scs 0.3.2 → 0.4.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +10 -0
- data/LICENSE.txt +1 -1
- data/README.md +35 -6
- 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 +2 -2
- data/vendor/scs/CMakeLists.txt +285 -169
- data/vendor/scs/Makefile +43 -18
- data/vendor/scs/README.md +3 -1
- data/vendor/scs/include/cones.h +5 -3
- data/vendor/scs/include/glbopts.h +35 -17
- data/vendor/scs/include/linsys.h +8 -8
- data/vendor/scs/include/normalize.h +1 -0
- data/vendor/scs/include/rw.h +3 -3
- data/vendor/scs/include/scs.h +51 -24
- data/vendor/scs/include/scs_types.h +3 -1
- data/vendor/scs/include/scs_work.h +13 -15
- data/vendor/scs/include/util.h +4 -2
- data/vendor/scs/linsys/cpu/direct/private.c +32 -153
- data/vendor/scs/linsys/cpu/direct/private.h +6 -6
- data/vendor/scs/linsys/cpu/indirect/private.c +9 -22
- data/vendor/scs/linsys/cpu/indirect/private.h +4 -2
- data/vendor/scs/linsys/csparse.c +140 -12
- data/vendor/scs/linsys/csparse.h +10 -17
- data/vendor/scs/linsys/external/amd/LICENSE.txt +0 -897
- data/vendor/scs/linsys/external/amd/SuiteSparse_config.c +4 -2
- data/vendor/scs/linsys/external/amd/SuiteSparse_config.h +0 -5
- data/vendor/scs/linsys/gpu/gpu.c +4 -4
- data/vendor/scs/linsys/gpu/gpu.h +1 -1
- data/vendor/scs/linsys/gpu/indirect/private.c +15 -26
- data/vendor/scs/linsys/mkl/direct/private.c +182 -0
- data/vendor/scs/linsys/mkl/direct/private.h +38 -0
- data/vendor/scs/linsys/scs_matrix.c +49 -72
- data/vendor/scs/linsys/scs_matrix.h +4 -3
- data/vendor/scs/scs.mk +39 -30
- data/vendor/scs/src/aa.c +0 -4
- data/vendor/scs/src/cones.c +78 -184
- data/vendor/scs/src/exp_cone.c +399 -0
- data/vendor/scs/src/normalize.c +51 -0
- data/vendor/scs/src/rw.c +139 -76
- data/vendor/scs/src/scs.c +275 -202
- data/vendor/scs/src/util.c +36 -13
- data/vendor/scs/test/minunit.h +2 -1
- data/vendor/scs/test/problem_utils.h +5 -4
- data/vendor/scs/test/problems/degenerate.h +1 -0
- data/vendor/scs/test/problems/hs21_tiny_qp.h +2 -1
- data/vendor/scs/test/problems/hs21_tiny_qp_rw.h +13 -4
- data/vendor/scs/test/problems/infeasible_tiny_qp.h +1 -0
- data/vendor/scs/test/problems/max_ent +0 -0
- data/vendor/scs/test/problems/max_ent.h +8 -0
- data/vendor/scs/test/problems/qafiro_tiny_qp.h +2 -1
- data/vendor/scs/test/problems/random_prob.h +2 -39
- data/vendor/scs/test/problems/rob_gauss_cov_est.h +15 -3
- data/vendor/scs/test/problems/small_lp.h +4 -1
- data/vendor/scs/test/problems/small_qp.h +42 -7
- data/vendor/scs/test/problems/test_exp_cone.h +84 -0
- data/vendor/scs/test/problems/test_prob_from_data_file.h +57 -0
- data/vendor/scs/test/problems/test_validation.h +4 -1
- data/vendor/scs/test/problems/unbounded_tiny_qp.h +3 -3
- data/vendor/scs/test/random_socp_prob.c +3 -1
- data/vendor/scs/test/run_from_file.c +22 -4
- data/vendor/scs/test/run_tests.c +22 -9
- metadata +12 -4
data/vendor/scs/src/util.c
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
#include "scs_matrix.h"
|
6
6
|
|
7
7
|
/* return milli-seconds */
|
8
|
-
#if (defined
|
8
|
+
#if (defined NO_TIMER)
|
9
9
|
|
10
10
|
void SCS(tic)(SCS(timer) * t) {
|
11
11
|
}
|
@@ -71,7 +71,41 @@ 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
|
+
/* MATLAB does something weird with strdup, so use strcpy instead */
|
88
|
+
char *tmp;
|
89
|
+
if (src->write_data_filename) {
|
90
|
+
/* sizeof(char) = 1 */
|
91
|
+
tmp = (char *)scs_malloc(strlen(src->write_data_filename) + 1);
|
92
|
+
strcpy(tmp, src->write_data_filename);
|
93
|
+
dest->write_data_filename = tmp;
|
94
|
+
} else {
|
95
|
+
dest->write_data_filename = SCS_NULL;
|
96
|
+
}
|
97
|
+
/* MATLAB does something weird with strdup, so use strcpy instead */
|
98
|
+
if (src->log_csv_filename) {
|
99
|
+
/* sizeof(char) = 1 */
|
100
|
+
tmp = (char *)scs_malloc(strlen(src->log_csv_filename) + 1);
|
101
|
+
strcpy(tmp, src->log_csv_filename);
|
102
|
+
dest->log_csv_filename = tmp;
|
103
|
+
} else {
|
104
|
+
dest->log_csv_filename = SCS_NULL;
|
105
|
+
}
|
106
|
+
}
|
107
|
+
|
108
|
+
void SCS(free_data)(ScsData *d) {
|
75
109
|
if (d) {
|
76
110
|
scs_free(d->b);
|
77
111
|
scs_free(d->c);
|
@@ -83,17 +117,6 @@ void SCS(free_data)(ScsData *d, ScsCone *k, ScsSettings *stgs) {
|
|
83
117
|
}
|
84
118
|
scs_free(d);
|
85
119
|
}
|
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
120
|
}
|
98
121
|
|
99
122
|
void SCS(free_sol)(ScsSolution *sol) {
|
data/vendor/scs/test/minunit.h
CHANGED
@@ -8,11 +8,13 @@
|
|
8
8
|
return message; \
|
9
9
|
} \
|
10
10
|
} while (0)
|
11
|
+
|
11
12
|
#define mu_assert(message, test) \
|
12
13
|
do { \
|
13
14
|
if (!(test)) \
|
14
15
|
return message; \
|
15
16
|
} while (0)
|
17
|
+
|
16
18
|
#define mu_run_test(test) _mu_run_test(#test, test)
|
17
19
|
|
18
20
|
#define _mu_run_test(name, test) \
|
@@ -21,7 +23,6 @@
|
|
21
23
|
scs_printf("Running test: %s\n", name); \
|
22
24
|
const char *message = test(); \
|
23
25
|
tests_run++; \
|
24
|
-
scs_printf("*********************************************************\n"); \
|
25
26
|
if (message) \
|
26
27
|
return message; \
|
27
28
|
} while (0)
|
@@ -190,6 +190,7 @@ const char *verify_solution_correct(ScsData *d, ScsCone *k, ScsSettings *stgs,
|
|
190
190
|
|
191
191
|
/************** OPTIMALITY ****************/
|
192
192
|
|
193
|
+
/* TODO: the MAX expansion computes these norms many times */
|
193
194
|
grl = MAX(MAX(ABS(xt_p_x), ABS(ctx)), ABS(bty));
|
194
195
|
prl = MAX(MAX(NORM(b, m), NORM(s, m)), NORM(ax, m));
|
195
196
|
drl = MAX(MAX(NORM(c, n), NORM(px, n)), NORM(aty, n));
|
@@ -205,17 +206,17 @@ const char *verify_solution_correct(ScsData *d, ScsCone *k, ScsSettings *stgs,
|
|
205
206
|
/**************** ASSERTS *****************/
|
206
207
|
if (status == SCS_SOLVED) {
|
207
208
|
mu_assert_less("Primal residual ERROR", ABS(res_pri - info->res_pri),
|
208
|
-
1e-
|
209
|
+
1e-10);
|
209
210
|
mu_assert_less("Dual residual ERROR", ABS(res_dual - info->res_dual),
|
210
|
-
1e-
|
211
|
-
mu_assert_less("Gap ERROR", ABS(gap - info->gap), 1e-
|
211
|
+
1e-10);
|
212
|
+
mu_assert_less("Gap ERROR", ABS(gap - info->gap), 1e-7 * (1 + ABS(gap)));
|
212
213
|
mu_assert_less("Primal obj ERROR", ABS(pobj - info->pobj),
|
213
214
|
1e-9 * (1 + ABS(pobj)));
|
214
215
|
mu_assert_less("Dual obj ERROR", ABS(dobj - info->dobj),
|
215
216
|
1e-9 * (1 + ABS(dobj)));
|
216
217
|
/* slightly looser tol */
|
217
218
|
mu_assert_less("Complementary slackness ERROR", ABS(sty),
|
218
|
-
|
219
|
+
5e-8 * MAX(NORM(s, m), NORM(y, m)));
|
219
220
|
mu_assert_less("s cone dist ERROR", ABS(sdist), 1e-5);
|
220
221
|
mu_assert_less("y cone dist ERROR", ABS(ydist), 1e-5);
|
221
222
|
|
@@ -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"
|
@@ -67,7 +68,7 @@ static const char *hs21_tiny_qp(void) {
|
|
67
68
|
scs_set_default_settings(stgs);
|
68
69
|
stgs->eps_abs = 1e-6;
|
69
70
|
stgs->eps_rel = 1e-6;
|
70
|
-
stgs->eps_infeas =
|
71
|
+
stgs->eps_infeas = 0.; /* disable due to gpu test finding cert */
|
71
72
|
|
72
73
|
exitflag = scs(d, k, stgs, sol, &info);
|
73
74
|
|
@@ -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"
|
@@ -15,7 +16,7 @@ static const char *hs21_tiny_qp_rw(void) {
|
|
15
16
|
ScsInfo info = {0};
|
16
17
|
scs_int exitflag;
|
17
18
|
scs_float perr, derr;
|
18
|
-
scs_int success;
|
19
|
+
scs_int success, read_status;
|
19
20
|
const char *fail;
|
20
21
|
|
21
22
|
/* data */
|
@@ -69,7 +70,7 @@ static const char *hs21_tiny_qp_rw(void) {
|
|
69
70
|
scs_set_default_settings(stgs);
|
70
71
|
stgs->eps_abs = 1e-6;
|
71
72
|
stgs->eps_rel = 1e-6;
|
72
|
-
stgs->eps_infeas =
|
73
|
+
stgs->eps_infeas = 0.; /* disable due to gpu test finding cert */
|
73
74
|
|
74
75
|
stgs->write_data_filename = "hs21_tiny_qp";
|
75
76
|
stgs->max_iters = 1;
|
@@ -83,7 +84,12 @@ static const char *hs21_tiny_qp_rw(void) {
|
|
83
84
|
scs_free(stgs);
|
84
85
|
scs_free(d);
|
85
86
|
|
86
|
-
SCS(read_data)("hs21_tiny_qp", &d, &k, &stgs);
|
87
|
+
read_status = SCS(read_data)("hs21_tiny_qp", &d, &k, &stgs);
|
88
|
+
|
89
|
+
if (read_status < 0) {
|
90
|
+
return "Data read failure, exit.\n";
|
91
|
+
}
|
92
|
+
|
87
93
|
stgs->max_iters = 1000;
|
88
94
|
/* solve with read data */
|
89
95
|
exitflag = scs(d, k, stgs, sol, &info);
|
@@ -110,7 +116,10 @@ static const char *hs21_tiny_qp_rw(void) {
|
|
110
116
|
mu_assert("hs21_tiny_qp: SCS failed to produce outputflag SCS_SOLVED",
|
111
117
|
success);
|
112
118
|
|
119
|
+
SCS(free_data)(d);
|
120
|
+
SCS(free_cone)(k);
|
113
121
|
SCS(free_sol)(sol);
|
114
|
-
|
122
|
+
scs_free(stgs);
|
123
|
+
|
115
124
|
return fail;
|
116
125
|
}
|
Binary file
|
@@ -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"
|
@@ -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,45 +1,8 @@
|
|
1
1
|
#include "glbopts.h"
|
2
|
-
#include "
|
3
|
-
#include "problem_utils.h"
|
2
|
+
#include "problems/test_prob_from_data_file.h"
|
4
3
|
#include "scs.h"
|
5
|
-
#include "util.h"
|
6
4
|
|
7
5
|
static const char *random_prob(void) {
|
8
|
-
scs_int read_status;
|
9
|
-
ScsData *d;
|
10
|
-
ScsCone *k;
|
11
|
-
ScsSettings *stgs;
|
12
|
-
ScsSolution *sol;
|
13
|
-
ScsInfo info = {0};
|
14
|
-
scs_int exitflag;
|
15
|
-
scs_float perr, derr;
|
16
|
-
scs_int success;
|
17
|
-
const char *fail;
|
18
|
-
|
19
6
|
scs_float OPT = 5.751458006385587;
|
20
|
-
|
21
|
-
read_status = SCS(read_data)("test/problems/random_prob", &d, &k, &stgs);
|
22
|
-
|
23
|
-
if (read_status < 0) {
|
24
|
-
return "Data read failure, exit.\n";
|
25
|
-
}
|
26
|
-
|
27
|
-
stgs->eps_abs = 1e-6;
|
28
|
-
stgs->eps_rel = 1e-6;
|
29
|
-
|
30
|
-
sol = (ScsSolution *)scs_calloc(1, sizeof(ScsSolution));
|
31
|
-
exitflag = scs(d, k, stgs, sol, &info);
|
32
|
-
|
33
|
-
perr = SCS(dot)(d->c, sol->x, d->n) - OPT;
|
34
|
-
derr = -SCS(dot)(d->b, sol->y, d->m) - OPT;
|
35
|
-
scs_printf("primal obj error %4e\n", perr);
|
36
|
-
scs_printf("dual obj error %4e\n", derr);
|
37
|
-
|
38
|
-
success = ABS(perr) < 1e-4 && ABS(derr) < 1e-4 && exitflag == SCS_SOLVED;
|
39
|
-
|
40
|
-
mu_assert("random_prob: SCS failed to produce SCS_SOLVED", success);
|
41
|
-
fail = verify_solution_correct(d, k, stgs, &info, sol, exitflag);
|
42
|
-
SCS(free_data)(d, k, stgs);
|
43
|
-
SCS(free_sol)(sol);
|
44
|
-
return fail;
|
7
|
+
return _test_prob_from_data("test/problems/random_prob", OPT);
|
45
8
|
}
|
@@ -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"
|
@@ -13,7 +15,7 @@ static const char *rob_gauss_cov_est(void) {
|
|
13
15
|
ScsInfo info = {0};
|
14
16
|
scs_int exitflag;
|
15
17
|
scs_float perr, derr;
|
16
|
-
scs_int success;
|
18
|
+
scs_int success, read_status;
|
17
19
|
const char *fail;
|
18
20
|
|
19
21
|
/* data */
|
@@ -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;
|
@@ -196,7 +200,12 @@ static const char *rob_gauss_cov_est(void) {
|
|
196
200
|
scs_free(stgs);
|
197
201
|
scs_free(d);
|
198
202
|
|
199
|
-
SCS(read_data)("rob_gauss_cov_est", &d, &k, &stgs);
|
203
|
+
read_status = SCS(read_data)("rob_gauss_cov_est", &d, &k, &stgs);
|
204
|
+
|
205
|
+
if (read_status < 0) {
|
206
|
+
return "Data read failure, exit.\n";
|
207
|
+
}
|
208
|
+
|
200
209
|
stgs->max_iters = 1000;
|
201
210
|
/* solve with read data */
|
202
211
|
exitflag = scs(d, k, stgs, sol, &info);
|
@@ -236,7 +245,10 @@ static const char *rob_gauss_cov_est(void) {
|
|
236
245
|
mu_assert("rob_gauss_cov_est_rw: SCS failed to produce outputflag SCS_SOLVED",
|
237
246
|
success);
|
238
247
|
|
248
|
+
SCS(free_data)(d);
|
249
|
+
SCS(free_cone)(k);
|
239
250
|
SCS(free_sol)(sol);
|
240
|
-
|
251
|
+
scs_free(stgs);
|
252
|
+
|
241
253
|
return fail;
|
242
254
|
}
|
@@ -44,8 +44,11 @@ static const char *small_lp(void) {
|
|
44
44
|
|
45
45
|
mu_assert("small_lp: SCS failed to produce outputflag SCS_SOLVED", success);
|
46
46
|
fail = verify_solution_correct(d, k, stgs, &info, sol, exitflag);
|
47
|
-
SCS(free_data)(d
|
47
|
+
SCS(free_data)(d);
|
48
|
+
SCS(free_cone)(k);
|
48
49
|
SCS(free_sol)(sol);
|
49
50
|
SCS(free_sol)(opt_sol);
|
51
|
+
scs_free(stgs);
|
52
|
+
|
50
53
|
return fail;
|
51
54
|
}
|
@@ -251,7 +251,7 @@ scs_float u[] = {
|
|
251
251
|
96.00000, 96.00000, 96.00000, 96.00000, 96.00000, 96.00000,
|
252
252
|
96.00000, 96.00000, 96.00000, 96.00000, 96.00000, 96.00000,
|
253
253
|
96.00000, 96.00000, 96.00000, 96.00000};
|
254
|
-
scs_float
|
254
|
+
scs_float c[] = {0.00000, 0.00000, -35.02643, 0.00000, 0.00000,
|
255
255
|
-3.56718, 0.00000, -17.41907, 0.00000, 0.00000,
|
256
256
|
-17.64691, 0.00000, 0.00000, 0.00000, 0.00000,
|
257
257
|
0.00000, 0.00000, 0.00000, 0.00000, 0.00000,
|
@@ -298,7 +298,7 @@ static const char *small_qp(void) {
|
|
298
298
|
d->n = n;
|
299
299
|
d->b = (scs_float *)scs_calloc(m + 1, sizeof(scs_float));
|
300
300
|
d->b[0] = 1; /* t var in box cone */
|
301
|
-
d->c =
|
301
|
+
d->c = c;
|
302
302
|
|
303
303
|
d->A = (ScsMatrix *)scs_calloc(1, sizeof(ScsMatrix));
|
304
304
|
d->A->m = m + 1; /* t var in box cone */
|
@@ -332,11 +332,48 @@ static const char *small_qp(void) {
|
|
332
332
|
stgs->eps_rel = 1e-6;
|
333
333
|
stgs->eps_infeas = 1e-10;
|
334
334
|
|
335
|
-
|
335
|
+
ScsWork *w = scs_init(d, k, stgs);
|
336
|
+
exitflag = scs_solve(w, sol, &info, 0);
|
336
337
|
success = exitflag == SCS_SOLVED;
|
337
338
|
|
338
339
|
mu_assert("small_qp: SCS failed to produce outputflag SCS_SOLVED", success);
|
339
340
|
fail = verify_solution_correct(d, k, stgs, &info, sol, exitflag);
|
341
|
+
if (fail)
|
342
|
+
return fail;
|
343
|
+
|
344
|
+
/* test updating c */
|
345
|
+
d->c[0] = 1.0; /* set to new value */
|
346
|
+
scs_update(w, SCS_NULL, d->c);
|
347
|
+
exitflag = scs_solve(w, sol, &info, 1);
|
348
|
+
success = exitflag == SCS_SOLVED;
|
349
|
+
|
350
|
+
mu_assert("small_qp: SCS failed to produce outputflag SCS_SOLVED", success);
|
351
|
+
fail = verify_solution_correct(d, k, stgs, &info, sol, exitflag);
|
352
|
+
if (fail)
|
353
|
+
return fail;
|
354
|
+
|
355
|
+
/* test updating b */
|
356
|
+
d->b[0] = 4.0; /* set to new value */
|
357
|
+
scs_update(w, d->b, SCS_NULL);
|
358
|
+
exitflag = scs_solve(w, sol, &info, 1);
|
359
|
+
success = exitflag == SCS_SOLVED;
|
360
|
+
|
361
|
+
mu_assert("small_qp: SCS failed to produce outputflag SCS_SOLVED", success);
|
362
|
+
fail = verify_solution_correct(d, k, stgs, &info, sol, exitflag);
|
363
|
+
if (fail)
|
364
|
+
return fail;
|
365
|
+
|
366
|
+
/* revert back to original data */
|
367
|
+
d->c[0] = 0.0; /* revert to original value */
|
368
|
+
d->b[0] = 1.0; /* revert to original value */
|
369
|
+
scs_update(w, d->b, d->c);
|
370
|
+
exitflag = scs_solve(w, sol, &info, 1);
|
371
|
+
success = exitflag == SCS_SOLVED;
|
372
|
+
|
373
|
+
mu_assert("small_qp: SCS failed to produce outputflag SCS_SOLVED", success);
|
374
|
+
fail = verify_solution_correct(d, k, stgs, &info, sol, exitflag);
|
375
|
+
|
376
|
+
scs_finish(w);
|
340
377
|
|
341
378
|
scs_free(d->A);
|
342
379
|
scs_free(d->P);
|
@@ -344,9 +381,7 @@ static const char *small_qp(void) {
|
|
344
381
|
scs_free(k);
|
345
382
|
scs_free(d);
|
346
383
|
scs_free(stgs);
|
347
|
-
|
348
|
-
|
349
|
-
scs_free(sol->s);
|
350
|
-
scs_free(sol);
|
384
|
+
SCS(free_sol)(sol);
|
385
|
+
|
351
386
|
return fail;
|
352
387
|
}
|
@@ -0,0 +1,84 @@
|
|
1
|
+
#include "glbopts.h"
|
2
|
+
#include "linalg.h"
|
3
|
+
#include "minunit.h"
|
4
|
+
#include "scs.h"
|
5
|
+
|
6
|
+
/* Forward declare exponential cone projection routine.
|
7
|
+
* Implemented in exp_cone.c.
|
8
|
+
*/
|
9
|
+
scs_float SCS(proj_pd_exp_cone)(scs_float *v0, scs_int primal);
|
10
|
+
|
11
|
+
static scs_int _run_exp_cone_test(scs_float *v0, scs_float *vp_true,
|
12
|
+
scs_float *vd_true) {
|
13
|
+
scs_int success = 1;
|
14
|
+
scs_float vp[3], vd[3];
|
15
|
+
const scs_float TOL = 1e-6;
|
16
|
+
|
17
|
+
memcpy(vp, v0, 3 * sizeof(scs_float));
|
18
|
+
memcpy(vd, v0, 3 * sizeof(scs_float));
|
19
|
+
|
20
|
+
/* inefficient, but just for testing */
|
21
|
+
SCS(proj_pd_exp_cone)(vp, 1);
|
22
|
+
SCS(proj_pd_exp_cone)(vd, 0);
|
23
|
+
|
24
|
+
scs_printf("*******************************\n");
|
25
|
+
scs_printf("v0: (%f, %f, %f)\n", v0[0], v0[1], v0[2]);
|
26
|
+
scs_printf("vp: (%f, %f, %f)\n", vp[0], vp[1], vp[2]);
|
27
|
+
scs_printf("vp_true: (%f, %f, %f)\n", vp_true[0], vp_true[1], vp_true[2]);
|
28
|
+
scs_printf("vd: (%f, %f, %f)\n", vd[0], vd[1], vd[2]);
|
29
|
+
scs_printf("vd_true: (%f, %f, %f)\n", vd_true[0], vd_true[1], vd_true[2]);
|
30
|
+
|
31
|
+
success &= (SCS(norm_diff)(vp, vp_true, 3) <= TOL);
|
32
|
+
success &= (SCS(norm_diff)(vd, vd_true, 3) <= TOL);
|
33
|
+
/* Moreau decomposition holds only for polar */
|
34
|
+
/*
|
35
|
+
success &= (SCS(dot)(vp, vd, 3) <= TOL);
|
36
|
+
success &= (ABS(v0[0] - vp[0] + vd[0]) <= TOL);
|
37
|
+
success &= (ABS(v0[1] - vp[1] + vd[1]) <= TOL);
|
38
|
+
success &= (ABS(v0[2] - vp[2] + vd[2]) <= TOL);
|
39
|
+
*/
|
40
|
+
|
41
|
+
if (!success) {
|
42
|
+
scs_printf("Failed.\n");
|
43
|
+
}
|
44
|
+
|
45
|
+
return success;
|
46
|
+
}
|
47
|
+
|
48
|
+
static const char *test_exp_cone(void) {
|
49
|
+
scs_int success = 1;
|
50
|
+
scs_int i;
|
51
|
+
/* test points */
|
52
|
+
scs_float v0[6][3] = {
|
53
|
+
{1, 2, 3},
|
54
|
+
{0.14814832, 1.04294573, 0.67905585},
|
55
|
+
{-0.78301134, 1.82790084, -1.05417044},
|
56
|
+
{1.3282585, -0.43277314, 1.7468072},
|
57
|
+
{0.67905585, 0.14814832, 1.04294573},
|
58
|
+
{0.50210027, 0.12314491, -1.77568921},
|
59
|
+
};
|
60
|
+
/* primal projections */
|
61
|
+
scs_float vp[6][3] = {
|
62
|
+
{0.8899428, 1.94041881, 3.06957226},
|
63
|
+
{-0.02001571, 0.8709169, 0.85112944},
|
64
|
+
{-1.17415616, 0.9567094, 0.280399},
|
65
|
+
{0.53160512, 0.2804836, 1.86652094},
|
66
|
+
{0.38322814, 0.27086569, 1.11482228},
|
67
|
+
{0., 0., 0.},
|
68
|
+
};
|
69
|
+
/* dual projections */
|
70
|
+
scs_float vd[6][3] = {
|
71
|
+
{-0., 2., 3.},
|
72
|
+
{-0., 1.04294573, 0.67905585},
|
73
|
+
{-0.68541419, 1.85424082, 0.01685653},
|
74
|
+
{-0.02277033, -0.12164823, 1.75085347},
|
75
|
+
{-0., 0.14814832, 1.04294573},
|
76
|
+
{-0., 0.12314491, -0.},
|
77
|
+
};
|
78
|
+
|
79
|
+
for (i = 0; i < 6; ++i) {
|
80
|
+
success &= _run_exp_cone_test(v0[i], vp[i], vd[i]);
|
81
|
+
}
|
82
|
+
mu_assert("test_exp_cone: Failure", success);
|
83
|
+
return 0;
|
84
|
+
}
|
@@ -0,0 +1,57 @@
|
|
1
|
+
#ifndef _SCS_FILE_TEST_CHASSIS
|
2
|
+
#define _SCS_FILE_TEST_CHASSIS
|
3
|
+
|
4
|
+
#include "glbopts.h"
|
5
|
+
#include "minunit.h"
|
6
|
+
#include "problem_utils.h"
|
7
|
+
#include "rw.h"
|
8
|
+
#include "scs.h"
|
9
|
+
#include "util.h"
|
10
|
+
|
11
|
+
static const char *_test_prob_from_data(const char *file, scs_float OPT) {
|
12
|
+
scs_int read_status;
|
13
|
+
ScsData *d;
|
14
|
+
ScsCone *k;
|
15
|
+
ScsSettings *stgs;
|
16
|
+
ScsSolution *sol;
|
17
|
+
ScsInfo info = {0};
|
18
|
+
scs_int exitflag;
|
19
|
+
scs_float perr, derr;
|
20
|
+
scs_int success;
|
21
|
+
const char *fail;
|
22
|
+
|
23
|
+
read_status = SCS(read_data)(file, &d, &k, &stgs);
|
24
|
+
|
25
|
+
if (read_status < 0) {
|
26
|
+
return "Data read failure, exit.\n";
|
27
|
+
}
|
28
|
+
|
29
|
+
stgs->eps_abs = 1e-6;
|
30
|
+
stgs->eps_rel = 1e-6;
|
31
|
+
|
32
|
+
sol = (ScsSolution *)scs_calloc(1, sizeof(ScsSolution));
|
33
|
+
exitflag = scs(d, k, stgs, sol, &info);
|
34
|
+
|
35
|
+
perr = SCS(dot)(d->c, sol->x, d->n) - OPT;
|
36
|
+
derr = -SCS(dot)(d->b, sol->y, d->m) - OPT;
|
37
|
+
scs_printf("primal obj error %4e\n", perr);
|
38
|
+
scs_printf("dual obj error %4e\n", derr);
|
39
|
+
|
40
|
+
success = ABS(perr) < 1e-4 && ABS(derr) < 1e-4 && exitflag == SCS_SOLVED;
|
41
|
+
if (!success) {
|
42
|
+
scs_printf("%s: FAILED\n", file);
|
43
|
+
}
|
44
|
+
mu_assert(file, success);
|
45
|
+
fail = verify_solution_correct(d, k, stgs, &info, sol, exitflag);
|
46
|
+
SCS(free_data)(d);
|
47
|
+
SCS(free_cone)(k);
|
48
|
+
SCS(free_sol)(sol);
|
49
|
+
scs_free(stgs);
|
50
|
+
|
51
|
+
if (fail) {
|
52
|
+
scs_printf("%s: FAILED\n", file);
|
53
|
+
}
|
54
|
+
return fail;
|
55
|
+
}
|
56
|
+
|
57
|
+
#endif
|
@@ -36,8 +36,11 @@ static const char *test_validation(void) {
|
|
36
36
|
|
37
37
|
mu_assert("test_fails: SCS failed to produce outputflag SCS_FAILED",
|
38
38
|
exitflag == SCS_FAILED);
|
39
|
-
SCS(free_data)(d
|
39
|
+
SCS(free_data)(d);
|
40
|
+
SCS(free_cone)(k);
|
40
41
|
SCS(free_sol)(sol);
|
41
42
|
SCS(free_sol)(opt_sol);
|
43
|
+
scs_free(stgs);
|
44
|
+
|
42
45
|
return 0;
|
43
46
|
}
|
@@ -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"
|
@@ -73,10 +74,9 @@ static const char *unbounded_tiny_qp(void) {
|
|
73
74
|
fail = verify_solution_correct(d, k, stgs, &info, sol, exitflag);
|
74
75
|
|
75
76
|
SCS(free_sol)(sol);
|
76
|
-
|
77
|
-
scs_free(d->P);
|
78
|
-
scs_free(k);
|
77
|
+
SCS(free_cone)(k);
|
79
78
|
scs_free(stgs);
|
79
|
+
scs_free(d->A);
|
80
80
|
scs_free(d);
|
81
81
|
return fail;
|
82
82
|
}
|
@@ -164,9 +164,11 @@ int main(int argc, char **argv) {
|
|
164
164
|
scs_printf("scs dua obj = %4f\n", -SCS(dot)(d->b, sol->y, d->m));
|
165
165
|
}
|
166
166
|
|
167
|
-
SCS(free_data)(d
|
167
|
+
SCS(free_data)(d);
|
168
|
+
SCS(free_cone)(k);
|
168
169
|
SCS(free_sol)(sol);
|
169
170
|
SCS(free_sol)(opt_sol);
|
171
|
+
scs_free(stgs);
|
170
172
|
|
171
173
|
return 0;
|
172
174
|
}
|
@@ -60,19 +60,37 @@ int main(int argc, char **argv) {
|
|
60
60
|
}
|
61
61
|
for (i = 2; i < argc; i += 2) {
|
62
62
|
if (argc < i + 2) {
|
63
|
-
scs_printf("Incorrect number of arguments supplied
|
64
|
-
|
63
|
+
scs_printf("Incorrect number of arguments supplied.\n");
|
64
|
+
|
65
|
+
SCS(free_data)(d);
|
66
|
+
SCS(free_cone)(k);
|
67
|
+
scs_free(stgs);
|
68
|
+
|
65
69
|
return -1;
|
66
70
|
}
|
67
71
|
if (override_setting(stgs, argv[i], argv[i + 1]) < 0) {
|
68
72
|
scs_printf("Unrecognized setting %s\n", argv[i]);
|
69
|
-
|
73
|
+
|
74
|
+
SCS(free_data)(d);
|
75
|
+
SCS(free_cone)(k);
|
76
|
+
scs_free(stgs);
|
77
|
+
|
70
78
|
return -1;
|
71
79
|
}
|
72
80
|
}
|
81
|
+
if (!stgs->verbose) {
|
82
|
+
scs_printf(
|
83
|
+
"File data set `verbose` to 0, SCS will not output information. Add "
|
84
|
+
"`verbose 1` to call to override.\n");
|
85
|
+
}
|
86
|
+
scs_printf("Solving problem.\n");
|
73
87
|
sol = (ScsSolution *)scs_calloc(1, sizeof(ScsSolution));
|
74
88
|
scs(d, k, stgs, sol, &info);
|
75
|
-
|
89
|
+
|
90
|
+
SCS(free_data)(d);
|
91
|
+
SCS(free_cone)(k);
|
76
92
|
SCS(free_sol)(sol);
|
93
|
+
scs_free(stgs);
|
94
|
+
|
77
95
|
return 0;
|
78
96
|
}
|