github cvxgrp/scs 3.3.1
SCS 3.3.1

3 hours ago

SCS 3.3.1 is a corrective release for the 3.3 series. It fixes binary serialization, MKL initialization and packaging, installed-library consumption, and binding robustness. The Python and MATLAB releases both use core commit cc244ebc4bff620e2e228e99a4e2e24ab12f9e3b.

Upgrade highlights

  • Python users should upgrade from the yanked 3.3.0 release. The missing MKL CPU-dispatch libraries in its x86-64 Linux wheels could abort the interpreter on the first solve. The new manylinux wheels link sequential MKL statically, so no separate MKL installation or scs[mkl] extra is needed.
  • MATLAB users should replace the old toolbox. The rebuilt package includes native Apple Silicon and Intel Mac binaries, corrected platform metadata, independent workspace handles, and safer MEX argument handling.
  • C/C++ packagers: shared libraries now use a stable major.minor loader identity (3.3), and installed CMake packages correctly expose the dependencies needed by static consumers.

The 3.3.0 release notes describe the underlying algorithm changes and benchmark results. This patch release does not introduce a new benchmark claim or retune the solver's default tolerances.

Binary serialization (#419)

  • Persist adaptive_diag_scale instead of silently restoring its default when a saved problem is read.
  • Use a separate extension-schema version for appended fields. The reader accepts older supported schemas, keeps defaults for absent fields, and rejects schemas newer than it understands.
  • Choose the settings layout by the actual 3.3 format transition, not by exact equality with the current patch-version string. Files from another 3.3.x build therefore no longer select the legacy layout accidentally.
  • Add round-trip tests for single and double precision, historical layouts, and adjacent 3.3.x version strings.

SCS binary problem files remain a native diagnostic format, not a general cross-platform interchange format. Older readers should not be expected to understand the new extension schema.

Anderson acceleration and solver robustness (#418, #421)

  • Accept finite negative acceleration_regularization values through the SCS settings validation. A negative value means pin the absolute regularization magnitude; it does not mean apply a negative diagonal shift. Zero retains its no-regularization meaning.
  • Reject non-finite acceleration parameters and improve allocation-failure handling.
  • Synchronize the vendored AA implementation with upstream, including Windows profiling timers and avoiding unused norm computations on pinned/no-regularization and type-II paths.
  • Correct the PSD metric documentation to match the implementation.

MKL interface handling (#422)

  • Compare the LP64/ILP64 integer-width bit, rather than the entire MKL interface-layer value. The GNU Fortran calling-convention flag is compatible and must not cause a false mismatch, including when an MKL-backed NumPy initializes MKL first.
  • Check the negative error return before interpreting those bits, and avoid Pardiso teardown when initialization did not succeed.
  • Permit static MKL linking when the dynamic-runtime-only MKL_Set_Interface_Layer symbol is absent. Dynamic builds retain their width check; genuinely incompatible LP64/ILP64 configurations still fail early.

Build and installed-package fixes (#420)

  • CMake and Make derive shared-library ABI names from major.minor: for example, libscsdir.so.3.3 and @rpath/libscsdir.3.3.dylib. CMake retains the full 3.3.1 file version and symlink chain.
  • Windows DLL filenames carry the ABI version; MinGW import libraries are generated, installed, and recoverable when missing, including parallel installs.
  • Shared installed packages no longer require consumers to rediscover private BLAS/LAPACK build dependencies. Static packages rediscover dependency targets rather than exporting build-machine provider paths.
  • Static LAPACK consumers receive the library's compiled integer width, with a diagnostic for an incompatible pre-existing LAPACK setup. MKL configuration uses the single dynamic library where required.
  • CMake builds and consumers of static packages require CMake 3.22 or newer, so LAPACK integer-width selection is honored. The core build explicitly uses C99 and requests the necessary POSIX declarations on Linux/SunOS. This does not make the solver implementation C89-compatible.

Python and MATLAB distributions

Python 3.3.1 fixes the MKL wheel failure, restores non-MKL wheel backends on other platforms, strengthens source-build guards, and fixes Ctrl-C handling across overlapping solves using different backends. Install with:

python -m pip install --upgrade scs

MATLAB 3.3.1 provides the rebuilt SCS.mltbx, SCS 3.3 settings, validated data/update paths, independent workspace handles, and safe handling of requested outputs. Linux release binaries require glibc 2.31 or newer, not a maximum glibc version. The optional cuDSS backend requires a source build and is not included in the toolbox.

Validation and documentation

Release gates cover core solver tests, spectral configurations, single/double precision, integer-width configurations, MKL initialization and solves, strict C99 compilation, memory checks, and external consumers of installed shared/static libraries. Python publication additionally waits for wheel ELF audits and pristine-container solves; MATLAB packages are installed and smoke-tested on each shipped platform.

Local core validation also passed both 60-test direct/indirect suites and an installed CMake consumer, with runtime version 3.3.1 and the 3.3 loader identity checked explicitly. Installation docs and citation metadata were refreshed; generated Doxygen output is no longer tracked (#424#426).

Full core changelog

Don't miss a new scs release

NewReleases is sending notifications on new releases.