o
    wi^9                     @   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)RNNTLosscpucudac           	      C   s   t |s
t |}d|v r| }|jsd|_|jd g|jd  }dd |D }t |}t |}t |}d|v rI| }| }| }| ||||}t |}|  d|v rbt j	  |j
d urp|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_rnnt.py
<listcomp>&   s    z!wrap_and_call.<locals>.<listcomp>)torch	is_tensorFloatTensorr   requires_gradshape
LongTensorsumbackwardsynchronizegraddatar   numpy)	fnactslabelsdevicelengthslabel_lengthscostscostr   r   r   r
   wrap_and_call   s0   







r    c                     s&   ddl m} |di |   fddS )Nr   )RnntLossc                    s<    t jj| d|jt jd|jt jd|jt jdd S )N)dtyper   )r   nn
functionallog_softmaxtolong)r   r   r   r   rnntr   r
   <lambda>B   s    zinit_k2_rnnt.<locals>.<lambda>r   )%nemo.collections.asr.parts.k2.ml_lossr!   )kwargsr!   r   r)   r
   init_k2_rnnt>   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_unsupportedJ   s   

r6   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 )TestRNNTLossK2r   c                 C   s   t ||| tg dg dg dgg dg dg dggg}ddgg}t|jd d	d
d}t||||\}}d}	tg dg dg dgg dg dg dggg}
tj||	dds`J dtj||
ddslJ dd S )N)皙?333333?r8   r8   r8   )r8   r8   r9   r8   r8   )r8   r8   皙?g?r8   )r8   r8   r:   r8   r8   )gffffff?r8   r:   r8   r8   r      r"   r   r   num_classesblank	reductiong.ޏ@)gg6fٿ)\?r@   r@   )g^ʎǿ =	;Z?g lAǿrA   rA   )g^HԉԿ0S?gR4?g(?rB   )d`?gd`˿rC   rC   rC   )'a.?rD   g #޿rD   rD   )ge)US?g"?rE   rE   ư>rtolzsmall_test costs mismatch.atolzsmall_test gradient mismatch.r6   nparrayr.   r   r    allcloseselfr   r2   r3   r   r   fn_k2k2_costk2_gradsexpected_costexpected_gradsr   r   r
   test_case_smallV   s2   
zTestRNNTLossK2.test_case_smallc                 C   s  t ||| tg dg dg dg dgg dg dg dg dgg d	g d
g dg dgg dg dg dg dgg dg dg dg dg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g dg d g d!g d"gg d#g d$g d%g d&gg d'g d(g d)g d*gg d+g d,g d-g d.ggg}
tj||	d/d0sJ d1tj||
d/d2sJ d3d S )4N)              ?      @)rW          @rY   )rX   rX   rY   )rZ   rY   rZ   )rW   rW   rX   )rW   rX   rX   )rX   rW   rX   )rZ   rZ   rW   )rW   rZ         @)rW   rY   r[   )rX   rZ   r[   )rZ         @r\   )rW   rY   r\   )rW   r\   r\   )rX   rY   r\   )rZ   r[   rY   )rZ   rZ   rX   )rZ   rY   rX   )rY   rZ   rX   )r\   r\   rW   )r   r   r   r"   r   r   r<   g   `:(@)g   w.g   ;?g    $)g   `gMf?g   @.|?g    )g   V?g   &V?g    
f)g   ,>g    ?>g   "9־)g   ,ȿg   ?g    a)g    J?g   a?g   \)g   ??g   ;i?g   @z)    6A?r]   g   6Q)g   g   羙?g    h)g   T_?g    @?g    1d)g   f?g   ࣡?g    "V)g   @?g    G?g   /J)g   hg   ?g    )g    Zg?g     j{g    8zo?)g   w?g   ?g   md)g   is(?g   ັn?g   xp)g   |ҿg   @ ?g   `?)g    fk?g   s˿g   5?)g   UTտg   /?g    ?)   ੵ?r^   g   ੵrF   rG   z%small_test_blank_last costs mismatch.rI   z(small_test_blank_last gradient mismatch.rK   rO   r   r   r
   test_case_small_blank_last}   sZ   
