U
    *Ç-ef  ã                   @   sf   U d dl 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ÚOptionalN)ÚTensorÚ__all__c                   @   sZ   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	eee  d
œdd„Z
dS )Ú_FunctionalSGDç{®Gáz„?ç        F)	ÚparamsÚlrÚmomentumÚ	dampeningÚweight_decayÚnesterovÚmaximizeÚforeachÚ_allow_empty_param_listc
           
      C   sl   ||||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)r   r   r   r   r   z%optimizer got an empty parameter listr
   )Údefaultsr   r   r   ÚtorchÚjitZannotater   r   ÚstrÚstateÚlenÚ
ValueErrorÚparam_group)
Úselfr
   r   r   r   r   r   r   r   r   © r   úg/var/www/html/Darija-Ai-Train/env/lib/python3.8/site-packages/torch/distributed/optim/functional_sgd.pyÚ__init__   s    ü$z_FunctionalSGD.__init__)ÚparamÚgradc                 C   sö   | j d }| j d }| j d }| j d }|g}g }g }	d}
|dk	r–|	 |¡ |jrVd}
|| jkrji | j|< | j| }d|krˆ| d¡ n| |d ¡ t ¡ , tj||	|||||| j| j	|
| j
d	 W 5 Q R X | j| }|d
 }|dk	rò||d< dS )z[Similar to self.step, but operates on a single parameter and
        its gradient.
        r   r   r   r   FNTÚmomentum_buffer©r   r   r   r   r   r   Úhas_sparse_gradr   r   )r   ÚappendÚ	is_sparser   r   Úno_gradÚFÚsgdr   r   r   )r   r   r    r   r   r   r   r
   Úmomentum_buffer_listÚgradsr#   r   r!   r   r   r   Ú
step_param3   sH    








õ
z_FunctionalSGD.step_param)Ú	gradientsc                 C   sh  | j d }g }g }g }| jd }| jd }| jd }| jd }	t|ƒt|ƒkrttddt|ƒ› d d	t|ƒ›  ƒ‚d
}
t||ƒD ]n\}}|d k	r‚| |¡ | |¡ |jr°d}
|| jkrÄi | j|< | j| }d|krâ| d ¡ q‚| |d ¡ q‚t 	¡ , t
j|||||||	| j| j|
| jd W 5 Q R X t|ƒD ].\}}| j| }|| }|d k	r4||d< q4d S )Nr
   r   r   r   r   zEthe gradients passed in does not equal to the size of the parameters!zParams length: z. zGradients length: FTr!   r"   )r   r   r   r   Úzipr$   r%   r   r   r&   r'   r(   r   r   r   Ú	enumerate)r   r,   r
   Zparams_with_gradr*   r)   r   r   r   r   r#   r   Zgradientr   ÚiÚpr!   r   r   r   Ústepb   s`    




ÿþÿ





õ

z_FunctionalSGD.stepN)r   r	   r	   r	   FFFF)Ú__name__Ú
__module__Ú__qualname__r   r   ÚfloatÚboolr   r   r+   r1   r   r   r   r   r      s*           öö/r   )Útypingr   r   r   r   Ztorch.optim._functionalZoptimZ_functionalr'   r   r   r   Ú__annotations__r   Úscriptr   r   r   r   r   Ú<module>   s    