code: def forward(self, x, edge_index, batch=None, edge_label_index=None):
      x = self.conv1(x, edge_index).relu()
      x = self.conv2(x, edge_index)
  
      if self.model_config.task_level == ModelTaskLevel.graph:
          x = global_add_pool(x, batch)
      elif self.model_config.task_level == ModelTaskLevel.edge:
          assert edge_label_index is not None
          x = x[edge_label_index[0]] * x[edge_label_index[1]]
  
      if self.model_config.mode == ModelMode.binary_classification:
          if self.model_config.return_type == ModelReturnType.probs:
              x = x.sigmoid()
      elif (
          self.model_config.mode == ModelMode.multiclass_classification
      ):
          if self.model_config.return_type == ModelReturnType.probs:
              x = x.softmax(dim=-1)
          elif (
              self.model_config.return_type == ModelReturnType.log_probs
          ):
              x = x.log_softmax(dim=-1)
  
      return x
  
file_path: pytorch_geometric/test/explain/algorithm/test_gnn_explainer.py
imports: import pytest
  import torch
  from torch_geometric.explain import Explainer, GNNExplainer
  from torch_geometric.explain.config import ExplanationType, MaskType, ModelConfig, ModelMode, ModelReturnType, ModelTaskLevel
  from torch_geometric.nn import AttentiveFP, ChebConv, GCNConv, global_add_pool
label_desc: Use image node_id 2 for calling the GCN obj's underlying member method code with example usage: obj.forward(x, edge_index, batch, edge_label_index) and returns: x