scs 0.3.2 → 0.4.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 +6 -0
- data/README.md +34 -5
- data/lib/scs/matrix.rb +72 -0
- data/lib/scs/solver.rb +19 -26
- data/lib/scs/version.rb +1 -1
- data/lib/scs.rb +1 -0
- data/vendor/scs/CITATION.cff +1 -1
- data/vendor/scs/CMakeLists.txt +2 -2
- data/vendor/scs/README.md +3 -1
- data/vendor/scs/include/cones.h +5 -3
- data/vendor/scs/include/glbopts.h +4 -5
- data/vendor/scs/include/normalize.h +1 -0
- data/vendor/scs/include/rw.h +3 -3
- data/vendor/scs/include/scs.h +45 -22
- data/vendor/scs/include/scs_work.h +15 -18
- data/vendor/scs/include/util.h +3 -1
- data/vendor/scs/linsys/external/amd/LICENSE.txt +0 -897
- data/vendor/scs/linsys/external/amd/SuiteSparse_config.c +4 -2
- data/vendor/scs/linsys/external/amd/SuiteSparse_config.h +0 -5
- data/vendor/scs/linsys/scs_matrix.c +38 -67
- data/vendor/scs/linsys/scs_matrix.h +4 -3
- data/vendor/scs/scs.mk +0 -4
- data/vendor/scs/src/aa.c +0 -4
- data/vendor/scs/src/cones.c +63 -25
- data/vendor/scs/src/normalize.c +49 -0
- data/vendor/scs/src/rw.c +48 -40
- data/vendor/scs/src/scs.c +212 -170
- data/vendor/scs/src/util.c +26 -12
- data/vendor/scs/test/problem_utils.h +3 -3
- data/vendor/scs/test/problems/degenerate.h +1 -0
- data/vendor/scs/test/problems/hs21_tiny_qp.h +1 -0
- data/vendor/scs/test/problems/hs21_tiny_qp_rw.h +5 -1
- data/vendor/scs/test/problems/infeasible_tiny_qp.h +1 -0
- data/vendor/scs/test/problems/qafiro_tiny_qp.h +2 -1
- data/vendor/scs/test/problems/random_prob.h +5 -1
- data/vendor/scs/test/problems/rob_gauss_cov_est.h +8 -1
- data/vendor/scs/test/problems/small_lp.h +4 -1
- data/vendor/scs/test/problems/small_qp.h +42 -7
- data/vendor/scs/test/problems/test_validation.h +4 -1
- data/vendor/scs/test/problems/unbounded_tiny_qp.h +3 -3
- data/vendor/scs/test/random_socp_prob.c +3 -1
- data/vendor/scs/test/run_from_file.c +15 -3
- metadata +5 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2afa78c52786f5325f64a76edb263b4d30dabab7b15a9415375ed57af861669c
|
4
|
+
data.tar.gz: ae105845b96b30fab4a24bdf3eb2c1f80db7b12d635716ac3c4acfdb17930783
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b8bc74c496d1661b5f14e6da33c79987502d4c320c6789e4cd2d7a4bf118a8800978dc0cd0989f2f9d38978a9d27e14c37d47f8b6bb63ced36af97fee753f5e0
|
7
|
+
data.tar.gz: 5282b6cd3e7f7ed98423ef61eabb1275ce17bdb7b497fab9f7537c53cf7be154d3f1029a170c2c6562bb35780ebceca075e8ca12cd81af163bb7824bb2e91a27
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -18,11 +18,16 @@ If installation fails, you may need to install [dependencies](#dependencies).
|
|
18
18
|
|
19
19
|
## Getting Started
|
20
20
|
|
21
|
-
Prep the problem
|
21
|
+
Prep the problem, like [this one](https://www.cvxgrp.org/scs/examples/python/basic_qp.html)
|
22
22
|
|
23
23
|
```ruby
|
24
|
-
data = {
|
25
|
-
|
24
|
+
data = {
|
25
|
+
p: SCS::Matrix.from_dense([[3, -1], [-1, 2]]),
|
26
|
+
a: SCS::Matrix.from_dense([[-1, 1], [1, 0], [0, 1]]),
|
27
|
+
b: [-1, 0.3, -0.5],
|
28
|
+
c: [-1, -1]
|
29
|
+
}
|
30
|
+
cone = {z: 1, l: 2}
|
26
31
|
```
|
27
32
|
|
28
33
|
And solve it
|
@@ -32,12 +37,36 @@ solver = SCS::Solver.new
|
|
32
37
|
solver.solve(data, cone)
|
33
38
|
```
|
34
39
|
|
40
|
+
## Data
|
41
|
+
|
42
|
+
Matrices can be a sparse matrix
|
43
|
+
|
44
|
+
```ruby
|
45
|
+
a = SCS::Matrix.new(3, 2)
|
46
|
+
a[0, 0] = 1
|
47
|
+
a[1, 0] = 2
|
48
|
+
# or
|
49
|
+
SCS::Matrix.from_dense([[1, 0], [2, 0], [0, 0]])
|
50
|
+
```
|
51
|
+
|
52
|
+
Arrays can be Ruby arrays
|
53
|
+
|
54
|
+
```ruby
|
55
|
+
[1, 2, 3]
|
56
|
+
```
|
57
|
+
|
58
|
+
Or Numo arrays
|
59
|
+
|
60
|
+
```ruby
|
61
|
+
Numo::NArray.cast([1, 2, 3])
|
62
|
+
```
|
63
|
+
|
35
64
|
## Settings
|
36
65
|
|
37
66
|
Default values shown
|
38
67
|
|
39
68
|
```ruby
|
40
|
-
solver.solve(data, cone,
|
69
|
+
solver.solve(data, cone,
|
41
70
|
normalize: true, # heuristic data rescaling
|
42
71
|
scale: 0.1, # if normalized, rescales by this factor
|
43
72
|
adaptive_scale: true, # heuristically adapt dual scale through the solve
|
@@ -54,7 +83,7 @@ solver.solve(data, cone, {
|
|
54
83
|
acceleration_interval: 10, # iterations to run Anderson acceleration
|
55
84
|
write_data_filename: nil, # filename to write data if set
|
56
85
|
log_csv_filename: nil # write csv logs of various quantities
|
57
|
-
|
86
|
+
)
|
58
87
|
```
|
59
88
|
|
60
89
|
## Direct vs Indirect
|
data/lib/scs/matrix.rb
ADDED
@@ -0,0 +1,72 @@
|
|
1
|
+
module SCS
|
2
|
+
class Matrix
|
3
|
+
attr_reader :m, :n
|
4
|
+
|
5
|
+
def initialize(m, n)
|
6
|
+
@m = m
|
7
|
+
@n = n
|
8
|
+
@data = {}
|
9
|
+
end
|
10
|
+
|
11
|
+
def []=(row_index, column_index, value)
|
12
|
+
raise IndexError, "row index out of bounds" if row_index < 0 || row_index >= @m
|
13
|
+
raise IndexError, "column index out of bounds" if column_index < 0 || column_index >= @n
|
14
|
+
# dictionary of keys, optimized for converting to CSC
|
15
|
+
# TODO try COO for performance
|
16
|
+
if value == 0
|
17
|
+
(@data[column_index] ||= {}).delete(row_index)
|
18
|
+
else
|
19
|
+
(@data[column_index] ||= {})[row_index] = value
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def to_csc
|
24
|
+
cx = []
|
25
|
+
ci = []
|
26
|
+
cp = []
|
27
|
+
|
28
|
+
# CSC format
|
29
|
+
# https://www.gormanalysis.com/blog/sparse-matrix-storage-formats/
|
30
|
+
cp << 0
|
31
|
+
n.times do |j|
|
32
|
+
(@data[j] || {}).sort_by { |k, v| k }.each do |k, v|
|
33
|
+
cx << v
|
34
|
+
ci << k
|
35
|
+
end
|
36
|
+
# cumulative column values
|
37
|
+
cp << cx.size
|
38
|
+
end
|
39
|
+
|
40
|
+
{
|
41
|
+
start: cp,
|
42
|
+
index: ci,
|
43
|
+
value: cx
|
44
|
+
}
|
45
|
+
end
|
46
|
+
|
47
|
+
# private, for tests
|
48
|
+
def nnz
|
49
|
+
@data.sum { |_, v| v.count }
|
50
|
+
end
|
51
|
+
|
52
|
+
def initialize_copy(other)
|
53
|
+
super
|
54
|
+
@data = @data.transform_values(&:dup)
|
55
|
+
end
|
56
|
+
|
57
|
+
def self.from_dense(data)
|
58
|
+
data = data.to_a
|
59
|
+
m = data.size
|
60
|
+
n = m > 0 ? data.first.size : 0
|
61
|
+
|
62
|
+
mtx = Matrix.new(m, n)
|
63
|
+
data.each_with_index do |row, i|
|
64
|
+
raise ArgumentError, "row has different number of columns" if row.size != n
|
65
|
+
row.each_with_index do |v, j|
|
66
|
+
mtx[i, j] = v if v != 0
|
67
|
+
end
|
68
|
+
end
|
69
|
+
mtx
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
data/lib/scs/solver.rb
CHANGED
@@ -73,42 +73,35 @@ module SCS
|
|
73
73
|
char_ptr[0, idx].map(&:chr).join
|
74
74
|
end
|
75
75
|
|
76
|
-
# TODO add support sparse matrices
|
77
76
|
def csc_matrix(mtx, upper: false)
|
78
|
-
mtx = mtx.
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
# CSC format
|
87
|
-
# https://www.gormanalysis.com/blog/sparse-matrix-storage-formats/
|
88
|
-
cp << 0
|
89
|
-
n.times do |j|
|
90
|
-
mtx.each_with_index do |row, i|
|
91
|
-
if row[j] != 0 && (!upper || i <= j)
|
92
|
-
cx << row[j]
|
93
|
-
ci << i
|
77
|
+
mtx = Matrix.from_dense(mtx) unless mtx.is_a?(Matrix)
|
78
|
+
|
79
|
+
if upper
|
80
|
+
# TODO improve performance
|
81
|
+
mtx = mtx.dup
|
82
|
+
mtx.m.times do |i|
|
83
|
+
mtx.n.times do |j|
|
84
|
+
mtx[i, j] = 0 if i > j
|
94
85
|
end
|
95
86
|
end
|
96
|
-
# cumulative column values
|
97
|
-
cp << cx.size
|
98
87
|
end
|
99
88
|
|
89
|
+
csc = mtx.to_csc
|
90
|
+
|
100
91
|
# construct matrix
|
101
92
|
matrix = ffi::Matrix.malloc
|
102
|
-
matrix.x = float_array(
|
103
|
-
matrix.i = int_array(
|
104
|
-
matrix.p = int_array(
|
105
|
-
matrix.m = m
|
106
|
-
matrix.n = n
|
93
|
+
matrix.x = float_array(csc[:value])
|
94
|
+
matrix.i = int_array(csc[:index])
|
95
|
+
matrix.p = int_array(csc[:start])
|
96
|
+
matrix.m = mtx.m
|
97
|
+
matrix.n = mtx.n
|
107
98
|
matrix
|
108
99
|
end
|
109
100
|
|
110
101
|
def shape(a)
|
111
|
-
if
|
102
|
+
if a.is_a?(Matrix)
|
103
|
+
[a.m, a.n]
|
104
|
+
elsif defined?(::Matrix) && a.is_a?(::Matrix)
|
112
105
|
[a.row_count, a.column_count]
|
113
106
|
elsif defined?(Numo::NArray) && a.is_a?(Numo::NArray)
|
114
107
|
a.shape
|
@@ -126,7 +119,7 @@ module SCS
|
|
126
119
|
|
127
120
|
if data[:p]
|
128
121
|
raise ArgumentError, "Bad p shape" if shape(data[:p]) != [n, n]
|
129
|
-
cdata.p = csc_matrix(data[:p])
|
122
|
+
cdata.p = csc_matrix(data[:p], upper: true)
|
130
123
|
end
|
131
124
|
|
132
125
|
raise ArgumentError, "Bad b size" if data[:b].to_a.size != m
|
data/lib/scs/version.rb
CHANGED
data/lib/scs.rb
CHANGED
data/vendor/scs/CITATION.cff
CHANGED
data/vendor/scs/CMakeLists.txt
CHANGED
@@ -5,7 +5,7 @@ cmake_minimum_required(VERSION 3.5)
|
|
5
5
|
|
6
6
|
project(scs
|
7
7
|
LANGUAGES C
|
8
|
-
VERSION 3.
|
8
|
+
VERSION 3.2.0)
|
9
9
|
|
10
10
|
# Defines the CMAKE_INSTALL_LIBDIR, CMAKE_INSTALL_BINDIR and many other useful macros.
|
11
11
|
# See https://cmake.org/cmake/help/latest/module/GNUInstallDirs.html
|
@@ -110,7 +110,7 @@ option(DLONG "Use long integers (64bit) for indexing" OFF)
|
|
110
110
|
message(STATUS "Long integers (64bit) are ${DLONG}")
|
111
111
|
|
112
112
|
|
113
|
-
set(COMPILER_OPTS "-DUSE_LAPACK -
|
113
|
+
set(COMPILER_OPTS "-DUSE_LAPACK -DCTRLC")
|
114
114
|
|
115
115
|
# Primitive types
|
116
116
|
if(SFLOAT)
|
data/vendor/scs/README.md
CHANGED
@@ -8,6 +8,8 @@
|
|
8
8
|
|
9
9
|
|
10
10
|
SCS (`splitting conic solver`) is a numerical optimization package for solving
|
11
|
-
large-scale convex cone problems. The current version is `3.
|
11
|
+
large-scale convex cone problems. The current version is `3.2.0`.
|
12
12
|
|
13
13
|
The full documentation is available [here](https://www.cvxgrp.org/scs/).
|
14
|
+
|
15
|
+
If you wish to cite SCS please cite the papers listed [here](https://www.cvxgrp.org/scs/citing).
|
data/vendor/scs/include/cones.h
CHANGED
@@ -18,14 +18,14 @@ struct SCS_CONE_WORK {
|
|
18
18
|
* cone boundaries, boundaries[0] is starting index for cones of size larger
|
19
19
|
* than 1
|
20
20
|
*/
|
21
|
-
|
21
|
+
ScsCone *k; /* original cone information */
|
22
22
|
scs_int *cone_boundaries;
|
23
23
|
scs_int cone_boundaries_len;
|
24
24
|
scs_int scaled_cones; /* boolean, whether the cones have been scaled */
|
25
25
|
scs_float *s; /* used for Moreau decomposition in projection */
|
26
26
|
scs_int m; /* total length of cone */
|
27
27
|
/* box cone quantities */
|
28
|
-
scs_float
|
28
|
+
scs_float box_t_warm_start;
|
29
29
|
#ifdef USE_LAPACK
|
30
30
|
/* workspace for eigenvector decompositions: */
|
31
31
|
scs_float *Xs, *Z, *e, *work;
|
@@ -33,7 +33,9 @@ struct SCS_CONE_WORK {
|
|
33
33
|
#endif
|
34
34
|
};
|
35
35
|
|
36
|
-
|
36
|
+
void SCS(free_cone)(ScsCone *k);
|
37
|
+
void SCS(deep_copy_cone)(ScsCone *dest, const ScsCone *src);
|
38
|
+
ScsConeWork *SCS(init_cone)(ScsCone *k, scs_int m);
|
37
39
|
char *SCS(get_cone_header)(const ScsCone *k);
|
38
40
|
scs_int SCS(validate_cones)(const ScsData *d, const ScsCone *k);
|
39
41
|
scs_int SCS(proj_dual_cone)(scs_float *x, ScsConeWork *c, ScsScaling *scal,
|
@@ -14,7 +14,7 @@ extern "C" {
|
|
14
14
|
|
15
15
|
/* SCS VERSION NUMBER ---------------------------------------------- */
|
16
16
|
/* string literals automatically null-terminated */
|
17
|
-
#define SCS_VERSION ("3.
|
17
|
+
#define SCS_VERSION ("3.2.0")
|
18
18
|
|
19
19
|
/* verbosity level */
|
20
20
|
#ifndef VERBOSITY
|
@@ -49,6 +49,9 @@ extern "C" {
|
|
49
49
|
#define scs_realloc mxRealloc
|
50
50
|
#elif defined PYTHON
|
51
51
|
#include <Python.h>
|
52
|
+
/* see:
|
53
|
+
* https://cython-users.narkive.com/jRjjs3sK/reacquire-gil-for-printing-in-wrapped-c-library
|
54
|
+
*/
|
52
55
|
#define scs_printf(...) \
|
53
56
|
{ \
|
54
57
|
PyGILState_STATE gilstate = PyGILState_Ensure(); \
|
@@ -60,8 +63,6 @@ extern "C" {
|
|
60
63
|
#define scs_malloc PyMem_RawMalloc
|
61
64
|
#define scs_realloc PyMem_RawRealloc
|
62
65
|
#define scs_calloc PyMem_RawCalloc
|
63
|
-
/* only for SuiteSparse + python */
|
64
|
-
#define _scs_printf PySys_WriteStdout
|
65
66
|
#else
|
66
67
|
#define scs_free PyMem_Free
|
67
68
|
#define scs_malloc PyMem_Malloc
|
@@ -107,8 +108,6 @@ static inline void *scs_calloc(size_t count, size_t size) {
|
|
107
108
|
#endif
|
108
109
|
#endif
|
109
110
|
|
110
|
-
#define SCS_NULL 0
|
111
|
-
|
112
111
|
#ifndef MAX
|
113
112
|
#define MAX(a, b) (((a) > (b)) ? (a) : (b))
|
114
113
|
#endif
|
@@ -8,6 +8,7 @@ extern "C" {
|
|
8
8
|
#include "glbopts.h"
|
9
9
|
#include "scs_work.h"
|
10
10
|
|
11
|
+
void SCS(normalize_b_c)(ScsScaling *scal, scs_float *b, scs_float *c);
|
11
12
|
void SCS(normalize_sol)(ScsScaling *scal, ScsSolution *sol);
|
12
13
|
void SCS(un_normalize_sol)(ScsScaling *scal, ScsSolution *sol);
|
13
14
|
void SCS(un_normalize_primal)(ScsScaling *scal, scs_float *r);
|
data/vendor/scs/include/rw.h
CHANGED
@@ -13,9 +13,9 @@ void SCS(write_data)(const ScsData *d, const ScsCone *k,
|
|
13
13
|
const ScsSettings *stgs);
|
14
14
|
scs_int SCS(read_data)(const char *filename, ScsData **d, ScsCone **k,
|
15
15
|
ScsSettings **stgs);
|
16
|
-
void SCS(log_data_to_csv)(const
|
17
|
-
const
|
18
|
-
|
16
|
+
void SCS(log_data_to_csv)(const ScsCone *k, const ScsSettings *stgs,
|
17
|
+
const ScsWork *w, scs_int iter,
|
18
|
+
SCS(timer) * solve_timer);
|
19
19
|
|
20
20
|
#ifdef __cplusplus
|
21
21
|
}
|
data/vendor/scs/include/scs.h
CHANGED
@@ -11,6 +11,8 @@ extern "C" {
|
|
11
11
|
/* Contains definitions of primitive types `scs_int` and `scs_float`. */
|
12
12
|
#include "scs_types.h"
|
13
13
|
|
14
|
+
#define SCS_NULL 0 /* NULL type */
|
15
|
+
|
14
16
|
/* The following abstract structs are implemented later. */
|
15
17
|
|
16
18
|
/** Struct containing acceleration workspace. Implemented by acceleration. */
|
@@ -116,11 +118,11 @@ typedef struct {
|
|
116
118
|
scs_float *bl;
|
117
119
|
/** Total length of box cone (includes scale `t`). */
|
118
120
|
scs_int bsize;
|
119
|
-
/** Array of second-order cone constraints
|
121
|
+
/** Array of second-order cone constraints, `len(q) = qsize`. */
|
120
122
|
scs_int *q;
|
121
123
|
/** Length of second-order cone array `q`. */
|
122
124
|
scs_int qsize;
|
123
|
-
/** Array of semidefinite cone constraints
|
125
|
+
/** Array of semidefinite cone constraints, `len(s) = ssize`. */
|
124
126
|
scs_int *s;
|
125
127
|
/** Length of semidefinite constraints array `s`. */
|
126
128
|
scs_int ssize;
|
@@ -129,7 +131,7 @@ typedef struct {
|
|
129
131
|
/** Number of dual exponential cone triples. */
|
130
132
|
scs_int ed;
|
131
133
|
/** Array of power cone params, must be in `[-1, 1]`, negative values are
|
132
|
-
* interpreted as specifying the dual cone
|
134
|
+
* interpreted as specifying the dual cone, `len(p) = psize ` */
|
133
135
|
scs_float *p;
|
134
136
|
/** Number of (primal and dual) power cone triples. */
|
135
137
|
scs_int psize;
|
@@ -205,7 +207,9 @@ typedef struct {
|
|
205
207
|
/**
|
206
208
|
* Initialize SCS and allocate memory.
|
207
209
|
*
|
208
|
-
* All the inputs must be already allocated in memory before calling.
|
210
|
+
* All the inputs must be already allocated in memory before calling. After
|
211
|
+
* this function returns then the memory associated with `d`, `k`, and `stgs`
|
212
|
+
* can be freed as SCS maintains deep copies of these internally.
|
209
213
|
*
|
210
214
|
* It performs:
|
211
215
|
* - data and settings validation
|
@@ -213,26 +217,45 @@ typedef struct {
|
|
213
217
|
* - automatic parameters tuning (if enabled)
|
214
218
|
* - setup linear system solver:
|
215
219
|
* - direct solver: KKT matrix factorization is performed here
|
216
|
-
* - indirect solver: KKT matrix preconditioning is performed here
|
217
|
-
* - solve the linear system for the `r` vector in the paper.
|
220
|
+
* - indirect solver: KKT matrix preconditioning is performed here.
|
218
221
|
*
|
219
222
|
*
|
220
|
-
* @param d
|
221
|
-
* @param k
|
222
|
-
* @param stgs
|
223
|
-
* @return
|
223
|
+
* @param d Problem data.
|
224
|
+
* @param k Cone data.
|
225
|
+
* @param stgs SCS solve settings.
|
226
|
+
* @return Solver workspace.
|
224
227
|
*/
|
225
228
|
ScsWork *scs_init(const ScsData *d, const ScsCone *k, const ScsSettings *stgs);
|
226
229
|
|
230
|
+
/**
|
231
|
+
* Update the `b` vector, `c` vector, or both, before another solve call.
|
232
|
+
*
|
233
|
+
* After a solve we can reuse the SCS workspace in another solve if the only
|
234
|
+
* problem data that has changed are the `b` and `c` vectors.
|
235
|
+
*
|
236
|
+
* @param w SCS workspace from scs_init (modified in-place).
|
237
|
+
* @param b New `b` vector (can be `SCS_NULL` if unchanged).
|
238
|
+
* @param c New `c` vector (can be `SCS_NULL` if unchanged).
|
239
|
+
*
|
240
|
+
* @return 0 if update successful.
|
241
|
+
*/
|
242
|
+
scs_int scs_update(ScsWork *w, scs_float *b, scs_float *c);
|
243
|
+
|
227
244
|
/**
|
228
245
|
* Solve quadratic cone program initialized by scs_init.
|
229
246
|
*
|
230
|
-
* @param w
|
231
|
-
* @param sol
|
232
|
-
*
|
247
|
+
* @param w Workspace allocated by scs_init.
|
248
|
+
* @param sol Solution will be stored here. If members `x`, `y`, `s`
|
249
|
+
* are NULL then SCS will allocate memory for them which
|
250
|
+
* must be freed by the caller.
|
251
|
+
* @param info Information about the solve will be stored here.
|
252
|
+
* @param warm_start Whether to use the entries of `sol` as warm-start for
|
253
|
+
* the solve.
|
254
|
+
*
|
233
255
|
* @return Flag containing problem status (see \a glbopts.h).
|
234
256
|
*/
|
235
|
-
scs_int scs_solve(ScsWork *w, ScsSolution *sol, ScsInfo *info
|
257
|
+
scs_int scs_solve(ScsWork *w, ScsSolution *sol, ScsInfo *info,
|
258
|
+
scs_int warm_start);
|
236
259
|
|
237
260
|
/**
|
238
261
|
* Clean up allocated SCS workspace.
|
@@ -246,13 +269,13 @@ void scs_finish(ScsWork *w);
|
|
246
269
|
*
|
247
270
|
* All the inputs must already be allocated in memory before calling.
|
248
271
|
*
|
249
|
-
* @param d
|
250
|
-
* @param k
|
251
|
-
* @param stgs
|
252
|
-
* @param sol
|
253
|
-
*
|
254
|
-
* @param info
|
255
|
-
* @return
|
272
|
+
* @param d Problem data.
|
273
|
+
* @param k Cone data.
|
274
|
+
* @param stgs SCS solver settings.
|
275
|
+
* @param sol Solution will be stored here. If members `x`, `y`, `s` are
|
276
|
+
* NULL then SCS will allocate memory for them.
|
277
|
+
* @param info Information about the solve will be stored here.
|
278
|
+
* @return Flag containing problem status (see \a glbopts.h).
|
256
279
|
*/
|
257
280
|
scs_int scs(const ScsData *d, const ScsCone *k, const ScsSettings *stgs,
|
258
281
|
ScsSolution *sol, ScsInfo *info);
|
@@ -260,7 +283,7 @@ scs_int scs(const ScsData *d, const ScsCone *k, const ScsSettings *stgs,
|
|
260
283
|
/**
|
261
284
|
* Helper function to set all settings to default values (see \a glbopts.h).
|
262
285
|
*
|
263
|
-
* @param stgs
|
286
|
+
* @param stgs Settings struct that will be populated.
|
264
287
|
*/
|
265
288
|
void scs_set_default_settings(ScsSettings *stgs);
|
266
289
|
|
@@ -9,6 +9,8 @@
|
|
9
9
|
extern "C" {
|
10
10
|
#endif
|
11
11
|
|
12
|
+
#include "scs.h"
|
13
|
+
|
12
14
|
/** Contains normalization variables. */
|
13
15
|
typedef struct {
|
14
16
|
scs_float *D, *E; /* for normalization */
|
@@ -40,10 +42,11 @@ typedef struct {
|
|
40
42
|
scs_float *ax, *ax_s, *px, *aty, *ax_s_btau, *px_aty_ctau;
|
41
43
|
} ScsResiduals;
|
42
44
|
|
43
|
-
/** Workspace for SCS */
|
45
|
+
/** Workspace for SCS. */
|
44
46
|
struct SCS_WORK {
|
45
47
|
/* x_prev = x from previous iteration */
|
46
|
-
|
48
|
+
scs_float setup_time; /* time taken for setup phase (milliseconds) */
|
49
|
+
scs_int time_limit_reached; /* boolean, if the time-limit is reached */
|
47
50
|
scs_float *u, *u_t;
|
48
51
|
scs_float *v, *v_prev;
|
49
52
|
scs_float *rsk; /* rsk [ r; s; kappa ] */
|
@@ -51,30 +54,24 @@ struct SCS_WORK {
|
|
51
54
|
scs_float *g; /* g = (I + M)^{-1} h */
|
52
55
|
scs_float *lin_sys_warm_start; /* linear system warm-start (indirect only) */
|
53
56
|
scs_float *diag_r; /* vector of R matrix diagonals (affects cone proj) */
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
ScsConeWork *cone_work; /* workspace for the cone projection step */
|
57
|
+
scs_float *b_orig, *c_orig; /* original unnormalized b and c vectors */
|
58
|
+
AaWork *accel; /* struct for acceleration workspace */
|
59
|
+
ScsData *d; /* Problem data deep copy NORMALIZED */
|
60
|
+
ScsCone *k; /* Problem cone deep copy */
|
61
|
+
ScsSettings *stgs; /* contains solver settings specified by user */
|
62
|
+
ScsLinSysWork *p; /* struct populated by linear system solver */
|
63
|
+
ScsScaling *scal; /* contains the re-scaling data */
|
64
|
+
ScsConeWork *cone_work; /* workspace for the cone projection step */
|
63
65
|
/* normalized and unnormalized residuals */
|
64
66
|
ScsResiduals *r_orig, *r_normalized;
|
65
67
|
/* track x,y,s as alg progresses, tau *not* divided out */
|
66
68
|
ScsSolution *xys_orig, *xys_normalized;
|
67
|
-
/* updating
|
69
|
+
/* Scale updating workspace */
|
68
70
|
scs_float sum_log_scale_factor;
|
69
71
|
scs_int last_scale_update_iter, n_log_scale_factor, scale_updates;
|
70
|
-
/*
|
72
|
+
/* AA stats */
|
71
73
|
scs_float aa_norm;
|
72
74
|
scs_int rejected_accel_steps, accepted_accel_steps;
|
73
|
-
scs_float setup_time; /* time taken for setup phase (milliseconds) */
|
74
|
-
scs_float scale; /* current scale parameter */
|
75
|
-
const ScsData *d;
|
76
|
-
const ScsCone *k;
|
77
|
-
const ScsSettings *stgs; /* contains solver settings specified by user */
|
78
75
|
};
|
79
76
|
|
80
77
|
#ifdef __cplusplus
|
data/vendor/scs/include/util.h
CHANGED
@@ -45,7 +45,9 @@ typedef struct SCS(timer) {
|
|
45
45
|
void SCS(tic)(SCS(timer) * t);
|
46
46
|
scs_float SCS(tocq)(SCS(timer) * t);
|
47
47
|
void SCS(free_sol)(ScsSolution *sol);
|
48
|
-
void SCS(
|
48
|
+
void SCS(deep_copy_data)(ScsData *dest, const ScsData *src);
|
49
|
+
void SCS(deep_copy_stgs)(ScsSettings *dest, const ScsSettings *src);
|
50
|
+
void SCS(free_data)(ScsData *d);
|
49
51
|
|
50
52
|
#ifdef __cplusplus
|
51
53
|
}
|