Recent Releases of qpsolvers

qpsolvers - v4.8.1

This patch release makes the Calarabel interface warn properly when forwarding an unconstrained problem to lsqr, like the other interfaces already do. Thanks to @proyan for this patch :+1:

Changed

  • Clarabel: Warn when problem is unconstrained and solved by lsqr

- Python
Published by stephane-caron 10 months ago

qpsolvers - v4.8.0

This release adds support for the new API of PIQP v0.6.0, as well as macOS unit testing for KVXOPT.

Thanks to @RSchwan and @sanurielf for contributing to this release :+1:

Added

  • PIQP: Add support for new API in v0.6.0 (thanks to @RSchwan)
  • PIQP: Add new solver options to the documentation (thanks to @RSchwan)

Fixed

  • CICD: Enable macOS tests for KVXOPT (thanks to @sanurielf)

- Python
Published by stephane-caron 11 months ago

qpsolvers - v4.7.1

This patch release adds a py.typed file to be used by tools like Mypy. Thanks to @ValerianRey for taking care of this :+1:

Added

  • py.typed file to indicate tools like mypy to use type annotations

- Python
Published by stephane-caron 12 months ago

qpsolvers - v4.7.0

This release adds SIP, a sparse interior point solver implemented in C++. Thanks to @joaospinto for implementing this interface 👍

Additionally, this new version adds warning filters and clears out the OSQP version pin.

Added

  • New solver: SIP (thanks to @joaospinto)
  • warnings: Add SparseConversionWarning to filter the corresponding warning
  • warnings: Base class QPWarning for all qpsolvers-related warnings
  • warnings: Recall solver name when issuing conversion warnings

Changed

  • Add solver name argument to internal ensure_sparse_matrices function
  • CICD: Update Python version to 3.10 in coverage job

Fixed

  • docs: Add jaxopt.OSQP to the list of supported solvers

Removed

  • OSQP: Remove pre-1.0 version pin
  • OSQP: Update interface after relase of v1.0.4
  • Warning that was issued every time an unsupported solver is available

- Python
Published by stephane-caron about 1 year ago

qpsolvers - v4.6.0

This release adds KVXOPT, a fork from CVXOPT including more SuiteSparse functions and KLU sparse matrix solver. Thanks to @agroudiev for implementing this interface 👍

Additionally, this new version extends support to JAX arrays when using the jaxopt.OSQP solver.

Added

  • New solver: KVXOPT
  • jaxopt.OSQP: Support JAX array inputs when jaxopt.OSQP is the selected solver

- Python
Published by stephane-caron about 1 year ago

qpsolvers - v4.5.1

This patch release adds a workaround to handle OSQP infeasibility certificates with both pre-1.0 and 1.0.3 versions of the solver.

Changed

  • CICD: Update checkout action to v4

Fixed

  • OSQP: Temporary fix in returning primal-dual infeasibility certificates

- Python
Published by stephane-caron about 1 year ago

qpsolvers - v4.5.0

This release adds jaxopt.OSQP, an implementation of the OSQP algorithm in JAX.

Added

  • HPIPM: Document new tol_dual_gap parameter
  • New solver: jaxopt.OSQP
  • Support Python 3.12

Changed

  • Bump minimum Python version to 3.8
  • CICD: Remove Python 3.8 from continuous integration
  • Fix output datatypes when splitting linear-box dual multipliers
  • Warn when solving unconstrained problem by SciPy's LSQR rather than QP solver

Fixed

  • Fix mypy error in Solution.primal_residual

- Python
Published by stephane-caron about 1 year ago

qpsolvers - v4.4.0

This release adds qpax, a primal-dual interior-point solver implemented in JAX. Thanks to @lvjonok for implementing this interface :thumbsup:

Added

  • New solver: qpax
  • HPIPM: Link to reference paper for details on solver modes

- Python
Published by stephane-caron over 1 year ago

qpsolvers - v4.3.3

This patch release follows a NumPy update, avoids unnecessary matrix conversions with PIQP and catches some exceptions from Clarabel.

Thanks to @itsahmedkhalil for contributing to this release :+1:

