40 [[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); }); }
41 [[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(); }
44 [[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(); }
45 [[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); }); }
53 [[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); }); }
54 [[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); }); }
55 const Box &
get_variable_bounds() const requires requires { &std::remove_cvref_t<Problem>::get_variable_bounds; } {
return problem.get_variable_bounds(); }
56 const Box &
get_general_bounds() const requires requires { &std::remove_cvref_t<Problem>::get_general_bounds; } {
return problem.get_general_bounds(); }
57 void check() const requires requires { &std::remove_cvref_t<Problem>::check; } {
return problem.check(); }
58 [[nodiscard]] std::string
get_name() const requires requires { &std::remove_cvref_t<Problem>::get_name; } {
return problem.get_name(); }
60 [[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(); }
61 [[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(); }
62 [[nodiscard]]
bool provides_eval_prox_jacobian_diag() const requires requires (Problem p) { { p.provides_eval_prox_jacobian_diag() } -> std::convertible_to<bool>; } {
return problem.provides_eval_prox_jacobian_diag(); }
63 [[nodiscard]]
bool provides_eval_nonsmooth_objective() const requires requires (Problem p) { { p.provides_eval_nonsmooth_objective() } -> std::convertible_to<bool>; } {
return problem.provides_eval_nonsmooth_objective(); }
64 [[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(); }
66 [[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(); }
67 [[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(); }
68 [[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(); }
72 [[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(); }
73 [[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(); }
75 [[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(); }
76 [[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(); }
79 [[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(); }
80 [[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(); }
81 [[nodiscard]]
bool provides_check() const requires requires (Problem p) { { p.provides_check() } -> std::convertible_to<bool>; } {
return problem.provides_check(); }
82 [[nodiscard]]
bool provides_get_name() const requires requires (Problem p) { { p.provides_get_name() } -> std::convertible_to<bool>; } {
return problem.provides_get_name(); }
88 std::shared_ptr<EvalCounter>
evaluations = std::make_shared<EvalCounter>();
92 requires std::is_default_constructible_v<Problem>
96 requires std::is_same_v<std::remove_cvref_t<P>, std::remove_cvref_t<Problem>>
98 template <
class... Args>
100 requires(!std::is_lvalue_reference_v<Problem>)
101 :
problem{std::forward<Args>(args)...} {}
113 template <
class TimeT,
class FunT>
114 [[gnu::always_inline]]
static decltype(
auto)
timed(TimeT &time, FunT &&f) {
115 guanaqo::Timed
timed{time};
116 return std::forward<FunT>(f)();