o
    pi                     @   s@   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   AvgNonZeroReducer)loss_and_miner_utils   )GenericPairLossc                       sN   e Zd Zd fdd	Zdd Zdd Zd	d
 Zdd Zdd Zdd Z	  Z
S )ContrastiveLossr   r   c                    s8   t  jdddi| || _|| _| jddgdd d S )Nmat_based_lossF
pos_margin
neg_margin)list_of_namesis_stat )super__init__r
   r   add_to_recordable_attributes)selfr
   r   kwargs	__class__r   c/home/ubuntu/.local/lib/python3.10/site-packages/pytorch_metric_learning/losses/contrastive_loss.pyr   	   s   
zContrastiveLoss.__init__c                 C   sf   d\}}t |dkr| |d}t |dkr| |d}t|}t|}||dd||dddS )	N)r   r   r   posnegpos_pair)lossesindicesreduction_typeneg_pair)pos_lossneg_loss)lenget_per_pair_losslmupos_pairs_from_tupleneg_pairs_from_tuple)r   pos_pair_distneg_pair_distindices_tupler   r   	pos_pairs	neg_pairsr   r   r   _compute_loss   s    

zContrastiveLoss._compute_lossc                 C   s6   |dkr| j n| j}|dkr| jn| j}|||}|S )Nr   )pos_calcneg_calcr
   r   )r   
pair_dists
pos_or_negloss_calc_funcmarginper_pair_lossr   r   r   r!   &   s   
z!ContrastiveLoss.get_per_pair_lossc                 C   s   t jj| j||S Ntorchnn
functionalreludistancer0   )r   r%   r0   r   r   r   r+   ,      zContrastiveLoss.pos_calcc                 C   s   t jj| j||S r2   r3   )r   r&   r0   r   r   r   r,   /   r9   zContrastiveLoss.neg_calcc                 C   s   t  S r2   r   r   r   r   r   get_default_reducer2   s   z#ContrastiveLoss.get_default_reducerc                 C   s   ddgS )Nr   r   r   r:   r   r   r   _sub_loss_names5   s   zContrastiveLoss._sub_loss_names)r   r   )__name__
__module____qualname__r   r*   r!   r+   r,   r;   r<   __classcell__r   r   r   r   r      s    r   )	r4   reducersr   utilsr   r"   generic_pair_lossr   r   r   r   r   r   <module>   s
    