38 [[gnu::always_inline]]
void eval_constraints_jacobian(
crvec x,
rvec J_values)
const requires requires { &std::remove_cvref_t<Problem>::eval_constraints_jacobian; } { ++
evaluations->constraints_jacobian;
return timed(
evaluations->time.constraints_jacobian, [&] { return problem.eval_constraints_jacobian(x, J_values); }); }
39 [[gnu::always_inline]] Sparsity
get_constraints_jacobian_sparsity() const requires requires { &std::remove_cvref_t<Problem>::get_constraints_jacobian_sparsity; } {
return problem.get_constraints_jacobian_sparsity(); }
42 [[gnu::always_inline]] Sparsity
get_lagrangian_hessian_sparsity() const requires requires { &std::remove_cvref_t<Problem>::get_lagrangian_hessian_sparsity; } {
return problem.get_lagrangian_hessian_sparsity(); }
43 [[gnu::always_inline]]
void eval_augmented_lagrangian_hessian_product(
crvec x,
crvec y,
crvec Σ,
real_t scale,
crvec v,
rvec Hv)
const requires requires { &std::remove_cvref_t<Problem>::eval_augmented_lagrangian_hessian_product; } { ++
evaluations->augmented_lagrangian_hessian_product;
return timed(
evaluations->time.augmented_lagrangian_hessian_product, [&] { return problem.eval_augmented_lagrangian_hessian_product(x, y, Σ, scale, v, Hv); }); }
51 [[gnu::always_inline]]
void eval_augmented_lagrangian_gradient(
crvec x,
crvec y,
crvec Σ,
rvec grad_ψ,
rvec work_n,
rvec work_m)
const requires requires { &std::remove_cvref_t<Problem>::eval_augmented_lagrangian_gradient; } { ++
evaluations->augmented_lagrangian_gradient;
return timed(
evaluations->time.augmented_lagrangian_gradient, [&] { return problem.eval_augmented_lagrangian_gradient(x, y, Σ, grad_ψ, work_n, work_m); }); }
52 [[gnu::always_inline]]
real_t eval_augmented_lagrangian_and_gradient(
crvec x,
crvec y,
crvec Σ,
rvec grad_ψ,
rvec work_n,
rvec work_m)
const requires requires { &std::remove_cvref_t<Problem>::eval_augmented_lagrangian_and_gradient; } { ++
evaluations->augmented_lagrangian_and_gradient;
return timed(
evaluations->time.augmented_lagrangian_and_gradient, [&] { return problem.eval_augmented_lagrangian_and_gradient(x, y, Σ, grad_ψ, work_n, work_m); }); }
53 const Box &
get_variable_bounds() const requires requires { &std::remove_cvref_t<Problem>::get_variable_bounds; } {
return problem.get_variable_bounds(); }
54 const Box &
get_general_bounds() const requires requires { &std::remove_cvref_t<Problem>::get_general_bounds; } {
return problem.get_general_bounds(); }
55 void check() const requires requires { &std::remove_cvref_t<Problem>::check; } {
return problem.check(); }
56 [[nodiscard]] std::string
get_name() const requires requires { &std::remove_cvref_t<Problem>::get_name; } {
return problem.get_name(); }
58 [[nodiscard]]
bool provides_eval_grad_gi() const requires requires (Problem p) { { p.provides_eval_grad_gi() } -> std::convertible_to<bool>; } {
return problem.provides_eval_grad_gi(); }
59 [[nodiscard]]
bool provides_eval_inactive_indices_res_lna() const requires requires (Problem p) { { p.provides_eval_inactive_indices_res_lna() } -> std::convertible_to<bool>; } {
return problem.provides_eval_inactive_indices_res_lna(); }
60 [[nodiscard]]
bool provides_eval_constraints_jacobian() const requires requires (Problem p) { { p.provides_eval_constraints_jacobian() } -> std::convertible_to<bool>; } {
return problem.provides_eval_constraints_jacobian(); }
62 [[nodiscard]]
bool provides_eval_lagrangian_hessian_product() const requires requires (Problem p) { { p.provides_eval_lagrangian_hessian_product() } -> std::convertible_to<bool>; } {
return problem.provides_eval_lagrangian_hessian_product(); }
63 [[nodiscard]]
bool provides_eval_lagrangian_hessian() const requires requires (Problem p) { { p.provides_eval_lagrangian_hessian() } -> std::convertible_to<bool>; } {
return problem.provides_eval_lagrangian_hessian(); }
64 [[nodiscard]]
bool provides_get_lagrangian_hessian_sparsity() const requires requires (Problem p) { { p.provides_get_lagrangian_hessian_sparsity() } -> std::convertible_to<bool>; } {
return problem.provides_get_lagrangian_hessian_sparsity(); }
68 [[nodiscard]]
bool provides_eval_objective_and_gradient() const requires requires (Problem p) { { p.provides_eval_objective_and_gradient() } -> std::convertible_to<bool>; } {
return problem.provides_eval_objective_and_gradient(); }
69 [[nodiscard]]
bool provides_eval_objective_and_constraints() const requires requires (Problem p) { { p.provides_eval_objective_and_constraints() } -> std::convertible_to<bool>; } {
return problem.provides_eval_objective_and_constraints(); }
71 [[nodiscard]]
bool provides_eval_lagrangian_gradient() const requires requires (Problem p) { { p.provides_eval_lagrangian_gradient() } -> std::convertible_to<bool>; } {
return problem.provides_eval_lagrangian_gradient(); }
72 [[nodiscard]]
bool provides_eval_augmented_lagrangian() const requires requires (Problem p) { { p.provides_eval_augmented_lagrangian() } -> std::convertible_to<bool>; } {
return problem.provides_eval_augmented_lagrangian(); }
75 [[nodiscard]]
bool provides_get_variable_bounds() const requires requires (Problem p) { { p.provides_get_variable_bounds() } -> std::convertible_to<bool>; } {
return problem.provides_get_variable_bounds(); }
76 [[nodiscard]]
bool provides_get_general_bounds() const requires requires (Problem p) { { p.provides_get_general_bounds() } -> std::convertible_to<bool>; } {
return problem.provides_get_general_bounds(); }
77 [[nodiscard]]
bool provides_check() const requires requires (Problem p) { { p.provides_check() } -> std::convertible_to<bool>; } {
return problem.provides_check(); }
78 [[nodiscard]]
bool provides_get_name() const requires requires (Problem p) { { p.provides_get_name() } -> std::convertible_to<bool>; } {
return problem.provides_get_name(); }
84 std::shared_ptr<EvalCounter>
evaluations = std::make_shared<EvalCounter>();
88 requires std::is_default_constructible_v<Problem>
92 requires std::is_same_v<std::remove_cvref_t<P>, std::remove_cvref_t<Problem>>
94 template <
class... Args>
96 requires(!std::is_lvalue_reference_v<Problem>)
97 :
problem{std::forward<Args>(args)...} {}
109 template <
class TimeT,
class FunT>
110 [[gnu::always_inline]]
static decltype(
auto)
timed(TimeT &time, FunT &&f) {
111 guanaqo::Timed
timed{time};
112 return std::forward<FunT>(f)();