o
    }oic                     @   sT   d dl mZ d dlZdZdejdejdejdefdd	Zd
d Zdd Zdd Z	dS )    )permutationsNg:0yE>sourceestimate_sourcesource_lengthsreturnc                 C   s&   t | ||\}}}}dt| }|S )zy
    Args:
        source: [B, C, T], B is batch size
        estimate_source: [B, C, T]
        source_lengths: [B]
    r   )cal_si_snr_with_pittorchmean)r   r   r   max_snrpermsmax_snr_idxsnr_setloss r   c/home/ubuntu/.local/lib/python3.10/site-packages/nemo/collections/audio/losses/maxine/sisnr_loss.py
sisnr_loss/   s   r   c                 C   s  |   |  ks
J |   \}}}t| |}|| }|ddd }tj| ddd| }tj|ddd| }	| | }
||	 }|
|9 }
||9 }tj|
dd}tj|dd}tj|| ddd}tj|d dddt }|| | }|| }tj|d ddtj|d ddt  }dt|t  }t	|dd}| j
ttt|tjd	}t|d}| g |  |R d|d}td
||g}tj|dd}tj|ddd\}}|| }||||| fS )zCalculate SI-SNR with PIT training.
    Args:
        source: [B, C, T], B is batch size
        estimate_source: [B, C, T]
        source_lengths: [B], each item is between [0, T]
          T)dimkeepdim)r      
   )dtypezbij,pij->bp)sizeget_maskviewfloatr   sum	unsqueezeEPSlog10	transpose
new_tensorlistr   rangelong	new_zerosscatter_einsumargmaxmax)r   r   r   BCTmasknum_samplesmean_targetmean_estimatezero_mean_targetzero_mean_estimates_target
s_estimatepair_wise_dots_target_energypair_wise_proje_noisepair_wise_si_snrr   indexperms_one_hotr   r   r
   _r   r   r   r   <   s8   
("r   c           
      C   sd   |   ^}}}tj|d|d}t| }t|D ]}t|D ]}	| ||| |	 f |||	f< qq|S )z
    Args:
        source: [B, C, T]
        perms: [C!, C], permutations
        max_snr_idx: [B], each item is between [0, C!)
    Returns:
        reorder_source: [B, C, T]
    r   )r   r<   )r   r   index_select
zeros_liker%   )
r   r   r   r,   r-   r>   max_snr_permreorder_sourcebcr   r   r   rB   q   s   	
rB   c                 C   sL   |   \}}}	 | |d|f}t|D ]}d||dd|| df< q|S )zj
    Args:
        source: [B, C, T]
        source_lengths: [B]
    Returns:
        mask: [B, 1, T]
    r   r   N)r   new_onesr%   )r   r   r,   r>   r.   r/   ir   r   r   r      s   r   )
	itertoolsr   r   r    Tensorr   r   r   rB   r   r   r   r   r   <module>   s   ' 5