scs 0.2.0 → 0.3.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 +17 -0
- data/LICENSE.txt +18 -18
- data/README.md +28 -9
- data/ext/scs/extconf.rb +29 -0
- data/lib/scs/ffi.rb +30 -13
- data/lib/scs/solver.rb +32 -14
- data/lib/scs/version.rb +1 -1
- data/vendor/scs/CITATION.cff +39 -0
- data/vendor/scs/CMakeLists.txt +272 -0
- data/vendor/scs/Makefile +24 -15
- data/vendor/scs/README.md +8 -216
- data/vendor/scs/include/aa.h +67 -23
- data/vendor/scs/include/cones.h +17 -17
- data/vendor/scs/include/glbopts.h +98 -32
- data/vendor/scs/include/linalg.h +2 -4
- data/vendor/scs/include/linsys.h +58 -44
- data/vendor/scs/include/normalize.h +3 -3
- data/vendor/scs/include/rw.h +8 -2
- data/vendor/scs/include/scs.h +293 -133
- data/vendor/scs/include/util.h +3 -15
- data/vendor/scs/linsys/cpu/direct/private.c +220 -224
- data/vendor/scs/linsys/cpu/direct/private.h +13 -7
- data/vendor/scs/linsys/cpu/direct/private.o +0 -0
- data/vendor/scs/linsys/cpu/indirect/private.c +177 -110
- data/vendor/scs/linsys/cpu/indirect/private.h +8 -4
- data/vendor/scs/linsys/cpu/indirect/private.o +0 -0
- data/vendor/scs/linsys/csparse.c +87 -0
- data/vendor/scs/linsys/csparse.h +34 -0
- data/vendor/scs/linsys/csparse.o +0 -0
- data/vendor/scs/linsys/external/amd/SuiteSparse_config.c +1 -1
- 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_internal.h +1 -1
- 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/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.o +0 -0
- 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 +66 -28
- data/vendor/scs/linsys/gpu/indirect/private.c +368 -154
- data/vendor/scs/linsys/gpu/indirect/private.h +26 -12
- data/vendor/scs/linsys/scs_matrix.c +498 -0
- data/vendor/scs/linsys/scs_matrix.h +70 -0
- data/vendor/scs/linsys/scs_matrix.o +0 -0
- data/vendor/scs/scs.mk +13 -9
- data/vendor/scs/src/aa.c +384 -109
- data/vendor/scs/src/aa.o +0 -0
- data/vendor/scs/src/cones.c +440 -353
- data/vendor/scs/src/cones.o +0 -0
- data/vendor/scs/src/ctrlc.c +15 -5
- data/vendor/scs/src/ctrlc.o +0 -0
- data/vendor/scs/src/linalg.c +84 -28
- data/vendor/scs/src/linalg.o +0 -0
- data/vendor/scs/src/normalize.c +22 -64
- data/vendor/scs/src/normalize.o +0 -0
- data/vendor/scs/src/rw.c +161 -22
- data/vendor/scs/src/rw.o +0 -0
- data/vendor/scs/src/scs.c +768 -561
- data/vendor/scs/src/scs.o +0 -0
- data/vendor/scs/src/scs_indir.o +0 -0
- data/vendor/scs/src/scs_version.c +9 -3
- data/vendor/scs/src/scs_version.o +0 -0
- data/vendor/scs/src/util.c +37 -106
- data/vendor/scs/src/util.o +0 -0
- data/vendor/scs/test/minunit.h +17 -8
- data/vendor/scs/test/problem_utils.h +176 -14
- 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 +13 -14
- data/vendor/scs/test/problems/test_fails.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 +19 -10
- data/vendor/scs/test/run_tests.c +27 -3
- metadata +30 -73
- data/ext/scs/Rakefile +0 -11
- 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/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/include/aa.h
CHANGED
@@ -5,50 +5,94 @@
|
|
5
5
|
extern "C" {
|
6
6
|
#endif
|
7
7
|
|
8
|
+
#include "glbopts.h"
|
8
9
|
#include <stdio.h>
|
9
10
|
#include <stdlib.h>
|
10
11
|
#include <string.h>
|
11
|
-
#include "glbopts.h"
|
12
12
|
|
13
13
|
typedef scs_float aa_float;
|
14
14
|
typedef scs_int aa_int;
|
15
15
|
|
16
16
|
typedef struct ACCEL_WORK AaWork;
|
17
17
|
|
18
|
-
|
18
|
+
/**
|
19
|
+
* Initialize Anderson Acceleration, allocates memory.
|
20
|
+
*
|
21
|
+
* @param dim the dimension of the variable for AA
|
22
|
+
* @param mem the memory (number of past iterations used) for AA
|
23
|
+
* @param type1 if True use type 1 AA, otherwise use type 2
|
24
|
+
* @param regularization type-I and type-II different, for type-I: 1e-8 works
|
25
|
+
* well, type-II: more stable can use 1e-12 often
|
26
|
+
* @param relaxation float \in [0,2], mixing parameter (1.0 is vanilla)
|
27
|
+
* @param safeguard_factor factor that controls safeguarding checks
|
28
|
+
* larger is more aggressive but less stable
|
29
|
+
* @param max_weight_norm float, maximum norm of AA weights
|
30
|
+
* @param verbosity if greater than 0 prints out various info
|
31
|
+
*
|
32
|
+
* @return pointer to AA workspace
|
33
|
+
*
|
34
|
+
*/
|
35
|
+
AaWork *aa_init(aa_int dim, aa_int mem, aa_int type1, aa_float regularization,
|
36
|
+
aa_float relaxation, aa_float safeguard_factor,
|
37
|
+
aa_float max_weight_norm, aa_int verbosity);
|
38
|
+
/**
|
39
|
+
* Apply Anderson Acceleration. The usage pattern should be as follows:
|
40
|
+
*
|
41
|
+
* - for i = 0 .. N:
|
42
|
+
* - if (i > 0): aa_apply(x, x_prev, a)
|
43
|
+
* - x_prev = x.copy()
|
44
|
+
* - x = F(x)
|
45
|
+
* - aa_safeguard(x, x_prev, a) // optional but helps stability
|
46
|
+
*
|
47
|
+
* Here F is the map we are trying to find the fixed point for. We put the AA
|
48
|
+
* before the map so that any properties of the map are maintained at the end.
|
49
|
+
* Eg if the map contains a projection onto a set then the output is guaranteed
|
50
|
+
* to be in the set.
|
51
|
+
*
|
19
52
|
*
|
20
|
-
*
|
21
|
-
*
|
22
|
-
*
|
23
|
-
*
|
53
|
+
* @param f output of map at current iteration, overwritten with AA output
|
54
|
+
* @param x input to map at current iteration
|
55
|
+
* @param a workspace from aa_init
|
56
|
+
*
|
57
|
+
* @return (+ or -) norm of AA weights vector. If positive then update
|
58
|
+
* was accepted and f contains new point, if negative then update was
|
59
|
+
* rejected and f is unchanged
|
24
60
|
*
|
25
|
-
* Reurns:
|
26
|
-
* Pointer to aa workspace
|
27
61
|
*/
|
28
|
-
|
62
|
+
aa_float aa_apply(aa_float *f, const aa_float *x, AaWork *a);
|
29
63
|
|
30
|
-
|
64
|
+
/**
|
65
|
+
* Apply safeguarding.
|
66
|
+
*
|
67
|
+
* This step is optional but can improve stability.
|
68
|
+
*
|
69
|
+
* @param f_new output of map after AA step
|
70
|
+
* @param x_new AA output that is input to the map
|
71
|
+
* @param a workspace from aa_init
|
31
72
|
*
|
32
|
-
*
|
33
|
-
*
|
34
|
-
* x: input to map at current iteration
|
35
|
-
* a: aa workspace from aa_init
|
73
|
+
* @returns 0 if AA step is accepted otherwise -1, if AA step is rejected then
|
74
|
+
* this overwrites f_new and x_new with previous values
|
36
75
|
*
|
37
|
-
* Returns:
|
38
|
-
* int, a value of 0 is success, <0 is failure at which point f is unchanged
|
39
76
|
*/
|
40
|
-
aa_int
|
77
|
+
aa_int aa_safeguard(aa_float *f_new, aa_float *x_new, AaWork *a);
|
41
78
|
|
42
|
-
|
79
|
+
/**
|
80
|
+
* Finish Anderson Acceleration, clears memory.
|
81
|
+
*
|
82
|
+
* @param a AA workspace from aa_init
|
43
83
|
*
|
44
|
-
* Args:
|
45
|
-
* a: aa workspace from aa_init.
|
46
84
|
*/
|
47
85
|
void aa_finish(AaWork *a);
|
48
86
|
|
49
|
-
|
50
|
-
|
51
|
-
|
87
|
+
/**
|
88
|
+
* Reset Anderson Acceleration.
|
89
|
+
*
|
90
|
+
* Resets AA as if at the first iteration, reuses original memory allocations.
|
91
|
+
*
|
92
|
+
* @param a AA workspace from aa_init
|
93
|
+
*
|
94
|
+
*/
|
95
|
+
void aa_reset(AaWork *a);
|
52
96
|
|
53
97
|
#ifdef __cplusplus
|
54
98
|
}
|
data/vendor/scs/include/cones.h
CHANGED
@@ -11,34 +11,34 @@ extern "C" {
|
|
11
11
|
|
12
12
|
/* private data to help cone projection step */
|
13
13
|
struct SCS_CONE_WORK {
|
14
|
-
|
14
|
+
/*
|
15
|
+
* cone_boundaries will contain array of indices of rows of A corresponding to
|
16
|
+
* cone boundaries, boundaries[0] is starting index for cones of size larger
|
17
|
+
* than 1
|
18
|
+
*/
|
19
|
+
scs_float *s; /* used for Moreau decomposition in projection */
|
20
|
+
scs_int cone_len;
|
21
|
+
/* box cone quantities */
|
22
|
+
scs_float *bl, *bu, box_t_warm_start;
|
15
23
|
#ifdef USE_LAPACK
|
16
24
|
/* workspace for eigenvector decompositions: */
|
17
25
|
scs_float *Xs, *Z, *e, *work;
|
18
|
-
blas_int
|
26
|
+
blas_int lwork;
|
19
27
|
#endif
|
20
28
|
};
|
21
29
|
|
22
|
-
|
23
|
-
|
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);
|
30
|
+
ScsConeWork *SCS(init_cone)(const ScsCone *k, const ScsScaling *scal,
|
31
|
+
scs_int cone_len);
|
32
32
|
char *SCS(get_cone_header)(const ScsCone *k);
|
33
33
|
scs_int SCS(validate_cones)(const ScsData *d, const ScsCone *k);
|
34
|
+
scs_int SCS(set_cone_boundaries)(const ScsCone *k, scs_int **cone_boundaries);
|
34
35
|
|
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
36
|
scs_int SCS(proj_dual_cone)(scs_float *x, const ScsCone *k, ScsConeWork *c,
|
39
|
-
|
37
|
+
scs_int normalize);
|
40
38
|
void SCS(finish_cone)(ScsConeWork *c);
|
41
|
-
|
39
|
+
|
40
|
+
void SCS(set_rho_y_vec)(const ScsCone *k, scs_float scale, scs_float *rho_y_vec,
|
41
|
+
scs_int m);
|
42
42
|
|
43
43
|
#ifdef __cplusplus
|
44
44
|
}
|
@@ -12,8 +12,8 @@ extern "C" {
|
|
12
12
|
#endif
|
13
13
|
|
14
14
|
/* SCS VERSION NUMBER ---------------------------------------------- */
|
15
|
-
#define SCS_VERSION
|
16
|
-
("
|
15
|
+
#define SCS_VERSION \
|
16
|
+
("3.0.0") /* string literals automatically null-terminated */
|
17
17
|
|
18
18
|
/* SCS returns one of the following integers: */
|
19
19
|
#define SCS_INFEASIBLE_INACCURATE (-7)
|
@@ -27,18 +27,28 @@ extern "C" {
|
|
27
27
|
#define SCS_SOLVED (1)
|
28
28
|
#define SCS_SOLVED_INACCURATE (2)
|
29
29
|
|
30
|
+
/* verbosity level */
|
31
|
+
#ifndef VERBOSITY
|
32
|
+
#define VERBOSITY (0)
|
33
|
+
#endif
|
34
|
+
|
30
35
|
/* DEFAULT SOLVER PARAMETERS AND SETTINGS -------------------------- */
|
31
|
-
#define MAX_ITERS (
|
32
|
-
#define
|
36
|
+
#define MAX_ITERS (100000)
|
37
|
+
#define EPS_REL (1E-4)
|
38
|
+
#define EPS_ABS (1E-4)
|
39
|
+
#define EPS_INFEAS (1E-7)
|
33
40
|
#define ALPHA (1.5)
|
34
|
-
#define RHO_X (1E-
|
35
|
-
#define SCALE (1
|
36
|
-
#define CG_RATE (2.0)
|
41
|
+
#define RHO_X (1E-6)
|
42
|
+
#define SCALE (0.1)
|
37
43
|
#define VERBOSE (1)
|
38
44
|
#define NORMALIZE (1)
|
39
45
|
#define WARM_START (0)
|
40
46
|
#define ACCELERATION_LOOKBACK (10)
|
47
|
+
#define ACCELERATION_INTERVAL (10)
|
48
|
+
#define ADAPTIVE_SCALE (1)
|
41
49
|
#define WRITE_DATA_FILENAME (0)
|
50
|
+
#define LOG_CSV_FILENAME (0)
|
51
|
+
#define TIME_LIMIT_SECS (0.)
|
42
52
|
|
43
53
|
/* redefine printfs and memory allocators as needed */
|
44
54
|
#ifdef MATLAB_MEX_FILE
|
@@ -50,19 +60,30 @@ extern "C" {
|
|
50
60
|
#define _scs_realloc mxRealloc
|
51
61
|
#elif defined PYTHON
|
52
62
|
#include <Python.h>
|
53
|
-
#
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
PyGILState_Release(gilstate); \
|
63
|
+
#define scs_printf(...) \
|
64
|
+
{ \
|
65
|
+
PyGILState_STATE gilstate = PyGILState_Ensure(); \
|
66
|
+
PySys_WriteStdout(__VA_ARGS__); \
|
67
|
+
PyGILState_Release(gilstate); \
|
59
68
|
}
|
60
|
-
|
61
|
-
#define
|
62
|
-
#
|
63
|
-
#define
|
64
|
-
#define
|
65
|
-
#
|
69
|
+
/* only for SuiteSparse */
|
70
|
+
#define _scs_printf PySys_WriteStdout
|
71
|
+
#if PY_MAJOR_VERSION >= 3
|
72
|
+
#define _scs_free PyMem_RawFree
|
73
|
+
#define _scs_malloc PyMem_RawMalloc
|
74
|
+
#define _scs_realloc PyMem_RawRealloc
|
75
|
+
#define _scs_calloc PyMem_RawCalloc
|
76
|
+
#else
|
77
|
+
#define _scs_free PyMem_Free
|
78
|
+
#define _scs_malloc PyMem_Malloc
|
79
|
+
#define _scs_realloc PyMem_Realloc
|
80
|
+
static inline void *_scs_calloc(size_t count, size_t size) {
|
81
|
+
void *obj = PyMem_Malloc(count * size);
|
82
|
+
memset(obj, 0, count * size);
|
83
|
+
return obj;
|
84
|
+
}
|
85
|
+
#endif
|
86
|
+
#elif defined R_LANG
|
66
87
|
#include <R_ext/Print.h> /* Rprintf etc */
|
67
88
|
#include <stdio.h>
|
68
89
|
#include <stdlib.h>
|
@@ -86,21 +107,22 @@ extern "C" {
|
|
86
107
|
#define _scs_printf scs_printf
|
87
108
|
#endif
|
88
109
|
|
89
|
-
#define scs_free(x)
|
90
|
-
_scs_free(x);
|
110
|
+
#define scs_free(x) \
|
111
|
+
_scs_free(x); \
|
91
112
|
x = SCS_NULL
|
92
113
|
#define scs_malloc(x) _scs_malloc(x)
|
93
114
|
#define scs_calloc(x, y) _scs_calloc(x, y)
|
94
115
|
#define scs_realloc(x, y) _scs_realloc(x, y)
|
95
116
|
|
96
117
|
#ifdef DLONG
|
97
|
-
|
118
|
+
/*#ifdef _WIN64
|
98
119
|
#include <stdint.h>
|
99
120
|
typedef int64_t scs_int;
|
100
|
-
/* typedef long scs_int; */
|
101
121
|
#else
|
102
122
|
typedef long scs_int;
|
103
123
|
#endif
|
124
|
+
*/
|
125
|
+
typedef long long scs_int;
|
104
126
|
#else
|
105
127
|
typedef int scs_int;
|
106
128
|
#endif
|
@@ -153,23 +175,67 @@ typedef float scs_float;
|
|
153
175
|
#endif
|
154
176
|
#endif
|
155
177
|
|
178
|
+
/* Force SCS to treat the problem as (non-homogeneous) feasible for this many */
|
179
|
+
/* iters. This acts like a warm-start that biases towards feasibility, which */
|
180
|
+
/* is the most common use-case */
|
181
|
+
#define FEASIBLE_ITERS (1)
|
182
|
+
|
183
|
+
/* how many iterations between heuristic residual rescaling */
|
184
|
+
#define RESCALING_MIN_ITERS (100)
|
185
|
+
|
156
186
|
#define EPS_TOL (1E-18)
|
157
187
|
#define SAFEDIV_POS(X, Y) ((Y) < EPS_TOL ? ((X) / EPS_TOL) : (X) / (Y))
|
158
188
|
|
159
|
-
#if
|
189
|
+
#if VERBOSITY > 0
|
160
190
|
#define PRINT_INTERVAL (1)
|
161
191
|
#define CONVERGED_INTERVAL (1)
|
162
192
|
#else
|
193
|
+
|
163
194
|
/* print summary output every this num iterations */
|
164
|
-
#define PRINT_INTERVAL (
|
195
|
+
#define PRINT_INTERVAL (250)
|
165
196
|
/* check for convergence every this num iterations */
|
166
|
-
#define CONVERGED_INTERVAL (
|
167
|
-
#endif
|
168
|
-
|
169
|
-
/*
|
170
|
-
#define
|
171
|
-
|
172
|
-
|
197
|
+
#define CONVERGED_INTERVAL (25)
|
198
|
+
#endif
|
199
|
+
|
200
|
+
/* maintain the iterates at L2 norm = ITERATE_NORM * sqrt(n+m+1) */
|
201
|
+
#define ITERATE_NORM (1.)
|
202
|
+
|
203
|
+
/* Which norm to use for termination checking etc */
|
204
|
+
/* #define NORM SCS(norm_2) */
|
205
|
+
#define NORM SCS(norm_inf)
|
206
|
+
|
207
|
+
/* Factor which is scales tau in the linear system update */
|
208
|
+
/* Larger factors prevent tau from moving as much */
|
209
|
+
#define TAU_FACTOR (10.)
|
210
|
+
|
211
|
+
/* Anderson acceleration parameters: */
|
212
|
+
#define AA_RELAXATION (1.0)
|
213
|
+
#define AA_REGULARIZATION_TYPE_1 (1e-6)
|
214
|
+
#define AA_REGULARIZATION_TYPE_2 (1e-10)
|
215
|
+
/* Safeguarding norm factor at which we reject AA steps */
|
216
|
+
#define AA_SAFEGUARD_FACTOR (1.)
|
217
|
+
/* Max allowable AA weight norm */
|
218
|
+
#define AA_MAX_WEIGHT_NORM (1e10)
|
219
|
+
|
220
|
+
/* (Dual) Scale updating parameters */
|
221
|
+
#define MAX_SCALE_VALUE (1e6)
|
222
|
+
#define MIN_SCALE_VALUE (1e-6)
|
223
|
+
#define SCALE_NORM NORM /* what norm to use when computing the scale factor */
|
224
|
+
|
225
|
+
/* CG == Conjugate gradient */
|
226
|
+
/* Linear system tolerances, only used with indirect */
|
227
|
+
#define CG_BEST_TOL (1e-12)
|
228
|
+
/* This scales the current residuals to get the tolerance we solve the
|
229
|
+
* linear system to at each iteration. Lower factors require more CG steps
|
230
|
+
* but give better accuracy */
|
231
|
+
#define CG_TOL_FACTOR (0.2)
|
232
|
+
|
233
|
+
/* norm to use when deciding CG convergence */
|
234
|
+
#ifndef CG_NORM
|
235
|
+
#define CG_NORM SCS(norm_inf)
|
236
|
+
#endif
|
237
|
+
/* cg tol ~ O(1/k^(CG_RATE)) */
|
238
|
+
#define CG_RATE (1.5)
|
173
239
|
|
174
240
|
#ifdef __cplusplus
|
175
241
|
}
|
data/vendor/scs/include/linalg.h
CHANGED
@@ -5,15 +5,13 @@
|
|
5
5
|
extern "C" {
|
6
6
|
#endif
|
7
7
|
|
8
|
-
#include <math.h>
|
9
8
|
#include "scs.h"
|
9
|
+
#include <math.h>
|
10
10
|
|
11
|
-
void SCS(set_as_scaled_array)(scs_float *x, const scs_float *a,
|
12
|
-
const scs_float b, scs_int len);
|
13
11
|
void SCS(scale_array)(scs_float *a, const scs_float b, scs_int len);
|
14
12
|
scs_float SCS(dot)(const scs_float *x, const scs_float *y, scs_int len);
|
15
13
|
scs_float SCS(norm_sq)(const scs_float *v, scs_int len);
|
16
|
-
scs_float SCS(
|
14
|
+
scs_float SCS(norm_2)(const scs_float *v, scs_int len);
|
17
15
|
scs_float SCS(norm_inf)(const scs_float *a, scs_int l);
|
18
16
|
void SCS(add_scaled_array)(scs_float *a, const scs_float *b, scs_int n,
|
19
17
|
const scs_float sc);
|
data/vendor/scs/include/linsys.h
CHANGED
@@ -7,55 +7,69 @@ extern "C" {
|
|
7
7
|
|
8
8
|
#include "scs.h"
|
9
9
|
|
10
|
-
/*
|
11
|
-
* STRUCT */
|
10
|
+
/* This is the API that any new linear system solver must implement */
|
12
11
|
|
13
|
-
/*
|
14
|
-
|
15
|
-
|
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);
|
12
|
+
/* Struct containing linear system workspace. Implemented by linear solver. */
|
13
|
+
/* This typedef is in scs.h */
|
14
|
+
/* typedef struct SCS_LIN_SYS_WORK ScsLinSysWork; */
|
23
15
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
16
|
+
/**
|
17
|
+
* Initialize `ScsLinSysWork` structure and perform any necessary preprocessing.
|
18
|
+
*
|
19
|
+
* @param A A data matrix.
|
20
|
+
* @param P P data matrix.
|
21
|
+
* @param rho_y_vec `rho_y > 0` diagonal entries.
|
22
|
+
* @param rho_x `rho_x > 0` float.
|
23
|
+
* @return Linear system solver workspace.
|
24
|
+
*
|
25
|
+
*/
|
26
|
+
ScsLinSysWork *SCS(init_lin_sys_work)(const ScsMatrix *A, const ScsMatrix *P,
|
27
|
+
scs_float *rho_y_vec, scs_float rho_x);
|
30
28
|
|
31
|
-
|
32
|
-
|
29
|
+
/**
|
30
|
+
* Frees `ScsLinSysWork` structure and associated allocated memory.
|
31
|
+
*
|
32
|
+
* @param w Linear system private workspace.
|
33
|
+
*/
|
34
|
+
void SCS(free_lin_sys_work)(ScsLinSysWork *w);
|
33
35
|
|
34
|
-
|
35
|
-
*
|
36
|
-
|
37
|
-
|
38
|
-
*
|
39
|
-
|
36
|
+
/**
|
37
|
+
* Solves the linear system required by SCS at each iteration:
|
38
|
+
* \f[
|
39
|
+
* \begin{bmatrix}
|
40
|
+
* (\rho_x I + P) & A^\top \\
|
41
|
+
* A & -\mathrm{diag}(\rho_y) \\
|
42
|
+
* \end{bmatrix} x = b
|
43
|
+
* \f]
|
44
|
+
*
|
45
|
+
* for `x`. Overwrites `b` with result.
|
46
|
+
*
|
47
|
+
* @param w Linear system private workspace.
|
48
|
+
* @param b Right hand side, contains solution at the end.
|
49
|
+
* @param s Contains warm-start (may be NULL).
|
50
|
+
* @param tol Tolerance required for the system solve.
|
51
|
+
* @return status < 0 indicates failure.
|
52
|
+
*
|
53
|
+
*/
|
54
|
+
scs_int SCS(solve_lin_sys)(ScsLinSysWork *w, scs_float *b, const scs_float *s,
|
55
|
+
scs_float tol);
|
56
|
+
/**
|
57
|
+
* Update the linsys workspace when `rho_y_vec` is changed. For example, a
|
58
|
+
* direct method for solving the linear system might need to update the
|
59
|
+
* factorization of the matrix.
|
60
|
+
*
|
61
|
+
* @param w Linear system private workspace.
|
62
|
+
* @param rho_y_vec `rho_y` diagonal entries.
|
63
|
+
*
|
64
|
+
*/
|
65
|
+
void SCS(update_lin_sys_rho_y_vec)(ScsLinSysWork *w, scs_float *rho_y_vec);
|
40
66
|
|
41
|
-
|
42
|
-
|
43
|
-
*
|
44
|
-
*
|
45
|
-
|
46
|
-
*
|
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);
|
67
|
+
/**
|
68
|
+
* Name of the linear solver.
|
69
|
+
*
|
70
|
+
* @return name of method.
|
71
|
+
*/
|
72
|
+
const char *SCS(get_lin_sys_method)(void);
|
59
73
|
|
60
74
|
#ifdef __cplusplus
|
61
75
|
}
|
@@ -7,10 +7,10 @@ extern "C" {
|
|
7
7
|
|
8
8
|
#include "scs.h"
|
9
9
|
|
10
|
-
void SCS(
|
11
|
-
void SCS(calc_scaled_resids)(ScsWork *w, ScsResiduals *r);
|
12
|
-
void SCS(normalize_warm_start)(ScsWork *w);
|
10
|
+
void SCS(normalize_sol)(ScsWork *w, ScsSolution *sol);
|
13
11
|
void SCS(un_normalize_sol)(ScsWork *w, ScsSolution *sol);
|
12
|
+
void SCS(un_normalize_primal)(ScsWork *w, scs_float *r);
|
13
|
+
void SCS(un_normalize_dual)(ScsWork *w, scs_float *r);
|
14
14
|
|
15
15
|
#ifdef __cplusplus
|
16
16
|
}
|
data/vendor/scs/include/rw.h
CHANGED
@@ -7,9 +7,15 @@ extern "C" {
|
|
7
7
|
|
8
8
|
#include "glbopts.h"
|
9
9
|
#include "scs.h"
|
10
|
+
#include "util.h"
|
10
11
|
|
11
|
-
void SCS(write_data)(const ScsData *d, const ScsCone *k
|
12
|
-
|
12
|
+
void SCS(write_data)(const ScsData *d, const ScsCone *k,
|
13
|
+
const ScsSettings *stgs);
|
14
|
+
scs_int SCS(read_data)(const char *filename, ScsData **d, ScsCone **k,
|
15
|
+
ScsSettings **stgs);
|
16
|
+
void SCS(log_data_to_csv)(const ScsData *d, const ScsCone *k,
|
17
|
+
const ScsSettings *stgs, const ScsWork *w,
|
18
|
+
scs_int iter, SCS(timer) * solve_timer);
|
13
19
|
|
14
20
|
#ifdef __cplusplus
|
15
21
|
}
|