o
    i(                     @   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m	Z	 d dl
mZ d dlmZmZ ddgZd	d
 ZG dd deZde de	 de de_			d#de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fd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fd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fd!d"ZdS )$    N)Tensor   )	Optimizer_use_grad_for_differentiable
_get_value_default_to_fused_or_foreach_differentiable_doc_foreach_doc_maximize_doc)is_compiling)ListOptionalASGDasgdc                 C      t | tjst| S | S N
isinstancetorchr   tensorx r   _/var/www/html/eduruby.in/lip-sync/lip-sync-env/lib/python3.10/site-packages/torch/optim/asgd.py
_to_tensor   s   
r   c                       sb   e Zd Z								ddee d	ed
ef fddZ fddZdd ZedddZ	  Z
S )r   {Gz?-C6?      ?    .Ar   NFforeachmaximizedifferentiablec
              
      sV   d|kst d| d|kst d| t||||||||	d}
t ||
 d S )N        zInvalid learning rate: zInvalid weight_decay value: )lrlambdalphat0weight_decayr   r    r!   )
ValueErrordictsuper__init__)selfparamsr#   r$   r%   r&   r'   r   r    r!   defaults	__class__r   r   r+      s   
zASGD.__init__c                    s  t  | | jD ]}|dd  |dd |dd q	t| j }t|dko3t	|d d }|sF|D ]}t
t|d |d< q8t|dkoTt	|d d }|se|D ]}t
|d |d< qYt|dkost	|d d }|s|D ]}t
t|d |d< qxd S d S )	Nr   r    Fr!   r   stepetamu)r*   __setstate__param_groups
setdefaultliststatevalueslenr   Z	is_tensorr   float)r,   r8   groupZstate_valuesZstep_is_tensorsZeta_is_tensorZmu_is_tensorr/   r   r   r4   /   s4   



zASGD.__setstate__c           
      C   s   |d D ]b}|j d urf|| |j jrtd||j  | j| }	t|	dkrJtd|	d< t|d |	d< td|	d	< tj|tj	d
|	d< ||	d	  ||	d  ||	d  ||	d  qd S )Nr-   z&ASGD does not support sparse gradientsr   r"   r1   r#   r2   g      ?r3   )Zmemory_formatax)
gradappendZ	is_sparseRuntimeErrorr8   r:   r   r   Z
zeros_likeZpreserve_format)
r,   r<   params_with_gradgradsmusaxsetasstate_stepspr8   r   r   r   _init_groupI   s(   



zASGD._init_groupc           
      C   s   d}|durt   | }W d   n1 sw   Y  | jD ];}g }g }g }g }g }g }	| |||||||	 t||||||	|d |d |d |d |d |d |d |d	 d
 q |S )zPerforms 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   Zenable_gradr5   rI   r   )
r,   closureZlossr<   rB   rC   rD   rE   rF   rG   r   r   r   r1   `   s<   

z	ASGD.step)r   r   r   r   r   NFFr   )__name__
__module____qualname__r   boolr+   r4   rI   r   r1   __classcell__r   r   r/   r   r      s(    	
ah  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)
        z	
        zx

    .. _Acceleration of stochastic approximation by averaging:
        https://dl.acm.org/citation.cfm?id=131098

    Fr-   rC   rE   rD   rF   rG   r   r    r!   r$   r#   r&   r%   r'   c	                C   sn   |du rt | |dd\}}|rtj rtd|r"tj s"t}nt}|| ||||||	|
|||||d dS )znFunctional API that performs asgd algorithm computation.

    See :class:`~torch.optim.ASGD` for details.
    NF)Z	use_fusedz6torch.jit.script not supported with foreach optimizers)r$   r#   r&   r%   r'   r    r!   )r   r   ZjitZis_scriptingrA   _multi_tensor_asgd_single_tensor_asgd)r-   rC   rE   rD   rF   rG   r   r    r!   r$   r#   r&   r%   r'   _funcr   r   r   r      s,   
c                C   sF  dd }t | D ]\}}|| }|s|n| }|| }|| }|| }|| }t|r;t|}t|}t|}|d7 }t|}|
dkrN|j||
d}t|}|d||   |j|| d t sl|	 dkrx||
|| n|| ||d|| |  |	  }|| |dtd||  }|| qd S )Nc                 S   r   r   r   r   r   r   r   r      s   
z'_single_tensor_asgd.<locals>._to_tensorr   r   r%   )	enumerater   
is_complexview_as_realr   addZmul_add_r   itemsubmulcopy_max)r-   rC   rE   rD   rF   rG   r$   r#   r&   r%   r'   r    r!   r   iparamr?   r3   r>   r2   Zstep_tr1   Z	eta_valuenew_etanew_mur   r   r   rQ      s6   





rQ   c             	   C   s  t | dkrd S |rJ dt| |||||g}| D ]\\}}}}}}}|r.t|}dd }||}||}||}t|d |
dkr[|rStj|||
d ntj|||
d}t|d }t	|d||   tj||| d t
t |D ]*}t s||  dkr|| || || ||  qz|| ||  qzt
t |D ]1}t|d|| t|| |	    }|| | tdtdt|| |  }|| | qqd 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   )r   rV   rW   ).0tr   r   r   
<listcomp>/  s    zE_multi_tensor_asgd.<locals>._view_complex_as_real.<locals>.<listcomp>r   )Ztensor_listr   r   r   _view_complex_as_real.  s   z1_multi_tensor_asgd.<locals>._view_complex_as_realr   rT   )r:   r   Z"_group_tensors_by_device_and_dtyper9   r   Z_foreach_negZ_foreach_add_Z_foreach_addr   Z_foreach_mul_ranger   rZ   rY   r[   r\   r]   r   r^   )r-   rC   rE   rD   rF   rG   r$   r#   r&   r%   r'   r    r!   Zgrouped_tensorsZgrouped_paramsZgrouped_gradsZgrouped_axsZgrouped_musZgrouped_etasZgrouped_state_stepsrR   rf   r2   r_   ra   rb   r   r   r   rP     sD   
(rP   )NFF)r   r   Z	optimizerr   r   r   r   r   r	   r
   Ztorch._utilsr   typingr   r   __all__r   r   __doc__rN   r;   r   rQ   rP   r   r   r   r   <module>   s    $z
 	

4	

<	
