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: Import a `Variable` into this `FunctionGraph`.
  
  This will import the `var`'s `Apply` node and inputs.
  
  Parameters
  ----------
  variable : pytensor.graph.basic.Variable
      The variable to be imported.
  reason : str
      The name of the optimization or operation in progress.
  import_missing : bool
      Add missing inputs instead of raising an exception.
docstr_tok: ["Import","a","`","Variable","`","into","this","`","FunctionGraph","`",".","This","will","import","the","`","var","`","'s","`","Apply","`","node","and","inputs",".","Parameters","--","--","--","--","--","variable",":","pytensor.graph.basic.Variable","The","variable","to","be","imported",".","reason",":","str","The","name","of","the","optimization","or","operation","in","progress",".","import_missing",":","bool","Add","missing","inputs","instead","of","raising","an","exception","."]
code: def import_var(
      self,
      var: Variable,
      reason: Optional[str] = None,
      import_missing: bool = False,
  ) -> None:
      """Import a `Variable` into this `FunctionGraph`.
  
      This will import the `var`'s `Apply` node and inputs.
  
      Parameters
      ----------
      variable : pytensor.graph.basic.Variable
          The variable to be imported.
      reason : str
          The name of the optimization or operation in progress.
      import_missing : bool
          Add missing inputs instead of raising an exception.
  
      """
      # Imports the owners of the variables
      if var.owner and var.owner not in self.apply_nodes:
          self.import_node(
              var.owner, reason=reason, import_missing=import_missing
          )
      elif (
          var.owner is None
          and not isinstance(var, AtomicVariable)
          and var not in self.inputs
      ):
          from pytensor.graph.null_type import NullType
  
          if isinstance(var.type, NullType):
              raise TypeError(
                  f"Computation graph contains a NaN. {var.type.why_null}"
              )
          if import_missing:
              self.add_input(var)
          else:
              raise MissingInputError(
                  f"Undeclared input: {var}", variable=var
              )
      self.setup_var(var)
      self.variables.add(var)
  
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 8 for calling the FunctionGraph obj's underlying member method code with example usage: obj.import_var(var, reason, import_missing) without return types