o
    }oi@%                     @   s   d dl Z d dl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
mZ d dlmZmZ edgZej r>ed ejd	d
dd Zejd	d
dd ZG dd dZdS )    N)Path)pad_sequence)tqdm)KenLMBatchedWrapperNGramGPULanguageModel)KENLM_AVAILABLETRITON_AVAILABLEcpucudamodule)scopec                 C   s    t | d }d}tj||ddS )NBasr/kenlm_ngram_lm/parakeet-tdt_ctc-110m-libri-1024.kenlm.tmp.arpa   F
vocab_sizenormalize_unkr   r   	from_arpatest_data_dirkenlm_model_pathr    r   W/home/ubuntu/.local/lib/python3.10/site-packages/tests/collections/asr/test_ngram_lm.pyn_gpu_lm    s   r   c                 C   s   t | d }d}tj||dS )Nr   r   )lm_pathr   )r   r   	from_filer   r   r   r   kenlm_wrapper'   s   r   c                   @   s  e Zd Zejjejjdd Zejjejjejje	 ddej
deej
dddgej
d	d
dgdeded	ededejf
ddZejjejjejje ddejjej  ddd defddZejjejje	 ddej
deej
d	d
dgdeded	edejfddZejjejje	 ddej
deej
d	d
dgej
dd
dgdeded	ededejf
ddZejjdd Zejjdd ZdS )!TestNGramGPULanguageModelc                 C   s   t |d }tj|dd}d S )Nr   r   r   r   )selfr   r   _r   r   r   	test_load/   s   z#TestNGramGPULanguageModel.test_loadzKenLM is not available)reasondevice
batch_size      bosTFr   r   c                 C   s\   | |}|j||d}|j||d}||\}}	||\}
}	t||
 |s,J d S )Nr$   r'   )toget_init_statesadvancetorchallclose)r   r   r   r'   r$   r#   init_statesinit_states_kenlm	scores_lmr    
scores_refr   r   r   test_initial_states5   s   
z-TestNGramGPULanguageModel.test_initial_stateszTriton is not availablezCUDA is not available   d   c              	   C   s   t d t d}||}tt|D ]Q}td|jd }t 	 * |j
t j|g||t jdd\}}|jt j|g||t jdd\}	}
W d   n1 sQw   Y  ||
k s^J t ||	sfJ qdS )z`Randomly initializes the states and compares the scores from Triton and PyTorch implementations.i	  r
   r   r%   )
fill_valuer#   dtypestatesN)r,   manual_seedr#   r)   r   rangerandomrandint
num_statesno_grad_advance_pytorchfullint64_advance_tritonallr-   )r   r   r$   num_iterationsr#   r    start_statescores1states1scores2states2r   r   r   $test_triton_vs_pytorch_random_statesJ   s    




z>TestNGramGPULanguageModel.test_triton_vs_pytorch_random_statesc                 C   s   | |}g dg dg g}g }|D ]}|j|d}|D ]}	|j||	d\}
}q|| q|j|dj |d}g }|D ]$}|jd|d}|D ]}	|j|d\}
}|d	|	f d	}qG|| q<|jtj	|d	d
d}t
||svJ ddS )zTest final (eos) scores   F      :   )      i%  i2       i  i  i  rS   )r'   )statelabelr7   )r#   r%   r(   r   )dimzFinal scores do not matchN)r)   get_init_stateadvance_singleappend	get_finalr*   r+   	unsqueezer,   catr-   )r   r   r   r'   r#   	sentenceslast_statessentencerU   rV   r    	final_refr8   final_lmr   r   r   
test_final_   s*   
z$TestNGramGPULanguageModel.test_finaleosc           
      C   s   | |}g dg dg g}|D ]&}|j|g||d |}|t|g |||d}	t||	s6J dq|j|||d |}|tdd |D dd	 |td
d |D  |||d}	t|	|skJ dd S )NrK   rO   )r'   rd   )labelsr'   rd   zNon-batched scores do not matchc                 S   s   g | ]}t |qS r   )r,   
LongTensor.0r`   r   r   r   
<listcomp>   s    z<TestNGramGPULanguageModel.test_sentences.<locals>.<listcomp>T)batch_firstc                 S   s   g | ]}t |qS r   )lenrg   r   r   r   ri      s    )re   labels_lengthsr'   rd   zBatched scores do not match)r)   score_sentencesr,   rf   r-   r   )
r   r   r   r'   rd   r#   r^   r`   r1   r0   r   r   r   test_sentences   s*   
z(TestNGramGPULanguageModel.test_sentencesc                 C   s   d}t |d }tj||dd}|d }||  tj| |d}t|j|js,J |j|jk	 s6J |j
|j
k	 s@J |j|jk	 sJJ |j|jk	 sTJ |j|jk	 s^J |j|jk	 shJ t|j|jsrJ t|j|js|J d S Nr   r   Fr   zngram_lm.nemor   )r   r   r   save_to	from_nemor,   r-   arcs_weightsfrom_statesrC   	to_statesilabelsstart_end_arcsstate_orderbackoff_to_statesbackoff_weightsfinal_weightsr   tmp_pathr   r   r   r   	nemo_pathn_gpu_lm_loadedr   r   r   test_save_load_nemo      z-TestNGramGPULanguageModel.test_save_load_nemoc                 C   s   d}t |d }tj||dd}|d }||  tj| |d}t|j|js,J |j|jk s6J |j	|j	k s@J |j
|j
k sJJ |j|jk sTJ |j|jk s^J |j|jk shJ t|j|jsrJ t|j|js|J d S ro   )r   r   r   rp   r,   r-   rr   rs   rC   rt   ru   rv   rw   rx   ry   rz   r{   r   r   r   test_save_load_from_file   r   z2TestNGramGPULanguageModel.test_save_load_from_fileN)r3   r4   )__name__
__module____qualname__pytestmarkwith_downloadsunitr!   skipifr   parametrizeDEVICESr   r   boolintr,   r#   r2   r   r
   is_availablerJ   rc   rn   r   r   r   r   r   r   r   .   sv    "
r   )r;   pathlibr   r   r,   torch.nn.utils.rnnr   	tqdm.autor   .nemo.collections.asr.parts.submodules.ngram_lmr   r   nemo.core.utils.optional_libsr   r   r#   r   r
   r   rZ   fixturer   r   r   r   r   r   r   <module>   s    





