scs 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
@@ -0,0 +1,272 @@
1
+ # CMakeLists.txt file for scs
2
+ # This software may be modified and distributed under the terms of the MIT License
3
+
4
+ cmake_minimum_required(VERSION 3.5)
5
+
6
+ project(scs
7
+ LANGUAGES C
8
+ VERSION 2.1.4)
9
+
10
+ # Defines the CMAKE_INSTALL_LIBDIR, CMAKE_INSTALL_BINDIR and many other useful macros.
11
+ # See https://cmake.org/cmake/help/latest/module/GNUInstallDirs.html
12
+ include(GNUInstallDirs)
13
+
14
+ # Control where libraries and executables are placed during the build.
15
+ # With the following settings executables are placed in <the top level of the
16
+ # build tree>/bin and libraries/archives in <top level of the build tree>/lib.
17
+ # This is particularly useful to run ctests on libraries built on Windows
18
+ # machines: tests, which are executables, are placed in the same folders of
19
+ # dlls, which are treated as executables as well, so that they can properly
20
+ # find the libraries to run. This is a because of missing RPATH on Windows.
21
+ set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_BINDIR}")
22
+ set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}")
23
+ set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}")
24
+
25
+ # To build shared libraries in Windows, we set CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS to TRUE.
26
+ # See https://cmake.org/cmake/help/v3.4/variable/CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS.html
27
+ # See https://blog.kitware.com/create-dlls-on-windows-without-declspec-using-new-cmake-export-all-feature/
28
+ set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
29
+
30
+ # Under MSVC, we set CMAKE_DEBUG_POSTFIX to "d" to add a trailing "d" to library
31
+ # built in debug mode. In this Windows user can compile, build and install the
32
+ # library in both Release and Debug configuration avoiding naming clashes in the
33
+ # installation directories.
34
+ if(MSVC)
35
+ set(CMAKE_DEBUG_POSTFIX "d")
36
+ endif()
37
+
38
+ # Build position independent code.
39
+ # Position Independent Code (PIC) is commonly used for shared libraries so that
40
+ # the same shared library code can be loaded in each program address space in a
41
+ # location where it will not overlap with any other uses of such memory.
42
+ # In particular, this option avoids problems occurring when a process wants to
43
+ # load more than one shared library at the same virtual address.
44
+ # Since shared libraries cannot predict where other shared libraries could be
45
+ # loaded, this is an unavoidable problem with the traditional shared library
46
+ # concept.
47
+ # Generating position-independent code is often the default behavior for most
48
+ # modern compilers.
49
+ # Moreover linking a static library that is not built with PIC from a shared
50
+ # library will fail on some compiler/architecture combinations.
51
+ # Further details on PIC can be found here:
52
+ # https://eli.thegreenplace.net/2011/11/03/position-independent-code-pic-in-shared-libraries/
53
+ set(CMAKE_POSITION_INDEPENDENT_CODE ON)
54
+
55
+ # Disable C and C++ compiler extensions.
56
+ # C/CXX_EXTENSIONS are ON by default to allow the compilers to use extended
57
+ # variants of the C/CXX language.
58
+ # However, this could expose cross-platform bugs in user code or in the headers
59
+ # of third-party dependencies and thus it is strongly suggested to turn
60
+ # extensions off.
61
+ set(CMAKE_C_EXTENSIONS OFF)
62
+ set(CMAKE_CXX_EXTENSIONS OFF)
63
+ list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
64
+
65
+ ### Options
66
+ # Shared/Dynamic or Static library?
67
+ option(BUILD_SHARED_LIBS "Build libraries as shared as opposed to static" ON)
68
+
69
+ # Enable RPATH support for installed binaries and libraries
70
+ include(AddInstallRPATHSupport)
71
+ add_install_rpath_support(BIN_DIRS "${CMAKE_INSTALL_FULL_BINDIR}"
72
+ LIB_DIRS "${CMAKE_INSTALL_FULL_LIBDIR}"
73
+ INSTALL_NAME_DIR "${CMAKE_INSTALL_FULL_LIBDIR}"
74
+ USE_LINK_PATH)
75
+
76
+ # Encourage user to specify a build type (e.g. Release, Debug, etc.), otherwise set it to Release.
77
+ if(NOT CMAKE_CONFIGURATION_TYPES)
78
+ if(NOT CMAKE_BUILD_TYPE)
79
+ message(STATUS "Setting build type to 'Release' as none was specified.")
80
+ set_property(CACHE CMAKE_BUILD_TYPE PROPERTY VALUE "Release")
81
+ endif()
82
+ endif()
83
+
84
+
85
+ # Build test related commands?
86
+ option(BUILD_TESTING "Create tests using CMake" OFF)
87
+ if(BUILD_TESTING)
88
+ enable_testing()
89
+ endif()
90
+
91
+ ### Some variables useful for sampling the building process
92
+ # Note that the GPU profile is not compiled.
93
+ set(LINSYS linsys)
94
+ set(DIRSRC ${LINSYS}/cpu/direct)
95
+ set(INDIRSRC ${LINSYS}/cpu/indirect)
96
+ set(EXTERNAL ${LINSYS}/external)
97
+
98
+
99
+ # Common source files
100
+ set(${PROJECT_NAME}_SRC
101
+ src/aa.c
102
+ src/cones.c
103
+ src/ctrlc.c
104
+ src/linalg.c
105
+ src/normalize.c
106
+ src/rw.c
107
+ src/scs.c
108
+ src/scs_version.c
109
+ src/util.c
110
+ ${LINSYS}/csparse.c
111
+ ${LINSYS}/scs_matrix.c)
112
+
113
+ # Common header files
114
+ set(${PROJECT_NAME}_HDR
115
+ include/aa.h
116
+ include/cones.h
117
+ include/ctrlc.h
118
+ include/glbopts.h
119
+ include/linalg.h
120
+ include/linsys.h
121
+ include/normalize.h
122
+ include/rw.h
123
+ include/scs.h
124
+ include/scs_blas.h
125
+ include/util.h
126
+ ${LINSYS}/csparse.h
127
+ ${LINSYS}/scs_matrix.h)
128
+
129
+ # get all the c file in amd/external
130
+ file(GLOB ${PROJECT_NAME}_AMD_EXTERNAL_SRC
131
+ ${EXTERNAL}/amd/*.c
132
+ )
133
+
134
+ # get all the h file in amd/external
135
+ file(GLOB ${PROJECT_NAME}_AMD_EXTERNAL_HDR
136
+ ${EXTERNAL}/amd/*.h
137
+ )
138
+
139
+ # get all the c file in amd/external
140
+ file(GLOB ${PROJECT_NAME}_LDL_EXTERNAL_HDR
141
+ ${EXTERNAL}/qdldl/*.h
142
+ )
143
+
144
+ ### Direct method
145
+ # Here we compile the direct method library
146
+ set(${PROJECT_NAME}_DIRECT ${PROJECT_NAME}dir)
147
+ add_library(${${PROJECT_NAME}_DIRECT}
148
+ ${${PROJECT_NAME}_HDR}
149
+ ${${PROJECT_NAME}_SRC}
150
+ ${DIRSRC}/private.c
151
+ ${DIRSRC}/private.h
152
+ ${EXTERNAL}/qdldl/qdldl.c
153
+ ${${PROJECT_NAME}_AMD_EXTERNAL_SRC}
154
+ ${${PROJECT_NAME}_AMD_EXTERNAL_HDR}
155
+ ${${PROJECT_NAME}_LDL_EXTERNAL_HDR})
156
+
157
+ target_include_directories(${${PROJECT_NAME}_DIRECT} PRIVATE
158
+ "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/${EXTERNAL}/amd;${CMAKE_CURRENT_SOURCE_DIR}/${EXTERNAL}/qdldl;${CMAKE_CURRENT_SOURCE_DIR}/${DIRSRC};${CMAKE_CURRENT_SOURCE_DIR}/${LINSYS}>")
159
+
160
+ target_include_directories(${${PROJECT_NAME}_DIRECT} PUBLIC
161
+ "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>"
162
+ "$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/scs>")
163
+
164
+ # Compiled with blas and lapack, can solve LPs, SOCPs, SDPs, ECPs, and PCPs
165
+ target_compile_definitions(${${PROJECT_NAME}_DIRECT} PRIVATE -DUSE_LAPACK -DCOPYAMATRIX -DCTRLC)
166
+
167
+ # The library depends on math (m) blas and lapack
168
+ target_link_libraries(${${PROJECT_NAME}_DIRECT} PRIVATE
169
+ m
170
+ blas
171
+ lapack)
172
+
173
+ # Set some properties
174
+ set_target_properties(${${PROJECT_NAME}_DIRECT} PROPERTIES
175
+ VERSION ${scs_VERSION}
176
+ PUBLIC_HEADER "${${PROJECT_NAME}_HDR}")
177
+
178
+ add_library(scs::${${PROJECT_NAME}_DIRECT} ALIAS ${${PROJECT_NAME}_DIRECT})
179
+
180
+ # Install the library
181
+ install(TARGETS ${${PROJECT_NAME}_DIRECT}
182
+ EXPORT ${PROJECT_NAME}
183
+ COMPONENT runtime
184
+ LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" COMPONENT shlib
185
+ ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" COMPONENT lib
186
+ RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" COMPONENT bin
187
+ PUBLIC_HEADER DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/scs")
188
+
189
+ # Add the direct method to the set of the compiled targets
190
+ set_property(GLOBAL APPEND PROPERTY scs_TARGETS ${${PROJECT_NAME}_DIRECT})
191
+
192
+ ### Indirect method
193
+ # Here we compile the indirect method library
194
+ set(${PROJECT_NAME}_INDIRECT ${PROJECT_NAME}indir)
195
+ add_library(${${PROJECT_NAME}_INDIRECT}
196
+ ${${PROJECT_NAME}_HDR}
197
+ ${${PROJECT_NAME}_SRC}
198
+ ${INDIRSRC}/private.c
199
+ ${INDIRSRC}/private.h
200
+ ${${${PROJECT_NAME}_INDIRECT}_HDR}
201
+ )
202
+
203
+
204
+ target_include_directories(${${PROJECT_NAME}_INDIRECT} PRIVATE
205
+ "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/${EXTERNAL}/amd;${CMAKE_CURRENT_SOURCE_DIR}/${EXTERNAL}/qdldl;${CMAKE_CURRENT_SOURCE_DIR}/${INDIRSRC};${CMAKE_CURRENT_SOURCE_DIR}/${LINSYS}>")
206
+
207
+ target_include_directories(${${PROJECT_NAME}_INDIRECT} PUBLIC
208
+ "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>"
209
+ "$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/scs>")
210
+
211
+ # Compiled with blas and lapack, can solve LPs, SOCPs, SDPs, ECPs, and PCPs
212
+ target_compile_definitions(${${PROJECT_NAME}_INDIRECT} PRIVATE -DUSE_LAPACK -DCOPYAMATRIX -DCTRLC -DINDIRECT)
213
+
214
+ # The library depends on math (m) blas and lapack
215
+ target_link_libraries(${${PROJECT_NAME}_INDIRECT} PUBLIC
216
+ m
217
+ blas
218
+ lapack)
219
+
220
+ # Set some properties
221
+ set_target_properties(${${PROJECT_NAME}_INDIRECT} PROPERTIES
222
+ VERSION ${scs_VERSION}
223
+ PUBLIC_HEADER "${${${PROJECT_NAME}_INDIRECT}_HDR}")
224
+
225
+ add_library(scs::${${PROJECT_NAME}_INDIRECT} ALIAS ${${PROJECT_NAME}_INDIRECT})
226
+
227
+ # Install the library
228
+ install(TARGETS ${${PROJECT_NAME}_INDIRECT}
229
+ EXPORT ${PROJECT_NAME}
230
+ COMPONENT runtime
231
+ LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" COMPONENT shlib
232
+ ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" COMPONENT lib
233
+ RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" COMPONENT bin
234
+ PUBLIC_HEADER DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/scs")
235
+
236
+ # Add the indirect method to the set of the compiled targets
237
+ set_property(GLOBAL APPEND PROPERTY scs_TARGETS ${${PROJECT_NAME}_INDIRECT})
238
+
239
+ ### Install the .cmake file.
240
+ # Thanks to thanks file it will be possible to link scs to consumer libraries
241
+ include(InstallBasicPackageFiles)
242
+ install_basic_package_files(${PROJECT_NAME}
243
+ NAMESPACE scs::
244
+ VERSION ${${PROJECT_NAME}_VERSION}
245
+ TARGETS_PROPERTY scs_TARGETS
246
+ COMPATIBILITY SameMajorVersion
247
+ VARS_PREFIX ${PROJECT_NAME}
248
+ NO_CHECK_REQUIRED_COMPONENTS_MACRO)
249
+
250
+ ### Add the tests
251
+ if(BUILD_TESTING)
252
+ add_executable(run_tests_direct test/run_tests.c)
253
+ target_link_libraries(run_tests_direct PRIVATE
254
+ scs::scsdir)
255
+ 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}>")
257
+
258
+ add_test(NAME run_tests_direct
259
+ COMMAND run_tests_direct
260
+ WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
261
+
262
+ add_executable(run_tests_indirect test/run_tests.c)
263
+ target_link_libraries(run_tests_indirect PRIVATE
264
+ scs::scsindir)
265
+ 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}>")
267
+
268
+ add_test(NAME run_tests_indirect
269
+ COMMAND run_tests_indirect
270
+ WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
271
+
272
+ endif()
data/vendor/scs/Makefile CHANGED
@@ -1,7 +1,9 @@
1
1
  # MAKEFILE for scs
2
2
  include scs.mk
3
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
4
+ SCS_OBJECTS = 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
+ SCS_O = src/scs.o
6
+ SCS_INDIR_O = src/scs_indir.o
5
7
 
6
8
  SRC_FILES = $(wildcard src/*.c)
7
9
  INC_FILES = $(wildcard include/*.h)
@@ -17,7 +19,7 @@ TARGETS = $(OUT)/demo_socp_indirect $(OUT)/demo_socp_direct $(OUT)/run_from_file
17
19
  default: $(TARGETS) $(OUT)/libscsdir.a $(OUT)/libscsindir.a $(OUT)/libscsdir.$(SHARED) $(OUT)/libscsindir.$(SHARED)
18
20
  @echo "****************************************************************************************"
19
21
  @echo "Successfully compiled scs, copyright Brendan O'Donoghue 2012."
20
- @echo "To test, type '$(OUT)/demo_socp_indirect' to solve a random SOCP."
22
+ @echo "To test, type '$(OUT)/demo_socp_direct' to solve a random SOCP."
21
23
  @echo "**********************************************************************************"
22
24
  ifneq ($(USE_LAPACK), 0)
23
25
  @echo "Compiled with blas and lapack, can solve LPs, SOCPs, SDPs, ECPs, and PCPs"
@@ -28,38 +30,43 @@ else
28
30
  endif
29
31
  @echo "****************************************************************************************"
30
32
 
33
+ $(SCS_O): src/scs.c $(INC_FILES)
34
+ $(CC) $(CFLAGS) -c $< -o $@
35
+
36
+ $(SCS_INDIR_O): src/scs.c $(INC_FILES)
37
+ $(CC) $(CFLAGS) -DINDIRECT=1 -c $< -o $@
38
+
31
39
  %.o : src/%.c
32
40
  $(CC) $(CFLAGS) -c $< -o $@
33
41
 
34
- src/scs.o : $(SRC_FILES) $(INC_FILES)
35
42
  src/util.o : src/util.c include/util.h include/glbopts.h
36
43
  src/cones.o : src/cones.c include/cones.h include/scs_blas.h
37
44
  src/aa.o : src/aa.c include/aa.h include/scs_blas.h
38
45
  src/rw.o : src/rw.c include/rw.h
39
- src/cs.o : src/cs.c include/cs.h
40
46
  src/linalg.o: src/linalg.c include/linalg.h
41
47
  src/ctrl.o : src/ctrl.c include/ctrl.h
42
48
  src/scs_version.o: src/scs_version.c include/glbopts.h
43
49
 
44
50
  $(DIRSRC)/private.o: $(DIRSRC)/private.c $(DIRSRC)/private.h
45
51
  $(INDIRSRC)/indirect/private.o: $(INDIRSRC)/private.c $(INDIRSRC)/private.h
46
- $(LINSYS)/amatrix.o: $(LINSYS)/amatrix.c $(LINSYS)/amatrix.h
52
+ $(LINSYS)/scs_matrix.o: $(LINSYS)/scs_matrix.c $(LINSYS)/scs_matrix.h
53
+ $(LINSYS)/csparse.o: $(LINSYS)/csparse.c $(LINSYS)/csparse.h
47
54
 
48
- $(OUT)/libscsdir.a: $(SCS_OBJECTS) $(DIRSRC)/private.o $(AMD_OBJS) $(LDL_OBJS) $(LINSYS)/amatrix.o
55
+ $(OUT)/libscsdir.a: $(SCS_O) $(SCS_OBJECTS) $(DIRSRC)/private.o $(AMD_OBJS) $(LDL_OBJS) $(LINSYS)/scs_matrix.o $(LINSYS)/csparse.o
49
56
  mkdir -p $(OUT)
50
57
  $(ARCHIVE) $@ $^
51
58
  - $(RANLIB) $@
52
59
 
53
- $(OUT)/libscsindir.a: $(SCS_OBJECTS) $(INDIRSRC)/private.o $(LINSYS)/amatrix.o
60
+ $(OUT)/libscsindir.a: $(SCS_INDIR_O) $(SCS_OBJECTS) $(INDIRSRC)/private.o $(LINSYS)/scs_matrix.o $(LINSYS)/csparse.o
54
61
  mkdir -p $(OUT)
55
62
  $(ARCHIVE) $@ $^
56
63
  - $(RANLIB) $@
57
64
 
58
- $(OUT)/libscsdir.$(SHARED): $(SCS_OBJECTS) $(DIRSRC)/private.o $(AMD_OBJS) $(LDL_OBJS) $(LINSYS)/amatrix.o
65
+ $(OUT)/libscsdir.$(SHARED): $(SCS_O) $(SCS_OBJECTS) $(DIRSRC)/private.o $(AMD_OBJS) $(LDL_OBJS) $(LINSYS)/scs_matrix.o $(LINSYS)/csparse.o
59
66
  mkdir -p $(OUT)
60
67
  $(CC) $(CFLAGS) -shared -Wl,$(SONAME),$(@:$(OUT)/%=%) -o $@ $^ $(LDFLAGS)
61
68
 
62
- $(OUT)/libscsindir.$(SHARED): $(SCS_OBJECTS) $(INDIRSRC)/private.o $(LINSYS)/amatrix.o
69
+ $(OUT)/libscsindir.$(SHARED): $(SCS_INDIR_O) $(SCS_OBJECTS) $(INDIRSRC)/private.o $(LINSYS)/scs_matrix.o $(LINSYS)/csparse.o
63
70
  mkdir -p $(OUT)
64
71
  $(CC) $(CFLAGS) -shared -Wl,$(SONAME),$(@:$(OUT)/%=%) -o $@ $^ $(LDFLAGS)
65
72
 
@@ -110,20 +117,20 @@ $(LINSYS)/gpu/gpu.o: $(LINSYS)/gpu/gpu.c
110
117
  $(GPUINDIR)/private.o: $(GPUINDIR)/private.c
111
118
  $(CUCC) -c -o $(GPUINDIR)/private.o $^ $(CUDAFLAGS)
112
119
 
113
- # $(OUT)/libscsgpudir.$(SHARED): $(SCS_OBJECTS) $(GPUDIR)/private.o $(AMD_OBJS) $(LINSYS)/amatrix.o $(LINSYS)/gpu/gpu.o
120
+ # $(OUT)/libscsgpudir.$(SHARED): $(SCS_O) $(SCS_OBJECTS) $(GPUDIR)/private.o $(AMD_OBJS) $(LINSYS)/scs_matrix.o $(LINSYS)/gpu/gpu.o
114
121
  # mkdir -p $(OUT)
115
122
  # $(CC) $(CFLAGS) -shared -Wl,$(SONAME),$(@:$(OUT)/%=%) -o $@ $^ $(LDFLAGS) $(CULDFLAGS)
116
123
 
117
- # $(OUT)/libscsgpudir.a: $(SCS_OBJECTS) $(GPUDIR)/private.o $(AMD_OBJS) $(LINSYS)/amatrix.o $(LINSYS)/gpu/gpu.o
124
+ # $(OUT)/libscsgpudir.a: $(SCS_INDIR_O) $(SCS_OBJECTS) $(GPUDIR)/private.o $(AMD_OBJS) $(LINSYS)/scs_matrix.o $(LINSYS)/gpu/gpu.o
118
125
  # mkdir -p $(OUT)
119
126
  # $(ARCHIVE) $@ $^
120
127
  # - $(RANLIB) $@
121
128
 
122
- $(OUT)/libscsgpuindir.$(SHARED): $(SCS_OBJECTS) $(GPUINDIR)/private.o $(LINSYS)/amatrix.o $(LINSYS)/gpu/gpu.o
129
+ $(OUT)/libscsgpuindir.$(SHARED): $(SCS_O) $(SCS_OBJECTS) $(GPUINDIR)/private.o $(LINSYS)/scs_matrix.o $(LINSYS)/csparse.o $(LINSYS)/gpu/gpu.o
123
130
  mkdir -p $(OUT)
124
131
  $(CC) $(CFLAGS) -shared -Wl,$(SONAME),$(@:$(OUT)/%=%) -o $@ $^ $(LDFLAGS) $(CULDFLAGS)
125
132
 
126
- $(OUT)/libscsgpuindir.a: $(SCS_OBJECTS) $(GPUINDIR)/private.o $(LINSYS)/amatrix.o $(LINSYS)/gpu/gpu.o
133
+ $(OUT)/libscsgpuindir.a: $(SCS_INDIR_O) $(SCS_OBJECTS) $(GPUINDIR)/private.o $(LINSYS)/scs_matrix.o $(LINSYS)/csparse.o $(LINSYS)/gpu/gpu.o
127
134
  mkdir -p $(OUT)
128
135
  $(ARCHIVE) $@ $^
129
136
  - $(RANLIB) $@
@@ -136,7 +143,7 @@ $(OUT)/demo_socp_gpu_indirect: test/random_socp_prob.c $(OUT)/libscsgpuindir.a
136
143
 
137
144
  .PHONY: clean purge
138
145
  clean:
139
- @rm -rf $(TARGETS) $(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
140
147
  @rm -rf $(OUT)/*.dSYM
141
148
  @rm -rf matlab/*.mex*
142
149
  @rm -rf .idea
@@ -153,7 +160,7 @@ INSTALL_GPU_TARGETS = $(OUT)/libscsgpuindir.a $(OUT)/libscsgpuindir.$(SHARED) #
153
160
  INSTALL_INC_DIR = $(DESTDIR)$(PREFIX)/include/scs/
154
161
  INSTALL_LIB_DIR = $(DESTDIR)$(PREFIX)/lib/
155
162
 
156
- .PHONY: install install_gpu
163
+ .PHONY: install install_gpu direct indirect
157
164
  install: $(INSTALL_INC_FILES) $(INSTALL_TARGETS)
158
165
  $(INSTALL) -d $(INSTALL_INC_DIR) $(INSTALL_LIB_DIR)
159
166
  $(INSTALL) -m 644 $(INSTALL_INC_FILES) $(INSTALL_INC_DIR)
@@ -162,3 +169,5 @@ install_gpu: $(INSTALL_INC_FILES) $(INSTALL_GPU_TARGETS)
162
169
  $(INSTALL) -d $(INSTALL_INC_DIR) $(INSTALL_LIB_DIR)
163
170
  $(INSTALL) -m 644 $(INSTALL_INC_FILES) $(INSTALL_INC_DIR)
164
171
  $(INSTALL) -m 644 $(INSTALL_GPU_TARGETS) $(INSTALL_LIB_DIR)
172
+ direct:$(OUT)/libscsdir.$(SHARED) $(OUT)/demo_socp_direct $(OUT)/run_from_file_direct $(OUT)/run_tests_direct
173
+ indirect:$(OUT)/libscsindir.$(SHARED) $(OUT)/demo_socp_indirect $(OUT)/run_from_file_indirect $(OUT)/run_tests_indirect
data/vendor/scs/README.md CHANGED
@@ -1,220 +1,12 @@
1
- SCS
2
- ====
1
+ <h1 align="center" margin=0px>
2
+ <img src="https://github.com/cvxgrp/scs/blob/master/docs/src/_static/scs_logo.png" alt="Intersection of a cone and a polyhedron" width="450">
3
+ </h1>
3
4
 
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)
5
+ [![Build Status](https://github.com/cvxgrp/scs/actions/workflows/build.yml/badge.svg)](https://github.com/cvxgrp/scs/actions/workflows/build.yml)
6
+ [![Coverage Status](https://coveralls.io/repos/github/cvxgrp/scs/badge.svg?branch=master)](https://coveralls.io/github/cvxgrp/scs?branch=master)
6
7
 
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), programs via the linked
16
- interfaces. It can also be called as a solver from convex optimization
17
- toolboxes [CVX](http://cvxr.com/cvx/) (3.0 or later),
18
- [CVXPY](https://github.com/cvxgrp/cvxpy),
19
- [Convex.jl](https://github.com/JuliaOpt/Convex.jl), and
20
- [Yalmip](https://github.com/johanlofberg/YALMIP).
21
-
22
- The current version is `2.1.2`. If you wish to cite SCS, please use the
23
- following:
24
- ```
25
- @article{ocpb:16,
26
- author = {B. O'Donoghue and E. Chu and N. Parikh and S. Boyd},
27
- title = {Conic Optimization via Operator Splitting and Homogeneous Self-Dual Embedding},
28
- journal = {Journal of Optimization Theory and Applications},
29
- month = {June},
30
- year = {2016},
31
- volume = {169},
32
- number = {3},
33
- pages = {1042-1068},
34
- url = {http://stanford.edu/~boyd/papers/scs.html},
35
- }
36
- @misc{scs,
37
- author = {B. O'Donoghue and E. Chu and N. Parikh and S. Boyd},
38
- title = {{SCS}: Splitting Conic Solver, version 2.1.2},
39
- howpublished = {\url{https://github.com/cvxgrp/scs}},
40
- month = nov,
41
- year = 2019
42
- }
43
- ```
44
-
45
- ----
46
- SCS numerically solves convex cone programs using the alternating direction
47
- method of multipliers
48
- ([ADMM](http://web.stanford.edu/~boyd/papers/admm_distr_stats.html)). It
49
- returns solutions to both the primal and dual problems if the problem is
50
- feasible, or a certificate of infeasibility otherwise. It solves the following
51
- primal cone problem:
52
-
53
- ```
54
- minimize c'x
55
- subject to Ax + s = b
56
- s in K
57
- ```
58
- over variables `x` and `s`, where `A`, `b` and `c` are user-supplied data and
59
- `K` is a user-defined convex cone. The dual problem is given by
60
- ```
61
- maximize -b'y
62
- subject to -A'y == c
63
- y in K^*
64
- ```
65
- over variable `y`, where `K^*` denotes the dual cone to `K`.
66
-
67
- The cone `K` can be any Cartesian product of the following primitive cones:
68
- + zero cone `{x | x = 0 }` (dual to the free cone `{x | x in R}`)
69
- + positive orthant `{x | x >= 0}`
70
- + second-order cone `{(t,x) | ||x||_2 <= t}`
71
- + positive semidefinite cone `{ X | min(eig(X)) >= 0, X = X^T }`
72
- + exponential cone `{(x,y,z) | y e^(x/y) <= z, y>0 }`
73
- + dual exponential cone `{(u,v,w) | −u e^(v/u) <= e w, u<0}`
74
- + power cone `{(x,y,z) | x^a * y^(1-a) >= |z|, x>=0, y>=0}`
75
- + dual power cone `{(u,v,w) | (u/a)^a * (v/(1-a))^(1-a) >= |w|, u>=0, v>=0}`
76
-
77
- The rows of the data matrix `A` correspond to the cones in `K`. **The rows of
78
- `A` must be in the order of the cones given above, i.e., first come the rows
79
- that correspond to the zero/free cones, then those that correspond to the
80
- positive orthants, then SOCs, etc.** For a `k` dimensional semidefinite cone
81
- when interpreting the rows of the data matrix `A` SCS assumes that the `k x k`
82
- matrix variable has been vectorized by scaling the off-diagonal entries by
83
- `sqrt(2)` and stacking the **lower triangular elements column-wise** to create a
84
- vector of length `k(k+1)/2`. See the section on semidefinite programming below.
85
-
86
- At termination SCS returns solution `(x*, s*, y*)` if the problem is feasible,
87
- or a certificate of infeasibility otherwise. See
88
- [here](http://web.stanford.edu/~boyd/cvxbook/) for more details about
89
- cone programming and certificates of infeasibility.
90
-
91
- **Anderson Acceleration**
92
-
93
- By default SCS uses Anderson acceleration (AA) to speed up convergence. The
94
- number of iterates that SCS uses in the AA calculation can be controlled by the
95
- parameter `acceleration_lookback` in the settings struct. It defaults to 10. AA
96
- is available as a standalone package [here](https://github.com/cvxgrp/aa). More
97
- details are available in our paper on AA
98
- [here](https://stanford.edu/~boyd/papers/nonexp_global_aa1.html).
99
-
100
- **Semidefinite Programming**
101
-
102
- SCS assumes that the matrix variables and the input data corresponding to
103
- semidefinite cones have been vectorized by **scaling the off-diagonal entries by
104
- `sqrt(2)`** and stacking the lower triangular elements **column-wise**. For a `k
105
- x k` matrix variable (or data matrix) this operation would create a vector of
106
- length `k(k+1)/2`. Scaling by `sqrt(2)` is required to preserve the
107
- inner-product.
108
-
109
- **To recover the matrix solution this operation must be inverted on the
110
- components of the vector returned by SCS corresponding to semidefinite cones**.
111
- That is, the off-diagonal entries must be scaled by `1/sqrt(2)` and the upper
112
- triangular entries are filled in by copying the values of lower triangular
113
- entries.
114
-
115
- More explicitly, we want to express
116
- `Tr(C X)` as `vec(C)'*vec(X)`, where the `vec` operation takes the `k x k` matrix
117
- ```
118
- X = [ X11 X12 ... X1k
119
- X21 X22 ... X2k
120
- ...
121
- Xk1 Xk2 ... Xkk ]
122
- ```
123
- and produces a vector consisting of
124
- ```
125
- vec(X) = (X11, sqrt(2)*X21, ..., sqrt(2)*Xk1, X22, sqrt(2)*X32, ..., Xkk).
126
- ```
127
-
128
- **Linear equation solvers**
129
-
130
- Each iteration of SCS requires the solution of a set of linear equations. This
131
- package includes two implementations for solving linear equations: a direct
132
- solver which uses a cached LDL factorization and an indirect solver based on
133
- conjugate gradients. The indirect solver can be run on either the cpu or
134
- gpu.
135
-
136
- The direct solver uses external numerical linear algebra packages:
137
- * [QDLDL](https://github.com/oxfordcontrol/qdldl)
138
- * [AMD](http://www.cise.ufl.edu/research/sparse/).
139
-
140
- ### Using SCS in C
141
- Typing `make` at the command line will compile the code and create SCS libraries
142
- in the `out` folder. To run the tests execute:
143
- ```sh
144
- make
145
- make test
146
- test/run_tests
147
- ```
148
-
149
- If `make` completes successfully, it will produce two static library files,
150
- `libscsdir.a`, `libscsindir.a`, and two dynamic library files `libscsdir.ext`,
151
- `libscsindir.ext` (where `.ext` extension is platform dependent) in the same
152
- folder. It will also produce two demo binaries in the `out` folder named
153
- `demo_socp_direct`, and `demo_socp_indirect`. If you have a GPU and have CUDA
154
- installed, you can also execture `make gpu` to compile SCS to run on the GPU
155
- which will create additional libraries and demo binaries in the `out` folder
156
- corresponding to the gpu version. Note that the GPU version requires 32 bit
157
- ints, which can be enforced by compiling with `DLONG=0`.
158
8
 
159
- To use the libraries in your own source code, compile your code with the linker
160
- option `-L(PATH_TO_SCS_LIBS)` and `-lscsdir` or `-lscsindir` (as needed). The
161
- API and required data structures are defined in the file `include/scs.h`. The
162
- four main API functions are:
163
-
164
- * `ScsWork * scs_init(const ScsData * d, const ScsCone * k, ScsInfo * info);`
165
-
166
- This initializes the ScsWork struct containing the workspace that scs will
167
- use, and performs the necessary preprocessing (e.g. matrix factorization).
168
- All inputs `d`, `k`, and `info` must be memory allocated before calling.
169
-
170
- * `scs_int scs_solve(ScsWork * w, const ScsData * d, const ScsCone * k, ScsSolution * sol, ScsInfo * info);`
171
-
172
- This solves the problem as defined by ScsData `d` and ScsCone `k` using the
173
- workspace in `w`. The solution is returned in `sol` and information about
174
- the solve is returned in `info` (outputs must have memory allocated before
175
- calling). None of the inputs can be NULL. You can call `scs_solve` many
176
- times for one call to `scs_init`, so long as the matrix `A` does not change
177
- (vectors `b` and `c` can change).
178
-
179
- * `void scs_finish(ScsWork * w);`
180
-
181
- Called after all solves completed to free allocated memory and other
182
- cleanup.
183
-
184
- * `scs_int scs(const ScsData * d, const ScsCone * k, ScsSolution * sol, ScsInfo * info);`
185
-
186
- Convenience method that simply calls all the above routines in order, for
187
- cases where the workspace does not need to be reused. All inputs must have
188
- memory allocated before this call.
189
-
190
- The data matrix `A` is specified in column-compressed format and the vectors `b`
191
- and `c` are specified as dense arrays. The solutions `x` (primal), `s` (slack),
192
- and `y` (dual) are returned as dense arrays. Cones are specified as the struct
193
- defined in `include/scs.h`, the rows of `A` must correspond to the cones in the
194
- exact order as specified by the cone struct (i.e. put linear cones before
195
- second-order cones etc.).
196
-
197
- **Warm-start**
198
-
199
- You can warm-start SCS (supply a guess of the solution) by setting `warm_start`
200
- in the ScsData struct to `1` and supplying the warm-starts in the ScsSolution
201
- struct (`x`,`y`, and `s`). All inputs must be warm-started if any one is. These
202
- are used to initialize the iterates in `scs_solve`.
203
-
204
- **Re-using matrix factorization**
205
-
206
- If using the direct version you can factorize the matrix once and solve many
207
- times. Simply call `scs_init` once, and use `scs_solve` many times with the same
208
- workspace, changing the input data `b` and `c` (and optionally warm-starts) for
209
- each iteration.
210
-
211
- **Using your own linear system solver**
212
-
213
- To use your own linear system solver simply implement all the methods and the
214
- two structs in `include/linsys.h` and plug it in.
215
-
216
- **BLAS / LAPACK install error**
9
+ SCS (`splitting conic solver`) is a numerical optimization package for solving
10
+ large-scale convex cone problems. The current version is `3.0.0`.
217
11
 
218
- If you get an error like `cannot find -lblas` or `cannot find -llapack`, then
219
- you need to install blas and lapack and / or update your environment variables
220
- to point to the install locations.
12
+ The full documentation is available [here](https://www.cvxgrp.org/scs/).