o
    zi                     @   sh   d dl mZmZmZmZmZ d dlZd dlmZ ddl	m
Z
mZmZ dZeddd	ZG d
d deZdS )    )ListTupleTypeTypeVarUnionN)	Optimizer   )OptFloatOptLossClosureParams)AggMoTr   )boundc                       s   e Zd ZdZ			ddededeee eedf f d	ed
df
 fddZ	e
				ddee dedededed	ed
efddZdded
efddZ  ZS )r   a  Implements Aggregated Momentum Gradient Descent.

    It has been proposed in `Aggregated Momentum: Stability Through Passive
    Damping`__

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

     __ https://arxiv.org/abs/1804.00325

    Note:
        Reference code: https://github.com/AtheMathmo/AggMo/blob/master/aggmo.py  # noqa
    MbP?        g?gGz?r   paramslrbetas.weight_decayreturnNc           	         s   |dkrt d|t|D ]\}}d|  krdk s)n d|| }t |q|dk r5t d|t|||d}tt| || d S )Nr   zInvalid learning rate: {}g      ?z%Invalid beta parameter at index 1: {}zInvalid weight_decay value: {})r   r   r   )
ValueErrorformat	enumeratedictsuperr   __init__)	selfr   r   r   r   ibetamsgdefaults	__class__ I/home/ubuntu/.local/lib/python3.10/site-packages/torch_optimizer/aggmo.pyr   !   s   zAggMo.__init__皙?   clsakc                    s:   |dkrt d| fddt|D }| ||||S )Nr   zInvalid parameter k: {}c                    s   g | ]}d  |  qS )r   r$   ).0r   r)   r$   r%   
<listcomp>D   s    z'AggMo.from_exp_form.<locals>.<listcomp>)r   r   range)r(   r   r   r)   r*   r   r   r$   r,   r%   from_exp_form8   s   	zAggMo.from_exp_formclosurec                 C   s   d}|dur	| }| j D ]h}|d }|d }tt|}|d D ]S}|jdu r(q |jj}|dkr8|j|j|d | j| }	d|	vrTi |	d< |D ]}
t|j|	d |
< qG|D ]}
|	d |
 }|	|
| |jj
||d | d qVq q|S )	zPerforms a single optimization step.

        Arguments:
            closure: A closure that reevaluates the model and returns the loss.
        Nr   r   r   r   )alphamomentum_bufferr   )param_groupsfloatlengraddataadd_statetorch
zeros_likemul_sub_)r   r0   lossgroupr   r   	total_mompd_pparam_stater   bufr$   r$   r%   stepG   s8   



z
AggMo.step)r   r   r   )r   r&   r'   r   )N)__name__
__module____qualname____doc__r   r4   r   r   r   r   classmethodr   r   intr/   r
   r	   rE   __classcell__r$   r$   r"   r%   r      sJ    )typingr   r   r   r   r   r:   torch.optim.optimizerr   typesr	   r
   r   __all__r   r   r$   r$   r$   r%   <module>   s    