Skip to content

Commit 49104f4

Browse files
committed
add _paulis_commute
1 parent 05a1efe commit 49104f4

File tree

2 files changed

+25
-5
lines changed

2 files changed

+25
-5
lines changed

cirq-core/cirq/ops/pauli_string.py

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -783,7 +783,7 @@ def _commutes_(
783783
) -> Union[bool, NotImplementedType, None]:
784784
if not isinstance(other, PauliString):
785785
return NotImplemented
786-
return sum(not protocols.commutes(p0, p1) for p0, p1 in self.zip_paulis(other)) % 2 == 0
786+
return sum(not _paulis_commute(p0, p1) for p0, p1 in self.zip_paulis(other)) % 2 == 0
787787

788788
def __neg__(self) -> 'PauliString':
789789
return PauliString(qubit_pauli_map=self._qubit_pauli_map, coefficient=-self._coefficient)
@@ -1080,6 +1080,18 @@ def _resolve_parameters_(
10801080
return PauliString(qubit_pauli_map=self._qubit_pauli_map, coefficient=coefficient)
10811081

10821082

1083+
def _paulis_commute(
1084+
p0: Union['cirq.Pauli', 'cirq.IdentityGate'], p1: Union['cirq.Pauli', 'cirq.IdentityGate']
1085+
) -> bool:
1086+
"""Determines whether two single-qubit Pauli operators commute.
1087+
1088+
Args:
1089+
p0: A single-qubit Pauli operator.
1090+
p1: A single-qubit Pauli operator.
1091+
"""
1092+
return p0 == identity.I or p1 == identity.I or p0 == p1
1093+
1094+
10831095
def _validate_qubit_mapping(
10841096
qubit_map: Mapping[TKey, int], pauli_qubits: Tuple[TKey, ...], num_state_qubits: int
10851097
) -> None:
@@ -1395,8 +1407,8 @@ def inplace_after(self, ops: 'cirq.OP_TREE') -> 'cirq.MutablePauliString':
13951407
p1 = _INT_TO_PAULI_OR_IDENTITY[ps[1]]
13961408

13971409
# Kick across Paulis that anti-commute with the controls.
1398-
kickback_0_to_1 = not (identity.I in [p0, gate.pauli0] or p0 == gate.pauli0)
1399-
kickback_1_to_0 = not (identity.I in [p1, gate.pauli1] or p1 == gate.pauli1)
1410+
kickback_0_to_1 = not _paulis_commute(p0, gate.pauli0)
1411+
kickback_1_to_0 = not _paulis_commute(p1, gate.pauli1)
14001412
kick0 = gate.pauli1 if kickback_0_to_1 else identity.I
14011413
kick1 = gate.pauli0 if kickback_1_to_0 else identity.I
14021414
self.__imul__({q0: p0, q1: kick0})
@@ -1673,11 +1685,11 @@ def merge_and_kickback(
16731685
return int(inv) * 2 - 1
16741686

16751687
quarter_kickback = 0
1676-
if qubit0 in pauli_map and not protocols.commutes(pauli_map[qubit0], gate.pauli0):
1688+
if qubit0 in pauli_map and not _paulis_commute(pauli_map[qubit0], gate.pauli0):
16771689
quarter_kickback += merge_and_kickback(
16781690
qubit1, gate.pauli1, pauli_map.get(qubit1), gate.invert1
16791691
)
1680-
if qubit1 in pauli_map and not protocols.commutes(pauli_map[qubit1], gate.pauli1):
1692+
if qubit1 in pauli_map and not _paulis_commute(pauli_map[qubit1], gate.pauli1):
16811693
quarter_kickback += merge_and_kickback(
16821694
qubit0, pauli_map.get(qubit0), gate.pauli0, gate.invert0
16831695
)

cirq-core/cirq/ops/pauli_string_test.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2023,3 +2023,11 @@ def test_resolve(resolve_fn):
20232023
pst = cirq.PauliString({q: 'x'}, coefficient=t)
20242024
ps1 = cirq.PauliString({q: 'x'}, coefficient=1j)
20252025
assert resolve_fn(pst, {'t': 1j}) == ps1
2026+
2027+
2028+
def test_paulis_commute():
2029+
assert all(
2030+
cirq.ops.pauli_string._paulis_commute(p0, p1) == cirq.commutes(p0, p1)
2031+
for p0 in [cirq.I, cirq.X, cirq.Y, cirq.Z]
2032+
for p1 in [cirq.I, cirq.X, cirq.Y, cirq.Z]
2033+
)

0 commit comments

Comments
 (0)