scs 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
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
  }