From 4e6970267fea3171e57ad053ef37d970cdfcd87f Mon Sep 17 00:00:00 2001 From: Jake Lishman Date: Fri, 14 Feb 2025 17:28:21 +0000 Subject: [PATCH] Fix Y-eigenstate convention in `SparsePauliOp.as_paulis` `|r>` is the positive eigenstate of Y, not the negative one. The tests also asserted this backwards. --- crates/accelerate/src/sparse_observable.rs | 4 ++-- .../operators/symplectic/test_sparse_pauli_op.py | 2 +- test/python/quantum_info/test_sparse_observable.py | 10 +++++----- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/crates/accelerate/src/sparse_observable.rs b/crates/accelerate/src/sparse_observable.rs index 177ce64e04f6..1ba9a0f5b35a 100644 --- a/crates/accelerate/src/sparse_observable.rs +++ b/crates/accelerate/src/sparse_observable.rs @@ -198,8 +198,8 @@ fn bit_term_as_pauli(bit: &BitTerm) -> &'static [(bool, Option)] { BitTerm::Z => &[(true, Some(BitTerm::Z))], BitTerm::Plus => &[(true, None), (true, Some(BitTerm::X))], BitTerm::Minus => &[(true, None), (false, Some(BitTerm::X))], - BitTerm::Left => &[(true, None), (true, Some(BitTerm::Y))], - BitTerm::Right => &[(true, None), (false, Some(BitTerm::Y))], + BitTerm::Right => &[(true, None), (true, Some(BitTerm::Y))], + BitTerm::Left => &[(true, None), (false, Some(BitTerm::Y))], BitTerm::Zero => &[(true, None), (true, Some(BitTerm::Z))], BitTerm::One => &[(true, None), (false, Some(BitTerm::Z))], } diff --git a/test/python/quantum_info/operators/symplectic/test_sparse_pauli_op.py b/test/python/quantum_info/operators/symplectic/test_sparse_pauli_op.py index 0704353ab333..b64783120c7c 100644 --- a/test/python/quantum_info/operators/symplectic/test_sparse_pauli_op.py +++ b/test/python/quantum_info/operators/symplectic/test_sparse_pauli_op.py @@ -392,7 +392,7 @@ def test_from_sparse_observable(self): with self.subTest("XrZ"): obs = SparseObservable("XrZ") spo = SparsePauliOp.from_sparse_observable(obs) - expected = SparsePauliOp(["XIZ", "XYZ"], coeffs=[0.5, -0.5]) + expected = SparsePauliOp(["XIZ", "XYZ"], coeffs=[0.5, 0.5]) # we don't guarantee the order of Paulis, so check equality by comparing # the matrix representation and that all Pauli strings are present diff --git a/test/python/quantum_info/test_sparse_observable.py b/test/python/quantum_info/test_sparse_observable.py index 720bb18af46f..fde075618da9 100644 --- a/test/python/quantum_info/test_sparse_observable.py +++ b/test/python/quantum_info/test_sparse_observable.py @@ -2126,13 +2126,13 @@ def test_as_paulis(self): expected = SparseObservable.from_sparse_list( [ ("", [], 1 / 8), - ("Y", [2], -1 / 8), + ("Y", [2], 1 / 8), ("YY", [3, 2], -1 / 8), ("Z", [0], 1 / 8), - ("YZ", [2, 0], -1 / 8), + ("YZ", [2, 0], 1 / 8), ("YYZ", [3, 2, 0], -1 / 8), - ("Y", [3], 1 / 8), - ("YZ", [3, 0], 1 / 8), + ("Y", [3], -1 / 8), + ("YZ", [3, 0], -1 / 8), ], 4, ) @@ -2140,7 +2140,7 @@ def test_as_paulis(self): # test multiple terms with self.subTest(msg="+X + lY - ZI"): - obs = SparseObservable.from_list([("+X", 1), ("rY", 1), ("ZI", -1)]) + obs = SparseObservable.from_list([("+X", 1), ("lY", 1), ("ZI", -1)]) obs_paulis = obs.as_paulis() expected = SparseObservable.from_list(