From 2e6058ddac1d4dd32a9f8e87fd4bb10d18df83a8 Mon Sep 17 00:00:00 2001 From: mhucka <1450019+mhucka@users.noreply.github.com> Date: Fri, 27 Mar 2026 04:57:14 +0000 Subject: [PATCH 1/2] =?UTF-8?q?=F0=9F=A7=AA=20Improve=20reliability=20and?= =?UTF-8?q?=20tests=20for=20map=5Fparticle=5Fhole=5Fdm=5Fto=5Fone=5Fpdm?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This change addresses a potential ZeroDivisionError in `map_particle_hole_dm_to_one_pdm` by raising a `ValueError` when the denominator is zero. It also adds a unit test to verify this behavior and ensure edge cases are handled correctly. --- src/openfermion/utils/rdm_mapping_functions.py | 5 ++++- src/openfermion/utils/rdm_mapping_functions_test.py | 8 ++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/openfermion/utils/rdm_mapping_functions.py b/src/openfermion/utils/rdm_mapping_functions.py index 1ac4173c5..b8358c07e 100644 --- a/src/openfermion/utils/rdm_mapping_functions.py +++ b/src/openfermion/utils/rdm_mapping_functions.py @@ -202,4 +202,7 @@ def map_particle_hole_dm_to_one_pdm(phdm, num_particles, num_basis_functions): Returns: opdm (numpy.ndarray): the 1-RDM transformed from a 1-RDM. """ - return numpy.einsum('prrq', phdm) / (num_basis_functions - num_particles + 1) + denominator = num_basis_functions - num_particles + 1 + if denominator == 0: + raise ValueError("Denominator (num_basis_functions - num_particles + 1) " "cannot be zero.") + return numpy.einsum('prrq', phdm) / denominator diff --git a/src/openfermion/utils/rdm_mapping_functions_test.py b/src/openfermion/utils/rdm_mapping_functions_test.py index 5b9216818..0ee0e9630 100644 --- a/src/openfermion/utils/rdm_mapping_functions_test.py +++ b/src/openfermion/utils/rdm_mapping_functions_test.py @@ -171,6 +171,14 @@ def test_phdm_conversions_h2_631g(self): test_tpdm = map_particle_hole_dm_to_two_pdm(true_phdm, molecule.fci_one_rdm) assert numpy.allclose(test_tpdm, molecule.fci_two_rdm) + def test_map_particle_hole_dm_to_one_pdm_edge_cases(self): + # Trigger division by zero + phdm = numpy.zeros((2, 2, 2, 2)) + num_particles = 3 + num_basis_functions = 2 + with self.assertRaises(ValueError): + map_particle_hole_dm_to_one_pdm(phdm, num_particles, num_basis_functions) + def test_phdm_conversions_h2_sto3g(self): filename = "H2_sto-3g_singlet_1.4.hdf5" molecule = MolecularData(filename=os.path.join(DATA_DIRECTORY, filename)) From cbb47dc9cbf8bc21324c52d409774d45e69ac91d Mon Sep 17 00:00:00 2001 From: Michael Hucka Date: Thu, 26 Mar 2026 22:32:13 -0700 Subject: [PATCH 2/2] Update src/openfermion/utils/rdm_mapping_functions.py Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- src/openfermion/utils/rdm_mapping_functions.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/openfermion/utils/rdm_mapping_functions.py b/src/openfermion/utils/rdm_mapping_functions.py index b8358c07e..f7b26886a 100644 --- a/src/openfermion/utils/rdm_mapping_functions.py +++ b/src/openfermion/utils/rdm_mapping_functions.py @@ -202,7 +202,6 @@ def map_particle_hole_dm_to_one_pdm(phdm, num_particles, num_basis_functions): Returns: opdm (numpy.ndarray): the 1-RDM transformed from a 1-RDM. """ - denominator = num_basis_functions - num_particles + 1 - if denominator == 0: - raise ValueError("Denominator (num_basis_functions - num_particles + 1) " "cannot be zero.") - return numpy.einsum('prrq', phdm) / denominator + if num_particles > num_basis_functions: + raise ValueError('Number of particles cannot exceed number of basis functions.') + return numpy.einsum('prrq', phdm) / (num_basis_functions - num_particles + 1)