From f9ba85afbf45b5648d8af0302f05e296877ad418 Mon Sep 17 00:00:00 2001 From: mhucka Date: Mon, 6 Apr 2026 04:30:32 +0000 Subject: [PATCH 1/7] Replace another assert with an exception Replace another `assert` in a non-test context. --- .../transforms/opconversions/reverse_jordan_wigner.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/openfermion/transforms/opconversions/reverse_jordan_wigner.py b/src/openfermion/transforms/opconversions/reverse_jordan_wigner.py index e340c5edf..04d081c18 100644 --- a/src/openfermion/transforms/opconversions/reverse_jordan_wigner.py +++ b/src/openfermion/transforms/opconversions/reverse_jordan_wigner.py @@ -81,7 +81,8 @@ def reverse_jordan_wigner(qubit_operator, n_qubits=None): working_term.terms[list(working_term.terms)[0]] = 1.0 # Get next non-identity operator acting below 'working_qubit'. - assert len(working_term.terms) == 1 + if len(working_term.terms) != 1: + raise ValueError('Qubit operator term needs to be a single term') working_qubit = pauli_operator[0] - 1 for working_operator in reversed(list(working_term.terms)[0]): if working_operator[0] <= working_qubit: From 04cbcb8196f729fb1c6ccd2958be424010299409 Mon Sep 17 00:00:00 2001 From: Michael Hucka Date: Sun, 5 Apr 2026 21:39:43 -0700 Subject: [PATCH 2/7] Update src/openfermion/transforms/opconversions/reverse_jordan_wigner.py Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- .../transforms/opconversions/reverse_jordan_wigner.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/openfermion/transforms/opconversions/reverse_jordan_wigner.py b/src/openfermion/transforms/opconversions/reverse_jordan_wigner.py index 04d081c18..f99d75419 100644 --- a/src/openfermion/transforms/opconversions/reverse_jordan_wigner.py +++ b/src/openfermion/transforms/opconversions/reverse_jordan_wigner.py @@ -82,7 +82,7 @@ def reverse_jordan_wigner(qubit_operator, n_qubits=None): # Get next non-identity operator acting below 'working_qubit'. if len(working_term.terms) != 1: - raise ValueError('Qubit operator term needs to be a single term') + raise ValueError('QubitOperator must contain exactly one term') working_qubit = pauli_operator[0] - 1 for working_operator in reversed(list(working_term.terms)[0]): if working_operator[0] <= working_qubit: From 3853e3530af059e175e2c4b52788740b11404b1d Mon Sep 17 00:00:00 2001 From: mhucka Date: Mon, 6 Apr 2026 05:38:29 +0000 Subject: [PATCH 3/7] Add test to cover change from assert to exception This tests the corresponding change in reverse_jordan_wigner.py --- .../opconversions/reverse_jordan_wigner_test.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/openfermion/transforms/opconversions/reverse_jordan_wigner_test.py b/src/openfermion/transforms/opconversions/reverse_jordan_wigner_test.py index 88a419ed8..32885a6a6 100644 --- a/src/openfermion/transforms/opconversions/reverse_jordan_wigner_test.py +++ b/src/openfermion/transforms/opconversions/reverse_jordan_wigner_test.py @@ -12,6 +12,7 @@ """Tests reverse_jordan_wigner.py.""" import unittest +from unittest.mock import patch from openfermion.ops.operators import FermionOperator, QubitOperator from openfermion.transforms.opconversions import jordan_wigner, normal_ordered @@ -160,6 +161,14 @@ def test_bad_type(self): with self.assertRaises(TypeError): reverse_jordan_wigner(3) + def test_reverse_jw_multi_term_error(self): + with patch('openfermion.transforms.opconversions.reverse_jordan_wigner.' + 'QubitOperator.__mul__') as mock_mul: + mock_mul.return_value = QubitOperator('X0') + QubitOperator('Y0') + with self.assertRaisesRegex( + ValueError, 'Qubit operator term needs to be a single term'): + reverse_jordan_wigner(QubitOperator('X1')) + def test_jw_convention(self): """Test that the Jordan-Wigner convention places the Z-string on lower indices.""" From 3b4d79937c50bf42fb8419d221eca3ab4b1e6c4a Mon Sep 17 00:00:00 2001 From: mhucka Date: Mon, 6 Apr 2026 05:54:17 +0000 Subject: [PATCH 4/7] Format --- .../opconversions/reverse_jordan_wigner_test.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/openfermion/transforms/opconversions/reverse_jordan_wigner_test.py b/src/openfermion/transforms/opconversions/reverse_jordan_wigner_test.py index 32885a6a6..8bf05096e 100644 --- a/src/openfermion/transforms/opconversions/reverse_jordan_wigner_test.py +++ b/src/openfermion/transforms/opconversions/reverse_jordan_wigner_test.py @@ -162,11 +162,13 @@ def test_bad_type(self): reverse_jordan_wigner(3) def test_reverse_jw_multi_term_error(self): - with patch('openfermion.transforms.opconversions.reverse_jordan_wigner.' - 'QubitOperator.__mul__') as mock_mul: + with patch( + 'openfermion.transforms.opconversions.reverse_jordan_wigner.' 'QubitOperator.__mul__' + ) as mock_mul: mock_mul.return_value = QubitOperator('X0') + QubitOperator('Y0') with self.assertRaisesRegex( - ValueError, 'Qubit operator term needs to be a single term'): + ValueError, 'Qubit operator term needs to be a single term' + ): reverse_jordan_wigner(QubitOperator('X1')) def test_jw_convention(self): From af8bc8a944e2e4b30f268792df4221ce22c7f93f Mon Sep 17 00:00:00 2001 From: mhucka Date: Mon, 6 Apr 2026 05:57:10 +0000 Subject: [PATCH 5/7] Fix error message comparison --- .../transforms/opconversions/reverse_jordan_wigner_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/openfermion/transforms/opconversions/reverse_jordan_wigner_test.py b/src/openfermion/transforms/opconversions/reverse_jordan_wigner_test.py index 8bf05096e..dec401e5f 100644 --- a/src/openfermion/transforms/opconversions/reverse_jordan_wigner_test.py +++ b/src/openfermion/transforms/opconversions/reverse_jordan_wigner_test.py @@ -167,7 +167,7 @@ def test_reverse_jw_multi_term_error(self): ) as mock_mul: mock_mul.return_value = QubitOperator('X0') + QubitOperator('Y0') with self.assertRaisesRegex( - ValueError, 'Qubit operator term needs to be a single term' + ValueError, 'QubitOperator must contain exactly one term' ): reverse_jordan_wigner(QubitOperator('X1')) From b8e44d3273328b683f7209bb227451597f6af2e0 Mon Sep 17 00:00:00 2001 From: mhucka Date: Mon, 6 Apr 2026 06:06:27 +0000 Subject: [PATCH 6/7] Format --- .../transforms/opconversions/reverse_jordan_wigner_test.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/openfermion/transforms/opconversions/reverse_jordan_wigner_test.py b/src/openfermion/transforms/opconversions/reverse_jordan_wigner_test.py index dec401e5f..0533c1951 100644 --- a/src/openfermion/transforms/opconversions/reverse_jordan_wigner_test.py +++ b/src/openfermion/transforms/opconversions/reverse_jordan_wigner_test.py @@ -166,9 +166,7 @@ def test_reverse_jw_multi_term_error(self): 'openfermion.transforms.opconversions.reverse_jordan_wigner.' 'QubitOperator.__mul__' ) as mock_mul: mock_mul.return_value = QubitOperator('X0') + QubitOperator('Y0') - with self.assertRaisesRegex( - ValueError, 'QubitOperator must contain exactly one term' - ): + with self.assertRaisesRegex(ValueError, 'QubitOperator must contain exactly one term'): reverse_jordan_wigner(QubitOperator('X1')) def test_jw_convention(self): From 6e098d2fcb8c45081175585dd8febde04ccfa952 Mon Sep 17 00:00:00 2001 From: mhucka Date: Wed, 8 Apr 2026 01:59:00 +0000 Subject: [PATCH 7/7] Include more info in the exception message Include info about the number of terms actually found. --- .../transforms/opconversions/reverse_jordan_wigner.py | 5 ++++- .../transforms/opconversions/reverse_jordan_wigner_test.py | 4 +++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/openfermion/transforms/opconversions/reverse_jordan_wigner.py b/src/openfermion/transforms/opconversions/reverse_jordan_wigner.py index f99d75419..99159e6f0 100644 --- a/src/openfermion/transforms/opconversions/reverse_jordan_wigner.py +++ b/src/openfermion/transforms/opconversions/reverse_jordan_wigner.py @@ -82,7 +82,10 @@ def reverse_jordan_wigner(qubit_operator, n_qubits=None): # Get next non-identity operator acting below 'working_qubit'. if len(working_term.terms) != 1: - raise ValueError('QubitOperator must contain exactly one term') + raise ValueError( + 'QubitOperator must contain exactly one term. ' + f'Found {len(working_term.terms)} terms: {working_term!r}' + ) working_qubit = pauli_operator[0] - 1 for working_operator in reversed(list(working_term.terms)[0]): if working_operator[0] <= working_qubit: diff --git a/src/openfermion/transforms/opconversions/reverse_jordan_wigner_test.py b/src/openfermion/transforms/opconversions/reverse_jordan_wigner_test.py index 0533c1951..2f98b65b2 100644 --- a/src/openfermion/transforms/opconversions/reverse_jordan_wigner_test.py +++ b/src/openfermion/transforms/opconversions/reverse_jordan_wigner_test.py @@ -166,7 +166,9 @@ def test_reverse_jw_multi_term_error(self): 'openfermion.transforms.opconversions.reverse_jordan_wigner.' 'QubitOperator.__mul__' ) as mock_mul: mock_mul.return_value = QubitOperator('X0') + QubitOperator('Y0') - with self.assertRaisesRegex(ValueError, 'QubitOperator must contain exactly one term'): + with self.assertRaisesRegex( + ValueError, 'QubitOperator must contain exactly one term. Found 2 terms' + ): reverse_jordan_wigner(QubitOperator('X1')) def test_jw_convention(self):