o
    }oiU#                     @   sD   d dl Zd dlZd dlZd dlmZ G dd dZG dd dZdS )    N)ConformerEncoderc                   @   s(   e Zd ZdZdd Zejjdd ZdS )TestStochasticDepthz'Testing stochastic depth functionality.c              
      s  d}t d|ddd}|jdg| ksJ dD ].dD ])}t d|dd|d}||  |jdg|  fd	d
td d D  ksCJ qqdD ] t d|ddd|d}||  |jdg| g   ksgJ qGdD ]#tjtdd t d|dddd W d   n1 sw   Y  qjtjtdd t d|dddd W d   n1 sw   Y  dD ]"}tjtdd t d|dd|d W d   n1 sw   Y  qdS )zGTesting basic model creation and the drop probs are correctly assigned.   
      )feat_inn_layersd_modelfeat_out        )g333333?g      ?g?)      )r   r   r	   r
   stochastic_depth_drop_probstochastic_depth_start_layerc                    s   g | ]}|   qS  r   ).0lL	drop_probr   `/home/ubuntu/.local/lib/python3.10/site-packages/tests/collections/asr/test_conformer_encoder.py
<listcomp>,   s    zLTestStochasticDepth.test_stochastic_depth_model_creation.<locals>.<listcomp>r   uniform)r   r   r	   r
   r   stochastic_depth_moder   )g      g      ?z'stochastic_depth_drop_prob has to be in)match)r   r   r	   r
   r   r   Nz&stochastic_depth_mode has to be one ofweird)r   r   r	   r
   r   )r      z)stochastic_depth_start_layer has to be in)r   r   r	   r
   r   )r   layer_drop_probsrangepytestraises
ValueError)selfr   modelstart_layerr   r   r   $test_stochastic_depth_model_creation   sn   4	 
z8TestStochasticDepth.test_stochastic_depth_model_creationc                 C   s  t d}t jdgt jd}tddddddddddd	
}|  d
gd }tdD ]}|||dd ||< q)d}tddD ]}t || |d sM|d7 }q=|dksTJ |  d
gd }tdD ]}|||dd ||< qad}tddD ]}t || |d s|d7 }qu|dksJ d
S )zVTesting that forward works and we get randomness during training, but not during eval.)r      r'   r'   dtyper   r   g?r   
layer_norm
r   r   r	   r
   r   dropoutdropout_pre_encoderdropout_embconv_norm_typeconv_kernel_sizeNr   )audio_signallengthr   r   )	torchrandtensorint64r   trainr   allcloseeval)r#   random_inputrandom_lengthr$   outputsinum_diffr   r   r   test_stochastic_depth_forwardU   sD   


z1TestStochasticDepth.test_stochastic_depth_forwardN)	__name__
__module____qualname____doc__r&   r    markpleasefixmer?   r   r   r   r   r      s
    =r   c                   @   s    e Zd ZdZdd Zdd ZdS )TestBypassPreEncodez(Testing bypass pre-encode functionality.c           	      C   s   d}d\}}}t |||f}t j|gt jd}tdd||ddddddd
}|  |||d	d
d }|j|||fks=J |  |||d	d
d }|j|||fksTJ dS )z9Testing that forward works with "bypass pre-encode" mode.r'   )      r   r(   r   r   r   r*   r+   Tr1   r2   bypass_pre_encoder   N)r3   r4   r5   r6   r   r7   shaper9   )	r#   
batch_sizen_framesemb_dimr
   r:   r;   r$   fwd_outputsr   r   r   test_bypass_pre_encode_forward   s,   
z2TestBypassPreEncode.test_bypass_pre_encode_forwardc                 C   s,  d}d\}}}}t |||f}t |||f}t j|gt jd}t|d||ddddddd
}	t||	j }
|	  t	
t |	||dd	 W d
   n1 sRw   Y  |	  t	
t |	||dd	 W d
   n1 srw   Y  |	  |	||dd	d }|j|||fksJ |	  |	||dd	d }|j|||fksJ |	  t	
t |	||dd	 W d
   n1 sw   Y  |	  t	
t |	||dd	 W d
   n1 sw   Y  |	  |	||dd	d }|j|||
fksJ |	  |	||dd	d }|j|||
fksJ d
S )a  
        Testing that error messages are correctly triggered regarding "bypass pre-encode" mode.
        Both correct samples and wrongs samples are tested.

        (1) bypass_pre_encode = False (default):
            `audio_signal` must be a tensor containing audio features.
            Shape: (batch, self._feat_in, n_frames)
        (2) bypass_pre_encode = True:
            `audio_signal` must be a tensor containing pre-encoded embeddings.
            Shape: (batch, n_frame, self.d_model)
        r'   )rG   rH   r   r   r(   r   r   r*   r+   TrI   Nr   F)r3   r4   r5   r6   r   npceilsubsampling_factorr7   r    r!   r"   r9   rK   )r#   rL   rM   rN   r   r
   pre_encode_input
feat_inputinput_lengthr$   sub_sampled_n_framesrO   r   r   r   2test_error_shape_invalid_bypass_pre_encode_forward   s\   zFTestBypassPreEncode.test_error_shape_invalid_bypass_pre_encode_forwardN)r@   rA   rB   rC   rP   rX   r   r   r   r   rF   ~   s    rF   )numpyrQ   r    r3   .nemo.collections.asr.modules.conformer_encoderr   r   rF   r   r   r   r   <module>   s   i