pairinteraction
A Rydberg Interaction Calculator
Database.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
8
9#include <Eigen/SparseCore>
10#include <complex>
11#include <filesystem>
12#include <memory>
13#include <oneapi/tbb.h>
14#include <string>
15#include <vector>
16
17namespace duckdb {
18class DuckDB;
19class Connection;
20} // namespace duckdb
21
22namespace pairinteraction {
23enum class OperatorType;
24
25struct AtomDescriptionByParameters;
26
27struct AtomDescriptionByRanges;
28
29class KetAtom;
30
31template <typename Scalar>
32class BasisAtom;
33
34class GitHubDownloader;
35
36class ParquetManager;
37
38class Database {
39public:
40 Database();
41 Database(bool download_missing);
42 Database(std::filesystem::path database_dir);
43 Database(bool download_missing, bool use_cache, std::filesystem::path database_dir);
46 static Database &get_global_instance(bool download_missing);
48 static Database &get_global_instance(bool download_missing, bool use_cache,
49 std::filesystem::path database_dir);
50
51 std::shared_ptr<const KetAtom> get_ket(const std::string &species,
52 const AtomDescriptionByParameters &description);
53
54 template <typename Scalar>
55 std::shared_ptr<const BasisAtom<Scalar>> get_basis(const std::string &species,
56 const AtomDescriptionByRanges &description,
57 std::vector<size_t> additional_ket_ids);
58
59 template <typename Scalar>
60 Eigen::SparseMatrix<Scalar, Eigen::RowMajor>
61 get_matrix_elements(std::shared_ptr<const BasisAtom<Scalar>> initial_basis,
62 std::shared_ptr<const BasisAtom<Scalar>> final_basis, OperatorType type,
63 int q);
64
65 bool get_download_missing() const;
66 bool get_use_cache() const;
68
69private:
70 struct Table {
71 std::filesystem::path local_path{""};
72 std::filesystem::path remote_path{""};
73 int local_version{-1};
74 int remote_version{-1};
75 };
76
77 const std::string default_database_repo_host{"https://api.github.com"};
78 const std::vector<std::string> default_database_repo_paths{
79 "/repos/pairinteraction/database-sqdt/releases/latest",
80 "/repos/pairinteraction/database-mqdt/releases/latest"};
81
82 bool download_missing_;
83 bool use_cache_;
84 std::filesystem::path database_dir_;
85 std::unique_ptr<duckdb::DuckDB> db;
86 std::unique_ptr<duckdb::Connection> con;
87 std::unique_ptr<GitHubDownloader> downloader;
88 std::unique_ptr<ParquetManager> manager;
89
90 static constexpr bool default_download_missing{false};
91 static constexpr bool default_use_cache{true};
92 static const std::filesystem::path default_database_dir;
93
94 static oneapi::tbb::concurrent_unordered_map<std::string,
95 Eigen::SparseMatrix<double, Eigen::RowMajor>> &
96 get_matrix_elements_cache();
97
98 static Database &get_global_instance_without_checks(bool download_missing, bool use_cache,
99 std::filesystem::path database_dir);
100
101 void ensure_presence_of_table(const std::string &name);
102};
103
104// Extern template declarations
105// NOLINTBEGIN(bugprone-macro-parentheses, cppcoreguidelines-macro-usage)
106#define EXTERN_GETTERS(SCALAR) \
107 extern template std::shared_ptr<const BasisAtom<SCALAR>> Database::get_basis<SCALAR>( \
108 const std::string &species, const AtomDescriptionByRanges &description, \
109 std::vector<size_t> additional_ket_ids); \
110 extern template Eigen::SparseMatrix<SCALAR, Eigen::RowMajor> \
111 Database::get_matrix_elements<SCALAR>(std::shared_ptr<const BasisAtom<SCALAR>> initial_basis, \
112 std::shared_ptr<const BasisAtom<SCALAR>> final_basis, \
113 OperatorType type, int q);
114// NOLINTEND(bugprone-macro-parentheses, cppcoreguidelines-macro-usage)
115
116EXTERN_GETTERS(double)
117EXTERN_GETTERS(std::complex<double>)
118
119#undef EXTERN_GETTERS
120} // namespace pairinteraction
#define EXTERN_GETTERS(SCALAR)
Definition: Database.hpp:106
Class for creating a basis of atomic kets.
Definition: BasisAtom.hpp:40
std::shared_ptr< const KetAtom > get_ket(const std::string &species, const AtomDescriptionByParameters &description)
Definition: Database.cpp:154
static Database & get_global_instance()
Definition: Database.cpp:1068
bool get_download_missing() const
Definition: Database.cpp:1054
std::filesystem::path get_database_dir() const
Definition: Database.cpp:1058
std::shared_ptr< const BasisAtom< Scalar > > get_basis(const std::string &species, const AtomDescriptionByRanges &description, std::vector< size_t > additional_ket_ids)
Definition: Database.cpp:467
Eigen::SparseMatrix< Scalar, Eigen::RowMajor > get_matrix_elements(std::shared_ptr< const BasisAtom< Scalar > > initial_basis, std::shared_ptr< const BasisAtom< Scalar > > final_basis, OperatorType type, int q)
Definition: Database.cpp:905
bool get_use_cache() const
Definition: Database.cpp:1056