
    '}h7                        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 d dlmZmZ ddgZ G d de      Zd	d
e
 de de	 dz   e_        	 	 	 	 ddee   dee   dee   dee   dedee   dededededededefdZd Zdee   dee   dee   dee   d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   dee   dedededededededefdZy)    N)Tensor   )		Optimizer_use_grad_for_differentiable
_get_value_view_as_real_default_to_fused_or_foreach_get_scalar_dtype_differentiable_doc_foreach_doc_maximize_doc)ListOptionalAdagradadagradc                   p     e Zd Z	 	 	 	 	 	 dddddee   dedef fdZ fdZd Zd	 Ze	dd
       Z
 xZS )r   F)maximizedifferentiableforeachr   r   c          
      :   d|k  st        d|       d|k  st        d|       d|k  st        d|       d|k  st        d|       d|k  st        d|       t        ||||||||	      }
t        |   ||
       | j                  D ]  }|d   D ]  }| j
                  |   }t        j                  dt               	      |d
<   t        j                  |      rt        ||      n|}t        j                  ||t        j                        |d<     y )Ng        zInvalid learning rate: zInvalid lr_decay value: zInvalid weight_decay value: z)Invalid initial_accumulator_value value: zInvalid epsilon value: )lrlr_decayepsweight_decayinitial_accumulator_valuer   r   r   paramsdtypestep)memory_formatsum)
ValueErrordictsuper__init__param_groupsstatetorchtensorr
   
is_complexcomplex	full_likepreserve_format)selfr   r   r   r   r   r   r   r   r   defaultsgrouppr'   
init_value	__class__s                  R/var/www/html/test/engine/venv/lib/python3.12/site-packages/torch/optim/adagrad.pyr%   zAdagrad.__init__   sY    by6rd;<<h7zBCCl";L>JKK//;<U;VW  cz6se<==%&?)	
 	*&& 	E8_ 


1 %S8I8K Lf ''* 57PQ2 
  %z1F1F e
	    c                    t         |   |       | j                  D ]8  }|j                  dd        |j                  dd       |j                  dd       : t	        | j
                  j                               }t        |      dk7  xr t        j                  |d   d         }|s6|D ]0  }t        j                  t        |d         t                     |d<   2 y y )Nr   r   Fr   r   r   r   )r$   __setstate__r&   
setdefaultlistr'   valueslenr(   	is_tensorr)   floatr
   )r.   r'   r0   state_valuesstep_is_tensorsr3   s         r4   r7   zAdagrad.__setstate__@   s    U#&& 	6EY-Z/-u5	6
 DJJ--/0l+q0 
eooOF#7
 ! V!LLqy)9ARATU&	V r5   c                 ~    | j                   D ].  }|d   D ]$  }| j                  |   }|d   j                          & 0 y )Nr   r!   )r&   r'   share_memory_)r.   r0   r1   r'   s       r4   share_memoryzAdagrad.share_memoryO   sG    && 	-E8_ -

