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 unsup_forward(self, graph, nfeat, efeat, graph_id):
      sup_global_emb, sup_local_emb = self.sup_encoder(
          graph, nfeat, efeat
      )
      unsup_global_emb, unsup_local_emb = self.unsup_encoder(
          graph, nfeat, efeat
      )
  
      g_enc = self.unsup_global_d(unsup_global_emb)
      l_enc = self.unsup_local_d(unsup_local_emb)
  
      sup_g_enc = self.sup_d(sup_global_emb)
      unsup_g_enc = self.unsup_d(unsup_global_emb)
  
      # Calculate loss
      unsup_loss = local_global_loss_(l_enc, g_enc, graph_id)
      con_loss = global_global_loss_(sup_g_enc, unsup_g_enc)
  
      return unsup_loss, con_loss
  
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 3 for calling the InfoGraphS obj's underlying member method code with example usage: obj.unsup_forward(graph, nfeat, efeat, graph_id) and returns: unsup_loss,  con_loss