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

Uploaded Python 3.12macOS 11.0+ ARM64

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

Uploaded Python 3.11macOS 11.0+ ARM64

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

Uploaded Python 3.10macOS 11.0+ ARM64

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250831014332-py312-none-manylinux_2_39_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 3095ae37d692899123d23edf2fbbe9cd7b282a5601a87e2bf7ea6d71c7a81b3c
MD5 45135ddcbf48e05f0bb93c27e287cd43
BLAKE2b-256 3cddc1919602af32ae22408a9e26beefdd88d8ec7e52ea8b974c3db3c64aedf0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250831014332-py312-none-manylinux_2_35_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 0b9505011479e11a646e3d32ec5d8f0cd16065c9ba75a5c18769423e7ea4f978
MD5 ccdf6a9b3ec63a5263ebfc215faa85aa
BLAKE2b-256 21dcafd2ddb4565c0c1031aa06394a8d70de3c29bc6a32f46b2d3967f6d08ea6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250831014332-py312-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 1ed507caf22241c31daacf9fe26ba80f7bf7ca617a2b351c2f8bc5033dc709ab
MD5 d71d6521f11fa64b947c4c1ef08a72f0
BLAKE2b-256 669f74b4010beafca4592fbeddc3479a4dbfe82c28a96f5054a0f8886b792a69

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250831014332-py312-none-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 2b97888894547f5d662c63876566ddcbb3b26aba8cbe32dbdf83ebe842676623
MD5 109c1e48222e162c9170bf5c62303af1
BLAKE2b-256 97cb911aa5f37698f787409a6e8d57539ae8cb114ff4b958d70a692266103f4a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250831014332-py311-none-manylinux_2_39_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 4f7dc500302591c032fa6162afe7fa49923bd1ee003ee84e72999b025f03d137
MD5 1460222447d608007697b6e1508d4f0f
BLAKE2b-256 947a477da5378f1b2e566341ccad5e320680b2f5be4b7d1f5d3dba87f9f2a556

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250831014332-py311-none-manylinux_2_35_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 88d987a4b0859f2e9ffd34c1d9363cf2e91505480b3c8f71e281842e907b1303
MD5 924c285f2bcca6122b322145acbf7ad9
BLAKE2b-256 4d5342e52e1e8f8a3fe8570e039df837c6f409573068f75a616a790c9020f918

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250831014332-py311-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e233be7514f90998a9c766d00d16f0affa32fe38897ed676049fd18edc4e4eac
MD5 3cd350761f45153f5b074238ee4536f6
BLAKE2b-256 2d984db39b50810247706a94739c3c2bf12831a78589f72085bea9cc31c12085

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250831014332-py311-none-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 eb28ffb81573959df68123eebe55fefdd46dc70206928b65b97eeef6727cdb35
MD5 e754401bc2d2ce000f0ca7aac436c98e
BLAKE2b-256 f2fe47ba63d8f54f6aa53d6fc535e78a0205c7b8a8781444469395624361c926

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250831014332-py310-none-manylinux_2_39_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 56d598603c97749dfa290fcf2765bfb3f31d2a5043a5d3495ae4844a4a30ea41
MD5 f3a792dec532fea35e33926997963e90
BLAKE2b-256 a8df04c2db311231434880e613b1fd1c1c38559b706ead992b97ad6cdd9677a7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250831014332-py310-none-manylinux_2_35_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 cf1ba65c3481a0b9f74803214421411824ae244f3183b1969e41a63e9ac9a208
MD5 85a2d69334a47e35e98e043babac7873
BLAKE2b-256 a4fe932a3be05f5f4c3798b77c9cb0f825e50088502fe37b9c407eff624f591e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250831014332-py310-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 d430f70cc31a0785ee1c82d99f134bbbe1d66fe93090a0d0dbef6c7ab11b9b83
MD5 29dfb9c7fe919335e2fed72f76da4fa5
BLAKE2b-256 f15814d62e2285d974cce488e39ba07e2e4ddae7d309b9c2ab9e5a681c1f70f0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250831014332-py310-none-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 c4e000e85729d4e90c8db76874da79d891baa4b203c67736da79e1119c8ac8f0
MD5 d94ada57afb8cc0515932437c3d6c8ba
BLAKE2b-256 8244d7d6ca3408d4d8735a76c6055d889f14c30d4754ac6d589f21a7e06eca41

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