Skip to main content
Pre-release

This release is a pre-release and may not be stable for production use.

Tesseract Decoder

A Search-Based Decoder for Quantum Error Correction.

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

Installation – Usage – Python Interface – Paper – Help – Citation – Contact

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.

Metadata

Release files for tesseract-decoder 0.1.1.dev20250809043128

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Built distributions (wheels)

Table of built distributions (wheels) for tesseract-decoder 0.1.1.dev20250809043128
File
tesseract_decoder-0.1.1.dev20250809043128-py312-none-manylinux_2_39_x86_64.manylinux2014_x86_64.whl Python 3.12 none Linux glibc 2.17+ x86-64, Linux glibc 2.39+ x86-64 Details
tesseract_decoder-0.1.1.dev20250809043128-py312-none-manylinux_2_35_x86_64.manylinux2014_x86_64.whl Python 3.12 none Linux glibc 2.17+ x86-64, Linux glibc 2.35+ x86-64 Details
tesseract_decoder-0.1.1.dev20250809043128-py312-none-macosx_11_0_arm64.whl Python 3.12 none macOS 11.0+ ARM64 Details
tesseract_decoder-0.1.1.dev20250809043128-py312-none-macosx_10_13_x86_64.whl Python 3.12 none macOS 10.13+ x86-64 Details
tesseract_decoder-0.1.1.dev20250809043128-py311-none-manylinux_2_39_x86_64.manylinux2014_x86_64.whl Python 3.11 none Linux glibc 2.39+ x86-64, Linux glibc 2.17+ x86-64 Details
tesseract_decoder-0.1.1.dev20250809043128-py311-none-manylinux_2_35_x86_64.manylinux2014_x86_64.whl Python 3.11 none Linux glibc 2.35+ x86-64, Linux glibc 2.17+ x86-64 Details
tesseract_decoder-0.1.1.dev20250809043128-py311-none-macosx_11_0_arm64.whl Python 3.11 none macOS 11.0+ ARM64 Details
tesseract_decoder-0.1.1.dev20250809043128-py311-none-macosx_10_13_x86_64.whl Python 3.11 none macOS 10.13+ x86-64 Details
tesseract_decoder-0.1.1.dev20250809043128-py310-none-manylinux_2_39_x86_64.manylinux2014_x86_64.whl Python 3.10 none Linux glibc 2.17+ x86-64, Linux glibc 2.39+ x86-64 Details
tesseract_decoder-0.1.1.dev20250809043128-py310-none-manylinux_2_35_x86_64.manylinux2014_x86_64.whl Python 3.10 none Linux glibc 2.35+ x86-64, Linux glibc 2.17+ x86-64 Details
tesseract_decoder-0.1.1.dev20250809043128-py310-none-macosx_11_0_arm64.whl Python 3.10 none macOS 11.0+ ARM64 Details
tesseract_decoder-0.1.1.dev20250809043128-py310-none-macosx_10_13_x86_64.whl Python 3.10 none macOS 10.13+ x86-64 Details

Total release size: 38.9 MB

Release files / tesseract_decoder-0.1.1.dev20250809043128-py312-none-manylinux_2_39_x86_64.manylinux2014_x86_64.whl

Download URL tesseract_decoder-0.1.1.dev20250809043128-py312-none-manylinux_2_39_x86_64.manylinux2014_x86_64.whl
Size 3.4 MB
Tags Linux glibc 2.17+ x86-64 Linux glibc 2.39+ x86-64 Python 3.12
SHA-256 checksum
How to use checksums
7aa794a83b06429a8c41b38d04839b0f9586e63510f7cefb2c046e02894c1303
BLAKE2b-256 checksum
How to use checksums
cb69bf79a83f1cd7cfca2e033737c2248f7c8318a24ea20e5f3f78191e19f193
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.9.23

Release files / tesseract_decoder-0.1.1.dev20250809043128-py312-none-manylinux_2_35_x86_64.manylinux2014_x86_64.whl

Download URL tesseract_decoder-0.1.1.dev20250809043128-py312-none-manylinux_2_35_x86_64.manylinux2014_x86_64.whl
Size 3.5 MB
Tags Linux glibc 2.17+ x86-64 Linux glibc 2.35+ x86-64 Python 3.12
SHA-256 checksum
How to use checksums
962529a44638301d46f87abd3075585327d7eddebaacef2f3f7a58f5cd3531b7
BLAKE2b-256 checksum
How to use checksums
13024c547c0a35c1ac6ceabd211e7dd43ed94fa7bcd601054b258f32ddf7a622
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.9.23

Release files / tesseract_decoder-0.1.1.dev20250809043128-py312-none-macosx_11_0_arm64.whl

Download URL tesseract_decoder-0.1.1.dev20250809043128-py312-none-macosx_11_0_arm64.whl
Size 3.1 MB
Tags Python 3.12 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
edb63b8582cf92be61cc049aa207411a3d4eacd5da7429deecc9f8e48d69f71d
BLAKE2b-256 checksum
How to use checksums
ebde4f924ed8ed7dfc894288504d1213f14a45d1820d4cc723127aa35a09c518
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.9.23

Release files / tesseract_decoder-0.1.1.dev20250809043128-py312-none-macosx_10_13_x86_64.whl

Download URL tesseract_decoder-0.1.1.dev20250809043128-py312-none-macosx_10_13_x86_64.whl
Size 3.0 MB
Tags Python 3.12 macOS 10.13+ x86-64
SHA-256 checksum
How to use checksums
57fab8c987d802f6e0f2db7465f3ea9c569edc7fe776053b8e6c1c03b56baea8
BLAKE2b-256 checksum
How to use checksums
3616a1c5aae306034ec90310593efa03598283d7873dc1309317c16cfbfeb5fb
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.9.23

