o
    ϯiE8                     @   s   d dl mZ d dlZd dlZd dlmZmZ d dlmZ	 d dl
Zd dlmZmZmZ zd dlmZ W n ey=   dZY nw 					 			ddd	ZG d
d dejZ		dddZdd Zdd Zdd ZG dd deZdd ZG dd dejZdS )    )ValueN)distributednn)
functional)average_precision_scoreroc_auc_scoreaccuracy_scoreF   c
                    s  |rt d us
J d|r$t  }
t }|	r"t }t }n0t  t  }
t }|	r?t }t }W d    n1 sIw   Y  |st|
j|dd}t|j|dd} ||< ||< tj|dd}
tj|dd}|	rt|j|dd}t|j|dd}||< ||< tj|dd}tj|dd}n|rtjtjj	 dd}
tjtjj	dd}|	rtjtjj	dd}tjtjj	dd}n| fddt
|D }fddt
|D }t	|  t	| |	rfddt
|D }fddt
|D }t	| t	| |s5 ||< ||< |	r5||< ||< tj|dd}
tj|dd}|	rTtj|dd}tj|dd}|	r]|
|||fS |
|fS )	NPlease install horovodr   dimc                       g | ]}t  qS  torch
zeros_like.0_)audio_featuresr   O/home/ubuntu/.local/lib/python3.10/site-packages/laion_clap/clap_module/loss.py
<listcomp>B       z#gather_features.<locals>.<listcomp>c                    r   r   r   r   )text_featuresr   r   r   C   r   c                    r   r   r   r   )audio_features_mlpr   r   r   G   r   c                    r   r   r   r   )text_features_mlpr   r   r   H   r   )hvd	allgatherr   no_gradlistchunkcatr   r   
all_gatherrangedist)r   r   r   r   
local_lossgather_with_gradrank
world_sizeuse_horovodmlp_lossall_audio_featuresall_text_featuresall_audio_features_mlpall_text_features_mlpgathered_audio_featuresgathered_text_featuresgathered_audio_features_mlpgathered_text_features_mlpr   )r   r   r   r   r   gather_features   s|   








r3   c                       s8   e Zd Z								d	 fdd	Zd
ddZ  ZS )ClipLossFr   r	   c	           	         sX   t    || _|| _|| _|| _|| _|| _|| _t	|dk| _
|| _d| _i | _d S )Nr   )super__init__r%   r&   cache_labelsr'   r(   r)   r*   boolweighted_lossweight_loss_kappaprev_num_logitslabels)	selfr%   r&   r7   r'   r(   r)   r*   r:   	__class__r   r   r6   _   s   

zClipLoss.__init__Nc                 C   s  |j }| jr$| jdkrYt||||| j| j| j| j| j| jd
\}}	}
}| jrD|| |j }|| |j }|| |	j }|| |
j }n1|| |j }|j}||
 |	j }|j}n|| |j }|| |j }|| |j }|| |j }|j	d }| j
|ks|| jvrtj||tjd}| jdkr| jr||| j  }| jr|| j|< || _
n| j| }| jst||t|| t|| t|| d }|S ||j  }ttj|dd| jt|   }||j  }ttj|dd| jt|   }tj|||dtj|||d tj|||d tj|||d d }|S | jdkr\t||| j| j| j| j| j| jd\}}	| jrQ|| |	j }|| |j }n|| |	j }|j}n|| |j }|| |j }|j	d }| j
|ks{|| jvrtj||tjd}| jdkr| jr||| j  }| jr|| j|< || _
n| j| }| jst||t|| d	 }|S ||j  }ttj|dd| jt|   }|	|	j  }ttj|dd| jt|	   }tj|||dtj|||d d	 }|S )
Nr	   )
r   r   r   r   r%   r&   r'   r(   r)   r*   r   )devicedtype   )axis)weight)r   r   r%   r&   r'   r(   r)   r*      )r@   r*   r(   r3   r%   r&   r'   r)   Tshaper;   r<   r   arangelongr7   r9   Fcross_entropydetachexpsumr:   len)r=   r   r   logit_scale_alogit_scale_tr   r   r@   r+   r,   r-   r.   a_logits_per_audioa_logits_per_textt_logits_per_audiot_logits_per_text
num_logitsr<   
total_lossaudio_weighttext_weightlogits_per_audiologits_per_textr   r   r   forwardx   s   







=&&2





&&zClipLoss.forward)FFFr   r	   FFr   )NNN__name__
__module____qualname__r6   r\   __classcell__r   r   r>   r   r4   ]   s    r4   c                    s   |r/t d us
J dt  t  }t }W d    ||fS 1 s&w   Y  ||fS  fddt|D }fddt|D }t|  t| tj|dd}tj|dd}||fS )Nr
   c                    r   r   r   r   )predr   r   r      r   z&lp_gather_features.<locals>.<listcomp>c                    r   r   r   r   )targetr   r   r      r   r   r   )	r   r   r   r   allgathr#   r$   r"   r!   )rb   rc   r(   r)   	all_predsall_targetsgathered_predsgathered_targetsr   rb   rc   r   lp_gather_features   s    


rj   c                 C   *   t |  } | }tt|| d dS N)average)r   sigmoidnumpynpmeanr   ri   r   r   r   get_map      rr   c                 C   s*   t | d } t |d }t|| S Nr	   )r   argmaxro   r   ri   r   r   r   get_acc   s   
rv   c                 C   rk   rl   )r   rn   ro   rp   rq   r   ri   r   r   r   get_mauc   rs   rw   c                   @   s,   e Zd Zg dfddZdd Zdd ZdS )		LPMetrics)mapaccmaucc                 C   s,   g | _ |D ]}| j | | q|| _d S N)metricsappend
get_metricmetric_names)r=   r   namer   r   r   r6     s   
zLPMetrics.__init__c                 C   s,   |dkrt S |dkrtS |dkrtS td)Nry   rz   r{   z5the metric should be at least one of [map, acc, mauc])rr   rv   rw   
ValueError)r=   r   r   r   r   r     s   zLPMetrics.get_metricc                 C   s6   i }t t| jD ]}| j| |||| j| < q	|S r|   )r#   rO   r   r}   )r=   rb   rc   metric_dictir   r   r   evaluate_mertics  s   zLPMetrics.evaluate_merticsN)r^   r_   r`   r6   r   r   r   r   r   r   rx     s    
rx   c                 C   s   t |d }t | |S rt   )r   ru   rI   r   CrossEntropyLossri   r   r   r   calc_celoss  s   r   c                       s$   e Zd Z fddZdd Z  ZS )LPLossc                    sP   t    |dkrt | _d S |dkrt| _d S |dkr$t | _d S td)Nbcecemsez6the loss func should be at least one of [bce, ce, mse])r5   r6   r   BCEWithLogitsLoss	loss_funcr   MSELossr   )r=   	loss_namer>   r   r   r6   %  s   

zLPLoss.__init__c                 C   s   |  ||}|S r|   )r   )r=   rb   rc   lossr   r   r   r\   0  s   zLPLoss.forwardr]   r   r   r>   r   r   #  s    r   )NNFFr   r	   FF)r	   F)multiprocessing.sharedctypesr   r   torch.distributed.nnr   r$   r   torch.nnr   rJ   ro   rp   sklearn.metricsr   r   r   horovod.torchr   ImportErrorr3   Moduler4   rj   rr   rv   rw   objectrx   r   r   r   r   r   r   <module>   s@    
N 
