scs 0.3.0 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +14 -0
- data/README.md +42 -13
- data/lib/scs/ffi.rb +1 -7
- data/lib/scs/matrix.rb +72 -0
- data/lib/scs/solver.rb +19 -26
- data/lib/scs/version.rb +1 -1
- data/lib/scs.rb +1 -0
- data/vendor/scs/CITATION.cff +1 -1
- data/vendor/scs/CMakeLists.txt +55 -7
- data/vendor/scs/Makefile +9 -9
- data/vendor/scs/README.md +4 -1
- data/vendor/scs/include/aa.h +1 -1
- data/vendor/scs/include/cones.h +17 -12
- data/vendor/scs/include/glbopts.h +27 -66
- data/vendor/scs/include/linalg.h +2 -1
- data/vendor/scs/include/linsys.h +13 -13
- data/vendor/scs/include/normalize.h +7 -5
- data/vendor/scs/include/rw.h +3 -3
- data/vendor/scs/include/scs.h +85 -106
- data/vendor/scs/include/scs_types.h +34 -0
- data/vendor/scs/include/scs_work.h +80 -0
- data/vendor/scs/include/util.h +3 -1
- data/vendor/scs/linsys/cpu/direct/private.c +86 -73
- data/vendor/scs/linsys/cpu/direct/private.h +2 -2
- data/vendor/scs/linsys/cpu/indirect/private.c +42 -33
- data/vendor/scs/linsys/cpu/indirect/private.h +1 -2
- data/vendor/scs/linsys/csparse.c +3 -3
- data/vendor/scs/linsys/external/amd/LICENSE.txt +0 -897
- data/vendor/scs/linsys/external/amd/SuiteSparse_config.c +9 -7
- data/vendor/scs/linsys/external/amd/SuiteSparse_config.h +1 -1
- data/vendor/scs/linsys/external/amd/amd_order.c +5 -5
- data/vendor/scs/linsys/gpu/gpu.h +8 -11
- data/vendor/scs/linsys/gpu/indirect/private.c +72 -49
- data/vendor/scs/linsys/gpu/indirect/private.h +14 -13
- data/vendor/scs/linsys/scs_matrix.c +55 -104
- data/vendor/scs/linsys/scs_matrix.h +5 -4
- data/vendor/scs/scs.mk +1 -5
- data/vendor/scs/src/aa.c +13 -8
- data/vendor/scs/src/cones.c +197 -108
- data/vendor/scs/src/linalg.c +25 -0
- data/vendor/scs/src/normalize.c +75 -26
- data/vendor/scs/src/rw.c +74 -30
- data/vendor/scs/src/scs.c +300 -264
- data/vendor/scs/src/scs_version.c +8 -6
- data/vendor/scs/src/util.c +27 -13
- data/vendor/scs/test/minunit.h +6 -1
- data/vendor/scs/test/problem_utils.h +28 -35
- data/vendor/scs/test/problems/degenerate.h +2 -1
- data/vendor/scs/test/problems/hs21_tiny_qp.h +2 -1
- data/vendor/scs/test/problems/hs21_tiny_qp_rw.h +6 -2
- data/vendor/scs/test/problems/infeasible_tiny_qp.h +2 -1
- data/vendor/scs/test/problems/qafiro_tiny_qp.h +5 -4
- data/vendor/scs/test/problems/random_prob.h +6 -2
- data/vendor/scs/test/problems/rob_gauss_cov_est.h +9 -2
- data/vendor/scs/test/problems/small_lp.h +7 -2
- data/vendor/scs/test/problems/small_qp.h +387 -0
- data/vendor/scs/test/problems/{test_fails.h → test_validation.h} +7 -4
- data/vendor/scs/test/problems/unbounded_tiny_qp.h +4 -4
- data/vendor/scs/test/random_socp_prob.c +4 -2
- data/vendor/scs/test/run_from_file.c +16 -4
- data/vendor/scs/test/run_tests.c +23 -14
- metadata +10 -35
- data/vendor/scs/linsys/cpu/direct/private.o +0 -0
- data/vendor/scs/linsys/cpu/indirect/private.o +0 -0
- data/vendor/scs/linsys/csparse.o +0 -0
- data/vendor/scs/linsys/external/amd/SuiteSparse_config.o +0 -0
- data/vendor/scs/linsys/external/amd/amd_1.o +0 -0
- data/vendor/scs/linsys/external/amd/amd_2.o +0 -0
- data/vendor/scs/linsys/external/amd/amd_aat.o +0 -0
- data/vendor/scs/linsys/external/amd/amd_control.o +0 -0
- data/vendor/scs/linsys/external/amd/amd_defaults.o +0 -0
- data/vendor/scs/linsys/external/amd/amd_dump.o +0 -0
- data/vendor/scs/linsys/external/amd/amd_global.o +0 -0
- data/vendor/scs/linsys/external/amd/amd_info.o +0 -0
- data/vendor/scs/linsys/external/amd/amd_order.o +0 -0
- data/vendor/scs/linsys/external/amd/amd_post_tree.o +0 -0
- data/vendor/scs/linsys/external/amd/amd_postorder.o +0 -0
- data/vendor/scs/linsys/external/amd/amd_preprocess.o +0 -0
- data/vendor/scs/linsys/external/amd/amd_valid.o +0 -0
- data/vendor/scs/linsys/external/qdldl/qdldl.o +0 -0
- data/vendor/scs/linsys/scs_matrix.o +0 -0
- data/vendor/scs/src/aa.o +0 -0
- data/vendor/scs/src/cones.o +0 -0
- data/vendor/scs/src/ctrlc.o +0 -0
- data/vendor/scs/src/linalg.o +0 -0
- data/vendor/scs/src/normalize.o +0 -0
- data/vendor/scs/src/rw.o +0 -0
- data/vendor/scs/src/scs.o +0 -0
- data/vendor/scs/src/scs_indir.o +0 -0
- data/vendor/scs/src/scs_version.o +0 -0
- 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 *
|
7
|
+
const char *scs_version(void) {
|
4
8
|
return SCS_VERSION;
|
5
9
|
}
|
6
|
-
|
7
|
-
|
8
|
-
}
|
9
|
-
size_t SCS(sizeof_float)(void) {
|
10
|
-
return sizeof(scs_float);
|
10
|
+
|
11
|
+
#ifdef __cplusplus
|
11
12
|
}
|
13
|
+
#endif
|
data/vendor/scs/src/util.c
CHANGED
@@ -71,7 +71,32 @@ scs_float SCS(tocq)(SCS(timer) * t) {
|
|
71
71
|
|
72
72
|
#endif
|
73
73
|
|
74
|
-
void SCS(
|
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
|
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;
|
data/vendor/scs/test/minunit.h
CHANGED
@@ -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
|
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()) /
|
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,
|
55
|
-
SCS(proj_dual_cone)(y,
|
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,
|
92
|
-
|
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,
|
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,
|
104
|
-
|
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,
|
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,
|
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,
|
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,
|
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-
|
208
|
+
1e-10);
|
219
209
|
mu_assert_less("Dual residual ERROR", ABS(res_dual - info->res_dual),
|
220
|
-
1e-
|
221
|
-
mu_assert_less("Gap ERROR", ABS(gap - info->gap), 1e-
|
222
|
-
mu_assert_less("Primal obj ERROR", ABS(pobj - info->pobj),
|
223
|
-
|
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),
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
122
|
-
stgs->eps_abs = 1e-
|
123
|
-
stgs->eps_rel = 1e-
|
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 <=
|
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
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
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
|
}
|