code: def forward(self, graph):
      ea = graph.edge_feat["feat"]
  
      multi_hop_graph = graph.multi_hop_graphs
  
      h = graph.node_feat["atom_feat"]
      if self.virtual_node:
          if self.conv_type == "gin+":
              h[0] = h[0] + paddle.gather(
                  graph.virtual_node, graph.graph_node_id
              )
          else:
              h = h + paddle.gather(virtual_node, graph.graph_node_id)
  
      if self.conv_type == "gcn":
          H = self.conv(graph, h)
      elif self.conv_type == "gin+":
          H = self.conv(multi_hop_graph, h, self.edge_embed(ea))
  
      if self.conv_type == "gin+":
          h = H[0]
      else:
          h = H
      h = self.norm(h)
      if not self.last_layer:
          h = self.act(h)
      h = F.dropout(h, self.dropout_ratio, training=self.training)
  
      if self.virtual_node and self.virtual_node_agg:
          v = self.vn_aggregator(
              graph.virtual_node, h, graph.graph_node_id
          )
          v = F.dropout(v, self.dropout_ratio, training=self.training)
          graph.virtual_node = v
  
      if self.conv_type == "gin+":
          H[0] = h
          h = H
      graph.node_feat["atom_feat"] = h
      return graph
  
imports: import paddle
  import paddle.nn
  import paddle.nn.functional
  import pgl
  import pgl.nn
  from pgl.nn import functional
  from mol_encoder import AtomEncoder, BondEncoder
label_desc: Use image node_id 2 for calling the ConvBlock obj's underlying member method code with example usage: obj.forward(graph) and returns: graph