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 __init__(self, config, dataset):
      super(SRGNN, self).__init__(config, dataset)
  
      # load parameters info
      self.embedding_size = config["embedding_size"]
      self.step = config["step"]
      self.device = config["device"]
      self.loss_type = config["loss_type"]
  
      # define layers and loss
      # item embedding
      self.item_embedding = nn.Embedding(
          self.n_items, self.embedding_size, padding_idx=0
      )
      # define layers and loss
      self.gnn = GNN(self.embedding_size, self.step)
      self.linear_one = nn.Linear(
          self.embedding_size, self.embedding_size, bias=True
      )
      self.linear_two = nn.Linear(
          self.embedding_size, self.embedding_size, bias=True
      )
      self.linear_three = nn.Linear(self.embedding_size, 1, bias=False)
      self.linear_transform = nn.Linear(
          self.embedding_size * 2, self.embedding_size, bias=True
      )
      if self.loss_type == "BPR":
          self.loss_fct = BPRLoss()
      elif self.loss_type == "CE":
          self.loss_fct = nn.CrossEntropyLoss()
      else:
          raise NotImplementedError(
              "Make sure 'loss_type' in ['BPR', 'CE']!"
          )
  
      # parameters initialization
      self._reset_parameters()
  
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 1 to create a new SRGNN object from inherited base classes: SequentialRecommender with example: obj = SRGNN(config, dataset)