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
data/vendor/scs/src/rw.c CHANGED
@@ -33,21 +33,29 @@ static ScsCone *read_scs_cone(FILE *fin) {
33
33
  fread(&(k->z), sizeof(scs_int), 1, fin);
34
34
  fread(&(k->l), sizeof(scs_int), 1, fin);
35
35
  fread(&(k->bsize), sizeof(scs_int), 1, fin);
36
- k->bl = scs_calloc(MAX(k->bsize - 1, 0), sizeof(scs_float));
37
- k->bu = scs_calloc(MAX(k->bsize - 1, 0), sizeof(scs_float));
38
- fread(k->bl, sizeof(scs_float), MAX(k->bsize - 1, 0), fin);
39
- fread(k->bu, sizeof(scs_float), MAX(k->bsize - 1, 0), fin);
36
+ if (k->bsize > 1) {
37
+ k->bl = (scs_float *)scs_calloc(MAX(k->bsize - 1, 0), sizeof(scs_float));
38
+ k->bu = (scs_float *)scs_calloc(MAX(k->bsize - 1, 0), sizeof(scs_float));
39
+ fread(k->bl, sizeof(scs_float), MAX(k->bsize - 1, 0), fin);
40
+ fread(k->bu, sizeof(scs_float), MAX(k->bsize - 1, 0), fin);
41
+ }
40
42
  fread(&(k->qsize), sizeof(scs_int), 1, fin);
41
- k->q = scs_calloc(k->qsize, sizeof(scs_int));
42
- fread(k->q, sizeof(scs_int), k->qsize, fin);
43
+ if (k->qsize) {
44
+ k->q = (scs_int *)scs_calloc(k->qsize, sizeof(scs_int));
45
+ fread(k->q, sizeof(scs_int), k->qsize, fin);
46
+ }
43
47
  fread(&(k->ssize), sizeof(scs_int), 1, fin);
44
- k->s = scs_calloc(k->ssize, sizeof(scs_int));
45
- fread(k->s, sizeof(scs_int), k->ssize, fin);
48
+ if (k->ssize) {
49
+ k->s = (scs_int *)scs_calloc(k->ssize, sizeof(scs_int));
50
+ fread(k->s, sizeof(scs_int), k->ssize, fin);
51
+ }
46
52
  fread(&(k->ep), sizeof(scs_int), 1, fin);
47
53
  fread(&(k->ed), sizeof(scs_int), 1, fin);
48
54
  fread(&(k->psize), sizeof(scs_int), 1, fin);
49
- k->p = scs_calloc(k->psize, sizeof(scs_float));
50
- fread(k->p, sizeof(scs_float), k->psize, fin);
55
+ if (k->psize) {
56
+ k->p = (scs_float *)scs_calloc(k->psize, sizeof(scs_float));
57
+ fread(k->p, sizeof(scs_float), k->psize, fin);
58
+ }
51
59
  return k;
52
60
  }
53
61
 
