Skip to content

Commit

Permalink
Support passing empty lists to Pauli delete method (#10849)
Browse files Browse the repository at this point in the history
* handle empty lists in delete methods, added release notes

* fixed ordering of empty list check in pauli delete method

* add proper cross-references to classes

Co-authored-by: Jake Lishman <jake@binhbar.com>

---------

Co-authored-by: Jake Lishman <jake@binhbar.com>
  • Loading branch information
AlexanderGroeger and jakelishman authored Sep 22, 2023
1 parent 846d329 commit 6a38279
Show file tree
Hide file tree
Showing 7 changed files with 29 additions and 2 deletions.
2 changes: 2 additions & 0 deletions qiskit/quantum_info/operators/symplectic/pauli.py
Original file line number Diff line number Diff line change
Expand Up @@ -363,6 +363,8 @@ def delete(self, qubits: int | list) -> Pauli:
"""
if isinstance(qubits, (int, np.integer)):
qubits = [qubits]
if len(qubits) == 0:
return Pauli((self._z, self._x, self.phase))
if max(qubits) > self.num_qubits - 1:
raise QiskitError(
"Qubit index is larger than the number of qubits "
Expand Down
3 changes: 2 additions & 1 deletion qiskit/quantum_info/operators/symplectic/pauli_list.py
Original file line number Diff line number Diff line change
Expand Up @@ -376,7 +376,8 @@ def delete(self, ind: int | list, qubit: bool = False) -> PauliList:
"""
if isinstance(ind, int):
ind = [ind]

if len(ind) == 0:
return PauliList.from_symplectic(self._z, self._x, self.phase)
# Row deletion
if not qubit:
if max(ind) >= len(self):
Expand Down
3 changes: 2 additions & 1 deletion qiskit/quantum_info/operators/symplectic/pauli_table.py
Original file line number Diff line number Diff line change
Expand Up @@ -281,7 +281,8 @@ def delete(self, ind: int | list, qubit: bool = False) -> PauliTable:
"""
if isinstance(ind, (int, np.integer)):
ind = [ind]

if len(ind) == 0:
return PauliTable(self._array)
# Row deletion
if not qubit:
if max(ind) >= self.size:
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
fixes:
- |
Passing an empty list to the methods :meth:`.Pauli.delete`, :meth:`.PauliList.delete`,
and :meth:`.PauliTable.delete` now returns a copy of the original object instead of throwing an error.
2 changes: 2 additions & 0 deletions test/python/quantum_info/operators/symplectic/test_pauli.py
Original file line number Diff line number Diff line change
Expand Up @@ -224,6 +224,8 @@ def test_insert(self):
def test_delete(self):
"""Test delete method"""
pauli = Pauli("IXYZ")
pauli = pauli.delete([])
self.assertEqual(str(pauli), "IXYZ")
pauli = pauli.delete([0, 2])
self.assertEqual(str(pauli), "IY")

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1495,6 +1495,10 @@ def test_unique(self):

def test_delete(self):
"""Test delete method."""
with self.subTest(msg="no rows"):
pauli = PauliList(["XX", "ZZ"])
self.assertEqual(pauli.delete([]), pauli)

with self.subTest(msg="single row"):
for j in range(1, 6):
pauli = PauliList([j * "X", j * "Y"])
Expand All @@ -1508,6 +1512,10 @@ def test_delete(self):
self.assertEqual(pauli.delete([1, 2]), PauliList(j * "X"))
self.assertEqual(pauli.delete([0, 1]), PauliList(j * "Z"))

with self.subTest(msg="no qubits"):
pauli = PauliList(["XX", "ZZ"])
self.assertEqual(pauli.delete([], qubit=True), pauli)

with self.subTest(msg="single qubit"):
pauli = PauliList(["IIX", "iIYI", "ZII"])
value = pauli.delete(0, qubit=True)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1136,6 +1136,10 @@ def test_unique(self):

def test_delete(self):
"""Test delete method."""
with self.subTest(msg="no rows"):
pauli = PauliTable.from_labels(["XX", "YY"])
self.assertEqual(pauli.delete([]), pauli)

with self.subTest(msg="single row"):
for j in range(1, 6):
with self.assertWarns(DeprecationWarning):
Expand All @@ -1151,6 +1155,10 @@ def test_delete(self):
self.assertEqual(pauli.delete([1, 2]), PauliTable(j * "X"))
self.assertEqual(pauli.delete([0, 1]), PauliTable(j * "Z"))

with self.subTest(msg="no rows"):
pauli = PauliTable.from_labels(["XX", "YY"])
self.assertEqual(pauli.delete([], qubit=True), pauli)

with self.subTest(msg="single qubit"):
with self.assertWarns(DeprecationWarning):
pauli = PauliTable.from_labels(["IIX", "IYI", "ZII"])
Expand Down

0 comments on commit 6a38279

Please sign in to comment.