scs 0.2.2 → 0.3.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 (103) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +16 -0
  3. data/LICENSE.txt +18 -18
  4. data/README.md +19 -14
  5. data/lib/scs/ffi.rb +31 -20
  6. data/lib/scs/solver.rb +32 -9
  7. data/lib/scs/version.rb +1 -1
  8. data/vendor/scs/CITATION.cff +39 -0
  9. data/vendor/scs/CMakeLists.txt +320 -0
  10. data/vendor/scs/Makefile +32 -23
  11. data/vendor/scs/README.md +9 -218
  12. data/vendor/scs/include/aa.h +67 -23
  13. data/vendor/scs/include/cones.h +22 -19
  14. data/vendor/scs/include/glbopts.h +107 -79
  15. data/vendor/scs/include/linalg.h +3 -4
  16. data/vendor/scs/include/linsys.h +58 -44
  17. data/vendor/scs/include/normalize.h +6 -5
  18. data/vendor/scs/include/rw.h +8 -2
  19. data/vendor/scs/include/scs.h +257 -141
  20. data/vendor/scs/include/scs_types.h +34 -0
  21. data/vendor/scs/include/scs_work.h +83 -0
  22. data/vendor/scs/include/util.h +3 -15
  23. data/vendor/scs/linsys/cpu/direct/private.c +241 -232
  24. data/vendor/scs/linsys/cpu/direct/private.h +13 -7
  25. data/vendor/scs/linsys/cpu/indirect/private.c +194 -118
  26. data/vendor/scs/linsys/cpu/indirect/private.h +7 -4
  27. data/vendor/scs/linsys/csparse.c +87 -0
  28. data/vendor/scs/linsys/csparse.h +34 -0
  29. data/vendor/scs/linsys/external/amd/SuiteSparse_config.c +6 -6
  30. data/vendor/scs/linsys/external/amd/SuiteSparse_config.h +6 -1
  31. data/vendor/scs/linsys/external/amd/amd_internal.h +1 -1
  32. data/vendor/scs/linsys/external/amd/amd_order.c +5 -5
  33. data/vendor/scs/linsys/external/qdldl/changes +2 -0
  34. data/vendor/scs/linsys/external/qdldl/qdldl.c +29 -46
  35. data/vendor/scs/linsys/external/qdldl/qdldl.h +33 -41
  36. data/vendor/scs/linsys/external/qdldl/qdldl_types.h +11 -3
  37. data/vendor/scs/linsys/gpu/gpu.c +58 -21
  38. data/vendor/scs/linsys/gpu/gpu.h +70 -35
  39. data/vendor/scs/linsys/gpu/indirect/private.c +394 -157
  40. data/vendor/scs/linsys/gpu/indirect/private.h +27 -12
  41. data/vendor/scs/linsys/scs_matrix.c +478 -0
  42. data/vendor/scs/linsys/scs_matrix.h +70 -0
  43. data/vendor/scs/scs.mk +14 -10
  44. data/vendor/scs/src/aa.c +394 -110
  45. data/vendor/scs/src/cones.c +497 -359
  46. data/vendor/scs/src/ctrlc.c +15 -5
  47. data/vendor/scs/src/linalg.c +107 -26
  48. data/vendor/scs/src/normalize.c +30 -72
  49. data/vendor/scs/src/rw.c +202 -27
  50. data/vendor/scs/src/scs.c +769 -571
  51. data/vendor/scs/src/scs_version.c +11 -3
  52. data/vendor/scs/src/util.c +37 -106
  53. data/vendor/scs/test/minunit.h +22 -8
  54. data/vendor/scs/test/problem_utils.h +180 -25
  55. data/vendor/scs/test/problems/degenerate.h +130 -0
  56. data/vendor/scs/test/problems/hs21_tiny_qp.h +124 -0
  57. data/vendor/scs/test/problems/hs21_tiny_qp_rw.h +116 -0
  58. data/vendor/scs/test/problems/infeasible_tiny_qp.h +100 -0
  59. data/vendor/scs/test/problems/qafiro_tiny_qp.h +199 -0
  60. data/vendor/scs/test/problems/random_prob +0 -0
  61. data/vendor/scs/test/problems/random_prob.h +45 -0
  62. data/vendor/scs/test/problems/rob_gauss_cov_est.h +188 -31
  63. data/vendor/scs/test/problems/small_lp.h +14 -13
  64. data/vendor/scs/test/problems/small_qp.h +352 -0
  65. data/vendor/scs/test/problems/test_validation.h +43 -0
  66. data/vendor/scs/test/problems/unbounded_tiny_qp.h +82 -0
  67. data/vendor/scs/test/random_socp_prob.c +54 -53
  68. data/vendor/scs/test/rng.h +109 -0
  69. data/vendor/scs/test/run_from_file.c +20 -11
  70. data/vendor/scs/test/run_tests.c +35 -2
  71. metadata +29 -98
  72. data/vendor/scs/linsys/amatrix.c +0 -305
  73. data/vendor/scs/linsys/amatrix.h +0 -36
  74. data/vendor/scs/linsys/amatrix.o +0 -0
  75. data/vendor/scs/linsys/cpu/direct/private.o +0 -0
  76. data/vendor/scs/linsys/cpu/indirect/private.o +0 -0
  77. data/vendor/scs/linsys/external/amd/SuiteSparse_config.o +0 -0
  78. data/vendor/scs/linsys/external/amd/amd_1.o +0 -0
  79. data/vendor/scs/linsys/external/amd/amd_2.o +0 -0
  80. data/vendor/scs/linsys/external/amd/amd_aat.o +0 -0
  81. data/vendor/scs/linsys/external/amd/amd_control.o +0 -0
  82. data/vendor/scs/linsys/external/amd/amd_defaults.o +0 -0
  83. data/vendor/scs/linsys/external/amd/amd_dump.o +0 -0
  84. data/vendor/scs/linsys/external/amd/amd_global.o +0 -0
  85. data/vendor/scs/linsys/external/amd/amd_info.o +0 -0
  86. data/vendor/scs/linsys/external/amd/amd_order.o +0 -0
  87. data/vendor/scs/linsys/external/amd/amd_post_tree.o +0 -0
  88. data/vendor/scs/linsys/external/amd/amd_postorder.o +0 -0
  89. data/vendor/scs/linsys/external/amd/amd_preprocess.o +0 -0
  90. data/vendor/scs/linsys/external/amd/amd_valid.o +0 -0
  91. data/vendor/scs/linsys/external/qdldl/qdldl.o +0 -0
  92. data/vendor/scs/src/aa.o +0 -0
  93. data/vendor/scs/src/cones.o +0 -0
  94. data/vendor/scs/src/ctrlc.o +0 -0
  95. data/vendor/scs/src/linalg.o +0 -0
  96. data/vendor/scs/src/normalize.o +0 -0
  97. data/vendor/scs/src/rw.o +0 -0
  98. data/vendor/scs/src/scs.o +0 -0
  99. data/vendor/scs/src/scs_version.o +0 -0
  100. data/vendor/scs/src/util.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,320 @@
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 3.1.1)
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
+ # Add uninstall target
92
+ # After 'make install' can run 'make uninstall' to remove.
93
+ include(AddUninstallTarget)
94
+
95
+ ### Some variables useful for sampling the building process
96
+ # Note that the GPU profile is not compiled.
97
+ set(LINSYS linsys)
98
+ set(DIRSRC ${LINSYS}/cpu/direct)
99
+ set(INDIRSRC ${LINSYS}/cpu/indirect)
100
+ set(EXTERNAL ${LINSYS}/external)
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 -DCOPYAMATRIX -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)
142
+
143
+ # Common source files
144
+ set(${PROJECT_NAME}_SRC
145
+ src/aa.c
146
+ src/cones.c
147
+ src/ctrlc.c
148
+ src/linalg.c
149
+ src/normalize.c
150
+ src/rw.c
151
+ src/scs.c
152
+ src/scs_version.c
153
+ src/util.c
154
+ ${LINSYS}/csparse.c
155
+ ${LINSYS}/scs_matrix.c)
156
+
157
+ # Common header files
158
+ set(${PROJECT_NAME}_HDR
159
+ include/aa.h
160
+ include/cones.h
161
+ include/ctrlc.h
162
+ include/glbopts.h
163
+ include/linalg.h
164
+ include/linsys.h
165
+ include/normalize.h
166
+ include/rw.h
167
+ include/scs.h
168
+ include/scs_blas.h
169
+ include/scs_types.h
170
+ include/scs_work.h
171
+ include/util.h
172
+ ${LINSYS}/csparse.h
173
+ ${LINSYS}/scs_matrix.h)
174
+
175
+ # get all the c file in amd/external
176
+ file(GLOB ${PROJECT_NAME}_AMD_EXTERNAL_SRC
177
+ ${EXTERNAL}/amd/*.c
178
+ )
179
+
180
+ # get all the h file in amd/external
181
+ file(GLOB ${PROJECT_NAME}_AMD_EXTERNAL_HDR
182
+ ${EXTERNAL}/amd/*.h
183
+ )
184
+
185
+ # get all the c file in amd/external
186
+ file(GLOB ${PROJECT_NAME}_LDL_EXTERNAL_HDR
187
+ ${EXTERNAL}/qdldl/*.h
188
+ )
189
+
190
+ ### Direct method
191
+ # Here we compile the direct method library
192
+ set(${PROJECT_NAME}_DIRECT ${PROJECT_NAME}dir)
193
+ add_library(${${PROJECT_NAME}_DIRECT}
194
+ ${${PROJECT_NAME}_HDR}
195
+ ${${PROJECT_NAME}_SRC}
196
+ ${DIRSRC}/private.c
197
+ ${DIRSRC}/private.h
198
+ ${EXTERNAL}/qdldl/qdldl.c
199
+ ${${PROJECT_NAME}_AMD_EXTERNAL_SRC}
200
+ ${${PROJECT_NAME}_AMD_EXTERNAL_HDR}
201
+ ${${PROJECT_NAME}_LDL_EXTERNAL_HDR})
202
+
203
+ target_include_directories(${${PROJECT_NAME}_DIRECT} PRIVATE
204
+ "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/${EXTERNAL}/amd;${CMAKE_CURRENT_SOURCE_DIR}/${EXTERNAL}/qdldl;${CMAKE_CURRENT_SOURCE_DIR}/${DIRSRC};${CMAKE_CURRENT_SOURCE_DIR}/${LINSYS}>")
205
+
206
+ target_include_directories(${${PROJECT_NAME}_DIRECT} PUBLIC
207
+ "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>"
208
+ "$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/scs>")
209
+
210
+ # Compiled with blas and lapack, can solve LPs, SOCPs, SDPs, ECPs, and PCPs
211
+ target_compile_definitions(${${PROJECT_NAME}_DIRECT} PRIVATE ${COMPILER_OPTS})
212
+
213
+ # The library depends on math (m) blas and lapack
214
+ target_link_libraries(${${PROJECT_NAME}_DIRECT} PRIVATE
215
+ m
216
+ blas
217
+ lapack)
218
+
219
+ # Set some properties
220
+ set_target_properties(${${PROJECT_NAME}_DIRECT} PROPERTIES
221
+ VERSION ${scs_VERSION}
222
+ PUBLIC_HEADER "${${PROJECT_NAME}_PUBLIC_HDR}")
223
+
224
+ add_library(scs::${${PROJECT_NAME}_DIRECT} ALIAS ${${PROJECT_NAME}_DIRECT})
225
+
226
+ # Install the library
227
+ install(TARGETS ${${PROJECT_NAME}_DIRECT}
228
+ EXPORT ${PROJECT_NAME}
229
+ COMPONENT runtime
230
+ LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" COMPONENT shlib
231
+ ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" COMPONENT lib
232
+ RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" COMPONENT bin
233
+ PUBLIC_HEADER DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/scs")
234
+
235
+ # Add the direct method to the set of the compiled targets
236
+ set_property(GLOBAL APPEND PROPERTY scs_TARGETS ${${PROJECT_NAME}_DIRECT})
237
+
238
+ ### Indirect method
239
+ # Here we compile the indirect method library
240
+ set(${PROJECT_NAME}_INDIRECT ${PROJECT_NAME}indir)
241
+ add_library(${${PROJECT_NAME}_INDIRECT}
242
+ ${${PROJECT_NAME}_HDR}
243
+ ${${PROJECT_NAME}_SRC}
244
+ ${INDIRSRC}/private.c
245
+ ${INDIRSRC}/private.h
246
+ ${${${PROJECT_NAME}_INDIRECT}_HDR}
247
+ )
248
+
249
+
250
+ target_include_directories(${${PROJECT_NAME}_INDIRECT} PRIVATE
251
+ "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/${EXTERNAL}/amd;${CMAKE_CURRENT_SOURCE_DIR}/${EXTERNAL}/qdldl;${CMAKE_CURRENT_SOURCE_DIR}/${INDIRSRC};${CMAKE_CURRENT_SOURCE_DIR}/${LINSYS}>")
252
+
253
+ target_include_directories(${${PROJECT_NAME}_INDIRECT} PUBLIC
254
+ "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>"
255
+ "$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/scs>")
256
+
257
+ # Compiled with blas and lapack, can solve LPs, SOCPs, SDPs, ECPs, and PCPs
258
+ target_compile_definitions(${${PROJECT_NAME}_INDIRECT} PRIVATE ${COMPILER_OPTS} -DINDIRECT)
259
+
260
+ # The library depends on math (m) blas and lapack
261
+ target_link_libraries(${${PROJECT_NAME}_INDIRECT} PUBLIC
262
+ m
263
+ blas
264
+ lapack)
265
+
266
+ # Set some properties
267
+ set_target_properties(${${PROJECT_NAME}_INDIRECT} PROPERTIES
268
+ VERSION ${scs_VERSION}
269
+ PUBLIC_HEADER "${${PROJECT_NAME}_PUBLIC_HDR}")
270
+
271
+ add_library(scs::${${PROJECT_NAME}_INDIRECT} ALIAS ${${PROJECT_NAME}_INDIRECT})
272
+
273
+ # Install the library
274
+ install(TARGETS ${${PROJECT_NAME}_INDIRECT}
275
+ EXPORT ${PROJECT_NAME}
276
+ COMPONENT runtime
277
+ LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" COMPONENT shlib
278
+ ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" COMPONENT lib
279
+ RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" COMPONENT bin
280
+ PUBLIC_HEADER DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/scs")
281
+
282
+ # Add the indirect method to the set of the compiled targets
283
+ set_property(GLOBAL APPEND PROPERTY scs_TARGETS ${${PROJECT_NAME}_INDIRECT})
284
+
285
+ ### Install the .cmake file.
286
+ # Thanks to thanks file it will be possible to link scs to consumer libraries
287
+ include(InstallBasicPackageFiles)
288
+ install_basic_package_files(${PROJECT_NAME}
289
+ NAMESPACE scs::
290
+ VERSION ${${PROJECT_NAME}_VERSION}
291
+ TARGETS_PROPERTY scs_TARGETS
292
+ COMPATIBILITY SameMajorVersion
293
+ VARS_PREFIX ${PROJECT_NAME}
294
+ NO_CHECK_REQUIRED_COMPONENTS_MACRO)
295
+
296
+ ### Add the tests
297
+ if(BUILD_TESTING)
298
+ add_executable(run_tests_direct test/run_tests.c)
299
+ target_compile_definitions(run_tests_direct PRIVATE ${COMPILER_OPTS})
300
+ target_link_libraries(run_tests_direct PRIVATE
301
+ scs::scsdir)
302
+ target_include_directories(run_tests_direct PRIVATE
303
+ "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/test;${CMAKE_CURRENT_SOURCE_DIR}/include;${CMAKE_CURRENT_SOURCE_DIR}/${LINSYS}>" )
304
+
305
+ add_test(NAME run_tests_direct
306
+ COMMAND run_tests_direct
307
+ WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
308
+
309
+ add_executable(run_tests_indirect test/run_tests.c)
310
+ target_compile_definitions(run_tests_indirect PRIVATE ${COMPILER_OPTS})
311
+ target_link_libraries(run_tests_indirect PRIVATE
312
+ scs::scsindir)
313
+ target_include_directories(run_tests_indirect PRIVATE
314
+ "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/test;${CMAKE_CURRENT_SOURCE_DIR}/include;${CMAKE_CURRENT_SOURCE_DIR}/${LINSYS}>" )
315
+
316
+ add_test(NAME run_tests_indirect
317
+ COMMAND run_tests_indirect
318
+ WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
319
+
320
+ 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
- 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
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)
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
 
@@ -108,22 +115,22 @@ $(LINSYS)/gpu/gpu.o: $(LINSYS)/gpu/gpu.c
108
115
  # $(CUCC) -c -o $(GPUDIR)/private.o $^ $(CUDAFLAGS)
109
116
 
110
117
  $(GPUINDIR)/private.o: $(GPUINDIR)/private.c
111
- $(CUCC) -c -o $(GPUINDIR)/private.o $^ $(CUDAFLAGS)
118
+ $(CUCC) -c -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 $(LINSYS)/gpu/*.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,222 +1,13 @@
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
+ [![Documentation](https://img.shields.io/badge/docs-online-brightgreen?logo=read-the-docs&style=flat)](https://www.cvxgrp.org/scs/)
7
+ [![Coverage Status](https://coveralls.io/repos/github/cvxgrp/scs/badge.svg?branch=master)](https://coveralls.io/github/cvxgrp/scs?branch=master)
6
8
 
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
9
 
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**
10
+ SCS (`splitting conic solver`) is a numerical optimization package for solving
11
+ large-scale convex cone problems. The current version is `3.1.1`.
219
12
 
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.
13
+ The full documentation is available [here](https://www.cvxgrp.org/scs/).