class_docstr: An `Op` that provides conditional graph evaluation.
  
  According to a scalar condition, this `Op` evaluates and then
  returns all the tensors provided on the "then"-branch, otherwise it
  evaluates and returns the tensors provided on the "else"-branch. The `Op`
  supports multiple tensors on each branch, with the condition that the same
  number of tensors are on the "then"-branch as on the "else"-branch and
  there is a one to one correspondence between their dtypes and numbers of
  dimensions.
  
  The "then"-branch is defined as the first ``N`` tensors (after the
  condition), while the "else"-branch is defined as the last ``N`` tensors.
  
  Example usage:
  
  .. code-block::
  
      rval = ifelse(condition,
                    rval_if_true_1, ..., rval_if_true_N,
                    rval_if_false_1, ..., rval_if_false_N)
  
  .. note:
  
      `Linker`\s other than `CVM`, and some other `VM` subclasses, are
      incompatible with this `Op`, and will ignore its lazy characteristic,
      computing both the true and false branches before returning one.
code: def __hash__(self):
      return hash((type(self), self.as_view, self.n_outs))
  
imports: from collections.abc import Sequence
  from copy import deepcopy
  from typing import TYPE_CHECKING, Any, Optional, Union
  import numpy
  import pytensor.tensor
  from pytensor import as_symbolic
  from pytensor.compile import optdb
  from pytensor.configdefaults import config
  from pytensor.graph.basic import Apply, Variable, apply_depends_on
  from pytensor.graph.op import _NoPythonOp
  from pytensor.graph.replace import clone_replace
  from pytensor.graph.rewriting.basic import GraphRewriter, in2out, node_rewriter
  from pytensor.graph.type import HasDataType, HasShape
  from pytensor.tensor.shape import Reshape, Shape, SpecifyShape, Unbroadcast
label_desc: Use image node_id 3 for calling the IfElse obj's underlying member method code with example usage: obj.__hash__() and returns: hash