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

Uploaded Python 3.12macOS 11.0+ ARM64

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

Uploaded Python 3.11macOS 11.0+ ARM64

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

Uploaded Python 3.10macOS 11.0+ ARM64

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250811171539-py312-none-manylinux_2_39_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 2971b166a28e64197ca444dcaca30957ea49bf05bc871e379e515634fffa761d
MD5 3631229db3be4dbe436dccf63dd347fb
BLAKE2b-256 f19117dfa879f38ced88ff5fdcb148c60a661a9518505cc66622e7f7aa2a5381

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250811171539-py312-none-manylinux_2_35_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 fef50be1093a7c9aeabd39a94cd673948b8d36cfbbcadcb60de8d60e7cb169d3
MD5 617daff81f8fba9fc57eae2a7b63f1b8
BLAKE2b-256 dd001039e327b196e6ebd62d418cff7a985cb7c80229e9212628fa89a3d625e6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250811171539-py312-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 469f7d1dc7f5420fbbad45d6b8ebd449818f27291fc721ddb5ab12f249268aeb
MD5 23cbc7c2ff242618952fdb7df33a81d0
BLAKE2b-256 a3259bdf5c072156fa4ea44bcce8478300d18c04b25165f955d7adc00fd38cd2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250811171539-py312-none-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 81cd7e7575d5cd0cf1c9793af9855c2ffee2234584373cf8576e9f990a31ca3f
MD5 a445eb52a5bf31b1ef8fc2d57a7c3054
BLAKE2b-256 95d17ece318bcfff0c7eaac10d6c9be81d349f627766489c10f844741a00ad25

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250811171539-py311-none-manylinux_2_39_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 569bc863a1267230c96209756f83bf8b419f48268a87072b8c071903de5166fe
MD5 5aa2fd7e65261d72b3be692e7ab13fd4
BLAKE2b-256 aa57ca4f861e7a07d6687b294fd2df747ed062b9651b4d1973db6e4e295439ee

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250811171539-py311-none-manylinux_2_35_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 a6abb92c4045e802792aa36513f9e05d3a176b724f9635afc110ddb804d2daad
MD5 d922bcdd86ddfd582d633d25d97f2eaa
BLAKE2b-256 202dab2a1e6e572f3a0c721c8b201a765d394ae608c513a842bba0f0038fe94c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250811171539-py311-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 fceef1b58e3b56677863c236c9cad7fe9ce72aab2dd7a188805db07bc02e908f
MD5 37f7db8c7d46e6be17e02aa7d9b18663
BLAKE2b-256 faaf8afeb004e991062222570bf489e9990d3fa83917714a4d8afc19ba473662

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250811171539-py311-none-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 214ca829c9682674efe7c37ee39bec87faef17ef322f7708c8b44074161c9a18
MD5 dce4840f7464fd988b299786fdf97a1e
BLAKE2b-256 4a86c38ab2f91775607e0806a551e88a9c5f486dd67f8ba20861336676e5d140

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250811171539-py310-none-manylinux_2_39_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 d8c0a312db733aef3187960079c5b3f0224508a858613b4cfeb7fb6693ed2a1f
MD5 a85699e855517f818ca2f597ca952334
BLAKE2b-256 2f48f4be65676831b31c2fd7e568a6f8eb4456384ddf1014999076898c98ede3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250811171539-py310-none-manylinux_2_35_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 35683d2f149f2d610d02a03785056ee161409af74f8e9d976fd8031cf308de9c
MD5 e3cf7378afc83760be6dc529911e700a
BLAKE2b-256 66734b13c163fc3ab7ac1997f979e05410567339b0b2e13e0dcb059f31510d1e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250811171539-py310-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 006ec29dd7d091be604cb9fb48963caa3ca21aeac87e7c9dc1cb1ce5731851cb
MD5 a8fac41bd57dee4c9fd64ed109ca48da
BLAKE2b-256 018fa790799d1abaf30da2e8cbb24a6dc96c44d92d6f312e948e4c7f31773f5d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250811171539-py310-none-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 61567a97767710d9c0c90d3a7ba4b5219c4bdd2df361546e305fe92d922d8673
MD5 793cf73cc723695ab443bba70fde84b0
BLAKE2b-256 d056b42dfbbc15bbba152d05a78429abaee473b82226a40fc6a9520470548f7c

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