o
    iZ                     @   sZ   d Z ddlZddlZddlmZ ddlm  mZ eeej	j
ZG dd dejZdS )z-Lightweight 2-Dimensional Convolution module.    N)nnc                       s.   e Zd ZdZ		d fdd	Zdd Z  ZS )LightweightConvolution2Da  Lightweight 2-Dimensional Convolution layer.

    This implementation is based on
    https://github.com/pytorch/fairseq/tree/master/fairseq

    Args:
        wshare (int): the number of kernel of convolution
        n_feat (int): the number of features
        dropout_rate (float): dropout_rate
        kernel_size (int): kernel size (length)
        use_kernel_mask (bool): Use causal mask or not for convolution kernel
        use_bias (bool): Use bias term or not.

    Fc           	         s  t t|   || dksJ || _|| _|| _|| _t|d | _t	
||d | _t	
|d || _t	 | _t	t| jd|dd| _t	tdd|dd| _|| _| jrgt	t|| _t| jt|d }t| jt|d d }tj||fddd| _dS )z6Construct Lightweight 2-Dimensional Convolution layer.r         dimN)superr   __init__wshareuse_kernel_maskdropout_ratekernel_sizeintpadding_sizer   Linearlinear1linear2GLUact	ParametertorchTensoruniform_weightweight_fuse_biasbiaszerosonescat	unsqueezekernel_mask)	selfr   n_featr   r   r   r   kernel_mask0kernel_mask1	__class__ _/home/ubuntu/.local/lib/python3.10/site-packages/funasr/models/transformer/utils/lightconv2d.pyr
      s$   

 z!LightweightConvolution2D.__init__c                 C   s  |}|  \}}}| j}	| |}| |}tj| jdd}
tj|
| j| j	d}
t
j|| d| j|j|jd|
}tj|d|| ||| j|| d|||}|dd d|	|}tj| j| j| j	d}| jr| j|j| _|| jdktd	}tj|dd}tj||| j| jd|||}| jr|| jddd }|dd}t
||fd}|d
ur| js|dd}||dkd}| |}|S )a8  Forward of 'Lightweight 2-Dimensional Convolution'.

        This function takes query, key and value but uses only query.
        This is just for compatibility with self-attention layer (attention.py)

        Args:
            query (torch.Tensor): (batch, time1, d_model) input tensor
            key (torch.Tensor): (batch, time2, d_model) NOT USED
            value (torch.Tensor): (batch, time2, d_model) NOT USED
            mask (torch.Tensor): (batch, time1, time2) mask

        Return:
            x (torch.Tensor): (batch, time1, d_model) output

        r   r   )trainingr   )devicedtype)paddinggroupsr   g        z-infNr   )sizer   r   r   Fsoftmaxr   dropoutr   r+   r   r   r   r,   r-   copy_conv1dviewr   	transpose
contiguousr   r   r"   tomasked_fillfloatr   r   r    r   )r#   querykeyvaluemaskxBTCHr   
weight_newxfr   r)   r)   r*   forward@   s>   


 
z LightweightConvolution2D.forward)FF)__name__
__module____qualname____doc__r
   rH   __classcell__r)   r)   r'   r*   r      s    $r   )rL   numpyr   r   torch.nn.functional
functionalr2   r<   finfofloat32min	MIN_VALUEModuler   r)   r)   r)   r*   <module>   s    