code: def forward(self, graph, features):
      h = features
      if self.use_mlp:
          if self.join_with_mlp:
              h = torch.cat((h, self.mlp(features)), 1)
          else:
              h = self.mlp(features)
      if self.name == "gat":
          h = self.l1(graph, h).flatten(1)
          logits = self.l2(graph, h).mean(1)
      elif self.name in ["appnp"]:
          h = self.lin1(h)
          logits = self.l1(graph, h)
      elif self.name == "agnn":
          h = self.lin1(h)
          h = self.l1(graph, h)
          h = self.l2(graph, h)
          logits = self.lin2(h)
      elif self.name == "che3b":
          lambda_max = dgl.laplacian_lambda_max(graph)
          h = self.drop(h)
          h = self.l1(graph, h, lambda_max)
          logits = self.l2(graph, h, lambda_max)
      elif self.name == "gcn":
          h = self.drop(h)
          h = self.l1(graph, h)
          logits = self.l2(graph, h)
  
      return logits
  
file_path: dgl/examples/pytorch/bgnn/run.py
imports: import json
  import os
  import numpy
  import pandas
  import torch
  import torch.nn.functional
  from BGNN import BGNNPredictor
  from category_encoders import CatBoostEncoder
  from dgl.data.utils import load_graphs
  from dgl.nn.pytorch import AGNNConv, APPNPConv, ChebConv, GATConv, GraphConv
  from sklearn import preprocessing
  from torch.nn import Dropout, ELU, Linear, ReLU, Sequential
label_desc: Use image node_id 2 for calling the GNNModelDGL obj's underlying member method code with example usage: obj.forward(graph, features) and returns: logits