LCOV - code coverage report
Current view: top level - tests - test_mapping.py (source / functions) Coverage Total Hit
Test: coverage.info Lines: 100.0 % 18 18
Test Date: 2026-11-02 09:44:19 Functions: 100.0 % 1 1

            Line data    Source code
       1              : # SPDX-FileCopyrightText: 2024 PairInteraction Developers
       2              : # SPDX-License-Identifier: LGPL-3.0-or-later
       3              : 
       4            1 : from __future__ import annotations
       5              : 
       6            1 : from typing import TYPE_CHECKING
       7              : 
       8            1 : import numpy as np
       9            1 : from scipy.optimize import linear_sum_assignment
      10              : 
      11              : if TYPE_CHECKING:
      12              :     from pairinteraction.units import NDArray
      13              : 
      14              :     from .utils import PairinteractionModule
      15              : 
      16              : 
      17            1 : def test_mapping(pi_module: PairinteractionModule) -> None:
      18              :     """Test generation of a mapping."""
      19              :     # Get the eigenbasis of the Hamiltonian describing an atom in an electric field
      20            1 :     basis = pi_module.BasisAtom("Rb", n=(58, 62), l=(0, 2))
      21            1 :     system = pi_module.SystemAtom(basis).set_electric_field([0, 0, 2.5], unit="V/cm")
      22            1 :     system.diagonalize(diagonalizer="eigen")
      23            1 :     eigenbasis = system.get_eigenbasis()
      24              : 
      25            1 :     assert eigenbasis.number_of_states == eigenbasis.number_of_kets
      26              : 
      27              :     # Obtain the mapping
      28            1 :     state_indices = [eigenbasis.get_corresponding_state_index(ket) for ket in eigenbasis.kets]
      29              : 
      30              :     # Calculate the mapping from the coefficient matrix using scipy
      31            1 :     coefficient_matrix = np.square(np.abs(eigenbasis.get_coefficients().todense()))
      32              :     rows: NDArray
      33              :     cols: NDArray
      34            1 :     rows, cols = linear_sum_assignment(-coefficient_matrix)
      35              : 
      36            1 :     sorter = np.argsort(rows)
      37            1 :     rows = rows[sorter]
      38            1 :     cols = cols[sorter]
      39              : 
      40              :     # Because we have chosen the electric field to be weak enough to avoid strong mixing of states,
      41              :     # the mapping obtained by PairInteraction's heuristic should be the same as the optimal mapping
      42              :     # obtained by scipy's linear_sum_assignment
      43            1 :     np.testing.assert_array_equal(rows, np.arange(eigenbasis.number_of_kets))
      44            1 :     np.testing.assert_array_equal(cols, state_indices)  # TODO
        

Generated by: LCOV version 2.0-1