1e**,-	-r5   c                 j   d\  }}|d   D ]  }|j                   ||j                   j                  z  }|t        j                  |      z  }|j	                  |       |j	                  |j                          | j
                  |   }	|j	                  |	d          |j	                  |	d           ||fS )N)FFr   r!   r   )grad	is_sparser(   r*   appendr'   )
r.   r0   params_with_gradgrads
state_sumsstate_stepshas_sparse_gradhas_complexr1   r'   s
             r4   _init_groupzAdagrad._init_groupU   s    '3$x 	2Avv!166#3#33u//22 ''*QVV$

1!!%,/""5=1	2 ++r5   c                 *   d}|$t        j                         5   |       }ddd       | j                  D ]O  }g }g }g }g }| j                  |||||      \  }}	t	        |||||d   |d   |d   |d   ||d   |d   |d   |		       Q |S # 1 sw Y   ixY w)
zPerform 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   rL   r   r   r   rM   )r(   enable_gradr&   rN   r   )
r.   closurelossr0   rH   rI   rJ   rK   rL   rM   s
             r4   r   zAdagrad.stepc   s     ""$ !y! && 	E!EJK+/+;+;ECSUZ\fhs+t(O[ ;">2z*%L /i(z*$%56'	0 7! !s   B		B)g{Gz?r   r   r   g|=NN)__name__
__module____qualname__r   boolr%   r7   rC   rN   r   r   __classcell__)r3   s   @r4   r   r      sp     "#"&1 $1 $1 1 1fV-, "% "%r5   a[  Implements Adagrad algorithm.

    .. math::
       \begin{aligned}
            &\rule{110mm}{0.4pt}                                                                 \\
            &\textbf{input}      : \gamma \text{ (lr)}, \: \theta_0 \text{ (params)}, \: f(\theta)
                \text{ (objective)}, \: \lambda \text{ (weight decay)},                          \\
            &\hspace{12mm}    \tau \text{ (initial accumulator value)}, \: \eta\text{ (lr decay)}\\
            &\textbf{initialize} :  state\_sum_0 \leftarrow 0                             \\[-1.ex]
            &\rule{110mm}{0.4pt}                                                                 \\
            &\textbf{for} \: t=1 \: \textbf{to} \: \ldots \: \textbf{do}                         \\
            &\hspace{5mm}g_t           \leftarrow   \nabla_{\theta} f_t (\theta_{t-1})           \\
            &\hspace{5mm} \tilde{\gamma}    \leftarrow \gamma / (1 +(t-1) \eta)                  \\
            &\hspace{5mm} \textbf{if} \: \lambda \neq 0                                          \\
            &\hspace{10mm} g_t \leftarrow g_t + \lambda \theta_{t-1}                             \\
            &\hspace{5mm}state\_sum_t  \leftarrow  state\_sum_{t-1} + g^2_t                      \\
            &\hspace{5mm}\theta_t \leftarrow
                \theta_{t-1}- \tilde{\gamma} \frac{g_t}{\sqrt{state\_sum_t}+\epsilon}            \\
            &\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 `Adaptive Subgradient Methods for Online Learning
    and Stochastic Optimization`_.
    a  
    Args:
        params (iterable): iterable of parameters to optimize or dicts defining
            parameter groups
        lr (float, optional): learning rate (default: 1e-2)
        lr_decay (float, optional): learning rate decay (default: 0)
        weight_decay (float, optional): weight decay (L2 penalty) (default: 0)
        eps (float, optional): term added to the denominator to improve
            numerical stability (default: 1e-10)
        z	
        z

    .. _Adaptive Subgradient Methods for Online Learning and Stochastic
        Optimization: http://jmlr.org/papers/v12/duchi11a.html

    r   rI   rJ   rK   rL   r   r   rM   r   r   r   r   r   c                <   t        d |D              st        d      |t        | |d      \  }}|r)t        j                  j                         rt        d      |r%t        j                  j                         st        }nt        } || |||||	|
|||||       y)ztFunctional API that performs Adagrad algorithm computation.

    See :class:`~torch.optim.Adagrad` for details.
    c              3   P   K   | ]  }t        |t        j                           y wrS   )
isinstancer(   r   ).0ts     r4   	<genexpr>zadagrad.<locals>.<genexpr>   s     @qz!U\\*@s   $&zPAPI has changed, `state_steps` argument must contain a list of singleton tensorsNF)	use_fusedz6torch.jit.script not supported with foreach optimizersr   r   r   r   rL   r   r   rM   )allRuntimeErrorr	   r(   jitis_scripting_multi_tensor_adagrad_single_tensor_adagrad)r   rI   rJ   rK   rL   r   r   rM   r   r   r   r   r   _funcs                  r4   r   r      s    , @K@@^
 	
 1&.TYZ
