LCOV - code coverage report
Current view: top level - src/basis - BasisPair.cpp (source / functions) Hit Total Coverage
Test: coverage.info Lines: 31 31 100.0 %
Date: 2026-06-19 12:50:25 Functions: 12 12 100.0 %

          Line data    Source code
       1             : // SPDX-FileCopyrightText: 2024 PairInteraction Developers
       2             : // SPDX-License-Identifier: LGPL-3.0-or-later
       3             : 
       4             : #include "pairinteraction/basis/BasisPair.hpp"
       5             : 
       6             : #include "pairinteraction/basis/BasisAtom.hpp"
       7             : #include "pairinteraction/database/Database.hpp"
       8             : #include "pairinteraction/ket/KetPair.hpp"
       9             : #include "pairinteraction/utils/Range.hpp"
      10             : #include "pairinteraction/utils/tensor.hpp"
      11             : 
      12             : #include <cassert>
      13             : #include <memory>
      14             : #include <vector>
      15             : 
      16             : namespace pairinteraction {
      17             : template <typename Scalar>
      18         483 : BasisPair<Scalar>::BasisPair(Private /*unused*/, ketvec_t &&kets,
      19             :                              map_range_t &&map_range_of_state_index2,
      20             :                              map_indices_t &&state_indices_to_ket_index,
      21             :                              std::shared_ptr<const BasisAtom<Scalar>> basis1,
      22             :                              std::shared_ptr<const BasisAtom<Scalar>> basis2)
      23         483 :     : Basis<BasisPair<Scalar>>(std::move(kets)),
      24         483 :       map_range_of_state_index2(std::move(map_range_of_state_index2)),
      25         483 :       state_indices_to_ket_index(std::move(state_indices_to_ket_index)), basis1(std::move(basis1)),
      26         966 :       basis2(std::move(basis2)) {}
      27             : 
      28             : template <typename Scalar>
      29             : const typename BasisPair<Scalar>::range_t &
      30     7365236 : BasisPair<Scalar>::get_index_range(size_t state_index1) const {
      31     7365236 :     return map_range_of_state_index2.at(state_index1);
      32             : }
      33             : 
      34             : template <typename Scalar>
      35         976 : std::shared_ptr<const BasisAtom<Scalar>> BasisPair<Scalar>::get_basis1() const {
      36         976 :     return basis1;
      37             : }
      38             : 
      39             : template <typename Scalar>
      40         976 : std::shared_ptr<const BasisAtom<Scalar>> BasisPair<Scalar>::get_basis2() const {
      41         976 :     return basis2;
      42             : }
      43             : 
      44             : template <typename Scalar>
      45     8573111 : int BasisPair<Scalar>::get_ket_index_from_tuple(size_t state_index1, size_t state_index2) const {
      46     8573111 :     if (!state_indices_to_ket_index.contains({state_index1, state_index2})) {
      47     1177519 :         return -1;
      48             :     }
      49     7395592 :     return state_indices_to_ket_index.at({state_index1, state_index2});
      50             : }
      51             : 
      52             : template <typename Scalar>
      53             : Eigen::SparseMatrix<Scalar, Eigen::RowMajor>
      54         188 : BasisPair<Scalar>::get_matrix_elements(std::shared_ptr<const Type> final_state, OperatorType type1,
      55             :                                        OperatorType type2, int q1, int q2) const {
      56         188 :     auto initial1 = this->get_basis1();
      57         188 :     auto initial2 = this->get_basis2();
      58         188 :     auto final1 = final_state->get_basis1();
      59         188 :     auto final2 = final_state->get_basis2();
      60             : 
      61         188 :     auto matrix_elements1 = initial1->get_database().get_matrix_elements_in_canonical_basis(
      62             :         initial1, final1, type1, q1);
      63         188 :     matrix_elements1 =
      64         188 :         final1->get_coefficients().adjoint() * matrix_elements1 * initial1->get_coefficients();
      65         188 :     auto matrix_elements2 = initial2->get_database().get_matrix_elements_in_canonical_basis(
      66             :         initial2, final2, type2, q2);
      67         188 :     matrix_elements2 =
      68         188 :         final2->get_coefficients().adjoint() * matrix_elements2 * initial2->get_coefficients();
      69         188 :     auto matrix_elements = utils::calculate_tensor_product_in_canonical_basis(
      70             :         this->shared_from_this(), final_state, matrix_elements1, matrix_elements2);
      71         188 :     assert(static_cast<size_t>(matrix_elements.rows()) == final_state->get_number_of_kets());
      72         188 :     assert(static_cast<size_t>(matrix_elements.cols()) == this->get_number_of_kets());
      73             : 
      74         376 :     return final_state->get_coefficients().adjoint() * matrix_elements * this->get_coefficients();
      75         188 : }
      76             : 
      77             : // Explicit instantiations
      78             : template class BasisPair<double>;
      79             : template class BasisPair<std::complex<double>>;
      80             : } // namespace pairinteraction

Generated by: LCOV version 1.16