o
    pi                     @   s4   d dl Z ddlmZ ddlmZ G dd deZdS )    N   )common_functions   )LargeMarginSoftmaxLossc                       sH   e Zd ZdZddd fdd
Zdd Zd	d
 Zdd Zdd Z  Z	S )CosFaceLossz<
    Implementation of https://arxiv.org/abs/1801.09414
    gffffff?@   marginscalec                   s   t  j|||d| d S )Nr   )super__init__)selfr	   r
   argskwargs	__class__ _/home/ubuntu/.local/lib/python3.10/site-packages/pytorch_metric_learning/losses/cosface_loss.pyr         zCosFaceLoss.__init__c                 C   s   d S Nr   )r   r   r   r   init_margin   s   zCosFaceLoss.init_marginc                 C   s   t j| jj||d| j_d S )N)devicedtype)c_f	to_deviceWdata)r   r   r   r   r   r   
cast_types   r   zCosFaceLoss.cast_typesc                 C   sB   | j rt  | | W d    n1 sw   Y  || j S r   )collect_statstorchno_grad
get_anglesr	   )r   cosine_of_target_classesr   r   r   modify_cosine_of_target_classes   s   

z+CosFaceLoss.modify_cosine_of_target_classesc                 G   s
   || j  S r   )r
   )r   logits_r   r   r   scale_logits   s   
zCosFaceLoss.scale_logits)
__name__
__module____qualname____doc__r   r   r   r#   r&   __classcell__r   r   r   r   r      s    r   )r   utilsr   r   large_margin_softmax_lossr   r   r   r   r   r   <module>   s    