o
    wi#3                     @   s   d dl Zd dlZd dlZd dlmZ dgZej	 re
d dd Zdd Zd	d
 ZG dd dZedkr>eeg dS dS )    N)CTCLosscpucudac           
      C   s  t |s
t |}d|v r| }|jsd|_|jd g|jd  }dd |D }t |}t |}t |}t jj	|
ddd}d|v rU| }| }| }| ||||}t |}|  d|v rnt j  |jd ur||jj  }	nd }	|j  |	fS )Nr   T   r   c                 S   s   g | ]}t |qS  )len).0lr   r   ^/home/ubuntu/sommelier/.venv/lib/python3.10/site-packages/tests/collections/asr/k2/test_ctc.py
<listcomp>%   s    z!wrap_and_call.<locals>.<listcomp>)torch	is_tensorFloatTensorr   requires_gradshape
LongTensornn
functionallog_softmax	transposesumbackwardsynchronizegraddatar   numpy)
fnactslabelsdevicelengthslabel_lengths	log_probscostscostr   r   r   r
   wrap_and_call   s2   







r&   c                     s&   ddl m} |di |   fddS )Nr   )CtcLossc                    s    |  dd|||d S )Nr   r   )r   )r#   r   r!   r"   ctcr   r
   <lambda>B   s
    zinit_k2_ctc.<locals>.<lambda>r   )%nemo.collections.asr.parts.k2.ml_lossr'   )kwargsr'   r   r(   r
   init_k2_ctc>   s   r-   c                 C   sN   | dkr	|\}}n| dkr|\}}nt d|  |s%td|  d S d S )Nr   r   zUnknown device: zk2 test is skipped. Reason : )
ValueErrorpytestskip)r    k2_is_appropriatek2_cuda_is_enabled	supportedmsgr   r   r
   skip_test_if_unsupportedG   s   

r5   c                   @   s   e Zd Zejjejdedd Zejjejdedd Z	ejjejdedd Z
ejjejdedd	 Zejjejded
d ZdS )TestCTCLossK2r    c              	   C   s   t ||| tg dg dg dg dg dg dgg}g dg}t|jd dd	d
}t||||\}}d}	tg dg dg dg dg dg dgg}
tj||	dds\J dtj||
ddshJ dd S )N)皙?333333?r7   r7   r7   )r7   r7   r8   r7   r7   )r7   r7   皙?g?r7   )r7   r7   r9   r7   r7   )gffffff?r7   r9   r7   r7   )r         r   r   r   num_classesblank	reductiong+]@)guY?g,~ߞʋ?r@   r@   )g昿gſgCbĿ珩?rA   )gYggݑ?gҿgB6g?g/?)gAgg3?gTgƿgݺĿg$|U?)gF&50O&E?gGƣЭ?g^@ֿrB   )g9k̿j<T?gMx?gUߖNQӿrC   ư>rtolzsmall_test costs mismatch.atolzsmall_test gradient mismatch.r5   nparrayr-   r   r&   allcloseselfr    r1   r2   r   r   fn_k2k2_costk2_gradsexpected_costexpected_gradsr   r   r
   test_case_smallS   s6   
zTestCTCLossK2.test_case_smallc                 C   s  t ||| tg dg dg dg dg dg dg dg dg d	g d
g dg dg dg dg dg dg dg dg dg dgg}g dg}t|jd |jd d dd}t||||\}}d}	tg dg dg dg dg dg d g d!g d"g d#g d$g d%g d&g d'g d(g d)g d*g d+g d,g d-g d.gg}
tj||	d/d0sJ d1tj||
d/d2sJ d3d S )4N)              ?      @)rU          @rW   )rV   rV   rW   )rX   rW   rX   )rU   rU   rV   )rU   rV   rV   )rV   rU   rV   )rX   rX   rU   )rU   rX         @)rU   rW   rY   )rV   rX   rY   )rX         @rZ   )rU   rW   rZ   )rU   rZ   rZ   )rV   rW   rZ   )rX   rY   rW   )rX   rX   rV   )rX   rW   rV   )rW   rX   rV   )rZ   rZ   rU   )r   r   r   r   r   r   r   r   r   r<   gG:#/K@)gyg;?gOT6)gWp5ҶgAmmDd?gQ')g-3ɿg>%K?g;Xv?)g<|_};Ϳg8Z?g"%?)gN-^qg.,gھ?)gV-g57Ϧ]+?gH1?)g8?g%q?g)g1#ۿgs?gxrZ?)grx?kg㑦?g`dݤ)g߁	W<gP~?gOYA)gzg2y?gߔ]{)gC\mѿg$\?g}*Ŀ)gyf꡿g7kH?gcÿ)g/ (uѝgx
?g1fd%ѿ)g4gxg#+9?)g1/ڀgi᧚?g2t)gu@?g;؋6ɿg?)g*'gwD?g*E?)gtyg<y?gcR1?)g\߿gDè?gKIvrD   rE   z%small_test_blank_last costs mismatch.rG   z(small_test_blank_last gradient mismatch.rI   rM   r   r   r
   test_case_small_blank_lastz   sn   
