diff --git a/src/openfermion/linalg/sparse_tools.py b/src/openfermion/linalg/sparse_tools.py index 28e5731a2..844aacf1c 100644 --- a/src/openfermion/linalg/sparse_tools.py +++ b/src/openfermion/linalg/sparse_tools.py @@ -12,6 +12,7 @@ """This module provides functions to interface with scipy.sparse.""" import itertools from functools import reduce +import warnings import numpy.linalg import numpy @@ -1268,6 +1269,13 @@ def get_sparse_operator(operator, n_qubits=None, trunc=None, hbar=1.0): elif isinstance(operator, FermionOperator): return jordan_wigner_sparse(operator, n_qubits) elif isinstance(operator, QubitOperator): + if hasattr(operator, "simplify"): + operator.simplify() + else: + warnings.warn( + "QubitOperator.simplify() not found. " + "Ensure your operator is simplified to avoid errors." + ) return qubit_operator_sparse(operator, n_qubits) elif isinstance(operator, (BosonOperator, QuadOperator)): return boson_operator_sparse(operator, trunc, hbar) diff --git a/src/openfermion/linalg/sparse_tools_test.py b/src/openfermion/linalg/sparse_tools_test.py index 30a555e20..e632cc8d1 100644 --- a/src/openfermion/linalg/sparse_tools_test.py +++ b/src/openfermion/linalg/sparse_tools_test.py @@ -1829,6 +1829,11 @@ def test_sparse_matrix_linearity(self): self.assertEqual(list(sparse2.data), [2] * 8) self.assertEqual(list(sparse2.indices), [0, 3, 5, 6, 9, 10, 12, 15]) + def test_get_sparse_operator_simplifies_qubit_operator(self): + op = QubitOperator('X0') + QubitOperator('X0') + sparse = get_sparse_operator(op) + self.assertIsNotNone(sparse) + class GetSparseOperatorFermionTest(unittest.TestCase): def test_sparse_matrix_zero_n_qubit(self):