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.
Files changed (92) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +14 -0
  3. data/README.md +42 -13
  4. data/lib/scs/ffi.rb +1 -7
  5. data/lib/scs/matrix.rb +72 -0
  6. data/lib/scs/solver.rb +19 -26
  7. data/lib/scs/version.rb +1 -1
  8. data/lib/scs.rb +1 -0
  9. data/vendor/scs/CITATION.cff +1 -1
  10. data/vendor/scs/CMakeLists.txt +55 -7
  11. data/vendor/scs/Makefile +9 -9
  12. data/vendor/scs/README.md +4 -1
  13. data/vendor/scs/include/aa.h +1 -1
  14. data/vendor/scs/include/cones.h +17 -12
  15. data/vendor/scs/include/glbopts.h +27 -66
  16. data/vendor/scs/include/linalg.h +2 -1
  17. data/vendor/scs/include/linsys.h +13 -13
  18. data/vendor/scs/include/normalize.h +7 -5
  19. data/vendor/scs/include/rw.h +3 -3
  20. data/vendor/scs/include/scs.h +85 -106
  21. data/vendor/scs/include/scs_types.h +34 -0
  22. data/vendor/scs/include/scs_work.h +80 -0
  23. data/vendor/scs/include/util.h +3 -1
  24. data/vendor/scs/linsys/cpu/direct/private.c +86 -73
  25. data/vendor/scs/linsys/cpu/direct/private.h +2 -2
  26. data/vendor/scs/linsys/cpu/indirect/private.c +42 -33
  27. data/vendor/scs/linsys/cpu/indirect/private.h +1 -2
  28. data/vendor/scs/linsys/csparse.c +3 -3
  29. data/vendor/scs/linsys/external/amd/LICENSE.txt +0 -897
  30. data/vendor/scs/linsys/external/amd/SuiteSparse_config.c +9 -7
  31. data/vendor/scs/linsys/external/amd/SuiteSparse_config.h +1 -1
  32. data/vendor/scs/linsys/external/amd/amd_order.c +5 -5
  33. data/vendor/scs/linsys/gpu/gpu.h +8 -11
  34. data/vendor/scs/linsys/gpu/indirect/private.c +72 -49
  35. data/vendor/scs/linsys/gpu/indirect/private.h +14 -13
  36. data/vendor/scs/linsys/scs_matrix.c +55 -104
  37. data/vendor/scs/linsys/scs_matrix.h +5 -4
  38. data/vendor/scs/scs.mk +1 -5
  39. data/vendor/scs/src/aa.c +13 -8
  40. data/vendor/scs/src/cones.c +197 -108
  41. data/vendor/scs/src/linalg.c +25 -0
  42. data/vendor/scs/src/normalize.c +75 -26
  43. data/vendor/scs/src/rw.c +74 -30
  44. data/vendor/scs/src/scs.c +300 -264
  45. data/vendor/scs/src/scs_version.c +8 -6
  46. data/vendor/scs/src/util.c +27 -13
  47. data/vendor/scs/test/minunit.h +6 -1
  48. data/vendor/scs/test/problem_utils.h +28 -35
  49. data/vendor/scs/test/problems/degenerate.h +2 -1
  50. data/vendor/scs/test/problems/hs21_tiny_qp.h +2 -1
  51. data/vendor/scs/test/problems/hs21_tiny_qp_rw.h +6 -2
  52. data/vendor/scs/test/problems/infeasible_tiny_qp.h +2 -1
  53. data/vendor/scs/test/problems/qafiro_tiny_qp.h +5 -4
  54. data/vendor/scs/test/problems/random_prob.h +6 -2
  55. data/vendor/scs/test/problems/rob_gauss_cov_est.h +9 -2
  56. data/vendor/scs/test/problems/small_lp.h +7 -2
  57. data/vendor/scs/test/problems/small_qp.h +387 -0
  58. data/vendor/scs/test/problems/{test_fails.h → test_validation.h} +7 -4
  59. data/vendor/scs/test/problems/unbounded_tiny_qp.h +4 -4
  60. data/vendor/scs/test/random_socp_prob.c +4 -2
  61. data/vendor/scs/test/run_from_file.c +16 -4
  62. data/vendor/scs/test/run_tests.c +23 -14
  63. metadata +10 -35
  64. data/vendor/scs/linsys/cpu/direct/private.o +0 -0
  65. data/vendor/scs/linsys/cpu/indirect/private.o +0 -0
  66. data/vendor/scs/linsys/csparse.o +0 -0
  67. data/vendor/scs/linsys/external/amd/SuiteSparse_config.o +0 -0
  68. data/vendor/scs/linsys/external/amd/amd_1.o +0 -0
  69. data/vendor/scs/linsys/external/amd/amd_2.o +0 -0
  70. data/vendor/scs/linsys/external/amd/amd_aat.o +0 -0
  71. data/vendor/scs/linsys/external/amd/amd_control.o +0 -0
  72. data/vendor/scs/linsys/external/amd/amd_defaults.o +0 -0
  73. data/vendor/scs/linsys/external/amd/amd_dump.o +0 -0
  74. data/vendor/scs/linsys/external/amd/amd_global.o +0 -0
  75. data/vendor/scs/linsys/external/amd/amd_info.o +0 -0
  76. data/vendor/scs/linsys/external/amd/amd_order.o +0 -0
  77. data/vendor/scs/linsys/external/amd/amd_post_tree.o +0 -0
  78. data/vendor/scs/linsys/external/amd/amd_postorder.o +0 -0
  79. data/vendor/scs/linsys/external/amd/amd_preprocess.o +0 -0
  80. data/vendor/scs/linsys/external/amd/amd_valid.o +0 -0
  81. data/vendor/scs/linsys/external/qdldl/qdldl.o +0 -0
  82. data/vendor/scs/linsys/scs_matrix.o +0 -0
  83. data/vendor/scs/src/aa.o +0 -0
  84. data/vendor/scs/src/cones.o +0 -0
  85. data/vendor/scs/src/ctrlc.o +0 -0
  86. data/vendor/scs/src/linalg.o +0 -0
  87. data/vendor/scs/src/normalize.o +0 -0
  88. data/vendor/scs/src/rw.o +0 -0
  89. data/vendor/scs/src/scs.o +0 -0
  90. data/vendor/scs/src/scs_indir.o +0 -0
  91. data/vendor/scs/src/scs_version.o +0 -0
  92. 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 *)scs_malloc(sizeof(scs_float) * Anz);
