Open burlemarxiste opened 4 months ago
Adding some pointers:
Each term of the PauliSum
is turned back into a PauliString
in _pauli_string_from_unit
. The element of the Pauli string are stored in a frozenset which is not guaranteed to return items over several runs (just use the system hash, not stable with some python implementations). My suggestion is to always return the qubits in sorted order.
Suggested fix: https://github.com/quantumlib/Cirq/compare/main...burlemarxiste:Cirq:qubit_order_in_sum
cirq-sync: it makes sense to maintain the original qubit order. to do this we need to keep track of the original qubit order and use it when computing the unitary or decomposition
Description of the issue
When retrieving the terms of a
PauliSum
, the resultingPauliString
may have their qubits reordered compared to what was their original order when added to the sum.What is happening behind the scenes is that the Pauli string
cirq.DensePauliString('XY').on(q0, q1)
is added to the PauliSum, but may be turned into acirq.DensePauliString('YX').on(q1, q0)
when retrieving the first term of the sum. They represent the same operation indeed, but do not have the same representation and unitary.As a result, everything based on
PauliSum
produces consistent results at the circuit level, butx
andPauliSum() + x
are not guaranteed to be equivalent at the representation and unitary level. In addition,PauliSum() + x
might have an inconsistent representation over several calls.How to reproduce the issue
Output
Output in Colab
Cirq version
Observed on
1.5.0.dev
with python3.11.9 (main, Apr 6 2024, 17:59:24) [GCC 9.4.0]
in a dev environement. Non-deterministic behavior.Observed on
1.5.0.dev20240531223815
with python3.10.12 (main, Nov 20 2023, 15:14:05) [GCC 11.4.0]
running in Colab. Deterministic behavior, but qubit order consistently swapped in the string repr and unitary.