{ "info": { "author": null, "author_email": "St\u00e9phane Caron ", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "Intended Audience :: Science/Research", "License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)", "Operating System :: OS Independent", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Topic :: Scientific/Engineering :: Mathematics" ], "description": "# QP Solvers for Python\n\n[**Installation**](https://github.com/stephane-caron/qpsolvers#installation)\n| [**Documentation**](https://scaron.info/doc/qpsolvers/)\n| [**Example**](https://github.com/stephane-caron/qpsolvers#example)\n| [**Solvers**](https://github.com/stephane-caron/qpsolvers#solvers)\n| [**FAQ**](https://github.com/stephane-caron/qpsolvers#frequently-asked-questions)\n| [**Benchmark**](https://github.com/stephane-caron/qpsolvers#benchmark)\n\n[![Build](https://img.shields.io/github/workflow/status/stephane-caron/qpsolvers/CI)](https://github.com/stephane-caron/qpsolvers/actions)\n[![Coverage](https://coveralls.io/repos/github/stephane-caron/qpsolvers/badge.svg?branch=master)](https://coveralls.io/github/stephane-caron/qpsolvers?branch=master)\n[![PyPI version](https://img.shields.io/pypi/v/qpsolvers)](https://pypi.org/project/qpsolvers/)\n![Status](https://img.shields.io/pypi/status/qpsolvers)\n\nUnified interface to Quadratic Programming (QP) solvers available in Python.\n\n## Installation\n\n```sh\npip install qpsolvers\n```\nCheck out the documentation for [Python 2](https://scaron.info/doc/qpsolvers/installation.html#python-2) or [Windows](https://scaron.info/doc/qpsolvers/installation.html#windows) instructions.\n\n## Usage\n\nThe library provides a one-stop shop ``solve_qp(P, q, G, h, A, b, lb, ub)`` function with a ``solver`` keyword argument to select the backend solver. It solves convex quadratic programs in standard form:\n\n> ![Quadratic program in standard form](https://raw.githubusercontent.com/stephane-caron/qpsolvers/master/doc/src/images/qp.gif)\n\nVector inequalities are taken coordinate by coordinate. For most solvers, the matrix *P* should be [positive definite](https://en.wikipedia.org/wiki/Definite_symmetric_matrix).\n\n## Example\n\nTo solve a quadratic program, build the matrices that define it and call the ``solve_qp`` function:\n\n```python\nfrom numpy import array, dot\nfrom qpsolvers import solve_qp\n\nM = array([[1., 2., 0.], [-8., 3., 2.], [0., 1., 1.]])\nP = dot(M.T, M) # this is a positive definite matrix\nq = dot(array([3., 2., 3.]), M)\nG = array([[1., 2., 1.], [2., 0., 1.], [-1., 2., -1.]])\nh = array([3., 2., -2.])\nA = array([1., 1., 1.])\nb = array([1.])\n\nx = solve_qp(P, q, G, h, A, b)\nprint(\"QP solution: x = {}\".format(x))\n```\n\nThis example outputs the solution ``[0.30769231, -0.69230769, 1.38461538]``.\n\n## Solvers\n\nThe list of supported solvers currently includes:\n\n| Solver | Keyword | Type | License | Warm-start |\n| ------ | ------- | ---- | ------- |------------|\n| [CVXOPT](http://cvxopt.org/) | ``cvxopt`` | Dense | GPL-3.0 | \u2714\ufe0f |\n| [ECOS](https://web.stanford.edu/~boyd/papers/ecos.html) | ``ecos`` | Sparse | GPL-3.0 | \u2716\ufe0f |\n| [Gurobi](https://www.gurobi.com/) | ``gurobi`` | Sparse | Commercial | \u2716\ufe0f |\n| [MOSEK](https://mosek.com/) | ``mosek`` | Sparse | Commercial | \u2714\ufe0f |\n| [OSQP](https://github.com/oxfordcontrol/osqp) | ``osqp`` | Sparse | Apache-2.0 | \u2714\ufe0f |\n| [qpOASES](https://github.com/coin-or/qpOASES) | ``qpoases`` | Dense | LGPL-2.1 | \u2796 |\n| [qpSWIFT](https://github.com/qpSWIFT/qpSWIFT) | ``qpswift`` | Sparse | GPL-3.0 | \u2716\ufe0f |\n| [quadprog](https://pypi.python.org/pypi/quadprog/) | ``quadprog`` | Dense | GPL-2.0 | \u2716\ufe0f |\n| [SCS](https://github.com/cvxgrp/scs) | ``scs`` | Sparse | MIT | \u2714\ufe0f |\n\n## Frequently Asked Questions\n\n- *Can I print the list of solvers available on my machine?*\n - Absolutely: ``print(qpsolvers.available_solvers)``\n- *Is it possible to solve a least squares rather than a quadratic program?*\n - Yes, `qpsolvers` also provides a [solve\\_ls](https://scaron.info/doc/qpsolvers/least-squares.html#qpsolvers.solve_ls) function.\n- *I have a squared norm in my cost function, how can I apply a QP solver to my problem?*\n - You can [cast squared norms to QP matrices](https://scaron.info/teaching/conversion-from-least-squares-to-quadratic-programming.html) and feed the result to `solve_qp`.\n- *I have a non-convex quadratic program. Is there a solver I can use?*\n - Unfortunately most available QP solvers are designed for convex problems.\n - If your cost matrix *P* is semi-definite rather than definite, try OSQP.\n - If your problem has concave components, go for a nonlinear solver such as [IPOPT](https://pypi.org/project/ipopt/) *e.g.* using [CasADi](https://web.casadi.org/).\n- *I get the following [build error on Windows](https://github.com/stephane-caron/qpsolvers/issues/28) when running `pip install qpsolvers`.*\n - You will need to install the [Visual C++ Build Tools](https://visualstudio.microsoft.com/visual-cpp-build-tools/) to build all package dependencies.\n\n## Benchmark\n\nOn a [dense problem](examples/benchmark_dense_problem.py), the performance of all solvers (as measured by IPython's ``%timeit`` on an Intel(R) Core(TM) i7-6700K CPU @ 4.00GHz) is:\n\n| Solver | Type | Time (ms) |\n| -------- | ------ | --------- |\n| qpswift | Dense | 0.008 |\n| quadprog | Dense | 0.01 |\n| qpoases | Dense | 0.02 |\n| osqp | Sparse | 0.03 |\n| scs | Sparse | 0.03 |\n| ecos | Sparse | 0.27 |\n| cvxopt | Dense | 0.44 |\n| gurobi | Sparse | 1.74 |\n| cvxpy | Sparse | 5.71 |\n| mosek | Sparse | 7.17 |\n\nOn a [sparse problem](examples/benchmark_sparse_problem.py) with *n = 500* optimization variables, these performances become:\n\n| Solver | Type | Time (ms) |\n| -------- | ------ | --------- |\n| osqp | Sparse | 1 |\n| qpswift | Dense | 2 |\n| scs | Sparse | 4 |\n| cvxpy | Sparse | 11 |\n| mosek | Sparse | 17 |\n| ecos | Sparse | 33 |\n| cvxopt | Dense | 51 |\n| gurobi | Sparse | 221 |\n| quadprog | Dense | 427 |\n| qpoases | Dense | 1560 |\n\nOn a [model predictive control](examples/model_predictive_control.py) problem for robot locomotion, we get:\n\n| Solver | Type | Time (ms) |\n| -------- | ------ | --------- |\n| quadprog | Dense | 0.03 |\n| qpswift | Dense | 0.08 |\n| qpoases | Dense | 0.36 |\n| osqp | Sparse | 0.48 |\n| ecos | Sparse | 0.69 |\n| scs | Sparse | 0.76 |\n| cvxopt | Dense | 2.75 |\n| cvxpy | Sparse | 7.02 |\n\nFinally, here is a small benchmark of [random dense problems](examples/benchmark_random_problems.py) (each data point corresponds to an average over 10 runs):\n\n\n\nNote that performances of QP solvers largely depend on the problem solved. For instance, MOSEK performs an [automatic conversion to Second-Order Cone Programming (SOCP)](https://docs.mosek.com/8.1/pythonapi/prob-def-quadratic.html) which the documentation advises bypassing for better performance. Similarly, ECOS reformulates [from QP to SOCP](qpsolvers/solvers/convert_to_socp.py) and [works best on small problems](https://web.stanford.edu/%7Eboyd/papers/ecos.html).\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": null, "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": null, "keywords": null, "license": null, "maintainer": null, "maintainer_email": "St\u00e9phane Caron ", "name": "qpsolvers", "package_url": "https://pypi.org/project/qpsolvers/", "platform": null, "project_url": "https://pypi.org/project/qpsolvers/", "project_urls": { "Changelog": "https://github.com/stephane-caron/qpsolvers/blob/master/CHANGELOG.md", "Documentation": "https://scaron.info/doc/qpsolvers/", "Source": "https://github.com/stephane-caron/qpsolvers", "Tracker": "https://github.com/stephane-caron/qpsolvers/issues" }, "release_url": "https://pypi.org/project/qpsolvers/1.9.1/", "requires_dist": [ "quadprog >=0.1.8", "scipy >=1.2.0", "cvxopt >=1.2.6 ; extra == \"all_pypi_solvers\"", "cvxpy >=1.1.11 ; extra == \"all_pypi_solvers\"", "ecos >=2.0.7.post1 ; extra == \"all_pypi_solvers\"", "osqp >=0.6.2 ; extra == \"all_pypi_solvers\"", "scs >=3.0.1 ; extra == \"all_pypi_solvers\"", "sphinx ; extra == \"doc\"" ], "requires_python": ">=3.7", "summary": "Quadratic programming solvers in Python with a unified API", "version": "1.9.1", "yanked": false, "yanked_reason": null }, "last_serial": 13684894, "releases": { "1.0.1": [ { "comment_text": "", "digests": { "md5": "a2c8c5929245f2df710efc814efe8a87", "sha256": "ee21dbd325eb1b1d27baeb6e894f2caa77d3d9ae7616190fc001b6c3cc8e2328" }, "downloads": -1, "filename": "qpsolvers-1.0.1.tar.gz", "has_sig": false, "md5_digest": "a2c8c5929245f2df710efc814efe8a87", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6642, "upload_time": "2018-05-11T18:15:40", "upload_time_iso_8601": "2018-05-11T18:15:40.608285Z", "url": "https://files.pythonhosted.org/packages/04/bd/98c9d849916487689140ab2547837a2534460e2d6817750370917d17643b/qpsolvers-1.0.1.tar.gz", "yanked": false, "yanked_reason": null } ], "1.0.2": [ { "comment_text": "", "digests": { "md5": "eb495dd11078d3970bf46e9fe7bc21dc", "sha256": "aa493623491944be10a8ac50ba2f658dfb196bbbd5940346a36d454f283081c2" }, "downloads": -1, "filename": "qpsolvers-1.0.2.tar.gz", "has_sig": false, "md5_digest": "eb495dd11078d3970bf46e9fe7bc21dc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7098, "upload_time": "2018-05-11T18:37:06", "upload_time_iso_8601": "2018-05-11T18:37:06.264335Z", "url": "https://files.pythonhosted.org/packages/7f/11/546137a839d263e08a9ee2295aef836cd253cb2a01cd16e4a7d5d11d0d98/qpsolvers-1.0.2.tar.gz", "yanked": false, "yanked_reason": null } ], "1.0.3": [ { "comment_text": "", "digests": { "md5": "8d7e9f1adf4c9b8eca6ce041f2286ba6", "sha256": "b0b17adc66ac54fc7103f4cb1284657eff2df7bc2c58dae856fd520beca363d6" }, "downloads": -1, "filename": "qpsolvers-1.0.3.tar.gz", "has_sig": false, "md5_digest": "8d7e9f1adf4c9b8eca6ce041f2286ba6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7100, "upload_time": "2018-07-05T08:48:36", "upload_time_iso_8601": "2018-07-05T08:48:36.726449Z", "url": "https://files.pythonhosted.org/packages/d9/ed/9088ecc74f40fcb59a14429b07c39b3e2689edddf7401522dc009c632b89/qpsolvers-1.0.3.tar.gz", "yanked": false, "yanked_reason": null } ], "1.0.4": [ { "comment_text": "", "digests": { "md5": "cb7006d92eb73dabaaac32bf44d718af", "sha256": "453449692cc4ae50972137017061904b2fddcc4e162df75b88cdfd681849c64c" }, "downloads": -1, "filename": "qpsolvers-1.0.4.tar.gz", "has_sig": false, "md5_digest": "cb7006d92eb73dabaaac32bf44d718af", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8388, "upload_time": "2018-07-05T09:55:40", "upload_time_iso_8601": "2018-07-05T09:55:40.323668Z", "url": "https://files.pythonhosted.org/packages/08/f0/d72359c3b124fa92f9cfee538a0f5ea62b3e46d94e11c4c12bbd0c925e1d/qpsolvers-1.0.4.tar.gz", "yanked": false, "yanked_reason": null } ], "1.0.5": [ { "comment_text": "", "digests": { "md5": "3360f1bd7edeca3664e21a2d48a28050", "sha256": "e1aa03d3a971989be43f145a8e9804daed9b76824f2d7ccbe0e74314a63656ed" }, "downloads": -1, "filename": "qpsolvers-1.0.5.tar.gz", "has_sig": false, "md5_digest": "3360f1bd7edeca3664e21a2d48a28050", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8755, "upload_time": "2019-04-10T09:17:11", "upload_time_iso_8601": "2019-04-10T09:17:11.336017Z", "url": "https://files.pythonhosted.org/packages/1b/16/2f4d3463631cdba7192d812dae1b2595ce6ed0854685efcdc23ef761876d/qpsolvers-1.0.5.tar.gz", "yanked": false, "yanked_reason": null } ], "1.0.6": [ { "comment_text": "", "digests": { "md5": "0a2b6c78e9dcec902756d8c756bdff11", "sha256": "aa57ade7a181251eab354dd09ba56cd0713cab43587c0358b20e3c077fe0b84f" }, "downloads": -1, "filename": "qpsolvers-1.0.6-py2.7.egg", "has_sig": false, "md5_digest": "0a2b6c78e9dcec902756d8c756bdff11", "packagetype": "bdist_egg", "python_version": "2.7", "requires_python": null, "size": 26844, "upload_time": "2019-10-26T02:53:34", "upload_time_iso_8601": "2019-10-26T02:53:34.439054Z", "url": "https://files.pythonhosted.org/packages/91/ec/283d2409216a05f557586a21a4c8262e3ef2de1f8cfe562d104de22a335d/qpsolvers-1.0.6-py2.7.egg", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "80e7860fd9c0a410fb0028933536a8e1", "sha256": "9777feaacac70251d6a631238582fcf94157b48a47e40a334f9a42dad833b100" }, "downloads": -1, "filename": "qpsolvers-1.0.6.tar.gz", "has_sig": false, "md5_digest": "80e7860fd9c0a410fb0028933536a8e1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8756, "upload_time": "2019-10-26T02:53:36", "upload_time_iso_8601": "2019-10-26T02:53:36.443937Z", "url": "https://files.pythonhosted.org/packages/3e/e4/411f8451b9828f674bf2d162f441862fb8702a64ad4aa4fa047702df6e44/qpsolvers-1.0.6.tar.gz", "yanked": false, "yanked_reason": null } ], "1.0.7": [ { "comment_text": "", "digests": { "md5": "8bc3af1dccdf899f456992b408e42205", "sha256": "2549daab90f21ebe02bacd28c62223dbdbc8dd2af0c2aa148e191e81b6106035" }, "downloads": -1, "filename": "qpsolvers-1.0.7.tar.gz", "has_sig": false, "md5_digest": "8bc3af1dccdf899f456992b408e42205", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8869, "upload_time": "2019-10-26T08:19:46", "upload_time_iso_8601": "2019-10-26T08:19:46.945923Z", "url": "https://files.pythonhosted.org/packages/bd/d8/a5ea1d7dade38657a9e9afd9779ce5814bd483d8c246032261daff73c949/qpsolvers-1.0.7.tar.gz", "yanked": false, "yanked_reason": null } ], "1.1": [ { "comment_text": "", "digests": { "md5": "31ec05e43e29094126a52dfbb6c41791", "sha256": "44c3edf73f5c973e0fe24da06345e37340bbf89044a8f30a07b6a36e13ebd096" }, "downloads": -1, "filename": "qpsolvers-1.1.tar.gz", "has_sig": false, "md5_digest": "31ec05e43e29094126a52dfbb6c41791", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8935, "upload_time": "2020-03-07T13:19:24", "upload_time_iso_8601": "2020-03-07T13:19:24.494069Z", "url": "https://files.pythonhosted.org/packages/ba/10/b9a34d08edd4f492498dcb46c016cc02866a73132efb197c9d2865e21672/qpsolvers-1.1.tar.gz", "yanked": false, "yanked_reason": null } ], "1.1.1": [ { "comment_text": "", "digests": { "md5": "29f1027a8049959057a33ebaf82718bb", "sha256": "67b95f2de4b2dcef1976df3ba3e20baaf59cae799d3778705a6375b5c9b6c221" }, "downloads": -1, "filename": "qpsolvers-1.1.1.tar.gz", "has_sig": false, "md5_digest": "29f1027a8049959057a33ebaf82718bb", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9080, "upload_time": "2020-05-15T15:56:46", "upload_time_iso_8601": "2020-05-15T15:56:46.742724Z", "url": "https://files.pythonhosted.org/packages/7a/40/ddc5532e1473f625321ff713656860a76992ad59a86e27b3fa82c651a00e/qpsolvers-1.1.1.tar.gz", "yanked": false, "yanked_reason": null } ], "1.1.2": [ { "comment_text": "", "digests": { "md5": "ac5b524266b9a567da8bb2e8a1121819", "sha256": "be83e7d03cfa5ab3ee36ff3db0852fc84e95b9ce6198fdbc0e9d9e805d474bd9" }, "downloads": -1, "filename": "qpsolvers-1.1.2.tar.gz", "has_sig": false, "md5_digest": "ac5b524266b9a567da8bb2e8a1121819", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9182, "upload_time": "2020-05-15T16:14:23", "upload_time_iso_8601": "2020-05-15T16:14:23.192486Z", "url": "https://files.pythonhosted.org/packages/cb/26/dd401f8bd99f676694e16d0c1d1d71c52df2dadb4367c40222bf80166545/qpsolvers-1.1.2.tar.gz", "yanked": false, "yanked_reason": null } ], "1.2": [ { "comment_text": "", "digests": { "md5": "0bd74389fca190500c60b246974935b0", "sha256": "b78b1c7027ae3c099f4151b540c0968294bd775e082d87205d55c3c6fc245467" }, "downloads": -1, "filename": "qpsolvers-1.2.tar.gz", "has_sig": false, "md5_digest": "0bd74389fca190500c60b246974935b0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9405, "upload_time": "2020-05-16T11:02:40", "upload_time_iso_8601": "2020-05-16T11:02:40.342521Z", "url": "https://files.pythonhosted.org/packages/06/81/7817ca4874828e27fc2d88b383ba4d1f3d12c677c78e189f1b0670f9f5e4/qpsolvers-1.2.tar.gz", "yanked": false, "yanked_reason": null } ], "1.2.1": [ { "comment_text": "", "digests": { "md5": "a30fe8aeb93d39194a43ee470653ff05", "sha256": "ffb8d886a06503dc0c42487c074c35cfd34020087192f3faf2d0096a29b0a506" }, "downloads": -1, "filename": "qpsolvers-1.2.1.tar.gz", "has_sig": false, "md5_digest": "a30fe8aeb93d39194a43ee470653ff05", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9505, "upload_time": "2020-05-16T11:26:59", "upload_time_iso_8601": "2020-05-16T11:26:59.235826Z", "url": "https://files.pythonhosted.org/packages/c4/8a/1eeb7c4d908263152f867a55dcf2a0397d1e57cb115cb2bc6204ca15af3a/qpsolvers-1.2.1.tar.gz", "yanked": false, "yanked_reason": null } ], "1.3": [ { "comment_text": "", "digests": { "md5": "44ac75c8686dcd3c48a740b2922bd12d", "sha256": "895a9c02ee50a2bd36cf0b09cd23ff5e9e89e25316eaab91a367fd04b53c256e" }, "downloads": -1, "filename": "qpsolvers-1.3.tar.gz", "has_sig": false, "md5_digest": "44ac75c8686dcd3c48a740b2922bd12d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10129, "upload_time": "2020-05-16T17:38:18", "upload_time_iso_8601": "2020-05-16T17:38:18.123023Z", "url": "https://files.pythonhosted.org/packages/54/73/f4860dedb7b500ec6ba2356f3f7d8df681134a41d908ce59b3845c445970/qpsolvers-1.3.tar.gz", "yanked": false, "yanked_reason": null } ], "1.3.1": [ { "comment_text": "", "digests": { "md5": "46fde05f2330f5e6fd460bd56366ca36", "sha256": "11a0cb8af84e6cc5e4bca41d6a15297636b9426f222a0a0a336090369c1d40e4" }, "downloads": -1, "filename": "qpsolvers-1.3.1.tar.gz", "has_sig": false, "md5_digest": "46fde05f2330f5e6fd460bd56366ca36", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9819, "upload_time": "2020-06-13T11:26:20", "upload_time_iso_8601": "2020-06-13T11:26:20.493901Z", "url": "https://files.pythonhosted.org/packages/9c/1d/094bd9defdf99e69e45108a11d5e575a305b26f3286a9305c141abbf7bb9/qpsolvers-1.3.1.tar.gz", "yanked": false, "yanked_reason": null } ], "1.4": [ { "comment_text": "", "digests": { "md5": "3b3de5afc73e8622f78cf1a1ad137224", "sha256": "67d019f92c125f4e6377c6d5a06c53d48260f7005cf7ebb1dfc2c54a5ecba984" }, "downloads": -1, "filename": "qpsolvers-1.4.tar.gz", "has_sig": false, "md5_digest": "3b3de5afc73e8622f78cf1a1ad137224", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10245, "upload_time": "2020-07-04T15:56:06", "upload_time_iso_8601": "2020-07-04T15:56:06.606486Z", "url": "https://files.pythonhosted.org/packages/08/bd/5ea67fe9071013b635ca15afbc1860573fa963328e07336315add4ecbd48/qpsolvers-1.4.tar.gz", "yanked": false, "yanked_reason": null } ], "1.4.1": [ { "comment_text": "", "digests": { "md5": "a93e75923a09c14b375f83932b6b8a76", "sha256": "36e713b0a86447770715211e65eba334bfac39666a23b345ed09bb7854f8fa7e" }, "downloads": -1, "filename": "qpsolvers-1.4.1.tar.gz", "has_sig": false, "md5_digest": "a93e75923a09c14b375f83932b6b8a76", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10614, "upload_time": "2020-11-29T14:01:07", "upload_time_iso_8601": "2020-11-29T14:01:07.470148Z", "url": "https://files.pythonhosted.org/packages/0d/01/12195be7a99a1a574de9b3d9ba0ef3e1b7fe77fb4285978bd7f917edf459/qpsolvers-1.4.1.tar.gz", "yanked": false, "yanked_reason": null } ], "1.5": [ { "comment_text": "", "digests": { "md5": "965e1be75a12c31a4a2b59fbe3322af5", "sha256": "b975839554da17ea94b9b0ac1606c997ff4e49cb2d31d58eca2775363ffae660" }, "downloads": -1, "filename": "qpsolvers-1.5.tar.gz", "has_sig": false, "md5_digest": "965e1be75a12c31a4a2b59fbe3322af5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10627, "upload_time": "2020-12-05T13:42:33", "upload_time_iso_8601": "2020-12-05T13:42:33.527425Z", "url": "https://files.pythonhosted.org/packages/50/f4/fe24323e1e1084f64c41bdd2cb71d3dded6ad592f235c00a28b36d142663/qpsolvers-1.5.tar.gz", "yanked": false, "yanked_reason": null } ], "1.6": [ { "comment_text": "", "digests": { "md5": "2ba429c96f5d0ea5f6083d56f3d58d4e", "sha256": "c51a906219fccaa844d9c5adb46a969562b1f160bfc976d08268cc6eb9aeb55a" }, "downloads": -1, "filename": "qpsolvers-1.6-py3-none-any.whl", "has_sig": false, "md5_digest": "2ba429c96f5d0ea5f6083d56f3d58d4e", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 23591, "upload_time": "2021-04-09T12:21:24", "upload_time_iso_8601": "2021-04-09T12:21:24.842793Z", "url": "https://files.pythonhosted.org/packages/bf/c2/3f027cd64f62e905f45540ba864c117a12d4b1f2ff380aa137a339922273/qpsolvers-1.6-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "7c175ca9483b3523600c0c959100853e", "sha256": "19170d6e9398c9956bc18e5f42b8a9f912b16200e7d434698433b0c8a98dde6c" }, "downloads": -1, "filename": "qpsolvers-1.6.tar.gz", "has_sig": false, "md5_digest": "7c175ca9483b3523600c0c959100853e", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 29119, "upload_time": "2021-04-09T12:21:26", "upload_time_iso_8601": "2021-04-09T12:21:26.678730Z", "url": "https://files.pythonhosted.org/packages/f0/fa/5b299a10af139b5e02ef88e0c983720dee52720dc6b79f486d2a8d43a498/qpsolvers-1.6.tar.gz", "yanked": false, "yanked_reason": null } ], "1.6.1": [ { "comment_text": "", "digests": { "md5": "e7027cb0320cf0762afd179f2ce258b4", "sha256": "beb61992a9d79e7fcd91e8c2126de06a572d63dda4c7a12c0a9faadff627bfa6" }, "downloads": -1, "filename": "qpsolvers-1.6.1-py3-none-any.whl", "has_sig": false, "md5_digest": "e7027cb0320cf0762afd179f2ce258b4", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 23674, "upload_time": "2021-04-09T13:36:59", "upload_time_iso_8601": "2021-04-09T13:36:59.947124Z", "url": "https://files.pythonhosted.org/packages/d2/84/4775a9d3497fed47d77a1996baee409c8f67b670a00b75ac375036875168/qpsolvers-1.6.1-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "10a575f4466300001baf38b05ca4745e", "sha256": "238227f1170e067dd0330526e9a38376dc25a7f6f57c6b7c05029d48fcaab756" }, "downloads": -1, "filename": "qpsolvers-1.6.1.tar.gz", "has_sig": false, "md5_digest": "10a575f4466300001baf38b05ca4745e", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 29235, "upload_time": "2021-04-09T13:37:02", "upload_time_iso_8601": "2021-04-09T13:37:02.031354Z", "url": "https://files.pythonhosted.org/packages/37/89/72a32e75d8e2a04d8093ed1d00b612ce4b5a9911f6c08ef4cfecc479a4cd/qpsolvers-1.6.1.tar.gz", "yanked": false, "yanked_reason": null } ], "1.7.0": [ { "comment_text": "", "digests": { "md5": "5a29975954d9def30c3c99ccf2027ab9", "sha256": "f5f0685aa5dbf0b23ef99ddeb28bc5b33cf82fcf2b12d64ace44d281ae7b12b0" }, "downloads": -1, "filename": "qpsolvers-1.7.0-py3-none-any.whl", "has_sig": false, "md5_digest": "5a29975954d9def30c3c99ccf2027ab9", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 35529, "upload_time": "2021-09-19T11:54:05", "upload_time_iso_8601": "2021-09-19T11:54:05.442389Z", "url": "https://files.pythonhosted.org/packages/e3/f0/a32449d2590a7f2577fc377d900f1b6e4823df6adf4990d3eae7c937f864/qpsolvers-1.7.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "ad1005f9ca6276dcf67a3a3f00d0a2a4", "sha256": "86a10a3984df6d8abc263da8870b3af14a7149e31ec7565ce569a52175b9cf2f" }, "downloads": -1, "filename": "qpsolvers-1.7.0.tar.gz", "has_sig": false, "md5_digest": "ad1005f9ca6276dcf67a3a3f00d0a2a4", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 35576, "upload_time": "2021-09-19T11:54:07", "upload_time_iso_8601": "2021-09-19T11:54:07.781978Z", "url": "https://files.pythonhosted.org/packages/e7/1c/bfba9a2737f7a8b3acd09fac68dde9c0d9039ac926b0a3ea849d6a950781/qpsolvers-1.7.0.tar.gz", "yanked": false, "yanked_reason": null } ], "1.7.1": [ { "comment_text": "", "digests": { "md5": "c3749b919c851b683e239699802532f5", "sha256": "9dd3315af33e384845334e6353db23136a81d0a387956760b51a363f4794946c" }, "downloads": -1, "filename": "qpsolvers-1.7.1-py3-none-any.whl", "has_sig": false, "md5_digest": "c3749b919c851b683e239699802532f5", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 35374, "upload_time": "2021-10-02T09:59:18", "upload_time_iso_8601": "2021-10-02T09:59:18.309046Z", "url": "https://files.pythonhosted.org/packages/c9/66/ca33bcb359302344696c2db8555ec101a47a269d480d932ad25dba8c5f3a/qpsolvers-1.7.1-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "2ac5f20930a0df211d8a0cbacf020bf8", "sha256": "0f9fd0a8fc4101b1da15454e4ce8667745333b398b86e31b6eb14f4cfc3e0bd0" }, "downloads": -1, "filename": "qpsolvers-1.7.1.tar.gz", "has_sig": false, "md5_digest": "2ac5f20930a0df211d8a0cbacf020bf8", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 36124, "upload_time": "2021-10-02T09:59:20", "upload_time_iso_8601": "2021-10-02T09:59:20.884370Z", "url": "https://files.pythonhosted.org/packages/a2/04/742af817a6b9d3ab026b26426c63d104467127a257dcc1c24f30ef1b909b/qpsolvers-1.7.1.tar.gz", "yanked": false, "yanked_reason": null } ], "1.7.2": [ { "comment_text": "", "digests": { "md5": "4c9c8b96e4277bfca3d5f48d38549077", "sha256": "ff7194d38c6078b365023c2bd69813c3def8407a4a407fcb24a94bcbfd0432ff" }, "downloads": -1, "filename": "qpsolvers-1.7.2-py3-none-any.whl", "has_sig": false, "md5_digest": "4c9c8b96e4277bfca3d5f48d38549077", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 36400, "upload_time": "2021-11-24T18:20:02", "upload_time_iso_8601": "2021-11-24T18:20:02.047910Z", "url": "https://files.pythonhosted.org/packages/fc/4a/521cc4f10344dbd52bde875881bac6de1e349e4d4f07332a4b190b41154b/qpsolvers-1.7.2-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "673c9a2eaa106248fbcb68d234113d72", "sha256": "1be3bb41a866f3c516343facd73870ae6fe96da882d7b9b40fa0ad09b1f35261" }, "downloads": -1, "filename": "qpsolvers-1.7.2.tar.gz", "has_sig": false, "md5_digest": "673c9a2eaa106248fbcb68d234113d72", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 37043, "upload_time": "2021-11-24T18:20:04", "upload_time_iso_8601": "2021-11-24T18:20:04.677442Z", "url": "https://files.pythonhosted.org/packages/21/95/5d3ea1a9fdecf961a8b70062c3d9ecd3a4cfc3988f295ceda60539c845dd/qpsolvers-1.7.2.tar.gz", "yanked": false, "yanked_reason": null } ], "1.8.0": [ { "comment_text": "", "digests": { "md5": "d4afadf912e43b6a5ad3d111a3295a0a", "sha256": "0fb8b7a2505338e1ad3258dafdde3593dfce5022cfa881a2c9094d527e76f89a" }, "downloads": -1, "filename": "qpsolvers-1.8.0-py3-none-any.whl", "has_sig": false, "md5_digest": "d4afadf912e43b6a5ad3d111a3295a0a", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 36536, "upload_time": "2022-01-13T11:06:33", "upload_time_iso_8601": "2022-01-13T11:06:33.737558Z", "url": "https://files.pythonhosted.org/packages/8a/c1/fda509e24fcc754ff3e3acb3cc3cff9781b9b40aec1373627cd0d7c95141/qpsolvers-1.8.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "05b7a40bd671fbf0d6b7b9d31d009d92", "sha256": "8917b72c44d1d02d5d75e6ec09df1867a0fe2b45f267f9c80b341ad502d324ab" }, "downloads": -1, "filename": "qpsolvers-1.8.0.tar.gz", "has_sig": false, "md5_digest": "05b7a40bd671fbf0d6b7b9d31d009d92", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 36899, "upload_time": "2022-01-13T11:06:35", "upload_time_iso_8601": "2022-01-13T11:06:35.944288Z", "url": "https://files.pythonhosted.org/packages/83/6f/2683794023f993bde584d2c10009819ca2dc2705b71e18d2fccbec946dbc/qpsolvers-1.8.0.tar.gz", "yanked": false, "yanked_reason": null } ], "1.8.1": [ { "comment_text": "", "digests": { "md5": "2eaef224c03b2a269ae26a5628af5b13", "sha256": "5cd63c4bfaaabfd3598f10094d0458367e84934c635f8b5816c3b510460c28c6" }, "downloads": -1, "filename": "qpsolvers-1.8.1-py3-none-any.whl", "has_sig": false, "md5_digest": "2eaef224c03b2a269ae26a5628af5b13", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7", "size": 36981, "upload_time": "2022-03-05T11:22:21", "upload_time_iso_8601": "2022-03-05T11:22:21.197564Z", "url": "https://files.pythonhosted.org/packages/3f/e4/3b0725f6458dabf847629e7a6d990cccf3b8e6176c87f0d1556c75f89cce/qpsolvers-1.8.1-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "517e74f9b52d5ee6ab94d2fbd4807847", "sha256": "cfca57f43cd7ff370d1ea922601f4ad1ad00de580f363e9a6328a3050ac4a9bd" }, "downloads": -1, "filename": "qpsolvers-1.8.1.tar.gz", "has_sig": false, "md5_digest": "517e74f9b52d5ee6ab94d2fbd4807847", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.7", "size": 39732, "upload_time": "2022-03-05T11:22:23", "upload_time_iso_8601": "2022-03-05T11:22:23.727129Z", "url": "https://files.pythonhosted.org/packages/c9/f5/4438a1586f627062c6fb95a6311dc9a3b5accbba6b929702e1cb206a549c/qpsolvers-1.8.1.tar.gz", "yanked": false, "yanked_reason": null } ], "1.9.0": [ { "comment_text": null, "digests": { "md5": "fa4e4850306dd3153b83ecc118cadae6", "sha256": "64f64bda94a135245bf14f0f65caed406f232d6e25a8f4841925fab35bff2101" }, "downloads": -1, "filename": "qpsolvers-1.9.0-py3-none-any.whl", "has_sig": false, "md5_digest": "fa4e4850306dd3153b83ecc118cadae6", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7", "size": 40306, "upload_time": "2022-04-03T10:17:35", "upload_time_iso_8601": "2022-04-03T10:17:35.254597Z", "url": "https://files.pythonhosted.org/packages/83/ec/7d40b7ea0e8e9a4d3e071cd56a6ac356eaebfcb42e68cc4ea30d0cf05e4a/qpsolvers-1.9.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": null, "digests": { "md5": "0ecd31022f44d8bda574cc9bd4896420", "sha256": "37779a9f146eb2db34fcd50f755d2f40de6636135c580d184aa8ab211cb8b2f8" }, "downloads": -1, "filename": "qpsolvers-1.9.0.tar.gz", "has_sig": false, "md5_digest": "0ecd31022f44d8bda574cc9bd4896420", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.7", "size": 47319, "upload_time": "2022-04-03T10:17:38", "upload_time_iso_8601": "2022-04-03T10:17:38.021556Z", "url": "https://files.pythonhosted.org/packages/98/a9/c99a715f4a3c0af8476e5b05f2ba07fca1cd0d8343c33751d1d3b0f792de/qpsolvers-1.9.0.tar.gz", "yanked": false, "yanked_reason": null } ], "1.9.1": [ { "comment_text": null, "digests": { "md5": "2647efc1e6c03f12396efbd9bd9cab2c", "sha256": "ffc274a622343332e740d8eddaaf42e65889a2889465b5a214cc6da4298c5dcb" }, "downloads": -1, "filename": "qpsolvers-1.9.1-py3-none-any.whl", "has_sig": false, "md5_digest": "2647efc1e6c03f12396efbd9bd9cab2c", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7", "size": 40597, "upload_time": "2022-05-02T06:28:23", "upload_time_iso_8601": "2022-05-02T06:28:23.097290Z", "url": "https://files.pythonhosted.org/packages/8f/34/126a51ca56748ae6a5fec66ebdb6a8f46a15b07c9cc35fdb32566c069d22/qpsolvers-1.9.1-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": null, "digests": { "md5": "9f0e5b13e36d1bc0671fe41191413894", "sha256": "fd2eddabc6431b08dd9957399076dc36e977c06c989fe5620be1aaa6d46aaf13" }, "downloads": -1, "filename": "qpsolvers-1.9.1.tar.gz", "has_sig": false, "md5_digest": "9f0e5b13e36d1bc0671fe41191413894", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.7", "size": 47701, "upload_time": "2022-05-02T06:28:25", "upload_time_iso_8601": "2022-05-02T06:28:25.639685Z", "url": "https://files.pythonhosted.org/packages/26/e8/f427c487f48e185a02f0eef7b0a9c3904473b9396adcd9728e478983a66f/qpsolvers-1.9.1.tar.gz", "yanked": false, "yanked_reason": null } ] }, "urls": [ { "comment_text": null, "digests": { "md5": "2647efc1e6c03f12396efbd9bd9cab2c", "sha256": "ffc274a622343332e740d8eddaaf42e65889a2889465b5a214cc6da4298c5dcb" }, "downloads": -1, "filename": "qpsolvers-1.9.1-py3-none-any.whl", "has_sig": false, "md5_digest": "2647efc1e6c03f12396efbd9bd9cab2c", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7", "size": 40597, "upload_time": "2022-05-02T06:28:23", "upload_time_iso_8601": "2022-05-02T06:28:23.097290Z", "url": "https://files.pythonhosted.org/packages/8f/34/126a51ca56748ae6a5fec66ebdb6a8f46a15b07c9cc35fdb32566c069d22/qpsolvers-1.9.1-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": null, "digests": { "md5": "9f0e5b13e36d1bc0671fe41191413894", "sha256": "fd2eddabc6431b08dd9957399076dc36e977c06c989fe5620be1aaa6d46aaf13" }, "downloads": -1, "filename": "qpsolvers-1.9.1.tar.gz", "has_sig": false, "md5_digest": "9f0e5b13e36d1bc0671fe41191413894", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.7", "size": 47701, "upload_time": "2022-05-02T06:28:25", "upload_time_iso_8601": "2022-05-02T06:28:25.639685Z", "url": "https://files.pythonhosted.org/packages/26/e8/f427c487f48e185a02f0eef7b0a9c3904473b9396adcd9728e478983a66f/qpsolvers-1.9.1.tar.gz", "yanked": false, "yanked_reason": null } ], "vulnerabilities": [] }