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_scaleinstead 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_regularizationvalues 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_Layersymbol 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.3and@rpath/libscsdir.3.3.dylib. CMake retains the full3.3.1file 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 scsMATLAB 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).