scs 0.2.2

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.
Files changed (106) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +12 -0
  3. data/LICENSE.txt +22 -0
  4. data/README.md +98 -0
  5. data/ext/scs/extconf.rb +29 -0
  6. data/lib/scs.rb +17 -0
  7. data/lib/scs/ffi.rb +117 -0
  8. data/lib/scs/solver.rb +173 -0
  9. data/lib/scs/version.rb +3 -0
  10. data/vendor/scs/LICENSE.txt +21 -0
  11. data/vendor/scs/Makefile +164 -0
  12. data/vendor/scs/README.md +222 -0
  13. data/vendor/scs/include/aa.h +56 -0
  14. data/vendor/scs/include/cones.h +46 -0
  15. data/vendor/scs/include/ctrlc.h +33 -0
  16. data/vendor/scs/include/glbopts.h +177 -0
  17. data/vendor/scs/include/linalg.h +26 -0
  18. data/vendor/scs/include/linsys.h +64 -0
  19. data/vendor/scs/include/normalize.h +18 -0
  20. data/vendor/scs/include/rw.h +17 -0
  21. data/vendor/scs/include/scs.h +161 -0
  22. data/vendor/scs/include/scs_blas.h +51 -0
  23. data/vendor/scs/include/util.h +65 -0
  24. data/vendor/scs/linsys/amatrix.c +305 -0
  25. data/vendor/scs/linsys/amatrix.h +36 -0
  26. data/vendor/scs/linsys/amatrix.o +0 -0
  27. data/vendor/scs/linsys/cpu/direct/private.c +366 -0
  28. data/vendor/scs/linsys/cpu/direct/private.h +26 -0
  29. data/vendor/scs/linsys/cpu/direct/private.o +0 -0
  30. data/vendor/scs/linsys/cpu/indirect/private.c +256 -0
  31. data/vendor/scs/linsys/cpu/indirect/private.h +31 -0
  32. data/vendor/scs/linsys/cpu/indirect/private.o +0 -0
  33. data/vendor/scs/linsys/external/amd/LICENSE.txt +934 -0
  34. data/vendor/scs/linsys/external/amd/SuiteSparse_config.c +469 -0
  35. data/vendor/scs/linsys/external/amd/SuiteSparse_config.h +254 -0
  36. data/vendor/scs/linsys/external/amd/SuiteSparse_config.o +0 -0
  37. data/vendor/scs/linsys/external/amd/amd.h +400 -0
  38. data/vendor/scs/linsys/external/amd/amd_1.c +180 -0
  39. data/vendor/scs/linsys/external/amd/amd_1.o +0 -0
  40. data/vendor/scs/linsys/external/amd/amd_2.c +1842 -0
  41. data/vendor/scs/linsys/external/amd/amd_2.o +0 -0
  42. data/vendor/scs/linsys/external/amd/amd_aat.c +184 -0
  43. data/vendor/scs/linsys/external/amd/amd_aat.o +0 -0
  44. data/vendor/scs/linsys/external/amd/amd_control.c +64 -0
  45. data/vendor/scs/linsys/external/amd/amd_control.o +0 -0
  46. data/vendor/scs/linsys/external/amd/amd_defaults.c +37 -0
  47. data/vendor/scs/linsys/external/amd/amd_defaults.o +0 -0
  48. data/vendor/scs/linsys/external/amd/amd_dump.c +179 -0
  49. data/vendor/scs/linsys/external/amd/amd_dump.o +0 -0
  50. data/vendor/scs/linsys/external/amd/amd_global.c +16 -0
  51. data/vendor/scs/linsys/external/amd/amd_global.o +0 -0
  52. data/vendor/scs/linsys/external/amd/amd_info.c +119 -0
  53. data/vendor/scs/linsys/external/amd/amd_info.o +0 -0
  54. data/vendor/scs/linsys/external/amd/amd_internal.h +304 -0
  55. data/vendor/scs/linsys/external/amd/amd_order.c +199 -0
  56. data/vendor/scs/linsys/external/amd/amd_order.o +0 -0
  57. data/vendor/scs/linsys/external/amd/amd_post_tree.c +120 -0
  58. data/vendor/scs/linsys/external/amd/amd_post_tree.o +0 -0
  59. data/vendor/scs/linsys/external/amd/amd_postorder.c +206 -0
  60. data/vendor/scs/linsys/external/amd/amd_postorder.o +0 -0
  61. data/vendor/scs/linsys/external/amd/amd_preprocess.c +118 -0
  62. data/vendor/scs/linsys/external/amd/amd_preprocess.o +0 -0
  63. data/vendor/scs/linsys/external/amd/amd_valid.c +92 -0
  64. data/vendor/scs/linsys/external/amd/amd_valid.o +0 -0
  65. data/vendor/scs/linsys/external/amd/changes +11 -0
  66. data/vendor/scs/linsys/external/qdldl/LICENSE +201 -0
  67. data/vendor/scs/linsys/external/qdldl/README.md +120 -0
  68. data/vendor/scs/linsys/external/qdldl/changes +4 -0
  69. data/vendor/scs/linsys/external/qdldl/qdldl.c +298 -0
  70. data/vendor/scs/linsys/external/qdldl/qdldl.h +177 -0
  71. data/vendor/scs/linsys/external/qdldl/qdldl.o +0 -0
  72. data/vendor/scs/linsys/external/qdldl/qdldl_types.h +21 -0
  73. data/vendor/scs/linsys/gpu/gpu.c +41 -0
  74. data/vendor/scs/linsys/gpu/gpu.h +85 -0
  75. data/vendor/scs/linsys/gpu/indirect/private.c +304 -0
  76. data/vendor/scs/linsys/gpu/indirect/private.h +36 -0
  77. data/vendor/scs/scs.mk +181 -0
  78. data/vendor/scs/src/aa.c +224 -0
  79. data/vendor/scs/src/aa.o +0 -0
  80. data/vendor/scs/src/cones.c +802 -0
  81. data/vendor/scs/src/cones.o +0 -0
  82. data/vendor/scs/src/ctrlc.c +77 -0
  83. data/vendor/scs/src/ctrlc.o +0 -0
  84. data/vendor/scs/src/linalg.c +84 -0
  85. data/vendor/scs/src/linalg.o +0 -0
  86. data/vendor/scs/src/normalize.c +93 -0
  87. data/vendor/scs/src/normalize.o +0 -0
  88. data/vendor/scs/src/rw.c +167 -0
  89. data/vendor/scs/src/rw.o +0 -0
  90. data/vendor/scs/src/scs.c +978 -0
  91. data/vendor/scs/src/scs.o +0 -0
  92. data/vendor/scs/src/scs_version.c +5 -0
  93. data/vendor/scs/src/scs_version.o +0 -0
  94. data/vendor/scs/src/util.c +196 -0
  95. data/vendor/scs/src/util.o +0 -0
  96. data/vendor/scs/test/data/small_random_socp +0 -0
  97. data/vendor/scs/test/minunit.h +13 -0
  98. data/vendor/scs/test/problem_utils.h +93 -0
  99. data/vendor/scs/test/problems/rob_gauss_cov_est.h +85 -0
  100. data/vendor/scs/test/problems/small_lp.h +50 -0
  101. data/vendor/scs/test/problems/small_random_socp.h +33 -0
  102. data/vendor/scs/test/random_socp_prob.c +171 -0
  103. data/vendor/scs/test/run_from_file.c +69 -0
  104. data/vendor/scs/test/run_tests +2 -0
  105. data/vendor/scs/test/run_tests.c +32 -0
  106. metadata +203 -0
