class_docstr: A `FunctionGraph` represents a subgraph bound by a set of input variables and
  a set of output variables, ie a subgraph that specifies an PyTensor function.
  The inputs list should contain all the inputs on which the outputs depend.
  `Variable`\s of type `Constant` are not counted as inputs.
  
  The `FunctionGraph` supports the replace operation which allows to replace
  a variable in the subgraph by another, e.g. replace ``(x + x).out`` by
  ``(2 * x).out``. This is the basis for optimization in PyTensor.
  
  This class is also responsible for verifying that a graph is valid
  (ie, all the dtypes and broadcast patterns are compatible with the
  way the `Variable`\s are used) and for tracking the `Variable`\s with
  a :attr:`FunctionGraph.clients` ``dict`` that specifies which `Apply` nodes
  use the `Variable`.  The :attr:`FunctionGraph.clients` field, combined with
  the :attr:`Variable.owner` and each :attr:`Apply.inputs`, allows the graph
  to be traversed in both directions.
  
  It can also be extended with new features using
  :meth:`FunctionGraph.attach_feature`.  See `Feature` for event types and
  documentation.  Extra features allow the `FunctionGraph` to verify new
  properties of a graph as it is optimized.
  
  The constructor creates a `FunctionGraph` which operates on the subgraph
  bound by the inputs and outputs sets.
  
  This class keeps lists for the inputs and outputs and modifies them
  in-place.
docstr: Clone the graph and return a ``dict`` that maps old nodes to new nodes.
  
  Parameters
  ----------
  check_integrity
      Whether or not to check the resulting graph's integrity.
  attach_feature
      Whether or not to attach `self`'s features to the cloned graph.
  
  Returns
  -------
  e
      The cloned `FunctionGraph`. Every node in the cloned graph is cloned.
  equiv
      A ``dict`` that maps old nodes to the new nodes.
docstr_tok: ["Clone","the","graph","and","return","a","``","dict","``","that","maps","old","nodes","to","new","nodes",".","Parameters","--","--","--","--","--","check_integrity","Whether","or","not","to","check","the","resulting","graph","'s","integrity",".","attach_feature","Whether","or","not","to","attach","`","self","`","'s","features","to","the","cloned","graph",".","Returns","--","--","--","-","e","The","cloned","`","FunctionGraph","`",".","Every","node","in","the","cloned","graph","is","cloned",".","equiv","A","``","dict","``","that","maps","old","nodes","to","the","new","nodes","."]
code: def clone_get_equiv(
      self,
      check_integrity: bool = True,
      attach_feature: bool = True,
      **kwargs,
  ) -> tuple[
      "FunctionGraph",
      dict[Union[Apply, Variable, "Op"], Union[Apply, Variable, "Op"]],
  ]:
      """Clone the graph and return a ``dict`` that maps old nodes to new nodes.
  
      Parameters
      ----------
      check_integrity
          Whether or not to check the resulting graph's integrity.
      attach_feature
          Whether or not to attach `self`'s features to the cloned graph.
  
      Returns
      -------
      e
          The cloned `FunctionGraph`. Every node in the cloned graph is cloned.
      equiv
          A ``dict`` that maps old nodes to the new nodes.
      """
      equiv = clone_get_equiv(self.inputs, self.outputs, **kwargs)
  
      e = FunctionGraph(
          [cast(Variable, equiv[i]) for i in self.inputs],
          [cast(Variable, equiv[o]) for o in self.outputs],
          clone=False,
          update_mapping=self.update_mapping,
      )
  
      if check_integrity:
          e.check_integrity()
  
      if attach_feature:
          for feature in self._features:
              e.attach_feature(feature.clone())
      return e, equiv
  
imports: import time
  from collections import OrderedDict
  from collections.abc import Iterable, Sequence
  from typing import TYPE_CHECKING, Any, Literal, Optional, Union, cast
  import pytensor
  from pytensor.configdefaults import config
  from pytensor.graph.basic import Apply, AtomicVariable, Variable, applys_between, clone_get_equiv, graph_inputs, io_toposort, vars_between
  from pytensor.graph.basic import as_string
  from pytensor.graph.features import AlreadyThere, Feature, ReplaceValidate
  from pytensor.graph.utils import MetaObject, MissingInputError, TestValueError
  from pytensor.misc.ordered_set import OrderedSet
label_desc: Use image node_id 26 for calling the FunctionGraph obj's underlying member method code with example usage: obj.clone_get_equiv(check_integrity, attach_feature) and returns: e,  equiv