scs 0.2.2 → 0.3.2

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.
Files changed (103) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +16 -0
  3. data/LICENSE.txt +18 -18
  4. data/README.md +19 -14
  5. data/lib/scs/ffi.rb +31 -20
  6. data/lib/scs/solver.rb +32 -9
  7. data/lib/scs/version.rb +1 -1
  8. data/vendor/scs/CITATION.cff +39 -0
  9. data/vendor/scs/CMakeLists.txt +320 -0
  10. data/vendor/scs/Makefile +32 -23
  11. data/vendor/scs/README.md +9 -218
  12. data/vendor/scs/include/aa.h +67 -23
  13. data/vendor/scs/include/cones.h +22 -19
  14. data/vendor/scs/include/glbopts.h +107 -79
  15. data/vendor/scs/include/linalg.h +3 -4
  16. data/vendor/scs/include/linsys.h +58 -44
  17. data/vendor/scs/include/normalize.h +6 -5
  18. data/vendor/scs/include/rw.h +8 -2
  19. data/vendor/scs/include/scs.h +257 -141
  20. data/vendor/scs/include/scs_types.h +34 -0
  21. data/vendor/scs/include/scs_work.h +83 -0
  22. data/vendor/scs/include/util.h +3 -15
  23. data/vendor/scs/linsys/cpu/direct/private.c +241 -232
  24. data/vendor/scs/linsys/cpu/direct/private.h +13 -7
  25. data/vendor/scs/linsys/cpu/indirect/private.c +194 -118
  26. data/vendor/scs/linsys/cpu/indirect/private.h +7 -4
  27. data/vendor/scs/linsys/csparse.c +87 -0
  28. data/vendor/scs/linsys/csparse.h +34 -0
  29. data/vendor/scs/linsys/external/amd/SuiteSparse_config.c +6 -6
  30. data/vendor/scs/linsys/external/amd/SuiteSparse_config.h +6 -1
  31. data/vendor/scs/linsys/external/amd/amd_internal.h +1 -1
  32. data/vendor/scs/linsys/external/amd/amd_order.c +5 -5
  33. data/vendor/scs/linsys/external/qdldl/changes +2 -0
  34. data/vendor/scs/linsys/external/qdldl/qdldl.c +29 -46
  35. data/vendor/scs/linsys/external/qdldl/qdldl.h +33 -41
  36. data/vendor/scs/linsys/external/qdldl/qdldl_types.h +11 -3
  37. data/vendor/scs/linsys/gpu/gpu.c +58 -21
  38. data/vendor/scs/linsys/gpu/gpu.h +70 -35
  39. data/vendor/scs/linsys/gpu/indirect/private.c +394 -157
  40. data/vendor/scs/linsys/gpu/indirect/private.h +27 -12
  41. data/vendor/scs/linsys/scs_matrix.c +478 -0
  42. data/vendor/scs/linsys/scs_matrix.h +70 -0
  43. data/vendor/scs/scs.mk +14 -10
  44. data/vendor/scs/src/aa.c +394 -110
  45. data/vendor/scs/src/cones.c +497 -359
  46. data/vendor/scs/src/ctrlc.c +15 -5
  47. data/vendor/scs/src/linalg.c +107 -26
  48. data/vendor/scs/src/normalize.c +30 -72
  49. data/vendor/scs/src/rw.c +202 -27
  50. data/vendor/scs/src/scs.c +769 -571
  51. data/vendor/scs/src/scs_version.c +11 -3
  52. data/vendor/scs/src/util.c +37 -106
  53. data/vendor/scs/test/minunit.h +22 -8
  54. data/vendor/scs/test/problem_utils.h +180 -25
  55. data/vendor/scs/test/problems/degenerate.h +130 -0
  56. data/vendor/scs/test/problems/hs21_tiny_qp.h +124 -0
  57. data/vendor/scs/test/problems/hs21_tiny_qp_rw.h +116 -0
  58. data/vendor/scs/test/problems/infeasible_tiny_qp.h +100 -0
  59. data/vendor/scs/test/problems/qafiro_tiny_qp.h +199 -0
  60. data/vendor/scs/test/problems/random_prob +0 -0
  61. data/vendor/scs/test/problems/random_prob.h +45 -0
  62. data/vendor/scs/test/problems/rob_gauss_cov_est.h +188 -31
  63. data/vendor/scs/test/problems/small_lp.h +14 -13
  64. data/vendor/scs/test/problems/small_qp.h +352 -0
  65. data/vendor/scs/test/problems/test_validation.h +43 -0
  66. data/vendor/scs/test/problems/unbounded_tiny_qp.h +82 -0
  67. data/vendor/scs/test/random_socp_prob.c +54 -53
  68. data/vendor/scs/test/rng.h +109 -0
  69. data/vendor/scs/test/run_from_file.c +20 -11
  70. data/vendor/scs/test/run_tests.c +35 -2
  71. metadata +29 -98
  72. data/vendor/scs/linsys/amatrix.c +0 -305
  73. data/vendor/scs/linsys/amatrix.h +0 -36
  74. data/vendor/scs/linsys/amatrix.o +0 -0
  75. data/vendor/scs/linsys/cpu/direct/private.o +0 -0
  76. data/vendor/scs/linsys/cpu/indirect/private.o +0 -0
  77. data/vendor/scs/linsys/external/amd/SuiteSparse_config.o +0 -0
  78. data/vendor/scs/linsys/external/amd/amd_1.o +0 -0
  79. data/vendor/scs/linsys/external/amd/amd_2.o +0 -0
  80. data/vendor/scs/linsys/external/amd/amd_aat.o +0 -0
  81. data/vendor/scs/linsys/external/amd/amd_control.o +0 -0
  82. data/vendor/scs/linsys/external/amd/amd_defaults.o +0 -0
  83. data/vendor/scs/linsys/external/amd/amd_dump.o +0 -0
  84. data/vendor/scs/linsys/external/amd/amd_global.o +0 -0
  85. data/vendor/scs/linsys/external/amd/amd_info.o +0 -0
  86. data/vendor/scs/linsys/external/amd/amd_order.o +0 -0
  87. data/vendor/scs/linsys/external/amd/amd_post_tree.o +0 -0
  88. data/vendor/scs/linsys/external/amd/amd_postorder.o +0 -0
  89. data/vendor/scs/linsys/external/amd/amd_preprocess.o +0 -0
  90. data/vendor/scs/linsys/external/amd/amd_valid.o +0 -0
  91. data/vendor/scs/linsys/external/qdldl/qdldl.o +0 -0
  92. data/vendor/scs/src/aa.o +0 -0
  93. data/vendor/scs/src/cones.o +0 -0
  94. data/vendor/scs/src/ctrlc.o +0 -0
  95. data/vendor/scs/src/linalg.o +0 -0
  96. data/vendor/scs/src/normalize.o +0 -0
  97. data/vendor/scs/src/rw.o +0 -0
  98. data/vendor/scs/src/scs.o +0 -0
  99. data/vendor/scs/src/scs_version.o +0 -0
  100. data/vendor/scs/src/util.o +0 -0
  101. data/vendor/scs/test/data/small_random_socp +0 -0
  102. data/vendor/scs/test/problems/small_random_socp.h +0 -33
  103. data/vendor/scs/test/run_tests +0 -2
