{ "info": { "author": "Joseph T. Iosue", "author_email": "joe.iosue@yahoo.com", "bugtrack_url": null, "classifiers": [ "License :: OSI Approved :: Apache Software License", "Operating System :: OS Independent", "Programming Language :: Python :: 3" ], "description": "========\nQUBOVert\n========\n*master branch*\n\n.. image:: https://travis-ci.com/jiosue/QUBOVert.svg?branch=master\n :target: https://travis-ci.com/jiosue/QUBOVert\n :alt: Travis-CI\n.. image:: https://readthedocs.org/projects/qubovert/badge/?version=latest\n :target: https://qubovert.readthedocs.io/en/latest/?badge=latest\n :alt: Documentation Status\n.. image:: https://codecov.io/gh/jiosue/QUBOVert/branch/master/graph/badge.svg\n :target: https://codecov.io/gh/jiosue/QUBOVert\n :alt: Code Coverage\n.. image:: https://img.shields.io/lgtm/grade/python/g/jiosue/QUBOVert.svg?logo=lgtm&logoWidth=18\n :target: https://lgtm.com/projects/g/jiosue/QUBOVert/context:python\n :alt: Code Quality\n\n*dev branch*\n\n.. image:: https://travis-ci.com/jiosue/QUBOVert.svg?branch=dev\n :target: https://travis-ci.com/jiosue/QUBOVert\n :alt: Travis-CI\n.. image:: https://readthedocs.org/projects/qubovert/badge/?version=dev\n :target: https://qubovert.readthedocs.io/en/latest/?badge=dev\n :alt: Documentation Status\n.. image:: https://codecov.io/gh/jiosue/QUBOVert/branch/dev/graph/badge.svg\n :target: https://codecov.io/gh/jiosue/QUBOVert\n :alt: Code Coverage\n\n*pypi distribution*\n\n.. image:: https://badge.fury.io/py/qubovert.svg\n :target: https://badge.fury.io/py/qubovert\n :alt: pypi dist\n.. image:: https://pepy.tech/badge/qubovert\n :target: https://pepy.tech/project/qubovert\n :alt: pypi dist downloads\n\n\nPlease see the `Repository `_ and `Docs `_. For examples/tutorials, see the `notebooks `_.\n\n\nInstallation\n------------\n`For the stable release`.\n\n.. code:: shell\n\n pip install qubovert\n\n\nTo install from source:\n\n.. code:: shell\n\n git clone https://github.com/jiosue/qubovert.git\n cd qubovert\n pip install -e .\n\n\nThen you can use it in Python **versions 3.6 and above** with\n\n.. code:: python\n\n import qubovert\n\n # get info\n help(qubovert)\n\n # see the main functionality\n print(qubovert.__all__)\n\n # see the utilities defined\n help(qubovert.utils)\n print(qubovert.utils.__all__)\n\n # see the satisfiability library\n help(qubovert.sat)\n print(qubovert.sat.__all__)\n\n # see all the probles defined\n print(qubovert.problems.__all__)\n\n # to see specifically the np problems:\n help(qubovert.problems.np)\n print(qubovert.problems.np.__all__)\n\n # to see specifically the benchmarking problems:\n help(qubovert.problems.benchmarking)\n print(qubovert.problems.benchmarking.__all__)\n\n # etc ...\n\n\nManaging QUBO, Ising, PUBO, HIsing, HOBO, and HOIO formulations\n---------------------------------------------------------------\n\nSee ``qubovert.__all__``.\n\n- QUBO: Quadratic Unconstrained Binary Optimization\n- Ising: quadratic unconstrained spin-1/2 Hamiltonian\n- PUBO: Polynomial Unconstrained Binary Optimization\n- HIsing: Higher order unconstrained spin-1/2 Hamiltonian\n- HOBO: Higher Order Binary Optimization\n- HOIO: Higher Order Ising Optimization\n\nSee the docstrings for ``qubovert.HOBO``, ``qubovert.HOIO``, ``qubovert.QUBO``, ``qubovert.Ising``, ``qubovert.PUBO``, and ``qubovert.HIsing``.\n\nSee the following HOBO examples (much of the same functionality can be used with HOIO problems).\n\n.. code:: python\n\n from qubovert import HOBO\n\n H = HOBO()\n H.add_constraint_eq_zero({('a', 1): 2, (1, 2): -1, (): -1})\n print(H)\n # {('a', 1, 2): -4, (1, 2): 3, (): 1}\n H -= 1\n print(H)\n # {('a', 1, 2): -4, (1, 2): 3}\n\n\n.. code:: python\n\n from qubovert import binary_var\n\n x0, x1, x2 = binary_var(\"x0\"), binary_var(\"x1\"), binary_var(\"x2\")\n H = x0 + 2 * x1 * x2 - 3 + x2\n print(H)\n # {('x0',): 1, ('x1', 'x2'): 2, (): -3, ('x2',): 1}\n\n\nNote that for large problems, it is slower to use the `binary_var` functionality. For example, consider the following where creating `H0` is much faster than creating `H1`!\n\n.. code:: python\n\n from qubovert import binary_var, HOBO\n\n H0 = HOBO()\n for i in range(1000):\n H0[(i,)] += 1\n\n xs = [binary_var(i) for i in range(1000)]\n H1 = sum(xs)\n\n\nHere we show how to solve problems with the bruteforce solver, and how to convert problems to QUBO and Ising form. You can use any QUBO/Ising solver you'd like to solve!\n\n.. code:: python\n\n H = HOBO()\n\n # minimize -x_0 - x_1 - x_2\n for i in (0, 1, 2):\n H[(i,)] -= 1\n\n # subject to constraints\n H.add_constraint_eq_zero( # enforce that x_0 x_1 - x_2 == 0\n {(0, 1): 1, (2,): -1}\n ).add_constraint_lt_zero( # enforce that x_1 x_2 + x_0 < 1\n {(1, 2): 1, (0,): 1, (): -1}\n )\n print(H)\n # {(1,): -2, (2,): -1, (0, 1): 2, (1, 2): 2, (0, 1, 2): 2}\n\n print(H.solve_bruteforce(all_solutions=True))\n # [{0: 0, 1: 1, 2: 0}]\n\n Q = H.to_qubo()\n solutions = [H.convert_solution(sol)\n for sol in Q.solve_bruteforce(all_solutions=True)]\n print(solutions)\n # [{0: 0, 1: 1, 2: 0}] # matches the HOBO solution!\n\n L = H.to_ising()\n solutions = [H.convert_solution(sol)\n for sol in L.solve_bruteforce(all_solutions=True)]\n print(solutions)\n # [{0: 0, 1: 1, 2: 0}] # matches the HOBO solution!\n\n\nHere we show how to add various boolean constraints to models.\n\n.. code:: python\n\n H = HOBO()\n # make it favorable to AND variables a and b, and variables b and c\n H.add_constraint_AND('a', 'b').add_constraint_AND('b', 'c')\n\n # make it favorable to OR variables b and c\n H.add_constraint_OR('b', 'c')\n\n # make it favorable to (a AND b) OR (c AND d) OR e\n H.add_constraint_OR(['a', 'b'], ['c', 'd'], 'e')\n\n # enforce that 'b' = NOR('a', 'c', 'd')\n H.add_constraint_eq_NOR('b', 'a', 'c', 'd')\n\n print(H)\n # {(): 5, ('c',): -2, ('c', 'a', 'b', 'd'): 1, ('a', 'e', 'b'): 1,\n # ('c', 'e', 'd'): 1, ('e',): -1, ('a',): -1, ('c', 'a'): 1,\n # ('a', 'd'): 1, ('c', 'b'): 2, ('d',): -1, ('b', 'd'): 2}\n Q = H.to_qubo()\n print(Q)\n # {(): 5, (2,): -2, (5,): 12, (0, 1): 4, (0, 5): -8, (1, 5): -8,\n # (6,): 12, (2, 3): 4, (2, 6): -8, (3, 6): -8, (5, 6): 1, (4, 5): 1,\n # (4, 6): 1, (4,): -1, (0,): -1, (0, 2): 1, (0, 3): 1, (1, 2): 2,\n # (3,): -1, (1, 3): 2}\n obj_value, sol = qubo_solver(Q)\n print(sol)\n # {0: 0, 1: 0, 2: 1, 3: 0, 4: 1, 5: 0, 6: 0}\n solution = H.convert_solution(sol)\n print(solution)\n # {'a': 0, 'b': 0, 'c': 1, 'd': 0, 'e': 1}\n\n\nSee the following PUBO example.\n\n.. code:: python\n\n from qubovert import PUBO\n from any_module import qubo_solver\n # or you can use my bruteforce solver...\n # from qubovert.utils import solve_qubo_bruteforce as qubo_solver\n\n pubo = PUBO()\n pubo[('a', 'b', 'c', 'd')] -= 3\n pubo[('a', 'b', 'c')] += 1\n pubo[('c', 'd')] -= 2\n pubo[('a',)] += 1\n pubo -= 3 # equivalent to pubo[()] -= 3\n pubo **= 4\n pubo *= 2\n\n Q = pubo.to_qubo()\n obj, sol = qubo_solver(Q)\n solution = pubo.convert_solution(sol)\n print((obj, solution))\n # (2, {'a': 1, 'b': 1, 'c': 1, 'd': 0})\n\n\nSymbols can also be used, for example:\n\n.. code:: python\n\n from qubovert import HOIO\n from sympy import Symbol\n\n a, b = Symbol('a'), Symbol('b')\n\n # enforce that z_0 + z_1 == 0 with penalty a\n H = HOIO().add_constraint_eq_zero({(0,): 1, (1,): 1}, lam=a)\n print(H)\n # {(): 2*a, (0, 1): 2*a}\n H[(0, 1)] += b\n print(H)\n # {(): 2*a, (0, 1): 2*a + b}\n H_subs = H.subs({a: 2})\n print(H_subs)\n # {(): 4, (0, 1): 4 + b}\n\n H_subs = H.subs({a: 2, b: 3})\n print(H_subs)\n # {(): 4, (0, 1): 7}\n\nPlease note that ``H.mapping`` is not necessarily equal to ``H.subs(...).mapping``. Thus, when using the ``HOBO.convert_solution`` function, make sure that you use the correct ``HOBO`` instance!\n\nThe convension used is that ``()`` elements of every dictionary corresponds to offsets. Note that some QUBO solvers accept QUBOs where each key is a two element tuple (since for a QUBO ``{(0, 0): 1}`` is the same as ``{(0,): 1}``). To get this standard form from our ``QUBOMatrix`` object, just access the property ``Q``. Similar for the ``IsingMatrix``. For example:\n\n.. code:: python\n\n from qubovert.utils import QUBOMatrix\n Q = QUBOMatrix()\n Q += 3\n Q[(0,)] -= 1\n Q[(0, 1)] += 2\n Q[(1, 1)] -= 3\n print(Q)\n # {(): 3, (0,): -1, (0, 1): 2, (1,): -3}\n print(Q.Q)\n # {(0, 0): -1, (0, 1): 2, (1, 1): -3}\n print(Q.offset)\n # 3\n\n.. code:: python\n\n from qubovert.utils import IsingMatrix\n L = IsingMatrix()\n L += 3\n L[(0, 1, 1)] -= 1\n L[(0, 1)] += 2\n L[(1, 1)] -= 3\n print(L)\n # {(0,): -1, (0, 1): 2}\n print(L.h)\n # {0: -1}\n print(L.J)\n # {(0, 1): 2}\n print(L.offset)\n # 0\n\n\nCommon binary optimization utilities (the ``utils`` library)\n------------------------------------------------------------\n\nSee ``qubovert.utils.__all__``.\n\nWe implement various utility functions, including\n\n- ``solve_pubo_bruteforce``,\n- ``solve_hising_bruteforce``,\n- ``pubo_value``,\n- ``hising_value``,\n- ``pubo_to_hising``,\n- ``hising_to_pubo``,\n- ``subgraph``,\n\nand more.\n\n\nConverting SAT problems (the ``sat`` library)\n---------------------------------------------\n\nSee ``qubovert.sat.__all__``.\n\nConsider the following 3-SAT example.\n\n.. code:: python\n\n from qubovert.sat import AND, NOT, OR\n from anywhere import qubo_solver\n\n C = AND(OR(0, 1, 2), OR(NOT(0), 2, NOT(3)), OR(NOT(1), NOT(2), 3))\n\n # C is 1 for a satisfying assignment, else 0\n # So minimizing P will solve it.\n P = -C\n\n # P is a PUBO\n Q = P.to_qubo()\n solution = qubo_solver(Q)\n\n print(solution) # {0: 0, 1: 0, 2: 0, 3: 1, 4: 0, 5: 0, 6: 0}\n converted_sol = P.convert_solution(solution)\n print(converted_sol) # {0: 0, 3: 0, 1: 0, 2: 1}\n\n print(C.value(converted_sol)) # will print 1 because it satisfies C\n\n\nConvert common problems to QUBO form (the ``problems`` library)\n---------------------------------------------------------------\n\nSee ``qubovert.problems.__all__``.\n\nSo far we have just implemented some of the formulations from [Lucas]_. The goal of QUBOVert is to become a large collection of problems mapped to QUBO and Ising forms in order to aid the recent increase in study of these problems due to quantum optimization algorithms. Use Python's ``help`` function! I have very descriptive doc strings on all the functions and classes.\n\n\nSee the following Set Cover example. All other problems can be used in a similar way.\n\n.. code:: python\n\n from qubovert.problems import SetCover\n from any_module import qubo_solver\n # or you can use my bruteforce solver...\n # from qubovert.utils import solve_qubo_bruteforce as qubo_solver\n\n U = {\"a\", \"b\", \"c\", \"d\"}\n V = [{\"a\", \"b\"}, {\"a\", \"c\"}, {\"c\", \"d\"}]\n\n problem = SetCover(U, V)\n Q = problem.to_qubo()\n\n obj, sol = qubo_solver(Q)\n\n solution = problem.convert_solution(sol)\n\n print(solution)\n # {0, 2}\n print(problem.is_solution_valid(solution))\n # will print True, since V[0] + V[2] covers all of U\n print(obj == len(solution))\n # will print True\n\nTo use the Ising formulation instead:\n\n.. code:: python\n\n from qubovert.problems import SetCover\n from any_module import ising_solver\n # or you can use my bruteforce solver...\n # from qubovert.utils import solve_ising_bruteforce as ising_solver\n\n U = {\"a\", \"b\", \"c\", \"d\"}\n V = [{\"a\", \"b\"}, {\"a\", \"c\"}, {\"c\", \"d\"}]\n\n problem = SetCover(U, V)\n L = problem.to_ising()\n\n obj, sol = ising_solver(L)\n\n solution = problem.convert_solution(sol)\n\n print(solution)\n # {0, 2}\n print(problem.is_solution_valid(solution))\n # will print True, since V[0] + V[2] covers all of U\n print(obj == len(solution))\n # will print True\n\n\nTo see problem specifics, run\n\n.. code:: python\n\n help(qubovert.problems.SetCover)\n help(qubovert.problems.VertexCover)\n # etc\n\nI have very descriptive doc strings that should explain everything you need to know to use each problem class.\n\n\nReferences\n----------\n\n.. [Lucas] Andrew Lucas. Ising formulations of many np problems. Frontiers in Physics, 2:5, 2014.\n\n\n", "description_content_type": "text/x-rst", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/jiosue/qubovert", "keywords": "", "license": "Apache Software License 2.0", "maintainer": "", "maintainer_email": "", "name": "qubovert", "package_url": "https://pypi.org/project/qubovert/", "platform": "", "project_url": "https://pypi.org/project/qubovert/", "project_urls": { "Docs": "https://qubovert.readthedocs.io", "Homepage": "https://github.com/jiosue/qubovert", "Source": "https://github.com/jiosue/qubovert" }, "release_url": "https://pypi.org/project/qubovert/0.1.0/", "requires_dist": [ "numpy" ], "requires_python": "", "summary": "A package for converting common problems to QUBO/Ising form", "version": "0.1.0" }, "last_serial": 5930634, "releases": { "0.0.1": [ { "comment_text": "", "digests": { "md5": "3d8721f6c00237069c1c4d28a5c987f6", "sha256": "8252ad692c4bb11b6b0f925093a26d6d263afc458fee0ff2fd002b3b8ec46fce" }, "downloads": -1, "filename": "qubovert-0.0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "3d8721f6c00237069c1c4d28a5c987f6", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 52665, "upload_time": "2019-08-02T19:21:33", "url": "https://files.pythonhosted.org/packages/9f/31/b4fd89a94ab67625ed13871bfa85e62d15fa0469e0bbca53dc8170a6a9e7/qubovert-0.0.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5dbb71fde86c55c6be8b52633a3132fb", "sha256": "7ce026e62e8b309f166796aecd3bd1f81003f6f80d21f5900e9002dc79e7f413" }, "downloads": -1, "filename": "qubovert-0.0.1.tar.gz", "has_sig": false, "md5_digest": "5dbb71fde86c55c6be8b52633a3132fb", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 27153, "upload_time": "2019-08-02T19:21:36", "url": "https://files.pythonhosted.org/packages/31/f2/2ee503f8fdf4a16b18c1c33a92d30289436a05c0b901de9af69b2b96caf1/qubovert-0.0.1.tar.gz" } ], "0.0.2": [ { "comment_text": "", "digests": { "md5": "b898e5a3a92f642cc4b062bae5871fb7", "sha256": "e409fcce43170c31a00a3a2036e5750d77dfa9d49e2a25c5530e1c256d353bdf" }, "downloads": -1, "filename": "qubovert-0.0.2-py3-none-any.whl", "has_sig": false, "md5_digest": "b898e5a3a92f642cc4b062bae5871fb7", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 109656, "upload_time": "2019-09-09T19:47:14", "url": "https://files.pythonhosted.org/packages/f5/6e/6682488ddbfaa1b9d103632420e7b23667243b27c9e124634d920b3b8092/qubovert-0.0.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b309a510596fee2bf870ae91b06b7ac8", "sha256": "92f0df32132293a7d11be75bfed1671407858e01ef574c0978248e9df26b1881" }, "downloads": -1, "filename": "qubovert-0.0.2.tar.gz", "has_sig": false, "md5_digest": "b309a510596fee2bf870ae91b06b7ac8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 65036, "upload_time": "2019-09-09T19:47:16", "url": "https://files.pythonhosted.org/packages/28/4b/2a698fc9eadf7686498451c45ccd2eccfc8f064a0dfec0e82dbef1bf21f6/qubovert-0.0.2.tar.gz" } ], "0.0.3": [ { "comment_text": "", "digests": { "md5": "c09cc892b47a2c62646ef203c4259fe2", "sha256": "2993d95a65d7660a9b0be10e9d46a0acde879b1d9835a71804e7b5276c36c8b0" }, "downloads": -1, "filename": "qubovert-0.0.3-py3-none-any.whl", "has_sig": false, "md5_digest": "c09cc892b47a2c62646ef203c4259fe2", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 110439, "upload_time": "2019-09-18T07:02:49", "url": "https://files.pythonhosted.org/packages/3f/41/af0b0e968cd855d007953a3686c5b007df4d745d317945d64df84ccab1b8/qubovert-0.0.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "cd9c847d9703b00f98aa4f0dc44c8648", "sha256": "c9c4235bfe1f05526733d50f47c0e22a66e873309aa7ed63f7e1205d414233ea" }, "downloads": -1, "filename": "qubovert-0.0.3.tar.gz", "has_sig": false, "md5_digest": "cd9c847d9703b00f98aa4f0dc44c8648", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 65736, "upload_time": "2019-09-18T07:02:52", "url": "https://files.pythonhosted.org/packages/59/9e/d4e22bb5809125c4447f13e8e61034b93784e97e0e46247ee1244c6e243a/qubovert-0.0.3.tar.gz" } ], "0.0.4": [ { "comment_text": "", "digests": { "md5": "4e28f8c47cfff4e539635b7f3e765634", "sha256": "e70ef1e084f477516b5801d5ff3483e9f46c9a1aee8bd76adaf0c2e7218ca787" }, "downloads": -1, "filename": "qubovert-0.0.4-py3-none-any.whl", "has_sig": false, "md5_digest": "4e28f8c47cfff4e539635b7f3e765634", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 110472, "upload_time": "2019-09-18T07:33:34", "url": "https://files.pythonhosted.org/packages/c6/76/4d50cc639864a67c5a7b7c4950a64aac4e8902832a261f7a72e9cd9b0357/qubovert-0.0.4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a460cb597a725f82b53c1c412b0dd977", "sha256": "01f0c1f3c78387fc6e0944496cd87b983230fb3e5aa9ae2738d02e78002fe6fb" }, "downloads": -1, "filename": "qubovert-0.0.4.tar.gz", "has_sig": false, "md5_digest": "a460cb597a725f82b53c1c412b0dd977", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 65717, "upload_time": "2019-09-18T07:33:38", "url": "https://files.pythonhosted.org/packages/84/14/142cb8762af48fb1482e16f77d32106c459c7a3a2165015218400341caab/qubovert-0.0.4.tar.gz" } ], "0.0.5": [ { "comment_text": "", "digests": { "md5": "66f50d2c6400960b7a9628a3ab4b0adc", "sha256": "b3d6afdbffc0bef846300ac83535f2123c29ade3cb4db984be83e9592adbcd7f" }, "downloads": -1, "filename": "qubovert-0.0.5-py3-none-any.whl", "has_sig": false, "md5_digest": "66f50d2c6400960b7a9628a3ab4b0adc", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 110773, "upload_time": "2019-09-18T18:41:37", "url": "https://files.pythonhosted.org/packages/5a/0c/554043bfa56190e474ea24ac029a9452529cd7fffa9c0ff421d49dec4861/qubovert-0.0.5-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "04c56c4d502989ecbfadd4bf6ee1acaf", "sha256": "50d62024be717e5cfa8abe8c0111cd5efff3660f6c5707d60f196a52238a2cba" }, "downloads": -1, "filename": "qubovert-0.0.5.tar.gz", "has_sig": false, "md5_digest": "04c56c4d502989ecbfadd4bf6ee1acaf", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 66023, "upload_time": "2019-09-18T18:41:39", "url": "https://files.pythonhosted.org/packages/7e/f9/6d7f07d9327ec08d864815d6edbeb22a0530a49b19a8745f280854a3ce03/qubovert-0.0.5.tar.gz" } ], "0.0.6": [ { "comment_text": "", "digests": { "md5": "3adb7ef16c17b37528167e56da075745", "sha256": "95526b70905d87bf6766c1283fce1f984a0700670a0fdaca18c2d7d5fdfc655b" }, "downloads": -1, "filename": "qubovert-0.0.6-py3-none-any.whl", "has_sig": false, "md5_digest": "3adb7ef16c17b37528167e56da075745", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 110736, "upload_time": "2019-09-25T23:34:25", "url": "https://files.pythonhosted.org/packages/d9/ff/719a6d9682c3d5e5681b65543ccc1f7791701807d034db40be1b9a51c95e/qubovert-0.0.6-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "51a423470b9e800cc05b0f33776ad4a9", "sha256": "d6ae28b0f98b93aed4232a9e217f0d81f320ec8703395780a41193dc8d78b575" }, "downloads": -1, "filename": "qubovert-0.0.6.tar.gz", "has_sig": false, "md5_digest": "51a423470b9e800cc05b0f33776ad4a9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 66394, "upload_time": "2019-09-25T23:34:27", "url": "https://files.pythonhosted.org/packages/b1/9f/135676623f8b66f3ebeef37a7d65edb03509314d259e2d7f0f27015ddb3b/qubovert-0.0.6.tar.gz" } ], "0.1.0": [ { "comment_text": "", "digests": { "md5": "4de1aa7a029e5292ffc7b9e69042b85a", "sha256": "e67db65bc3811aa185dc050c3ca64e6e9823ef52b656fc4234880ccc73dfa21f" }, "downloads": -1, "filename": "qubovert-0.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "4de1aa7a029e5292ffc7b9e69042b85a", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 111264, "upload_time": "2019-10-04T23:36:17", "url": "https://files.pythonhosted.org/packages/1a/a0/b720e83e9ba6f7d9d4cdae072baa02b71bf14ac42c0178bfa8a23eecb8ba/qubovert-0.1.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0f6ba17063feb3a8801e0fc21524e625", "sha256": "fb3198610c21b95c3d0744d0ac1144e24b77929c21e32e8a02e13c9e3bd2b505" }, "downloads": -1, "filename": "qubovert-0.1.0.tar.gz", "has_sig": false, "md5_digest": "0f6ba17063feb3a8801e0fc21524e625", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 66985, "upload_time": "2019-10-04T23:36:19", "url": "https://files.pythonhosted.org/packages/e1/79/85084cf61da98e5c6aa735eaf7e14efede7c34114a8209edb3540f19fbec/qubovert-0.1.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "4de1aa7a029e5292ffc7b9e69042b85a", "sha256": "e67db65bc3811aa185dc050c3ca64e6e9823ef52b656fc4234880ccc73dfa21f" }, "downloads": -1, "filename": "qubovert-0.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "4de1aa7a029e5292ffc7b9e69042b85a", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 111264, "upload_time": "2019-10-04T23:36:17", "url": "https://files.pythonhosted.org/packages/1a/a0/b720e83e9ba6f7d9d4cdae072baa02b71bf14ac42c0178bfa8a23eecb8ba/qubovert-0.1.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0f6ba17063feb3a8801e0fc21524e625", "sha256": "fb3198610c21b95c3d0744d0ac1144e24b77929c21e32e8a02e13c9e3bd2b505" }, "downloads": -1, "filename": "qubovert-0.1.0.tar.gz", "has_sig": false, "md5_digest": "0f6ba17063feb3a8801e0fc21524e625", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 66985, "upload_time": "2019-10-04T23:36:19", "url": "https://files.pythonhosted.org/packages/e1/79/85084cf61da98e5c6aa735eaf7e14efede7c34114a8209edb3540f19fbec/qubovert-0.1.0.tar.gz" } ] }