Skip to main content

qb-compiler

Qiskit Ecosystem PyPI Python 3.10+ License Tests Coverage floor Docs

Quantum Execution Intelligence. Know before you run.


What is qb-compiler?

qb-compiler helps quantum developers make better execution decisions. Know which backend to use, whether your circuit is viable, what fidelity to expect, and what it will cost, before you spend QPU time.

Built on top of Qiskit's transpiler.

pip install qb-compiler

Quick Start

from qb_compiler import QBCompiler, check_viability

# Is my circuit worth running?
result = check_viability(circuit, backend="ibm_fez")
print(result)
# → Status: VIABLE
# → Est. fidelity: 0.847
# → Cost (4096 shots): $0.6554
# → Suggestions:
# →   - Circuit looks good, proceed with execution.

# Compile with automatic optimizations
compiler = QBCompiler.from_backend("ibm_fez")
compiled = compiler.compile(circuit)

v0.7: trust the number

Every estimate now tells you how much to trust it, the tool keeps receipts, and you can check it against hardware yourself.

What's new

capability what you get
Error budget preflight shows WHERE fidelity goes: two-qubit gates vs readout, pct of loss
Honest band every fidelity estimate carries a typical-error band with stated provenance
Calibration age preflight warns when its snapshot is stale, shows the age
Verify mode qbc verify: mirror-circuit check of the prediction, builds a local accuracy log
Receipts a passport per compile: versions, calibration age, prediction + band, error budget
Regression watch flags when YOUR circuit compiles worse than your own history, beyond noise
Best-of-N qb_transpile(n_seeds=5): seed sweep scored by calibrated fidelity, evidence attached
Fidelity per dollar qbc when: rank backends by predicted fidelity per dollar, with trend
Shot budgets how many shots to resolve your observable or error rate, before you pay
QEC preflight projected LER band + shot bill for a memory experiment, from calibration
Backend discovery rank whatever backends your own credentials expose
NVIDIA Ising onramp the only Qiskit-side bridge to the Ising decoder family, with telemetry

Fidelity estimate accuracy, measured on hardware

Predicted vs measured on IBM Fez (GHZ family, 4096 shots, March 2026):

circuit predicted measured delta
GHZ-5 (qb layout) 0.948 0.931 +0.017
GHZ-5 (qiskit layout) 0.947 0.920 +0.027
GHZ-8 (qb layout) 0.905 0.856 +0.049
GHZ-8 (qiskit layout) 0.905 0.863 +0.042
GHZ-10 (qb layout) 0.874 0.793 +0.081
GHZ-10 (qiskit layout) 0.874 0.808 +0.067

Median absolute error 0.045; the model runs optimistic by about +0.05 (it prices gate and readout error, not crosstalk or idle decoherence). That is why every estimate prints with a +-0.05 band and why qbc verify exists: check it on your own circuits, the log stays on your machine.

Example: a real run vs the projection

50,000-shot distance-3 surface code memory run on ibm_fez, April 2026:

