o
    ¡¿¯iá  ã                   @   s(   d dl Z d dlZG dd„ dejjƒZdS )é    Nc                       s,   e Zd ZdZd‡ fdd„	Zd	dd„Z‡  ZS )
ÚGaussianUpsamplingz]Gaussian upsampling with fixed temperature as in:

    https://arxiv.org/abs/2010.04301

    çš™™™™™¹?c                    s   t ƒ  ¡  || _d S )N)ÚsuperÚ__init__Údelta)Úselfr   ©Ú	__class__© úY/home/ubuntu/.local/lib/python3.10/site-packages/espnet2/gan_tts/jets/length_regulator.pyr      s   

zGaussianUpsampling.__init__Nc                 C   s  |  d¡}|j}| ¡ dkrt d¡ d||jdd d¡< |du r)| ¡  ¡ }n|  d¡}t d|¡ 	d¡ 
|d¡ |¡ ¡ }|durJ|| ¡  }|jdd|d  }	d| j | 	d¡|	 	d¡ d  }
|dur{|
 | 	d¡ 
d|d¡ tdƒ ¡}
tj|
dd}t ||¡}|S )	a’  Upsample hidden states according to durations.

        Args:
            hs (Tensor): Batched hidden state to be expanded (B, T_text, adim).
            ds (Tensor): Batched token duration (B, T_text).
            h_masks (Tensor): Mask tensor (B, T_feats).
            d_masks (Tensor): Mask tensor (B, T_text).

        Returns:
            Tensor: Expanded hidden state (B, T_feat, adim).

        r   zLpredicted durations includes all 0 sequences. fill the first element with 1.é   )ÚdimNéÿÿÿÿé   Úinf)ÚsizeÚdeviceÚsumÚloggingÚwarningÚeqÚintÚtorchÚarangeÚ	unsqueezeÚrepeatÚtoÚfloatÚcumsumr   Úmasked_fillÚsoftmaxÚmatmul)r   ÚhsÚdsÚh_masksÚd_masksÚBr   ÚT_featsÚtÚcÚenergyÚp_attnr
   r
   r   Úforward   s,   
ÿ
$"ÿzGaussianUpsampling.forward)r   )NN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r,   Ú__classcell__r
   r
   r   r   r   	   s    r   )r   r   ÚnnÚModuler   r
   r
   r
   r   Ú<module>   s   