iterative-solver 0.0
LinearEigensystemDavidson.h
1#ifndef LINEARALGEBRA_SRC_MOLPRO_LINALG_ITSOLV_LINEAREIGENSYSTEMDAVIDSON_H
2#define LINEARALGEBRA_SRC_MOLPRO_LINALG_ITSOLV_LINEAREIGENSYSTEMDAVIDSON_H
3#include <iterator>
4#include <map>
5#include <molpro/Profiler.h>
6#include <molpro/linalg/itsolv/CastOptions.h>
7#include <molpro/linalg/itsolv/DSpaceResetter.h>
8#include <molpro/linalg/itsolv/IterativeSolverTemplate.h>
9#include <molpro/linalg/itsolv/Logger.h>
10#include <molpro/linalg/itsolv/propose_rspace.h>
11#include <molpro/linalg/itsolv/subspace/SubspaceSolverLinEig.h>
12#include <molpro/linalg/itsolv/subspace/XSpace.h>
13
14namespace molpro::linalg::itsolv {
15
27template <class R, class Q = R, class P = std::map<size_t, typename R::value_type>>
28class LinearEigensystemDavidson : public IterativeSolverTemplate<LinearEigensystem, R, Q, P> {
29public:
31 using typename SolverTemplate::scalar_type;
33
34 explicit LinearEigensystemDavidson(const std::shared_ptr<ArrayHandlers<R, Q, P>>& handlers=std::make_shared<molpro::linalg::itsolv::ArrayHandlers<R, Q, P>>(),
35 const std::shared_ptr<Logger>& logger_ = std::make_shared<Logger>())
36 : SolverTemplate(std::make_shared<subspace::XSpace<R, Q, P>>(handlers, logger_),
37 std::static_pointer_cast<subspace::ISubspaceSolver<R, Q, P>>(
38 std::make_shared<subspace::SubspaceSolverLinEig<R, Q, P>>(logger_)),
39 handlers, std::make_shared<Statistics>(), logger_),
40 logger(logger_) {
42 this->m_normalise_solution = false;
43 }
44
45 bool nonlinear() const override { return false; }
46
63 size_t end_iteration(const VecRef<R>& parameters, const VecRef<R>& action) override {
64 auto prof = this->profiler();
65 auto m_prof = prof->push("itsolv::end_iteration");
66 if (m_dspace_resetter.do_reset(this->m_stats->iterations, this->m_xspace->dimensions())) {
68 this->m_working_set = m_dspace_resetter.run(parameters, *this->m_xspace, this->m_subspace_solver->solutions(),
70 *this->m_handlers, *this->m_logger);
71 } else {
73 prof->start("end_iteration (propose_rspace)");
75 *this, parameters, action, *this->m_xspace, *this->m_subspace_solver, *this->m_handlers, *this->m_logger,
77 prof->stop();
78 }
79 this->m_stats->iterations++;
81 this->m_end_iteration_needed = false;
82 return this->working_set().size();
83 }
84 size_t end_iteration(std::vector<R>& parameters, std::vector<R>& action) override {
85 return end_iteration(wrap(parameters), wrap(action));
86 }
87 size_t end_iteration(R& parameters, R& actions) override {
88 auto wparams = std::vector<std::reference_wrapper<R>>{std::ref(parameters)};
89 auto wactions = std::vector<std::reference_wrapper<R>>{std::ref(actions)};
90 return end_iteration(wparams, wactions);
91 }
92
94 void precondition(std::vector<R>& parameters, std::vector<R>& action) const {}
95
96 std::vector<scalar_type> eigenvalues() const override { return this->m_subspace_solver->eigenvalues(); }
97
98 virtual std::vector<scalar_type> working_set_eigenvalues() const override {
99 auto eval = std::vector<scalar_type>{};
100 for (auto i : this->working_set()) {
101 eval.emplace_back(this->m_subspace_solver->eigenvalues().at(i));
102 }
103 return eval;
104 }
105
106 void set_value_errors() override {
107 auto current_values = this->m_subspace_solver->eigenvalues();
108 this->m_value_errors.assign(current_values.size(), std::numeric_limits<scalar_type>::max());
109 for (size_t i = 0; i < std::min(m_last_values.size(), current_values.size()); i++)
110 this->m_value_errors[i] = std::abs(current_values[i] - m_last_values[i]);
112 m_last_values = current_values;
113 }
114
115 void report(std::ostream& cout, bool endl = true) const override {
117 cout << "errors " << std::scientific;
118 auto& err = this->m_errors;
119 std::copy(begin(err), end(err), std::ostream_iterator<scalar_type>(molpro::cout, ", "));
120 cout << std::endl;
121 cout << "eigenvalues ";
122 auto ev = eigenvalues();
123 cout << std::fixed << std::setprecision(14);
124 std::copy(begin(ev), end(ev), std::ostream_iterator<scalar_type>(molpro::cout, ", "));
125 cout << std::defaultfloat;
126 if (endl)
127 cout << std::endl;
128 }
129
131 void set_reset_D(size_t n) { m_dspace_resetter.set_nreset(n); }
132 size_t get_reset_D() const { return m_dspace_resetter.get_nreset(); }
134 void set_reset_D_maxQ_size(size_t n) { m_dspace_resetter.set_max_Qsize(n); }
135 int get_reset_D_maxQ_size() const { return m_dspace_resetter.get_max_Qsize(); }
139 if (m_dspace_resetter.get_max_Qsize() > m_max_size_qspace)
141 }
142 void set_hermiticity(bool hermitian) override {
143 m_hermiticity = hermitian;
144 auto xspace = std::dynamic_pointer_cast<subspace::XSpace<R, Q, P>>(this->m_xspace);
145 xspace->set_hermiticity(hermitian);
146 auto subspace_solver = std::dynamic_pointer_cast<subspace::SubspaceSolverLinEig<R, Q, P>>(this->m_subspace_solver);
147 subspace_solver->set_hermiticity(hermitian);
148 }
149 bool get_hermiticity() const override { return m_hermiticity; }
150
151 void set_options(const Options& options) override {
154 if (opt.reset_D)
155 set_reset_D(opt.reset_D.value());
156 if (opt.reset_D_max_Q_size)
157 set_reset_D_maxQ_size(opt.reset_D_max_Q_size.value());
158 if (opt.max_size_qspace)
159 set_max_size_qspace(opt.max_size_qspace.value());
160 if (opt.norm_thresh)
161 propose_rspace_norm_thresh = opt.norm_thresh.value();
162 if (opt.svd_thresh)
163 propose_rspace_svd_thresh = opt.svd_thresh.value();
164 if (opt.hermiticity)
165 set_hermiticity(opt.hermiticity.value());
166 }
167
168 std::shared_ptr<Options> get_options() const override {
169 auto opt = std::make_shared<LinearEigensystemDavidsonOptions>();
170 opt->copy(*SolverTemplate::get_options());
171 opt->reset_D = get_reset_D();
172 opt->reset_D_max_Q_size = get_reset_D_maxQ_size();
173 opt->max_size_qspace = get_max_size_qspace();
174 opt->norm_thresh = propose_rspace_norm_thresh;
175 opt->svd_thresh = propose_rspace_svd_thresh;
176 opt->hermiticity = get_hermiticity();
177 return opt;
178 }
179
180 std::shared_ptr<Logger> logger;
185protected:
186 void construct_residual(const std::vector<int>& roots, const CVecRef<R>& params, const VecRef<R>& actions) override {
187 auto prof = this->profiler()->push("itsolv::construct_residual");
188 assert(params.size() >= roots.size());
189 const auto& eigvals = eigenvalues();
190 for (size_t i = 0; i < roots.size(); ++i)
191 this->m_handlers->rr().axpy(-eigvals.at(roots[i]), params.at(i), actions.at(i));
192 }
193
194 int m_max_size_qspace = std::numeric_limits<int>::max();
196 bool m_hermiticity = false;
197 std::vector<double> m_last_values;
199};
200
201} // namespace molpro::linalg::itsolv
202
203#endif // LINEARALGEBRA_SRC_MOLPRO_LINALG_ITSOLV_LINEAREIGENSYSTEMDAVIDSON_H
Class, containing a collection of array handlers used in IterativeSolver Provides a Builder sub-class...
Definition: ArrayHandlers.h:25
Implements IterativeSolver interface that is common to all solvers.
Definition: IterativeSolverTemplate.h:127
std::vector< int > m_working_set
indices of roots in the working set
Definition: IterativeSolverTemplate.h:583
std::shared_ptr< subspace::IXSpace< R, R, std::map< size_t, typename R::value_type > > > m_xspace
manages the subspace and associated data
Definition: IterativeSolverTemplate.h:579
std::shared_ptr< ArrayHandlers< R, R, std::map< size_t, typename R::value_type > > > m_handlers
Array handlers.
Definition: IterativeSolverTemplate.h:578
std::shared_ptr< subspace::ISubspaceSolver< R, R, std::map< size_t, typename R::value_type > > > m_subspace_solver
solves the subspace problem
Definition: IterativeSolverTemplate.h:580
std::shared_ptr< Options > get_options() const override
Definition: IterativeSolverTemplate.h:262
const std::shared_ptr< molpro::profiler::Profiler > & profiler() const override
Definition: IterativeSolverTemplate.h:320
bool m_end_iteration_needed
whether end_iteration should be called after any preconditioner
Definition: IterativeSolverTemplate.h:600
void report() const override
Writes a report to std::cout.
Definition: IterativeSolverTemplate.h:287
bool m_normalise_solution
whether to normalise the solutions
Definition: IterativeSolverTemplate.h:590
const std::vector< int > & working_set() const override
Working set of roots that are not yet converged.
Definition: IterativeSolverTemplate.h:243
void set_options(const Options &options) override
Definition: IterativeSolverTemplate.h:253
std::vector< double > m_errors
errors from the most recent solution
Definition: IterativeSolverTemplate.h:581
std::shared_ptr< Statistics > m_stats
accumulates statistics of operations performed by the solver
Definition: IterativeSolverTemplate.h:588
std::vector< double > m_value_errors
value errors from the most recent solution
Definition: IterativeSolverTemplate.h:582
One specific implementation of LinearEigensystem using Davidson's algorithm with modifications to man...
Definition: LinearEigensystemDavidson.h:28
int get_max_size_qspace() const
Definition: LinearEigensystemDavidson.h:136
int get_reset_D_maxQ_size() const
Definition: LinearEigensystemDavidson.h:135
size_t end_iteration(const VecRef< R > &parameters, const VecRef< R > &action) override
Proposes new parameters for the subspace from the preconditioned residuals.
Definition: LinearEigensystemDavidson.h:63
void set_reset_D_maxQ_size(size_t n)
Set the maximum size of Q space after resetting the D space.
Definition: LinearEigensystemDavidson.h:134
bool nonlinear() const override
Report whether the class is a non-linear solver.
Definition: LinearEigensystemDavidson.h:45
std::vector< double > m_last_values
The values from the previous iteration.
Definition: LinearEigensystemDavidson.h:197
void set_hermiticity(bool hermitian) override
Sets hermiticity of kernel.
Definition: LinearEigensystemDavidson.h:142
std::shared_ptr< Logger > logger
Definition: LinearEigensystemDavidson.h:180
bool get_hermiticity() const override
Gets hermiticity of kernel, if true than it is hermitian, otherwise it is not.
Definition: LinearEigensystemDavidson.h:149
double propose_rspace_svd_thresh
Definition: LinearEigensystemDavidson.h:182
int m_max_size_qspace
maximum size of Q space
Definition: LinearEigensystemDavidson.h:194
bool m_resetting_in_progress
whether D space resetting is in progress
Definition: LinearEigensystemDavidson.h:198
detail::DSpaceResetter< Q > m_dspace_resetter
resets D space
Definition: LinearEigensystemDavidson.h:195
std::vector< scalar_type > eigenvalues() const override
The calculated eigenvalues of the subspace matrix.
Definition: LinearEigensystemDavidson.h:96
void set_max_size_qspace(int n)
Definition: LinearEigensystemDavidson.h:137
size_t end_iteration(std::vector< R > &parameters, std::vector< R > &action) override
Definition: LinearEigensystemDavidson.h:84
void precondition(std::vector< R > &parameters, std::vector< R > &action) const
Applies the Davidson preconditioner.
Definition: LinearEigensystemDavidson.h:94
void set_value_errors() override
Implementation class should overload this to set errors in the current values (e.g....
Definition: LinearEigensystemDavidson.h:106
size_t get_reset_D() const
Definition: LinearEigensystemDavidson.h:132
bool m_hermiticity
whether the problem is hermitian or not
Definition: LinearEigensystemDavidson.h:196
void set_options(const Options &options) override
Definition: LinearEigensystemDavidson.h:151
void set_reset_D(size_t n)
Set the period in iterations for resetting the D space.
Definition: LinearEigensystemDavidson.h:131
double propose_rspace_norm_thresh
vectors with norm less than threshold can be considered null.
Definition: LinearEigensystemDavidson.h:181
void report(std::ostream &cout, bool endl=true) const override
Writes a report to cout output stream.
Definition: LinearEigensystemDavidson.h:115
void construct_residual(const std::vector< int > &roots, const CVecRef< R > &params, const VecRef< R > &actions) override
Constructs residual for given roots provided their parameters and actions.
Definition: LinearEigensystemDavidson.h:186
virtual std::vector< scalar_type > working_set_eigenvalues() const override
Definition: LinearEigensystemDavidson.h:98
LinearEigensystemDavidson(const std::shared_ptr< ArrayHandlers< R, Q, P > > &handlers=std::make_shared< molpro::linalg::itsolv::ArrayHandlers< R, Q, P > >(), const std::shared_ptr< Logger > &logger_=std::make_shared< Logger >())
Definition: LinearEigensystemDavidson.h:34
std::shared_ptr< Options > get_options() const override
Definition: LinearEigensystemDavidson.h:168
size_t end_iteration(R &parameters, R &actions) override
Definition: LinearEigensystemDavidson.h:87
Interface for a specific iterative solver, it can add special member functions or variables.
Definition: IterativeSolver.h:401
Resets D space constructing full solutions as the new working set, removing instabilities from Q spac...
Definition: DSpaceResetter.h:70
auto propose_rspace(IterativeSolver< R, Q, P > &solver, const VecRef< R > &parameters, const VecRef< R > &residuals, subspace::IXSpace< R, Q, P > &xspace, subspace::ISubspaceSolver< R, Q, P > &subspace_solver, ArrayHandlers< R, Q, P > &handlers, Logger &logger, value_type_abs svd_thresh, value_type_abs res_norm_thresh, int max_size_qspace, molpro::profiler::Profiler &profiler)
Proposes new parameters for the subspace from the preconditioned residuals.
Definition: propose_rspace.h:554
4-parameter interpolation of a 1-dimensional function given two points for which function values and ...
Definition: helper.h:10
auto wrap(ForwardIt begin, ForwardIt end)
Takes a begin and end iterators and returns a vector of references to each element.
Definition: wrap.h:32
std::vector< std::reference_wrapper< const A > > CVecRef
Definition: wrap.h:14
std::vector< std::reference_wrapper< A > > VecRef
Definition: wrap.h:11
void read_handler_counts(std::shared_ptr< Statistics > stats, std::shared_ptr< ArrayHandlers< R, Q, P > > handlers)
Definition: Statistics.h:30
const std::shared_ptr< const molpro::Options > options()
Get the Options object associated with iterative-solver.
Definition: options.cpp:4
static std::shared_ptr< LinearEigensystemDavidsonOptions > LinearEigensystem(const std::shared_ptr< Options > &options)
Definition: CastOptions.h:39
Access point for different options in iterative solvers.
Definition: Options.h:20
Information about performance of IterativeSolver instance.
Definition: Statistics.h:10