class_docstr: InfoGraph* model for semi-supervised setting
  Parameters
  -----------
  in_dim: int
      Input feature size.
  hid_dim: int
      Hidden feature size.
  
  Functions
  -----------
  forward(graph):
      graph: DGLGraph
  
  unsupforward(graph):
      graph: DGLGraph
code: def __init__(self, in_dim, hid_dim):
      super(InfoGraphS, self).__init__()
  
      self.sup_encoder = NNConvEncoder(in_dim, hid_dim)
      self.unsup_encoder = NNConvEncoder(in_dim, hid_dim)
  
      self.fc1 = Linear(2 * hid_dim, hid_dim)
      self.fc2 = Linear(hid_dim, 1)
  
      # unsupervised local discriminator and global discriminator for local-global infomax
      self.unsup_local_d = FeedforwardNetwork(hid_dim, hid_dim)
      self.unsup_global_d = FeedforwardNetwork(2 * hid_dim, hid_dim)
  
      # supervised global discriminator and unsupervised global discriminator for global-global infomax
      self.sup_d = FeedforwardNetwork(2 * hid_dim, hid_dim)
      self.unsup_d = FeedforwardNetwork(2 * hid_dim, hid_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 InfoGraphS object from inherited base classes: nn with example: obj = InfoGraphS(in_dim, hid_dim)