alpaqa dll
Nonconvex constrained optimization
Loading...
Searching...
No Matches
functional-problem.hpp
Go to the documentation of this file.
1#pragma once
2
5
6namespace alpaqa {
7
8/// Problem class that allows specifying the basic functions as C++
9/// `std::function`s.
10/// @ingroup grp_Problems
11template <Config Conf = DefaultConfig>
12class FunctionalProblem : public BoxConstrProblem<Conf> {
13 public:
16
17 std::function<real_t(crvec)> f;
18 std::function<void(crvec, rvec)> grad_f;
19 std::function<void(crvec, rvec)> g;
20 std::function<void(crvec, crvec, rvec)> grad_g_prod;
21 std::function<void(crvec, index_t, rvec)> grad_gi;
22 std::function<void(crvec, rmat)> jac_g;
23 std::function<void(crvec, crvec, real_t, crvec, rvec)> hess_L_prod;
24 std::function<void(crvec, crvec, real_t, rmat)> hess_L;
25 std::function<void(crvec, crvec, crvec, real_t, crvec, rvec)> hess_ψ_prod;
26 std::function<void(crvec, crvec, crvec, real_t, rmat)> hess_ψ;
27
28 // clang-format off
29 real_t eval_objective(crvec x) const { ScopedMallocAllower ma; return f(x); }
30 void eval_objective_gradient(crvec x, rvec grad_fx) const { ScopedMallocAllower ma; grad_f(x, grad_fx); }
31 void eval_constraints(crvec x, rvec gx) const { ScopedMallocAllower ma; g(x, gx); }
32 void eval_constraints_gradient_product(crvec x, crvec y, rvec grad_gxy) const { ScopedMallocAllower ma; grad_g_prod(x, y, grad_gxy); }
33 void eval_grad_gi(crvec x, index_t i, rvec grad_gix) const { ScopedMallocAllower ma; grad_gi(x, i, grad_gix); }
34 void eval_lagrangian_hessian_product(crvec x, crvec y, real_t scale, crvec v, rvec Hv) const { ScopedMallocAllower ma; hess_L_prod(x, y, scale, v, Hv); }
35 void eval_augmented_lagrangian_hessian_product(crvec x, crvec y, crvec Σ, real_t scale, crvec v, rvec Hv) const { ScopedMallocAllower ma; hess_ψ_prod(x, y, Σ, scale, v, Hv); }
36 // clang-format on
37 void eval_constraints_jacobian(crvec x, rvec J_values) const {
39 jac_g(x, J_values.reshaped(this->num_constraints, this->num_variables));
40 }
41 void eval_lagrangian_hessian(crvec x, crvec y, real_t scale, rvec H_values) const {
43 hess_L(x, y, scale, H_values.reshaped(this->num_variables, this->num_variables));
44 }
46 rvec H_values) const {
48 hess_ψ(x, y, Σ, scale, H_values.reshaped(this->num_variables, this->num_variables));
49 }
50
51 /// @see @ref TypeErasedProblem::provides_eval_grad_gi
52 [[nodiscard]] bool provides_eval_grad_gi() const { return bool{grad_gi}; }
53 /// @see @ref TypeErasedProblem::provides_eval_constraints_jacobian
54 [[nodiscard]] bool provides_eval_constraints_jacobian() const { return bool{jac_g}; }
55 /// @see @ref TypeErasedProblem::provides_eval_lagrangian_hessian_product
56 [[nodiscard]] bool provides_eval_lagrangian_hessian_product() const {
57 return bool{hess_L_prod};
58 }
59 /// @see @ref TypeErasedProblem::provides_eval_lagrangian_hessian
60 [[nodiscard]] bool provides_eval_lagrangian_hessian() const { return bool{hess_L}; }
61 /// @see @ref TypeErasedProblem::provides_eval_augmented_lagrangian_hessian_product
63 return bool{hess_ψ_prod};
64 }
65 /// @see @ref TypeErasedProblem::provides_eval_augmented_lagrangian_hessian
66 [[nodiscard]] bool provides_eval_augmented_lagrangian_hessian() const { return bool{hess_ψ}; }
67
68 /// @see @ref TypeErasedProblem::get_name
69 [[nodiscard]] std::string get_name() const { return "FunctionalProblem"; }
70
73 FunctionalProblem(FunctionalProblem &&) noexcept = default;
74 FunctionalProblem &operator=(FunctionalProblem &&) noexcept = default;
75};
76
77} // namespace alpaqa
BoxConstrProblem(length_t num_variables, length_t num_constraints)
void eval_constraints(crvec x, rvec gx) const
bool provides_eval_constraints_jacobian() const
std::function< void(crvec, crvec, real_t, rmat)> hess_L
std::function< real_t(crvec)> f
void eval_lagrangian_hessian_product(crvec x, crvec y, real_t scale, crvec v, rvec Hv) const
void eval_lagrangian_hessian(crvec x, crvec y, real_t scale, rvec H_values) const
std::function< void(crvec, crvec, real_t, crvec, rvec)> hess_L_prod
std::function< void(crvec, index_t, rvec)> grad_gi
std::function< void(crvec, crvec, crvec, real_t, crvec, rvec)> hess_ψ_prod
std::function< void(crvec, crvec, crvec, real_t, rmat)> hess_ψ
std::function< void(crvec, crvec, rvec)> grad_g_prod
void eval_constraints_jacobian(crvec x, rvec J_values) const
std::function< void(crvec, rvec)> g
FunctionalProblem & operator=(const FunctionalProblem &)=default
void eval_augmented_lagrangian_hessian_product(crvec x, crvec y, crvec Σ, real_t scale, crvec v, rvec Hv) const
std::function< void(crvec, rmat)> jac_g
bool provides_eval_lagrangian_hessian_product() const
std::function< void(crvec, rvec)> grad_f
void eval_augmented_lagrangian_hessian(crvec x, crvec y, crvec Σ, real_t scale, rvec H_values) const
bool provides_eval_augmented_lagrangian_hessian() const
FunctionalProblem(const FunctionalProblem &)=default
void eval_objective_gradient(crvec x, rvec grad_fx) const
bool provides_eval_augmented_lagrangian_hessian_product() const
FunctionalProblem(FunctionalProblem &&) noexcept=default
real_t eval_objective(crvec x) const
bool provides_eval_lagrangian_hessian() const
void eval_constraints_gradient_product(crvec x, crvec y, rvec grad_gxy) const
void eval_grad_gi(crvec x, index_t i, rvec grad_gix) const
#define USING_ALPAQA_CONFIG(Conf)
Definition config.hpp:77
typename Conf::rmat rmat
Definition config.hpp:96
typename Conf::real_t real_t
Definition config.hpp:86
typename Conf::index_t index_t
Definition config.hpp:104
typename Conf::rvec rvec
Definition config.hpp:91
typename Conf::crvec crvec
Definition config.hpp:92