scs 0.2.1 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (98) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +16 -0
  3. data/LICENSE.txt +18 -18
  4. data/README.md +12 -7
  5. data/lib/scs/ffi.rb +30 -13
  6. data/lib/scs/solver.rb +32 -14
  7. data/lib/scs/version.rb +1 -1
  8. data/vendor/scs/CITATION.cff +39 -0
  9. data/vendor/scs/CMakeLists.txt +272 -0
  10. data/vendor/scs/Makefile +24 -15
  11. data/vendor/scs/README.md +8 -216
  12. data/vendor/scs/include/aa.h +67 -23
  13. data/vendor/scs/include/cones.h +17 -17
  14. data/vendor/scs/include/glbopts.h +98 -32
  15. data/vendor/scs/include/linalg.h +2 -4
  16. data/vendor/scs/include/linsys.h +58 -44
  17. data/vendor/scs/include/normalize.h +3 -3
  18. data/vendor/scs/include/rw.h +8 -2
  19. data/vendor/scs/include/scs.h +293 -133
  20. data/vendor/scs/include/util.h +3 -15
  21. data/vendor/scs/linsys/cpu/direct/private.c +220 -224
  22. data/vendor/scs/linsys/cpu/direct/private.h +13 -7
  23. data/vendor/scs/linsys/cpu/indirect/private.c +177 -110
  24. data/vendor/scs/linsys/cpu/indirect/private.h +8 -4
  25. data/vendor/scs/linsys/csparse.c +87 -0
  26. data/vendor/scs/linsys/csparse.h +34 -0
  27. data/vendor/scs/linsys/external/amd/SuiteSparse_config.c +1 -1
  28. data/vendor/scs/linsys/external/amd/amd_internal.h +1 -1
  29. data/vendor/scs/linsys/external/qdldl/changes +2 -0
  30. data/vendor/scs/linsys/external/qdldl/qdldl.c +29 -46
  31. data/vendor/scs/linsys/external/qdldl/qdldl.h +33 -41
  32. data/vendor/scs/linsys/external/qdldl/qdldl_types.h +11 -3
  33. data/vendor/scs/linsys/gpu/gpu.c +58 -21
  34. data/vendor/scs/linsys/gpu/gpu.h +66 -28
  35. data/vendor/scs/linsys/gpu/indirect/private.c +368 -154
  36. data/vendor/scs/linsys/gpu/indirect/private.h +26 -12
  37. data/vendor/scs/linsys/scs_matrix.c +498 -0
  38. data/vendor/scs/linsys/scs_matrix.h +70 -0
  39. data/vendor/scs/scs.mk +13 -9
  40. data/vendor/scs/src/aa.c +384 -109
  41. data/vendor/scs/src/cones.c +440 -353
  42. data/vendor/scs/src/ctrlc.c +15 -5
  43. data/vendor/scs/src/linalg.c +84 -28
  44. data/vendor/scs/src/normalize.c +22 -64
  45. data/vendor/scs/src/rw.c +161 -22
  46. data/vendor/scs/src/scs.c +768 -561
  47. data/vendor/scs/src/scs_version.c +9 -3
  48. data/vendor/scs/src/util.c +37 -106
  49. data/vendor/scs/test/minunit.h +17 -8
  50. data/vendor/scs/test/problem_utils.h +176 -14
  51. data/vendor/scs/test/problems/degenerate.h +130 -0
  52. data/vendor/scs/test/problems/hs21_tiny_qp.h +124 -0
  53. data/vendor/scs/test/problems/hs21_tiny_qp_rw.h +116 -0
  54. data/vendor/scs/test/problems/infeasible_tiny_qp.h +100 -0
  55. data/vendor/scs/test/problems/qafiro_tiny_qp.h +199 -0
  56. data/vendor/scs/test/problems/random_prob +0 -0
  57. data/vendor/scs/test/problems/random_prob.h +45 -0
  58. data/vendor/scs/test/problems/rob_gauss_cov_est.h +188 -31
  59. data/vendor/scs/test/problems/small_lp.h +13 -14
  60. data/vendor/scs/test/problems/test_fails.h +43 -0
  61. data/vendor/scs/test/problems/unbounded_tiny_qp.h +82 -0
  62. data/vendor/scs/test/random_socp_prob.c +54 -53
  63. data/vendor/scs/test/rng.h +109 -0
  64. data/vendor/scs/test/run_from_file.c +19 -10
  65. data/vendor/scs/test/run_tests.c +27 -3
  66. metadata +25 -97
  67. data/vendor/scs/linsys/amatrix.c +0 -305
  68. data/vendor/scs/linsys/amatrix.h +0 -36
  69. data/vendor/scs/linsys/amatrix.o +0 -0
  70. data/vendor/scs/linsys/cpu/direct/private.o +0 -0
  71. data/vendor/scs/linsys/cpu/indirect/private.o +0 -0
  72. data/vendor/scs/linsys/external/amd/SuiteSparse_config.o +0 -0
  73. data/vendor/scs/linsys/external/amd/amd_1.o +0 -0
  74. data/vendor/scs/linsys/external/amd/amd_2.o +0 -0
  75. data/vendor/scs/linsys/external/amd/amd_aat.o +0 -0
  76. data/vendor/scs/linsys/external/amd/amd_control.o +0 -0
  77. data/vendor/scs/linsys/external/amd/amd_defaults.o +0 -0
  78. data/vendor/scs/linsys/external/amd/amd_dump.o +0 -0
  79. data/vendor/scs/linsys/external/amd/amd_global.o +0 -0
  80. data/vendor/scs/linsys/external/amd/amd_info.o +0 -0
  81. data/vendor/scs/linsys/external/amd/amd_order.o +0 -0
  82. data/vendor/scs/linsys/external/amd/amd_post_tree.o +0 -0
  83. data/vendor/scs/linsys/external/amd/amd_postorder.o +0 -0
  84. data/vendor/scs/linsys/external/amd/amd_preprocess.o +0 -0
  85. data/vendor/scs/linsys/external/amd/amd_valid.o +0 -0
  86. data/vendor/scs/linsys/external/qdldl/qdldl.o +0 -0
  87. data/vendor/scs/src/aa.o +0 -0
  88. data/vendor/scs/src/cones.o +0 -0
  89. data/vendor/scs/src/ctrlc.o +0 -0
  90. data/vendor/scs/src/linalg.o +0 -0
  91. data/vendor/scs/src/normalize.o +0 -0
  92. data/vendor/scs/src/rw.o +0 -0
  93. data/vendor/scs/src/scs.o +0 -0
  94. data/vendor/scs/src/scs_version.o +0 -0
  95. data/vendor/scs/src/util.o +0 -0
  96. data/vendor/scs/test/data/small_random_socp +0 -0
  97. data/vendor/scs/test/problems/small_random_socp.h +0 -33
  98. data/vendor/scs/test/run_tests +0 -2
