All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
4.2.0 - 2023-12-21
- Example: lasso regularization
Problem.load
functionProblem.save
function
4.1.1 - 2023-12-05
- Mark QPALM as a sparse solver only
4.1.0 - 2023-12-04
- New solver: QPALM
- Unit test for internal linear-box inequality combination
- Internal: refactor linear-box inequality combination function
- Renamed main branch of the repository from
master
tomain
- Fix combination of box inequalities with empty linear inequalities
- Gurobi: Account for a slight regression in QPSUT01 performance
4.0.1 - 2023-11-01
- Allow installation of a subset of QP solvers from PyPI
4.0.0 - 2023-08-30
- New solver: PIQP (thanks to @shaoanlu)
- Type for active set of equality and inequality constraints
- Breaking: condition number requires an active set (thanks to @aescande)
3.5.0 - 2023-08-16
- New solver: HPIPM (thanks to @adamheins)
- MOSEK: Disable CI test on QPSUT03 due to regression with 10.1.8
- MOSEK: Relax test tolerances as latest version is less accurate with defaults
3.4.0 - 2023-04-28
- Converted THANKS file to CFF
- ECOS: raise a ProblemError if inequality vectors contain infinite values
- ECOS: raise a ProblemError if the cost matrix is not positive definite
- MOSEK is now a supported solver (thanks to @uricohen and @aszekMosek)
- Residual and duality gap computations when solution is not found
- Update OSQP version to 0.6.2.post9 for testing
3.3.1 - 2023-04-12
- DAQP: Update to 0.5.1 to fix installation of arm64 wheels
3.3.0 - 2023-04-11
- New sample problems in
qpsolvers.problems
- New solver: DAQP (thanks to @darnstrom)
- Dual multipliers are empty arrays rather than None when no constraint
- Store solver results even when solution is not found
- Switch to
Solution.found
as solver success status (thanks to @rxian)
- Unit test on actual solution to QPSUT03 problem
3.2.0 - 2023-03-29
- Sparse strategy to convert LS problems to QP (thanks to @bodono)
- Start
problems
submodule to collect sample test problems
- Clarabel: upstream handling of infinite values in inequalities
- CVXOPT: option passing
3.1.0 - 2023-03-07
- New solver: NPPro
- Documentation: separate support and unsupported solver lists
- Exclude unsupported solvers from code coverage report
- Move unsupported solvers to a separate submodule
- Remove CVXOPT from dependencies as it doesn't have arm64 wheels
- Remove quadprog from dependencies as it doesn't have arm64 wheels
3.0.0 - 2023-02-28
- Exception
ParamError
for incorrect solver parameters - Exception
SolverError
for solver failures
- All functions throw only qpsolvers-owned exceptions
- CVXOPT: rethrow
ValueError
as eitherProblemError
orSolverError
- Checking
Solution.is_empty
becomesnot Solution.found
- Install open source solvers with wheels by default
- Remove
solve_safer_qp
- Remove
sym_proj
parameter
2.8.1 - 2023-02-28
- Expose
solve_unconstrained
function from main module
- Clarabel: handle unconstrained problems
- README: correct and improve FAQ on non-convex problems (thanks to @nrontsis)
2.8.0 - 2023-02-27
- New solver: Clarabel
- Move documentation to GitHub Pages
- Remove Python 2 installation instructions
- Check vector shapes in problem constructor
2.7.3 - 2023-01-16
- qpOASES: return number of WSR in solution extra info
- CVXOPT: fix domain errors when some bounds are infinite
- qpOASES: fix missing lower bound when there is no equality constraint
- qpOASES: handle infinite bounds
- qpOASES: segmentation fault with conda feedstock
2.7.2 - 2023-01-02
- ECOS: handle two more exit flags
- Exception
ProblemError
for problem formulation errors - Exception
QPError
as a base class for exceptions - Property to check if a Problem has sparse matrices
- qpOASES: raise a ProblemError when matrices are not dense
- qpSWIFT: raise a ProblemError when matrices are not dense
- quadprog: raise a ProblemError when matrices are not dense
- Add
use_sparse
argument to internal linear-from-box conversion - Restrict condition number calculation to dense problems for now
2.7.1 - 2022-12-23
- Document problem conversion functions in developer notes
- ECOS: handle more exit flags
- quadprog: use internal
split_dual_linear_box
conversion function
- SCS: require at least version 3.2
- Solution: duality gap computation under infinite box bounds
2.7.0 - 2022-12-15
- Continuous integration for macOS
- CVXOPT: return dual multipliers
- ECOS: return dual multipliers
- Example: dual multipliers
- Gurobi: return dual multipliers
- HiGHS: return dual multipliers
- MOSEK: return dual multipliers
- OSQP: return dual multipliers
- Problem class with utility metrics on quadratic programs
- Problem: condition number
- ProxQP: return dual multipliers
- qpOASES: return dual multipliers
- qpOASES: return objective value
- qpSWIFT: return dual multipliers
- qpSWIFT: return objective value
- quadprog: return dual multipliers
- SCS: return dual multipliers
- Code: move
solve_safer_qp
to a separate source file - Code: refactor location of internal conversions submodule
- ProxQP: bump minimum supported version to 0.2.9
- qpOASES: eliminate redundant equality constraints
2.6.0 - 2022-11-14
- Example: constrained linear regression
- Example: sparse linear least squares
- Gurobi: forward keyword arguments as solver parameters
- Handle diagonal matrices when combining linear and box inequalities
- qpOASES: pre-defined options parameter
- qpOASES: time limit parameter
- CVXOPT: forward all keyword arguments as solver options
- Deprecate
solve_safer_qp
and warn about future removal - Example: disable verbose output in least squares example
- HiGHS: forward all keyword arguments as solver options
- OSQP: drop support for versions <= 0.5.0
- OSQP: streamline stacking of box inequalities
- ProxQP: also consider constraint matrices to select backend
- qpOASES: forward all keyword arguments as solver options
- qpOASES: forward box inequalities directly
- Remove CVXPY which is not a solver
- SCS:
SOLVED_INACCURATE
is now considered a failure
- Dot product bug in
solve_ls
with sparse matrices - MOSEK: restore CVXOPT options after calling MOSEK
- ProxQP: fix box inequality shapes when combining bounds
- qpOASES: non-persistent solver options between calls
- qpOASES: return failure on
RET_INIT_FAILED*
return codes
2.5.0 - 2022-11-04
- CVXOPT: absolute tolerance parameter
- CVXOPT: feasibility tolerance parameter
- CVXOPT: limit maximum number of iterations
- CVXOPT: refinement parameter
- CVXOPT: relative tolerance parameter
- Documentation: reference solver papers
- ECOS: document additional parameters
- Gurobi: time limit parameter
- HiGHS: dual feasibility tolerance parameter
- HiGHS: primal feasibility tolerance parameter
- HiGHS: time limit parameter
- CVXOPT matrices are not valid types for qpsolvers any more
- CVXOPT: improve documentation
- CVXOPT: solver is now listed as sparse as well
- ECOS: type annotations allow sparse input matrices
- OSQP: don't override default solver tolerances
- Remove internal CVXOPT-specific type annotation
- Restrict matrix types to NumPy arrays and SciPy CSC matrices
- SCS: don't override default solver tolerances
- Simplify intermediate internal type annotations
- CVXOPT: pass warm-start primal properly
- ECOS: forward keyword arguments
- OSQP: dense arrays for vectors in type annotations
- SCS: fix handling of problems with only box inequalities
- Update ProxQP to version 0.2.2
2.4.0 - 2022-09-29
- New solver: HiGHS
- Raise error when there is no available solver
- Make sure plot is shown in MPC example
- Print expected solutions in QP, LS and box-inequality examples
- Renamed starter solvers optional deps to
open_source_solvers
- Correct documentation of
R
argument tosolve_ls
2.3.0 - 2022-09-06
- New solver: ProxQP
- Clean up unused dependencies in GitHub workflow
- Non-default solver parameters in unit tests to test their precision
- Configuration of
tox-gh-actions
for Python 3.7 - Enforce
USING_COVERAGE
in GitHub workflow configuration - Remove redundant solver loop from
test_all_shapes
2.2.0 - 2022-08-15
- Add
lb
andub
arguments to all<solver>_solve_qp
functions - Internal
conversions
submodule
- Moved
concatenate_bounds
to internalconversions
submodule - Moved
convert_to_socp
to internalconversions
submodule - Renamed
concatenate_bounds
tolinear_from_box_inequalities
- Renamed internal
convert_to_socp
function tosocp_from_qp
2.1.0 - 2022-07-25
- Document how to add a new QP solver to the library
- Example with (box) lower and upper bounds
- Test case where
lb
XORub
is set
- SCS: use the box cone API when lower/upper bounds are set
2.0.0 - 2022-07-05
- Exception
NoSolverSelected
raised when the solver kwarg is missing - Starter set of QP solvers as optional dependencies
- Test exceptions raised by
solve_ls
andsolve_qp
- Breaking:
solver
keyword argument is now mandatory forsolve_ls
- Breaking:
solver
keyword argument is now mandatory forsolve_qp
- Quadratic programming example now randomly selects an available solver
1.10.0 - 2022-06-25
- qpSWIFT: forward solver options as keywords arguments as with other solvers
1.9.1 - 2022-05-02
- OSQP: pass extra keyword arguments properly (thanks to @urob)
1.9.0 - 2022-04-03
- Benchmark on model predictive control problem
- Model predictive control example
- qpSWIFT 0.0.2 solver interface
- Compute colors automatically in benchmark example
- Bounds concatenation for CVXOPT sparse matrices
1.8.1 - 2022-03-05
- Setup instructions for Microsoft Visual Studio
- Unit tests where the problem is unbounded below
- Minimum supported Python version is now 3.7
- Clear all Pylint warnings
- Disable Pylint false positives that are covered by mypy
- ECOS: raise a ValueError when the cost matrix is not positive definite
1.8.0 - 2022-01-13
- Build and test for Python 3.10 in GitHub Actions
- Moved SCS to sparse solvers
- Re-run solver benchmark reported to the README
- Removed
requirements2.txt
and update Python 2 installation instructions - Updated SCS to new 3.0 version
- Handle sparse matrices in
print_matrix_vector
- Match
__all__
in model and top-level__init__.py
- Run unit tests in GitHub Actions
- Typing error in bound concatenation
1.7.2 - 2021-11-24
- Convenience function to prettyprint a matrix and vector side by side
- Move old tests from the examples folder to the unit test suite
- Removed deprecated
requirements.txt
installation file - Renamed
solvers
optional dependencies toall_pypi_solvers
1.7.1 - 2021-10-02
- Make CVXOPT optional again (thanks to @adamoppenheimer)
1.7.0 - 2021-09-19
- Example script corresponding exactly to the README
- Handle lower and upper bounds with sparse matrices (thanks to @MeindertHH)
- SCS 2.0 solver interface
- Type annotations to all solve functions
- Unit tests: package coverage is now 94%
- ECOS: simplify sparse matrix conversions
- Ignore warnings when running unit tests
- Inequality tolerance is now 1e-10 when validating solvers on README example
- Refactor QP to SOCP conversion to use more than one SOCP solver
- Rename "example problem" for testing to "README problem" (less ambiguous)
- Rename
sw
parameter ofsolve_safer_qp
tosr
for "slack repulsion" - Reorganize code with a qpsolvers/solvers submodule
- quadprog: warning when
initvals is not None
is now verbose
- OSQP: forward keyword arguments to solver properly
- quadprog: forward keyword arguments to solver properly
1.6.1 - 2021-04-09
- Add quadprog dependency properly in
pyproject.toml
1.6.0 - 2021-04-09
- Add
__version__
to main module - First unit tests to check all solvers over a pre-defined set of problems
- GitHub Actions now make sure the project is built and tested upon updates
- Type hints now decorate all function definitions
- Code formatting now applies Black
- ECOS: refactor SOCP conversion to improve function readability
- Gurobi: performance significantly improved by new matrix API (thanks to @DKenefake)
- CVXPY: properly return
None
on unfeasible problems - Consistently warn when
initvals
is passed but ignored by solver interface - ECOS: properly return
None
on unfeasible problems - Fix
None
case insolve_safer_qp
(found by static type checking) - Fix warnings in repository-level
__init__.py
- OSQP: properly return
None
on unfeasible problems - Pass Flake8 validation for overall code style
- Reduce complexity of entry
solve_qp
via a module-level solve-function index - Remove Python 2 compatibility line from examples
- quadprog: properly return
None
on unfeasible problems (thanks to @DKenefake)
1.5.0 - 2020-12-05
- Upgrade to Python 3 and deprecate Python 2
- Saved Python 2 package versions to
requirements2.txt
- Deprecation warning in CVXPY
1.4.1 - 2020-11-29
- New
solve_ls
function to solve linear Least Squares problems
- Call to
print
in PyPI description - Handling of quadprog ValueError exceptions
1.4.0 - 2020-07-04
- Solver settings can now by passed to
solve_qp
as keyword arguments - Started an API documentation
- Made
verbose
an explicit keyword argument of all internal functions - OSQP settings now match precision of other solvers (thanks to @Neotriple)
1.3.1 - 2020-06-13
- Equation of quadratic program on PyPI page
1.3.0 - 2020-05-16
- Lower and upper bound keyword arguments
lb
andub
- Check that equality/inequality matrices/vectors are provided consistently
- Relaxed offset check in test_solvers.py
1.2.1 - 2020-05-16
- CVXPY: verbose keyword argument
- ECOS: verbose keyword argument
- Gurobi: verbose keyword argument
- OSQP: verbose keyword argument
- Ignore verbosity argument when solver is not available
1.2.0 - 2020-05-16
- cvxopt: verbose keyword argument
- mosek: verbose keyword argument
- qpoases: verbose keyword argument
1.1.2 - 2020-05-15
- osqp: handle both old and more recent versions
1.1.1 - 2020-05-15
- Avoid variable name clash in OSQP
- Handle quadprog exception to avoid confusion on cost matrix notation
1.1.0 - 2020-03-07
- ECOS solver interface (no need to go through CVXPY any more)
- Update ECOS performance in benchmark (much better than before!)
- Fix link to ECOS in setup.py
- Remove ned for IPython in solver test
- Update notes on P matrix
1.0.7 - 2019/10/26
- Always reshape A or G vectors into one-line matrices
- cvxopt: handle case where G and h are None but not A and b
- osqp: handle case where G and h are None
- osqp: handle case where both G and A are one-line matrices
- qpoases: handle case where G and h are None but not A and b
1.0.6 - 2019/10/26
Thanks to Brian Delhaisse and Soeren Wolfers who contributed fixes to this release!
- quadprog: handle case where G and h are None
- quadprog: handle cas where A.ndim == 1
- Make examples compatible with both Python 2 and Python 3
1.0.5 - 2019/04/10
- Equality constraint shown in the README example
- Installation file
requirements.txt
- Installation instructions for qpOASES
- OSQP: automatic CSC matrix conversions (with performance warnings)
- This change log
- CVXOPT: case where A is one-dimensional
- qpOASES: case where both G and A are not None
- quadprog: wrapper for one-dimensional A matrix (thanks to @nvitucci)
- CVXOPT version is now 1.1.8 due to this issue
- Examples now in a separate folder
1.0.4 - 2018/07/05
- Let's take this change log from there.