o
    ॵi                     @   s`   d dl Z d dlmZmZ d dlZd dlZd dlmZ d dl	m
Z
 d dlmZ G dd deZdS )    N)ABCMetaabstractmethod)Hook)Priority)ModeKeysc                   @   s   e Zd ZdZeZejZ				dddZ	e
dd Zedd	d
ZdddZdd Zd ddZdd Zdd Zdd Zdd Zdd ZdS )!
LoggerHooka  Base class for logger hooks.

    Args:
        interval (int): Logging interval (every k iterations). It is interval of iterations even by_epoch is true.
        ignore_last (bool): Ignore the log of last iterations in each epoch
            if less than `interval`.
        reset_flag (bool): Whether to clear the output buffer after logging.
        by_epoch (bool): Whether EpochBasedtrainer is used.
    
   TFc                 C   s   || _ || _|| _|| _d S N)intervalignore_last
reset_flagby_epoch)selfr
   r   r   r    r   Y/home/ubuntu/.local/lib/python3.10/site-packages/modelscope/trainers/hooks/logger/base.py__init__   s   
zLoggerHook.__init__c                 C   s   d S r	   r   r   trainerr   r   r   log&   s   zLoggerHook.logc                 C   sR   t | tjrdS |rt | tjr| jdkrdS |r't | tjr't| dkr'dS dS )a4  Tell the input variable is a scalar or not.

        Args:
            val: Input variable.
            include_np (bool): Whether to treat 0-d np.ndarray as a scalar.
            include_torch (bool): Whether to treat 0-d torch.Tensor as a scalar.

        Returns:
            bool: True or False.
        Tr      F)	
isinstancenumbersNumbernpndarrayndimtorchTensorlen)val
include_npinclude_torchr   r   r   	is_scalar*   s   zLoggerHook.is_scalarr   c                 C   s   |dksJ |j jD ]3}|j j| | d }t|D ]\}}t|tjr1|   	 ||< q||j j| | d< q
dS )zYFetch latest n values or all values, process tensor type, convert to numpy for dump logs.r   N)

log_bufferval_history	enumerater   r   r   clonedetachcpunumpy)r   r   nkeyvaluesivr   r   r   fetch_tensor?   s   zLoggerHook.fetch_tensorc                 C   s@   |j tjtjfv r|jd }|S tdtj dtj d|j  )Nr   ztrainer mode should be z or z
, but got )moder   TRAINEVALepoch
ValueError)r   r   r3   r   r   r   	get_epochK   s   
zLoggerHook.get_epochc                 C   s&   | j r|r|jd }|S |jd }|S )z(Get the current training iteration step.r   )r   
inner_iteriter)r   r   r6   current_iterr   r   r   get_iterT   s
   


zLoggerHook.get_iterc                 C   s0   |j d d d D ]}t|trd|_ d S qd S )NT)hooksr   r   r   )r   r   hookr   r   r   
before_run\   s   
zLoggerHook.before_runc                 C   s   |j   d S r	   )r#   clearr   r   r   r   before_epochb   s   zLoggerHook.before_epochc                 C   s   | j r| || jr| || j |j| j n/| j s2| || jr2| || j |j| j n| |rH| jsH| || j |j| j |jj	r[| 
| | jr]|j  d S d S d S r	   )r   every_n_inner_itersr
   r/   r#   averageevery_n_itersend_of_epochr   readyr   r   clear_outputr   r   r   r   after_train_itere   s   
zLoggerHook.after_train_iterc                 C   s.   |j jr| | | jr|j   d S d S d S r	   )r#   rD   r   r   rE   r   r   r   r   after_train_epochv   s   
zLoggerHook.after_train_epochc                 C   s6   |  | |j  | | | jr|j  d S d S r	   )r/   r#   rA   r   r   rE   r   r   r   r   after_val_epoch|   s   


zLoggerHook.after_val_epochN)r   TFT)TT)r   )F)__name__
__module____qualname____doc__r   __metaclass__r   VERY_LOWPRIORITYr   r   r   staticmethodr"   r/   r5   r9   r=   r?   rF   rG   rH   r   r   r   r   r      s*    





	r   )r   abcr   r   r)   r   r   modelscope.trainers.hooks.hookr   "modelscope.trainers.hooks.priorityr   modelscope.utils.constantr   r   r   r   r   r   <module>   s   