o
    ij                     @   sN   d dl mZmZ d dlZd dlZd dlmZ d dlm	Z	 G dd de	j
ZdS )    )TupleOptionalN)
functionalc                       s   e Zd ZdZ							d dededed	ed
edededdf fddZdejdejdejfddZ	dejdejdejfddZ
dejdejdejfddZ					d!dejdejdejdejdejdejdeejeej eej f fddZ  ZS )"
ProfileAugao  
    Implement the augmentation for profiles including:
    - Split aug: split one profile into two profiles, i.e., main and inaccurate, labels assigned to main
    - Merge aug: merge two profiles into one, labels are also merged into one, the other set to zero
    - Disturb aug: disturb some profile with others to simulate the inaccurate clustering centroids.
    T皙?皙?皙?apply_split_augsplit_aug_probapply_merge_augmerge_aug_probapply_disturb_augdisturb_aug_probdisturb_alphareturnNc                    s8   t    || _|| _|| _|| _|| _|| _|| _d S )N)	super__init__r	   r
   r   r   r   r   r   )selfr	   r
   r   r   r   r   r   	__class__ T/home/ubuntu/.local/lib/python3.10/site-packages/funasr/models/specaug/profileaug.pyr      s   


zProfileAug.__init__profilebinary_labelsmaskc                 C   s6  |j d |j d }}tjj|ddd}|jdd}tj|}t|| j	k d }	|	D ]i}
t||
 ||
  }t||
 dk||
  }t
|dksRt
|dkrSq,|tt
|d }|tt
|d }t|f|}tj|dd}t||
|f | j|  ||
|f< d||
|f< d||
|f< q,|||fS Nr   Fdimkeepdim   r   r   )shapetorchlinalgnormsumnprandomrandnonzeror
   lenrandintrandntoF	normalizer   )r   r   r   r   bszr   profile_norm	spk_countprobbatch_indicesidxvalid_spk_idxpad_spk_idxsplit_spk_idxto_cover_idxdisturb_vecr   r   r   	split_aug#   s(   
zProfileAug.split_augc                 C   s  |j d |j d }}tjj|ddd}|jdd}tj|}t|| j	k d }	|	D ]}
t||
 ||
  }t
|dkr@q,tt
|d}||d  ||d  }}||
|f ||
|f  ||
|f< tj||
|f dd||
|f< d||
|f< ||
d d |f ||
d d |f  ||
d d |f< ||
d d |f dk|||
d d |f< d||
d d |f< d||
|f< d||
|f< q,|||fS )Nr   r   Fr   r    r!   )   )r"   r#   r$   r%   r&   r'   r(   r)   r*   r   r+   r,   r/   r0   r.   )r   r   r   r   r1   r   r2   r3   r4   r5   r6   r7   to_merge	spk_idx_1	spk_idx_2r   r   r   	merge_aug:   s.    "
zProfileAug.merge_augc                 C   s@  |j d |j d }}tjj|ddd}|jdd}tj|}t|| j	k d }	|	D ]n}
t||
 ||
  }t||
 ||
  }t
|dksPt
|dkrQq,|tt
|d }|tt
|d }| jtd  }d| ||
|f  |||
|f   ||
|f< tj||
|f dd||
|f< d||
|f< q,|||fS r   )r"   r#   r$   r%   r&   r'   r(   r)   r*   r   r+   r,   r   itemr/   r0   )r   r   r   r   r1   r   r2   r3   r4   r5   r6   pos_spk_idxr7   to_disturb_idxdisturb_idxalphar   r   r   disturb_augX   s*   
zProfileAug.disturb_augspeechspeech_lengthsprofile_lengthslabels_lengthc                 C   s   t |t |t |}}}tj|dd}t |jd d |}| jr2| |||\}}}| j	r?| 
|||\}}}| jrL| |||\}}}|||fS )Nr   r!   r=   )r#   cloner/   r0   onesr"   r.   r   rG   r	   r<   r   rA   )r   rH   rI   r   rJ   r   rK   profile_maskr   r   r   forwardn   s&   




zProfileAug.forward)Tr   Tr   Tr   r   )NNNNN)__name__
__module____qualname____doc__boolfloatr   r#   Tensorr<   rA   rG   r   r   rO   __classcell__r   r   r   r   r      sb    		r   )typingr   r   numpyr'   r#   torch.nnr   r/   nnModuler   r   r   r   r   <module>   s    