o
    }oi                     @   sj   d dl mZ d dlZd dlmZ d dlmZ d dlmZm	Z	m
Z
mZ d dlmZ dgZG dd deZdS )	    )OptionalN)Loss)	typecheck)
LabelsType
LogitsTypeLossType
NeuralType)loggingMultiSimilarityLossc                
       sn   e Zd Zedd Zedd Z				dd	ee d
ee dee dee f fddZe	 dd Z
  ZS )r
   c                 C   s   t dt t dt dS )z3Returns definitions of module input ports.
        )BDr   )logitslabels)r   r   r   self r   h/home/ubuntu/.local/lib/python3.10/site-packages/nemo/collections/common/losses/multi_similarity_loss.pyinput_types   s   zMultiSimilarityLoss.input_typesc                 C   s   dt t diS )z4Returns definitions of module output ports.
        loss)elements_type)r   r   r   r   r   r   output_types"   s   z MultiSimilarityLoss.output_types       @      D@      ?皙?	scale_pos	scale_negoffsetmarginc                    s,   t    || _|| _|| _|| _d| _d S )Ngh㈵>)super__init__
_scale_pos
_scale_neg_offset_margin_epsilon)r   r   r   r   r   	__class__r   r   r    (   s   

zMultiSimilarityLoss.__init__c                 C   s  t |t |}g }t|dD ]}|| |||  }||d| j  }|| |||  }t	|dks@t	|dkrAq||
t|| j  }||t|| j  }	t	|dkset	|	dkrfqd| j t dt t | j |	| j    }
d| j t dt t | j|| j    }||
|  qt	|dkrt jg dd }td| d |S t t ||d }|S )Nr      g      ?T)requires_gradz.Encountered zero loss in multisimloss, loss = z%. No hard examples found in the batch)torchmatmultrangesizeeqltr%   nelengtminr$   maxr!   logsumexpr#   r"   appendzeroscudar	   infostack)r   r   r   cos_simlossesipositive_simsnegative_simshard_negativeshard_positivespos_termneg_termr   r   r   r   forward6   s>   &$zMultiSimilarityLoss.forward)r   r   r   r   )__name__
__module____qualname__propertyr   r   r   floatr    r   rG   __classcell__r   r   r&   r   r
      s(    

)typingr   r*   nemo.core.classesr   nemo.core.classes.commonr   nemo.core.neural_typesr   r   r   r   
nemo.utilsr	   __all__r
   r   r   r   r   <module>   s   