U
    •Ê¹jß7  ã                   @   s4  d dl Z d dl mZ ddl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„ deƒZd	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dœdd„Ze
e e
e e
e e
e e
e eee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dœdd„ZdS )é    N)ÚTensoré   )Ú	OptimizerÚ_default_to_fused_or_foreachÚ_use_grad_for_differentiableÚ_differentiable_docÚ_foreach_docÚ_maximize_doc)ÚListÚOptionalÚRMSpropÚrmspropc                	       sN   e Zd Zdee eedœ‡ fdd	„Z‡ fd
d„Zdd„ Zeddd„ƒZ	‡  Z
S )r   ç{®Gáz„?ç®Gáz®ï?ç:Œ0âŽyE>r   FN)ÚforeachÚmaximizeÚdifferentiablec                    sš   d|kst d|› �ƒ‚d|ks,t d|› �ƒ‚d|ksBt d|› �ƒ‚d|ksXt d|› �ƒ‚d|ksnt d|› �ƒ‚t||||||||	|
d�	}tƒ  ||¡ d S )Ng        zInvalid learning rate: zInvalid epsilon value: zInvalid momentum value: zInvalid weight_decay value: zInvalid alpha value: )	ÚlrÚmomentumÚalphaÚepsÚcenteredÚweight_decayr   r   r   )Ú
ValueErrorÚdictÚsuperÚ__init__)ÚselfÚparamsr   r   r   r   r   r   r   r   r   Údefaults©Ú	__class__© úR/var/www/html/bwave/python/venv/lib/python3.8/site-packages/torch/optim/rmsprop.pyr      s,    ÷zRMSprop.__init__c                    sX   t ƒ  |¡ | jD ]@}| dd¡ | dd¡ | dd ¡ | dd¡ | dd¡ qd S )Nr   r   r   Fr   r   r   )r   Ú__setstate__Úparam_groupsÚ
setdefault)r   ÚstateÚgroupr!   r#   r$   r%   0   s    
zRMSprop.__setstate__c           	      C   s$  |d D �]}|j d krq| |¡ |j jr4tdƒ‚| |j ¡ | j| }t|ƒdkr®d|d< tj|tjd�|d< |d dkr’tj|tjd�|d< |d	 r®tj|tjd�|d
< | |d ¡ |d dkrÖ| |d ¡ |d	 rì| |d
 ¡ |d �rt	|d t
ƒ�rtdƒ‚|d  d7  < qd S )Nr   z)RMSprop does not support sparse gradientsr   Ústep)Zmemory_formatÚ
square_avgr   Zmomentum_bufferr   Úgrad_avgr   z`step` can't be a tensorr   )ÚgradÚappendZ	is_sparseÚRuntimeErrorr(   ÚlenÚtorchZ
zeros_likeZpreserve_formatÚ
isinstancer   )	r   r)   Úparams_with_gradÚgradsÚsquare_avgsÚmomentum_buffer_listÚ	grad_avgsÚpr(   r#   r#   r$   Ú_init_group9   s@    


 ÿ
 ÿ
 ÿ
zRMSprop._init_groupc           	      C   s¦   d}|dk	r&t  ¡ � |ƒ }W 5 Q R X | jD ]t}g }g }g }g }g }|  ||||||¡ t||||||d |d |d |d |d |d |d |d	 |d
 d� q,|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   r   r   r   r   r   r   r   r   )r1   Zenable_gradr&   r9   r   )	r   ÚclosureZlossr)   r3   r4   r5   r7   r6   r#   r#   r$   r*   _   s8    

òzRMSprop.step)	r   r   r   r   r   FNFF)N)Ú__name__Ú
__module__Ú__qualname__r   Úboolr   r%   r9   r   r*   Ú__classcell__r#   r#   r!   r$   r   
   s$            õ	õ%	&a  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\\
            &\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.
    aŸ  
    Args:
        params (iterable): iterable of parameters to optimize or dicts defining
            parameter groups
        lr (float, optional): learning rate (default: 1e-2)
        momentum (float, optional): momentum factor (default: 0)
        alpha (float, optional): smoothing constant (default: 0.99)
        eps (float, optional): term added to the denominator to improve
            numerical stability (default: 1e-8)
        centered (bool, optional) : if ``True``, compute the centered RMSProp,
            the gradient is normalized by an estimation of its variance
        weight_decay (float, optional): weight decay (L2 penalty) (default: 0)
        z	
        z

    F)r   r4   r5   r7   r6   r   r   r   r   r   r   r   r   r   c                C   sn   |dkrt | |dd�\}}|r0tj ¡ r0tdƒ‚|rDtj ¡ sDt}nt}|| ||||||	|
