o
    zi.                     @   s@   d dl Z d dlmZ ddlmZmZmZ dZG dd deZdS )    N)	Optimizer   )OptFloatOptLossClosureParams)AccSGDc                       s^   e Zd ZdZ					ddeded	ed
edededdf fddZddedefddZ	  Z
S )r   a  Implements AccSGD algorithm.

    It has been proposed in `On the insufficiency of existing momentum
    schemes for Stochastic Optimization`__ and  `Accelerating Stochastic
    Gradient Descent For Least Squares Regression`__

    Arguments:
        params: iterable of parameters to optimize or dicts defining
            parameter groups
        lr: learning rate (default: 1e-3)
        kappa: ratio of long to short step (default: 1000)
        xi: statistical advantage parameter (default: 10)
        small_const: any value <=1 (default: 0.7)
        weight_decay: weight decay (L2 penalty) (default: 0)

    Example:
        >>> import torch_optimizer as optim
        >>> optimizer = optim.AccSGD(model.parameters(), lr=0.1)
        >>> optimizer.zero_grad()
        >>> loss_fn(model(input), target).backward()
        >>> optimizer.step()

     __ https://arxiv.org/abs/1704.08227
     __ https://arxiv.org/abs/1803.05591

    Note:
        Reference code: https://github.com/rahulkidambi/AccSGD
    MbP?     @@      $@ffffff?r   paramslrkappaxismall_constweight_decayreturnNc                    sT   |dkrt d||dk rt d|t|||||d}tt| || d S )Ng        zInvalid learning rate: {}r   zInvalid weight_decay value: {})r   r   r   r   r   )
ValueErrorformatdictsuperr   __init__)selfr   r   r   r   r   r   defaults	__class__ J/home/ubuntu/.local/lib/python3.10/site-packages/torch_optimizer/accsgd.pyr   (   s   	zAccSGD.__init__closurec                 C   sT  d}|dur	| }| j D ]}|d }|d |d  |d  }d|d |d  |d  |d   }d| }|d |d |  }|d D ]d}	|	jdu rJqB|	jj}
|d	krZ|
j|	j|d
 | j|	 }d|vrkt|	j|d< |d }|d| d  |j|
| d
 ||	j || |	jj|
|d  d
 |	j| |	jj|d| d
 qBq|S )zPerforms a single optimization step.

        Arguments:
            closure: A closure that reevaluates the model and returns the loss.
        Nr   r   r   r   g      ?r   r   r   )alphamomentum_buffer)param_groupsgraddataadd_statecopydeepcopymul_)r   r   lossgroupr   large_lrr   betazetapd_pparam_statebufr   r   r   step@   s@   



zAccSGD.step)r   r	   r
   r   r   )N)__name__
__module____qualname____doc__r   floatr   r   r   r2   __classcell__r   r   r   r   r   
   s.     r   )	r&   torch.optim.optimizerr   typesr   r   r   __all__r   r   r   r   r   <module>   s
    