code: def forward(self, g, x, edge_attr):
      with g.local_scope():
          x = self.linear(x)
          edge_embedding = self.bond_encoder(edge_attr)
  
          # Molecular graphs are undirected
          # g.out_degrees() is the same as g.in_degrees()
          degs = (g.out_degrees().float() + 1).to(x.device)
          norm = torch.pow(degs, -0.5).unsqueeze(-1)  # (N, 1)
          g.ndata["norm"] = norm
          g.apply_edges(fn.u_mul_v("norm", "norm", "norm"))
  
          g.ndata["x"] = x
          g.apply_edges(fn.copy_u("x", "m"))
          g.edata["m"] = g.edata["norm"] * F.relu(
              g.edata["m"] + edge_embedding
          )
          g.update_all(fn.copy_e("m", "m"), fn.sum("m", "new_x"))
          out = g.ndata["new_x"] + F.relu(
              x + self.root_emb.weight
          ) * 1.0 / degs.view(-1, 1)
  
          return out
  
imports: import dgl
  import dgl.function
  import torch
  import torch.nn
  import torch.nn.functional
  from dgl.nn.pytorch import SumPooling
  from ogb.graphproppred.mol_encoder import AtomEncoder, BondEncoder
label_desc: Use image node_id 2 for calling the GCNConv obj's underlying member method code with example usage: obj.forward(g, x, edge_attr) and returns: out