1#ifndef LINEARALGEBRA_SRC_MOLPRO_LINALG_ITSOLV_SOLVERFACTORY_H
2#define LINEARALGEBRA_SRC_MOLPRO_LINALG_ITSOLV_SOLVERFACTORY_H
5#include "LinearEigensystemDavidsonOptions.h"
6#include "LinearEigensystemRSPTOptions.h"
7#include "LinearEquationsDavidsonOptions.h"
8#include "OptimizeBFGSOptions.h"
9#include "OptimizeSDOptions.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>
73template <
class R,
class Q = R,
class P = std::map<
size_t,
typename R::value_type>>
80 virtual std::unique_ptr<LinearEigensystem<R, Q, P>>
85 virtual std::unique_ptr<LinearEquations<R, Q, P>>
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>>());
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>>());
99 virtual std::unique_ptr<IterativeSolver<R, Q, P>>
101 const std::shared_ptr<ArrayHandlers<R, Q, P>>& handlers =
106template <
class R,
class Q = R,
class P = std::map<
size_t,
typename R::value_type>>
107std::unique_ptr<LinearEigensystem<R, Q, P>>
114template <
class R,
class Q = R,
class P = std::map<
size_t,
typename R::value_type>>
115std::unique_ptr<LinearEigensystem<R, Q, P>>
120 if (method ==
"Davidson" or method.empty())
122 if (method ==
"RSPT")
124 throw std::runtime_error(
"Unimplemented method " + method);
127template <
class R,
class Q = R,
class P = std::map<
size_t,
typename R::value_type>>
128std::unique_ptr<LinearEquations<R, Q, P>>
135template <
class R,
class Q = R,
class P = std::map<
size_t,
typename R::value_type>>
136std::unique_ptr<LinearEquations<R, Q, P>>
141 if (method ==
"Davidson" or method.empty())
143 throw std::runtime_error(
"Unimplemented method " + method);
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>>>
149 int verbosity = 0,
bool generate_initial_guess =
true,
const std::string& method =
"Davidson",
150 const std::string&
options =
"",
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);
158 return std::make_tuple<bool, std::unique_ptr<LinearEquations<R, Q, P>>>(std::move(success), std::move(solver));
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>>>
164 bool generate_initial_guess =
true,
const std::string& method =
"Davidson",
165 const std::string&
options =
"",
168 return Solve_LinearEquations<R, Q, P>(
wrap(parameters),
wrap(actions), problem, verbosity, generate_initial_guess,
172template <
class R,
class Q = R,
class P = std::map<
size_t,
typename R::value_type>>
174 bool generate_initial_guess =
true,
const std::string& method =
"Davidson",
175 const std::string&
options =
"",
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);
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);
191template <
class R,
class Q = R,
class P = std::map<
size_t,
typename R::value_type>>
192std::unique_ptr<NonLinearEquations<R, Q, P>>
197 if (method ==
"DIIS" or method.empty())
199 throw std::runtime_error(
"Unimplemented method " + method);
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);
210template <
class R,
class Q = R,
class P = std::map<
size_t,
typename R::value_type>>
211std::unique_ptr<Optimize<R, Q, P>>
216 if (method ==
"BFGS" or method.empty())
220 throw std::runtime_error(
"Unimplemented method " + method);
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
virtual ~SolverFactory()=default
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 > ¶meters, 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