From 81441673becaeb47d1c577a49877f2fcf5967769 Mon Sep 17 00:00:00 2001 From: SeanvdMeer <18538762+minisean@users.noreply.github.com> Date: Sat, 14 Feb 2026 11:21:10 +0100 Subject: [PATCH 1/2] Updated majority voting decoder to work correctly with X-type memory experiment by disabling the effect of refocusing gates every second round on the logical observable --- src/qce_interp/decoder_examples/majority_voting.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/qce_interp/decoder_examples/majority_voting.py b/src/qce_interp/decoder_examples/majority_voting.py index eb68ea4..9b5c8cf 100644 --- a/src/qce_interp/decoder_examples/majority_voting.py +++ b/src/qce_interp/decoder_examples/majority_voting.py @@ -3,6 +3,7 @@ # https://arxiv.org/pdf/1703.04136.pdf # ------------------------------------------- import numpy as np +from qce_circuit.connectivity.intrf_connectivity_surface_code import StabilizerType from qce_interp.interface_definitions.intrf_error_identifier import IErrorDetectionIdentifier from qce_interp.interface_definitions.intrf_syndrome_decoder import IDecoder from qce_interp.interface_definitions.intrf_state_classification import IStateClassifierContainer @@ -22,8 +23,9 @@ class MajorityVotingDecoder(IDecoder): """ # region Class Constructor - def __init__(self, error_identifier: IErrorDetectionIdentifier): + def __init__(self, error_identifier: IErrorDetectionIdentifier, initial_state_basis: StabilizerType = StabilizerType.STABILIZER_Z): self._error_identifier: IErrorDetectionIdentifier = error_identifier + self._initial_state_basis: StabilizerType = initial_state_basis # endregion # region ILookupDecoder Interface Methods @@ -40,7 +42,9 @@ def get_fidelity(self, cycle_stabilizer_count: int, target_state: np.ndarray) -> # (N, D) corrected_binary_output: np.ndarray = binary_output.reshape((n, d)) # Correct for refocusing (bit-flips) - if cycle_stabilizer_count % 2 == 0 and cycle_stabilizer_count != 0: + if self._initial_state_basis == StabilizerType.STABILIZER_X: + corrected_binary_output = corrected_binary_output ^ 1 + elif cycle_stabilizer_count % 2 == 0 and cycle_stabilizer_count != 0: corrected_binary_output = IStateClassifierContainer.binary_to_eigenvalue(corrected_binary_output) * -1 corrected_binary_output = IStateClassifierContainer.eigenvalue_to_binary(corrected_binary_output) From 935450d5a39a919aadc9ef1976725d76e7c0c5f1 Mon Sep 17 00:00:00 2001 From: MiniSean <18538762+MiniSean@users.noreply.github.com> Date: Wed, 25 Mar 2026 18:52:39 +0100 Subject: [PATCH 2/2] Fixed correct use of target state dimension distance --- src/qce_interp/visualization/plot_logical_fidelity.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qce_interp/visualization/plot_logical_fidelity.py b/src/qce_interp/visualization/plot_logical_fidelity.py index 5daec1a..db673e4 100644 --- a/src/qce_interp/visualization/plot_logical_fidelity.py +++ b/src/qce_interp/visualization/plot_logical_fidelity.py @@ -213,7 +213,7 @@ def plot_fidelity(decoder: IDecoder, included_rounds: List[int], target_state: I ) contains_nan_values: bool = np.isnan(y_array).any() if fit_error_rate and not contains_nan_values: - code_distance: int = len(target_state.as_ordered_array(qubit_order=target_state_order)) + code_distance: int = target_state.distance exclude_first_n: int = code_distance if code_distance < 5: exclude_first_n = 2 * code_distance