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

Uploaded Python 3.12macOS 11.0+ ARM64

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

Uploaded Python 3.11macOS 11.0+ ARM64

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

Uploaded Python 3.10macOS 11.0+ ARM64

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250809160557-py312-none-manylinux_2_39_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 d5e7fb495a43b2d4d3b942c0a83d2f36edf6668fb07330cb39a41c2d35e0c2a4
MD5 6af8ffbda7976973a7ea496938451cd9
BLAKE2b-256 4531f7ce525a7a1bf4992459aba1da4e71f7d1530a22ab99c2f88f85635465f7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250809160557-py312-none-manylinux_2_35_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 cb13d916197250c67fe773ed95a023c86ac77b8a9832ed9234f5ab68819255e2
MD5 fb8fe6c5cdcb81aadadac1032fd87671
BLAKE2b-256 289820a6dfc98984606daa644d5be7592b4da2539d15e3e5bffb294de0192528

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250809160557-py312-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 4fe504a9c1a88b7011db50b8dfdeef3e1679d5b82a95ad62c53d43778b32b273
MD5 25ce00955c09d7c5cbc97c8a18d508bf
BLAKE2b-256 5d58cecf12a64d9e7de3e856d69c26d545c0e8256f34df7c2c6ecc487fcfc71a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250809160557-py312-none-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 9568a192baf07ef76aa2436080663fe66da136f9805496d4b29e6fef9c2f1deb
MD5 d7acddbdc0947e1ad16ede755747f9f0
BLAKE2b-256 55ae8094f349ed771f23cbd92f8ff6303b1113f6842bd12c065e6c83d5d8f053

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250809160557-py311-none-manylinux_2_39_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 39a935207fb95ba0ad9b1a6a4e6440bc9bd43ad335880fa6eee9095f6e40964d
MD5 0b7528cc762ece08a31fb1cd10533c2d
BLAKE2b-256 3d35998c038d299063aa9bf61b42ac71de108978313633c8817ea6ec8a5d7911

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250809160557-py311-none-manylinux_2_35_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 005a6bada8054db1a44fb195ddc37599cc112135db65595793378a2e96e80d95
MD5 9e1f555b85107b78a7ff47af2ebbc878
BLAKE2b-256 5548ab0a4ff81151994451e4b43b025b3bbbfa612b44e3bce105482052a95aff

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250809160557-py311-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 febacf234aac0129bdbf83dd6deb095ded366f91a7e9dd36aed388ba8d375cc5
MD5 f4383a1fd25c8430f46ed9ab1c8e731b
BLAKE2b-256 74ce9b08fe02ca550b420a8391271f4a48316b1858aa7a94fd636e539aba63aa

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250809160557-py311-none-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 2037df9625e7622e1f5dfd101c2fdb622ad16cad16f47e42881a86ead52e8820
MD5 919155599ef6a84db304d6fcad99bfe8
BLAKE2b-256 9d12784ee8435280b03d76370a80d61550118629785e5f9faeb3b1f2f954798d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250809160557-py310-none-manylinux_2_39_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 dbf4b2c2adcc3ba04c8c00ac245ed32340d3a9d5db3c761eec607169216e6bc9
MD5 bda212ec1282af058995eff3950d2ee4
BLAKE2b-256 964ddd42141aaa03f03fb051eabe4365763db396131bc54ff669c8106f44e6d6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250809160557-py310-none-manylinux_2_35_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 9f4349217d4b813c4a7964377abbca7f65a397f5b85d4dd090621d713eca7863
MD5 36462a38a800fb21a1036d14c4f496cb
BLAKE2b-256 d635ed5b58a8df39e12478bb1a25acc67478010f962638a88ddaed41213fdfe1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250809160557-py310-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 534b142114f68f4e8f75e6db0ccdccd46bb7efdc67190d0637e57fb5912bb2ba
MD5 233d81eeeae8d73f68436603666a517a
BLAKE2b-256 419c64d9712dd6c4d171cd0fb337b45486be60892597693edd21dfa03f68ff25

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tesseract_decoder-0.1.1.dev20250809160557-py310-none-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 1da45b39c492957306352110a637135c9161a47995e77374eb4692a5f3376711
MD5 bd9647b4cdc4ced5519630014b7291fc
BLAKE2b-256 2d3a0df09edf163c38998ab322a62c2b42c46f4b2b919b26abe26873d550a76e

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