U
    •Ê¹jœ0  ã                   @   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 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dœdd„Z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dœ
dd„ZdS )é    N)ÚTensoré   )Ú	OptimizerÚ_use_grad_for_differentiableÚ_default_to_fused_or_foreachÚ_differentiable_docÚ_foreach_docÚ_maximize_doc)ÚListÚOptionalÚRpropÚrpropc                       sX   e Zd Zdddd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      à?g333333ó?©g�íµ ÷Æ°>é2   NF)ÚforeachÚmaximizeÚdifferentiablec          	         s€   d|kst d|› �ƒ‚d|d   k r<d  k r<|d k sZn t d|d › d|d › �ƒ‚t||||||d�}tƒ  ||¡ d S )	Ng        zInvalid learning rate: r   g      ð?r   zInvalid eta values: z, )ÚlrÚetasÚ
step_sizesr   r   r   )Ú
ValueErrorÚdictÚsuperÚ__init__)	ÚselfÚparamsr   r   r   r   r   r   Údefaults©Ú	__class__© úP/var/www/html/bwave/python/venv/lib/python3.8/site-packages/torch/optim/rprop.pyr      s    (úzRprop.__init__c                    s@   t ƒ  |¡ | jD ](}| dd ¡ | dd¡ | dd¡ qd S )Nr   r   Fr   )r   Ú__setstate__Úparam_groupsÚ
setdefault)r   ÚstateÚgroupr   r!   r"   r#   %   s
    
zRprop.__setstate__c           	      C   sð   |d D ]â}|j d krq| |¡ |j }|jr6tdƒ‚| |¡ | j| }t|ƒdkr¾d|d< tj|tjd�|d< |j	j
r¢| ¡  |¡ t|d |d ƒ¡|d< n| ¡  |¡ |d ¡|d< | |d ¡ | |d ¡ |d  d	7  < qd S )
Nr   z'Rprop does not support sparse gradientsr   Ústep©Zmemory_formatÚprevr   Ú	step_sizer   )ÚgradÚappendZ	is_sparseÚRuntimeErrorr&   ÚlenÚtorchZ
zeros_likeÚpreserve_formatZdtypeÚ
is_complexÚnewZ
resize_as_Zfill_Úcomplex)	r   r'   r   ÚgradsÚprevsr   Úpr,   r&   r!   r!   r"   Ú_init_group,   s6    



 ÿ
ÿþÿÿzRprop._init_groupc                 C   s¢   d}|dk	r&t  ¡ � |ƒ }W 5 Q R X | jD ]p}g }g }g }g }|d \}}	|d \}
}|d }|d }|  |||||¡ t|||||
|||	|||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   )Ústep_size_minÚstep_size_maxÚetaminusÚetaplusr   r   r   )r0   Zenable_gradr$   r8   r   )r   ÚclosureZlossr'   r   r5   r6   r   r;   r<   r9   r:   r   r   r!   r!   r"   r(   P   s8    

õz
Rprop.step)r   r   r   )N)Ú__name__Ú
__module__Ú__qualname__r   Úboolr   r#   r8   r   r(   Ú__classcell__r!   r!   r   r"   r   
   s       û÷÷$aÁ
  Implements the resilient backpropagation algorithm.

    .. math::
       \begin{aligned}
            &\rule{110mm}{0.4pt}                                                                 \\
            &\textbf{input}      : \theta_0 \in \mathbf{R}^d \text{ (params)},f(\theta)
                \text{ (objective)},                                                             \\
            &\hspace{13mm}      \eta_{+/-} \text{ (etaplus, etaminus)}, \Gamma_{max/min}
                \text{ (step sizes)}                                                             \\
            &\textbf{initialize} :   g^0_{prev} \leftarrow 0,
                \: \eta_0 \leftarrow \text{lr (learning rate)}                                   \\
            &\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} \textbf{for} \text{  } i = 0, 1, \ldots, d-1 \: \mathbf{do}            \\
            &\hspace{10mm}  \textbf{if} \:   g^i_{prev} g^i_t  > 0                               \\
            &\hspace{15mm}  \eta^i_t \leftarrow \mathrm{min}(\eta^i_{t-1} \eta_{+},
                \Gamma_{max})                                                                    \\
            &\hspace{10mm}  \textbf{else if}  \:  g^i_{prev} g^i_t < 0                           \\
            &\hspace{15mm}  \eta^i_t \leftarrow \mathrm{max}(\eta^i_{t-1} \eta_{-},
                \Gamma_{min})                                                                    \\
            &\hspace{15mm}  g^i_t \leftarrow 0                                                   \\
            &\hspace{10mm}  \textbf{else}  \:                                                    \\
            &\hspace{15mm}  \eta^i_t \leftarrow \eta^i_{t-1}                                     \\
            &\hspace{5mm}\theta_t \leftarrow \theta_{t-1}- \eta_t \mathrm{sign}(g_t)             \\
            &\hspace{5mm}g_{prev} \leftarrow  g_t                                                \\
            &\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 the paper
    `A Direct Adaptive Method for Faster Backpropagation Learning: The RPROP Algorithm
    <http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.21.1417>`_.
    aò  
    Args:
        params (iterable): iterable of parameters to optimize or dicts defining
            parameter groups
        lr (float, optional): learning rate (default: 1e-2)
        etas (Tuple[float, float], optional): pair of (etaminus, etaplus), that
            are multiplicative increase and decrease factors
            (default: (0.5, 1.2))
        step_sizes (Tuple[float, float], optional): a pair of minimal and
            maximal allowed step sizes (default: (1e-6, 50))
        z	
        z

    F)r   r5   r6   r   r   r   r   r9   r:   r;   r<   c                C   sh   |dkrt | |dd�\}}|r0tj ¡ r0tdƒ‚|rDtj ¡ sDt}nt}|| ||||||	|
