U
    •Ê¹jcl  ã                   @   s  d dl Z d dl mZ ddlmZmZmZmZmZmZm	Z	m
Z
mZmZmZmZ d dlmZmZmZmZ d dlmZ ddgZG d	d„ deƒZd
de› de
› de› de	› de› d� e_dee ee ee ee ee ee ee eeee ee ee eeeeeef eeedœdd„Zee ee ee ee ee ee ee ee eeeeeef eeeeedœdd„Zee ee ee ee ee ee ee ee eeeeeef eeeeedœdd„Zee ee ee ee ee ee ee ee eeeeeef eeeeeddœdd„ZdS )é    N)ÚTensoré   )Ú	OptimizerÚ_use_grad_for_differentiableÚ
_get_valueÚ_dispatch_sqrtÚ_stack_if_compilingÚ_capturable_docÚ_differentiable_docÚ_foreach_docÚ
_fused_docÚ_maximize_docÚ_default_to_fused_or_foreachÚparams_t)ÚListÚOptionalÚTupleÚUnion)Ú$_get_fused_kernels_supported_devicesÚAdamWÚadamwc                       s€   e Zd Zdddddddœeeeef eeef eeeee	e eee	e dœ‡ fd	d
„Z
‡ fdd„Zdd„ Zeddd„ƒZ‡  ZS )r   çü©ñÒMbP?©gÍÌÌÌÌÌì?g+‡ÙÎ÷ï?ç:Œ0âŽyE>ç{®Gáz„?FN)ÚmaximizeÚforeachÚ
capturableÚdifferentiableÚfused)ÚparamsÚlrÚbetasÚepsÚweight_decayÚamsgradr   r   r   r   r   c                   s8  d|kst d|› �ƒ‚t|tƒr0|r0|	s0t dƒ‚d|ksFt d|› �ƒ‚d|d   kr^dk srn t d|d › �ƒ‚d|d   krŠdk sžn t d	|d › �ƒ‚d|ks´t d
|› �ƒ‚t||||||||	|
|d�
}tƒ  ||¡ |�r4|
rðtdƒ‚d| _tƒ ‰ t	‡ fdd„| j
D ƒƒ�s&tdˆ › d�ƒ‚|�r4tdƒ‚d S )Nç        zInvalid learning rate: úElr as a Tensor is not supported for capturable=False and foreach=TruezInvalid epsilon value: r   g      ð?z#Invalid beta parameter at index 0: r   z#Invalid beta parameter at index 1: zInvalid weight_decay value: )
r!   r"   r#   r$   r%   r   r   r   r   r   z)`fused` does not support `differentiable`Tc                 3   s2   | ]*}|d  D ]}|j jˆ ko&t |¡V  qqdS )r    N)ÚdeviceÚtypeÚtorchZis_floating_point)Ú.0ZpgÚp©Zfused_supported_devices© úP/var/www/html/bwave/python/venv/lib/python3.8/site-packages/torch/optim/adamw.pyÚ	<genexpr>?   s
    
 þz!AdamW.__init__.<locals>.<genexpr>zX`fused=True` requires all the params to be floating point Tensors of supported devices: Ú.z0`fused` and `foreach` cannot be `True` together.)Ú
ValueErrorÚ
isinstancer   ÚdictÚsuperÚ__init__ÚRuntimeErrorZ_step_supports_amp_scalingr   ÚallÚparam_groups)Úselfr    r!   r"   r#   r$   r%   r   r   r   r   r   Údefaults©Ú	__class__r-   r/   r6      sH    öý
zAdamW.__init__c                    s´   t ƒ  |¡ | jD ]L}| dd¡ | dd¡ | dd ¡ | dd¡ | dd¡ | dd ¡ qt| j ¡ ƒ}t|ƒdkoŠt 	|d d	 ¡}|s°|D ]}t 
t|d	 ƒ¡|d	< q”d S )
Nr%   Fr   r   r   r   r   r   Ústep)r5   Ú__setstate__r9   Ú
setdefaultÚlistÚstateÚvaluesÚlenr*   Z	is_tensorÚtensorÚfloat)r:   rB   ÚgroupZstate_valuesZstep_is_tensorÚsr<   r.   r/   r?   I   s    

