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 )z%MultiBlocks for encoder architecture.    )DictListOptionalNc                       s   e Zd ZdZejjdfdeejj de	dejjde
e ddf
 fdd	Zd
e	dejddfddZ	ddejdejdejde
ej dejf
ddZ		ddejdejdejd
e	de	dejfddZ  ZS )MultiBlockszMultiBlocks definition.

    Args:
        block_list: Individual blocks of the encoder architecture.
        output_size: Architecture output size.
        norm_class: Normalization module class.
        norm_args: Normalization module arguments.

    N
block_listoutput_size
norm_class	norm_argsreturnc                    s8   t    tj|| _||fi || _t|| _dS )zConstruct a MultiBlocks object.N)	super__init__torchnn
ModuleListblocksnorm_blockslen
num_blocks)selfr   r   r   r	   	__class__ g/home/ubuntu/.local/lib/python3.10/site-packages/espnet2/asr_transducer/encoder/modules/multi_blocks.pyr      s   
zMultiBlocks.__init__left_contextdevicec                 C   s&   t | jD ]}| j| || qdS )zInitialize/Reset encoder streaming cache.

        Args:
            left_context: Number of left frames during chunk-by-chunk inference.
            device: Device to use for cache tensor.

        N)ranger   r   reset_streaming_cache)r   r   r   idxr   r   r   r   "   s   z!MultiBlocks.reset_streaming_cachexpos_encmask
chunk_maskc                 C   s8   t | jD ]\}}|||||d\}}}q| |}|S )aU  Forward each block of the encoder architecture.

        Args:
            x: MultiBlocks input sequences. (B, T, D_block_1)
            pos_enc: Positional embedding sequences.
            mask: Source mask. (B, T)
            chunk_mask: Chunk mask. (T_2, T_2)

        Returns:
            x: Output sequences. (B, T, D_block_N)

        )r!   )	enumerater   r   )r   r   r   r    r!   block_indexblockr   r   r   forward-   s   
zMultiBlocks.forwardr   right_contextc                 C   s:   t | jD ]\}}|j|||||d\}}q| |}|S )a  Forward each block of the encoder architecture.

        Args:
            x: MultiBlocks input sequences. (B, T, D_block_1)
            pos_enc: Positional embedding sequences. (B, 2 * (T - 1), D_att)
            mask: Source mask. (B, T_2)
            left_context: Number of frames in left context.
            right_context: Number of frames in right context.

        Returns:
            x: MultiBlocks output sequences. (B, T, D_block_N)

        )r   r&   )r"   r   chunk_forwardr   )r   r   r   r    r   r&   	block_idxr$   r   r   r   r'   G   s   
zMultiBlocks.chunk_forward)N)r   r   )__name__
__module____qualname____doc__r   r   	LayerNormr   Moduleintr   r   r   r   r   Tensorr%   r'   __classcell__r   r   r   r   r      sV    

r   )	r,   typingr   r   r   r   r   r.   r   r   r   r   r   <module>   s    