Quantum hardware noise characterization & compiler benchmarking
ibm_fez (156-qubit Heron processor) • Qiskit vs Superstaq
curve_fit.
T1 (energy relaxation) and T2 (dephasing) measured across multiple runs. Each point is one hardware measurement. Drift between runs reveals noise instability.
T1 experiment: Prepare the qubit in |1〉 with an X gate, wait a variable delay, then measure. The probability of remaining in |1〉 decays exponentially: P(1) = A·exp(-t/T1) + C. The curve is fit with scipy.optimize.curve_fit across 10–20 delay values.
qc = QuantumCircuit(1, 1) qc.x(0) # prepare |1〉 qc.delay(delay_sec, 0, unit="s") # wait qc.measure(0, 0) # check if it decayed
T2 experiment (Hahn echo): Create a superposition with H, wait half the delay, apply an X refocusing pulse to cancel static noise, wait the other half, then H and measure. The echo isolates true T2 from T2* (which includes inhomogeneous broadening).
qc.h(0) # superposition qc.delay(half_delay, 0, unit="s") qc.x(0) # refocusing pulse qc.delay(half_delay, 0, unit="s") qc.h(0) # interfere qc.measure(0, 0)
Each qubit's circuits are transpiled with initial_layout=[qubit] to make sure the correct quibit is read, not whatever the transpiler picks.
Physics constrains T2 ≤ 2×T1. Points near the dashed line indicate energy relaxation dominates.
Decoherence has two components: energy relaxation (T1 — the qubit loses energy to its environment) and pure dephasing (Tφ — the phase relationship randomizes without energy exchange). The total coherence time satisfies:
1/T2 = 1/(2*T1) + 1/T_phi
Since Tφ ≥ 0, T2 can never exceed 2×T1. When T2 ≈ 2×T1, pure dephasing is negligible and energy relaxation is the dominant noise channel. When T2 ≪ 2×T1, the qubit suffers additional phase noise (e.g., flux fluctuations, TLS coupling).
Assignment error per qubit. False negatives (1→0) dominate due to T1 decay during measurement.
For each qubit, two circuits are run:
# Prepare |0〉 and measure qc0 = QuantumCircuit(1, 1) qc0.measure(0, 0) # Prepare |1〉 and measure qc1 = QuantumCircuit(1, 1) qc1.x(0) qc1.measure(0, 0)
P(1|prep 0) = fraction of |0〉 preparations that are misread as |1〉. This is typically very low.
P(0|prep 1) = fraction of |1〉 preparations that are misread as |0〉. This is higher because the qubit can undergo T1 decay during the measurement process itself, falling from |1〉 to |0〉 before the readout completes.
Identical circuits compiled through two optimizers, then executed on the same hardware.
Three benchmark circuits (Bell state, GHZ-4q, QFT-4q) are compiled through two paths:
Qiskit path: transpile(circuit, backend=ibm_fez, optimization_level=3) — Qiskit's most aggressive optimization. Decomposes to the native gate set (CZ, SX, RZ), optimizes single-qubit chains, and routes qubits across the hardware topology.
Superstaq path: provider.ibmq_compile(circuit, target="ibmq_fez_qpu") — Infleqtion's cloud compiler. Uses proprietary optimizations including hardware-aware noise models and custom decomposition strategies.
Both compiled circuits are then submitted to ibm_fez in the same job, ensuring identical hardware conditions for a fair comparison.
Hellinger fidelity between measured output and ideal (noiseless) distribution. Higher is better.
I use Hellinger fidelity to compare the measured output distribution against the ideal (noiseless) distribution:
F_H = (sum_x sqrt(p_measured(x) * p_ideal(x)))^2
F_H = 1.0 means perfect agreement with the ideal circuit. For the Bell state, the ideal distribution is 50% |00〉 + 50% |11〉. For GHZ-4q, it's 50% |0000〉 + 50% |1111〉. For QFT on |0000〉, the ideal output is a uniform distribution over all 16 bitstrings.
This metric captures all noise sources simultaneously — gate errors, decoherence during the circuit, readout errors, and crosstalk. It's the most honest measure of real-world compiler performance.