@@ -0,0 +1,3 @@
1
+ module SCS
2
+ VERSION = "0.2.2"
3
+ end
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2012 Brendan O'Donoghue (bodonoghue85@gmail.com)
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,164 @@
1
+ # MAKEFILE for scs
2
+ include scs.mk
3
+
4
+ SCS_OBJECTS = src/scs.o src/util.o src/cones.o src/aa.o src/rw.o src/linalg.o src/ctrlc.o src/scs_version.o src/normalize.o
5
+
6
+ SRC_FILES = $(wildcard src/*.c)
7
+ INC_FILES = $(wildcard include/*.h)
8
+
9
+ AMD_SOURCE = $(wildcard $(EXTSRC)/amd/*.c)
10
+ LDL_SOURCE = $(EXTSRC)/qdldl/qdldl.c
11
+ AMD_OBJS = $(AMD_SOURCE:.c=.o)
12
+ LDL_OBJS = $(LDL_SOURCE:.c=.o)
13
+ TARGETS = $(OUT)/demo_socp_indirect $(OUT)/demo_socp_direct $(OUT)/run_from_file_indirect $(OUT)/run_from_file_direct
14
+
15
+ .PHONY: default
16
+
17
+ default: $(TARGETS) $(OUT)/libscsdir.a $(OUT)/libscsindir.a $(OUT)/libscsdir.$(SHARED) $(OUT)/libscsindir.$(SHARED)
18
+ @echo "****************************************************************************************"
19
+ @echo "Successfully compiled scs, copyright Brendan O'Donoghue 2012."
20
+ @echo "To test, type '$(OUT)/demo_socp_indirect' to solve a random SOCP."
21
+ @echo "**********************************************************************************"
22
+ ifneq ($(USE_LAPACK), 0)
23
+ @echo "Compiled with blas and lapack, can solve LPs, SOCPs, SDPs, ECPs, and PCPs"
24
+ else
25
+ @echo "NOT compiled with blas/lapack, cannot solve SDPs (can solve LPs, SOCPs, ECPs, and PCPs)."
26
+ @echo "To solve SDPs, install blas and lapack, then edit scs.mk to set USE_LAPACK=1"
27
+ @echo "and point to the library install locations, and recompile with 'make purge', 'make'."
28
+ endif
29
+ @echo "****************************************************************************************"
30
+
31
+ %.o : src/%.c
32
+ $(CC) $(CFLAGS) -c $< -o $@
33
+
34
+ src/scs.o : $(SRC_FILES) $(INC_FILES)
35
+ src/util.o : src/util.c include/util.h include/glbopts.h
36
+ src/cones.o : src/cones.c include/cones.h include/scs_blas.h
37
+ src/aa.o : src/aa.c include/aa.h include/scs_blas.h
38
+ src/rw.o : src/rw.c include/rw.h
39
+ src/cs.o : src/cs.c include/cs.h
40
+ src/linalg.o: src/linalg.c include/linalg.h
41
+ src/ctrl.o : src/ctrl.c include/ctrl.h
42
+ src/scs_version.o: src/scs_version.c include/glbopts.h
43
+
44
+ $(DIRSRC)/private.o: $(DIRSRC)/private.c $(DIRSRC)/private.h
45
+ $(INDIRSRC)/indirect/private.o: $(INDIRSRC)/private.c $(INDIRSRC)/private.h
46
+ $(LINSYS)/amatrix.o: $(LINSYS)/amatrix.c $(LINSYS)/amatrix.h
47
+
48
+ $(OUT)/libscsdir.a: $(SCS_OBJECTS) $(DIRSRC)/private.o $(AMD_OBJS) $(LDL_OBJS) $(LINSYS)/amatrix.o
49
+ mkdir -p $(OUT)
50
+ $(ARCHIVE) $@ $^
51
+ - $(RANLIB) $@
52
+
53
+ $(OUT)/libscsindir.a: $(SCS_OBJECTS) $(INDIRSRC)/private.o $(LINSYS)/amatrix.o
54
+ mkdir -p $(OUT)
55
+ $(ARCHIVE) $@ $^
56
+ - $(RANLIB) $@
57
+
58
+ $(OUT)/libscsdir.$(SHARED): $(SCS_OBJECTS) $(DIRSRC)/private.o $(AMD_OBJS) $(LDL_OBJS) $(LINSYS)/amatrix.o
59
+ mkdir -p $(OUT)
60
+ $(CC) $(CFLAGS) -shared -Wl,$(SONAME),$(@:$(OUT)/%=%) -o $@ $^ $(LDFLAGS)
61
+
62
+ $(OUT)/libscsindir.$(SHARED): $(SCS_OBJECTS) $(INDIRSRC)/private.o $(LINSYS)/amatrix.o
63
+ mkdir -p $(OUT)
64
+ $(CC) $(CFLAGS) -shared -Wl,$(SONAME),$(@:$(OUT)/%=%) -o $@ $^ $(LDFLAGS)
65
+
66
+ $(OUT)/demo_socp_direct: test/random_socp_prob.c $(OUT)/libscsdir.a
67
+ $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS)
68
+
69
+ $(OUT)/demo_socp_indirect: test/random_socp_prob.c $(OUT)/libscsindir.a
70
+ $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS)
71
+
72
+ $(OUT)/run_from_file_direct: test/run_from_file.c $(OUT)/libscsdir.a
73
+ $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS)
74
+
75
+ $(OUT)/run_from_file_indirect: test/run_from_file.c $(OUT)/libscsindir.a
76
+ $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS)
77
+
78
+ $(OUT)/run_from_file_gpu_indirect: test/run_from_file.c $(OUT)/libscsgpuindir.a
79
+ $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) $(CULDFLAGS)
80
+
81
+ # basic testing
82
+ .PHONY: test
83
+ test: $(OUT)/run_tests_indirect $(OUT)/run_tests_direct
84
+ $(OUT)/run_tests_indirect: test/run_tests.c $(OUT)/libscsindir.a
85
+ $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) -Itest
86
+ $(OUT)/run_tests_direct: test/run_tests.c $(OUT)/libscsdir.a
87
+ $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) -Itest
88
+
89
+ .PHONY: test_gpu
90
+ test_gpu: $(OUT)/run_tests_gpu_indirect # $(OUT)/run_tests_gpu_direct
91
+
92
+ $(OUT)/run_tests_gpu_indirect: test/run_tests.c $(OUT)/libscsgpuindir.a
93
+ $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) $(CULDFLAGS) -Itest
94
+
95
+ # $(OUT)/run_tests_gpu_direct: test/run_tests.c $(OUT)/libscsgpudir.a
96
+ # $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) $(CULDFLAGS) -Itest
97
+
98
+ # REQUIRES GPU AND CUDA INSTALLED
99
+ gpu: gpu_indirect # gpu_direct
100
+
101
+ # gpu_direct: $(OUT)/demo_socp_gpu_direct $(OUT)/libscsgpudir.$(SHARED) $(OUT)/libscsgpudir.a $(OUT)/run_from_file_gpu_direct
102
+ gpu_indirect: $(OUT)/demo_socp_gpu_indirect $(OUT)/libscsgpuindir.$(SHARED) $(OUT)/libscsgpuindir.a $(OUT)/run_from_file_gpu_indirect
103
+
104
+ $(LINSYS)/gpu/gpu.o: $(LINSYS)/gpu/gpu.c
105
+ $(CUCC) -c -o $@ $^ $(CUDAFLAGS)
106
+
107
+ # $(GPUDIR)/private.o: $(GPUDIR)/private.c
108
+ # $(CUCC) -c -o $(GPUDIR)/private.o $^ $(CUDAFLAGS)
109
+
110
+ $(GPUINDIR)/private.o: $(GPUINDIR)/private.c
111
+ $(CUCC) -c -o $(GPUINDIR)/private.o $^ $(CUDAFLAGS)
112
+
113
+ # $(OUT)/libscsgpudir.$(SHARED): $(SCS_OBJECTS) $(GPUDIR)/private.o $(AMD_OBJS) $(LINSYS)/amatrix.o $(LINSYS)/gpu/gpu.o
114
+ # mkdir -p $(OUT)
115
+ # $(CC) $(CFLAGS) -shared -Wl,$(SONAME),$(@:$(OUT)/%=%) -o $@ $^ $(LDFLAGS) $(CULDFLAGS)
116
+
117
+ # $(OUT)/libscsgpudir.a: $(SCS_OBJECTS) $(GPUDIR)/private.o $(AMD_OBJS) $(LINSYS)/amatrix.o $(LINSYS)/gpu/gpu.o
118
+ # mkdir -p $(OUT)
119
+ # $(ARCHIVE) $@ $^
120
+ # - $(RANLIB) $@
121
+
122
+ $(OUT)/libscsgpuindir.$(SHARED): $(SCS_OBJECTS) $(GPUINDIR)/private.o $(LINSYS)/amatrix.o $(LINSYS)/gpu/gpu.o
123
+ mkdir -p $(OUT)
124
+ $(CC) $(CFLAGS) -shared -Wl,$(SONAME),$(@:$(OUT)/%=%) -o $@ $^ $(LDFLAGS) $(CULDFLAGS)
125
+
126
+ $(OUT)/libscsgpuindir.a: $(SCS_OBJECTS) $(GPUINDIR)/private.o $(LINSYS)/amatrix.o $(LINSYS)/gpu/gpu.o
127
+ mkdir -p $(OUT)
128
+ $(ARCHIVE) $@ $^
129
+ - $(RANLIB) $@
130
+
131
+ # $(OUT)/demo_socp_gpu_direct: test/random_socp_prob.c $(OUT)/libscsgpudir.a
132
+ # $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) $(CULDFLAGS)
133
+
134
+ $(OUT)/demo_socp_gpu_indirect: test/random_socp_prob.c $(OUT)/libscsgpuindir.a
135
+ $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) $(CULDFLAGS)
136
+
137
+ .PHONY: clean purge
138
+ clean:
139
+ @rm -rf $(TARGETS) $(SCS_OBJECTS) $(AMD_OBJS) $(LDL_OBJS) $(LINSYS)/*.o $(DIRSRC)/*.o $(INDIRSRC)/*.o $(GPUDIR)/*.o $(GPUINDIR)/*.o
140
+ @rm -rf $(OUT)/*.dSYM
141
+ @rm -rf matlab/*.mex*
142
+ @rm -rf .idea
143
+ @rm -rf python/*.pyc
144
+ @rm -rf python/build
145
+ purge: clean
146
+ @rm -rf $(OUT)
147
+
148
+ INSTALL_INC_FILES = $(INC_FILES)
149
+
150
+ INSTALL_TARGETS = $(OUT)/libscsdir.a $(OUT)/libscsindir.a $(OUT)/libscsdir.$(SHARED) $(OUT)/libscsindir.$(SHARED)
151
+ INSTALL_GPU_TARGETS = $(OUT)/libscsgpuindir.a $(OUT)/libscsgpuindir.$(SHARED) # $(OUT)/libscsgpudir.a $(OUT)/libscsgpudir.$(SHARED)
152
+
153
+ INSTALL_INC_DIR = $(DESTDIR)$(PREFIX)/include/scs/
154
+ INSTALL_LIB_DIR = $(DESTDIR)$(PREFIX)/lib/
155
+
156
+ .PHONY: install install_gpu
157
+ install: $(INSTALL_INC_FILES) $(INSTALL_TARGETS)
158
+ $(INSTALL) -d $(INSTALL_INC_DIR) $(INSTALL_LIB_DIR)
159
+ $(INSTALL) -m 644 $(INSTALL_INC_FILES) $(INSTALL_INC_DIR)
160
+ $(INSTALL) -m 644 $(INSTALL_TARGETS) $(INSTALL_LIB_DIR)
161
+ install_gpu: $(INSTALL_INC_FILES) $(INSTALL_GPU_TARGETS)
162
+ $(INSTALL) -d $(INSTALL_INC_DIR) $(INSTALL_LIB_DIR)
163
+ $(INSTALL) -m 644 $(INSTALL_INC_FILES) $(INSTALL_INC_DIR)
164
+ $(INSTALL) -m 644 $(INSTALL_GPU_TARGETS) $(INSTALL_LIB_DIR)
@@ -0,0 +1,222 @@
1
+ SCS
2
+ ====
3
+
4
+ [![Build Status](https://travis-ci.org/cvxgrp/scs.svg?branch=master)](https://travis-ci.org/cvxgrp/scs)
5
+ [![Build status](https://ci.appveyor.com/api/projects/status/4542u6kom5293qpm/branch/master?svg=true)](https://ci.appveyor.com/project/bodono/scs/branch/master)
6
+
7
+ SCS (`splitting conic solver`) is a numerical optimization package for solving
8
+ large-scale convex cone problems, based on our paper [Conic Optimization via
9
+ Operator Splitting and Homogeneous Self-Dual
10
+ Embedding](http://www.stanford.edu/~boyd/papers/scs.html). It is written in C
11
+ and can be used in other C, C++,
12
+ [Python](https://github.com/bodono/scs-python),
13
+ [Matlab](https://github.com/bodono/scs-matlab),
14
+ [R](https://github.com/bodono/scs-r),
15
+ [Julia](https://github.com/JuliaOpt/SCS.jl), and
16
+ [Ruby](https://github.com/ankane/scs),
17
+ programs via the linked
18
+ interfaces. It can also be called as a solver from convex optimization
19
+ toolboxes [CVX](http://cvxr.com/cvx/) (3.0 or later),
20
+ [CVXPY](https://github.com/cvxgrp/cvxpy),
21
+ [Convex.jl](https://github.com/JuliaOpt/Convex.jl), and
22
+ [Yalmip](https://github.com/johanlofberg/YALMIP).
23
+
24
+ The current version is `2.1.2`. If you wish to cite SCS, please use the
25
+ following:
26
+ ```
27
+ @article{ocpb:16,
28
+ author = {B. O'Donoghue and E. Chu and N. Parikh and S. Boyd},
29
+ title = {Conic Optimization via Operator Splitting and Homogeneous Self-Dual Embedding},
30
+ journal = {Journal of Optimization Theory and Applications},
31
+ month = {June},
32
+ year = {2016},
33
+ volume = {169},
34
+ number = {3},
35
+ pages = {1042-1068},
36
+ url = {http://stanford.edu/~boyd/papers/scs.html},
37
+ }
38
+ @misc{scs,
39
+ author = {B. O'Donoghue and E. Chu and N. Parikh and S. Boyd},
40
+ title = {{SCS}: Splitting Conic Solver, version 2.1.2},
41
+ howpublished = {\url{https://github.com/cvxgrp/scs}},
42
+ month = nov,
43
+ year = 2019
44
+ }
45
+ ```
46
+
47
+ ----
48
+ SCS numerically solves convex cone programs using the alternating direction
49
+ method of multipliers
50
+ ([ADMM](http://web.stanford.edu/~boyd/papers/admm_distr_stats.html)). It
51
+ returns solutions to both the primal and dual problems if the problem is
52
+ feasible, or a certificate of infeasibility otherwise. It solves the following
53
+ primal cone problem:
54
+
55
+ ```
56
+ minimize c'x
57
+ subject to Ax + s = b
58
+ s in K
59
+ ```
60
+ over variables `x` and `s`, where `A`, `b` and `c` are user-supplied data and
61
+ `K` is a user-defined convex cone. The dual problem is given by
62
+ ```
63
+ maximize -b'y
64
+ subject to -A'y == c
65
+ y in K^*
66
+ ```
67
+ over variable `y`, where `K^*` denotes the dual cone to `K`.
68
+
69
+ The cone `K` can be any Cartesian product of the following primitive cones:
70
+ + zero cone `{x | x = 0 }` (dual to the free cone `{x | x in R}`)
71
+ + positive orthant `{x | x >= 0}`
72
+ + second-order cone `{(t,x) | ||x||_2 <= t}`
73
+ + positive semidefinite cone `{ X | min(eig(X)) >= 0, X = X^T }`
74
+ + exponential cone `{(x,y,z) | y e^(x/y) <= z, y>0 }`
75
+ + dual exponential cone `{(u,v,w) | −u e^(v/u) <= e w, u<0}`
76
+ + power cone `{(x,y,z) | x^a * y^(1-a) >= |z|, x>=0, y>=0}`
77
+ + dual power cone `{(u,v,w) | (u/a)^a * (v/(1-a))^(1-a) >= |w|, u>=0, v>=0}`
78
+
79
+ The rows of the data matrix `A` correspond to the cones in `K`. **The rows of
80
+ `A` must be in the order of the cones given above, i.e., first come the rows
81
+ that correspond to the zero/free cones, then those that correspond to the
82
+ positive orthants, then SOCs, etc.** For a `k` dimensional semidefinite cone
83
+ when interpreting the rows of the data matrix `A` SCS assumes that the `k x k`
84
+ matrix variable has been vectorized by scaling the off-diagonal entries by
85
+ `sqrt(2)` and stacking the **lower triangular elements column-wise** to create a
86
+ vector of length `k(k+1)/2`. See the section on semidefinite programming below.
87
+
88
+ At termination SCS returns solution `(x*, s*, y*)` if the problem is feasible,
89
+ or a certificate of infeasibility otherwise. See
90
+ [here](http://web.stanford.edu/~boyd/cvxbook/) for more details about
91
+ cone programming and certificates of infeasibility.
92
+
93
+ **Anderson Acceleration**
94
+
95
+ By default SCS uses Anderson acceleration (AA) to speed up convergence. The
96
+ number of iterates that SCS uses in the AA calculation can be controlled by the
97
+ parameter `acceleration_lookback` in the settings struct. It defaults to 10. AA
98
+ is available as a standalone package [here](https://github.com/cvxgrp/aa). More
99
+ details are available in our paper on AA
100
+ [here](https://stanford.edu/~boyd/papers/nonexp_global_aa1.html).
101
+
102
+ **Semidefinite Programming**
103
+
104
+ SCS assumes that the matrix variables and the input data corresponding to
105
+ semidefinite cones have been vectorized by **scaling the off-diagonal entries by
106
+ `sqrt(2)`** and stacking the lower triangular elements **column-wise**. For a `k
107
+ x k` matrix variable (or data matrix) this operation would create a vector of
108
+ length `k(k+1)/2`. Scaling by `sqrt(2)` is required to preserve the
109
+ inner-product.
110
+
111
+ **To recover the matrix solution this operation must be inverted on the
112
+ components of the vector returned by SCS corresponding to semidefinite cones**.
113
+ That is, the off-diagonal entries must be scaled by `1/sqrt(2)` and the upper
114
+ triangular entries are filled in by copying the values of lower triangular
115
+ entries.
116
+
117
+ More explicitly, we want to express
118
+ `Tr(C X)` as `vec(C)'*vec(X)`, where the `vec` operation takes the `k x k` matrix
119
+ ```
120
+ X = [ X11 X12 ... X1k
121
+ X21 X22 ... X2k
122
+ ...
123
+ Xk1 Xk2 ... Xkk ]
124
+ ```
125
+ and produces a vector consisting of
126
+ ```
127
+ vec(X) = (X11, sqrt(2)*X21, ..., sqrt(2)*Xk1, X22, sqrt(2)*X32, ..., Xkk).
128
+ ```
129
+
130
+ **Linear equation solvers**
131
+
132
+ Each iteration of SCS requires the solution of a set of linear equations. This
133
+ package includes two implementations for solving linear equations: a direct
134
+ solver which uses a cached LDL factorization and an indirect solver based on
135
+ conjugate gradients. The indirect solver can be run on either the cpu or
136
+ gpu.
137
+
138
+ The direct solver uses external numerical linear algebra packages:
139
+ * [QDLDL](https://github.com/oxfordcontrol/qdldl)
140
+ * [AMD](http://www.cise.ufl.edu/research/sparse/).
141
+
142
+ ### Using SCS in C
143
+ Typing `make` at the command line will compile the code and create SCS libraries
144
+ in the `out` folder. To run the tests execute:
145
+ ```sh
146
+ make
147
+ make test
148
+ test/run_tests
149
+ ```
150
+
151
+ If `make` completes successfully, it will produce two static library files,
152
+ `libscsdir.a`, `libscsindir.a`, and two dynamic library files `libscsdir.ext`,
153
+ `libscsindir.ext` (where `.ext` extension is platform dependent) in the same
154
+ folder. It will also produce two demo binaries in the `out` folder named
155
+ `demo_socp_direct`, and `demo_socp_indirect`. If you have a GPU and have CUDA
156
+ installed, you can also execture `make gpu` to compile SCS to run on the GPU
157
+ which will create additional libraries and demo binaries in the `out` folder
158
+ corresponding to the gpu version. Note that the GPU version requires 32 bit
159
+ ints, which can be enforced by compiling with `DLONG=0`.
160
+
161
+ To use the libraries in your own source code, compile your code with the linker
162
+ option `-L(PATH_TO_SCS_LIBS)` and `-lscsdir` or `-lscsindir` (as needed). The
163
+ API and required data structures are defined in the file `include/scs.h`. The
164
+ four main API functions are:
165
+
166
+ * `ScsWork * scs_init(const ScsData * d, const ScsCone * k, ScsInfo * info);`
167
+
168
+ This initializes the ScsWork struct containing the workspace that scs will
169
+ use, and performs the necessary preprocessing (e.g. matrix factorization).
170
+ All inputs `d`, `k`, and `info` must be memory allocated before calling.
171
+
172
+ * `scs_int scs_solve(ScsWork * w, const ScsData * d, const ScsCone * k, ScsSolution * sol, ScsInfo * info);`
173
+
174
+ This solves the problem as defined by ScsData `d` and ScsCone `k` using the
175
+ workspace in `w`. The solution is returned in `sol` and information about
176
+ the solve is returned in `info` (outputs must have memory allocated before
177
+ calling). None of the inputs can be NULL. You can call `scs_solve` many
178
+ times for one call to `scs_init`, so long as the matrix `A` does not change
179
+ (vectors `b` and `c` can change).
180
+
181
+ * `void scs_finish(ScsWork * w);`
182
+
183
+ Called after all solves completed to free allocated memory and other
184
+ cleanup.
185
+
186
+ * `scs_int scs(const ScsData * d, const ScsCone * k, ScsSolution * sol, ScsInfo * info);`
187
+
188
+ Convenience method that simply calls all the above routines in order, for
189
+ cases where the workspace does not need to be reused. All inputs must have
190
+ memory allocated before this call.
191
+
192
+ The data matrix `A` is specified in column-compressed format and the vectors `b`
193
+ and `c` are specified as dense arrays. The solutions `x` (primal), `s` (slack),
194
+ and `y` (dual) are returned as dense arrays. Cones are specified as the struct
195
+ defined in `include/scs.h`, the rows of `A` must correspond to the cones in the
196
+ exact order as specified by the cone struct (i.e. put linear cones before
197
+ second-order cones etc.).
198
+
199
+ **Warm-start**
200
+
201
+ You can warm-start SCS (supply a guess of the solution) by setting `warm_start`
202
+ in the ScsData struct to `1` and supplying the warm-starts in the ScsSolution
203
+ struct (`x`,`y`, and `s`). All inputs must be warm-started if any one is. These
204
+ are used to initialize the iterates in `scs_solve`.
205
+
206
+ **Re-using matrix factorization**
207
+
208
+ If using the direct version you can factorize the matrix once and solve many
209
+ times. Simply call `scs_init` once, and use `scs_solve` many times with the same
210
+ workspace, changing the input data `b` and `c` (and optionally warm-starts) for
211
+ each iteration.
212
+
213
+ **Using your own linear system solver**
214
+
215
+ To use your own linear system solver simply implement all the methods and the
216
+ two structs in `include/linsys.h` and plug it in.
217
+
218
+ **BLAS / LAPACK install error**
219
+
220
+ If you get an error like `cannot find -lblas` or `cannot find -llapack`, then
221
+ you need to install blas and lapack and / or update your environment variables
222
+ to point to the install locations.
@@ -0,0 +1,56 @@
1
+ #ifndef AA_H_GUARD
2
+ #define AA_H_GUARD
3
+
4
+ #ifdef __cplusplus
5
+ extern "C" {
6
+ #endif
7
+
8
+ #include <stdio.h>
9
+ #include <stdlib.h>
10
+ #include <string.h>
11
+ #include "glbopts.h"
12
+
13
+ typedef scs_float aa_float;
14
+ typedef scs_int aa_int;
15
+
16
+ typedef struct ACCEL_WORK AaWork;
17
+
18
+ /* Initialize Anderson Acceleration, allocates memory.
19
+ *
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
24
+ *
25
+ * Reurns:
26
+ * Pointer to aa workspace
27
+ */
28
+ AaWork *aa_init(aa_int dim, aa_int aa_mem, aa_int type1);
29
+
30
+ /* Apply Anderson Acceleration.
31
+ *
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
36
+ *
37
+ * Returns:
38
+ * int, a value of 0 is success, <0 is failure at which point f is unchanged
39
+ */
40
+ aa_int aa_apply(aa_float *f, const aa_float *x, AaWork *a);
41
+
42
+ /* Finish Anderson Acceleration, clears memory.
43
+ *
44
+ * Args:
45
+ * a: aa workspace from aa_init.
46
+ */
47
+ void aa_finish(AaWork *a);
48
+
49
+ #define MAX_AA_NRM (1e4)
50
+
51
+ #define MIN(a, b) (((a) < (b)) ? (a) : (b))
52
+
53
+ #ifdef __cplusplus
54
+ }
55
+ #endif
56
+ #endif