scs 0.2.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.
Files changed (106) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +3 -0
  3. data/LICENSE.txt +22 -0
  4. data/README.md +84 -0
  5. data/ext/scs/Rakefile +11 -0
  6. data/lib/scs/ffi.rb +117 -0
  7. data/lib/scs/solver.rb +178 -0
  8. data/lib/scs/version.rb +3 -0
  9. data/lib/scs.rb +17 -0
  10. data/vendor/scs/LICENSE.txt +21 -0
  11. data/vendor/scs/Makefile +164 -0
  12. data/vendor/scs/README.md +220 -0
  13. data/vendor/scs/include/aa.h +56 -0
  14. data/vendor/scs/include/cones.h +46 -0
  15. data/vendor/scs/include/ctrlc.h +33 -0
  16. data/vendor/scs/include/glbopts.h +177 -0
  17. data/vendor/scs/include/linalg.h +26 -0
  18. data/vendor/scs/include/linsys.h +64 -0
  19. data/vendor/scs/include/normalize.h +18 -0
  20. data/vendor/scs/include/rw.h +17 -0
  21. data/vendor/scs/include/scs.h +161 -0
  22. data/vendor/scs/include/scs_blas.h +51 -0
  23. data/vendor/scs/include/util.h +65 -0
  24. data/vendor/scs/linsys/amatrix.c +305 -0
  25. data/vendor/scs/linsys/amatrix.h +36 -0
  26. data/vendor/scs/linsys/amatrix.o +0 -0
  27. data/vendor/scs/linsys/cpu/direct/private.c +366 -0
  28. data/vendor/scs/linsys/cpu/direct/private.h +26 -0
  29. data/vendor/scs/linsys/cpu/direct/private.o +0 -0
  30. data/vendor/scs/linsys/cpu/indirect/private.c +256 -0
  31. data/vendor/scs/linsys/cpu/indirect/private.h +31 -0
  32. data/vendor/scs/linsys/cpu/indirect/private.o +0 -0
  33. data/vendor/scs/linsys/external/amd/LICENSE.txt +934 -0
  34. data/vendor/scs/linsys/external/amd/SuiteSparse_config.c +469 -0
  35. data/vendor/scs/linsys/external/amd/SuiteSparse_config.h +254 -0
  36. data/vendor/scs/linsys/external/amd/SuiteSparse_config.o +0 -0
  37. data/vendor/scs/linsys/external/amd/amd.h +400 -0
  38. data/vendor/scs/linsys/external/amd/amd_1.c +180 -0
  39. data/vendor/scs/linsys/external/amd/amd_1.o +0 -0
  40. data/vendor/scs/linsys/external/amd/amd_2.c +1842 -0
  41. data/vendor/scs/linsys/external/amd/amd_2.o +0 -0
  42. data/vendor/scs/linsys/external/amd/amd_aat.c +184 -0
  43. data/vendor/scs/linsys/external/amd/amd_aat.o +0 -0
  44. data/vendor/scs/linsys/external/amd/amd_control.c +64 -0
  45. data/vendor/scs/linsys/external/amd/amd_control.o +0 -0
  46. data/vendor/scs/linsys/external/amd/amd_defaults.c +37 -0
  47. data/vendor/scs/linsys/external/amd/amd_defaults.o +0 -0
  48. data/vendor/scs/linsys/external/amd/amd_dump.c +179 -0
  49. data/vendor/scs/linsys/external/amd/amd_dump.o +0 -0
  50. data/vendor/scs/linsys/external/amd/amd_global.c +16 -0
  51. data/vendor/scs/linsys/external/amd/amd_global.o +0 -0
  52. data/vendor/scs/linsys/external/amd/amd_info.c +119 -0
  53. data/vendor/scs/linsys/external/amd/amd_info.o +0 -0
  54. data/vendor/scs/linsys/external/amd/amd_internal.h +304 -0
  55. data/vendor/scs/linsys/external/amd/amd_order.c +199 -0
  56. data/vendor/scs/linsys/external/amd/amd_order.o +0 -0
  57. data/vendor/scs/linsys/external/amd/amd_post_tree.c +120 -0
  58. data/vendor/scs/linsys/external/amd/amd_post_tree.o +0 -0
  59. data/vendor/scs/linsys/external/amd/amd_postorder.c +206 -0
  60. data/vendor/scs/linsys/external/amd/amd_postorder.o +0 -0
  61. data/vendor/scs/linsys/external/amd/amd_preprocess.c +118 -0
  62. data/vendor/scs/linsys/external/amd/amd_preprocess.o +0 -0
  63. data/vendor/scs/linsys/external/amd/amd_valid.c +92 -0
  64. data/vendor/scs/linsys/external/amd/amd_valid.o +0 -0
  65. data/vendor/scs/linsys/external/amd/changes +11 -0
  66. data/vendor/scs/linsys/external/qdldl/LICENSE +201 -0
  67. data/vendor/scs/linsys/external/qdldl/README.md +120 -0
  68. data/vendor/scs/linsys/external/qdldl/changes +4 -0
  69. data/vendor/scs/linsys/external/qdldl/qdldl.c +298 -0
  70. data/vendor/scs/linsys/external/qdldl/qdldl.h +177 -0
  71. data/vendor/scs/linsys/external/qdldl/qdldl.o +0 -0
  72. data/vendor/scs/linsys/external/qdldl/qdldl_types.h +21 -0
  73. data/vendor/scs/linsys/gpu/gpu.c +41 -0
  74. data/vendor/scs/linsys/gpu/gpu.h +85 -0
  75. data/vendor/scs/linsys/gpu/indirect/private.c +304 -0
  76. data/vendor/scs/linsys/gpu/indirect/private.h +36 -0
  77. data/vendor/scs/scs.mk +181 -0
  78. data/vendor/scs/src/aa.c +224 -0
  79. data/vendor/scs/src/aa.o +0 -0
  80. data/vendor/scs/src/cones.c +802 -0
  81. data/vendor/scs/src/cones.o +0 -0
  82. data/vendor/scs/src/ctrlc.c +77 -0
  83. data/vendor/scs/src/ctrlc.o +0 -0
  84. data/vendor/scs/src/linalg.c +84 -0
  85. data/vendor/scs/src/linalg.o +0 -0
  86. data/vendor/scs/src/normalize.c +93 -0
  87. data/vendor/scs/src/normalize.o +0 -0
  88. data/vendor/scs/src/rw.c +167 -0
  89. data/vendor/scs/src/rw.o +0 -0
  90. data/vendor/scs/src/scs.c +975 -0
  91. data/vendor/scs/src/scs.o +0 -0
  92. data/vendor/scs/src/scs_version.c +5 -0
  93. data/vendor/scs/src/scs_version.o +0 -0
  94. data/vendor/scs/src/util.c +196 -0
  95. data/vendor/scs/src/util.o +0 -0
  96. data/vendor/scs/test/data/small_random_socp +0 -0
  97. data/vendor/scs/test/minunit.h +13 -0
  98. data/vendor/scs/test/problem_utils.h +93 -0
  99. data/vendor/scs/test/problems/rob_gauss_cov_est.h +85 -0
  100. data/vendor/scs/test/problems/small_lp.h +50 -0
  101. data/vendor/scs/test/problems/small_random_socp.h +33 -0
  102. data/vendor/scs/test/random_socp_prob.c +171 -0
  103. data/vendor/scs/test/run_from_file.c +69 -0
  104. data/vendor/scs/test/run_tests +2 -0
  105. data/vendor/scs/test/run_tests.c +32 -0
  106. metadata +203 -0
