scs 0.2.0 → 0.3.0

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 +17 -0
  3. data/LICENSE.txt +18 -18
  4. data/README.md +28 -9
  5. data/ext/scs/extconf.rb +29 -0
  6. data/lib/scs/ffi.rb +30 -13
  7. data/lib/scs/solver.rb +32 -14
  8. data/lib/scs/version.rb +1 -1
  9. data/vendor/scs/CITATION.cff +39 -0
  10. data/vendor/scs/CMakeLists.txt +272 -0
  11. data/vendor/scs/Makefile +24 -15
  12. data/vendor/scs/README.md +8 -216
  13. data/vendor/scs/include/aa.h +67 -23
  14. data/vendor/scs/include/cones.h +17 -17
  15. data/vendor/scs/include/glbopts.h +98 -32
  16. data/vendor/scs/include/linalg.h +2 -4
  17. data/vendor/scs/include/linsys.h +58 -44
  18. data/vendor/scs/include/normalize.h +3 -3
  19. data/vendor/scs/include/rw.h +8 -2
  20. data/vendor/scs/include/scs.h +293 -133
  21. data/vendor/scs/include/util.h +3 -15
  22. data/vendor/scs/linsys/cpu/direct/private.c +220 -224
  23. data/vendor/scs/linsys/cpu/direct/private.h +13 -7
  24. data/vendor/scs/linsys/cpu/direct/private.o +0 -0
  25. data/vendor/scs/linsys/cpu/indirect/private.c +177 -110
  26. data/vendor/scs/linsys/cpu/indirect/private.h +8 -4
  27. data/vendor/scs/linsys/cpu/indirect/private.o +0 -0
  28. data/vendor/scs/linsys/csparse.c +87 -0
  29. data/vendor/scs/linsys/csparse.h +34 -0
  30. data/vendor/scs/linsys/csparse.o +0 -0
  31. data/vendor/scs/linsys/external/amd/SuiteSparse_config.c +1 -1
  32. data/vendor/scs/linsys/external/amd/SuiteSparse_config.o +0 -0
  33. data/vendor/scs/linsys/external/amd/amd_1.o +0 -0
  34. data/vendor/scs/linsys/external/amd/amd_2.o +0 -0
  35. data/vendor/scs/linsys/external/amd/amd_aat.o +0 -0
  36. data/vendor/scs/linsys/external/amd/amd_control.o +0 -0
  37. data/vendor/scs/linsys/external/amd/amd_defaults.o +0 -0
  38. data/vendor/scs/linsys/external/amd/amd_dump.o +0 -0
  39. data/vendor/scs/linsys/external/amd/amd_global.o +0 -0
  40. data/vendor/scs/linsys/external/amd/amd_info.o +0 -0
  41. data/vendor/scs/linsys/external/amd/amd_internal.h +1 -1
  42. data/vendor/scs/linsys/external/amd/amd_order.o +0 -0
  43. data/vendor/scs/linsys/external/amd/amd_post_tree.o +0 -0
  44. data/vendor/scs/linsys/external/amd/amd_postorder.o +0 -0
  45. data/vendor/scs/linsys/external/amd/amd_preprocess.o +0 -0
  46. data/vendor/scs/linsys/external/amd/amd_valid.o +0 -0
  47. data/vendor/scs/linsys/external/qdldl/changes +2 -0
  48. data/vendor/scs/linsys/external/qdldl/qdldl.c +29 -46
  49. data/vendor/scs/linsys/external/qdldl/qdldl.h +33 -41
  50. data/vendor/scs/linsys/external/qdldl/qdldl.o +0 -0
  51. data/vendor/scs/linsys/external/qdldl/qdldl_types.h +11 -3
  52. data/vendor/scs/linsys/gpu/gpu.c +58 -21
  53. data/vendor/scs/linsys/gpu/gpu.h +66 -28
  54. data/vendor/scs/linsys/gpu/indirect/private.c +368 -154
  55. data/vendor/scs/linsys/gpu/indirect/private.h +26 -12
  56. data/vendor/scs/linsys/scs_matrix.c +498 -0
  57. data/vendor/scs/linsys/scs_matrix.h +70 -0
  58. data/vendor/scs/linsys/scs_matrix.o +0 -0
  59. data/vendor/scs/scs.mk +13 -9
  60. data/vendor/scs/src/aa.c +384 -109
  61. data/vendor/scs/src/aa.o +0 -0
  62. data/vendor/scs/src/cones.c +440 -353
  63. data/vendor/scs/src/cones.o +0 -0
  64. data/vendor/scs/src/ctrlc.c +15 -5
  65. data/vendor/scs/src/ctrlc.o +0 -0
  66. data/vendor/scs/src/linalg.c +84 -28
  67. data/vendor/scs/src/linalg.o +0 -0
  68. data/vendor/scs/src/normalize.c +22 -64
  69. data/vendor/scs/src/normalize.o +0 -0
  70. data/vendor/scs/src/rw.c +161 -22
  71. data/vendor/scs/src/rw.o +0 -0
  72. data/vendor/scs/src/scs.c +768 -561
  73. data/vendor/scs/src/scs.o +0 -0
  74. data/vendor/scs/src/scs_indir.o +0 -0
  75. data/vendor/scs/src/scs_version.c +9 -3
  76. data/vendor/scs/src/scs_version.o +0 -0
  77. data/vendor/scs/src/util.c +37 -106
  78. data/vendor/scs/src/util.o +0 -0
  79. data/vendor/scs/test/minunit.h +17 -8
  80. data/vendor/scs/test/problem_utils.h +176 -14
  81. data/vendor/scs/test/problems/degenerate.h +130 -0
  82. data/vendor/scs/test/problems/hs21_tiny_qp.h +124 -0
  83. data/vendor/scs/test/problems/hs21_tiny_qp_rw.h +116 -0
  84. data/vendor/scs/test/problems/infeasible_tiny_qp.h +100 -0
  85. data/vendor/scs/test/problems/qafiro_tiny_qp.h +199 -0
  86. data/vendor/scs/test/problems/random_prob +0 -0
  87. data/vendor/scs/test/problems/random_prob.h +45 -0
  88. data/vendor/scs/test/problems/rob_gauss_cov_est.h +188 -31
  89. data/vendor/scs/test/problems/small_lp.h +13 -14
  90. data/vendor/scs/test/problems/test_fails.h +43 -0
  91. data/vendor/scs/test/problems/unbounded_tiny_qp.h +82 -0
  92. data/vendor/scs/test/random_socp_prob.c +54 -53
  93. data/vendor/scs/test/rng.h +109 -0
  94. data/vendor/scs/test/run_from_file.c +19 -10
  95. data/vendor/scs/test/run_tests.c +27 -3
  96. metadata +30 -73
  97. data/ext/scs/Rakefile +0 -11
  98. data/vendor/scs/linsys/amatrix.c +0 -305
  99. data/vendor/scs/linsys/amatrix.h +0 -36
  100. data/vendor/scs/linsys/amatrix.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
