scs 0.2.0 → 0.3.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.
- 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
|
}
|