iterative-solver 0.0
 
Loading...
Searching...
No Matches
OptimizeSD.h
1#ifndef LINEARALGEBRA_SRC_MOLPRO_LINALG_ITSOLV_OPTIMIZESD_H
2#define LINEARALGEBRA_SRC_MOLPRO_LINALG_ITSOLV_OPTIMIZESD_H
3#include <molpro/linalg/itsolv/CastOptions.h>
4#include <molpro/linalg/itsolv/DSpaceResetter.h>
5#include <molpro/linalg/itsolv/IterativeSolverTemplate.h>
6#include <molpro/linalg/itsolv/propose_rspace.h>
7#include <molpro/linalg/itsolv/subspace/SubspaceSolverOptSD.h>
8#include <molpro/linalg/itsolv/subspace/XSpace.h>
9
10namespace molpro::linalg::itsolv {
19template <class R, class Q = R, class P = std::map<size_t, typename R::value_type>>
20class OptimizeSD : public IterativeSolverTemplate<Optimize, R, Q, P> {
21public:
24 using typename SolverTemplate::scalar_type;
25 using typename SolverTemplate::value_type;
26 using typename SolverTemplate::value_type_abs;
28
29 explicit OptimizeSD(const std::shared_ptr<ArrayHandlers<R, Q, P>>& handlers,
30 const std::shared_ptr<Logger>& logger_ = std::make_shared<Logger>())
31 : SolverTemplate(std::make_shared<subspace::XSpace<R, Q, P>>(handlers, logger_),
32 std::static_pointer_cast<subspace::ISubspaceSolver<R, Q, P>>(
33 std::make_shared<subspace::SubspaceSolverOptSD<R, Q, P>>(logger_)),
35
36 bool nonlinear() const override { return true; }
37
38 size_t end_iteration(const VecRef<R>& parameters, const VecRef<R>& action) override {
39 this->m_end_iteration_needed = false;
40 this->solution_params(this->m_working_set, parameters);
41 if (this->m_errors.front() < this->m_convergence_threshold) {
42 this->m_working_set.clear();
43 return 0;
44 }
45 this->m_working_set.assign(1, 0);
46 this->m_handlers->rr().axpy(-1, action.front(), parameters.front());
47 this->m_stats->iterations++;
48 return 1;
49 }
50
51 size_t end_iteration(std::vector<R>& parameters, std::vector<R>& action) override {
52 auto result = end_iteration(wrap(parameters), wrap(action));
53 return result;
54 }
55
56 void set_value_errors() override {
57 auto& Value = this->m_xspace->data[subspace::EqnData::value];
58 this->m_value_errors.assign(1, std::numeric_limits<value_type_abs>::max());
59 // the objective is real, whatever the element type of the containers
60 if (this->m_xspace->size() > 1 and real_part(Value(0, 0)) < real_part(Value(1, 0)))
61 this->m_value_errors.front() = real_part(Value(1, 0)) - real_part(Value(0, 0));
62 }
63
64 void set_options(const Options& options) override {
66 if (auto opt2 = dynamic_cast<const molpro::linalg::itsolv::OptimizeSDOptions*>(&options)) {
68 }
69 }
70
71 std::shared_ptr<Options> get_options() const override {
72 auto opt = std::make_shared<OptimizeSDOptions>();
74 return opt;
75 }
76
77 void report(std::ostream& cout, bool endl = true) const override {
79 cout << ", value " << this->value();
80 if (endl)
81 cout << std::endl;
82 }
83
84 int add_vector(R& parameters, R& residual, value_type value) override {
85 using namespace subspace;
86 auto& xspace = this->m_xspace;
87 auto& xdata = xspace->data;
88 const auto n = this->m_xspace->dimensions().nX();
89 xdata[EqnData::value].resize({n + 1, 1});
90 xdata[EqnData::value](0, 0) = value;
92 return nwork;
93 }
94
95 size_t end_iteration(R& parameters, R& actions) override {
96 return end_iteration(wrap_arg(parameters), wrap_arg(actions));
97 }
98
99protected:
100 // for non-linear problems, actions already contains the residual
101 void construct_residual(const std::vector<int>& roots, const CVecRef<R>& params, const VecRef<R>& actions,
103};
104
105} // namespace molpro::linalg::itsolv
106#endif // LINEARALGEBRA_SRC_MOLPRO_LINALG_ITSOLV_OPTIMIZESD_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
std::vector< value_type_abs > m_value_errors
value errors from the most recent solution
Definition IterativeSolverTemplate.h:1213
void solution_params(const std::vector< int > &roots, std::vector< R > &parameters) override
Definition IterativeSolverTemplate.h:294
std::vector< int > m_working_set
indices of roots in the working set
Definition IterativeSolverTemplate.h:1214
scalar_type value() const override
Definition IterativeSolverTemplate.h:421
std::shared_ptr< subspace::IXSpace< R, Q, P > > m_xspace
manages the subspace and associated data
Definition IterativeSolverTemplate.h:1210
std::shared_ptr< ArrayHandlers< R, Q, P > > m_handlers
Array handlers.
Definition IterativeSolverTemplate.h:1209
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
bool m_end_iteration_needed
whether end_iteration should be called after any preconditioner
Definition IterativeSolverTemplate.h:1236
int add_vector(const VecRef< R > &parameters, const VecRef< R > &actions) override
Definition IterativeSolverTemplate.h:215
void report() const override
Definition IterativeSolverTemplate.h:384
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
A class that optimises a function using a simple steepest-descent method.
Definition OptimizeSD.h:20
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 OptimizeSD.h:101
size_t end_iteration(R &parameters, R &actions) override
Definition OptimizeSD.h:95
void report(std::ostream &cout, bool endl=true) const override
Definition OptimizeSD.h:77
bool nonlinear() const override
Definition OptimizeSD.h:36
size_t end_iteration(const VecRef< R > &parameters, const VecRef< R > &action) override
Definition OptimizeSD.h:38
void set_value_errors() override
Implementation class should overload this to set errors in the current values (e.g....
Definition OptimizeSD.h:56
size_t end_iteration(std::vector< R > &parameters, std::vector< R > &action) override
Definition OptimizeSD.h:51
int add_vector(R &parameters, R &residual, value_type value) override
Definition OptimizeSD.h:84
std::shared_ptr< Options > get_options() const override
Definition OptimizeSD.h:71
OptimizeSD(const std::shared_ptr< ArrayHandlers< R, Q, P > > &handlers, const std::shared_ptr< Logger > &logger_=std::make_shared< Logger >())
Definition OptimizeSD.h:29
void set_options(const Options &options) override
Definition OptimizeSD.h:64
Solves subspace problem for minimisation using the Steepest Descent algorithm.
Definition SubspaceSolverOptSD.h:16
4-parameter interpolation of a 1-dimensional function given two points for which function values and ...
Definition helper.h:14
auto wrap_arg(T &&arg, S &&... args) -> std::enable_if_t< std::conjunction_v< std::is_same< decay_t< T >, decay_t< S > >... >, VecRef< decay_t< T > > >
Constructs a vector of reference wrappers with provided arguments.
Definition wrap.h:135
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
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
real_type_t< T > real_part(const T &x)
The real part of a scalar; the value itself for a real type.
Definition scalar_traits.h:58
const std::shared_ptr< const molpro::Options > options()
Get the Options object associated with iterative-solver.
Definition linalg_options.cpp:4
static std::shared_ptr< OptimizeSDOptions > OptimizeSD(const std::shared_ptr< Options > &options)
Definition CastOptions.h:90
Allows setting and getting of options for OptimizeBFGS instance via IterativeSolver base class.
Definition OptimizeSDOptions.h:9
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