iterative-solver 0.0
 
Loading...
Searching...
No Matches
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>>
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
102 virtual std::unique_ptr<IterativeSolver<R, Q, P>>
103 create(const std::string& method, const options_map& options,
104 const std::shared_ptr<ArrayHandlers<R, Q, P>>& handlers =
106};
107
108// free-function factory invocation
109template <class R, class Q = R, class P = std::map<size_t, typename R::value_type>>
110std::unique_ptr<LinearEigensystem<R, Q, P>>
116
117template <class R, class Q = R, class P = std::map<size_t, typename R::value_type>>
118std::unique_ptr<LinearEigensystem<R, Q, P>>
119create_LinearEigensystem(const std::string& method = "Davidson", const std::string& options = "",
120 const std::shared_ptr<ArrayHandlers<R, Q, P>>& handlers =
123 if (method == "Davidson" or method.empty())
125 if (method == "RSPT")
127 throw std::runtime_error("Unimplemented method " + method);
128}
129
130template <class R, class Q = R, class P = std::map<size_t, typename R::value_type>>
131std::unique_ptr<LinearEquations<R, Q, P>>
137
138template <class R, class Q = R, class P = std::map<size_t, typename R::value_type>>
139std::unique_ptr<LinearEquations<R, Q, P>>
140create_LinearEquations(const std::string& method = "Davidson", const std::string& options = "",
141 const std::shared_ptr<ArrayHandlers<R, Q, P>>& handlers =
144 if (method == "Davidson" or method.empty())
146 throw std::runtime_error("Unimplemented method " + method);
147}
148
149template <class R, class Q = R, class P = std::map<size_t, typename R::value_type>>
150std::tuple<bool, std::unique_ptr<LinearEquations<R, Q, P>>>
151Solve_LinearEquations(const VecRef<R>& parameters, const VecRef<R>& actions, const Problem<R>& problem,
152 int verbosity = 0, bool generate_initial_guess = true, const std::string& method = "Davidson",
153 const std::string& options = "",
154 const std::shared_ptr<ArrayHandlers<R, Q, P>>& handlers =
157 solver->set_verbosity(verbosity);
158 auto success = solver->solve(parameters, actions, problem, generate_initial_guess);
159// if (success)
160// solver->solution(parameters, actions);
161 return std::make_tuple<bool, std::unique_ptr<LinearEquations<R, Q, P>>>(std::move(success), std::move(solver));
162}
163
164template <class R, class Q = R, class P = std::map<size_t, typename R::value_type>>
165std::tuple<bool, std::unique_ptr<LinearEquations<R, Q, P>>>
166Solve_LinearEquations(std::vector<R>& parameters, std::vector<R>& actions, const Problem<R>& problem, int verbosity = 0,
167 bool generate_initial_guess = true, const std::string& method = "Davidson",
168 const std::string& options = "",
169 const std::shared_ptr<ArrayHandlers<R, Q, P>>& handlers =
171 return Solve_LinearEquations<R, Q, P>(wrap(parameters), wrap(actions), problem, verbosity, generate_initial_guess,
173}
174
175template <class R, class Q = R, class P = std::map<size_t, typename R::value_type>>
176auto Solve_LinearEquations(R& parameters, R& actions, const Problem<R>& problem, int verbosity = 0,
177 bool generate_initial_guess = true, const std::string& method = "Davidson",
178 const std::string& options = "",
179 const std::shared_ptr<ArrayHandlers<R, Q, P>>& handlers =
181 return Solve_LinearEquations<R, Q, P>(std::vector<std::reference_wrapper<R>>{std::ref(parameters)},
182 std::vector<std::reference_wrapper<R>>{std::ref(actions)}, problem, verbosity,
184}
185
186template <class R, class Q = R, class P = std::map<size_t, typename R::value_type>>
187std::unique_ptr<NonLinearEquations<R, Q, P>>
189 const std::shared_ptr<ArrayHandlers<R, Q, P>>& handlers =
190 std::make_shared<molpro::linalg::itsolv::ArrayHandlers<R, Q, P>>()) {
191 return SolverFactory<R, Q, P>{}.create(options, handlers);
192}
193
194template <class R, class Q = R, class P = std::map<size_t, typename R::value_type>>
195std::unique_ptr<NonLinearEquations<R, Q, P>>
196create_NonLinearEquations(const std::string& method = "DIIS", const std::string& options = "",
197 const std::shared_ptr<ArrayHandlers<R, Q, P>>& handlers =
200 if (method == "DIIS" or method.empty())
202 throw std::runtime_error("Unimplemented method " + method);
203}
204
205template <class R, class Q = R, class P = std::map<size_t, typename R::value_type>>
206std::unique_ptr<Optimize<R, Q, P>>
208 const std::shared_ptr<ArrayHandlers<R, Q, P>>& handlers =
209 std::make_shared<molpro::linalg::itsolv::ArrayHandlers<R, Q, P>>()) {
210 return SolverFactory<R, Q, P>{}.create(options, handlers);
211}
212
213template <class R, class Q = R, class P = std::map<size_t, typename R::value_type>>
214std::unique_ptr<Optimize<R, Q, P>>
215create_Optimize(const std::string& method = "BFGS", const std::string& options = "",
216 const std::shared_ptr<ArrayHandlers<R, Q, P>>& handlers =
219 if (method == "BFGS" or method.empty())
221 if (method == "SD")
223 throw std::runtime_error("Unimplemented method " + method);
224}
225
226} // namespace molpro::linalg::itsolv
227#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:85
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:14
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:151
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::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:188
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:207
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:132
const std::shared_ptr< const molpro::Options > options()
Get the Options object associated with iterative-solver.
Definition linalg_options.cpp:4
Allows setting and getting of options for LinearEigensystemDavidson instance via IterativeSolver base...
Definition LinearEigensystemDavidsonOptions.h:38
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:13
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