o
    i/                     @   s~   d Z ddlZddlZ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lmZ ddlmZmZ G d	d
 d
ejZdS )z+Class Declaration of Transformer's Encoder.    N)links)PositionalEncoding)EncoderLayer)	LayerNorm)make_history_mask)Conv2dSubsamplingLinearSamplingc                       s@   e Zd ZdZdddddddded	d	f fd
d	Zdd Z  ZS )Encodera  Encoder.

    Args:
        input_type(str):
            Sampling type. `input_type` must be `conv2d` or 'linear' currently.
        idim (int): Dimension of inputs.
        n_layers (int): Number of encoder layers.
        n_units (int): Number of input/output dimension of a FeedForward layer.
        d_units (int): Number of units of hidden layer in a FeedForward layer.
        h (int): Number of attention heads.
        dropout (float): Dropout rate

          i      g?g        conv2dNc              	      sZ  t t|   |du rtjjn|}|du rtjjn|}d| _|  a d| _d}|	dkrKt	t
t
|d d | }t||||||d| _d| _n,|	d	krYt||||d
| _n|	dkrqttj||dd|
||| _d| _ntd|	 t|| _W d   n1 sw   Y  t|D ]}dt| }t||||||d}| || q|| _dS )a   Initialize Encoder.

        Args:
            idim (int): Input dimension.
            args (Namespace): Training config.
            initialW (int, optional):  Initializer to initialize the weight.
            initial_bias (bool, optional): Initializer to initialize the bias.

        NF   @   r      )dropoutinitialWinitial_biasr   linear)r   r   embed)ignore_labelTzunknown input_layer: 	encoders.)d_unitshr   r   r   )superr	   __init__chainerinitializersUniformdo_history_mask
init_scopeconv_subsampling_factorintnpceilr   input_layerr   
SequentialLEmbedID
ValueErrorr   normrangestrr   add_linkn_layers)selfidimattention_dimattention_headslinear_units
num_blocksdropout_ratepositional_dropout_rateattention_dropout_rater&   pos_enc_classr   r   channelsinamelayer	__class__ c/home/ubuntu/.local/lib/python3.10/site-packages/espnet/nets/chainer_backend/transformer/encoder.pyr   #   sX   
 

zEncoder.__init__c                 C   s   t | jtr| ||\}}n| |}|j\}}}t||g}t|D ]}d|||| df< q%|dddddf dk|dddddf dk }| j|}| j	r_t
| j|}	||	9 }tdt|j  |d|}t| jD ]}
| dt|
  |||}qt| |||d||fS )a{  Compute Encoder layer.

        Args:
            e (chainer.Variable): Batch of padded character. (B, Tmax)
            ilens (chainer.Variable): Batch of length of each input batch. (B,)

        Returns:
            chainer.Variable: Computed variable of encoder.
            numpy.array: Mask.
            chainer.Variable: Batch of lengths of each encoder outputs.

        r   Nr   zencoders size: r   )
isinstancer&   r   shaper$   onesr,   xparrayr    r   loggingdebugr-   reshaper/   r+   )r0   eilensbatchlengthdimsx_maskjxx_maskhistory_maskr;   r@   r@   rA   forwardi   s"   
4zEncoder.forward)__name__
__module____qualname____doc__r   r   rS   __classcell__r@   r@   r>   rA   r	      s    Fr	   )rW   rG   r   numpyr$   r   r(   1espnet.nets.chainer_backend.transformer.embeddingr   5espnet.nets.chainer_backend.transformer.encoder_layerr   2espnet.nets.chainer_backend.transformer.layer_normr   ,espnet.nets.chainer_backend.transformer.maskr   3espnet.nets.chainer_backend.transformer.subsamplingr   r   Chainr	   r@   r@   r@   rA   <module>   s   