o
    }o™iC   ã                   @   s^   d dl mZ d dlZd dlZd dlmZmZmZmZ dd„ Z	dd„ Z
dd	„ ZG d
d„ dƒZdS )é    )ÚpermutationsN)Úcalculate_session_cpWERÚ"calculate_session_cpWER_bruteforceÚget_online_DER_statsÚget_partial_ref_labelsc                 C   s   t dd„ | D ƒƒS )Nc                 S   s   g | ]}t | ¡ ƒ‘qS © )ÚlenÚsplit)Ú.0Úwr   r   úe/home/ubuntu/.local/lib/python3.10/site-packages/tests/collections/speaker_tasks/test_diar_metrics.pyÚ
<listcomp>   s    zword_count.<locals>.<listcomp>)Úsum)Úspk_transcriptr   r   r   Ú
word_count   s   r   c                 C   s   | | | | S ©Nr   )Ú_insÚ_delÚ_subÚref_word_countr   r   r   Úcalculate_wer_count    s   r   c                 C   sD   t | ƒD ]}t||d\}}}t t || ¡¡}|dksJ ‚qdS )zP
    Randomly permute the input to see if evaluation result stays the same.
    ©Úspk_hypothesisÚspk_referenceçíµ ÷Æ°>N)r   r   ÚtorchÚabsÚtensor)ÚhypÚrefÚ
calculatedÚ
hyp_permedÚcpWERÚhyp_minÚref_strÚdiffr   r   r   Úpermuted_input_test$   s
   ýr&   c                   @   sv  e Zd ZdZejjdd„ ƒZejjdd„ ƒZejjdd„ ƒZ	ejjdd	„ ƒZ
ejjd
d„ ƒZej dg g g fdgg g fdgdgdgfddgdgdgfddgdgdgfddgdgdgfddgddgddgfdgg d¢g d¢fg¡dd„ ƒZej dddd d!d"d#d#d#d#d#d#d$œd%d&d'd(d)d*œddd&d'd&d'd$œf	dd+d,d-d.ddd)d)d&d'd$œd.d'd/d0d1d*œd2d3d/d4d&d/d$œf	g¡d5d6„ ƒZd7S )8ÚTestConcatMinPermWordErrorRatez&
    Tests for cpWER calculation.
    c                 C   s.  dg}dg}d\}}}t ||d\}}}t|ƒ}	t||||	ƒ}
t t |
| ¡¡}|dks/J ‚t|||
ƒ t||d\}}}t t || ¡¡}|dksNJ ‚dg}d\}}}t ||d\}}}t||||	ƒ}
t t |
| ¡¡}|dksvJ ‚t|||
ƒ t||d\}}}t t || ¡¡}|dks•J ‚d S )NÚoneword)r   r   r   r   r   Ú	wrongword)r   r   é   ©r   r   r   r   r   r   r&   r   ©Úselfr   r   r   r   r   r"   r#   r$   r   r    r%   Ú
cpWER_permÚhyp_min_permr   r   r   Útest_cpwer_oneword3   s,   

z1TestConcatMinPermWordErrorRate.test_cpwer_onewordc                 C   sV   g d¢}g d¢}t ||d\}}}d}t t || ¡¡}|dks#J ‚t|||ƒ d S )N)Úffúaa bb ccúdd ee)r2   r3   r1   r   r   r   )r   r   r   r   r&   )r-   r   r   r"   r#   r$   r    r%   r   r   r   Útest_cpwer_perfectN   s   z1TestConcatMinPermWordErrorRate.test_cpwer_perfectc                 C   s¤   g d¢}g d¢}d\}}}t ||d\}}}t|ƒ}	t||||	ƒ}
t t |
| ¡¡}|dks1J ‚t|||
ƒ t||d\}}}t t || ¡¡}|dksPJ ‚d S )N)z
aa bb c ffzdd e ii jj kkÚhi)zaa bb cc ffzdd ee gg jj kkúhh ii)r   r*   é   r   r   r+   r,   r   r   r   Ú'test_cpwer_spk_counfusion_and_asr_errorX   s   
zFTestConcatMinPermWordErrorRate.test_cpwer_spk_counfusion_and_asr_errorc                 C   s˜   g d¢}g d¢}d\}}}t ||d\}}}t|ƒ}	t||||	ƒ}
t t |
| ¡¡}|dks1J ‚t||d\}}}t t || ¡¡}|dksJJ ‚d S )N)r2   zdd ee ggr6   újj kk)r2   r3   r1   Úggr6   r9   ©r   r*   r   r   r   ©r   r   r   r   r   r   r   r,   r   r   r   Útest_cpwer_undercountg   ó   
z4TestConcatMinPermWordErrorRate.test_cpwer_undercountc                 C   s˜   g d¢}ddg}d\}}}t ||d\}}}t|ƒ}	t||||	ƒ}
t t |
| ¡¡}|dks1J ‚t||d\}}}t t || ¡¡}|dksJJ ‚d S )N)r2   zdd ee gg hhzii jj kkr2   zdd ee ff gg hh ii jj kkr;   r   r   r<   r,   r   r   r   Útest_cpwer_overcountu   r>   z3TestConcatMinPermWordErrorRate.test_cpwer_overcountz(pred_labels, ref_labels, expected_outputz0.0 1.0 speaker1z0.0 1.5 speaker1z0.1 0.4 speaker1z0.5 1.0 speaker2z0.1 1.4 speaker1z0.0 1.4 speaker1z0.1 0.6 speaker1z0.2 1.5 speaker2z0.5 1.0 speaker1z1.01 2.0 speaker2z1.01 1.5 speaker2ú0.0 2.0 speaker1)r@   z1.0 3.0 speaker2z0.0 5.0 speaker3)r@   z1.0 2.0 speaker2z0.0 2.0 speaker3c                 C   s   t ||ƒ|ks	J ‚d S r   )r   )r-   Úpred_labelsÚ
ref_labelsÚexpected_outputr   r   r   Útest_get_partial_ref_labelsƒ   s   z:TestConcatMinPermWordErrorRate.test_get_partial_ref_labelszcDER, CER, FA, MISS, diar_eval_count, der_stat_dict, deci, expected_der_dict, expected_der_stat_dictg333333Ó?gš™™™™™¹?gš™™™™™©?g333333Ã?r*   r   )Úcum_DERÚcum_CERÚavg_DERÚavg_CERÚmax_DERÚmax_CERé   g      >@g      $@g      @g      .@)ÚDERÚCERÚFAÚMISSgš™™™™™É?g¸…ëQ¸ž?gìQ¸…ë±?é   g      4@g      @g      @gš™™™™™Ù?g      à?g      9@c
                 C   s4   t |||||||ƒ\}
}|
|ksJ ‚||	ksJ ‚d S r   )r   )r-   rL   rM   rN   rO   Údiar_eval_countÚder_stat_dictÚdeciÚexpected_der_dictÚexpected_der_stat_dictÚactual_der_dictÚactual_der_stat_dictr   r   r   Útest_get_online_DER_stats£   s
   ÿz8TestConcatMinPermWordErrorRate.test_get_online_DER_statsN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚpytestÚmarkÚunitr0   r4   r8   r=   r?   ÚparametrizerD   rX   r   r   r   r   r'   .   s|    

	



ýýýýìþ
÷÷ôþr'   )Ú	itertoolsr   r]   r   Ú nemo.collections.asr.metrics.derr   r   r   r   r   r   r&   r'   r   r   r   r   Ú<module>   s   
