o
    i                     @   sl   d dl mZmZm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mZ G dd de
ZdS )	    )OptionalSequenceTupleN)check_argument_types)
AbsEncoder)make_pad_mask)RNNRNNPc                       s   e Zd ZdZ								dded	ed
ededededededee	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jf fddZ  ZS )
RNNEncodera  RNNEncoder class.

    Args:
        input_size: The number of expected features in the input
        output_size: The number of output features
        hidden_size: The number of hidden features
        bidirectional: If ``True`` becomes a bidirectional LSTM
        use_projection: Use projection layer or not
        num_layers: Number of recurrent layers
        dropout: dropout probability

    lstmT   @             r      r   
input_sizernn_typebidirectionaluse_projection
num_layershidden_sizeoutput_sizedropout	subsamplec
           
         s   t  sJ t   || _|| _|| _|| _|dvr!td| |	d u r0tj	|d tj
d}	n|	d | }	tjtj|	tj
dd|t|	 gddd}	|rOdnd| }|rhtjt|||||	||d	g| _d S tjt||||||d	g| _d S )
N>   grur   zNot supported rnn_type=r   )dtypeconstant)modeconstant_valuesb )typ)r   super__init___output_sizer   r   r   
ValueErrornponesint64padarraylentorchnn
ModuleListr	   encr   )
selfr   r   r   r   r   r   r   r   r   	__class__ S/home/ubuntu/.local/lib/python3.10/site-packages/espnet2/asr/encoder/rnn_encoder.pyr$      sT   



zRNNEncoder.__init__returnc                 C   s   | j S N)r%   )r1   r4   r4   r5   r   Z   s   zRNNEncoder.output_sizeNxs_padilensprev_statesc                 C   s   |d u rd gt | j }t |t | jksJ g }t| j|D ]\}}||||d\}}}|| q| jrA|t||dd n
|t||dd}|||fS )N)
prev_stater   r   )r,   r0   zipappendr   masked_fill_r   masked_fill)r1   r8   r9   r:   current_statesmoduler;   statesr4   r4   r5   forward]   s   
zRNNEncoder.forward)r   TTr   r   r   r   r   r7   )__name__
__module____qualname____doc__intstrboolfloatr   r   r$   r   r-   Tensorr   rC   __classcell__r4   r4   r2   r5   r
      sP    	

@r
   )typingr   r   r   numpyr'   r-   	typeguardr   espnet2.asr.encoder.abs_encoderr   &espnet.nets.pytorch_backend.nets_utilsr   (espnet.nets.pytorch_backend.rnn.encodersr   r	   r
   r4   r4   r4   r5   <module>   s    