iterative-solver 0.0
SolverFactory-implementation.h
1#ifndef LINEARALGEBRA_SRC_MOLPRO_LINALG_ITSOLV_SOLVERFACTORY_IMPLEMENTATION_H
2#define LINEARALGEBRA_SRC_MOLPRO_LINALG_ITSOLV_SOLVERFACTORY_IMPLEMENTATION_H
3#include "OptimizeSD.h"
4#include "OptimizeSDOptions.h"
5#include <molpro/linalg/itsolv/LinearEigensystemDavidson.h>
6#include <molpro/linalg/itsolv/LinearEigensystemRSPT.h>
7#include <molpro/linalg/itsolv/LinearEquationsDavidson.h>
8#include <molpro/linalg/itsolv/NonLinearEquationsDIIS.h>
9#include <molpro/linalg/itsolv/OptimizeBFGS.h>
10#include <molpro/linalg/itsolv/SolverFactory.h>
11#include <molpro/linalg/itsolv/subspace/SubspaceSolverDIIS.h>
12#include <molpro/linalg/itsolv/subspace/SubspaceSolverOptBFGS.h>
13#include <molpro/linalg/itsolv/subspace/SubspaceSolverOptSD.h>
14
15namespace molpro::linalg::itsolv {
16
17template <class R, class Q, class P>
18std::unique_ptr<IterativeSolver<R, Q, P>>
19SolverFactory<R, Q, P>::create(const Options& options, const std::shared_ptr<ArrayHandlers<R, Q, P>>& handlers) {
20 Options* options_ptr = &const_cast<Options&>(options);
21 if (auto options_child = dynamic_cast<LinearEigensystemOptions*>(options_ptr); options_child) {
22 return create(*options_child, handlers);
23 } else if (auto options_child = dynamic_cast<LinearEquationsOptions*>(options_ptr); options_child) {
24 return create(*options_child, handlers);
25 } else {
26 return nullptr;
27 }
28}
29
30template <class R, class Q, class P>
31std::unique_ptr<LinearEigensystem<R, Q, P>>
33 const std::shared_ptr<ArrayHandlers<R, Q, P>>& handlers) {
34 Options* options_ptr = &const_cast<LinearEigensystemOptions&>(options);
35 if (auto options_child = dynamic_cast<LinearEigensystemDavidsonOptions*>(options_ptr); options_child) {
36 auto solver = std::make_unique<LinearEigensystemDavidson<R, Q, P>>(handlers);
37 solver->set_options(options);
38 return solver;
39 }
40 if (auto options_child = dynamic_cast<LinearEigensystemRSPTOptions*>(options_ptr); options_child) {
41 auto solver = std::make_unique<LinearEigensystemRSPT<R, Q, P>>(handlers);
42 solver->set_options(options);
43 return solver;
44 }
45 throw std::logic_error("SolverFactory failed to cast to solver");
46}
47
48template <class R, class Q, class P>
49std::unique_ptr<LinearEquations<R, Q, P>>
51 const std::shared_ptr<ArrayHandlers<R, Q, P>>& handlers) {
52 auto solver = std::make_unique<LinearEquationsDavidson<R, Q, P>>(handlers);
53 solver->set_options(options);
54 return solver;
55}
56
57template <class R, class Q, class P>
58std::unique_ptr<NonLinearEquations<R, Q, P>>
60 const std::shared_ptr<ArrayHandlers<R, Q, P>>& handlers) {
61 Options* options_ptr = &const_cast<NonLinearEquationsOptions&>(options);
62 if (auto options_child = dynamic_cast<NonLinearEquationsDIISOptions*>(options_ptr); options_child) {
63 auto solver = std::make_unique<NonLinearEquationsDIIS<R, Q, P>>(handlers);
64 solver->set_options(options);
65 return solver;
66 }
67 throw std::runtime_error("Unimplemented solver method");
68}
69
70template <class R, class Q, class P>
71std::unique_ptr<Optimize<R, Q, P>>
73 const std::shared_ptr<ArrayHandlers<R, Q, P>>& handlers) {
74 Options* options_ptr = &const_cast<OptimizeOptions&>(options);
75 if (auto options_child = dynamic_cast<OptimizeBFGSOptions*>(options_ptr); options_child) {
76 auto solver = std::make_unique<OptimizeBFGS<R, Q, P>>(handlers);
77 solver->set_options(options);
78 return solver;
79 }
80 if (auto options_child = dynamic_cast<OptimizeSDOptions*>(options_ptr); options_child) {
81 auto solver = std::make_unique<OptimizeSD<R, Q, P>>(handlers);
82 solver->set_options(options);
83 return solver;
84 }
85 throw std::runtime_error("Unimplemented solver method");
86}
87
88template <class R, class Q, class P>
89std::unique_ptr<IterativeSolver<R, Q, P>>
90SolverFactory<R, Q, P>::create(const std::string& method, const options_map& options,
91 const std::shared_ptr<ArrayHandlers<R, Q, P>>& handlers) {
92 if (method == "LinearEigensystem") {
93 return create(LinearEigensystemDavidsonOptions{options}, handlers);
94 } else if (method == "LinearEquations") {
95 return create(LinearEquationsDavidsonOptions{options}, handlers);
96 } else {
97 throw std::runtime_error("Method = " + method + ", is not implemented");
98 }
99}
100
101} // namespace molpro::linalg::itsolv
102
103#endif // LINEARALGEBRA_SRC_MOLPRO_LINALG_ITSOLV_SOLVERFACTORY_IMPLEMENTATION_H
Class, containing a collection of array handlers used in IterativeSolver Provides a Builder sub-class...
Definition: ArrayHandlers.h:25
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
4-parameter interpolation of a 1-dimensional function given two points for which function values and ...
Definition: helper.h:10
std::map< std::string, std::string > options_map
Definition: options_map.h:8
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