||d�
 dS )zpFunctional API that performs rprop algorithm computation.

    See :class:`~torch.optim.Rprop` for details.
    NF)Z	use_fusedz6torch.jit.script not supported with foreach optimizers)r9   r:   r;   r<   r   r   )r   r0   ZjitZis_scriptingr.   Ú_multi_tensor_rpropÚ_single_tensor_rprop)r   r5   r6   r   r   r   r   r9   r:   r;   r<   Ú_Úfuncr!   r!   r"   r   ¬   s&    ö)
r   r5   r6   r   r9   r:   r;   r<   r   r   c                C   s
  t | ƒD ]ü\}
}||
 }|s |n| }||
 }||
 }t |¡rht |¡}t |¡}t |¡}t |¡}|	r€| | ¡ ¡ ¡ }n| |¡ ¡ }||| d¡< ||| d¡< d|| 	d¡< | 
|¡ ||¡ |jtjd�}d|| 	|¡< |j| ¡ |dd� | |¡ qd S )Nr   r   r)   éÿÿÿÿ©Úvalue)Ú	enumerater0   r2   Úview_as_realÚmulÚcloneÚsignÚgtÚltÚeqZmul_Úclamp_r1   Zaddcmul_Zcopy_)r   r5   r6   r   r9   r:   r;   r<   r   r   ÚiÚparamr,   r*   r+   rN   r!   r!   r"   rD   Ú   s*    




rD   c                C   sb  t | ƒdkrd S |	rtdƒ‚t | |||g¡}
|
 ¡ D �]$\\}}}}}dd„ }||ƒ}||ƒ}||ƒ}||ƒ}t ||¡}|rŠt |¡ t ||¡ |r¤t |¡ |}t 	|¡ |D ].}||| 
d¡< ||| d¡< d|| d¡< q¶t ||¡ |D ]}| ||¡ qöt|ƒ}tt |ƒƒD ]}d|| ||  |¡< �q~dd„ |D ƒ}tj|||dd	� q6d S )
Nr   z#_foreach ops don't support autogradc                 S   s   dd„ | D ƒS )Nc                 S   s$   g | ]}t  |¡rt  |¡n|‘qS r!   )r0   r2   rK   )Ú.0Útr!   r!   r"   Ú
<listcomp>  s    zF_multi_tensor_rprop.<locals>._view_complex_as_real.<locals>.<listcomp>r!   )Ztensor_listr!   r!   r"   Ú_view_complex_as_real  s    ÿz2_multi_tensor_rprop.<locals>._view_complex_as_realr   c                 S   s   g | ]}|  ¡ ‘qS r!   )rN   )rU   r,   r!   r!   r"   rW   I  s     z'_multi_tensor_rprop.<locals>.<listcomp>rG   rH   )r/   ÚAssertionErrorr   Z"_group_tensors_by_device_and_dtypeÚvaluesr0   Z_foreach_mulZ_foreach_neg_Z_foreach_copy_Z_foreach_sign_rO   rP   rQ   Z_foreach_mul_rR   ÚlistÚrangeZ_foreach_addcmul_)r   r5   r6   r   r9   r:   r;   r<   r   r   Zgrouped_tensorsZgrouped_paramsZgrouped_gradsZgrouped_prevsZgrouped_step_sizesrE   rX   ZsignsrN   r+   rS   Z
grad_signsr!   r!   r"   rC     s>    


rC   )NFF)r0   r   Z	optimizerr   r   r   r   r   r	   Útypingr
   r   Ú__all__r   Ú__doc__rA   Úfloatr   rD   rC   r!   r!   r!   r"   Ú<module>   sh    p"
öõôÞ9   ÷ò/õ/õ