pairinteraction
A Rydberg Interaction Calculator
Operator.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
9
10#include <Eigen/SparseCore>
11#include <memory>
12
13namespace pairinteraction {
14enum class TransformationType : unsigned char;
15
16template <typename Derived>
17class Operator;
18
19template <typename Derived>
20Derived operator*(const typename Operator<Derived>::scalar_t &lhs, const Operator<Derived> &rhs);
21
22template <typename Derived>
23Derived operator*(const Operator<Derived> &lhs, const typename Operator<Derived>::scalar_t &rhs);
24
25template <typename Derived>
26Derived operator/(const Operator<Derived> &lhs, const typename Operator<Derived>::scalar_t &rhs);
27
28template <typename Derived>
29Derived &operator+=(Operator<Derived> &lhs, const Operator<Derived> &rhs);
30
31template <typename Derived>
32Derived &operator-=(Operator<Derived> &lhs, const Operator<Derived> &rhs);
33
34template <typename Derived>
35Derived operator+(const Operator<Derived> &lhs, const Operator<Derived> &rhs);
36
37template <typename Derived>
38Derived operator-(const Operator<Derived> &lhs, const Operator<Derived> &rhs);
39
40template <typename Derived>
42 : public TransformationBuilderInterface<typename traits::CrtpTraits<Derived>::scalar_t> {
43public:
48
49 Operator(std::shared_ptr<const basis_t> basis);
50 virtual ~Operator() = default;
51
52 std::shared_ptr<const basis_t> get_basis() const;
53 std::shared_ptr<const basis_t> &get_basis();
54
55 const Eigen::SparseMatrix<scalar_t, Eigen::RowMajor> &get_matrix() const;
56 Eigen::SparseMatrix<scalar_t, Eigen::RowMajor> &get_matrix();
57
58 const Transformation<scalar_t> &get_transformation() const override;
59 Transformation<scalar_t> get_rotator(real_t alpha, real_t beta, real_t gamma) const override;
60 Sorting get_sorter(const std::vector<TransformationType> &labels) const override;
61 std::vector<IndicesOfBlock>
62 get_indices_of_blocks(const std::vector<TransformationType> &labels) const override;
63
64 void get_indices_of_blocks_without_checks(const std::set<TransformationType> &unique_labels,
65 IndicesOfBlocksCreator &blocks) const;
66
67 Derived transformed(const Transformation<scalar_t> &transformation) const;
68 Derived transformed(const Sorting &transformation) const;
69
70 friend Derived operator*
71 <>(const typename Operator<Derived>::scalar_t &lhs, const Operator<Derived> &rhs);
72 friend Derived operator*
73 <>(const Operator<Derived> &lhs, const typename Operator<Derived>::scalar_t &rhs);
74 friend Derived operator/
75 <>(const Operator<Derived> &lhs, const typename Operator<Derived>::scalar_t &rhs);
76 // clang-format off
77 friend Derived &operator+=<>(Operator<Derived> &lhs, const Operator<Derived> &rhs);
78 friend Derived &operator-=<>(Operator<Derived> &lhs, const Operator<Derived> &rhs);
79 friend Derived operator+<>(const Operator<Derived> &lhs, const Operator<Derived> &rhs);
80 friend Derived operator-<>(const Operator<Derived> &lhs, const Operator<Derived> &rhs);
81 // clang-format on
82
83protected:
85 void initialize_from_matrix(Eigen::SparseMatrix<scalar_t, Eigen::RowMajor> &&matrix);
86 std::shared_ptr<const basis_t> basis;
87 Eigen::SparseMatrix<scalar_t, Eigen::RowMajor> matrix;
88
89private:
90 const Derived &derived() const;
91 Derived &derived_mutable();
92};
93} // namespace pairinteraction
const Transformation< scalar_t > & get_transformation() const override
Definition: Operator.cpp:86
typename traits::CrtpTraits< Derived >::real_t real_t
Definition: Operator.hpp:45
void initialize_as_energy_operator()
Definition: Operator.cpp:27
std::shared_ptr< const basis_t > basis
Definition: Operator.hpp:86
virtual ~Operator()=default
Operator(std::shared_ptr< const basis_t > basis)
Definition: Operator.cpp:21
std::shared_ptr< const basis_t > get_basis() const
Definition: Operator.cpp:63
Eigen::SparseMatrix< scalar_t, Eigen::RowMajor > matrix
Definition: Operator.hpp:87
typename traits::CrtpTraits< Derived >::scalar_t scalar_t
Definition: Operator.hpp:44
Derived transformed(const Transformation< scalar_t > &transformation) const
typename traits::CrtpTraits< Derived >::basis_t basis_t
Definition: Operator.hpp:47
void get_indices_of_blocks_without_checks(const std::set< TransformationType > &unique_labels, IndicesOfBlocksCreator &blocks) const
typename traits::CrtpTraits< Derived >::ketvec_t ketvec_t
Definition: Operator.hpp:46
const Eigen::SparseMatrix< scalar_t, Eigen::RowMajor > & get_matrix() const
Definition: Operator.cpp:74
std::vector< IndicesOfBlock > get_indices_of_blocks(const std::vector< TransformationType > &labels) const override
Definition: Operator.cpp:149
Transformation< scalar_t > get_rotator(real_t alpha, real_t beta, real_t gamma) const override
Definition: Operator.cpp:92
void initialize_from_matrix(Eigen::SparseMatrix< scalar_t, Eigen::RowMajor > &&matrix)
Definition: Operator.cpp:43
Sorting get_sorter(const std::vector< TransformationType > &labels) const override
Definition: Operator.cpp:97
Derived operator+(const Operator< Derived > &lhs, const Operator< Derived > &rhs)
Definition: Operator.cpp:248
Derived & operator-=(Operator< Derived > &lhs, const Operator< Derived > &rhs)
Definition: Operator.cpp:239
Derived operator*(const typename Operator< Derived >::scalar_t &lhs, const Operator< Derived > &rhs)
Definition: Operator.cpp:209
Derived & operator+=(Operator< Derived > &lhs, const Operator< Derived > &rhs)
Definition: Operator.cpp:230
Derived operator/(const Operator< Derived > &lhs, const typename Operator< Derived >::scalar_t &rhs)
Definition: Operator.cpp:223
Derived operator-(const Operator< Derived > &lhs, const Operator< Derived > &rhs)
Definition: Operator.cpp:258
Helper struct to extract types from a derived basis type. Must be specialized for each derived basis ...
Definition: traits.hpp:24