Supplemental software for "Digital Zero-Noise Extrapolation with Quantum Circuit Unoptimization" (arXiv:2503.06341).
Implements the quantum circuit unoptimization elementary recipe from "Quantum Circuit Unoptimization" (arXiv:2311.03805). Unoptimizing a circuit increases its depth and gate count, which can lead to higher noise due to increased opportunities for errors. By deliberately adding gates that do not change the overall computation, we can amplify the noise without altering the circuit's functionality. This serves as an alternate method of noise-scaling for quantum error mitigation techniques like zero-noise extrapolation (ZNE).
You will require Python 3.12 and uv.
Once you have uv installed, run:
uv sync --all-extrasThis will install all dependencies including development tools (pytest, ruff, mypy, etc.).
Consider the following arbitrary quantum circuit:
>>> from qiskit import QuantumCircuit
>>> from unopt.recipe import unoptimize_circuit
>>>
>>> # Create a 4-qubit fully connected graph state.
>>> num_qubits = 4
>>> qc = QuantumCircuit(num_qubits)
>>>
>>> for qubit in range(num_qubits):
>>> qc.h(qubit)
>>>
>>> for i in range(num_qubits):
>>> for j in range(i + 1, num_qubits):
>>> qc.cz(i, j)
>>> print(qc)
βββββ
q_0: β€ H βββ βββ βββ ββββββββββ
βββββ€ β β β
q_1: β€ H βββ βββΌβββΌβββ βββ ββββ
βββββ€ β β β β
q_2: β€ H ββββββ βββΌβββ βββΌβββ β
βββββ€ β β β
q_3: β€ H βββββββββ ββββββ βββ β
βββββ We can perform comparative benchmarks for ZNE with unoptimization as a scaling technique against the ideal, unmitigated, and ZNE with folding
**Averages Across All Trials:
Ideal Value: 0.06250000000000006
Unmitigated Value: 0.003799999999999956
ZNE + Fold Value: 0.00037500000000005443 (Error: 0.062125)
ZNE + Unopt Value: 0.008441716269841373 (Error: 0.05405828373015868)
Percent Improvement (Unmit): 8.59%
Percent Improvement (ZNE + Fold): 14.92%
Original Circuit Depth: 6
Avg Folded Depths: [6.0, 18.0, 30.0]
Avg Unoptimized Depths: [37.0, 65.0, 101.0]
Trial Details:
Trial 1:
Ideal Value: 0.06250000000000006
Unmitigated Value: 0.003799999999999956
ZNE + Fold Value: 0.00037500000000005443
ZNE + Fold Depths: [6, 18, 30]
ZNE + Unopt Value: 0.008441716269841373
ZNE + Unopt Depths: [37, 65, 101]**
Note that for certain circuits and runs, you may obtain different results as there is a randomized component to the circuit unoptimization and extrapolation.
One can also run the unoptimization procedure of arXiv:2311.03805 in isolation as such:
>>> # Apply one rounds of unoptimization to the circuit.
>>> unopt_qc = unoptimize_circuit(qc, 1)
>>> print(unopt_qc)
global phase: 4.4801
βββββββββββββββββββββββ ββββββββββββββββββ ββββββββββββββββββββββββ βββββββββββββββββββββββ ββββββββββββββββββββ Β»
q_0: β€ U3(0.62409,Ο/2,Ο/2) ββββ βββββββββ€ U3(Ο,-Ο/4,Ο/4) βββββββββ ββββ€ U3(0.36348,1.4779,0) βββββ ββββββββββββββββββββββββββββ βββ€ U3(2.4621,0,1.6637) ββββββββββββββββββββββββββ ββββββββ€ U3(2.5975,0,Ο/2) ββββββββ ββΒ»
ββ¬ββββββββββββββββββββ¬ββββ΄βββββββββ΄βββββββββββββββββ΄ββββββββ΄ββββ΄βββββββββββββββββββββββ΄β β β ββββββββββββββββββββββββββββββββββββββββββββββββ΄ββββββββ΄βββββββββββββββββββ΄βββββββ΄ββΒ»
q_1: ββ€ U3(2.1322,Ο/2,-Ο) βββ€ X ββ€ U3(1.8034,2.0685,-2.4328) ββ€ X ββ€ U3(1.0094,1.3772,-Ο/2) ββββΌβββββ βββββββββββββββββββββββΌββββββββββββββ ββββββββββββ€ U3(Ο/2,-Ο,-1.5964) ββ€ X ββ€ U3(2.0383,2.2097,-2.8185) ββ€ X βΒ»
ββ΄ββββββββββββββββββββ΄βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ΄βββββ΄βββββββββββββββββββββββ΄ββ βββ΄ββ βββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββββββββββΒ»
q_2: β€ U3(Ο/2,-0.21066,-Ο) βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€ X ββ€ X ββ€ U3(0,0,1.0189) ββ€ X βββββββββββ€ X βββββββββββ€ U3(0.048388,0,-Ο) βββββββββββββββββββββββββββββββββββββββββΒ»
βββββββββββββββββββββββ βββββββββββββββββββββββββββββββββ βββββ βββββββββββββββββββββ Β»
q_3: βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββΒ»
Β»
Β« ββββββββββββββββββββββββββ ββββββββββββββββββββ ββββββββββββββββββββββββ βββββββββββββββββββββββββ Β»
Β«q_0: ββ€ U3(Ο,-0.59091,-2.8735) ββββββββββββββββββββββββββββββββββββ ββββββββ€ U3(2.5156,0,Ο/2) ββββββββ βββββββ€ U3(Ο/2,2.986,0.6101) ββββββββ βββββββββββββββββββββββ βββββ€ U3(Ο,-2.6303,-2.6303) βββββββ ββΒ»
Β« ββ΄βββββββββββββββββββββββββ€ ββββββββββββββββββββββββββββββ΄ββββββββ΄βββββββββββββββββββ΄βββββββ΄βββββββ΄βββββββββββββββββββββββ΄ββββ β β βββββββββββββββββββββββββ βββ΄ββΒ»
Β«q_1: β€ U3(2.5802,-2.6044,-Ο/2) ββββ βββ€ U3(1.0094,-Ο/2,-1.0918) ββ€ X ββ€ U3(2.0383,2.2097,-2.8185) ββ€ X ββ€ U3(1.4839,-0.13902,-0.55533) ββββΌβββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββ€ X βΒ»
Β« ββββββββββββββββββββββββββββββ΄ββββ¬βββββββββββββββββββββββββ€ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ΄βββββββββββββββββββββββ΄βββββββββββββββββββββββββββββββββββββΒ»
Β«q_2: ββββββββββββββββββββββββββββ€ X βββ€ U3(0.99038,0.75265,-Ο) βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€ X ββ€ U3(0,0,2.2352) ββ€ X ββ€ U3(1.633,-0.4035,0.080188) ββββββΒ»
Β« βββββ ββββββββββββββββββββββββββ ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ Β»
Β«q_3: βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββΒ»
Β« Β»
Β« ββββββββββββββββββ ββββββββββββββββββββββββββββ ββββββββββββββββββββββββ ββββββββββββββββββββββ ββββββββββββββββββββββββββββββββ Β»
Β«q_0: βββββββ€ U3(Ο,-Ο/4,Ο/4) βββββββββ βββ€ U3(2.5684,2.4992,2.8748) ββββ ββββββ€ U3(1.0824,-Ο/2,-Ο/2) ββββββ βββββββ€ U3(0.15576,-Ο,Ο/2) ββββββββ βββ€ U3(0.80295,-1.7413,-0.98507) βββββββββ βββββββββββββββββββββββββββΒ»
Β« βββββββ΄βββββββββββββββββ΄ββββββββ΄βββββ¬ββββββββββββββββββββββ¬βββ β ββββββββββββββββββββββββ β ββββββββββββββββββββββ β ββββββββββββββββββββββββββββββββ β Β»
Β«q_1: β€ U3(1.8527,2.1084,-2.5222) ββ€ X ββββ€ U3(2.1322,-Ο/8,Ο/2) βββββββΌββββββββββββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββ βββββΌββββββββββββββββββββ βββββββΒ»
Β« ββββββββββββββββββββββββββββββββββ βββββββββββββββββββββββ βββ΄ββββββββββββββββββββββββββββββββββ΄βββββββββββββββββββββββββββββββββββ΄ββ βββββββββββββββββββββββββββββ βββ΄ββ β βββββββββββββββ β Β»
Β«q_2: βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€ X ββ€ U3(1.9504,2.7175,0.68731) ββ€ X ββ€ U3(1.1033,0.32306,-2.2097) ββ€ X βββ€ U3(1.3489,1.3177,-2.6481) ββββ€ X ββββΌβββ€ U3(Ο/2,0,Ο) ββββΌβββββ ββΒ»
Β« ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ βββββββββββββββββββββββββββββ ββββββββ΄ββββββββββββββββββββ΄βββββ΄ββΒ»
Β«q_3: ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€ X βββββββββββββββββ€ X ββ€ X βΒ»
Β« βββββ ββββββββββΒ»
Β«
Β«q_0: βββββββββββββββ
Β«
Β«q_1: βββββββββββββββ
Β«
Β«q_2: βββββββββββββββ
Β« βββββββββββββββ
Β«q_3: β€ U3(Ο/2,0,Ο) β
Β« βββββββββββββββ
# To generate the plots used in the paper, they can be run and generated directly by:
uv run python unopt/plot.pyNote that generating these files from scratch can take several minutes. The progress of the computations used for the plots are shown when the above is run.
To run the tests:
uv run pytestTo guarantee that both linter and formatter run before each commit, please install the pre-commit hook with:
uv run pre-commit install