iterative-solver 0.0
 
Loading...
Searching...
No Matches
LinearEigensystemRSPT.h
1//
2// Created by Peter Knowles on 18/01/2021.
3//
4
5#ifndef LINEARALGEBRA_SRC_MOLPRO_LINALG_ITSOLV_SUBSPACE_LINEAREIGENSYSTEMRSPT_H_
6#define LINEARALGEBRA_SRC_MOLPRO_LINALG_ITSOLV_SUBSPACE_LINEAREIGENSYSTEMRSPT_H_
7
8#include <iterator>
9//#include <molpro/linalg/array/DistrArraySpan.h>
10#include <molpro/linalg/itsolv/CastOptions.h>
11#include <molpro/linalg/itsolv/DSpaceResetter.h>
12#include <molpro/linalg/itsolv/IterativeSolverTemplate.h>
13#include <molpro/linalg/itsolv/LinearEigensystemRSPTOptions.h>
14#include <molpro/linalg/itsolv/Logger.h>
15#include <molpro/linalg/itsolv/propose_rspace.h>
16#include <molpro/linalg/itsolv/subspace/SubspaceSolverRSPT.h>
17#include <molpro/linalg/itsolv/subspace/XSpace.h>
18
19namespace molpro::linalg::itsolv {
20
32template <class R, class Q = R, class P = std::map<size_t, typename R::value_type>>
33class LinearEigensystemRSPT : public IterativeSolverTemplate<LinearEigensystem, R, Q, P> {
34public:
36 using typename SolverTemplate::scalar_type;
37 using typename SolverTemplate::value_type_abs;
39
40 explicit LinearEigensystemRSPT(const std::shared_ptr<ArrayHandlers<R, Q, P>>& handlers,
41 const std::shared_ptr<Logger>& logger_ = std::make_shared<Logger>())
42 : SolverTemplate(std::make_shared<subspace::XSpace<R, Q, P>>(handlers, logger_),
43 std::static_pointer_cast<subspace::ISubspaceSolver<R, Q, P>>(
44 std::make_shared<subspace::SubspaceSolverRSPT<R, Q, P>>(logger_)),
46 // set_hermiticity(true);
47 auto xspace = std::dynamic_pointer_cast<subspace::XSpace<R, Q, P>>(this->m_xspace);
48 xspace->set_hermiticity(true);
49 auto subspace_solver = std::dynamic_pointer_cast<subspace::SubspaceSolverRSPT<R, Q, P>>(this->m_subspace_solver);
50 subspace_solver->set_hermiticity(true);
51 this->set_n_roots(1);
52 }
53
54 bool nonlinear() const override { return false; }
55
56 bool linearEigensystem() const override { return true; }
57
68 size_t end_iteration(const VecRef<R>& parameters, const VecRef<R>& action) override {
69 return end_iteration(parameters.front().get(), action.front().get());
70 }
71 size_t end_iteration(std::vector<R>& parameters, std::vector<R>& action) override {
72 return end_iteration(parameters.front(), action.front());
73 }
74 size_t end_iteration(R& parameters, R& actions) override {
75 auto n = this->m_xspace->size();
76 if (n == 1)
77 this->m_handlers->rr().fill(0, parameters);
78 else // parameters may have been overwritten since add_vector(), e.g. by solve()
79 this->solution_params(parameters);
80 this->m_handlers->rr().axpy(-1, actions, parameters);
81
82 this->m_stats->iterations++;
84 this->m_end_iteration_needed = false;
85 return this->m_errors.front() < this->m_convergence_threshold ? 0 : 1;
86 }
87
88 std::vector<scalar_type> eigenvalues() const override { return this->m_subspace_solver->eigenvalues(); }
89
90 virtual std::vector<scalar_type> working_set_eigenvalues() const override {
91 auto eval = std::vector<scalar_type>{};
92 for (auto i : this->working_set()) {
93 eval.emplace_back(this->m_subspace_solver->eigenvalues().at(i));
94 }
95 return eval;
96 }
97
98 // void set_value_errors() override {
99 // auto current_values = this->m_subspace_solver->eigenvalues();
100 // this->m_value_errors.assign(current_values.size(), std::numeric_limits<scalar_type>::max());
101 // for (size_t i = 0; i < std::min(m_last_values.size(), current_values.size()); i++)
102 // this->m_value_errors[i] = std::abs(current_values[i] - m_last_values[i]);
103 // if (!m_resetting_in_progress)
104 // m_last_values = current_values;
105 // }
106
107 void report(std::ostream& cout, bool endl = true) const override {
108 // SolverTemplate::report(cout);
109 // cout << "errors " << std::scientific;
110 // auto& err = this->m_errors;
111 // std::copy(begin(err), end(err), std::ostream_iterator<scalar_type>(cout, ", "));
112 // cout << std::endl;
113 // cout << "eigenvalues ";
114 // auto ev = eigenvalues();
116 cout << "Perturbed energies ";
117 cout << std::fixed << std::setprecision(8);
118 std::copy(begin(m_rspt_values), end(m_rspt_values), std::ostream_iterator<scalar_type>(cout, ", "));
119 if (endl)
120 cout << std::endl;
121 }
122
123 void set_hermiticity(bool hermitian) override {
124 // m_hermiticity = hermitian;
125 auto xspace = std::dynamic_pointer_cast<subspace::XSpace<R, Q, P>>(this->m_xspace);
126 xspace->set_hermiticity(hermitian);
127 auto subspace_solver = std::dynamic_pointer_cast<subspace::SubspaceSolverRSPT<R, Q, P>>(this->m_subspace_solver);
128 subspace_solver->set_hermiticity(hermitian);
129 }
130
131 bool get_hermiticity() const override { return true; }
132
133 void set_options(const Options& options) override {
136 if (opt.norm_thresh)
137 propose_rspace_norm_thresh = opt.norm_thresh.value();
138 if (opt.svd_thresh)
139 propose_rspace_svd_thresh = opt.svd_thresh.value();
140 }
141
142 std::shared_ptr<Options> get_options() const override {
143 auto opt = std::make_shared<LinearEigensystemRSPTOptions>();
145 opt->norm_thresh = propose_rspace_norm_thresh;
146 opt->svd_thresh = propose_rspace_svd_thresh;
147 return opt;
148 }
149
156protected:
157 // static std::string str(const array::DistrArraySpan& a) {
158 // std::vector<double> v(a.size());
159 // a.get(0, a.size(), v.data());
160 // return str(v);
161 // }
162 static std::string str(const std::vector<scalar_type>& a) {
163 std::string result;
164 for (const auto& e : a)
165 result += std::to_string(e) + " ";
166 return result;
167 }
168 void construct_residual(const std::vector<int>& roots, const CVecRef<R>& params, const VecRef<R>& actions,
170 auto prof = this->profiler()->push("itsolv::construct_residual");
171 auto xspace = std::dynamic_pointer_cast<subspace::XSpace<R, Q, P>>(this->m_xspace);
172 const auto& q = xspace->paramsq();
173 const auto& n = q.size();
174 const auto& c = params.back();
175 auto& hc = actions.back();
176 // molpro::cout << "construct_residual n=" << n << std::endl;
177 // molpro::cout << "construct_residual c=" << str(c) << std::endl;
178 // molpro::cout << "construct_residual hc=" << str(hc) << std::endl;
179 // for (auto i = 0; i < n; i++)
180 // molpro::cout << "construct_residual q[" << i << "].dot(c)=" << this->m_handlers->qr().dot(q.at(i), c)
181 // << std::endl;
182 // for (auto i = 0; i < n; i++)
183 // molpro::cout << "construct_residual q[" << i << "].dot(hc)=" << this->m_handlers->qr().dot(q.at(i), hc)
184 // << std::endl;
185 // q.at(k) holds psi(n-k-1)
186 if (n == 1)
187 m_rspt_values.assign(1, 0);
188 m_rspt_values.push_back(this->m_handlers->qr().dot(q.at(n - 1), hc));
189 // molpro::cout << "m_rspt_values[" << m_rspt_values.size() - 1 << "]=" << m_rspt_values.back() << std::endl;
190 // molpro::cout << "m_rspt_values " << str(m_rspt_values)<<std::endl;
191 this->m_handlers->rr().axpy(-m_rspt_values[0], c, hc);
192 for (size_t k = 0; k < n; k++) {
193 // molpro::cout << "axpy E[" << n - k << "] c[" << k << "]" << std::endl;
194 this->m_handlers->rq().axpy(-m_rspt_values[n - k], q.at(n - k - 1), hc);
195 }
196 }
197
198 std::vector<scalar_type> m_rspt_values;
199};
200
201} // namespace molpro::linalg::itsolv
202
203#endif // LINEARALGEBRA_SRC_MOLPRO_LINALG_ITSOLV_SUBSPACE_LINEAREIGENSYSTEMRSPT_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:187
void solution_params(const std::vector< int > &roots, std::vector< R > &parameters) override
Definition IterativeSolverTemplate.h:294
std::shared_ptr< subspace::IXSpace< R, Q, P > > m_xspace
manages the subspace and associated data
Definition IterativeSolverTemplate.h:1210
void set_n_roots(size_t roots) override
Definition IterativeSolverTemplate.h:318
std::shared_ptr< ArrayHandlers< R, Q, P > > m_handlers
Array handlers.
Definition IterativeSolverTemplate.h:1209
std::shared_ptr< subspace::ISubspaceSolver< R, Q, P > > m_subspace_solver
solves the subspace problem
Definition IterativeSolverTemplate.h:1211
std::vector< value_type_abs > m_errors
errors from the most recent solution
Definition IterativeSolverTemplate.h:1212
std::shared_ptr< Options > get_options() const override
Definition IterativeSolverTemplate.h:341
const std::shared_ptr< molpro::profiler::Profiler > & profiler() const override
Definition IterativeSolverTemplate.h:434
bool m_end_iteration_needed
whether end_iteration should be called after any preconditioner
Definition IterativeSolverTemplate.h:1236
void report() const override
Definition IterativeSolverTemplate.h:384
const std::vector< int > & working_set() const override
Definition IterativeSolverTemplate.h:314
void set_options(const Options &options) override
Definition IterativeSolverTemplate.h:324
std::shared_ptr< Statistics > m_stats
accumulates statistics of operations performed by the solver
Definition IterativeSolverTemplate.h:1219
value_type_abs m_convergence_threshold
residual norms less than this mark a converged solution
Definition IterativeSolverTemplate.h:1216
One specific implementation of LinearEigensystem using Davidson's algorithm with modifications to man...
Definition LinearEigensystemRSPT.h:33
void set_hermiticity(bool hermitian) override
Definition LinearEigensystemRSPT.h:123
void construct_residual(const std::vector< int > &roots, const CVecRef< R > &params, const VecRef< R > &actions, const detail::MetricSolutions< R, Q > &metric_solutions) override
Constructs residual for given roots provided their parameters and actions.
Definition LinearEigensystemRSPT.h:168
std::shared_ptr< Options > get_options() const override
Definition LinearEigensystemRSPT.h:142
void set_options(const Options &options) override
Definition LinearEigensystemRSPT.h:133
bool get_hermiticity() const override
Definition LinearEigensystemRSPT.h:131
size_t end_iteration(std::vector< R > &parameters, std::vector< R > &action) override
Definition LinearEigensystemRSPT.h:71
bool linearEigensystem() const override
Definition LinearEigensystemRSPT.h:56
value_type_abs propose_rspace_svd_thresh
Definition LinearEigensystemRSPT.h:152
void report(std::ostream &cout, bool endl=true) const override
Definition LinearEigensystemRSPT.h:107
std::vector< scalar_type > eigenvalues() const override
Definition LinearEigensystemRSPT.h:88
bool nonlinear() const override
Definition LinearEigensystemRSPT.h:54
static std::string str(const std::vector< scalar_type > &a)
Definition LinearEigensystemRSPT.h:162
size_t end_iteration(const VecRef< R > &parameters, const VecRef< R > &action) override
constructs next perturbed wavefunction
Definition LinearEigensystemRSPT.h:68
value_type_abs propose_rspace_norm_thresh
vectors with norm less than threshold can be considered null (rescaled to the working precision)
Definition LinearEigensystemRSPT.h:151
virtual std::vector< scalar_type > working_set_eigenvalues() const override
Definition LinearEigensystemRSPT.h:90
size_t end_iteration(R &parameters, R &actions) override
Definition LinearEigensystemRSPT.h:74
LinearEigensystemRSPT(const std::shared_ptr< ArrayHandlers< R, Q, P > > &handlers, const std::shared_ptr< Logger > &logger_=std::make_shared< Logger >())
Definition LinearEigensystemRSPT.h:40
std::vector< scalar_type > m_rspt_values
perturbation series for the eigenvalue
Definition LinearEigensystemRSPT.h:198
Interface for a specific iterative solver, it can add special member functions or variables.
Definition IterativeSolver.h:770
Restores the format flags and precision of a stream when it goes out of scope.
Definition util.h:156
4-parameter interpolation of a 1-dimensional function given two points for which function values and ...
Definition helper.h:14
std::unique_ptr< LinearEigensystem< R, Q, P > > create_LinearEigensystem(const LinearEigensystemOptions &options, const std::shared_ptr< ArrayHandlers< R, Q, P > > &handlers=std::make_shared< molpro::linalg::itsolv::ArrayHandlers< R, Q, P > >())
Definition SolverFactory.h:111
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 linalg_options.cpp:4
static const LinearEigensystemRSPTOptions & LinearEigensystemRSPT(const Options &options)
Definition CastOptions.h:45
Access point for different options in iterative solvers.
Definition Options.h:20
Information about performance of IterativeSolver instance.
Definition Statistics.h:10
The actions of a metric applied on the fly on solutions, in R vectors or, if there are not enough of ...
Definition IterativeSolverTemplate.h:40