o
    i                     @   sp   d dl mZmZ d dlZd dlmZ d dlmZmZ d dl	m
Z
 d dlmZ d dlmZ G dd	 d	ejjZdS )
    )TupleUnionN)ComplexTensor)	to_doubleto_float)MaskEstimator)wpe_one_iteration)make_pad_maskc                '       s  e Zd Z												
									d*dedededededededededededededededededed ef& fd!d"Zd#ee	j
ef d$e	jd%eee	j
ef e	jee	j
ef f fd&d'Zd#ee	j
ef d$e	jd%ee	j
e	jf fd(d)Z  ZS )+DNN_WPEblstmp     ,  @             T   sigmoidFư>Hz>wtypewidimwlayerswunitswprojsdropout_ratetapsdelayuse_dnn_masknmask	nonlinear
iterationsnormalizationepsdiagonal_loadingdiag_epsmask_flooringflooring_thresuse_torch_solverc              
      s   t    || _|| _|| _|| _|| _|	| _d| _|| _	|| _
|| _|| _|| _| jr>|
| _t|||||||
|d| _d S d| _d S )NT)r   r    r   )super__init__r!   r   r   r#   r"   r   inverse_powerr$   r%   r&   r'   r(   r   r   mask_est)selfr   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   	__class__ N/home/ubuntu/.local/lib/python3.10/site-packages/espnet2/enh/layers/dnn_wpe.pyr*      s4   

zDNN_WPE.__init__datailensreturnc                    sD    dddd  fddtjD }dd}tjD ]V}dd |D }|dkrVjrV \}jrAfd	dD jrKd
d D fddt|D }fdd|D } fdd|D } fdd|D }qdd |D }durjdkrdd D nd 	ddjdkr|d }||fS )a  DNN_WPE forward function.

        Notation:
            B: Batch
            C: Channel
            T: Time or Sequence length
            F: Freq or Some dimension of the feature vector

        Args:
            data: (B, T, C, F)
            ilens: (B,)
        Returns:
            enhanced (torch.Tensor or List[torch.Tensor]): (B, T, C, F)
            ilens: (B,)
            masks (torch.Tensor or List[torch.Tensor]): (B, T, C, F)
            power (List[torch.Tensor]): (B, F, T)
        r   r      r   c                    s   g | ]} qS r0   r0   ).0i)r2   r0   r1   
<listcomp>\   s    z#DNN_WPE.forward.<locals>.<listcomp>Nc                 S   s    g | ]}|j d  |jd   qS )r5   )realimagr6   enhr0   r0   r1   r8   b   s     c                    s   g | ]	}|j  jd qS )min)clampr'   r6   mr-   r0   r1   r8   h   s    c                 S   s   g | ]}||j d dd qS )T)dimkeepdim)sumr@   r0   r0   r1   r8   k   s    c                    s   g | ]
\}}| |  qS r0   r0   )r6   r7   p)masksr0   r1   r8   m       c                    s"   g | ]}|j d dj jdqS ))rD   r=   )meanr?   r#   r6   rG   rB   r0   r1   r8   p   s   " c              	      s0   g | ]}t t  t|jjjd qS ))r   r   r+   )r   r   
contiguousr   r   r+   rL   )r2   r-   r0   r1   r8   t   s    
c                    s*   g | ]}|j  jd t|jdqS ))dtyper   )torN   masked_fillr	   r9   r;   )r2   r3   r0   r1   r8   ~   s    c                 S   s   g | ]
}| d dddqS )r   r   r5   r   )permuter;   r0   r0   r1   r8      rI   c                 S      g | ]}| d dqS rC   	transposer@   r0   r0   r1   r8          rC   rT   )
rQ   ranger   r!   r   r,   r&   r"   	enumeraterV   )r-   r2   r3   enhancedpowerr7   _r0   )r2   r3   rH   r-   r1   forwardB   s:   


zDNN_WPE.forwardc              	   C   sZ   | j r'| t|dddd|\}}dd |D }| jdkr#|d }||fS d}||fS )a2  Predict mask for WPE dereverberation.

        Args:
            data (torch.complex64/ComplexTensor): (B, T, C, F), double precision
            ilens (torch.Tensor): (B,)
        Returns:
            masks (torch.Tensor or List[torch.Tensor]): (B, T, C, F)
            ilens (torch.Tensor): (B,)
        r   r   r5   r   c                 S   rR   rS   rU   r@   r0   r0   r1   r8      rW   z(DNN_WPE.predict_mask.<locals>.<listcomp>N)r   r,   r   rQ   r   )r-   r2   r3   rH   r0   r0   r1   predict_mask   s    
zDNN_WPE.predict_mask)r   r   r   r   r   r   r   r   Tr   r   r   Fr   Tr   Fr   T)__name__
__module____qualname__strintfloatboolr*   r   torchTensorr   
LongTensorr   r]   r^   __classcell__r0   r0   r.   r1   r
      s    	
5
Nr
   )typingr   r   rf   torch_complex.tensorr    espnet2.enh.layers.complex_utilsr   r   !espnet2.enh.layers.mask_estimatorr   espnet2.enh.layers.wper   &espnet.nets.pytorch_backend.nets_utilsr	   nnModuler
   r0   r0   r0   r1   <module>   s    