pairinteraction
A Rydberg Interaction Calculator
BasisPair.hpp
Go to the documentation of this file.
1// SPDX-FileCopyrightText: 2024 Pairinteraction Developers
2// SPDX-License-Identifier: LGPL-3.0-or-later
3
4#pragma once
5
12
13#include <Eigen/Dense>
14#include <Eigen/SparseCore>
15#include <complex>
16#include <memory>
17#include <unordered_map>
18#include <vector>
19
20namespace pairinteraction {
21template <typename Scalar>
22class BasisPairCreator;
23
24template <typename Scalar>
25class KetPair;
26
27template <typename Scalar>
28class BasisPair;
29
30template <typename Scalar>
31class BasisAtom;
32
33class KetAtom;
34
35template <typename Scalar>
37 using scalar_t = Scalar;
40 using ketvec_t = std::vector<std::shared_ptr<const ket_t>>;
41};
42
43template <typename Scalar>
44class BasisPair : public Basis<BasisPair<Scalar>>,
45 public std::enable_shared_from_this<BasisPair<Scalar>> {
47
48 friend class BasisPairCreator<Scalar>;
49 struct Private {};
50
51public:
57 using map_size_t = std::unordered_map<size_t, size_t>;
58 using map_range_t = std::unordered_map<size_t, range_t>;
60 std::unordered_map<std::vector<size_t>, size_t, utils::hash<std::vector<size_t>>>;
61
62 BasisPair(Private /*unused*/, ketvec_t &&kets, map_range_t &&map_range_of_state_index2,
63 map_indices_t &&state_indices_to_ket_index,
64 std::shared_ptr<const BasisAtom<Scalar>> basis1,
65 std::shared_ptr<const BasisAtom<Scalar>> basis2);
66 const range_t &get_index_range(size_t state_index1) const;
67 std::shared_ptr<const BasisAtom<Scalar>> get_basis1() const;
68 std::shared_ptr<const BasisAtom<Scalar>> get_basis2() const;
69 int get_ket_index_from_tuple(size_t state_index1, size_t state_index2) const;
70
71 Eigen::VectorX<Scalar> get_amplitudes(std::shared_ptr<const KetAtom> ket1,
72 std::shared_ptr<const KetAtom> ket2) const;
73 Eigen::SparseMatrix<Scalar, Eigen::RowMajor>
74 get_amplitudes(std::shared_ptr<const BasisAtom<Scalar>> other1,
75 std::shared_ptr<const BasisAtom<Scalar>> other2) const;
76 Eigen::VectorX<real_t> get_overlaps(std::shared_ptr<const KetAtom> ket1,
77 std::shared_ptr<const KetAtom> ket2) const;
78 Eigen::SparseMatrix<real_t, Eigen::RowMajor>
79 get_overlaps(std::shared_ptr<const BasisAtom<Scalar>> other1,
80 std::shared_ptr<const BasisAtom<Scalar>> other2) const;
81
82 Eigen::VectorX<Scalar> get_matrix_elements(std::shared_ptr<const ket_t> /*ket*/,
83 OperatorType /*type*/, int /*q*/) const override;
84 Eigen::SparseMatrix<Scalar, Eigen::RowMajor>
85 get_matrix_elements(std::shared_ptr<const Type> /*final*/, OperatorType /*type*/,
86 int /*q*/) const override;
87 Eigen::VectorX<Scalar> get_matrix_elements(std::shared_ptr<const ket_t> ket, OperatorType type1,
88 OperatorType type2, int q1 = 0, int q2 = 0) const;
89 Eigen::VectorX<Scalar> get_matrix_elements(std::shared_ptr<const KetAtom> ket1,
90 std::shared_ptr<const KetAtom> ket2,
91 OperatorType type1, OperatorType type2, int q1 = 0,
92 int q2 = 0) const;
93 Eigen::SparseMatrix<Scalar, Eigen::RowMajor>
94 get_matrix_elements(std::shared_ptr<const Type> final, OperatorType type1, OperatorType type2,
95 int q1 = 0, int q2 = 0) const;
96 Eigen::SparseMatrix<Scalar, Eigen::RowMajor>
97 get_matrix_elements(std::shared_ptr<const BasisAtom<Scalar>> final1,
98 std::shared_ptr<const BasisAtom<Scalar>> final2, OperatorType type1,
99 OperatorType type2, int q1 = 0, int q2 = 0) const;
100
101private:
102 map_range_t map_range_of_state_index2;
103 map_indices_t state_indices_to_ket_index;
104 std::shared_ptr<const BasisAtom<Scalar>> basis1;
105 std::shared_ptr<const BasisAtom<Scalar>> basis2;
106};
107
108extern template class BasisPair<double>;
109extern template class BasisPair<std::complex<double>>;
110} // namespace pairinteraction
Class for creating a basis of atomic kets.
Definition: BasisAtom.hpp:40
int get_ket_index_from_tuple(size_t state_index1, size_t state_index2) const
Definition: BasisPair.cpp:48
const range_t & get_index_range(size_t state_index1) const
Definition: BasisPair.cpp:33
Eigen::VectorX< Scalar > get_amplitudes(std::shared_ptr< const KetAtom > ket1, std::shared_ptr< const KetAtom > ket2) const
Definition: BasisPair.cpp:57
std::shared_ptr< const BasisAtom< Scalar > > get_basis2() const
Definition: BasisPair.cpp:43
Eigen::VectorX< real_t > get_overlaps(std::shared_ptr< const KetAtom > ket1, std::shared_ptr< const KetAtom > ket2) const
Definition: BasisPair.cpp:140
std::unordered_map< std::vector< size_t >, size_t, utils::hash< std::vector< size_t > > > map_indices_t
Definition: BasisPair.hpp:60
typename traits::CrtpTraits< Type >::ket_t ket_t
Definition: BasisPair.hpp:54
typename traits::CrtpTraits< Type >::ketvec_t ketvec_t
Definition: BasisPair.hpp:55
Eigen::VectorX< Scalar > get_matrix_elements(std::shared_ptr< const ket_t >, OperatorType, int) const override
Definition: BasisPair.cpp:153
std::shared_ptr< const BasisAtom< Scalar > > get_basis1() const
Definition: BasisPair.cpp:38
BasisPair(Private, ketvec_t &&kets, map_range_t &&map_range_of_state_index2, map_indices_t &&state_indices_to_ket_index, std::shared_ptr< const BasisAtom< Scalar > > basis1, std::shared_ptr< const BasisAtom< Scalar > > basis2)
Definition: BasisPair.cpp:21
typename traits::CrtpTraits< Type >::real_t real_t
Definition: BasisPair.hpp:53
std::unordered_map< size_t, range_t > map_range_t
Definition: BasisPair.hpp:58
std::unordered_map< size_t, size_t > map_size_t
Definition: BasisPair.hpp:57
Base class for a basis.
Definition: Basis.hpp:41
Matrix< Type, Dynamic, 1 > VectorX
typename traits::NumTraits< Scalar >::real_t real_t
Definition: BasisPair.hpp:38
std::vector< std::shared_ptr< const ket_t > > ketvec_t
Definition: BasisPair.hpp:40
Helper struct to extract types from a derived basis type. Must be specialized for each derived basis ...
Definition: traits.hpp:24
Helper struct to extract types from a numerical type.
Definition: traits.hpp:35
Hash function.
Definition: hash.hpp:72