o
    i                     @   s8   d Z ddlmZmZmZ ddlZG dd dejjZdS )zmHiFiGAN Residual block modules.

This code is modified from https://github.com/kan-bayashi/ParallelWaveGAN.

    )AnyDictListNc                       sx   e Zd ZdZddg ddddddifd	ed
edee dedededeee	f f fddZ
dejdejfddZ  ZS )ResidualBlockz!Residual block module in HiFiGAN.   i   )   r      T	LeakyReLUnegative_slopeg?kernel_sizechannels	dilationsbiasuse_additional_convsnonlinear_activationnonlinear_activation_paramsc           	         s   t    || _tj | _|rtj | _|d dks J d|D ]P}|  jtjt	tj|di |tjj
|||d|||d d | dg7  _|rr|  jtjt	tj|di |tjj
|||dd||d d dg7  _q"dS )ag  Initialize ResidualBlock module.

        Args:
            kernel_size (int): Kernel size of dilation convolution layer.
            channels (int): Number of channels for convolution layer.
            dilations (List[int]): List of dilation factors.
            use_additional_convs (bool): Whether to use additional convolution layers.
            bias (bool): Whether to add bias parameter in convolution layers.
            nonlinear_activation (str): Activation function module name.
            nonlinear_activation_params (Dict[str, Any]): Hyperparameters for activation
                function.

           r   zKernel size must be odd number.)dilationr   paddingN )super__init__r   torchnn
ModuleListconvs1convs2
SequentialgetattrConv1d)	selfr   r   r   r   r   r   r   r   	__class__r   Z/home/ubuntu/.local/lib/python3.10/site-packages/espnet2/gan_tts/hifigan/residual_block.pyr      sT   

zResidualBlock.__init__xreturnc                 C   sB   t t| jD ]}| j| |}| jr| j| |}|| }q|S )zCalculate forward propagation.

        Args:
            x (Tensor): Input tensor (B, channels, T).

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

        )rangelenr   r   r   )r    r$   idxxtr   r   r#   forwardR   s   

zResidualBlock.forward)__name__
__module____qualname____doc__intr   boolstrr   r   r   r   Tensorr*   __classcell__r   r   r!   r#   r      s2    
@r   )	r.   typingr   r   r   r   r   Moduler   r   r   r   r#   <module>   s   