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

Uploaded Python 3.12macOS 11.0+ ARM64

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

Uploaded Python 3.11macOS 11.0+ ARM64

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

Uploaded Python 3.10macOS 11.0+ ARM64

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250808060343-py312-none-manylinux_2_39_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 341d86eeb335eda24eb72168118033a969377ade91203b8836c5e6b52c74349e
MD5 edf1ba73d00dd67d4fe7dc3b4c4bf303
BLAKE2b-256 50517b1676702b5ebfbf6453cab289a26e4ce9f68028f73c37c34cec7c0b96a6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250808060343-py312-none-manylinux_2_35_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 ad078ef9f8ff108bb85afbadf926f253bb60155b996844489cfb1f36ca934072
MD5 e6a39cc97183228d16c9360d3046a73c
BLAKE2b-256 8f6f83bbabf970eadfc99b4fa573343abf159d79767c55362c4e387e3e7946c4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250808060343-py312-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 0cc1a69f5dafcbc2297ef7a02954ab913d6b33166aa55bda7991f236d2ac4162
MD5 db03a5641c2ae70f9c3ecd5764c425c9
BLAKE2b-256 2abd3a4da0eb2437c85adb6fd21101e7d6e940c6f9509d6620fb98b56a20d531

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250808060343-py312-none-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 cb33b9050494e0ba5260a3336188c04a36da9b62a2209c5e15d8573c80bf6f5d
MD5 6f0e717683fba279540b82ddc36e587d
BLAKE2b-256 4a6e8a28c025e0d561a2db88ea01620277f595f445e123d331dbb2e7d9439ae2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250808060343-py311-none-manylinux_2_39_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 712490622e3269446077fbea6165278df6026967c87f6ba3ce0c8ba1b0091620
MD5 3a9d73591d936b516b95ec346e9ffde9
BLAKE2b-256 a6337b66325d4bf2881516807847cd30330b68454c4a743f2b1cdb3403b5db73

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250808060343-py311-none-manylinux_2_35_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 a36807ca91dd503035b8dc66e9f18c5e68912a57adda624a2fbf6476e7111e4e
MD5 a81da592ba76499d7eabec8fee0cc53a
BLAKE2b-256 01306c43c7c6bf2729240e6b640937349f7e63a6261edc34cc7e00058d7920da

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250808060343-py311-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 358cf5ec7bfc7adfba6053f51f4a1ad2f61889e5e1f02ec48882cfcdd1ca37a6
MD5 02aa0b149039aba9e0ad97102bdcd933
BLAKE2b-256 82ab3e7e9dab61d2653d12877681da2585005d15019d7f7c9303cf7752c3e1af

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250808060343-py311-none-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 fbb1aa476003b4b0b6022c39459cbd39213b8b1990359bc36f7022fa85738e57
MD5 255b3c07190d337855305ac0707fb939
BLAKE2b-256 818925a4b21f6dec97babb313461a031247642f75a743d2146d6098fda9db68e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250808060343-py310-none-manylinux_2_39_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 567d072d630b935aec84a5b15cb718d3f8f9347f52aca9bae34ddc84191948f1
MD5 7c88f209ca6b5a9c07f6e764753d46cd
BLAKE2b-256 c311b1b54cc4ddebbe64bb1230ca06ff058041aa1edbe29af13c596c167509e9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250808060343-py310-none-manylinux_2_35_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 78628eb7e92a8b2b309a729f74313f1f8ae0fdcb2e5429696888e456866c9ac2
MD5 925b072d066423e77a1f3d6d3a24da60
BLAKE2b-256 a588daebf23ebbf1d729c235e33f476dc2d55ee211fc5ddff06825fc81fc89e5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250808060343-py310-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 27b2e5521258fd1c5766b5cfafaf933164a42a41d426457c342961f069f17832
MD5 8908c25df4fb4f685ccd76a35cef183e
BLAKE2b-256 398681846fdceba7b1a98d087c80202a781eec94252d2e9b17c25d5393ea98f3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250808060343-py310-none-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 5b40e86eb73792d0a3ac69203952318a019a0056ecbbe06659a1bbeb9486ce54
MD5 26f0746b77b51102c19d44372ed7a7fc
BLAKE2b-256 0e4cc22c4c7bef4e6ec60431f0d1ce40a5c4f8ee3b0d551ffaa7784699e272ed

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