scs 0.2.2 → 0.3.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +16 -0
- data/LICENSE.txt +18 -18
- data/README.md +19 -14
- data/lib/scs/ffi.rb +31 -20
- data/lib/scs/solver.rb +32 -9
- data/lib/scs/version.rb +1 -1
- data/vendor/scs/CITATION.cff +39 -0
- data/vendor/scs/CMakeLists.txt +320 -0
- data/vendor/scs/Makefile +32 -23
- data/vendor/scs/README.md +9 -218
- data/vendor/scs/include/aa.h +67 -23
- data/vendor/scs/include/cones.h +22 -19
- data/vendor/scs/include/glbopts.h +107 -79
- data/vendor/scs/include/linalg.h +3 -4
- data/vendor/scs/include/linsys.h +58 -44
- data/vendor/scs/include/normalize.h +6 -5
- data/vendor/scs/include/rw.h +8 -2
- data/vendor/scs/include/scs.h +257 -141
- data/vendor/scs/include/scs_types.h +34 -0
- data/vendor/scs/include/scs_work.h +83 -0
- data/vendor/scs/include/util.h +3 -15
- data/vendor/scs/linsys/cpu/direct/private.c +241 -232
- data/vendor/scs/linsys/cpu/direct/private.h +13 -7
- data/vendor/scs/linsys/cpu/indirect/private.c +194 -118
- data/vendor/scs/linsys/cpu/indirect/private.h +7 -4
- data/vendor/scs/linsys/csparse.c +87 -0
- data/vendor/scs/linsys/csparse.h +34 -0
- data/vendor/scs/linsys/external/amd/SuiteSparse_config.c +6 -6
- data/vendor/scs/linsys/external/amd/SuiteSparse_config.h +6 -1
- data/vendor/scs/linsys/external/amd/amd_internal.h +1 -1
- data/vendor/scs/linsys/external/amd/amd_order.c +5 -5
- data/vendor/scs/linsys/external/qdldl/changes +2 -0
- data/vendor/scs/linsys/external/qdldl/qdldl.c +29 -46
- data/vendor/scs/linsys/external/qdldl/qdldl.h +33 -41
- data/vendor/scs/linsys/external/qdldl/qdldl_types.h +11 -3
- data/vendor/scs/linsys/gpu/gpu.c +58 -21
- data/vendor/scs/linsys/gpu/gpu.h +70 -35
- data/vendor/scs/linsys/gpu/indirect/private.c +394 -157
- data/vendor/scs/linsys/gpu/indirect/private.h +27 -12
- data/vendor/scs/linsys/scs_matrix.c +478 -0
- data/vendor/scs/linsys/scs_matrix.h +70 -0
- data/vendor/scs/scs.mk +14 -10
- data/vendor/scs/src/aa.c +394 -110
- data/vendor/scs/src/cones.c +497 -359
- data/vendor/scs/src/ctrlc.c +15 -5
- data/vendor/scs/src/linalg.c +107 -26
- data/vendor/scs/src/normalize.c +30 -72
- data/vendor/scs/src/rw.c +202 -27
- data/vendor/scs/src/scs.c +769 -571
- data/vendor/scs/src/scs_version.c +11 -3
- data/vendor/scs/src/util.c +37 -106
- data/vendor/scs/test/minunit.h +22 -8
- data/vendor/scs/test/problem_utils.h +180 -25
- data/vendor/scs/test/problems/degenerate.h +130 -0
- data/vendor/scs/test/problems/hs21_tiny_qp.h +124 -0
- data/vendor/scs/test/problems/hs21_tiny_qp_rw.h +116 -0
- data/vendor/scs/test/problems/infeasible_tiny_qp.h +100 -0
- data/vendor/scs/test/problems/qafiro_tiny_qp.h +199 -0
- data/vendor/scs/test/problems/random_prob +0 -0
- data/vendor/scs/test/problems/random_prob.h +45 -0
- data/vendor/scs/test/problems/rob_gauss_cov_est.h +188 -31
- data/vendor/scs/test/problems/small_lp.h +14 -13
- data/vendor/scs/test/problems/small_qp.h +352 -0
- data/vendor/scs/test/problems/test_validation.h +43 -0
- data/vendor/scs/test/problems/unbounded_tiny_qp.h +82 -0
- data/vendor/scs/test/random_socp_prob.c +54 -53
- data/vendor/scs/test/rng.h +109 -0
- data/vendor/scs/test/run_from_file.c +20 -11
- data/vendor/scs/test/run_tests.c +35 -2
- metadata +29 -98
- data/vendor/scs/linsys/amatrix.c +0 -305
- data/vendor/scs/linsys/amatrix.h +0 -36
- data/vendor/scs/linsys/amatrix.o +0 -0
- data/vendor/scs/linsys/cpu/direct/private.o +0 -0
- data/vendor/scs/linsys/cpu/indirect/private.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/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_version.o +0 -0
- data/vendor/scs/src/util.o +0 -0
- data/vendor/scs/test/data/small_random_socp +0 -0
- data/vendor/scs/test/problems/small_random_socp.h +0 -33
- data/vendor/scs/test/run_tests +0 -2
data/vendor/scs/src/ctrlc.c
CHANGED
@@ -22,9 +22,13 @@ void scs_start_interrupt_listener(void) {
|
|
22
22
|
istate = (int)utSetInterruptEnabled(true);
|
23
23
|
}
|
24
24
|
|
25
|
-
void scs_end_interrupt_listener(void) {
|
25
|
+
void scs_end_interrupt_listener(void) {
|
26
|
+
utSetInterruptEnabled((bool)istate);
|
27
|
+
}
|
26
28
|
|
27
|
-
int scs_is_interrupted(void) {
|
29
|
+
int scs_is_interrupted(void) {
|
30
|
+
return (int)utIsInterruptPending();
|
31
|
+
}
|
28
32
|
|
29
33
|
#elif (defined _WIN32 || _WIN64 || defined _WINDLL)
|
30
34
|
#include <windows.h>
|
@@ -47,14 +51,18 @@ void scs_end_interrupt_listener(void) {
|
|
47
51
|
SetConsoleCtrlHandler(scs_handle_ctrlc, FALSE);
|
48
52
|
}
|
49
53
|
|
50
|
-
int scs_is_interrupted(void) {
|
54
|
+
int scs_is_interrupted(void) {
|
55
|
+
return int_detected;
|
56
|
+
}
|
51
57
|
|
52
58
|
#else /* Unix */
|
53
59
|
|
54
60
|
#include <signal.h>
|
55
61
|
static int int_detected;
|
56
62
|
struct sigaction oact;
|
57
|
-
static void scs_handle_ctrlc(int dummy) {
|
63
|
+
static void scs_handle_ctrlc(int dummy) {
|
64
|
+
int_detected = dummy ? dummy : -1;
|
65
|
+
}
|
58
66
|
|
59
67
|
void scs_start_interrupt_listener(void) {
|
60
68
|
struct sigaction act;
|
@@ -70,7 +78,9 @@ void scs_end_interrupt_listener(void) {
|
|
70
78
|
sigaction(SIGINT, &oact, &act);
|
71
79
|
}
|
72
80
|
|
73
|
-
int scs_is_interrupted(void) {
|
81
|
+
int scs_is_interrupted(void) {
|
82
|
+
return int_detected;
|
83
|
+
}
|
74
84
|
|
75
85
|
#endif /* END IF MATLAB_MEX_FILE / WIN32 */
|
76
86
|
|
data/vendor/scs/src/linalg.c
CHANGED
@@ -1,17 +1,40 @@
|
|
1
1
|
#include "linalg.h"
|
2
|
+
#include "scs_blas.h"
|
2
3
|
#include <math.h>
|
3
4
|
|
4
|
-
/*
|
5
|
-
|
6
|
-
|
5
|
+
/* these routines do not have BLAS implementations (that I can find at least) */
|
6
|
+
|
7
|
+
scs_float SCS(norm_diff)(const scs_float *a, const scs_float *b, scs_int len) {
|
8
|
+
scs_float nm_diff = 0.0, tmp;
|
7
9
|
scs_int i;
|
8
|
-
for (i = 0; i < len; ++i)
|
10
|
+
for (i = 0; i < len; ++i) {
|
11
|
+
tmp = (a[i] - b[i]);
|
12
|
+
nm_diff += tmp * tmp;
|
13
|
+
}
|
14
|
+
return SQRTF(nm_diff);
|
9
15
|
}
|
10
16
|
|
17
|
+
scs_float SCS(norm_inf_diff)(const scs_float *a, const scs_float *b,
|
18
|
+
scs_int len) {
|
19
|
+
scs_float tmp, max = 0.0;
|
20
|
+
scs_int i;
|
21
|
+
for (i = 0; i < len; ++i) {
|
22
|
+
tmp = ABS(a[i] - b[i]);
|
23
|
+
if (tmp > max) {
|
24
|
+
max = tmp;
|
25
|
+
}
|
26
|
+
}
|
27
|
+
return max;
|
28
|
+
}
|
29
|
+
|
30
|
+
#ifndef USE_LAPACK
|
31
|
+
/* Self-rolled basic linear algebra routines */
|
32
|
+
|
11
33
|
/* a *= b */
|
12
34
|
void SCS(scale_array)(scs_float *a, const scs_float b, scs_int len) {
|
13
35
|
scs_int i;
|
14
|
-
for (i = 0; i < len; ++i)
|
36
|
+
for (i = 0; i < len; ++i)
|
37
|
+
a[i] *= b;
|
15
38
|
}
|
16
39
|
|
17
40
|
/* x'*y */
|
@@ -35,14 +58,14 @@ scs_float SCS(norm_sq)(const scs_float *v, scs_int len) {
|
|
35
58
|
}
|
36
59
|
|
37
60
|
/* ||v||_2 */
|
38
|
-
scs_float SCS(
|
61
|
+
scs_float SCS(norm_2)(const scs_float *v, scs_int len) {
|
39
62
|
return SQRTF(SCS(norm_sq)(v, len));
|
40
63
|
}
|
41
64
|
|
42
|
-
scs_float SCS(norm_inf)(const scs_float *a, scs_int
|
65
|
+
scs_float SCS(norm_inf)(const scs_float *a, scs_int len) {
|
43
66
|
scs_float tmp, max = 0.0;
|
44
67
|
scs_int i;
|
45
|
-
for (i = 0; i <
|
68
|
+
for (i = 0; i < len; ++i) {
|
46
69
|
tmp = ABS(a[i]);
|
47
70
|
if (tmp > max) {
|
48
71
|
max = tmp;
|
@@ -51,7 +74,7 @@ scs_float SCS(norm_inf)(const scs_float *a, scs_int l) {
|
|
51
74
|
return max;
|
52
75
|
}
|
53
76
|
|
54
|
-
/*
|
77
|
+
/* axpy a += sc*b */
|
55
78
|
void SCS(add_scaled_array)(scs_float *a, const scs_float *b, scs_int n,
|
56
79
|
const scs_float sc) {
|
57
80
|
scs_int i;
|
@@ -60,25 +83,83 @@ void SCS(add_scaled_array)(scs_float *a, const scs_float *b, scs_int n,
|
|
60
83
|
}
|
61
84
|
}
|
62
85
|
|
63
|
-
scs_float SCS(
|
64
|
-
scs_float nm_diff = 0.0, tmp;
|
86
|
+
scs_float SCS(mean)(const scs_float *x, scs_int n) {
|
65
87
|
scs_int i;
|
66
|
-
|
67
|
-
|
68
|
-
|
88
|
+
scs_float mean = 0.;
|
89
|
+
for (i = 0; i < n; ++i) {
|
90
|
+
mean += x[i];
|
69
91
|
}
|
70
|
-
return
|
92
|
+
return mean / n;
|
71
93
|
}
|
72
94
|
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
95
|
+
#else
|
96
|
+
/* If we have BLAS / LAPACK we may as well use them */
|
97
|
+
|
98
|
+
#ifdef __cplusplus
|
99
|
+
extern "C" {
|
100
|
+
#endif
|
101
|
+
|
102
|
+
scs_float BLAS(nrm2)(blas_int *n, const scs_float *x, blas_int *incx);
|
103
|
+
scs_float BLAS(dot)(const blas_int *n, const scs_float *x, const blas_int *incx,
|
104
|
+
const scs_float *y, const blas_int *incy);
|
105
|
+
scs_float BLAS(lange)(const char *norm, const blas_int *m, const blas_int *n,
|
106
|
+
const scs_float *a, blas_int *lda, scs_float *work);
|
107
|
+
void BLAS(axpy)(blas_int *n, const scs_float *a, const scs_float *x,
|
108
|
+
blas_int *incx, scs_float *y, blas_int *incy);
|
109
|
+
void BLAS(scal)(const blas_int *n, const scs_float *sa, scs_float *sx,
|
110
|
+
const blas_int *incx);
|
111
|
+
|
112
|
+
#ifdef __cplusplus
|
113
|
+
}
|
114
|
+
#endif
|
115
|
+
|
116
|
+
/* a *= b */
|
117
|
+
void SCS(scale_array)(scs_float *a, const scs_float b, scs_int len) {
|
118
|
+
blas_int bone = 1;
|
119
|
+
blas_int blen = (blas_int)len;
|
120
|
+
BLAS(scal)(&blen, &b, a, &bone);
|
121
|
+
}
|
122
|
+
|
123
|
+
/* x'*y */
|
124
|
+
scs_float SCS(dot)(const scs_float *x, const scs_float *y, scs_int len) {
|
125
|
+
blas_int bone = 1;
|
126
|
+
blas_int blen = (blas_int)len;
|
127
|
+
return BLAS(dot)(&blen, x, &bone, y, &bone);
|
84
128
|
}
|
129
|
+
|
130
|
+
/* ||v||_2^2 */
|
131
|
+
scs_float SCS(norm_sq)(const scs_float *v, scs_int len) {
|
132
|
+
scs_float nrm = SCS(norm_2)(v, len);
|
133
|
+
return nrm * nrm;
|
134
|
+
}
|
135
|
+
|
136
|
+
/* ||v||_2 */
|
137
|
+
scs_float SCS(norm_2)(const scs_float *v, scs_int len) {
|
138
|
+
blas_int bone = 1;
|
139
|
+
blas_int blen = (blas_int)len;
|
140
|
+
return BLAS(nrm2)(&blen, v, &bone);
|
141
|
+
}
|
142
|
+
|
143
|
+
scs_float SCS(norm_inf)(const scs_float *a, scs_int len) {
|
144
|
+
blas_int bone = 1;
|
145
|
+
blas_int blen = (blas_int)len;
|
146
|
+
return BLAS(lange)("Max", &blen, &bone, a, &bone, SCS_NULL);
|
147
|
+
}
|
148
|
+
|
149
|
+
/* axpy a += sc*b */
|
150
|
+
void SCS(add_scaled_array)(scs_float *a, const scs_float *b, scs_int len,
|
151
|
+
const scs_float sc) {
|
152
|
+
blas_int bone = 1;
|
153
|
+
blas_int blen = (blas_int)len;
|
154
|
+
BLAS(axpy)(&blen, &sc, b, &bone, a, &bone);
|
155
|
+
}
|
156
|
+
|
157
|
+
scs_float SCS(mean)(const scs_float *x, scs_int n) {
|
158
|
+
blas_int bone = 1;
|
159
|
+
blas_int bzero = 0;
|
160
|
+
blas_int blen = (blas_int)n;
|
161
|
+
scs_float y = 1.0;
|
162
|
+
return BLAS(dot)(&blen, x, &bone, &y, &bzero) / n;
|
163
|
+
}
|
164
|
+
|
165
|
+
#endif
|
data/vendor/scs/src/normalize.c
CHANGED
@@ -1,93 +1,51 @@
|
|
1
1
|
#include "normalize.h"
|
2
|
+
|
2
3
|
#include "linalg.h"
|
3
4
|
#include "scs.h"
|
4
5
|
|
5
|
-
|
6
|
-
|
7
|
-
void SCS(normalize_b_c)(ScsWork *w) {
|
6
|
+
/* needed for normalizing the warm-start */
|
7
|
+
void SCS(normalize_sol)(ScsScaling *scal, ScsSolution *sol) {
|
8
8
|
scs_int i;
|
9
|
-
scs_float
|
10
|
-
|
11
|
-
for (i = 0; i <
|
12
|
-
|
9
|
+
scs_float *D = scal->D;
|
10
|
+
scs_float *E = scal->E;
|
11
|
+
for (i = 0; i < scal->n; ++i) {
|
12
|
+
sol->x[i] /= (E[i] / scal->dual_scale);
|
13
|
+
}
|
14
|
+
for (i = 0; i < scal->m; ++i) {
|
15
|
+
sol->y[i] /= (D[i] / scal->primal_scale);
|
13
16
|
}
|
14
|
-
|
15
|
-
|
16
|
-
/* scale c */
|
17
|
-
for (i = 0; i < w->n; ++i) {
|
18
|
-
c[i] /= E[i];
|
17
|
+
for (i = 0; i < scal->m; ++i) {
|
18
|
+
sol->s[i] *= (D[i] * scal->dual_scale);
|
19
19
|
}
|
20
|
-
nm = SCS(norm)(c, w->n);
|
21
|
-
w->sc_c = w->scal->mean_norm_row_a / MAX(nm, MIN_SCALE);
|
22
|
-
SCS(scale_array)(b, w->sc_b * w->stgs->scale, w->m);
|
23
|
-
SCS(scale_array)(c, w->sc_c * w->stgs->scale, w->n);
|
24
20
|
}
|
25
21
|
|
26
|
-
void SCS(
|
27
|
-
|
28
|
-
scs_float *
|
29
|
-
scs_float *
|
30
|
-
|
31
|
-
|
32
|
-
scs_float tmp;
|
33
|
-
scs_int i, n = w->n, m = w->m;
|
34
|
-
|
35
|
-
r->res_pri = 0;
|
36
|
-
for (i = 0; i < n; ++i) {
|
37
|
-
tmp = (u[i] - u_t[i]) / (E[i] * w->sc_b);
|
38
|
-
r->res_pri += tmp * tmp;
|
22
|
+
void SCS(un_normalize_sol)(ScsScaling *scal, ScsSolution *sol) {
|
23
|
+
scs_int i;
|
24
|
+
scs_float *D = scal->D;
|
25
|
+
scs_float *E = scal->E;
|
26
|
+
for (i = 0; i < scal->n; ++i) {
|
27
|
+
sol->x[i] *= (E[i] / scal->dual_scale);
|
39
28
|
}
|
40
|
-
for (i = 0; i < m; ++i) {
|
41
|
-
|
42
|
-
r->res_pri += tmp * tmp;
|
29
|
+
for (i = 0; i < scal->m; ++i) {
|
30
|
+
sol->y[i] *= (D[i] / scal->primal_scale);
|
43
31
|
}
|
44
|
-
|
45
|
-
|
46
|
-
r->res_pri = sqrt(r->res_pri);
|
47
|
-
|
48
|
-
r->res_dual = 0;
|
49
|
-
for (i = 0; i < n; ++i) {
|
50
|
-
tmp = (u[i] - u_prev[i]) * E[i] / w->sc_b;
|
51
|
-
r->res_dual += tmp * tmp;
|
32
|
+
for (i = 0; i < scal->m; ++i) {
|
33
|
+
sol->s[i] /= (D[i] * scal->dual_scale);
|
52
34
|
}
|
53
|
-
for (i = 0; i < m; ++i) {
|
54
|
-
tmp = (u[i + n] - u_prev[i + n]) * D[i] / w->sc_c;
|
55
|
-
r->res_dual += tmp * tmp;
|
56
|
-
}
|
57
|
-
tmp = u[n + m] - u_t[n + m];
|
58
|
-
r->res_dual += tmp * tmp;
|
59
|
-
r->res_dual = sqrt(r->res_dual);
|
60
35
|
}
|
61
36
|
|
62
|
-
void SCS(
|
37
|
+
void SCS(un_normalize_primal)(ScsScaling *scal, scs_float *r) {
|
63
38
|
scs_int i;
|
64
|
-
scs_float *D =
|
65
|
-
|
66
|
-
|
67
|
-
scs_float *y = &(w->u[w->n]);
|
68
|
-
scs_float *s = &(w->v[w->n]);
|
69
|
-
for (i = 0; i < w->n; ++i) {
|
70
|
-
x[i] *= (E[i] * w->sc_b);
|
71
|
-
}
|
72
|
-
for (i = 0; i < w->m; ++i) {
|
73
|
-
y[i] *= (D[i] * w->sc_c);
|
74
|
-
}
|
75
|
-
for (i = 0; i < w->m; ++i) {
|
76
|
-
s[i] /= (D[i] / (w->sc_b * w->stgs->scale));
|
39
|
+
scs_float *D = scal->D;
|
40
|
+
for (i = 0; i < scal->m; ++i) {
|
41
|
+
r[i] /= (D[i] * scal->dual_scale);
|
77
42
|
}
|
78
43
|
}
|
79
44
|
|
80
|
-
void SCS(
|
45
|
+
void SCS(un_normalize_dual)(ScsScaling *scal, scs_float *r) {
|
81
46
|
scs_int i;
|
82
|
-
scs_float *
|
83
|
-
|
84
|
-
|
85
|
-
sol->x[i] /= (E[i] * w->sc_b);
|
86
|
-
}
|
87
|
-
for (i = 0; i < w->m; ++i) {
|
88
|
-
sol->y[i] /= (D[i] * w->sc_c);
|
89
|
-
}
|
90
|
-
for (i = 0; i < w->m; ++i) {
|
91
|
-
sol->s[i] *= D[i] / (w->sc_b * w->stgs->scale);
|
47
|
+
scs_float *E = scal->E;
|
48
|
+
for (i = 0; i < scal->n; ++i) {
|
49
|
+
r[i] /= (E[i] * scal->primal_scale);
|
92
50
|
}
|
93
51
|
}
|