z(TestCTCLossK2.test_case_small_blank_lastc                 C   s   t ||| tjd}|ddd}ddgg}t|jd ddd}t||||\}}	tdd	d
}
t|
|||\}}tj	||ddsFJ dtj	|	|ddsRJ dd S )Nr   r      r;   r:   r   r   r<   Tr?   zero_infinityrD   rE   z!small_random_test costs mismatch.rG   z$small_random_test gradient mismatch.
r5   rJ   randomRandomStaterandnr-   r   r&   CTCLoss_PytorchrL   )rN   r    r1   r2   rngr   r   rO   rP   rQ   fn_ptpt_costpt_gradsr   r   r
   test_case_small_random   s   
z$TestCTCLossK2.test_case_small_randomc                 C   s  t ||| g dg dg dg dg dg dg dg dg d	g d
g dg dgg dg dg dg dg dg dg dg dg dg dg dg dgg}ddg}g dg dg dg dg dg d g d!g d"g d#g d$g d%g d&gg d'g d(g d)g d*g d+g d,g d-g d.g d/g d0g d1g d2gg}t|}t|}g d3g d4g}t|jd5 d6d7d8}t||||\}	}
t|	|sJ d9tj|
|d:d;sJ d<d S )=N)g :?g!!ir3?g֮2?)g4{n?g`8?g82b!?)g(+0?g+"?g.4?)giڈd?ghu?gLچ?)g'F?gg7?gUa&M?)gL?ga&Q?gNxE\?)gxbu?gTw?gL?)gxU?gSY?gÏ?)gR[v&?g|0?gHyÚ?)gL'r[?gϦqܟ?g<.qy?)g	))?g0?v?g #}g?)g8	?gb޹?g#,?)gZ%n-?g9 ~j?gGB}?)g!?g%f}X?g`2!<?)g2W Z?g֮?ga?)gMH?gn9?g?)gp>*H?g`Gή?g8i?)gq%3?gIś4?g@ t ?)g+?gu\l?gs'Ә?)gsA9?gS$r?g|?)gQ?gfmK?gO<?)g^ ?g
|KO?gޗ?)gH?gIr~<O?gzIc?)g녷%?g@<VA"?gO?goa@gG3@)g^c?g?/ZӿgߤHBK?)g
h?gvAg}?wz)g{g<W?ge~=xPƿ)gC~7ɿg']?g)USƿ)gOM΋gĻua?gph$Kѿ)g7οgTtfF?g/O|i)g`&gu?gͿ)g[A*ѿg?g||.Ŀ)ghٻĿgHڂ?g5󣼿)gKg9
3?g824ҿ)gDr*rοgk;?g^d1)g?gxk?gcYܿ)gb^¿gXF4Kѿg"m%Y?)g-[o(Bga?ǿgQk?)gοgNJgN*u$?)g(gIƿg=?R?)g#(gGE)g,\}?)g1]{UgArG?gj[)gۙ2GgZ)<?goaĿ)g_tg{
?g?=&п)gXA-ɿg̣4?gt@3)g֗?g%K?g 57FĿ)glҊN?gp 1ſg9^&/G?)gWz?ghN$xӿg>?)r   r:   r:   r:   r:   )r   r   r:   r:   r   r   r   noner<   z big_test average costs mismatch.MbP?rE   z)big_test grads for average cost mismatch.rI   )rN   r    r1   r2   r   expected_costsrS   r   rO   k2_costsrQ   r   r   r
   test_case_big_tensor   s~   

z"TestCTCLossK2.test_case_big_tensorc                 C   s   t ||| tjd}|ddd}g dg dg dg dg}t|jd	 dd
d}t||||\}}	td
dd}
t|
|||\}}tj	||dddsPJ dtj	|	|ddds]J dd S )Nr   r\   P      )r   r:   r\   r;   r:   r:   r   r   r   r   r   r   r:   r   r:   r;   r;   r   r   r   )r;   r:   r:   r;   r\   r   r   r   r   r   r\   r\   r   r:   r   r;   r\   r;   r   r:   )r\   r\   r   r:   r   r;   r\   r;   r   r:   r;   r:   r:   r;   r\   r   r   r   r   r   )r   r   r:   r   r:   r;   r;   r   r   r   r   r:   r\   r;   r:   r:   r   r   r   r   r   r   r<   Tr]   gh㈵>rj   )rH   rF   z!large_random_test costs mismatch.z$large_random_test gradient mismatch.r_   )rN   r    r1   r2   rd   r   r   rO   rl   rQ   re   pt_costsrg   r   r   r
   test_case_large_random  s   z$TestCTCLossK2.test_case_large_randomN)__name__
__module____qualname__r/   markunitparametrizeDEVICESrT   r[   rh   rm   rq   r   r   r   r
   r6   R   s     %AMr6   __main__)r   rJ   r/   r   torch.nnr   rc   rx   r   is_availableappendr&   r-   r5   r6   rr   main__file__r   r   r   r
   <module>   s   

$	 e