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   CosineSimilarity)common_functions   )GenericPairLossc                       s.   e Zd Zd fdd	Zdd Zdd Z  ZS )	
NTXentLossQ?c                    s0   t  jdddi| || _| jdgdd d S )Nmat_based_lossFtemperature)list_of_namesis_stat )super__init__r   add_to_recordable_attributes)selfr   kwargs	__class__r   ^/home/ubuntu/.local/lib/python3.10/site-packages/pytorch_metric_learning/losses/ntxent_loss.pyr   	   s   zNTXentLoss.__init__c                 C   s  |\}}}}t |dkrt |dkr|j}| jjs| }| }|d| j }|| j }tj|d|dk|d}	||	 }t|||	dk< t	
|t	j
|dddd  }
t	||
 d}t	jt	||
 dd| }t	|| t| }d| ||fdd	iS |  S )
Nr   r   )dtypeT)dimkeepdim)r   losspos_pair)lossesindicesreduction_type)lenr   distanceis_inverted	unsqueezer   c_fto_dtypeneg_inftorchmaxdetachexpsqueezesumlog	small_valzero_losses)r   	pos_pairs	neg_pairsindices_tuplea1pa2_r   n_per_pmax_val	numeratordenominatorlog_expr   r   r   _compute_loss   s4   
zNTXentLoss._compute_lossc                 C   s   t  S )Nr   )r   r   r   r   get_default_distance-   s   zNTXentLoss.get_default_distance)r	   )__name__
__module____qualname__r   r;   r<   __classcell__r   r   r   r   r      s    r   )	r&   	distancesr   utilsr   r#   generic_pair_lossr   r   r   r   r   r   <module>   s
    