scs 0.3.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +14 -0
- data/README.md +42 -13
- data/lib/scs/ffi.rb +1 -7
- data/lib/scs/matrix.rb +72 -0
- data/lib/scs/solver.rb +19 -26
- data/lib/scs/version.rb +1 -1
- data/lib/scs.rb +1 -0
- data/vendor/scs/CITATION.cff +1 -1
- data/vendor/scs/CMakeLists.txt +55 -7
- data/vendor/scs/Makefile +9 -9
- data/vendor/scs/README.md +4 -1
- data/vendor/scs/include/aa.h +1 -1
- data/vendor/scs/include/cones.h +17 -12
- data/vendor/scs/include/glbopts.h +27 -66
- data/vendor/scs/include/linalg.h +2 -1
- data/vendor/scs/include/linsys.h +13 -13
- data/vendor/scs/include/normalize.h +7 -5
- data/vendor/scs/include/rw.h +3 -3
- data/vendor/scs/include/scs.h +85 -106
- data/vendor/scs/include/scs_types.h +34 -0
- data/vendor/scs/include/scs_work.h +80 -0
- data/vendor/scs/include/util.h +3 -1
- data/vendor/scs/linsys/cpu/direct/private.c +86 -73
- data/vendor/scs/linsys/cpu/direct/private.h +2 -2
- data/vendor/scs/linsys/cpu/indirect/private.c +42 -33
- data/vendor/scs/linsys/cpu/indirect/private.h +1 -2
- data/vendor/scs/linsys/csparse.c +3 -3
- data/vendor/scs/linsys/external/amd/LICENSE.txt +0 -897
- data/vendor/scs/linsys/external/amd/SuiteSparse_config.c +9 -7
- data/vendor/scs/linsys/external/amd/SuiteSparse_config.h +1 -1
- data/vendor/scs/linsys/external/amd/amd_order.c +5 -5
- data/vendor/scs/linsys/gpu/gpu.h +8 -11
- data/vendor/scs/linsys/gpu/indirect/private.c +72 -49
- data/vendor/scs/linsys/gpu/indirect/private.h +14 -13
- data/vendor/scs/linsys/scs_matrix.c +55 -104
- data/vendor/scs/linsys/scs_matrix.h +5 -4
- data/vendor/scs/scs.mk +1 -5
- data/vendor/scs/src/aa.c +13 -8
- data/vendor/scs/src/cones.c +197 -108
- data/vendor/scs/src/linalg.c +25 -0
- data/vendor/scs/src/normalize.c +75 -26
- data/vendor/scs/src/rw.c +74 -30
- data/vendor/scs/src/scs.c +300 -264
- data/vendor/scs/src/scs_version.c +8 -6
- data/vendor/scs/src/util.c +27 -13
- data/vendor/scs/test/minunit.h +6 -1
- data/vendor/scs/test/problem_utils.h +28 -35
- data/vendor/scs/test/problems/degenerate.h +2 -1
- data/vendor/scs/test/problems/hs21_tiny_qp.h +2 -1
- data/vendor/scs/test/problems/hs21_tiny_qp_rw.h +6 -2
- data/vendor/scs/test/problems/infeasible_tiny_qp.h +2 -1
- data/vendor/scs/test/problems/qafiro_tiny_qp.h +5 -4
- data/vendor/scs/test/problems/random_prob.h +6 -2
- data/vendor/scs/test/problems/rob_gauss_cov_est.h +9 -2
- data/vendor/scs/test/problems/small_lp.h +7 -2
- data/vendor/scs/test/problems/small_qp.h +387 -0
- data/vendor/scs/test/problems/{test_fails.h → test_validation.h} +7 -4
- data/vendor/scs/test/problems/unbounded_tiny_qp.h +4 -4
- data/vendor/scs/test/random_socp_prob.c +4 -2
- data/vendor/scs/test/run_from_file.c +16 -4
- data/vendor/scs/test/run_tests.c +23 -14
- metadata +10 -35
- data/vendor/scs/linsys/cpu/direct/private.o +0 -0
- data/vendor/scs/linsys/cpu/indirect/private.o +0 -0
- data/vendor/scs/linsys/csparse.o +0 -0
- data/vendor/scs/linsys/external/amd/SuiteSparse_config.o +0 -0
- data/vendor/scs/linsys/external/amd/amd_1.o +0 -0
- data/vendor/scs/linsys/external/amd/amd_2.o +0 -0
- data/vendor/scs/linsys/external/amd/amd_aat.o +0 -0
- data/vendor/scs/linsys/external/amd/amd_control.o +0 -0
- data/vendor/scs/linsys/external/amd/amd_defaults.o +0 -0
- data/vendor/scs/linsys/external/amd/amd_dump.o +0 -0
- data/vendor/scs/linsys/external/amd/amd_global.o +0 -0
- data/vendor/scs/linsys/external/amd/amd_info.o +0 -0
- data/vendor/scs/linsys/external/amd/amd_order.o +0 -0
- data/vendor/scs/linsys/external/amd/amd_post_tree.o +0 -0
- data/vendor/scs/linsys/external/amd/amd_postorder.o +0 -0
- data/vendor/scs/linsys/external/amd/amd_preprocess.o +0 -0
- data/vendor/scs/linsys/external/amd/amd_valid.o +0 -0
- data/vendor/scs/linsys/external/qdldl/qdldl.o +0 -0
- data/vendor/scs/linsys/scs_matrix.o +0 -0
- data/vendor/scs/src/aa.o +0 -0
- data/vendor/scs/src/cones.o +0 -0
- data/vendor/scs/src/ctrlc.o +0 -0
- data/vendor/scs/src/linalg.o +0 -0
- data/vendor/scs/src/normalize.o +0 -0
- data/vendor/scs/src/rw.o +0 -0
- data/vendor/scs/src/scs.o +0 -0
- data/vendor/scs/src/scs_indir.o +0 -0
- data/vendor/scs/src/scs_version.o +0 -0
- data/vendor/scs/src/util.o +0 -0
|
@@ -10,6 +10,10 @@
|
|
|
10
10
|
#define NUM_L2_PASSES (1) /* do one or zero, not more since not stable */
|
|
11
11
|
|
|
12
12
|
scs_int SCS(copy_matrix)(ScsMatrix **dstp, const ScsMatrix *src) {
|
|
13
|
+
if (!src) {
|
|
14
|
+
*dstp = SCS_NULL;
|
|
15
|
+
return 1;
|
|
16
|
+
}
|
|
13
17
|
scs_int Anz = src->p[src->n];
|
|
14
18
|
ScsMatrix *A = (ScsMatrix *)scs_calloc(1, sizeof(ScsMatrix));
|
|
15
19
|
if (!A) {
|
|
@@ -18,11 +22,11 @@ scs_int SCS(copy_matrix)(ScsMatrix **dstp, const ScsMatrix *src) {
|
|
|
18
22
|
A->n = src->n;
|
|
19
23
|
A->m = src->m;
|
|
20
24
|
/* A values, size: NNZ A */
|
|
21
|
-
A->x = (scs_float *)
|
|
25
|
+
A->x = (scs_float *)scs_calloc(Anz, sizeof(scs_float));
|
|
22
26
|
/* A row index, size: NNZ A */
|
|
23
|
-
A->i = (scs_int *)
|
|
27
|
+
A->i = (scs_int *)scs_calloc(Anz, sizeof(scs_int));
|
|
24
28
|
/* A column pointer, size: n+1 */
|
|
25
|
-
A->p = (scs_int *)
|
|
29
|
+
A->p = (scs_int *)scs_calloc(src->n + 1, sizeof(scs_int));
|
|
26
30
|
if (!A->x || !A->i || !A->p) {
|
|
27
31
|
return 0;
|
|
28
32
|
}
|
|
@@ -41,6 +45,8 @@ scs_int SCS(validate_lin_sys)(const ScsMatrix *A, const ScsMatrix *P) {
|
|
|
41
45
|
}
|
|
42
46
|
/* detects some errors in A col ptrs: */
|
|
43
47
|
Anz = A->p[A->n];
|
|
48
|
+
/* Disable this check which is slowish and typically just produces noise. */
|
|
49
|
+
/*
|
|
44
50
|
if (Anz > 0) {
|
|
45
51
|
for (i = 0; i < A->n; ++i) {
|
|
46
52
|
if (A->p[i] == A->p[i + 1]) {
|
|
@@ -53,6 +59,7 @@ scs_int SCS(validate_lin_sys)(const ScsMatrix *A, const ScsMatrix *P) {
|
|
|
53
59
|
}
|
|
54
60
|
}
|
|
55
61
|
}
|
|
62
|
+
*/
|
|
56
63
|
if (((scs_float)Anz / A->m > A->n) || (Anz < 0)) {
|
|
57
64
|
scs_printf("Anz (nonzeros in A) = %li, outside of valid range\n",
|
|
58
65
|
(long)Anz);
|
|
@@ -106,19 +113,17 @@ static inline scs_float apply_limit(scs_float x) {
|
|
|
106
113
|
return x;
|
|
107
114
|
}
|
|
108
115
|
|
|
109
|
-
static void compute_ruiz_mats(ScsMatrix *P, ScsMatrix *A, scs_float *
|
|
110
|
-
scs_float *
|
|
111
|
-
|
|
112
|
-
scs_int cone_boundaries_len) {
|
|
113
|
-
scs_int i, j, kk, count, delta;
|
|
116
|
+
static void compute_ruiz_mats(ScsMatrix *P, ScsMatrix *A, scs_float *Dt,
|
|
117
|
+
scs_float *Et, ScsConeWork *cone) {
|
|
118
|
+
scs_int i, j, kk;
|
|
114
119
|
scs_float wrk;
|
|
115
120
|
|
|
116
121
|
/**************************** D ****************************/
|
|
117
122
|
|
|
118
123
|
/* initialize D */
|
|
119
124
|
for (i = 0; i < A->m; ++i) {
|
|
120
|
-
|
|
121
|
-
Dt[i] = ABS(b[i]);
|
|
125
|
+
Dt[i] = 0.;
|
|
126
|
+
/* Dt[i] = ABS(b[i]); */
|
|
122
127
|
}
|
|
123
128
|
|
|
124
129
|
/* calculate row norms */
|
|
@@ -129,16 +134,9 @@ static void compute_ruiz_mats(ScsMatrix *P, ScsMatrix *A, scs_float *b,
|
|
|
129
134
|
}
|
|
130
135
|
|
|
131
136
|
/* accumulate D across each cone */
|
|
132
|
-
|
|
133
|
-
for (i = 1; i < cone_boundaries_len; ++i) {
|
|
134
|
-
delta = boundaries[i];
|
|
135
|
-
wrk = SCS(norm_inf)(&(Dt[count]), delta);
|
|
136
|
-
for (j = count; j < count + delta; ++j) {
|
|
137
|
-
Dt[j] = wrk;
|
|
138
|
-
}
|
|
139
|
-
count += delta;
|
|
140
|
-
}
|
|
137
|
+
SCS(enforce_cone_boundaries)(cone, Dt, &SCS(norm_inf));
|
|
141
138
|
|
|
139
|
+
/* invert temporary vec to form D */
|
|
142
140
|
for (i = 0; i < A->m; ++i) {
|
|
143
141
|
Dt[i] = SAFEDIV_POS(1.0, SQRTF(apply_limit(Dt[i])));
|
|
144
142
|
}
|
|
@@ -147,8 +145,8 @@ static void compute_ruiz_mats(ScsMatrix *P, ScsMatrix *A, scs_float *b,
|
|
|
147
145
|
|
|
148
146
|
/* initialize E */
|
|
149
147
|
for (i = 0; i < A->n; ++i) {
|
|
150
|
-
|
|
151
|
-
Et[i] = ABS(c[i]);
|
|
148
|
+
Et[i] = 0.;
|
|
149
|
+
/* Et[i] = ABS(c[i]); */
|
|
152
150
|
}
|
|
153
151
|
|
|
154
152
|
/* TODO: test not using P to determine scaling */
|
|
@@ -174,25 +172,19 @@ static void compute_ruiz_mats(ScsMatrix *P, ScsMatrix *A, scs_float *b,
|
|
|
174
172
|
Et[i] = MAX(Et[i], SCS(norm_inf)(&(A->x[A->p[i]]), A->p[i + 1] - A->p[i]));
|
|
175
173
|
Et[i] = SAFEDIV_POS(1.0, SQRTF(apply_limit(Et[i])));
|
|
176
174
|
}
|
|
177
|
-
|
|
178
|
-
/* calculate s value */
|
|
179
|
-
*s = MAX(SCS(norm_inf)(c, A->n), SCS(norm_inf)(b, A->m));
|
|
180
|
-
*s = SAFEDIV_POS(1.0, SQRTF(apply_limit(*s)));
|
|
181
175
|
}
|
|
182
176
|
|
|
183
|
-
static void compute_l2_mats(ScsMatrix *P, ScsMatrix *A, scs_float *
|
|
184
|
-
scs_float *
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
scs_int i, j, kk, count, delta;
|
|
188
|
-
scs_float wrk, norm_c, norm_b;
|
|
177
|
+
static void compute_l2_mats(ScsMatrix *P, ScsMatrix *A, scs_float *Dt,
|
|
178
|
+
scs_float *Et, ScsConeWork *cone) {
|
|
179
|
+
scs_int i, j, kk;
|
|
180
|
+
scs_float wrk;
|
|
189
181
|
|
|
190
182
|
/**************************** D ****************************/
|
|
191
183
|
|
|
192
184
|
/* initialize D */
|
|
193
185
|
for (i = 0; i < A->m; ++i) {
|
|
194
|
-
|
|
195
|
-
Dt[i] = b[i] * b[i];
|
|
186
|
+
Dt[i] = 0.;
|
|
187
|
+
/* Dt[i] = b[i] * b[i]; */
|
|
196
188
|
}
|
|
197
189
|
|
|
198
190
|
/* calculate row norms */
|
|
@@ -206,19 +198,7 @@ static void compute_l2_mats(ScsMatrix *P, ScsMatrix *A, scs_float *b,
|
|
|
206
198
|
}
|
|
207
199
|
|
|
208
200
|
/* accumulate D across each cone */
|
|
209
|
-
|
|
210
|
-
for (i = 1; i < cone_boundaries_len; ++i) {
|
|
211
|
-
delta = boundaries[i];
|
|
212
|
-
wrk = 0.;
|
|
213
|
-
for (j = count; j < count + delta; ++j) {
|
|
214
|
-
wrk += Dt[j];
|
|
215
|
-
}
|
|
216
|
-
wrk /= delta;
|
|
217
|
-
for (j = count; j < count + delta; ++j) {
|
|
218
|
-
Dt[j] = wrk;
|
|
219
|
-
}
|
|
220
|
-
count += delta;
|
|
221
|
-
}
|
|
201
|
+
SCS(enforce_cone_boundaries)(cone, Dt, &SCS(mean));
|
|
222
202
|
|
|
223
203
|
for (i = 0; i < A->m; ++i) {
|
|
224
204
|
Dt[i] = SAFEDIV_POS(1.0, SQRTF(apply_limit(Dt[i])));
|
|
@@ -228,8 +208,8 @@ static void compute_l2_mats(ScsMatrix *P, ScsMatrix *A, scs_float *b,
|
|
|
228
208
|
|
|
229
209
|
/* initialize E */
|
|
230
210
|
for (i = 0; i < A->n; ++i) {
|
|
231
|
-
|
|
232
|
-
Et[i] = c[i] * c[i];
|
|
211
|
+
Et[i] = 0.;
|
|
212
|
+
/* Et[i] = c[i] * c[i]; */
|
|
233
213
|
}
|
|
234
214
|
|
|
235
215
|
/* TODO: test not using P to determine scaling */
|
|
@@ -255,17 +235,10 @@ static void compute_l2_mats(ScsMatrix *P, ScsMatrix *A, scs_float *b,
|
|
|
255
235
|
Et[i] += SCS(norm_sq)(&(A->x[A->p[i]]), A->p[i + 1] - A->p[i]);
|
|
256
236
|
Et[i] = SAFEDIV_POS(1.0, SQRTF(apply_limit(SQRTF(Et[i]))));
|
|
257
237
|
}
|
|
258
|
-
|
|
259
|
-
/* calculate s value */
|
|
260
|
-
norm_c = SCS(norm_2)(c, A->n);
|
|
261
|
-
norm_b = SCS(norm_2)(b, A->m);
|
|
262
|
-
*s = SQRTF(norm_c * norm_c + norm_b * norm_b);
|
|
263
|
-
*s = SAFEDIV_POS(1.0, SQRTF(apply_limit(*s)));
|
|
264
238
|
}
|
|
265
239
|
|
|
266
|
-
static void rescale(ScsMatrix *P, ScsMatrix *A, scs_float *
|
|
267
|
-
|
|
268
|
-
scs_int *boundaries, scs_int cone_boundaries_len) {
|
|
240
|
+
static void rescale(ScsMatrix *P, ScsMatrix *A, scs_float *Dt, scs_float *Et,
|
|
241
|
+
ScsScaling *scal, ScsConeWork *cone) {
|
|
269
242
|
scs_int i, j;
|
|
270
243
|
/* scale the rows of A with D */
|
|
271
244
|
for (i = 0; i < A->n; ++i) {
|
|
@@ -292,15 +265,6 @@ static void rescale(ScsMatrix *P, ScsMatrix *A, scs_float *b, scs_float *c,
|
|
|
292
265
|
}
|
|
293
266
|
}
|
|
294
267
|
|
|
295
|
-
/* scale c */
|
|
296
|
-
for (i = 0; i < A->n; ++i) {
|
|
297
|
-
c[i] *= Et[i];
|
|
298
|
-
}
|
|
299
|
-
/* scale b */
|
|
300
|
-
for (i = 0; i < A->m; ++i) {
|
|
301
|
-
b[i] *= Dt[i];
|
|
302
|
-
}
|
|
303
|
-
|
|
304
268
|
/* Accumulate scaling */
|
|
305
269
|
for (i = 0; i < A->m; ++i) {
|
|
306
270
|
scal->D[i] *= Dt[i];
|
|
@@ -309,58 +273,44 @@ static void rescale(ScsMatrix *P, ScsMatrix *A, scs_float *b, scs_float *c,
|
|
|
309
273
|
scal->E[i] *= Et[i];
|
|
310
274
|
}
|
|
311
275
|
|
|
312
|
-
/*
|
|
313
|
-
SCS(scale_array)(c, s, A->n);
|
|
314
|
-
SCS(scale_array)(b, s, A->m);
|
|
315
|
-
/* no need to scale P since primal_scale = dual_scale */
|
|
276
|
+
/* no need to scale P since later primal_scale = dual_scale */
|
|
316
277
|
/*
|
|
317
278
|
if (P) {
|
|
318
279
|
SCS(scale_array)(P->x, primal_scale, P->p[P->n]);
|
|
319
280
|
SCS(scale_array)(P->x, 1.0 / dual_scale, P->p[P->n]);
|
|
320
281
|
}
|
|
321
282
|
*/
|
|
322
|
-
|
|
323
|
-
/* Accumulate scaling */
|
|
324
|
-
scal->primal_scale *= s;
|
|
325
|
-
scal->dual_scale *= s;
|
|
326
283
|
}
|
|
327
284
|
|
|
328
|
-
/* Will rescale as P -> EPE, A -> DAE
|
|
285
|
+
/* Will rescale as P -> EPE, A -> DAE in-place.
|
|
329
286
|
* Essentially trying to rescale this matrix:
|
|
330
287
|
*
|
|
331
|
-
* [P A'
|
|
332
|
-
* [A 0
|
|
333
|
-
* [c' b' 0] [0 0 s]
|
|
288
|
+
* [P A'] with [E 0 ] on both sides (D, E diagonal)
|
|
289
|
+
* [A 0 ] [0 D ]
|
|
334
290
|
*
|
|
335
291
|
* which results in:
|
|
336
292
|
*
|
|
337
|
-
* [ EPE EA'D
|
|
338
|
-
* [ DAE 0
|
|
339
|
-
* [ sc'E sb'D 0 ]
|
|
293
|
+
* [ EPE EA'D ]
|
|
294
|
+
* [ DAE 0 ]
|
|
340
295
|
*
|
|
341
|
-
* In other words D rescales the rows of A
|
|
342
|
-
* E rescales the cols of A and rows/cols of P
|
|
296
|
+
* In other words D rescales the rows of A
|
|
297
|
+
* E rescales the cols of A and rows/cols of P
|
|
343
298
|
*
|
|
344
|
-
* will repeatedly set: D^-1 ~ norm of rows of [ A
|
|
299
|
+
* will repeatedly set: D^-1 ~ norm of rows of [ A ]
|
|
345
300
|
*
|
|
346
301
|
* E^-1 ~ norm of cols of [ P ]
|
|
347
302
|
* [ A ]
|
|
348
|
-
* [ c']
|
|
349
|
-
*
|
|
350
|
-
* `s` is incorporated into dual_scale and primal_scale
|
|
351
303
|
*
|
|
352
304
|
* The main complication is that D has to respect cone boundaries.
|
|
353
305
|
*
|
|
354
306
|
*/
|
|
355
|
-
|
|
356
|
-
ScsScaling *scal, scs_int *cone_boundaries,
|
|
357
|
-
scs_int cone_boundaries_len) {
|
|
307
|
+
ScsScaling *SCS(normalize_a_p)(ScsMatrix *P, ScsMatrix *A, ScsConeWork *cone) {
|
|
358
308
|
scs_int i;
|
|
359
|
-
|
|
360
|
-
scs_float *Dt = (scs_float *)
|
|
361
|
-
scs_float *Et = (scs_float *)
|
|
362
|
-
scal->D = (scs_float *)
|
|
363
|
-
scal->E = (scs_float *)
|
|
309
|
+
ScsScaling *scal = (ScsScaling *)scs_calloc(1, sizeof(ScsScaling));
|
|
310
|
+
scs_float *Dt = (scs_float *)scs_calloc(A->m, sizeof(scs_float));
|
|
311
|
+
scs_float *Et = (scs_float *)scs_calloc(A->n, sizeof(scs_float));
|
|
312
|
+
scal->D = (scs_float *)scs_calloc(A->m, sizeof(scs_float));
|
|
313
|
+
scal->E = (scs_float *)scs_calloc(A->n, sizeof(scs_float));
|
|
364
314
|
|
|
365
315
|
#if VERBOSITY > 5
|
|
366
316
|
SCS(timer) normalize_timer;
|
|
@@ -369,23 +319,23 @@ void SCS(normalize)(ScsMatrix *P, ScsMatrix *A, scs_float *b, scs_float *c,
|
|
|
369
319
|
#endif
|
|
370
320
|
|
|
371
321
|
/* init D, E */
|
|
322
|
+
scal->m = A->m;
|
|
372
323
|
for (i = 0; i < A->m; ++i) {
|
|
373
324
|
scal->D[i] = 1.;
|
|
374
325
|
}
|
|
326
|
+
scal->n = A->n;
|
|
375
327
|
for (i = 0; i < A->n; ++i) {
|
|
376
328
|
scal->E[i] = 1.;
|
|
377
329
|
}
|
|
378
330
|
scal->primal_scale = 1.;
|
|
379
331
|
scal->dual_scale = 1.;
|
|
380
332
|
for (i = 0; i < NUM_RUIZ_PASSES; ++i) {
|
|
381
|
-
compute_ruiz_mats(P, A,
|
|
382
|
-
|
|
383
|
-
rescale(P, A, b, c, Dt, Et, s, scal, cone_boundaries, cone_boundaries_len);
|
|
333
|
+
compute_ruiz_mats(P, A, Dt, Et, cone);
|
|
334
|
+
rescale(P, A, Dt, Et, scal, cone);
|
|
384
335
|
}
|
|
385
336
|
for (i = 0; i < NUM_L2_PASSES; ++i) {
|
|
386
|
-
compute_l2_mats(P, A,
|
|
387
|
-
|
|
388
|
-
rescale(P, A, b, c, Dt, Et, s, scal, cone_boundaries, cone_boundaries_len);
|
|
337
|
+
compute_l2_mats(P, A, Dt, Et, cone);
|
|
338
|
+
rescale(P, A, Dt, Et, scal, cone);
|
|
389
339
|
}
|
|
390
340
|
scs_free(Dt);
|
|
391
341
|
scs_free(Et);
|
|
@@ -399,14 +349,14 @@ void SCS(normalize)(ScsMatrix *P, ScsMatrix *A, scs_float *b, scs_float *c,
|
|
|
399
349
|
}
|
|
400
350
|
scs_printf("primal_scale %g\n", scal->primal_scale);
|
|
401
351
|
scs_printf("dual_scale %g\n", scal->dual_scale);
|
|
402
|
-
scs_printf("norm_b %g\n", SCS(norm_inf)(b, A->m));
|
|
403
|
-
scs_printf("norm_c %g\n", SCS(norm_inf)(c, A->n));
|
|
404
352
|
scs_printf("norm D %g\n", SCS(norm_inf)(scal->D, A->m));
|
|
405
353
|
scs_printf("norm E %g\n", SCS(norm_inf)(scal->E, A->n));
|
|
406
354
|
#endif
|
|
355
|
+
return scal;
|
|
407
356
|
}
|
|
408
357
|
|
|
409
|
-
|
|
358
|
+
/*
|
|
359
|
+
void SCS(un_normalize_a_p)(ScsMatrix *A, ScsMatrix *P, const ScsScaling *scal) {
|
|
410
360
|
scs_int i, j;
|
|
411
361
|
scs_float *D = scal->D;
|
|
412
362
|
scs_float *E = scal->E;
|
|
@@ -431,6 +381,7 @@ void SCS(un_normalize)(ScsMatrix *A, ScsMatrix *P, const ScsScaling *scal) {
|
|
|
431
381
|
}
|
|
432
382
|
}
|
|
433
383
|
}
|
|
384
|
+
*/
|
|
434
385
|
|
|
435
386
|
void SCS(accum_by_atrans)(const ScsMatrix *A, const scs_float *x,
|
|
436
387
|
scs_float *y) {
|
|
@@ -7,17 +7,18 @@ extern "C" {
|
|
|
7
7
|
|
|
8
8
|
#include "glbopts.h"
|
|
9
9
|
#include "scs.h"
|
|
10
|
+
#include "scs_work.h"
|
|
10
11
|
|
|
11
12
|
/* Normalization routines, used if d->NORMALIZE is true */
|
|
12
13
|
/* normalizes A matrix, sets scal->E and scal->D diagonal scaling matrices,
|
|
13
14
|
* A -> D*A*E. D and E must be all positive entries, D must satisfy cone
|
|
14
15
|
* boundaries */
|
|
15
|
-
|
|
16
|
-
ScsScaling *scal, scs_int *cone_boundaries,
|
|
17
|
-
scs_int cone_boundaries_len);
|
|
16
|
+
ScsScaling *SCS(normalize_a_p)(ScsMatrix *P, ScsMatrix *A, ScsConeWork *cone);
|
|
18
17
|
|
|
19
18
|
/* unnormalizes A matrix, unnormalizes by w->D and w->E */
|
|
20
|
-
void SCS(
|
|
19
|
+
/* void SCS(un_normalize_a_p)(ScsMatrix *A, ScsMatrix *P, const ScsScaling
|
|
20
|
+
* *scal);
|
|
21
|
+
*/
|
|
21
22
|
|
|
22
23
|
/* to free the memory allocated in a ScsMatrix (called on A and P at finish) */
|
|
23
24
|
void SCS(free_scs_matrix)(ScsMatrix *A);
|
data/vendor/scs/scs.mk
CHANGED
|
@@ -103,10 +103,6 @@ NOTIMER = 0
|
|
|
103
103
|
ifneq ($(NOTIMER), 0)
|
|
104
104
|
OPT_FLAGS += -DNOTIMER=$(NOTIMER) # no timing, times reported as nan
|
|
105
105
|
endif
|
|
106
|
-
COPYAMATRIX = 1
|
|
107
|
-
ifneq ($(COPYAMATRIX), 0)
|
|
108
|
-
OPT_FLAGS += -DCOPYAMATRIX=$(COPYAMATRIX) # if normalize, copy A
|
|
109
|
-
endif
|
|
110
106
|
GPU_TRANSPOSE_MAT = 1
|
|
111
107
|
ifneq ($(GPU_TRANSPOSE_MAT), 0)
|
|
112
108
|
OPT_FLAGS += -DGPU_TRANSPOSE_MAT=$(GPU_TRANSPOSE_MAT) # tranpose A mat in GPU memory
|
|
@@ -145,7 +141,7 @@ endif
|
|
|
145
141
|
USE_LAPACK = 1
|
|
146
142
|
ifneq ($(USE_LAPACK), 0)
|
|
147
143
|
# edit these for your setup:
|
|
148
|
-
BLASLDFLAGS = -lblas -
|
|
144
|
+
BLASLDFLAGS = -llapack -lblas # -lgfortran
|
|
149
145
|
LDFLAGS += $(BLASLDFLAGS)
|
|
150
146
|
OPT_FLAGS += -DUSE_LAPACK
|
|
151
147
|
|
data/vendor/scs/src/aa.c
CHANGED
|
@@ -96,6 +96,10 @@ aa_float toc(const char *str, timer *t) {
|
|
|
96
96
|
|
|
97
97
|
#endif
|
|
98
98
|
|
|
99
|
+
#ifdef __cplusplus
|
|
100
|
+
extern "C" {
|
|
101
|
+
#endif
|
|
102
|
+
|
|
99
103
|
/* BLAS functions used */
|
|
100
104
|
aa_float BLAS(nrm2)(blas_int *n, aa_float *x, blas_int *incx);
|
|
101
105
|
void BLAS(axpy)(blas_int *n, aa_float *a, const aa_float *x, blas_int *incx,
|
|
@@ -113,6 +117,10 @@ void BLAS(gemm)(const char *transa, const char *transb, blas_int *m,
|
|
|
113
117
|
void BLAS(scal)(const blas_int *n, const aa_float *a, aa_float *x,
|
|
114
118
|
const blas_int *incx);
|
|
115
119
|
|
|
120
|
+
#ifdef __cplusplus
|
|
121
|
+
}
|
|
122
|
+
#endif
|
|
123
|
+
|
|
116
124
|
/* This file uses Anderson acceleration to improve the convergence of
|
|
117
125
|
* a fixed point mapping.
|
|
118
126
|
* At each iteration we need to solve a (small) linear system, we
|
|
@@ -191,7 +199,6 @@ static void set_m(AaWork *a, aa_int len) {
|
|
|
191
199
|
}
|
|
192
200
|
}
|
|
193
201
|
TIME_TOC
|
|
194
|
-
return;
|
|
195
202
|
}
|
|
196
203
|
|
|
197
204
|
/* initialize accel params, in particular x_prev, f_prev, g_prev */
|
|
@@ -270,23 +277,23 @@ static void update_accel_params(const aa_float *x, const aa_float *f, AaWork *a,
|
|
|
270
277
|
a->norm_g = BLAS(nrm2)(&bdim, a->g, &one);
|
|
271
278
|
|
|
272
279
|
TIME_TOC
|
|
273
|
-
return;
|
|
274
280
|
}
|
|
275
281
|
|
|
276
282
|
/* f = (1-relaxation) * \sum_i a_i x_i + relaxation * \sum_i a_i f_i */
|
|
277
283
|
static void relax(aa_float *f, AaWork *a, aa_int len) {
|
|
278
284
|
TIME_TIC
|
|
279
|
-
/* x_work = x
|
|
285
|
+
/* x_work = x initially */
|
|
280
286
|
blas_int bdim = (blas_int)(a->dim), one = 1, blen = (blas_int)len;
|
|
281
287
|
aa_float onef = 1.0, neg_onef = -1.0;
|
|
282
288
|
aa_float one_m_relaxation = 1. - a->relaxation;
|
|
289
|
+
/* x_work = x - S * work */
|
|
283
290
|
BLAS(gemv)
|
|
284
291
|
("NoTrans", &bdim, &blen, &neg_onef, a->S, &bdim, a->work, &one, &onef,
|
|
285
292
|
a->x_work, &one);
|
|
286
293
|
/* f = relaxation * f */
|
|
287
|
-
BLAS(scal)(&
|
|
294
|
+
BLAS(scal)(&bdim, &a->relaxation, f, &one);
|
|
288
295
|
/* f += (1 - relaxation) * x_work */
|
|
289
|
-
BLAS(axpy)(&
|
|
296
|
+
BLAS(axpy)(&bdim, &one_m_relaxation, a->x_work, &one, f, &one);
|
|
290
297
|
TIME_TOC
|
|
291
298
|
}
|
|
292
299
|
|
|
@@ -352,7 +359,7 @@ AaWork *aa_init(aa_int dim, aa_int mem, aa_int type1, aa_float regularization,
|
|
|
352
359
|
AaWork *a = (AaWork *)calloc(1, sizeof(AaWork));
|
|
353
360
|
if (!a) {
|
|
354
361
|
printf("Failed to allocate memory for AA.\n");
|
|
355
|
-
return (
|
|
362
|
+
return (AaWork *)0;
|
|
356
363
|
}
|
|
357
364
|
a->type1 = type1;
|
|
358
365
|
a->iter = 0;
|
|
@@ -484,7 +491,6 @@ void aa_finish(AaWork *a) {
|
|
|
484
491
|
}
|
|
485
492
|
free(a);
|
|
486
493
|
}
|
|
487
|
-
return;
|
|
488
494
|
}
|
|
489
495
|
|
|
490
496
|
void aa_reset(AaWork *a) {
|
|
@@ -493,7 +499,6 @@ void aa_reset(AaWork *a) {
|
|
|
493
499
|
printf("AA reset.\n");
|
|
494
500
|
}
|
|
495
501
|
a->iter = 0;
|
|
496
|
-
return;
|
|
497
502
|
}
|
|
498
503
|
|
|
499
504
|
#endif
|