
    igP              &       8   d Z ddlmZ 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mZmZ ddgZ G d	 de      Zd
de de de
 de de dz   e_         dee   dee   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dededdf"d Zdee   dee   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dededdf"d!Z e	e"      	 	 	 	 	 d%dee   dee   dee   dee   dee   dee   d#edz  dededededededededededdf$d$       Zy)&z)Implementation for the RMSprop algorithm.    )castN)Tensor   )_capturable_doc_default_to_fused_or_foreach_differentiable_doc_disable_dynamo_if_unsupported_foreach_doc!_get_capturable_supported_devices_get_scalar_dtype_maximize_doc_params_doc
_to_scalar_use_grad_for_differentiable_view_as_real	OptimizerParamsTRMSproprmspropc                        e Zd Z	 	 	 	 	 	 	 	 	 	 ddedeez  dededededed	ed
edz  dededdf fdZ fdZd Z	e
dd       Z xZS )r   Nparamslralphaepsweight_decaymomentumcentered
capturableforeachmaximizedifferentiablereturnc                 Z   t        |t              r|j                         dk7  rt        d      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|       ||||||||	|
|d	
}t        |   ||       y )
Nr   zTensor lr must be 1-elementg        zInvalid learning rate: zInvalid epsilon value: zInvalid momentum value: zInvalid weight_decay value: zInvalid alpha value: )
r   r   r   r   r   r   r   r   r    r!   )
isinstancer   numel
ValueErrorsuper__init__)selfr   r   r   r   r   r   r   r   r   r    r!   defaults	__class__s                M/var/www/html/engine/venv/lib/python3.12/site-packages/torch/optim/rmsprop.pyr(   zRMSprop.__init__   s     b&!bhhjAo:;;by6rd;<<cz6se<==h7zBCCl";L>JKKe|4UG<==   ($ ,
 	*    c                 |   t         |   |       | j                  D ]  }|j                  dd       |j                  dd       |j                  dd        |j                  dd       |j                  dd       |j                  dd       |d	   D ]  }| j                  j                  |g       }t        |      dk7  s.t        j                  |d
         rGt        |d
         }|d   r*t        j                  |t               |j                        nt        j                  |t                     |d
<     y )Nr   r   r   Fr   r    r!   r   r   stepdtypedevicer1   )r'   __setstate__param_groups
setdefaultstategetlentorch	is_tensorfloattensorr   r2   )r)   r7   grouppp_statestep_valr+   s         r,   r4   zRMSprop.__setstate__H   s   U#&& 	EZ+Z/Y-Z/-u5\518_ 
**..B/w<1$U__WV_-M$WV_5H
 !. $,=,? #\\(:K:MN FO	
	r-   c                    d}|d   D ]  }	|	j                   |t        j                  |	      z  }|j                  |	       |	j                   j                  rt        d      |j                  |	j                          | j                  |	   }
t        |
      dk(  r|d   r*t        j                  dt               |	j                        nt        j                  dt                     |
d	<   t        j                  |	t        j                  
      |
d<   |d   dkD  r(t        j                  |	t        j                  
      |
d<   |d   r(t        j                  |	t        j                  
      |
d<   |j                  |
d          |j                  |
d	          |d   dkD  r|j                  |
d          |d   s|j                  |
d           |S )NFr   z)RMSprop does not support sparse gradientsr   r    r0   r3   r/   )memory_format
square_avgr   momentum_bufferr   grad_avg)gradr:   
is_complexappend	is_sparseRuntimeErrorr7   r9   zerosr   r2   
zeros_likepreserve_format)r)   r>   params_with_gradgradssquare_avgsmomentum_buffer_list	grad_avgsstate_stepshas_complexr?   r7   s              r,   _init_groupzRMSprop._init_group]   s    x $	4Avv~5++A..K##A&vv"#NOOLL JJqME 5zQ \* KK*;*=ahhOR/@/BC f
 ',&6&6U%:%:'l# $q(/4/?/?)>)>0E+, $(-(8(8)>)>)E*% u\23uV}-Z 1$$++E2C,DEZ   z!23I$	4L r-   c                 j   | j                          d}|$t        j                         5   |       }ddd       | j                  D ]_  }g }g }g }g }g }g }	| j	                  |||||||	      }
t        ||||||	|d   |d   |d   |d   |d   |d   |d   |d	   |d
   |d   |
       a |S # 1 sw Y   yx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   r   r   r   r   r   r   r    r!   r   rV   ) _cuda_graph_capture_health_checkr:   enable_gradr5   rW   r   )r)   closurelossr>   rP   rQ   rR   rT   rS   rU   rV   s              r,   r/   zRMSprop.step   s    	--/""$ !y! && $	E-/"$E(*K&(I13 (*K** $K  $;Gn%L">2z*z*i(z*$%56 .'#%$	L S! !s   B))B2)
g{Gz?gGz?g:0yE>r   r   FFNFFN)__name__
__module____qualname__r   r<   r   boolr(   r4   rW   r   r/   __classcell__)r+   s   @r,   r   r      s     " #$'+'+ FN'+ 	'+
 '+ '+ '+ '+ '+ '+ '+ '+ 