ÿzAdamW.__setstate__c	                 C   sX  |d D �]H}	|	j d krq| |	¡ |	j jr4tdƒ‚| |	j ¡ | j|	 }
t|
ƒdkrÈ|d sf|d rztjdtj|	j	d�nt 
d¡|
d	< tj|	tjd
�|
d< tj|	tjd
�|
d< |rÈtj|	tjd
�|
d< | |
d ¡ | |
d ¡ |d rú| |
d ¡ |d �r|
d	 j�rtdƒ‚|d �rDt|d tƒ�rD|d �sDtdƒ‚| |
d	 ¡ qd S )Nr    z'AdamW does not support sparse gradientsr   r   r   r.   )Zdtyper(   r&   r>   )Zmemory_formatÚexp_avgÚ
exp_avg_sqÚmax_exp_avg_sqr%   r   zB`requires_grad` is not supported for `step` in differentiable moder   r!   r'   )ÚgradÚappendZ	is_sparser7   rB   rD   r*   ZzerosrF   r(   rE   Z
zeros_likeZpreserve_formatZrequires_gradr3   r   )r:   rG   Úparams_with_gradÚgradsr%   Úexp_avgsÚexp_avg_sqsÚmax_exp_avg_sqsÚstate_stepsr,   rB   r.   r.   r/   Ú_init_groupZ   sJ    


ÿÿý ÿ
 ÿ
 ÿ
$zAdamW._init_groupc                 C   sà   |   ¡  d}|dk	r.t ¡ � |ƒ }W 5 Q R X | jD ]¦}g }g }g }g }g }g }	|d }
|d \}}|  ||||
||||	¡ t||||||	|
|||d |d |d |d |d |d	 |d
 |d t| ddƒt| ddƒd� q4|S )z±Performs a single optimization step.

        Args:
            closure (Callable, optional): A closure that reevaluates the model
                and returns the loss.
        Nr%   r"   r!   r$   r#   r   r   r   r   r   Ú
grad_scaleÚ	found_inf)r%   Úbeta1Úbeta2r!   r$   r#   r   r   r   r   r   rU   rV   )Z _cuda_graph_capture_health_checkr*   Zenable_gradr9   rT   r   Úgetattr)r:   ÚclosureZlossrG   rN   rO   rP   rQ   rR   rS   r%   rW   rX   r.   r.   r/   r>   ”   s\    

ø

íz
AdamW.step)r   r   r   r   F)N)Ú__name__Ú
__module__Ú__qualname__r   r   rF   r   r   Úboolr   r6   r?   rT   r   r>   Ú__classcell__r.   r.   r<   r/   r      s8        ù	ó

