Skip to main content

A search-based decoder for quantum error correction (QEC).

Project description

Tesseract Decoder

A Search-Based Decoder for Quantum Error Correction.

Licensed under the Apache 2.0 open-source license C++

InstallationUsagePython InterfacePaperHelpCitationContact

Tesseract is a Most Likely Error decoder designed for Low Density Parity Check (LDPC) quantum error-correcting codes. It applies pruning heuristics and manifold orientation techniques during a search over the error subsets to identify the most likely error configuration consistent with the observed syndrome. Tesseract achieves significant speed improvements over traditional integer programming-based decoders while maintaining comparable accuracy at moderate physical error rates.

We tested the Tesseract decoder for:

  • Surface codes
  • Color codes
  • Bivariate-bicycle codes
  • Transversal CNOT protocols for surface codes

Features

  • A* search: deploys A* search while running a Dijkstra algorithm with early stop for high performance.
  • Stim and DEM Support: processes Stim circuit files and Detector Error Model (DEM) files with arbitrary error models. Zero-probability error instructions are automatically removed when a DEM is loaded.
  • Parallel Decoding: uses multithreading to accelerate the decoding process, making it suitable for large-scale simulations.
  • Efficient Beam Search: implements a beam search algorithm to minimize decoding cost and enhance efficiency. Sampling and Shot Range Processing: supports sampling shots from circuits. When a detection error model is provided without an accompanying circuit, Tesseract requires detection events from files using --in. The decoder can also process specific shot ranges for flexible experiment setups.
  • Detailed Statistics: provides comprehensive statistics output, including shot counts, error counts, and processing times.
  • Heuristics: includes flexible heuristic options: --beam, --det-penalty, --beam-climbing, --no-revisit-dets, --at-most-two-errors-per-detector, and --pqlimit to improve performance while maintaining a low logical error rate. To learn more about these options, use ./bazel-bin/src/tesseract --help
  • Visualization tool: open the viz directory in your browser to view decoding results. See viz/README.md for instructions on generating the visualization JSON.

Installation

Tesseract relies on the following external libraries:

  • argparse: For command-line argument parsing.
  • nlohmann/json: For JSON handling (used for statistics output).
  • Stim: For quantum circuit simulation and error model handling.

Build Instructions

Tesseract uses Bazel as its build system. To build the decoder:

bazel build src:all

Running Tests

Unit tests are executed with Bazel. Run the quick test suite using:

bazel test //src:all

By default the tests use reduced parameters and finish in under 30 seconds. To run a more exhaustive suite with additional shots and larger distances, set:

TESSERACT_LONG_TESTS=1 bazel test //src:all

Usage

The file tesseract_main.cc provides the main entry point for Tesseract Decoder. It can decode error events from Stim circuits, DEM files, and pre-existing detection event files.

Basic Usage:

./tesseract --circuit CIRCUIT_FILE.stim --sample-num-shots N --print-stats

To decode pre-generated detection events, provide the input file using --in SHOTS_FILE --in-format FORMAT.

Example with Advanced Options:

./tesseract \
        --pqlimit 1000000 \
        --at-most-two-errors-per-detector \
        --det-order-seed 232852747 \
        --circuit circuit_file.stim \
        --sample-seed 232856747 \
        --sample-num-shots 10000 \
        --threads 32 \
        --print-stats \
        --beam 23 \
        --num-det-orders 1 \
        --shot-range-begin 582 \
        --shot-range-end 583

Example Usage

Sampling Shots from a Circuit:

./tesseract --circuit surface_code.stim --sample-num-shots 1000 --out predictions.01 --out-format 01

Using a Detection Event File:

./tesseract --in events.01 --in-format 01 --dem surface_code.dem --out decoded.txt

Using a Detection Event File and Observable Flips:

./tesseract --in events.01 --in-format 01 --obs_in obs.01 --obs-in-format 01 --dem surface_code.dem --out decoded.txt

