o
    pi`                     @   sB   d dl Z ddlmZ ddlmZ ddlmZ G dd deeZdS )	    N   )common_functions   )WeightRegularizerMixin)NCALossc                       s4   e Zd Z fddZdd Zdd Zdd Z  ZS )	ProxyNCALossc                    sT   t  jdi | tjt||| _| | j t|| _	| j
dgdd d S )Nnum_classesF)list_of_namesis_stat )super__init__torchnn	ParameterTensorproxiesweight_init_funcarangeproxy_labelsadd_to_recordable_attributes)selfr   embedding_sizekwargs	__class__r   _/home/ubuntu/.local/lib/python3.10/site-packages/pytorch_metric_learning/losses/proxy_losses.pyr   	   s
   zProxyNCALoss.__init__c                 C   s   t j| jj||d| j_d S )N)devicedtype)c_f	to_devicer   data)r   r   r   r   r   r   
cast_types   s   zProxyNCALoss.cast_typesc           	   	   C   sd   t | t |||| |j|j}}| || | || j|t | j	||}| 
|| j |S N)r   labels_requiredref_not_supportedr   r   r"   nca_computationr   r    r   &add_weight_regularization_to_loss_dict)	r   
embeddingslabelsindices_tupleref_emb
ref_labelsr   r   	loss_dictr   r   r   compute_loss   s   
zProxyNCALoss.compute_lossc                 C   s   |  || jS r#   )distancer   )r   r(   r   r   r   
get_logits"   s   zProxyNCALoss.get_logits)__name__
__module____qualname__r   r"   r.   r0   __classcell__r   r   r   r   r      s
    r   )	r   utilsr   r   mixinsr   nca_lossr   r   r   r   r   r   <module>   s
    