From fcdc130d71ba85a741f91aacc1787e241502438e Mon Sep 17 00:00:00 2001 From: atharva-satpute <55058959+atharva-satpute@users.noreply.github.com> Date: Wed, 16 Aug 2023 12:25:23 +0530 Subject: [PATCH] Reject bad values in `SparsePauliOp.paulis` setter (#10437) * Fix Sparse pauli setter to update dimension info * Fix Sparse pauli setter to verify dimension info Value error will be raised if: 1. Number of qubits are not equal 2. Number of elements in PauliList are not equal * Add tests * Add release note --------- Co-authored-by: Jake Lishman Co-authored-by: Ikko Hamamura (cherry picked from commit fe87015a901b8b84dba03b201409a2dc545825f2) --- .../quantum_info/operators/symplectic/sparse_pauli_op.py | 8 ++++++++ ...pauli-op-constraint-pauli-setter-52f6f89627d1937c.yaml | 6 ++++++ .../operators/symplectic/test_sparse_pauli_op.py | 8 ++++++++ 3 files changed, 22 insertions(+) create mode 100644 releasenotes/notes/sparse-pauli-op-constraint-pauli-setter-52f6f89627d1937c.yaml diff --git a/qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py b/qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py index 95162ebe247d..cee5300049e4 100644 --- a/qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +++ b/qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py @@ -235,6 +235,14 @@ def paulis(self): def paulis(self, value): if not isinstance(value, PauliList): value = PauliList(value) + if value.num_qubits != self.num_qubits: + raise ValueError( + f"incorrect number of qubits: expected {self.num_qubits}, got {value.num_qubits}" + ) + if len(value) != len(self.paulis): + raise ValueError( + f"incorrect number of operators: expected {len(self.paulis)}, got {len(value)}" + ) self._pauli_list = value @property diff --git a/releasenotes/notes/sparse-pauli-op-constraint-pauli-setter-52f6f89627d1937c.yaml b/releasenotes/notes/sparse-pauli-op-constraint-pauli-setter-52f6f89627d1937c.yaml new file mode 100644 index 000000000000..86d4b552ffe4 --- /dev/null +++ b/releasenotes/notes/sparse-pauli-op-constraint-pauli-setter-52f6f89627d1937c.yaml @@ -0,0 +1,6 @@ +--- +fixes: + - | + The setter for :attr:`.SparsePauliOp.paulis` will now correctly reject attempts to set the + attribute with incorrectly shaped data, rather than silently allowing an invalid object to be + created. See `#10384 `__. 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 be066453a78d..767153e23883 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 @@ -1015,6 +1015,14 @@ def test_assign_parameters(self): with self.subTest(msg="fully bound"): self.assertTrue(np.allclose(bound.coeffs.astype(complex), [1, 3, 6])) + def test_paulis_setter_rejects_bad_inputs(self): + """Test that the setter for `paulis` rejects different-sized inputs.""" + op = SparsePauliOp(["XY", "ZX"], coeffs=[1, 1j]) + with self.assertRaisesRegex(ValueError, "incorrect number of qubits"): + op.paulis = PauliList([Pauli("X"), Pauli("Y")]) + with self.assertRaisesRegex(ValueError, "incorrect number of operators"): + op.paulis = PauliList([Pauli("XY"), Pauli("ZX"), Pauli("YZ")]) + if __name__ == "__main__": unittest.main()