Tesseract supports reading and writing from all of Stim's standard output formats.

Performance Optimization

Here are some tips for improving performance:

  • Parallelism over shots: increase --threads to leverage multicore processors for faster decoding.
  • Beam Search: use --beam to control the trade-off between accuracy and speed. Smaller beam sizes result in faster decoding but potentially lower accuracy.
  • Beam Climbing: enable --beam-climbing for enhanced cost-based decoding.
  • At most two errors per detector: enable --at-most-two-errors-per-detector to improve performance.
  • Priority Queue limit: use --pqlimit to limit the size of the priority queue.

Output Formats

  • Observable flips output: predictions of logical errors.
  • DEM usage frequency output: if --dem-out is specified, outputs estimated error frequencies.
  • Statistics output: includes number of shots, errors, low confidence shots, and processing time.

Python Interface

Full Python wrapper documentation

This repository contains the C++ implementation of the Tesseract quantum error correction decoder, along with a Python wrapper. The Python wrapper/interface exposes the decoding algorithms and helper utilities, allowing Python users to leverage this high-performance decoding algorithm.

The following example demonstrates how to create and use the Tesseract decoder using the Python interface.

from tesseract_decoder import tesseract
import stim
import numpy as np


# 1. Define a detector error model (DEM)
dem = stim.DetectorErrorModel("""
    error(0.1) D0 D1 L0
    error(0.2) D1 D2 L1
    detector(0, 0, 0) D0
    detector(1, 0, 0) D1
    detector(2, 0, 0) D2
""")

# 2. Create the decoder configuration
config = tesseract.TesseractConfig(dem=dem, det_beam=50)

# 3. Create a decoder instance
decoder = config.compile_decoder()

# 4. Simulate detection events
syndrome = [0, 1, 1]

# 5a. Decode to observables
flipped_observables = decoder.decode(syndrome)
print(f"Flipped observables: {flipped_observables}")

# 5b. Alternatively, decode to errors
decoder.decode_to_errors(np.where(syndrome)[0])
predicted_errors = decoder.predicted_errors_buffer
# Indices of predicted errors
print(f"Predicted errors indices: {predicted_errors}")
# Print properties of predicted errors
for i in predicted_errors:
    print(f"    {i}: {decoder.errors[i]}")

Help

We are committed to providing a friendly, safe, and welcoming environment for all. Please read and respect our Code of Conduct.

Citation

When publishing articles or otherwise writing about Tesseract Decoder, please cite the following:

