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
@@ -1,11 +1,13 @@
1
+ #ifdef __cplusplus
2
+ extern "C" {
3
+ #endif
4
+
1
5
  #include "glbopts.h"
2
6
 
3
- const char *SCS(version)(void) {
7
+ const char *scs_version(void) {
4
8
  return SCS_VERSION;
5
9
  }
6
- size_t SCS(sizeof_int)(void) {
7
- return sizeof(scs_int);
8
- }
9
- size_t SCS(sizeof_float)(void) {
10
- return sizeof(scs_float);
10
+
11
+ #ifdef __cplusplus
11
12
  }
13
+ #endif
@@ -71,7 +71,32 @@ scs_float SCS(tocq)(SCS(timer) * t) {
71
71
 
72
72
  #endif
73
73
 
74
- void SCS(free_data)(ScsData *d, ScsCone *k, ScsSettings *stgs) {
74
+ void SCS(deep_copy_data)(ScsData *dest, const ScsData *src) {
75
+ dest->n = src->n;
76
+ dest->m = src->m;
77
+ SCS(copy_matrix)(&(dest->A), src->A);
78
+ SCS(copy_matrix)(&(dest->P), src->P);
79
+ dest->b = (scs_float *)scs_calloc(dest->m, sizeof(scs_float));
80
+ memcpy(dest->b, src->b, dest->m * sizeof(scs_float));
81
+ dest->c = (scs_float *)scs_calloc(dest->n, sizeof(scs_float));
82
+ memcpy(dest->c, src->c, dest->n * sizeof(scs_float));
83
+ }
84
+
85
+ void SCS(deep_copy_stgs)(ScsSettings *dest, const ScsSettings *src) {
86
+ memcpy(dest, src, sizeof(ScsSettings));
87
+ if (src->write_data_filename) {
88
+ dest->write_data_filename = strdup(src->write_data_filename);
89
+ } else {
90
+ dest->write_data_filename = SCS_NULL;
91
+ }
92
+ if (src->log_csv_filename) {
93
+ dest->log_csv_filename = strdup(src->log_csv_filename);
94
+ } else {
95
+ dest->log_csv_filename = SCS_NULL;
96
+ }
97
+ }
98
+
99
+ void SCS(free_data)(ScsData *d) {
75
100
  if (d) {
76
101
  scs_free(d->b);
77
102
  scs_free(d->c);
@@ -83,17 +108,6 @@ void SCS(free_data)(ScsData *d, ScsCone *k, ScsSettings *stgs) {
83
108
  }
84
109
  scs_free(d);
85
110
  }
86
- if (k) {
87
- scs_free(k->bu);
88
- scs_free(k->bl);
89
- scs_free(k->q);
90
- scs_free(k->s);
91
- scs_free(k->p);
92
- scs_free(k);
93
- }
94
- if (stgs) {
95
- scs_free(stgs);
96
- }
97
111
  }
98
112
 
99
113
  void SCS(free_sol)(ScsSolution *sol) {
@@ -106,7 +120,7 @@ void SCS(free_sol)(ScsSolution *sol) {
106
120
  }
107
121
 
108
122
  /* assumes stgs already allocated memory */
109
- void SCS(set_default_settings)(ScsSettings *stgs) {
123
+ void scs_set_default_settings(ScsSettings *stgs) {
110
124
  /* These constants are defined in include/glbopts.h */
111
125
  stgs->max_iters = MAX_ITERS;
112
126
  stgs->eps_abs = EPS_ABS;
@@ -13,10 +13,15 @@
13
13
  if (!(test)) \
14
14
  return message; \
15
15
  } while (0)
16
- #define mu_run_test(test) \
16
+ #define mu_run_test(test) _mu_run_test(#test, test)
17
+
18
+ #define _mu_run_test(name, test) \
17
19
  do { \
20
+ scs_printf("*********************************************************\n"); \
21
+ scs_printf("Running test: %s\n", name); \
18
22
  const char *message = test(); \
19
23
  tests_run++; \
24
+ scs_printf("*********************************************************\n"); \
20
25
  if (message) \
21
26
  return message; \
22
27
  } while (0)
@@ -10,21 +10,11 @@
10
10
  #include "scs_matrix.h"
11
11
  #include "util.h"
12
12
 
13
- #define PI (3.141592654)
14
- #ifdef DLONG
15
- #ifdef _WIN64
16
- /* this is a Microsoft extension, but also works with min_g_w-w64 */
17
- #define INTRW "%I64d"
18
- #else
19
- #define INTRW "%ld"
20
- #endif
21
- #else
22
- #define INTRW "%i"
23
- #endif
13
+ #define _MAX_RAND_VAL (1073741823) /* 2^30 - 1 */
24
14
 
25
15
  /* uniform random number in [-1,1] */
26
16
  static scs_float rand_scs_float(void) {
27
- return 2 * (((scs_float)ran_arr_next()) / RAND_MAX) - 1;
17
+ return 2 * (((scs_float)ran_arr_next()) / _MAX_RAND_VAL) - 1; /* in [-1, 1] */
28
18
  }
29
19
 
30
20
  void gen_random_prob_data(scs_int nnz, scs_int col_nnz, ScsData *d, ScsCone *k,
@@ -51,8 +41,8 @@ void gen_random_prob_data(scs_int nnz, scs_int col_nnz, ScsData *d, ScsCone *k,
51
41
  for (i = 0; i < m; i++) {
52
42
  y[i] = z[i] = rand_scs_float();
53
43
  }
54
- tmp_cone_work = SCS(init_cone)(k, SCS_NULL, m);
55
- SCS(proj_dual_cone)(y, k, tmp_cone_work, 0);
44
+ tmp_cone_work = SCS(init_cone)(k, m);
45
+ SCS(proj_dual_cone)(y, tmp_cone_work, SCS_NULL, SCS_NULL);
56
46
  SCS(finish_cone(tmp_cone_work));
57
47
 
58
48
  for (i = 0; i < m; i++) {
@@ -88,25 +78,25 @@ void gen_random_prob_data(scs_int nnz, scs_int col_nnz, ScsData *d, ScsCone *k,
88
78
  scs_free(z);
89
79
  }
90
80
 
91
- static scs_float get_dual_cone_dist(const scs_float *y, const ScsCone *k,
92
- ScsConeWork *c, scs_int m) {
81
+ static scs_float get_dual_cone_dist(const scs_float *y, ScsConeWork *c,
82
+ scs_int m) {
93
83
  scs_float dist;
94
84
  scs_float *t = (scs_float *)scs_calloc(m, sizeof(scs_float));
95
85
  memcpy(t, y, m * sizeof(scs_float));
96
- SCS(proj_dual_cone)(t, k, c, 0);
86
+ SCS(proj_dual_cone)(t, c, SCS_NULL, SCS_NULL);
97
87
  dist = SCS(norm_inf_diff)(t, y, m);
98
88
  scs_free(t);
99
89
  return dist;
100
90
  }
101
91
 
102
92
  /* via moreau */
103
- static scs_float get_pri_cone_dist(const scs_float *s, const ScsCone *k,
104
- ScsConeWork *c, scs_int m) {
93
+ static scs_float get_pri_cone_dist(const scs_float *s, ScsConeWork *c,
94
+ scs_int m) {
105
95
  scs_float dist;
106
96
  scs_float *t = (scs_float *)scs_calloc(m, sizeof(scs_float));
107
97
  memcpy(t, s, m * sizeof(scs_float));
108
98
  SCS(scale_array)(t, -1.0, m);
109
- SCS(proj_dual_cone)(t, k, c, 0);
99
+ SCS(proj_dual_cone)(t, c, SCS_NULL, SCS_NULL);
110
100
  dist = SCS(norm_inf)(t, m); /* ||s - Pi_c(s)|| = ||Pi_c*(-s)|| */
111
101
  scs_free(t);
112
102
  return dist;
@@ -123,11 +113,11 @@ const char *verify_solution_correct(ScsData *d, ScsCone *k, ScsSettings *stgs,
123
113
  scs_float *c = d->c;
124
114
  scs_float *b = d->b;
125
115
 
126
- scs_float *primal = scs_calloc(m, sizeof(scs_float));
127
- scs_float *ax = scs_calloc(m, sizeof(scs_float));
128
- scs_float *dual = scs_calloc(n, sizeof(scs_float));
129
- scs_float *px = scs_calloc(n, sizeof(scs_float));
130
- scs_float *aty = scs_calloc(n, sizeof(scs_float));
116
+ scs_float *primal = (scs_float *)scs_calloc(m, sizeof(scs_float));
117
+ scs_float *ax = (scs_float *)scs_calloc(m, sizeof(scs_float));
118
+ scs_float *dual = (scs_float *)scs_calloc(n, sizeof(scs_float));
119
+ scs_float *px = (scs_float *)scs_calloc(n, sizeof(scs_float));
120
+ scs_float *aty = (scs_float *)scs_calloc(n, sizeof(scs_float));
131
121
 
132
122
  scs_float res_pri, res_dual, res_infeas, res_unbdd_a, res_unbdd_p;
133
123
  scs_float ctx, bty, xt_p_x, gap, pobj, dobj, sty;
@@ -135,7 +125,7 @@ const char *verify_solution_correct(ScsData *d, ScsCone *k, ScsSettings *stgs,
135
125
 
136
126
  scs_float sdist = NAN, ydist = NAN;
137
127
 
138
- ScsConeWork *cone_work = SCS(init_cone)(k, SCS_NULL, m);
128
+ ScsConeWork *cone_work = SCS(init_cone)(k, m);
139
129
 
140
130
  /**************** PRIMAL *********************/
141
131
  memset(ax, 0, m * sizeof(scs_float));
@@ -182,10 +172,10 @@ const char *verify_solution_correct(ScsData *d, ScsCone *k, ScsSettings *stgs,
182
172
  /**************** CONES *****************/
183
173
 
184
174
  if (status == SCS_SOLVED || status == SCS_UNBOUNDED) {
185
- sdist = get_pri_cone_dist(sol->s, k, cone_work, m);
175
+ sdist = get_pri_cone_dist(sol->s, cone_work, m);
186
176
  }
187
177
  if (status == SCS_SOLVED || status == SCS_INFEASIBLE) {
188
- ydist = get_dual_cone_dist(sol->y, k, cone_work, m);
178
+ ydist = get_dual_cone_dist(sol->y, cone_work, m);
189
179
  }
190
180
 
191
181
  /**************** OTHERS *****************/
@@ -215,14 +205,17 @@ const char *verify_solution_correct(ScsData *d, ScsCone *k, ScsSettings *stgs,
215
205
  /**************** ASSERTS *****************/
216
206
  if (status == SCS_SOLVED) {
217
207
  mu_assert_less("Primal residual ERROR", ABS(res_pri - info->res_pri),
218
- 1e-12);
208
+ 1e-10);
219
209
  mu_assert_less("Dual residual ERROR", ABS(res_dual - info->res_dual),
220
- 1e-12);
221
- mu_assert_less("Gap ERROR", ABS(gap - info->gap), 1e-12);
222
- mu_assert_less("Primal obj ERROR", ABS(pobj - info->pobj), 1e-12);
223
- mu_assert_less("Dual obj ERROR", ABS(dobj - info->dobj), 1e-12);
210
+ 1e-10);
211
+ mu_assert_less("Gap ERROR", ABS(gap - info->gap), 1e-7 * (1 + ABS(gap)));
212
+ mu_assert_less("Primal obj ERROR", ABS(pobj - info->pobj),
213
+ 1e-9 * (1 + ABS(pobj)));
214
+ mu_assert_less("Dual obj ERROR", ABS(dobj - info->dobj),
215
+ 1e-9 * (1 + ABS(dobj)));
224
216
  /* slightly looser tol */
225
- mu_assert_less("Complementary slackness ERROR", ABS(sty), 1e-6);
217
+ mu_assert_less("Complementary slackness ERROR", ABS(sty),
218
+ 1e-8 * MAX(NORM(s, m), NORM(y, m)));
226
219
  mu_assert_less("s cone dist ERROR", ABS(sdist), 1e-5);
227
220
  mu_assert_less("y cone dist ERROR", ABS(ydist), 1e-5);
228
221
 
@@ -230,7 +223,7 @@ const char *verify_solution_correct(ScsData *d, ScsCone *k, ScsSettings *stgs,
230
223
  stgs->eps_abs + stgs->eps_rel * prl);
231
224
  mu_assert_less("Dual feas ERROR", res_dual,
232
225
  stgs->eps_abs + stgs->eps_rel * drl);
233
- mu_assert_less("Gap ERROR", gap, stgs->eps_abs + stgs->eps_rel * grl);
226
+ mu_assert_less("Gap feas ERROR", gap, stgs->eps_abs + stgs->eps_rel * grl);
234
227
 
235
228
  } else if (status == SCS_INFEASIBLE) {
236
229
  mu_assert_less("Infeas ERROR", ABS(res_infeas - info->res_infeas), 1e-8);
@@ -1,6 +1,7 @@
1
1
  #include "glbopts.h"
2
2
  #include "linalg.h"
3
3
  #include "minunit.h"
4
+ #include "problem_utils.h"
4
5
  #include "scs.h"
5
6
  #include "scs_matrix.h"
6
7
  #include "util.h"
@@ -58,7 +59,7 @@ static const char *degenerate(void) {
58
59
  d->P->i = Pi;
59
60
  d->P->p = Pp;
60
61
 
61
- SCS(set_default_settings)(stgs);
62
+ scs_set_default_settings(stgs);
62
63
  stgs->eps_abs = 1e-6;
63
64
  stgs->eps_rel = 1e-6;
64
65
  stgs->eps_infeas = 1e-9;
@@ -1,6 +1,7 @@
1
1
  #include "glbopts.h"
2
2
  #include "linalg.h"
3
3
  #include "minunit.h"
4
+ #include "problem_utils.h"
4
5
  #include "scs.h"
5
6
  #include "scs_matrix.h"
6
7
  #include "util.h"
@@ -64,7 +65,7 @@ static const char *hs21_tiny_qp(void) {
64
65
  k->bl = bl;
65
66
  k->bu = bu;
66
67
 
67
- SCS(set_default_settings)(stgs);
68
+ scs_set_default_settings(stgs);
68
69
  stgs->eps_abs = 1e-6;
69
70
  stgs->eps_rel = 1e-6;
70
71
  stgs->eps_infeas = 1e-9;
@@ -1,6 +1,7 @@
1
1
  #include "glbopts.h"
2
2
  #include "linalg.h"
3
3
  #include "minunit.h"
4
+ #include "problem_utils.h"
4
5
  #include "rw.h"
5
6
  #include "scs.h"
6
7
  #include "scs_matrix.h"
@@ -66,7 +67,7 @@ static const char *hs21_tiny_qp_rw(void) {
66
67
  k->bl = bl;
67
68
  k->bu = bu;
68
69
 
69
- SCS(set_default_settings)(stgs);
70
+ scs_set_default_settings(stgs);
70
71
  stgs->eps_abs = 1e-6;
71
72
  stgs->eps_rel = 1e-6;
72
73
  stgs->eps_infeas = 1e-9;
@@ -110,7 +111,10 @@ static const char *hs21_tiny_qp_rw(void) {
110
111
  mu_assert("hs21_tiny_qp: SCS failed to produce outputflag SCS_SOLVED",
111
112
  success);
112
113
 
114
+ SCS(free_data)(d);
115
+ SCS(free_cone)(k);
113
116
  SCS(free_sol)(sol);
114
- SCS(free_data)(d, k, stgs);
117
+ scs_free(stgs);
118
+
115
119
  return fail;
116
120
  }
@@ -1,6 +1,7 @@
1
1
  #include "glbopts.h"
2
2
  #include "linalg.h"
3
3
  #include "minunit.h"
4
+ #include "problem_utils.h"
4
5
  #include "scs.h"
5
6
  #include "scs_matrix.h"
6
7
  #include "util.h"
@@ -78,7 +79,7 @@ static const char *infeasible_tiny_qp(void) {
78
79
 
79
80
  k->l = l;
80
81
 
81
- SCS(set_default_settings)(stgs);
82
+ scs_set_default_settings(stgs);
82
83
  stgs->eps_abs = 1e-6;
83
84
  stgs->eps_rel = 1e-6;
84
85
  stgs->eps_infeas = 1e-9;
@@ -1,6 +1,7 @@
1
1
  #include "glbopts.h"
2
2
  #include "linalg.h"
3
3
  #include "minunit.h"
4
+ #include "problem_utils.h"
4
5
  #include "scs.h"
5
6
  #include "scs_matrix.h"
6
7
  #include "util.h"
@@ -118,9 +119,9 @@ static const char *qafiro_tiny_qp(void) {
118
119
  k->bu = bu;
119
120
  k->z = z;
120
121
 
121
- SCS(set_default_settings)(stgs);
122
- stgs->eps_abs = 1e-6;
123
- stgs->eps_rel = 1e-6;
122
+ scs_set_default_settings(stgs);
123
+ stgs->eps_abs = 1e-7;
124
+ stgs->eps_rel = 1e-7;
124
125
  stgs->eps_infeas = 1e-9;
125
126
 
126
127
  exitflag = scs(d, k, stgs, sol, &info);
@@ -141,7 +142,7 @@ static const char *qafiro_tiny_qp(void) {
141
142
  stgs->warm_start = 1;
142
143
  exitflag = scs(d, k, stgs, sol, &info);
143
144
  /* 25 iters should be enough if warm-started */
144
- mu_assert("qafiro_tiny_qp: warm-start failure", info.iter <= 50);
145
+ mu_assert("qafiro_tiny_qp: warm-start failure", info.iter <= 100);
145
146
  success = ABS(perr) < 1e-4 && ABS(derr) < 1e-4 && exitflag == SCS_SOLVED;
146
147
 
147
148
  mu_assert("qafiro_tiny_qp: SCS failed to produce outputflag SCS_SOLVED",
@@ -1,6 +1,7 @@
1
1
  #include "glbopts.h"
2
2
  #include "minunit.h"
3
3
  #include "problem_utils.h"
4
+ #include "rw.h"
4
5
  #include "scs.h"
5
6
  #include "util.h"
6
7
 
@@ -27,7 +28,7 @@ static const char *random_prob(void) {
27
28
  stgs->eps_abs = 1e-6;
28
29
  stgs->eps_rel = 1e-6;
29
30
 
30
- sol = scs_calloc(1, sizeof(ScsSolution));
31
+ sol = (ScsSolution *)scs_calloc(1, sizeof(ScsSolution));
31
32
  exitflag = scs(d, k, stgs, sol, &info);
32
33
 
33
34
  perr = SCS(dot)(d->c, sol->x, d->n) - OPT;
@@ -39,7 +40,10 @@ static const char *random_prob(void) {
39
40
 
40
41
  mu_assert("random_prob: SCS failed to produce SCS_SOLVED", success);
41
42
  fail = verify_solution_correct(d, k, stgs, &info, sol, exitflag);
42
- SCS(free_data)(d, k, stgs);
43
+ SCS(free_data)(d);
44
+ SCS(free_cone)(k);
43
45
  SCS(free_sol)(sol);
46
+ scs_free(stgs);
47
+
44
48
  return fail;
45
49
  }
@@ -1,6 +1,8 @@
1
1
  #include "glbopts.h"
2
2
  #include "linalg.h"
3
3
  #include "minunit.h"
4
+ #include "problem_utils.h"
5
+ #include "rw.h"
4
6
  #include "scs.h"
5
7
  #include "scs_matrix.h"
6
8
  #include "util.h"
@@ -155,7 +157,7 @@ static const char *rob_gauss_cov_est(void) {
155
157
  k->p = p;
156
158
  k->psize = psize;
157
159
 
158
- SCS(set_default_settings)(stgs);
160
+ scs_set_default_settings(stgs);
159
161
  stgs->eps_abs = 1e-6;
160
162
  stgs->eps_rel = 1e-6;
161
163
  stgs->eps_infeas = 1e-9;
@@ -173,6 +175,8 @@ static const char *rob_gauss_cov_est(void) {
173
175
  mu_assert("rob_gauss_cov_est: SCS failed to produce outputflag SCS_SOLVED",
174
176
  success);
175
177
  fail = verify_solution_correct(d, k, stgs, &info, sol, exitflag);
178
+ if (fail)
179
+ return fail;
176
180
 
177
181
  /* test warm-starting */
178
182
  stgs->warm_start = 1;
@@ -236,7 +240,10 @@ static const char *rob_gauss_cov_est(void) {
236
240
  mu_assert("rob_gauss_cov_est_rw: SCS failed to produce outputflag SCS_SOLVED",
237
241
  success);
238
242
 
243
+ SCS(free_data)(d);
244
+ SCS(free_cone)(k);
239
245
  SCS(free_sol)(sol);
240
- SCS(free_data)(d, k, stgs);
246
+ scs_free(stgs);
247
+
241
248
  return fail;
242
249
  }
@@ -28,13 +28,15 @@ static const char *small_lp(void) {
28
28
  d->m = m;
29
29
  d->n = n;
30
30
  gen_random_prob_data(nnz, col_nnz, d, k, opt_sol, seed);
31
- SCS(set_default_settings)(stgs);
31
+ scs_set_default_settings(stgs);
32
32
  stgs->eps_abs = 1e-5;
33
33
  stgs->eps_rel = 1e-5;
34
34
 
35
35
  exitflag = scs(d, k, stgs, sol, &info);
36
+
36
37
  perr = SCS(dot)(d->c, sol->x, d->n) - SCS(dot)(d->c, opt_sol->x, d->n);
37
38
  derr = -SCS(dot)(d->b, sol->y, d->m) + SCS(dot)(d->b, opt_sol->y, d->m);
39
+ scs_printf("true obj %4e\n", SCS(dot)(d->c, opt_sol->x, d->n));
38
40
  scs_printf("primal obj error %4e\n", perr);
39
41
  scs_printf("dual obj error %4e\n", derr);
40
42
 
@@ -42,8 +44,11 @@ static const char *small_lp(void) {
42
44
 
43
45
  mu_assert("small_lp: SCS failed to produce outputflag SCS_SOLVED", success);
44
46
  fail = verify_solution_correct(d, k, stgs, &info, sol, exitflag);
45
- SCS(free_data)(d, k, stgs);
47
+ SCS(free_data)(d);
48
+ SCS(free_cone)(k);
46
49
  SCS(free_sol)(sol);
47
50
  SCS(free_sol)(opt_sol);
51
+ scs_free(stgs);
52
+
48
53
  return fail;
49
54
  }