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.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
SparseConversionWarningto filter the corresponding warning - warnings: Base class
QPWarningfor all qpsolvers-related warnings - warnings: Recall solver name when issuing conversion warnings
Changed
- Add solver name argument to internal
ensure_sparse_matricesfunction - 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_gapparameter - 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.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
Nonerather than empty list - PIQP: Warning message about CSC matrix conversions (thanks to @itsahmedkhalil)
- Update all instances of
np.inftytonp.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_onlyfor 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.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_lsdocumentation (thanks to @ogencoglu) - Documentation: Correct output of LS example (thanks to @ogencoglu)
- 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
mastertomain
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
- New solver: HPIPM
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.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.foundas success signal rather thanSolution.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
problemssubmodule 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
QPErrorbase exception. - The
solve_safer_qpfunction has been removed. - The
sym_projparameter has been removed. - The extra
__init__.pyat 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
ParamErrorfor incorrect solver parameters - Exception
SolverErrorfor solver failures
Changed
- All functions throw only qpsolvers-owned exceptions
- CVXOPT: rethrow
ValueErroras eitherProblemErrororSolverError - Checking
Solution.is_emptybecomesnot Solution.found - Install open source solvers with wheels by default
- Remove
solve_safer_qp - Remove
sym_projparameter
- 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_unconstrainedfunction 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
- New solver: Clarabel
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_sparseargument 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_boxconversion 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_qpto 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_qpand 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_INACCURATEis now considered a failure
Fixed
- Dot product bug in
solve_lswith 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-4andeps_rel=1e-4 - SCS:
eps_abs=1e-7andeps_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.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_solversoptional deps toopen_source_solvers
Fixed
- Correct documentation of
Rargument tosolve_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
- New solver: ProxQP
Changed
- Clean up unused dependencies in GitHub workflow
- Non-default solver parameters in unit tests to test their precision
Fixed
- Configuration of
tox-gh-actionsfor Python 3.7 - Enforce
USING_COVERAGEin 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
Nonevalues forlbandubbounds, which now come beforeinitvals.
Added
- Internal
qpsolvers.solvers.conversionssubmodule
Changed
- :warning: Breaking: add
lbandubarguments to all<solver>_solve_qpfunctions - Moved
concatenate_boundsto internalconversionssubmodule - Moved
convert_to_socpto internalconversionssubmodule - Renamed
concatenate_boundstolinear_from_box_inequalities - Renamed internal
convert_to_socpfunction tosocp_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
lbXORubis 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
NoSolverSelectedraised when the solver kwarg is missing - Starter set of QP solvers as optional dependencies
- Test exceptions raised by
solve_lsandsolve_qp
Changed
- :warning: Breaking:
solverkeyword argument is now mandatory forsolve_ls - :warning: Breaking:
solverkeyword argument is now mandatory forsolve_qp - Quadratic programming example now randomly selects an available solver
- Python
Published by stephane-caron almost 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.txtand 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.txtinstallation file - Renamed
solversoptional dependencies toall_pypi_solvers
- 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
swparameter ofsolve_safer_qptosrfor "slack repulsion" - Reorganize code with a qpsolvers/solvers submodule
- quadprog: warning when
initvals is not Noneis 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
Noneon unfeasible problems - Consistently warn when
initvalsis passed but ignored by solver interface - ECOS: properly return
Noneon unfeasible problems - Fix
Nonecase insolve_safer_qp(found by static type checking) - Fix warnings in repository-level
__init__.py - OSQP: properly return
Noneon unfeasible problems - Pass Flake8 validation for overall code style
- Reduce complexity of entry
solve_qpvia a module-level solve-function index - Remove Python 2 compatibility line from examples
- quadprog: properly return
Noneon 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_lsfunction 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
printin 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_qpas keyword arguments - Started an API documentation
Changed
- Made
verbosean 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=Trueavailable 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