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.
- {scs-3.3.1 → scs-3.3.2}/.bumpversion.cfg +1 -1
- scs-3.3.2/.github/scripts/install_openblas_arm64.ps1 +68 -0
- {scs-3.3.1 → scs-3.3.2}/.github/workflows/build.yml +237 -31
- {scs-3.3.1 → scs-3.3.2}/.github/workflows/freethreading_tests.yml +5 -3
- {scs-3.3.1 → scs-3.3.2}/.gitignore +1 -0
- {scs-3.3.1 → scs-3.3.2}/PKG-INFO +23 -2
- {scs-3.3.1 → scs-3.3.2}/README.md +21 -1
- {scs-3.3.1 → scs-3.3.2}/legacy_setup.py +1 -1
- {scs-3.3.1 → scs-3.3.2}/meson.build +59 -10
- {scs-3.3.1 → scs-3.3.2}/meson.options +2 -0
- {scs-3.3.1 → scs-3.3.2}/pyproject.toml +9 -3
- {scs-3.3.1 → scs-3.3.2}/scs/py/__init__.py +46 -0
- {scs-3.3.1 → scs-3.3.2}/scs/scspy.c +1 -1
- {scs-3.3.1 → scs-3.3.2}/scs_source/.bumpversion.cfg +1 -1
- scs-3.3.2/scs_source/.github/actions/brew-blas/action.yml +27 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/.github/dependabot.yml +4 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/.github/workflows/build.yml +30 -1
- {scs-3.3.1 → scs-3.3.2}/scs_source/.github/workflows/build_mkl.yml +4 -4
- scs-3.3.2/scs_source/.github/workflows/build_openmp.yml +46 -0
- scs-3.3.2/scs_source/.github/workflows/build_openmp_mkl.yml +203 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/.github/workflows/build_spectral.yml +5 -2
- {scs-3.3.1 → scs-3.3.2}/scs_source/.github/workflows/buildpp.yml +1 -1
- {scs-3.3.1 → scs-3.3.2}/scs_source/.github/workflows/cmake.yml +1 -1
- scs-3.3.2/scs_source/.github/workflows/cmake_cudss.yml +61 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/.github/workflows/cmake_mkl.yml +4 -4
- scs-3.3.2/scs_source/.github/workflows/cmake_openmp.yml +55 -0
- scs-3.3.2/scs_source/.github/workflows/docs.yml +44 -0
- scs-3.3.2/scs_source/.github/workflows/gpu.yml +186 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/.github/workflows/mkl_interface_mismatch.yml +4 -4
- {scs-3.3.1 → scs-3.3.2}/scs_source/.github/workflows/valgrind.yml +4 -1
- {scs-3.3.1 → scs-3.3.2}/scs_source/.gitignore +2 -4
- {scs-3.3.1 → scs-3.3.2}/scs_source/CITATION.cff +2 -2
- {scs-3.3.1 → scs-3.3.2}/scs_source/CMakeLists.txt +138 -10
- scs-3.3.2/scs_source/CONTRIBUTING.md +68 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/Makefile +4 -3
- {scs-3.3.1 → scs-3.3.2}/scs_source/README.md +25 -14
- {scs-3.3.1 → scs-3.3.2}/scs_source/cmake/scsConfig.cmake.in +6 -2
- {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/Doxyfile +8 -3
- scs-3.3.2/scs_source/docs/src/Makefile +77 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/_static/css/scs_theme.css +5 -10
- scs-3.3.2/scs_source/docs/src/_static/js/analytics.js +8 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/algorithm/acceleration.rst +14 -2
- {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/algorithm/equilibration.rst +1 -1
- {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/algorithm/index.rst +2 -4
- scs-3.3.2/scs_source/docs/src/algorithm/scale.rst +357 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/algorithm/warm_start.rst +17 -1
- {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/api/c.rst +4 -24
- scs-3.3.2/scs_source/docs/src/api/compile_flags.rst +201 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/api/cones.rst +43 -4
- {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/api/index.rst +0 -2
- {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/api/info.rst +13 -3
- {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/api/javascript.rst +1 -1
- {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/api/python.rst +11 -5
- {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/api/settings.rst +10 -10
- scs-3.3.2/scs_source/docs/src/benchmarks/index.rst +1103 -0
- scs-3.3.2/scs_source/docs/src/blas_lapack/index.rst +279 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/citing/index.rst +2 -4
- {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/conf.py +10 -10
- scs-3.3.2/scs_source/docs/src/contributing/index.rst +52 -0
- scs-3.3.2/scs_source/docs/src/examples/.gitignore +8 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/examples/c.rst +2 -1
- {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/examples/matlab.rst +7 -2
- {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/examples/python/basic_qp.rst +2 -1
- {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/examples/python/entropy.py +1 -1
- {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/examples/python/entropy.rst +2 -1
- {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/examples/python/lasso.rst +3 -2
- {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/examples/python/mat_completion.rst +2 -1
- {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/examples/python/mpc.py +1 -1
- {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/examples/python/mpc.rst +2 -1
- scs-3.3.2/scs_source/docs/src/files/bench/infeas_pair.png +0 -0
- scs-3.3.2/scs_source/docs/src/files/bench/landing_grid.png +0 -0
- scs-3.3.2/scs_source/docs/src/files/bench/landing_grid_1e-5.png +0 -0
- scs-3.3.2/scs_source/docs/src/files/bench/lp_1e-4_pair.png +0 -0
- scs-3.3.2/scs_source/docs/src/files/bench/lp_1e-6_pair_largest.png +0 -0
- scs-3.3.2/scs_source/docs/src/files/bench/lpbig_1e-4_pair.png +0 -0
- scs-3.3.2/scs_source/docs/src/files/bench/lpbig_1e-5_pair.png +0 -0
- scs-3.3.2/scs_source/docs/src/files/bench/qp_1e-4_pair.png +0 -0
- scs-3.3.2/scs_source/docs/src/files/bench/qp_1e-6_pair_largest.png +0 -0
- scs-3.3.2/scs_source/docs/src/files/bench/sdp_1e-4_pair.png +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/help/index.rst +9 -6
- {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/index.rst +44 -14
- scs-3.3.2/scs_source/docs/src/install/c.rst +357 -0
- scs-3.3.2/scs_source/docs/src/install/python.rst +291 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/linear_solver/index.rst +66 -4
- scs-3.3.2/scs_source/docs/src/requirements.txt +9 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/include/cones.h +27 -9
- {scs-3.3.1 → scs-3.3.2}/scs_source/include/glbopts.h +25 -5
- {scs-3.3.1 → scs-3.3.2}/scs_source/include/scs.h +10 -8
- {scs-3.3.1 → scs-3.3.2}/scs_source/include/scs_work.h +2 -1
- {scs-3.3.1 → scs-3.3.2}/scs_source/linsys/cudss/direct/private.c +50 -2
- {scs-3.3.1 → scs-3.3.2}/scs_source/linsys/gpu/indirect/private.c +17 -4
- {scs-3.3.1 → scs-3.3.2}/scs_source/linsys/mkl/direct/private.c +1 -1
- {scs-3.3.1 → scs-3.3.2}/scs_source/scs.mk +43 -2
- {scs-3.3.1 → scs-3.3.2}/scs_source/src/aa.c +27 -7
- {scs-3.3.1 → scs-3.3.2}/scs_source/src/cones.c +851 -163
- {scs-3.3.1 → scs-3.3.2}/scs_source/src/linalg.c +16 -3
- {scs-3.3.1 → scs-3.3.2}/scs_source/src/scs.c +91 -46
- {scs-3.3.1 → scs-3.3.2}/scs_source/src/spectral_cones/logdeterminant/logdet_cone.c +15 -14
- {scs-3.3.1 → scs-3.3.2}/scs_source/src/spectral_cones/nuclear/ell1_cone.c +1 -4
- {scs-3.3.1 → scs-3.3.2}/scs_source/src/spectral_cones/sum-largest/sum_largest_eval_cone.c +11 -9
- scs-3.3.2/scs_source/test/minunit.h +52 -0
- scs-3.3.2/scs_source/test/mkl_psd_guard.c +282 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/test/problem_utils.h +123 -22
- {scs-3.3.1 → scs-3.3.2}/scs_source/test/problems/complex_PSD.h +2 -1
- {scs-3.3.1 → scs-3.3.2}/scs_source/test/problems/degenerate.h +10 -3
- {scs-3.3.1 → scs-3.3.2}/scs_source/test/problems/dense_qp.h +2 -1
- {scs-3.3.1 → scs-3.3.2}/scs_source/test/problems/hs21_tiny_qp.h +7 -3
- {scs-3.3.1 → scs-3.3.2}/scs_source/test/problems/hs21_tiny_qp_rw.h +5 -2
- scs-3.3.2/scs_source/test/problems/issue_140 +0 -0
- scs-3.3.2/scs_source/test/problems/issue_140.h +19 -0
- scs-3.3.2/scs_source/test/problems/issue_220 +0 -0
- scs-3.3.2/scs_source/test/problems/issue_220.h +37 -0
- scs-3.3.2/scs_source/test/problems/issue_499.h +79 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/test/problems/lp_update.h +5 -5
- {scs-3.3.1 → scs-3.3.2}/scs_source/test/problems/qafiro_tiny_qp.h +25 -5
- {scs-3.3.1 → scs-3.3.2}/scs_source/test/problems/rob_gauss_cov_est.h +24 -4
- {scs-3.3.1 → scs-3.3.2}/scs_source/test/problems/sd_and_complex_sd.h +2 -1
- {scs-3.3.1 → scs-3.3.2}/scs_source/test/problems/small_lp.h +2 -1
- {scs-3.3.1 → scs-3.3.2}/scs_source/test/problems/small_qp.h +7 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/test/problems/test_box_cone.h +2 -1
- {scs-3.3.1 → scs-3.3.2}/scs_source/test/problems/test_dual_exp_cone.h +2 -1
- {scs-3.3.1 → scs-3.3.2}/scs_source/test/problems/test_mixed_cones.h +2 -1
- scs-3.3.2/scs_source/test/problems/test_non_psd_p.h +76 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/test/problems/test_normalize_roundtrip.h +14 -12
- {scs-3.3.1 → scs-3.3.2}/scs_source/test/problems/test_power_cone.h +139 -5
- {scs-3.3.1 → scs-3.3.2}/scs_source/test/problems/test_prob_from_data_file.h +14 -4
- {scs-3.3.1 → scs-3.3.2}/scs_source/test/problems/test_psd_metric.h +11 -7
- {scs-3.3.1 → scs-3.3.2}/scs_source/test/problems/test_psd_n1.h +2 -1
- scs-3.3.2/scs_source/test/problems/test_psd_parallel.h +383 -0
- scs-3.3.2/scs_source/test/problems/test_psd_scale_updates.h +186 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/test/problems/test_soc_sizes.h +10 -5
- {scs-3.3.1 → scs-3.3.2}/scs_source/test/problems/test_solver_options.h +10 -3
- {scs-3.3.1 → scs-3.3.2}/scs_source/test/problems/test_zero_cone.h +2 -1
- {scs-3.3.1 → scs-3.3.2}/scs_source/test/run_from_file.c +8 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/test/run_tests.c +84 -19
- {scs-3.3.1 → scs-3.3.2}/scs_source/test/spectral_cones_problems/exp_design.h +1 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/test/spectral_cones_problems/several_logdet_cones.h +1 -0
- scs-3.3.2/scs_source/test/spectral_cones_problems/test_spectral_metric_updates.h +163 -0
- {scs-3.3.1 → scs-3.3.2}/test/test_scs_coverage.py +53 -0
- {scs-3.3.1 → scs-3.3.2}/test/test_scs_sdp.py +57 -0
- scs-3.3.1/CLAUDE.md +0 -92
- scs-3.3.1/scs_source/.github/workflows/build_openmp.yml +0 -30
- scs-3.3.1/scs_source/.github/workflows/cmake_cudss.yml +0 -41
- scs-3.3.1/scs_source/.github/workflows/cmake_openmp.yml +0 -30
- scs-3.3.1/scs_source/.github/workflows/docs.yml +0 -30
- scs-3.3.1/scs_source/.github/workflows/gpu.yml +0 -31
- scs-3.3.1/scs_source/CLAUDE.md +0 -115
- scs-3.3.1/scs_source/CONTRIBUTING.md +0 -49
- scs-3.3.1/scs_source/docs/src/Makefile +0 -28
- scs-3.3.1/scs_source/docs/src/algorithm/scale.rst +0 -216
- scs-3.3.1/scs_source/docs/src/api/compile_flags.rst +0 -92
- scs-3.3.1/scs_source/docs/src/blas_lapack/index.rst +0 -35
- scs-3.3.1/scs_source/docs/src/contributing/index.rst +0 -22
- scs-3.3.1/scs_source/docs/src/examples/.gitignore +0 -1
- scs-3.3.1/scs_source/docs/src/examples/python/entropy.py.out +0 -28
- scs-3.3.1/scs_source/docs/src/examples/python/lasso.py.out +0 -189
- scs-3.3.1/scs_source/docs/src/examples/python/mat_completion.py.out +0 -215
- scs-3.3.1/scs_source/docs/src/examples/python/mpc.py.out +0 -143
- scs-3.3.1/scs_source/docs/src/examples/python/qp.py.out +0 -30
- scs-3.3.1/scs_source/docs/src/examples/qp.c.out +0 -34
- scs-3.3.1/scs_source/docs/src/files/qp_solvers_benchmark.png +0 -0
- scs-3.3.1/scs_source/docs/src/files/windows1.png +0 -0
- scs-3.3.1/scs_source/docs/src/files/windows2.png +0 -0
- scs-3.3.1/scs_source/docs/src/files/windows3.png +0 -0
- scs-3.3.1/scs_source/docs/src/install/c.rst +0 -209
- scs-3.3.1/scs_source/docs/src/install/python.rst +0 -208
- scs-3.3.1/scs_source/docs/src/make.bat +0 -35
- scs-3.3.1/scs_source/docs/src/requirements.txt +0 -4
- scs-3.3.1/scs_source/test/minunit.h +0 -28
- {scs-3.3.1 → scs-3.3.2}/.github/ISSUE_TEMPLATE.md +0 -0
- {scs-3.3.1 → scs-3.3.2}/.github/dependabot.yml +0 -0
- {scs-3.3.1 → scs-3.3.2}/.github/scripts/install_mkl_static.sh +0 -0
- {scs-3.3.1 → scs-3.3.2}/.github/scripts/mkl_guard.py +0 -0
- {scs-3.3.1 → scs-3.3.2}/.gitmodules +0 -0
- {scs-3.3.1 → scs-3.3.2}/LICENSE +0 -0
- {scs-3.3.1 → scs-3.3.2}/LICENSE-INTEL-MKL.txt +0 -0
- {scs-3.3.1 → scs-3.3.2}/distribute.sh +0 -0
- {scs-3.3.1 → scs-3.3.2}/notebooks/analyze_csv_logs.ipynb +0 -0
- {scs-3.3.1 → scs-3.3.2}/notebooks/scs_benchmarks.ipynb +0 -0
- {scs-3.3.1 → scs-3.3.2}/notebooks/scs_qp.ipynb +0 -0
- {scs-3.3.1 → scs-3.3.2}/pixi.toml +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs/py_ctrlc.c +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs/pythoncapi-compat/.github/workflows/build.yml +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs/pythoncapi-compat/.gitignore +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs/pythoncapi-compat/.readthedocs.yaml +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs/pythoncapi-compat/CODE_OF_CONDUCT.md +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs/pythoncapi-compat/COPYING +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs/pythoncapi-compat/README.rst +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs/pythoncapi-compat/docs/Makefile +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs/pythoncapi-compat/docs/api.rst +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs/pythoncapi-compat/docs/changelog.rst +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs/pythoncapi-compat/docs/conf.py +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs/pythoncapi-compat/docs/index.rst +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs/pythoncapi-compat/docs/links.rst +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs/pythoncapi-compat/docs/make.bat +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs/pythoncapi-compat/docs/tests.rst +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs/pythoncapi-compat/docs/upgrade.rst +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs/pythoncapi-compat/docs/users.rst +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs/pythoncapi-compat/pythoncapi_compat.h +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs/pythoncapi-compat/runtests.py +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs/pythoncapi-compat/tests/__init__.py +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs/pythoncapi-compat/tests/setup.py +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs/pythoncapi-compat/tests/test_pythoncapi_compat.py +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs/pythoncapi-compat/tests/test_pythoncapi_compat_cext.c +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs/pythoncapi-compat/tests/test_pythoncapi_compat_cppext.cpp +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs/pythoncapi-compat/tests/test_upgrade_pythoncapi.py +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs/pythoncapi-compat/tests/utils.py +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs/pythoncapi-compat/upgrade_pythoncapi.py +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs/scsmodule.h +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs/scsobject.h +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/.github/ISSUE_TEMPLATE.md +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/.github/workflows/cmake_consume.yml +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/LICENSE.txt +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/cmake/AddInstallRPATHSupport.cmake +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/cmake/AddUninstallTarget.cmake +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/cmake/InstallBasicPackageFiles.cmake +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/cmake/scs_types.h.in +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/_static/favicon.ico +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/_static/scs_logo.png +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/_static/scs_logo_transparent.png +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/algorithm/relaxation.rst +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/api/exit_flags.rst +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/api/julia.rst +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/api/matlab.rst +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/api/matrices.rst +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/api/r.rst +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/api/ruby.rst +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/examples/index.rst +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/examples/javascript.rst +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/examples/javascript_disc.html +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/examples/julia.rst +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/examples/python/lasso.py +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/examples/python/mat_completion.py +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/examples/python/qp.py +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/examples/python.rst +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/examples/qp.c +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/examples/qp.m +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/examples/qp.m.out +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/examples/qp.prob +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/examples/r.rst +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/examples/ruby.rst +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/install/index.rst +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/install/javascript.rst +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/install/julia.rst +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/install/matlab.rst +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/install/r.rst +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/docs/src/install/ruby.rst +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/include/aa.h +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/include/aa_stats.h +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/include/ctrlc.h +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/include/linalg.h +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/include/linsys.h +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/include/normalize.h +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/include/rw.h +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/include/scs_blas.h +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/include/scs_types.h +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/include/util.h +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/include/util_spectral_cones.h +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/linsys/accelerate/direct/private.c +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/linsys/accelerate/direct/private.h +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/linsys/cpu/dense/private.c +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/linsys/cpu/dense/private.h +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/linsys/cpu/direct/private.c +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/linsys/cpu/direct/private.h +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/linsys/cpu/indirect/private.c +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/linsys/cpu/indirect/private.h +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/linsys/csparse.c +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/linsys/csparse.h +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/linsys/cudss/direct/private.h +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/linsys/external/amd/LICENSE.txt +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/linsys/external/amd/SuiteSparse_config.c +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/linsys/external/amd/SuiteSparse_config.h +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/linsys/external/amd/amd.h +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/linsys/external/amd/amd_1.c +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/linsys/external/amd/amd_2.c +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/linsys/external/amd/amd_aat.c +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/linsys/external/amd/amd_control.c +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/linsys/external/amd/amd_defaults.c +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/linsys/external/amd/amd_dump.c +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/linsys/external/amd/amd_global.c +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/linsys/external/amd/amd_info.c +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/linsys/external/amd/amd_internal.h +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/linsys/external/amd/amd_order.c +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/linsys/external/amd/amd_post_tree.c +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/linsys/external/amd/amd_postorder.c +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/linsys/external/amd/amd_preprocess.c +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/linsys/external/amd/amd_valid.c +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/linsys/external/amd/changes +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/linsys/external/qdldl/LICENSE +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/linsys/external/qdldl/README.md +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/linsys/external/qdldl/changes +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/linsys/external/qdldl/qdldl.c +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/linsys/external/qdldl/qdldl.h +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/linsys/external/qdldl/qdldl_types.h +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/linsys/gpu/gpu.c +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/linsys/gpu/gpu.h +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/linsys/gpu/indirect/private.h +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/linsys/mkl/direct/private.h +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/linsys/scs_matrix.c +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/linsys/scs_matrix.h +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/src/ctrlc.c +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/src/exp_cone.c +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/src/normalize.c +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/src/rw.c +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/src/scs_version.c +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/src/spectral_cones/logdeterminant/log_cone_IPM.c +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/src/spectral_cones/logdeterminant/log_cone_Newton.c +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/src/spectral_cones/logdeterminant/log_cone_wrapper.c +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/src/spectral_cones/nuclear/nuclear_cone.c +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/src/spectral_cones/sum-largest/sum_largest_cone.c +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/src/spectral_cones/util_spectral_cones.c +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/src/util.c +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/test/mkl_interface_mismatch.c +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/test/packaging/CMakeLists.txt +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/test/packaging/consume.c +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/test/problems/infeasible_lp.h +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/test/problems/infeasible_socp.h +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/test/problems/infeasible_tiny_qp.h +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/test/problems/max_ent +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/test/problems/max_ent.h +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/test/problems/mpc_bug.h +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/test/problems/mpc_bug1 +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/test/problems/mpc_bug2 +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/test/problems/mpc_bug3 +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/test/problems/random_prob +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/test/problems/random_prob.h +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/test/problems/test_exp_cone.h +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/test/problems/test_inaccurate.h +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/test/problems/test_root_plus.h +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/test/problems/test_rw_settings.h +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/test/problems/test_validation.h +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/test/problems/unbounded_lp.h +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/test/problems/unbounded_socp.h +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/test/problems/unbounded_tiny_qp.h +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/test/random_socp_prob.c +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/test/rng.h +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/test/rw_settings.c +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/test/spectral_cones_problems/graph_partitioning.h +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/test/spectral_cones_problems/robust_pca.h +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/test/spectral_cones_problems/several_nuc_cone.h +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/test/spectral_cones_problems/several_sum_largest.h +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/test/spectral_cones_problems/test_ell1_and_nuc.h +0 -0
- {scs-3.3.1 → scs-3.3.2}/scs_source/test/spectral_cones_problems/test_ell1_cone.h +0 -0
- {scs-3.3.1 → scs-3.3.2}/test/conftest.py +0 -0
- {scs-3.3.1 → scs-3.3.2}/test/gen_random_cone_prob.py +0 -0
- {scs-3.3.1 → scs-3.3.2}/test/lsan-suppressions.txt +0 -0
- {scs-3.3.1 → scs-3.3.2}/test/solve_random_cone_prob.py +0 -0
- {scs-3.3.1 → scs-3.3.2}/test/test_free_threading.py +0 -0
- {scs-3.3.1 → scs-3.3.2}/test/test_mix_sd_csd_cone.py +0 -0
- {scs-3.3.1 → scs-3.3.2}/test/test_scs_basic.py +0 -0
- {scs-3.3.1 → scs-3.3.2}/test/test_scs_object.py +0 -0
- {scs-3.3.1 → scs-3.3.2}/test/test_scs_quad.py +0 -0
- {scs-3.3.1 → scs-3.3.2}/test/test_scs_rand.py +0 -0
- {scs-3.3.1 → scs-3.3.2}/test/test_sigint_mixed_backends.py +0 -0
- {scs-3.3.1 → scs-3.3.2}/test/test_solve_random_cone_prob.py +0 -0
- {scs-3.3.1 → scs-3.3.2}/test/test_solve_random_cone_prob_accelerate.py +0 -0
- {scs-3.3.1 → scs-3.3.2}/test/test_solve_random_cone_prob_cudss.py +0 -0
- {scs-3.3.1 → scs-3.3.2}/test/test_solve_random_cone_prob_dense.py +0 -0
- {scs-3.3.1 → scs-3.3.2}/test/test_solve_random_cone_prob_mkl.py +0 -0
- {scs-3.3.1 → scs-3.3.2}/test/test_spectral_and_complex_cones.py +0 -0
- {scs-3.3.1 → scs-3.3.2}/test/test_thread_safety.py +0 -0
- {scs-3.3.1 → scs-3.3.2}/test/test_warm_start_consistency.py +0 -0
- {scs-3.3.1 → scs-3.3.2}/test/tsan-suppressions.txt +0 -0
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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:
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
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:
|
|
262
|
-
|
|
263
|
-
#
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
run:
|
|
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
|
-
|
|
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@
|
|
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@
|
|
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.
|
|
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
|
-
|
|
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'
|
{scs-3.3.1 → scs-3.3.2}/PKG-INFO
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: scs
|
|
3
|
-
Version: 3.3.
|
|
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
|
|
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
|
|
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)
|