Release files / tesseract_decoder-0.1.1.dev20250809043128-py311-none-manylinux_2_39_x86_64.manylinux2014_x86_64.whl

Download URL tesseract_decoder-0.1.1.dev20250809043128-py311-none-manylinux_2_39_x86_64.manylinux2014_x86_64.whl
Size 3.4 MB
Tags Linux glibc 2.17+ x86-64 Linux glibc 2.39+ x86-64 Python 3.11
SHA-256 checksum
How to use checksums
4c145e18bfd0d2fc43cfa8670caac47edd7ddb13b215dfd22ad366c50d100bf5
BLAKE2b-256 checksum
How to use checksums
1aab8f9ae7abd632aa4abe1eca5a88163794fc7bd235403cf7a3972bd2a702f9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.9.23

Release files / tesseract_decoder-0.1.1.dev20250809043128-py311-none-manylinux_2_35_x86_64.manylinux2014_x86_64.whl

Download URL tesseract_decoder-0.1.1.dev20250809043128-py311-none-manylinux_2_35_x86_64.manylinux2014_x86_64.whl
Size 3.5 MB
Tags Linux glibc 2.17+ x86-64 Linux glibc 2.35+ x86-64 Python 3.11
SHA-256 checksum
How to use checksums
c24d21fe61da88a416aa393e2d8587b6dfbe01eca457dcba1d56804e8b2398a0
BLAKE2b-256 checksum
How to use checksums
c2dd16d0f487859b8b78f13748fe0b863421c3523b050d1eaed1ff99049f5141
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.9.23

Release files / tesseract_decoder-0.1.1.dev20250809043128-py311-none-macosx_11_0_arm64.whl

Download URL tesseract_decoder-0.1.1.dev20250809043128-py311-none-macosx_11_0_arm64.whl
Size 3.1 MB
Tags Python 3.11 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
ec5f476bf9edc763045389011719af68e9a8e04c0a9828f257307f92b38c266a
BLAKE2b-256 checksum
How to use checksums
843044b89289de3bc7098db10e7e12bf420f927b2bc3827c7cfc47fa0cb2a760
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.9.23

Release files / tesseract_decoder-0.1.1.dev20250809043128-py311-none-macosx_10_13_x86_64.whl

Download URL tesseract_decoder-0.1.1.dev20250809043128-py311-none-macosx_10_13_x86_64.whl
Size 3.0 MB
Tags Python 3.11 macOS 10.13+ x86-64
SHA-256 checksum
How to use checksums
237e4f12523074f8a4ed481afd0d5e026a7ab187d6f50c1ed0f55a71c2f75cbe
BLAKE2b-256 checksum
How to use checksums
4042bff09064f618357a1c44c7da462477da8a1d54f28c473d2c351c0f470d32
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.9.23

Release files / tesseract_decoder-0.1.1.dev20250809043128-py310-none-manylinux_2_39_x86_64.manylinux2014_x86_64.whl

Download URL tesseract_decoder-0.1.1.dev20250809043128-py310-none-manylinux_2_39_x86_64.manylinux2014_x86_64.whl
Size 3.4 MB
Tags Linux glibc 2.17+ x86-64 Linux glibc 2.39+ x86-64 Python 3.10
SHA-256 checksum
How to use checksums
1bdd849610a7b2aa14a4704d92c11743990d7bc14749d57092a25897e307f2d4
BLAKE2b-256 checksum
How to use checksums
80733ef7d4c77e0d412ecf40e612df009a85ac48752caecf446080fffcd074d8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.9.23

Release files / tesseract_decoder-0.1.1.dev20250809043128-py310-none-manylinux_2_35_x86_64.manylinux2014_x86_64.whl

Download URL tesseract_decoder-0.1.1.dev20250809043128-py310-none-manylinux_2_35_x86_64.manylinux2014_x86_64.whl
Size 3.5 MB
Tags Linux glibc 2.17+ x86-64 Linux glibc 2.35+ x86-64 Python 3.10
SHA-256 checksum
How to use checksums
8bd98eea02c754b2907e8ea3b68ddb6a0e824b9a7c70aa62aabd6db9ede7e923
BLAKE2b-256 checksum
How to use checksums
ccdf8d64849fc4ebd96aac5d682bc3d8852392caa44882aab5036a406f43375b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.9.23

Release files / tesseract_decoder-0.1.1.dev20250809043128-py310-none-macosx_11_0_arm64.whl

Download URL tesseract_decoder-0.1.1.dev20250809043128-py310-none-macosx_11_0_arm64.whl
Size 3.1 MB
Tags Python 3.10 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
a651cc24af13de6f93c3fcccf94d17711964213c5afe316f8eab71a87013ce31
BLAKE2b-256 checksum
How to use checksums
e4a52a7b56a06acd01a67dadb45f1d7858bfb16a4c0ca384cc11f85f1a70951c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.9.23

Release files / tesseract_decoder-0.1.1.dev20250809043128-py310-none-macosx_10_13_x86_64.whl

Download URL tesseract_decoder-0.1.1.dev20250809043128-py310-none-macosx_10_13_x86_64.whl
Size 3.0 MB
Tags Python 3.10 macOS 10.13+ x86-64
SHA-256 checksum
How to use checksums
6864099a4d882f7dd89808f91a492fd317ae56f5dd7f08d76d54a6b6ee24e85d
BLAKE2b-256 checksum
How to use checksums
fdd1a37e2c1e29df3eda36ff54386b7c30a2596b918a788814a7535f1128c01a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.9.23

Release history Release notifications | RSS feed

This release
Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page