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

Uploaded Python 3.12macOS 11.0+ ARM64

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

Uploaded Python 3.11macOS 11.0+ ARM64

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

Uploaded Python 3.10macOS 11.0+ ARM64

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250808004738-py312-none-manylinux_2_39_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 2f56b9e5c8335efe96ac739287fb9e6caaa889df290b654f2f34917d752b3036
MD5 6ef47d1a9882ac79c98738a5a04142ac
BLAKE2b-256 a649877d4b27d8f62c002c4b64d9215bf63c4e82bbe7e072805c282e7aefeaeb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250808004738-py312-none-manylinux_2_35_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 e5424bb5553e7075fb552c570a169e746d746a17b058c8fc85baf0df88918643
MD5 b6677389b8432d0421330d5f06b46cf3
BLAKE2b-256 153e7a8559dc0d6cfe31845a7e0492f69956dbe464b545d21026a0ced5daf808

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250808004738-py312-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 b9bdd7d4c7691d1f99807058abb2b628d4c79b3d09fd73914979119fd5c051e9
MD5 cea0f94e11f9b0a6d0ff8c139ff87b93
BLAKE2b-256 263eca9d8428af5cfa3e51b417da8e5293cf911e770ea9fd37c3a622442771d5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250808004738-py312-none-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 b7c8216e380b627f98a9272dbc219bb082cf703a80a1420cedc3ff6e8ebf9b7e
MD5 9981b82360255db6b74c3b3b30699354
BLAKE2b-256 cc4a40f873eda09f1b727e77c9176ddf3f278e52ee820e422434bd04729ae5b3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250808004738-py311-none-manylinux_2_39_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 404cf9ba489b49222a9071338d725ccb586a654095341097531cb96c37c2227b
MD5 67778402638ca18abc9419e4f442929c
BLAKE2b-256 933d6157cf87c9cdbe738348976c0ac5b0d0147c2bfba2476971ce4dd73b5538

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250808004738-py311-none-manylinux_2_35_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 6886abfc904a05f99c61f612b4ff62cb5f844b6913b848a35efd334c2c034e0e
MD5 7d2ec1563f8968282d00bcf147845698
BLAKE2b-256 d1fea4858367e2576f3ca546e5631b8d85da359cb76c9c22654f316d1d1823ee

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250808004738-py311-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 ed08e04d51066550d5f2a10b265d454ee641f268889ad5855d65678b24fdffbe
MD5 e5684da6ca101fc85cab96a1ac5ac309
BLAKE2b-256 e4e7d38b71b705fa82567eeeb4ee8fbc5b7879eebf3fbd3691363cea84358341

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250808004738-py311-none-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 64d35b098fc1eca10a5c9a9f73c2cc464c02c97deaae2182ddf7cdeef6fb77e9
MD5 cd85021d7ef5e6b4308ba49b1ea00f2d
BLAKE2b-256 1460246fbf26b9dd06439e47822d8729f602f79db886552468c724616aa4ce12

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250808004738-py310-none-manylinux_2_39_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 3edcf111665a9d30838bbf5b516deafb6a24215746b4e16f63e005f382aa93fa
MD5 77b77380ab2a5608ea65a58648ff5a58
BLAKE2b-256 575de142d27bb3cf56a5e9ad93ee077cab03abb663a894793d1f9ee6730f73a4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250808004738-py310-none-manylinux_2_35_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 06255e4d9275d512cd5bd18903510edd546ae8158843905fe005c9494f577da5
MD5 61d5ff4efbc5940dff9deb399e6fabb6
BLAKE2b-256 09dddd9880507721fbc939b50b8f9b18c6366e018de2d2b7d99ab5cfb2dc8e8e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250808004738-py310-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 455c2022528b045bd90c877e5dcce0c7ec785b7edf4f3e3259e5dce5b84a3a7a
MD5 2a7f9c077d32fd265cdc9f35e74b3d69
BLAKE2b-256 bb1a8d2449070dcd8201672f863efdd42af74573009b6a1c26ee2f77c7d39c59

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250808004738-py310-none-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 d96013ee67c1e9867c05e176613886cbb631a6db8f634d36f147a1795e35ee46
MD5 426bdc0928186c4d4c3b21b60eb15c5f
BLAKE2b-256 58dd0b9cdee83a065f5b437fe282430d6242308034dd05af949eb4a65a2a0ce7

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