a
    þd  ã                   @   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__© úb/var/www/html/stable-diffusion-webui/venv/lib/python3.9/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sŒ| jdkrü| jržt j	 
d¡ || }	|d|  }
|	|
 }| j| | jd|   }t  d| |¡}| jrôt j	 
d¡ ||9 }| ¡  S )zz"
        Parameters
        ----------
        x: input logits
        y: targets (multi-label binarized vector)
        r   Nr   )Úmax)ÚminFT)ÚtorchZsigmoidr   ÚclampÚlogr   r	   r
   r   Z_CZset_grad_enabledÚpowÚsum)r   ÚxÚyZ	x_sigmoidÚxs_posÚxs_negZlos_posZlos_negÚlossZpt0Zpt1ÚptZone_sided_gammaZ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edœ‡ fdd„Zdd	d
„Z‡  ZS )ÚAsymmetricLossSingleLabelr   r   çš™™™™™¹?Úmean)r   c                    s>   t t| ƒ ¡  || _tjdd| _g | _|| _|| _	|| _
d S )Néÿÿÿÿ©Zdim)r   r%   r   r   ÚnnZ
LogSoftmaxÚ
logsoftmaxÚtargets_classesr
   r	   Ú	reduction)r   r
   r	   r   r-   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rè| ¡ }|S )zj"
        Parameters
        ----------
        x: input logits
        y: targets (1-hot vector)
        r(   r   r   r)   r'   )Úsizer+   r   Z
zeros_likeZscatter_ÚlongZ	unsqueezer,   Úexpr   r
   r	   r   ÚmulÚaddr   r-   r'   )r   ÚinputsÚtargetr-   Znum_classesZ	log_predsÚtargetsZanti_targetsr   r   Zasymmetric_wr   r   r   r   r    @   s(    
 
ÿ
 
z!AsymmetricLossSingleLabel.forward)r   r   r&   r'   )N)r!   r"   r#   Úfloatr   r    r$   r   r   r   r   r%   5   s   
r%   )r   Ztorch.nnr*   ÚModuler   r%   r   r   r   r   Ú<module>   s   0