QuantumACES.jl
QuantumACES.jl: design noise characterisation experiments for quantum computers - Published in JOSS (2025)
Science Score: 98.0%
This score indicates how likely this project is to be science-related based on various indicators:
-
✓CITATION.cff file
Found CITATION.cff file -
✓codemeta.json file
Found codemeta.json file -
✓.zenodo.json file
Found .zenodo.json file -
✓DOI references
Found 4 DOI reference(s) in README and JOSS metadata -
✓Academic publication links
Links to: arxiv.org, joss.theoj.org -
○Committers with academic emails
-
○Institutional organization owner
-
✓JOSS paper metadata
Published in Journal of Open Source Software
Keywords
Keywords from Contributors
Scientific Fields
Repository
Design scalable noise characterisation experiments for quantum computers
Basic Info
Statistics
- Stars: 27
- Watchers: 1
- Forks: 1
- Open Issues: 0
- Releases: 12
Topics
Metadata Files
README.md
QuantumACES.jl
QuantumACES is a package for designing and simulating scalable and performant Pauli noise characterisation experiments for stabiliser circuits with averaged circuit eigenvalue sampling (ACES). It focuses on the context of quantum error correction and fault-tolerant circuits and, in particular, on the syndrome extraction circuits of topological quantum error correcting codes. It interfaces with Stim for stabiliser circuit simulation, PyMatching and BeliefMatching for decoding, and Qiskit for implementation on quantum devices.
Typical usage of QuantumACES involves first doing the following:
- Construct the circuit and the noise model that you aim to characterise, either using existing functions or your own.
- Optimise an ACES experimental design for noise characterisation of a small-scale instance of the circuit, typically according to a deterministic noise model, such as depolarising noise, with roughly the same average error rates as the noise you aim to characterise.
This subsequently enables:
- Transferring the optimised experimental design to larger-scale instances of the circuit, including with different noise models.
- Simulate noise characterisation experiments with ACES experimental designs, including at large scales, using Stim.
- Calculating performance predictions for experimental designs at small scales and fitting the performance predictions, in particular for syndrome extraction circuits as a function of the distance of the underlying code, to predict performance at large scales.
- Simulating memory experiments for syndrome extraction circuits using Stim, and then decoding with PyMatching or BeliefMatching with decoder priors informed by a range of noise models, including ACES noise estimates.
- Creating Pauli frame randomised ACES experimental designs, exporting them to Qiskit circuits, and processing the results, enabling implementation on quantum devices.
Example usage
First parameterise a depolarising noise model with single-qubit gate infidelity r_1, two-qubit gate infidelity r_2, and measurement infidelity r_m, and a log-normal random Pauli noise model with the same gate infidelities and a standard deviation of the underlying normal distributions total_std_log, specifying the seed seed for reproducibility.
julia
using QuantumACES
r_1 = 0.05 / 100
r_2 = 0.4 / 100
r_m = 0.8 / 100
total_std_log = 0.5
seed = UInt(0)
dep_param = get_dep_param(r_1, r_2, r_m)
log_param = get_log_param(r_1, r_2, r_m, total_std_log; seed = seed)
Similarly, we create circuit parameters for the syndrome extraction circuit of a distance dist (rotated) surface code.
julia
dist = 3
rotated_param = get_rotated_param(dist)
Next, we create versions of this circuit with both noise models.
julia
circuit_dep = get_circuit(rotated_param, dep_param)
circuit_log = get_circuit(rotated_param, log_param)
Now we can generate an experimental design for this circuit.
julia
d = generate_design(circuit_dep)
Alternatively, we can optimise an experimental design to improve its sample efficiency, configuring the optimisation with the parameters associated with OptimOptions.
julia
d = optimise_design(circuit_dep; options = OptimOptions(; seed = seed))
There are a number of options that allow you to reduce the optimisation time.
For example, we can disable cyclic coordinate descent optimisation of the circuit depth of repeated tuples in the design by setting max_cycles = 0.
We can also allow the greedy search over ordinary tuples to terminate once they are left unchanged by single excursion in the search by setting excursions_unchanged = 1.
julia
d = optimise_design(
circuit_dep;
options = OptimOptions(; max_cycles = 0, excursions_unchanged = 1, seed = seed),
)
This experimental design can be transferred to the circuit with the log-normal Pauli noise model.
julia
d_log = generate_design(circuit_log, d)
If we only wish to update the noise model, however, we can do this more efficiently.
julia
d_log = update_noise(d, circuit_log)
Now we can simulate repetitions instances of ACES noise characterisation across a range of measurement budgets budget_set, which are measurement shots normalised by the time taken to perform the experiment.
julia
budget_set = [10^6; 10^7; 10^8]
repetitions = 20
aces_data = simulate_aces(d_log, budget_set; repetitions = repetitions, seed = seed)
We can compare the performance to predictions, although we note that the z-scores will not quite be normally distributed as the underlying distribution is not quite normal.
julia
merit_log = calc_merit(d_log)
pretty_print(aces_data, merit_log)
We can also simulate ACES noise characterisation at scale.
First create a new design at a large code distance dist_big.
Setting full_covariance to be false means only the diagonal circuit eigenvalue estimator covariance matrix is generated, which saves a substantial amount of time.
It also prevents the design from attempting to perform generalised least squares (GLS) with the full covariance matrix, which can consume large amounts of memory at large scales, restricting the design to weighted least squares (WLS).
julia
dist_big = 13
rotated_param_big = get_rotated_param(dist_big)
circuit_big = get_circuit(rotated_param_big, dep_param)
circuit_big_log = get_circuit(rotated_param_big, log_param)
d_big = generate_design(circuit_big_log, d; full_covariance = false, diagnostics = true)
Now simulate this new design, setting split to be true to avoid memory issues by splitting projection of the gate error probabilities into the simplex across each of the gates, rather than doing all gates collectively.
julia
aces_data_big = simulate_aces(d_big, budget_set; seed = seed, split = true)
Installation and setup
To install this package, run the following command in the Julia REPL.
] add QuantumACES
CAUTION: This package uses PythonCall to call a number of Python packages. If PythonCall and these packages are not configured correctly, associated functions will not work. The packages attempts to load the following Python packages:
- Stim, installed with
pip install stim. - PyMatching, installed with
pip install pymatching. - BeliefMatching, installed with
pip install beliefmatching. - Qiskit, installed with
pip install qiskit. - Aer, installed with
pip install qiskit-aer.
By default, PythonCall creates its own Python environment, but you may wish to configure it to use an existing Python installation.
One helpful method for managing Python versions is pyenv, or for Windows, pyenv-win; these are analogous to Juliaup for Julia. The following assumes you are using pyenv or pyenv-win.
On Windows, to instruct PythonCall to use the Python version set by pyenv, configure PythonCall's environment variables by adding the following to your ~/.julia/config/startup.jl file
julia
ENV["JULIA_CONDAPKG_BACKEND"] = "Null"
python_exe = readchomp(`cmd /C pyenv which python`)
ENV["JULIA_PYTHONCALL_EXE"] = python_exe
On Unix systems, shell commands are parsed directly by Julia and appear to be unaware of your PATH variable, and I am not sure how to work around this.
Therefore, you may need to manually supply python_exe for the Python version <version> as
julia
python_exe = homedir() * "/.pyenv/versions/<version>/bin/python"
Attribution
The methods used in this package are based on arXiv:2404.06545 and arXiv:2502.21044, and they build on the original ACES protocol introduced in arXiv:2108.05803.
The code for arXiv:2404.06545 can be found in the scalable_aces folder on the scalable_aces branch.
The code for arXiv:2502.21044 can be found in the aces_decoding folder on the aces_decoding branch.
If you find this package helpful for your research, please cite it using the supplied CITATION.cff file, and consider citing the associated papers if appropriate.
If you wish to contribute to this package, please refer to the CONTRIBUTING.md file.
Owner
- Name: evanhockings
- Login: EvanHockings
- Kind: user
- Repositories: 2
- Profile: https://github.com/EvanHockings
JOSS Publication
QuantumACES.jl: design noise characterisation experiments for quantum computers
Authors
Tags
Quantum computing Quantum error correctionCitation (CITATION.cff)
cff-version: "1.0"
authors:
- family-names: Hockings
given-names: Evan T.
orcid: "https://orcid.org/0000-0002-5890-5705"
doi: 10.5281/zenodo.15043208
message: If you use this software, please cite our article in the
Journal of Open Source Software.
preferred-citation:
authors:
- family-names: Hockings
given-names: Evan T.
orcid: "https://orcid.org/0000-0002-5890-5705"
date-published: 2025-03-31
doi: 10.21105/joss.07707
issn: 2475-9066
issue: 107
journal: Journal of Open Source Software
publisher:
name: Open Journals
start: 7707
title: "QuantumACES.jl: design noise characterisation experiments for
quantum computers"
type: article
url: "https://joss.theoj.org/papers/10.21105/joss.07707"
volume: 10
title: "QuantumACES.jl: design noise characterisation experiments for
quantum computers"
GitHub Events
Total
- Create event: 29
- Commit comment event: 13
- Release event: 8
- Issues event: 2
- Watch event: 13
- Delete event: 18
- Issue comment event: 18
- Push event: 95
- Pull request event: 35
Last Year
- Create event: 29
- Commit comment event: 13
- Release event: 8
- Issues event: 2
- Watch event: 13
- Delete event: 18
- Issue comment event: 18
- Push event: 95
- Pull request event: 35
Committers
Last synced: 7 months ago
Top Committers
| Name | Commits | |
|---|---|---|
| evanhockings | e****s@g****m | 102 |
| dependabot[bot] | 4****] | 3 |
| Dilum Aluthge | d****m@a****m | 1 |
Committer Domains (Top 20 + Academic)
Issues and Pull Requests
Last synced: 6 months ago
All Time
- Total issues: 5
- Total pull requests: 49
- Average time to close issues: 2 months
- Average time to close pull requests: 18 days
- Total issue authors: 3
- Total pull request authors: 5
- Average comments per issue: 3.4
- Average comments per pull request: 0.65
- Merged pull requests: 40
- Bot issues: 0
- Bot pull requests: 10
Past Year
- Issues: 2
- Pull requests: 42
- Average time to close issues: 4 minutes
- Average time to close pull requests: 15 days
- Issue authors: 1
- Pull request authors: 3
- Average comments per issue: 0.0
- Average comments per pull request: 0.6
- Merged pull requests: 35
- Bot issues: 0
- Bot pull requests: 9
Top Authors
Issue Authors
- evanhockings (2)
- Fe-r-oz (1)
- JuliaTagBot (1)
Pull Request Authors
- evanhockings (46)
- dependabot[bot] (7)
- github-actions[bot] (6)
- DilumAluthge (2)
- Fe-r-oz (2)
Top Labels
Issue Labels
Pull Request Labels
Packages
- Total packages: 1
- Total downloads: unknown
- Total dependent packages: 0
- Total dependent repositories: 0
- Total versions: 7
juliahub.com: QuantumACES
Design scalable noise characterisation experiments for quantum computers
- Documentation: https://docs.juliahub.com/General/QuantumACES/stable/
- License: MIT
-
Latest release: 0.2.4
published 10 months ago
Rankings
Dependencies
- actions/checkout v4 composite
- codecov/codecov-action v4 composite
- julia-actions/cache v1 composite
- julia-actions/julia-buildpkg v1 composite
- julia-actions/julia-docdeploy v1 composite
- julia-actions/julia-processcoverage v1 composite
- julia-actions/julia-runtest v1 composite
- julia-actions/setup-julia v2 composite
- JuliaRegistries/TagBot v1 composite
