U
    ©Ê¹jg  ã                   @   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 )Ú_FunctionalAdamçü©ñÒMbP?©gÍÌÌÌÌÌì?g+‡ÙÎ÷ï?ç:Œ0âŽyE>ç        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 )Nr   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#   úf/var/www/html/bwave/python/venv/lib/python3.8/site-packages/torch/distributed/optim/functional_adam.pyÚ__init__   s0    û$z_FunctionalAdam.__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 )zo
        Similar to step, but operates on a single parameter and optionally a
        gradient tensor.
        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Úadamr   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_FunctionalAdam.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   r/   r0   r1   r   r2   r3   r4   r   r   r   r   )r"   r<   r   r5   r6   r7   r8   r9   r:   r&   Zgradientr   r#   r#   r$   r(   {   s|    
ÿþÿ




 ÿ
 ÿ
 ÿ


ïz_FunctionalAdam.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_functionalr3   r   r   r   Ú__annotations__r   Úscriptr   r#   r#   r#   r$   Ú<module>   s    