Changed

  • CICD: Remove Gurobi from macOS continuous integration
  • CICD: Remove Python 3.7 from continuous integration
  • CICD: Update ruff to 0.4.3

Fixed

  • CICD: Fix coverage and licensed-solver workflows
  • CICD: Install missing dependency in licensed solver test environment
  • Clarabel: Catch pyO3 panics that can happen when building a problem
  • Default arguments to active set dataclass to None rather than empty list
  • PIQP: Warning message about CSC matrix conversions (thanks to @itsahmedkhalil)
  • Update all instances of np.infty to np.inf

- Python
Published by stephane-caron almost 2 years ago

qpsolvers - v4.3.2

This patch release updates the wheels_only optional dependency to work on more systems.

Added

  • Optional dependency: wheels_only for solvers with pre-compiled binaries

Changed

  • Update developer notes in the documentation
  • Update some solver tolerances in unit tests
  • Warn rather than raise when there is no solver detected

Fixed

  • CICD: Update micromamba setup action

- Python
Published by stephane-caron about 2 years ago

qpsolvers - v4.3.1

This patch release fixes the sign of dual multipliers in the Gurobi interface, and adds corresponding unit tests. Thanks @563925743 for finding this :+1:

Fixed

  • Gurobi: sign of inequality multipliers (thanks to @563925743)

- Python
Published by stephane-caron over 2 years ago

qpsolvers - v4.3.0

