From 0a3bab7b35f71a66a1998e32887d730022ec2baf Mon Sep 17 00:00:00 2001 From: Iftach Yakar Date: Tue, 16 Sep 2025 23:34:04 +0300 Subject: [PATCH 1/9] Noise more granular control from CLI + added measurement noise --- .../error_correction/decoder_manual.py | 9 +- tesseract_sim/noise/noise_cfg.py | 2 + tesseract_sim/noise/noise_utils.py | 10 +- .../plotting/plot_acceptance_rates.py | 92 +++++++++++++++++-- 4 files changed, 97 insertions(+), 16 deletions(-) diff --git a/tesseract_sim/error_correction/decoder_manual.py b/tesseract_sim/error_correction/decoder_manual.py index b13a3b4..f073573 100644 --- a/tesseract_sim/error_correction/decoder_manual.py +++ b/tesseract_sim/error_correction/decoder_manual.py @@ -1,11 +1,8 @@ -import stim import numpy as np -from tesseract_sim.error_correction.correction_rules import correct_row_Z, correct_row_X, correct_column_Z, correct_column_X -def append_detector_on_last_n_measurements(circuit, num_measurements=4): - circuit.append("DETECTOR", [ - stim.target_rec(-i) for i in range(1,num_measurements+1) - ]) +from tesseract_sim.error_correction.correction_rules import correct_row_Z, correct_row_X, correct_column_Z, \ + correct_column_X + def process_shot(shot_data, rounds, measurement_offset=0): """ diff --git a/tesseract_sim/noise/noise_cfg.py b/tesseract_sim/noise/noise_cfg.py index baca267..8549ac6 100644 --- a/tesseract_sim/noise/noise_cfg.py +++ b/tesseract_sim/noise/noise_cfg.py @@ -13,6 +13,8 @@ class NoiseCfg: op2: str = "DEPOLARIZE2" channel_noise_level: float = 0.0 # channel noise between encoding and EC channel_noise_type: str = "DEPOLARIZE1" + meas_active: bool = False # apply to measurements (SPAM error)? + meas_error_rate: float = 0.0 # measurement error rate # TODO add noise on 'meas' phase as well diff --git a/tesseract_sim/noise/noise_utils.py b/tesseract_sim/noise/noise_utils.py index 2be0f15..99218a7 100644 --- a/tesseract_sim/noise/noise_utils.py +++ b/tesseract_sim/noise/noise_utils.py @@ -8,7 +8,7 @@ def append_op( circuit: stim.Circuit, opname: str, targets: Sequence[int], - phase: Literal['enc', 'ec'], + phase: Literal['enc', 'ec', 'meas'], cfg: NoiseCfg = CURRENT_NOISE_CFG ): circuit.append(opname, targets) @@ -27,6 +27,10 @@ def append_op( active_noise = True rate_1q = cfg.ec_rate_1q rate_2q = cfg.ec_rate_2q + elif phase == 'meas' and cfg.meas_active: + active_noise = True + rate_1q = cfg.meas_error_rate + rate_2q = cfg.meas_error_rate # Use same rate for consistency if active_noise: if len(targets) == 1 and rate_1q > 0: @@ -34,8 +38,8 @@ def append_op( elif len(targets) > 1 and rate_2q > 0: circuit.append(op2, targets, rate_2q) -def append_1q(circuit: stim.Circuit, opname: str, target: int, phase: Literal['enc', 'ec'], cfg: NoiseCfg = CURRENT_NOISE_CFG): +def append_1q(circuit: stim.Circuit, opname: str, target: int, phase: Literal['enc', 'ec', 'meas'], cfg: NoiseCfg = CURRENT_NOISE_CFG): append_op(circuit, opname, [target], phase, cfg) -def append_2q(circuit: stim.Circuit, opname: str, target1: int, target2: int, phase: Literal['enc', 'ec'], cfg: NoiseCfg = CURRENT_NOISE_CFG): +def append_2q(circuit: stim.Circuit, opname: str, target1: int, target2: int, phase: Literal['enc', 'ec', 'meas'], cfg: NoiseCfg = CURRENT_NOISE_CFG): append_op(circuit, opname, [target1, target2], phase, cfg) \ No newline at end of file diff --git a/tesseract_sim/plotting/plot_acceptance_rates.py b/tesseract_sim/plotting/plot_acceptance_rates.py index b562016..0a7fedd 100644 --- a/tesseract_sim/plotting/plot_acceptance_rates.py +++ b/tesseract_sim/plotting/plot_acceptance_rates.py @@ -118,7 +118,11 @@ def write_experiment_metadata( apply_pauli_frame: bool, encoding_mode: str, sweep_channel_noise: bool, - runtime_seconds: float = None + runtime_seconds: float = None, + ec_rate_1q: float = None, + ec_rate_2q: float = None, + meas_error_rate: float = 0.0, + channel_noise_rate: float = None ) -> None: """Write experiment metadata to a text file.""" metadata_path = os.path.join(out_dir, "experiment_metadata.txt") @@ -142,6 +146,20 @@ def write_experiment_metadata( f.write(f"Apply Pauli frame correction: {apply_pauli_frame}\n") f.write(f"Encoding mode: {encoding_mode}\n") f.write(f"Sweep channel noise: {sweep_channel_noise}\n") + f.write(f"Measurement error rate: {meas_error_rate}\n") + + # Report if using fixed rates vs sweep + use_fixed_rates = (ec_rate_1q is not None and ec_rate_2q is not None) or channel_noise_rate is not None + if use_fixed_rates: + f.write(f"Mode: Fixed noise rates\n") + if ec_rate_1q is not None: + f.write(f"EC 1Q rate (fixed): {ec_rate_1q}\n") + if ec_rate_2q is not None: + f.write(f"EC 2Q rate (fixed): {ec_rate_2q}\n") + if channel_noise_rate is not None: + f.write(f"Channel noise rate (fixed): {channel_noise_rate}\n") + else: + f.write(f"Mode: Sweeping noise rates\n") if sweep_channel_noise: f.write(f"Noise configuration: Sweeping channel noise only\n") @@ -166,7 +184,11 @@ def plot_ec_experiment( base_out_dir: str, apply_pauli_frame: bool = True, encoding_mode: Literal['9a', '9b'] = '9b', - sweep_channel_noise: bool = False + sweep_channel_noise: bool = False, + ec_rate_1q: float = None, + ec_rate_2q: float = None, + meas_error_rate: float = 0.0, + channel_noise_rate: float = None ) -> None: """Plots both EC acceptance and logical check rates for the EC experiment.""" start_time = time.time() @@ -177,10 +199,52 @@ def plot_ec_experiment( os.makedirs(out_dir, exist_ok=True) # One sweep collecting full results - if sweep_channel_noise: - cfg_builder = lambda noise: NoiseCfg(ec_active=False, channel_noise_level=noise, channel_noise_type="DEPOLARIZE1") + # Determine if we're using fixed rates or sweeping + use_fixed_rates = (ec_rate_1q is not None and ec_rate_2q is not None) or channel_noise_rate is not None + + if use_fixed_rates: + # Use fixed rates - ignore noise_levels sweep + if sweep_channel_noise: + fixed_channel_rate = channel_noise_rate if channel_noise_rate is not None else 0.0 + cfg_builder = lambda _: NoiseCfg( + ec_active=False, + channel_noise_level=fixed_channel_rate, + channel_noise_type="DEPOLARIZE1", + meas_active=meas_error_rate > 0, + meas_error_rate=meas_error_rate + ) + noise_levels = [fixed_channel_rate] # Single point for fixed rate + else: + fixed_1q = ec_rate_1q if ec_rate_1q is not None else 0.0 + fixed_2q = ec_rate_2q if ec_rate_2q is not None else 0.0 + cfg_builder = lambda _: NoiseCfg( + ec_active=True, + ec_rate_1q=fixed_1q, + ec_rate_2q=fixed_2q, + channel_noise_level=0.0, + meas_active=meas_error_rate > 0, + meas_error_rate=meas_error_rate + ) + noise_levels = [max(fixed_1q, fixed_2q)] # Single point for plotting else: - cfg_builder = lambda noise: NoiseCfg(ec_active=True, ec_rate_1q=noise, ec_rate_2q=noise, channel_noise_level=0.0) + # Use original sweep behavior + if sweep_channel_noise: + cfg_builder = lambda noise: NoiseCfg( + ec_active=False, + channel_noise_level=noise, + channel_noise_type="DEPOLARIZE1", + meas_active=meas_error_rate > 0, + meas_error_rate=meas_error_rate + ) + else: + cfg_builder = lambda noise: NoiseCfg( + ec_active=True, + ec_rate_1q=noise, + ec_rate_2q=noise, + channel_noise_level=0.0, + meas_active=meas_error_rate > 0, + meas_error_rate=meas_error_rate + ) raw_results = sweep_results( run_simulation_ec_experiment, @@ -242,7 +306,9 @@ def plot_ec_experiment( write_experiment_metadata( out_dir, rounds, noise_levels, shots, apply_pauli_frame, encoding_mode, sweep_channel_noise, - runtime_seconds=runtime_seconds + runtime_seconds=runtime_seconds, + ec_rate_1q=ec_rate_1q, ec_rate_2q=ec_rate_2q, + meas_error_rate=meas_error_rate, channel_noise_rate=channel_noise_rate ) print(f"All experiment files saved to: {out_dir}") @@ -278,6 +344,14 @@ def main(): help=f'List of EC rounds to sweep (e.g. 1 10 20 30). Default: {default_rounds}') parser.add_argument('--noise-levels', type=float, nargs='+', default=default_noise_levels, help=f'List of noise rates to sweep (e.g. 0.05 0.1 0.2). Default: 10 points from 0.0 to 0.01') + parser.add_argument('--ec-rate-1q', type=float, default=None, + help='Single-qubit gate error rate for EC operations (overrides noise-levels sweep)') + parser.add_argument('--ec-rate-2q', type=float, default=None, + help='Two-qubit gate error rate for EC operations (overrides noise-levels sweep)') + parser.add_argument('--meas-error-rate', type=float, default=0.0, + help='Measurement error rate (SPAM error)') + parser.add_argument('--channel-noise-rate', type=float, default=None, + help='Channel noise rate (overrides noise-levels sweep when using --sweep-channel-noise)') args = parser.parse_args() # Use configurable values @@ -288,7 +362,11 @@ def main(): print(args.experiments) if 2 in args.experiments: - plot_ec_experiment(rounds, noise_levels, args.shots, args.out_dir, args.apply_pauli_frame, args.encoding_mode, args.sweep_channel_noise) + plot_ec_experiment( + rounds, noise_levels, args.shots, args.out_dir, + args.apply_pauli_frame, args.encoding_mode, args.sweep_channel_noise, + args.ec_rate_1q, args.ec_rate_2q, args.meas_error_rate, args.channel_noise_rate + ) if __name__ == "__main__": main() \ No newline at end of file From 5796676c4f2227e09437ab6c199835729d9fb26f Mon Sep 17 00:00:00 2001 From: Iftach Yakar Date: Tue, 16 Sep 2025 23:35:46 +0300 Subject: [PATCH 2/9] Added plots that attempt to reproduce paper (not there yet) --- .../acceptance_rates_ec_experiment.png | Bin 0 -> 42996 bytes .../experiment_metadata.txt | 24 ++++++++++++++++++ .../fidelity_rates_ec_experiment.png | Bin 0 -> 31913 bytes .../logical_rates_ec_experiment.png | Bin 0 -> 34672 bytes .../acceptance_rates_ec_experiment.png | Bin .../experiment_metadata.txt | 0 .../fidelity_rates_ec_experiment.png | Bin .../logical_rates_ec_experiment.png | Bin .../acceptance_rates_ec_experiment.png | Bin .../experiment_metadata.txt | 0 .../fidelity_rates_ec_experiment.png | Bin .../logical_rates_ec_experiment.png | Bin 12 files changed, 24 insertions(+) create mode 100644 plots/ec_experiment_3_H2_params/acceptance_rates_ec_experiment.png create mode 100644 plots/ec_experiment_3_H2_params/experiment_metadata.txt create mode 100644 plots/ec_experiment_3_H2_params/fidelity_rates_ec_experiment.png create mode 100644 plots/ec_experiment_3_H2_params/logical_rates_ec_experiment.png rename plots/{ec_experiment_20250916_161024_with_correction => ec_experiment_with_correction}/acceptance_rates_ec_experiment.png (100%) rename plots/{ec_experiment_20250916_161024_with_correction => ec_experiment_with_correction}/experiment_metadata.txt (100%) rename plots/{ec_experiment_20250916_161024_with_correction => ec_experiment_with_correction}/fidelity_rates_ec_experiment.png (100%) rename plots/{ec_experiment_20250916_161024_with_correction => ec_experiment_with_correction}/logical_rates_ec_experiment.png (100%) rename plots/{ec_experiment_20250916_165427_without_correction => ec_experiment_without_correction}/acceptance_rates_ec_experiment.png (100%) rename plots/{ec_experiment_20250916_165427_without_correction => ec_experiment_without_correction}/experiment_metadata.txt (100%) rename plots/{ec_experiment_20250916_165427_without_correction => ec_experiment_without_correction}/fidelity_rates_ec_experiment.png (100%) rename plots/{ec_experiment_20250916_165427_without_correction => ec_experiment_without_correction}/logical_rates_ec_experiment.png (100%) diff --git a/plots/ec_experiment_3_H2_params/acceptance_rates_ec_experiment.png b/plots/ec_experiment_3_H2_params/acceptance_rates_ec_experiment.png new file mode 100644 index 0000000000000000000000000000000000000000..0e772aac1abb7641c3ba202be5f5ddbfe10b7d83 GIT binary patch literal 42996 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

j&t$i_eg2r3&!nHdkmXl7wuiN;2`_p3)Hfg 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 z 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 literal 0 HcmV?d00001 diff --git a/plots/ec_experiment_3_H2_params/experiment_metadata.txt b/plots/ec_experiment_3_H2_params/experiment_metadata.txt new file mode 100644 index 0000000..1c6c1ba --- /dev/null +++ b/plots/ec_experiment_3_H2_params/experiment_metadata.txt @@ -0,0 +1,24 @@ +Tesseract EC Experiment Metadata +=================================== + +Timestamp: 2025-09-16 22:48:05 +Total runtime: 00:00:27.687 (27.687 seconds) + +Experiment Parameters: +-------------------- +Rounds: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 15, 20, 25, 30, 35, 40, 45, 50] +Noise levels: [0.00115] +Shots per data point: 10000 +Apply Pauli frame correction: True +Encoding mode: 9a +Sweep channel noise: False +Measurement error rate: 0.00147 +Mode: Fixed noise rates +EC 1Q rate (fixed): 2.9e-05 +EC 2Q rate (fixed): 0.00115 +Noise configuration: Sweeping EC/decoding noise + - EC noise applied: During error correction rounds and decoding + - EC 1Q rate: Swept parameter + - EC 2Q rate: Swept parameter (same as 1Q) + - Channel noise: None (0.0) + - Encoding: Noiseless diff --git a/plots/ec_experiment_3_H2_params/fidelity_rates_ec_experiment.png b/plots/ec_experiment_3_H2_params/fidelity_rates_ec_experiment.png new file mode 100644 index 0000000000000000000000000000000000000000..2324f2a969a43a3684b737f9009527d3a7b13c21 GIT binary patch literal 31913 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 Date: Tue, 16 Sep 2025 23:36:18 +0300 Subject: [PATCH 3/9] Added project status+reproduction instructions + known differences --- README.md | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index fd0bcda..6191081 100644 --- a/README.md +++ b/README.md @@ -10,10 +10,28 @@ The 16-qubit tesseract subsystem color code offers a useful comprosmise between ### Project status This codebase is an active work-in-progress. -• All building blocks (encoding, noise, measurement, decoder) are implemented. -• The end-to-end error-correction success rate is **not yet at the target level**. +• All building blocks (encoding, noise, measurement, decoder) are implemented, connected and working together. +• Error correction does improve fidelity, but we have not yet reproduced Fig. 13 of the paper. Acceptance rate plot has matching shape, but start too high (at ~1 instead of ~0.85). Logical error probability plots have the correct shapes, but are off by ~x10. +To reproduce run +```bash +python tesseract_sim/plotting/plot_acceptance_rates.py \ + --shots 10000 \ + --apply_pauli_frame true \ + --encoding-mode 9a \ + --ec-rate-1q 2.9e-5 \ + --ec-rate-2q 1.15e-3 \ + --meas-error-rate 1.47e-3 \ + --rounds 0 1 2 3 4 5 6 7 8 9 10 15 20 25 30 35 40 45 50 +``` Community testing, bug-fixes, and feature PRs are highly appreciated! +#### Known differences from the paper +- Noise model: we use depolarizing noise. +- Pauli frame correction is applied after measurement, rather than before. +- Memory decoherence: we have not implemented any noise for idling qubits, only for gates, in contrast with real devices. +- Encoding - noiseless in our model, to avoid having to preselect. +- Logical measurements - we currently only measure two logical Z observables. This is because we use enconding |++0000> but measure by splitting the code into two [[8,3,2]] color codes. + **Disclaimer:** This repository is an independent, community-driven implementation. It is **not** affiliated with Microsoft, Quantinuum, nor the authors of the original tesseract-code paper. From 58f16a62c27898d2a41c285d6e855e1a28511705 Mon Sep 17 00:00:00 2001 From: Iftach Yakar Date: Tue, 16 Sep 2025 23:58:01 +0300 Subject: [PATCH 4/9] readme opening more concise. --- README.md | 44 +++++++++++++++++++++++--------------------- 1 file changed, 23 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index 6191081..077fed5 100644 --- a/README.md +++ b/README.md @@ -1,18 +1,20 @@ -# Stim implementation of the [[16,4,4]] Tesseract Code - -This repository contains implementations and simulations of the Tesseract quantum error correction code [[1]](#references) using Stim [[3]](#references). +# Stim Implementation of the [[16,4,4]] Tesseract Code ## Overview -### Motivation -The 16-qubit tesseract subsystem color code offers a useful comprosmise between protection against errors and overhead. It encodes 4 logical qubits with a code rate of 1/4. By reducing 2 logical qubit from the original [[16,6,4]] code, this code achieves single-shot error correction, with only 2 ancilla qubits. This makes this code practical for current trapped-ion platforms. Recent experiments on Quantinuum hardware[[1]](#references) demonstrated preparing high-fidelity encoded graph states of up to 12 logical qubits, as well as protecting encoded states through 5 rounds of error correction. This repository reproduces these results in simulation, providing modular Stim circuits, noise modelling, and verification tests to support further research on low-overhead fault tolerance. +• **What it is**: A complete Stim-based [[3]](#references) simulation of the Tesseract quantum error correction code [[1]](#references) with gate-level encoding, error correction rounds, and manual decoding. + +• **Why it matters**: The [[16,4,4]] Tesseract subsystem color code offers practical fault tolerance for NISQ devices; encoding 4 logical qubits with single-shot error correction using only 2 ancilla qubits. This makes it viable for current trapped-ion platforms and a stepping stone to larger codes. + +• **What's implemented**: Full error correction pipeline including two encoding modes, configurable noise, stabilizer measurement rounds, Pauli frame tracking, and acceptance/fidelity analysis. + +• **Validation status**: Error correction improves fidelity as expected, but quantitative reproduction of paper results is work-in-progress. Acceptance rates show correct trend but offset (~1.0 vs ~0.85 baseline); logical error rates have correct shape but ~10× scaling difference. ![Figure 1: Tesseract code structure (from [1])](docs/images/fig1_tesseract_code.png) -### Project status -This codebase is an active work-in-progress. -• All building blocks (encoding, noise, measurement, decoder) are implemented, connected and working together. -• Error correction does improve fidelity, but we have not yet reproduced Fig. 13 of the paper. Acceptance rate plot has matching shape, but start too high (at ~1 instead of ~0.85). Logical error probability plots have the correct shapes, but are off by ~x10. -To reproduce run +## Reproduce the Paper + +To regenerate the main results with paper parameters: + ```bash python tesseract_sim/plotting/plot_acceptance_rates.py \ --shots 10000 \ @@ -23,27 +25,27 @@ python tesseract_sim/plotting/plot_acceptance_rates.py \ --meas-error-rate 1.47e-3 \ --rounds 0 1 2 3 4 5 6 7 8 9 10 15 20 25 30 35 40 45 50 ``` -Community testing, bug-fixes, and feature PRs are highly appreciated! -#### Known differences from the paper -- Noise model: we use depolarizing noise. -- Pauli frame correction is applied after measurement, rather than before. -- Memory decoherence: we have not implemented any noise for idling qubits, only for gates, in contrast with real devices. -- Encoding - noiseless in our model, to avoid having to preselect. -- Logical measurements - we currently only measure two logical Z observables. This is because we use enconding |++0000> but measure by splitting the code into two [[8,3,2]] color codes. +**Requirements**: Python 3.8+, Stim 1.11+. Install via `pip install -r requirements.txt`. + +**Known differences from paper**: +- Depolarizing noise model (vs. experimental noise) +- Pauli frame correction applied post-measurement (vs. pre-measurement) +- No memory decoherence during idle periods +- Noiseless encoding to avoid preselection +- Only two logical Z measurements (due to |++0000⟩ encoding split into [[8,3,2]] codes) -**Disclaimer:** This repository is an independent, community-driven implementation. -It is **not** affiliated with Microsoft, Quantinuum, nor the authors of the original tesseract-code paper. +**Disclaimer**: Independent implementation, not affiliated with Microsoft/Quantinuum/original authors. ### Features -- Circuit implementation of the [[16,4,4]] Tesseract subsystem color code [[2]](#references) in Stim, including encoding, error correction rounds and final measurements. +- Circuit implementation of the [[16,4,4]] Tesseract subsystem color code [[1]](#references) in Stim, including encoding, error correction rounds and final measurements. - Simulation of an error correction experiment with configurable noise setting, rounds, shot and more. - Plotting: sweeping of different parameters and obtaining acceptance rate and logical success rate. ### Implementation details -In order to mimic the original paper's error correction, the different parts of the experiment are implemented in the gate level, and not using Stim's `MPP` stabilizer measurements, or detectors, for example. +In order to mimic the original paper's error correction, the different parts of the experiment are implemented at the gate level. The experiment implemented here is an error correction experiment based on Microsoft's paper[[1]](#references), and resembles the experimental setup shown in Figure 8 below. ![Figure 8: Error correction experiment (from [1])](docs/images/fig8_error_correction_experiment.png) From 118be7dc767a15199d3220425bc6cbfcceaf3d67 Mon Sep 17 00:00:00 2001 From: Iftach Yakar Date: Wed, 17 Sep 2025 00:00:32 +0300 Subject: [PATCH 5/9] Add LICENSE (MIT) and CITATION.cff for v0.1.0 release - Added MIT License for open source distribution - Added CITATION.cff with proper metadata for academic citation - Prepared for v0.1.0 release tagging --- CITATION.cff | 37 +++++++++++++++++++++++++++++++++++++ LICENSE | 21 +++++++++++++++++++++ 2 files changed, 58 insertions(+) create mode 100644 CITATION.cff create mode 100644 LICENSE diff --git a/CITATION.cff b/CITATION.cff new file mode 100644 index 0000000..dab4878 --- /dev/null +++ b/CITATION.cff @@ -0,0 +1,37 @@ +cff-version: 1.2.0 +message: "If you use this software, please cite it as below." +type: software +title: "Stim Implementation of the [[16,4,4]] Tesseract Code" +abstract: "A complete Stim-based simulation of the Tesseract quantum error correction code with gate-level encoding, error correction rounds, and manual decoding." +authors: + - family-names: "Yakar" + given-names: "Iftach" + orcid: "https://orcid.org/0000-0000-0000-0000" +repository-code: "https://github.com/DeDuckProject/tesseract-code-stim" +url: "https://github.com/DeDuckProject/tesseract-code-stim" +license: MIT +date-released: 2024-09-16 +version: "0.1.0" +keywords: + - "quantum error correction" + - "tesseract code" + - "stim" + - "quantum computing" + - "fault tolerance" +references: + - type: article + title: "Demonstration of quantum computation and error correction with a tesseract code" + authors: + - family-names: "Reichardt" + given-names: "Ben W." + year: 2024 + url: "https://arxiv.org/abs/2409.04628" + notes: "arXiv:2409.04628" + - type: software + title: "Stim: a fast stabilizer circuit simulator" + authors: + - family-names: "Gidney" + given-names: "Craig" + year: 2021 + url: "https://github.com/quantumlib/Stim" + doi: "10.22331/q-2021-07-06-497" diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..d4a7563 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 Tesseract Code Stim Contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. From b7090bd18cd7e7b09c61827fcc41623b819651cb Mon Sep 17 00:00:00 2001 From: Iftach Yakar Date: Wed, 17 Sep 2025 00:01:59 +0300 Subject: [PATCH 6/9] Fix CITATION.cff: remove placeholder ORCID --- CITATION.cff | 1 - 1 file changed, 1 deletion(-) diff --git a/CITATION.cff b/CITATION.cff index dab4878..b7eafd6 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -6,7 +6,6 @@ abstract: "A complete Stim-based simulation of the Tesseract quantum error corre authors: - family-names: "Yakar" given-names: "Iftach" - orcid: "https://orcid.org/0000-0000-0000-0000" repository-code: "https://github.com/DeDuckProject/tesseract-code-stim" url: "https://github.com/DeDuckProject/tesseract-code-stim" license: MIT From 083868dfbf1c167a32b7c413297cc4f39a317e9f Mon Sep 17 00:00:00 2001 From: Iftach Yakar Date: Wed, 17 Sep 2025 00:03:51 +0300 Subject: [PATCH 7/9] Add ORCID ID to CITATION.cff --- CITATION.cff | 1 + 1 file changed, 1 insertion(+) diff --git a/CITATION.cff b/CITATION.cff index b7eafd6..e5f08a7 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -6,6 +6,7 @@ abstract: "A complete Stim-based simulation of the Tesseract quantum error corre authors: - family-names: "Yakar" given-names: "Iftach" + orcid: "https://orcid.org/0009-0003-8795-3794" repository-code: "https://github.com/DeDuckProject/tesseract-code-stim" url: "https://github.com/DeDuckProject/tesseract-code-stim" license: MIT From 74675edd71588afdb25f2a96f93824f4723e3c32 Mon Sep 17 00:00:00 2001 From: Iftach Yakar Date: Wed, 17 Sep 2025 00:14:44 +0300 Subject: [PATCH 8/9] Add Zenodo DOI (10.5281/zenodo.17137851) - Updated CITATION.cff with DOI and version 0.1.1 - Added DOI badge to README for visibility - Enables proper academic citation with permanent DOI --- CITATION.cff | 3 ++- README.md | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CITATION.cff b/CITATION.cff index e5f08a7..6e291fd 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -9,9 +9,10 @@ authors: orcid: "https://orcid.org/0009-0003-8795-3794" repository-code: "https://github.com/DeDuckProject/tesseract-code-stim" url: "https://github.com/DeDuckProject/tesseract-code-stim" +doi: "10.5281/zenodo.17137851" license: MIT date-released: 2024-09-16 -version: "0.1.0" +version: "0.1.1" keywords: - "quantum error correction" - "tesseract code" diff --git a/README.md b/README.md index 077fed5..9c36fa7 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # Stim Implementation of the [[16,4,4]] Tesseract Code +[![DOI](https://zenodo.org/badge/1014457478.svg)](https://doi.org/10.5281/zenodo.17137850) + ## Overview • **What it is**: A complete Stim-based [[3]](#references) simulation of the Tesseract quantum error correction code [[1]](#references) with gate-level encoding, error correction rounds, and manual decoding. From 234390ab7cc8927bfdb72d570555f3a22c1df5d3 Mon Sep 17 00:00:00 2001 From: Iftach Yakar Date: Wed, 17 Sep 2025 00:22:51 +0300 Subject: [PATCH 9/9] Added ROADMAP.md --- ROADMAP.md | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 ROADMAP.md diff --git a/ROADMAP.md b/ROADMAP.md new file mode 100644 index 0000000..041be31 --- /dev/null +++ b/ROADMAP.md @@ -0,0 +1,38 @@ +# Roadmap + +This document outlines the next major features and improvements planned for the Tesseract Code Stim implementation. + +## Upcoming Features + +### 1. Pre-measurement Pauli Frame Correction +**GitHub Issue**: [#6](https://github.com/DeDuckProject/tesseract-code-stim/issues/6) + +Currently, Pauli frame corrections are applied after measurement, which differs from the original paper's approach. This feature will: +- Modify the circuit flow to apply Pauli frame corrections before logical measurements +- Align the implementation more closely with the experimental procedure described in the paper +- Potentially improve quantitative reproduction of paper results + +### 2. Logical vs Unencoded Qubit Benchmarking + +Implement comprehensive benchmarking to compare the performance of encoded logical qubits against unencoded physical qubits under realistic conditions: +- Add memory decoherence modeling for idle qubits (currently missing) +- Implement realistic T1/T2 coherence times based on trapped-ion parameters +- Generate comparative plots showing logical vs physical qubit fidelity over time + +### 3. Alternative Noise Models + +Extend the `noise_cfg.py` API to support custom and alternative noise models beyond depolarizing noise: +- Implement amplitude damping and phase damping channels +- Add support for correlated noise models +- Enable user-defined custom noise channels via configuration +- Add noise model parameter sweeps for comparative analysis +- Support for experimental noise characterization data import + +## Contributing + +We welcome contributions to any of these roadmap items! Please: +1. Check existing GitHub issues for related discussions +2. Open a new issue to discuss your proposed implementation approach +3. Submit pull requests with tests and documentation + +For questions or suggestions about the roadmap, please open an issue with the `roadmap` label.