o
    i                     @   sb   d Z ddlmZmZmZ ddlmZ ddlZG dd dejj	Z
ddd	ZG d
d dejjZdS )z!Repeat the same layer definition.    )DictListOptional)	LayerNormNc                       s.   e Zd ZdZdd fdd
Zdd Z  ZS )MultiSequentialz-Multi-input multi-output torch.nn.Sequential.        )layer_drop_ratec                   s   t t| j|  || _dS )zInitialize MultiSequential with layer_drop.

        Args:
            layer_drop_rate (float): Probability of dropping out each fn (layer).

        N)superr   __init__r   )selfr   args	__class__ Z/home/ubuntu/.local/lib/python3.10/site-packages/funasr/models/transformer/utils/repeat.pyr
      s   
zMultiSequential.__init__c                 G   sD   t t|  }t| D ]\}}| jr|| | jkr|| }q|S )zRepeat.)torchemptylenuniform_	enumeratetrainingr   )r   r   _probsidxmr   r   r   forward   s   zMultiSequential.forward)__name__
__module____qualname____doc__r
   r   __classcell__r   r   r   r   r      s    
r   r   c                    s    t  fddt| D d|iS )a  Repeat module N times.

    Args:
        N (int): Number of repeat time.
        fn (Callable): Function to generate module.
        layer_drop_rate (float): Probability of dropping out each fn (layer).

    Returns:
        MultiSequential: Repeated model instance.

    c                    s   g | ]} |qS r   r   ).0nfnr   r   
<listcomp>0   s    zrepeat.<locals>.<listcomp>r   )r   range)Nr#   r   r   r"   r   repeat$   s    r'   c                       s   e Zd ZdZefdeejj de	dejj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	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.
    
block_listoutput_size
norm_classreturnNc                    s0   t    tj|| _||| _t|| _dS )zConstruct a MultiBlocks object.N)	r	   r
   r   nn
ModuleListblocksnorm_blocksr   
num_blocks)r   r)   r*   r+   r   r   r   r
   <   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)r%   r1   r/   reset_streaming_cache)r   r2   r3   r   r   r   r   r4   J   s   z!MultiBlocks.reset_streaming_cachexpos_encmask
chunk_maskc                 C   s8   t | jD ]\}}|||||d\}}}q| |}|S )aR  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)
        )r8   )r   r/   r0   )r   r5   r6   r7   r8   block_indexblockr   r   r   r   S   s   
zMultiBlocks.forwardr   
chunk_size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;   r2   r<   )r   r/   chunk_forwardr0   )	r   r5   r6   r7   r;   r2   r<   	block_idxr:   r   r   r   r=   j   s   
	zMultiBlocks.chunk_forward)N)r   r   r   )r   r   r   r   r   r   r   r-   Moduleintr
   r3   r4   Tensorr   r   r=   r   r   r   r   r   r(   3   sV    

r(   )r   )r   typingr   r   r   $funasr.models.transformer.layer_normr   r   r-   
Sequentialr   r'   r?   r(   r   r   r   r   <module>   s   