'+R*1f "4 "4r-   aj  Implements RMSprop algorithm.

    .. math::
       \begin{aligned}
            &\rule{110mm}{0.4pt}                                                                 \\
            &\textbf{input}      : \alpha \text{ (alpha)}, \: \gamma \text{ (lr)},
                \: \theta_0 \text{ (params)}, \: f(\theta) \text{ (objective)}                   \\
            &\hspace{13mm}   \lambda \text{ (weight decay)},\: \mu \text{ (momentum)},
                \: centered, \: \epsilon \text{ (epsilon)}                                       \\
            &\textbf{initialize} : v_0 \leftarrow 0 \text{ (square average)}, \:
                \textbf{b}_0 \leftarrow 0 \text{ (buffer)}, \: g^{ave}_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}if \: \lambda \neq 0                                                    \\
            &\hspace{10mm} g_t \leftarrow g_t + \lambda  \theta_{t-1}                            \\
            &\hspace{5mm}v_t           \leftarrow   \alpha v_{t-1} + (1 - \alpha) g^2_t
                \hspace{8mm}                                                                     \\
            &\hspace{5mm} \tilde{v_t} \leftarrow v_t                                             \\
            &\hspace{5mm}if \: centered                                                          \\
            &\hspace{10mm} g^{ave}_t \leftarrow g^{ave}_{t-1} \alpha + (1-\alpha) g_t            \\
            &\hspace{10mm} \tilde{v_t} \leftarrow \tilde{v_t} -  \big(g^{ave}_{t} \big)^2        \\
            &\hspace{5mm}if \: \mu > 0                                                           \\
            &\hspace{10mm} \textbf{b}_t\leftarrow \mu \textbf{b}_{t-1} +
                g_t/ \big(\sqrt{\tilde{v_t}} +  \epsilon \big)                                   \\
            &\hspace{10mm} \theta_t \leftarrow \theta_{t-1} - \gamma \textbf{b}_t                \\
            &\hspace{5mm} else                                                                   \\
            &\hspace{10mm}\theta_t      \leftarrow   \theta_{t-1} -
                \gamma  g_t/ \big(\sqrt{\tilde{v_t}} + \epsilon \big)  \hspace{3mm}              \\
            &\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
    `lecture notes <https://www.cs.toronto.edu/~tijmen/csc321/slides/lecture_slides_lec6.pdf>`_ by G. Hinton.
    and centered version `Generating Sequences
    With Recurrent Neural Networks <https://arxiv.org/pdf/1308.0850v5.pdf>`_.
    The implementation here takes the square root of the gradient average before
    adding epsilon (note that TensorFlow interchanges these two operations). The effective
    learning rate is thus :math:`\gamma/(\sqrt{v} + \epsilon)` where :math:`\gamma`
    is the scheduled learning rate and :math:`v` is the weighted moving average
    of the squared gradient.
    z
    Args:
        a0  
        lr (float, Tensor, optional): learning rate (default: 1e-2)
        alpha (float, optional): smoothing constant (default: 0.99)
        eps (float, optional): term added to the denominator to improve
            numerical stability (default: 1e-8)
        weight_decay (float, optional): weight decay (L2 penalty) (default: 0)
        momentum (float, optional): momentum factor (default: 0)
        centered (bool, optional) : if ``True``, compute the centered RMSProp,
            the gradient is normalized by an estimation of its variance
        z	
        z

    r   rQ   rR   rT   rS   rU   r   r   r   r   r   r   r    r!   r   rV   r"   c       
            t         j                  j                         st        |      }t	        |       D ]+  \  }}||   }t         j
                  j                         s`|r^t               }|j                  j                  |j                  j                  k(  r|j                  j                  |v st        d| d      ||   }|s|n| }||   }|dz  }|	dk7  r|j                  ||	      }t        j                  |      }|r?t        j                  |      }t        j                  |      }t        j                  |      }|j                  |      j                  ||d|z
         |rT||   }|rt        j                  |      }|j!                  |d|z
         |j#                  ||d      j%                         }n|j'                         }|r|j                  |      }n|j)                  |      }|
dkD  rS||   }|rt        j                  |      }|j                  |
      j+                  ||       |j)                  ||        |j+                  |||        . y )NIIf capturable=True, params and state_steps must be on supported devices: .r   r   r   value)r:   jitis_scriptingr   	enumeratecompileris_compilingr   r2   typeAssertionErroraddrI   view_as_realmul_addcmul_lerp_addcmulsqrt_sqrtadd_addcdiv_)r   rQ   rR   rT   rS   rU   r   r   r   r   r   r   r    r!   r   rV   iparamr/   capturable_supported_devicesrH   rE   is_complex_paramrG   avgbufs                             r,   _single_tensor_rmspropr   	  s,   & 99!!#^f% 4151~ ~~**,+L+N(!!T[[%5%55LL%%)EE$_`|_}}~  Qx#t$ ^
	188E86D ++E2&&u-E%%d+D++J7J''d!e)'D |H --h7NN4U+$$Xxr$BHHJC//#C''#,C((3-Ca<&q)C((-HHX''c2JJs2#J&NN4RCN0i41r-   c       
         \  ! t        |       dk(  ry |rt        d      t        j                  j	                         s;|r9t               !t        !fdt        | |d      D              st        d! d      t        |      }t        j                  | |||||g      }|j                         D ]|  \  \  }}}}}}}t        t        t           |      }t        t        t           |      }t        t        t           |      }t        t        t           |      }|rg||g}|
