QPALM 1.3.0
Proximal Augmented Lagrangian method for Quadratic Programs
Loading...
Searching...
No Matches
iteration.c
Go to the documentation of this file.
1/**
2 * @file iteration.c
3 * @author Ben Hermans
4 * @brief QPALM main solver routines.
5 * @details This file contains the functions that make up the qpalm algorithm (the functions that qpalm_solve will use).
6 * These include the computation of the residuals at the start of the iteration,
7 * the update of the primal variables in an inner iteration,
8 * the update of the penalty factors and dual variables in an outer iteration,
9 * the computation of the primal and dual objective values, etc.
10 */
11
12#include <qpalm/iteration.h>
13#include <qpalm/lin_alg.h>
15#include <qpalm/newton.h>
16#include <qpalm/linesearch.h>
17#include <qpalm/nonconvex.h>
18#include <qpalm/util.h>
19
20#include <ladel.h>
21
23
24 //Axys = Ax + y./sigma
25 vec_ew_prod(work->y, work->sigma_inv, work->temp_m, work->data->m);
26 vec_add_scaled(work->Ax, work->temp_m, work->Axys, 1, work->data->m);
27 //z = min(max(Axys,bmin),bmax)
28 vec_ew_mid_vec(work->Axys, work->data->bmin, work->data->bmax, work->z, work->data->m);
29 //pri_res = Ax-z
30 vec_add_scaled(work->Ax, work->z, work->pri_res, -1, work->data->m);
31 //yh = y + pri_res.*sigma
32 vec_ew_prod(work->pri_res, work->sigma, work->temp_m, work->data->m);
33 vec_add_scaled(work->y, work->temp_m, work->yh, 1, work->data->m);
34 //df = Qx + q
35 vec_add_scaled(work->Qx, work->data->q, work->df, 1, work->data->n);
36
37 if (work->settings->proximal) {
38 //df = Qx + q +1/gamma*(x-x0)
39 // NB work->Qx contains Qx+1/gamma*x
40 vec_add_scaled(work->df, work->x0, work->df, -1/work->gamma, work->data->n);
41 }
42 // Atyh = A'*yh
43 mat_tpose_vec(work->data->A, work->solver->yh, work->solver->Atyh, c);
44 //dphi = df+Atyh
45 vec_add_scaled(work->df, work->Atyh, work->dphi, 1, work->data->n);
46}
47
49
50 // Compute initial sigma
51 size_t n = work->data->n;
52 size_t m = work->data->m;
53 c_float f = 0.5*vec_prod(work->x, work->Qx, n) + vec_prod(work->data->q, work->x, n);
54 if (work->settings->proximal) {
55 f -= 0.5/work->gamma*vec_prod(work->x, work->x, n);
56 }
57 vec_ew_mid_vec(work->Ax, work->data->bmin, work->data->bmax, work->temp_m, m);
58 vec_add_scaled(work->Ax, work->temp_m, work->temp_m, -1, m);
59 c_float dist2 = vec_prod(work->temp_m, work->temp_m, m);
60 vec_set_scalar(work->sigma, c_max(1e-4, c_min(work->settings->sigma_init*c_max(1,c_absval(f))/c_max(1,0.5*dist2),1e4)), m);
61
62 // Set fields related to sigma
63 vec_ew_recipr(work->sigma, work->sigma_inv, m);
64 vec_ew_sqrt(work->sigma, work->sqrt_sigma, m);
66
68 {
69 work->solver->At_sqrt_sigma = ladel_sparse_free(work->solver->At_sqrt_sigma);
70 work->solver->At_sqrt_sigma = ladel_transpose(work->data->A, TRUE, c);
71 ladel_scale_columns(work->solver->At_sqrt_sigma, work->sqrt_sigma);
72 }
73
74}
75
77
78 work->nb_sigma_changed = 0;
79 c_float *At_scalex = work->solver->At_scale;
80 c_float pri_res_unscaled_norm = vec_norm_inf(work->pri_res, work->data->m);
81 c_float sigma_temp, mult_factor;
82 c_int *sigma_changed = work->solver->enter;
83 size_t k;
84 for (k = 0; k < work->data->m; k++) {
85 if ((c_absval(work->pri_res[k]) > work->settings->theta*c_absval(work->pri_res_in[k])) && work->solver->active_constraints[k]) {
86 mult_factor = c_max(1.0, work->settings->delta * c_absval(work->pri_res[k]) / (pri_res_unscaled_norm + 1e-6));
87 sigma_temp = mult_factor * work->sigma[k];
88 if (sigma_temp <= work->settings->sigma_max) {
89 if (work->sigma[k] != sigma_temp) {
90 sigma_changed[work->nb_sigma_changed] = (c_int)k;
91 work->nb_sigma_changed++;
92 }
93 work->sigma[k] = sigma_temp;
94 work->sigma_inv[k] = 1.0/sigma_temp;
95 mult_factor = c_sqrt(mult_factor);
96 work->sqrt_sigma[k] = mult_factor * work->sqrt_sigma[k];
97 At_scalex[k] = mult_factor;
98 } else {
99 if (work->sigma[k] != work->settings->sigma_max) {
100 sigma_changed[work->nb_sigma_changed] = (c_int)k;
101 work->nb_sigma_changed++;
102 }
103 work->sigma[k] = work->settings->sigma_max;
104 work->sigma_inv[k] = 1.0/work->settings->sigma_max;
105 At_scalex[k] = work->sqrt_sigma_max / work->sqrt_sigma[k];
106 work->sqrt_sigma[k] = work->sqrt_sigma_max;
107 }
108 } else {
109 At_scalex[k] = 1.0;
110 }
111 }
112
113 // TODO implement updating sigma in KKT system
115 ladel_scale_columns(work->solver->At_sqrt_sigma, work->solver->At_scale);
116
117 if (work->solver->first_factorization || (work->settings->proximal && work->gamma < work->settings->gamma_max) ||
118 (work->nb_sigma_changed >
119 c_min(work->settings->max_rank_update_fraction*(work->data->n+work->data->m), 0.25*work->settings->max_rank_update)))
120 {
121 work->solver->reset_newton = TRUE;
122 } else if (work->nb_sigma_changed == 0){
123 /* do nothing */
124 } else {
126 }
127}
128
130
131 if (work->gamma < work->settings->gamma_max)
132 {
133 c_float prev_gamma = work->gamma;
134 work->gamma = c_min(work->gamma*work->settings->gamma_upd, work->settings->gamma_max);
135 work->solver->reset_newton = TRUE;
136 vec_add_scaled(work->Qx, work->x, work->Qx, 1/work->gamma - 1/prev_gamma, work->data->n);
137 }
138
139}
140
142
143 c_float prev_gamma = work->gamma;
144 if (work->solver->nb_active_constraints) {
145 // work->gamma = 1e10;
146 solver_sparse *AtsigmaA = NULL;
147 size_t nb_active = 0;
148 for (size_t i = 0; i < work->data->m; i++){
149 if (work->solver->active_constraints[i]){
150 work->solver->enter[nb_active] = (c_int)i;
151 nb_active++;
152 }
153 }
154 solver_sparse *A = NULL, *At = NULL;
156 {
157 work->gamma = 1e10;
158 // size_t i;
159 // At = ladel_column_submatrix(work->solver->At, work->solver->enter, nb_active);
160 // A = ladel_transpose(At, TRUE, c);
161 // for (i = 0; i < nb_active; i++)
162 // work->temp_m[i] = work->sigma[work->solver->enter[i]];
163 // AtsigmaA = ladel_mat_diag_mat_transpose(At, A, work->temp_m, c);
164 } else if (work->solver->factorization_method == FACTORIZE_SCHUR)
165 {
166 At = ladel_column_submatrix(work->solver->At_sqrt_sigma, work->solver->enter, nb_active);
167 A = ladel_transpose(At, TRUE, c);
168 AtsigmaA = ladel_mat_mat_transpose(At, A, c);
169 work->gamma = c_max(work->settings->gamma_max, 1e14/gershgorin_max(AtsigmaA, work->temp_n, work->neg_dphi));
170 }
171
172 // work->gamma = c_max(work->settings->gamma_max, 1e14/gershgorin_max(AtsigmaA, work->temp_n, work->neg_dphi));
173 work->gamma_maxed = TRUE;
174 A = ladel_sparse_free(A);
175 At = ladel_sparse_free(At);
176 AtsigmaA = ladel_sparse_free(AtsigmaA);
177 } else {
178 work->gamma = 1e12;
179 }
180 if (prev_gamma != work->gamma) {
181 vec_add_scaled(work->Qx, work->x, work->Qx, 1.0/work->gamma - 1.0/prev_gamma, work->data->n);
182 vec_add_scaled(work->Qd, work->d, work->Qd, work->tau/work->gamma - work->tau/prev_gamma, work->data->n);
183 work->solver->reset_newton = TRUE;
184 }
185}
186
188{
189 if (!work->gamma_maxed && iter_out > 0 && work->solver->nb_enter == 0
190 && work->solver->nb_leave == 0 && work->info->pri_res_norm < work->eps_pri)
191 {
192 //Axys = Ax + y./sigma
193 vec_ew_div(work->y, work->sigma, work->temp_m, work->data->m);
194 vec_add_scaled(work->Ax, work->temp_m, work->Axys, 1, work->data->m);
197 if (work->solver->nb_enter == 0 && work->solver->nb_leave == 0)
198 {
199 boost_gamma(work, c);
200 }
201 else
202 {
203 update_gamma(work);
204 }
205 }
206 else
207 {
208 update_gamma(work);
209 }
210}
211
213{
214 if (work->settings->nonconvex)
215 {
216 c_float eps_k;
217 c_int m = work->data->m;
218 if (work->settings->scaling)
219 {
220 /**NB Implementation detail: store Einv*Ax and Einv*z in temp_2m.
221 * The infinity norm of that vector is then equal to the maximum of both norms. */
222 vec_ew_prod(work->scaling->Einv, work->Ax, work->temp_2m, m);
223 vec_ew_prod(work->scaling->Einv, work->z, work->temp_2m + m, m);
224 eps_k = (*eps_k_abs) + (*eps_k_rel)*vec_norm_inf(work->temp_2m, 2 * m);
225 }
226 else
227 {
228 eps_k = (*eps_k_abs) + (*eps_k_rel)*c_max(vec_norm_inf(work->Ax, m), vec_norm_inf(work->z, m));
229 }
230
231 if (work->info->pri_res_norm < eps_k)
232 {
233 prea_vec_copy(work->x, work->x0, work->data->n);
234 *eps_k_abs = c_max(work->settings->eps_abs, work->settings->rho*(*eps_k_abs));
235 *eps_k_rel = c_max(work->settings->eps_rel, work->settings->rho*(*eps_k_rel));
236 }
237 else
238 {
239 /* We do not update the tolerances and proximal point in this case */
240 }
241 }
242 else
243 {
244 if(work->settings->proximal)
245 {
246 update_or_boost_gamma(work, c, iter_out);
247 prea_vec_copy(work->x, work->x0, work->data->n);
248 }
249 }
250}
251
253{
254 c_int n = work->data->n, m = work->data->m;
255
256 if (iter_out > 0 && work->info->pri_res_norm > work->eps_pri)
257 {
258 update_sigma(work, c);
259 }
260
261 prea_vec_copy(work->yh, work->y, m);
262 prea_vec_copy(work->Atyh, work->Aty, n);
263
264 work->eps_abs_in = c_max(work->settings->eps_abs, work->settings->rho*work->eps_abs_in);
265 work->eps_rel_in = c_max(work->settings->eps_rel, work->settings->rho*work->eps_rel_in);
266
267 update_proximal_point_and_penalty(work, c, iter_out, eps_k_abs, eps_k_rel);
268
269 prea_vec_copy(work->pri_res, work->pri_res_in, m);
270}
271
273
274 newton_set_direction(work, c);
275
276 work->tau = exact_linesearch(work, c);
277
278 //x_prev = x
279 prea_vec_copy(work->x, work->x_prev, work->data->n);
280 //dphi_prev = dphi
281 prea_vec_copy(work->dphi, work->dphi_prev, work->data->n);
282 //x = x+tau*d
283 vec_add_scaled(work->x, work->d, work->x, work->tau, work->data->n);
284 vec_self_mult_scalar(work->Qd, work->tau, work->data->n); //Qdx used in dua_infeas check
285 vec_self_mult_scalar(work->Ad, work->tau, work->data->m); //Adx used in dua_infeas check
286 vec_add_scaled(work->Qx, work->Qd, work->Qx, 1, work->data->n);
287 vec_add_scaled(work->Ax, work->Ad, work->Ax, 1, work->data->m);
288}
289
291
292 c_float objective = 0;
293 size_t n = work->data->n;
294 size_t i = 0;
295
296 if (work->settings->proximal) {
297 if(n >= 4) {
298 for (; i <= n-4; i+=4) {
299 objective += (0.5*(work->Qx[i] - 1/work->gamma*work->x[i]) + work->data->q[i])*work->x[i]
300 + (0.5*(work->Qx[i+1] - 1/work->gamma*work->x[i+1]) + work->data->q[i+1])*work->x[i+1]
301 + (0.5*(work->Qx[i+2] - 1/work->gamma*work->x[i+2]) + work->data->q[i+2])*work->x[i+2]
302 + (0.5*(work->Qx[i+3] - 1/work->gamma*work->x[i+3]) + work->data->q[i+3])*work->x[i+3];
303 }
304 }
305 for (; i < n; i++) {
306 objective += (0.5*(work->Qx[i] - 1/work->gamma*work->x[i])+ work->data->q[i])*work->x[i];
307 }
308 } else {
309 if(n >= 4) {
310 for (; i <= n-4; i+=4) {
311 objective += (0.5*work->Qx[i] + work->data->q[i])*work->x[i]
312 + (0.5*work->Qx[i+1] + work->data->q[i+1])*work->x[i+1]
313 + (0.5*work->Qx[i+2] + work->data->q[i+2])*work->x[i+2]
314 + (0.5*work->Qx[i+3] + work->data->q[i+3])*work->x[i+3];
315 }
316 }
317 for (; i < n; i++) {
318 objective += (0.5*work->Qx[i] + work->data->q[i])*work->x[i];
319 }
320 }
321
322 if (work->settings->scaling) {
323 objective *= work->scaling->cinv;
324 }
325
326 objective += work->data->c;
327
328 return objective;
329}
330
332
333 c_float dual_objective = 0;
334
335 vec_add_scaled(work->Atyh, work->data->q, work->neg_dphi, 1.0, work->data->n);
336 ladel_dense_solve(work->solver->LD_Q, work->neg_dphi, work->D_temp, c);
337
338 dual_objective -= 0.5*vec_prod(work->neg_dphi, work->D_temp, work->data->n);
339 for (size_t i = 0; i < work->data->m; i++) {
340 dual_objective -= work->yh[i] > 0 ? work->yh[i]*work->data->bmax[i] : work->yh[i]*work->data->bmin[i];
341 }
342
343 if(work->settings->scaling) {
344 dual_objective *= work->scaling->cinv;
345 }
346
347 dual_objective += work->data->c;
348
349 return dual_objective;
350}
#define FACTORIZE_SCHUR
factorize the Schur complement
Definition constants.h:108
#define TRUE
Definition constants.h:18
#define FACTORIZE_KKT
factorize the kkt system
Definition constants.h:107
#define c_sqrt
square root
ladel_int c_int
type for integer numbers
Definition global_opts.h:42
ladel_double c_float
type for floating point numbers
Definition global_opts.h:41
#define c_max(a, b)
maximum of two values
Definition global_opts.h:96
#define c_absval(x)
absolute value
Definition global_opts.h:92
#define c_min(a, b)
minimum of two values
void initialize_sigma(QPALMWorkspace *work, solver_common *c)
Initialize penalty factors from initial x.
Definition iteration.c:48
c_float compute_dual_objective(QPALMWorkspace *work, solver_common *c)
Compute the (unscaled) dual objective value at the current iterate.
Definition iteration.c:331
void update_dual_iterate_and_parameters(QPALMWorkspace *work, solver_common *c, c_int iter_out, c_float *eps_k_abs, c_float *eps_k_rel)
Definition iteration.c:252
void update_gamma(QPALMWorkspace *work)
Update the proximal penalty.
Definition iteration.c:129
void update_proximal_point_and_penalty(QPALMWorkspace *work, solver_common *c, c_int iter_out, c_float *eps_k_abs, c_float *eps_k_rel)
Definition iteration.c:212
void update_sigma(QPALMWorkspace *work, solver_common *c)
Update the penalty factors.
Definition iteration.c:76
void update_or_boost_gamma(QPALMWorkspace *work, solver_common *c, c_int iter_out)
Definition iteration.c:187
void update_primal_iterate(QPALMWorkspace *work, solver_common *c)
Update the primal iterate.
Definition iteration.c:272
c_float compute_objective(QPALMWorkspace *work)
Compute the (unscaled) primal objective value at the current iterate.
Definition iteration.c:290
void boost_gamma(QPALMWorkspace *work, solver_common *c)
Maximize the proximal penalty.
Definition iteration.c:141
void compute_residuals(QPALMWorkspace *work, solver_common *c)
Compute the residuals (in vector form)
Definition iteration.c:22
QPALM main solver routines.
void vec_add_scaled(const c_float *a, const c_float *b, c_float *c, c_float sc, size_t n)
Scaled addition of one vector to another vector, .
Definition lin_alg.c:110
void vec_set_scalar(c_float *a, c_float sc, size_t n)
Fill float vector with a scalar value.
Definition lin_alg.c:40
void vec_ew_div(const c_float *a, const c_float *b, c_float *c, size_t n)
Elementwise division, .
Definition lin_alg.c:101
void vec_self_mult_scalar(c_float *a, c_float sc, size_t n)
Mulitply vector with a constant scale factor.
Definition lin_alg.c:56
void vec_ew_mid_vec(const c_float *a, const c_float *bmin, const c_float *bmax, c_float *c, size_t n)
Elementwise mid between vectors, .
Definition lin_alg.c:200
void vec_ew_prod(const c_float *a, const c_float *b, c_float *c, size_t n)
Elementwise product, .
Definition lin_alg.c:92
c_float vec_prod(const c_float *a, const c_float *b, size_t n)
Inner product between two vectors, .
Definition lin_alg.c:72
void prea_vec_copy(const c_float *a, c_float *b, size_t n)
Copy vector a into preallocated vector b.
Definition lin_alg.c:24
c_float vec_norm_inf(const c_float *a, size_t n)
Infinity norm of a vector, .
Definition lin_alg.c:126
void vec_ew_recipr(const c_float *a, c_float *b, size_t n)
Elementwise reciprocal .
Definition lin_alg.c:176
void vec_ew_sqrt(const c_float *a, c_float *b, size_t n)
Elementwise square root, .
Definition lin_alg.c:208
Linear algebra with vectors.
c_float exact_linesearch(QPALMWorkspace *work, solver_common *c)
Execute exact linesearch (using qsort)
Definition linesearch.c:14
Routines to perform exact linesearch.
void set_entering_leaving_constraints(QPALMWorkspace *work)
Determines the entering and leaving constraints and stores them in work->solver->enter and work->solv...
Definition newton.c:134
void set_active_constraints(QPALMWorkspace *work)
Computes the set of active constraints and stores it in work->solver->active_constraints.
Definition newton.c:122
void newton_set_direction(QPALMWorkspace *work, solver_common *c)
Sets work->d to the direction calculated by the semismooth Newton method.
Definition newton.c:17
Functions to calculate the semismooth Newton direction.
c_float gershgorin_max(solver_sparse *M, c_float *center, c_float *radius)
Calculate the Gershgorin upper bound for the eigenvalues of a symmetric matrix.
Definition nonconvex.c:353
Routines to deal with nonconvex QPs.
void ldlupdate_sigma_changed(QPALMWorkspace *work, solver_common *c)
Update the factorization given a set of indexes where has been updated.
void mat_tpose_vec(solver_sparse *A, solver_dense *x, solver_dense *y, solver_common *c)
Matrix-transpose-vector multiplication.
Interface and wrapper to matrix/factorization (ladel) functions.
size_t m
number of constraints m
Definition types.h:111
c_float * bmin
dense array for lower bounds (size m)
Definition types.h:116
c_float c
constant part of cost
Definition types.h:115
size_t n
number of variables n
Definition types.h:110
c_float * q
dense array for linear part of cost function (size n)
Definition types.h:114
solver_sparse * A
sparse linear constraints matrix A (size m x n)
Definition types.h:113
c_float * bmax
dense array for upper bounds (size m)
Definition types.h:117
c_float pri_res_norm
norm of primal residual
Definition types.h:87
c_float * Einv
dual variable rescaling
Definition types.h:72
c_float cinv
objective rescaling
Definition types.h:74
c_float gamma_upd
proximal penalty update factor
Definition types.h:140
c_float sigma_max
penalty factor cap
Definition types.h:136
c_float gamma_max
proximal penalty parameter cap
Definition types.h:141
c_int proximal
boolean, use proximal method of multipliers or not
Definition types.h:138
c_float delta
penalty update factor
Definition types.h:135
c_float sigma_init
initial penalty parameter (guideline)
Definition types.h:137
c_float rho
tolerance scaling factor
Definition types.h:131
c_float theta
penalty update criterion parameter
Definition types.h:134
c_int max_rank_update
maximum rank for the sparse factorization update
Definition types.h:153
c_float max_rank_update_fraction
maximum rank (relative to n+m) for the factorization update
Definition types.h:154
c_float eps_rel
relative convergence tolerance
Definition types.h:128
c_int scaling
scaling iterations, if 0 then scaling is disabled
Definition types.h:142
c_int nonconvex
boolean, indicates whether the QP is nonconvex
Definition types.h:143
c_float eps_abs
absolute convergence tolerance
Definition types.h:127
solver_sparse * At_sqrt_sigma
A' * sqrt(sigma)
Definition types.h:193
c_int * active_constraints
index set of active constraints
Definition types.h:185
solver_dense * yh
candidate dual update
Definition types.h:181
c_int reset_newton
boolean, after sigma is updated perform a new factorization
Definition types.h:184
c_int factorization_method
factorize KKT or Schur complement
Definition types.h:163
c_int * enter
index set of entering constraints
Definition types.h:188
c_int first_factorization
boolean, indicate we have not factorized previously
Definition types.h:183
solver_dense * At_scale
running vector of sqrt(sigma), used to scale At_sqrt_sigma
Definition types.h:192
solver_dense * Atyh
A' * yh.
Definition types.h:182
solver_factor * LD_Q
LD factor of Q (useful in computing dual objective)
Definition types.h:171
c_int nb_leave
number of leaving constraints
Definition types.h:191
c_int nb_active_constraints
number of active constraints
Definition types.h:187
c_int nb_enter
number of entering constraints
Definition types.h:189
QPALM Workspace.
Definition types.h:204
c_float * x
primal iterate
Definition types.h:211
c_float * y
dual iterate
Definition types.h:212
c_float * yh
candidate dual update
Definition types.h:236
QPALMScaling * scaling
scaling vectors
Definition types.h:313
c_int nb_sigma_changed
number of sigma-components that changed in an outer iteration (relevant for factorization update)
Definition types.h:229
c_float * D_temp
temporary primal variable scaling vectors
Definition types.h:306
c_float eps_pri
primal tolerance
Definition types.h:275
c_float * Ax
scaled A * x
Definition types.h:213
QPALMInfo * info
solver information
Definition types.h:315
c_float * z
projection of Axys onto the constraint set [bmin, bmax]
Definition types.h:233
c_float * pri_res_in
intermediate primal residual
Definition types.h:235
c_float * temp_m
placeholder for vector of size m
Definition types.h:224
c_float * pri_res
primal residual
Definition types.h:234
c_float tau
stepsize
Definition types.h:252
c_float * sqrt_sigma
elementwise sqrt(sigma)
Definition types.h:255
c_float * sigma
penalty vector
Definition types.h:226
c_float * x_prev
previous primal iterate
Definition types.h:216
c_float * neg_dphi
-dphi, required as the rhs in SCHUR
Definition types.h:242
c_float * Axys
Ax + y./sigma.
Definition types.h:232
c_int gamma_maxed
flag to indicate whether gamma has been maximized when the primal residual was low
Definition types.h:231
c_float sqrt_sigma_max
sqrt(sigma_max)
Definition types.h:228
c_float * Qx
scaled Q * x
Definition types.h:214
c_float * dphi_prev
previous gradient of the Lagrangian
Definition types.h:243
c_float eps_rel_in
intermediate relative tolerance
Definition types.h:279
QPALMSettings * settings
problem settings
Definition types.h:312
c_float * x0
record of the primal iterate during the last dual update
Definition types.h:239
c_float * sigma_inv
1./sigma
Definition types.h:227
c_float gamma
proximal penalty factor
Definition types.h:230
c_float * dphi
gradient of the Lagrangian
Definition types.h:241
c_float * df
gradient of the primal objective (+proximal term)
Definition types.h:238
QPALMSolver * solver
linsys variables
Definition types.h:311
c_float * temp_2m
placeholder for vector of size 2m
Definition types.h:261
c_float * Ad
A * d.
Definition types.h:254
c_float * Aty
A' * y (useful for saving one mat_tpose_vec)
Definition types.h:215
c_float eps_abs_in
intermediate absolute tolerance
Definition types.h:278
QPALMData * data
problem data to work on (possibly scaled)
Definition types.h:205
c_float * Qd
Q * d.
Definition types.h:253
c_float * temp_n
placeholder for vector of size n
Definition types.h:225
c_float * d
primal update step
Definition types.h:244
c_float * Atyh
A' * yh.
Definition types.h:237
ladel_work solver_common
Definition types.h:25
ladel_sparse_matrix solver_sparse
Definition types.h:26
Utility functions.