@@ -103,11 +111,11 @@ static ScsMatrix *read_amatrix(FILE *fin) {
103
111
  ScsMatrix *A = (ScsMatrix *)scs_calloc(1, sizeof(ScsMatrix));
104
112
  fread(&(A->m), sizeof(scs_int), 1, fin);
105
113
  fread(&(A->n), sizeof(scs_int), 1, fin);
106
- A->p = scs_calloc(A->n + 1, sizeof(scs_int));
114
+ A->p = (scs_int *)scs_calloc(A->n + 1, sizeof(scs_int));
107
115
  fread(A->p, sizeof(scs_int), A->n + 1, fin);
108
116
  Anz = A->p[A->n];
109
- A->x = scs_calloc(Anz, sizeof(scs_float));
110
- A->i = scs_calloc(Anz, sizeof(scs_int));
117
+ A->x = (scs_float *)scs_calloc(Anz, sizeof(scs_float));
118
+ A->i = (scs_int *)scs_calloc(Anz, sizeof(scs_int));
111
119
  fread(A->x, sizeof(scs_float), Anz, fin);
112
120
  fread(A->i, sizeof(scs_int), Anz, fin);
113
121
  return A;
@@ -132,8 +140,8 @@ static ScsData *read_scs_data(FILE *fin) {
132
140
  ScsData *d = (ScsData *)scs_calloc(1, sizeof(ScsData));
133
141
  fread(&(d->m), sizeof(scs_int), 1, fin);
134
142
  fread(&(d->n), sizeof(scs_int), 1, fin);
135
- d->b = scs_calloc(d->m, sizeof(scs_float));
136
- d->c = scs_calloc(d->n, sizeof(scs_float));
143
+ d->b = (scs_float *)scs_calloc(d->m, sizeof(scs_float));
144
+ d->c = (scs_float *)scs_calloc(d->n, sizeof(scs_float));
137
145
  fread(d->b, sizeof(scs_float), d->m, fin);
138
146
  fread(d->c, sizeof(scs_float), d->n, fin);
139
147
  d->A = read_amatrix(fin);
@@ -146,8 +154,8 @@ static ScsData *read_scs_data(FILE *fin) {
146
154
  void SCS(write_data)(const ScsData *d, const ScsCone *k,
147
155
  const ScsSettings *stgs) {
148
156
  FILE *fout = fopen(stgs->write_data_filename, "wb");
149
- uint32_t scs_int_sz = (uint32_t)SCS(sizeof_int)();
150
- uint32_t scs_float_sz = (uint32_t)SCS(sizeof_float)();
157
+ uint32_t scs_int_sz = (uint32_t)sizeof(scs_int);
158
+ uint32_t scs_float_sz = (uint32_t)sizeof(scs_float);
151
159
  const char *scs_version = SCS_VERSION;
152
160
  uint32_t scs_version_sz = (uint32_t)strlen(scs_version);
153
161
  scs_printf("writing data to %s\n", stgs->write_data_filename);
@@ -208,11 +216,13 @@ scs_int SCS(read_data)(const char *filename, ScsData **d, ScsCone **k,
208
216
  return 0;
209
217
  }
210
218
 
211
- void SCS(log_data_to_csv)(const ScsData *d, const ScsCone *k,
212
- const ScsSettings *stgs, const ScsWork *w,
213
- scs_int iter, SCS(timer) * solve_timer) {
219
+ void SCS(log_data_to_csv)(const ScsCone *k, const ScsSettings *stgs,
220
+ const ScsWork *w, scs_int iter,
221
+ SCS(timer) * solve_timer) {
214
222
  ScsResiduals *r = w->r_orig;
215
223
  ScsResiduals *r_n = w->r_normalized;
224
+ ScsSolution *sol = w->xys_orig;
225
+ ScsSolution *sol_n = w->xys_normalized;
216
226
  /* if iter 0 open to write, else open to append */
217
227
  FILE *fout = fopen(stgs->log_csv_filename, iter == 0 ? "w" : "a");
218
228
  if (!fout) {
@@ -220,13 +230,25 @@ void SCS(log_data_to_csv)(const ScsData *d, const ScsCone *k,
220
230
  stgs->log_csv_filename);
221
231
  return;
222
232
  }
223
- scs_int l = w->m + w->n + 1;
233
+ scs_int l = w->d->m + w->d->n + 1;
224
234
  if (iter == 0) {
225
235
  /* need to end in comma so that csv parsing is correct */
226
236
  fprintf(fout, "iter,"
227
237
  "res_pri,"
228
238
  "res_dual,"
229
239
  "gap,"
240
+ "x_nrm_inf,"
241
+ "y_nrm_inf,"
242
+ "s_nrm_inf,"
243
+ "x_nrm_2,"
244
+ "y_nrm_2,"
245
+ "s_nrm_2,"
246
+ "x_nrm_inf_normalized,"
247
+ "y_nrm_inf_normalized,"
248
+ "s_nrm_inf_normalized,"
249
+ "x_nrm_2_normalized,"
250
+ "y_nrm_2_normalized,"
251
+ "s_nrm_2_normalized,"
230
252
  "ax_s_btau_nrm_inf,"
231
253
  "px_aty_ctau_nrm_inf,"
232
254
  "ax_s_btau_nrm_2,"
@@ -252,6 +274,11 @@ void SCS(log_data_to_csv)(const ScsData *d, const ScsCone *k,
252
274
  "dobj_normalized,"
253
275
  "tau_normalized,"
254
276
  "kap_normalized,"
277
+ "ax_nrm_inf,"
278
+ "px_nrm_inf,"
279
+ "aty_nrm_inf,"
280
+ "b_nrm_inf,"
281
+ "c_nrm_inf,"
255
282
  "scale,"
256
283
  "diff_u_ut_nrm_2,"
257
284
  "diff_v_v_prev_nrm_2,"
@@ -267,10 +294,22 @@ void SCS(log_data_to_csv)(const ScsData *d, const ScsCone *k,
267
294
  fprintf(fout, "%.16e,", r->res_pri);
268
295
  fprintf(fout, "%.16e,", r->res_dual);
269
296
  fprintf(fout, "%.16e,", r->gap);
270
- fprintf(fout, "%.16e,", SCS(norm_inf)(r->ax_s_btau, w->m));
271
- fprintf(fout, "%.16e,", SCS(norm_inf)(r->px_aty_ctau, w->n));
272
- fprintf(fout, "%.16e,", SCS(norm_2)(r->ax_s_btau, w->m));
273
- fprintf(fout, "%.16e,", SCS(norm_2)(r->px_aty_ctau, w->n));
297
+ fprintf(fout, "%.16e,", SCS(norm_inf)(sol->x, w->d->n));
298
+ fprintf(fout, "%.16e,", SCS(norm_inf)(sol->y, w->d->m));
299
+ fprintf(fout, "%.16e,", SCS(norm_inf)(sol->s, w->d->m));
300
+ fprintf(fout, "%.16e,", SCS(norm_2)(sol->x, w->d->n));
301
+ fprintf(fout, "%.16e,", SCS(norm_2)(sol->y, w->d->m));
302
+ fprintf(fout, "%.16e,", SCS(norm_2)(sol->s, w->d->m));
303
+ fprintf(fout, "%.16e,", SCS(norm_inf)(sol_n->x, w->d->n));
304
+ fprintf(fout, "%.16e,", SCS(norm_inf)(sol_n->y, w->d->m));
305
+ fprintf(fout, "%.16e,", SCS(norm_inf)(sol_n->s, w->d->m));
306
+ fprintf(fout, "%.16e,", SCS(norm_2)(sol_n->x, w->d->n));
307
+ fprintf(fout, "%.16e,", SCS(norm_2)(sol_n->y, w->d->m));
308
+ fprintf(fout, "%.16e,", SCS(norm_2)(sol_n->s, w->d->m));
309
+ fprintf(fout, "%.16e,", SCS(norm_inf)(r->ax_s_btau, w->d->m));
310
+ fprintf(fout, "%.16e,", SCS(norm_inf)(r->px_aty_ctau, w->d->n));
311
+ fprintf(fout, "%.16e,", SCS(norm_2)(r->ax_s_btau, w->d->m));
312
+ fprintf(fout, "%.16e,", SCS(norm_2)(r->px_aty_ctau, w->d->n));
274
313
  fprintf(fout, "%.16e,", r->res_infeas);
275
314
  fprintf(fout, "%.16e,", r->res_unbdd_a);
276
315
  fprintf(fout, "%.16e,", r->res_unbdd_p);
@@ -281,10 +320,10 @@ void SCS(log_data_to_csv)(const ScsData *d, const ScsCone *k,
281
320
  fprintf(fout, "%.16e,", r_n->res_pri);
282
321
  fprintf(fout, "%.16e,", r_n->res_dual);
283
322
  fprintf(fout, "%.16e,", r_n->gap);
284
- fprintf(fout, "%.16e,", SCS(norm_inf)(r_n->ax_s_btau, w->m));
285
- fprintf(fout, "%.16e,", SCS(norm_inf)(r_n->px_aty_ctau, w->n));
286
- fprintf(fout, "%.16e,", SCS(norm_2)(r_n->ax_s_btau, w->m));
287
- fprintf(fout, "%.16e,", SCS(norm_2)(r_n->px_aty_ctau, w->n));
323
+ fprintf(fout, "%.16e,", SCS(norm_inf)(r_n->ax_s_btau, w->d->m));
324
+ fprintf(fout, "%.16e,", SCS(norm_inf)(r_n->px_aty_ctau, w->d->n));
325
+ fprintf(fout, "%.16e,", SCS(norm_2)(r_n->ax_s_btau, w->d->m));
326
+ fprintf(fout, "%.16e,", SCS(norm_2)(r_n->px_aty_ctau, w->d->n));
288
327
  fprintf(fout, "%.16e,", r_n->res_infeas);
289
328
  fprintf(fout, "%.16e,", r_n->res_unbdd_a);
290
329
  fprintf(fout, "%.16e,", r_n->res_unbdd_p);
@@ -292,7 +331,12 @@ void SCS(log_data_to_csv)(const ScsData *d, const ScsCone *k,
292
331
  fprintf(fout, "%.16e,", r_n->dobj);
293
332
  fprintf(fout, "%.16e,", r_n->tau);
294
333
  fprintf(fout, "%.16e,", r_n->kap);
295
- fprintf(fout, "%.16e,", w->scale);
334
+ fprintf(fout, "%.16e,", SCS(norm_inf)(r->ax, w->d->m));
335
+ fprintf(fout, "%.16e,", SCS(norm_inf)(r->px, w->d->n));
336
+ fprintf(fout, "%.16e,", SCS(norm_inf)(r->aty, w->d->n));
337
+ fprintf(fout, "%.16e,", SCS(norm_inf)(w->b_orig, w->d->m));
338
+ fprintf(fout, "%.16e,", SCS(norm_inf)(w->c_orig, w->d->n));
339
+ fprintf(fout, "%.16e,", w->stgs->scale);
296
340
  fprintf(fout, "%.16e,", SCS(norm_diff)(w->u, w->u_t, l));
297
341
  fprintf(fout, "%.16e,", SCS(norm_diff)(w->v, w->v_prev, l));
298
342
  fprintf(fout, "%.16e,", SCS(norm_inf_diff)(w->u, w->u_t, l));