o
    oi'                     @   s   d dl mZmZ d dlZd dlmZ ddlmZmZm	Z	m
Z
 dZeeeegef Zdeded	ed
efddZdeded	ed
efddZdeded	ed
efddZG dd deZdS )    )CallableDictN)	Optimizer   )OptFloatOptLossClosureParamsState)
SGDLRDecaylrtalphareturnc                 C   s   | ||  S N r   r   r   r   r   X/home/ubuntu/SoloSpeech/.venv/lib/python3.10/site-packages/torch_optimizer/sgdlrdecay.py_exp   s   r   c                 C   s   | d||   S )N      ?r   r   r   r   r   _1t   s   r   c                 C   s   | d||d    S )Nr   g      ?r   r   r   r   r   _sqrt   s   r   c                       s   e Zd ZdZ							ddeded	ed
edededededdf fddZde	ddf fddZ
ddedefddZ  ZS )r
   a/  Implements stochastic gradient descent with several step size
    decay schemes.

    It has been proposed in `Exponential Step Sizes for Non-Convex
    Optimization`__.

    Arguments:
        params: iterable of parameters to optimize or dicts defining
            parameter groups
        lr: initial learning rate (default: 1e-3)
        scheme: the decay scheme, currently only supports 'exp', 't', 'sqrt'
        alpha: decay factor.
        momentum: momentum factor (default: 0).
        weight_decay: weight decay (L2 penalty) (default: 0).
        dampening: dampening for momentum (default: 0).
        nesterov: enables Nesterov momentum (default: False).

    __ https://arxiv.org/abs/2002.05273

    Note:
        Reference code: https://github.com/zhenxun-zhuang/SGD-Exponential-Stepsize  # noqa
    MbP?exp+?        Fparamsr   schemer   momentum	dampeningweight_decaynesterovr   Nc	           
   	      s   |dkrt d| |dkrt d| |dk r!t d| |dk r,t d| |dvr7t d| t|||||||d}	|rP|d	ksL|d	krPt d
tt| ||	 tttd| _d S )Nr   zInvalid learning rate: zInvalid alpha value: zInvalid momentum value: zInvalid weight_decay value: )r   1tsqrtzInvalid scheme value: )r   r   r   r   r   r   r    r   z8Nesterov momentum requires a momentum and zero dampening)	
ValueErrordictsuperr
   __init__r   r   r   _schemes)
selfr   r   r   r   r   r   r   r    defaults	__class__r   r   r&   2   s8   	zSGDLRDecay.__init__statec                    s,   t t| | | jD ]}|dd qd S )Nr    F)r%   r
   __setstate__param_groups
setdefault)r(   r,   groupr*   r   r   r-   ]   s   
zSGDLRDecay.__setstate__closurec                 C   sB  d}|dur	| }| j D ]}|d }|d }|d }|d }|d }|d }	| j|d  }
|d	 D ]l}|jdu r9q1| j| }t|d
krHd
|d< |d  d7  < |jj}|d
kr_|||j |d
krd|vrst|	  }|d< n|d }|
|d| | |r|||}n|}|
|	|d |}|j| | q1q|S )zPerforms a single optimization step.

        Arguments:
            closure: A closure that reevaluates the model and returns the loss.
        Nr   r   r   r    r   r   r   r   r   stepr   momentum_buffer)r.   r'   gradr,   lendataadd_torchclonedetachmul_add)r(   r1   lossr0   r   r   r   r    r   r   
decay_funcpparam_stated_pbuf
setep_sizer   r   r   r2   b   sJ   


zSGDLRDecay.step)r   r   r   r   r   r   Fr   )__name__
__module____qualname____doc__r   floatstrboolr&   r	   r-   r   r   r2   __classcell__r   r   r*   r   r
      s<    	
+r
   )typingr   r   r8   torch.optim.optimizerr   typesr   r   r   r	   __all__rH   int	DecayFuncr   r   r   r
   r   r   r   r   <module>   s    