QPALM 1.2.5
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 vec_ew_mid_vec(work->Ax, work->data->bmin, work->data->bmax, work->temp_m, m);
55 vec_add_scaled(work->Ax, work->temp_m, work->temp_m, -1, m);
56 c_float dist2 = vec_prod(work->temp_m, work->temp_m, m);
57 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);
58
59 // Set fields related to sigma
60 vec_ew_recipr(work->sigma, work->sigma_inv, m);
61 vec_ew_sqrt(work->sigma, work->sqrt_sigma, m);
63
65 {
66 work->solver->At_sqrt_sigma = ladel_sparse_free(work->solver->At_sqrt_sigma);
67 work->solver->At_sqrt_sigma = ladel_transpose(work->data->A, TRUE, c);
68 ladel_scale_columns(work->solver->At_sqrt_sigma, work->sqrt_sigma);
69 }
70
71}
72
74
75 work->nb_sigma_changed = 0;
76 c_float *At_scalex = work->solver->At_scale;
77 c_float pri_res_unscaled_norm = vec_norm_inf(work->pri_res, work->data->m);
78 c_float sigma_temp, mult_factor;
79 c_int *sigma_changed = work->solver->enter;
80 size_t k;
81 for (k = 0; k < work->data->m; k++) {
82 if ((c_absval(work->pri_res[k]) > work->settings->theta*c_absval(work->pri_res_in[k])) && work->solver->active_constraints[k]) {
83 mult_factor = c_max(1.0, work->settings->delta * c_absval(work->pri_res[k]) / (pri_res_unscaled_norm + 1e-6));
84 sigma_temp = mult_factor * work->sigma[k];
85 if (sigma_temp <= work->settings->sigma_max) {
86 if (work->sigma[k] != sigma_temp) {
87 sigma_changed[work->nb_sigma_changed] = (c_int)k;
88 work->nb_sigma_changed++;
89 }
90 work->sigma[k] = sigma_temp;
91 work->sigma_inv[k] = 1.0/sigma_temp;
92 mult_factor = c_sqrt(mult_factor);
93 work->sqrt_sigma[k] = mult_factor * work->sqrt_sigma[k];
94 At_scalex[k] = mult_factor;
95 } else {
96 if (work->sigma[k] != work->settings->sigma_max) {
97 sigma_changed[work->nb_sigma_changed] = (c_int)k;
98 work->nb_sigma_changed++;
99 }
100 work->sigma[k] = work->settings->sigma_max;
101 work->sigma_inv[k] = 1.0/work->settings->sigma_max;
102 At_scalex[k] = work->sqrt_sigma_max / work->sqrt_sigma[k];
103 work->sqrt_sigma[k] = work->sqrt_sigma_max;
104 }
105 } else {
106 At_scalex[k] = 1.0;
107 }
108 }
109
110 // TODO implement updating sigma in KKT system
112 ladel_scale_columns(work->solver->At_sqrt_sigma, work->solver->At_scale);
113
114 if (work->solver->first_factorization || (work->settings->proximal && work->gamma < work->settings->gamma_max) ||
115 (work->nb_sigma_changed >
116 c_min(work->settings->max_rank_update_fraction*(work->data->n+work->data->m), 0.25*work->settings->max_rank_update)))
117 {
118 work->solver->reset_newton = TRUE;
119 } else if (work->nb_sigma_changed == 0){
120 /* do nothing */
121 } else {
123 }
124}
125
127
128 if (work->gamma < work->settings->gamma_max)
129 {
130 c_float prev_gamma = work->gamma;
131 work->gamma = c_min(work->gamma*work->settings->gamma_upd, work->settings->gamma_max);
132 work->solver->reset_newton = TRUE;
133 vec_add_scaled(work->Qx, work->x, work->Qx, 1/work->gamma - 1/prev_gamma, work->data->n);
134 }
135
136}
137
139
140 c_float prev_gamma = work->gamma;
141 if (work->solver->nb_active_constraints) {
142 // work->gamma = 1e10;
143 solver_sparse *AtsigmaA = NULL;
144 size_t nb_active = 0;
145 for (size_t i = 0; i < work->data->m; i++){
146 if (work->solver->active_constraints[i]){
147 work->solver->enter[nb_active] = (c_int)i;
148 nb_active++;
149 }
150 }
151 solver_sparse *A = NULL, *At = NULL;
153 {
154 work->gamma = 1e10;
155 // size_t i;
156 // At = ladel_column_submatrix(work->solver->At, work->solver->enter, nb_active);
157 // A = ladel_transpose(At, TRUE, c);
158 // for (i = 0; i < nb_active; i++)
159 // work->temp_m[i] = work->sigma[work->solver->enter[i]];
160 // AtsigmaA = ladel_mat_diag_mat_transpose(At, A, work->temp_m, c);
161 } else if (work->solver->factorization_method == FACTORIZE_SCHUR)
162 {
163 At = ladel_column_submatrix(work->solver->At_sqrt_sigma, work->solver->enter, nb_active);
164 A = ladel_transpose(At, TRUE, c);
165 AtsigmaA = ladel_mat_mat_transpose(At, A, c);
166 work->gamma = c_max(work->settings->gamma_max, 1e14/gershgorin_max(AtsigmaA, work->temp_n, work->neg_dphi));
167 }
168
169 // work->gamma = c_max(work->settings->gamma_max, 1e14/gershgorin_max(AtsigmaA, work->temp_n, work->neg_dphi));
170 work->gamma_maxed = TRUE;
171 A = ladel_sparse_free(A);
172 At = ladel_sparse_free(At);
173 AtsigmaA = ladel_sparse_free(AtsigmaA);
174 } else {
175 work->gamma = 1e12;
176 }
177 if (prev_gamma != work->gamma) {
178 vec_add_scaled(work->Qx, work->x, work->Qx, 1.0/work->gamma - 1.0/prev_gamma, work->data->n);
179 vec_add_scaled(work->Qd, work->d, work->Qd, work->tau/work->gamma - work->tau/prev_gamma, work->data->n);
180 work->solver->reset_newton = TRUE;
181 }
182}
183
185{
186 if (!work->gamma_maxed && iter_out > 0 && work->solver->nb_enter == 0
187 && work->solver->nb_leave == 0 && work->info->pri_res_norm < work->eps_pri)
188 {
189 //Axys = Ax + y./sigma
190 vec_ew_div(work->y, work->sigma, work->temp_m, work->data->m);
191 vec_add_scaled(work->Ax, work->temp_m, work->Axys, 1, work->data->m);
194 if (work->solver->nb_enter == 0 && work->solver->nb_leave == 0)
195 {
196 boost_gamma(work, c);
197 }
198 else
199 {
200 update_gamma(work);
201 }
202 }
203 else
204 {
205 update_gamma(work);
206 }
207}
208
210{
211 if (work->settings->nonconvex)
212 {
213 c_float eps_k;
214 c_int m = work->data->m;
215 if (work->settings->scaling)
216 {
217 /**NB Implementation detail: store Einv*Ax and Einv*z in temp_2m.
218 * The infinity norm of that vector is then equal to the maximum of both norms. */
219 vec_ew_prod(work->scaling->Einv, work->Ax, work->temp_2m, m);
220 vec_ew_prod(work->scaling->Einv, work->z, work->temp_2m + m, m);
221 eps_k = (*eps_k_abs) + (*eps_k_rel)*vec_norm_inf(work->temp_2m, 2 * m);
222 }
223 else
224 {
225 eps_k = (*eps_k_abs) + (*eps_k_rel)*c_max(vec_norm_inf(work->Ax, m), vec_norm_inf(work->z, m));
226 }
227
228 if (work->info->pri_res_norm < eps_k)
229 {
230 prea_vec_copy(work->x, work->x0, work->data->n);
231 *eps_k_abs = c_max(work->settings->eps_abs, work->settings->rho*(*eps_k_abs));
232 *eps_k_rel = c_max(work->settings->eps_rel, work->settings->rho*(*eps_k_rel));
233 }
234 else
235 {
236 /* We do not update the tolerances and proximal point in this case */
237 }
238 }
239 else
240 {
241 if(work->settings->proximal)
242 {
243 update_or_boost_gamma(work, c, iter_out);
244 prea_vec_copy(work->x, work->x0, work->data->n);
245 }
246 }
247}
248
250{
251 c_int n = work->data->n, m = work->data->m;
252
253 if (iter_out > 0 && work->info->pri_res_norm > work->eps_pri)
254 {
255 update_sigma(work, c);
256 }
257
258 prea_vec_copy(work->yh, work->y, m);
259 prea_vec_copy(work->Atyh, work->Aty, n);
260
261 work->eps_abs_in = c_max(work->settings->eps_abs, work->settings->rho*work->eps_abs_in);
262 work->eps_rel_in = c_max(work->settings->eps_rel, work->settings->rho*work->eps_rel_in);
263
264 update_proximal_point_and_penalty(work, c, iter_out, eps_k_abs, eps_k_rel);
265
266 prea_vec_copy(work->pri_res, work->pri_res_in, m);
267}
268
270
271 newton_set_direction(work, c);
272
273 work->tau = exact_linesearch(work, c);
274
275 //x_prev = x
276 prea_vec_copy(work->x, work->x_prev, work->data->n);
277 //dphi_prev = dphi
278 prea_vec_copy(work->dphi, work->dphi_prev, work->data->n);
279 //x = x+tau*d
280 vec_add_scaled(work->x, work->d, work->x, work->tau, work->data->n);
281 vec_self_mult_scalar(work->Qd, work->tau, work->data->n); //Qdx used in dua_infeas check
282 vec_self_mult_scalar(work->Ad, work->tau, work->data->m); //Adx used in dua_infeas check
283 vec_add_scaled(work->Qx, work->Qd, work->Qx, 1, work->data->n);
284 vec_add_scaled(work->Ax, work->Ad, work->Ax, 1, work->data->m);
285}
286
288
289 c_float objective = 0;
290 size_t n = work->data->n;
291 size_t i = 0;
292
293 if (work->settings->proximal) {
294 if(n >= 4) {
295 for (; i <= n-4; i+=4) {
296 objective += (0.5*(work->Qx[i] - 1/work->gamma*work->x[i]) + work->data->q[i])*work->x[i]
297 + (0.5*(work->Qx[i+1] - 1/work->gamma*work->x[i+1]) + work->data->q[i+1])*work->x[i+1]
298 + (0.5*(work->Qx[i+2] - 1/work->gamma*work->x[i+2]) + work->data->q[i+2])*work->x[i+2]
299 + (0.5*(work->Qx[i+3] - 1/work->gamma*work->x[i+3]) + work->data->q[i+3])*work->x[i+3];
300 }
301 }
302 for (; i < n; i++) {
303 objective += (0.5*(work->Qx[i] - 1/work->gamma*work->x[i])+ work->data->q[i])*work->x[i];
304 }
305 } else {
306 if(n >= 4) {
307 for (; i <= n-4; i+=4) {
308 objective += (0.5*work->Qx[i] + work->data->q[i])*work->x[i]
309 + (0.5*work->Qx[i+1] + work->data->q[i+1])*work->x[i+1]
310 + (0.5*work->Qx[i+2] + work->data->q[i+2])*work->x[i+2]
311 + (0.5*work->Qx[i+3] + work->data->q[i+3])*work->x[i+3];
312 }
313 }
314 for (; i < n; i++) {
315 objective += (0.5*work->Qx[i] + work->data->q[i])*work->x[i];
316 }
317 }
318
319 if (work->settings->scaling) {
320 objective *= work->scaling->cinv;
321 }
322
323 objective += work->data->c;
324
325 return objective;
326}
327
329
330 c_float dual_objective = 0;
331
332 vec_add_scaled(work->Aty, work->data->q, work->neg_dphi, 1.0, work->data->n);
333 ladel_dense_solve(work->solver->LD_Q, work->neg_dphi, work->D_temp, c);
334
335 dual_objective -= 0.5*vec_prod(work->neg_dphi, work->D_temp, work->data->n);
336 for (size_t i = 0; i < work->data->m; i++) {
337 dual_objective -= work->y[i] > 0 ? work->y[i]*work->data->bmax[i] : work->y[i]*work->data->bmin[i];
338 }
339
340 if(work->settings->scaling) {
341 dual_objective *= work->scaling->cinv;
342 }
343
344 dual_objective += work->data->c;
345
346 return dual_objective;
347}
#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:328
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:249
void update_gamma(QPALMWorkspace *work)
Update the proximal penalty.
Definition iteration.c:126
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:209
void update_sigma(QPALMWorkspace *work, solver_common *c)
Update the penalty factors.
Definition iteration.c:73
void update_or_boost_gamma(QPALMWorkspace *work, solver_common *c, c_int iter_out)
Definition iteration.c:184
void update_primal_iterate(QPALMWorkspace *work, solver_common *c)
Update the primal iterate.
Definition iteration.c:269
c_float compute_objective(QPALMWorkspace *work)
Compute the (unscaled) primal objective value at the current iterate.
Definition iteration.c:287
void boost_gamma(QPALMWorkspace *work, solver_common *c)
Maximize the proximal penalty.
Definition iteration.c:138
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.