class_docstr: The data type a sampler is operating on.
code: def from_data(cls, data: Any):
      if isinstance(data, Data):
          return cls.homogeneous
      elif isinstance(data, HeteroData):
          return cls.heterogeneous
      elif (
          isinstance(data, (list, tuple))
          and len(data) == 2
          and isinstance(data[0], FeatureStore)
          and isinstance(data[1], GraphStore)
      ):
          return cls.remote
  
      raise ValueError(
          f"Expected a 'Data', 'HeteroData', or a tuple of "
          f"'FeatureStore' and 'GraphStore' "
          f"(got '{type(data)}')"
      )
  
imports: import copy
  import math
  import warnings
  from abc import ABC
  from collections import defaultdict
  from dataclasses import dataclass
  from enum import Enum
  from typing import Any, Dict, List, Optional, Union
  import torch
  from torch import Tensor
  from torch_geometric.data import Data, FeatureStore, GraphStore, HeteroData
  from torch_geometric.sampler.utils import to_bidirectional
  from torch_geometric.typing import EdgeType, EdgeTypeStr, NodeType, OptTensor
  from torch_geometric.utils.mixin import CastMixin
label_desc: Use image node_id 1 for calling the DataType obj's underlying member method code with example usage: obj.from_data(cls, data) and returns: cls, cls, cls