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

Uploaded Python 3.12macOS 11.0+ ARM64

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

Uploaded Python 3.11macOS 11.0+ ARM64

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

Uploaded Python 3.10macOS 11.0+ ARM64

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250809043128-py312-none-manylinux_2_39_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 7aa794a83b06429a8c41b38d04839b0f9586e63510f7cefb2c046e02894c1303
MD5 1b8d6cbee5266f96028b9f70f411644b
BLAKE2b-256 cb69bf79a83f1cd7cfca2e033737c2248f7c8318a24ea20e5f3f78191e19f193

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250809043128-py312-none-manylinux_2_35_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 962529a44638301d46f87abd3075585327d7eddebaacef2f3f7a58f5cd3531b7
MD5 94e5a8325a4a710ea4e2c297b3ea3e5c
BLAKE2b-256 13024c547c0a35c1ac6ceabd211e7dd43ed94fa7bcd601054b258f32ddf7a622

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250809043128-py312-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 edb63b8582cf92be61cc049aa207411a3d4eacd5da7429deecc9f8e48d69f71d
MD5 0a3b2e82458a309a0af12959d107d178
BLAKE2b-256 ebde4f924ed8ed7dfc894288504d1213f14a45d1820d4cc723127aa35a09c518

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250809043128-py312-none-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 57fab8c987d802f6e0f2db7465f3ea9c569edc7fe776053b8e6c1c03b56baea8
MD5 d6a006365c33d10a1571d86b3df6261b
BLAKE2b-256 3616a1c5aae306034ec90310593efa03598283d7873dc1309317c16cfbfeb5fb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250809043128-py311-none-manylinux_2_39_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 4c145e18bfd0d2fc43cfa8670caac47edd7ddb13b215dfd22ad366c50d100bf5
MD5 42b13ac441870b9851b700d6123e73a2
BLAKE2b-256 1aab8f9ae7abd632aa4abe1eca5a88163794fc7bd235403cf7a3972bd2a702f9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250809043128-py311-none-manylinux_2_35_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 c24d21fe61da88a416aa393e2d8587b6dfbe01eca457dcba1d56804e8b2398a0
MD5 7a477275e535eeb01e0af86953be2656
BLAKE2b-256 c2dd16d0f487859b8b78f13748fe0b863421c3523b050d1eaed1ff99049f5141

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250809043128-py311-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 ec5f476bf9edc763045389011719af68e9a8e04c0a9828f257307f92b38c266a
MD5 739477a6695f6f1730a7f32abeaf1fef
BLAKE2b-256 843044b89289de3bc7098db10e7e12bf420f927b2bc3827c7cfc47fa0cb2a760

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250809043128-py311-none-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 237e4f12523074f8a4ed481afd0d5e026a7ab187d6f50c1ed0f55a71c2f75cbe
MD5 5711b9cd9c9047f0f255cbb24b2b2307
BLAKE2b-256 4042bff09064f618357a1c44c7da462477da8a1d54f28c473d2c351c0f470d32

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250809043128-py310-none-manylinux_2_39_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 1bdd849610a7b2aa14a4704d92c11743990d7bc14749d57092a25897e307f2d4
MD5 c1804e171015d3edc3dba06ef6661a0c
BLAKE2b-256 80733ef7d4c77e0d412ecf40e612df009a85ac48752caecf446080fffcd074d8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250809043128-py310-none-manylinux_2_35_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 8bd98eea02c754b2907e8ea3b68ddb6a0e824b9a7c70aa62aabd6db9ede7e923
MD5 97a440d068d523621a64e1465a159084
BLAKE2b-256 ccdf8d64849fc4ebd96aac5d682bc3d8852392caa44882aab5036a406f43375b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250809043128-py310-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a651cc24af13de6f93c3fcccf94d17711964213c5afe316f8eab71a87013ce31
MD5 a682ac2562819ffc6c8d893a1c1e4172
BLAKE2b-256 e4a52a7b56a06acd01a67dadb45f1d7858bfb16a4c0ca384cc11f85f1a70951c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250809043128-py310-none-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 6864099a4d882f7dd89808f91a492fd317ae56f5dd7f08d76d54a6b6ee24e85d
MD5 1204f2af30e98cb7949823d90b1d2ec2
BLAKE2b-256 fdd1a37e2c1e29df3eda36ff54386b7c30a2596b918a788814a7535f1128c01a

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