scs 0.3.2 → 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 +6 -0
- data/README.md +34 -5
- 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 +2 -2
- data/vendor/scs/README.md +3 -1
- data/vendor/scs/include/cones.h +5 -3
- data/vendor/scs/include/glbopts.h +4 -5
- data/vendor/scs/include/normalize.h +1 -0
- data/vendor/scs/include/rw.h +3 -3
- data/vendor/scs/include/scs.h +45 -22
- data/vendor/scs/include/scs_work.h +15 -18
- data/vendor/scs/include/util.h +3 -1
- 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/scs_matrix.c +38 -67
- data/vendor/scs/linsys/scs_matrix.h +4 -3
- data/vendor/scs/scs.mk +0 -4
- data/vendor/scs/src/aa.c +0 -4
- data/vendor/scs/src/cones.c +63 -25
- data/vendor/scs/src/normalize.c +49 -0
- data/vendor/scs/src/rw.c +48 -40
- data/vendor/scs/src/scs.c +212 -170
- data/vendor/scs/src/util.c +26 -12
- data/vendor/scs/test/problem_utils.h +3 -3
- data/vendor/scs/test/problems/degenerate.h +1 -0
- data/vendor/scs/test/problems/hs21_tiny_qp.h +1 -0
- data/vendor/scs/test/problems/hs21_tiny_qp_rw.h +5 -1
- data/vendor/scs/test/problems/infeasible_tiny_qp.h +1 -0
- data/vendor/scs/test/problems/qafiro_tiny_qp.h +2 -1
- data/vendor/scs/test/problems/random_prob.h +5 -1
- data/vendor/scs/test/problems/rob_gauss_cov_est.h +8 -1
- 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_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 +15 -3
- metadata +5 -4
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) {
|
@@ -205,10 +205,10 @@ const char *verify_solution_correct(ScsData *d, ScsCone *k, ScsSettings *stgs,
|
|
205
205
|
/**************** ASSERTS *****************/
|
206
206
|
if (status == SCS_SOLVED) {
|
207
207
|
mu_assert_less("Primal residual ERROR", ABS(res_pri - info->res_pri),
|
208
|
-
1e-
|
208
|
+
1e-10);
|
209
209
|
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-
|
210
|
+
1e-10);
|
211
|
+
mu_assert_less("Gap ERROR", ABS(gap - info->gap), 1e-7 * (1 + ABS(gap)));
|
212
212
|
mu_assert_less("Primal obj ERROR", ABS(pobj - info->pobj),
|
213
213
|
1e-9 * (1 + ABS(pobj)));
|
214
214
|
mu_assert_less("Dual obj ERROR", ABS(dobj - info->dobj),
|
@@ -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"
|
@@ -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"
|
@@ -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
|
|
@@ -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"
|
@@ -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
|
}
|
@@ -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
|
}
|
@@ -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
|
}
|
@@ -61,18 +61,30 @@ int main(int argc, char **argv) {
|
|
61
61
|
for (i = 2; i < argc; i += 2) {
|
62
62
|
if (argc < i + 2) {
|
63
63
|
scs_printf("Incorrect number of arguments supplied\n.");
|
64
|
-
|
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
|
}
|
73
81
|
sol = (ScsSolution *)scs_calloc(1, sizeof(ScsSolution));
|
74
82
|
scs(d, k, stgs, sol, &info);
|
75
|
-
|
83
|
+
|
84
|
+
SCS(free_data)(d);
|
85
|
+
SCS(free_cone)(k);
|
76
86
|
SCS(free_sol)(sol);
|
87
|
+
scs_free(stgs);
|
88
|
+
|
77
89
|
return 0;
|
78
90
|
}
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: scs
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrew Kane
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-07-07 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description:
|
14
14
|
email: andrew@ankane.org
|
@@ -23,6 +23,7 @@ files:
|
|
23
23
|
- ext/scs/extconf.rb
|
24
24
|
- lib/scs.rb
|
25
25
|
- lib/scs/ffi.rb
|
26
|
+
- lib/scs/matrix.rb
|
26
27
|
- lib/scs/solver.rb
|
27
28
|
- lib/scs/version.rb
|
28
29
|
- vendor/scs/CITATION.cff
|
@@ -120,14 +121,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
120
121
|
requirements:
|
121
122
|
- - ">="
|
122
123
|
- !ruby/object:Gem::Version
|
123
|
-
version: '2.
|
124
|
+
version: '2.7'
|
124
125
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
125
126
|
requirements:
|
126
127
|
- - ">="
|
127
128
|
- !ruby/object:Gem::Version
|
128
129
|
version: '0'
|
129
130
|
requirements: []
|
130
|
-
rubygems_version: 3.3.
|
131
|
+
rubygems_version: 3.3.7
|
131
132
|
signing_key:
|
132
133
|
specification_version: 4
|
133
134
|
summary: SCS - the splitting conic solver - for Ruby
|