U
    d                     @   sV   d dl mZmZmZ d dlZd dlm  mZ d dlm	Z	 ej
jG dd deZdS )    )ListDictOptionalN)Tensorc                   @   sF   e Zd Zdee eeeeeeeed	ddZeee  d	d
dZ	dS )_FunctionalRMSprop{Gz?Gz?:0yE>        F)	paramslralphaepsweight_decaymomentumcenteredforeach_allow_empty_param_listc
           
      C   sh   |||||d| _ || _|| _t|dkr6|	s6tdd|i| _tjt	tj
t	ttj
f f i | _d S )N)r   r   r   r   r   r   z%optimizer got an empty parameter listr   )defaultsr   r   len
ValueErrorparam_grouptorchjitZannotater   r   strstate)
selfr   r   r   r   r   r   r   r   r    r   N/tmp/pip-unpacked-wheel-ua33x9lu/torch/distributed/optim/functional_rmsprop.py__init__   s    
z_FunctionalRMSprop.__init__)	gradientsc                 C   s  | j d }g }g }g }g }g }| jd }| jd }	| jd }
| jd }| jd }t|t|krtddt| d	 d
t|  t||D ]\}}|d k	r|| || || jkr0i | j|< | j| }td|d< tj	|tj
d|d< |dkrtj	|tj
d|d< | jr0tj	|tj
d|d< | j| }||d  |dkr`||d  | jrv||d  |d  d7  < qt , tj|||||||	|
||| j| jd W 5 Q R X d S )Nr   r   r   r   r   r   zEthe gradients passed in does not equal to the size of the parameters!zParams length: z. zGradients length: r
   step)Zmemory_formatZ
square_avgr   Zmomentum_bufferZgrad_avg   )r   r   r   r   r   r   r   )r   r   r   r   zipappendr   r   ZtensorZ
zeros_likeZpreserve_formatr   Zno_gradFZrmspropr   )r   r    r   Zparams_with_gradZgradsZsquare_avgsZ	grad_avgsZmomentum_buffer_listr   r   r   r   r   paramZgradientr   r   r   r   r!   1   sj    













z_FunctionalRMSprop.stepN)r   r   r	   r
   r
   FFF)
__name__
__module____qualname__r   r   floatboolr   r   r!   r   r   r   r   r      s(           r   )typingr   r   r   r   Ztorch.optim._functionalZoptimZ_functionalr%   r   r   scriptobjectr   r   r   r   r   <module>   s
   