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.

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.

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.dev20250809145641-py312-none-manylinux_2_39_x86_64.manylinux2014_x86_64.whl (3.4 MB view details)

Uploaded Python 3.12manylinux: glibc 2.39+ x86-64

tesseract_decoder-0.1.1.dev20250809145641-py312-none-manylinux_2_35_x86_64.manylinux2014_x86_64.whl (3.5 MB view details)

Uploaded Python 3.12manylinux: glibc 2.35+ x86-64

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

Uploaded Python 3.12macOS 11.0+ ARM64

tesseract_decoder-0.1.1.dev20250809145641-py312-none-macosx_10_13_x86_64.whl (3.0 MB view details)

Uploaded Python 3.12macOS 10.13+ x86-64

tesseract_decoder-0.1.1.dev20250809145641-py311-none-manylinux_2_39_x86_64.manylinux2014_x86_64.whl (3.4 MB view details)

Uploaded Python 3.11manylinux: glibc 2.39+ x86-64

tesseract_decoder-0.1.1.dev20250809145641-py311-none-manylinux_2_35_x86_64.manylinux2014_x86_64.whl (3.5 MB view details)

Uploaded Python 3.11manylinux: glibc 2.35+ x86-64

tesseract_decoder-0.1.1.dev20250809145641-py311-none-macosx_11_0_arm64.whl (3.1 MB view details)

Uploaded Python 3.11macOS 11.0+ ARM64

tesseract_decoder-0.1.1.dev20250809145641-py311-none-macosx_10_13_x86_64.whl (3.0 MB view details)

Uploaded Python 3.11macOS 10.13+ x86-64

tesseract_decoder-0.1.1.dev20250809145641-py310-none-manylinux_2_39_x86_64.manylinux2014_x86_64.whl (3.4 MB view details)

Uploaded Python 3.10manylinux: glibc 2.39+ x86-64

tesseract_decoder-0.1.1.dev20250809145641-py310-none-manylinux_2_35_x86_64.manylinux2014_x86_64.whl (3.5 MB view details)

Uploaded Python 3.10manylinux: glibc 2.35+ x86-64

tesseract_decoder-0.1.1.dev20250809145641-py310-none-macosx_11_0_arm64.whl (3.1 MB view details)

Uploaded Python 3.10macOS 11.0+ ARM64

tesseract_decoder-0.1.1.dev20250809145641-py310-none-macosx_10_13_x86_64.whl (3.0 MB view details)

Uploaded Python 3.10macOS 10.13+ x86-64

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250809145641-py312-none-manylinux_2_39_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 f34f6f0d11701124f66216031b7d8461d34113f716822a7e7abf17ce27034148
MD5 000a505a683a0ea940206750b0b878e1
BLAKE2b-256 c873f8aac7293c47b59f54e61776b7cab4d9224da655b0a77a38f7e1794832bf

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250809145641-py312-none-manylinux_2_35_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 2c63f2c78dd397a11b4559c165c2db857fbe0db0494dcc893d41e4d8c8ff4509
MD5 3d471c55f55bc6eb4e5a69e5df07c00c
BLAKE2b-256 5611c6b3ad7bafc5a953c8a78b642d502db6d658f2a5818094dbe172b9a9c182

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250809145641-py312-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 bcf88a21c60ac3f7b0e25fb4f7e1a42e833e416df0a368aca45a7c960feb2f4e
MD5 068a80ea88c5de8b49de0fac84873a82
BLAKE2b-256 ade636aa2a3e4a9b5e03588ee7dfcd687b5df064ef0f9622a82a4408a95bfaf3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250809145641-py312-none-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 5d9f2e3ef14559a03b4e2cafd0fb127ea6d1c9781dad61bd158f8c5b6a098f57
MD5 924305ddacb7bee6c85b73bf4958201c
BLAKE2b-256 c052735ea19497c85b4434d755e21ca0fb0109f91c7903ec7b08ea2b792b9b54

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250809145641-py311-none-manylinux_2_39_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 80cc2e52eeb6913a89f03a39e02a0d9ff006af47651501e1676d0b4e525e23df
MD5 59bfef77ca2930af739c2076ae84a047
BLAKE2b-256 b66b1916057427cedfcbc2928c62a8129e2b477cd91d0e155555e7cb7a2776aa

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250809145641-py311-none-manylinux_2_35_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 0d9ed100152326bca157b053744f95e6b2fe2027891b335743ed238278d2919a
MD5 a2fad62950bea2daedb3430dab9b6f08
BLAKE2b-256 2bfd6d90afbb66ff371578a82945a9b4d4907fcb74923859fb7bb8dd909e7f57

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250809145641-py311-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 66047b24baf6d11c3f6b1fb72391407358f6e2bbbed6fbb77c9b8e3caca4c846
MD5 c62d852a85f192d51fa116eeb6c1d380
BLAKE2b-256 f9ca14eb180af7df678dc8f99e04250f9ba8e0962eaa5d3335f40a5bfbf14ef4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250809145641-py311-none-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 94477e5d2a97e28f17ead175db6c816abcdc0b0ebd9274fe305944c51bbf84b2
MD5 f358edb5847a2366bf0f9e06656776b9
BLAKE2b-256 a6d2659f38de1b174cec16caf98cff8710ea5f5aa173ce16f0a97812417a6fdb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250809145641-py310-none-manylinux_2_39_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 b7b70e2e2fc4fb518afc2337dba294c01eccc9627357a4240b121d493b675a24
MD5 b87260342c16d2bd4ce7d7c04f245f27
BLAKE2b-256 44cc3e338421dfaf26ca14b4d92c5883532d349aae95558c0e41293662d981f0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250809145641-py310-none-manylinux_2_35_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 601f275ea6ddd218221362f27902c0bfe7d4aecd406981d9c72b65c33ceeb9df
MD5 5710cd5fe33ac4413f9ce2af6380108a
BLAKE2b-256 8c007c121395fd52d6f8b176b3178f0817a79c5f643269ccc098e38d607bee9d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250809145641-py310-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 f43a085ba713f1bd97819306735daf2b36765ad2f5c8b6c576dbed5321ff387d
MD5 34dc6b25b33e5d5dd956ee27d731a1ad
BLAKE2b-256 2a696b4744d35c6510c6455e0aef4d2407e2b3591de02a2beacc987721543f03

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250809145641-py310-none-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 4c6726ddca85d6c58c8bf9aeb346c25ba54ed7ba19ac1d356a3d351428b4df16
MD5 83852f236135622ded468bbf8843b08c
BLAKE2b-256 25d38ad1261ac572f752e729a8929781c91ad5a31de909ca0b1652da1b61648e

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