class_docstr: SRGNN regards the conversation history as a directed graph.
  In addition to considering the connection between the item and the adjacent item,
  it also considers the connection with other interactive items.
  
  Such as: A example of a session sequence(eg:item1, item2, item3, item2, item4) and the connection matrix A
  
  Outgoing edges:
      === ===== ===== ===== =====
       \    1     2     3     4
      === ===== ===== ===== =====
       1    0     1     0     0
       2    0     0    1/2   1/2
       3    0     1     0     0
       4    0     0     0     0
      === ===== ===== ===== =====
  
  Incoming edges:
      === ===== ===== ===== =====
       \    1     2     3     4
      === ===== ===== ===== =====
       1    0     0     0     0
       2   1/2    0    1/2    0
       3    0     1     0     0
       4    0     1     0     0
      === ===== ===== ===== =====
code: def forward(self, item_seq, item_seq_len):
      alias_inputs, A, items, mask = self._get_slice(item_seq)
      hidden = self.item_embedding(items)
      hidden = self.gnn(A, hidden)
      alias_inputs = alias_inputs.view(
          -1, alias_inputs.size(1), 1
      ).expand(-1, -1, self.embedding_size)
      seq_hidden = torch.gather(hidden, dim=1, index=alias_inputs)
      # fetch the last hidden state of last timestamp
      ht = self.gather_indexes(seq_hidden, item_seq_len - 1)
      q1 = self.linear_one(ht).view(ht.size(0), 1, ht.size(1))
      q2 = self.linear_two(seq_hidden)
  
      alpha = self.linear_three(torch.sigmoid(q1 + q2))
      a = torch.sum(
          alpha * seq_hidden * mask.view(mask.size(0), -1, 1).float(), 1
      )
      seq_output = self.linear_transform(torch.cat([a, ht], dim=1))
      return seq_output
  
imports: import math
  import numpy
  import torch
  from torch import nn
  from torch.nn import Parameter
  from torch.nn import functional
  from recbole.model.abstract_recommender import SequentialRecommender
  from recbole.model.loss import BPRLoss
label_desc: Use image node_id 4 for calling the SRGNN obj's underlying member method code with example usage: obj.forward(item_seq, item_seq_len) and returns: seq_output