o
    wif                     @   s   d dl Z d dl mZ d dlmZmZmZ d dlmZmZm	Z	m
Z
mZmZ d dlmZ ddgZG dd dejeeZG d	d dejeeZdS )
    N)nn)SerializationTyping	typecheck)
LabelsType
LogitsTypeLogprobsTypeLossTypeMaskType
NeuralType)loggingCrossEntropyLossNLLLossc                       N   e Zd ZdZedd Zedd Zd fd
d	Ze d fdd	Z	  Z
S )r   z
    CrossEntropyLoss
    c                 C   s^   t dgdg| jd   t t dgdg| jd   t t dgdg| jd   t dddS )3Returns definitions of module input ports.
        BANY      Toptional)logitslabels	loss_mask)r   _logits_dimr   r   r
   self r   i/home/ubuntu/sommelier/.venv/lib/python3.10/site-packages/nemo/collections/common/losses/cross_entropy.pyinput_types   s    zCrossEntropyLoss.input_typesc                 C      dt t diS z4Returns definitions of module output ports.
        loss)elements_typer   r	   r   r   r   r   output_types(      zCrossEntropyLoss.output_typesr   Nmeanc                    sH   |durt |st |}td|  t j|||d || _dS )z
        Args:
            logits_ndim (int): number of dimensions (or rank) of the logits tensor
            weight (list): list of rescaling weight given to each class
            reduction (str): type of the reduction over the batch
        Nz(Weighted Cross Entropy loss with weight weight	reductionignore_index)torch	is_tensorFloatTensorr   infosuper__init__r   )r   logits_ndimr*   r+   r,   	__class__r   r   r2   .   s
   

zCrossEntropyLoss.__init__c                       t j|ddd}t j|ddd}|dur.|jt jur|dk}t j|ddd}|| }|| }t|dkr@t |t j|ddS t ||}|S )z
        Args:
            logits (float): output of the classifier
            labels (long): ground truth labels
            loss_mask (bool/float/int): tensor to specify the masking
        r   	start_dimend_dimN      ?dimr-   flattendtypeboollenr1   forwardargmax)r   r   r   r   logits_flattenlabels_flattenloss_mask_flattenr"   r4   r   r   rD   ;      zCrossEntropyLoss.forwardr   Nr'   r(   N__name__
__module____qualname____doc__propertyr   r%   r2   r   rD   __classcell__r   r   r4   r   r          
	
c                       r   )r   z
    NLLLoss
    c                 C   s(   t dt t dt t dt dddS )r   )r   TD)r   rT   Tr   )	log_probsr   output_mask)r   r   r   r
   r   r   r   r   r   Y   s   

zNLLLoss.input_typesc                 C   r    r!   r$   r   r   r   r   r%   c   r&   zNLLLoss.output_typesr   Nr'   r(   c                    s8   |durt |st |}t j|||d || _dS )aO  
        Args:
            log_probs_ndim (int): number of dimensions (or rank) of the logprobs tensor
            weight (list): list of rescaling weight given to each class
            reduction (str): type of the reduction over the batch
            ignore_index (int): mask out loss computation where labels = ignore_index
        Nr)   )r-   r.   r/   r1   r2   _log_probs_dim)r   log_probs_ndimr*   r+   r,   r4   r   r   r2   i   s   

zNLLLoss.__init__c                    r6   )z
        Args:
            log_probs (float): output log probability tensor
            labels (long): ground truth labels
            loss_mask (bool/float/int): tensor to specify the masking
        r   r7   r8   r;   Nr<   r=   r?   )r   rV   r   r   log_probs_flattenrG   rH   r"   r4   r   r   rD   v   rI   zNLLLoss.forwardrJ   rK   rL   r   r   r4   r   r   T   rS   )r-   r   nemo.core.classesr   r   r   nemo.core.neural_typesr   r   r   r	   r
   r   
nemo.utilsr   __all__r   r   r   r   r   r   <module>   s    ;