iterative-solver 0.0
SubspaceSolverLinEig.h
1#ifndef LINEARALGEBRA_SRC_MOLPRO_LINALG_ITSOLV_SUBSPACE_SUBSPACESOLVERLINEIG_H
2#define LINEARALGEBRA_SRC_MOLPRO_LINALG_ITSOLV_SUBSPACE_SUBSPACESOLVERLINEIG_H
3#include <molpro/linalg/itsolv/subspace/ISubspaceSolver.h>
4#include <molpro/linalg/itsolv/subspace/IXSpace.h>
5#include <molpro/linalg/itsolv/subspace/Matrix.h>
6#include <molpro/linalg/itsolv/Logger.h>
7#include <molpro/linalg/itsolv/helper.h>
8
9#include <memory>
10
12
16template <class RT, class QT, class PT>
17class SubspaceSolverLinEig : public ISubspaceSolver<RT, QT, PT> {
18public:
24
25 explicit SubspaceSolverLinEig(std::shared_ptr<Logger> logger) : m_logger(std::move(logger)) {}
26
27 void solve(IXSpace<R, Q, P>& xspace, const size_t nroots_max) override {
28 m_logger->trace("SubspaceSolverLinEig::solve");
29 if (xspace.data.find(EqnData::rhs) == xspace.data.end() || xspace.data[EqnData::rhs].empty()) {
30 solve_eigenvalue(xspace, nroots_max);
31 } else {
33 }
34 }
35
36protected:
38 switch (verbosity) {
40 return 3;
42 return 2;
44 return 1;
46 return 0;
47 }
48
49 return 0;
50 }
51
52 void solve_eigenvalue(IXSpace<R, Q, P>& xspace, const size_t nroots_max) {
53 m_logger->trace("SubspaceSolverLinEig::solve_eigenvalue");
54 auto h = xspace.data[EqnData::H];
55 auto s = xspace.data[EqnData::S];
56 m_logger->data_dump("S = ", s);
57 m_logger->data_dump<15>("H = ", h);
58 auto dim = h.rows();
59 auto evec = std::vector<value_type>{};
60 int verbosity = convert_verbosity(m_logger->verbosity());
61 itsolv::eigenproblem(evec, m_eigenvalues, h.data(), s.data(), dim, m_hermitian, m_svd_solver_threshold, verbosity,
63 size_t n_solutions = 0;
64 if (dim)
65 n_solutions = evec.size() / dim;
66 auto full_matrix = Matrix<value_type>{std::move(evec), {n_solutions, dim}};
67 auto nroots = std::min(nroots_max, n_solutions);
68 m_eigenvalues.resize(nroots);
69 auto [first, last] = std::ranges::remove_if(
70 m_imag_eigval_comps, [nroots](std::size_t idx) { return idx >= nroots; },
71 &decltype(m_imag_eigval_comps)::value_type::first);
72 if (first != last && (std::ranges::distance(first, last) % 2) != 0) {
73 m_logger->info("Complex eigenvalue pair split up due to truncation to requested number of roots");
74 }
75 m_imag_eigval_comps.erase(first, last);
76 m_solutions.resize({nroots, dim});
77 m_solutions.slice() = full_matrix.slice({0, 0}, {nroots, dim});
78 m_errors.assign(size(), std::numeric_limits<value_type_abs>::max());
79 m_logger->data_dump<10>("eigenvalues = ", m_eigenvalues);
80 if (!m_imag_eigval_comps.empty()) {
81 m_logger->info("The following eigenvalues turned out to be complex-valued: ",
83 std::ranges::views::transform([](const auto& pair) { return pair.first + 1; }));
84 m_logger->data_dump("imaginary parts of eigenvalues = ",
85 m_imag_eigval_comps | std::ranges::views::transform([](auto pair) {
86 pair.first += 1;
87 return pair;
88 }));
89 }
90 m_logger->data_dump("eigenvectors = ", m_solutions);
91 }
92
94 m_logger->trace("SubspaceSolverLinEig::solve_linear_equations");
95 auto h = xspace.data[EqnData::H];
96 auto s = xspace.data[EqnData::S];
97 auto rhs = xspace.data[EqnData::rhs];
98 m_logger->data_dump<15>("S = ", s);
99 m_logger->data_dump<15>("H = ", h);
100 m_logger->data_dump<15>("rhs = ", rhs);
101 const auto dim = h.rows();
102 const auto n_solutions = rhs.cols();
103 auto solution = std::vector<value_type>{};
104 m_eigenvalues.assign(n_solutions, 0);
105 m_imag_eigval_comps.clear();
106 int verbosity = convert_verbosity(m_logger->verbosity());
107 itsolv::solve_LinearEquations(solution, m_eigenvalues, h.data(), s.data(), rhs.data(), dim, n_solutions,
109 m_solutions = Matrix<value_type>{std::move(solution), {n_solutions, dim}};
110 m_errors.assign(size(), std::numeric_limits<value_type_abs>::max());
111 m_logger->data_dump<10>("eigenvalues = ", m_eigenvalues);
112 m_logger->data_dump("solutions = ", m_solutions);
113 }
114
115public:
117 void set_error(int root, value_type_abs error) override { m_errors.at(root) = error; }
118 void set_error(const std::vector<int>& roots, const std::vector<value_type_abs>& errors) override {
119 for (size_t i = 0; i < roots.size(); ++i)
120 set_error(roots[i], errors[i]);
121 }
122
123 const Matrix<value_type>& solutions() const override { return m_solutions; }
124 const std::vector<value_type>& eigenvalues() const override { return m_eigenvalues; }
125 const std::vector<std::pair<std::size_t, value_type>>& imag_eigval_components() const { return m_imag_eigval_comps; }
126 const std::vector<value_type_abs>& errors() const override { return m_errors; }
127
129 size_t size() const override { return m_solutions.rows(); }
130
131 void set_logger(std::shared_ptr<Logger> logger) override { m_logger = std::move(logger); }
132
133 // FIXME What difference does it make?
135 void set_hermiticity(bool hermitian) { m_hermitian = hermitian; }
136 bool get_hermiticity() { return m_hermitian; }
140
141protected:
143 std::vector<value_type> m_eigenvalues;
144 std::vector<std::pair<std::size_t, value_type>> m_imag_eigval_comps;
145 std::vector<value_type_abs> m_errors;
146 std::shared_ptr<Logger> m_logger{};
147
148public:
150 value_type_abs m_svd_solver_threshold = precision_scaled<value_type_abs>(1e-14);
151protected:
152 bool m_hermitian = false;
155};
156
157} // namespace molpro::linalg::itsolv::subspace
158
159#endif // LINEARALGEBRA_SRC_MOLPRO_LINALG_ITSOLV_SUBSPACE_SUBSPACESOLVERLINEIG_H
SubspaceData< value_type > data
Equation data in the subspace.
Definition: IXSpace.h:28
Slice slice(coord_type upper_left, coord_type bottom_right)
Access a rectangular slice of the matrix.
Definition: Matrix.h:99
void resize(const coord_type &dims)
Resize the matrix. The old data is preserved and any new rows/cols are zeroed.
Definition: Matrix.h:128
index_type rows() const
Definition: Matrix.h:167
Solves subspace problem for linear eigenvalues and system of linear equations.
Definition: SubspaceSolverLinEig.h:17
value_type_abs get_augmented_hessian()
Definition: SubspaceSolverLinEig.h:139
value_type_abs m_augmented_hessian
value of augmented hessian parameter. If 0, than augmented Hessian is not used
Definition: SubspaceSolverLinEig.h:154
std::vector< value_type_abs > m_errors
errors in subspace solutions
Definition: SubspaceSolverLinEig.h:145
typename ISubspaceSolver< RT, QT, PT >::value_type_abs value_type_abs
Definition: SubspaceSolverLinEig.h:20
void set_error(const std::vector< int > &roots, const std::vector< value_type_abs > &errors) override
Update errors for a group of roots.
Definition: SubspaceSolverLinEig.h:118
void set_logger(std::shared_ptr< Logger > logger) override
Definition: SubspaceSolverLinEig.h:131
void set_error(int root, value_type_abs error) override
Set error value for solution root
Definition: SubspaceSolverLinEig.h:117
void solve_eigenvalue(IXSpace< R, Q, P > &xspace, const size_t nroots_max)
Definition: SubspaceSolverLinEig.h:52
value_type_abs m_svd_solver_threshold
threshold to select null space during SVD in eigenproblem, rescaled from double to the working precis...
Definition: SubspaceSolverLinEig.h:150
std::vector< value_type > m_eigenvalues
eigenvalues
Definition: SubspaceSolverLinEig.h:143
bool get_hermiticity()
Definition: SubspaceSolverLinEig.h:136
Matrix< value_type > m_solutions
solution matrix with row vectors
Definition: SubspaceSolverLinEig.h:142
std::shared_ptr< Logger > m_logger
Definition: SubspaceSolverLinEig.h:146
const std::vector< value_type > & eigenvalues() const override
Access eigenvalues from the last solve() call.
Definition: SubspaceSolverLinEig.h:124
std::vector< std::pair< std::size_t, value_type > > m_imag_eigval_comps
eigenvalues
Definition: SubspaceSolverLinEig.h:144
void set_augmented_hessian(value_type_abs parameter)
Set value of augmented hessian parameter. If 0, than augmented Hessian is not used.
Definition: SubspaceSolverLinEig.h:138
typename ISubspaceSolver< RT, QT, PT >::value_type value_type
Definition: SubspaceSolverLinEig.h:19
void solve(IXSpace< R, Q, P > &xspace, const size_t nroots_max) override
Solve the subspace problem.
Definition: SubspaceSolverLinEig.h:27
const std::vector< std::pair< std::size_t, value_type > > & imag_eigval_components() const
Definition: SubspaceSolverLinEig.h:125
void set_hermiticity(bool hermitian)
Set Hermiticity of the subspace.
Definition: SubspaceSolverLinEig.h:135
const std::vector< value_type_abs > & errors() const override
Access errors corresponding to each solution.
Definition: SubspaceSolverLinEig.h:126
int convert_verbosity(log::Verbosity verbosity)
Definition: SubspaceSolverLinEig.h:37
SubspaceSolverLinEig(std::shared_ptr< Logger > logger)
Definition: SubspaceSolverLinEig.h:25
void solve_linear_equations(IXSpace< R, Q, P > &xspace)
Definition: SubspaceSolverLinEig.h:93
const Matrix< value_type > & solutions() const override
Access solutions from the last solve() call.
Definition: SubspaceSolverLinEig.h:123
bool m_hermitian
Definition: SubspaceSolverLinEig.h:152
size_t size() const override
Number of solutions.
Definition: SubspaceSolverLinEig.h:129
Verbosity
Different levels of logging.
Definition: Logger.h:29
Definition: PSpace.h:7
void solve_LinearEquations(std::vector< value_type > &solution, std::vector< value_type > &eigenvalues, const std::vector< value_type > &matrix, const std::vector< value_type > &metric, const std::vector< value_type > &rhs, size_t dimension, size_t nroot, real_type_t< value_type > augmented_hessian, real_type_t< value_type > svdThreshold, int verbosity)
Definition: helper-implementation.h:477
void eigenproblem(std::vector< value_type > &eigenvectors, std::vector< value_type > &eigenvalues, const std::vector< value_type > &matrix, const std::vector< value_type > &metric, size_t dimension, bool hermitian, real_type_t< value_type > svdThreshold, int verbosity)
Definition: helper-implementation.h:260
Manages solution of the subspace problem and storage of those solutions.
Definition: ISubspaceSolver.h:21
typename array::ArrayHandler< R, R >::value_type value_type
Definition: ISubspaceSolver.h:25
typename array::ArrayHandler< R, R >::value_type_abs value_type_abs
Definition: ISubspaceSolver.h:26
PT P
Definition: ISubspaceSolver.h:24
QT Q
Definition: ISubspaceSolver.h:23
RT R
Definition: ISubspaceSolver.h:22