o
    ´©ié  ã                   @   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)Dynamic 2-Dimensional Convolution module.é    N)Únnc                       s.   e Zd ZdZ		d‡ fdd„	Zdd„ Z‡  ZS )ÚDynamicConvolution2DaØ  Dynamic 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 ƒ| _d| _	d| _
t ||d ¡| _t |d |¡| _t || jd | ¡| _tj | jj¡ t ||¡| _tj | jj¡ t ¡ | _|| _| jrst t |¡¡| _dS dS )z2Construct Dynamic 2-Dimensional Convolution layer.r   é   Né   )Úsuperr   Ú__init__ÚwshareÚuse_kernel_maskÚdropout_rateÚkernel_sizeÚintÚpadding_sizeÚattn_tÚattn_fr   ÚLinearÚlinear1Úlinear2Úlinear_weightÚinitÚxavier_uniformÚweightÚlinear_weight_fÚGLUÚactÚuse_biasÚ	ParameterÚtorchÚTensorÚbias)Úselfr   Ún_featr
   r   r	   r   ©Ú	__class__© úb/home/ubuntu/.local/lib/python3.10/site-packages/funasr/models/transformer/utils/dynamic_conv2d.pyr      s(   

ÿzDynamicConvolution2D.__init__c                 C   s¦  |}|  ¡ \}}}| j}	| j}
|  |¡}|  |¡}|  |¡ || d|
¡}| |||
¡ d¡| _t	j
| d|| |¡|| j|| d}| |||¡}|  |¡}t	j|| j| jd}| |||	|
¡ dd¡ ¡ }tj||	 | ||
 d  |jd}| ||	|||
 d ¡ tdƒ¡}| |j¡}| ||	||
f||
 d | |	 ||
 d | ||
 df¡ |¡ | dt|
d d ƒ|¡}| jrÚt tj|||jd¡ d	¡}|  |d
ktdƒ¡}t	j!|dd}|| _"| ||	 ||¡}| dd¡ ¡ }| ||	 t||	 ƒ|¡ dd¡}t #||¡}| dd¡ ¡  |||¡}| j$r'|| j% ddd¡ }| dd¡}t &||fd¡}|durL| jsL| dd¡}|  |d	kd
¡}|  '|¡}|S )a4  Forward of 'Dynamic 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   )ÚpaddingÚgroups)Útrainingr   )Údtypez-inféÿÿÿÿ)Údevicer   g        )ÚdimNéþÿÿÿ)(Úsizer   r   r   r   r   ÚviewÚ	unsqueezer   ÚFÚconv1dr   r   Údropoutr
   r'   Ú	transposeÚ
contiguousr   Úzerosr(   Úfill_ÚfloatÚtor*   Ú
as_stridedÚcopy_Únarrowr   r	   ÚtrilÚonesÚmasked_fillÚsoftmaxr   Úbmmr   r   Úcatr   )r   ÚqueryÚkeyÚvalueÚmaskÚxÚBÚTÚCÚHÚkÚweight_fÚxfr   Ú
weight_newÚkernel_maskr#   r#   r$   ÚforwardA   sN   

&
$"<ÿ"
zDynamicConvolution2D.forward)FF)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   rP   Ú__classcell__r#   r#   r!   r$   r      s    ù%r   )rT   Únumpyr   r   Útorch.nn.functionalÚ
functionalr0   r7   ÚfinfoÚfloat32ÚminÚ	MIN_VALUEÚModuler   r#   r#   r#   r$   Ú<module>   s    