class_docstr: General GNN layer, with mul attention
class_docstr_tok: ["General","GNN","layer",",","with","mul","attention"]
code: def message(self, edge_index_i, x_i, x_j, norm, size_i):
      # todo: curently only for single head attention
      x_i = x_i.view(-1, self.heads, self.head_channels)
      x_j = x_j.view(-1, self.heads, self.head_channels)
      alpha = (x_i * x_j + self.bias_att).sum(dim=-1) / self.scaler
      # alpha = F.leaky_relu(alpha, self.negative_slope)
      alpha = softmax(alpha, edge_index_i, num_nodes=size_i)
      alpha = alpha.view(-1, self.heads, 1)
      return (
          norm.view(-1, 1) * x_j * alpha
          if norm is not None
          else x_j * alpha
      )
  
imports: import torch
  import torch.nn
  import torch.nn.functional
  from torch.nn import Parameter
  from torch_geometric.nn.conv import MessagePassing
  from torch_geometric.nn.inits import glorot, zeros
  from torch_geometric.utils import add_remaining_self_loops, softmax
  from torch_scatter import scatter_add
  from graphgym.config import cfg
  from graphgym.register import register_layer
label_desc: Use image node_id 5 for calling the GeneralMulAttConvLayer obj's underlying member method code with example usage: obj.message(edge_index_i, x_i, x_j, norm, size_i) and returns: unknown