docstr: Parameters
  ----------
  g : DGLGraph
      Input graph.
  inputs : dict[str, torch.Tensor]
      Node feature for each node type.
  
  Returns
  -------
  dict[str, torch.Tensor]
      New node features for each node type.
docstr_tok: ["Parameters","--","--","--","--","--","g",":","DGLGraph","Input","graph",".","inputs",":","dict","[","str",",","torch.Tensor","]","Node","feature","for","each","node","type",".","Returns","--","--","--","-","dict","[","str",",","torch.Tensor","]","New","node","features","for","each","node","type","."]
code: def forward(self, g, inputs):
      """
      Parameters
      ----------
      g : DGLGraph
          Input graph.
      inputs : dict[str, torch.Tensor]
          Node feature for each node type.
  
      Returns
      -------
      dict[str, torch.Tensor]
          New node features for each node type.
      """
      g = g.local_var()
      wdict = {
          rel_name: {"weight": self.weight[rel_name].weight.T}
          for rel_name in self.rel_names
      }
  
      inputs_dst = {
          k: v[: g.number_of_dst_nodes(k)] for k, v in inputs.items()
      }
  
      hs = self.conv(g, inputs, mod_kwargs=wdict)
  
      def _apply(ntype, h):
          h = h + self.loop_weights[ntype](inputs_dst[ntype])
          if self.activation:
              h = self.activation(h)
          return self.dropout(h)
  
      return {ntype: _apply(ntype, h) for ntype, h in hs.items()}
  
imports: import argparse
  import itertools
  import sys
  import dgl
  import dgl.nn
  import psutil
  import torch
  import torch.nn
  import torch.nn.functional
  from dgl import AddReverse, Compose, ToSimple
  from dgl.nn import HeteroEmbedding
  from ogb.nodeproppred import DglNodePropPredDataset, Evaluator
  from tqdm import tqdm
label_desc: Use image node_id 3 for calling the RelGraphConvLayer obj's underlying member method code with example usage: obj.forward(g, inputs) and returns: unknown, self