a
    d                     @   s   d Z ddlmZmZ ddlmZ ddlmZ ddlm	Z	 ddl
mZ ddlmZ dd	lmZ dd
lmZ dd Zd!eedddZd"eeeeee eeeeeeeeeee f eeeeeeeeeeddd ZdS )#zE Scheduler Factory
Hacked together by / Copyright 2021 Ross Wightman
    )ListUnion)	Optimizer   )CosineLRScheduler)MultiStepLRScheduler)PlateauLRScheduler)PolyLRScheduler)StepLRScheduler)TanhLRSchedulerc                 C   s   t | dd}d|v rdnd}t| jt | ddt | dd	t | d
d	dgt | ddt | ddt | ddt | ddt | ddt | ddt | ddt | ddt | ddt | ddt | d d!t | d"dt | d#dt | d$d%t | d&d|t | d'd d(}|S ))zz cfg/argparse to kwargs helper
    Convert scheduler args in argparse args or cfg (.dot) like object to keyword args.
    eval_metricZtop1ZlossminmaxZepochsd   decay_epochs   decay_milestones<   warmup_epochs   cooldown_epochsr   patience_epochs
   
decay_rate皙?min_lrg        	warmup_lrh㈵>warmup_prefixFZlr_noiseNZlr_noise_pctq=
ףp?Zlr_noise_std      ?seed*   Zlr_cycle_mulZlr_cycle_decayZlr_cycle_limitr   Z
lr_k_decayZsched_on_updates)sched
num_epochsr   r   r   r   r   r   r   r   r   noise	noise_pct	noise_std
noise_seed	cycle_mulcycle_decaycycle_limitk_decayplateau_modestep_on_epochs)getattrdictr#   )cfgr   r-   kwargs r3   i/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/timm/scheduler/scheduler_factory.pyscheduler_kwargs   s4    
















r5   )	optimizerupdates_per_epochc                 C   s   t f d|it| d|iS )Nr6   r7   )create_scheduler_v2r5   )argsr6   r7   r3   r3   r4   create_scheduler0   s    r:   cosine,  Z   r=      i  r   r   r   FNr   r    r"   r   T)r6   r#   r$   r   r   r   r   r   r   r   r   r   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r7   c                     s0  | |
}|}|}|sVdks$J d   | }| }fdd|D }| }t |	||d}|d urt|ttfr fdd|D }t|dkr|d }q|  }nd }t ||||d}t |||d	}d }|d
krt| f ||d|||d|i}n|dkr2t| f ||d|||}n|dkrZt| f|||d||}n|dkrt| f|||d||}nz|dkr|sJ d|	dd t
| f||dd|||d|}n.|dkrt| f| |||d|||}t|dr(| | }|r |}n| }||fS )Nr   z=updates_per_epoch must be set to number of dataloader batchesc                    s   g | ]}|  qS r3   r3   ).0d)r7   r3   r4   
<listcomp>_       z'create_scheduler_v2.<locals>.<listcomp>)Zwarmup_lr_initwarmup_tr   c                    s   g | ]}|  qS r3   r3   )r@   n)	t_initialr3   r4   rB   l   rC   r   )Znoise_range_tr&   r'   r(   )r)   r*   r+   r;   )rF   lr_mint_in_epochsr,   tanhstep)decay_tr   rH   Z	multistepZplateauz(Plateau LR only supports step per epoch.r   F)r   Z
patience_t
cooldown_t)rG   modeZpoly)powerrF   rG   rH   r,   get_cycle_length)r0   
isinstancelisttuplelenr   r   r
   r   popr   r	   hasattrrO   ) r6   r#   r$   r   r   r   r   r   r   r   r   r   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r7   rD   rK   rL   Zwarmup_argsZnoise_rangeZ
noise_argsZ
cycle_argsZlr_schedulerZt_with_cycles_and_cooldownr3   )rF   r7   r4   r8   <   s    





	




	r8   )r   )r;   r<   r=   r>   r   r   r   r   r   r   FNr   r    r"   r    r   r   r    r   Tr   )__doc__typingr   r   Ztorch.optimr   Z	cosine_lrr   Zmultistep_lrr   Z
plateau_lrr   Zpoly_lrr	   Zstep_lrr
   Ztanh_lrr   r5   intr:   strfloatboolr8   r3   r3   r3   r4   <module>   sz   #                       