U
    ©Ê¹jß  ã                   @   sj   U d dl mZmZmZmZ d dlZd dlm  mZ	 d dlm
Z
 g Zee ed< ejjG dd„ dƒƒZdS )é    )ÚDictÚListÚOptionalÚTupleN)ÚTensorÚ__all__c                   @   sd   e Zd Zdee eeeef eeeeeeedœ
dd„Zee	e d	œd
d„Z
ee	e  dœdd„ZdS )Ú_FunctionalAdamWçü©ñÒMbP?©gÍÌÌÌÌÌì?g+‡ÙÎ÷ï?ç:Œ0âŽyE>ç{®Gáz„?F)
ÚparamsÚlrÚbetasÚepsÚweight_decayÚamsgradÚmaximizeÚforeachÚfusedÚ_allow_empty_param_listc                 C   s  d|kst d|› �ƒ‚d|ks,t d|› �ƒ‚d|d   krDdk sXn t d|d › �ƒ‚d|d   krpdk s„n t d|d › �ƒ‚d|ksšt d	|› �ƒ‚|||d |d |d
œ| _|| _|| _|| _|	| _tj t	tj
t	ttj
f f i ¡| _t|ƒdk�r|
�st dƒ‚d|i| _d S )Nç        zInvalid learning rate: zInvalid epsilon value: r   g      ð?z#Invalid beta parameter at index 0: é   z#Invalid beta parameter at index 1: zInvalid weight_decay value: )r   r   Úbeta1Úbeta2r   z%optimizer got an empty parameter listr   )Ú
ValueErrorÚdefaultsr   r   r   r   ÚtorchÚjitZannotater   r   ÚstrÚstateÚlenÚparam_group)Úselfr   r   r   r   r   r   r   r   r   r   © r$   úg/var/www/html/bwave/python/venv/lib/python3.8/site-packages/torch/distributed/optim/functional_adamw.pyÚ__init__   s0    û$z_FunctionalAdamW.__init__)ÚparamÚgradc           
      C   sT  g }g }g }g }g }g }|d k	r4|  |¡ |  |¡ || jkr¢i | j|< | j| }	t d¡|	d< tj|tjd�|	d< tj|tjd�|	d< | jr¢tj|tjd�|	d< | j| }	|  |	d ¡ |  |	d ¡ | jrÜ|  |	d ¡ |  |	d ¡ t ¡ �X tj	||||||| j| j
| jd | jd | jd	 | jd
 | jd | j| jd d d� W 5 Q R X d S )Nr   Ústep©Zmemory_formatÚexp_avgÚ
exp_avg_sqÚmax_exp_avg_sqr   r   r   r   r   ©r   r   r   r   r   r   r   r   r   Z
grad_scaleZ	found_inf)Úappendr    r   ÚtensorÚ
zeros_likeÚpreserve_formatr   Úno_gradÚFÚadamwr   r   r   r   )
r#   r'   r(   Úparams_with_gradÚgradsÚexp_avgsÚexp_avg_sqsÚmax_exp_avg_sqsÚstate_stepsr    r$   r$   r%   Ú
step_paramA   sh    




 ÿ
 ÿ
 ÿ


ïz_FunctionalAdamW.step_param)Ú	gradientsc                 C   s°  | j d }g }g }g }g }g }g }t|ƒt|ƒkrXtddt|ƒ› d� dt|ƒ› � ƒ‚t| j d |ƒD ]Ü\}	}
|
d k	rh| |	¡ | |
¡ |	| jkrúi | j|	< | j|	 }t d¡|d< tj|	tj	d�|d	< tj|	tj	d�|d
< | j
rútj|	tj	d�|d< | j|	 }| |d	 ¡ | |d
 ¡ | j
�r6| |d ¡ | |d ¡ qht ¡ �X tj||||||| j
| j| jd | jd | jd | jd | jd | j| jd d d� W 5 Q R X d S )Nr   zEthe gradients passed in does not equal to the size of the parameters!zParams length: z. zGradients length: r   r)   r*   r+   r,   r-   r   r   r   r   r   r.   )r"   r!   r   Úzipr/   r    r   r0   r1   r2   r   r3   r4   r5   r   r   r   r   )r#   r=   r   r6   r7   r8   r9   r:   r;   r'   Zgradientr    r$   r$   r%   r)   |   s|    
ÿþÿ




 ÿ
 ÿ
 ÿ


ïz_FunctionalAdamW.stepN)	r	   r
   r   r   FFFFF)Ú__name__Ú
__module__Ú__qualname__r   r   Úfloatr   Úboolr&   r   r<   r)   r$   r$   r$   r%   r      s.            õ
õ,;r   )Útypingr   r   r   r   r   Ztorch.optim._functionalZoptimZ_functionalr4   r   r   r   Ú__annotations__r   Úscriptr   r$   r$   r$   r%   Ú<module>   s    