7599))+STTuyy--/$%!'%r5   c                     | j                         }|j                         dk(  s|j                         dk(  rt        j                  |       S t        j                  |||      S )Nr   )sizenumelr(   
empty_likesparse_coo_tensor)rE   grad_indicesr:   rj   s       r4   _make_sparsero      sQ    99;Dq FLLNa$7%%""<>>r5   c          
      6   t        | |||      D ]  \  }}}}|dz  }t        |      }|	s|n| }|dk7  r*|j                  rt        d      |j	                  ||      }|d|dz
  |z  z   z  }|j                  r|j                         }|j                         }|j                         }|j                  t        |||j                  d                   |j                  |      }|j                         j                         j                  |      }|j                  t        ||||z        |        &t        j                  |      }|r?t        j                  |      }t        j                  |      }t        j                  |      }|j!                  ||d       |
r|j#                         |z   }n|j#                         j                  |      }|j%                  |||        |st        j&                  |      }t        j&                  |      }
 y )Nr   r   z;weight_decay option is not compatible with sparse gradientsalpha   value)zipr   rF   rb   addcoalesce_indices_valuesadd_ro   powsparse_masksqrt_r(   r*   view_as_realaddcmul_sqrtaddcdiv_view_as_complex)r   rI   rJ   rK   r   r   r   r   rL   r   r   rM   paramrE   	state_sumstep_tr   clrrn   grad_valuesstd
std_valuesr*   s                          r4   rf   rf      s     -0z;,W (=(i!&!#t$1~~"Q  88E86DAX--.>>==?D==?L,,.KNN<lKOOA<NOP''-C,,.33C8JJJT<z1IJSVRV   ))%0J))$/!..y9	**51tT3nn&,nn&++C0NN4SDN1--e4!11)<	Q(=r5   c                   |
rJ d       t        |       dk(  ry t        j                  | |||g      }|j                         D ]  \  \  }}}}}|xr t	        d |D              }|rt        ||||||||dd|
|       <|rt        |||       |	rt        j                  |      }|d   j                  r.t        j                  |t        j                  dd	      d
       nt        j                  |d       |dk7  r3|	rt        j                  |||
       nt        j                  |||
      }|D cg c]  }| dt        |      dz
  |z  z   z   }}t        j                  |||d       t        j                  |      }t        j                  ||       |dk7  s|	rt        j                   ||       |}nt        j"                  ||      }t        j$                  |||        y c c}w )Nz#_foreach ops don't support autogradr   c              3   4   K   | ]  }|j                     y wrS   )rF   )r\   rE   s     r4   r^   z(_multi_tensor_adagrad.<locals>.<genexpr>H  s     8aD8as   TFr`   g      ?cpu)devicerq   r   rt   )r;   r   "_group_tensors_by_device_and_dtyper:   anyrf   r   r(   _foreach_negis_cpu_foreach_add_r)   _foreach_addr   _foreach_addcmul__foreach_sqrt_foreach_mul__foreach_mul_foreach_addcdiv_)r   rI   rJ   rK   r   r   r   r   rL   r   r   rM   grouped_tensorlistsdevice_paramsdevice_gradsdevice_state_sumsdevice_state_stepsrg   device_has_sparse_gradr   	minus_clrr   	numerators                          r4   re   re   0  s     DDD 6{a#FFPUWacnGopUhUoUoUq 9?Q	M-'8:Lq!0!aS8aT`8a5a!"!")! $-'  -7HI --l;L a '' 2ELLU4S[^_ 2A61##L-|T$11,UabOabtbSAD!1A!5 AABb	b 1<UVW!!"34C%1i8$I**<CIy#>s9?V cs   3G))NNFF)r(   r   	optimizerr   r   r   r   r	   r
   r   r   r   typingr   r   __all__r   __doc__rW   r=   r   ro   rf   re    r5   r4   <module>r      s=    5 5 5 "i
 }i }@2		 
 		 		 3)f !" 3L3<3 V3 f	3 3 d^3 3 3 	3 3 3 
3  !3l?8=L8=<8= V8= f	8= 	8= 8= 8= 
8= 8= 8= 8= 8=vP?LP?<P? VP? f	P? 	P? P? P? 
P? P? P? P? P?r5   