o
    i1                     @   s   d dl Zd dlZd dlZd dlm  mZ d dlm	Z	 d dlm
Z
 dddZdd	 Zd
d Zdd ZdddZdddZ	dddZdS )    N)combinations)permutations      c                 C   s   g }| d t|D ]3}|d }tttt| |}|D ]}t| }d||< tt	|
dd| d }| | q qt|}	i }
i |
d< i |
d< tt|	D ]}|	| }||
d |< ||
d |< qSt|	}||
d< |
S )Nr      	dec2label	label2decoov)appendrangenparraylistr   arangezerosintraw_dec_transreshapesortedlen)max_speaker_nummax_olp_speaker_num	all_kindsiselected_numcomscomtmpitemall_kinds_ordermapping_dictdecoov_id r$   R/home/ubuntu/.local/lib/python3.10/site-packages/funasr/models/eend/utils/power.pygenerate_mapping_dict	   s,   

r&   c                 C   sb   g }t |D ]}|| d d |f  qd}| jd }t|}|D ]}||| 7 }|d }q"|S )Nr   r      )r   r   shaper   r   )xr   num_listr   baseTresnumr$   r$   r%   r   "   s   


r   c                 C   s,   | |d   v r|d |  }|S |d }|S )Nr   r
   )keys)r.   r!   labelr$   r$   r%   mapping_func/   s
   r1   c           	         sz   g }t |D ]}|| d d |f  qd}| jd }t|}|D ]}||| 7 }|d }q"t fdd|D }|S )Nr   r   r'   c                    s   g | ]}t | qS r$   )r1   ).0r   r!   r$   r%   
<listcomp>A   s    zdec_trans.<locals>.<listcomp>)r   r   r(   r   r   r   )	r)   r   r!   r*   r   r+   r,   r-   r.   r$   r3   r%   	dec_trans7   s   


r5   c                 C   sF   | j \}}t||f}| |d d d |f< t|||}t|}|S N)r(   r   r   r5   torch
from_numpy)r0   r!   r   r   r,   Cpadding_label	out_labelr$   r$   r%   create_powerlabelE   s   

r<   c                    sf   t ttt|t j}t|	 j
	tj} fdd|D }fdd|D }||fS )Nc                    s   g | ]
} d d |f qS r6   r$   )r2   perm)r0   r$   r%   r4   Q   s    z%generate_perm_pse.<locals>.<listcomp>c                    s,   g | ]}t |   j|jd dqS )T)non_blocking)r<   cpunumpytodevice)r2   
perm_label)r!   r   r$   r%   r4   R   s    )r   r   r   r   r   astypefloat32r7   r8   rA   rB   int64)r0   	n_speakerr!   r   r   permsperm_labelsperm_pse_labelsr$   )r0   r!   r   r%   generate_perm_pseN   s   rK   c                    sV   t | ||||d\}} fdd|D }t|}	t|	}
||
 ||
 }}||fS )N)r   c                    s*   g | ]}t j |tjd t  qS ))inputtarget)Fcross_entropyrA   r7   longr   )r2   perm_pse_label	pse_logitr$   r%   r4   a   s    z$generate_min_pse.<locals>.<listcomp>)rK   r7   stackargmin)r0   rG   r!   r   rS   r   rI   rJ   lossesloss	min_indexselected_perm_labelselected_pse_labelr$   rR   r%   generate_min_pse[   s   




r[   )r   r   )r   )r@   r   r7   torch.multiprocessingtorch.nn.functionalnn
functionalrN   	itertoolsr   r   r&   r   r1   r5   r<   rK   r[   r$   r$   r$   r%   <module>   s    


	