o
    ÓÙ¾i¨  ã                   @   s<   d dl Z d dlmZ G dd„ dejƒZG dd„ dejƒZdS )é    Nc                       s&   e Zd Zd
‡ fdd„	Zdd	„ Z‡  ZS )ÚAsymmetricLossMultiLabelé   é   çš™™™™™©?ç:Œ0âŽyE>Fc                    s0   t t| ƒ ¡  || _|| _|| _|| _|| _d S ©N)Úsuperr   Ú__init__Ú	gamma_negÚ	gamma_posÚclipÚdisable_torch_grad_focal_lossÚeps)Úselfr
   r   r   r   r   ©Ú	__class__© úM/home/ubuntu/.local/lib/python3.10/site-packages/timm/loss/asymmetric_loss.pyr	      s   
z!AsymmetricLossMultiLabel.__init__c                 C   s  t  |¡}|}d| }| jdur| jdkr|| j jdd}|t  |j| jd¡ }d| t  |j| jd¡ }|| }| jdksF| jdkr|| jrNt  	d¡ || }	|d|  }
|	|
 }| j| | jd|   }t  
d| |¡}| jrxt  	d¡ ||9 }| ¡  S )zz"
        Parameters
        ----------
        x: input logits
        y: targets (multi-label binarized vector)
        r   Nr   )Úmax)ÚminFT)ÚtorchÚsigmoidr   ÚclampÚlogr   r
   r   r   Úset_grad_enabledÚpowÚsum)r   ÚxÚyÚ	x_sigmoidÚxs_posÚxs_negÚlos_posÚlos_negÚlossÚpt0Úpt1ÚptÚone_sided_gammaÚone_sided_wr   r   r   Úforward   s(   
	


z AsymmetricLossMultiLabel.forward)r   r   r   r   F)Ú__name__Ú
__module__Ú__qualname__r	   r*   Ú__classcell__r   r   r   r   r      s    	r   c                       s.   e Zd Zddef‡ fdd„Zdd	d
„Z‡  ZS )ÚAsymmetricLossSingleLabelr   r   çš™™™™™¹?Úmeanr   c                    s>   t t| ƒ ¡  || _tjdd| _g | _|| _|| _	|| _
d S )Néÿÿÿÿ©Údim)r   r/   r	   r   ÚnnÚ
LogSoftmaxÚ
logsoftmaxÚtargets_classesr   r
   Ú	reduction)r   r   r
   r   r9   r   r   r   r	   6   s   
z"AsymmetricLossSingleLabel.__init__Nc                 C   sì   |  ¡ d }|  |¡}t |¡ d| ¡  d¡d¡| _| j}d| }t |¡}d| }	|| }|	| }	t 	d| |	 | j
| | j|  ¡}
||
 }| jdkr^| j d| j ¡ | j| ¡| _| j |¡ }|jdd}| jdkrt| ¡ }|S )zj"
        Parameters
        ----------
        x: input logits
        y: targets (1-hot vector)
        r2   r   r   r3   r1   )Úsizer7   r   Ú
zeros_likeÚscatter_ÚlongÚ	unsqueezer8   Úexpr   r   r
   r   ÚmulÚaddr   r9   r1   )r   ÚinputsÚtargetr9   Únum_classesÚ	log_predsÚtargetsÚanti_targetsr    r!   Úasymmetric_wr$   r   r   r   r*   @   s(   
 
ÿ
 
z!AsymmetricLossSingleLabel.forward)r   r   r0   r1   r   )r+   r,   r-   Úfloatr	   r*   r.   r   r   r   r   r/   5   s    
r/   )r   Útorch.nnr5   ÚModuler   r/   r   r   r   r   Ú<module>   s    0