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

Uploaded Python 3.12macOS 11.0+ ARM64

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

Uploaded Python 3.11macOS 11.0+ ARM64

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

Uploaded Python 3.10macOS 11.0+ ARM64

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250808035306-py312-none-manylinux_2_39_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 4b37f04b14611b9ac220c9793fa6c046b68ef4edfa820ad6997e8ae5349188d0
MD5 76dc2cdcad65a60e0cdeab2307012e72
BLAKE2b-256 7bc783ab29815a6c3fdaee112f9e7b55535938a7078d455aacd69de38e64cdf1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250808035306-py312-none-manylinux_2_35_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 2ca66080d55e6c1d6e251abed4ba12b14b14ce43eba74a3b2464f87f0cec5cc5
MD5 f0c1dbc4f6dd78528f774b6538d7ee64
BLAKE2b-256 1fe6ff2dba11fee8833d7735a6af2f1510844291a7ddbcec2e577125ae61a37d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250808035306-py312-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 dc137fe9199e54161f5eb116fd14f2aa5bffe507df0b2708cc20fcae3498e8dc
MD5 5af61c6813bca86776b0c404dd25fa1b
BLAKE2b-256 c1bb73e1bbdbe8ccae45e1b9de60874d9d51dd858acc98ed16fc78c37af02933

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250808035306-py312-none-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 04da7e94b912277d7f408db677abf0462a46a5edcfd171ccf9f0052280b3edd5
MD5 7f15ad7a0278ef6b54f33623041a0010
BLAKE2b-256 49e0296e76b97a59cee4fec04a9b8cbb73d98c91a82e5053475be64623a145c8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250808035306-py311-none-manylinux_2_39_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 44fcc378f8b71658b7587a5ed277015213386451f7780f2ea274a1411a9387a9
MD5 78417a3505cc471e18adb7e8c3f76c14
BLAKE2b-256 4cb0f3c8e8342788dc0f449a999236b30be52bb9d508af5ff1e40e0aa9c91bca

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250808035306-py311-none-manylinux_2_35_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 068676eaaee1ea72d22123a41353f21fdfc2514f2be0573c4d914b5b1802577f
MD5 6f4f4e45934f490bdacc0cd398a434fb
BLAKE2b-256 10713293290a377bde3bb7cc4faefdbce4e4846d4e929372f2b3277e6f5fe49a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250808035306-py311-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 428264427790941a9ea356b59c26b7b6f8d3420a8f26d8b4cd10093ff4806f32
MD5 bd449fad742e196d292d52297231071d
BLAKE2b-256 394bd2b2f81aef35a425b9ca045585889eb5740c19b467e7486472a73e303a3e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250808035306-py311-none-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 fa89e70d4bfa582cd98eaa920d23d0ac2c97dfd51c35533fbfd58c3cd3549a13
MD5 8bf774119447bc2a522d9aae331a15b5
BLAKE2b-256 34df65b32b262b45cf6d4d26a862cd75a3e7de5a363b23c3f6be6b69a32c9ae5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250808035306-py310-none-manylinux_2_39_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 f8015921e69e45d989933954e4cf924a76df202747ab2d76877226f0b7dd14e9
MD5 72bd8309895ed4c304f8cfe84bbf2db6
BLAKE2b-256 d8bb35930b8d81dc31de4119650615c41fb8d062d235a6e2d2ea598ffc3d80c8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250808035306-py310-none-manylinux_2_35_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 4790dd0fb731772601ff2002cc61e0bdf6b7eafa67908e68d7a4cbf12954be8a
MD5 e771b56edd72ce8383193a3b9889f58f
BLAKE2b-256 e280fd6742e31415c97ee7382573c169676d64566e9a08ea2693e7c503cb4339

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250808035306-py310-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 41f3df39463da1994186bda903810bc9452880c50ea8afdb1642c02591940a0d
MD5 335894e2f5f0c631f3df63cb32b458db
BLAKE2b-256 cab1783328a2bde274a276cfea0ddd05c2622a8577e2aed452512afb58fefc68

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250808035306-py310-none-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 9216400cbf4e363a7e25a8c23c028227ff18b41a815716ac2cd576e3bae6fa45
MD5 a1a69faf400260d8eba709cab681eb89
BLAKE2b-256 6d8612e7b871afbbf48541c467ba59fa4697635021676da0ec5eff715ee2942b

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