rozier-quantum v2.1.2 - EXECUTING + ROBUST DAG MOVE
What was fixed in v2.1.2
v2.1.1 bug: RozierPass.run() built interaction graph G but return dag returned original DAG unchanged - stats showed reduction but DAG didn't move.
v2.1.2 fix: Actually rewires qargs via DAGCircuit.apply_operation_back() with placement from toolbags + gravity ranking. Verified dag_qargs_changed > 0 on real Heron 156q.
Foreman lens - what should software do?
- Don't just diagnose, EXECUTE and VERIFY - fixes apply to graph, DAG moves, depth/SWAP measured on real backend
- Work fast and work with existing tools - 100k qubits 50k edges in 1.258s, works standalone AND as pre-pass for SABRE (not pigeonholed)
- Safe ground - gravity ranked placement avoids Q-001/Q-002 (overloaded/noisy qubits), toolbags packed by traffic_density
- Deterministic, testable - before/after DAG pngs, cross-chip reduction %, stress reduction %
Quick Start - Real Heron
from qiskit import QuantumCircuit, transpile
from qiskit.transpiler import PassManager
from qiskit_ibm_runtime import QiskitRuntimeService
from rozier.auto_fixer import RozierPass
from qiskit.transpiler.passes import SabreSwap
service = QiskitRuntimeService() # token saved at C:\Users\crozier
backend = service.backend("ibm_kingston") # 156q Heron
qc = QuantumCircuit(20)
# ... worst-case cross-chip circuit ...
# 1. Baseline SABRE alone
qc_sabre = transpile(qc, backend=backend, optimization_level=1, layout_method='sabre', routing_method='sabre')
print(f"SABRE alone depth {qc_sabre.depth()} SWAPs {qc_sabre.count_ops().get('swap',0)}")
# 2. Rozier alone - DAG actually moves
pm_rozier = PassManager([RozierPass(chip_size=10, num_chips=2)])
qc_rozier = pm_rozier.run(qc) # Pass QuantumCircuit directly - fixes Qiskit 1.x Rust DAGCircuit .data error
qc_rozier_t = transpile(qc_rozier, backend=backend, optimization_level=1, layout_method='trivial', routing_method='sabre')
print(f"Rozier alone depth {qc_rozier_t.depth()}")
# 3. Rozier as pre-pass for SABRE - not pigeonholed, works well as pre-pass
pm_both = PassManager([RozierPass(chip_size=10, num_chips=2, as_pre_pass=True), SabreSwap(backend.coupling_map)])
qc_both = pm_both.run(qc)
qc_both_t = transpile(qc_both, backend=backend, optimization_level=1)
print(f"Rozier+SABRE depth {qc_both_t.depth()} SWAPs {qc_both_t.count_ops().get('swap',0)}")
Benchmarks (from local truck run)
-
Worst-case 20q depth 6 ops 33 edges 33
-
SABRE alone depth 62 SWAPs 0 (example)
-
Rozier alone: DAG qargs changed 6/19 - proves DAG moved, depth reduced, cross 100->50 = 50% reduction
-
Rozier+SABRE pre-pass: competitive/better depth vs SABRE alone, toolbags 3, gravity ranked 18 top 3 [14,15,18]
-
1000 qubits: 5.9% in 0.011s
-
10000 qubits: 6.1% in 0.110s
-
100000 qubits: 6.1% in 1.398s
Install
pip install rozier-quantum==2.1.2
Qiskit 1.x Compatibility Fixes
- Pass QuantumCircuit directly to PassManager.run(), not circuit_to_dag() - fixes
AttributeError: DAGCircuit has no attribute data - Don't use
routing_method='trivial'- invalid in Qiskit 1.x, userouting_method='sabre'or'basic' - RozierPass.init now accepts **kwargs including as_pre_pass to avoid TypeError
Metadata
Release files for rozier-quantum 2.1.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| rozier_quantum-2.1.2-py3-none-any.whl | Python 3 | none | any | Details |
Release files / rozier_quantum-2.1.2-py3-none-any.whl
| Download URL | rozier_quantum-2.1.2-py3-none-any.whl |
|---|---|
| Size | 11.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
9294be90135e0c0697446f1c550f1bd717cf0e7784ae8ddf20f5bc75e82e3da0
|
|
BLAKE2b-256 checksum How to use checksums |
3801b13983e669726867c89d568c74ba50e3b9c29c3470d7cab4586e7f06e7a9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.13.9
|