scs 0.2.2 → 0.3.2

Sign up to get free protection for your applications and to get access to all the features.
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
  }