o
    pi                     @   sP   d dl mZ d dlmZ d dlmZ d dlmZ ddl	m
Z
 G dd de
Zd	S )
   CosineSimilarityAvgNonZeroReducer)common_functions)loss_and_miner_utils   )GenericPairLossc                       s6   e Zd Zd
 fdd	Zdd Zdd Zdd	 Z  ZS )
SupConLoss皙?c                    s0   t  jdddi| || _| jdgdd d S )Nmat_based_lossTtemperatureF)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/supcon_loss.pyr   
   s   zSupConLoss.__init__c           	      C   s   |   rX|   rX| jjs| }|| j }|jddd\}}||  }tj|||   ddd}|| }|| j	dd|j	ddt
|j  }d| t
|dd	iS |  S )
Nr   T)dimkeepdimF)	keep_maskadd_oner   )r   losselement)lossesindicesreduction_type)boolanydistanceis_invertedr   maxdetachlmu	logsumexpsumc_f	small_valdtypetorch_arange_from_sizezero_losses)	r   matpos_maskneg_maskmat_max_denominatorlog_probmean_log_prob_posr   r   r   _compute_loss   s(   
zSupConLoss._compute_lossc                 C      t  S Nr   r   r   r   r   get_default_reducer)      zSupConLoss.get_default_reducerc                 C   r9   r:   r   r;   r   r   r   get_default_distance,   r=   zSupConLoss.get_default_distance)r   )__name__
__module____qualname__r   r8   r<   r>   __classcell__r   r   r   r   r
   	   s
    r
   N)	distancesr   reducersr   utilsr   r+   r   r(   generic_pair_lossr	   r
   r   r   r   r   <module>   s    