From 33f6f5dfd4ae54a44011c7f8a085ea6aa99dc3e1 Mon Sep 17 00:00:00 2001 From: "Michael A. Perlin" Date: Mon, 16 Dec 2024 16:35:23 -0500 Subject: [PATCH 01/27] draft steane_qec --- .../src/pecos/qeclib/steane/steane_class.py | 118 +++++++++++++++--- 1 file changed, 101 insertions(+), 17 deletions(-) diff --git a/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py b/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py index e4bf0661..9e2e8054 100644 --- a/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py +++ b/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py @@ -14,6 +14,10 @@ from typing import TYPE_CHECKING from warnings import warn +from pecos.qeclib.steane.decoders.lookup import ( + FlagLookupQASMActiveCorrectionX, + FlagLookupQASMActiveCorrectionZ, +) from pecos.qeclib.steane.gates_sq import paulis, sqrt_paulis from pecos.qeclib.steane.gates_sq.hadamards import H from pecos.qeclib.steane.gates_tq import transversal_tq @@ -283,7 +287,7 @@ def nonft_t_tel(self, aux: Steane): aux.cx(self), self.mz(self.t_meas), If(self.t_meas == 1).Then(aux.x(), aux.sz()), - Permute(self.d, aux.d), + self.permute(aux), ) def t_tel( @@ -306,7 +310,7 @@ def t_tel( aux.cx(self), self.mz(self.t_meas), If(self.t_meas == 1).Then(aux.x(), aux.sz()), # SZ/S correction. - Permute(self.d, aux.d), + self.permute(aux), ) def nonft_tdg_tel(self, aux: Steane): @@ -324,7 +328,7 @@ def nonft_tdg_tel(self, aux: Steane): aux.cx(self), self.mz(self.tdg_meas), If(self.tdg_meas == 1).Then(aux.x(), aux.szdg()), - Permute(self.d, aux.d), + self.permute(aux), ) def tdg_tel( @@ -347,7 +351,7 @@ def tdg_tel( aux.cx(self), self.mz(self.tdg_meas), If(self.t_meas == 1).Then(aux.x(), aux.szdg()), # SZdg/Sdg correction. - Permute(self.d, aux.d), + self.permute(aux), ) # End Experimental: ------------------------------------ @@ -370,19 +374,17 @@ def cz(self, target: Steane): def m(self, meas_basis: str, log: Bit | None = None): """Destructively measure the logical qubit in some Pauli basis.""" - block = Block( - MeasDecode( - q=self.d, - meas_basis=meas_basis, - meas=self.raw_meas, - log_raw=self.log_raw, - log=self.log, - syn_meas=self.syn_meas, - pf_x=self.pf_x, - pf_z=self.pf_z, - last_raw_syn_x=self.last_raw_syn_x, - last_raw_syn_z=self.last_raw_syn_z, - ), + block = MeasDecode( + q=self.d, + meas_basis=meas_basis, + meas=self.raw_meas, + log_raw=self.log_raw, + log=self.log, + syn_meas=self.syn_meas, + pf_x=self.pf_x, + pf_z=self.pf_z, + last_raw_syn_x=self.last_raw_syn_x, + last_raw_syn_z=self.last_raw_syn_z, ) if log is not None: block.extend(log.set(self.log)) @@ -419,3 +421,85 @@ def qec(self, flag_bit: Bit | None = None): if flag_bit is not None: block.extend(If(self.flags != 0).Then(flag_bit.set(1))) return block + + def steane_qec( + self, + aux: Steane, + reject_x: Bit | None = None, + reject_z: Bit | None = None, + flag_bit_x: Bit | None = None, + flag_bit_z: Bit | None = None, + rus_limit: int | None = None, + ) -> Block: + """Run a Steane-type error-correction cycle of this code.""" + return Block( + self.steane_qec_x( + aux, reject=reject_x, flag_bit=flag_bit_x, rus_limit=rus_limit + ), + self.steane_qec_z( + aux, reject=reject_z, flag_bit=flag_bit_z, rus_limit=rus_limit + ), + ) + + def steane_qec_x( + self, + aux: Steane, + reject: Bit | None = None, + flag_bit: Bit | None = None, + rus_limit: int | None = None, + ) -> Block: + """Run a Steane-type error-correction cycle of this code, for X-type errors.""" + return Block( + aux.px(reject=reject, rus_limit=rus_limit), + self.cx(aux), + aux.mx(), + FlagLookupQASMActiveCorrectionX( + self.d, + aux.syn_x, + aux.syndromes, + aux.last_raw_syn_x, + aux.pf_z, + aux.flag_x, + aux.flags, + aux.scratch, + ), + Permute(self.syn_x, aux.syn_x), + Permute(self.last_raw_syn_x, aux.last_raw_syn_x), + Permute(self.pf_z, aux.pf_z), + Permute(self.flags_x, aux.flags_x), + ) + + # def steane_qec_z( + # self, + # aux: Steane, + # reject: Bit | None = None, + # flag_bit: Bit | None = None, + # rus_limit: int | None = None, + # ) -> Block: + # """Run a Steane-type error-correction cycle of this code, for Z-type errors.""" + # return Block( + # aux.pz(reject=reject, rus_limit=rus_limit), + # aux.cx(self), + # aux.mz(), + # FlagLookupQASMActiveCorrectionZ( + # self.d, + # aux.syn_x, + # aux.syndromes, + # aux.last_raw_syn_x, + # aux.pf_z, + # aux.flag_x, + # aux.flags, + # aux.scratch, + # ), + # ) + + def permute(self, other: Steane): + """Permute this Steane qubit with another.""" + # collect all variables in self and other, noting that self.a may or may not be in self.vars + self_vars = [var for var in self.vars if var is not self.a] + [self.a] + other_vars = [var for var in other.vars if var is not other.a] + [other.a] + permutes = [ + Permute(self_var, other_var) + for self_var, other_var in zip(self_vars, other_vars) + ] + return Block(*permutes) From d34ce75f625ae14851f5aeeec75ac9ce63a61c90 Mon Sep 17 00:00:00 2001 From: "Michael A. Perlin" Date: Mon, 16 Dec 2024 18:04:30 -0500 Subject: [PATCH 02/27] fix qec_steane_z --- .../src/pecos/qeclib/steane/steane_class.py | 86 ++++++++++--------- 1 file changed, 46 insertions(+), 40 deletions(-) diff --git a/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py b/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py index 9e2e8054..c14d8cab 100644 --- a/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py +++ b/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py @@ -422,7 +422,7 @@ def qec(self, flag_bit: Bit | None = None): block.extend(If(self.flags != 0).Then(flag_bit.set(1))) return block - def steane_qec( + def qec_steane( self, aux: Steane, reject_x: Bit | None = None, @@ -433,65 +433,71 @@ def steane_qec( ) -> Block: """Run a Steane-type error-correction cycle of this code.""" return Block( - self.steane_qec_x( + self.qec_steane_x( aux, reject=reject_x, flag_bit=flag_bit_x, rus_limit=rus_limit ), - self.steane_qec_z( + self.qec_steane_z( aux, reject=reject_z, flag_bit=flag_bit_z, rus_limit=rus_limit ), ) - def steane_qec_x( + def qec_steane_x( self, aux: Steane, reject: Bit | None = None, flag_bit: Bit | None = None, rus_limit: int | None = None, ) -> Block: - """Run a Steane-type error-correction cycle of this code, for X-type errors.""" + """Run a Steane-type error-correction cycle of for X stabilizers (Z errors).""" + flag = self.scratch.elems[7] # unused bit to flag the presence of errors return Block( aux.px(reject=reject, rus_limit=rus_limit), self.cx(aux), - aux.mx(), + aux.mz(), + self.syn_x.set(aux.syn_meas), + If(self.syn_x != 0).Then(flag.set(1)), + self.last_raw_syn_x.set(0), + self.pf_z.set(0), FlagLookupQASMActiveCorrectionX( self.d, - aux.syn_x, - aux.syndromes, - aux.last_raw_syn_x, - aux.pf_z, - aux.flag_x, - aux.flags, - aux.scratch, + self.syn_x, + self.syndromes, + self.last_raw_syn_x, + self.pf_z, + flag, + self.syn_x, + self.scratch, ), - Permute(self.syn_x, aux.syn_x), - Permute(self.last_raw_syn_x, aux.last_raw_syn_x), - Permute(self.pf_z, aux.pf_z), - Permute(self.flags_x, aux.flags_x), ) - # def steane_qec_z( - # self, - # aux: Steane, - # reject: Bit | None = None, - # flag_bit: Bit | None = None, - # rus_limit: int | None = None, - # ) -> Block: - # """Run a Steane-type error-correction cycle of this code, for Z-type errors.""" - # return Block( - # aux.pz(reject=reject, rus_limit=rus_limit), - # aux.cx(self), - # aux.mz(), - # FlagLookupQASMActiveCorrectionZ( - # self.d, - # aux.syn_x, - # aux.syndromes, - # aux.last_raw_syn_x, - # aux.pf_z, - # aux.flag_x, - # aux.flags, - # aux.scratch, - # ), - # ) + def qec_steane_z( + self, + aux: Steane, + reject: Bit | None = None, + flag_bit: Bit | None = None, + rus_limit: int | None = None, + ) -> Block: + """Run a Steane-type error-correction cycle of for Z stabilizers (X errors).""" + flag = self.scratch.elems[7] # unused bit to flag the presence of errors + return Block( + aux.px(reject=reject, rus_limit=rus_limit), + self.cx(aux), + aux.mz(), + self.syn_z.set(aux.syn_meas), + If(self.syn_z != 0).Then(flag.set(1)), + self.last_raw_syn_z.set(0), + self.pf_x.set(0), + FlagLookupQASMActiveCorrectionZ( + self.d, + self.syn_z, + self.syndromes, + self.last_raw_syn_z, + self.pf_x, + flag, + self.syn_z, + self.scratch, + ), + ) def permute(self, other: Steane): """Permute this Steane qubit with another.""" From a837422da04ea7abb4f64da49c5ac4b453b2d9d6 Mon Sep 17 00:00:00 2001 From: "Michael A. Perlin" Date: Mon, 16 Dec 2024 18:10:24 -0500 Subject: [PATCH 03/27] factor out permute changes to another PR --- .../src/pecos/qeclib/steane/steane_class.py | 19 ++++--------------- 1 file changed, 4 insertions(+), 15 deletions(-) diff --git a/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py b/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py index c14d8cab..4195c672 100644 --- a/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py +++ b/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py @@ -287,7 +287,7 @@ def nonft_t_tel(self, aux: Steane): aux.cx(self), self.mz(self.t_meas), If(self.t_meas == 1).Then(aux.x(), aux.sz()), - self.permute(aux), + Permute(self.d, aux.d), ) def t_tel( @@ -310,7 +310,7 @@ def t_tel( aux.cx(self), self.mz(self.t_meas), If(self.t_meas == 1).Then(aux.x(), aux.sz()), # SZ/S correction. - self.permute(aux), + Permute(self.d, aux.d), ) def nonft_tdg_tel(self, aux: Steane): @@ -328,7 +328,7 @@ def nonft_tdg_tel(self, aux: Steane): aux.cx(self), self.mz(self.tdg_meas), If(self.tdg_meas == 1).Then(aux.x(), aux.szdg()), - self.permute(aux), + Permute(self.d, aux.d), ) def tdg_tel( @@ -351,7 +351,7 @@ def tdg_tel( aux.cx(self), self.mz(self.tdg_meas), If(self.t_meas == 1).Then(aux.x(), aux.szdg()), # SZdg/Sdg correction. - self.permute(aux), + Permute(self.d, aux.d), ) # End Experimental: ------------------------------------ @@ -498,14 +498,3 @@ def qec_steane_z( self.scratch, ), ) - - def permute(self, other: Steane): - """Permute this Steane qubit with another.""" - # collect all variables in self and other, noting that self.a may or may not be in self.vars - self_vars = [var for var in self.vars if var is not self.a] + [self.a] - other_vars = [var for var in other.vars if var is not other.a] + [other.a] - permutes = [ - Permute(self_var, other_var) - for self_var, other_var in zip(self_vars, other_vars) - ] - return Block(*permutes) From 710b0ff062da2e2b604a60a637981926a52f64f4 Mon Sep 17 00:00:00 2001 From: "Michael A. Perlin" Date: Mon, 16 Dec 2024 18:10:57 -0500 Subject: [PATCH 04/27] factor out Steane.m cleanup to another PR --- .../src/pecos/qeclib/steane/steane_class.py | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py b/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py index 4195c672..4dcd392d 100644 --- a/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py +++ b/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py @@ -374,17 +374,19 @@ def cz(self, target: Steane): def m(self, meas_basis: str, log: Bit | None = None): """Destructively measure the logical qubit in some Pauli basis.""" - block = MeasDecode( - q=self.d, - meas_basis=meas_basis, - meas=self.raw_meas, - log_raw=self.log_raw, - log=self.log, - syn_meas=self.syn_meas, - pf_x=self.pf_x, - pf_z=self.pf_z, - last_raw_syn_x=self.last_raw_syn_x, - last_raw_syn_z=self.last_raw_syn_z, + block = Block( + MeasDecode( + q=self.d, + meas_basis=meas_basis, + meas=self.raw_meas, + log_raw=self.log_raw, + log=self.log, + syn_meas=self.syn_meas, + pf_x=self.pf_x, + pf_z=self.pf_z, + last_raw_syn_x=self.last_raw_syn_x, + last_raw_syn_z=self.last_raw_syn_z, + ), ) if log is not None: block.extend(log.set(self.log)) From 2743142fe77a4f1cd1e8c6b3a0efbf484615b99d Mon Sep 17 00:00:00 2001 From: "Michael A. Perlin" Date: Mon, 16 Dec 2024 18:27:24 -0500 Subject: [PATCH 05/27] set flag bit correctly --- .../src/pecos/qeclib/steane/steane_class.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py b/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py index 4dcd392d..c151cc12 100644 --- a/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py +++ b/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py @@ -451,13 +451,13 @@ def qec_steane_x( rus_limit: int | None = None, ) -> Block: """Run a Steane-type error-correction cycle of for X stabilizers (Z errors).""" - flag = self.scratch.elems[7] # unused bit to flag the presence of errors + flag_bit = flag_bit or self.scratch.elems[7] return Block( - aux.px(reject=reject, rus_limit=rus_limit), - self.cx(aux), - aux.mz(), + aux.pz(reject=reject, rus_limit=rus_limit), + aux.cx(self), + aux.mx(), self.syn_x.set(aux.syn_meas), - If(self.syn_x != 0).Then(flag.set(1)), + If(self.syn_x != 0).Then(flag_bit.set(1)), self.last_raw_syn_x.set(0), self.pf_z.set(0), FlagLookupQASMActiveCorrectionX( @@ -466,7 +466,7 @@ def qec_steane_x( self.syndromes, self.last_raw_syn_x, self.pf_z, - flag, + flag_bit, self.syn_x, self.scratch, ), @@ -480,13 +480,13 @@ def qec_steane_z( rus_limit: int | None = None, ) -> Block: """Run a Steane-type error-correction cycle of for Z stabilizers (X errors).""" - flag = self.scratch.elems[7] # unused bit to flag the presence of errors + flag_bit = flag_bit or self.scratch.elems[7] return Block( aux.px(reject=reject, rus_limit=rus_limit), self.cx(aux), aux.mz(), self.syn_z.set(aux.syn_meas), - If(self.syn_z != 0).Then(flag.set(1)), + If(self.syn_z != 0).Then(flag_bit.set(1)), self.last_raw_syn_z.set(0), self.pf_x.set(0), FlagLookupQASMActiveCorrectionZ( @@ -495,7 +495,7 @@ def qec_steane_z( self.syndromes, self.last_raw_syn_z, self.pf_x, - flag, + flag_bit, self.syn_z, self.scratch, ), From 566d26655e9f6e25b51d1c5724dff9f7156e5867 Mon Sep 17 00:00:00 2001 From: "Michael A. Perlin" Date: Mon, 16 Dec 2024 18:44:50 -0500 Subject: [PATCH 06/27] add qec_steane_.*tel templates --- .../src/pecos/qeclib/steane/steane_class.py | 109 +++++++++++++++--- 1 file changed, 93 insertions(+), 16 deletions(-) diff --git a/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py b/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py index c151cc12..bf14302e 100644 --- a/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py +++ b/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py @@ -435,12 +435,89 @@ def qec_steane( ) -> Block: """Run a Steane-type error-correction cycle of this code.""" return Block( + self.qec_steane_z( + aux, reject=reject_z, flag_bit=flag_bit_z, rus_limit=rus_limit + ), self.qec_steane_x( aux, reject=reject_x, flag_bit=flag_bit_x, rus_limit=rus_limit ), - self.qec_steane_z( + ) + + def qec_steane_tel( + self, + aux: Steane, + reject_x: Bit | None = None, + reject_z: Bit | None = None, + flag_bit_x: Bit | None = None, + flag_bit_z: Bit | None = None, + rus_limit: int | None = None, + ) -> Block: + """Run a Steane-type error-correction cycle of this code with one-bit teleportation.""" + return Block( + self.qec_steane_z_tel( aux, reject=reject_z, flag_bit=flag_bit_z, rus_limit=rus_limit ), + self.qec_steane_x_tel( + aux, reject=reject_x, flag_bit=flag_bit_x, rus_limit=rus_limit + ), + ) + + def qec_steane_z( + self, + aux: Steane, + reject: Bit | None = None, + flag_bit: Bit | None = None, + rus_limit: int | None = None, + ) -> Block: + """Run a Steane-type error-correction cycle for Z stabilizers (X errors).""" + flag_bit = flag_bit or self.scratch.elems[7] + return Block( + aux.px(reject=reject, rus_limit=rus_limit), + self.cx(aux), + aux.mz(), + self.syn_z.set(aux.syn_meas), + If(self.syn_z != 0).Then(flag_bit.set(1)), + self.last_raw_syn_z.set(0), + self.pf_x.set(0), + FlagLookupQASMActiveCorrectionZ( + self.d, + self.syn_z, + self.syndromes, + self.last_raw_syn_z, + self.pf_x, + flag_bit, + self.syn_z, + self.scratch, + ), + ) + + def qec_steane_z_tel( + self, + aux: Steane, + reject: Bit | None = None, + flag_bit: Bit | None = None, + rus_limit: int | None = None, + ) -> Block: + """Run a Steane-type error-correction cycle for Z stabilizers with one-bit teleportation.""" + flag_bit = flag_bit or self.scratch.elems[7] + return Block( + aux.px(reject=reject, rus_limit=rus_limit), + self.cx(aux), + aux.mz(), + self.syn_z.set(aux.syn_meas), + If(self.syn_z != 0).Then(flag_bit.set(1)), + self.last_raw_syn_z.set(0), + self.pf_x.set(0), + FlagLookupQASMActiveCorrectionZ( + self.d, + self.syn_z, + self.syndromes, + self.last_raw_syn_z, + self.pf_x, + flag_bit, + self.syn_z, + self.scratch, + ), ) def qec_steane_x( @@ -450,7 +527,7 @@ def qec_steane_x( flag_bit: Bit | None = None, rus_limit: int | None = None, ) -> Block: - """Run a Steane-type error-correction cycle of for X stabilizers (Z errors).""" + """Run a Steane-type error-correction cycle for X stabilizers (Z errors).""" flag_bit = flag_bit or self.scratch.elems[7] return Block( aux.pz(reject=reject, rus_limit=rus_limit), @@ -472,31 +549,31 @@ def qec_steane_x( ), ) - def qec_steane_z( + def qec_steane_x_tel( self, aux: Steane, reject: Bit | None = None, flag_bit: Bit | None = None, rus_limit: int | None = None, ) -> Block: - """Run a Steane-type error-correction cycle of for Z stabilizers (X errors).""" + """Run a Steane-type error-correction cycle for X stabilizers with one-bit teleportation.""" flag_bit = flag_bit or self.scratch.elems[7] return Block( - aux.px(reject=reject, rus_limit=rus_limit), - self.cx(aux), - aux.mz(), - self.syn_z.set(aux.syn_meas), - If(self.syn_z != 0).Then(flag_bit.set(1)), - self.last_raw_syn_z.set(0), - self.pf_x.set(0), - FlagLookupQASMActiveCorrectionZ( + aux.pz(reject=reject, rus_limit=rus_limit), + aux.cx(self), + aux.mx(), + self.syn_x.set(aux.syn_meas), + If(self.syn_x != 0).Then(flag_bit.set(1)), + self.last_raw_syn_x.set(0), + self.pf_z.set(0), + FlagLookupQASMActiveCorrectionX( self.d, - self.syn_z, + self.syn_x, self.syndromes, - self.last_raw_syn_z, - self.pf_x, + self.last_raw_syn_x, + self.pf_z, flag_bit, - self.syn_z, + self.syn_x, self.scratch, ), ) From f39c31bbde64b9cf61f18970d42794bd26eb8e3f Mon Sep 17 00:00:00 2001 From: "Michael A. Perlin" Date: Mon, 16 Dec 2024 19:33:37 -0500 Subject: [PATCH 07/27] fix Steane.qec_steane_tel --- .../src/pecos/qeclib/steane/steane_class.py | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py b/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py index bf14302e..8597c652 100644 --- a/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py +++ b/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py @@ -502,14 +502,15 @@ def qec_steane_z_tel( flag_bit = flag_bit or self.scratch.elems[7] return Block( aux.px(reject=reject, rus_limit=rus_limit), - self.cx(aux), - aux.mz(), + aux.cx(self), + self.mz(), + If(self.log).Then(aux.x()), self.syn_z.set(aux.syn_meas), If(self.syn_z != 0).Then(flag_bit.set(1)), self.last_raw_syn_z.set(0), self.pf_x.set(0), FlagLookupQASMActiveCorrectionZ( - self.d, + aux.d, self.syn_z, self.syndromes, self.last_raw_syn_z, @@ -518,6 +519,7 @@ def qec_steane_z_tel( self.syn_z, self.scratch, ), + Permute(self.d, aux.d), ) def qec_steane_x( @@ -560,9 +562,10 @@ def qec_steane_x_tel( flag_bit = flag_bit or self.scratch.elems[7] return Block( aux.pz(reject=reject, rus_limit=rus_limit), - aux.cx(self), - aux.mx(), - self.syn_x.set(aux.syn_meas), + self.cx(aux), + self.mx(), + If(self.log).Then(aux.z()), + self.syn_x.set(self.syn_meas), If(self.syn_x != 0).Then(flag_bit.set(1)), self.last_raw_syn_x.set(0), self.pf_z.set(0), @@ -576,4 +579,5 @@ def qec_steane_x_tel( self.syn_x, self.scratch, ), + Permute(self.d, aux.d), ) From 95c68918873141aa68db32d056c29246981e6c8f Mon Sep 17 00:00:00 2001 From: "Michael A. Perlin" Date: Mon, 16 Dec 2024 20:09:03 -0500 Subject: [PATCH 08/27] permute all qubits for teleportation --- python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py b/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py index 8597c652..a30c2436 100644 --- a/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py +++ b/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py @@ -520,6 +520,7 @@ def qec_steane_z_tel( self.scratch, ), Permute(self.d, aux.d), + Permute(self.a, aux.a), ) def qec_steane_x( @@ -580,4 +581,5 @@ def qec_steane_x_tel( self.scratch, ), Permute(self.d, aux.d), + Permute(self.a, aux.a), ) From 661cd65b53ea4e71773fb57d0868a394cc1636e3 Mon Sep 17 00:00:00 2001 From: "Michael A. Perlin" Date: Mon, 16 Dec 2024 20:58:45 -0500 Subject: [PATCH 09/27] formatting fixes --- .../src/pecos/qeclib/steane/steane_class.py | 20 +++++-------------- 1 file changed, 5 insertions(+), 15 deletions(-) diff --git a/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py b/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py index a30c2436..7216a816 100644 --- a/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py +++ b/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py @@ -166,9 +166,7 @@ def prep_t_plus_state( d=self.d, a=self.a, out=self.scratch, - reject=self.scratch[ - 2 - ], # the first two bits of self.scratch are used by "out" + reject=self.scratch[2], # the first two bits of self.scratch are used by "out" flag_x=self.flag_x, flag_z=self.flag_z, flags=self.flags, @@ -435,12 +433,8 @@ def qec_steane( ) -> Block: """Run a Steane-type error-correction cycle of this code.""" return Block( - self.qec_steane_z( - aux, reject=reject_z, flag_bit=flag_bit_z, rus_limit=rus_limit - ), - self.qec_steane_x( - aux, reject=reject_x, flag_bit=flag_bit_x, rus_limit=rus_limit - ), + self.qec_steane_z(aux, reject=reject_z, flag_bit=flag_bit_z, rus_limit=rus_limit), + self.qec_steane_x(aux, reject=reject_x, flag_bit=flag_bit_x, rus_limit=rus_limit), ) def qec_steane_tel( @@ -454,12 +448,8 @@ def qec_steane_tel( ) -> Block: """Run a Steane-type error-correction cycle of this code with one-bit teleportation.""" return Block( - self.qec_steane_z_tel( - aux, reject=reject_z, flag_bit=flag_bit_z, rus_limit=rus_limit - ), - self.qec_steane_x_tel( - aux, reject=reject_x, flag_bit=flag_bit_x, rus_limit=rus_limit - ), + self.qec_steane_z_tel(aux, reject=reject_z, flag_bit=flag_bit_z, rus_limit=rus_limit), + self.qec_steane_x_tel(aux, reject=reject_x, flag_bit=flag_bit_x, rus_limit=rus_limit), ) def qec_steane_z( From b6c1fb267bb579dea7aa0ba166ebac43cf68a33e Mon Sep 17 00:00:00 2001 From: "Michael A. Perlin" Date: Mon, 16 Dec 2024 21:06:22 -0500 Subject: [PATCH 10/27] formatting fixes --- .../src/pecos/qeclib/steane/steane_class.py | 24 ++++++++++++------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py b/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py index 7216a816..aa5e711e 100644 --- a/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py +++ b/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py @@ -160,13 +160,14 @@ def prep_t_plus_state( rus_limit: int | None = None, ): """Prepare logical T|+X> in a fault tolerant manner.""" - block = Block( + reject = reject or self.scratch[2] # the first two scratch bits are used by "out" + return Block( self.scratch.set(0), PrepEncodeTPlusFTRUS( d=self.d, a=self.a, out=self.scratch, - reject=self.scratch[2], # the first two bits of self.scratch are used by "out" + reject=reject, flag_x=self.flag_x, flag_z=self.flag_z, flags=self.flags, @@ -175,9 +176,6 @@ def prep_t_plus_state( limit=rus_limit or self.default_rus_limit, ), ) - if reject is not None: - block.extend(reject.set(self.scratch[2])) - return block def nonft_prep_tdg_plus_state(self): """Prepare logical Tdg|+X> in a non-fault tolerant manner.""" @@ -433,8 +431,12 @@ def qec_steane( ) -> Block: """Run a Steane-type error-correction cycle of this code.""" return Block( - self.qec_steane_z(aux, reject=reject_z, flag_bit=flag_bit_z, rus_limit=rus_limit), - self.qec_steane_x(aux, reject=reject_x, flag_bit=flag_bit_x, rus_limit=rus_limit), + self.qec_steane_z( + aux, reject=reject_z, flag_bit=flag_bit_z, rus_limit=rus_limit + ), + self.qec_steane_x( + aux, reject=reject_x, flag_bit=flag_bit_x, rus_limit=rus_limit + ), ) def qec_steane_tel( @@ -448,8 +450,12 @@ def qec_steane_tel( ) -> Block: """Run a Steane-type error-correction cycle of this code with one-bit teleportation.""" return Block( - self.qec_steane_z_tel(aux, reject=reject_z, flag_bit=flag_bit_z, rus_limit=rus_limit), - self.qec_steane_x_tel(aux, reject=reject_x, flag_bit=flag_bit_x, rus_limit=rus_limit), + self.qec_steane_z_tel( + aux, reject=reject_z, flag_bit=flag_bit_z, rus_limit=rus_limit + ), + self.qec_steane_x_tel( + aux, reject=reject_x, flag_bit=flag_bit_x, rus_limit=rus_limit + ), ) def qec_steane_z( From 548f21649fdf11f4a1c9faef98fd627704ba7e8b Mon Sep 17 00:00:00 2001 From: "Michael A. Perlin" Date: Mon, 16 Dec 2024 21:09:21 -0500 Subject: [PATCH 11/27] formatting fix --- .../quantum-pecos/src/pecos/qeclib/steane/steane_class.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py b/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py index aa5e711e..256c9d1d 100644 --- a/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py +++ b/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py @@ -160,14 +160,13 @@ def prep_t_plus_state( rus_limit: int | None = None, ): """Prepare logical T|+X> in a fault tolerant manner.""" - reject = reject or self.scratch[2] # the first two scratch bits are used by "out" - return Block( + block = Block( self.scratch.set(0), PrepEncodeTPlusFTRUS( d=self.d, a=self.a, out=self.scratch, - reject=reject, + reject=self.scratch[2], # the first two bits are used by "out" flag_x=self.flag_x, flag_z=self.flag_z, flags=self.flags, @@ -176,6 +175,9 @@ def prep_t_plus_state( limit=rus_limit or self.default_rus_limit, ), ) + if reject is not None: + block.extend(reject.set(self.scratch[2])) + return block def nonft_prep_tdg_plus_state(self): """Prepare logical Tdg|+X> in a non-fault tolerant manner.""" From e7bbed0c843cdfa9d5f678d092e25e2a367c733d Mon Sep 17 00:00:00 2001 From: "Michael A. Perlin" Date: Mon, 16 Dec 2024 21:43:51 -0500 Subject: [PATCH 12/27] formatting fix --- .../src/pecos/qeclib/steane/steane_class.py | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py b/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py index 256c9d1d..53239948 100644 --- a/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py +++ b/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py @@ -434,10 +434,16 @@ def qec_steane( """Run a Steane-type error-correction cycle of this code.""" return Block( self.qec_steane_z( - aux, reject=reject_z, flag_bit=flag_bit_z, rus_limit=rus_limit + aux, + reject=reject_z, + flag_bit=flag_bit_z, + rus_limit=rus_limit, ), self.qec_steane_x( - aux, reject=reject_x, flag_bit=flag_bit_x, rus_limit=rus_limit + aux, + reject=reject_x, + flag_bit=flag_bit_x, + rus_limit=rus_limit, ), ) @@ -453,10 +459,16 @@ def qec_steane_tel( """Run a Steane-type error-correction cycle of this code with one-bit teleportation.""" return Block( self.qec_steane_z_tel( - aux, reject=reject_z, flag_bit=flag_bit_z, rus_limit=rus_limit + aux, + reject=reject_z, + flag_bit=flag_bit_z, + rus_limit=rus_limit, ), self.qec_steane_x_tel( - aux, reject=reject_x, flag_bit=flag_bit_x, rus_limit=rus_limit + aux, + reject=reject_x, + flag_bit=flag_bit_x, + rus_limit=rus_limit, ), ) From e6077e119ca44a39a3b789df6e123f688138fff7 Mon Sep 17 00:00:00 2001 From: "Michael A. Perlin" Date: Mon, 16 Dec 2024 22:26:01 -0500 Subject: [PATCH 13/27] no need to permute ancillas --- python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py b/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py index 53239948..bceea73f 100644 --- a/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py +++ b/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py @@ -530,7 +530,6 @@ def qec_steane_z_tel( self.scratch, ), Permute(self.d, aux.d), - Permute(self.a, aux.a), ) def qec_steane_x( @@ -591,5 +590,4 @@ def qec_steane_x_tel( self.scratch, ), Permute(self.d, aux.d), - Permute(self.a, aux.a), ) From 622b2d2d52853a1d94a711aed35981b6f8d682b2 Mon Sep 17 00:00:00 2001 From: "Michael A. Perlin" Date: Mon, 16 Dec 2024 23:59:06 -0500 Subject: [PATCH 14/27] minor rearrangement --- .../src/pecos/qeclib/steane/steane_class.py | 72 +++++++++---------- 1 file changed, 34 insertions(+), 38 deletions(-) diff --git a/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py b/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py index bceea73f..456e88ea 100644 --- a/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py +++ b/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py @@ -485,80 +485,77 @@ def qec_steane_z( aux.px(reject=reject, rus_limit=rus_limit), self.cx(aux), aux.mz(), - self.syn_z.set(aux.syn_meas), - If(self.syn_z != 0).Then(flag_bit.set(1)), + If(aux.syn_meas != 0).Then(flag_bit.set(1)), self.last_raw_syn_z.set(0), self.pf_x.set(0), FlagLookupQASMActiveCorrectionZ( self.d, - self.syn_z, + aux.syn_meas, self.syndromes, self.last_raw_syn_z, self.pf_x, flag_bit, - self.syn_z, + aux.syn_meas, self.scratch, ), ) - def qec_steane_z_tel( + def qec_steane_x( self, aux: Steane, reject: Bit | None = None, flag_bit: Bit | None = None, rus_limit: int | None = None, ) -> Block: - """Run a Steane-type error-correction cycle for Z stabilizers with one-bit teleportation.""" + """Run a Steane-type error-correction cycle for X stabilizers (Z errors).""" flag_bit = flag_bit or self.scratch.elems[7] return Block( - aux.px(reject=reject, rus_limit=rus_limit), + aux.pz(reject=reject, rus_limit=rus_limit), aux.cx(self), - self.mz(), - If(self.log).Then(aux.x()), - self.syn_z.set(aux.syn_meas), - If(self.syn_z != 0).Then(flag_bit.set(1)), - self.last_raw_syn_z.set(0), - self.pf_x.set(0), - FlagLookupQASMActiveCorrectionZ( - aux.d, - self.syn_z, + aux.mx(), + If(aux.syn_meas != 0).Then(flag_bit.set(1)), + self.last_raw_syn_x.set(0), + self.pf_z.set(0), + FlagLookupQASMActiveCorrectionX( + self.d, + aux.syn_meas, self.syndromes, - self.last_raw_syn_z, - self.pf_x, + self.last_raw_syn_x, + self.pf_z, flag_bit, - self.syn_z, + aux.syn_meas, self.scratch, ), - Permute(self.d, aux.d), ) - def qec_steane_x( + def qec_steane_z_tel( self, aux: Steane, reject: Bit | None = None, flag_bit: Bit | None = None, rus_limit: int | None = None, ) -> Block: - """Run a Steane-type error-correction cycle for X stabilizers (Z errors).""" + """Run a Steane-type error-correction cycle for Z stabilizers with one-bit teleportation.""" flag_bit = flag_bit or self.scratch.elems[7] return Block( - aux.pz(reject=reject, rus_limit=rus_limit), + aux.px(reject=reject, rus_limit=rus_limit), aux.cx(self), - aux.mx(), - self.syn_x.set(aux.syn_meas), - If(self.syn_x != 0).Then(flag_bit.set(1)), - self.last_raw_syn_x.set(0), - self.pf_z.set(0), - FlagLookupQASMActiveCorrectionX( - self.d, - self.syn_x, + self.mz(), + If(self.log).Then(aux.x()), + If(aux.syn_meas != 0).Then(flag_bit.set(1)), + self.last_raw_syn_z.set(0), + self.pf_x.set(0), + FlagLookupQASMActiveCorrectionZ( + aux.d, + aux.syn_meas, self.syndromes, - self.last_raw_syn_x, - self.pf_z, + self.last_raw_syn_z, + self.pf_x, flag_bit, - self.syn_x, + aux.syn_meas, self.scratch, ), + Permute(self.d, aux.d), ) def qec_steane_x_tel( @@ -575,18 +572,17 @@ def qec_steane_x_tel( self.cx(aux), self.mx(), If(self.log).Then(aux.z()), - self.syn_x.set(self.syn_meas), - If(self.syn_x != 0).Then(flag_bit.set(1)), + If(self.syn_meas != 0).Then(flag_bit.set(1)), self.last_raw_syn_x.set(0), self.pf_z.set(0), FlagLookupQASMActiveCorrectionX( self.d, - self.syn_x, + self.syn_meas, self.syndromes, self.last_raw_syn_x, self.pf_z, flag_bit, - self.syn_x, + self.syn_meas, self.scratch, ), Permute(self.d, aux.d), From 4d665ce9d760378dd5630b3d8510a11999ef4d0a Mon Sep 17 00:00:00 2001 From: "Michael A. Perlin" Date: Tue, 17 Dec 2024 01:02:47 -0500 Subject: [PATCH 15/27] fix teleportation-based QEC --- .../src/pecos/qeclib/steane/steane_class.py | 95 +++++++------------ 1 file changed, 36 insertions(+), 59 deletions(-) diff --git a/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py b/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py index 456e88ea..e5835562 100644 --- a/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py +++ b/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py @@ -447,31 +447,6 @@ def qec_steane( ), ) - def qec_steane_tel( - self, - aux: Steane, - reject_x: Bit | None = None, - reject_z: Bit | None = None, - flag_bit_x: Bit | None = None, - flag_bit_z: Bit | None = None, - rus_limit: int | None = None, - ) -> Block: - """Run a Steane-type error-correction cycle of this code with one-bit teleportation.""" - return Block( - self.qec_steane_z_tel( - aux, - reject=reject_z, - flag_bit=flag_bit_z, - rus_limit=rus_limit, - ), - self.qec_steane_x_tel( - aux, - reject=reject_x, - flag_bit=flag_bit_x, - rus_limit=rus_limit, - ), - ) - def qec_steane_z( self, aux: Steane, @@ -528,62 +503,64 @@ def qec_steane_x( ), ) - def qec_steane_z_tel( + def qec_tel( self, aux: Steane, - reject: Bit | None = None, + reject_x: Bit | None = None, + reject_z: Bit | None = None, flag_bit: Bit | None = None, rus_limit: int | None = None, ) -> Block: - """Run a Steane-type error-correction cycle for Z stabilizers with one-bit teleportation.""" - flag_bit = flag_bit or self.scratch.elems[7] + """Run a teleportation-based error correction cycle.""" return Block( + self.qec_tel_x(aux, reject_x, rus_limit=rus_limit), + self.qec_tel_z(aux, reject_x, flag_bit, rus_limit), + ) + + def qec_tel_x( + self, + aux: Steane, + reject: Bit | None = None, + flag_bit: Bit | None = None, + rus_limit: int | None = None, + ) -> Block: + """Run a teleportation-based error correction cycle for X errors.""" + block = Block( + # teleport aux.px(reject=reject, rus_limit=rus_limit), aux.cx(self), self.mz(), If(self.log).Then(aux.x()), - If(aux.syn_meas != 0).Then(flag_bit.set(1)), - self.last_raw_syn_z.set(0), - self.pf_x.set(0), - FlagLookupQASMActiveCorrectionZ( - aux.d, - aux.syn_meas, - self.syndromes, - self.last_raw_syn_z, - self.pf_x, - flag_bit, - aux.syn_meas, - self.scratch, - ), Permute(self.d, aux.d), + # update syndromes and pauli frame + self.last_raw_syn_z.set(self.syn_meas), + self.last_raw_syn_x.set(0), + self.pf_x.set(0), ) + if flag_bit is not None: + block.extend(If(self.syn_meas != 0).Then(flag_bit.set(1))) + return block - def qec_steane_x_tel( + def qec_tel_z( self, aux: Steane, reject: Bit | None = None, flag_bit: Bit | None = None, rus_limit: int | None = None, ) -> Block: - """Run a Steane-type error-correction cycle for X stabilizers with one-bit teleportation.""" - flag_bit = flag_bit or self.scratch.elems[7] - return Block( + """Run a teleportation-based error correction cycle for X errors.""" + block = Block( + # teleport aux.pz(reject=reject, rus_limit=rus_limit), self.cx(aux), self.mx(), If(self.log).Then(aux.z()), - If(self.syn_meas != 0).Then(flag_bit.set(1)), - self.last_raw_syn_x.set(0), - self.pf_z.set(0), - FlagLookupQASMActiveCorrectionX( - self.d, - self.syn_meas, - self.syndromes, - self.last_raw_syn_x, - self.pf_z, - flag_bit, - self.syn_meas, - self.scratch, - ), Permute(self.d, aux.d), + # update syndromes and pauli frame + self.last_raw_syn_x.set(self.syn_meas), + self.last_raw_syn_z.set(0), + self.pf_z.set(0), ) + if flag_bit is not None: + block.extend(If(self.syn_meas != 0).Then(flag_bit.set(1))) + return block From b864193bd368e7efd997f0ede8db8e28198746df Mon Sep 17 00:00:00 2001 From: "Michael A. Perlin" Date: Tue, 17 Dec 2024 01:06:46 -0500 Subject: [PATCH 16/27] fix typo --- python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py b/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py index e5835562..54066918 100644 --- a/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py +++ b/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py @@ -548,7 +548,7 @@ def qec_tel_z( flag_bit: Bit | None = None, rus_limit: int | None = None, ) -> Block: - """Run a teleportation-based error correction cycle for X errors.""" + """Run a teleportation-based error correction cycle for Z errors.""" block = Block( # teleport aux.pz(reject=reject, rus_limit=rus_limit), From 0e8ae1d1bbddf68102193e92ad9222cce1ea19de Mon Sep 17 00:00:00 2001 From: "Michael A. Perlin" Date: Tue, 17 Dec 2024 01:15:42 -0500 Subject: [PATCH 17/27] maybe fix classical registers in teleportation-based QEC --- .../quantum-pecos/src/pecos/qeclib/steane/steane_class.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py b/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py index 54066918..294d9605 100644 --- a/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py +++ b/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py @@ -533,8 +533,9 @@ def qec_tel_x( If(self.log).Then(aux.x()), Permute(self.d, aux.d), # update syndromes and pauli frame - self.last_raw_syn_z.set(self.syn_meas), self.last_raw_syn_x.set(0), + self.last_raw_syn_z.set(0), + self.syn_z.set(self.syn_meas), self.pf_x.set(0), ) if flag_bit is not None: @@ -557,8 +558,9 @@ def qec_tel_z( If(self.log).Then(aux.z()), Permute(self.d, aux.d), # update syndromes and pauli frame - self.last_raw_syn_x.set(self.syn_meas), + self.last_raw_syn_x.set(0), self.last_raw_syn_z.set(0), + self.syn_x.set(self.syn_meas), self.pf_z.set(0), ) if flag_bit is not None: From 4c6486509019d493652a46abd53f4b119d9e863d Mon Sep 17 00:00:00 2001 From: "Michael A. Perlin" Date: Tue, 17 Dec 2024 10:00:52 -0500 Subject: [PATCH 18/27] two flag bits for Steane.qec_tel --- .../quantum-pecos/src/pecos/qeclib/steane/steane_class.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py b/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py index 294d9605..e5c782e1 100644 --- a/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py +++ b/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py @@ -508,13 +508,14 @@ def qec_tel( aux: Steane, reject_x: Bit | None = None, reject_z: Bit | None = None, - flag_bit: Bit | None = None, + flag_bit_x: Bit | None = None, + flag_bit_z: Bit | None = None, rus_limit: int | None = None, ) -> Block: """Run a teleportation-based error correction cycle.""" return Block( - self.qec_tel_x(aux, reject_x, rus_limit=rus_limit), - self.qec_tel_z(aux, reject_x, flag_bit, rus_limit), + self.qec_tel_x(aux, reject_x, flag_bit_x, rus_limit), + self.qec_tel_z(aux, reject_z, flag_bit_z, rus_limit), ) def qec_tel_x( From 3cee0b9ac02b4a1e3d609fb386b5a4a692421775 Mon Sep 17 00:00:00 2001 From: "Michael A. Perlin" Date: Tue, 17 Dec 2024 10:03:43 -0500 Subject: [PATCH 19/27] add warnings --- python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py b/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py index e5c782e1..30c9ee5c 100644 --- a/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py +++ b/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py @@ -455,6 +455,7 @@ def qec_steane_z( rus_limit: int | None = None, ) -> Block: """Run a Steane-type error-correction cycle for Z stabilizers (X errors).""" + warn("Using experimental feature: qec_steane_z", stacklevel=2) flag_bit = flag_bit or self.scratch.elems[7] return Block( aux.px(reject=reject, rus_limit=rus_limit), @@ -483,6 +484,7 @@ def qec_steane_x( rus_limit: int | None = None, ) -> Block: """Run a Steane-type error-correction cycle for X stabilizers (Z errors).""" + warn("Using experimental feature: qec_steane_x", stacklevel=2) flag_bit = flag_bit or self.scratch.elems[7] return Block( aux.pz(reject=reject, rus_limit=rus_limit), @@ -526,6 +528,7 @@ def qec_tel_x( rus_limit: int | None = None, ) -> Block: """Run a teleportation-based error correction cycle for X errors.""" + warn("Using experimental feature: qec_tel_x", stacklevel=2) block = Block( # teleport aux.px(reject=reject, rus_limit=rus_limit), @@ -551,6 +554,7 @@ def qec_tel_z( rus_limit: int | None = None, ) -> Block: """Run a teleportation-based error correction cycle for Z errors.""" + warn("Using experimental feature: qec_tel_z", stacklevel=2) block = Block( # teleport aux.pz(reject=reject, rus_limit=rus_limit), From b1ab651bd42aa510bbcddd6a468038ed3acbd13d Mon Sep 17 00:00:00 2001 From: "Michael A. Perlin" Date: Tue, 17 Dec 2024 10:13:26 -0500 Subject: [PATCH 20/27] rename flag_bit --> flag, in agreement with elsewhere in the repo --- .../src/pecos/qeclib/steane/steane_class.py | 50 +++++++++---------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py b/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py index 30c9ee5c..c503b924 100644 --- a/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py +++ b/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py @@ -402,7 +402,7 @@ def mz(self, log: Bit | None = None): """Logical destructive measurement of the logical Z operator.""" return self.m("Z", log=log) - def qec(self, flag_bit: Bit | None = None): + def qec(self, flag: Bit | None = None): block = ParallelFlagQECActiveCorrection( q=self.d, a=self.a, @@ -418,8 +418,8 @@ def qec(self, flag_bit: Bit | None = None): pf_z=self.pf_z, scratch=self.scratch, ) - if flag_bit is not None: - block.extend(If(self.flags != 0).Then(flag_bit.set(1))) + if flag is not None: + block.extend(If(self.flags != 0).Then(flag.set(1))) return block def qec_steane( @@ -427,8 +427,8 @@ def qec_steane( aux: Steane, reject_x: Bit | None = None, reject_z: Bit | None = None, - flag_bit_x: Bit | None = None, - flag_bit_z: Bit | None = None, + flag_x: Bit | None = None, + flag_z: Bit | None = None, rus_limit: int | None = None, ) -> Block: """Run a Steane-type error-correction cycle of this code.""" @@ -436,13 +436,13 @@ def qec_steane( self.qec_steane_z( aux, reject=reject_z, - flag_bit=flag_bit_z, + flag=flag_z, rus_limit=rus_limit, ), self.qec_steane_x( aux, reject=reject_x, - flag_bit=flag_bit_x, + flag=flag_x, rus_limit=rus_limit, ), ) @@ -451,17 +451,17 @@ def qec_steane_z( self, aux: Steane, reject: Bit | None = None, - flag_bit: Bit | None = None, + flag: Bit | None = None, rus_limit: int | None = None, ) -> Block: """Run a Steane-type error-correction cycle for Z stabilizers (X errors).""" warn("Using experimental feature: qec_steane_z", stacklevel=2) - flag_bit = flag_bit or self.scratch.elems[7] + flag = flag or self.scratch.elems[7] return Block( aux.px(reject=reject, rus_limit=rus_limit), self.cx(aux), aux.mz(), - If(aux.syn_meas != 0).Then(flag_bit.set(1)), + If(aux.syn_meas != 0).Then(flag.set(1)), self.last_raw_syn_z.set(0), self.pf_x.set(0), FlagLookupQASMActiveCorrectionZ( @@ -470,7 +470,7 @@ def qec_steane_z( self.syndromes, self.last_raw_syn_z, self.pf_x, - flag_bit, + flag, aux.syn_meas, self.scratch, ), @@ -480,17 +480,17 @@ def qec_steane_x( self, aux: Steane, reject: Bit | None = None, - flag_bit: Bit | None = None, + flag: Bit | None = None, rus_limit: int | None = None, ) -> Block: """Run a Steane-type error-correction cycle for X stabilizers (Z errors).""" warn("Using experimental feature: qec_steane_x", stacklevel=2) - flag_bit = flag_bit or self.scratch.elems[7] + flag = flag or self.scratch.elems[7] return Block( aux.pz(reject=reject, rus_limit=rus_limit), aux.cx(self), aux.mx(), - If(aux.syn_meas != 0).Then(flag_bit.set(1)), + If(aux.syn_meas != 0).Then(flag.set(1)), self.last_raw_syn_x.set(0), self.pf_z.set(0), FlagLookupQASMActiveCorrectionX( @@ -499,7 +499,7 @@ def qec_steane_x( self.syndromes, self.last_raw_syn_x, self.pf_z, - flag_bit, + flag, aux.syn_meas, self.scratch, ), @@ -510,21 +510,21 @@ def qec_tel( aux: Steane, reject_x: Bit | None = None, reject_z: Bit | None = None, - flag_bit_x: Bit | None = None, - flag_bit_z: Bit | None = None, + flag_x: Bit | None = None, + flag_z: Bit | None = None, rus_limit: int | None = None, ) -> Block: """Run a teleportation-based error correction cycle.""" return Block( - self.qec_tel_x(aux, reject_x, flag_bit_x, rus_limit), - self.qec_tel_z(aux, reject_z, flag_bit_z, rus_limit), + self.qec_tel_x(aux, reject_x, flag_x, rus_limit), + self.qec_tel_z(aux, reject_z, flag_z, rus_limit), ) def qec_tel_x( self, aux: Steane, reject: Bit | None = None, - flag_bit: Bit | None = None, + flag: Bit | None = None, rus_limit: int | None = None, ) -> Block: """Run a teleportation-based error correction cycle for X errors.""" @@ -542,15 +542,15 @@ def qec_tel_x( self.syn_z.set(self.syn_meas), self.pf_x.set(0), ) - if flag_bit is not None: - block.extend(If(self.syn_meas != 0).Then(flag_bit.set(1))) + if flag is not None: + block.extend(If(self.syn_meas != 0).Then(flag.set(1))) return block def qec_tel_z( self, aux: Steane, reject: Bit | None = None, - flag_bit: Bit | None = None, + flag: Bit | None = None, rus_limit: int | None = None, ) -> Block: """Run a teleportation-based error correction cycle for Z errors.""" @@ -568,6 +568,6 @@ def qec_tel_z( self.syn_x.set(self.syn_meas), self.pf_z.set(0), ) - if flag_bit is not None: - block.extend(If(self.syn_meas != 0).Then(flag_bit.set(1))) + if flag is not None: + block.extend(If(self.syn_meas != 0).Then(flag.set(1))) return block From 45ebaf92ef95dae91f130c8058b3bdd19694827f Mon Sep 17 00:00:00 2001 From: "Michael A. Perlin" Date: Tue, 17 Dec 2024 10:16:42 -0500 Subject: [PATCH 21/27] minor cleanup --- .../src/pecos/qeclib/steane/steane_class.py | 24 +++++++++---------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py b/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py index c503b924..733ac2d3 100644 --- a/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py +++ b/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py @@ -372,19 +372,17 @@ def cz(self, target: Steane): def m(self, meas_basis: str, log: Bit | None = None): """Destructively measure the logical qubit in some Pauli basis.""" - block = Block( - MeasDecode( - q=self.d, - meas_basis=meas_basis, - meas=self.raw_meas, - log_raw=self.log_raw, - log=self.log, - syn_meas=self.syn_meas, - pf_x=self.pf_x, - pf_z=self.pf_z, - last_raw_syn_x=self.last_raw_syn_x, - last_raw_syn_z=self.last_raw_syn_z, - ), + block = MeasDecode( + q=self.d, + meas_basis=meas_basis, + meas=self.raw_meas, + log_raw=self.log_raw, + log=self.log, + syn_meas=self.syn_meas, + pf_x=self.pf_x, + pf_z=self.pf_z, + last_raw_syn_x=self.last_raw_syn_x, + last_raw_syn_z=self.last_raw_syn_z, ) if log is not None: block.extend(log.set(self.log)) From 70af9a57272251672cd4d9a4f09d83f86cf73491 Mon Sep 17 00:00:00 2001 From: "Michael A. Perlin" Date: Wed, 18 Dec 2024 11:12:35 -0500 Subject: [PATCH 22/27] minor renaming --- .../src/pecos/qeclib/steane/steane_class.py | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py b/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py index 733ac2d3..05123a94 100644 --- a/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py +++ b/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py @@ -431,28 +431,28 @@ def qec_steane( ) -> Block: """Run a Steane-type error-correction cycle of this code.""" return Block( - self.qec_steane_z( - aux, - reject=reject_z, - flag=flag_z, - rus_limit=rus_limit, - ), self.qec_steane_x( aux, reject=reject_x, flag=flag_x, rus_limit=rus_limit, ), + self.qec_steane_z( + aux, + reject=reject_z, + flag=flag_z, + rus_limit=rus_limit, + ), ) - def qec_steane_z( + def qec_steane_x( self, aux: Steane, reject: Bit | None = None, flag: Bit | None = None, rus_limit: int | None = None, ) -> Block: - """Run a Steane-type error-correction cycle for Z stabilizers (X errors).""" + """Run a Steane-type error-correction cycle to correct X errors.""" warn("Using experimental feature: qec_steane_z", stacklevel=2) flag = flag or self.scratch.elems[7] return Block( @@ -474,14 +474,14 @@ def qec_steane_z( ), ) - def qec_steane_x( + def qec_steane_z( self, aux: Steane, reject: Bit | None = None, flag: Bit | None = None, rus_limit: int | None = None, ) -> Block: - """Run a Steane-type error-correction cycle for X stabilizers (Z errors).""" + """Run a Steane-type error-correction cycle to correct Z errors.""" warn("Using experimental feature: qec_steane_x", stacklevel=2) flag = flag or self.scratch.elems[7] return Block( From cc910d7c82c1ee4dad73656e5bbb987e873a8408 Mon Sep 17 00:00:00 2001 From: "Michael A. Perlin" Date: Wed, 18 Dec 2024 11:15:00 -0500 Subject: [PATCH 23/27] standardize docstring --- python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py b/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py index 05123a94..e81631dc 100644 --- a/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py +++ b/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py @@ -452,7 +452,7 @@ def qec_steane_x( flag: Bit | None = None, rus_limit: int | None = None, ) -> Block: - """Run a Steane-type error-correction cycle to correct X errors.""" + """Run a Steane-type error-correction cycle for X errors.""" warn("Using experimental feature: qec_steane_z", stacklevel=2) flag = flag or self.scratch.elems[7] return Block( @@ -481,7 +481,7 @@ def qec_steane_z( flag: Bit | None = None, rus_limit: int | None = None, ) -> Block: - """Run a Steane-type error-correction cycle to correct Z errors.""" + """Run a Steane-type error-correction cycle for Z errors.""" warn("Using experimental feature: qec_steane_x", stacklevel=2) flag = flag or self.scratch.elems[7] return Block( From 9a59086ba8babf1b63dc649dbb59478e2f655aeb Mon Sep 17 00:00:00 2001 From: "Michael A. Perlin" Date: Fri, 20 Dec 2024 11:19:36 -0500 Subject: [PATCH 24/27] fix If statement --- python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py b/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py index e81631dc..f51b3a7a 100644 --- a/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py +++ b/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py @@ -532,7 +532,7 @@ def qec_tel_x( aux.px(reject=reject, rus_limit=rus_limit), aux.cx(self), self.mz(), - If(self.log).Then(aux.x()), + If(self.log == 1).Then(aux.x()), Permute(self.d, aux.d), # update syndromes and pauli frame self.last_raw_syn_x.set(0), @@ -558,7 +558,7 @@ def qec_tel_z( aux.pz(reject=reject, rus_limit=rus_limit), self.cx(aux), self.mx(), - If(self.log).Then(aux.z()), + If(self.log == 1).Then(aux.z()), Permute(self.d, aux.d), # update syndromes and pauli frame self.last_raw_syn_x.set(0), From 0eaffcc0fc0f736320a2822680edf844a104353d Mon Sep 17 00:00:00 2001 From: "Michael A. Perlin" Date: Sat, 21 Dec 2024 09:21:37 -0500 Subject: [PATCH 25/27] maybe fix Steane QEC and an incorrect type hint --- .../pecos/qeclib/steane/decoders/lookup.py | 4 +-- .../src/pecos/qeclib/steane/steane_class.py | 32 +++++++++++-------- 2 files changed, 20 insertions(+), 16 deletions(-) diff --git a/python/quantum-pecos/src/pecos/qeclib/steane/decoders/lookup.py b/python/quantum-pecos/src/pecos/qeclib/steane/decoders/lookup.py index 9d386dc6..5cb10e9e 100644 --- a/python/quantum-pecos/src/pecos/qeclib/steane/decoders/lookup.py +++ b/python/quantum-pecos/src/pecos/qeclib/steane/decoders/lookup.py @@ -27,7 +27,7 @@ def __init__( syndromes: CReg, raw_syn: CReg, pf: Bit, - flag: Bit, + flag: CReg, flags: CReg, scratch: CReg, ): @@ -96,7 +96,7 @@ def __init__( syndromes: CReg, raw_syn: CReg, pf: Bit, - flag: Bit, + flag: CReg, flags: CReg, scratch: CReg, pf_bit_copy: Bit | None = None, diff --git a/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py b/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py index f51b3a7a..9e5f3e95 100644 --- a/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py +++ b/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py @@ -454,25 +454,27 @@ def qec_steane_x( ) -> Block: """Run a Steane-type error-correction cycle for X errors.""" warn("Using experimental feature: qec_steane_z", stacklevel=2) - flag = flag or self.scratch.elems[7] - return Block( + block = Block( aux.px(reject=reject, rus_limit=rus_limit), self.cx(aux), aux.mz(), - If(aux.syn_meas != 0).Then(flag.set(1)), + self.syn_z.set(aux.syn_meas), self.last_raw_syn_z.set(0), self.pf_x.set(0), FlagLookupQASMActiveCorrectionZ( self.d, - aux.syn_meas, - self.syndromes, + self.syn_z, + self.syn_z, self.last_raw_syn_z, self.pf_x, - flag, - aux.syn_meas, + self.syn_z, + self.syn_z, self.scratch, ), ) + if flag is not None: + block.extend(If(self.syn_x != 0).Then(flag.set(1))) + return block def qec_steane_z( self, @@ -483,25 +485,27 @@ def qec_steane_z( ) -> Block: """Run a Steane-type error-correction cycle for Z errors.""" warn("Using experimental feature: qec_steane_x", stacklevel=2) - flag = flag or self.scratch.elems[7] - return Block( + block = Block( aux.pz(reject=reject, rus_limit=rus_limit), aux.cx(self), aux.mx(), - If(aux.syn_meas != 0).Then(flag.set(1)), + self.syn_x.set(aux.syn_meas), self.last_raw_syn_x.set(0), self.pf_z.set(0), FlagLookupQASMActiveCorrectionX( self.d, - aux.syn_meas, - self.syndromes, + self.syn_x, + self.syn_x, self.last_raw_syn_x, self.pf_z, - flag, - aux.syn_meas, + self.syn_x, + self.syn_x, self.scratch, ), ) + if flag is not None: + block.extend(If(self.syn_x != 0).Then(flag.set(1))) + return block def qec_tel( self, From cc99d1224ef3fb25e8a14392ed4eaff8180f33db Mon Sep 17 00:00:00 2001 From: "Michael A. Perlin" Date: Sat, 21 Dec 2024 09:25:46 -0500 Subject: [PATCH 26/27] fix typo --- python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py b/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py index 9e5f3e95..40444ad7 100644 --- a/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py +++ b/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py @@ -473,7 +473,7 @@ def qec_steane_x( ), ) if flag is not None: - block.extend(If(self.syn_x != 0).Then(flag.set(1))) + block.extend(If(self.syn_z != 0).Then(flag.set(1))) return block def qec_steane_z( From 87c739be457b209c0d1fc34d7343fa4e7bc73df6 Mon Sep 17 00:00:00 2001 From: "Michael A. Perlin" Date: Wed, 25 Dec 2024 14:20:15 -0500 Subject: [PATCH 27/27] fix warning typo --- python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py b/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py index 40444ad7..48f49e00 100644 --- a/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py +++ b/python/quantum-pecos/src/pecos/qeclib/steane/steane_class.py @@ -453,7 +453,7 @@ def qec_steane_x( rus_limit: int | None = None, ) -> Block: """Run a Steane-type error-correction cycle for X errors.""" - warn("Using experimental feature: qec_steane_z", stacklevel=2) + warn("Using experimental feature: qec_steane_x", stacklevel=2) block = Block( aux.px(reject=reject, rus_limit=rus_limit), self.cx(aux), @@ -484,7 +484,7 @@ def qec_steane_z( rus_limit: int | None = None, ) -> Block: """Run a Steane-type error-correction cycle for Z errors.""" - warn("Using experimental feature: qec_steane_x", stacklevel=2) + warn("Using experimental feature: qec_steane_z", stacklevel=2) block = Block( aux.pz(reject=reject, rus_limit=rus_limit), aux.cx(self),