ó<:a  Implements AdamW algorithm.

    .. math::
       \begin{aligned}
            &\rule{110mm}{0.4pt}                                                                 \\
            &\textbf{input}      : \gamma \text{(lr)}, \: \beta_1, \beta_2
                \text{(betas)}, \: \theta_0 \text{(params)}, \: f(\theta) \text{(objective)},
                \: \epsilon \text{ (epsilon)}                                                    \\
            &\hspace{13mm}      \lambda \text{(weight decay)},  \: \textit{amsgrad},
                \: \textit{maximize}                                                             \\
            &\textbf{initialize} : m_0 \leftarrow 0 \text{ (first moment)}, v_0 \leftarrow 0
                \text{ ( second moment)}, \: \widehat{v_0}^{max}\leftarrow 0              \\[-1.ex]
            &\rule{110mm}{0.4pt}                                                                 \\
            &\textbf{for} \: t=1 \: \textbf{to} \: \ldots \: \textbf{do}                         \\

            &\hspace{5mm}\textbf{if} \: \textit{maximize}:                                       \\
            &\hspace{10mm}g_t           \leftarrow   -\nabla_{\theta} f_t (\theta_{t-1})          \\
            &\hspace{5mm}\textbf{else}                                                           \\
            &\hspace{10mm}g_t           \leftarrow   \nabla_{\theta} f_t (\theta_{t-1})           \\
            &\hspace{5mm} \theta_t \leftarrow \theta_{t-1} - \gamma \lambda \theta_{t-1}         \\
            &\hspace{5mm}m_t           \leftarrow   \beta_1 m_{t-1} + (1 - \beta_1) g_t          \\
            &\hspace{5mm}v_t           \leftarrow   \beta_2 v_{t-1} + (1-\beta_2) g^2_t          \\
            &\hspace{5mm}\widehat{m_t} \leftarrow   m_t/\big(1-\beta_1^t \big)                   \\
            &\hspace{5mm}\widehat{v_t} \leftarrow   v_t/\big(1-\beta_2^t \big)                   \\
            &\hspace{5mm}\textbf{if} \: amsgrad                                                  \\
            &\hspace{10mm}\widehat{v_t}^{max} \leftarrow \mathrm{max}(\widehat{v_t}^{max},
                \widehat{v_t})                                                                   \\
            &\hspace{10mm}\theta_t \leftarrow \theta_t - \gamma \widehat{m_t}/
                \big(\sqrt{\widehat{v_t}^{max}} + \epsilon \big)                                 \\
            &\hspace{5mm}\textbf{else}                                                           \\
            &\hspace{10mm}\theta_t \leftarrow \theta_t - \gamma \widehat{m_t}/
                \big(\sqrt{\widehat{v_t}} + \epsilon \big)                                       \\
            &\rule{110mm}{0.4pt}                                                          \\[-1.ex]
            &\bf{return} \:  \theta_t                                                     \\[-1.ex]
            &\rule{110mm}{0.4pt}                                                          \\[-1.ex]
       \end{aligned}

    For further details regarding the algorithm we refer to `Decoupled Weight Decay Regularization`_.
    a�  
    Args:
        params (iterable): iterable of parameters to optimize or dicts defining
            parameter groups
        lr (float, Tensor, optional): learning rate (default: 1e-3). A tensor LR
            is not yet supported for all our implementations. Please use a float
            LR if you are not also specifying fused=True or capturable=True.
        betas (Tuple[float, float], optional): coefficients used for computing
            running averages of gradient and its square (default: (0.9, 0.999))
        eps (float, optional): term added to the denominator to improve
            numerical stability (default: 1e-8)
        weight_decay (float, optional): weight decay coefficient (default: 1e-2)
        amsgrad (bool, optional): whether to use the AMSGrad variant of this
            algorithm from the paper `On the Convergence of Adam and Beyond`_
            (default: False)
        z	
        z¿
    .. _Decoupled Weight Decay Regularization:
        https://arxiv.org/abs/1711.05101
    .. _On the Convergence of Adam and Beyond:
        https://openreview.net/forum?id=ryQu7f-RZ

    F)r    rO   rP   rQ   rR   rS   r   r   r   r   rU   rV   r%   rW   rX   r!   r$   r#   r   c                C   sú   t j ¡ s$tdd„ |D ƒƒs$tdƒ‚|	dkr\|dkr\t| |dd�\}}|r\t|tƒr\|s\d}|	dkrhd}	|dkrtd}|rŠt j 	¡ rŠtdƒ‚|	r t j 	¡ r tdƒ‚|	r´t j 	¡ s´t
}n|rÈt j 	¡ sÈt}nt}|| |||||||||||||||
|d	� dS )
zpFunctional API that performs AdamW algorithm computation.

    See :class:`~torch.optim.AdamW` for details.
    c                 s   s   | ]}t |tjƒV  qd S ©N)r3   r*   r   )r+   Útr.   r.   r/   r0   0  s     zadamw.<locals>.<genexpr>zPAPI has changed, `state_steps` argument must contain a list of singleton tensorsNF)Z	use_fusedz6torch.jit.script not supported with foreach optimizersz4torch.jit.script not supported with fused optimizers)r%   rW   rX   r!   r$   r#   r   r   r   rU   rV   )r*   Ú_utilsÚis_compilingr8   r7   r   r3   r   ÚjitÚis_scriptingÚ_fused_adamwÚ_multi_tensor_adamwÚ_single_tensor_adamw)r    rO   rP   rQ   rR   rS   r   r   r   r   rU   rV   r%   rW   rX   r!   r$   r#   r   Ú_Úfuncr.   r.   r/   r     sP    ÿï)r    rO   rP   rQ   rR   rS   rU   rV   r%   rW   rX   r!   r$   r#   r   r   r   c       	         C   sš  |d kr|d kst ‚tj ¡ r,t|tƒs,t ‚t| ƒD �]^\}}|sJ|| n||  }|| }|| }|| }tj ¡ sš|rš|j	r†|j	sš|j
