15template <index_t VL, StorageOrder DefaultOrder>
23 const auto rhs = [&](
auto,
auto,
auto di,
auto gi,
auto Mᵀλi,
auto Aᵀŷi,
auto Mxbi,
auto Δλi) {
27 ocp.foreach_stage(ctx, rhs, d, grad, Mᵀλ, Aᵀŷ, Mxb, Δλ);
32 ocp.factor_solve(ctx, S, J, d, Δλ);
33 if (ctx.is_master()) {
42 ocp.update_solve(ctx,
ΔΣ, d, Δλ);
43 if (ctx.is_master()) {
49 ocp.solve_forward(ctx, d, Δλ);
53 ocp.solve_reverse_mul(ctx, d, Δλ, MᵀΔλ);
61 ocp.cost_gradient(ctx, d, 1 / S, d, 0, ξ);
67template <index_t VL, StorageOrder DefaultOrder>
79 if (ctx.is_master()) {
80 std::cout <<
" gradient: abs∞="
86 <<
" constraints: abs∞="
92template <index_t VL, StorageOrder DefaultOrder>
99 ctx.run_single_sync([
this] {
105 int prec =
settings.print_precision;
106 using batmat::datapar::hmax;
112 const auto ΣAd = [&](
auto,
auto,
auto Ji,
auto Adi,
auto temp_ineqi) {
119 real_t r_norm_sq = 0, grad_norm_sq = 0, r_norm_inf = 0;
120 real_t r_kkt_norm_sq = 0, r_kkt_norm_inf = 0;
121 const auto resid_simd = [&](
auto gradi,
auto ξi,
auto Mᵀλi,
auto Aᵀŷi,
auto MᵀΔλi,
auto ri) {
123 simd r_kkt_i = gi + MᵀΔλi + ξi;
124 ri += gi + MᵀΔλi + ξi;
125 r_norm_inf = max(r_norm_inf, hmax(abs(ri)));
126 r_norm_sq += reduce(ri * ri);
127 r_kkt_norm_inf = max(r_kkt_norm_inf, hmax(abs(r_kkt_i)));
128 r_kkt_norm_sq += reduce(r_kkt_i * r_kkt_i);
129 grad_norm_sq += reduce(
simd{gi} *
simd{gi});
132 const auto resid_batch = [&](
auto,
auto,
auto gradi,
auto ξi,
auto Mᵀλi,
auto Aᵀŷi,
auto MᵀΔλi,
135 gradi, ξi, Mᵀλi, Aᵀŷi, MᵀΔλi, resi);
137 ocp.foreach_stage(ctx, resid_batch, grad, ξ, Mᵀλ, Aᵀŷ, MᵀΔλ, res);
138 r_norm_sq = ctx.reduce(r_norm_sq);
139 grad_norm_sq = ctx.reduce(grad_norm_sq);
140 r_norm_inf = ctx.reduce(r_norm_inf, [](
auto a,
auto b) {
return max(a, b); });
141 if (!isfinite(r_norm_sq))
142 r_norm_inf = r_norm_sq;
144 std::cout <<
" RESID(stationarity inner): abs∞="
149 <<
" RESID(stationarity outer): abs∞="
155 const auto add_step = [&](
auto,
auto,
auto xi,
auto dii,
auto x_nexti) {
158 ocp.foreach_stage(ctx, add_step, x, d, x_next);
161 real_t inf_res =
norm_inf(ctx, res_x_next);
163 std::cout <<
" RESID(eq. feasibility): abs∞="
Kahan-Babuška-Neumaier compensated summation.
std::string float_to_str(F value, int precision)
void axpy(Vy &&y, const std::array< simdified_value_t< Vy >, sizeof...(Vx)> &alphas, Vx &&...x)
Add scaled vector y = ∑ᵢ αᵢxᵢ + βy.
void transform_elementwise(F &&fun, VA &&A, VAs &&...As)
Apply a function to all elements of the given matrices or vectors, storing the result in the first ar...
void add(VA &&A, VB &&B, VC &&C, with_rotate_t< Rotate >={})
Add two matrices or vectors C = A + B. Rotate affects B.
void copy(VA &&A, VB &&B, Opts... opts)
void hadamard(Vx &&x, Vy &&y, Vz &&z)
Compute the Hadamard (elementwise) product of two vectors z = x ⊙ y.
real_t norm_inf(Context &ctx, const T &x) const
Infinity or max norm of x.
type update_factorization
ineq_constr_vec_t temp_ineq
auto get_timed(Timings::type Timings::*member) const
eq_constr_vec_t eq_constr_vec() const
typename OCP_t::Context Context
CyQPALMBackendSettings settings
var_vec_t var_vec() const
void print_solve_rhs_norms(Context &ctx, const var_vec_t &d, const eq_constr_vec_t &Δλ, const var_vec_t &grad, const var_vec_t &Mᵀλ, const var_vec_t &Aᵀŷ) const
void eq_constr_resid(Context &ctx, const var_vec_t &x, eq_constr_vec_t &Mxb)
ineq_constr_vec_t ineq_constr_vec() const
void print_solve_resid_norms(Context &ctx, const var_vec_t &x, const var_vec_t &d, const var_vec_t &grad, const var_vec_t &ξ, const var_vec_t &Mᵀλ, const var_vec_t &Aᵀŷ, const var_vec_t &MᵀΔλ, const ineq_constr_vec_t &Ad, const active_set_t &J)
void solve(Context &ctx, const var_vec_t &x, const var_vec_t &grad, const var_vec_t &Mᵀλ, const var_vec_t &Aᵀŷ, const eq_constr_vec_t &Mxb, real_t S, const ineq_constr_vec_t &Σ, const active_set_t &J, var_vec_t &d, var_vec_t &ξ, ineq_constr_vec_t &Ad, eq_constr_vec_t &Δλ, var_vec_t &MᵀΔλ)
void mat_vec_A(Context &ctx, const var_vec_t &x, ineq_constr_vec_t &Ax)
typename OCP_t::simd simd
auto norm_inf_l1_sq(Context &ctx, const T &x) const
Compute the infinity, l1 and l2 norms of x.
void mat_vec_AT(Context &ctx, const ineq_constr_vec_t &y, var_vec_t &Aᵀy)