U
    ¯Ê¹jÿ  ã                   @   s,   d Z ddlZddlmZ G dd„ deƒZdS )aL   RMSProp modified to behave like Tensorflow impl

Originally cut & paste from PyTorch RMSProp
https://github.com/pytorch/pytorch/blob/063946d2b3f3f1e953a2a3b54e0b34f1393de295/torch/optim/rmsprop.py
Licensed under BSD-Clause 3 (ish), https://github.com/pytorch/pytorch/blob/master/LICENSE

Modifications Copyright 2021 Ross Wightman
é    N)Ú	Optimizerc                       s@   e Zd ZdZd‡ fd	d
„	Z‡ fdd„Ze ¡ ddd„ƒZ‡  Z	S )Ú	RMSpropTFaE  Implements RMSprop algorithm (TensorFlow style epsilon)

    NOTE: This is a direct cut-and-paste of PyTorch RMSprop with eps applied before sqrt
    and a few other modifications to closer match Tensorflow for matching hyper-params.

    Noteworthy changes include:
    1. Epsilon applied inside square-root
    2. square_avg initialized to ones
    3. LR scaling of update accumulated in momentum buffer

    Proposed by G. Hinton in his
    `course <http://www.cs.toronto.edu/~tijmen/csc321/slides/lecture_slides_lec6.pdf>`_.

    The centered version first appears in `Generating Sequences
    With Recurrent Neural Networks <https://arxiv.org/pdf/1308.0850v5.pdf>`_.

    Arguments:
        params (iterable): iterable of parameters to optimize or dicts defining
            parameter groups
        lr (float, optional): learning rate (default: 1e-2)
        momentum (float, optional): momentum factor (default: 0)
        alpha (float, optional): smoothing (decay) constant (default: 0.9)
        eps (float, optional): term added to the denominator to improve
            numerical stability (default: 1e-10)
        centered (bool, optional) : if ``True``, compute the centered RMSProp,
            the gradient is normalized by an estimation of its variance
        weight_decay (float, optional): weight decay (L2 penalty) (default: 0)
        decoupled_decay (bool, optional): decoupled weight decay as per https://arxiv.org/abs/1711.05101
        lr_in_momentum (bool, optional): learning rate scaling is included in the momentum buffer
            update as per defaults in Tensorflow

    ç{®Gáz„?çÍÌÌÌÌÌì?ç»½×Ùß|Û=r   ç        FTc
              
      sœ   d|kst d |¡ƒ‚d|ks,t d |¡ƒ‚d|ksBt d |¡ƒ‚d|ksXt d |¡ƒ‚d|ksnt d |¡ƒ‚t||||||||	d�}
tt| ƒ ||
¡ d S )Nr   zInvalid learning rate: {}zInvalid epsilon value: {}zInvalid momentum value: {}zInvalid weight_decay value: {}zInvalid alpha value: {})ÚlrÚmomentumÚalphaÚepsÚcenteredÚweight_decayÚdecoupled_decayÚlr_in_momentum)Ú
ValueErrorÚformatÚdictÚsuperr   Ú__init__)ÚselfÚparamsr   r
   r   r   r	   r   r   r   Údefaults©Ú	__class__© úT/var/www/html/bwave/python/venv/lib/python3.8/site-packages/timm/optim/rmsprop_tf.pyr   0   s*          þzRMSpropTF.__init__c                    s8   t t| ƒ |¡ | jD ]}| dd¡ | dd¡ qd S )Nr	   r   r   F)r   r   Ú__setstate__Úparam_groupsÚ
setdefault)r   ÚstateÚgroupr   r   r   r   B   s    
zRMSpropTF.__setstate__Nc              	   C   s*  d}|dk	r&t  ¡ � |ƒ }W 5 Q R X | jD �]ö}|d D �]æ}|jdkrLq:|j}|jr`tdƒ‚| j| }t|ƒdkr¼d|d< t  |¡|d< |d dkr¦t  	|¡|d< |d	 r¼t  	|¡|d
< |d }d|d  }|d  d7  < |d dk�r&|d �r| 
d|d |d   ¡ n|j||d d�}|j| d¡| |d� |d	 �r‚|d
 }	|	j||	 |d� |j|	|	dd� |d ¡ ¡ }
n| |d ¡ ¡ }
|d dk�r|d }|d �rà| 
|d ¡j||
|d d� | | ¡ n*| 
|d ¡ ||
¡ |j||d  d� q:|j||
|d  d� q:q,|S )z¶Performs a single optimization step.

        Arguments:
            closure (callable, optional): A closure that reevaluates the model
                and returns the loss.
        Nr   z)RMSprop does not support sparse gradientsr   ÚstepÚ
square_avgr	   Zmomentum_bufferr   Úgrad_avgg      ð?r
   é   r   r   r   )r
   é   éÿÿÿÿ)Úvaluer   r   )ÚtorchZenable_gradr   ÚgradZ	is_sparseÚRuntimeErrorr   ÚlenZ	ones_likeZ
zeros_likeZmul_ÚaddZadd_ÚpowZaddcmulZsqrt_Zaddcdiv_)r   ÚclosureZlossr    Úpr)   r   r"   Zone_minus_alphar#   ÚavgÚbufr   r   r   r!   H   sR    




 
zRMSpropTF.step)r   r   r   r   r   FFT)N)
Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r(   Zno_gradr!   Ú__classcell__r   r   r   r   r      s   !    ÿr   )r5   r(   Ztorch.optimr   r   r   r   r   r   Ú<module>   s   	