@@ -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
- /* Initialize Anderson Acceleration, allocates memory.
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
- * 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
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
- AaWork *aa_init(aa_int dim, aa_int aa_mem, aa_int type1);
62
+ aa_float aa_apply(aa_float *f, const aa_float *x, AaWork *a);
29
63
 
30
- /* Apply Anderson Acceleration.
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
- * 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
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 aa_apply(aa_float *f, const aa_float *x, AaWork *a);
77
+ aa_int aa_safeguard(aa_float *f_new, aa_float *x_new, AaWork *a);
41
78
 
42
- /* Finish Anderson Acceleration, clears memory.
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
- #define MAX_AA_NRM (1e4)
50
-
51
- #define MIN(a, b) (((a) < (b)) ? (a) : (b))
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
  }
@@ -11,34 +11,34 @@ extern "C" {
11
11
 
12
12
  /* private data to help cone projection step */
13
13
  struct SCS_CONE_WORK {
14
- scs_float total_cone_time;
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 *iwork, lwork, liwork;
26
+ blas_int lwork;
19
27
  #endif
20
28
  };
21
29
 
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);
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
- const scs_float *warm_start, scs_int iter);
37
+ scs_int normalize);
40
38
  void SCS(finish_cone)(ScsConeWork *c);
41
- char *SCS(get_cone_summary)(const ScsInfo *info, ScsConeWork *c);
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
- ("2.1.2") /* string literals automatically null-terminated */
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 (5000)
32
- #define EPS (1E-5)
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-3)
35
- #define SCALE (1.0)
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
- #include <stdlib.h>
54
- #define scs_printf(...) \
55
- { \
56
- PyGILState_STATE gilstate = PyGILState_Ensure(); \
57
- PySys_WriteStdout(__VA_ARGS__); \
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
- #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))
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
- #ifdef _WIN64
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 EXTRA_VERBOSE > 0
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 (100)
195
+ #define PRINT_INTERVAL (250)
165
196
  /* 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.)
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
  }
@@ -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(norm)(const scs_float *v, scs_int len);
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);
@@ -7,55 +7,69 @@ extern "C" {
7
7
 
8
8
  #include "scs.h"
9
9
 
10
- /* YOUR LINEAR SYSTEM SOLVER MUST IMPLEMENT THESE METHODS AND SCS_LIN_SYS_WORK
11
- * STRUCT */
10
+ /* This is the API that any new linear system solver must implement */
12
11
 
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);
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
- /* 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);
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
- /* returns negative num if input data is invalid */
32
- scs_int SCS(validate_lin_sys)(const ScsMatrix *A);
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
- /* 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);
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
- /* 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);
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(normalize_b_c)(ScsWork *w);
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
  }
@@ -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
- scs_int SCS(read_data)(const char * filename, ScsData **d, ScsCone **k);
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
  }