o
    پi	                     @   sP   d Z ddlmZmZ ddlZddlmZ ddlm  mZ	 G dd dej
ZdS )zY Binary Cross Entropy w/ a few extras

Hacked together by / Copyright 2021 Ross Wightman
    )OptionalUnionNc                       sx   e Zd ZdZ						ddee deej ded	e	d
ee
ejef  f
 fddZdejdejdejfddZ  ZS )BinaryCrossEntropyz BCE with optional one-hot from dense targets, label smoothing, thresholding
    NOTE for experiments comparing CE to BCE /w label smoothing, may remove
    皙?NmeanFtarget_thresholdweight	reductionsum_classes
pos_weightc                    s   t t|   d|  krdk sJ  J |d ur$t|tjs$t|}|| _|| _|r.dn|| _	|| _
| d| | d| d S )Ng              ?noner   r   )superr   __init__
isinstancetorchTensortensor	smoothingr   r	   r
   register_buffer)selfr   r   r   r	   r
   r   	__class__ R/home/ubuntu/.local/lib/python3.10/site-packages/timm/loss/binary_cross_entropy.pyr      s   	
zBinaryCrossEntropy.__init__xtargetreturnc                 C   s   |j d }||j d ksJ |j |j kr?|j d }| j| }d| j | }| dd}tj||f||j|jdd||}| j	d urO|
| j	j|jd}tj||| j| j| jd}| jrf|d }|S )Nr   r      )devicedtype)r!   )r   r	   )shaper   longviewr   fullr    r!   scatter_r   gttoF binary_cross_entropy_with_logitsr   r   r	   r
   sumr   )r   r   r   
batch_sizenum_classes	off_valueon_valuelossr   r   r   forward%   s2   




zBinaryCrossEntropy.forward)r   NNr   FN)__name__
__module____qualname____doc__r   floatr   r   strboolr   r   r1   __classcell__r   r   r   r   r      s(    $r   )r5   typingr   r   r   torch.nnnntorch.nn.functional
functionalr)   Moduler   r   r   r   r   <module>   s    