o
    i$                     @   s   d Z ddlZddlmZmZmZ ddlZddlmZ G dd dej	j
ZG dd dej	j
ZG d	d
 d
ej	j
ZG dd dej	j
ZG dd dej	j
ZG dd dej	j
ZdS )z_Basic Flow modules used in VITS.

This code is based on https://github.com/jaywalnut310/vits.

    N)OptionalTupleUnion)&piecewise_rational_quadratic_transformc                   @   sD   e Zd ZdZdddejdedeejeejejf f fddZ	d	S )
FlipFlowzFlip flow module.F)inversexr   returnc                O   s.   t |dg}|s||d}||fS |S )a6  Calculate forward propagation.

        Args:
            x (Tensor): Input tensor (B, channels, T).
            inverse (bool): Whether to inverse the flow.

        Returns:
            Tensor: Flipped tensor (B, channels, T).
            Tensor: Log-determinant tensor for NLL (B,) if not inverse.

           r   )torchflip	new_zerossize)selfr   r   argskwargslogdet r   M/home/ubuntu/.local/lib/python3.10/site-packages/espnet2/gan_tts/vits/flow.pyforward   s
   zFlipFlow.forwardN)
__name__
__module____qualname____doc__r   Tensorboolr   r   r   r   r   r   r   r      s    r   c                   @   sN   e Zd ZdZ		ddejdejdededeeje	ejejf f f
d	d
Z
dS )LogFlowzLog flow module.Fh㈵>r   x_maskr   epsr	   c                 K   sF   |st t ||| }t | ddg}||fS t || }|S )a  Calculate forward propagation.

        Args:
            x (Tensor): Input tensor (B, channels, T).
            x_mask (Tensor): Mask tensor (B, 1, T).
            inverse (bool): Whether to inverse the flow.
            eps (float): Epsilon for log.

        Returns:
            Tensor: Output tensor (B, channels, T).
            Tensor: Log-determinant tensor for NLL (B,) if not inverse.

        r
      )r   log	clamp_minsumexp)r   r   r   r   r   r   yr   r   r   r   r   .   s   zLogFlow.forwardN)Fr   )r   r   r   r   r   r   r   floatr   r   r   r   r   r   r   r   +   s    r   c                       s^   e Zd ZdZdef fddZ	ddejdejded	e	eje
