o
    i                     @   sP   d Z ddlZddlmZ ddlmZ G dd dejjZG dd dejjZ	dS )	zMLP with convolutional gating (cgMLP) definition.

References:
    https://openreview.net/forum?id=RA-zVvZLYIy
    https://arxiv.org/abs/2105.08050

    N)get_activation)	LayerNormc                
       sH   e Zd ZdZdededededef
 fddZd	d
 Z	dddZ
  ZS )ConvolutionalSpatialGatingUnitz)Convolutional Spatial Gating Unit (CSGU).sizekernel_sizedropout_rateuse_linear_after_convgate_activationc                    s   t    |d }t|| _tjj|||d|d d |d| _|r*tj||| _	nd | _	|dkr8tj
 | _nt|| _tj|| _d S )N      )groupsidentity)super__init__r   normtorchnnConv1dconvLinearlinearIdentityactr   Dropoutdropout)selfr   r   r   r   r	   
n_channels	__class__ L/home/ubuntu/.local/lib/python3.10/site-packages/espnet2/asr/layers/cgmlp.pyr      s$   



z'ConvolutionalSpatialGatingUnit.__init__c                 C   sb   t jjj| jjdd t jj| jj | jd ur/t jjj| jjdd t jj| jj d S d S )Ngư>)std)	r   r   initnormal_r   weightones_biasr   )r   r   r   r    espnet_initialization_fn2   s   
z7ConvolutionalSpatialGatingUnit.espnet_initialization_fnNc                 C   sz   |j ddd\}}| |}| |dddd}| jdur%| |}|dur-|| }| |}|| }| |}|S )zForward method

        Args:
            x (torch.Tensor): (N, T, D)
            gate_add (torch.Tensor): (N, T, D/2)

        Returns:
            out (torch.Tensor): (N, T, D/2)
        r
   )dimr   N)chunkr   r   	transposer   r   r   )r   xgate_addx_rx_goutr   r   r    forward9   s   




z&ConvolutionalSpatialGatingUnit.forwardN)__name__
__module____qualname____doc__intfloatboolstrr   r'   r1   __classcell__r   r   r   r    r      s     r   c                       sB   e Zd ZdZdedededededef fdd	Zd
d Z	  Z
S )ConvolutionalGatingMLPz!Convolutional Gating MLP (cgMLP).r   linear_unitsr   r   r   r	   c                    sV   t    tjtj||tj | _t|||||d| _	tj|d || _
d S )N)r   r   r   r   r	   r
   )r   r   r   r   
Sequentialr   GELUchannel_proj1r   csguchannel_proj2)r   r   r=   r   r   r   r	   r   r   r    r   W   s   
	zConvolutionalGatingMLP.__init__c                 C   sX   t |tr
|\}}n|d }}| |}| |}| |}|d ur(||f}|S |}|S r2   )
isinstancetupler@   rA   rB   )r   r,   maskxs_padpos_embr0   r   r   r    r1   n   s   





zConvolutionalGatingMLP.forward)r3   r4   r5   r6   r7   r8   r9   r:   r   r1   r;   r   r   r   r    r<   T   s     r<   )
r6   r   &espnet.nets.pytorch_backend.nets_utilsr   2espnet.nets.pytorch_backend.transformer.layer_normr   r   Moduler   r<   r   r   r   r    <module>   s    E