o
    wi                     @   sr   d dl Z d dlm  mZ d dlmZmZ d dlm	Z	m
Z
mZmZ d dlmZ G dd deZG dd deZdS )	    N)Loss	typecheck)LengthsTypeLogprobsTypeLossType	ProbsType)
NeuralTypec                       sD   e Zd Zd fdd	Zedd Zedd Ze d	d
 Z  Z	S )ForwardSumLoss      ?c                    s:   t    tjjdd| _tjjdd| _|| _|| _	d S )Nr
   )dimT)zero_infinity)
super__init__torchnn
LogSoftmaxlog_softmaxCTCLossctc_lossblank_logprob
loss_scale)selfr   r   	__class__ e/home/ubuntu/sommelier/.venv/lib/python3.10/site-packages/nemo/collections/tts/losses/aligner_loss.pyr      s
   

zForwardSumLoss.__init__c                 C   s,   t dt t tdt t tdt dS )NBST_specT_textr   )attn_logprobin_lensout_lens)r   r   tupler   r   r   r   r   input_types    s   
zForwardSumLoss.input_typesc                 C      dt t diS )Nforward_sum_losselements_typer   r   r&   r   r   r   output_types(      zForwardSumLoss.output_typesc           
      C   s   |}|}| d}|d}|ddd}tj|d| jd}tj|d |jtj	d}|
|ddd|dddkd | |}|dd  d}|| d}| j||||d	}	|	| j9 }	|	S )
Nr
      r      )r/   r   r   r   r   r   )inputpadvalue)devicedtypeg  4&k)input_lengthstarget_lengths)sizesqueezepermuteFr2   r   r   aranger4   longmasked_fill_viewr   	unsqueezerepeatnumelr   r   )
r   r"   r#   r$   key_lens
query_lensmax_key_lenkey_indstarget_seqscostr   r   r   forward.   s   

$

zForwardSumLoss.forward)r
   r   
__name__
__module____qualname__r   propertyr'   r-   r   rI   __classcell__r   r   r   r   r	      s    

r	   c                       sD   e Zd Zd
 fdd	Zedd Zedd Ze dd	 Z  Z	S )BinLossr   c                    s   t    || _d S )N)r   r   r   )r   r   r   r   r   r   M   s   

zBinLoss.__init__c                 C   s   t dt t dt dS )Nr   )hard_attentionsoft_attention)r   r   r&   r   r   r   r'   Q   s   

zBinLoss.input_typesc                 C   r(   )Nbin_lossr*   r,   r&   r   r   r   r-   X   r.   zBinLoss.output_typesc                 C   s<   t t j||dk dd }| |  }|| j9 }|S )Nr/   g-q=)min)r   logclampsumr   )r   rQ   rR   log_sumlossr   r   r   rI   ^   s    
zBinLoss.forward)r   rJ   r   r   r   r   rP   L   s    

rP   )r   torch.nn.functionalr   
functionalr;   nemo.core.classesr   r   nemo.core.neural_types.elementsr   r   r   r   "nemo.core.neural_types.neural_typer   r	   rP   r   r   r   r   <module>   s   4