ejejf f fd
dZ  ZS )ElementwiseAffineFlowzElementwise affine flow module.channelsc              	      sL   t    || _| dtjt|d | dtjt|d dS )zqInitialize ElementwiseAffineFlow module.

        Args:
            channels (int): Number of channels.

        mr
   logsN)super__init__r(   register_parameterr   nn	Parameterzeros)r   r(   	__class__r   r   r,   O   s   
 zElementwiseAffineFlow.__init__Fr   r   r   r	   c                 K   s`   |s | j t| j|  }|| }t| j| ddg}||fS || j  t| j  | }|S )ai  Calculate forward propagation.

        Args:
            x (Tensor): Input tensor (B, channels, T).
            x_lengths (Tensor): Length tensor (B,).
            inverse (bool): Whether to inverse the flow.

        Returns:
            Tensor: Output tensor (B, channels, T).
            Tensor: Log-determinant tensor for NLL (B,) if not inverse.

        r
   r    )r)   r   r$   r*   r#   )r   r   r   r   r   r%   r   r   r   r   r   [   s   zElementwiseAffineFlow.forward)F)r   r   r   r   intr,   r   r   r   r   r   r   __classcell__r   r   r1   r   r'   L   s    r'   c                       s@   e Zd ZdZdedef fddZdejdejfdd	Z  Z	S )
	Transposez+Transpose module for torch.nn.Sequential().dim1dim2c                    s   t    || _|| _dS )zInitialize Transpose module.N)r+   r,   r6   r7   )r   r6   r7   r1   r   r   r,   w   s   

zTranspose.__init__r   r	   c                 C   s   | | j| jS )z
Transpose.)	transposer6   r7   )r   r   r   r   r   r   }   s   zTranspose.forward)
r   r   r   r   r3   r,   r   r   r   r4   r   r   r1   r   r5   t   s    r5   c                       sf   e Zd ZdZ		ddededededef
 fd	d
Z	ddejdejde	ej dejfddZ
  ZS )DilatedDepthSeparableConvz$Dilated depth-separable conv module.        r   r(   kernel_sizelayersdropout_rater   c           	         s   t    tj | _t|D ]X}|| }|| | d }|  jtjtjj||||||dt	ddtjj
||ddt	ddtj tj||dt	ddtjj
||ddt	ddtj tj|g7  _qdS )a.  Initialize DilatedDepthSeparableConv module.

        Args:
            channels (int): Number of channels.
            kernel_size (int): Kernel size.
            layers (int): Number of layers.
            dropout_rate (float): Dropout rate.
            eps (float): Epsilon for layer norm.

        r    )groupsdilationpaddingr
   T)r   elementwise_affineN)r+   r,   r   r.   
ModuleListconvsrange
SequentialConv1dr5   	LayerNormGELUDropout)	r   r(   r;   r<   r=   r   ir?   r@   r1   r   r   r,      sP   


z"DilatedDepthSeparableConv.__init__Nr   r   gr	   c                 C   s8   |dur|| }| j D ]}||| }|| }q|| S )aA  Calculate forward propagation.

        Args:
            x (Tensor): Input tensor (B, in_channels, T).
            x_mask (Tensor): Mask tensor (B, 1, T).
            g (Optional[Tensor]): Global conditioning tensor (B, global_channels, 1).

        Returns:
            Tensor: Output tensor (B, channels, T).

        N)rC   )r   r   r   rK   fr%   r   r   r   r      s   

z!DilatedDepthSeparableConv.forward)r:   r   )N)r   r   r   r   r3   r&   r,   r   r   r   r   r4   r   r   r1   r   r9      s2    <r9   c                       s   e Zd ZdZ		ddededededed	ef fd
dZ		ddejdejde	ej de
deejeejejf f f
ddZ  ZS )ConvFlowzConvolutional flow module.
         @in_channelshidden_channelsr;   r<   bins
tail_boundc                    s   t    |d | _|| _|| _|| _tj| j|d| _	t
|||dd| _tj|| j|d d  d| _| jjj  | jjj  dS )a]  Initialize ConvFlow module.

        Args:
            in_channels (int): Number of input channels.
            hidden_channels (int): Number of hidden channels.
            kernel_size (int): Kernel size.
            layers (int): Number of layers.
            bins (int): Number of bins.
            tail_bound (float): Tail bound value.

        r    r
   r:   )r=      N)r+   r,   half_channelsrQ   rR   rS   r   r.   rF   
input_convr9   dds_convprojweightdatazero_bias)r   rP   rQ   r;   r<   rR   rS   r1   r   r   r,      s.   

zConvFlow.__init__NFr   r   rK   r   r	   c              	   C   s  | |dd d\}}| |}| j|||d}| || }|j\}}	}
|||	d|
dddd}t	| j
}|dd| jf | }|d| jd| j f | }|dd| j df }t|||||d	| jd
\}}t||gd| }t|| ddg}|s||fS |S )a  Calculate forward propagation.

        Args:
            x (Tensor): Input tensor (B, channels, T).
            x_mask (Tensor): Mask tensor (B,).
            g (Optional[Tensor]): Global conditioning tensor (B, channels, 1).
            inverse (bool): Whether to inverse the flow.

        Returns:
            Tensor: Output tensor (B, channels, T).
            Tensor: Log-determinant tensor for NLL (B,) if not inverse.

        r
   r    )rK   r   rT   .Nlinear)r   tailsrS   )splitr   rV   rW   rX   shapereshapepermutemathsqrtrQ   rR   r   rS   r   catr#   )r   r   r   rK   r   xaxbhbctdenomunnorm_widthsunnorm_heightsunnorm_derivatives
logdet_absr   r   r   r   r     s0   

	zConvFlow.forward)rN   rO   )NF)r   r   r   r   r3   r&   r,   r   r   r   r   r   r   r   r4   r   r   r1   r   rM      s<    1rM   )r   rd   typingr   r   r   r   espnet2.gan_tts.vits.transformr   r.   Moduler   r   r'   r5   r9   rM   r   r   r   r   <module>   s   !(T