o
    i                  
   @   s   d Z ddlmZmZmZmZ ddlmZ deeef de	de	dee	e	f fdd	Z
deeef d
eeef de	de	fddZdeeef deeeef  de	dee	e	f fddZdS )z0Set of methods to validate encoder architecture.    )AnyDictListTuple)sub_factor_to_paramsconfigurationblock_idprevious_block_outputreturnc                 C   s   |  d}|du rtd| |dv r;|  ddu r td| |  ddu r-td| |  d	}|  d	}||fS |d
kre|  d}|du rNtd| |  ddu r[td| | }| d< ||fS td| )a  Validate block arguments.

    Args:
        configuration: Architecture configuration.
        block_id: Block ID.
        previous_block_output: Previous block output size.

    Returns:
        input_size: Block input size.
        output_size: Block output size.

    
block_typeNz2Block %d in encoder doesn't have a type assigned. )branchformer	conformerlinear_sizez:Missing 'linear_size' argument for X-former block (ID: %d)conv_mod_kernel_sizezCMissing 'conv_mod_kernel_size' argument for X-former block (ID: %d)hidden_sizeconv1doutput_sizez8Missing 'output_size' argument for Conv1d block (ID: %d)kernel_sizez8Missing 'kernel_size' argument for Conv1d block (ID: %d)
input_sizez Block type: %s is not supported.)get
ValueError)r   r   r	   r   r   r    r   ]/home/ubuntu/.local/lib/python3.10/site-packages/espnet2/asr_transducer/encoder/validation.pyvalidate_block_arguments   s@   



r   body_first_confr   c                 C   s4  |  dd}| d}g d}|du s||vrdS |  ddu r$d| d< |r6|  d	d
}t|tr5||f}n|  d	d}t|trE|d }|dkr|rV|d |d d  }n&|du r`| dd}| d }t||\}	}	}
|
dksxJ d||f |
| }d| d< n| d}|du r|}|| d< || d	< || d< |S )a  Validate input block.

    Args:
        configuration: Encoder input block configuration.
        body_first_conf: Encoder first body block configuration.
        input_size: Encoder input block input size.

    Return:
        output_size: Encoder input block output size.

    vgg_likeFr   )r   r   r   Nsubsampling_factor   	conv_size)@      r   r         r   r    z>Conv2D output size is <1 with input size %d and subsampling %dr   )r   
isinstanceinttupler   )r   r   r   r   next_block_typeallowed_next_block_typer   r   
sub_factor_
conv_osizer   r   r   validate_input_blockC   sJ   





r,   
input_conf	body_confc                 C   s   t | |d |}g }t|D ]\}}t||d |dkr|n||d  d }|| qtdt|D ]}||d  d || d krMtd|d |f q3||d d fS )aC  Validate specified architecture is valid.

    Args:
        input_conf: Encoder input block configuration.
        body_conf: Encoder body blocks configuration.
        input_size: Encoder input size.

    Returns:
        input_block_osize: Encoder input block output size.
        : Encoder body block output size.

    r   r"   zCOutput/Input mismatch between blocks %d and %d in the encoder body.r   )r,   	enumerater   appendrangelenr   )r-   r.   r   input_block_osizecmp_ioib_ior   r   r   validate_architecture   s    "
r8   N)__doc__typingr   r   r   r   espnet2.asr_transducer.utilsr   strr%   r   r,   r8   r   r   r   r   <module>   s<    


;


E