@@ -0,0 +1,220 @@
1
+ SCS
2
+ ====
3
+
4
+ [![Build Status](https://travis-ci.org/cvxgrp/scs.svg?branch=master)](https://travis-ci.org/cvxgrp/scs)
5
+ [![Build status](https://ci.appveyor.com/api/projects/status/4542u6kom5293qpm/branch/master?svg=true)](https://ci.appveyor.com/project/bodono/scs/branch/master)
6
+
7
+ SCS (`splitting conic solver`) is a numerical optimization package for solving
8
+ large-scale convex cone problems, based on our paper [Conic Optimization via
9
+ Operator Splitting and Homogeneous Self-Dual
10
+ Embedding](http://www.stanford.edu/~boyd/papers/scs.html). It is written in C
11
+ and can be used in other C, C++,
12
+ [Python](https://github.com/bodono/scs-python),
13
+ [Matlab](https://github.com/bodono/scs-matlab),
14
+ [R](https://github.com/bodono/scs-r),
15
+ [Julia](https://github.com/JuliaOpt/SCS.jl), programs via the linked
16
+ interfaces. It can also be called as a solver from convex optimization
17
+ toolboxes [CVX](http://cvxr.com/cvx/) (3.0 or later),
18
+ [CVXPY](https://github.com/cvxgrp/cvxpy),
19
+ [Convex.jl](https://github.com/JuliaOpt/Convex.jl), and
20
+ [Yalmip](https://github.com/johanlofberg/YALMIP).
21
+
22
+ The current version is `2.1.2`. If you wish to cite SCS, please use the
23
+ following:
24
+ ```
25
+ @article{ocpb:16,
26
+ author = {B. O'Donoghue and E. Chu and N. Parikh and S. Boyd},
27
+ title = {Conic Optimization via Operator Splitting and Homogeneous Self-Dual Embedding},
28
+ journal = {Journal of Optimization Theory and Applications},
29
+ month = {June},
30
+ year = {2016},
31
+ volume = {169},
32
+ number = {3},
33
+ pages = {1042-1068},
34
+ url = {http://stanford.edu/~boyd/papers/scs.html},
35
+ }
36
+ @misc{scs,
37
+ author = {B. O'Donoghue and E. Chu and N. Parikh and S. Boyd},
38
+ title = {{SCS}: Splitting Conic Solver, version 2.1.2},
39
+ howpublished = {\url{https://github.com/cvxgrp/scs}},
40
+ month = nov,
41
+ year = 2019
42
+ }
43
+ ```
44
+
45
+ ----
46
+ SCS numerically solves convex cone programs using the alternating direction
47
+ method of multipliers
48
+ ([ADMM](http://web.stanford.edu/~boyd/papers/admm_distr_stats.html)). It
49
+ returns solutions to both the primal and dual problems if the problem is
50
+ feasible, or a certificate of infeasibility otherwise. It solves the following
51
+ primal cone problem:
52
+
53
+ ```
54
+ minimize c'x
55
+ subject to Ax + s = b
56
+ s in K
57
+ ```
58
+ over variables `x` and `s`, where `A`, `b` and `c` are user-supplied data and
59
+ `K` is a user-defined convex cone. The dual problem is given by
60
+ ```
61
+ maximize -b'y
62
+ subject to -A'y == c
63
+ y in K^*
64
+ ```
65
+ over variable `y`, where `K^*` denotes the dual cone to `K`.
66
+
67
+ The cone `K` can be any Cartesian product of the following primitive cones:
68
+ + zero cone `{x | x = 0 }` (dual to the free cone `{x | x in R}`)
69
+ + positive orthant `{x | x >= 0}`
70
+ + second-order cone `{(t,x) | ||x||_2 <= t}`
71
+ + positive semidefinite cone `{ X | min(eig(X)) >= 0, X = X^T }`
72
+ + exponential cone `{(x,y,z) | y e^(x/y) <= z, y>0 }`
73
+ + dual exponential cone `{(u,v,w) | −u e^(v/u) <= e w, u<0}`
74
+ + power cone `{(x,y,z) | x^a * y^(1-a) >= |z|, x>=0, y>=0}`
75
+ + dual power cone `{(u,v,w) | (u/a)^a * (v/(1-a))^(1-a) >= |w|, u>=0, v>=0}`
76
+
77
+ The rows of the data matrix `A` correspond to the cones in `K`. **The rows of
78
+ `A` must be in the order of the cones given above, i.e., first come the rows
79
+ that correspond to the zero/free cones, then those that correspond to the
80
+ positive orthants, then SOCs, etc.** For a `k` dimensional semidefinite cone
81
+ when interpreting the rows of the data matrix `A` SCS assumes that the `k x k`
82
+ matrix variable has been vectorized by scaling the off-diagonal entries by
83
+ `sqrt(2)` and stacking the **lower triangular elements column-wise** to create a
84
+ vector of length `k(k+1)/2`. See the section on semidefinite programming below.
85
+
86
+ At termination SCS returns solution `(x*, s*, y*)` if the problem is feasible,
87
+ or a certificate of infeasibility otherwise. See
88
+ [here](http://web.stanford.edu/~boyd/cvxbook/) for more details about
89
+ cone programming and certificates of infeasibility.
90
+
91
+ **Anderson Acceleration**
92
+
93
+ By default SCS uses Anderson acceleration (AA) to speed up convergence. The
94
+ number of iterates that SCS uses in the AA calculation can be controlled by the
95
+ parameter `acceleration_lookback` in the settings struct. It defaults to 10. AA
96
+ is available as a standalone package [here](https://github.com/cvxgrp/aa). More
97
+ details are available in our paper on AA
98
+ [here](https://stanford.edu/~boyd/papers/nonexp_global_aa1.html).
99
+
100
+ **Semidefinite Programming**
101
+
102
+ SCS assumes that the matrix variables and the input data corresponding to
103
+ semidefinite cones have been vectorized by **scaling the off-diagonal entries by
104
+ `sqrt(2)`** and stacking the lower triangular elements **column-wise**. For a `k
105
+ x k` matrix variable (or data matrix) this operation would create a vector of
106
+ length `k(k+1)/2`. Scaling by `sqrt(2)` is required to preserve the
107
+ inner-product.
108
+
109
+ **To recover the matrix solution this operation must be inverted on the
110
+ components of the vector returned by SCS corresponding to semidefinite cones**.
111
+ That is, the off-diagonal entries must be scaled by `1/sqrt(2)` and the upper
112
+ triangular entries are filled in by copying the values of lower triangular
113
+ entries.
114
+
115
+ More explicitly, we want to express
116
+ `Tr(C X)` as `vec(C)'*vec(X)`, where the `vec` operation takes the `k x k` matrix
117
+ ```
118
+ X = [ X11 X12 ... X1k
119
+ X21 X22 ... X2k
120
+ ...
121
+ Xk1 Xk2 ... Xkk ]
122
+ ```
123
+ and produces a vector consisting of
124
+ ```
125
+ vec(X) = (X11, sqrt(2)*X21, ..., sqrt(2)*Xk1, X22, sqrt(2)*X32, ..., Xkk).
126
+ ```
127
+
128
+ **Linear equation solvers**
129
+
130
+ Each iteration of SCS requires the solution of a set of linear equations. This
131
+ package includes two implementations for solving linear equations: a direct
132
+ solver which uses a cached LDL factorization and an indirect solver based on
133
+ conjugate gradients. The indirect solver can be run on either the cpu or
134
+ gpu.
135
+
136
+ The direct solver uses external numerical linear algebra packages:
137
+ * [QDLDL](https://github.com/oxfordcontrol/qdldl)
138
+ * [AMD](http://www.cise.ufl.edu/research/sparse/).
139
+
140
+ ### Using SCS in C
141
+ Typing `make` at the command line will compile the code and create SCS libraries
142
+ in the `out` folder. To run the tests execute:
143
+ ```sh
144
+ make
145
+ make test
146
+ test/run_tests
147
+ ```
148
+
149
+ If `make` completes successfully, it will produce two static library files,
150
+ `libscsdir.a`, `libscsindir.a`, and two dynamic library files `libscsdir.ext`,
151
+ `libscsindir.ext` (where `.ext` extension is platform dependent) in the same
152
+ folder. It will also produce two demo binaries in the `out` folder named
153
+ `demo_socp_direct`, and `demo_socp_indirect`. If you have a GPU and have CUDA
154
+ installed, you can also execture `make gpu` to compile SCS to run on the GPU
155
+ which will create additional libraries and demo binaries in the `out` folder
156
+ corresponding to the gpu version. Note that the GPU version requires 32 bit
157
+ ints, which can be enforced by compiling with `DLONG=0`.
158
+
159
+ To use the libraries in your own source code, compile your code with the linker
160
+ option `-L(PATH_TO_SCS_LIBS)` and `-lscsdir` or `-lscsindir` (as needed). The
161
+ API and required data structures are defined in the file `include/scs.h`. The
162
+ four main API functions are:
163
+
164
+ * `ScsWork * scs_init(const ScsData * d, const ScsCone * k, ScsInfo * info);`
165
+
166
+ This initializes the ScsWork struct containing the workspace that scs will
167
+ use, and performs the necessary preprocessing (e.g. matrix factorization).
168
+ All inputs `d`, `k`, and `info` must be memory allocated before calling.
169
+
170
+ * `scs_int scs_solve(ScsWork * w, const ScsData * d, const ScsCone * k, ScsSolution * sol, ScsInfo * info);`
171
+
172
+ This solves the problem as defined by ScsData `d` and ScsCone `k` using the
173
+ workspace in `w`. The solution is returned in `sol` and information about
174
+ the solve is returned in `info` (outputs must have memory allocated before
175
+ calling). None of the inputs can be NULL. You can call `scs_solve` many
176
+ times for one call to `scs_init`, so long as the matrix `A` does not change
177
+ (vectors `b` and `c` can change).
178
+
179
+ * `void scs_finish(ScsWork * w);`
180
+
181
+ Called after all solves completed to free allocated memory and other
182
+ cleanup.
183
+
184
+ * `scs_int scs(const ScsData * d, const ScsCone * k, ScsSolution * sol, ScsInfo * info);`
185
+
186
+ Convenience method that simply calls all the above routines in order, for
187
+ cases where the workspace does not need to be reused. All inputs must have
188
+ memory allocated before this call.
189
+
190
+ The data matrix `A` is specified in column-compressed format and the vectors `b`
191
+ and `c` are specified as dense arrays. The solutions `x` (primal), `s` (slack),
192
+ and `y` (dual) are returned as dense arrays. Cones are specified as the struct
193
+ defined in `include/scs.h`, the rows of `A` must correspond to the cones in the
194
+ exact order as specified by the cone struct (i.e. put linear cones before
195
+ second-order cones etc.).
196
+
197
+ **Warm-start**
198
+
199
+ You can warm-start SCS (supply a guess of the solution) by setting `warm_start`
200
+ in the ScsData struct to `1` and supplying the warm-starts in the ScsSolution
201
+ struct (`x`,`y`, and `s`). All inputs must be warm-started if any one is. These
202
+ are used to initialize the iterates in `scs_solve`.
203
+
204
+ **Re-using matrix factorization**
205
+
206
+ If using the direct version you can factorize the matrix once and solve many
207
+ times. Simply call `scs_init` once, and use `scs_solve` many times with the same
208
+ workspace, changing the input data `b` and `c` (and optionally warm-starts) for
209
+ each iteration.
210
+
211
+ **Using your own linear system solver**
212
+
213
+ To use your own linear system solver simply implement all the methods and the
214
+ two structs in `include/linsys.h` and plug it in.
215
+
216
+ **BLAS / LAPACK install error**
217
+
218
+ If you get an error like `cannot find -lblas` or `cannot find -llapack`, then
219
+ you need to install blas and lapack and / or update your environment variables
220
+ to point to the install locations.
@@ -0,0 +1,56 @@
1
+ #ifndef AA_H_GUARD
2
+ #define AA_H_GUARD
3
+
4
+ #ifdef __cplusplus
5
+ extern "C" {
6
+ #endif
7
+
8
+ #include <stdio.h>
9
+ #include <stdlib.h>
10
+ #include <string.h>
11
+ #include "glbopts.h"
12
+
13
+ typedef scs_float aa_float;
14
+ typedef scs_int aa_int;
15
+
16
+ typedef struct ACCEL_WORK AaWork;
17
+
18
+ /* Initialize Anderson Acceleration, allocates memory.
19
+ *
20
+ * Args:
21
+ * dim: the dimension of the variable for aa
22
+ * aa_mem: the memory (number of past iterations used) for aa
23
+ * type1: bool, if True use type 1 aa, otherwise use type 2
24
+ *
25
+ * Reurns:
26
+ * Pointer to aa workspace
27
+ */
28
+ AaWork *aa_init(aa_int dim, aa_int aa_mem, aa_int type1);
29
+
30
+ /* Apply Anderson Acceleration.
31
+ *
32
+ * Args:
33
+ * f: output of map at current iteration, overwritten with aa output at end.
34
+ * x: input to map at current iteration
35
+ * a: aa workspace from aa_init
36
+ *
37
+ * Returns:
38
+ * int, a value of 0 is success, <0 is failure at which point f is unchanged
39
+ */
40
+ aa_int aa_apply(aa_float *f, const aa_float *x, AaWork *a);
41
+
42
+ /* Finish Anderson Acceleration, clears memory.
43
+ *
44
+ * Args:
45
+ * a: aa workspace from aa_init.
46
+ */
47
+ void aa_finish(AaWork *a);
48
+
49
+ #define MAX_AA_NRM (1e4)
50
+
51
+ #define MIN(a, b) (((a) < (b)) ? (a) : (b))
52
+
53
+ #ifdef __cplusplus
54
+ }
55
+ #endif
56
+ #endif
@@ -0,0 +1,46 @@
1
+ #ifndef CONES_H_GUARD
2
+ #define CONES_H_GUARD
3
+
4
+ #ifdef __cplusplus
5
+ extern "C" {
6
+ #endif
7
+
8
+ #include "glbopts.h"
9
+ #include "scs.h"
10
+ #include "scs_blas.h"
11
+
12
+ /* private data to help cone projection step */
13
+ struct SCS_CONE_WORK {
14
+ scs_float total_cone_time;
15
+ #ifdef USE_LAPACK
16
+ /* workspace for eigenvector decompositions: */
17
+ scs_float *Xs, *Z, *e, *work;
18
+ blas_int *iwork, lwork, liwork;
19
+ #endif
20
+ };
21
+
22
+ /*
23
+ * boundaries will contain array of indices of rows of A corresponding to
24
+ * cone boundaries, boundaries[0] is starting index for cones of size larger
25
+ * than 1
26
+ * returns length of boundaries array, boundaries malloc-ed here so should be
27
+ * freed
28
+ */
29
+ scs_int SCS(get_cone_boundaries)(const ScsCone *k, scs_int **boundaries);
30
+
31
+ ScsConeWork *SCS(init_cone)(const ScsCone *k);
32
+ char *SCS(get_cone_header)(const ScsCone *k);
33
+ scs_int SCS(validate_cones)(const ScsData *d, const ScsCone *k);
34
+
35
+ /* pass in iter to control how accurate the cone projection
36
+ with iteration, set iter < 0 for exact projection, warm_start contains guess
37
+ of solution, can be SCS_NULL*/
38
+ scs_int SCS(proj_dual_cone)(scs_float *x, const ScsCone *k, ScsConeWork *c,
39
+ const scs_float *warm_start, scs_int iter);
40
+ void SCS(finish_cone)(ScsConeWork *c);
41
+ char *SCS(get_cone_summary)(const ScsInfo *info, ScsConeWork *c);
42
+
43
+ #ifdef __cplusplus
44
+ }
45
+ #endif
46
+ #endif
@@ -0,0 +1,33 @@
1
+ /*
2
+ * Interface for SCS signal handling.
3
+ */
4
+
5
+ #ifndef CTRLC_H_GUARD
6
+ #define CTRLC_H_GUARD
7
+
8
+ #ifdef __cplusplus
9
+ extern "C" {
10
+ #endif
11
+
12
+ #if CTRLC > 0
13
+
14
+ void scs_start_interrupt_listener(void);
15
+ void scs_end_interrupt_listener(void);
16
+ int scs_is_interrupted(void);
17
+
18
+ #else /* CTRLC = 0 */
19
+
20
+ /* Simply to suppress empty translation unit warnings. */
21
+ typedef int scs_make_iso_compilers_happy;
22
+
23
+ /* No signal handling. */
24
+ #define scs_start_interrupt_listener()
25
+ #define scs_end_interrupt_listener()
26
+ #define scs_is_interrupted() 0
27
+
28
+ #endif /* END IF CTRLC > 0 */
29
+
30
+ #ifdef __cplusplus
31
+ }
32
+ #endif
33
+ #endif
@@ -0,0 +1,177 @@
1
+ #ifndef GLB_H_GUARD
2
+ #define GLB_H_GUARD
3
+
4
+ #ifdef __cplusplus
5
+ extern "C" {
6
+ #endif
7
+
8
+ #include <math.h>
9
+
10
+ #ifndef SCS
11
+ #define SCS(x) scs_##x
12
+ #endif
13
+
14
+ /* SCS VERSION NUMBER ---------------------------------------------- */
15
+ #define SCS_VERSION \
16
+ ("2.1.2") /* string literals automatically null-terminated */
17
+
18
+ /* SCS returns one of the following integers: */
19
+ #define SCS_INFEASIBLE_INACCURATE (-7)
20
+ #define SCS_UNBOUNDED_INACCURATE (-6)
21
+ #define SCS_SIGINT (-5)
22
+ #define SCS_FAILED (-4)
23
+ #define SCS_INDETERMINATE (-3)
24
+ #define SCS_INFEASIBLE (-2) /* primal infeasible, dual unbounded */
25
+ #define SCS_UNBOUNDED (-1) /* primal unbounded, dual infeasible */
26
+ #define SCS_UNFINISHED (0) /* never returned, used as placeholder */
27
+ #define SCS_SOLVED (1)
28
+ #define SCS_SOLVED_INACCURATE (2)
29
+
30
+ /* DEFAULT SOLVER PARAMETERS AND SETTINGS -------------------------- */
31
+ #define MAX_ITERS (5000)
32
+ #define EPS (1E-5)
33
+ #define ALPHA (1.5)
34
+ #define RHO_X (1E-3)
35
+ #define SCALE (1.0)
36
+ #define CG_RATE (2.0)
37
+ #define VERBOSE (1)
38
+ #define NORMALIZE (1)
39
+ #define WARM_START (0)
40
+ #define ACCELERATION_LOOKBACK (10)
41
+ #define WRITE_DATA_FILENAME (0)
42
+
43
+ /* redefine printfs and memory allocators as needed */
44
+ #ifdef MATLAB_MEX_FILE
45
+ #include "mex.h"
46
+ #define scs_printf mexPrintf
47
+ #define _scs_free mxFree
48
+ #define _scs_malloc mxMalloc
49
+ #define _scs_calloc mxCalloc
50
+ #define _scs_realloc mxRealloc
51
+ #elif defined PYTHON
52
+ #include <Python.h>
53
+ #include <stdlib.h>
54
+ #define scs_printf(...) \
55
+ { \
56
+ PyGILState_STATE gilstate = PyGILState_Ensure(); \
57
+ PySys_WriteStdout(__VA_ARGS__); \
58
+ PyGILState_Release(gilstate); \
59
+ }
60
+ #define _scs_printf printf
61
+ #define _scs_free free
62
+ #define _scs_malloc malloc
63
+ #define _scs_calloc calloc
64
+ #define _scs_realloc realloc
65
+ #elif (defined(USING_R))
66
+ #include <R_ext/Print.h> /* Rprintf etc */
67
+ #include <stdio.h>
68
+ #include <stdlib.h>
69
+ #define scs_printf Rprintf
70
+ #define _scs_free free
71
+ #define _scs_malloc malloc
72
+ #define _scs_calloc calloc
73
+ #define _scs_realloc realloc
74
+ #else
75
+ #include <stdio.h>
76
+ #include <stdlib.h>
77
+ #define scs_printf printf
78
+ #define _scs_free free
79
+ #define _scs_malloc malloc
80
+ #define _scs_calloc calloc
81
+ #define _scs_realloc realloc
82
+ #endif
83
+
84
+ /* Only required for SuiteSparse compatibility: */
85
+ #ifndef _scs_printf
86
+ #define _scs_printf scs_printf
87
+ #endif
88
+
89
+ #define scs_free(x) \
90
+ _scs_free(x); \
91
+ x = SCS_NULL
92
+ #define scs_malloc(x) _scs_malloc(x)
93
+ #define scs_calloc(x, y) _scs_calloc(x, y)
94
+ #define scs_realloc(x, y) _scs_realloc(x, y)
95
+
96
+ #ifdef DLONG
97
+ #ifdef _WIN64
98
+ #include <stdint.h>
99
+ typedef int64_t scs_int;
100
+ /* typedef long scs_int; */
101
+ #else
102
+ typedef long scs_int;
103
+ #endif
104
+ #else
105
+ typedef int scs_int;
106
+ #endif
107
+
108
+ #ifndef SFLOAT
109
+ typedef double scs_float;
110
+ #ifndef NAN
111
+ #define NAN ((scs_float)0x7ff8000000000000)
112
+ #endif
113
+ #ifndef INFINITY
114
+ #define INFINITY NAN
115
+ #endif
116
+ #else
117
+ typedef float scs_float;
118
+ #ifndef NAN
119
+ #define NAN ((float)0x7fc00000)
120
+ #endif
121
+ #ifndef INFINITY
122
+ #define INFINITY NAN
123
+ #endif
124
+ #endif
125
+
126
+ #define SCS_NULL 0
127
+
128
+ #ifndef MAX
129
+ #define MAX(a, b) (((a) > (b)) ? (a) : (b))
130
+ #endif
131
+
132
+ #ifndef MIN
133
+ #define MIN(a, b) (((a) < (b)) ? (a) : (b))
134
+ #endif
135
+
136
+ #ifndef ABS
137
+ #define ABS(x) (((x) < 0) ? -(x) : (x))
138
+ #endif
139
+
140
+ #ifndef POWF
141
+ #ifdef SFLOAT
142
+ #define POWF powf
143
+ #else
144
+ #define POWF pow
145
+ #endif
146
+ #endif
147
+
148
+ #ifndef SQRTF
149
+ #ifdef SFLOAT
150
+ #define SQRTF sqrtf
151
+ #else
152
+ #define SQRTF sqrt
153
+ #endif
154
+ #endif
155
+
156
+ #define EPS_TOL (1E-18)
157
+ #define SAFEDIV_POS(X, Y) ((Y) < EPS_TOL ? ((X) / EPS_TOL) : (X) / (Y))
158
+
159
+ #if EXTRA_VERBOSE > 0
160
+ #define PRINT_INTERVAL (1)
161
+ #define CONVERGED_INTERVAL (1)
162
+ #else
163
+ /* print summary output every this num iterations */
164
+ #define PRINT_INTERVAL (100)
165
+ /* check for convergence every this num iterations */
166
+ #define CONVERGED_INTERVAL (20)
167
+ #endif
168
+
169
+ /* tolerance at which we declare problem indeterminate */
170
+ #define INDETERMINATE_TOL (1e-9)
171
+ /* maintain the iterates at this l2 norm (due to homogeneity) */
172
+ #define ITERATE_NORM (10.)
173
+
174
+ #ifdef __cplusplus
175
+ }
176
+ #endif
177
+ #endif
@@ -0,0 +1,26 @@
1
+ #ifndef LINALG_H_GUARD
2
+ #define LINALG_H_GUARD
3
+
4
+ #ifdef __cplusplus
5
+ extern "C" {
6
+ #endif
7
+
8
+ #include <math.h>
9
+ #include "scs.h"
10
+
11
+ void SCS(set_as_scaled_array)(scs_float *x, const scs_float *a,
12
+ const scs_float b, scs_int len);
13
+ void SCS(scale_array)(scs_float *a, const scs_float b, scs_int len);
14
+ scs_float SCS(dot)(const scs_float *x, const scs_float *y, scs_int len);
15
+ scs_float SCS(norm_sq)(const scs_float *v, scs_int len);
16
+ scs_float SCS(norm)(const scs_float *v, scs_int len);
17
+ scs_float SCS(norm_inf)(const scs_float *a, scs_int l);
18
+ void SCS(add_scaled_array)(scs_float *a, const scs_float *b, scs_int n,
19
+ const scs_float sc);
20
+ scs_float SCS(norm_diff)(const scs_float *a, const scs_float *b, scs_int l);
21
+ scs_float SCS(norm_inf_diff)(const scs_float *a, const scs_float *b, scs_int l);
22
+
23
+ #ifdef __cplusplus
24
+ }
25
+ #endif
26
+ #endif
@@ -0,0 +1,64 @@
1
+ #ifndef LINSYS_H_GUARD
2
+ #define LINSYS_H_GUARD
3
+
4
+ #ifdef __cplusplus
5
+ extern "C" {
6
+ #endif
7
+
8
+ #include "scs.h"
9
+
10
+ /* YOUR LINEAR SYSTEM SOLVER MUST IMPLEMENT THESE METHODS AND SCS_LIN_SYS_WORK
11
+ * STRUCT */
12
+
13
+ /* initialize ScsLinSysWork structure and perform any necessary preprocessing */
14
+ ScsLinSysWork *SCS(init_lin_sys_work)(const ScsMatrix *A,
15
+ const ScsSettings *stgs);
16
+ /* solves [d->RHO_X * I A' ; A -I] x = b for x, stores result in b, s contains
17
+ * warm-start, iter is current scs iteration count */
18
+ scs_int SCS(solve_lin_sys)(const ScsMatrix *A, const ScsSettings *stgs,
19
+ ScsLinSysWork *p, scs_float *b, const scs_float *s,
20
+ scs_int iter);
21
+ /* frees ScsLinSysWork structure and allocated memory in ScsLinSysWork */
22
+ void SCS(free_lin_sys_work)(ScsLinSysWork *p);
23
+
24
+ /* forms y += A'*x */
25
+ void SCS(accum_by_atrans)(const ScsMatrix *A, ScsLinSysWork *p,
26
+ const scs_float *x, scs_float *y);
27
+ /* forms y += A*x */
28
+ void SCS(accum_by_a)(const ScsMatrix *A, ScsLinSysWork *p, const scs_float *x,
29
+ scs_float *y);
30
+
31
+ /* returns negative num if input data is invalid */
32
+ scs_int SCS(validate_lin_sys)(const ScsMatrix *A);
33
+
34
+ /* returns string describing method, can return null, if not null free will be
35
+ * called on output */
36
+ char *SCS(get_lin_sys_method)(const ScsMatrix *A, const ScsSettings *stgs);
37
+ /* returns string containing summary information about linear system solves, can
38
+ * return null, if not null free will be called on output */
39
+ char *SCS(get_lin_sys_summary)(ScsLinSysWork *p, const ScsInfo *info);
40
+
41
+ /* Normalization routines, used if d->NORMALIZE is true */
42
+ /* normalizes A matrix, sets w->E and w->D diagonal scaling matrices, Anew =
43
+ * d->SCALE * (D^-1)*A*(E^-1) (different to paper which is D*A*E)
44
+ * D and E must be all positive entries, D must satisfy cone boundaries
45
+ * must set (w->mean_norm_row_a = mean of norms of rows of normalized A) THEN
46
+ * scale
47
+ * resulting A by d->SCALE */
48
+ void SCS(normalize_a)(ScsMatrix *A, const ScsSettings *stgs, const ScsCone *k,
49
+ ScsScaling *scal);
50
+ /* unnormalizes A matrix, unnormalizes by w->D and w->E and d->SCALE */
51
+ void SCS(un_normalize_a)(ScsMatrix *A, const ScsSettings *stgs,
52
+ const ScsScaling *scal);
53
+ /* to free the memory allocated in ScsMatrix */
54
+ void SCS(free_a_matrix)(ScsMatrix *A);
55
+
56
+ /* copies A (instead of in-place normalization), returns 0 for failure,
57
+ * allocates memory for dstp */
58
+ scs_int SCS(copy_a_matrix)(ScsMatrix **dstp, const ScsMatrix *src);
59
+
60
+ #ifdef __cplusplus
61
+ }
62
+ #endif
63
+
64
+ #endif
@@ -0,0 +1,18 @@
1
+ #ifndef NORMALIZE_H_GUARD
2
+ #define NORMALIZE_H_GUARD
3
+
4
+ #ifdef __cplusplus
5
+ extern "C" {
6
+ #endif
7
+
8
+ #include "scs.h"
9
+
10
+ void SCS(normalize_b_c)(ScsWork *w);
11
+ void SCS(calc_scaled_resids)(ScsWork *w, ScsResiduals *r);
12
+ void SCS(normalize_warm_start)(ScsWork *w);
13
+ void SCS(un_normalize_sol)(ScsWork *w, ScsSolution *sol);
14
+
15
+ #ifdef __cplusplus
16
+ }
17
+ #endif
18
+ #endif
@@ -0,0 +1,17 @@
1
+ #ifndef RW_H_GUARD
2
+ #define RW_H_GUARD
3
+
4
+ #ifdef __cplusplus
5
+ extern "C" {
6
+ #endif
7
+
8
+ #include "glbopts.h"
9
+ #include "scs.h"
10
+
11
+ void SCS(write_data)(const ScsData *d, const ScsCone *k);
12
+ scs_int SCS(read_data)(const char * filename, ScsData **d, ScsCone **k);
13
+
14
+ #ifdef __cplusplus
15
+ }
16
+ #endif
17
+ #endif