r’|j
sšt dƒ‚t |¡rât |¡}t |¡}t |¡}|rØt || ¡||< t |¡}|d7 }| d||  ¡ | |d|	 ¡ | |
¡j||d|
 d� |�s2|�ræ|}d|	|  }d|
|  }|| }| ¡ }| ¡ }|�r¾|�r€||  ¡ }n|| }||  t ||¡¡ ||  ¡ ||   || ¡}n| ¡ ||   || ¡}| ||¡ nŠt|ƒ}d|	|  }d|
|  }|| }t|ƒ}|�rLtj|| ||| d� ||  ¡ |  |¡}n| ¡ |  |¡}|j||| d� |r4t | | ¡r4t || ¡||< q4d S )NzGIf capturable=True, params and state_steps must be CUDA or XLA tensors.r   )Úvalue)Úout)ÚAssertionErrorr*   rd   re   r3   rF   Ú	enumeraterb   rc   Úis_cudaZis_xlaÚ
is_complexÚview_as_realZmul_Zlerp_Zaddcmul_ÚnegÚsqrtÚcloneZcopy_ÚmaximumZadd_Zaddcdiv_r   r   Zview_as_complex)r    rO   rP   rQ   rR   rS   rU   rV   r%   rW   rX   r!   r$   r#   r   r   r   ÚiÚparamrL   rI   rJ   Zstep_tr>   Úbias_correction1Úbias_correction2Ú	step_sizeZstep_size_negÚbias_correction2_sqrtrK   Údenomr.   r.   r/   rh   d  s~    
ÿÿÿÿþ




