Python
After installing you can import SCS using
import scs
This module provides the SCS class which is initialized using:
solver = scs.SCS(data,
cone,
linear_solver=scs.LinearSolver.AUTO,
verbose=True,
normalize=True,
max_iters=int(1e5),
scale=0.1,
adaptive_scale=True,
adaptive_diag_scale=True,
eps_abs=1e-4,
eps_rel=1e-4,
eps_infeas=1e-7,
alpha=1.5,
rho_x=1e-6,
acceleration_lookback=10,
acceleration_interval=5,
time_limit_secs=0,
write_data_filename=None,
log_csv_filename=None)
where data is a dict containing P, A, b, c, and cone is
a dict that contains the Cones information. The cone dict
contains keys corresponding to the cone type and values corresponding to either
the cone length or the array that defines the cone (see the third column in
Cones for the keys and what the corresponding values represent). The
b, and c entries must be 1d numpy arrays and the P and
A entries must be scipy sparse matrices in CSC format; if they are not
of the proper format, SCS will attempt to convert them.
Linear solver selection
The linear_solver setting controls which Linear System Solver backend
SCS uses. It accepts a scs.LinearSolver enum value.
The default is AUTO, which selects the best available solver for
the platform:
macOS: QDLDL (Apple Accelerate is available via
LinearSolver.ACCELERATE)Linux / Windows: MKL Pardiso if available (built into the x86-64 manylinux wheels), otherwise QDLDL
Value |
Description |
|---|---|
|
Auto-detect best available solver (default). |
|
Sparse direct solver using QDLDL (always available). |
|
Sparse indirect solver using conjugate gradients (runs on CPU). |
|
Intel MKL Pardiso direct solver (built into the x86-64 manylinux wheels, or an MKL build). |
|
Apple Accelerate sparse LDLT (macOS only, included automatically). |
|
Dense direct solver via LAPACK (requires LAPACK build). |
|
Sparse GPU indirect solver (requires GPU build). |
|
Sparse GPU direct solver via cuDSS (requires cuDSS build). |
Example:
# Use the default (auto-detect)
solver = scs.SCS(data, cone)
# Explicitly select a solver
solver = scs.SCS(data, cone, linear_solver=scs.LinearSolver.QDLDL)
The remaining fields are explained in Settings.
Cone dict
The cone dict supports the following keys (see Cones for mathematical
definitions):
Key |
Value |
Description |
|---|---|---|
|
|
Zero cone length. |
|
|
Non-negative cone length. |
|
|
Box cone upper/lower bounds (length \(\text{bsize}-1\)). |
|
|
Second-order cone lengths. |
|
|
PSD cone matrix dimensions. |
|
|
Complex PSD cone matrix dimensions. |
|
|
Number of primal exponential cone triples. |
|
|
Number of dual exponential cone triples. |
|
|
Power cone parameters in \([-1, 1]\). |
Spectral cone keys (require spectral cone build):
Key |
Value |
Description |
|---|---|---|
|
|
Log-determinant cone matrix dimensions. |
|
|
Nuclear norm cone matrix row/column dimensions (must be equal length, \(m_i \geq n_i\)). |
|
|
\(\ell_1\) norm cone vector dimensions. |
|
|
Sum-of-largest-eigenvalues cone matrix dimensions and \(k\) values (must be equal length, \(0 < k_i < n_i\)). |
Then to solve the problem call:
sol = solver.solve(warm_start=True, x=None, y=None, s=None)
where warm_start indicates whether the solve will reuse the previous
solution as a warm-start (if this is the first solve it initializes at zero).
A good warm-start can reduce the overall number of iterations required to solve
a problem. 1d Numpy arrays x,y,s are (optional) warm-start overrides if
you wish to set these manually rather than use solution to the last problem as
the warm-start.
At termination sol is a dict with fields x, y, s, info where
x, y, s contains the primal-dual solution or the
certificate of infeasibility, and info is a dict
containing the solve Return information. Detailed Anderson acceleration diagnostics are
available in sol["info"]["aa_stats"].
To re-use the workspace and solve a similar problem with new b
and / or c data, we can update the solver using:
solver.update(b=new_b, c=new_c) # update b and c vectors (can be None)
solver.solve() # solve new problem with updated b and c