code: def find_measurable_specify_shapes(
      fgraph, node
  ) -> Optional[List[MeasurableSpecifyShape]]:
      r"""Finds `SpecifyShapeOp`\s for which a `logprob` can be computed."""
  
      if isinstance(node.op, MeasurableSpecifyShape):
          return None  # pragma: no cover
  
      rv_map_feature: Optional[PreserveRVMappings] = getattr(
          fgraph, "preserve_rv_mappings", None
      )
  
      if rv_map_feature is None:
          return None  # pragma: no cover
  
      rv = node.outputs[0]
  
      base_rv, *shape = node.inputs
  
      if not (
          base_rv.owner
          and isinstance(base_rv.owner.op, MeasurableVariable)
          and base_rv not in rv_map_feature.rv_values
      ):
          return None  # pragma: no cover
  
      new_op = MeasurableSpecifyShape()
      new_rv = new_op.make_node(base_rv, *shape).default_output()
  
      return [new_rv]
  
file_path: pymc/pymc/logprob/checks.py
imports: from typing import List, Optional
  import pytensor.tensor
  from pytensor.graph.rewriting.basic import node_rewriter
  from pytensor.raise_op import CheckAndRaise
  from pytensor.tensor.shape import SpecifyShape
  from pymc.logprob.abstract import MeasurableVariable, _logprob, _logprob_helper
  from pymc.logprob.rewriting import PreserveRVMappings, measurable_ir_rewrites_db
  from pymc.logprob.utils import replace_rvs_by_values
label_desc: Use image node_id 2 for calling a global function with example usage: find_measurable_specify_shapes(fgraph, node) and returns: list, None, None, None