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 detector outcomes
syndrome = np.array([0, 1, 1], dtype=bool)

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

# 5b. Alternatively, decode to errors
decoder.decode_to_errors(syndrome)
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]}")

Good Starting Points for Tesseract Configurations:

The Tesseract paper recommends two setup for starting your exploration with tesseract:

(1) Long-beam setup:

tesseract_config = tesseract.TesseractConfig(
    dem=dem,
    pqlimit=1_000_000,
    det_beam=20,
    beam_climbing=True,
    num_det_orders=21,
    det_order=tesseract_decoder.utils.DetOrder.DetIndex,
    no_revisit_dets=True,
)

(2) Short-beam setup:

tesseract_config = tesseract.TesseractConfig(
    dem=dem,
    pqlimit=200_000,
    det_beam=15,
    beam_climbing=True,
    num_det_orders=16,
    det_order=tesseract_decoder.utils.DetOrder.DetIndex,
    no_revisit_dets=True,
)

For det_order, you can use two other options of DetIndex and DetCoordinate as well. These values balance decoding speed and accuracy across the benchmarks reported in the paper and can be adjusted for specific use cases.

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.dev20250909231331-py313-none-manylinux_2_39_x86_64.manylinux2014_x86_64.whl (3.5 MB view details)

Uploaded Python 3.13manylinux: glibc 2.39+ x86-64

tesseract_decoder-0.1.1.dev20250909231331-py313-none-manylinux_2_35_x86_64.manylinux2014_x86_64.whl (3.6 MB view details)

Uploaded Python 3.13manylinux: glibc 2.35+ x86-64

tesseract_decoder-0.1.1.dev20250909231331-py313-none-macosx_11_0_arm64.whl (3.1 MB view details)

Uploaded Python 3.13macOS 11.0+ ARM64

tesseract_decoder-0.1.1.dev20250909231331-py313-none-macosx_10_13_x86_64.whl (3.1 MB view details)

Uploaded Python 3.13macOS 10.13+ x86-64

tesseract_decoder-0.1.1.dev20250909231331-py312-none-manylinux_2_39_x86_64.manylinux2014_x86_64.whl (3.5 MB view details)

Uploaded Python 3.12manylinux: glibc 2.39+ x86-64

tesseract_decoder-0.1.1.dev20250909231331-py312-none-manylinux_2_35_x86_64.manylinux2014_x86_64.whl (3.6 MB view details)

Uploaded Python 3.12manylinux: glibc 2.35+ x86-64

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

Uploaded Python 3.12macOS 11.0+ ARM64

tesseract_decoder-0.1.1.dev20250909231331-py312-none-macosx_10_13_x86_64.whl (3.1 MB view details)

Uploaded Python 3.12macOS 10.13+ x86-64

tesseract_decoder-0.1.1.dev20250909231331-py311-none-manylinux_2_39_x86_64.manylinux2014_x86_64.whl (3.5 MB view details)

Uploaded Python 3.11manylinux: glibc 2.39+ x86-64

tesseract_decoder-0.1.1.dev20250909231331-py311-none-manylinux_2_35_x86_64.manylinux2014_x86_64.whl (3.6 MB view details)

Uploaded Python 3.11manylinux: glibc 2.35+ x86-64

tesseract_decoder-0.1.1.dev20250909231331-py311-none-macosx_11_0_arm64.whl (3.2 MB view details)

Uploaded Python 3.11macOS 11.0+ ARM64

tesseract_decoder-0.1.1.dev20250909231331-py311-none-macosx_10_13_x86_64.whl (3.1 MB view details)

Uploaded Python 3.11macOS 10.13+ x86-64

tesseract_decoder-0.1.1.dev20250909231331-py310-none-manylinux_2_39_x86_64.manylinux2014_x86_64.whl (3.5 MB view details)

Uploaded Python 3.10manylinux: glibc 2.39+ x86-64

tesseract_decoder-0.1.1.dev20250909231331-py310-none-manylinux_2_35_x86_64.manylinux2014_x86_64.whl (3.6 MB view details)

Uploaded Python 3.10manylinux: glibc 2.35+ x86-64

tesseract_decoder-0.1.1.dev20250909231331-py310-none-macosx_11_0_arm64.whl (3.2 MB view details)

Uploaded Python 3.10macOS 11.0+ ARM64

tesseract_decoder-0.1.1.dev20250909231331-py310-none-macosx_10_13_x86_64.whl (3.1 MB view details)

Uploaded Python 3.10macOS 10.13+ x86-64

File details

Details for the file tesseract_decoder-0.1.1.dev20250909231331-py313-none-manylinux_2_39_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250909231331-py313-none-manylinux_2_39_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 6dac9bccc532d7ec00569e39b12b067cb7d71661f119d6705622a698798b6d18
MD5 65acb0dadccc1278884e36c30687b041
BLAKE2b-256 dce4948cf91d1124c24abd0e949908fee15b5d390b6d60c3df12877352b9cdf1

See more details on using hashes here.

File details

Details for the file tesseract_decoder-0.1.1.dev20250909231331-py313-none-manylinux_2_35_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250909231331-py313-none-manylinux_2_35_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 49a45b8c77c019cbfb1248ece5a6e97716281ef193a2b8f8c03a2827dc6b07a4
MD5 8f975990371b2fae2d13a214f02d32df
BLAKE2b-256 88bff53a037edc0aa1f453b8051d026da62db68c8497567ac2b8f7f7d0d9c3dd

