code: def forward(self, x):
      x = torch.matmul(x, self.weight)
      x = x.reshape((x.size(0), self.heads, -1))  # NxHxD'
      head_x = x.transpose(0, 1)  # HxNxD'
      a1 = torch.bmm(head_x, self.att_l).transpose(0, 1)  # NxHx1
      a2 = torch.bmm(head_x, self.att_r).transpose(0, 1)  # NxHx1
      self.g.ndata.update({"x": x, "a1": a1, "a2": a2})
      self.g.apply_edges(self.edge_attention)
      self.edge_softmax()
      self.g.update_all(
          fn.src_mul_edge("x", "a", "x"), fn.sum("x", "x")
      )
      x = self.g.ndata["x"] / self.g.ndata["z"]  # NxHxD'
      return x.view(-1, self.heads * self.out_channels)
  
imports: import dgl.function
  import torch
  import torch.nn.functional
  from dgl.nn.pytorch import EdgeSoftmax
  from torch.nn import Parameter
  from torch_geometric.nn.inits import glorot, zeros
label_desc: Use image node_id 3 for calling the GATSPMVConv obj's underlying member method code with example usage: obj.forward(x) and returns: x