o
    pi                     @   sL   d dl 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 )
    N   DivisorReducer)common_functions)loss_and_miner_utils   )BaseMetricLossFunctionc                       sR   e Zd Z						d fdd	Zd	d
 Zdd Zdd Zdd Zdd Z  Z	S )
MarginLoss皙?r   333333?allFNc                    sL   t  jdi | || _|| _|| _| || || _| jg ddd d S )N)marginnubetaF)list_of_namesis_stat )super__init__r   r   
learn_betainitialize_betatriplets_per_anchoradd_to_recordable_attributes)selfr   r   r   r   r   num_classeskwargs	__class__r   ^/home/ubuntu/.local/lib/python3.10/site-packages/pytorch_metric_learning/losses/margin_loss.pyr   
   s   

zMarginLoss.__init__c                 C   s   t || t|||| j}|\}}}t|dkr|  S t| jdkr(| jn| j||  }	t j|	|j	|j
d}	| ||}
|
||f }|
||f }tjj| j||	| j }tjj| j|	|| j }t|dk}t|dk}|| }|| }||d|d| |	||d}|S )Nr   r   )devicedtypeg        tripletlossesindicesreduction_typedivisor)margin_lossbeta_reg_loss)c_f labels_or_indices_tuple_requiredlmuconvert_to_tripletsr   lenzero_lossesr   	to_devicer   r    distancetorchnn
functionalrelur   sumcompute_reg_loss)r   
embeddingslabelsindices_tupleref_emb
ref_labels
anchor_idxpositive_idxnegative_idxr   matd_apd_anpos_lossneg_lossnum_pos_pairsnum_neg_pairsr&   r'   	loss_dictr   r   r   compute_loss   s<   

"
zMarginLoss.compute_lossc                 C   s@   | j r|| j }t| jdkr|d ddS ||d|dS |  S )Nr   already_reduced)r#   r$   r%   elementr"   )r   r   r-   r   	zero_loss)r   r   r<   r&   lossr   r   r   r6   I   s   
zMarginLoss.compute_reg_lossc                 C   s   ddgS )Nr'   r(   r   r   r   r   r   _sub_loss_names[   s   zMarginLoss._sub_loss_namesc                 C   s   t  S Nr   rL   r   r   r   get_default_reducer^   s   zMarginLoss.get_default_reducerc                 C   sF   t t|g| _|rt || j | _| jr!t j| j| _d S d S rN   )r1   tensorfloatr   onesr   r2   	Parameter)r   r   r   r   r   r   r   a   s   zMarginLoss.initialize_beta)r
   r   r   r   FN)
__name__
__module____qualname__r   rG   r6   rM   rO   r   __classcell__r   r   r   r   r	   	   s    +r	   )r1   reducersr   utilsr   r)   r   r+   base_metric_loss_functionr   r	   r   r   r   r   <module>   s    