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
8
12template <class RT, class QT, class PT>
13class SubspaceSolverLinEig : public ISubspaceSolver<RT, QT, PT> {
14public:
20
21 explicit SubspaceSolverLinEig(std::shared_ptr<Logger> logger) : m_logger(std::move(logger)) {}
22
23 void solve(IXSpace<R, Q, P>& xspace, const size_t nroots_max) override {
24 m_logger->msg("SubspaceSolverLinEig::solve", Logger::Trace);
25 if (xspace.data.find(EqnData::rhs) == xspace.data.end() || xspace.data[EqnData::rhs].empty()) {
26 solve_eigenvalue(xspace, nroots_max);
27 } else {
29 }
30 }
31
32protected:
33 void solve_eigenvalue(IXSpace<R, Q, P>& xspace, const size_t nroots_max) {
34 m_logger->msg("SubspaceSolverLinEig::solve_eigenvalue", Logger::Trace);
35 auto h = xspace.data[EqnData::H];
36 auto s = xspace.data[EqnData::S];
37 if (m_logger->data_dump) {
38 m_logger->msg("S = " + as_string(s), Logger::Info);
39 m_logger->msg("H = " + as_string(h, 15), Logger::Info);
40 }
41 auto dim = h.rows();
42 auto evec = std::vector<value_type>{};
43 int verbosity = m_logger->max_trace_level == Logger::Info ? 3 : 0;
44 itsolv::eigenproblem(evec, m_eigenvalues, h.data(), s.data(), dim, m_hermitian, m_svd_solver_threshold, verbosity,
45 true);
46 size_t n_solutions = 0;
47 if (dim)
48 n_solutions = evec.size() / dim;
49 auto full_matrix = Matrix<value_type>{std::move(evec), {n_solutions, dim}};
50 auto nroots = std::min(nroots_max, n_solutions);
51 m_eigenvalues.resize(nroots);
52 m_solutions.resize({nroots, dim});
53 m_solutions.slice() = full_matrix.slice({0, 0}, {nroots, dim});
54 m_errors.assign(size(), std::numeric_limits<value_type_abs>::max());
55 if (m_logger->data_dump) {
56 m_logger->msg("eigenvalues = ", begin(m_eigenvalues), end(m_eigenvalues), Logger::Debug, 10);
57 m_logger->msg("eigenvectors = " + as_string(m_solutions), Logger::Info);
58 }
59 }
60
62 m_logger->msg("SubspaceSolverLinEig::solve_linear_equations", Logger::Trace);
63 auto h = xspace.data[EqnData::H];
64 auto s = xspace.data[EqnData::S];
65 auto rhs = xspace.data[EqnData::rhs];
66 if (m_logger->data_dump) {
67 m_logger->msg("S = " + as_string(s, 15), Logger::Info);
68 m_logger->msg("H = " + as_string(h, 15), Logger::Info);
69 m_logger->msg("rhs = " + as_string(rhs, 15), Logger::Info);
70 }
71 const auto dim = h.rows();
72 const auto n_solutions = rhs.cols();
73 auto solution = std::vector<value_type>{};
74 m_eigenvalues.assign(n_solutions, 0);
75 int verbosity = m_logger->max_trace_level == Logger::Info ? 3 : 0;
76 itsolv::solve_LinearEquations(solution, m_eigenvalues, h.data(), s.data(), rhs.data(), dim, n_solutions,
78 m_solutions = Matrix<value_type>{std::move(solution), {n_solutions, dim}};
79 m_errors.assign(size(), std::numeric_limits<value_type_abs>::max());
80 if (m_logger->data_dump) {
81 m_logger->msg("eigenvalues = ", begin(m_eigenvalues), end(m_eigenvalues), Logger::Debug, 10);
82 m_logger->msg("solutions = " + as_string(m_solutions), Logger::Info);
83 }
84 }
85
86public:
88 void set_error(int root, value_type_abs error) override { m_errors.at(root) = error; }
89 void set_error(const std::vector<int>& roots, const std::vector<value_type_abs>& errors) override {
90 for (size_t i = 0; i < roots.size(); ++i)
91 set_error(roots[i], errors[i]);
92 }
93
94 const Matrix<value_type>& solutions() const override { return m_solutions; }
95 const std::vector<value_type>& eigenvalues() const override { return m_eigenvalues; }
96 const std::vector<value_type_abs>& errors() const override { return m_errors; }
97
99 size_t size() const override { return m_solutions.rows(); }
100
101 // FIXME What difference does it make?
103 void set_hermiticity(bool hermitian) { m_hermitian = hermitian; }
104 bool get_hermiticity() { return m_hermitian; }
106 void set_augmented_hessian(double parameter) { m_augmented_hessian = parameter; }
108
109protected:
111 std::vector<value_type> m_eigenvalues;
112 std::vector<value_type_abs> m_errors;
113 std::shared_ptr<Logger> m_logger{};
114
115public:
117protected:
118 bool m_hermitian = false;
120};
121
122} // namespace molpro::linalg::itsolv::subspace
123
124#endif // LINEARALGEBRA_SRC_MOLPRO_LINALG_ITSOLV_SUBSPACE_SUBSPACESOLVERLINEIG_H
SubspaceData data
Equation data in the subspace.
Definition: IXSpace.h:22
Slice slice(coord_type upper_left, coord_type bottom_right)
Access a rectangular slice of the matrix.
Definition: Matrix.h:97
void resize(const coord_type &dims)
Resize the matrix. The old data is preserved and any new rows/cols are zeroed.
Definition: Matrix.h:126
index_type rows() const
Definition: Matrix.h:165
Solves subspace problem for linear eigenvalues and system of linear equations.
Definition: SubspaceSolverLinEig.h:13
std::vector< value_type_abs > m_errors
errors in subspace solutions
Definition: SubspaceSolverLinEig.h:112
typename ISubspaceSolver< RT, QT, PT >::value_type_abs value_type_abs
Definition: SubspaceSolverLinEig.h:16
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:89
double get_augmented_hessian()
Definition: SubspaceSolverLinEig.h:107
void set_error(int root, value_type_abs error) override
Set error value for solution root
Definition: SubspaceSolverLinEig.h:88
void solve_eigenvalue(IXSpace< R, Q, P > &xspace, const size_t nroots_max)
Definition: SubspaceSolverLinEig.h:33
value_type_abs m_svd_solver_threshold
threshold to select null space during SVD in eigenproblem
Definition: SubspaceSolverLinEig.h:116
std::vector< value_type > m_eigenvalues
eigenvalues
Definition: SubspaceSolverLinEig.h:111
bool get_hermiticity()
Definition: SubspaceSolverLinEig.h:104
Matrix< value_type > m_solutions
solution matrix with row vectors
Definition: SubspaceSolverLinEig.h:110
std::shared_ptr< Logger > m_logger
Definition: SubspaceSolverLinEig.h:113
const std::vector< value_type > & eigenvalues() const override
Access eigenvalues from the last solve() call.
Definition: SubspaceSolverLinEig.h:95
void set_augmented_hessian(double parameter)
Set value of augmented hessian parameter. If 0, than augmented Hessian is not used.
Definition: SubspaceSolverLinEig.h:106
void solve(IXSpace< R, Q, P > &xspace, const size_t nroots_max) override
Solve the subspace problem.
Definition: SubspaceSolverLinEig.h:23
void set_hermiticity(bool hermitian)
Set Hermiticity of the subspace.
Definition: SubspaceSolverLinEig.h:103
const std::vector< value_type_abs > & errors() const override
Access errors corresponding to each solution.
Definition: SubspaceSolverLinEig.h:96
double m_augmented_hessian
value of augmented hessian parameter. If 0, than augmented Hessian is not used
Definition: SubspaceSolverLinEig.h:119
SubspaceSolverLinEig(std::shared_ptr< Logger > logger)
Definition: SubspaceSolverLinEig.h:21
void solve_linear_equations(IXSpace< R, Q, P > &xspace)
Definition: SubspaceSolverLinEig.h:61
const Matrix< value_type > & solutions() const override
Access solutions from the last solve() call.
Definition: SubspaceSolverLinEig.h:94
bool m_hermitian
flags the matrix as Hermitian
Definition: SubspaceSolverLinEig.h:118
size_t size() const override
Number of solutions.
Definition: SubspaceSolverLinEig.h:99
Definition: PSpace.h:7
std::string as_string(const Mat &m, int precision=6)
Definition: Matrix.h:289
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, double augmented_hessian, double svdThreshold, int verbosity)
Definition: helper-implementation.h:546
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, double svdThreshold, int verbosity, bool condone_complex)
Definition: helper-implementation.h:312
@ Info
Definition: Logger.h:49
@ Trace
Definition: Logger.h:49
@ Debug
Definition: Logger.h:49
Manages solution of the subspace problem and storage of those solutions.
Definition: ISubspaceSolver.h:15
typename array::ArrayHandler< R, R >::value_type value_type
Definition: ISubspaceSolver.h:19
typename array::ArrayHandler< R, R >::value_type_abs value_type_abs
Definition: ISubspaceSolver.h:20
PT P
Definition: ISubspaceSolver.h:18
QT Q
Definition: ISubspaceSolver.h:17
RT R
Definition: ISubspaceSolver.h:16