|||||d� dS )zsFunctional API that performs rmsprop algorithm computation.
    See :class:`~torch.optim.RMSProp` for details.
    NF)Z	use_fusedz6torch.jit.script not supported with foreach optimizers)r   r   r   r   r   r   r   r   )r   r1   ZjitZis_scriptingr/   Ú_multi_tensor_rmspropÚ_single_tensor_rmsprop)r   r4   r5   r7   r6   r   r   r   r   r   r   r   r   r   Ú_Úfuncr#   r#   r$   r   Æ   s,    ó)r   r4   r5   r7   r6   r   r   r   r   r   r   r   r   c                C   sL  t | ƒD �]<\}}|| }|s"|n| }|| }|dkrF|j||d�}t |¡}|rrt |¡}t |¡}t |¡}| |¡j||d| d� |
rÌ|| }|r¦t |¡}| |d| ¡ |j||dd� 	¡ }n| 
¡ }|rä| |¡}n
| |¡}|	dk�r4|| }|�rt |¡}| |	¡ ||¡ |j|| d� q|j||| d� qd S )Nr   ©r   r   ©Úvalueéÿÿÿÿ)Ú	enumerateÚaddr1   Ú
is_complexÚview_as_realZmul_Zaddcmul_Zlerp_ZaddcmulZsqrt_ÚsqrtZadd_Zaddcdiv_)r   r4   r5   r7   r6   r   r   r   r   r   r   r   r   ÚiÚparamr-   r+   Zis_complex_paramr,   ÚavgÚbufr#   r#   r$   rA   ù   s:    







rA   c                C   s„  t | ƒdkrd S |rtdƒ‚t | ||||g¡}| ¡ D �]D\\}}}}}}|rZt |¡}|dkrˆ|rxtj|||d� ntj|||d�}dd„ }||ƒ}||ƒ}||ƒ}t 	||¡ tj
|||d| d� |
�r||ƒ}t ||d| ¡ tj|||dd�}t |¡ t ||¡ nt |¡}t ||¡ |	dk�rj||ƒ}t 	||	¡ t |||¡ tj||| d� q8tj|||| d� q8d S )	Nr   z#_foreach ops don't support autogradrD   c                 S   s   dd„ | D ƒS )Nc                 S   s$   g | ]}t  |¡rt  |¡n|‘qS r#   )r1   rJ   rK   )Ú.0Útr#   r#   r$   Ú
<listcomp>V  s    zH_multi_tensor_rmsprop.<locals>._view_complex_as_real.<locals>.<listcomp>r#   )Ztensor_listr#   r#   r$   Ú_view_complex_as_realU  s    ÿz4_multi_tensor_rmsprop.<locals>._view_complex_as_realr   rE   rG   )r0   ÚAssertionErrorr   Z"_group_tensors_by_device_and_dtypeÚvaluesr1   Z_foreach_negZ_foreach_add_Z_foreach_addZ_foreach_mul_Z_foreach_addcmul_Z_foreach_lerp_Z_foreach_addcmulZ_foreach_sqrt_Z_foreach_sqrtZ_foreach_addcdiv_)r   r4   r5   r7   r6   r   r   r   r   r   r   r   r   Zgrouped_tensorsZgrouped_paramsZgrouped_gradsZgrouped_square_avgsZgrouped_grad_avgsZgrouped_momentum_buffer_listrB   rT   rO   r#   r#   r$   r@   2  sD    ÿ 



r@   )NFF)r1   r   Z	optimizerr   r   r   r   r   r	   Útypingr
   r   Ú__all__r   Ú__doc__r>   Úfloatr   rA   r@   r#   r#   r#   r$   Ú<module>   sz    *ôóòÖE   öï4ò:ò