scs 0.3.0 → 0.4.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 +14 -0
- data/README.md +42 -13
- data/lib/scs/ffi.rb +1 -7
- 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 +55 -7
- data/vendor/scs/Makefile +9 -9
- data/vendor/scs/README.md +4 -1
- data/vendor/scs/include/aa.h +1 -1
- data/vendor/scs/include/cones.h +17 -12
- data/vendor/scs/include/glbopts.h +27 -66
- data/vendor/scs/include/linalg.h +2 -1
- data/vendor/scs/include/linsys.h +13 -13
- data/vendor/scs/include/normalize.h +7 -5
- data/vendor/scs/include/rw.h +3 -3
- data/vendor/scs/include/scs.h +85 -106
- data/vendor/scs/include/scs_types.h +34 -0
- data/vendor/scs/include/scs_work.h +80 -0
- data/vendor/scs/include/util.h +3 -1
- data/vendor/scs/linsys/cpu/direct/private.c +86 -73
- data/vendor/scs/linsys/cpu/direct/private.h +2 -2
- data/vendor/scs/linsys/cpu/indirect/private.c +42 -33
- data/vendor/scs/linsys/cpu/indirect/private.h +1 -2
- data/vendor/scs/linsys/csparse.c +3 -3
- data/vendor/scs/linsys/external/amd/LICENSE.txt +0 -897
- data/vendor/scs/linsys/external/amd/SuiteSparse_config.c +9 -7
- data/vendor/scs/linsys/external/amd/SuiteSparse_config.h +1 -1
- data/vendor/scs/linsys/external/amd/amd_order.c +5 -5
- data/vendor/scs/linsys/gpu/gpu.h +8 -11
- data/vendor/scs/linsys/gpu/indirect/private.c +72 -49
- data/vendor/scs/linsys/gpu/indirect/private.h +14 -13
- data/vendor/scs/linsys/scs_matrix.c +55 -104
- data/vendor/scs/linsys/scs_matrix.h +5 -4
- data/vendor/scs/scs.mk +1 -5
- data/vendor/scs/src/aa.c +13 -8
- data/vendor/scs/src/cones.c +197 -108
- data/vendor/scs/src/linalg.c +25 -0
- data/vendor/scs/src/normalize.c +75 -26
- data/vendor/scs/src/rw.c +74 -30
- data/vendor/scs/src/scs.c +300 -264
- data/vendor/scs/src/scs_version.c +8 -6
- data/vendor/scs/src/util.c +27 -13
- data/vendor/scs/test/minunit.h +6 -1
- data/vendor/scs/test/problem_utils.h +28 -35
- data/vendor/scs/test/problems/degenerate.h +2 -1
- data/vendor/scs/test/problems/hs21_tiny_qp.h +2 -1
- data/vendor/scs/test/problems/hs21_tiny_qp_rw.h +6 -2
- data/vendor/scs/test/problems/infeasible_tiny_qp.h +2 -1
- data/vendor/scs/test/problems/qafiro_tiny_qp.h +5 -4
- data/vendor/scs/test/problems/random_prob.h +6 -2
- data/vendor/scs/test/problems/rob_gauss_cov_est.h +9 -2
- data/vendor/scs/test/problems/small_lp.h +7 -2
- data/vendor/scs/test/problems/small_qp.h +387 -0
- data/vendor/scs/test/problems/{test_fails.h → test_validation.h} +7 -4
- data/vendor/scs/test/problems/unbounded_tiny_qp.h +4 -4
- data/vendor/scs/test/random_socp_prob.c +4 -2
- data/vendor/scs/test/run_from_file.c +16 -4
- data/vendor/scs/test/run_tests.c +23 -14
- metadata +10 -35
- data/vendor/scs/linsys/cpu/direct/private.o +0 -0
- data/vendor/scs/linsys/cpu/indirect/private.o +0 -0
- data/vendor/scs/linsys/csparse.o +0 -0
- 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_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/qdldl.o +0 -0
- data/vendor/scs/linsys/scs_matrix.o +0 -0
- data/vendor/scs/src/aa.o +0 -0
- data/vendor/scs/src/cones.o +0 -0
- data/vendor/scs/src/ctrlc.o +0 -0
- data/vendor/scs/src/linalg.o +0 -0
- data/vendor/scs/src/normalize.o +0 -0
- data/vendor/scs/src/rw.o +0 -0
- data/vendor/scs/src/scs.o +0 -0
- data/vendor/scs/src/scs_indir.o +0 -0
- data/vendor/scs/src/scs_version.o +0 -0
- data/vendor/scs/src/util.o +0 -0
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
|
@@ -1,3 +1,17 @@
|
|
|
1
|
+
## 0.4.0 (2022-07-06)
|
|
2
|
+
|
|
3
|
+
- Updated SCS to 3.2.0
|
|
4
|
+
- Added `Matrix` class
|
|
5
|
+
- Dropped support for Ruby < 2.7
|
|
6
|
+
|
|
7
|
+
## 0.3.2 (2022-01-17)
|
|
8
|
+
|
|
9
|
+
- Updated SCS to 3.1.1
|
|
10
|
+
|
|
11
|
+
## 0.3.1 (2021-10-08)
|
|
12
|
+
|
|
13
|
+
- Fixed installation on Linux
|
|
14
|
+
|
|
1
15
|
## 0.3.0 (2021-10-05)
|
|
2
16
|
|
|
3
17
|
- Updated SCS to 3.0.0
|
data/README.md
CHANGED
|
@@ -1,28 +1,33 @@
|
|
|
1
|
-
# SCS
|
|
1
|
+
# SCS Ruby
|
|
2
2
|
|
|
3
3
|
[SCS](https://github.com/cvxgrp/scs) - the splitting conic solver - for Ruby
|
|
4
4
|
|
|
5
5
|
:fire: Supports many different [problem types](https://www.cvxpy.org/tutorial/advanced/index.html#choosing-a-solver)
|
|
6
6
|
|
|
7
|
-
[](https://github.com/ankane/scs/actions)
|
|
7
|
+
[](https://github.com/ankane/scs-ruby/actions)
|
|
8
8
|
|
|
9
9
|
## Installation
|
|
10
10
|
|
|
11
11
|
Add this line to your application’s Gemfile:
|
|
12
12
|
|
|
13
13
|
```ruby
|
|
14
|
-
gem
|
|
14
|
+
gem "scs"
|
|
15
15
|
```
|
|
16
16
|
|
|
17
17
|
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
|
|
@@ -81,22 +110,22 @@ On Heroku, use the [heroku-apt-buildpack](https://github.com/heroku/heroku-build
|
|
|
81
110
|
|
|
82
111
|
## History
|
|
83
112
|
|
|
84
|
-
View the [changelog](https://github.com/ankane/scs/blob/master/CHANGELOG.md)
|
|
113
|
+
View the [changelog](https://github.com/ankane/scs-ruby/blob/master/CHANGELOG.md)
|
|
85
114
|
|
|
86
115
|
## Contributing
|
|
87
116
|
|
|
88
117
|
Everyone is encouraged to help improve this project. Here are a few ways you can help:
|
|
89
118
|
|
|
90
|
-
- [Report bugs](https://github.com/ankane/scs/issues)
|
|
91
|
-
- Fix bugs and [submit pull requests](https://github.com/ankane/scs/pulls)
|
|
119
|
+
- [Report bugs](https://github.com/ankane/scs-ruby/issues)
|
|
120
|
+
- Fix bugs and [submit pull requests](https://github.com/ankane/scs-ruby/pulls)
|
|
92
121
|
- Write, clarify, or fix documentation
|
|
93
122
|
- Suggest or add new features
|
|
94
123
|
|
|
95
124
|
To get started with development:
|
|
96
125
|
|
|
97
126
|
```sh
|
|
98
|
-
git clone --recursive https://github.com/ankane/scs.git
|
|
99
|
-
cd scs
|
|
127
|
+
git clone --recursive https://github.com/ankane/scs-ruby.git
|
|
128
|
+
cd scs-ruby
|
|
100
129
|
bundle install
|
|
101
130
|
bundle exec rake compile
|
|
102
131
|
bundle exec rake test
|
data/lib/scs/ffi.rb
CHANGED
|
@@ -27,13 +27,6 @@ module SCS
|
|
|
27
27
|
|
|
28
28
|
dlload File.expand_path("../../vendor/scs/out/#{lib_name}.#{ext}", __dir__)
|
|
29
29
|
|
|
30
|
-
extern "size_t scs_sizeof_int(void)"
|
|
31
|
-
extern "size_t scs_sizeof_float(void)"
|
|
32
|
-
|
|
33
|
-
# TODO support other sizes
|
|
34
|
-
raise Error, "Unsupported int size" if scs_sizeof_int != 4
|
|
35
|
-
raise Error, "Unsupported float size" if scs_sizeof_float != 8
|
|
36
|
-
|
|
37
30
|
typealias "scs_float", "double"
|
|
38
31
|
typealias "scs_int", "int"
|
|
39
32
|
|
|
@@ -71,6 +64,7 @@ module SCS
|
|
|
71
64
|
m::Info = struct [
|
|
72
65
|
"scs_int iter",
|
|
73
66
|
"char status[128]",
|
|
67
|
+
"char lin_sys_solver[128]",
|
|
74
68
|
"scs_int status_val",
|
|
75
69
|
"scs_int scale_updates",
|
|
76
70
|
"scs_float pobj",
|
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 2.
|
|
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
|
|
@@ -88,6 +88,10 @@ if(BUILD_TESTING)
|
|
|
88
88
|
enable_testing()
|
|
89
89
|
endif()
|
|
90
90
|
|
|
91
|
+
# Add uninstall target
|
|
92
|
+
# After 'make install' can run 'make uninstall' to remove.
|
|
93
|
+
include(AddUninstallTarget)
|
|
94
|
+
|
|
91
95
|
### Some variables useful for sampling the building process
|
|
92
96
|
# Note that the GPU profile is not compiled.
|
|
93
97
|
set(LINSYS linsys)
|
|
@@ -95,6 +99,46 @@ set(DIRSRC ${LINSYS}/cpu/direct)
|
|
|
95
99
|
set(INDIRSRC ${LINSYS}/cpu/indirect)
|
|
96
100
|
set(EXTERNAL ${LINSYS}/external)
|
|
97
101
|
|
|
102
|
+
# Options
|
|
103
|
+
# ----------------------------------------------
|
|
104
|
+
# Use floats instead of doubles
|
|
105
|
+
option(SFLOAT "Use single precision floats rather than doubles" OFF)
|
|
106
|
+
message(STATUS "Single precision floats (32bit) are ${SFLOAT}")
|
|
107
|
+
|
|
108
|
+
# Use long integers for indexing
|
|
109
|
+
option(DLONG "Use long integers (64bit) for indexing" OFF)
|
|
110
|
+
message(STATUS "Long integers (64bit) are ${DLONG}")
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
set(COMPILER_OPTS "-DUSE_LAPACK -DCTRLC")
|
|
114
|
+
|
|
115
|
+
# Primitive types
|
|
116
|
+
if(SFLOAT)
|
|
117
|
+
set(SCS_FLOAT_TYPE "float")
|
|
118
|
+
set(COMPILER_OPTS "-DSFLOAT ${COMPILER_OPTS}")
|
|
119
|
+
else()
|
|
120
|
+
set(SCS_FLOAT_TYPE "double")
|
|
121
|
+
endif()
|
|
122
|
+
|
|
123
|
+
if(DLONG)
|
|
124
|
+
set(SCS_INT_TYPE "long long")
|
|
125
|
+
set(COMPILER_OPTS "-DDLONG ${COMPILER_OPTS}")
|
|
126
|
+
else()
|
|
127
|
+
set(SCS_INT_TYPE "int")
|
|
128
|
+
endif()
|
|
129
|
+
|
|
130
|
+
message(STATUS "COMPILER_OPTS = ${COMPILER_OPTS}")
|
|
131
|
+
|
|
132
|
+
# TODO this is a hack that overwrites the scs_types.h file, we should
|
|
133
|
+
# find a way to do this that doesn't pollute the master directory.
|
|
134
|
+
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/cmake/scs_types.h.in
|
|
135
|
+
${CMAKE_CURRENT_SOURCE_DIR}/include/scs_types.h
|
|
136
|
+
NEWLINE_STYLE LF)
|
|
137
|
+
|
|
138
|
+
# Public headers
|
|
139
|
+
set(${PROJECT_NAME}_PUBLIC_HDR
|
|
140
|
+
include/scs_types.h
|
|
141
|
+
include/scs.h)
|
|
98
142
|
|
|
99
143
|
# Common source files
|
|
100
144
|
set(${PROJECT_NAME}_SRC
|
|
@@ -122,6 +166,8 @@ set(${PROJECT_NAME}_HDR
|
|
|
122
166
|
include/rw.h
|
|
123
167
|
include/scs.h
|
|
124
168
|
include/scs_blas.h
|
|
169
|
+
include/scs_types.h
|
|
170
|
+
include/scs_work.h
|
|
125
171
|
include/util.h
|
|
126
172
|
${LINSYS}/csparse.h
|
|
127
173
|
${LINSYS}/scs_matrix.h)
|
|
@@ -162,7 +208,7 @@ target_include_directories(${${PROJECT_NAME}_DIRECT} PUBLIC
|
|
|
162
208
|
"$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/scs>")
|
|
163
209
|
|
|
164
210
|
# Compiled with blas and lapack, can solve LPs, SOCPs, SDPs, ECPs, and PCPs
|
|
165
|
-
target_compile_definitions(${${PROJECT_NAME}_DIRECT} PRIVATE
|
|
211
|
+
target_compile_definitions(${${PROJECT_NAME}_DIRECT} PRIVATE ${COMPILER_OPTS})
|
|
166
212
|
|
|
167
213
|
# The library depends on math (m) blas and lapack
|
|
168
214
|
target_link_libraries(${${PROJECT_NAME}_DIRECT} PRIVATE
|
|
@@ -173,7 +219,7 @@ target_link_libraries(${${PROJECT_NAME}_DIRECT} PRIVATE
|
|
|
173
219
|
# Set some properties
|
|
174
220
|
set_target_properties(${${PROJECT_NAME}_DIRECT} PROPERTIES
|
|
175
221
|
VERSION ${scs_VERSION}
|
|
176
|
-
PUBLIC_HEADER "${${PROJECT_NAME}
|
|
222
|
+
PUBLIC_HEADER "${${PROJECT_NAME}_PUBLIC_HDR}")
|
|
177
223
|
|
|
178
224
|
add_library(scs::${${PROJECT_NAME}_DIRECT} ALIAS ${${PROJECT_NAME}_DIRECT})
|
|
179
225
|
|
|
@@ -209,7 +255,7 @@ target_include_directories(${${PROJECT_NAME}_INDIRECT} PUBLIC
|
|
|
209
255
|
"$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/scs>")
|
|
210
256
|
|
|
211
257
|
# Compiled with blas and lapack, can solve LPs, SOCPs, SDPs, ECPs, and PCPs
|
|
212
|
-
target_compile_definitions(${${PROJECT_NAME}_INDIRECT} PRIVATE
|
|
258
|
+
target_compile_definitions(${${PROJECT_NAME}_INDIRECT} PRIVATE ${COMPILER_OPTS} -DINDIRECT)
|
|
213
259
|
|
|
214
260
|
# The library depends on math (m) blas and lapack
|
|
215
261
|
target_link_libraries(${${PROJECT_NAME}_INDIRECT} PUBLIC
|
|
@@ -220,7 +266,7 @@ target_link_libraries(${${PROJECT_NAME}_INDIRECT} PUBLIC
|
|
|
220
266
|
# Set some properties
|
|
221
267
|
set_target_properties(${${PROJECT_NAME}_INDIRECT} PROPERTIES
|
|
222
268
|
VERSION ${scs_VERSION}
|
|
223
|
-
PUBLIC_HEADER "${${
|
|
269
|
+
PUBLIC_HEADER "${${PROJECT_NAME}_PUBLIC_HDR}")
|
|
224
270
|
|
|
225
271
|
add_library(scs::${${PROJECT_NAME}_INDIRECT} ALIAS ${${PROJECT_NAME}_INDIRECT})
|
|
226
272
|
|
|
@@ -250,20 +296,22 @@ install_basic_package_files(${PROJECT_NAME}
|
|
|
250
296
|
### Add the tests
|
|
251
297
|
if(BUILD_TESTING)
|
|
252
298
|
add_executable(run_tests_direct test/run_tests.c)
|
|
299
|
+
target_compile_definitions(run_tests_direct PRIVATE ${COMPILER_OPTS})
|
|
253
300
|
target_link_libraries(run_tests_direct PRIVATE
|
|
254
301
|
scs::scsdir)
|
|
255
302
|
target_include_directories(run_tests_direct PRIVATE
|
|
256
|
-
"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/test;${CMAKE_CURRENT_SOURCE_DIR}/include;${CMAKE_CURRENT_SOURCE_DIR}/${LINSYS}>")
|
|
303
|
+
"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/test;${CMAKE_CURRENT_SOURCE_DIR}/include;${CMAKE_CURRENT_SOURCE_DIR}/${LINSYS}>" )
|
|
257
304
|
|
|
258
305
|
add_test(NAME run_tests_direct
|
|
259
306
|
COMMAND run_tests_direct
|
|
260
307
|
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
|
|
261
308
|
|
|
262
309
|
add_executable(run_tests_indirect test/run_tests.c)
|
|
310
|
+
target_compile_definitions(run_tests_indirect PRIVATE ${COMPILER_OPTS})
|
|
263
311
|
target_link_libraries(run_tests_indirect PRIVATE
|
|
264
312
|
scs::scsindir)
|
|
265
313
|
target_include_directories(run_tests_indirect PRIVATE
|
|
266
|
-
"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/test;${CMAKE_CURRENT_SOURCE_DIR}/include;${CMAKE_CURRENT_SOURCE_DIR}/${LINSYS}>")
|
|
314
|
+
"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/test;${CMAKE_CURRENT_SOURCE_DIR}/include;${CMAKE_CURRENT_SOURCE_DIR}/${LINSYS}>" )
|
|
267
315
|
|
|
268
316
|
add_test(NAME run_tests_indirect
|
|
269
317
|
COMMAND run_tests_indirect
|
data/vendor/scs/Makefile
CHANGED
|
@@ -39,13 +39,13 @@ $(SCS_INDIR_O): src/scs.c $(INC_FILES)
|
|
|
39
39
|
%.o : src/%.c
|
|
40
40
|
$(CC) $(CFLAGS) -c $< -o $@
|
|
41
41
|
|
|
42
|
-
src/util.o : src/util.c
|
|
43
|
-
src/cones.o : src/cones.c
|
|
44
|
-
src/aa.o : src/aa.c
|
|
45
|
-
src/rw.o : src/rw.c
|
|
46
|
-
src/linalg.o: src/linalg.c
|
|
47
|
-
src/ctrl.o : src/ctrl.c
|
|
48
|
-
src/scs_version.o: src/scs_version.c
|
|
42
|
+
src/util.o : src/util.c $(INC_FILES)
|
|
43
|
+
src/cones.o : src/cones.c $(INC_FILES)
|
|
44
|
+
src/aa.o : src/aa.c $(INC_FILES)
|
|
45
|
+
src/rw.o : src/rw.c $(INC_FILES)
|
|
46
|
+
src/linalg.o: src/linalg.c $(INC_FILES)
|
|
47
|
+
src/ctrl.o : src/ctrl.c $(INC_FILES)
|
|
48
|
+
src/scs_version.o: src/scs_version.c $(INC_FILES)
|
|
49
49
|
|
|
50
50
|
$(DIRSRC)/private.o: $(DIRSRC)/private.c $(DIRSRC)/private.h
|
|
51
51
|
$(INDIRSRC)/indirect/private.o: $(INDIRSRC)/private.c $(INDIRSRC)/private.h
|
|
@@ -115,7 +115,7 @@ $(LINSYS)/gpu/gpu.o: $(LINSYS)/gpu/gpu.c
|
|
|
115
115
|
# $(CUCC) -c -o $(GPUDIR)/private.o $^ $(CUDAFLAGS)
|
|
116
116
|
|
|
117
117
|
$(GPUINDIR)/private.o: $(GPUINDIR)/private.c
|
|
118
|
-
$(CUCC) -c -o
|
|
118
|
+
$(CUCC) -c -o $@ $^ $(CUDAFLAGS)
|
|
119
119
|
|
|
120
120
|
# $(OUT)/libscsgpudir.$(SHARED): $(SCS_O) $(SCS_OBJECTS) $(GPUDIR)/private.o $(AMD_OBJS) $(LINSYS)/scs_matrix.o $(LINSYS)/gpu/gpu.o
|
|
121
121
|
# mkdir -p $(OUT)
|
|
@@ -143,7 +143,7 @@ $(OUT)/demo_socp_gpu_indirect: test/random_socp_prob.c $(OUT)/libscsgpuindir.a
|
|
|
143
143
|
|
|
144
144
|
.PHONY: clean purge
|
|
145
145
|
clean:
|
|
146
|
-
@rm -rf $(TARGETS) $(SCS_O) $(SCS_INDIR_O) $(SCS_OBJECTS) $(AMD_OBJS) $(LDL_OBJS) $(LINSYS)/*.o $(DIRSRC)/*.o $(INDIRSRC)/*.o $(GPUDIR)/*.o $(GPUINDIR)/*.o
|
|
146
|
+
@rm -rf $(TARGETS) $(SCS_O) $(SCS_INDIR_O) $(SCS_OBJECTS) $(AMD_OBJS) $(LDL_OBJS) $(LINSYS)/*.o $(DIRSRC)/*.o $(INDIRSRC)/*.o $(GPUDIR)/*.o $(GPUINDIR)/*.o $(LINSYS)/gpu/*.o
|
|
147
147
|
@rm -rf $(OUT)/*.dSYM
|
|
148
148
|
@rm -rf matlab/*.mex*
|
|
149
149
|
@rm -rf .idea
|
data/vendor/scs/README.md
CHANGED
|
@@ -3,10 +3,13 @@
|
|
|
3
3
|
</h1>
|
|
4
4
|
|
|
5
5
|
[](https://github.com/cvxgrp/scs/actions/workflows/build.yml)
|
|
6
|
+
[](https://www.cvxgrp.org/scs/)
|
|
6
7
|
[](https://coveralls.io/github/cvxgrp/scs?branch=master)
|
|
7
8
|
|
|
8
9
|
|
|
9
10
|
SCS (`splitting conic solver`) is a numerical optimization package for solving
|
|
10
|
-
large-scale convex cone problems. The current version is `3.
|
|
11
|
+
large-scale convex cone problems. The current version is `3.2.0`.
|
|
11
12
|
|
|
12
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/aa.h
CHANGED
|
@@ -23,7 +23,7 @@ typedef struct ACCEL_WORK AaWork;
|
|
|
23
23
|
* @param type1 if True use type 1 AA, otherwise use type 2
|
|
24
24
|
* @param regularization type-I and type-II different, for type-I: 1e-8 works
|
|
25
25
|
* well, type-II: more stable can use 1e-12 often
|
|
26
|
-
* @param relaxation float
|
|
26
|
+
* @param relaxation float in [0,2], mixing parameter (1.0 is vanilla)
|
|
27
27
|
* @param safeguard_factor factor that controls safeguarding checks
|
|
28
28
|
* larger is more aggressive but less stable
|
|
29
29
|
* @param max_weight_norm float, maximum norm of AA weights
|
data/vendor/scs/include/cones.h
CHANGED
|
@@ -8,6 +8,8 @@ extern "C" {
|
|
|
8
8
|
#include "glbopts.h"
|
|
9
9
|
#include "scs.h"
|
|
10
10
|
#include "scs_blas.h"
|
|
11
|
+
#include "scs_work.h"
|
|
12
|
+
#include <string.h>
|
|
11
13
|
|
|
12
14
|
/* private data to help cone projection step */
|
|
13
15
|
struct SCS_CONE_WORK {
|
|
@@ -16,10 +18,14 @@ struct SCS_CONE_WORK {
|
|
|
16
18
|
* cone boundaries, boundaries[0] is starting index for cones of size larger
|
|
17
19
|
* than 1
|
|
18
20
|
*/
|
|
19
|
-
|
|
20
|
-
scs_int
|
|
21
|
+
ScsCone *k; /* original cone information */
|
|
22
|
+
scs_int *cone_boundaries;
|
|
23
|
+
scs_int cone_boundaries_len;
|
|
24
|
+
scs_int scaled_cones; /* boolean, whether the cones have been scaled */
|
|
25
|
+
scs_float *s; /* used for Moreau decomposition in projection */
|
|
26
|
+
scs_int m; /* total length of cone */
|
|
21
27
|
/* box cone quantities */
|
|
22
|
-
scs_float
|
|
28
|
+
scs_float box_t_warm_start;
|
|
23
29
|
#ifdef USE_LAPACK
|
|
24
30
|
/* workspace for eigenvector decompositions: */
|
|
25
31
|
scs_float *Xs, *Z, *e, *work;
|
|
@@ -27,18 +33,17 @@ struct SCS_CONE_WORK {
|
|
|
27
33
|
#endif
|
|
28
34
|
};
|
|
29
35
|
|
|
30
|
-
|
|
31
|
-
|
|
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);
|
|
32
39
|
char *SCS(get_cone_header)(const ScsCone *k);
|
|
33
40
|
scs_int SCS(validate_cones)(const ScsData *d, const ScsCone *k);
|
|
34
|
-
scs_int SCS(
|
|
35
|
-
|
|
36
|
-
scs_int SCS(proj_dual_cone)(scs_float *x, const ScsCone *k, ScsConeWork *c,
|
|
37
|
-
scs_int normalize);
|
|
41
|
+
scs_int SCS(proj_dual_cone)(scs_float *x, ScsConeWork *c, ScsScaling *scal,
|
|
42
|
+
scs_float *r_y);
|
|
38
43
|
void SCS(finish_cone)(ScsConeWork *c);
|
|
39
|
-
|
|
40
|
-
void SCS(
|
|
41
|
-
|
|
44
|
+
void SCS(set_r_y)(const ScsConeWork *c, scs_float scale, scs_float *r_y);
|
|
45
|
+
void SCS(enforce_cone_boundaries)(const ScsConeWork *c, scs_float *vec,
|
|
46
|
+
scs_float (*f)(const scs_float *, scs_int));
|
|
42
47
|
|
|
43
48
|
#ifdef __cplusplus
|
|
44
49
|
}
|