a
    8Sic”  ã                   @   sþ   d dl Z d dlZd dlmZ ddlmZ d dlmZmZ G dd„ deƒZd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
dœdd„Z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)ÚListÚOptionalc                       sJ   e Zd ZdZdee dœ‡ fd	d
„Z‡ fdd„Ze 	¡ ddd„ƒZ
‡  ZS )ÚASGDaH  Implements Averaged Stochastic Gradient Descent.

    It has been proposed in `Acceleration of stochastic approximation by
    averaging`_.

    Args:
        params (iterable): iterable of parameters to optimize or dicts defining
            parameter groups
        lr (float, optional): learning rate (default: 1e-2)
        lambd (float, optional): decay term (default: 1e-4)
        alpha (float, optional): power for eta update (default: 0.75)
        t0 (float, optional): point at which to start averaging (default: 1e6)
        weight_decay (float, optional): weight decay (L2 penalty) (default: 0)
        foreach (bool, optional): whether foreach implementation of optimizer
            is used (default: None)

    .. _Acceleration of stochastic approximation by averaging:
        https://dl.acm.org/citation.cfm?id=131098
    ç{®Gáz„?ç-Cëâ6?ç      è?ç    €„.Ar   N)Úforeachc           	         sV   d|kst d |¡ƒ‚d|ks,t d |¡ƒ‚t||||||d}tt| ƒ ||¡ d S )Nç        zInvalid learning rate: {}zInvalid weight_decay value: {})ÚlrÚlambdÚalphaÚt0Úweight_decayr   )Ú
ValueErrorÚformatÚdictÚsuperr   Ú__init__)	ÚselfÚparamsr   r   r   r   r   r   Údefaults©Ú	__class__© úL/var/www/html/django/DPS/env/lib/python3.9/site-packages/torch/optim/asgd.pyr      s    
ÿzASGD.__init__c                    sø   t ƒ  |¡ | jD ]}| dd ¡ qt| j ¡ ƒ}t|ƒdkoNt 	|d d ¡}|st|D ]}t 
t|d ƒ¡|d< qXt|ƒdkot 	|d d ¡}|s²|D ]}t 
|d ¡|d< qšt|ƒdkoÎt 	|d d ¡}|sô|D ]}t 
t|d ƒ¡|d< qØd S )Nr   r   ÚstepÚetaÚmu)r   Ú__setstate__Úparam_groupsÚ
setdefaultÚlistÚstateÚvaluesÚlenÚtorchÚ	is_tensorÚtensorÚfloat)r   r&   ÚgroupÚstate_valuesÚstep_is_tensorÚsZeta_is_tensorZmu_is_tensorr   r   r   r"   )   s     
zASGD.__setstate__c                 C   sj  d}|dur:t  ¡  |ƒ }W d  ƒ n1 s00    Y  | jD ]"}g }g }g }g }g }g }	|d D ]Ä}
|
jdurf| |
¡ |
jjrŽtdƒ‚| |
j¡ | j|
 }t|ƒdkròt  	d¡|d< t  	|d ¡|d< t  	d	¡|d
< t j
|
t jd|d< | |d
 ¡ | |d ¡ | |d ¡ |	 |d ¡ qft||||||	|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   z&ASGD does not support sparse gradientsr   r   r   r   r    g      ð?r!   )Úmemory_formatÚaxr   r   r   r   r   )r   r   r   r   r   r   )r)   Úenable_gradr#   ÚgradÚappendÚ	is_sparseÚRuntimeErrorr&   r(   r+   Ú
zeros_likeÚpreserve_formatÚasgd)r   ÚclosureÚlossr-   Úparams_with_gradÚgradsÚmusÚaxsÚetasÚstate_stepsÚpr&   r   r   r   r   ;   sR    
$


õz	ASGD.step)r   r	   r
   r   r   N)N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Úboolr   r"   r)   Úno_gradr   Ú__classcell__r   r   r   r   r   	   s     ÿÿr   )r   r>   r@   r?   rA   rB   r   r   r   r   r   r   c                C   s\   |du rd}|r"t j ¡ r"tdƒ‚|r6t j ¡ s6t}nt}|| ||||||||	|
|d dS )znFunctional API that performs asgd algorithm computation.

    See :class:`~torch.optim.ASGD` for details.
    NFz6torch.jit.script not supported with foreach optimizers)r   r   r   r   r   )r)   ÚjitÚis_scriptingr7   Ú_multi_tensor_asgdÚ_single_tensor_asgd)r   r>   r@   r?   rA   rB   r   r   r   r   r   r   Úfuncr   r   r   r:   t   s&    ör:   )r   r>   r@   r?   rA   rB   r   r   r   r   r   c             	   C   s
  t | ƒD ]ü\}}|| }|| }|| }|| }|| }|d7 }| ¡ }|
dkr^|j||
d}| d|| ¡   ¡ |j|| ¡  d | ¡ dkr¬| | |¡ |¡¡ n
| |¡ t 	|t
 d|| |  |	¡ ¡}| |¡ t 	dtd|| ƒ ¡}| |¡ qd S )Nr   r   ©r   )Ú	enumerateÚitemÚaddÚmul_Úadd_ÚsubÚmulÚcopy_r)   r+   ÚmathÚpowÚmax)r   r>   r@   r?   rA   rB   r   r   r   r   r   ÚiÚparamr4   r!   r2   r    Ústep_tr   Únew_etaÚnew_mur   r   r   rN   ¡   s&    
"
rN   c             
   C   s>  t | ƒdkrd S t |d¡ |
dkr4tj|| |
d |d  ¡ }t | d||  ¡ tj| || d tt |ƒƒD ]N}||  ¡ dkr®||  | |  || ¡ || ¡¡ qr||  	| | ¡ qrtt |ƒƒD ]j}t 
|t d|| ||  ¡   |	¡ ¡}||  	|¡ t 
dtd||  ¡ | ƒ ¡}||  	|¡ qÎd S )Nr   r   rP   )r(   r)   Ú_foreach_add_rR   Ú_foreach_mul_ÚrangerU   rV   rW   rX   r+   rY   rZ   r[   )r   r>   r@   r?   rA   rB   r   r   r   r   r   r    r\   r_   r`   r   r   r   rM   Î   s"    (* rM   )N)rY   r)   r   Ú	optimizerr   Útypingr   r   r   rH   r,   r:   rN   rM   r   r   r   r   Ú<module>   sV   s øò-õ-õ