%z)TestRNNTLossK2.test_case_small_blank_lastc                 C   s   t ||| tjd}|dddd}ddgg}t|jd ddd}t||||\}}	t }
t|
|||\}}tj	||d	d
sDJ dtj	|	|d	dsPJ dd S )Nr   r         r;   r"   r   r<   rF   rG   z!small_random_test costs mismatch.rI   z$small_random_test gradient mismatch.
r6   rL   randomRandomStaterandnr.   r   r    RNNTLoss_NumpyrN   )rP   r   r2   r3   rngr   r   rQ   rR   rS   fn_npnp_costnp_gradsr   r   r
   test_case_small_random   s   
z%TestRNNTLossK2.test_case_small_randomc                 C   s  t ||| g dg dg dgg dg dg dgg dg dg d	gg d
g dg dggg dg dg dgg dg dg dgg dg dg dgg dg dg dggg}ddg}g dg dg dgg dg dg d gg d!g d"g d#gg d$g d%g d&ggg d'g d(g d)gg d*g d+g d,gg d-g d.g d/gg d0g d1g d2ggg}t|}t|}d3d4gd3d3g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?gDvc@gQ?@)gF@ǿgܤg-L?)go ?ʿg6?8?g;P?)g}s¿g[ZoA?gnϠ_c?)gIl tgδg$$(÷?)g]ÿg2^?gkl>)g_0\Ͽgib?gE?)gtg@&g% 0?)g%_)gj#?gVsĿ)gh#`߿gZe_?gt?)gAi!܋?ggfZv?)g1 (*?gm?gJƿ)g6Xg˜Jง?g)?)gf VֿgvfVgi &Y?)g3@ϸg.G*?gh>E?)g Bg/uQ?g,+ \?)gÿgV`g"u@=?)g@ _Yſg~
gr A\?)g_5ƿg`T?g8?)g?r?g#H^Fga_Y)?)gaκg~2@!㻿g=,X?)gK.@׿gQO ?g`H?)gȋT?g" Wgh?݄?)gJAP?gzοgqZн?)g7q(gwKW?gM@?r   r;   r"   r   noner<   z big_test average costs mismatch.MbP?rG   z)big_test grads for average cost mismatch.rK   )rP   r   r2   r3   r   expected_costsrU   r   rQ   k2_costsrS   r   r   r
   test_case_big_tensor   s   /
/
z#TestRNNTLossK2.test_case_big_tensorc                 C   s   t ||| tjd}|dddd}g dg dg dg d	g}t|jd
 ddd}t||||\}}	t }
t|
|||\}}tj	||dddsNJ dtj	|	|ddds[J dd S )Nr   r`            )
r   r;   r`   ra   r;   r;   r   r   r   r   )
ra   r;   r;   ra   r`   r   r   r   r   r   )
r`   r`   r   r;   r   ra   r`   ra   r   r;   )
r   r   r;   r   r;   ra   ra   r   r   r   r"   r   r<   gh㈵>rm   )rJ   rH   z!large_random_test costs mismatch.z$large_random_test gradient mismatch.rb   )rP   r   r2   r3   rg   r   r   rQ   ro   rS   rh   np_costsrj   r   r   r
   test_case_large_random<  s   z%TestRNNTLossK2.test_case_large_randomN)__name__
__module____qualname__r0   markunitparametrizeDEVICESrV   r_   rk   rp   ru   r   r   r   r
   r7   U   s     %<mr7   __main__)r   rL   r0   r   5nemo.collections.asr.parts.numba.rnnt_loss.rnnt_numpyr   rf   r|   r   is_availableappendr    r.   r6   r7   rv   main__file__r   r   r   r
   <module>   s    

#  