25
+ A->x = (scs_float *)scs_calloc(Anz, sizeof(scs_float));
22
26
  /* A row index, size: NNZ A */
23
- A->i = (scs_int *)scs_malloc(sizeof(scs_int) * Anz);
27
+ A->i = (scs_int *)scs_calloc(Anz, sizeof(scs_int));
24
28
  /* A column pointer, size: n+1 */
25
- A->p = (scs_int *)scs_malloc(sizeof(scs_int) * (src->n + 1));
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 *b,
110
- scs_float *c, scs_float *Dt, scs_float *Et,
111
- scs_float *s, scs_int *boundaries,
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
- /* Dt[i] = 0.; */
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
- count = boundaries[0];
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
- /* Et[i] = 0.; */
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 *b,
184
- scs_float *c, scs_float *Dt, scs_float *Et,
185
- scs_float *s, scs_int *boundaries,
186
- scs_int cone_boundaries_len) {
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
- /* Dt[i] = 0.; */
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
- count = boundaries[0];
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
- /* Et[i] = 0.; */
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 *b, scs_float *c,
267
- scs_float *Dt, scs_float *Et, scs_float s, ScsScaling *scal,
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
- /* Apply scaling */
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, c -> sEc, b -> sDb, in-place.
285
+ /* Will rescale as P -> EPE, A -> DAE in-place.
329
286
  * Essentially trying to rescale this matrix:
330
287
  *
331
- * [P A' c] with [E 0 0] on both sides (D, E diagonal)
332
- * [A 0 b] [0 D 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 sEc ]
338
- * [ DAE 0 sDb ]
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, b
342
- * E rescales the cols of A and rows/cols of P, c'
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 b ]
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
- void SCS(normalize)(ScsMatrix *P, ScsMatrix *A, scs_float *b, scs_float *c,
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
- scs_float s;
360
- scs_float *Dt = (scs_float *)scs_malloc(A->m * sizeof(scs_float));
361
- scs_float *Et = (scs_float *)scs_malloc(A->n * sizeof(scs_float));
362
- scal->D = (scs_float *)scs_malloc(A->m * sizeof(scs_float));
363
- scal->E = (scs_float *)scs_malloc(A->n * sizeof(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, b, c, Dt, Et, &s, cone_boundaries,
382
- cone_boundaries_len);
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, b, c, Dt, Et, &s, cone_boundaries,
387
- cone_boundaries_len);
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
- void SCS(un_normalize)(ScsMatrix *A, ScsMatrix *P, const ScsScaling *scal) {
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
- void SCS(normalize)(ScsMatrix *P, ScsMatrix *A, scs_float *b, scs_float *c,
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(un_normalize)(ScsMatrix *A, ScsMatrix *P, const ScsScaling *scal);
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 -llapack #-lgfortran
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 - S * work */
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)(&blen, &a->relaxation, f, &one);
294
+ BLAS(scal)(&bdim, &a->relaxation, f, &one);
288
295
  /* f += (1 - relaxation) * x_work */
289
- BLAS(axpy)(&blen, &one_m_relaxation, a->x_work, &one, f, &one);
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 (void *)0;
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