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 forward(self, graph, feat, graph_id):
      global_emb, local_emb = self.encoder(graph, feat)
  
      global_h = self.global_d(
          global_emb
      )  # global hidden representation
      local_h = self.local_d(local_emb)  # local hidden representation
  
      loss = local_global_loss_(local_h, global_h, graph_id)
  
      return 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 InfoGraph obj's underlying member method code with example usage: obj.forward(graph, feat, graph_id) and returns: loss