11 [[maybe_unused]]
crvec x_0, [[maybe_unused]]
crvec x̂_0,
12 [[maybe_unused]]
crvec p_0, [[maybe_unused]]
crvec grad_ψx_0) {
13 if (!
problem.provides_eval_inactive_indices_res_lna())
14 throw std::invalid_argument(
15 "Structured L-BFGS requires eval_inactive_indices_res_lna()");
19 !
problem.provides_eval_lagrangian_hessian_product())
20 throw std::invalid_argument(
21 "Structured L-BFGS requires eval_lagrangian_hessian_product(). "
22 "Alternatively, set hessian_vec_factor = 0 or "
23 "hessian_vec_finite_differences = true.");
27 !(
problem.provides_eval_lagrangian_hessian_product() ||
28 problem.provides_eval_augmented_lagrangian_hessian_product()))
29 throw std::invalid_argument(
30 "Structured L-BFGS requires "
31 "_eval_augmented_lagrangian_hessian_product() or "
32 "eval_lagrangian_hessian_product(). Alternatively, set "
33 "hessian_vec_factor = 0 or hessian_vec_finite_differences = true.");
37 !
problem.provides_eval_augmented_lagrangian_hessian_product() &&
38 !(
problem.provides_get_general_bounds() &&
39 problem.provides_eval_grad_gi()))
40 throw std::invalid_argument(
41 "Structured L-BFGS requires either "
42 "eval_augmented_lagrangian_hessian_product() or "
43 "get_general_bounds() and eval_grad_gi(). Alternatively, "
44 "set hessian_vec_factor = 0, hessian_vec_finite_differences = "
45 "true, or full_augmented_hessian = false.");
51 const auto n =
problem.get_num_variables();
52 const auto m =
problem.get_num_constraints();
123 const auto m =
problem->get_num_constraints();
133 problem->eval_lagrangian_hessian_product(xₖ, *
y, 1, qₖ,
HqK);
135 if (
problem->provides_eval_augmented_lagrangian_hessian_product()) {
138 problem->eval_augmented_lagrangian_hessian_product(xₖ, *
y, *
Σ,
142 problem->eval_lagrangian_hessian_product(xₖ, *
y, 1, qₖ,
HqK);
146 assert(m == 0 ||
problem->provides_eval_grad_gi());
147 const auto &D =
problem->get_general_bounds();
149 problem->eval_constraints(xₖ, g);
150 for (
index_t i = 0; i < m; ++i) {
151 real_t ζ = g(i) + (*y)(i) / (*
Σ)(i);
152 bool inactive = D.lower(i) < ζ && ζ < D.upper(i);
155 auto t = (*Σ)(i)*
work_n.dot(qₖ);
void initialize(const Problem &problem, crvec y, crvec Σ, real_t γ_0, crvec x_0, crvec x̂_0, crvec p_0, crvec grad_ψx_0)
static void calc_augmented_lagrangian_hessian_prod_fd(const Problem &problem, crvec xₖ, crvec y, crvec Σ, crvec grad_ψ, crvec v, rvec Hv, rvec work_n1, rvec work_n2, rvec work_m)