class_docstr:     InfoGraph model for unsupervised setting
  
  Parameters
  -----------
  in_dim: int
      Input feature size.
  hid_dim: int
      Hidden feature size.
  n_layer: int
      Number of the GNN encoder layers.
  
  Functions
  -----------
  forward(graph):
      graph: DGLGraph
code: def __init__(self, in_dim, hid_dim, n_layer):
      super(InfoGraph, self).__init__()
  
      self.in_dim = in_dim
      self.hid_dim = hid_dim
  
      self.n_layer = n_layer
      embedding_dim = hid_dim * n_layer
  
      self.encoder = GINEncoder(in_dim, hid_dim, n_layer)
  
      self.local_d = FeedforwardNetwork(
          embedding_dim, embedding_dim
      )  # local discriminator (node-level)
      self.global_d = FeedforwardNetwork(embedding_dim, embedding_dim)
  
imports: import torch
  import torch.nn
  import torch.nn.functional
  from dgl.nn import GINConv, NNConv, Set2Set
  from dgl.nn.pytorch.glob import SumPooling
  from torch.nn import BatchNorm1d, GRU, Linear, ModuleList, ReLU, Sequential
  from utils import global_global_loss_, local_global_loss_
label_desc: Use image node_id 1 to create a new InfoGraph object from inherited base classes: nn with example: obj = InfoGraph(in_dim, hid_dim, n_layer)