o
    *j                     @   s   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	lmZ G d
d dZG dd dZejejdG dd deZG dd deZejejdG dd deZejejdG dd deZdS )    )Hooks)build_lr_scheduler)LogKeys)
get_logger)	is_master   )HOOKS)Hook)Priorityc                   @   s<   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdS )LrSchedulerProcessorc                 C   s   d | _ d | _d S N)lr_strategywarmup_lr_scheduler)self r   l/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/modelscope/trainers/hooks/lr_scheduler_hook.py__init__   s   
zLrSchedulerProcessor.__init__c                 C   
   || _ d S r   )r   )r   r   r   r   r   set_lr_strategy      
z$LrSchedulerProcessor.set_lr_strategyc                 C   r   r   )r   )r   r   r   r   r   set_warmup_lr_scheduler   r   z,LrSchedulerProcessor.set_warmup_lr_schedulerc                 C   s   dS )z}Initialize the lr scheduler.

        This is a strategic function which can be registered by other hook's function.
        Nr   r   trainerr   r   r   initialize_lr_scheduler   s   z,LrSchedulerProcessor.initialize_lr_schedulerc                 C   s&   | j dur| j   dS |j  dS )zxDo lr scheduler's step.

        This is a strategic function which can be registered by other hook's function.
        N)r   steplr_schedulerr   r   r   r   r       s   
zLrSchedulerProcessor.stepc                 C   st   dd l }t|j|jjrdd |jjD }|S t|jtr6t }|j D ]\}}dd |jD ||< q%|S td)Nr   c                 S      g | ]}|d  qS lrr   .0groupr   r   r   
<listcomp>.       z7LrSchedulerProcessor.get_current_lr.<locals>.<listcomp>c                 S   r   r   r   r   r   r   r   r"   2   r#   z6lr is not applicable because optimizer does not exist.)	torch
isinstanceZ	optimizeroptimZ	OptimizerZparam_groupsdictitemsRuntimeError)r   r   r$   r   namer&   r   r   r   get_current_lr*   s   z#LrSchedulerProcessor.get_current_lrN)	__name__
__module____qualname__r   r   r   r   r   r+   r   r   r   r   r      s    
r   c                   @   s   e Zd ZdZdZdZdS )
LrStrategyby_epochby_stepnoN)r,   r-   r.   r0   r1   r2   r   r   r   r   r/   9   s    r/   )module_namec                       sb   e Zd ZdZejZejdf	d fddZ	dd Z
dd	 Zd
d Zdd Zdd Zdd Z  ZS )LrSchedulerHookzxLr scheduler.

    Args:
        by_epoch (bool): Whether lr changes by epoch
        warmup (dict): warm up config
    Nreturnc                    sH   t    d|v r|d rtjntj| _n|| _|| _d | _t | _	d S )Nr0   )
superr   r/   r0   r1   r   warmupr   r   	processor)r   r   r7   kwargs	__class__r   r   r   I   s   

zLrSchedulerHook.__init__c                 C   r   r   )r8   )r   r8   r   r   r   set_processorW   r   zLrSchedulerHook.set_processorc                 C   sf   | j | j | jd ur+t| jtrd| jv sJ t| jd|jid| _| j 	| j | j 
| d S )NtypeZbase_scheduler)cfgZdefault_args)r8   r   r   r7   r%   r'   r   r   r   r   r   r   r   r   r   
before_runZ   s   
zLrSchedulerHook.before_runc                 C   sF   | j tjkr|jt|ddd kr| j| | ||jj	t
j< d S )NZcumulative_itersr   )r   r/   r1   itergetattrr8   r   _get_log_lr
log_bufferoutputr   LRr   r   r   r   after_train_itere   s   z LrSchedulerHook.after_train_iterc                 C   s   |  ||jjtj< d S r   )rB   rC   rD   r   rE   r   r   r   r   before_train_epochk   s   z"LrSchedulerHook.before_train_epochc                 C   s    | j tjkr| j| d S d S r   )r   r/   r0   r8   r   r   r   r   r   after_train_epochn   s   z!LrSchedulerHook.after_train_epochc                 C   s|   t | ds	t | _| j|}t|tr|d }|S t|ts!J i }| D ]\}}t|ts2J |||d i q'|S )Nr8   r   )	hasattrr   r8   r+   r%   listr'   r(   update)r   r   Zcur_lrr   kZlr_r   r   r   rB   r   s   

zLrSchedulerHook._get_log_lrr5   N)r,   r-   r.   __doc__r
   LOWPRIORITYr/   r0   r   r<   r?   rF   rG   rH   rB   __classcell__r   r   r:   r   r4   ?   s    r4   c                       s$   e Zd Z fddZdd Z  ZS )PlateauLrSchedulerProcessorc                       t    || _d S r   r6   r   
metric_key)r   rU   r:   r   r   r         

z$PlateauLrSchedulerProcessor.__init__c                 C   sp   |j d u rt rtd|j d d S |j | j }| jtjkr6| jd ur-| jj	|d d S |j
j	|d d S d S )NzCurrent epoch z< has no evaluation metric values, skip lr_scheduler.step() !)metrics)Zmetric_valuesr   printepochrU   r   r/   r0   r   r   r   )r   r   rW   r   r   r   r      s   

z PlateauLrSchedulerProcessor.step)r,   r-   r.   r   r   rQ   r   r   r:   r   rR      s    rR   c                       s6   e Zd ZdZejZ fddZdd Zdd Z	  Z
S )PlateauLrSchedulerHookzLr scheduler hook for `ReduceLROnPlateau`.

    Args:
        metric_key (str): Metric key returned from `trainer.metric_values`,
            get the value of metric key and pass it to `ReduceLROnPlateau.step`.
    c                    rS   r   rT   )r   rU   r9   r:   r   r   r      rV   zPlateauLrSchedulerHook.__init__c                 C   sP   | t}t|dkr$t|d jtd tfv r&|d t| j d S d S d S )Nr   )	Zget_hookr4   lenr=   r8   r   r<   rR   rU   )r   r   Zlr_scheduler_hookr   r   r   register_processor   s   
z)PlateauLrSchedulerHook.register_processorc                 C   s"   t |dst | _d S |j| _d S )Nlogger)rI   r   r]   r   r   r   r   r?      s   
z!PlateauLrSchedulerHook.before_run)r,   r-   r.   rN   r
   rO   rP   r   r\   r?   rQ   r   r   r:   r   rZ      s    rZ   c                       s6   e Zd ZejZd
d fddZdd Zdd	 Z  Z	S )NoneLrSchedulerHookTNr5   c                    s   t  j||d d S )N)r0   r7   )r6   r   )r   r0   r7   r:   r   r   r      s   zNoneLrSchedulerHook.__init__c                 C      d S r   r   r   r   r   r   r?         zNoneLrSchedulerHook.before_runc                 C   r_   r   r   r   r   r   r   rH      r`   z%NoneLrSchedulerHook.after_train_epoch)TNrM   )
r,   r-   r.   r
   rO   rP   r   r?   rH   rQ   r   r   r:   r   r^      s
    r^   N)Zmodelscope.metainfor   Z'modelscope.trainers.lrscheduler.builderr   Zmodelscope.utils.constantr   Zmodelscope.utils.loggerr   Zmodelscope.utils.torch_utilsr   builderr   hookr	   priorityr
   r   r/   Zregister_moduler4   rR   rZ   r^   r   r   r   r   <module>   s"   ,D