o
    ¡¿¯iÆ  ã                   @   s¬   d Z ddlmZm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 dd
lmZ ddlmZmZ ddlmZ ddlmZ G dd„ deƒZdS )zEncoder definition.é    )ÚOptionalÚTupleN)Úcheck_argument_types)ÚAbsPostEncoder)Úmake_pad_mask)ÚMultiHeadedAttention)ÚPositionalEncoding)ÚEncoderLayer)Ú	LayerNorm)ÚConv1dLinearÚMultiLayeredConv1d)ÚPositionwiseFeedForward)Úrepeatc                       sÂ   e Zd ZdZdddddddded	d
dddfdededededededededee de	de	dededef‡ fdd„Z
defdd„Z	 d&d!ejd"ejd#ejdeejejeej f fd$d%„Z‡  ZS )'ÚTransformerPostEncoderac  Transformer encoder module.

    Args:
        input_size: input dim
        output_size: dimension of attention
        attention_heads: the number of heads of multi head attention
        linear_units: the number of units of position-wise feed forward
        num_blocks: the number of decoder blocks
        dropout_rate: dropout rate
        attention_dropout_rate: dropout rate in attention
        positional_dropout_rate: dropout rate after adding positional encoding
        input_layer: input layer type
        pos_enc_class: PositionalEncoding or ScaledPositionalEncoding
        normalize_before: whether to use layer_norm before the first block
        concat_after: whether to concat attention layer's input and output
            if True, additional linear will be applied.
            i.e. x -> x + linear(concat(x, att(x)))
            if False, no additional linear will be applied.
            i.e. x -> x + att(x)
        positionwise_layer_type: linear of conv1d
        positionwise_conv_kernel_size: kernel size of positionwise conv1d layer
        padding_idx: padding_idx for input_layer=embed
    é   é   i   é   gš™™™™™¹?g        ÚlinearTFé   éÿÿÿÿÚ
input_sizeÚoutput_sizeÚattention_headsÚlinear_unitsÚ
num_blocksÚdropout_rateÚpositional_dropout_rateÚattention_dropout_rateÚinput_layerÚnormalize_beforeÚconcat_afterÚpositionwise_layer_typeÚpositionwise_conv_kernel_sizeÚpadding_idxc              
      s*  t ƒ sJ ‚tƒ  ¡  ˆ| _|	dkr0tj tj |ˆ¡tj ˆ¡tj 	ˆ¡tj 
¡ |
ˆ|ƒ¡| _n|	dkrEtj tj |ˆ¡|
ˆ|ƒ¡| _ntd|	 ƒ‚ˆ| _|dkrZt‰ˆ|ˆf‰n|dkrgt‰ˆ||ˆf‰n|dkrtt‰ˆ||ˆf‰ntdƒ‚t|‡ ‡‡‡‡‡‡‡fdd„ƒ| _| jr“tˆƒ| _d S d S )	Nr   ÚNonezunknown input_layer: Úconv1dzconv1d-linearzSupport only linear or conv1d.c                    s   t ˆtˆˆˆ ƒˆˆŽ ˆˆˆƒS ©N)r	   r   )Úlnum©r   r   r    r   r   r   Úpositionwise_layerÚpositionwise_layer_args© úc/home/ubuntu/.local/lib/python3.10/site-packages/espnet2/slu/postencoder/transformer_postencoder.pyÚ<lambda>t   s    ÿøz1TransformerPostEncoder.__init__.<locals>.<lambda>)r   ÚsuperÚ__init__Ú_output_sizeÚtorchÚnnÚ
SequentialÚLinearr
   ÚDropoutÚReLUÚembedÚ
ValueErrorr   r   r   r   ÚNotImplementedErrorr   ÚencodersÚ
after_norm)Úselfr   r   r   r   r   r   r   r   r   Úpos_enc_classr   r    r!   r"   r#   ©Ú	__class__r(   r,   r/   3   s\   



ûþýüüþÿzTransformerPostEncoder.__init__Úreturnc                 C   s   | j S r&   )r0   )r<   r+   r+   r,   r   ‚   s   z"TransformerPostEncoder.output_sizeNÚxs_padÚilensÚprev_statesc                 C   sf   t |ƒdd…ddd…f   |j¡}|  |¡}|  ||¡\}}| jr'|  |¡}| d¡ d¡}||fS )zíEmbed positions in tensor.

        Args:
            xs_pad: input tensor (B, L, D)
            ilens: input length (B)
            prev_states: Not to be used now.
        Returns:
            position embedded tensor and mask
        Nr   )	r   ÚtoÚdevicer7   r:   r   r;   ÚsqueezeÚsum)r<   rA   rB   rC   ÚmasksÚolensr+   r+   r,   Úforward…   s   $

zTransformerPostEncoder.forwardr&   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   ÚintÚfloatr   ÚstrÚboolr/   r   r1   ÚTensorr   rJ   Ú__classcell__r+   r+   r>   r,   r      sp    ðþýüûúùø	÷
öôóòñðOüþýüûr   )rN   Útypingr   r   r1   Ú	typeguardr   Ú'espnet2.asr.postencoder.abs_postencoderr   Ú&espnet.nets.pytorch_backend.nets_utilsr   Ú1espnet.nets.pytorch_backend.transformer.attentionr   Ú1espnet.nets.pytorch_backend.transformer.embeddingr   Ú5espnet.nets.pytorch_backend.transformer.encoder_layerr	   Ú2espnet.nets.pytorch_backend.transformer.layer_normr
   Ú8espnet.nets.pytorch_backend.transformer.multi_layer_convr   r   ÚAespnet.nets.pytorch_backend.transformer.positionwise_feed_forwardr   Ú.espnet.nets.pytorch_backend.transformer.repeatr   r   r+   r+   r+   r,   Ú<module>   s   