o
    ॵi                     @   sl   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
ejejd	G d
d de	ZdS )    )OrderedDict)Optional)Hooks   )HOOKS)Hookc                   @   s   e Zd ZdZdZdZdS )EvaluationStrategyby_epochby_stepnoN)__name__
__module____qualname__r	   r
   r    r   r   ]/home/ubuntu/.local/lib/python3.10/site-packages/modelscope/trainers/hooks/evaluation_hook.pyr   
   s    r   )module_namec                   @   sd   e Zd ZdZdejdfdee dee dee fddZ	d	d
 Z
dd Zdd Zdd Zdd ZdS )EvaluationHooka7  
    Evaluation hook.

    Args:
        interval (int): Evaluation interval.
        by_epoch (bool): Evaluate by epoch or by iteration.
        start_idx (int or None, optional): The epoch or iterations validation begins.
            Default: None, validate every interval epochs/iterations from scratch.
    r   Nintervaleval_strategy	start_idxc                 K   sT   |dksJ d|| _ || _d| _d|v r%|d rtj| _d S tj| _d S || _d S )Nr   z"interval must be a positive number)NNr	   )r   r   last_eval_tagr   r	   r
   r   )selfr   r   r   kwargsr   r   r   __init__   s   
zEvaluationHook.__init__c                 C   8   | j tjkr| |r| | d|jf| _dS dS dS )z9Called after every training iter to evaluate the results.iterN)r   r   r
   _should_evaluatedo_evaluater   r   r   trainerr   r   r   after_train_iter+      
zEvaluationHook.after_train_iterc                 C   r   )z:Called after every training epoch to evaluate the results.epochN)r   r   r	   r   r   r"   r   r   r   r   r   after_train_epoch2   r!   z EvaluationHook.after_train_epochc                 C   sB   |j jdd d u rt |j jd< |j jd || d S d S )Neval_results)visualization_bufferoutputgetr   update	visualize)r   r   resultsr   r   r   add_visualization_info9   s   
z%EvaluationHook.add_visualization_infoc                 C   s6   |  }| D ]\}}||jjd| < qd|j_dS )zEvaluate the results.zevaluation/TN)evaluateitems
log_bufferr&   ready)r   r   eval_resnamevalr   r   r   r   A   s   zEvaluationHook.do_evaluatec                 C   sr   | j tjkr|j}| j}n|j}| j}| jdu r"||| js dS dS |d | jk r+dS |d | j | j r7dS dS )aN  Judge whether to perform evaluation.

        Here is the rule to judge whether to perform evaluation:
        1. It will not perform evaluation during the epoch/iteration interval,
           which is determined by ``self.interval``.
        2. It will not perform evaluation if the ``start_idx`` is larger than
           current epochs/iters.
        3. It will not perform evaluation when current epochs/iters is larger than
           the ``start_idx`` but during epoch/iteration interval.

        Returns:
            bool: The flag indicating whether to perform evaluation.
        NFr   T)	r   r   r	   r"   every_n_epochsr   every_n_itersr   r   )r   r   current
check_timer   r   r   r   I   s   
zEvaluationHook._should_evaluate)r   r   r   __doc__r   r	   r   intstrr   r    r#   r+   r   r   r   r   r   r   r      s"    
r   N)collectionsr   typingr   modelscope.metainfor   builderr   hookr   r   register_moduler   r   r   r   r   <module>   s   