o
    ϯ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lZd dl	Z	d dl
m  mZ zd dlZW n ey<   dZY nw d dlmZmZmZ d dlmZmZ ddlmZ ddlmZ G dd	 d	eZd
d Z	dddZdddZdS )    N)suppress)LPLoss	LPMetricslp_gather_features)do_mixupget_mix_lambda   )	is_master)zero_shot_evalc                   @   s*   e Zd ZdZdd Zdd Zd
ddZd	S )AverageMeterz1Computes and stores the average and current valuec                 C   s   |    d S N)resetself r   P/home/ubuntu/.local/lib/python3.10/site-packages/laion_clap/training/lp_train.py__init__   s   zAverageMeter.__init__c                 C   s   d| _ d| _d| _d| _d S )Nr   )valavgsumcountr   r   r   r   r      s   
zAverageMeter.resetr   c                 C   s8   || _ |  j|| 7  _|  j|7  _| j| j | _d S r   )r   r   r   r   )r   r   nr   r   r   update#   s   zAverageMeter.updateN)r   )__name__
__module____qualname____doc__r   r   r   r   r   r   r   r      s
    r   c                 C   s   t | dr| jS | S )Nmodule)hasattrr   )modelr   r   r   unwrap_model*   s   
r     c	           &      C   s  t |j}	|jdkrt jjjnt}
|   t|j	}|d j
|d j}}|jr2|d ur2|| |j}tt|jd d}|jdkrK|j  t }t }t }t }t|D ]j\}}|| | }t|trx| D ]}|| qpn|| |}|d }|j|	dd}|jrt td	t |d
 |	}t!||}nd }|"t |  t|tr| D ]}|#  qn|#  |
  | |||	d}|||}W d    n1 sw   Y  t|tr<|d ur+|$|%  | D ]/}|j&r |'  |(| |)  |*| W d    n	1 sw   Y  q|*| q|"  nW|%  | D ]}|*  q3nF|d urz|$|%  |j&rp|'  |(| |)  |*| W d    n	1 sjw   Y  n|*| |"  n|%  |*  t + " t,| j-j./dtd t,| j-j0/dtd W d    n	1 sw   Y  |"t |  t }|d }t1|r|d dks||krt|trt |d
 }nt |}|| |j2 } |j}!d| | }"|"|3 | t|trHt45d| d| d| d|! d|"dd|j6dd|j7dd|j7dd|j7dddd | D   |j6|j6|j6dd | D d}#nCt45d| d| d| d|! d|"dd|j6dd|j7dd|j7dd|j7dd|j8d d  d!d" |j6|j6|j6|j8d d  d}#|#9 D ]/\}$}%d| d|$ }$|d ur|:|$|%| |j;rt;d usJ d#t;|$|%d$|i q|<  |<  q\d S )%Namptrainr   
   toyclass_labelTdevicenon_blockingg      ?waveform)
mix_lambdar(   r   d   g      Y@zTrain Epoch:  [>/z (z.0fz
%)] Loss: z#.5gz#.4gz) Data (t): z.3fz Batch (t): z LR: c                 S      g | ]	}|j d  d qS r   lrparam_groups.0o_r   r   r   
<listcomp>       z#train_one_epoch.<locals>.<listcomp>c                 S   r0   r1   r3   r5   r   r   r   r8      r9   )loss	data_time
batch_timer2   r2   5f Please install wandb.step)=torchr(   	precisioncudar"   autocastr   r#   r   lp_loss
dataloadersamplerdistributed	set_epochnum_batchesmathceillognum_samplesdataset_typedatasetgenerate_queuer   time	enumerate
isinstancedictvaluestomixup
from_numpyr   lenr   r   	zero_gradscalebackwardhorovodsynchronizeunscale_skip_synchronizer@   no_gradr    
clap_modellogit_scale_aclamp_logit_scale_tr	   
world_sizeitemlogginginfor   r   r4   items
add_scalarwandbr   )&r   dataepoch	optimizerscaler	schedulerargs	tb_writerextra_suffixr(   rD   r:   rF   rG   num_batches_per_epochsample_digitsloss_mbatch_time_mdata_time_mendibatchr@   saudior&   r+   r7   pred
total_lossbatch_count
batch_sizerN   samples_per_epochpercent_completelog_datanamer   r   r   r   train_one_epoch1   s
  

















"$$

r   c                    s~  i  |j st|s S t|j}|   t|r(td |jd}t|d}|j	dkr2tj
jjnt}	d|v r-|jr-||j dksJ||jkr-|j rh|d j|d j}
}|jrd|d urd|| |
j}n
|d j}
d}|
j}g g d}t  t|
D ]b\}}|}|d }|j|d	d
}|	 * | ||d}|j rt|||j|j\}}|d | |d | W d    n1 sw   Y  ||jd 7 }|d dkrtd| d| d| d qt|rt|d d  |d< t|d d  |d< |!|d |d } "| d # vr "d|i W d    n	1 s(w   Y  t|r s7 S td| dd$ fdd D   |j%r & D ]\}}|d urj|'d| d| || qTt(t)j*$|j+dd}|,t-.  |,d W d    n	1 sw   Y  |j/rt/d usJ d & D ]\}}t/0d| d| |d|i q S  S )NzEvaluating...,)metric_namesr"   r   r   )r   targetr&   Tr'   )r(   r   r   r,   zEval Epoch: r-   z / ]ro   r>   
c              	      s.   g | ]}d  | dt | ddgqS )	z:    z.4f)joinround)r6   mmetricsr   r   r8     s     zevaluate.<locals>.<listcomp>r/   zresults.jsonlza+r?   )1parallel_evalr	   rA   r(   evalprint
lp_metricssplitr   rB   rC   r"   rD   r   val_frequencyepochsrF   rG   rH   rI   rN   rb   rS   rW   r   rg   r^   appendshaperi   rj   catcpuevaluate_merticsr   keysr   	save_logsrk   rl   openospathcheckpoint_pathwritejsondumpsrm   rM   )r   rn   ro   rs   rt   ru   r(   r   	eval_toolrD   rF   rG   samples_per_valrN   	eval_infor|   r}   r   r&   r   metric_dictr   r   fr   r   r   evaluate   s   









	
"r   )Nr!   ) r   ri   rK   r   rR   
contextlibr   numpynprA   torch.nn.functionalnn
functionalFrm   ImportErrorclap_moduler   r   r   clap_module.utilsr   r   rH   r	   	zero_shotr
   objectr   r    r   r   r   r   r   r   <module>   s0    
 