code: def forward(self, graph, seq_lengths, ground_truth=None):
      etypes = graph.edata.pop("type")
      annotation = graph.ndata.pop("annotation").float()
  
      assert annotation.size()[-1] == self.annotation_size
  
      node_num = graph.num_nodes()
  
      all_logits = []
      for _ in range(self.max_seq_length):
          zero_pad = torch.zeros(
              [node_num, self.out_feats - self.annotation_size],
              dtype=torch.float,
              device=annotation.device,
          )
  
          h1 = torch.cat([annotation.detach(), zero_pad], -1)
          out = self.ggnn(graph, h1, etypes)
          out = torch.cat([out, annotation], -1)
          logits = self.pooling(graph, out)
          logits = self.output_layer(logits)
          all_logits.append(logits)
  
          annotation = self.annotation_out_layer(out)
          annotation = F.softmax(annotation, -1)
  
      all_logits = torch.stack(all_logits, 1)
      preds = torch.argmax(all_logits, -1)
      if ground_truth is not None:
          loss = sequence_loss(all_logits, ground_truth, seq_lengths)
          return loss, preds
      return preds
  
file_path: dgl/examples/pytorch/ggnn/ggsnn.py
imports: import torch
  import torch.nn.functional
  from dgl.nn.pytorch import GatedGraphConv, GlobalAttentionPooling
  from torch import nn
label_desc: Use image node_id 2 for calling the GGSNN obj's underlying member method code with example usage: obj.forward(graph, seq_lengths, ground_truth) and returns: preds, loss,  preds