def METHOD_NAME(self, ndata, attn_bias=None, attn_mask=None):
    """Forward computation.
    Parameters
    ----------
    ndata : torch.Tensor
        A 3D input tensor. Shape: (batch_size, N, :attr:`feat_size`), where
        N is the maximum number of nodes.
    attn_bias : torch.Tensor, optional
        The attention bias used for attention modification. Shape:
        (batch_size, N, N, :attr:`num_heads`).
    attn_mask : torch.Tensor, optional
        The attention mask used for avoiding computation on invalid
        positions, where invalid positions are indicated by `True` values.
        Shape: (batch_size, N, N). Note: For rows corresponding to
        unexisting nodes, make sure at least one entry is set to `False` to
        prevent obtaining NaNs with softmax.
    Returns
    -------
    y : torch.Tensor
        The output tensor. Shape: (batch_size, N, :attr:`feat_size`)
    """
    q_h = self.q_proj(ndata).transpose(0, 1)
    k_h = self.k_proj(ndata).transpose(0, 1)
    v_h = self.v_proj(ndata).transpose(0, 1)
    bsz, N, _ = ndata.shape
    q_h = (
        q_h.reshape(N, bsz * self.num_heads, self.head_dim).transpose(0, 1)
        * self.scaling
    )
    k_h = k_h.reshape(N, bsz * self.num_heads, self.head_dim).permute(
        1, 2, 0
    )
    v_h = v_h.reshape(N, bsz * self.num_heads, self.head_dim).transpose(
        0, 1
    )
    attn_weights = (
        th.bmm(q_h, k_h)
        .transpose(0, 2)
        .reshape(N, N, bsz, self.num_heads)
        .transpose(0, 2)
    )
    if attn_bias is not None:
        if self.attn_bias_type == "add":
            attn_weights += attn_bias
        else:
            attn_weights *= attn_bias
    if attn_mask is not None:
        attn_weights[attn_mask.to(th.bool)] = float("-inf")
    attn_weights = F.softmax(
        attn_weights.transpose(0, 2)
        .reshape(N, N, bsz * self.num_heads)
        .transpose(0, 2),
        dim=2,
    )
    attn_weights = self.dropout(attn_weights)
    attn = th.bmm(attn_weights, v_h).transpose(0, 1)
    attn = self.out_proj(
        attn.reshape(N, bsz, self.feat_size).transpose(0, 1)
    )
    return attn