o
    pi.                     @   sF   d dl Z d dlm  mZ ddlmZ ddlm	Z	 G dd de	Z
dS )    N   )common_functions   )BaseMetricLossFunctionc                       sH   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 )
VICRegLoss   r   -C6?c                    sP   d|v rt dd|v rt dt jdi | 	 || _|| _|| _|| _d S )Ndistancez)VICRegLoss cannot use a distance functionembedding_regularizerz#VICRegLoss cannot use a regularizer )
ValueErrorsuper__init__invariance_lambdavariance_mucovariance_veps)selfr   r   r   r   kwargs	__class__r   ^/home/ubuntu/.local/lib/python3.10/site-packages/pytorch_metric_learning/losses/vicreg_loss.pyr   	   s   
zVICRegLoss.__init__c                 C   s   t | t || | j| || }| ||\}}| j| || }	t |}
|t |dd| j	| |
dd| j	| |
dd|	d dddS )Nelement)lossesindicesreduction_typealready_reducedinvariance_lossvariance_loss1variance_loss2covariance_loss)
c_findices_tuple_not_supportedlabels_not_supportedr   r   variance_lossr   r!   torch_arange_from_sizer   )r   
embeddingslabelsindices_tupleref_emb
ref_labelsr   r   r    r!   var_loss_sizer   r   r   compute_loss   s2   

zVICRegLoss.compute_lossc                 C   s   t j|| d ddS )Nr   r   dim)torchmean)r   embr*   r   r   r   r   <   s   zVICRegLoss.invariance_lossc                 C   sT   t |jdd| j }t |jdd| j }td| d td| d fS )Nr   r.   r   r   )r0   sqrtvarr   Frelu)r   r2   r*   std_embstd_ref_embr   r   r   r%   ?   s   $zVICRegLoss.variance_lossc           	      C   s   |  \}}||jdd }||jdd }|j| |d  }|j| |d  }tj||jd}||   d | ||   d |  }|S )Nr   r.   r   )devicer   )	sizer1   Tr0   eyer9   boolpow_sum)	r   r2   r*   NDcov_embcov_ref_embdiagcov_lossr   r   r   r!   D   s   zVICRegLoss.covariance_lossc                 C   s   g dS )Nr   r   )r   r   r   r   _sub_loss_namesR   s   zVICRegLoss._sub_loss_names)r   r   r   r   )
__name__
__module____qualname__r   r-   r   r%   r!   rF   __classcell__r   r   r   r   r      s    !r   )r0   torch.nn.functionalnn
functionalr5   utilsr   r"   base_metric_loss_functionr   r   r   r   r   r   <module>   s
    