ÿÿÿÿrh   c       	            s¼  t | ƒdkrd S tˆtƒr&|s&tdƒ‚tj ¡ sT|rTtdd„ t| |ƒD ƒƒsTt	dƒ‚|r`t	dƒ‚|d krp|d kstt	‚t
 | |||||g¡}| ¡ D �]"\\}}}}}}}|r¶t |¡}dd„ |D ƒ}d	d„ |D ƒ}d
d„ |D ƒ}dd„ |D ƒ}dd„ |D ƒ}t |d¡ |dk�r&t |dˆ|  ¡ t ||dˆ  ¡ t |ˆ¡ t |||dˆ ¡ ~|�rt ˆ |¡}t ˆ|¡}t |d¡ t |d¡ t |¡ t |ˆ¡ t |¡ t |¡ |}|}|�ràt ||¡ t |¡}n
t |¡}t ||¡ t ||¡ t ||¡ t |||¡ q’‡ fdd„|D ƒ}‡fdd„|D ƒ}t‡fdd„|D ƒƒ}dd„ |D ƒ}|�r„t ||¡ t |¡}n
t |¡}t ||¡ t ||¡ t ||||¡ q’d S )Nr   r'   c                 s   s   | ]\}}|j o|j V  qd S r`   )ro   )r+   r,   r>   r.   r.   r/   r0   õ  s    z&_multi_tensor_adamw.<locals>.<genexpr>z@If capturable=True, params and state_steps must be CUDA tensors.z#_foreach ops don't support autogradc                 S   s$   g | ]}t  |¡rt  |¡n|‘qS r.   ©r*   rp   rq   ©r+   Úxr.   r.   r/   Ú
<listcomp>
  s     z'_multi_tensor_adamw.<locals>.<listcomp>c                 S   s$   g | ]}t  |¡rt  |¡n|‘qS r.   r}   r~   r.   r.   r/   r€     s     c                 S   s$   g | ]}t  |¡rt  |¡n|‘qS r.   r}   r~   r.   r.   r/   r€     s    c                 S   s$   g | ]}t  |¡rt  |¡n|‘qS r.   r}   r~   r.   r.   r/   r€     s    c                 S   s$   g | ]}t  |¡rt  |¡n|‘qS r.   r}   r~   r.   r.   r/   r€     s     r   c                    s   g | ]}d ˆ t |ƒ  ‘qS ©r   ©r   ©r+   r>   )rW   r.   r/   r€   I  s     c                    s   g | ]}d ˆ t |ƒ  ‘qS r�   r‚   rƒ   )rX   r.   r/   r€   J  s     c                    s   g | ]}ˆ | d  ‘qS )éÿÿÿÿr.   ©r+   Úbc)r!   r.   r/   r€   L  s     c                 S   s   g | ]}t |ƒ‘qS r.   )r   r…   r.   r.   r/   r€   N  s     )rD   r3   r   r7   r*   rb   rc   r8   Úziprm   r   Ú"_group_tensors_by_device_and_dtyperC   Z_foreach_negÚ_foreach_add_Z_foreach_mul_Z_foreach_lerp_Z_foreach_addcmul_Z_foreach_powÚ_foreach_sub_Z_foreach_neg_Z_foreach_div_Z_foreach_reciprocal_Z_foreach_sqrt_Z_foreach_maximum_Z_foreach_sqrtZ_foreach_addcdiv_r   )r    rO   rP   rQ   rR   rS   rU   rV   r%   rW   rX   r!   r$   r#   r   r   r   Úgrouped_tensorsÚdevice_paramsÚdevice_gradsÚdevice_exp_avgsÚdevice_exp_avg_sqsÚdevice_max_exp_avg_sqsÚdevice_state_stepsri   rx   ry   rz   r{   Zexp_avg_sq_sqrtr.   )rW   rX   r!   r/   rg   Ù  sš    ÿ
þ     ÿ	ù

ÿÿ





rg   )r    rO   rP   rQ   rR   rS   rU   rV   r%   rW   rX   r!   r$   r#   r   r   r   Úreturnc       	         C   s‚  | sd S |rt dƒ‚|d k	r&|j|ind }|d k	r<|j|ind }t|tƒrbt|jƒdkrb|j|ind }t | |||||g¡}| ¡ D ]ø\\}}\\}}}}}}}d\}}|d k	rÒ||krÊ|j|dd�||< || }|d k	rü||krô|j|dd�||< || }|d k	�r*||k�r*|j|dd�||< || }t	 
|d¡ t	j|||||||||	|
|||||d� |d k	r„t	 ||gt|ƒ ¡ q„d S )	Nz9Adam with fused=True does not support differentiable=TrueÚcpu)NNT)Únon_blocking)r(   r”   r   )	r%   r!   rW   rX   r$   r#   r   rU   rV   )r7   r(   r3   r   Ústrr   rˆ   ÚitemsÚtor*   r‰   Z_fused_adamw_rŠ   rD   )r    rO   rP   rQ   rR   rS   rU   rV   r%   rW   rX   r!   r$   r#   r   r   r   Zgrad_scale_dictZfound_inf_dictZlr_dictr‹   r(   ri   rŒ   r�   rŽ   r�   r�   r‘   Zdevice_grad_scaleZdevice_found_infr.   r.   r/   rf   ^  sd    &ÿû ñrf   )NFFNNN)r*   r   Z	optimizerr   r   r   r   r   r	   r
   r   r   r   r   r   Útypingr   r   r   r   Ztorch.utils._foreach_utilsr   Ú__all__r   Ú__doc__r^   rF   r   rh   rg   rf   r.   r.   r.   r/   Ú<module>   sÎ   8 F&ñðïîíÚK      ò
êR
îv
î 
í