o
    
j                     @   sX   d dl mZ G dd dejZG dd dejZG dd dejZG dd	 d	ejZd
S )    )nnc                       (   e Zd ZdZ fddZdd Z  ZS )ZeroTemporalPadz7Pad sequences to equal lentgh in the temporal dimensionc                    s>   t    ||d  }|d }|| }tdd||f| _d S )N      r   )super__init__r   	ZeroPad2d	pad_layer)selfkernel_sizedilation	total_padbeginend	__class__ U/home/kuhnn/.local/lib/python3.10/site-packages/TTS/tts/layers/generic/res_conv_bn.pyr      s
   
zZeroTemporalPad.__init__c                 C   
   |  |S N)r
   r   xr   r   r   forward   s   
zZeroTemporalPad.forward__name__
__module____qualname____doc__r   r   __classcell__r   r   r   r   r      s    r   c                       r   )Conv1dBNa  1d convolutional with batch norm.
    conv1d -> relu -> BN blocks.

    Note:
        Batch normalization is applied after ReLU regarding the original implementation.

    Args:
        in_channels (int): number of input channels.
        out_channels (int): number of output channels.
        kernel_size (int): kernel size for convolutional filters.
        dilation (int): dilation for convolution layers.
    c                    s^   t    ||d  }|d }|| }tj||||d| _t||ddf| _t|| _d S )Nr   r   )r   r   )	r   r   r   Conv1dconv1dr	   padBatchNorm1dnorm)r   in_channelsout_channelsr   r   paddingpad_spad_er   r   r   r       s   
zConv1dBN.__init__c                 C   s.   |  |}| |}tj|}| |}|S r   )r"   r#   r   
functionalrelur%   )r   r   or   r   r   r   )   s
   


zConv1dBN.forwardr   r   r   r   r   r       s    	r    c                       s*   e Zd ZdZd fdd	Zdd Z  ZS )Conv1dBNBlocka  1d convolutional block with batch norm. It is a set of conv1d -> relu -> BN blocks.

    Args:
        in_channels (int): number of input channels.
        out_channels (int): number of output channels.
        hidden_channels (int): number of inner convolution channels.
        kernel_size (int): kernel size for convolutional filters.
        dilation (int): dilation for convolution layers.
        num_conv_blocks (int, optional): number of convolutional blocks. Defaults to 2.
    r   c           	         sf   t    g | _t|D ]}t|dkr|n|||d kr|n|||}| j| qtj| j | _d S Nr   r   )r   r   conv_bn_blocksranger    appendr   
Sequential)	r   r&   r'   hidden_channelsr   r   num_conv_blocksidxlayerr   r   r   r   =   s   
zConv1dBNBlock.__init__c                 C   r   )z2
        Shapes:
            x: (B, D, T)
        )r0   r   r   r   r   r   J   s   
zConv1dBNBlock.forward)r   r   r   r   r   r   r.   1   s    r.   c                       s.   e Zd ZdZ	d	 fdd	Zd
ddZ  ZS )ResidualConv1dBNBlocka_  Residual Convolutional Blocks with BN
    Each block has 'num_conv_block' conv layers and 'num_res_blocks' such blocks are connected
    with residual connections.

    conv_block = (conv1d -> relu -> bn) x 'num_conv_blocks'
    residuak_conv_block =  (x -> conv_block ->  + ->) x 'num_res_blocks'
                            ' - - - - - - - - - ^
    Args:
        in_channels (int): number of input channels.
        out_channels (int): number of output channels.
        hidden_channels (int): number of inner convolution channels.
        kernel_size (int): kernel size for convolutional filters.
        dilations (list): dilations for each convolution layer.
        num_res_blocks (int, optional): number of residual blocks. Defaults to 13.
        num_conv_blocks (int, optional): number of convolutional blocks in each residual block. Defaults to 2.
       r   c                    sx   t    t||ksJ t | _t|D ]#\}}	t|dkr!|n||d t|kr,|n||||	|}
| j|
 qd S r/   )	r   r   lenr   
ModuleList
res_blocks	enumerater.   r2   )r   r&   r'   r4   r   	dilationsnum_res_blocksr5   r6   r   blockr   r   r   r   d   s   

zResidualConv1dBNBlock.__init__Nc                 C   sH   |d u rd}|| }| j D ]}|}||}|| }|d ur!|| }q|S )Ng      ?)r<   )r   r   x_maskr-   r@   resr   r   r   r   u   s   
zResidualConv1dBNBlock.forward)r9   r   r   r   r   r   r   r   r8   R   s
    r8   N)torchr   Moduler   r    r.   r8   r   r   r   r   <module>   s
    !