o
    }oi"                     @   s   d dl Z d dlmZ d dlmZ d dlmZ d dlm	Z	 dddZ
dd
dZG dd de jjZG dd de jjZG dd de	ZdS )    N)
functional)ForwardSumLoss)get_mask_from_lengths)Loss      ?c                 C   s   d}t |D ]+\}}	|dkrt|	| }
t|r|| }q|
t|	|  }
t|r1||| 7 }qt|r:||9 }| | } t| |  d| |  }||
 | }|| }|| }|| }||fS )N        r      )	enumeratetorchsumlen)zlog_det_W_list
log_s_list
n_elementsn_dimsmasksigmalog_det_W_totalilog_slog_s_total	prior_NLLlossdenom
loss_prior r   Z/home/ubuntu/.local/lib/python3.10/site-packages/nemo/collections/tts/losses/radttsloss.pycompute_flow_loss   s(   r   Fc                 C   s   t |jdkr|d d d f n|}t |jdkr |d d d f n|}t |jt |jks.J || }| | } |dkrCtj| |dd}ntj| |dd}||  }d||i}|S )Nr   vpredr   )	reductionloss_{})r   shapeF binary_cross_entropy_with_logitsmse_lossr   format)x_hatxr   namer   	loss_dictr   r   r   compute_regression_loss2   s   ""r+   c                       s&   e Zd Zd fdd	Zdd Z  ZS )AttributePredictionLossr   c                    sR   t t|   || _|| _|d | _|| _d| _d|d v r'|d d | _d S d S )Nr)      n_group_sizehparams)superr,   __init__r)   r   
model_nameloss_weightr.   )selfr)   model_configr3   r   	__class__r   r   r1   F   s   
z AttributePredictionLoss.__init__c                 C   s   t || j }|d d d f  }i }d|v rL| | j }|d d}t|d |d |d |||| j\}}d| j|| j	fd| j|dfi}n d|v rlt
|d |d	 || j}| D ]\}	}
|
| j	f||	< q`t|d
krvtd|S )Nr   r-   r   r   r!   zloss_prior_{}r   r'   r(   r   zloss not supported)r   r.   floatr   sizer   r   r&   r)   r3   r+   itemsr   	Exception)r4   model_outputlensr   r*   r   r   r   r   kvr   r   r   forwardP   s2   
zAttributePredictionLoss.forwardr   __name__
__module____qualname__r1   r@   __classcell__r   r   r6   r   r,   E   s    
r,   c                       s$   e Zd Z fddZdd Z  ZS )AttentionBinarizationLossc                    s   t t|   d S )N)r0   rG   r1   )r4   r6   r   r   r1   q   s   z"AttentionBinarizationLoss.__init__c                 C   s$   t ||dk  }| |  S )Nr-   )r
   logr   )r4   hard_attentionsoft_attentionlog_sumr   r   r   r@   t   s   z!AttentionBinarizationLoss.forwardrB   r   r   r6   r   rG   p   s    rG   c                       s4   e Zd Z							d fdd	Zdd Z  ZS )	
RADTTSLossr   r-   Nc                    s   t t|   || _|| _|| _t | _|| _i | _|d ur)t	d||d | jd< |d ur:t	d||d dd| jd< |d urIt	d	||d
 | jd< |d urZt	d||d | jd< d S d S )Ndurationdur_loss_weightduration_model_outputsf0f0_loss_weightr   )r   f0_model_outputsenergyenergy_loss_weightenergy_model_outputsr   vpred_loss_weightvpred_model_outputs)
r0   rL   r1   r   r.   loss_weightsr   attn_ctc_lossloss_fnsr,   )r4   r   r.   dur_model_configf0_model_configenergy_model_configvpred_model_configrX   r6   r   r   r1   z   s0   





zRADTTSLoss.__init__c                 C   s$  i }t |d rF| | j }t|| j }|d d d f  }|d d}t|d |d |d |||| j\}}	|df|d< |	df|d< | j|d	 ||d
}
|
| j	d f|d< |D ]4}|| j
v r|| d urt || dkrd|v rv|n|}|| }| j
| || D ]\}}|||< qq[|S )Nz_melr-   r   r   r   loss_melr   loss_prior_melattn_logprob)rb   in_lensout_lensctc_loss_weightloss_ctcr   dur)r   r   r.   r   r8   r9   r   r   rY   rX   rZ   r:   )r4   r<   rc   rd   r*   r   r   r   r`   ra   ctc_costr>   t_lensmout	loss_namer?   r   r   r   r@      s8   	

zRADTTSLoss.forward)r   r-   NNNNNrB   r   r   r6   r   rL   y   s    %rL   rA   )F)r
   torch.nnr   r#   (nemo.collections.tts.losses.aligner_lossr   (nemo.collections.tts.parts.utils.helpersr   nemo.core.classesr   r   r+   nnModuler,   rG   rL   r   r   r   r   <module>   s   

+	