Abstract class defining the problem-specific interface for the simplified solver interface to IterativeSolver. More...
#include <IterativeSolver.h>
Abstract class defining the problem-specific interface for the simplified solver interface to IterativeSolver.
| R | the type of container for solutions and residuals |
Public Types | |
| using | container_t = R |
| using | p_container_t = P |
| using | value_t = typename R::value_type |
Public Member Functions | |
| Problem ()=default | |
| virtual | ~Problem ()=default |
| virtual value_t | residual (const R ¶meters, R &residual) const |
| Calculate the residual vector. Used by non-linear solvers (NonLinearEquations, Optimize) only. | |
| virtual void | action (const CVecRef< R > ¶meters, const VecRef< R > &action) const |
| Calculate the action of the kernel matrix on a set of parameters. Used by linear solvers, but not by the non-linear solvers (NonLinearEquations, Optimize). | |
| virtual bool | diagonals (container_t &d) const |
| Optionally provide the diagonal elements of the underlying kernel. If implemented and returning true, the provided diagonals will be used by IterativeSolver for preconditioning (and therefore the precondition() function does not need to be implemented), and, in the case of linear problems, for selection of the P space. Otherwise, preconditioning will be done with precondition(), and any P space has to be provided manually. | |
| virtual void | precondition (const VecRef< R > &residual, const std::vector< value_t > &shift) const |
| Apply preconditioning to a residual vector in order to predict a step towards the solution. | |
| virtual void | precondition (const VecRef< R > &residual, const std::vector< value_t > &shift, const R &diagonals) const |
| Apply preconditioning to a residual vector in order to predict a step towards the solution. | |
| virtual void | precondition_with_metric (const VecRef< R > &residual, const std::vector< value_t > &shift, const R &diagonals, const R &metric_diagonals) const |
| Apply preconditioning to a residual vector of a generalised eigenproblem. Used instead of precondition() when both diagonals() and metric_diagonals() are provided. | |
| virtual MetricKind | metric_kind () const |
| The kind of metric M of the problem. Anything other than MetricKind::Identity turns the eigenproblem A v = lambda v into the generalised eigenproblem A v = lambda M v, which requires metric_action() and solving with the IterativeSolver::solve() overload that takes buffers for the actions of the metric. Which kinds are supported depends on the solver (IterativeSolver::supports_metric()); solve() throws for the others. | |
| virtual MetricStorage | metric_storage () const |
| How IterativeSolver::solve() obtains the actions of the metric on its subspace vectors, see IterativeSolver::set_metric(). With MetricStorage::Stored (the default) it keeps the action of the metric on every subspace vector; with MetricStorage::OnTheFly it keeps none, and calls metric_action() on the solutions whenever it constructs residuals instead. OnTheFly saves the memory or disk space of one vector per subspace vector at the cost of applying the metric once more per root and iteration, which pays off where the metric is cheap to apply, e.g. diagonal or sparse. | |
| virtual void | metric_action (const CVecRef< R > ¶meters, const VecRef< R > &metric_actions) const |
| Calculate the action of the metric on a set of parameters. Called only if metric_kind() is not MetricKind::Identity. | |
| virtual void | action_with_metric (const CVecRef< R > ¶meters, const VecRef< R > &actions, const VecRef< R > &metric_actions) const |
| Calculate the actions of the kernel and of the metric on a set of parameters together. Used by IterativeSolver::solve() for problems with a metric; the default calls action() and metric_action(), and can be overridden where both are cheaper to calculate together. | |
| virtual bool | metric_diagonals (R &d) const |
| Provide the diagonal elements of the metric. For a problem with a metric that provides diagonals(), this is required too, so that the default preconditioner divides by diag(A) - lambda diag(M); IterativeSolver::solve() throws otherwise. Approximate values are fine. The diagonal elements of the kernel and of the metric are then passed to precondition_with_metric(), and an initial guess is generated from the lowest ratios of the diagonal elements of the kernel and the metric, which needs a container supported by precondition_default(). | |
| virtual bool | RHS (R &RHS, unsigned int instance) const |
| Return the inhomogeneous part of a linear equation system. | |
| virtual std::vector< value_t > | pp_action_matrix (const std::vector< P > &pparams) const |
| Calculate the kernel matrix in the P space. | |
| virtual void | p_action (const std::vector< std::vector< value_t > > &p_coefficients, const CVecRef< P > &pparams, const VecRef< container_t > &actions) const |
| Calculate the action of the kernel matrix on a set of vectors in the P space. | |
| virtual std::vector< value_t > | pp_metric_matrix (const std::vector< P > &pparams) const |
| Calculate the metric matrix in the P space, for a problem with a metric (metric_kind()) | |
| virtual void | p_metric_action (const std::vector< std::vector< value_t > > &p_coefficients, const CVecRef< P > &pparams, const VecRef< container_t > &metric_actions) const |
| Calculate the action of the metric on a set of vectors in the P space, for a problem with a metric (metric_kind()). Not used if the metric is applied on the fly (metric_storage()). | |
| virtual bool | test_parameters (unsigned int instance, R ¶meters) const |
| Provide values of R vectors for testing the problem class. For use in a non-linear solver, the first vector (instance=0) should be a reference point, and the remainder (instance>0) should be close to it, such that meaningful numerical differentation can be done to test the residual function. | |
| using molpro::linalg::itsolv::Problem< R, P >::container_t = R |
| using molpro::linalg::itsolv::Problem< R, P >::p_container_t = P |
| using molpro::linalg::itsolv::Problem< R, P >::value_t = typename R::value_type |
|
default |
|
virtualdefault |
|
inlinevirtual |
Calculate the action of the kernel matrix on a set of parameters. Used by linear solvers, but not by the non-linear solvers (NonLinearEquations, Optimize).
| parameters | The trial solutions for which the action is to be calculated |
| action | The action vectors |
|
inlinevirtual |
Calculate the actions of the kernel and of the metric on a set of parameters together. Used by IterativeSolver::solve() for problems with a metric; the default calls action() and metric_action(), and can be overridden where both are cheaper to calculate together.
| parameters | The trial solutions for which the actions are to be calculated |
| actions | The action vectors of the kernel |
| metric_actions | The action vectors of the metric |
|
inlinevirtual |
Optionally provide the diagonal elements of the underlying kernel. If implemented and returning true, the provided diagonals will be used by IterativeSolver for preconditioning (and therefore the precondition() function does not need to be implemented), and, in the case of linear problems, for selection of the P space. Otherwise, preconditioning will be done with precondition(), and any P space has to be provided manually.
| d | On exit, contains the diagonal elements |
|
inlinevirtual |
Calculate the action of the metric on a set of parameters. Called only if metric_kind() is not MetricKind::Identity.
| parameters | The trial solutions for which the action is to be calculated |
| metric_actions | The action vectors of the metric |
|
inlinevirtual |
Provide the diagonal elements of the metric. For a problem with a metric that provides diagonals(), this is required too, so that the default preconditioner divides by diag(A) - lambda diag(M); IterativeSolver::solve() throws otherwise. Approximate values are fine. The diagonal elements of the kernel and of the metric are then passed to precondition_with_metric(), and an initial guess is generated from the lowest ratios of the diagonal elements of the kernel and the metric, which needs a container supported by precondition_default().
| d | On exit, contains the diagonal elements of the metric |
|
inlinevirtual |
The kind of metric M of the problem. Anything other than MetricKind::Identity turns the eigenproblem A v = lambda v into the generalised eigenproblem A v = lambda M v, which requires metric_action() and solving with the IterativeSolver::solve() overload that takes buffers for the actions of the metric. Which kinds are supported depends on the solver (IterativeSolver::supports_metric()); solve() throws for the others.
|
inlinevirtual |
How IterativeSolver::solve() obtains the actions of the metric on its subspace vectors, see IterativeSolver::set_metric(). With MetricStorage::Stored (the default) it keeps the action of the metric on every subspace vector; with MetricStorage::OnTheFly it keeps none, and calls metric_action() on the solutions whenever it constructs residuals instead. OnTheFly saves the memory or disk space of one vector per subspace vector at the cost of applying the metric once more per root and iteration, which pays off where the metric is cheap to apply, e.g. diagonal or sparse.
|
inlinevirtual |
Calculate the action of the kernel matrix on a set of vectors in the P space.
| p_coefficients | The projection of the vectors onto to the P space |
| pparams | Specification of the P space |
| actions | On exit, the computed action has been added to the original contents |
|
inlinevirtual |
Calculate the action of the metric on a set of vectors in the P space, for a problem with a metric (metric_kind()). Not used if the metric is applied on the fly (metric_storage()).
| p_coefficients | The projection of the vectors onto to the P space |
| pparams | Specification of the P space |
| metric_actions | On exit, the computed action of the metric has been added to the original contents |
IterativeSolver::solve() calls it once with no vectors (empty p_coefficients and metric_actions) before it changes the solver, to make sure that it is available.
|
inlinevirtual |
Calculate the kernel matrix in the P space.
| pparams | Specification of the P space |
|
inlinevirtual |
Calculate the metric matrix in the P space, for a problem with a metric (metric_kind())
| pparams | Specification of the P space |
|
inlinevirtual |
Apply preconditioning to a residual vector in order to predict a step towards the solution.
| residual | On entry, assumed to be the residual. On exit, the negative of the predicted step. |
| shift | When called from LinearEigensystem, contains the corresponding current eigenvalue estimates for each of the parameter vectors in the set. All other solvers pass a vector of zeroes. |
Used if diagonals() is not provided. For a generalised eigenproblem A v = lambda M v, the preconditioner should approximate the inverse of A - shift M.
|
inlinevirtual |
Apply preconditioning to a residual vector in order to predict a step towards the solution.
| residual | On entry, assumed to be the residual. On exit, the negative of the predicted step. |
| shift | When called from LinearEigensystem, contains the corresponding current eigenvalue estimates for each of the parameter vectors in the set. All other solvers pass a vector of zeroes. |
| diagonals | The diagonal elements of the underlying kernel |
|
inlinevirtual |
Apply preconditioning to a residual vector of a generalised eigenproblem. Used instead of precondition() when both diagonals() and metric_diagonals() are provided.
| residual | On entry, assumed to be the residual. On exit, the negative of the predicted step. |
| shift | Contains the current eigenvalue estimates for each of the parameter vectors in the set. |
| diagonals | The diagonal elements of the underlying kernel |
| metric_diagonals | The diagonal elements of the metric |
|
inlinevirtual |
Calculate the residual vector. Used by non-linear solvers (NonLinearEquations, Optimize) only.
| parameters | The trial solution for which the residual is to be calculated |
| residual | The residual vector |
Reimplemented in molpro::linalg::itsolv::interpolate_detail::Morse_problem< value_type >.
|
inlinevirtual |
Return the inhomogeneous part of a linear equation system.
| RHS | On return, will contain the requested right-hand-side of equations if available. |
| instance | Which RHS is required. If there are N sets of equations to solve, then 0,1,...N-1 number the instances. The solver will call this function repeatedly with instance=0,1,2,... until it receives a negative response. |
|
inlinevirtual |
Provide values of R vectors for testing the problem class. For use in a non-linear solver, the first vector (instance=0) should be a reference point, and the remainder (instance>0) should be close to it, such that meaningful numerical differentation can be done to test the residual function.
| instance | |
| parameters |