@@ -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) { utSetInterruptEnabled((bool)istate); }
25
+ void scs_end_interrupt_listener(void) {
26
+ utSetInterruptEnabled((bool)istate);
27
+ }
26
28
 
27
- int scs_is_interrupted(void) { return (int)utIsInterruptPending(); }
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) { return int_detected; }
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) { int_detected = dummy ? dummy : -1; }
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) { return int_detected; }
81
+ int scs_is_interrupted(void) {
82
+ return int_detected;
83
+ }
74
84
 
75
85
  #endif /* END IF MATLAB_MEX_FILE / WIN32 */
76
86
 
@@ -1,17 +1,40 @@
1
1
  #include "linalg.h"
2
+ #include "scs_blas.h"
2
3
  #include <math.h>
3
4
 
4
- /* x = b*a */
5
- void SCS(set_as_scaled_array)(scs_float *x, const scs_float *a,
6
- const scs_float b, scs_int len) {
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) x[i] = b * a[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) a[i] *= b;
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(norm)(const scs_float *v, scs_int len) {
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 l) {
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 < l; ++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
- /* saxpy a += sc*b */
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(norm_diff)(const scs_float *a, const scs_float *b, scs_int l) {
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
- for (i = 0; i < l; ++i) {
67
- tmp = (a[i] - b[i]);
68
- nm_diff += tmp * tmp;
88
+ scs_float mean = 0.;
89
+ for (i = 0; i < n; ++i) {
90
+ mean += x[i];
69
91
  }
70
- return SQRTF(nm_diff);
92
+ return mean / n;
71
93
  }
72
94
 
73
- scs_float SCS(norm_inf_diff)(const scs_float *a, const scs_float *b,
74
- scs_int l) {
75
- scs_float tmp, max = 0.0;
76
- scs_int i;
77
- for (i = 0; i < l; ++i) {
78
- tmp = ABS(a[i] - b[i]);
79
- if (tmp > max) {
80
- max = tmp;
81
- }
82
- }
83
- return max;
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
@@ -1,93 +1,51 @@
1
1
  #include "normalize.h"
2
+
2
3
  #include "linalg.h"
3
4
  #include "scs.h"
4
5
 
5
- #define MIN_SCALE (1e-6)
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 nm, *D = w->scal->D, *E = w->scal->E, *b = w->b, *c = w->c;
10
- /* scale b */
11
- for (i = 0; i < w->m; ++i) {
12
- b[i] /= D[i];
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
- nm = SCS(norm)(b, w->m);
15
- w->sc_b = w->scal->mean_norm_col_a / MAX(nm, MIN_SCALE);
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(calc_scaled_resids)(ScsWork *w, ScsResiduals *r) {
27
- scs_float *D = w->scal->D;
28
- scs_float *E = w->scal->E;
29
- scs_float *u = w->u;
30
- scs_float *u_t = w->u_t;
31
- scs_float *u_prev = w->u_prev;
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
- tmp = (u[i + n] - u_t[i + n]) / (D[i] * w->sc_c);
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
- tmp = u[n + m] - u_t[n + m];
45
- r->res_pri += tmp * tmp;
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(normalize_warm_start)(ScsWork *w) {
37
+ void SCS(un_normalize_primal)(ScsScaling *scal, scs_float *r) {
63
38
  scs_int i;
64
- scs_float *D = w->scal->D;
65
- scs_float *E = w->scal->E;
66
- scs_float *x = w->u;
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(un_normalize_sol)(ScsWork *w, ScsSolution *sol) {
45
+ void SCS(un_normalize_dual)(ScsScaling *scal, scs_float *r) {
81
46
  scs_int i;
82
- scs_float *D = w->scal->D;
83
- scs_float *E = w->scal->E;
84
- for (i = 0; i < w->n; ++i) {
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
  }