class_docstr: Duck-typed version of the DGLHeteroGraph class made for cuGraph
  for storing graph structure and node/edge feature data.
  
  This object is wrapper around cugraph's Multi GPU MultiGraph and returns samples
  that conform with `DGLHeteroGraph`
  See: https://docs.rapids.ai/api/cugraph/nightly/api_docs/cugraph_dgl.html
class_docstr_tok: ["Duck-typed","version","of","the","DGLHeteroGraph","class","made","for","cuGraph","for","storing","graph","structure","and","node\/edge","feature","data",".","This","object","is","wrapper","around","cugraph","'s","Multi","GPU","MultiGraph","and","returns","samples","that","conform","with","`","DGLHeteroGraph","`","See",":","https",":","\/\/docs.rapids.ai\/api\/cugraph\/nightly\/api_docs\/cugraph_dgl.html"]
docstr: Return a subgraph induced on given edges.
  This has the same semantics as ``dgl.edge_subgraph``.
  Parameters
  ----------
  edges : edges or dict[(str, str, str), edges]
      The edges to form the subgraph. The allowed edges formats are:
      * Int Tensor: Each element is an edge ID. The tensor must have the
        same device type and ID data type as the graph's.
      * iterable[int]: Each element is an edge ID.
      * Bool Tensor: Each :math:`i^{th}` element is a bool flag
       indicating whether edge :math:`i` is in the subgraph.
      If the graph is homogeneous, one can directly pass the above
      formats. Otherwise, the argument must be a dictionary with keys
      being edge types and values being the edge IDs in the above formats
  relabel_nodes : bool, optional
      If True, the extracted subgraph will only have the nodes in the
      specified node set and it will relabel the nodes in order.
  output_device : Framework-specific device context object, optional
      The output device.  Default is the same as the input graph.
  Returns
  -------
  DGLGraph
      The subgraph.
code: def edge_subgraph(
      self, edges, relabel_nodes=False, output_device=None
  ):
      """
      Return a subgraph induced on given edges.
      This has the same semantics as ``dgl.edge_subgraph``.
      Parameters
      ----------
      edges : edges or dict[(str, str, str), edges]
          The edges to form the subgraph. The allowed edges formats are:
          * Int Tensor: Each element is an edge ID. The tensor must have the
            same device type and ID data type as the graph's.
          * iterable[int]: Each element is an edge ID.
          * Bool Tensor: Each :math:`i^{th}` element is a bool flag
           indicating whether edge :math:`i` is in the subgraph.
          If the graph is homogeneous, one can directly pass the above
          formats. Otherwise, the argument must be a dictionary with keys
          being edge types and values being the edge IDs in the above formats
      relabel_nodes : bool, optional
          If True, the extracted subgraph will only have the nodes in the
          specified node set and it will relabel the nodes in order.
      output_device : Framework-specific device context object, optional
          The output device.  Default is the same as the input graph.
      Returns
      -------
      DGLGraph
          The subgraph.
      """
      raise NotImplementedError("edge_subgraph is not implemented yet")
  
imports: from __future__ import annotations
  from typing import Optional, Sequence, Tuple, Dict, Union
  from functools import cached_property
  from cugraph.utilities.utils import import_optional, MissingModule
  from cugraph.gnn import FeatureStore
  from cugraph.gnn.dgl_extensions.dgl_uniform_sampler import DGLUniformSampler
  import cudf
  import dask_cudf
  import cupy
  from cugraph_dgl.utils.cugraph_storage_utils import _assert_valid_canonical_etype, backend_dtype_to_np_dtype_dict, add_edge_ids_to_edges_dict, add_node_offset_to_edges_dict
  from cugraph_dgl.utils.feature_storage import dgl_FeatureStorage
label_desc: Use image node_id 6 for calling the CuGraphStorage obj's underlying member method code with example usage: obj.edge_subgraph(edges, relabel_nodes, output_device) without return types