code: def forward(self, *args):
      # Validate args:
      if self.mask_type == MaskLevelType.node:
          assert len(args) >= self.num_node_types + 1
          len_remaining_args = len(args) - (self.num_node_types + 1)
      elif self.mask_type == MaskLevelType.edge:
          assert len(args) >= self.num_edge_types + 2
          len_remaining_args = len(args) - (self.num_edge_types + 2)
      else:
          assert (
              len(args) >= self.num_node_types + self.num_edge_types + 1
          )
          len_remaining_args = len(args) - (
              self.num_node_types + self.num_edge_types + 1
          )
  
      # Get main args:
      (
          x_dict,
          edge_index_dict,
          edge_mask_dict,
      ) = self._captum_data_to_hetero_data(*args)
  
      if self.mask_type.with_edge:
          set_hetero_masks(self.model, edge_mask_dict, edge_index_dict)
  
      if len_remaining_args > 0:
          # If there are args other than `x_dict` and `edge_index_dict`
          x = self.model(
              x_dict, edge_index_dict, *args[-len_remaining_args:]
          )
      else:
          x = self.model(x_dict, edge_index_dict)
  
      return self.postprocess(x)
  
imports: from enum import Enum
  from typing import Dict, Optional, Tuple, Union
  import torch
  from torch import Tensor
  from torch_geometric.explain.algorithm.utils import clear_masks, set_hetero_masks, set_masks
  from torch_geometric.explain.config import ModelConfig, ModelMode, ModelReturnType
  from torch_geometric.typing import EdgeType, Metadata, NodeType
label_desc: Use image node_id 3 for calling the CaptumHeteroModel obj's underlying member method code with example usage: obj.forward() and returns: self