code: def forward(self, graph, node_feat, edge_feat):
      if self.virtual_node:
          virtual_emb = self.virtual_emb.weight.expand(
              graph.batch_size, -1
          )
  
      hn = self.node_encoder(node_feat)
  
      for layer in range(self.num_layers):
          if self.virtual_node:
              # messages from virtual nodes to graph nodes
              virtual_hn = dgl.broadcast_nodes(graph, virtual_emb)
              hn = hn + virtual_hn
  
          he = self.edge_encoders[layer](edge_feat)
          hn = self.conv_layers[layer](graph, hn, he)
          if layer != self.num_layers - 1:
              hn = F.relu(hn)
          hn = self.dropout(hn)
  
          if self.virtual_node and layer != self.num_layers - 1:
              # messages from graph nodes to virtual nodes
              virtual_emb_tmp = (
                  self.virtual_pool(graph, hn) + virtual_emb
              )
              virtual_emb = self.mlp_virtual[layer](virtual_emb_tmp)
              virtual_emb = self.dropout(F.relu(virtual_emb))
  
      hg = self.pool(graph, hn)
  
      return self.pred(hg)
  
file_path: dgl/dglgo/dglgo/model/graph_encoder/gin_ogbg.py
imports: import dgl
  import torch
  import torch.nn
  import torch.nn.functional
  from dgl.nn import AvgPooling, GINEConv, SumPooling
  from ogb.graphproppred.mol_encoder import AtomEncoder, BondEncoder
label_desc: Use image node_id 2 for calling the OGBGGIN obj's underlying member method code with example usage: obj.forward(graph, node_feat, edge_feat) and returns: self