o
    i                     @   s8   d Z ddlm  mZ ddlmZ G dd dejZdS )zHubert Pretrain Loss module.    N)nnc                       s@   e Zd ZdZ			ddededef fdd	ZdddZ  ZS )HubertPretrainLossa  Hubert criterion module.

    Args:
        pred_masked_weight: weight for predictive loss for masked frames
        pred_nomask_weight: weight for predictive loss for unmasked frames
        loss_weights: weights for additional loss terms (not first one)
          ?              $@pred_masked_weightpred_nomask_weightloss_weightsc                    s$   t t|   || _|| _|| _d S )N)superr   __init__r   r   r	   )selfr   r   r	   	__class__ N/home/ubuntu/.local/lib/python3.10/site-packages/espnet2/hubert/hubert_loss.pyr      s   
zHubertPretrainLoss.__init__Tc                 C   sz  d}d}|rdnd}g }| |d}||d}	tt||	D ]\}
\}}tj|||d}|| q| jdkrI|| jt| 7 }||	d 	 7 }g }| |d}||d}tt||D ]\}
\}}tj|||d}|| q^| j
dkr|| j
t| 7 }||d 	 7 }| jdkrt|dsJ ||\}}t|tr|d }|d }ntd	|| j|  | 7 }|||fS )
Nr   r   sumnoneT)	reductionFget_extra_losseszonly support one extra loss)
get_logitsget_targets	enumeratezipFcross_entropyappendr   r   numelr   r	   hasattrr   
isinstancelistNotImplementedErrorfloat)r   modelenc_outputsreducelosssample_sizer   loss_m_listlogp_m_listtarg_m_listilogp_mtarg_mloss_mloss_u_listlogp_u_listtarg_u_listlogp_utarg_uloss_uextra_lossesnamesr   r   r   forward&   s<   





zHubertPretrainLoss.forward)r   r   r   )T)__name__
__module____qualname____doc__r!   r   r6   __classcell__r   r   r   r   r      s    
r   )r:   torch.nn.functionalr   
functionalr   torchModuler   r   r   r   r   <module>   s   