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++

InstallationUsagePaperHelpCitationContact

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

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

For full documentation and detailed examples of the Python interface, please refer to the docs.

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 quantum-oss-maintainers@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.dev20250807174536-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.dev20250807174536-py312-none-manylinux_2_35_x86_64.manylinux2014_x86_64.whl (3.4 MB view details)

Uploaded Python 3.12manylinux: glibc 2.35+ x86-64

tesseract_decoder-0.1.1.dev20250807174536-py312-none-macosx_11_0_arm64.whl (3.0 MB view details)

Uploaded Python 3.12macOS 11.0+ ARM64

tesseract_decoder-0.1.1.dev20250807174536-py312-none-macosx_10_13_x86_64.whl (2.9 MB view details)

Uploaded Python 3.12macOS 10.13+ x86-64

tesseract_decoder-0.1.1.dev20250807174536-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.dev20250807174536-py311-none-manylinux_2_35_x86_64.manylinux2014_x86_64.whl (3.4 MB view details)

Uploaded Python 3.11manylinux: glibc 2.35+ x86-64

tesseract_decoder-0.1.1.dev20250807174536-py311-none-macosx_11_0_arm64.whl (3.0 MB view details)

Uploaded Python 3.11macOS 11.0+ ARM64

tesseract_decoder-0.1.1.dev20250807174536-py311-none-macosx_10_13_x86_64.whl (2.9 MB view details)

Uploaded Python 3.11macOS 10.13+ x86-64

tesseract_decoder-0.1.1.dev20250807174536-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.dev20250807174536-py310-none-manylinux_2_35_x86_64.manylinux2014_x86_64.whl (3.4 MB view details)

Uploaded Python 3.10manylinux: glibc 2.35+ x86-64

tesseract_decoder-0.1.1.dev20250807174536-py310-none-macosx_11_0_arm64.whl (3.0 MB view details)

Uploaded Python 3.10macOS 11.0+ ARM64

tesseract_decoder-0.1.1.dev20250807174536-py310-none-macosx_10_13_x86_64.whl (2.9 MB view details)

Uploaded Python 3.10macOS 10.13+ x86-64

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250807174536-py312-none-manylinux_2_39_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 49426b812886948d16cdc90a3f1bb19981258bc6dcb51d61bb27ce02f019b906
MD5 65cce21320d0cbd4dbafeaddf9e7d2b3
BLAKE2b-256 e64e891061c3b07b909376b2e90febd64c804bc783814f9b092eece1e9abacc1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250807174536-py312-none-manylinux_2_35_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 1c3ae7a58abcb980373bd5c648cbacb1814eb13199097109395783c95fa77b19
MD5 ad63f299c5d8cf0d9747e0b17dad9ea1
BLAKE2b-256 e9e72f0158108b834bf360ba97028cb76242333a049adb1c098e8d991cb2dd27

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250807174536-py312-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 88df541478299a487975c3c180f66f99f84901da62e59d3ce0e7983c86a1700e
MD5 37b06131b96faa2a543a44622e5c2d9a
BLAKE2b-256 41ffbd61a3d9acae8972430e82475192ac3421a49be6356b7fe5f400b816a2c3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250807174536-py312-none-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 66ca819957085ed4652e7d8d4d770ce5a2f2eca71188f27c62a15e1e7135270a
MD5 53d44b1f0872bb7c7a346975dcc222e1
BLAKE2b-256 417a75b62175c9540cf5c28c2557190339775a00c79a7393ac93c77901b949ea

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250807174536-py311-none-manylinux_2_39_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 fe290a66d7eb2ed18c30da040e29e4edb3a9931adff978310a8914bdd156bf9d
MD5 5472b2cf0f193aabb070e149e4a99a31
BLAKE2b-256 17faba7bd49bfe3b6c9221687777d42aeeb5c6e75975a92dcff30a2d70aa535c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250807174536-py311-none-manylinux_2_35_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 d09c19c91afe2a6fc9079d76162c9674443f83cac9e8d91c4ce570ecda88e3b8
MD5 8f0cfda6bc7fdf1ca8a766f71bd04701
BLAKE2b-256 9f73f52d8a45d8884f56ed9990b9676870d81b93ca89565ab56d10788ec72b2b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250807174536-py311-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 7a7af35239f815c6f0996eccc5c559c4ad3b05824dd77070a3546954ea77af57
MD5 6181c9e15db35fe2f165aec088c7e5cd
BLAKE2b-256 87066691a96713286129a35d047ec8ef49808f08c60616aa7b4ae89d1b200bad

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250807174536-py311-none-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 2fd5ab8811d979488530514d6c39d2ddd8e63f3da84cf82202e31735201f091e
MD5 9c20bf3974474efd692e40534361bbe9
BLAKE2b-256 20b322851be3e84544d4af4477a59d8c58b1f254c473907fa7a10476b238e594

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250807174536-py310-none-manylinux_2_39_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 ae0c7db18153e9180625e27415b9dcc0705c1a3b201d5288b2b0e13b4797dffe
MD5 2db1876709c7f0213a65b76ebb57c8cc
BLAKE2b-256 906e1115e683f8452226b7b1aefc52f188db37c3c68169859beb5a379c49586a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250807174536-py310-none-manylinux_2_35_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 4d6ad0bc628190a36db82eb6eba19dcf32186ba5a718d7e4b76922f2cf98aebc
MD5 a6b26bf2f53610f663a6ab96aec2d64a
BLAKE2b-256 4dd651d12ea0021725fb6486003be56466cf720dcd46a455430aa83591f97321

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250807174536-py310-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 cc6085dfd0ced9b68876a07dd84b0dd7dab96cedde1acfe37346da3656313a82
MD5 5d08381f60b8212f26062e45e9a5f1d7
BLAKE2b-256 3b645d792a123385f57126bdb3084856775f762d787d3f1856c9d4e6155b35cb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250807174536-py310-none-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 08000a7b56628abdb97566b36dfc25a81ac40524bdf67ed7272d3742717d2a09
MD5 7d59d38f6c55b9377424b1c58fa3b8ff
BLAKE2b-256 e9afaaecf5df7b00b5bcd1e4401ab05b85b913bb9ded0a82710828b2ed8a240b

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