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

Uploaded Python 3.13macOS 11.0+ ARM64

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

Uploaded Python 3.12macOS 11.0+ ARM64

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

Uploaded Python 3.11macOS 11.0+ ARM64

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

Uploaded Python 3.10macOS 11.0+ ARM64

tesseract_decoder-0.1.1.dev20250924202930-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.dev20250924202930-py313-none-manylinux_2_39_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250924202930-py313-none-manylinux_2_39_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 2a6c9db15a158291cb4d92fc37efa71bd2adcf31627a92ba776e9c11ebac1c5f
MD5 3efb8e7eb4a6a65a41739dc8b7ba6f18
BLAKE2b-256 45f39d8375ddefcee24f66bfa183e7d9388116738ee50eaa8422e0a4dd0707d8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250924202930-py313-none-manylinux_2_35_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 97e04dbc092392d6994f792c8e123da538faabe2c884167fd20d8e293fe17d58
MD5 8c25842e9c2b708388406c5fd7a17293
BLAKE2b-256 2aadd9cc5f3ec6234319703652729f867635392605946366b0e6738f284b8b86

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250924202930-py313-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c200e0d62bda6ce71aacf09b79c5464a7426272063c7917d222e84b4bead0ff7
MD5 40abd46f7c10cd2cf875884e16c42e19
BLAKE2b-256 f8960f6e028ae51e9ba2d385487df811ab239effc8d9b8183a18cb7174733ba0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250924202930-py313-none-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 e180babee48df43bae2498da3bb3f76f7717fd9151b8a67bfdc69e3ebadf98b4
MD5 a477efff6dd7b50d50b85667e9414738
BLAKE2b-256 728dee9b7c93e3f2ef4fe3da92b8819299eb85672e00186b38381853a707670e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250924202930-py312-none-manylinux_2_39_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 1780b5ed331d39977ab7692e3b7ef7f037e3aa27b29f5b04ec60ebeb3dc444ec
MD5 1d7481a1170e7571e512832f68fee026
BLAKE2b-256 7b60eeb8086112f45b72a60d9854b708b17d898d46fa8fc43c8c6fce46e84a89

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250924202930-py312-none-manylinux_2_35_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 25826e66e968a7aa7aa11c2458e5de9c0df4ca2478f2c1357409c109ec6371f1
MD5 e4962da8d61f8b89a800ef0a25d8b6df
BLAKE2b-256 ffb74e580ce104507f21be7743819f287f28f4fda29a79db237b352d5697af43

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250924202930-py312-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 f9dfd2d03227b59411c7889ca98e4ebc4c171f78305a58ac9a5721d296dafbf9
MD5 c5492f261cb56aabfa86ea84331041fc
BLAKE2b-256 64698cbb525ec7259d0cafba6ea2fd33d22e83ec9233d1c79283a88d8bcf4839

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250924202930-py312-none-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 5d8949dfcde64a61460d1b0dce329ef5576fd094f6aedf6b8eba93197d179009
MD5 9976aff4fde1123901d68c4ed44a881a
BLAKE2b-256 bf75ef9e348b9d49fa2b8909921b33e67489276d4c1a3bda0cf5b9d02dcd14e3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250924202930-py311-none-manylinux_2_39_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 cf3a5730f756e787e01329db60839657fb2a62bcb129fd4dff7fbaa630bb9bc6
MD5 438461306af66f9d11e8c871b9825b8e
BLAKE2b-256 a42d6b80260218f33940931aab123b2958d92ef6de4264bb062c77749c6e9ad2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250924202930-py311-none-manylinux_2_35_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 3003dc38502ca748ac5964d1107246ebf27157b082a724e29a47dfcffe8b423b
MD5 38f84ffa6a29b5181a8a2be6a98e56d7
BLAKE2b-256 b6822b94ba553ce4ca0494678ba0b870088ffa3f0a1dbcc6859dac5cb190cbdb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250924202930-py311-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 4141029eb18dee32d7591ae3c62c18caf9a4c690880b751e17545ec05e144e53
MD5 af9c30912f39e196776c77a22f303bf5
BLAKE2b-256 fd139bdd9b64aff289664f20d0b503b086d8c85d4c499264f1b05a34ee709f09

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250924202930-py311-none-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 eb659bbd432b64654e1c1f8d8fb69b22c65a6cd03c9a7cdcac462c638269b48a
MD5 9ad673130248f69ed3b02be77fcfa791
BLAKE2b-256 acee2b9f0e242ba1e6ed96f4d2927c8a13ed54c6fd63c9355b28cc691997d0cb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250924202930-py310-none-manylinux_2_39_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 df8eb5e18eea6f31f0395e95a85d84945ee5b7393779bf5dae117f869f041bcc
MD5 24e9aabbc5f925c235bf527c3e7200ef
BLAKE2b-256 f077464c9fcc873b8afe6ef56b011c993ea01930835264a087f88d7065c7aad6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250924202930-py310-none-manylinux_2_35_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 6494d7c924ca47c28eaa244b75cb3e4bdaa506f61151d4e24c526dfcd175253a
MD5 23f90339f5e580eee8cd91f1c6bca4b5
BLAKE2b-256 f3aab49b3cd1a16c31d5ebd39506e63a6d357ad250f501438075433afade1523

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250924202930-py310-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 1da56b34e66ed7064f57f5366335abc956d9ab802b88089395e3c27b2d4b59d1
MD5 d60eaad6613c9f46ed4ac94a099d87c5
BLAKE2b-256 c3e0f6ec649b5742c1aa5de505a98a6bcff64484b215f6bf0ded9147beb78424

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250924202930-py310-none-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 8be1e00462c2b81161cdcea03e38659e37c40fd2c44876949030c7c730e4deeb
MD5 2f07964aa472c1bcc363846a0390494c
BLAKE2b-256 599db02d05464d4ea342bc7db61c15a3bfe252e3014d16884f0ca3cc374ed59d

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