Source code for quchip.engine.partitioned

"""Partition-aware dispatch for :func:`quchip.engine.simulate`.

Chip-structural logic lives in :mod:`quchip.chip.partition`; this module
only orchestrates: decide, split, run one pipeline per component, combine.
"""

from __future__ import annotations

from collections.abc import Mapping
from typing import Any


[docs] def maybe_simulate_partitioned( chip: Any, drive_ops: list, tlist: Any, *, solver: str | None, options: dict | None, e_ops: dict | None, initial_state: Any | None, check_truncation: bool, truncation_threshold: float, ) -> Any | None: """Run per-component solves when the chip splits; ``None`` declines to the joint path.""" if initial_state is not None and not isinstance(initial_state, Mapping): return None part = chip.partition() if part.is_trivial: return None from quchip.chip.partition import split_drive_ops, split_e_ops, split_state_mapping from quchip.engine import simulate from quchip.results.partitioned import PartitionedSimulationResult per_ops = split_drive_ops(part, chip, drive_ops) per_eops, key_plan = split_e_ops(part, e_ops) per_state = ( split_state_mapping(part, initial_state) if initial_state is not None else [None] * len(part) ) results = [] for comp, ops_i, eops_i, state_i in zip(part.components, per_ops, per_eops, per_state): results.append(simulate( comp.chip, ops_i, tlist, solver=solver, options=options, e_ops=eops_i or None, initial_state=state_i, check_truncation=check_truncation, truncation_threshold=truncation_threshold, partition=False, )) return PartitionedSimulationResult(results, part, key_plan)