LER
projected (uniform gate-error proxy at the day's calibration) 0.005 to 0.059
measured, full run 0.245
measured, first 25k shots 0.129
measured, second 25k shots 0.361

The device drifted 2.8x inside the job, and the proxy doesn't model crosstalk, leakage or drift, so the projection undershoots by 5-50x. This is the case the calibration age warning, the regression watch and verify mode exist for.

Notebooks 19 and 20 walk through everything with live outputs. Everything here is signals only, nothing gates or blocks your jobs.

CLI

qbc preflight. Should I run this?

$ qbc preflight circuit.qasm --backend ibm_fez

  Circuit: GHZ-8
  Backend: ibm_fez (156q)

  Status: VIABLE
  Estimated fidelity: 0.8519
  Depth: 12  (viable limit: 188)
  2Q gates: 7
  Cost (4096 shots): $0.6554

qbc analyze. Detailed analysis with suggestions

$ qbc analyze circuit.qasm --backend ibm_fez

  Circuit Analysis: QAOA-MaxCut
  Qubits: 6  Gates: 84  Depth: 47
  Gate breakdown: cx:24, rz:18, rx:12, h:6, measure:6

  Backend: ibm_fez (156q)
  Status: MARGINAL
  Estimated fidelity: 0.1823
  Signal/noise ratio: 11.7x
  Depth: 47  (viable limit: 188)
  2Q gates after transpilation: 24
  Cost (4096 shots): $0.6554

  Suggestions:
    - Consider ZNE or PEC error mitigation (2-5x improvement possible).
    - Good candidate for error mitigation to further improve results.

qbc diff. Compare two backends

$ qbc diff circuit.qasm --backend ibm_fez --vs ibm_torino

  Circuit: GHZ-5

                              ibm_fez        ibm_torino
                           ----------------   ----------------
  Status                          VIABLE           VIABLE
  Est. fidelity                  0.9430           0.9285 <
  2Q gates                            4                4
  Depth                               5                5
  Cost/4096 shots              $0.6554          $0.5734 <

  Recommendation: ibm_fez (+0.0145 fidelity)

qbc doctor. Environment health check

$ qbc doctor

qbc doctor

✔  qb-compiler 0.9.0
✔  Python 3.11.14
✔  Qiskit 1.4.5
✔  IBM credentials configured (2 account(s))
✔  9 backends configured
✔  5 calibration snapshot(s) available
✔  numpy 2.3.5
✔  rustworkx 0.17.1

Environment looks good!

qbc compile. Compile with receipt

$ qbc compile circuit.qasm --backend ibm_fez --receipt

Compiled: depth 12 -> 8 (33.3% reduction)
Estimated fidelity: 0.8519
Compilation time: 142.3 ms
Receipt saved to circuit.receipt.json

qbc dem-audit. QEC decoder-input correctness preflight (ObservableGate)

A stim Detector Error Model (DEM) error mechanism carries detectors, logical-observable masks, and a probability. If a DEM-to-matrix step merges mechanisms by detector signature alone, two mechanisms that are detector-identical but logical-distinct collapse and the logical mask is lost, which can inflate the logical error rate. dem-audit detects this before decoding (CI-safe exit codes), and dem-canonicalize writes an observable-preserving canonical form.

$ qbc dem-audit model.dem
ObservableGate DEM audit
  raw mechanisms             : 2
  unique detector signatures : 1
  unique detector+obs masks  : 2
  mixed detector groups      : 1
  status: FAIL
  recommendation: detector-identical mechanisms carry conflicting masks; canonicalize by
  (detectors, observables) or preserve P(L|H), never merge by detector alone.
# exit code: 0 = PASS, 1 = WARN (--strict), 2 = FAIL

$ qbc dem-canonicalize model.dem -o safe.dem

Scope (honest): standard production paths are safe: surface/repetition and the full bivariate-bicycle / Gross family ([[72,12,6]] … [[144,12,12]] … [[288,12,18]], X and Z basis) audit PASS; decomposed DEMs are XOR-benign. The hazard is real and measured on graphlike DEMs with genuine detector-identical / logical-distinct mechanisms. See docs/observablegate.md.

ObservableGate and its --json receipts are free and open source. Signed receipts, batch reports, shared dashboards, and CI policy bundles are part of QubitBoost Pro, see docs/open-core.md.


Feature Comparison

Feature Qiskit qb-compiler
Transpilation Excellent Uses Qiskit internally
Circuit viability check No qbc preflight
Pre-execution fidelity estimate No Yes
Backend recommendation No Yes
Selective dynamical decoupling No Yes
Cost estimation No Yes
Budget enforcement No Yes
Compilation receipts No --receipt
Multi-vendor backend specs IBM only IBM, Rigetti, IonQ, IQM, Quantinuum
Environment health check No qbc doctor
Circuit analysis with suggestions No qbc analyze
Backend comparison No qbc diff

Hardware Validation

Validated on IBM Fez (156 qubits, March 2026). All results are measured fidelity from real hardware, 4096 shots per circuit.

Layout Selection. GHZ Circuits

qb-compiler's CalibrationMapper (post-routing scoring, multi-region search) vs Qiskit transpile optimization_level=3. Both use Qiskit's SabreSwap for routing, the only difference is initial qubit placement.

Circuit Qiskit qb-compiler Delta Notes
GHZ-3 96.5% 96.7% +0.2% Both find optimal region
GHZ-5 92.5% 93.2% +0.7% Different regions selected
GHZ-8 82.1% 87.5% +5.3% Best result, region 120-143
GHZ-10 78.8% 79.8% +1.0% Region 120-147

Fidelity = P(000...0) + P(111...1) over 4096 shots.

Results vary by calibration window. In runs where both mappers converge on the same optimal region (identical qubit selection), results are statistically equivalent. Improvement is largest when qb-compiler discovers a better region than Qiskit's default search.

Dynamical Decoupling

Selective DD applied after Qiskit routing. DD is automatically skipped for dense circuits where it adds noise without benefit.

Circuit Without DD With DD Delta Notes
GHZ-8 83.5% 83.6% +0.1% Minimal idle time
QFT-6 2.1% 2.6% +27% rel. Long idle periods. DD helps
QAOA-6 5.9% 5.5% -6.6% rel. Dense circuit. DD skipped in v0.2.1

QFT-6 and QAOA-6 base fidelities are in the noise floor (circuit depth exceeds viable limit). qbc preflight would flag these as DO NOT RUN, saving QPU time.

Journey to These Results

These results followed an iterative hardware validation process:

  1. Initial mapper lost to Qiskit by up to 10.6% (pre-routing scoring flaw)
  2. Post-routing scoring fix closed the gap
  3. Multi-region search + routed fidelity tiebreaker achieved positive results
  4. Qiskit seed injection ensures qb-compiler never selects a worse layout than Qiskit's own best

All raw validation data is in the results/ directory. Reproduce: python scripts/hardware_validation.py --dry-run

Full walkthrough: docs/tutorials/hardware_validation_walkthrough.ipynb


How It Works

Your Circuit
  │
  ├─→ Viability Check         Is it worth running?
  │
  ├─→ Backend Selection        Where should it run?
  │
  ├─→ Qiskit Transpilation     Best of N seeds, opt_level=3
  │
  ├─→ Selective DD             Protect idle qubits (skip dense circuits)
  │
  ├─→ Fidelity Estimation      What to expect
  │
  ├─→ Cost Estimation          What it will cost
  │
  └─→ Compilation Receipt      Full audit trail (JSON)

All transpilation uses Qiskit's routing engine internally. qb-compiler's value is in execution intelligence (preflight, viability, cost estimation) and calibration-aware layout selection. Performance vs Qiskit optimization_level=3 is workload-dependent: qb-compiler v0.5.1 wins on QAOA-style and VQE chemistry workloads (UCCSD-H4 4e4o: +12% estimated fidelity vs Qiskit, p<0.05 paired Wilcoxon, n=30 seeds, IBM Fez calibration), ties or marginally underperforms on simple GHZ circuits where Qiskit's own VF2 layout is already strong. Full benchmark + raw data in CHANGELOG v0.5.1.


Additional integrations

Beyond the core calibration-aware compiler, qb-compiler ships two opt-in integrations. Neither loads unless you install the matching extra; the core pip install qb-compiler doesn't pull these dependencies.

Live calibration via QubitBoost SDK (v0.5+)

pip install qb-compiler[qubitboost]

Replaces the static-fixture calibration path with a live fetch from IBM Quantum (or other vendor APIs as they're added). Auto-refreshes every 30 min, falls back to stale cache with a UserWarning on vendor outages. See LiveCalibrationProvider in qb_compiler.calibration.live_provider.

Optional companion gates from the QubitBoost SDK (adaptive shot reduction for QAOA, evaluation reduction for VQE, runtime execution checks) are surfaced as recommendations in qbc preflight / qbc analyze when the circuit type is detected. qb-compiler reports which gates are eligible for a given circuit and attaches no performance figure to them. See qubitboost.io for the SDK itself.

NVIDIA Ising Decoder onramp (v0.4.0b1, beta)

pip install --pre qb-compiler[ising]          # stim + pymatching baseline
pip install --pre qb-compiler[ising-nvidia]   # adds torch + safetensors

First Qiskit-side onramp to NVIDIA's Ising-Decoder-SurfaceCode-1 (released 2026-04-14). Takes a rotated surface-code memory experiment, emits the 4-channel (B, 4, T, D, D) tensor the pretrained decoder consumes. A PyMatching MWPM baseline ships in the package; bring your own NVIDIA gated weights (Apache 2.0 integration code; NVIDIA Open Model License weights distributed separately by NVIDIA). Stim-validated only, no hw shots through it yet.

from qb_compiler.ising import (
    SurfaceCodePatchSpec, PyMatchingDecoder, evaluate_logical_error_rate,
)
spec = SurfaceCodePatchSpec(distance=7, rounds=7, basis="X", p_error=0.003)
result = evaluate_logical_error_rate(
    spec, PyMatchingDecoder(spec), shots=50_000, seed=42,
)

Full API + walkthrough: src/qb_compiler/ising/README.md and Notebook 17.


Supported Backends

Vendor Backends Qubits Native Basis
IBM Fez, Torino, Marrakesh (Heron) 133-156 ECR, RZ, SX
Rigetti Ankaa-3 84 CZ, RZ, RX
IonQ Aria, Forte 25-36 MS, GPI, GPI2
IQM Garnet, Emerald 5-20 CZ, PRX
Quantinuum H2 32 RZ, U1Q, ZZ

Calibration data can be loaded from local JSON files OR fetched live from vendor APIs via LiveCalibrationProvider. The live path requires pip install qb-compiler[qubitboost] and a saved IBM-credentials profile; see Quick Start for the live-fetch workflow.


Installation

Compatibility

Python 3.10 to 3.12
Qiskit 1.0 to 1.4, and 2.3 (both legs run in CI)
Hardware the fidelity model is validated against IBM Fez, Torino, Marrakesh
Hardware with an adapter but no validation Rigetti Ankaa-3, IonQ, IQM, Quantinuum

Known pairing problem. On qiskit 1.x with qiskit-ibm-runtime 0.40 or newer, an IBM backend can advertise a translation plugin that the installed qiskit does not ship, and a plain transpile raises TranspilerError: Invalid plugin name on a circuit that has nothing wrong with it. Pass translation_method="translator", or move to qiskit 2.x. qbc doctor detects the pairing and prints the same workaround.

# Core (IBM backends via Qiskit)
pip install qb-compiler

# With ML acceleration (optional)
pip install "qb-compiler[ml]"

# With GNN layout predictor (optional)
pip install "qb-compiler[gnn]"

# Development
pip install "qb-compiler[dev]"

CLI Reference

Command Description
qbc preflight <circuit> -b <backend> Quick viability check: VIABLE / CAUTION / DO NOT RUN
qbc analyze <circuit> -b <backend> Detailed analysis with suggestions
qbc diff <circuit> -b <backend> --vs <backend> Side-by-side backend comparison
qbc doctor Environment health check
qbc compile <circuit> -b <backend> --receipt Compile with audit trail
qbc info Show version and available backends
qbc calibration show <backend> Show calibration summary
qbc chem-audit <file> Five integrity checks on a qubit Hamiltonian: ACCEPT / INCOMPLETE / REFUSE
qbc measure-plan <file> Terms, QWC settings and shots for that operator, before you submit
qbc verify-receipt <file> Check a receipt signature offline against a public key
qbc corpus list | show | verify Public QEC datasets, and whether your copy matches the published bytes
qbc when <circuit> Rank backends by predicted fidelity per dollar
qbc dem-audit <file> QEC decoder-input correctness audit

Contributing

Contributions are welcome. See CONTRIBUTING.md for guidelines.

pip install "qb-compiler[dev]"
pytest

License

Apache License 2.0. See LICENSE for the full text.

Copyright 2026 QubitBoost.

Selection receipts

CalibrationMapper chooses a layout from calibration data by scoring candidates on gate error, coherence, readout error, T1 asymmetry and temporal correlation, then picking the best via VF2 subgraph search. selection_receipt() turns that choice into a record somebody else can check: the layout, its score, the per signal breakdown, the calibration fingerprint, and how old that calibration was.

import functools
from qb_compiler.passes.mapping import CalibrationMapper, selection_receipt

mapper = CalibrationMapper(backend)
result = mapper.run(circuit, {})

receipt = selection_receipt(result, calibration=backend)          # the recommendation ran

receipt = selection_receipt(                                       # something else ran
    result,
    calibration=backend,
    executed_layout={0: 6, 1: 5, 2: 4},
    scorer=functools.partial(mapper.score_layout, circuit=circuit),
)

Pass executed_layout= whenever you run a layout other than the pass's pick. The receipt then describes what ran, keeps the recommendation in recommended_layout, and records what the override cost in score_penalty_vs_recommended. Before 0.12.0 the receipt always named the recommendation, so a receipt could describe a run that never happened.

sign=True signs with an Ed25519 key created once at ~/.qb-compiler/signing_key, or wherever QBC_SIGNING_KEY points, and the receipt carries that key's fingerprint rather than the key. Anyone can check it offline with qbc verify-receipt receipt.json --key their-public-key.txt, which needs no account, no network and no compiled crypto library.

Receipts signed by 0.9.0 to 0.11.0 should not be treated as evidence of origin. Those releases generated a fresh keypair per call and embedded its public half in the receipt, so the signature verified against a key that travelled with it. The verifier reports that shape as LEGACY_SELF_SIGNED and refuses it.

Full detail: docs/receipts.md.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

qb_compiler-0.12.0.tar.gz (1.3 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

qb_compiler-0.12.0-py3-none-any.whl (972.5 kB view details)

Uploaded Python 3

File details

Details for the file qb_compiler-0.12.0.tar.gz.

File metadata

  • Download URL: qb_compiler-0.12.0.tar.gz
  • Upload date:
  • Size: 1.3 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for qb_compiler-0.12.0.tar.gz
Algorithm Hash digest
SHA256 821d8f3a06f3603c9b0968b20c6155c1e06ee9fc091618756f1a5ed2b030400b
MD5 90652e8660a6648d27293473d22a5b7d
BLAKE2b-256 c2b5399cadb9b32d2c5a473e1017a9e9f5c2c0bf755ecbaa8555c169b8aae54f

See more details on using hashes here.

Provenance

The following attestation bundles were made for qb_compiler-0.12.0.tar.gz:

Publisher: release.yml on mwpwalshe/qb-compiler

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file qb_compiler-0.12.0-py3-none-any.whl.

File metadata

  • Download URL: qb_compiler-0.12.0-py3-none-any.whl
  • Upload date:
  • Size: 972.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for qb_compiler-0.12.0-py3-none-any.whl
Algorithm Hash digest
SHA256 3992238217c3ed772dc03e6f281fd92f03a84f79ca5f9d36b9e296075c163fb0
MD5 143a105d0ab8b39c30d20b19349a68cb
BLAKE2b-256 c1e928875237916ab047e9ab2217fd387a4c046e00957173d99a60638eda8eb0

See more details on using hashes here.

Provenance

The following attestation bundles were made for qb_compiler-0.12.0-py3-none-any.whl:

Publisher: release.yml on mwpwalshe/qb-compiler

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

This release

0.12.0 This release

2 files

0.11.0

2 files

0.10.0

2 files

0.7.0

2 files

0.5.2

2 files

0.5.1

2 files

0.3.0

2 files

0.2.3

2 files

0.2.2

2 files

0.2.1

2 files

0.1.1

2 files

0.1.0

2 files

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page