This release moves all QP solvers to optional dependencies (#268), along with a healthy batch of corrections to the documentation.

Thanks to @ogencoglu and @ottapav for contributing to this release :+1:

Added

  • Extend continuous integration to Python 3.11
  • Optional dependencies for all solvers in the list available on PyPI

Changed

  • Breaking: no default QP solver installed along with the library
  • NPPro: update exit flag value to match new solver API (thanks to @ottapav)

Fixed

  • Documentation: Add Clarabel to the list of supported solvers (thanks to @ogencoglu)
  • Documentation: Correct note in solve_ls documentation (thanks to @ogencoglu)
  • Documentation: Correct output of LS example (thanks to @ogencoglu)

- Python
Published by stephane-caron over 2 years ago

qpsolvers - v4.2.0

This release adds the ability to load and save problems from/to files.

Added

  • Problem.load function
  • Problem.save function

- Python
Published by stephane-caron over 2 years ago

qpsolvers - v4.1.1

This patch release marks QPALM as a sparse solver only to reflect its API.

Changed

  • Mark QPALM as a sparse solver only

- Python
Published by stephane-caron over 2 years ago

qpsolvers - v4.1.0

This release adds QPALM, a proximal augmented Lagrangian based solver for (possibly nonconvex) quadratic programs. Check it out!

Added

  • New solver: QPALM
  • Unit test for internal linear-box inequality combination

Changed

  • Internal: refactor linear-box inequality combination function
  • Renamed main branch of the repository from master to main

Fixed

  • Fix combination of box inequalities with empty linear inequalities
  • Gurobi: Account for a slight regression in QPSUT01 performance

- Python
Published by stephane-caron over 2 years ago

qpsolvers - v4.0.1

This minor release adds the ability to install specific solvers from PyPI, e.g. pip install qpsolvers[clarabel,daqp,proxqp,scs].

Thanks to @sandeep026 for suggesting this in https://github.com/qpsolvers/qpsolvers/discussions/247 :+1:

Added

  • Allow installation of a subset of QP solvers from PyPI

- Python
Published by stephane-caron over 2 years ago

qpsolvers - v4.0.0

This release adds PIQP, a proximal interior point solver suited to both dense and sparse problems. Thanks to @shaoanlu for implementing this interface 👍

This release ships an API-breaking change in the condition number Problem.cond, which now requires an active set. Thanks to @aescande for bringing this up in https://github.com/qpsolvers/qpsolvers/issues/220 :+1:

Added

  • New solver: PIQP
  • Type for active set of equality and inequality constraints

Changed

  • Breaking: condition number of a problem now requires an active set

- Python
Published by stephane-caron over 2 years ago

qpsolvers - v3.5.0

This release adds HPIPM, an interior point solver suited to small to medium-size problems arising in model predictive control and embedded optmization. Thanks to @adamheins for implementing this interface :+1:

Added

Changed

  • 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

- Python
Published by stephane-caron almost 3 years ago

qpsolvers - v3.4.0

This release adds support for MOSEK, fixes corner-case residual computations, and has ECOS raise errors on problems its interface does not handle.

Thanks to @aszekMosek for helping with MOSEK integration and @uricohen for bringing up this point :+1:

Changed

  • 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

Fixed

  • Residual and duality gap computations when solution is not found
  • Update OSQP version to 0.6.2.post9 for testing

- Python
Published by stephane-caron about 3 years ago

qpsolvers - v3.3.1

This release updates DAQP to 0.5.1 to address an installation issue with arm64 wheels.

Thanks @darnstrom for the swift fix :+1:

Fixed

  • DAQP: Update to 0.5.1 to fix installation of arm64 wheels

- Python
Published by stephane-caron about 3 years ago

qpsolvers - v3.3.0

This release adds DAQP, a dual active-set solver suited to small/medium-scale dense problems. It also introduces the Solution.found boolean, which is now used rather than Solution.x is not None to check if a call to solve_problem was successful. Solvers can then return a non-empty Solution.x even when the optimal solution was not found (e.g. an intermediate value reached after a maximum number of iterations).

Thanks to @darnstrom for implementing the DAQP interface, and @rxian for suggesting the switch to Solution.found :+1:

Added

  • New sample problems in qpsolvers.problems
  • New solver: DAQP

Changed

  • Dual multipliers are empty arrays rather than None when no constraint
  • Store solver results even when solution is not found
  • Use Solution.found as success signal rather than Solution.x is None

Fixed

  • Unit test on actual solution to QPSUT03 problem

- Python
Published by stephane-caron about 3 years ago

qpsolvers - v3.2.0

This release adds a second LS-to-QP conversion strategy to solve_ls that's better suited to sparse problems. It is used by default when input matrices are sparse. We can also specify which conversion to use explicitly using the sparse_conversion argument, for example solve_ls(..., sparse_conversion=False).

Thanks to @bodono for pointing out this strategy in https://github.com/qpsolvers/qpsolvers/issues/192 :+1:

Added

  • Sparse strategy to convert LS problems to QP
  • Start problems submodule to collect sample test problems

Fixed

  • Clarabel: upstream handling of infinite values in inequalities
  • CVXOPT: option passing

- Python
Published by stephane-caron about 3 years ago

qpsolvers - v3.1.0

This release adds an interface for the NPPro solver, and refactors solver interfaces into supported (open source, unit tested) and unsupported categories. It also makes CVXOPT and quadprog dependencies optional as they don't distribute arm64 wheels yet.

Added

  • New solver: NPPro

Changed

  • 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

- Python
Published by stephane-caron about 3 years ago

qpsolvers - v3.0.0

Here comes the new major version of qpsolvers! To be as underwhelming as possible, this release is feature-equivalent to v2.8.1. It only ships the announced API changes:

  • All open source solvers (that include wheels in their PyPI packages) are now installed by default.
  • All exceptions raised by qpsolvers now derive from the QPError base exception.
  • The solve_safer_qp function has been removed.
  • The sym_proj parameter has been removed.
  • The extra __init__.py at the root of the repository has been removed.

These changes unload some legacy weight from the API to keep the project manageable while moving forward.

Changelog

Added

  • Exception ParamError for incorrect solver parameters
  • Exception SolverError for solver failures

Changed

  • All functions throw only qpsolvers-owned exceptions
  • CVXOPT: rethrow ValueError as either ProblemError or SolverError
  • Checking Solution.is_empty becomes not Solution.found
  • Install open source solvers with wheels by default
  • Remove solve_safer_qp
  • Remove sym_proj parameter

- Python
Published by stephane-caron about 3 years ago

qpsolvers - v2.8.1

This minor version improves the README FAQ on non-convex problems and fixes the handling of unconstrained problems with Clarabel.

Thanks to @nrontsis for contributing the FAQ update :+1:

Changed

  • Expose solve_unconstrained function from main module

Fixed

  • Clarabel: handle unconstrained problems
  • README: correct and improve FAQ on non-convex problems

- Python
Published by stephane-caron about 3 years ago

qpsolvers - v2.8.0

This release adds support for Clarabel, an open-source interior-point solver for convex optimization problems. Check it out!

It will also be the last release in the qpsolvers v2.x series, as the release of qpsolvers v3.0 (API changes, no feature change) is scheduled for tomorrow. :calendar:

Added

Changed

  • Move documentation to GitHub Pages
  • Remove Python 2 installation instructions

- Python
Published by stephane-caron over 3 years ago

qpsolvers - v2.7.4

This minor release handles non-flat input problem vectors, either flattening them or raising an exception when there is ambiguity.

Thanks to @microprediction for the feedback :thumbsup:

Fixed

  • Check vector shapes in problem constructor

- Python
Published by stephane-caron over 3 years ago

qpsolvers - v2.7.3

This release fixes edge cases for CVXOPT and qpOASES when problems have infinite linear or box bounds, as well as a segmentation fault that occurred when using qpOASES from conda-forge.

Added

  • qpOASES: return number of WSR in solution extra info

Fixed

  • 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

- Python
Published by stephane-caron over 3 years ago

qpsolvers - v2.7.2

This patch release fixes an edge case dense conversion for sparse problems with only box inequalities. It also introduces the ProblemError exception, and brings minor improvements to the qpOASES, qpSWIFT and quadprog interfaces.

Added

  • ECOS: handle two more exit flags
  • ProblemError exception
  • Property to check if a Problem has sparse matrices
  • QPError base class for exceptions
  • 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

Changed

  • Add use_sparse argument to internal linear-from-box conversion
  • Restrict condition number calculation to dense problems for now

- Python
Published by stephane-caron over 3 years ago

qpsolvers - v2.7.1

This release fixes the duality gap computation when some box bounds are disabled (lb=-np.inf or ub=+np.inf). It also brings minor improvements to the ECOS and quadprog interfaces.

Added

  • Document problem conversion functions in developer notes
  • ECOS: handle more exit flags

Changed

  • quadprog: use internal split_dual_linear_box conversion function

Fixed

  • Solution: duality gap computation under infinite box bounds

- Python
Published by stephane-caron over 3 years ago

qpsolvers - v2.7.0

This release introduces the solve_problem function, and with it the ability to get dual multipliers (yes, finally!) at the solution for all wrapped QP solvers:

```python import numpy as np from qpsolvers import Problem, solve_problem

M = np.array([[1., 2., 0.], [-8., 3., 2.], [0., 1., 1.]]) P = M.T.dot(M) # quick way to build a symmetric matrix q = np.array([3., 2., 3.]).dot(M).reshape((3,)) G = np.array([[1., 2., 1.], [2., 0., 1.], [-1., 2., -1.]]) h = np.array([3., 2., -2.]).reshape((3,)) A = np.array([1., 1., 1.]) b = np.array([1.]) lb = -0.6 * np.ones(3) ub = +0.7 * np.ones(3)

problem = Problem(P, q, G, h, A, b, lb, ub) solution = solve_problem(problem, solver="proxqp")

print(f"Primal: x = {solution.x}") print(f"Dual (Gx <= h): z = {solution.z}") print(f"Dual (Ax == b): y = {solution.y}") print(f"Dual (lb <= x <= ub): zbox = {solution.zbox}") ```

Depending on the solver, solutions may also contain extra information such as the value of the objective at the solution.

Added

  • 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

Changed

  • 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

Fixed

  • qpOASES: eliminate redundant equality constraints

- Python
Published by stephane-caron over 3 years ago

qpsolvers - v2.6.0

This version improves support for box inequalities in Gurobi, ProxQP, qpOASES and OSQP. It also improves least squares for sparse problems.

Added

  • 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

Changed

  • 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
  • Removed CVXPY which is not a solver
  • SCS: SOLVED_INACCURATE is now considered a failure

Fixed

  • 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

- Python
Published by stephane-caron over 3 years ago

qpsolvers - v2.5.0

This release wires in all solver tolerance and time-limit parameters properly. It is accompanied by a blog post on :spiral_notepad: Optimality conditions and numerical tolerances in QP solvers. Check it our for a primer on the primal residual, dual residual, duality gap, and how solvers use (ideally all three of) them to decide whether they have converged to a solution.

Here is an overview of what tolerances solvers allow us to check as of this release:

Solver | Version | Primal residual | Dual residual | Duality gap | -- | -- | -- | -- | -- CVXOPT | 1.3.0 | ✔️ | ✔️ | ✔️ ECOS | 2.0.10 | ✔️ | ✔️ | ✔️ HiGHS | 1.1.2.dev3 | ✔️ | ✔️ | ❌ OSQP | 0.6.2.post0 | ✔️ | ✔️ | ❌ ProxQP | 0.2.2 | ✔️ | ✔️ | ❌ qpSWIFT | 1.0.0 | ✔️ | ✔️ | ✔️ quadprog | 0.1.11 | ❌ | ❌ | ❌ SCS | 3.2.0 | ✔️ | ✔️ | ✔️

API change

This release includes one API change: solver tolerance settings for OSQP and SCS, which had been so far overridden (to match the average solver accuracy of all unit tests), are now back to the solvers' respective defaults. If you were relying on the previous behavior, you can pass the additional keyword arguments:

  • OSQP: eps_abs=1e-4 and eps_rel=1e-4
  • SCS: eps_abs=1e-7 and eps_rel=1e-7

From this release onward, the library will adhere to the gateway principle: qpsolvers only acts as a gateway to QP solvers. All default settings are decided by the solvers themselves. Except verbosity :wink:

All changes

Added

  • 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

Changed

  • 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 https://github.com/stephane-caron/qpsolvers/issues/102
  • Remove internal CVXOPT-specific type annotation
  • Restrict matrix types to NumPy arrays and SciPy CSC matrices
  • SCS: don't override default solver tolerances https://github.com/stephane-caron/qpsolvers/issues/102
  • Simplify intermediate internal type annotations

Fixed

  • 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 https://github.com/stephane-caron/qpsolvers/issues/104

- Python
Published by stephane-caron over 3 years ago

qpsolvers - v2.4.1

This release updates ProxQP to v0.2.2. This upstream update removes a parameter conversion overhead that was adding ~0.4 ms to computation time on dense problems.

- Python
Published by stephane-caron over 3 years ago

qpsolvers - v2.4.0

This release adds support for HiGHS, an open-source solver tailored to large-scale sparse problems. Check it out!

Added

  • New solver: HiGHS
  • Raise error when there is no available solver

Changed

  • 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

Fixed

  • Correct documentation of R argument to solve_ls. Thanks to @ansetou for pointing this out.

- Python
Published by stephane-caron over 3 years ago

qpsolvers - v2.3.0

This release adds support for ProxQP, a new solver based on revisited primal-dual proximal algorithms. Check it out!

Added

Changed

  • Clean up unused dependencies in GitHub workflow
  • Non-default solver parameters in unit tests to test their precision

Fixed

  • Configuration of tox-gh-actions for Python 3.7
  • Enforce USING_COVERAGE in GitHub workflow configuration
  • Remove redundant solver loop from test_all_shapes

- Python
Published by stephane-caron over 3 years ago

qpsolvers - v2.2.0

This release adds lb and ub box-inequality arguments to all <solver>_solve_qp functions.

:warning: API update to solver-specific functions

If your code calls a solver-specific <solver>_solve_qp function with initvals as a positional keyword argument, it should be updated to either:

  • Use keyword arguments (recommended), or
  • Add None values for lb and ub bounds, which now come before initvals.

Added

  • Internal qpsolvers.solvers.conversions submodule

Changed

  • :warning: Breaking: add lb and ub arguments to all <solver>_solve_qp functions
  • Moved concatenate_bounds to internal conversions submodule
  • Moved convert_to_socp to internal conversions submodule
  • Renamed concatenate_bounds to linear_from_box_inequalities
  • Renamed internal convert_to_socp function to socp_from_qp

- Python
Published by stephane-caron almost 4 years ago

qpsolvers - v2.1.0

This release adds support for the SCS box cone API.

Thanks to @bodono for his feedback in https://github.com/bodono/scs-python/issues/63.

Added

  • Document how to add a new QP solver to the library
  • Example with (box) lower and upper bounds
  • Test case where lb XOR ub is set

Changed

  • SCS: use the box cone API when lower/upper bounds are set

- Python
Published by stephane-caron almost 4 years ago

qpsolvers - v2.0.0

This major release makes the solver keyword argument mandatory. (Meanwhile, quadprog is not the default QP solver any more.)

See https://github.com/stephane-caron/qpsolvers/issues/62 for the discussion that lead to this decision.

Thanks to @AntoineD for bringing up and helping with this release :+1:

Added

  • Exception NoSolverSelected raised when the solver kwarg is missing
  • Starter set of QP solvers as optional dependencies
  • Test exceptions raised by solve_ls and solve_qp

Changed

  • :warning: Breaking: solver keyword argument is now mandatory for solve_ls
  • :warning: Breaking: solver keyword argument is now mandatory for solve_qp
  • Quadratic programming example now randomly selects an available solver

- Python
Published by stephane-caron almost 4 years ago

qpsolvers - v1.10.0

This minor release gives qpSWIFT the same keyword argument passing API as the other solvers (e.g. quadprog or OSQP).

Changed

  • qpSWIFT: Forward solver options as keywords arguments as with other solvers

- Python
Published by stephane-caron almost 4 years ago

qpsolvers - v1.9.1

This minor release fixes OSQP keyword argument passing. Thanks to @urob for pointing out this bug :+1:

- Python
Published by stephane-caron about 4 years ago

qpsolvers - v1.9.0

This release adds an interface to the qpSWIFT solver.

The benchmark has been updated accordingly. qpSWIFT is one of the top-performing solvers there, on both dense and sparse problems. Thanks to @abhishek-pandala for support and feedback in https://github.com/qpSWIFT/qpSWIFT/issues/3 :+1:

Added

  • qpSWIFT 0.0.2 solver interface
  • Benchmark on model predictive control problem
  • Model predictive control example

Changed

  • Compute colors automatically in benchmark example

Fixed

  • Bounds concatenation for CVXOPT sparse matrices

- Python
Published by stephane-caron about 4 years ago

qpsolvers - v1.8.1

The main change of this release is that ECOS now raises a ValueError (like other solvers) when the matrix P is not positive definite.

Thanks to @bodono for pointing out https://github.com/stephane-caron/qpsolvers/issues/51 which lead to more unit tests and fixing this inconsistency. :constructionworkerman:

Added

  • Setup instructions for Microsoft Visual Studio
  • Unit tests where the problem is unbounded below

Changed

  • Minimum supported Python version is now 3.7

Fixed

  • 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

- Python
Published by stephane-caron about 4 years ago

qpsolvers - v1.8.0

The major update of this release is the switch to SCS 3.0. Thanks to @bodono for his help in https://github.com/stephane-caron/qpsolvers/pull/50 :+1:

The small solver benchmark in the README has been updated accordingly.

Added

  • Build and test for Python 3.10 in GitHub Actions

Changed

  • 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

Fixed

  • 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

- Python
Published by stephane-caron over 4 years ago

qpsolvers - v1.7.2

This release reduces required dependencies to numpy, quadprog and scipy (with a lower required version number for the latter). This should help with installing on older systems.

Added

  • Convenience function to pretty-print a matrix and vector side by side

Changed

  • Move old tests from the examples folder to the unit test suite
  • Removed deprecated requirements.txt installation file
  • Renamed solvers optional dependencies to all_pypi_solvers

- Python
Published by stephane-caron over 4 years ago

qpsolvers - v1.7.1

This release fixes https://github.com/stephane-caron/qpsolvers/issues/46. Thanks to @adamoppenheimer for reporting it.

- Python
Published by stephane-caron over 4 years ago

qpsolvers - v1.7

The main changes in this release are the addition of the SCS 2.0 SOCP solver and the handling of vector bounds for sparse matrices brought by @MeindertHH in https://github.com/stephane-caron/qpsolvers/issues/44 :+1:

Other changes aim to make the code more reliable. We now have over 100 unit tests covering over 94% of the code (up from 14 tests covering 77% of the code in v1.6.1), as well as type annotations that add a layer of verification while making the code easier to maintain.

Added

  • 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%

Changed

  • 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 of solve_safer_qp to sr for "slack repulsion"
  • Reorganize code with a qpsolvers/solvers submodule
  • quadprog: warning when initvals is not None is now verbose

Fixed

  • OSQP: forward keyword arguments to solver properly
  • quadprog: forward keyword arguments to solver properly

- Python
Published by stephane-caron over 4 years ago

qpsolvers - v1.6

The major update of this release is the significant performance improvement to the Gurobi interface brought by @DKenefake in https://github.com/stephane-caron/qpsolvers/pull/38 :+1:

This release also fixes major solver interface inconsistencies on CVXPY, ECOS, OSQP and quadprog when given unfeasible problems. Now all solvers diligently return None over unfeasible problems, as per the documentation of solve_qp. Thanks a lot to @DKenefake for pointing this out on quadprog, which triggered the whole hunt for inconsistencies via unit testing.

On the packaging side, the project leveled up (linting, static type checking, test coverage, GitHub Actions) thanks to the articles How to make an awesome Python package in 2021 and Python in GitHub Actions. Thanks @nalgeon and @hynek for sharing your experience in such a clear and actionable format! :grinning:

Added

  • Add __version__ to main module
  • First batch of 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

Changed

  • Code formatting now applies Black
  • ECOS: refactor SOCP conversion to improve function readability
  • Gurobi performance significantly improved by new matrix API (thanks to @DKenefake)

Fixed

  • 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 in solve_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)

