12 const auto [N, nx, nu, ny, ny_N] =
dim;
13 std::vector<real_t> dual_residual_sto(sol.solution.size());
21 for (index_t j = 0; j < N; ++j) {
22 auto xuj = x.middle_rows(j * (nx + nu), nx + nu), λj = λ.middle_rows(j * nx, nx),
23 λj_next = λ.middle_rows((j + 1) * nx, nx), yj = y.middle_rows(j * ny, ny);
24 auto rj = dual_residual.middle_rows(j * (nx + nu), nx + nu);
29 for (index_t i = 0; i < nx; ++i)
32 auto xN = x.bottom_rows(nx), λN = λ.bottom_rows(nx), yN = y.bottom_rows(ny_N);
33 auto rN = dual_residual.bottom_rows(nx);
37 for (index_t i = 0; i < nx; ++i)
40 auto stat_norm = std::accumulate(dual_residual.data, dual_residual.data + dual_residual.rows,
44 auto ineq_res_sto = std::vector<real_t>(sol.inequality_multipliers.size());
46 auto compl_norm =
norms.zero();
49 const auto eps = std::numeric_limits<real_t>::epsilon(), big = 1 / (eps * eps);
50 for (index_t j = 0; j < N; ++j) {
51 auto xuj = x.middle_rows(j * (nx + nu), nx + nu), yj = y.middle_rows(j * ny, ny);
53 auto cj = ineq_res.middle_rows(j * ny, ny);
56 for (index_t i = 0; i < ny; ++i) {
58 norms(compl_norm, yj(i, 0) > 0 ? yj(i, 0) * (cj(i, 0) - fmin(ubj(i, 0), +big))
59 : yj(i, 0) * (cj(i, 0) - fmax(lbj(i, 0), -big)));
60 cj(i, 0) -=
clamp(cj(i, 0), lbj(i, 0), ubj(i, 0));
63 auto cN = ineq_res.bottom_rows(ny_N);
66 auto lbN =
b_min().bottom_rows(ny_N), ubN =
b_max().bottom_rows(ny_N);
67 for (index_t i = 0; i < ny_N; ++i) {
69 norms(compl_norm, yN(i, 0) > 0 ? yN(i, 0) * (cN(i, 0) - fmin(ubN(i, 0), +big))
70 : yN(i, 0) * (cN(i, 0) - fmax(lbN(i, 0), -big)));
71 cN(i, 0) -=
clamp(cN(i, 0), lbN(i, 0), ubN(i, 0));
74 std::accumulate(ineq_res.data, ineq_res.data + ineq_res.rows,
norms.zero(),
norms);
78 auto eq_res_sto = std::vector<real_t>(sol.equality_multipliers.size());
81 for (index_t j = 0; j <= N; ++j) {
82 auto xj = x.middle_rows(j * (nx + nu), nx);
83 auto cj = eq_res.middle_rows(j * nx, nx);
84 for (index_t i = 0; i < nx; ++i)
87 auto xu_prev = x.middle_rows((j - 1) * (nx + nu), nx + nu);
91 auto eq_norm = std::accumulate(eq_res.data, eq_res.data + eq_res.rows,
norms.zero(),
norms);
94 .stationarity = stat_norm.norm_inf(),
95 .inequality_residual = ineq_norm.norm_inf(),
96 .equality_residual = eq_norm.norm_inf(),
97 .complementarity = compl_norm.norm_inf(),