From 901666852c1f933202c2185af0927ec34994ad82 Mon Sep 17 00:00:00 2001 From: marko1olo Date: Sat, 6 Jun 2026 11:13:46 +0400 Subject: [PATCH 1/2] Add optimal Givens input mutation regression Cover repeated optimal_givens_decomposition calls with the same unitary matrix so the implementation must leave caller-owned arrays unchanged. --- .../optimal_givens_decomposition_test.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/openfermion/circuits/primitives/optimal_givens_decomposition_test.py b/src/openfermion/circuits/primitives/optimal_givens_decomposition_test.py index 414e30acd..320012784 100644 --- a/src/openfermion/circuits/primitives/optimal_givens_decomposition_test.py +++ b/src/openfermion/circuits/primitives/optimal_givens_decomposition_test.py @@ -198,6 +198,23 @@ def test_circuit_generation_and_accuracy(): assert numpy.isclose(abs(numpy.trace(true_unitary.conj().T.dot(test_unitary))), 2**dim) +def test_circuit_generation_does_not_mutate_input_unitary(): + dim = 4 + qubits = cirq.LineQubit.range(dim) + rng = numpy.random.default_rng(1618033) + u_generator = rng.random((dim, dim)) + 1j * rng.random((dim, dim)) + u_generator = u_generator - numpy.conj(u_generator).T + + unitary = scipy.linalg.expm(u_generator) + expected_unitary = unitary.copy() + + first_circuit = cirq.Circuit(optimal_givens_decomposition(qubits, unitary)) + second_circuit = cirq.Circuit(optimal_givens_decomposition(qubits, unitary)) + + assert numpy.allclose(unitary, expected_unitary) + assert first_circuit == second_circuit + + def test_circuit_generation_state(): """ Determine if we rotate the Hartree-Fock state correctly From 69423118ea4fca0cde5810517a76d56cdcaca4a4 Mon Sep 17 00:00:00 2001 From: marko1olo Date: Sat, 6 Jun 2026 11:56:40 +0400 Subject: [PATCH 2/2] Avoid mutating optimal Givens inputs Use a private workspace copy for the in-place Givens rotations and phase rewrites so repeated decomposition calls with the same unitary remain deterministic. --- .../circuits/primitives/optimal_givens_decomposition.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/openfermion/circuits/primitives/optimal_givens_decomposition.py b/src/openfermion/circuits/primitives/optimal_givens_decomposition.py index 7e200f27c..fd7efe078 100644 --- a/src/openfermion/circuits/primitives/optimal_givens_decomposition.py +++ b/src/openfermion/circuits/primitives/optimal_givens_decomposition.py @@ -52,6 +52,7 @@ def optimal_givens_decomposition( should be ordered in linear physical order. unitary: """ + unitary = unitary.copy() N = unitary.shape[0] right_rotations = [] left_rotations = []