dkD  r(t        t        t           |      }|j                  |       |r(t        t        t           |      }|j                  |       t!        |g|  |rt        j"                  |      }t        j                  j	                         s=|d   j$                  r.t        j&                  |t        j(                  dd	
      d       nt        j&                  |d       |	dk7  r3|rt        j&                  |||	       nt        j*                  |||	      }t        j,                  ||       t        j.                  |||d|z
         |rvt        t        t           |      }t        j0                  ||d|z
         t        j2                  |||d      }t        j4                  |       t        j&                  ||       n+t        j6                  |      }t        j&                  ||       |
dkD  rt        t        t           |      }t        j,                  ||
       t        j8                  |||       |rIt;        |t        j                        r/t        j<                  ||       } t        j&                  ||        t        j&                  |||        |rJt;        |t        j                        r0t        j>                  ||        t        j8                  |||       ct        j8                  ||||         y )Nr   z#_foreach ops don't support autogradc              3      K   | ]N  \  }}|j                   j                  |j                   j                  k(  xr |j                   j                  v  P y wr]   )r2   ro   ).0r?   r/   r}   s      r,   	<genexpr>z(_multi_tensor_rmsprop.<locals>.<genexpr>r  sQ      
 4 HHMMT[[--- >!==>
s   AAT)strictrd   re   g      ?cpu)r2   rf   r   rg   ri   ) r9   rp   r:   rm   rn   r   allzipr   r   "_group_tensors_by_device_and_dtypevaluesr   listr   rJ   r   _foreach_negis_cpu_foreach_add_r=   _foreach_add_foreach_mul__foreach_addcmul__foreach_lerp__foreach_addcmul_foreach_sqrt__foreach_sqrt_foreach_addcdiv_r$   _foreach_mul_foreach_div_)"r   rQ   rR   rT   rS   rU   r   r   r   r   r   r   r    r!   r   rV   grouped_tensorsgrouped_params_grouped_grads_grouped_square_avgs_grouped_grad_avgs_grouped_momentum_buffer_list_grouped_state_steps__grouped_paramsgrouped_gradsgrouped_square_avgsgrouped_state_stepsstate_and_gradsgrouped_momentum_buffer_listgrouped_grad_avgsr   momentum_lrr}   s"                                    @r,   _multi_tensor_rmspropr   V  s   & 6{aBCC >>&&(Z'H'J$ 
 v{4@
 

 ![\x[yyz{  
BBBB	Y0DkRO ""$YW 				
 ) d6lO<T&\>:"4<1EF"4<1EF,.ABO!|/3L"?0,  &&'CD$(f7I$J!&&'89.;?;!..}=M ~~**,1DQ1G1N1N#U\\#e%DC  3Q71##M>V % 2 2!>! 	/7QY	
  $T&\3E F  !2M1u9M((#%68IQSC   %S)%%&9:CS)a<+/V;,(  <hG##$@-QTU jU\\:#001MPRsS##NK@##"$@ jU\\:##C"-''sK''sSURUVsYWr-   )single_tensor_fnr   c                   t         j                  j                         s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 rmsprop algorithm computation.

    See :class:`~torch.optim.RMSProp` for details.
    c              3   P   K   | ]  }t        |t        j                           y wr]   )r$   r:   r   )r   ts     r,   r   zrmsprop.<locals>.<genexpr>  s       5()
1ell#5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   r   r   r    r   r!   rV   )
r:   rm   rn   r   rL   r   rj   rk   r   r   )r   rQ   rR   rT   rS   rU   r   r    r!   r   rV   r   r   r   r   r   r   r   funcs                      r,   r   r     s    : >>&&( 5-85 2 ^
 	
 1Ne

7 599))+STTuyy--/$%!%!r-   )NFFFF)__doc__typingr   r:   r   	optimizerr   r   r   r	   r
   r   r   r   r   r   r   r   r   r   __all__r   r   r<   ra   r   r   r   rC   r-   r,   <module>r      s^   0      $ i
 gi gV+X		 		 
 		 		 		 Y< BJ1LJ1<J1 fJ1 F|	J1
 v,J1 fJ1 	J1 J1 
J1 J1 J1 J1 J1 J1  !J1" #J1$ 
%J1ZCWLCW<CW fCW F|	CW
 v,CW fCW 	CW CW 
CW CW CW CW CW CW  !CW" #CW$ 
%CWL  1GH   ALA<A fA F|	A
 v,A fA D[A A A A A 	A  !A" 
#A$ %A& 'A( )A* 
+A IAr-   