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]}")

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

Uploaded Python 3.12macOS 11.0+ ARM64

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

Uploaded Python 3.11macOS 11.0+ ARM64

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

Uploaded Python 3.10macOS 11.0+ ARM64

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250829212128-py312-none-manylinux_2_39_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 91c2ddbeb5d67f0b5e81e3e858ad357b1049dd71f76bb53d27f07d6b75ef3aa3
MD5 c6b3be98ccf7bcde0a7088df00b6f4dd
BLAKE2b-256 6b7b2b097ed724fd2d0c70087fd9bf3749c2464a99fb869ab1b9802a66812aff

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250829212128-py312-none-manylinux_2_35_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 d7d6e3bb90a4c28c16d7cbfb03413ed611381672519f879e10b856cbc49d80ee
MD5 721f08b9fbfe575d30c5f994fbf047b3
BLAKE2b-256 e6d0b127c4b978e204de9531aafd32241514d353380570c7b8ed66f299d40213

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250829212128-py312-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 7e47d2f9ddbb067424176fb22845d45858a99de32a8f50de9d23ab0488cce426
MD5 6f81fc8e55f2535e38c91e512326e2bd
BLAKE2b-256 15e7ba885f73f3120382d947602c418cba8b5fbb85673e034e11faaf5d8931d2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250829212128-py312-none-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 8d8ed34b0a56c9a1f58e57314d1f721cd986ac7e4b0143da5b8f5372990df5b4
MD5 644fcebb785f8d838d769df7dc59437f
BLAKE2b-256 22a5f0c1e0006d9c04974ea05c83979e88f79e20cc03fe49048ffc6df240c98e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250829212128-py311-none-manylinux_2_39_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 1c0f9b3e911c43f6992f43ed0ae618362caee742d2254207a8e45bdfd45c4a99
MD5 e85077490e3d47b41d243550f5d98862
BLAKE2b-256 3529effbd896a271d8df90e816c2bb040e7799b222c5b7c3b20ea0930990aabb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250829212128-py311-none-manylinux_2_35_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 8bf39ea7c3694b2f4cf27571e540ce31e32c3acc30743617b1512439fd531b4f
MD5 a9da8acb79e7fe42bbb4a4bdfbbf51f6
BLAKE2b-256 f262f699d2e2d9d57aaff709bf153bf9f625a58ade989a789293f78555b69cb2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250829212128-py311-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 d671b73e1c77ca893e47f84ad1aaf2524eeb846aab1e88dbccd5764f7c094ab4
MD5 8c921f0fd29eed6f23d9ee9732aeb4ac
BLAKE2b-256 19d8e291f74c2e52323e6212462459dc93b1e42a83bf8ae4928cca8f09a7cd00

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250829212128-py311-none-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 61cbe73bd9b026bc8d7d2b2ebf58557739758e63767093d923551724d938aad2
MD5 5222bceb417c75c8090ee2d4b99811e2
BLAKE2b-256 0cdefbfe15bf24bb16c19549e3d872cd985671ab6b7767d5ad66e6dda8b8ad29

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250829212128-py310-none-manylinux_2_39_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 48ba8bc9d8946e08a128c0cb705afaf89c2462ac7acaec1704b3735c8af3bfd2
MD5 5fa262c884aba588f2b87796c671717e
BLAKE2b-256 3c1aa893a81890b24d9c29305083865486adc545dfff747a492b0dceecaa577b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250829212128-py310-none-manylinux_2_35_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 71c946a3c23c14aa5675aff286d2ca0516c87585c3ae73eaa5f66dceb6324f87
MD5 92799adf68c2fc00deded26e076dfb8f
BLAKE2b-256 ce880493faa325cbfe2b7148d8bb1cb7a9d000f54689c5715e22a0a25f2fbcaa

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250829212128-py310-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 0a00d97ac6817d7102740fa9623b7ad7c4b2ebc9d4ac747df0162e417fc6adae
MD5 913f99738481e57fa771b5149b2d506c
BLAKE2b-256 64dc7eeff0f2a5d00c5ee661c8e24a306179ae0e72ec52769eede5310d073937

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250829212128-py310-none-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 849889745ca8a8d258895df951ed60c440befbed9f96fd195b0bcec4fe1842c0
MD5 17d63418f6911a4ba33ccc0cb2c05dc4
BLAKE2b-256 4703b81559608ec161c03e20f4e46e902f997a93d08d9da616ccd94fe122135e

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