a
    dY                     @   sF   d Z ddlZddlZddlZddlmZ eeZG dd deZ	dS )zu Polynomial Scheduler

Polynomial LR schedule with warmup, noise.

Hacked together by / Copyright 2021 Ross Wightman
    N   )	Schedulerc                       sL   e Zd ZdZdejjeeeeeed	d fddZ	dd Z
dddZ  ZS )PolyLRSchedulerz Polynomial LR Scheduler w/ warmup, noise, and k-decay

    k-decay option based on `k-decay: A New Method For Learning Rate Schedule` - https://arxiv.org/abs/2004.05909
          ?              ?r   r   FTNq=
ףp?*   )	optimizer	t_initialpowerlr_min	cycle_mulcycle_decaycycle_limitreturnc              
      s   t  j|d||||||d |dks(J |dks4J |dkrV|dkrV|dkrVtd | _| _| _| _| _| _	| _
 _|
 _| _ j
r fdd jD  _t   j ndd  jD  _d S )	Nlr)Zparam_group_fieldt_in_epochsnoise_range_t	noise_pct	noise_std
noise_seed
initializer   r   zjCosine annealing scheduler will have no effect on the learning rate since t_initial = t_mul = eta_mul = 1.c                    s   g | ]}|  j  qS  )warmup_t.0vselfwarmup_lr_initr   _/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/timm/scheduler/poly_lr.py
<listcomp>G       z,PolyLRScheduler.__init__.<locals>.<listcomp>c                 S   s   g | ]}d qS r   r   r   _r   r   r!   r"   J   r#   )super__init___loggerwarningr   r   r   r   r   r   r   r    warmup_prefixk_decaybase_valueswarmup_stepsZupdate_groups)r   r
   r   r   r   r   r   r   r   r    r+   r   r   r   r   r   r,   r   	__class__r   r!   r(      s8    
zPolyLRScheduler.__init__c                    s  j k r"fddjD }njr2j  jdkrttdj dj   j}j| j dj|  dj  j  nj }jj|  j|   fddj	D }j
|jk rfdd|D }nfddj	D }|S )Nc                    s   g | ]} j |  qS r   )r    )r   s)r   tr   r!   r"   N   r#   z+PolyLRScheduler._get_lr.<locals>.<listcomp>r   c                    s   g | ]}|  qS r   r   r   )gammar   r!   r"   ]   r#   c                    s6   g | ].}j |j  d       j   qS r$   )r   r   )r   Zlr_max)kr   t_currt_ir   r!   r"   a   s   c                    s   g | ]
} j qS r   )r   r%   )r   r   r!   r"   f   r#   )r   r.   r+   r   mathfloorlogr   r   r-   r,   r   )r   r2   ZlrsiZlr_max_valuesr   )r3   r4   r   r2   r5   r6   r!   _get_lrL   s(    


($


zPolyLRScheduler._get_lrc                 C   sR   t d|p| j}| jdkr$| j| S tt| j | j| d  d| j  S d S )Nr   r   )maxr   r   r   intr7   r8   )r   Zcyclesr   r   r!   get_cycle_lengthj   s    

z PolyLRScheduler.get_cycle_length)r   r   r   r   r   r   r   FTNr   r   r	   r   T)r   )__name__
__module____qualname____doc__torchZoptimZ	Optimizerr=   floatr(   r;   r>   __classcell__r   r   r/   r!   r      s8   	               4r   )
rB   r7   loggingrC   Z	schedulerr   	getLoggerr?   r)   r   r   r   r   r!   <module>   s   
