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.
- 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
|
}
|