o
    Xεi                     @   s   d dl Z d dlZd dlZd dlZd dlZd dlmZ dd ZdejdejfddZ	d	d
 Z
dd Zdd Zdd Zdd Zdd Zdd ZG dd dZdS )    N)loggerc                 C   sP   |t | v r&tt| |r&z	| |  W dS  ty    Y dS    Y dS dS )z,Check if a method is implemented in a class.FT)dircallablegetattr__getattribute__NotImplementedError)objmethod_name r
   I/home/ubuntu/.local/lib/python3.10/site-packages/trainer/generic_utils.pyisimplemented   s   r   xreturnc                 C   s8   | d u rd S t | r|  } t j r| jdd} | S )NT)non_blocking)torch	is_tensor
contiguouscudais_available)r   r
   r
   r   to_cuda   s   

r   c                  C   s*   t j } t t j rdnd}| |fS )Nzcuda:0cpu)r   r   r   device)use_cudar   r
   r
   r   get_cuda#   s   
r   c                  C   sp   zt ddgd} tdd | dD }|dd W |S  t jy,   d	}Y |S  ty7   d
}Y |S w )Ngitbranchutf8c                 s   s    | ]
}| d r|V  qdS )*N)
startswith).0liner
   r
   r   	<genexpr>,       z!get_git_branch.<locals>.<genexpr>
z*  inside_dockerunknown)
subprocesscheck_outputdecodenextsplitreplaceCalledProcessErrorFileNotFoundError)outcurrentr
   r
   r   get_git_branch)   s   r1   c               	   C   s<   zt g d  } W | S  t jtfy   d} Y | S w )zXhttps://stackoverflow.com/questions/14989858/get-the-current-git-hash-in-a-python-script)r   z	rev-parsez--shortHEAD0000000)r'   r(   r)   stripr-   r.   )commitr
   r
   r   get_commit_hash5   s   r6   c                 C   s8   t j  d}t }tj| |d | d | }|S )z<Get an experiment folder path with the current date and timez%B-%d-%Y_%I+%M%p-)datetimenowstrftimer6   ospathjoin)	root_path
model_namedate_strcommit_hashoutput_folderr
   r
   r   get_experiment_folder_path?   s   rC   c                 C   sZ   t | j}|| d }|s%|| r#|j| dd td|  dS dS td|  dS )zBCheck folder if there is a checkpoint, otherwise remove the folderz/*.pthT)	recursivez ! Run is removed from %sz ! Run is kept in %sN)fsspec
get_mapperfsglobexistsrmr   info)experiment_pathrG   checkpoint_filesr
   r
   r   remove_experiment_folderG   s   
rN   c                 C   s   t dd |  D S )z1Count number of trainable parameters in a networkc                 s   s    | ]
}|j r| V  qd S N)requires_gradnumel)r   pr
   r
   r   r!   U   r"   z#count_parameters.<locals>.<genexpr>)sum
parameters)modelr
   r
   r   count_parametersS   s   rV   c                    s  |  D ]\}}| vrtd| q D ]}||vr!td| q|  D ]\}}| v r>|  |  kr>td| q& fdd|  D } fdd|  D }|drp|jd urp|jD ]fdd|  D }qb | td	t|t   S )
Nz. | > Layer missing in the model definition: %sz( | > Layer missing in the checkpoint: %szJ | > Layer dimention missmatch between model definition and checkpoint: %sc                    s   i | ]\}}| v r||qS r
   r
   r   kv
model_dictr
   r   
<dictcomp>d       z*set_partial_state_dict.<locals>.<dictcomp>c                    s*   i | ]\}}|   |   kr||qS r
   )rQ   rW   rZ   r
   r   r\   f   s   * reinit_layersc                    s   i | ]\}} |vr||qS r
   r
   rW   )reinit_layer_namer
   r   r\   j   r]   z! | > %i / %i layers are restored.)itemsr   rK   rQ   hasr^   updatelen)r[   checkpoint_statecrX   rY   pretrained_dictr
   )r[   r_   r   set_partial_state_dictX   s(   

rg   c                   @   sH   e Zd Zdd Zdd Zdd Zddd	ZdddZdd Zdd Z	dS )KeepAveragec                 C   s   i | _ i | _d S rO   
avg_valuesitersselfr
   r
   r   __init__r   s   
zKeepAverage.__init__c                 C   s
   | j | S rO   )rj   )rm   keyr
   r
   r   __getitem__v      
zKeepAverage.__getitem__c                 C   s
   | j  S rO   )rj   r`   rl   r
   r
   r   r`   y   rq   zKeepAverage.itemsr   c                 C   s   || j |< || j|< d S rO   ri   )rm   nameinit_val	init_iterr
   r
   r   	add_value|   s   
zKeepAverage.add_valueFc                 C   s   || j vr| j||d d S |r)d| j |  d|  | j |< | j|  d7  < d S | j | | j|  | | j |< | j|  d7  < | j |  | j|   < d S )Nrs   gGz?g{Gz?   )rj   ru   rk   )rm   rr   valueweighted_avgr
   r
   r   update_value   s   
zKeepAverage.update_valuec                 C   s$   |  D ]\}}| j||d qd S )Nrv   )r`   ru   )rm   	name_dictro   rx   r
   r
   r   
add_values   s   zKeepAverage.add_valuesc                 C   s"   |  D ]
\}}| || qd S rO   )r`   rz   )rm   
value_dictro   rx   r
   r
   r   update_values   s   zKeepAverage.update_valuesN)r   r   )F)
__name__
__module____qualname__rn   rp   r`   ru   rz   r|   r~   r
   r
   r
   r   rh   q   s    

rh   )r8   r;   r'   rE   r   trainer.loggerr   r   Tensorr   r   r1   r6   rC   rN   rV   rg   rh   r
   r
   r
   r   <module>   s    

