Wave 1 deterministic representation search for Qiskit.
westquant-qiskit searches the compilation representation, not only compiler
parameters. A logical circuit is compiled through a reproducible grid of Qiskit
pipeline choices and every success, failure, metric delta, and verification
outcome is written to RepGraph/WQT-ready records.
The first deterministic engine searches the Cartesian product of:
- optimization level:
0, 1, 2, 3 - layout:
trivial, dense, sabre - routing:
basic, lookahead, sabre - translation:
translator, synthesis - fixed transpiler seeds
- approximation degree
The default training grid with three seeds contains 216 pipeline representations per circuit. This is intentionally deterministic: the same circuit, target, search-space version, and seeds reproduce the candidate set.
pip install -e ../westquant-core
pip install -e .
python -m westquant_qiskit.cli --suite smoke --output results/qiskit-smokeA larger local data-generation suite:
python -m westquant_qiskit.cli \
--suite train \
--seed-count 3 \
--output results/qiskit-trainEach challenge writes:
summary.json
repgraph.json
training.jsonl
training.jsonl is the primary WQT20 precursor format. Each row contains the
logical baseline metrics, one pipeline choice, compilation success/failure,
conservative equivalence verification, resulting metrics, metric deltas,
compile cost, Pareto membership, and rank.
WestQuant does not silently call a candidate equivalent. For small unitary
circuits of equal width, v0.1 uses
qiskit.quantum_info.Operator.from_circuit(...).equiv(...), which accounts for
stored transpiler layouts. Circuits that cannot be checked under that regime
are labeled UNKNOWN, not EXACT.
Candidates are Pareto-compared by minimizing:
- two-qubit gate count
- SWAP count
- depth
- circuit size
- compile time
The lexicographic best is used only as a transparent deterministic default;
the full Pareto front and all losing candidates remain in the dataset.
The package registers westquant as a Qiskit transpiler stage plugin for the
layout, routing and optimization stages:
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
pm = generate_preset_pass_manager(
optimization_level=2, backend=backend, seed_transpiler=7,
layout_method="westquant", routing_method="westquant", optimization_method="westquant",
)
tqc = pm.run(qc)
print(pm.property_set["westquant_selection"])Each stage is a deterministic best-of selection among Qiskit's own built-in
strategies (layout: trivial/dense/sabre; routing: SabreSwap/BasicSwap/
LookaheadSwap; optimization: levels 0-3), scored by two-qubit cost (SWAP = 3)
and then depth. Every candidate, including failures and their error messages,
is recorded in property_set["westquant_selection"]; if every candidate fails a
TranspilerError is raised. The routing stage only runs when the circuit is
not already mapped to the device. Tests check unitary equivalence, ideal output
distributions with measurements, coupling-map compliance and that the selected
candidate is the one returned. This is a best-of wrapper over Qiskit, not the
full sequential policy search described below.
Wave 1 now also includes a policy-style sequential search mode. Instead of choosing a complete compiler pipeline in one Cartesian-grid action, WestQuant chooses an ordered sequence:
layout -> routing -> translation -> optimization
Each partial prefix is evaluated through an end-to-end rollout with unchosen later stages set to Qiskit's explicit defaults. A beam retains the strongest states under the deterministic objective vector. This intentionally uses only public Qiskit APIs while producing WQT-ready state/action/reward trajectories.
westquant-qiskit-search \
--suite smoke \
--search sequential \
--beam-width 3 \
--output results/qiskit-sequentialEach challenge writes trajectory.jsonl in addition to summary.json and
repgraph.json. A row contains state_id, stage, action, prefix before and
after the action, rollout pipeline, verification, metrics, reward vector,
baseline delta, and whether the state survived the beam.
Generate a frozen balanced manifest:
westquant-qiskit-1000 --output results/wq-qiskit-sequential-1000 --manifest-onlyPilot 25 challenges:
westquant-qiskit-1000 --output results/wq-qiskit-sequential-1000 --beam-width 3 --limit 25Run/resume the full 1000:
westquant-qiskit-1000 --output results/wq-qiskit-sequential-1000 --beam-width 3Regenerate statistics from raw saved outputs only:
westquant-qiskit-1000 --output results/wq-qiskit-sequential-1000 --stats-onlySee docs/SEQUENTIAL-1000.md for the frozen design and failure-retention policy.