8#include <kernel/solver/nlopt_precond.hpp>
9#include <kernel/solver/test_aux/analytic_function_operator.hpp>
10#include <kernel/util/dist.hpp>
32 template<
typename Operator_,
typename Filter_>
35 template<
typename Operator_,
typename Filter_>
53 template<
typename DT_,
typename IT_,
typename Function_,
typename Filter_>
55 :
public NLOptPrecond<typename AnalyticFunctionOperator<DT_, IT_, Function_>::VectorTypeL, Filter_>
64 typedef typename OperatorType::VectorTypeL
VectorType;
69 typedef typename OperatorType::DataType DataType;
71 typedef typename OperatorType::HessianType HessianType;
81 HessianType _inv_hessian;
105 virtual ~HessianPrecond()
110 virtual String
name()
const override
112 return "HessianPrecond";
118 _op.compute_hess(_hessian);
119 _inv_hessian.set_inverse(_hessian);
125 Statistics::add_solver_expression(std::make_shared<ExpressionStartSolve>(this->
name()));
126 Statistics::add_solver_expression(std::make_shared<ExpressionCallPrecond>(this->
name(), _op.name()));
128 vec_cor(0, _inv_hessian*vec_def(0));
129 this->_filter.filter_cor(vec_cor);
131 Statistics::add_solver_expression(std::make_shared<ExpressionEndSolve>(this->
name(),
Status::success, 1));
156 template<
typename Operator_,
typename Filter_>
158 Operator_& op_,
const Filter_& filter_)
160 return std::make_shared<HessianPrecond<Operator_, Filter_>>(op_, filter_);
181 template<
typename Operator_,
typename Filter_>
182 class ApproximateHessianPrecond;
184 template<
typename Operator_,
typename Filter_>
202 template<
typename DT_,
typename IT_,
typename Function_,
typename Filter_>
204 :
public NLOptPrecond<typename AnalyticFunctionOperator<DT_, IT_, Function_>::VectorTypeL, Filter_>
213 typedef typename OperatorType::VectorTypeL
VectorType;
218 typedef typename OperatorType::DataType DataType;
220 typedef typename OperatorType::HessianType HessianType;
228 HessianType _hessian;
230 HessianType _inv_hessian;
255 virtual ~ApproximateHessianPrecond()
260 virtual String
name()
const override
262 return "ApproximateHessianPrecond";
288 _op.compute_approx_hess(_hessian);
289 _inv_hessian.set_inverse(_hessian);
295 Statistics::add_solver_expression(std::make_shared<ExpressionStartSolve>(this->
name()));
296 Statistics::add_solver_expression(std::make_shared<ExpressionCallPrecond>(this->
name(), _op.name()));
298 vec_cor(0, _inv_hessian*vec_def(0));
299 this->_filter.filter_cor(vec_cor);
301 Statistics::add_solver_expression(std::make_shared<ExpressionEndSolve>(this->
name(),
Status::success, 1));
326 template<
typename Operator_,
typename Filter_>
328 Operator_& op_,
const Filter_& filter_)
330 return std::make_shared<ApproximateHessianPrecond<Operator_, Filter_>>(op_, filter_);
Wrapper class defining an operator based on a scalar AnalyticFunction.
Wrapper class for applying an the inverse of an operator's approximate Hessian as a preconditioner.
Preconditioner that applies the inverse of an operator's Hessian.
Abstract base class for preconditioners for nonlinear optimization.
virtual void prepare(const VectorType &vec_state, FilterType &filter)=0
Prepares the preconditioner for application.
virtual String name() const override=0
Returns a descriptive String.
Operator_::VectorType VectorType
Floating point data type.
Filter_ FilterType
Type of the filter.
virtual Status apply(VectorType &vec_cor, const VectorType &vec_def) override=0
Applies the preconditioner.
std::shared_ptr< HessianPrecond< Operator_, Filter_ > > new_hessian_precond(Operator_ &op_, const Filter_ &filter_)
Creates a new HessianPrecond.
Status
Solver status return codes enumeration.
@ success
solving successful (convergence criterion fulfilled)
std::shared_ptr< ApproximateHessianPrecond< Operator_, Filter_ > > new_approximate_hessian_precond(Operator_ &op_, const Filter_ &filter_)
Creates a new ApproximateHessianPrecond.