scs 3.3.1__tar.gz → 3.3.2__tar.gz

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 (363) hide show
  1. {scs-3.3.1 → scs-3.3.2}/.bumpversion.cfg +1 -1
  2. scs-3.3.2/.github/scripts/install_openblas_arm64.ps1 +68 -0
  3. {scs-3.3.1 → scs-3.3.2}/.github/workflows/build.yml +237 -31
  4. {scs-3.3.1 → scs-3.3.2}/.github/workflows/freethreading_tests.yml +5 -3
  5. {scs-3.3.1 → scs-3.3.2}/.gitignore +1 -0
  6. {scs-3.3.1 → scs-3.3.2}/PKG-INFO +23 -2
  7. {scs-3.3.1 → scs-3.3.2}/README.md +21 -1
  8. {scs-3.3.1 → scs-3.3.2}/legacy_setup.py +1 -1
  9. {scs-3.3.1 → scs-3.3.2}/meson.build +59 -10
  10. {scs-3.3.1 → scs-3.3.2}/meson.options +2 -0
  11. {scs-3.3.1 → scs-3.3.2}/pyproject.toml +9 -3
  12. {scs-3.3.1 → scs-3.3.2}/scs/py/__init__.py +46 -0
  13. {scs-3.3.1 → scs-3.3.2}/scs/scspy.c +1 -1
  14. {scs-3.3.1 → scs-3.3.2}/scs_source/.bumpversion.cfg +1 -1
  15. scs-3.3.2/scs_source/.github/actions/brew-blas/action.yml +27 -0
  16. {scs-3.3.1 → scs-3.3.2}/scs_source/.github/dependabot.yml +4 -0
  17. {scs-3.3.1 → scs-3.3.2}/scs_source/.github/workflows/build.yml +30 -1
  18. {scs-3.3.1 → scs-3.3.2}/scs_source/.github/workflows/build_mkl.yml +4 -4
  19. scs-3.3.2/scs_source/.github/workflows/build_openmp.yml +46 -0
  20. scs-3.3.2/scs_source/.github/workflows/build_openmp_mkl.yml +203 -0
  21. {scs-3.3.1 → scs-3.3.2}/scs_source/.github/workflows/build_spectral.yml +5 -2
  22. {scs-3.3.1 → scs-3.3.2}/scs_source/.github/workflows/buildpp.yml +1 -1
  23. {scs-3.3.1 → scs-3.3.2}/scs_source/.github/workflows/cmake.yml +1 -1
  24. scs-3.3.2/scs_source/.github/workflows/cmake_cudss.yml +61 -0
  25. {scs-3.3.1 → scs-3.3.2}/scs_source/.github/workflows/cmake_mkl.yml +4 -4
  26. scs-3.3.2/scs_source/.github/workflows/cmake_openmp.yml +55 -0
  27. scs-3.3.2/scs_source/.github/workflows/docs.yml +44 -0
  28. scs-3.3.2/scs_source/.github/workflows/gpu.yml +186 -0
  29. {scs-3.3.1 → scs-3.3.2}/scs_source/.github/workflows/mkl_interface_mismatch.yml +4 -4
  30. {scs-3.3.1 → scs-3.3.2}/scs_source/.github/workflows/valgrind.yml +4 -1
  31. {scs-3.3.1 → scs-3.3.2}/scs_source/.gitignore +2 -4
  32. {scs-3.3.1 → scs-3.3.2}/scs_source/CITATION.cff +2 -2
  33. {scs-3.3.1 → scs-3.3.2}/scs_source/CMakeLists.txt +138 -10
  34. scs-3.3.2/scs_source/CONTRIBUTING.md +68 -0
  35. {scs-3.3.1 → scs-3.3.2}/scs_source/Makefile +4 -3
  36. {scs-3.3.1 → scs-3.3.2}/scs_source/README.md +25 -14
  37. {scs-3.3.1 → scs-3.3.2}/scs_source/cmake/scsConfig.cmake.in +6 -2
  38. {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/Doxyfile +8 -3
  39. scs-3.3.2/scs_source/docs/src/Makefile +77 -0
  40. {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/_static/css/scs_theme.css +5 -10
  41. scs-3.3.2/scs_source/docs/src/_static/js/analytics.js +8 -0
  42. {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/algorithm/acceleration.rst +14 -2
  43. {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/algorithm/equilibration.rst +1 -1
  44. {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/algorithm/index.rst +2 -4
  45. scs-3.3.2/scs_source/docs/src/algorithm/scale.rst +357 -0
  46. {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/algorithm/warm_start.rst +17 -1
  47. {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/api/c.rst +4 -24
  48. scs-3.3.2/scs_source/docs/src/api/compile_flags.rst +201 -0
  49. {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/api/cones.rst +43 -4
  50. {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/api/index.rst +0 -2
  51. {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/api/info.rst +13 -3
  52. {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/api/javascript.rst +1 -1
  53. {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/api/python.rst +11 -5
  54. {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/api/settings.rst +10 -10
  55. scs-3.3.2/scs_source/docs/src/benchmarks/index.rst +1103 -0
  56. scs-3.3.2/scs_source/docs/src/blas_lapack/index.rst +279 -0
  57. {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/citing/index.rst +2 -4
  58. {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/conf.py +10 -10
  59. scs-3.3.2/scs_source/docs/src/contributing/index.rst +52 -0
  60. scs-3.3.2/scs_source/docs/src/examples/.gitignore +8 -0
  61. {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/examples/c.rst +2 -1
  62. {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/examples/matlab.rst +7 -2
  63. {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/examples/python/basic_qp.rst +2 -1
  64. {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/examples/python/entropy.py +1 -1
  65. {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/examples/python/entropy.rst +2 -1
  66. {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/examples/python/lasso.rst +3 -2
  67. {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/examples/python/mat_completion.rst +2 -1
  68. {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/examples/python/mpc.py +1 -1
  69. {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/examples/python/mpc.rst +2 -1
  70. scs-3.3.2/scs_source/docs/src/files/bench/infeas_pair.png +0 -0
  71. scs-3.3.2/scs_source/docs/src/files/bench/landing_grid.png +0 -0
  72. scs-3.3.2/scs_source/docs/src/files/bench/landing_grid_1e-5.png +0 -0
  73. scs-3.3.2/scs_source/docs/src/files/bench/lp_1e-4_pair.png +0 -0
  74. scs-3.3.2/scs_source/docs/src/files/bench/lp_1e-6_pair_largest.png +0 -0
  75. scs-3.3.2/scs_source/docs/src/files/bench/lpbig_1e-4_pair.png +0 -0
  76. scs-3.3.2/scs_source/docs/src/files/bench/lpbig_1e-5_pair.png +0 -0
  77. scs-3.3.2/scs_source/docs/src/files/bench/qp_1e-4_pair.png +0 -0
  78. scs-3.3.2/scs_source/docs/src/files/bench/qp_1e-6_pair_largest.png +0 -0
  79. scs-3.3.2/scs_source/docs/src/files/bench/sdp_1e-4_pair.png +0 -0
  80. {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/help/index.rst +9 -6
  81. {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/index.rst +44 -14
  82. scs-3.3.2/scs_source/docs/src/install/c.rst +357 -0
  83. scs-3.3.2/scs_source/docs/src/install/python.rst +291 -0
  84. {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/linear_solver/index.rst +66 -4
  85. scs-3.3.2/scs_source/docs/src/requirements.txt +9 -0
  86. {scs-3.3.1 → scs-3.3.2}/scs_source/include/cones.h +27 -9
  87. {scs-3.3.1 → scs-3.3.2}/scs_source/include/glbopts.h +25 -5
  88. {scs-3.3.1 → scs-3.3.2}/scs_source/include/scs.h +10 -8
  89. {scs-3.3.1 → scs-3.3.2}/scs_source/include/scs_work.h +2 -1
  90. {scs-3.3.1 → scs-3.3.2}/scs_source/linsys/cudss/direct/private.c +50 -2
  91. {scs-3.3.1 → scs-3.3.2}/scs_source/linsys/gpu/indirect/private.c +17 -4
  92. {scs-3.3.1 → scs-3.3.2}/scs_source/linsys/mkl/direct/private.c +1 -1
  93. {scs-3.3.1 → scs-3.3.2}/scs_source/scs.mk +43 -2
  94. {scs-3.3.1 → scs-3.3.2}/scs_source/src/aa.c +27 -7
  95. {scs-3.3.1 → scs-3.3.2}/scs_source/src/cones.c +851 -163
  96. {scs-3.3.1 → scs-3.3.2}/scs_source/src/linalg.c +16 -3
  97. {scs-3.3.1 → scs-3.3.2}/scs_source/src/scs.c +91 -46
  98. {scs-3.3.1 → scs-3.3.2}/scs_source/src/spectral_cones/logdeterminant/logdet_cone.c +15 -14
  99. {scs-3.3.1 → scs-3.3.2}/scs_source/src/spectral_cones/nuclear/ell1_cone.c +1 -4
  100. {scs-3.3.1 → scs-3.3.2}/scs_source/src/spectral_cones/sum-largest/sum_largest_eval_cone.c +11 -9
  101. scs-3.3.2/scs_source/test/minunit.h +52 -0
  102. scs-3.3.2/scs_source/test/mkl_psd_guard.c +282 -0
  103. {scs-3.3.1 → scs-3.3.2}/scs_source/test/problem_utils.h +123 -22
  104. {scs-3.3.1 → scs-3.3.2}/scs_source/test/problems/complex_PSD.h +2 -1
  105. {scs-3.3.1 → scs-3.3.2}/scs_source/test/problems/degenerate.h +10 -3
  106. {scs-3.3.1 → scs-3.3.2}/scs_source/test/problems/dense_qp.h +2 -1
  107. {scs-3.3.1 → scs-3.3.2}/scs_source/test/problems/hs21_tiny_qp.h +7 -3
  108. {scs-3.3.1 → scs-3.3.2}/scs_source/test/problems/hs21_tiny_qp_rw.h +5 -2
  109. scs-3.3.2/scs_source/test/problems/issue_140 +0 -0
  110. scs-3.3.2/scs_source/test/problems/issue_140.h +19 -0
  111. scs-3.3.2/scs_source/test/problems/issue_220 +0 -0
  112. scs-3.3.2/scs_source/test/problems/issue_220.h +37 -0
  113. scs-3.3.2/scs_source/test/problems/issue_499.h +79 -0
  114. {scs-3.3.1 → scs-3.3.2}/scs_source/test/problems/lp_update.h +5 -5
  115. {scs-3.3.1 → scs-3.3.2}/scs_source/test/problems/qafiro_tiny_qp.h +25 -5
  116. {scs-3.3.1 → scs-3.3.2}/scs_source/test/problems/rob_gauss_cov_est.h +24 -4
  117. {scs-3.3.1 → scs-3.3.2}/scs_source/test/problems/sd_and_complex_sd.h +2 -1
  118. {scs-3.3.1 → scs-3.3.2}/scs_source/test/problems/small_lp.h +2 -1
  119. {scs-3.3.1 → scs-3.3.2}/scs_source/test/problems/small_qp.h +7 -0
  120. {scs-3.3.1 → scs-3.3.2}/scs_source/test/problems/test_box_cone.h +2 -1
  121. {scs-3.3.1 → scs-3.3.2}/scs_source/test/problems/test_dual_exp_cone.h +2 -1
  122. {scs-3.3.1 → scs-3.3.2}/scs_source/test/problems/test_mixed_cones.h +2 -1
  123. scs-3.3.2/scs_source/test/problems/test_non_psd_p.h +76 -0
  124. {scs-3.3.1 → scs-3.3.2}/scs_source/test/problems/test_normalize_roundtrip.h +14 -12
  125. {scs-3.3.1 → scs-3.3.2}/scs_source/test/problems/test_power_cone.h +139 -5
  126. {scs-3.3.1 → scs-3.3.2}/scs_source/test/problems/test_prob_from_data_file.h +14 -4
  127. {scs-3.3.1 → scs-3.3.2}/scs_source/test/problems/test_psd_metric.h +11 -7
  128. {scs-3.3.1 → scs-3.3.2}/scs_source/test/problems/test_psd_n1.h +2 -1
  129. scs-3.3.2/scs_source/test/problems/test_psd_parallel.h +383 -0
  130. scs-3.3.2/scs_source/test/problems/test_psd_scale_updates.h +186 -0
  131. {scs-3.3.1 → scs-3.3.2}/scs_source/test/problems/test_soc_sizes.h +10 -5
  132. {scs-3.3.1 → scs-3.3.2}/scs_source/test/problems/test_solver_options.h +10 -3
  133. {scs-3.3.1 → scs-3.3.2}/scs_source/test/problems/test_zero_cone.h +2 -1
  134. {scs-3.3.1 → scs-3.3.2}/scs_source/test/run_from_file.c +8 -0
  135. {scs-3.3.1 → scs-3.3.2}/scs_source/test/run_tests.c +84 -19
  136. {scs-3.3.1 → scs-3.3.2}/scs_source/test/spectral_cones_problems/exp_design.h +1 -0
  137. {scs-3.3.1 → scs-3.3.2}/scs_source/test/spectral_cones_problems/several_logdet_cones.h +1 -0
  138. scs-3.3.2/scs_source/test/spectral_cones_problems/test_spectral_metric_updates.h +163 -0
  139. {scs-3.3.1 → scs-3.3.2}/test/test_scs_coverage.py +53 -0
  140. {scs-3.3.1 → scs-3.3.2}/test/test_scs_sdp.py +57 -0
  141. scs-3.3.1/CLAUDE.md +0 -92
  142. scs-3.3.1/scs_source/.github/workflows/build_openmp.yml +0 -30
  143. scs-3.3.1/scs_source/.github/workflows/cmake_cudss.yml +0 -41
  144. scs-3.3.1/scs_source/.github/workflows/cmake_openmp.yml +0 -30
  145. scs-3.3.1/scs_source/.github/workflows/docs.yml +0 -30
  146. scs-3.3.1/scs_source/.github/workflows/gpu.yml +0 -31
  147. scs-3.3.1/scs_source/CLAUDE.md +0 -115
  148. scs-3.3.1/scs_source/CONTRIBUTING.md +0 -49
  149. scs-3.3.1/scs_source/docs/src/Makefile +0 -28
  150. scs-3.3.1/scs_source/docs/src/algorithm/scale.rst +0 -216
  151. scs-3.3.1/scs_source/docs/src/api/compile_flags.rst +0 -92
  152. scs-3.3.1/scs_source/docs/src/blas_lapack/index.rst +0 -35
  153. scs-3.3.1/scs_source/docs/src/contributing/index.rst +0 -22
  154. scs-3.3.1/scs_source/docs/src/examples/.gitignore +0 -1
  155. scs-3.3.1/scs_source/docs/src/examples/python/entropy.py.out +0 -28
  156. scs-3.3.1/scs_source/docs/src/examples/python/lasso.py.out +0 -189
  157. scs-3.3.1/scs_source/docs/src/examples/python/mat_completion.py.out +0 -215
  158. scs-3.3.1/scs_source/docs/src/examples/python/mpc.py.out +0 -143
  159. scs-3.3.1/scs_source/docs/src/examples/python/qp.py.out +0 -30
  160. scs-3.3.1/scs_source/docs/src/examples/qp.c.out +0 -34
  161. scs-3.3.1/scs_source/docs/src/files/qp_solvers_benchmark.png +0 -0
  162. scs-3.3.1/scs_source/docs/src/files/windows1.png +0 -0
  163. scs-3.3.1/scs_source/docs/src/files/windows2.png +0 -0
  164. scs-3.3.1/scs_source/docs/src/files/windows3.png +0 -0
  165. scs-3.3.1/scs_source/docs/src/install/c.rst +0 -209
  166. scs-3.3.1/scs_source/docs/src/install/python.rst +0 -208
  167. scs-3.3.1/scs_source/docs/src/make.bat +0 -35
  168. scs-3.3.1/scs_source/docs/src/requirements.txt +0 -4
  169. scs-3.3.1/scs_source/test/minunit.h +0 -28
  170. {scs-3.3.1 → scs-3.3.2}/.github/ISSUE_TEMPLATE.md +0 -0
  171. {scs-3.3.1 → scs-3.3.2}/.github/dependabot.yml +0 -0
  172. {scs-3.3.1 → scs-3.3.2}/.github/scripts/install_mkl_static.sh +0 -0
  173. {scs-3.3.1 → scs-3.3.2}/.github/scripts/mkl_guard.py +0 -0
  174. {scs-3.3.1 → scs-3.3.2}/.gitmodules +0 -0
  175. {scs-3.3.1 → scs-3.3.2}/LICENSE +0 -0
  176. {scs-3.3.1 → scs-3.3.2}/LICENSE-INTEL-MKL.txt +0 -0
  177. {scs-3.3.1 → scs-3.3.2}/distribute.sh +0 -0
  178. {scs-3.3.1 → scs-3.3.2}/notebooks/analyze_csv_logs.ipynb +0 -0
  179. {scs-3.3.1 → scs-3.3.2}/notebooks/scs_benchmarks.ipynb +0 -0
  180. {scs-3.3.1 → scs-3.3.2}/notebooks/scs_qp.ipynb +0 -0
  181. {scs-3.3.1 → scs-3.3.2}/pixi.toml +0 -0
  182. {scs-3.3.1 → scs-3.3.2}/scs/py_ctrlc.c +0 -0
  183. {scs-3.3.1 → scs-3.3.2}/scs/pythoncapi-compat/.github/workflows/build.yml +0 -0
  184. {scs-3.3.1 → scs-3.3.2}/scs/pythoncapi-compat/.gitignore +0 -0
  185. {scs-3.3.1 → scs-3.3.2}/scs/pythoncapi-compat/.readthedocs.yaml +0 -0
  186. {scs-3.3.1 → scs-3.3.2}/scs/pythoncapi-compat/CODE_OF_CONDUCT.md +0 -0
  187. {scs-3.3.1 → scs-3.3.2}/scs/pythoncapi-compat/COPYING +0 -0
  188. {scs-3.3.1 → scs-3.3.2}/scs/pythoncapi-compat/README.rst +0 -0
  189. {scs-3.3.1 → scs-3.3.2}/scs/pythoncapi-compat/docs/Makefile +0 -0
  190. {scs-3.3.1 → scs-3.3.2}/scs/pythoncapi-compat/docs/api.rst +0 -0
  191. {scs-3.3.1 → scs-3.3.2}/scs/pythoncapi-compat/docs/changelog.rst +0 -0
  192. {scs-3.3.1 → scs-3.3.2}/scs/pythoncapi-compat/docs/conf.py +0 -0
  193. {scs-3.3.1 → scs-3.3.2}/scs/pythoncapi-compat/docs/index.rst +0 -0
  194. {scs-3.3.1 → scs-3.3.2}/scs/pythoncapi-compat/docs/links.rst +0 -0
  195. {scs-3.3.1 → scs-3.3.2}/scs/pythoncapi-compat/docs/make.bat +0 -0
  196. {scs-3.3.1 → scs-3.3.2}/scs/pythoncapi-compat/docs/tests.rst +0 -0
  197. {scs-3.3.1 → scs-3.3.2}/scs/pythoncapi-compat/docs/upgrade.rst +0 -0
  198. {scs-3.3.1 → scs-3.3.2}/scs/pythoncapi-compat/docs/users.rst +0 -0
  199. {scs-3.3.1 → scs-3.3.2}/scs/pythoncapi-compat/pythoncapi_compat.h +0 -0
  200. {scs-3.3.1 → scs-3.3.2}/scs/pythoncapi-compat/runtests.py +0 -0
  201. {scs-3.3.1 → scs-3.3.2}/scs/pythoncapi-compat/tests/__init__.py +0 -0
  202. {scs-3.3.1 → scs-3.3.2}/scs/pythoncapi-compat/tests/setup.py +0 -0
  203. {scs-3.3.1 → scs-3.3.2}/scs/pythoncapi-compat/tests/test_pythoncapi_compat.py +0 -0
  204. {scs-3.3.1 → scs-3.3.2}/scs/pythoncapi-compat/tests/test_pythoncapi_compat_cext.c +0 -0
  205. {scs-3.3.1 → scs-3.3.2}/scs/pythoncapi-compat/tests/test_pythoncapi_compat_cppext.cpp +0 -0
  206. {scs-3.3.1 → scs-3.3.2}/scs/pythoncapi-compat/tests/test_upgrade_pythoncapi.py +0 -0
  207. {scs-3.3.1 → scs-3.3.2}/scs/pythoncapi-compat/tests/utils.py +0 -0
  208. {scs-3.3.1 → scs-3.3.2}/scs/pythoncapi-compat/upgrade_pythoncapi.py +0 -0
  209. {scs-3.3.1 → scs-3.3.2}/scs/scsmodule.h +0 -0
  210. {scs-3.3.1 → scs-3.3.2}/scs/scsobject.h +0 -0
  211. {scs-3.3.1 → scs-3.3.2}/scs_source/.github/ISSUE_TEMPLATE.md +0 -0
  212. {scs-3.3.1 → scs-3.3.2}/scs_source/.github/workflows/cmake_consume.yml +0 -0
  213. {scs-3.3.1 → scs-3.3.2}/scs_source/LICENSE.txt +0 -0
  214. {scs-3.3.1 → scs-3.3.2}/scs_source/cmake/AddInstallRPATHSupport.cmake +0 -0
  215. {scs-3.3.1 → scs-3.3.2}/scs_source/cmake/AddUninstallTarget.cmake +0 -0
  216. {scs-3.3.1 → scs-3.3.2}/scs_source/cmake/InstallBasicPackageFiles.cmake +0 -0
  217. {scs-3.3.1 → scs-3.3.2}/scs_source/cmake/scs_types.h.in +0 -0
  218. {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/_static/favicon.ico +0 -0
  219. {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/_static/scs_logo.png +0 -0
  220. {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/_static/scs_logo_transparent.png +0 -0
  221. {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/algorithm/relaxation.rst +0 -0
  222. {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/api/exit_flags.rst +0 -0
  223. {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/api/julia.rst +0 -0
  224. {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/api/matlab.rst +0 -0
  225. {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/api/matrices.rst +0 -0
  226. {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/api/r.rst +0 -0
  227. {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/api/ruby.rst +0 -0
  228. {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/examples/index.rst +0 -0
  229. {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/examples/javascript.rst +0 -0
  230. {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/examples/javascript_disc.html +0 -0
  231. {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/examples/julia.rst +0 -0
  232. {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/examples/python/lasso.py +0 -0
  233. {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/examples/python/mat_completion.py +0 -0
  234. {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/examples/python/qp.py +0 -0
  235. {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/examples/python.rst +0 -0
  236. {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/examples/qp.c +0 -0
  237. {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/examples/qp.m +0 -0
  238. {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/examples/qp.m.out +0 -0
  239. {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/examples/qp.prob +0 -0
  240. {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/examples/r.rst +0 -0
  241. {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/examples/ruby.rst +0 -0
  242. {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/install/index.rst +0 -0
  243. {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/install/javascript.rst +0 -0
  244. {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/install/julia.rst +0 -0
  245. {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/install/matlab.rst +0 -0
  246. {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/install/r.rst +0 -0
  247. {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/install/ruby.rst +0 -0
  248. {scs-3.3.1 → scs-3.3.2}/scs_source/include/aa.h +0 -0
  249. {scs-3.3.1 → scs-3.3.2}/scs_source/include/aa_stats.h +0 -0
  250. {scs-3.3.1 → scs-3.3.2}/scs_source/include/ctrlc.h +0 -0
  251. {scs-3.3.1 → scs-3.3.2}/scs_source/include/linalg.h +0 -0
  252. {scs-3.3.1 → scs-3.3.2}/scs_source/include/linsys.h +0 -0
  253. {scs-3.3.1 → scs-3.3.2}/scs_source/include/normalize.h +0 -0
  254. {scs-3.3.1 → scs-3.3.2}/scs_source/include/rw.h +0 -0
  255. {scs-3.3.1 → scs-3.3.2}/scs_source/include/scs_blas.h +0 -0
  256. {scs-3.3.1 → scs-3.3.2}/scs_source/include/scs_types.h +0 -0
  257. {scs-3.3.1 → scs-3.3.2}/scs_source/include/util.h +0 -0
  258. {scs-3.3.1 → scs-3.3.2}/scs_source/include/util_spectral_cones.h +0 -0
  259. {scs-3.3.1 → scs-3.3.2}/scs_source/linsys/accelerate/direct/private.c +0 -0
  260. {scs-3.3.1 → scs-3.3.2}/scs_source/linsys/accelerate/direct/private.h +0 -0
  261. {scs-3.3.1 → scs-3.3.2}/scs_source/linsys/cpu/dense/private.c +0 -0
  262. {scs-3.3.1 → scs-3.3.2}/scs_source/linsys/cpu/dense/private.h +0 -0
  263. {scs-3.3.1 → scs-3.3.2}/scs_source/linsys/cpu/direct/private.c +0 -0
  264. {scs-3.3.1 → scs-3.3.2}/scs_source/linsys/cpu/direct/private.h +0 -0
  265. {scs-3.3.1 → scs-3.3.2}/scs_source/linsys/cpu/indirect/private.c +0 -0
  266. {scs-3.3.1 → scs-3.3.2}/scs_source/linsys/cpu/indirect/private.h +0 -0
  267. {scs-3.3.1 → scs-3.3.2}/scs_source/linsys/csparse.c +0 -0
  268. {scs-3.3.1 → scs-3.3.2}/scs_source/linsys/csparse.h +0 -0
  269. {scs-3.3.1 → scs-3.3.2}/scs_source/linsys/cudss/direct/private.h +0 -0
  270. {scs-3.3.1 → scs-3.3.2}/scs_source/linsys/external/amd/LICENSE.txt +0 -0
  271. {scs-3.3.1 → scs-3.3.2}/scs_source/linsys/external/amd/SuiteSparse_config.c +0 -0
  272. {scs-3.3.1 → scs-3.3.2}/scs_source/linsys/external/amd/SuiteSparse_config.h +0 -0
  273. {scs-3.3.1 → scs-3.3.2}/scs_source/linsys/external/amd/amd.h +0 -0
  274. {scs-3.3.1 → scs-3.3.2}/scs_source/linsys/external/amd/amd_1.c +0 -0
  275. {scs-3.3.1 → scs-3.3.2}/scs_source/linsys/external/amd/amd_2.c +0 -0
  276. {scs-3.3.1 → scs-3.3.2}/scs_source/linsys/external/amd/amd_aat.c +0 -0
  277. {scs-3.3.1 → scs-3.3.2}/scs_source/linsys/external/amd/amd_control.c +0 -0
  278. {scs-3.3.1 → scs-3.3.2}/scs_source/linsys/external/amd/amd_defaults.c +0 -0
  279. {scs-3.3.1 → scs-3.3.2}/scs_source/linsys/external/amd/amd_dump.c +0 -0
  280. {scs-3.3.1 → scs-3.3.2}/scs_source/linsys/external/amd/amd_global.c +0 -0
  281. {scs-3.3.1 → scs-3.3.2}/scs_source/linsys/external/amd/amd_info.c +0 -0
  282. {scs-3.3.1 → scs-3.3.2}/scs_source/linsys/external/amd/amd_internal.h +0 -0
  283. {scs-3.3.1 → scs-3.3.2}/scs_source/linsys/external/amd/amd_order.c +0 -0
  284. {scs-3.3.1 → scs-3.3.2}/scs_source/linsys/external/amd/amd_post_tree.c +0 -0
  285. {scs-3.3.1 → scs-3.3.2}/scs_source/linsys/external/amd/amd_postorder.c +0 -0
  286. {scs-3.3.1 → scs-3.3.2}/scs_source/linsys/external/amd/amd_preprocess.c +0 -0
  287. {scs-3.3.1 → scs-3.3.2}/scs_source/linsys/external/amd/amd_valid.c +0 -0
  288. {scs-3.3.1 → scs-3.3.2}/scs_source/linsys/external/amd/changes +0 -0
  289. {scs-3.3.1 → scs-3.3.2}/scs_source/linsys/external/qdldl/LICENSE +0 -0
  290. {scs-3.3.1 → scs-3.3.2}/scs_source/linsys/external/qdldl/README.md +0 -0
  291. {scs-3.3.1 → scs-3.3.2}/scs_source/linsys/external/qdldl/changes +0 -0
  292. {scs-3.3.1 → scs-3.3.2}/scs_source/linsys/external/qdldl/qdldl.c +0 -0
  293. {scs-3.3.1 → scs-3.3.2}/scs_source/linsys/external/qdldl/qdldl.h +0 -0
  294. {scs-3.3.1 → scs-3.3.2}/scs_source/linsys/external/qdldl/qdldl_types.h +0 -0
  295. {scs-3.3.1 → scs-3.3.2}/scs_source/linsys/gpu/gpu.c +0 -0
  296. {scs-3.3.1 → scs-3.3.2}/scs_source/linsys/gpu/gpu.h +0 -0
  297. {scs-3.3.1 → scs-3.3.2}/scs_source/linsys/gpu/indirect/private.h +0 -0
  298. {scs-3.3.1 → scs-3.3.2}/scs_source/linsys/mkl/direct/private.h +0 -0
  299. {scs-3.3.1 → scs-3.3.2}/scs_source/linsys/scs_matrix.c +0 -0
  300. {scs-3.3.1 → scs-3.3.2}/scs_source/linsys/scs_matrix.h +0 -0
  301. {scs-3.3.1 → scs-3.3.2}/scs_source/src/ctrlc.c +0 -0
  302. {scs-3.3.1 → scs-3.3.2}/scs_source/src/exp_cone.c +0 -0
  303. {scs-3.3.1 → scs-3.3.2}/scs_source/src/normalize.c +0 -0
  304. {scs-3.3.1 → scs-3.3.2}/scs_source/src/rw.c +0 -0
  305. {scs-3.3.1 → scs-3.3.2}/scs_source/src/scs_version.c +0 -0
  306. {scs-3.3.1 → scs-3.3.2}/scs_source/src/spectral_cones/logdeterminant/log_cone_IPM.c +0 -0
  307. {scs-3.3.1 → scs-3.3.2}/scs_source/src/spectral_cones/logdeterminant/log_cone_Newton.c +0 -0
  308. {scs-3.3.1 → scs-3.3.2}/scs_source/src/spectral_cones/logdeterminant/log_cone_wrapper.c +0 -0
  309. {scs-3.3.1 → scs-3.3.2}/scs_source/src/spectral_cones/nuclear/nuclear_cone.c +0 -0
  310. {scs-3.3.1 → scs-3.3.2}/scs_source/src/spectral_cones/sum-largest/sum_largest_cone.c +0 -0
  311. {scs-3.3.1 → scs-3.3.2}/scs_source/src/spectral_cones/util_spectral_cones.c +0 -0
  312. {scs-3.3.1 → scs-3.3.2}/scs_source/src/util.c +0 -0
  313. {scs-3.3.1 → scs-3.3.2}/scs_source/test/mkl_interface_mismatch.c +0 -0
  314. {scs-3.3.1 → scs-3.3.2}/scs_source/test/packaging/CMakeLists.txt +0 -0
  315. {scs-3.3.1 → scs-3.3.2}/scs_source/test/packaging/consume.c +0 -0
  316. {scs-3.3.1 → scs-3.3.2}/scs_source/test/problems/infeasible_lp.h +0 -0
  317. {scs-3.3.1 → scs-3.3.2}/scs_source/test/problems/infeasible_socp.h +0 -0
  318. {scs-3.3.1 → scs-3.3.2}/scs_source/test/problems/infeasible_tiny_qp.h +0 -0
  319. {scs-3.3.1 → scs-3.3.2}/scs_source/test/problems/max_ent +0 -0
  320. {scs-3.3.1 → scs-3.3.2}/scs_source/test/problems/max_ent.h +0 -0
  321. {scs-3.3.1 → scs-3.3.2}/scs_source/test/problems/mpc_bug.h +0 -0
  322. {scs-3.3.1 → scs-3.3.2}/scs_source/test/problems/mpc_bug1 +0 -0
  323. {scs-3.3.1 → scs-3.3.2}/scs_source/test/problems/mpc_bug2 +0 -0
  324. {scs-3.3.1 → scs-3.3.2}/scs_source/test/problems/mpc_bug3 +0 -0
  325. {scs-3.3.1 → scs-3.3.2}/scs_source/test/problems/random_prob +0 -0
  326. {scs-3.3.1 → scs-3.3.2}/scs_source/test/problems/random_prob.h +0 -0
  327. {scs-3.3.1 → scs-3.3.2}/scs_source/test/problems/test_exp_cone.h +0 -0
  328. {scs-3.3.1 → scs-3.3.2}/scs_source/test/problems/test_inaccurate.h +0 -0
  329. {scs-3.3.1 → scs-3.3.2}/scs_source/test/problems/test_root_plus.h +0 -0
  330. {scs-3.3.1 → scs-3.3.2}/scs_source/test/problems/test_rw_settings.h +0 -0
  331. {scs-3.3.1 → scs-3.3.2}/scs_source/test/problems/test_validation.h +0 -0
  332. {scs-3.3.1 → scs-3.3.2}/scs_source/test/problems/unbounded_lp.h +0 -0
  333. {scs-3.3.1 → scs-3.3.2}/scs_source/test/problems/unbounded_socp.h +0 -0
  334. {scs-3.3.1 → scs-3.3.2}/scs_source/test/problems/unbounded_tiny_qp.h +0 -0
  335. {scs-3.3.1 → scs-3.3.2}/scs_source/test/random_socp_prob.c +0 -0
  336. {scs-3.3.1 → scs-3.3.2}/scs_source/test/rng.h +0 -0
  337. {scs-3.3.1 → scs-3.3.2}/scs_source/test/rw_settings.c +0 -0
  338. {scs-3.3.1 → scs-3.3.2}/scs_source/test/spectral_cones_problems/graph_partitioning.h +0 -0
  339. {scs-3.3.1 → scs-3.3.2}/scs_source/test/spectral_cones_problems/robust_pca.h +0 -0
  340. {scs-3.3.1 → scs-3.3.2}/scs_source/test/spectral_cones_problems/several_nuc_cone.h +0 -0
  341. {scs-3.3.1 → scs-3.3.2}/scs_source/test/spectral_cones_problems/several_sum_largest.h +0 -0
  342. {scs-3.3.1 → scs-3.3.2}/scs_source/test/spectral_cones_problems/test_ell1_and_nuc.h +0 -0
  343. {scs-3.3.1 → scs-3.3.2}/scs_source/test/spectral_cones_problems/test_ell1_cone.h +0 -0
  344. {scs-3.3.1 → scs-3.3.2}/test/conftest.py +0 -0
  345. {scs-3.3.1 → scs-3.3.2}/test/gen_random_cone_prob.py +0 -0
  346. {scs-3.3.1 → scs-3.3.2}/test/lsan-suppressions.txt +0 -0
  347. {scs-3.3.1 → scs-3.3.2}/test/solve_random_cone_prob.py +0 -0
  348. {scs-3.3.1 → scs-3.3.2}/test/test_free_threading.py +0 -0
  349. {scs-3.3.1 → scs-3.3.2}/test/test_mix_sd_csd_cone.py +0 -0
  350. {scs-3.3.1 → scs-3.3.2}/test/test_scs_basic.py +0 -0
  351. {scs-3.3.1 → scs-3.3.2}/test/test_scs_object.py +0 -0
  352. {scs-3.3.1 → scs-3.3.2}/test/test_scs_quad.py +0 -0
  353. {scs-3.3.1 → scs-3.3.2}/test/test_scs_rand.py +0 -0
  354. {scs-3.3.1 → scs-3.3.2}/test/test_sigint_mixed_backends.py +0 -0
  355. {scs-3.3.1 → scs-3.3.2}/test/test_solve_random_cone_prob.py +0 -0
  356. {scs-3.3.1 → scs-3.3.2}/test/test_solve_random_cone_prob_accelerate.py +0 -0
  357. {scs-3.3.1 → scs-3.3.2}/test/test_solve_random_cone_prob_cudss.py +0 -0
  358. {scs-3.3.1 → scs-3.3.2}/test/test_solve_random_cone_prob_dense.py +0 -0
  359. {scs-3.3.1 → scs-3.3.2}/test/test_solve_random_cone_prob_mkl.py +0 -0
  360. {scs-3.3.1 → scs-3.3.2}/test/test_spectral_and_complex_cones.py +0 -0
  361. {scs-3.3.1 → scs-3.3.2}/test/test_thread_safety.py +0 -0
  362. {scs-3.3.1 → scs-3.3.2}/test/test_warm_start_consistency.py +0 -0
  363. {scs-3.3.1 → scs-3.3.2}/test/tsan-suppressions.txt +0 -0
@@ -1,5 +1,5 @@
1
1
  [bumpversion]
2
- current_version = 3.3.1
2
+ current_version = 3.3.2
3
3
 
4
4
  [bumpversion:file:legacy_setup.py]
5
5
 
@@ -0,0 +1,68 @@
1
+ # Follow OpenBLAS's Windows ARM64 CI recipe, using its portable ARMV8 target:
2
+ # https://github.com/OpenMathLib/OpenBLAS/blob/v0.3.33/.github/workflows/windows_arm64.yml
3
+ $ErrorActionPreference = 'Stop'
4
+ $PSNativeCommandUseErrorActionPreference = $true
5
+
6
+ # Release downloads occasionally fail with a transient 5xx or network error;
7
+ # retry a few times before failing the job.
8
+ function Invoke-Download([string]$Uri, [string]$OutFile) {
9
+ for ($attempt = 1; ; $attempt++) {
10
+ try {
11
+ Invoke-WebRequest -OutFile $OutFile -Uri $Uri
12
+ return
13
+ } catch {
14
+ if ($attempt -ge 4) { throw }
15
+ Write-Warning "Download of $Uri failed (attempt $attempt): $_"
16
+ Start-Sleep -Seconds (15 * $attempt)
17
+ }
18
+ }
19
+ }
20
+
21
+ $version = '0.3.33'
22
+ $archive = Join-Path $env:RUNNER_TEMP 'openblas-source.tar.gz'
23
+ $source = Join-Path $env:RUNNER_TEMP "OpenBLAS-$version"
24
+ $build = Join-Path $env:RUNNER_TEMP 'openblas-build'
25
+ $prefix = Join-Path $env:RUNNER_TEMP 'openblas'
26
+ $llvm = Join-Path $env:RUNNER_TEMP 'openblas-llvm'
27
+ $installer = Join-Path $env:RUNNER_TEMP 'LLVM-20.1.8-woa64.exe'
28
+
29
+ Invoke-Download -OutFile $archive -Uri "https://github.com/OpenMathLib/OpenBLAS/releases/download/v$version/OpenBLAS-$version.tar.gz"
30
+ if ((Get-FileHash $archive -Algorithm SHA256).Hash -ne '6761af1d9f5d353ab4f0b7497be2643313b36c8f31caec0144bfef198e71e6ab') {
31
+ throw 'OpenBLAS source checksum mismatch'
32
+ }
33
+ tar -xf $archive -C $env:RUNNER_TEMP
34
+
35
+ # Pin the C and Fortran toolchain used by the upstream recipe. Keep it separate
36
+ # from the runner's LLVM, which does not necessarily include flang-new.
37
+ Invoke-Download -OutFile $installer -Uri 'https://github.com/llvm/llvm-project/releases/download/llvmorg-20.1.8/LLVM-20.1.8-woa64.exe'
38
+ if ((Get-FileHash $installer -Algorithm SHA256).Hash -ne '7c4ac97eb2ae6b960ca5f9caf3ff6124c8d2a18cc07a7840a4d2ea15537bad8e') {
39
+ throw 'LLVM installer checksum mismatch'
40
+ }
41
+ $install = Start-Process -FilePath $installer -ArgumentList '/S', "/D=$llvm" -Wait -PassThru
42
+ if ($install.ExitCode -ne 0) { throw "LLVM installation failed: $($install.ExitCode)" }
43
+
44
+ # Locate Visual Studio rather than depending on its version or edition.
45
+ $vswhere = Join-Path ${env:ProgramFiles(x86)} 'Microsoft Visual Studio\Installer\vswhere.exe'
46
+ $vs = & $vswhere -latest -products '*' -requires Microsoft.VisualStudio.Component.VC.Tools.ARM64 -property installationPath
47
+ if (-not $vs) { throw 'Visual Studio ARM64 tools were not found' }
48
+ # Initialize the current PowerShell process without passing paths through cmd.
49
+ & (Join-Path $vs 'Common7\Tools\Launch-VsDevShell.ps1') -Arch arm64 -HostArch arm64 -SkipAutomaticLocation
50
+ $env:PATH = "$llvm\bin;$env:PATH"
51
+
52
+ cmake -S $source -B $build -G Ninja `
53
+ -DCMAKE_BUILD_TYPE=Release `
54
+ -DTARGET=ARMV8 `
55
+ -DDYNAMIC_ARCH=OFF `
56
+ -DBINARY=64 `
57
+ -DCMAKE_C_COMPILER=clang-cl `
58
+ -DCMAKE_Fortran_COMPILER=flang-new `
59
+ -DBUILD_SHARED_LIBS=ON `
60
+ -DCMAKE_SYSTEM_PROCESSOR=arm64 `
61
+ -DCMAKE_SYSTEM_NAME=Windows `
62
+ "-DCMAKE_INSTALL_PREFIX=$prefix"
63
+ cmake --build $build --parallel 4
64
+ cmake --install $build
65
+
66
+ # Meson uses the CMake package; delvewheel bundles the DLL found on PATH.
67
+ "CMAKE_PREFIX_PATH=$prefix" | Out-File -Append -Encoding utf8 $env:GITHUB_ENV
68
+ "$prefix\bin" | Out-File -Append -Encoding utf8 $env:GITHUB_PATH
@@ -23,7 +23,7 @@ jobs:
23
23
  fail-fast: false
24
24
  matrix:
25
25
  os: [ ubuntu-latest ]
26
- python-version: [ "3.12" ]
26
+ python-version: [ "3.12", "3.13", "3.14", "3.15" ]
27
27
 
28
28
  env:
29
29
  PYTHON_VERSION: ${{ matrix.python-version }}
@@ -32,7 +32,20 @@ jobs:
32
32
  - uses: actions/checkout@v7
33
33
  with:
34
34
  submodules: recursive
35
- - uses: prefix-dev/setup-pixi@v0.10.2
35
+ # setup-pixi downloads the pixi binary without retrying, so a transient
36
+ # 5xx or DNS failure would fail the job; retry once after a pause.
37
+ - uses: prefix-dev/setup-pixi@v0.11.3
38
+ id: pixi
39
+ continue-on-error: true
40
+ with:
41
+ cache: false
42
+ pixi-version: v0.46.0
43
+ - name: Wait before retrying setup-pixi
44
+ if: steps.pixi.outcome == 'failure'
45
+ run: sleep 60
46
+ - name: Retry setup-pixi
47
+ if: steps.pixi.outcome == 'failure'
48
+ uses: prefix-dev/setup-pixi@v0.11.3
36
49
  with:
37
50
  cache: false
38
51
  pixi-version: v0.46.0
@@ -45,6 +58,26 @@ jobs:
45
58
  run: |
46
59
  pixi r python -m pip install -v . --no-build-isolation -Csetup-args=-Duse_openmp=true
47
60
  pixi r pytest
61
+ # Without use_parallel_psd an OpenMP build projects the PSD blocks
62
+ # one after another, under the conditions of the step below too.
63
+ OMP_NUM_THREADS=4 OPENBLAS_NUM_THREADS=1 SCS_EXPECT_PARALLEL_PSD=0 pixi r pytest -v test/test_scs_sdp.py -k parallel_psd
64
+ rm -rf build/
65
+ - name: Test with the parallel PSD projection option
66
+ # One Python version is enough to check the Meson option. The suite
67
+ # runs with several OpenMP threads and the BLAS on one thread, which
68
+ # is what the parallel projection asks for: SCS keeps it serial when
69
+ # it sees an OpenBLAS with a thread pool of its own on more than one
70
+ # thread. SCS_EXPECT_PARALLEL_PSD=1 makes
71
+ # test_parallel_psd_matches_build fail unless SCS reports a parallel
72
+ # projection.
73
+ if: matrix.python-version == '3.13'
74
+ env:
75
+ OMP_NUM_THREADS: "4"
76
+ OPENBLAS_NUM_THREADS: "1"
77
+ SCS_EXPECT_PARALLEL_PSD: "1"
78
+ run: |
79
+ pixi r python -m pip install -v . --no-build-isolation -Csetup-args=-Duse_openmp=true -Csetup-args=-Duse_parallel_psd=true
80
+ pixi r pytest
48
81
  rm -rf build/
49
82
 
50
83
  build_mkl:
@@ -64,13 +97,37 @@ jobs:
64
97
  - case: lp64-solve
65
98
  use_blas64: false
66
99
  numpy_blas: mkl
100
+ python-version: "3.12"
101
+ - case: ilp64-guard
102
+ use_blas64: true
103
+ numpy_blas: mkl
104
+ python-version: "3.12"
105
+ - case: ilp64-solve
106
+ use_blas64: true
107
+ numpy_blas: openblas
108
+ python-version: "3.12"
109
+ # Every case on the newest Python; only lp64-solve in between.
110
+ - case: lp64-solve
111
+ use_blas64: false
112
+ numpy_blas: mkl
113
+ python-version: "3.13"
114
+ - case: lp64-solve
115
+ use_blas64: false
116
+ numpy_blas: mkl
117
+ python-version: "3.14"
118
+ - case: lp64-solve
119
+ use_blas64: false
120
+ numpy_blas: mkl
121
+ python-version: "3.15"
67
122
  - case: ilp64-guard
68
123
  use_blas64: true
69
124
  numpy_blas: mkl
125
+ python-version: "3.15"
70
126
  - case: ilp64-solve
71
127
  use_blas64: true
72
128
  numpy_blas: openblas
73
- name: build_mkl (${{ matrix.case }})
129
+ python-version: "3.15"
130
+ name: build_mkl (${{ matrix.case }}, ${{ matrix.python-version }})
74
131
  env:
75
132
  USE_BLAS64: ${{ matrix.use_blas64 }}
76
133
  NUMPY_BLAS: ${{ matrix.numpy_blas }}
@@ -79,7 +136,19 @@ jobs:
79
136
  - uses: actions/checkout@v7
80
137
  with:
81
138
  submodules: recursive
82
- - uses: prefix-dev/setup-pixi@v0.10.2
139
+ # Retry once on a transient download failure (see build_openmp).
140
+ - uses: prefix-dev/setup-pixi@v0.11.3
141
+ id: pixi
142
+ continue-on-error: true
143
+ with:
144
+ cache: false
145
+ pixi-version: v0.46.0
146
+ - name: Wait before retrying setup-pixi
147
+ if: steps.pixi.outcome == 'failure'
148
+ run: sleep 60
149
+ - name: Retry setup-pixi
150
+ if: steps.pixi.outcome == 'failure'
151
+ uses: prefix-dev/setup-pixi@v0.11.3
83
152
  with:
84
153
  cache: false
85
154
  pixi-version: v0.46.0
@@ -88,7 +157,7 @@ jobs:
88
157
  shell: bash
89
158
  - name: Install dependencies
90
159
  run: |
91
- pixi add --platform linux-64 "blas-devel=*=*${NUMPY_BLAS}" pip scipy numpy pytest mkl mkl-devel pkg-config meson meson-python python==3.12
160
+ pixi add --platform linux-64 "blas-devel=*=*${NUMPY_BLAS}" pip scipy numpy pytest mkl mkl-devel pkg-config meson meson-python python==${{ matrix.python-version }}
92
161
  - name: Build
93
162
  run: |
94
163
  pixi r python -c "import numpy as np;print(np.show_config())"
@@ -120,13 +189,25 @@ jobs:
120
189
  strategy:
121
190
  fail-fast: false
122
191
  matrix:
123
- python-version: [ "3.12" ]
192
+ python-version: [ "3.12", "3.13", "3.14", "3.15" ]
124
193
 
125
194
  steps:
126
195
  - uses: actions/checkout@v7
127
196
  with:
128
197
  submodules: recursive
129
- - uses: prefix-dev/setup-pixi@v0.10.2
198
+ # Retry once on a transient download failure (see build_openmp).
199
+ - uses: prefix-dev/setup-pixi@v0.11.3
200
+ id: pixi
201
+ continue-on-error: true
202
+ with:
203
+ cache: false
204
+ pixi-version: v0.46.0
205
+ - name: Wait before retrying setup-pixi
206
+ if: steps.pixi.outcome == 'failure'
207
+ run: sleep 60
208
+ - name: Retry setup-pixi
209
+ if: steps.pixi.outcome == 'failure'
210
+ uses: prefix-dev/setup-pixi@v0.11.3
130
211
  with:
131
212
  cache: false
132
213
  pixi-version: v0.46.0
@@ -163,6 +244,62 @@ jobs:
163
244
  readelf -d "$so" | grep -q 'libcusparse' || { echo "ERROR: _scs_gpu not linked against cuSPARSE"; exit 1; }
164
245
  echo "OK: _scs_gpu links cuBLAS and cuSPARSE"
165
246
 
247
+ build_cudss:
248
+ # Build-only check of the cuDSS backend against NVIDIA's apt cuDSS, which
249
+ # installs the builds for CUDA 12 and CUDA 13 side by side. With the CUDA 12
250
+ # toolkit of this container, the CUDA 13 build must be refused when Meson
251
+ # configures (cuDSS's own check, see link_cudss in meson.build) and the
252
+ # CUDA 12 build must build and import. Importing needs only the shared
253
+ # libraries, not a GPU. Each build is pointed at explicitly with cudss_DIR,
254
+ # so the job does not depend on which one apt makes the default; if apt stops
255
+ # shipping one of them, the step that needs it is skipped with a warning.
256
+ runs-on: ubuntu-latest
257
+ # The newest CUDA 12 devel image when this job was written; bump it if
258
+ # NVIDIA removes the tag.
259
+ container: nvidia/cuda:12.6.3-devel-ubuntu22.04
260
+ steps:
261
+ - name: Install dependencies
262
+ run: |
263
+ apt-get -o Acquire::Retries=5 update
264
+ DEBIAN_FRONTEND=noninteractive apt-get -o Acquire::Retries=5 install -y git pkg-config cmake \
265
+ ninja-build libopenblas-dev liblapack-dev python3-dev python3-venv binutils cudss
266
+ - uses: actions/checkout@v7
267
+ with:
268
+ submodules: recursive
269
+ - name: Python build tools
270
+ run: |
271
+ git config --global --add safe.directory "$GITHUB_WORKSPACE"
272
+ # --upgrade-deps: Ubuntu 22.04's pip (22.0) has no -C option
273
+ python3 -m venv --upgrade-deps /opt/venv
274
+ /opt/venv/bin/pip install numpy scipy meson-python meson ninja
275
+ # meson-python runs the meson it finds on PATH
276
+ echo /opt/venv/bin >> "$GITHUB_PATH"
277
+ - name: The cuDSS build for another CUDA major version is refused
278
+ run: |
279
+ d=/usr/lib/x86_64-linux-gnu/libcudss/13/cmake/cudss
280
+ if [ ! -f "$d/cudss-config.cmake" ]; then
281
+ echo "::warning::apt's cuDSS has no CUDA 13 build; mismatch check skipped"
282
+ exit 0
283
+ fi
284
+ # LIBRARY_PATH: the image points it at the CUDA stubs; a plain toolkit install does not
285
+ if cudss_DIR=$d env -u LIBRARY_PATH /opt/venv/bin/pip install -v \
286
+ --no-build-isolation -Csetup-args=-Dlink_cudss=true -Csetup-args=-Dint32=true . > mismatch.log 2>&1; then
287
+ cat mismatch.log
288
+ echo "::error::the CUDA 13 build of cuDSS was accepted with the CUDA 12 toolkit"
289
+ exit 1
290
+ fi
291
+ grep "cuDSS for CUDA 12 was not found" mismatch.log || { cat mismatch.log; exit 1; }
292
+ - name: The cuDSS build for this CUDA builds and imports
293
+ run: |
294
+ d=/usr/lib/x86_64-linux-gnu/libcudss/12/cmake/cudss
295
+ if [ ! -f "$d/cudss-config.cmake" ]; then
296
+ echo "::warning::apt's cuDSS has no CUDA 12 build; build check skipped"
297
+ exit 0
298
+ fi
299
+ cudss_DIR=$d env -u LIBRARY_PATH /opt/venv/bin/pip install -v \
300
+ --no-build-isolation -Csetup-args=-Dlink_cudss=true -Csetup-args=-Dint32=true .
301
+ cd /tmp && /opt/venv/bin/python -c "from scs import _scs_cudss; import scs; print('scs', scs.__version__, 'cuDSS backend imports')"
302
+
166
303
  build_native_arch:
167
304
  runs-on: ubuntu-latest
168
305
  defaults:
@@ -172,12 +309,25 @@ jobs:
172
309
  fail-fast: false
173
310
  matrix:
174
311
  native_arch: [true]
312
+ python-version: [ "3.12", "3.13", "3.14", "3.15" ]
175
313
 
176
314
  steps:
177
315
  - uses: actions/checkout@v7
178
316
  with:
179
317
  submodules: recursive
180
- - uses: prefix-dev/setup-pixi@v0.10.2
318
+ # Retry once on a transient download failure (see build_openmp).
319
+ - uses: prefix-dev/setup-pixi@v0.11.3
320
+ id: pixi
321
+ continue-on-error: true
322
+ with:
323
+ cache: false
324
+ pixi-version: v0.46.0
325
+ - name: Wait before retrying setup-pixi
326
+ if: steps.pixi.outcome == 'failure'
327
+ run: sleep 60
328
+ - name: Retry setup-pixi
329
+ if: steps.pixi.outcome == 'failure'
330
+ uses: prefix-dev/setup-pixi@v0.11.3
181
331
  with:
182
332
  cache: false
183
333
  pixi-version: v0.46.0
@@ -185,7 +335,7 @@ jobs:
185
335
  run: echo "$(pwd)/.pixi/envs/default/bin" >> $GITHUB_PATH
186
336
  shell: bash
187
337
  - name: Install dependencies
188
- run: pixi add --platform linux-64 scipy numpy pip pytest meson meson-python openblas python==3.12
338
+ run: pixi add --platform linux-64 scipy numpy pip pytest meson meson-python openblas python==${{ matrix.python-version }}
189
339
  - name: Build (native_arch=${{ matrix.native_arch }})
190
340
  run: |
191
341
  pixi r python -m pip install -v . --no-build-isolation \
@@ -203,13 +353,25 @@ jobs:
203
353
  strategy:
204
354
  fail-fast: false
205
355
  matrix:
206
- python-version: [ "3.14" ]
356
+ python-version: [ "3.13", "3.14", "3.15" ]
207
357
 
208
358
  steps:
209
359
  - uses: actions/checkout@v7
210
360
  with:
211
361
  submodules: recursive
212
- - uses: prefix-dev/setup-pixi@v0.10.2
362
+ # Retry once on a transient download failure (see build_openmp).
363
+ - uses: prefix-dev/setup-pixi@v0.11.3
364
+ id: pixi
365
+ continue-on-error: true
366
+ with:
367
+ cache: false
368
+ pixi-version: v0.46.0
369
+ - name: Wait before retrying setup-pixi
370
+ if: steps.pixi.outcome == 'failure'
371
+ run: sleep 60
372
+ - name: Retry setup-pixi
373
+ if: steps.pixi.outcome == 'failure'
374
+ uses: prefix-dev/setup-pixi@v0.11.3
213
375
  with:
214
376
  cache: false
215
377
  pixi-version: v0.46.0
@@ -241,36 +403,77 @@ jobs:
241
403
  arch: auto
242
404
  - os: windows-latest
243
405
  arch: auto
406
+ - os: windows-11-arm
407
+ arch: auto
244
408
 
245
409
  steps:
246
410
  - uses: actions/checkout@v7
247
411
  with:
248
412
  submodules: true
249
413
 
250
- - name: Set up MSVC for Windows
251
- if: runner.os == 'Windows'
252
- uses: egor-tensin/vs-shell@v2
253
-
254
- - name: Install conda on Windows
255
- if: runner.os == 'Windows'
256
- uses: conda-incubator/setup-miniconda@v4
257
- with:
258
- miniconda-version: "latest"
259
- channels: conda-forge, anaconda
414
+ - name: Install OpenBLAS on Windows x64
415
+ # meson finds OpenBLAS via its CMake config; delvewheel finds the DLL via PATH.
416
+ # 0.3.34 is skipped: its DGEMM kernels crash on AMD Zen 4/5 CPUs that
417
+ # expose AVX-512 (Fixed in OpenMathLib/OpenBLAS#6013. Bump with the next release.)
418
+ if: runner.os == 'Windows' && runner.arch == 'X64'
419
+ shell: pwsh
420
+ run: |
421
+ $version = '0.3.33'
422
+ $sha256 = '7ad797ef0c9a5c42e28903bf726eaaaade307dafe187ff0e923d90cd4002780c'
423
+ $zip = Join-Path $env:RUNNER_TEMP 'openblas.zip'
424
+ $dest = Join-Path $env:RUNNER_TEMP 'openblas'
425
+ $uri = "https://github.com/OpenMathLib/OpenBLAS/releases/download/v$version/OpenBLAS-$version-x64.zip"
426
+ # Retry transient 5xx/network failures before failing the job.
427
+ for ($attempt = 1; ; $attempt++) {
428
+ try { Invoke-WebRequest -OutFile $zip -Uri $uri; break }
429
+ catch {
430
+ if ($attempt -ge 4) { throw }
431
+ Write-Warning "Download of $uri failed (attempt $attempt): $_"
432
+ Start-Sleep -Seconds (15 * $attempt)
433
+ }
434
+ }
435
+ if ((Get-FileHash $zip -Algorithm SHA256).Hash -ne $sha256) { throw 'OpenBLAS checksum mismatch' }
436
+ Expand-Archive $zip -DestinationPath $dest
437
+ $root = $dest
438
+ # The x64 (MinGW) CMake config points the linker at the DLL instead of its import library.
439
+ # (Fixed in OpenMathLib/OpenBLAS#6091. Can be removed with the next release.)
440
+ $cfg = Join-Path $root 'lib\cmake\openblas\OpenBLASConfig.cmake'
441
+ if (Test-Path $cfg) {
442
+ (Get-Content $cfg) -replace 'bin/libopenblas\.dll', 'lib/libopenblas.lib' | Set-Content $cfg
443
+ }
444
+ "CMAKE_PREFIX_PATH=$root" | Out-File -Append -Encoding utf8 $env:GITHUB_ENV
445
+ "$root\bin" | Out-File -Append -Encoding utf8 $env:GITHUB_PATH
260
446
 
261
- - name: Install openblas from conda on Windows
262
- if: runner.os == 'Windows'
263
- # 0.3.33 pinned: conda-forge's win-64 0.3.34 build crashes inside its
264
- # DGEMM kernels on AMD Zen 4/5 CPUs that expose AVX-512
265
- # (conda-forge/openblas-feedstock#196). Unpin once a fixed build ships.
266
- run: conda install -y "openblas=0.3.33" pkgconfig
447
+ - name: Build OpenBLAS for Windows ARM64
448
+ # The upstream woa64 DLL targets NEOVERSEN1 and requires LSE atomics.
449
+ # Build for ARMV8 so the wheels also work on older Windows ARM64 CPUs.
450
+ if: runner.os == 'Windows' && runner.arch == 'ARM64'
451
+ shell: pwsh
452
+ run: ./.github/scripts/install_openblas_arm64.ps1
267
453
 
454
+ # cibuildwheel's own downloads (virtualenv, CPython installers) and the
455
+ # pip installs inside it fail outright on a transient 5xx or DNS error,
456
+ # so retry the step once after a pause. A genuine build failure also
457
+ # reruns once, costing one extra build before the job goes red.
268
458
  - name: Build wheels
269
- uses: pypa/cibuildwheel@v4.2.0
459
+ id: cibw
460
+ continue-on-error: true
461
+ uses: pypa/cibuildwheel@v4.3.5
270
462
  env:
271
463
  # Explicitly set the architecture based on the matrix
272
464
  CIBW_ARCHS_LINUX: ${{ matrix.arch }}
273
465
 
466
+ - name: Wait before retrying cibuildwheel
467
+ if: steps.cibw.outcome == 'failure'
468
+ run: sleep 60
469
+ shell: bash
470
+
471
+ - name: Build wheels (retry)
472
+ if: steps.cibw.outcome == 'failure'
473
+ uses: pypa/cibuildwheel@v4.3.5
474
+ env:
475
+ CIBW_ARCHS_LINUX: ${{ matrix.arch }}
476
+
274
477
  - name: Report wheel sizes
275
478
  run: |
276
479
  ls -lh ./wheelhouse/*.whl
@@ -298,7 +501,7 @@ jobs:
298
501
  needs: build_wheels
299
502
  runs-on: ubuntu-latest
300
503
  steps:
301
- - uses: actions/download-artifact@v7
504
+ - uses: actions/download-artifact@v8
302
505
  with:
303
506
  pattern: cibw-wheels-ubuntu-*
304
507
  path: wheelhouse
@@ -361,9 +564,9 @@ jobs:
361
564
  strategy:
362
565
  fail-fast: false
363
566
  matrix:
364
- python: ["3.9", "3.14", "3.14t"]
567
+ python: ["3.9", "3.13", "3.14", "3.15", "3.14t", "3.15t"]
365
568
  steps:
366
- - uses: actions/download-artifact@v7
569
+ - uses: actions/download-artifact@v8
367
570
  with:
368
571
  pattern: cibw-wheels-ubuntu-latest-*
369
572
  path: wheelhouse
@@ -397,8 +600,11 @@ jobs:
397
600
  EOF
398
601
  case "${{ matrix.python }}" in
399
602
  3.9) IMAGE=python:3.9-slim; TAG=cp39-cp39 ;;
603
+ 3.13) IMAGE=python:3.13-slim; TAG=cp313-cp313 ;;
400
604
  3.14) IMAGE=python:3.14-slim; TAG=cp314-cp314 ;;
605
+ 3.15) IMAGE=python:3.15-slim; TAG=cp315-cp315 ;;
401
606
  3.14t) IMAGE=ghcr.io/astral-sh/uv:debian-slim; TAG=cp314-cp314t ;;
607
+ 3.15t) IMAGE=ghcr.io/astral-sh/uv:debian-slim; TAG=cp315-cp315t ;;
402
608
  esac
403
609
  docker run --rm -v "$PWD:/work" -w /tmp -e PY=${{ matrix.python }} -e TAG=$TAG \
404
610
  "$IMAGE" bash -ec '
@@ -12,7 +12,7 @@ jobs:
12
12
  strategy:
13
13
  fail-fast: false
14
14
  matrix:
15
- python-version: ["3.13t", "3.14t"]
15
+ python-version: ["3.14t", "3.15t"]
16
16
 
17
17
  steps:
18
18
  - uses: actions/checkout@v7
@@ -52,7 +52,9 @@ jobs:
52
52
  python -m pytest test/ -v --parallel-threads=4 --iterations=3
53
53
 
54
54
  test_sanitizers:
55
- runs-on: ubuntu-latest
55
+ # Pinned: the cached sanitizer CPython is tied to the image it was built on
56
+ # (a 24.04-built TSan interpreter breaks pip on ubuntu-latest = 26.04).
57
+ runs-on: ubuntu-24.04
56
58
  strategy:
57
59
  fail-fast: false
58
60
  matrix:
@@ -81,7 +83,7 @@ jobs:
81
83
  uses: actions/cache@v6
82
84
  with:
83
85
  path: cpython-${{ matrix.sanitizer }}
84
- key: cpython-${{ matrix.sanitizer }}-3.14-${{ runner.os }}-v1
86
+ key: cpython-${{ matrix.sanitizer }}-3.14-${{ runner.os }}-${{ env.ImageOS }}-v1
85
87
 
86
88
  - name: Build CPython 3.14t with ${{ matrix.sanitizer }}
87
89
  if: steps.cache-cpython.outputs.cache-hit != 'true'
@@ -52,3 +52,4 @@ out
52
52
  # pixi environments
53
53
  .pixi
54
54
  *.egg-info
55
+ CLAUDE.md
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: scs
3
- Version: 3.3.1
3
+ Version: 3.3.2
4
4
  Summary: Splitting conic solver
5
5
  Author-Email: Brendan O'Donoghue <bodonoghue85@gmail.com>
6
6
  License: MIT License
@@ -35,6 +35,7 @@ Classifier: Programming Language :: Python :: 3.11
35
35
  Classifier: Programming Language :: Python :: 3.12
36
36
  Classifier: Programming Language :: Python :: 3.13
37
37
  Classifier: Programming Language :: Python :: 3.14
38
+ Classifier: Programming Language :: Python :: 3.15
38
39
  Classifier: Programming Language :: Python :: 3 :: Only
39
40
  Classifier: Programming Language :: Python :: Free Threading :: 3 - Stable
40
41
  Classifier: Programming Language :: Python :: Implementation :: CPython
@@ -86,6 +87,18 @@ selects the best available solver for the platform:
86
87
  - **Linux / Windows**: MKL Pardiso if available, otherwise QDLDL
87
88
 
88
89
  ```python
90
+ import numpy as np
91
+ import scipy.sparse as sp
92
+ import scs
93
+
94
+ # A minimal LP: maximize x subject to 0 <= x <= 1
95
+ data = {
96
+ "A": sp.csc_matrix(np.array([[1.0], [-1.0]])),
97
+ "b": np.array([1.0, 0.0]),
98
+ "c": np.array([-1.0]),
99
+ }
100
+ cone = {"l": 2}
101
+
89
102
  # Auto-detect best backend (default)
90
103
  solver = scs.SCS(data, cone)
91
104
 
@@ -121,11 +134,17 @@ pip install . -Csetup-args=-Duse_lapack=true
121
134
 
122
135
  # Spectral cones (logdet, nuclear norm, ell-1, sum-of-largest)
123
136
  pip install . -Csetup-args=-Duse_spectral_cones=true
137
+
138
+ # Project the PSD blocks of a problem in parallel with OpenMP. Off by
139
+ # default: it is only faster when BLAS runs on one thread inside the threads
140
+ # of SCS (see "Parallel projection of PSD blocks" in the SCS documentation).
141
+ pip install . -Csetup-args=-Duse_openmp=true -Csetup-args=-Duse_parallel_psd=true
124
142
  ```
125
143
 
126
144
  Notes:
145
+ - With `use_parallel_psd`, a verbose solve prints `psd cones projected in parallel by N threads` when SCS projects the PSD blocks in parallel. The line is absent when SCS keeps the projection serial, for example with a single PSD block, with too little work for threads, with one OpenMP thread, or when it sees an OpenBLAS with a thread pool of its own on more than one thread (set `OPENBLAS_NUM_THREADS=1` for that one).
127
146
  - x86-64 manylinux wheels ship a `_scs_mkl` extension with sequential MKL linked statically (CI asserts the shipped inventory and that no wheel carries a dynamic MKL dependency). The musllinux, aarch64, macOS and Windows wheels do not include the MKL backend; Windows source builds use sequential MKL because Intel's conda `pkg-config` metadata for the threaded variant is still broken.
128
- - Windows wheels link conda-forge OpenBLAS pinned to 0.3.33: the win-64 0.3.34 build crashes inside its DGEMM kernels on AMD Zen 4/5 CPUs that expose AVX-512 (conda-forge/openblas-feedstock#196), so Windows source builds should avoid that build too.
147
+ - Windows x86-64 wheels link the OpenBLAS 0.3.33 release binaries from OpenBLAS's GitHub releases, and Windows ARM64 wheels link OpenBLAS 0.3.33 built for the portable ARMV8 target. 0.3.34 is skipped because its DGEMM kernels crash on AMD Zen 4/5 CPUs that expose AVX-512 (fixed in OpenMathLib/OpenBLAS#6013), so Windows source builds should avoid it too.
129
148
  - `BLAS64` is a general SCS build mode for ILP64 BLAS/LAPACK libraries, not an MKL-only feature.
130
149
  - For the MKL Pardiso backend specifically, `BLAS64` must be paired with 64-bit SCS integers (`DLONG` / `int32=false`), and SCS now fails early if another library in the process has already fixed MKL to an incompatible LP64/ILP64 interface layer.
131
150
 
@@ -136,6 +155,8 @@ import numpy as np
136
155
  import scipy.sparse as sp
137
156
  import scs
138
157
 
158
+ np.random.seed(0) # so the printed status below is reproducible
159
+
139
160
  m, n = 4, 2
140
161
  A = sp.random(m, n, density=0.5, format="csc")
141
162
  b = np.random.randn(m)
@@ -37,6 +37,18 @@ selects the best available solver for the platform:
37
37
  - **Linux / Windows**: MKL Pardiso if available, otherwise QDLDL
38
38
 
39
39
  ```python
40
+ import numpy as np
41
+ import scipy.sparse as sp
42
+ import scs
43
+
44
+ # A minimal LP: maximize x subject to 0 <= x <= 1
45
+ data = {
46
+ "A": sp.csc_matrix(np.array([[1.0], [-1.0]])),
47
+ "b": np.array([1.0, 0.0]),
48
+ "c": np.array([-1.0]),
49
+ }
50
+ cone = {"l": 2}
51
+
40
52
  # Auto-detect best backend (default)
41
53
  solver = scs.SCS(data, cone)
42
54
 
@@ -72,11 +84,17 @@ pip install . -Csetup-args=-Duse_lapack=true
72
84
 
73
85
  # Spectral cones (logdet, nuclear norm, ell-1, sum-of-largest)
74
86
  pip install . -Csetup-args=-Duse_spectral_cones=true
87
+
88
+ # Project the PSD blocks of a problem in parallel with OpenMP. Off by
89
+ # default: it is only faster when BLAS runs on one thread inside the threads
90
+ # of SCS (see "Parallel projection of PSD blocks" in the SCS documentation).
91
+ pip install . -Csetup-args=-Duse_openmp=true -Csetup-args=-Duse_parallel_psd=true
75
92
  ```
76
93
 
77
94
  Notes:
95
+ - With `use_parallel_psd`, a verbose solve prints `psd cones projected in parallel by N threads` when SCS projects the PSD blocks in parallel. The line is absent when SCS keeps the projection serial, for example with a single PSD block, with too little work for threads, with one OpenMP thread, or when it sees an OpenBLAS with a thread pool of its own on more than one thread (set `OPENBLAS_NUM_THREADS=1` for that one).
78
96
  - x86-64 manylinux wheels ship a `_scs_mkl` extension with sequential MKL linked statically (CI asserts the shipped inventory and that no wheel carries a dynamic MKL dependency). The musllinux, aarch64, macOS and Windows wheels do not include the MKL backend; Windows source builds use sequential MKL because Intel's conda `pkg-config` metadata for the threaded variant is still broken.
79
- - Windows wheels link conda-forge OpenBLAS pinned to 0.3.33: the win-64 0.3.34 build crashes inside its DGEMM kernels on AMD Zen 4/5 CPUs that expose AVX-512 (conda-forge/openblas-feedstock#196), so Windows source builds should avoid that build too.
97
+ - Windows x86-64 wheels link the OpenBLAS 0.3.33 release binaries from OpenBLAS's GitHub releases, and Windows ARM64 wheels link OpenBLAS 0.3.33 built for the portable ARMV8 target. 0.3.34 is skipped because its DGEMM kernels crash on AMD Zen 4/5 CPUs that expose AVX-512 (fixed in OpenMathLib/OpenBLAS#6013), so Windows source builds should avoid it too.
80
98
  - `BLAS64` is a general SCS build mode for ILP64 BLAS/LAPACK libraries, not an MKL-only feature.
81
99
  - For the MKL Pardiso backend specifically, `BLAS64` must be paired with 64-bit SCS integers (`DLONG` / `int32=false`), and SCS now fails early if another library in the process has already fixed MKL to an incompatible LP64/ILP64 interface layer.
82
100
 
@@ -87,6 +105,8 @@ import numpy as np
87
105
  import scipy.sparse as sp
88
106
  import scs
89
107
 
108
+ np.random.seed(0) # so the printed status below is reproducible
109
+
90
110
  m, n = 4, 2
91
111
  A = sp.random(m, n, density=0.5, format="csc")
92
112
  b = np.random.randn(m)
@@ -313,7 +313,7 @@ def install_scs(**kwargs):
313
313
 
314
314
  setup(
315
315
  name="scs",
316
- version="3.3.1",
316
+ version="3.3.2",
317
317
  author="Brendan O'Donoghue",
318
318
  author_email="bodonoghue85@gmail.com",
319
319
  url="http://github.com/cvxgrp/scs",