
    kh	                     h    d Z ddlmZmZ ddlZddlmZ ddlmc mZ	  G d dej                        Zy)zY Binary Cross Entropy w/ a few extras

Hacked together by / Copyright 2021 Ross Wightman
    )OptionalUnionNc                        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Zdej                  d	ej                  d
ej                  fdZ x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
    target_thresholdweight	reductionsum_classes
pos_weightc                 4   t         t        |           d|cxk  rdk  sJ  J |/t        |t        j
                        st	        j                  |      }|| _        || _        |rdn|| _	        || _
        | j                  d|       | j                  d|       y )Ng              ?noner   r   )superr   __init__
isinstancetorchTensortensor	smoothingr   r	   r
   register_buffer)selfr   r   r   r	   r
   r   	__class__s          Z/var/www/teggl/fontify/venv/lib/python3.12/site-packages/timm/loss/binary_cross_entropy.pyr   zBinaryCrossEntropy.__init__   s     	 $02Y$$$$$$!j%,,7"\\*5
" 0#.I&Xv.\:6    xtargetreturnc                    |j                   d   }||j                   d   k(  sJ |j                   |j                   k7  r|j                   d   }| j                  |z  }d| j                  z
  |z   }|j                         j                  dd      }t	        j
                  ||f||j                  |j                        j                  d||      }| j                  5|j                  | j                        j                  |j                        }t        j                  ||| j                  | j                  | j                         }| j"                  r|j%                  d      j'                         }|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
   summean)r   r   r   
batch_sizenum_classes	off_valueon_valuelosss           r   forwardzBinaryCrossEntropy.forward%   s8   WWQZ
V\\!_,,,<<177"''"+K4IDNN*Y6H[[]''A.FZZ[)xxqww0 19FH0M 
   ,YYt44588v||8LF11vKKnn	
 88B<$$&Dr   )g?NNr-   FN)__name__
__module____qualname____doc__r   floatr   r   strboolr   r   r3   __classcell__)r   s   @r   r   r      s    
 04-1# %?C7 'uo7 U\\*	7
 7 7 !u||U':!;<7* u||  r   r   )r7   typingr   r   r   torch.nnnntorch.nn.functional
functionalr*   Moduler    r   r   <module>rC      s+    #    5 5r   