
    NgV#                        d dl mZmZ d dlZd dlmZ d dlmZ 	 d dlmZmZ dZ	n# e
$ r dZ	Y nw xY wd dlmZmZ d	d
gZ G d d	e          Z	 	 ddee         dee         deee                  dedee         dedededededefdZdee         dee         deee                  dededededededefdZdee         dee         deee                  dededededededefdZdS )    )update_wrapperwrapsN)Tensor)	Optimizer)_use_grad_for_differentiable_default_to_fused_or_foreachTF)ListOptionalSGDWsgdwc                        e Zd Z	 	 	 	 	 ddddddedee         def fd	Z fd
Zd Z ej	                    dd            Z
 xZS )r   MbP?r   FN)maximizeforeachdifferentiabler   r   r   c          
      D   |dk     rt          d|           |dk     rt          d|           |dk     rt          d|           t          ||||||||	          }
|r|dk    s|dk    rt          d          t                                          ||
           d S )Ng        zInvalid learning rate: zInvalid momentum value: zInvalid weight_decay value: )lrmomentum	dampeningweight_decaynesterovr   r   r   r   z8Nesterov momentum requires a momentum and zero dampening)
ValueErrordictsuper__init__)selfparamsr   r   r   r   r   r   r   r   defaults	__class__s              K/var/www/html/ai-engine/env/lib/python3.11/site-packages/timm/optim/sgdw.pyr   zSGDW.__init__   s     88;r;;<<<c>>BBBCCC#JLJJKKKH	%w)	+ + +
  	YQ)q..WXXX*****    c                    t                                          |           | j        D ]Z}|                    dd           |                    dd           |                    dd            |                    dd           [d S )Nr   Fr   r   r   )r   __setstate__param_groups
setdefault)r   stategroupr   s      r    r#   zSGDW.__setstate__.   s    U###& 	6 	6EZ///Z///Y----u5555		6 	6r!   c                 ,   d}|d         D ]}|j         |                    |           |                    |j                    |j         j        rd}| j        |         }d|vr|                    d            m|                    |d                    |S )NFr   Tmomentum_buffer)gradappend	is_sparser&   )r   r'   params_with_gradd_p_listmomentum_buffer_listhas_sparse_gradpr&   s           r    _init_groupzSGDW._init_group6   s    x 	J 	JAv! ''***'''6# +&*O
1$E11(//5555(//6G0HIIIr!   c                    d}|5t          j                    5   |            }ddd           n# 1 swxY w Y   | j        D ]}g }g }g }|                     ||||          }t	          ||||d         |d         |d         |d         |d         |d         ||d         	           t          ||          D ]\  }}	| j        |         }
|	|
d
<   |S )zPerforms 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   r   r   r   r0   r   r)   )torchenable_gradr$   r2   r   zipr&   )r   closurelossr'   r-   r.   r/   r0   r1   r)   r&   s              r    stepz	SGDW.stepJ   s_    "$$ ! !wyy! ! ! ! ! ! ! ! ! ! ! ! ! ! ! & 	; 	;E!H#% "..u6FRfggO $">2z*;,z*z* /i(    '**:<P&Q&Q ; ;"?
1+:'((; s   /33)r   r   r   r   FN)__name__
__module____qualname__boolr
   r   r#   r2   r4   no_gradr9   __classcell__)r   s   @r    r   r      s         + #&*#(+ + + + d^+ !+ + + + + +:6 6 6 6 6  ( U]__& & & _& & & & &r!   r   r.   r/   r0   r   r   r   r   r   r   r   c                   t           r}t          t          d          rh|6t          j                                        st          | dd          \  }}nd}|r-t          j                                        rt          d          nd}|r&t          j                                        st          }nt          } || |||||||	||

  
         dS )zlFunctional API that performs SGD algorithm computation.

    See :class:`~torch.optim.SGD` for details.
    "_group_tensors_by_device_and_dtypeNF)r   	use_fusedz6torch.jit.script not supported with foreach optimizers)r   r   r   r   r   r0   r   )
has_recent_pthasattrr   r4   jitis_scriptingr   RuntimeError_multi_tensor_sgdw_single_tensor_sgdw)r   r.   r/   r0   r   r   r   r   r   r   r   _funcs                r    r   r   t   s    (  ,PQQ ? 9))++  9&QVbghhh
77 	Yuy--// 	YWXXX #uy--// #!"D!'     r!   c                   t          |           D ]\  }
}|s||
         n||
          }|                    d||z  z
             |dk    r||
         }|,t          j        |                                          }|||
<   n-|                    |                              |d|z
             |r|                    ||          }n|}|                    ||            d S )N      ?r      alpha)	enumeratemul_r4   clonedetachadd_add)r   r.   r/   r   r   r   r   r   r   r0   iparamd_pbufs                 r    rJ   rJ      s    f%% # #5!);hqkk|

2\))***q==&q)C{k#&&--//*-$Q''""''1y='AAA ggcg22

3rc
""""'# #r!   gradsc                   t          |           dk    rd S t          j        | ||gd          }
|
                                D ]
\  \  }}}}|	ot	          d |D                       }|rt          j        |          }t          j        | d||z  z
             |dk    rNg }d}t          t          |                    D ])}||         d} n|	                    ||                    *|r0t          j        ||           t          j
        ||d|z
             ng }t          t          |                    D ]}||         =t          j        ||                                                   x}x||<   |||         <   n;||         }|                    |                              ||         d|z
             |	                    |           |rt          j
        |||           n|}|st          j
        |||            t          t          |                    D ]&}||                             ||         |            'd S )	Nr   T)with_indicesc              3   $   K   | ]}|j         V  d S r:   )r,   ).0r*   s     r    	<genexpr>z%_multi_tensor_sgdw.<locals>.<genexpr>   s$      8a8aD8a8a8a8a8a8ar!   rN   FrO   rP   )lenr   rB   valuesanyr4   _foreach_neg_foreach_mul_ranger+   _foreach_add_rT   rU   rS   rV   )r   r\   r/   r   r   r   r   r   r   r0   grouped_tensorsdevice_paramsdevice_gradsdevice_momentum_buffer_listindicesdevice_has_sparse_gradbufsall_states_with_momentum_bufferrX   r[   s                       r    rI   rI      s    6{{aB	,-DB B BOQ`QgQgQiQi ,B ,BM	C-'BW!0!aS8a8aT`8a8a8a5a5a 	< -l;;LFBl):$:;;;q==D.2+3:;;<< @ @.q196;3EKK ;A >????. %#D(333#D,a)mLLLLLs#>??@@ % %A215=!KQ88??AAB B9!<?ST[\]T^?_?_ :!<**//Qq9}/UUUKK$$$$ $#L$hGGGGG#% 	B|B3GGGGG 3}--.. B Ba %%l1obS%AAAABW,B ,Br!   )NN)	functoolsr   r   r4   r   torch.optim.optimizerr   r   r   rD   ImportErrortypingr	   r
   __all__r   r>   floatr   rJ   rI    r!   r    <module>rx      s   + + + + + + + +        + + + + + +````````MM   MMM " ! ! ! ! ! ! !6
a a a a a9 a a aT !%"&2 2V2v,2 #8F#342 2 $2 2 2 2 2 2 2 2 2 2j #V #v, # #8F#34 #
  #  #  #  #  #  #  #  #  #  #F>BV>BF|>B #8F#34>B
 >B >B >B >B >B >B >B >B >B >B >B >Bs   
% //