@@ -783,7 +783,7 @@ def _commutes_(
783
783
) -> Union [bool , NotImplementedType , None ]:
784
784
if not isinstance (other , PauliString ):
785
785
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
787
787
788
788
def __neg__ (self ) -> 'PauliString' :
789
789
return PauliString (qubit_pauli_map = self ._qubit_pauli_map , coefficient = - self ._coefficient )
@@ -1080,6 +1080,18 @@ def _resolve_parameters_(
1080
1080
return PauliString (qubit_pauli_map = self ._qubit_pauli_map , coefficient = coefficient )
1081
1081
1082
1082
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
+
1083
1095
def _validate_qubit_mapping (
1084
1096
qubit_map : Mapping [TKey , int ], pauli_qubits : Tuple [TKey , ...], num_state_qubits : int
1085
1097
) -> None :
@@ -1395,8 +1407,8 @@ def inplace_after(self, ops: 'cirq.OP_TREE') -> 'cirq.MutablePauliString':
1395
1407
p1 = _INT_TO_PAULI_OR_IDENTITY [ps [1 ]]
1396
1408
1397
1409
# 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 )
1400
1412
kick0 = gate .pauli1 if kickback_0_to_1 else identity .I
1401
1413
kick1 = gate .pauli0 if kickback_1_to_0 else identity .I
1402
1414
self .__imul__ ({q0 : p0 , q1 : kick0 })
@@ -1673,11 +1685,11 @@ def merge_and_kickback(
1673
1685
return int (inv ) * 2 - 1
1674
1686
1675
1687
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 ):
1677
1689
quarter_kickback += merge_and_kickback (
1678
1690
qubit1 , gate .pauli1 , pauli_map .get (qubit1 ), gate .invert1
1679
1691
)
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 ):
1681
1693
quarter_kickback += merge_and_kickback (
1682
1694
qubit0 , pauli_map .get (qubit0 ), gate .pauli0 , gate .invert0
1683
1695
)
0 commit comments