code: def __add_subtoken_vocab_nodes(
      cls, graph: GraphData[Tuple[str, bool]]
  ) -> None:
      all_token_nodes = set(chain(*graph.edges["NextToken"]))
  
      subtoken_edges: List[Tuple[int, int]] = []
      subtoken_node_ids: Dict[str, int] = {}
  
      for token_node_idx in all_token_nodes:
          token_text = graph.node_information[token_node_idx][0]
          if not cls.IDENTIFIER_REGEX.match(token_text):
              continue
          for subtoken in split_identifier_into_parts(token_text):
              subtoken_node_idx = subtoken_node_ids.get(subtoken)
              if subtoken_node_idx is None:
                  subtoken_node_idx = len(graph.node_information)
                  graph.node_information.append((subtoken, False))
                  subtoken_node_ids[subtoken] = subtoken_node_idx
  
              subtoken_edges.append((subtoken_node_idx, token_node_idx))
  
      graph.edges["SubtokenOf"] = subtoken_edges
  
imports: from typing_extensions import Final, TypedDict
  import re
  import torch
  from dpu_utils.codeutils import split_identifier_into_parts
  from itertools import chain
  from torch import nn
  from torch_scatter import scatter_log_softmax, scatter_max
  from typing import Any, Dict, Iterator, List, NamedTuple, Optional, Tuple, Union
  from ptgnn.baseneuralmodel import AbstractNeuralModel, ModuleWithMetrics
  from ptgnn.neuralmodels.gnn.graphneuralnetwork import GraphNeuralNetwork, GraphNeuralNetworkModel
  from ptgnn.neuralmodels.gnn.structs import GnnOutput, GraphData, TensorizedGraphData
label_desc: Use image node_id 2 for calling the VarMisuseModel obj's underlying member method code with example usage: obj.__add_subtoken_vocab_nodes(cls, graph) without return types