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 forward(self, graph, nfeat, efeat):
      sup_global_emb, sup_local_emb = self.sup_encoder(
          graph, nfeat, efeat
      )
  
      sup_global_pred = self.fc2(F.relu(self.fc1(sup_global_emb)))
      sup_global_pred = sup_global_pred.view(-1)
  
      return sup_global_pred
  
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 2 for calling the InfoGraphS obj's underlying member method code with example usage: obj.forward(graph, nfeat, efeat) and returns: sup_global_pred