@@ -1,305 +0,0 @@
1
- /* contains routines common to direct and indirect sparse solvers */
2
- #include "amatrix.h"
3
-
4
- #include "linsys.h"
5
-
6
- #define MIN_SCALE (1e-4)
7
- #define MAX_SCALE (1e4)
8
- #define NUM_SCALE_PASSES 10 /* additional passes don't help much */
9
-
10
- scs_int SCS(copy_a_matrix)(ScsMatrix **dstp, const ScsMatrix *src) {
11
- scs_int Anz = src->p[src->n];
12
- ScsMatrix *A = (ScsMatrix *)scs_calloc(1, sizeof(ScsMatrix));
13
- if (!A) {
14
- return 0;
15
- }
16
- A->n = src->n;
17
- A->m = src->m;
18
- A->x = (scs_float *)scs_malloc(sizeof(scs_float) *
19
- Anz); /* A values, size: NNZ A */
20
- A->i = (scs_int *)scs_malloc(sizeof(scs_int) *
21
- Anz); /* A row index, size: NNZ A */
22
- A->p = (scs_int *)scs_malloc(sizeof(scs_int) *
23
- (src->n + 1)); /* A column pointer, size: n+1 */
24
- if (!A->x || !A->i || !A->p) {
25
- return 0;
26
- }
27
- memcpy(A->x, src->x, sizeof(scs_float) * Anz);
28
- memcpy(A->i, src->i, sizeof(scs_int) * Anz);
29
- memcpy(A->p, src->p, sizeof(scs_int) * (src->n + 1));
30
- *dstp = A;
31
- return 1;
32
- }
33
-
34
- scs_int SCS(validate_lin_sys)(const ScsMatrix *A) {
35
- scs_int i, r_max, Anz;
36
- if (!A->x || !A->i || !A->p) {
37
- scs_printf("data incompletely specified\n");
38
- return -1;
39
- }
40
- /* detects some errors in A col ptrs: */
41
- Anz = A->p[A->n];
42
- if (Anz > 0) {
43
- for (i = 0; i < A->n; ++i) {
44
- if (A->p[i] == A->p[i + 1]) {
45
- scs_printf(
46
- "WARN: A->p (column pointers) not strictly increasing, "
47
- "column %li empty\n",
48
- (long)i);
49
- } else if (A->p[i] > A->p[i + 1]) {
50
- scs_printf("ERROR: A->p (column pointers) decreasing\n");
51
- return -1;
52
- }
53
- }
54
- }
55
- if (((scs_float)Anz / A->m > A->n) || (Anz < 0)) {
56
- scs_printf("Anz (nonzeros in A) = %li, outside of valid range\n",
57
- (long)Anz);
58
- return -1;
59
- }
60
- r_max = 0;
61
- for (i = 0; i < Anz; ++i) {
62
- if (A->i[i] > r_max) {
63
- r_max = A->i[i];
64
- }
65
- }
66
- if (r_max > A->m - 1) {
67
- scs_printf("number of rows in A inconsistent with input dimension\n");
68
- return -1;
69
- }
70
- return 0;
71
- }
72
-
73
- void SCS(free_a_matrix)(ScsMatrix *A) {
74
- if (A) {
75
- scs_free(A->x);
76
- scs_free(A->i);
77
- scs_free(A->p);
78
- scs_free(A);
79
- }
80
- }
81
-
82
- #if EXTRA_VERBOSE > 0
83
- static void print_a_matrix(const ScsMatrix *A) {
84
- scs_int i, j;
85
- /* TODO: this is to prevent clogging stdout */
86
- if (A->p[A->n] < 2500) {
87
- scs_printf("\n");
88
- for (i = 0; i < A->n; ++i) {
89
- scs_printf("Col %li: ", (long)i);
90
- for (j = A->p[i]; j < A->p[i + 1]; j++) {
91
- scs_printf("A[%li,%li] = %4f, ", (long)A->i[j], (long)i, A->x[j]);
92
- }
93
- scs_printf("norm col = %4f\n",
94
- SCS(norm)(&(A->x[A->p[i]]), A->p[i + 1] - A->p[i]));
95
- }
96
- scs_printf("norm A = %4f\n", SCS(norm)(A->x, A->p[A->n]));
97
- }
98
- }
99
- #endif
100
-
101
- void SCS(_normalize_a)(ScsMatrix *A, const ScsSettings *stgs, const ScsCone *k,
102
- ScsScaling *scal) {
103
- scs_float *D = (scs_float *)scs_malloc(A->m * sizeof(scs_float));
104
- scs_float *E = (scs_float *)scs_malloc(A->n * sizeof(scs_float));
105
- scs_float *Dt = (scs_float *)scs_malloc(A->m * sizeof(scs_float));
106
- scs_float *Et = (scs_float *)scs_malloc(A->n * sizeof(scs_float));
107
- scs_float *nms = (scs_float *)scs_calloc(A->m, sizeof(scs_float));
108
- scs_int i, j, l, count, delta, *boundaries;
109
- scs_int num_boundaries = SCS(get_cone_boundaries)(k, &boundaries);
110
- scs_float wrk;
111
-
112
- #if EXTRA_VERBOSE > 0
113
- SCS(timer) normalize_timer;
114
- SCS(tic)(&normalize_timer);
115
- scs_printf("normalizing A\n");
116
- print_a_matrix(A);
117
- #endif
118
-
119
- for (l = 0; l < NUM_SCALE_PASSES; ++l) {
120
- memset(D, 0, A->m * sizeof(scs_float));
121
- memset(E, 0, A->n * sizeof(scs_float));
122
- /* calculate row norms */
123
- for (i = 0; i < A->n; ++i) {
124
- for (j = A->p[i]; j < A->p[i + 1]; ++j) {
125
- D[A->i[j]] = MAX(D[A->i[j]], ABS(A->x[j]));
126
- }
127
- }
128
- for (i = 0; i < A->m; ++i) {
129
- D[i] = SQRTF(D[i]);
130
- D[i] = D[i] < MIN_SCALE ? 1.0 : D[i];
131
- D[i] = D[i] > MAX_SCALE ? MAX_SCALE : D[i];
132
- }
133
- /* calculate col norms, E */
134
- for (i = 0; i < A->n; ++i) {
135
- E[i] = SCS(norm_inf)(&(A->x[A->p[i]]), A->p[i + 1] - A->p[i]);
136
- E[i] = SQRTF(E[i]);
137
- E[i] = E[i] < MIN_SCALE ? 1.0 : E[i];
138
- E[i] = E[i] > MAX_SCALE ? MAX_SCALE : E[i];
139
- }
140
-
141
- /* mean of D across each cone */
142
- count = boundaries[0];
143
- for (i = 1; i < num_boundaries; ++i) {
144
- wrk = 0;
145
- delta = boundaries[i];
146
- for (j = count; j < count + delta; ++j) {
147
- wrk += D[j];
148
- }
149
- wrk /= delta;
150
- for (j = count; j < count + delta; ++j) {
151
- D[j] = wrk;
152
- }
153
- count += delta;
154
- }
155
-
156
- /* scale the rows with D */
157
- for (i = 0; i < A->n; ++i) {
158
- for (j = A->p[i]; j < A->p[i + 1]; ++j) {
159
- A->x[j] /= D[A->i[j]];
160
- }
161
- }
162
-
163
- /* scale the cols with E */
164
- for (i = 0; i < A->n; ++i) {
165
- SCS(scale_array)(&(A->x[A->p[i]]), 1.0 / E[i], A->p[i + 1] - A->p[i]);
166
- }
167
-
168
- /* Accumulate scaling */
169
- for (i = 0; i < A->m; ++i) {
170
- Dt[i] = (l == 0) ? D[i] : Dt[i] * D[i];
171
- }
172
- for (i = 0; i < A->n; ++i) {
173
- Et[i] = (l == 0) ? E[i] : Et[i] * E[i];
174
- }
175
- }
176
- scs_free(boundaries);
177
- scs_free(D);
178
- scs_free(E);
179
-
180
- /* calculate mean of row norms of A */
181
- for (i = 0; i < A->n; ++i) {
182
- for (j = A->p[i]; j < A->p[i + 1]; ++j) {
183
- wrk = A->x[j];
184
- nms[A->i[j]] += wrk * wrk;
185
- }
186
- }
187
- scal->mean_norm_row_a = 0.0;
188
- for (i = 0; i < A->m; ++i) {
189
- scal->mean_norm_row_a += SQRTF(nms[i]) / A->m;
190
- }
191
- scs_free(nms);
192
-
193
- /* calculate mean of col norms of A */
194
- scal->mean_norm_col_a = 0.0;
195
- for (i = 0; i < A->n; ++i) {
196
- scal->mean_norm_col_a +=
197
- SCS(norm)(&(A->x[A->p[i]]), A->p[i + 1] - A->p[i]) / A->n;
198
- }
199
-
200
- /* scale up by d->SCALE if not equal to 1 */
201
- if (stgs->scale != 1) {
202
- SCS(scale_array)(A->x, stgs->scale, A->p[A->n]);
203
- }
204
-
205
- scal->D = Dt;
206
- scal->E = Et;
207
-
208
- #if EXTRA_VERBOSE > 0
209
- scs_printf("finished normalizing A, time: %1.2es\n",
210
- SCS(tocq)(&normalize_timer) / 1e3);
211
- print_a_matrix(A);
212
- #endif
213
- }
214
-
215
- void SCS(_un_normalize_a)(ScsMatrix *A, const ScsSettings *stgs,
216
- const ScsScaling *scal) {
217
- scs_int i, j;
218
- scs_float *D = scal->D;
219
- scs_float *E = scal->E;
220
- for (i = 0; i < A->n; ++i) {
221
- SCS(scale_array)
222
- (&(A->x[A->p[i]]), E[i] / stgs->scale, A->p[i + 1] - A->p[i]);
223
- }
224
- for (i = 0; i < A->n; ++i) {
225
- for (j = A->p[i]; j < A->p[i + 1]; ++j) {
226
- A->x[j] *= D[A->i[j]];
227
- }
228
- }
229
- }
230
-
231
- void SCS(_accum_by_atrans)(scs_int n, scs_float *Ax, scs_int *Ai, scs_int *Ap,
232
- const scs_float *x, scs_float *y) {
233
- /* y += A'*x
234
- A in column compressed format
235
- parallelizes over columns (rows of A')
236
- */
237
- scs_int p, j;
238
- scs_int c1, c2;
239
- scs_float yj;
240
- #if EXTRA_VERBOSE > 0
241
- SCS(timer) mult_by_atrans_timer;
242
- SCS(tic)(&mult_by_atrans_timer);
243
- #endif
244
- #ifdef _OPENMP
245
- #pragma omp parallel for private(p, c1, c2, yj)
246
- #endif
247
- for (j = 0; j < n; j++) {
248
- yj = y[j];
249
- c1 = Ap[j];
250
- c2 = Ap[j + 1];
251
- for (p = c1; p < c2; p++) {
252
- yj += Ax[p] * x[Ai[p]];
253
- }
254
- y[j] = yj;
255
- }
256
- #if EXTRA_VERBOSE > 0
257
- scs_printf("mult By A trans time: %1.2es\n",
258
- SCS(tocq)(&mult_by_atrans_timer) / 1e3);
259
- #endif
260
- }
261
-
262
- scs_float SCS(cumsum)(scs_int *p, scs_int *c, scs_int n) {
263
- scs_int i, nz = 0;
264
- scs_float nz2 = 0;
265
- if (!p || !c) {
266
- return (-1);
267
- } /* check inputs */
268
- for (i = 0; i < n; i++) {
269
- p[i] = nz;
270
- nz += c[i];
271
- nz2 += c[i]; /* also in scs_float to avoid scs_int overflow */
272
- c[i] = p[i]; /* also copy p[0..n-1] back into c[0..n-1]*/
273
- }
274
- p[n] = nz;
275
- return nz2; /* return sum (c [0..n-1]) */
276
- }
277
-
278
- void SCS(_accum_by_a)(scs_int n, scs_float *Ax, scs_int *Ai, scs_int *Ap,
279
- const scs_float *x, scs_float *y) {
280
- /*y += A*x
281
- A in column compressed format
282
- this parallelizes over columns and uses
283
- pragma atomic to prevent concurrent writes to y
284
- */
285
- scs_int p, j;
286
- scs_int c1, c2;
287
- scs_float xj;
288
- #if EXTRA_VERBOSE > 0
289
- SCS(timer) mult_by_a_timer;
290
- SCS(tic)(&mult_by_a_timer);
291
- #endif
292
- /*#pragma omp parallel for private(p,c1,c2,xj) */
293
- for (j = 0; j < n; j++) {
294
- xj = x[j];
295
- c1 = Ap[j];
296
- c2 = Ap[j + 1];
297
- for (p = c1; p < c2; p++) {
298
- /*#pragma omp atomic */
299
- y[Ai[p]] += Ax[p] * xj;
300
- }
301
- }
302
- #if EXTRA_VERBOSE > 0
303
- scs_printf("mult By A time: %1.2es\n", SCS(tocq)(&mult_by_a_timer) / 1e3);
304
- #endif
305
- }
@@ -1,36 +0,0 @@
1
- #ifndef AMATRIX_H_GUARD
2
- #define AMATRIX_H_GUARD
3
-
4
- #ifdef __cplusplus
5
- extern "C" {
6
- #endif
7
-
8
- #include "glbopts.h"
9
- #include "linalg.h"
10
- #include "linsys.h"
11
- #include "scs.h"
12
- #include "util.h"
13
-
14
- /* this struct defines the data matrix A */
15
- struct SCS_A_DATA_MATRIX {
16
- /* A is supplied in column compressed format */
17
- scs_float *x; /* A values, size: NNZ A */
18
- scs_int *i; /* A row index, size: NNZ A */
19
- scs_int *p; /* A column pointer, size: n+1 */
20
- scs_int m, n; /* m rows, n cols */
21
- };
22
-
23
- void SCS(_accum_by_atrans)(scs_int n, scs_float *Ax, scs_int *Ai, scs_int *Ap,
24
- const scs_float *x, scs_float *y);
25
- void SCS(_accum_by_a)(scs_int n, scs_float *Ax, scs_int *Ai, scs_int *Ap,
26
- const scs_float *x, scs_float *y);
27
- void SCS(_normalize_a)(ScsMatrix *A, const ScsSettings *stgs, const ScsCone *k,
28
- ScsScaling *scal);
29
- void SCS(_un_normalize_a)(ScsMatrix *A, const ScsSettings *stgs,
30
- const ScsScaling *scal);
31
- scs_float SCS(cumsum)(scs_int *p, scs_int *c, scs_int n);
32
-
33
- #ifdef __cplusplus
34
- }
35
- #endif
36
- #endif
Binary file
Binary file
Binary file
Binary file
data/vendor/scs/src/aa.o DELETED
Binary file
Binary file
Binary file
Binary file
Binary file
data/vendor/scs/src/rw.o DELETED
Binary file
data/vendor/scs/src/scs.o DELETED
Binary file
Binary file
Binary file
Binary file
@@ -1,33 +0,0 @@
1
- #include "rw.h"
2
- #include "scs.h"
3
- #include "util.h"
4
-
5
- #define OPT (1.530897)
6
-
7
- static const char *small_random_socp(void) {
8
- ScsData *d;
9
- ScsCone *k;
10
- ScsSolution *sol;
11
- ScsInfo info = {0};
12
- scs_int exitflag, success;
13
- scs_float perr, derr;
14
- const char *filename = "test/data/small_random_socp";
15
-
16
- SCS(read_data)(filename, &d, &k);
17
- sol = scs_calloc(1, sizeof(ScsSolution));
18
- exitflag = scs(d, k, sol, &info);
19
-
20
- perr = SCS(dot)(d->c, sol->x, d->n) - OPT;
21
- derr = -SCS(dot)(d->b, sol->y, d->m) - OPT;
22
-
23
- scs_printf("primal obj error %4e\n", perr);
24
- scs_printf("dual obj error %4e\n", derr);
25
-
26
- success = ABS(perr) < 1e-4 && ABS(derr) < 1e-4 && exitflag == SCS_SOLVED;
27
-
28
- SCS(free_data)(d, k);
29
- SCS(free_sol)(sol);
30
- mu_assert("small_random_socp: SCS failed to produce outputflag SCS_SOLVED",
31
- success);
32
- return 0;
33
- }
@@ -1,2 +0,0 @@
1
- out/run_tests_indirect
2
- out/run_tests_direct