o
    èp©ij  ã                   @   s<   d dl Z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                       sB   e Zd ZdZd‡ fdd„	Zdd„ Zdd	„ Zd
d„ Zdd„ Z‡  Z	S )ÚArcFaceLossz@
    Implementation of https://arxiv.org/pdf/1801.07698.pdf
    çš™™™™™<@é@   c                    s    t ƒ jd||||dœ|¤Ž d S )N)Únum_classesÚembedding_sizeÚmarginÚscale© )ÚsuperÚ__init__)Úselfr	   r
   r   r   Úkwargs©Ú	__class__r   ú_/home/ubuntu/.local/lib/python3.10/site-packages/pytorch_metric_learning/losses/arcface_loss.pyr      s   ü
ûzArcFaceLoss.__init__c                 C   s   t  | j¡| _d S ©N)ÚnpÚradiansr   )r   r   r   r   Úinit_margin   s   zArcFaceLoss.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   s   zArcFaceLoss.cast_typesc              	   C   sX   |   |¡}t || j ¡}t |¡}t |t d¡| j k||| jt | j¡  ¡}|S )Né´   )Ú
get_anglesÚtorchÚcosr   Úwherer   Údeg2radÚsin)r   Úcosine_of_target_classesÚanglesÚcos_theta_plus_marginÚ	cos_thetaÚunscaled_logitsr   r   r   Úmodify_cosine_of_target_classes   s   

ýz+ArcFaceLoss.modify_cosine_of_target_classesc                 G   s
   || j  S r   )r   )r   ÚlogitsÚ_r   r   r   Úscale_logits,   s   
zArcFaceLoss.scale_logits)r   r   )
Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r,   r/   Ú__classcell__r   r   r   r   r      s    	r   )	Únumpyr   r"   Úutilsr   r   Úlarge_margin_softmax_lossr   r   r   r   r   r   Ú<module>   s
    