- Python
Published by stephane-caron about 5 years ago

qpsolvers - v1.5

The major update of this release is the switch to Python 3 and a corresponding upgrade to newer versions of the related solvers in requirements.txt. Users who need Python 2 are now encouraged to install the package via: ```bash

Python 2

sudo apt install python-dev pip2 install -r requirements2.txt ``` Thanks to @gmazzamuto and @samuelstjean for proposing patches to CVXPY warnings!

Added

  • New solve_ls function to solve linear Least Squares problems
  • Upgrade to Python 3 and deprecate Python 2
  • Saved Python 2 package versions to requirements2.txt

Fixed

  • Deprecation warning in CVXPY
  • Call to print in PyPI description
  • Handling of quadprog ValueError exceptions

- Python
Published by stephane-caron over 5 years ago

qpsolvers -

Thanks to @Neotriple for contributing to the OSQP update in this release.

Added

  • Solver settings can now by passed to solve_qp as keyword arguments
  • Started an API documentation

Changed

  • Made verbose an explicit keyword argument of all internal functions
  • OSQP settings now match precision of other solvers

- Python
Published by stephane-caron almost 6 years ago

qpsolvers -

Thanks to @abhishek-pandala, @dmeoli, @juanjqo, @nikolaif399 and @samuelstjean for reporting and discussing issues that contributed to this release!

Added

  • ECOS solver interface (no need to go through CVXPY any more)
  • Keyword argument verbose=True available for all solvers except quadprog
  • Update ECOS performance in benchmark (much better than before!)

Fixed

  • Avoid variable name clash in OSQP
  • Fix link to ECOS in setup.py
  • Handle quadprog exception to avoid confusion on cost matrix notation
  • Handle both old and more recent versions of OSQP
  • Ignore verbosity argument when solver is not available
  • Remove ned for IPython in solver test
  • Update notes on P matrix

- Python
Published by stephane-caron about 6 years ago

qpsolvers -

Changed

  • Always reshape A or G vectors into one-line matrices

Fixed

  • 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

- Python
Published by stephane-caron over 6 years ago

qpsolvers -

Thanks to @bdelhaisse and @soerenwolfers who contributed fixes to this release!

Fixed

  • 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

- Python
Published by stephane-caron over 6 years ago