See more details on using hashes here.

File details

Details for the file tesseract_decoder-0.1.1.dev20250909231331-py313-none-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250909231331-py313-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a29a1c0bf8de83b5befee3ca4d7763cccb1eb1b8c6f6dc62b0e5c2a17994c8f9
MD5 559d436f5994e7072a00cd0a86879145
BLAKE2b-256 85519fe8ae38077b30f9c8d5e7461883191b568fc68e752710b08653b32852aa

See more details on using hashes here.

File details

Details for the file tesseract_decoder-0.1.1.dev20250909231331-py313-none-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250909231331-py313-none-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 df77c7185c74311bcb2ad8be92e3ff0600ae975721a3fe19c4865fd3459eb495
MD5 9d53ebf44add5b34860e83be61cc4161
BLAKE2b-256 8080c060b8b76e4d11c032ac9d47f8adb527f4fab52ff5fafa549d94fbbdbe21

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250909231331-py312-none-manylinux_2_39_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 ccd8c8818b75a042771aeb0f124f3e3a3ca142b9a5b8be54299472e1998bc9f5
MD5 a71df3cac107b965c50fa94f94424f30
BLAKE2b-256 f7beb4b7140bbbe5867114013aa63521ff450268ceff6343d1669d4830979aed

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250909231331-py312-none-manylinux_2_35_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 adafe98800712c5637061a3acfc427b1bfc6b0cedc973fd5bb21a24b790dbb41
MD5 1995bd8acb94a9246e3013c5a2185d78
BLAKE2b-256 0ddf4b799cbe1538fa4abe2b1cb67e9cbffde41f183ed2d56051891a101f3a25

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250909231331-py312-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 2cf46d259a980620a419e967b0dd15a60f6615453e5e9b40d515a0d421ad7b41
MD5 3539c9ab274a719f062c730bc839a33c
BLAKE2b-256 834bee3d0f305f7edb463dde7fe5d2b0f22e29ec796c705c69cfeebd79a7597a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250909231331-py312-none-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 9a2da7af99e732a3cfadc17ce24b95d8fa06b4b8f908c28cfbaead9526726db9
MD5 8fdc4112524c8ec76759e7bbb836a48a
BLAKE2b-256 9feec89618cad0bbeea1ce3196ad645560b6ceef9691810fec36b35f81a35b28

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250909231331-py311-none-manylinux_2_39_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 a9b9e1746ccbd03b6aa25109e4b05f27171e3e18083da46437edfdb0a899a5f2
MD5 a7f4e847883b174f2a2135753b3112e9
BLAKE2b-256 f5f5defb5c5be00a3044d8a1a89b07b76478cbd5a281b119bab21b830d283bbc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250909231331-py311-none-manylinux_2_35_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 1ee9fd7a26c41453abccc942b3a020d876e3d94f0e3d030dba43c74fb6ef6eda
MD5 07590e68791c6f390febd9ebd43aced0
BLAKE2b-256 6344fbb27046ed531fbb0d764b286e9579316e2119301d544347fe9a94cfb212

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250909231331-py311-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 3e63e9981cfeae13a8846d49c1ac77466416013f0e66347d538c8c7a8b66d592
MD5 9b37cc2bee8f0eb14507635fb6e4ab35
BLAKE2b-256 50f2a0235d84a25527845e61ef02813c3b6335098895ffbdc8fbb3a91be9e805

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250909231331-py311-none-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 c49aef78ee514e345d73baf429e165a65671d8a3b0a3be4c2e15ae5bde960329
MD5 f00dcca429907582006088d7acd818cb
BLAKE2b-256 fbde029f226018a7fea553aac59ff2d45b9082078d41b1ee8ccde659d23bb035

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250909231331-py310-none-manylinux_2_39_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 f96dd677070ead0650ca4f8a941d3ff836f1cb1020063eb796ee710166def45f
MD5 9e05e90566a87202c47850aa5c2b58b4
BLAKE2b-256 170cc57b9fac578cbf284750961da057df74c9c07f219cafc7c8e58b0e6f7750

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250909231331-py310-none-manylinux_2_35_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 691874116ad3f8ddf09cd84302ad32395582c282b13917e6ceac505a64c34d91
MD5 8894244d72a2192429966095881d7f41
BLAKE2b-256 823b4de96226bffa37a0033cf2ec1fe30ce2c4379f50c7863897fad21e49b488

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250909231331-py310-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 749d5f319d303da6f2fa61857334944ddcb3223c970637d2bb6e7016a1243fa7
MD5 2a2a122c3eea695807ad73a83c5e7759
BLAKE2b-256 329908557c34d9c9b3149ddff668c5c96c43a55cdc3a94af7d40e9e91e30d0e0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250909231331-py310-none-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 a9d3c36104f823e899cd1cf596d1038199ee2e1ec7e16b1377bb3b92de310e5b
MD5 edec9e87948e256122bba9bb3ac1b1dc
BLAKE2b-256 b955897c8a9270fe91614859c651ce0c86cb81c27c7ba6d1531c431042fbb878

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