class_docstr: Class used during heterogeneous sampling.
  1) The nodes to serve as source nodes in the next layer.
  2) The nodes with duplicates that are further needed to create COO output.
  3) The output nodes without duplicates.
code: def __init__(self, node_types, num_hops):
      self.src: Dict[NodeType, List[Tensor]] = {
          k: (num_hops + 1) * [torch.empty(0, dtype=torch.int64)]
          for k in node_types
      }
      self.with_dupl: Dict[NodeType, Tensor] = {
          k: torch.empty(0, dtype=torch.int64) for k in node_types
      }
      self.out: Dict[NodeType, Tensor] = {
          k: torch.empty(0, dtype=torch.int64) for k in node_types
      }
      self.seed_time: Dict[NodeType, List[Tensor]] = {
          k: num_hops * [torch.empty(0, dtype=torch.int64)]
          for k in node_types
      }
  
file_path: pytorch_geometric/torch_geometric/distributed/utils.py
imports: from typing import Dict, List, Optional, Tuple, Union
  import numpy
  import torch
  from torch import Tensor
  from torch_geometric.data import HeteroData
  from torch_geometric.distributed import LocalFeatureStore, LocalGraphStore
  from torch_geometric.sampler import SamplerOutput
  from torch_geometric.typing import EdgeType, NodeType
label_desc: Use image node_id 1 to create a new NodeDict object  with example: obj = NodeDict(node_types, num_hops)