iterative-solver 0.0
SolverFactory.h
1#ifndef LINEARALGEBRA_SRC_MOLPRO_LINALG_ITSOLV_SOLVERFACTORY_H
2#define LINEARALGEBRA_SRC_MOLPRO_LINALG_ITSOLV_SOLVERFACTORY_H
3#include <memory>
4
5#include "LinearEigensystemDavidsonOptions.h"
6#include "LinearEigensystemRSPTOptions.h"
7#include "LinearEquationsDavidsonOptions.h"
8#include "OptimizeBFGSOptions.h"
9#include "OptimizeSDOptions.h"
10#include "util.h"
11#include <molpro/linalg/itsolv/ArrayHandlers.h>
12#include <molpro/linalg/itsolv/IterativeSolver.h>
13#include <molpro/linalg/itsolv/NonLinearEquationsDIISOptions.h>
14#include <molpro/linalg/itsolv/options_map.h>
15
16namespace molpro::linalg::itsolv {
73template <class R, class Q = R, class P = std::map<size_t, typename R::value_type>>
75public:
76 virtual ~SolverFactory() = default;
77 virtual std::unique_ptr<IterativeSolver<R, Q, P>> create(const Options& options,
78 const std::shared_ptr<ArrayHandlers<R, Q, P>>& handlers);
79
80 virtual std::unique_ptr<LinearEigensystem<R, Q, P>>
82 const std::shared_ptr<ArrayHandlers<R, Q, P>>& handlers =
84
85 virtual std::unique_ptr<LinearEquations<R, Q, P>>
86 create(const LinearEquationsOptions& options, const std::shared_ptr<ArrayHandlers<R, Q, P>>& handlers =
88
89 virtual std::unique_ptr<NonLinearEquations<R, Q, P>>
91 const std::shared_ptr<ArrayHandlers<R, Q, P>>& handlers =
92 std::make_shared<molpro::linalg::itsolv::ArrayHandlers<R, Q, P>>());
93
94 virtual std::unique_ptr<Optimize<R, Q, P>>
96 const std::shared_ptr<ArrayHandlers<R, Q, P>>& handlers =
97 std::make_shared<molpro::linalg::itsolv::ArrayHandlers<R, Q, P>>());
98
99 virtual std::unique_ptr<IterativeSolver<R, Q, P>>
100 create(const std::string& method, const options_map& options,
101 const std::shared_ptr<ArrayHandlers<R, Q, P>>& handlers =
103};
104
105// free-function factory invocation
106template <class R, class Q = R, class P = std::map<size_t, typename R::value_type>>
107std::unique_ptr<LinearEigensystem<R, Q, P>>
109 const std::shared_ptr<ArrayHandlers<R, Q, P>>& handlers =
111 return SolverFactory<R, Q, P>{}.create(options, handlers);
112}
113
114template <class R, class Q = R, class P = std::map<size_t, typename R::value_type>>
115std::unique_ptr<LinearEigensystem<R, Q, P>>
116create_LinearEigensystem(const std::string& method = "Davidson", const std::string& options = "",
117 const std::shared_ptr<ArrayHandlers<R, Q, P>>& handlers =
120 if (method == "Davidson" or method.empty())
121 return SolverFactory<R, Q, P>{}.create(LinearEigensystemDavidsonOptions{optionsmap}, handlers);
122 if (method == "RSPT")
123 return SolverFactory<R, Q, P>{}.create(LinearEigensystemRSPTOptions{optionsmap}, handlers);
124 throw std::runtime_error("Unimplemented method " + method);
125}
126
127template <class R, class Q = R, class P = std::map<size_t, typename R::value_type>>
128std::unique_ptr<LinearEquations<R, Q, P>>
130 const std::shared_ptr<ArrayHandlers<R, Q, P>>& handlers =
132 return SolverFactory<R, Q, P>{}.create(options, handlers);
133}
134
135template <class R, class Q = R, class P = std::map<size_t, typename R::value_type>>
136std::unique_ptr<LinearEquations<R, Q, P>>
137create_LinearEquations(const std::string& method = "Davidson", const std::string& options = "",
138 const std::shared_ptr<ArrayHandlers<R, Q, P>>& handlers =
141 if (method == "Davidson" or method.empty())
142 return SolverFactory<R, Q, P>{}.create(LinearEquationsDavidsonOptions{optionsmap}, handlers);
143 throw std::runtime_error("Unimplemented method " + method);
144}
145
146template <class R, class Q = R, class P = std::map<size_t, typename R::value_type>>
147std::tuple<bool, std::unique_ptr<LinearEquations<R, Q, P>>>
148Solve_LinearEquations(const VecRef<R>& parameters, const VecRef<R>& actions, const Problem<R>& problem,
149 int verbosity = 0, bool generate_initial_guess = true, const std::string& method = "Davidson",
150 const std::string& options = "",
151 const std::shared_ptr<ArrayHandlers<R, Q, P>>& handlers =
153 auto solver = create_LinearEquations<R, Q, P>(method, options, handlers);
154 solver->set_verbosity(verbosity);
155 auto success = solver->solve(parameters, actions, problem, generate_initial_guess);
156// if (success)
157// solver->solution(parameters, actions);
158 return std::make_tuple<bool, std::unique_ptr<LinearEquations<R, Q, P>>>(std::move(success), std::move(solver));
159}
160
161template <class R, class Q = R, class P = std::map<size_t, typename R::value_type>>
162std::tuple<bool, std::unique_ptr<LinearEquations<R, Q, P>>>
163Solve_LinearEquations(std::vector<R>& parameters, std::vector<R>& actions, const Problem<R>& problem, int verbosity = 0,
164 bool generate_initial_guess = true, const std::string& method = "Davidson",
165 const std::string& options = "",
166 const std::shared_ptr<ArrayHandlers<R, Q, P>>& handlers =
168 return Solve_LinearEquations<R, Q, P>(wrap(parameters), wrap(actions), problem, verbosity, generate_initial_guess,
169 method, options, handlers);
170}
171
172template <class R, class Q = R, class P = std::map<size_t, typename R::value_type>>
173auto Solve_LinearEquations(R& parameters, R& actions, const Problem<R>& problem, int verbosity = 0,
174 bool generate_initial_guess = true, const std::string& method = "Davidson",
175 const std::string& options = "",
176 const std::shared_ptr<ArrayHandlers<R, Q, P>>& handlers =
178 return Solve_LinearEquations<R, Q, P>(std::vector<std::reference_wrapper<R>>{std::ref(parameters)},
179 std::vector<std::reference_wrapper<R>>{std::ref(actions)}, problem, verbosity,
180 generate_initial_guess, method, options, handlers);
181}
182
183template <class R, class Q = R, class P = std::map<size_t, typename R::value_type>>
184std::unique_ptr<NonLinearEquations<R, Q, P>>
186 const std::shared_ptr<ArrayHandlers<R, Q, P>>& handlers =
187 std::make_shared<molpro::linalg::itsolv::ArrayHandlers<R, Q, P>>()) {
188 return SolverFactory<R, Q, P>{}.create(options, handlers);
189}
190
191template <class R, class Q = R, class P = std::map<size_t, typename R::value_type>>
192std::unique_ptr<NonLinearEquations<R, Q, P>>
193create_NonLinearEquations(const std::string& method = "DIIS", const std::string& options = "",
194 const std::shared_ptr<ArrayHandlers<R, Q, P>>& handlers =
197 if (method == "DIIS" or method.empty())
198 return SolverFactory<R, Q, P>{}.create(NonLinearEquationsDIISOptions{optionsmap}, handlers);
199 throw std::runtime_error("Unimplemented method " + method);
200}
201
202template <class R, class Q = R, class P = std::map<size_t, typename R::value_type>>
203std::unique_ptr<Optimize<R, Q, P>>
205 const std::shared_ptr<ArrayHandlers<R, Q, P>>& handlers =
206 std::make_shared<molpro::linalg::itsolv::ArrayHandlers<R, Q, P>>()) {
207 return SolverFactory<R, Q, P>{}.create(options, handlers);
208}
209
210template <class R, class Q = R, class P = std::map<size_t, typename R::value_type>>
211std::unique_ptr<Optimize<R, Q, P>>
212create_Optimize(const std::string& method = "BFGS", const std::string& options = "",
213 const std::shared_ptr<ArrayHandlers<R, Q, P>>& handlers =
216 if (method == "BFGS" or method.empty())
217 return SolverFactory<R, Q, P>{}.create(OptimizeBFGSOptions{optionsmap}, handlers);
218 if (method == "SD")
219 return SolverFactory<R, Q, P>{}.create(OptimizeSDOptions{optionsmap}, handlers);
220 throw std::runtime_error("Unimplemented method " + method);
221}
222
223} // namespace molpro::linalg::itsolv
224#endif // LINEARALGEBRA_SRC_MOLPRO_LINALG_ITSOLV_SOLVERFACTORY_H
Class, containing a collection of array handlers used in IterativeSolver Provides a Builder sub-class...
Definition: ArrayHandlers.h:25
Abstract class defining the problem-specific interface for the simplified solver interface to Iterati...
Definition: IterativeSolver.h:77
Factory for creating instances of specific solver implementations from the corresponding Options obje...
Definition: SolverFactory.h:74
virtual std::unique_ptr< IterativeSolver< R, Q, P > > create(const Options &options, const std::shared_ptr< ArrayHandlers< R, Q, P > > &handlers)
Definition: SolverFactory-implementation.h:19
static std::map< std::string, std::string > parse_keyval_string(std::string s)
Definition: util.cpp:38
4-parameter interpolation of a 1-dimensional function given two points for which function values and ...
Definition: helper.h:10
std::tuple< bool, std::unique_ptr< LinearEquations< R, Q, P > > > Solve_LinearEquations(const VecRef< R > &parameters, const VecRef< R > &actions, const Problem< R > &problem, int verbosity=0, bool generate_initial_guess=true, const std::string &method="Davidson", const std::string &options="", const std::shared_ptr< ArrayHandlers< R, Q, P > > &handlers=std::make_shared< molpro::linalg::itsolv::ArrayHandlers< R, Q, P > >())
Definition: SolverFactory.h:148
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:108
std::map< std::string, std::string > options_map
Definition: options_map.h:8
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::unique_ptr< NonLinearEquations< R, Q, P > > create_NonLinearEquations(const NonLinearEquationsOptions &options=NonLinearEquationsOptions{}, const std::shared_ptr< ArrayHandlers< R, Q, P > > &handlers=std::make_shared< molpro::linalg::itsolv::ArrayHandlers< R, Q, P > >())
Definition: SolverFactory.h:185
std::unique_ptr< Optimize< R, Q, P > > create_Optimize(const OptimizeOptions &options=OptimizeOptions{}, const std::shared_ptr< ArrayHandlers< R, Q, P > > &handlers=std::make_shared< molpro::linalg::itsolv::ArrayHandlers< R, Q, P > >())
Definition: SolverFactory.h:204
std::vector< std::reference_wrapper< A > > VecRef
Definition: wrap.h:11
std::unique_ptr< LinearEquations< R, Q, P > > create_LinearEquations(const LinearEquationsOptions &options, const std::shared_ptr< ArrayHandlers< R, Q, P > > &handlers=std::make_shared< molpro::linalg::itsolv::ArrayHandlers< R, Q, P > >())
Definition: SolverFactory.h:129
const std::shared_ptr< const molpro::Options > options()
Get the Options object associated with iterative-solver.
Definition: options.cpp:4
Allows setting and getting of options for LinearEigensystemDavidson instance via IterativeSolver base...
Definition: LinearEigensystemDavidsonOptions.h:36
Allows setting and getting of options for LinearEigensystemRSPT instance via IterativeSolver base cla...
Definition: LinearEigensystemRSPTOptions.h:9
Allows setting and getting of options for LinearEquationsDavidson instance via IterativeSolver base c...
Definition: LinearEquationsDavidsonOptions.h:8
Allows setting and getting of options for NonLinearEquationsDIIS instance via IterativeSolver base cl...
Definition: NonLinearEquationsDIISOptions.h:9
Allows setting and getting of options for OptimizeBFGS instance via IterativeSolver base class.
Definition: OptimizeBFGSOptions.h:9
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