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.

import tesseract_decoder.tesseract as tesseract
import stim

# 1. Define a detector error model (DEM)
dem = stim.DetectorErrorModel("""
    error(0.1) D0 D1
    error(0.2) D1 D2 L0
    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. Configure and create a decoder instance
decoder = tesseract.TesseractDecoder(config)

# 4. Simulate detection events and decode it
detections = [1, 2]
flipped_observables = decoder.decode(detections)

print(f"Detections: {detections}")
print(f"Flipped observables: {flipped_observables}")

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.dev20250811165654-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.dev20250811165654-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.dev20250811165654-py312-none-macosx_11_0_arm64.whl (3.1 MB view details)

Uploaded Python 3.12macOS 11.0+ ARM64

tesseract_decoder-0.1.1.dev20250811165654-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.dev20250811165654-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.dev20250811165654-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.dev20250811165654-py311-none-macosx_11_0_arm64.whl (3.1 MB view details)

Uploaded Python 3.11macOS 11.0+ ARM64

tesseract_decoder-0.1.1.dev20250811165654-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.dev20250811165654-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.dev20250811165654-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.dev20250811165654-py310-none-macosx_11_0_arm64.whl (3.1 MB view details)

Uploaded Python 3.10macOS 11.0+ ARM64

tesseract_decoder-0.1.1.dev20250811165654-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.dev20250811165654-py312-none-manylinux_2_39_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250811165654-py312-none-manylinux_2_39_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 b24f46f5932c7a39ba783a663cd529b28b5b3f61ca74c929e21033948ad96fd8
MD5 691fa560a386f60b46a170ddef9c380f
BLAKE2b-256 9f182f6ea1b99761ce982a98c8c00bb6bb17b1f927d22e0d2ba5e0a0a07a1c5e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250811165654-py312-none-manylinux_2_35_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 1f08359454f141aa16d279ff0f6b1239aa2ff41cf6be1ab8297fedc2110d5083
MD5 421832a4fd14de4430d26387eb800512
BLAKE2b-256 9f653f6c0c49dcb0232c2e3069140b4fbe5b40b789902b1115339826af9d37e8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250811165654-py312-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 db0a5c38b202304bb955adf96a168bea91818606c292f9f3ac93caf6108c0f9b
MD5 98d48c726b0527868204bf4c63963146
BLAKE2b-256 2f75fc2932792d0c6754b74f4184e10bb8ac016cdb3bea01157bb071a18a9efe

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250811165654-py312-none-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 7b17982bbd0700859198d7953865b89958770baaa19fee389ec10a2b804bfd85
MD5 7634b6399a106e0900d8b176d7a9b73c
BLAKE2b-256 8dbf231fb3236865ff87226f98a418ae6aaba0972ac4542334532e318f9b6bb8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250811165654-py311-none-manylinux_2_39_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 534b28b203e994d0159795b5a48c6e188204ad80c294ea7545469bf7b72150b2
MD5 ea729cf2653dfd6ecdf8dab418257d63
BLAKE2b-256 36e38ab3be3c4e42eb55110f3bf068dd5a61a35cec737a76b29e6636dcd4f183

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250811165654-py311-none-manylinux_2_35_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 2e8ec220bd7e9c3f2c1e66a31e3d015d5d42f656f4f57e2140dfc8431e5c967b
MD5 3500677a779567626e2dcad00a53d934
BLAKE2b-256 7d1ae17508ade0a3d59c34727c9265ec114fe243b27c66137fcb9befa2538108

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250811165654-py311-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 1ea4f1cec35fee7bf958fbf58434cd971ecb4755d9abe9b591c4734390a3e514
MD5 6284ff10cad288ba40d96de722d93f71
BLAKE2b-256 4f64358ff433152aa29965b81dedae93213cc4c7a47e85b881b17e4e3fdee9b6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250811165654-py311-none-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 40d7e8e42c615420e92042763dc5e6ac2073ed83e2f2627248d2a252e03fa24a
MD5 7bb47c5be344c8eb5b729d908b9d1966
BLAKE2b-256 786be115cacf4b8e9d1d0a64ad7e24ff969c63e1d866c15d29874116d35b64d8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250811165654-py310-none-manylinux_2_39_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 1346a5860d5076b0cbdd278285d812c5439fc4b3c386b10a3bb1802a00888f75
MD5 e39c48131330e76355abe04773abdddf
BLAKE2b-256 6eee0529c2d3d20e9552c763bd11c1f96647c74caa791f8c32d3e0972fd7eed6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250811165654-py310-none-manylinux_2_35_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 b4d654c8dd62327d3032e200aa0c7804d5d7b37c5d897e66981d7b244275bfcb
MD5 291a2e11dbfc76b4bd5c78cecd8b178e
BLAKE2b-256 1350af3781bae13bb61c3a0ccadb602bc8d1d380c88f53ce225b85e640b9dfa9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250811165654-py310-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 6e4ae6ddc84591a46db7c1020e572e6692034028360c3985851b6c8d5b632f13
MD5 9492c1734a664fe3a77c7808871f19f2
BLAKE2b-256 0555e6d36e82959196fb75ce60c5e0306ad49c06715ac1c895733439e5a84642

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250811165654-py310-none-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 62a03a2d5f5323ffdf904159ddc5e2c17307af324d257e8658c9d0eec8246139
MD5 e3ccad11a7faf75d9975353026b6c960
BLAKE2b-256 14bd272e70a0eb512bd40ca2dbd73a9535280249a307c254532706de17d1286b

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