Base class defining the interface common to all iterative solvers. More...
#include <IterativeSolver.h>

Base class defining the interface common to all iterative solvers.
As well as through the interface, some behaviour (profiling, and tuning of BLAS operations) is influenced by the contents of a global molpro::Options object, which defaults to molpro::Options("ITERATIVE-SOLVER", "").
| R | container for "working-set" vectors. These are typically implemented in memory, and are created by the client program. R vectors are never created inside IterativeSolver. |
| Q | container for other vectors. These are typically implemented on backing store and/or distributed across processors. IterativeSolver constructs a number of instances of Q containers to store history. |
| P | a class that specifies the definition of a single P-space vector, which is a strictly sparse vector in the underlying space. |
Public Types | |
| using | value_type = typename R::value_type |
| The underlying type of elements of vectors. | |
| using | scalar_type = typename array::ArrayHandler< R, Q >::value_type |
| using | value_type_abs = typename array::ArrayHandler< R, R >::value_type_abs |
| using | VectorP = std::vector< value_type > |
| using | fapply_on_p_type = std::function< void(const std::vector< VectorP > &, const CVecRef< P > &, const VecRef< R > &)> |
| using | fapply_metric_type = std::function< void(const CVecRef< R > &, const VecRef< R > &)> |
| Function type for applying the metric to a set of vectors (first argument), writing the results into the second. | |
| using | PSpaceMetric = itsolv::PSpaceMetric< R, P > |
Public Member Functions | |
| virtual | ~IterativeSolver ()=default |
| IterativeSolver ()=default | |
| IterativeSolver (const IterativeSolver< R, Q, P > &)=delete | |
| IterativeSolver< R, Q, P > & | operator= (const IterativeSolver< R, Q, P > &)=delete |
| IterativeSolver (IterativeSolver< R, Q, P > &&) noexcept=default | |
| IterativeSolver< R, Q, P > & | operator= (IterativeSolver< R, Q, P > &&) noexcept=default |
| virtual bool | solve (const VecRef< R > ¶meters, const VecRef< R > &actions, const Problem< R > &problem, bool generate_initial_guess=false)=0 |
| Simplified one-call solver. | |
| virtual bool | solve (R ¶meters, R &actions, const Problem< R > &problem, bool generate_initial_guess=false)=0 |
| Simplified one-call solver. | |
| virtual bool | solve (std::vector< R > ¶meters, std::vector< R > &actions, const Problem< R > &problem, bool generate_initial_guess=false)=0 |
| Simplified one-call solver. | |
| bool | solve (const VecRef< R > ¶meters, const VecRef< R > &actions, const Problem< R > &&problem, bool generate_initial_guess=false)=delete |
| bool | solve (R ¶meters, R &actions, const Problem< R > &&problem, bool generate_initial_guess=false)=delete |
| bool | solve (std::vector< R > ¶meters, std::vector< R > &actions, const Problem< R > &&problem, bool generate_initial_guess=false)=delete |
| virtual bool | solve (const VecRef< R > ¶meters, const VecRef< R > &actions, const VecRef< R > &metric_actions, const Problem< R > &problem, bool generate_initial_guess=false) |
| Simplified one-call solver for problems that may have a metric, e.g. the generalised eigenproblem A v = lambda M v. | |
| virtual bool | solve (R ¶meters, R &actions, R &metric_actions, const Problem< R > &problem, bool generate_initial_guess=false) |
| Simplified one-call solver for problems that may have a metric, e.g. the generalised eigenproblem A v = lambda M v. | |
| virtual bool | solve (std::vector< R > ¶meters, std::vector< R > &actions, std::vector< R > &metric_actions, const Problem< R > &problem, bool generate_initial_guess=false) |
| Simplified one-call solver for problems that may have a metric, e.g. the generalised eigenproblem A v = lambda M v. | |
| bool | solve (const VecRef< R > ¶meters, const VecRef< R > &actions, const VecRef< R > &metric_actions, const Problem< R > &&problem, bool generate_initial_guess=false)=delete |
| A temporary problem is rejected, as the solver keeps references to the problem beyond solve() | |
| bool | solve (R ¶meters, R &actions, R &metric_actions, const Problem< R > &&problem, bool generate_initial_guess=false)=delete |
| A temporary problem is rejected, as the solver keeps references to the problem beyond solve() | |
| bool | solve (std::vector< R > ¶meters, std::vector< R > &actions, std::vector< R > &metric_actions, const Problem< R > &&problem, bool generate_initial_guess=false)=delete |
| A temporary problem is rejected, as the solver keeps references to the problem beyond solve() | |
| virtual bool | supports_metric (MetricKind kind) const |
| Whether the solver supports a metric of the given kind. MetricKind::Identity is always supported. | |
| virtual void | set_metric (MetricKind kind, MetricStorage storage=MetricStorage::Stored, fapply_metric_type apply_metric={}) |
| Declares the metric M of a generalised problem, e.g. the eigenproblem A v = lambda M v, for the stepwise interface. solve() calls it itself. | |
| virtual MetricKind | metric_kind () const |
| The kind of metric declared with set_metric() | |
| virtual MetricStorage | metric_storage () const |
| How the actions of the metric declared with set_metric() are obtained. | |
| virtual void | set_check_metric (bool check) |
| Sets whether add_p() and add_vector() check that the metric is Hermitian and, for the positive (semi)definite kinds, positive (semi)definite on the subspace (default: true). The checks cost a few operations on vectors in every iteration. | |
| virtual bool | get_check_metric () const |
| Whether the metric is checked, see set_check_metric() | |
| virtual int | add_vector (const VecRef< R > ¶meters, const VecRef< R > &actions)=0 |
| Take, typically, a current solution and residual, and add it to the solution space. | |
| virtual int | add_vector (std::vector< R > ¶meters, std::vector< R > &action)=0 |
| virtual int | add_vector (R ¶meters, R &action, value_type value=0)=0 |
| virtual int | add_vector (const VecRef< R > ¶meters, const VecRef< R > &actions, const VecRef< R > &metric_actions) |
| Like add_vector(const VecRef<R>&, const VecRef<R>&), for a problem with a metric declared with set_metric() | |
| virtual int | add_vector (std::vector< R > ¶meters, std::vector< R > &actions, std::vector< R > &metric_actions) |
| Like add_vector(const VecRef<R>&, const VecRef<R>&), for a problem with a metric declared with set_metric() | |
| virtual int | add_vector (R ¶meters, R &actions, R &metric_actions) |
| Like add_vector(const VecRef<R>&, const VecRef<R>&), for a problem with a metric declared with set_metric() | |
| virtual size_t | add_p (const CVecRef< P > &pparams, const array::Span< value_type > &pp_action_matrix, const VecRef< R > ¶meters, const VecRef< R > &action, fapply_on_p_type apply_p)=0 |
| Add P-space vectors to the expansion set for linear methods. | |
| virtual size_t | add_p (const CVecRef< P > &pparams, const array::Span< value_type > &pp_action_matrix, const VecRef< R > ¶meters, const VecRef< R > &action, fapply_on_p_type apply_p, const PSpaceMetric &metric) |
| Like add_p(const CVecRef. | |
| virtual void | clearP ()=0 |
| virtual void | solution (const std::vector< int > &roots, const VecRef< R > ¶meters, const VecRef< R > &residual)=0 |
| Construct solution and residual for a given set of roots. | |
| virtual void | solution_params (const std::vector< int > &roots, const VecRef< R > ¶meters)=0 |
| Constructs parameters of selected roots; throws like solution() | |
| virtual size_t | end_iteration (const VecRef< R > ¶meters, const VecRef< R > &residual)=0 |
| Behaviour depends on the solver. | |
| virtual void | finalize ()=0 |
| virtual bool | end_iteration_needed ()=0 |
| signal whether end_iteration should be called | |
| virtual std::vector< size_t > | suggest_p (const CVecRef< R > &solution, const CVecRef< R > &residual, size_t max_number, value_type_abs threshold)=0 |
| Get the solver's suggestion of which degrees of freedom would be best to add to the P-space. | |
| virtual void | solution (const std::vector< int > &roots, std::vector< R > ¶meters, std::vector< R > &residual)=0 |
| virtual void | solution (R ¶meters, R &residual)=0 |
| virtual void | solution_params (const std::vector< int > &roots, std::vector< R > ¶meters)=0 |
| virtual void | solution_params (R ¶meters)=0 |
| virtual size_t | end_iteration (std::vector< R > ¶meters, std::vector< R > &action)=0 |
| virtual size_t | end_iteration (R ¶meters, R &action)=0 |
| virtual const std::vector< int > & | working_set () const =0 |
| Working set of roots that are not yet converged. | |
| virtual std::vector< scalar_type > | working_set_eigenvalues () const |
| virtual size_t | n_roots () const =0 |
| virtual void | set_n_roots (size_t nroots)=0 |
| virtual const std::vector< value_type_abs > & | errors () const =0 |
| Errors are norms of the residuals, so they are real even when the problem is complex. | |
| virtual const Statistics & | statistics () const =0 |
| virtual void | report (std::ostream &cout, bool endl=true) const =0 |
| Writes a report to cout output stream. | |
| virtual void | report () const =0 |
| Writes a report to std::cout. | |
| virtual void | set_convergence_threshold (value_type_abs thresh)=0 |
| Sets the convergence threshold. | |
| virtual value_type_abs | convergence_threshold () const =0 |
| Reports the convergence threshold. | |
| virtual void | set_convergence_threshold_value (value_type_abs thresh)=0 |
| Sets the value convergence threshold. | |
| virtual value_type_abs | convergence_threshold_value () const =0 |
| Reports the value convergence threshold. | |
| virtual void | set_verbosity (Verbosity v)=0 |
| virtual void | set_verbosity (int v)=0 |
| virtual Verbosity | get_verbosity () const =0 |
| virtual void | set_max_iter (int n)=0 |
| virtual int | get_max_iter () const =0 |
| virtual void | set_max_p (int n)=0 |
| virtual int | get_max_p () const =0 |
| virtual void | set_p_threshold (value_type_abs thresh)=0 |
| virtual value_type_abs | get_p_threshold () const =0 |
| virtual const subspace::Dimensions & | dimensions () const =0 |
| virtual void | set_options (const Options &options)=0 |
| virtual std::shared_ptr< Options > | get_options () const =0 |
| virtual scalar_type | value () const =0 |
| Report the function value for the current optimum solution. | |
| virtual bool | nonlinear () const =0 |
| Report whether the class is a non-linear solver. | |
| virtual void | set_profiler (molpro::profiler::Profiler &profiler)=0 |
| Attach a profiler in order to collect performance data. | |
| virtual void | set_profiler (std::shared_ptr< molpro::profiler::Profiler > profiler)=0 |
| Attach a profiler in order to collect performance data. | |
| virtual const std::shared_ptr< molpro::profiler::Profiler > & | profiler () const =0 |
| virtual void | set_logger (std::shared_ptr< Logger > logger)=0 |
| Set the logger instance that shall be used. | |
| virtual Logger & | logger ()=0 |
| virtual bool | test_problem (const Problem< R > &problem, R &v0, R &v1, int verbosity=0, value_type_abs threshold=1e-5) const =0 |
| Test a supplied problem class. | |
| using molpro::linalg::itsolv::IterativeSolver< R, Q, P >::fapply_metric_type = std::function<void(const CVecRef<R>&, const VecRef<R>&)> |
Function type for applying the metric to a set of vectors (first argument), writing the results into the second.
| using molpro::linalg::itsolv::IterativeSolver< R, Q, P >::fapply_on_p_type = std::function<void(const std::vector<VectorP>&, const CVecRef<P>&, const VecRef<R>&)> |
Function type for applying matrix to the P space vectors and accumulating result in a residual
| using molpro::linalg::itsolv::IterativeSolver< R, Q, P >::PSpaceMetric = itsolv::PSpaceMetric<R, P> |
| using molpro::linalg::itsolv::IterativeSolver< R, Q, P >::scalar_type = typename array::ArrayHandler<R, Q>::value_type |
The type of scalar products of vectors
| using molpro::linalg::itsolv::IterativeSolver< R, Q, P >::value_type = typename R::value_type |
The underlying type of elements of vectors.
| using molpro::linalg::itsolv::IterativeSolver< R, Q, P >::value_type_abs = typename array::ArrayHandler<R, R>::value_type_abs |
| using molpro::linalg::itsolv::IterativeSolver< R, Q, P >::VectorP = std::vector<value_type> |
type for vectors projected on to P space, each element is a coefficient for the corresponding P space parameter
|
virtualdefault |
|
default |
|
delete |
|
defaultnoexcept |
|
pure virtual |
Add P-space vectors to the expansion set for linear methods.
| Pparams | the vectors to add. Each Pvector specifies a sparse vector in the underlying space. The size of the P space must be at least the number of roots to be sought. |
| pp_action_matrix | Matrix projected onto the existing+new, new P space. It should be provided as a 1-dimensional array, with the existing+new index running fastest. |
| parameters | Used as scratch working space |
| action | On exit, the residual of the interpolated solution. The contribution from the new, and any existing, P parameters is missing, and should be added in subsequently. |
| apply_p | A function that evaluates the action of the matrix on vectors in the P space |
|
inlinevirtual |
Like add_p(const CVecRef.
&, const array::Span<value_type>&, const VecRef<R>&, const VecRef<R>&, fapply_on_p_type), for a problem with a metric declared with set_metric(), which this overload requires.
| pparams | the vectors to add, as for the other overload |
| pp_action_matrix | the kernel matrix in the P space, as for the other overload |
| parameters | Used as scratch working space |
| action | On exit, the residual of the interpolated solution, missing the contributions from the P space |
| apply_p | A function that adds the action of the kernel on vectors in the P space |
| metric | the metric in the P space |
|
pure virtual |
Take, typically, a current solution and residual, and add it to the solution space.
| parameters | On input, the current solution or expansion vector. On exit, undefined. |
| actions | On input, the residual for parameters (non-linear), or action of matrix on parameters (linear). On exit, a vector set that should be preconditioned before returning to end_iteration(). |
| value | The value of the objective function for parameters. Used only in Optimize classes. |
|
inlinevirtual |
Like add_vector(const VecRef<R>&, const VecRef<R>&), for a problem with a metric declared with set_metric()
| parameters | On input, the current solution or expansion vector. On exit, undefined. |
| actions | On input, the action of the kernel on parameters. On exit, a vector set that should be preconditioned before returning to end_iteration(). |
| metric_actions | On input, the action of the metric on parameters. On exit, undefined. |
|
pure virtual |
|
inlinevirtual |
Like add_vector(const VecRef<R>&, const VecRef<R>&), for a problem with a metric declared with set_metric()
| parameters | On input, the current solution or expansion vector. On exit, undefined. |
| actions | On input, the action of the kernel on parameters. On exit, a vector set that should be preconditioned before returning to end_iteration(). |
| metric_actions | On input, the action of the metric on parameters. On exit, undefined. |
|
pure virtual |
|
inlinevirtual |
Like add_vector(const VecRef<R>&, const VecRef<R>&), for a problem with a metric declared with set_metric()
| parameters | On input, the current solution or expansion vector. On exit, undefined. |
| actions | On input, the action of the kernel on parameters. On exit, a vector set that should be preconditioned before returning to end_iteration(). |
| metric_actions | On input, the action of the metric on parameters. On exit, undefined. |
|
pure virtual |
|
pure virtual |
Reports the convergence threshold.
|
pure virtual |
Reports the value convergence threshold.
|
pure virtual |
|
pure virtual |
Behaviour depends on the solver.
|
pure virtual |
|
pure virtual |
|
pure virtual |
signal whether end_iteration should be called
|
pure virtual |
Errors are norms of the residuals, so they are real even when the problem is complex.
|
pure virtual |
Callback invoked once the solver iterations are done but before the solve function returns to the caller. Behaviour depends on the solver.
|
inlinevirtual |
Whether the metric is checked, see set_check_metric()
|
pure virtual |
|
pure virtual |
|
pure virtual |
Return all options. This is no different than using getters, but can be used with forward declaration.
|
pure virtual |
|
pure virtual |
|
pure virtual |
|
inlinevirtual |
The kind of metric declared with set_metric()
|
inlinevirtual |
How the actions of the metric declared with set_metric() are obtained.
|
pure virtual |
Total number of roots we are solving for, including the ones that are already converged
|
pure virtual |
Report whether the class is a non-linear solver.
|
delete |
|
defaultnoexcept |
|
pure virtual |
|
pure virtual |
Writes a report to std::cout.
|
pure virtual |
Writes a report to cout output stream.
|
inlinevirtual |
Sets whether add_p() and add_vector() check that the metric is Hermitian and, for the positive (semi)definite kinds, positive (semi)definite on the subspace (default: true). The checks cost a few operations on vectors in every iteration.
|
pure virtual |
Sets the convergence threshold.
|
pure virtual |
Sets the value convergence threshold.
|
pure virtual |
Set the logger instance that shall be used.
| logger |
|
pure virtual |
|
pure virtual |
|
inlinevirtual |
Declares the metric M of a generalised problem, e.g. the eigenproblem A v = lambda M v, for the stepwise interface. solve() calls it itself.
It has to be called before the first add_p() or add_vector(). On a non-empty subspace it may only be called again with the same kind and storage, replacing apply_metric. Throws if the solver does not support kind.
Once a metric other than the identity is declared, every add_vector() has to give the actions of the metric. Solutions are then normalised such that |<x|M|x>| = 1, and their residuals are A x - lambda M x. The errors are the norms of the residuals of the solutions scaled to unit length, |A x - lambda M x| / |x|, which do not depend on the scale of M and are the same as without a metric if M is the identity.
add_p() and add_vector() throw std::runtime_error if the actions of the metric show that it is not Hermitian or, for the positive (semi)definite kinds, that it is not positive (semi)definite, unless switched off with set_check_metric(). These checks see the metric only on the subspace, so that, e.g., an indefinite metric is noticed only once one of its negative directions enters the subspace; test_problem() checks the metric of a Problem more directly. The metric matrix of the P space is checked before the P space is added, but the vectors given to add_vector() are part of the subspace when the check of positivity fails.
| kind | the kind of metric |
| storage | how the solver obtains the actions of the metric on its subspace vectors: with MetricStorage::Stored it keeps those given to add_vector(); with MetricStorage::OnTheFly, which is worthwhile where the metric is cheap to apply, it keeps none, and calls apply_metric on the solutions whenever it constructs residuals instead. Irrelevant for MetricKind::Identity. |
| apply_metric | applies the metric, given exactly for MetricStorage::OnTheFly; it has to remain valid as long as residuals are constructed |
|
pure virtual |
|
pure virtual |
Set all spcecified options. This is no different than using setters, but can be used with forward declaration.
|
pure virtual |
|
pure virtual |
Attach a profiler in order to collect performance data.
| profiler | The profiler to use. It is not owned by the solver and must outlive it. |
|
pure virtual |
Attach a profiler in order to collect performance data.
| profiler | The profiler to use. The solver shares ownership of it, so it stays valid for the solver's lifetime. |
|
pure virtual |
|
pure virtual |
|
pure virtual |
Construct solution and residual for a given set of roots.
For a problem solved with solve() whose metric is applied on the fly (Problem::metric_storage()), this applies the metric through the problem, which therefore has to be still alive.
| std::logic_error | if called between an end_iteration() that reset the D space and the next add_vector(), when the subspace does not hold the solutions; they are in the parameters returned by end_iteration() instead |
|
pure virtual |
|
pure virtual |
|
pure virtual |
Constructs parameters of selected roots; throws like solution()
|
pure virtual |
|
pure virtual |
|
delete |
A temporary problem is rejected, as the solver may keep references to the problem beyond solve(), e.g. for a P space
|
pure virtual |
Simplified one-call solver.
| parameters | A set of scratch vectors. On entry, these vectors should be filled with starting guesses. Where possible, the number of vectors should be equal to the number of solutions sought, but a smaller array is permitted. |
| actions | A set of scratch vectors. It should have the same size as parameters. |
| problem | A Problem object defining the problem to be solved |
| generate_initial_guess | Whether to start with a guess based on diagonal elements (true) or on the contents of parameters (false) |
If a P space is used (max_p > 0, diagonal elements are available and the selected P space is at least as large as the number of roots), the initial subspace is the P space alone, and neither the contents of parameters on entry nor a generated initial guess are used. If max_p > 0 and diagonal elements are available but the selected P space is smaller than the number of roots, no P space is used and the initial guess is generated from the diagonal elements, irrespective of generate_initial_guess; the contents of parameters on entry are not used in this case either.
Starting vectors, whether generated or taken from parameters, are only used for the roots in the working set, at most one per root. On a solver that is used again after an earlier solve(), roots that have already converged are not in the working set, so fewer guesses, or none at all, are generated.
A problem with a metric (Problem::metric_kind() other than MetricKind::Identity) has to be solved with the overload taking buffers for the actions of the metric; this one throws for it.
The solver may keep references to problem for later calls such as solution(), e.g. for a P space, so problem has to outlive them; a further call of solve() replaces them. A temporary problem is therefore rejected at compile time.
An iteration that resets the D space leaves no solutions to return (see solution()). If this happens in the last of max_iter iterations, solve() goes on until the vectors of the reset are in the subspace, which takes one more action per root.
|
delete |
A temporary problem is rejected, as the solver keeps references to the problem beyond solve()
|
inlinevirtual |
Simplified one-call solver for problems that may have a metric, e.g. the generalised eigenproblem A v = lambda M v.
| parameters | A set of scratch vectors, as for solve(const VecRef<R>&, const VecRef<R>&, const Problem<R>&, bool) |
| actions | A set of scratch vectors. It should have the same size as parameters. |
| metric_actions | A set of scratch vectors, of the same size as parameters. The solver uses them for the actions of the metric on new expansion vectors, which it needs also when the metric is applied on the fly, as scratch space, and to hand the diagonal elements of the metric to the preconditioner. |
| problem | A Problem object defining the problem to be solved |
| generate_initial_guess | Whether to start with a guess based on diagonal elements (true) or on the contents of parameters (false) |
Behaves like solve(const VecRef<R>&, const VecRef<R>&, const Problem<R>&, bool), and for a problem without a metric exactly so. For a problem with a metric, set_metric() is called with Problem::metric_kind() (throwing if the solver does not support it) and Problem::metric_storage(), with, for MetricStorage::OnTheFly, a function calling Problem::metric_action(). The actions of kernel and metric are calculated together by Problem::action_with_metric(). If the problem provides diagonals(), it has to provide metric_diagonals() too; both are passed to the preconditioner, and a generated initial guess and the P space are selected from the lowest ratios of the diagonal elements of the kernel and the metric. A P space additionally needs Problem::pp_metric_matrix() and, unless the metric is applied on the fly, Problem::p_metric_action().
The solver keeps references to problem for later calls such as solution(), so problem has to outlive them; a further call of solve() replaces them. A temporary problem is therefore rejected at compile time.
|
delete |
A temporary problem is rejected, as the solver may keep references to the problem beyond solve(), e.g. for a P space
|
pure virtual |
Simplified one-call solver.
| parameters | A set of scratch vectors. On entry, these vectors should be filled with starting guesses. Where possible, the number of vectors should be equal to the number of solutions sought, but a smaller array is permitted. |
| actions | A set of scratch vectors. It should have the same size as parameters. |
| problem | A Problem object defining the problem to be solved |
| generate_initial_guess | Whether to start with a guess based on diagonal elements (true) or on the contents of parameters (false) |
If a P space is used (max_p > 0, diagonal elements are available and the selected P space is at least as large as the number of roots), the initial subspace is the P space alone, and neither the contents of parameters on entry nor a generated initial guess are used. If max_p > 0 and diagonal elements are available but the selected P space is smaller than the number of roots, no P space is used and the initial guess is generated from the diagonal elements, irrespective of generate_initial_guess; the contents of parameters on entry are not used in this case either.
Starting vectors, whether generated or taken from parameters, are only used for the roots in the working set, at most one per root. On a solver that is used again after an earlier solve(), roots that have already converged are not in the working set, so fewer guesses, or none at all, are generated.
A problem with a metric (Problem::metric_kind() other than MetricKind::Identity) has to be solved with the overload taking buffers for the actions of the metric; this one throws for it.
The solver may keep references to problem for later calls such as solution(), e.g. for a P space, so problem has to outlive them; a further call of solve() replaces them. A temporary problem is therefore rejected at compile time.
An iteration that resets the D space leaves no solutions to return (see solution()). If this happens in the last of max_iter iterations, solve() goes on until the vectors of the reset are in the subspace, which takes one more action per root.
|
delete |
A temporary problem is rejected, as the solver keeps references to the problem beyond solve()
|
inlinevirtual |
Simplified one-call solver for problems that may have a metric, e.g. the generalised eigenproblem A v = lambda M v.
| parameters | A set of scratch vectors, as for solve(const VecRef<R>&, const VecRef<R>&, const Problem<R>&, bool) |
| actions | A set of scratch vectors. It should have the same size as parameters. |
| metric_actions | A set of scratch vectors, of the same size as parameters. The solver uses them for the actions of the metric on new expansion vectors, which it needs also when the metric is applied on the fly, as scratch space, and to hand the diagonal elements of the metric to the preconditioner. |
| problem | A Problem object defining the problem to be solved |
| generate_initial_guess | Whether to start with a guess based on diagonal elements (true) or on the contents of parameters (false) |
Behaves like solve(const VecRef<R>&, const VecRef<R>&, const Problem<R>&, bool), and for a problem without a metric exactly so. For a problem with a metric, set_metric() is called with Problem::metric_kind() (throwing if the solver does not support it) and Problem::metric_storage(), with, for MetricStorage::OnTheFly, a function calling Problem::metric_action(). The actions of kernel and metric are calculated together by Problem::action_with_metric(). If the problem provides diagonals(), it has to provide metric_diagonals() too; both are passed to the preconditioner, and a generated initial guess and the P space are selected from the lowest ratios of the diagonal elements of the kernel and the metric. A P space additionally needs Problem::pp_metric_matrix() and, unless the metric is applied on the fly, Problem::p_metric_action().
The solver keeps references to problem for later calls such as solution(), so problem has to outlive them; a further call of solve() replaces them. A temporary problem is therefore rejected at compile time.
|
delete |
A temporary problem is rejected, as the solver may keep references to the problem beyond solve(), e.g. for a P space
|
pure virtual |
Simplified one-call solver.
| parameters | A set of scratch vectors. On entry, these vectors should be filled with starting guesses. Where possible, the number of vectors should be equal to the number of solutions sought, but a smaller array is permitted. |
| actions | A set of scratch vectors. It should have the same size as parameters. |
| problem | A Problem object defining the problem to be solved |
| generate_initial_guess | Whether to start with a guess based on diagonal elements (true) or on the contents of parameters (false) |
If a P space is used (max_p > 0, diagonal elements are available and the selected P space is at least as large as the number of roots), the initial subspace is the P space alone, and neither the contents of parameters on entry nor a generated initial guess are used. If max_p > 0 and diagonal elements are available but the selected P space is smaller than the number of roots, no P space is used and the initial guess is generated from the diagonal elements, irrespective of generate_initial_guess; the contents of parameters on entry are not used in this case either.
Starting vectors, whether generated or taken from parameters, are only used for the roots in the working set, at most one per root. On a solver that is used again after an earlier solve(), roots that have already converged are not in the working set, so fewer guesses, or none at all, are generated.
A problem with a metric (Problem::metric_kind() other than MetricKind::Identity) has to be solved with the overload taking buffers for the actions of the metric; this one throws for it.
The solver may keep references to problem for later calls such as solution(), e.g. for a P space, so problem has to outlive them; a further call of solve() replaces them. A temporary problem is therefore rejected at compile time.
An iteration that resets the D space leaves no solutions to return (see solution()). If this happens in the last of max_iter iterations, solve() goes on until the vectors of the reset are in the subspace, which takes one more action per root.
|
delete |
A temporary problem is rejected, as the solver keeps references to the problem beyond solve()
|
inlinevirtual |
Simplified one-call solver for problems that may have a metric, e.g. the generalised eigenproblem A v = lambda M v.
| parameters | A set of scratch vectors, as for solve(const VecRef<R>&, const VecRef<R>&, const Problem<R>&, bool) |
| actions | A set of scratch vectors. It should have the same size as parameters. |
| metric_actions | A set of scratch vectors, of the same size as parameters. The solver uses them for the actions of the metric on new expansion vectors, which it needs also when the metric is applied on the fly, as scratch space, and to hand the diagonal elements of the metric to the preconditioner. |
| problem | A Problem object defining the problem to be solved |
| generate_initial_guess | Whether to start with a guess based on diagonal elements (true) or on the contents of parameters (false) |
Behaves like solve(const VecRef<R>&, const VecRef<R>&, const Problem<R>&, bool), and for a problem without a metric exactly so. For a problem with a metric, set_metric() is called with Problem::metric_kind() (throwing if the solver does not support it) and Problem::metric_storage(), with, for MetricStorage::OnTheFly, a function calling Problem::metric_action(). The actions of kernel and metric are calculated together by Problem::action_with_metric(). If the problem provides diagonals(), it has to provide metric_diagonals() too; both are passed to the preconditioner, and a generated initial guess and the P space are selected from the lowest ratios of the diagonal elements of the kernel and the metric. A P space additionally needs Problem::pp_metric_matrix() and, unless the metric is applied on the fly, Problem::p_metric_action().
The solver keeps references to problem for later calls such as solution(), so problem has to outlive them; a further call of solve() replaces them. A temporary problem is therefore rejected at compile time.
|
pure virtual |
|
pure virtual |
Get the solver's suggestion of which degrees of freedom would be best to add to the P-space.
| solution | Current solution |
| residual | Current residual |
| max_number | Suggest no more than this number |
| threshold | Suggest only axes for which the current residual and update indicate an energy improvement in the next iteration of this amount or more. |
|
inlinevirtual |
Whether the solver supports a metric of the given kind. MetricKind::Identity is always supported.
|
pure virtual |
Test a supplied problem class.
For a linear problem, checks that the actions of the kernel and, if there is one, of the metric are linear, and that the metric is Hermitian and, for the positive (semi)definite kinds, positive (semi)definite on the test parameters.
| problem | |
| v0 | |
| v1 | |
| verbosity | |
| threshold |
|
pure virtual |
Report the function value for the current optimum solution.
|
pure virtual |
Working set of roots that are not yet converged.
|
inlinevirtual |
The calculated eigenvalues for roots in the working set (eigenvalue problems) or zero (otherwise)