@misc{beni2025tesseractdecoder,
    title={Tesseract: A Search-Based Decoder for Quantum Error Correction},
    author = {Aghababaie Beni, Laleh and Higgott, Oscar and Shutty, Noah},
    year={2025},
    eprint={2503.10988},
    archivePrefix={arXiv},
    primaryClass={quant-ph},
    doi = {10.48550/arXiv.2503.10988},
    url={https://arxiv.org/abs/2503.10988},
}

Contact

For any questions or concerns not addressed here, please email tesseract-decoder-dev@google.com.

Disclaimer

Tesseract Decoder is not an officially supported Google product. This project is not eligible for the Google Open Source Software Vulnerability Rewards Program.

Copyright 2025 Google LLC.

Project details


Release history Release notifications | RSS feed

Download files

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

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

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

tesseract_decoder-0.1.1.dev20250812175128-py312-none-manylinux_2_39_x86_64.manylinux2014_x86_64.whl (3.4 MB view details)

Uploaded Python 3.12manylinux: glibc 2.39+ x86-64

tesseract_decoder-0.1.1.dev20250812175128-py312-none-manylinux_2_35_x86_64.manylinux2014_x86_64.whl (3.5 MB view details)

Uploaded Python 3.12manylinux: glibc 2.35+ x86-64

tesseract_decoder-0.1.1.dev20250812175128-py312-none-macosx_11_0_arm64.whl (3.1 MB view details)

Uploaded Python 3.12macOS 11.0+ ARM64

tesseract_decoder-0.1.1.dev20250812175128-py312-none-macosx_10_13_x86_64.whl (3.0 MB view details)

Uploaded Python 3.12macOS 10.13+ x86-64

tesseract_decoder-0.1.1.dev20250812175128-py311-none-manylinux_2_39_x86_64.manylinux2014_x86_64.whl (3.4 MB view details)

Uploaded Python 3.11manylinux: glibc 2.39+ x86-64

tesseract_decoder-0.1.1.dev20250812175128-py311-none-manylinux_2_35_x86_64.manylinux2014_x86_64.whl (3.5 MB view details)

Uploaded Python 3.11manylinux: glibc 2.35+ x86-64

tesseract_decoder-0.1.1.dev20250812175128-py311-none-macosx_11_0_arm64.whl (3.1 MB view details)

Uploaded Python 3.11macOS 11.0+ ARM64

tesseract_decoder-0.1.1.dev20250812175128-py311-none-macosx_10_13_x86_64.whl (3.0 MB view details)

Uploaded Python 3.11macOS 10.13+ x86-64

tesseract_decoder-0.1.1.dev20250812175128-py310-none-manylinux_2_39_x86_64.manylinux2014_x86_64.whl (3.4 MB view details)

Uploaded Python 3.10manylinux: glibc 2.39+ x86-64

tesseract_decoder-0.1.1.dev20250812175128-py310-none-manylinux_2_35_x86_64.manylinux2014_x86_64.whl (3.5 MB view details)

Uploaded Python 3.10manylinux: glibc 2.35+ x86-64

tesseract_decoder-0.1.1.dev20250812175128-py310-none-macosx_11_0_arm64.whl (3.1 MB view details)

Uploaded Python 3.10macOS 11.0+ ARM64

tesseract_decoder-0.1.1.dev20250812175128-py310-none-macosx_10_13_x86_64.whl (3.0 MB view details)

Uploaded Python 3.10macOS 10.13+ x86-64

File details

Details for the file tesseract_decoder-0.1.1.dev20250812175128-py312-none-manylinux_2_39_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250812175128-py312-none-manylinux_2_39_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 80ead721bfa83b4774ed3fbc12f9d0817bf63ae4a78e372e66c7bbf64370cc7c
MD5 7220f3f41368caedbe6eef2e20376776
BLAKE2b-256 437ffa37e06d5a2117ec23957ea24081e7748029298fb7186af407b10f9e2ed8

See more details on using hashes here.

File details

Details for the file tesseract_decoder-0.1.1.dev20250812175128-py312-none-manylinux_2_35_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250812175128-py312-none-manylinux_2_35_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 3707952aa761c0f1ff5113d2f04ca34eb63f2586c49e29b7028d1b9b6c5bfee3
MD5 ecf48af1857151982df6c2341f94aefe
BLAKE2b-256 e25aa4ef5fa7fe859d2d103453da01faca72c05d40a7394dfdc8dffa4412a18f

See more details on using hashes here.

File details

Details for the file tesseract_decoder-0.1.1.dev20250812175128-py312-none-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250812175128-py312-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 8a580f4fabca2e748406d693a350717657622e3adabbe8a82e568017f749a9f5
MD5 b9303586c294044b31b1911ac417b274
BLAKE2b-256 5dfb43cc07474b3498de41f2793f31118a04239dcc7359cbdbb1bf83cbaabd42

See more details on using hashes here.

File details

Details for the file tesseract_decoder-0.1.1.dev20250812175128-py312-none-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250812175128-py312-none-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 ae540c0e0a8162129b0f043cc73a91ee6a7c6ad08359cc8ab148c55908c22d91
MD5 d3c1ef8d72cf3513fdddc2c53d67657a
BLAKE2b-256 c59bff8c037b0187ca08bc3facac0a0b8e70a2689afdaf195219b52b3815e6a8

See more details on using hashes here.

File details

Details for the file tesseract_decoder-0.1.1.dev20250812175128-py311-none-manylinux_2_39_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250812175128-py311-none-manylinux_2_39_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 a3ef47ca39f5ffc6da5ea742d382d99ce58e9155cc52e618f3c1b8f28c25373e
MD5 0b903579291914cff1f23bcf08ff1b59
BLAKE2b-256 0646c70e8bdaf6b9648666c18c1d16e3c7a8d6abf81d15c29e17029a77da71b9

See more details on using hashes here.

File details

Details for the file tesseract_decoder-0.1.1.dev20250812175128-py311-none-manylinux_2_35_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250812175128-py311-none-manylinux_2_35_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 2bc78aa8e14154b830e37775f3a9b657a19d965bedf9e22b33c68711bb640309
MD5 be3d28220a93f1512775b02923dce10b
BLAKE2b-256 735f816e5259c86a3af0ab3e77109de1db570a917d155bcd0bb5134afd9acc00

See more details on using hashes here.

File details

Details for the file tesseract_decoder-0.1.1.dev20250812175128-py311-none-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250812175128-py311-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 4473b209a3212b5ef1bcc4091477b2c92f0950741fea86b07fedc46775f9f6df
MD5 5ae7f1db4473ff3356402d5cdff80e60
BLAKE2b-256 2d08d2bf3b2584d22205e687ececc662b7d4271fa8c7cac2e3a115ee00f47c6a

See more details on using hashes here.

File details

Details for the file tesseract_decoder-0.1.1.dev20250812175128-py311-none-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250812175128-py311-none-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 904a1159f5135b09234f19ca67a23541fb66804148a84e026e49db5dde65c9be
MD5 11adbf3746c66c9b1c0b60ae7dcc9889
BLAKE2b-256 0f69557693bb1bd5212534f998f2c045830bd2df43544fcfb10b08faeb3d9958

See more details on using hashes here.

File details

Details for the file tesseract_decoder-0.1.1.dev20250812175128-py310-none-manylinux_2_39_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250812175128-py310-none-manylinux_2_39_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 c07d266418d8646ec92e7f2eec5a8fe39c4ea19b65a20ff6177eca30ecc637e5
MD5 a3d3dc92766e401e7dcf3c9d7229e683
BLAKE2b-256 7e279bee30f413cb06c08dad59515103208f72e599231bff0b7d3c58f52fef7e

See more details on using hashes here.

File details

Details for the file tesseract_decoder-0.1.1.dev20250812175128-py310-none-manylinux_2_35_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250812175128-py310-none-manylinux_2_35_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 eed8eb200326875a07e4735ca98025656530376f053b0c8a26f07002bea556a2
MD5 e460a4b0243681879d4706f3a27a24ac
BLAKE2b-256 953a74630bb2b9ede9bfcce05d193f39e01d78d7e27f69b9a8e90f80746f6d3e

See more details on using hashes here.

File details

Details for the file tesseract_decoder-0.1.1.dev20250812175128-py310-none-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250812175128-py310-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 f1b75120e9d6bd36c12efde7ebac599fa13089ff7caa277d3300213668d1bdbb
MD5 8f1aea9e8ae83e54776f1c3dffa61651
BLAKE2b-256 ceae10864ba2d358530a9090c74a24f9e4c6f87de84df9f9f15fde1debdd4226

See more details on using hashes here.

File details

Details for the file tesseract_decoder-0.1.1.dev20250812175128-py310-none-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250812175128-py310-none-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 0beb0170e057e7b1df0238a93dac930f05aa7e3d20e1b07e53b8a0d139b29140
MD5 db8c474ba6addbbec79aa8481f70e4ce
BLAKE2b-256 36bcb478b73f37198e85827d2454c224d8f5554af58dd8ee9df93debccffc0bb

See more details on using hashes here.

Supported by

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