def METHOD_NAME(self, query, key, value, mask):
    """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
    """
    # linear -> GLU -> lightconv -> linear
    x = query
    B, T, C = x.size()
    H = self.wshare
    # first liner layer
    x = self.linear1(x)
    # GLU activation
    x = self.act(x)
    # convolution along frequency axis
    weight_f = F.softmax(self.weight_f, dim=-1)
    weight_f = F.dropout(weight_f, self.dropout_rate, training=self.training)
    weight_new = torch.zeros(
        B * T, 1, self.kernel_size, device=x.device, dtype=x.dtype
    ).copy_(weight_f)
    xf = F.conv1d(
        x.view(1, B * T, C), weight_new, padding=self.padding_size, groups=B * T
    ).view(B, T, C)
    # lightconv
    x = x.transpose(1, 2).contiguous().view(-1, H, T)  # B x C x T
    weight = F.dropout(self.weight, self.dropout_rate, training=self.training)
    if self.use_kernel_mask:
        self.kernel_mask = self.kernel_mask.to(x.device)
        weight = weight.masked_fill(self.kernel_mask == 0.0, float("-inf"))
    weight = F.softmax(weight, dim=-1)
    x = F.conv1d(x, weight, padding=self.padding_size, groups=self.wshare).view(
        B, C, T
    )
    if self.use_bias:
        x = x + self.bias.view(1, -1, 1)
    x = x.transpose(1, 2)  # B x T x C
    x = torch.cat((x, xf), -1)  # B x T x Cx2
    if mask is not None and not self.use_kernel_mask:
        mask = mask.transpose(-1, -2)
        x = x.masked_fill(mask == 0, 0.0)
    # second linear layer
    x = self.linear2(x)
    return x