quboassist


Namequboassist JSON
Version 0.0.19 PyPI version JSON
download
home_pageNone
SummaryGenerate QUBO which can be input to dwave-neal simulated annealing solver and reconstruct the solution of the original problem.
upload_time2024-11-20 02:41:36
maintainerNone
docs_urlNone
authorNone
requires_python>=3.8
licenseNone
keywords qubo simulated annealing
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            ```

```

# quboassist

This is a package to generate QUBO which can be input to dwave-neal simulated annealing solver and reconstruct the solution of the original problem from the output.

## What problems is it applicable to?

This package converts the problem below into QUBO form which can be input directly to dwave-neal package:


$$
{\rm minimize}\ \ \ f(x) =x^t Ax\\
$$

$$
s.t. \ \ \ \forall i, a_i \leq x_i\leq b_i,x_i\in\mathbb Z
$$

$$
\forall j, \sum_ kc_{jk} x_k \geq d_j\ \ (c_{jk}, d_j \in \mathbb Z)
$$



where $A$ is a symmetric real matrix. I.e. problems where the objective function is quadratic, all variables are bounded and integer, all constraints are linear and their all coefficients are integer.

## How  to use

First, import the all classes of quboassist.

```
from quboassist import *
import neal
```

There are three classes: `Variable`, `Formula`, `Problem`. Using `Variable` class, we can define variables.

```
x = [Variable("x{}".format(i), 2, 5) for i in range(10)]
```

The fist component of input is the name of the variable. The second is the minimum value and the last is the maximum value, so this variable "x" takes $2,3,4,5$​​. 

 `Formula` is a class whose instance is generated automatically when variables are operated. For example, 

```
f = - x[0]**2 -  3 * x[1]
g = x[0] > x[1]
```

then `f`,  `g` are instances of `Formula`. Finally, we can define a problem using `Problem`.

```
P = Problem() 
P.add_objective(f)
P.add_constraint(g)
```

 Finally, we can get QUBO by `compile` method.

```
qubo = P.compile([10])

sampler = neal.SimulatedAnnealingSampler()
result = sampler.sample_qubo(qubo.todict()).first.sample
solution = P.solution(result, "neal")
print(solution)
```

where the input of `compile` method of `Problem` class  is the weights vector of the added constraints. The solution is almost always below .

```
({'x0': 5, 'x1': 4}, [True])
```

The second component means whether each solution satisfies each constraint conditions. In the above case, because $5 > 4$, the return is true. Note that heuristic algorithms do not necessarily return an exact solution, so we always need to pay attention to the second component. 

In general, increasing the weight $w_i$ tends to make it easier to satisfy the condition, but the objective function becomes relatively smaller. Therefore we propose to use a library called optuna to tune these hyperparameters $w_i$.

A sample code is showed below.

```
import neal
import quboassist
import optuna
import numpy as np
from copy import copy

x = [quboassist.Variable("x{}".format(i), 0, 3) for i in range(10)]

best_solution = []
best_val = np.inf

P = quboassist.Problem()

f = - x[0]**2 - x[1]
P.add_objective(f)

g = x[0] > x[1]
P.add_constraint(g)

h = x[0] + x[1] == x[2]
P.add_constraint(h)

sampler = neal.SimulatedAnnealingSampler()

def objective(trial):
    
    w = [trial.suggest_float("w{}".format(i), 0, 5) for i in range(2)]
    qubo = P.compile(w)

    result = sampler.sample_qubo(qubo.todict()).first
    solution = P.solution(result.sample)

    print("\n")
    print(solution)

    obj = w[0] + w[1] + 10 * sum(np.logical_not(solution[1]))
    val = result.energy
    
    # Note that result.energy and the value of objective function may differ by a constant which appears when expanding the product of variables!

    global best_solution, best_val
    
    if np.all(solution[1]) and val < best_val:
        best_val = val
        best_solution = copy(solution)
    
    return obj

study = optuna.create_study(direction="minimize")
study.optimize(objective, n_trials=20)

print("\n\nBest Solutuion")
print(best_solution)
```



## What kind of technique is used?



The core is as below. We leave it to the reader to consider how to use this to represent any bounded integer variable as a linear combination of a constant and a binary variable, and to convert an inequality into an equality.



Algorithm

------

Input: $n$

Output: $A(n)$

​        Define $A_0(n) \leftarrow 2^{\lfloor \log_2 (n + 1) \rfloor - 1}, n_1 \leftarrow n - A_0(n), k \leftarrow 0$

​        while $n_{k+1} \neq 0$ do

​                $A_{k + 1}(n) \leftarrow 2^{\lfloor \log_2 (n_{k + 1} + 1) \rfloor - 1}$	

​                $k \leftarrow k + 1$

​                $n_{k + 1}\leftarrow n_k - A_k(n)$

​        end while

------



*Lemma*

For all $n \in \mathbb N$, the sequence $A(n)$​ is finite and the length is at most


$$
2\lfloor\log_2(n +1)\rfloor.
$$


Moreover, a function $f: [0,1]^k \rightarrow \mathbb N$ defined as:


$$
f(x_1,x_2,...,x_k):= \sum_{i =1}^k A_i(n) x_i
$$


takes the all numbers $0,...,n$ and no other values.



*Proof.*

Since $A_0(n)$ is the only power of two which satisfies $4A_0(n)> n+1 \geq 2 A_0(n)$, 


$$
n - A_0(n) \geq A_0(n)-1
$$


i.e.


$$
A_1(n)=2^{\lfloor\log_2(n_1 +1)\rfloor-1}\geq \frac{1}{2}A_0(n)
$$


holds if $n_1 \neq 0$. Therefore if $A_0(n) \geq 2$, then $A_1(n) = A_0(n)$ or $A_1(n) =\frac{1}{2} A_0(n)$. Moreover, in the case that the first two numbers of $A(n)$​ is same, 


$$
n_2=n-2A_1(n)<2A_1(n)-1
$$


i.e.


$$
A_2(n)=2^{\lfloor\log_2(n_2 +1)\rfloor-1}<A_1(n).
$$


Hence the same number appears at most two times in $A(n)$ and the exponent $\lfloor\log_2(n_k +1)\rfloor-1$ is monotonically non-increasing, thus the length of $A(n)$ is at most


$$
2\lfloor\log_2(n +1)\rfloor,
$$


moreover by the same reason, we also conclude the sequence $A(n)$ includes all powers of two
less than or equal to


$$
2^{\lfloor\log_2(n +1)\rfloor-1}(= A_0(n)).
$$


Therefore, numbers $0,...,2A_0(n)-1$​ can be expressed as


$$
 \sum_{i=1}^kA_i(n)x_i
$$


and numbers $n-2A_0(n),...,n$​ can be expressed as


$$
n-\sum_{i=1}^kA_i(n)y_i=\sum_{i=1}^kA_i(n)(1-y_i).
$$


Since


$$
n-2A_0(n)< 2A_0(n) -1,
$$


finally all numbers $0,...,n$​​ can be expressed as


$$
\sum_{i=1}^kA_i(n)x_i.
$$

<div style="text-align: right;">
□
</div>


            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "quboassist",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.8",
    "maintainer_email": null,
    "keywords": "QUBO, Simulated annealing",
    "author": null,
    "author_email": "Enomoto Kan <enomotokan@gmail.com>",
    "download_url": null,
    "platform": null,
    "description": "```\n\n```\n\n# quboassist\n\nThis is a package to generate QUBO which can be input to dwave-neal simulated annealing solver and reconstruct the solution of the original problem from the output.\n\n## What problems is it applicable to?\n\nThis package converts the problem below into QUBO form which can be input directly to dwave-neal package:\n\n\n$$\n{\\rm minimize}\\ \\ \\ f(x) =x^t Ax\\\\\n$$\n\n$$\ns.t. \\ \\ \\ \\forall i, a_i \\leq x_i\\leq b_i,x_i\\in\\mathbb Z\n$$\n\n$$\n\\forall j, \\sum_ kc_{jk} x_k \\geq d_j\\ \\ (c_{jk}, d_j \\in \\mathbb Z)\n$$\n\n\n\nwhere $A$ is a symmetric real matrix. I.e. problems where the objective function is quadratic, all variables are bounded and integer, all constraints are linear and their all coefficients are integer.\n\n## How  to use\n\nFirst, import the all classes of quboassist.\n\n```\nfrom quboassist import *\nimport neal\n```\n\nThere are three classes: `Variable`, `Formula`, `Problem`. Using `Variable` class, we can define variables.\n\n```\nx = [Variable(\"x{}\".format(i), 2, 5) for i in range(10)]\n```\n\nThe fist component of input is the name of the variable. The second is the minimum value and the last is the maximum value, so this variable \"x\" takes $2,3,4,5$\u200b\u200b. \n\n `Formula` is a class whose instance is generated automatically when variables are operated. For example, \n\n```\nf = - x[0]**2 -  3 * x[1]\ng = x[0] > x[1]\n```\n\nthen `f`,  `g` are instances of `Formula`. Finally, we can define a problem using `Problem`.\n\n```\nP = Problem() \nP.add_objective(f)\nP.add_constraint(g)\n```\n\n Finally, we can get QUBO by `compile` method.\n\n```\nqubo = P.compile([10])\n\nsampler = neal.SimulatedAnnealingSampler()\nresult = sampler.sample_qubo(qubo.todict()).first.sample\nsolution = P.solution(result, \"neal\")\nprint(solution)\n```\n\nwhere the input of `compile` method of `Problem` class  is the weights vector of the added constraints. The solution is almost always below .\n\n```\n({'x0': 5, 'x1': 4}, [True])\n```\n\nThe second component means whether each solution satisfies each constraint conditions. In the above case, because $5 > 4$, the return is true. Note that heuristic algorithms do not necessarily return an exact solution, so we always need to pay attention to the second component. \n\nIn general, increasing the weight $w_i$ tends to make it easier to satisfy the condition, but the objective function becomes relatively smaller. Therefore we propose to use a library called optuna to tune these hyperparameters $w_i$.\n\nA sample code is showed below.\n\n```\nimport neal\nimport quboassist\nimport optuna\nimport numpy as np\nfrom copy import copy\n\nx = [quboassist.Variable(\"x{}\".format(i), 0, 3) for i in range(10)]\n\nbest_solution = []\nbest_val = np.inf\n\nP = quboassist.Problem()\n\nf = - x[0]**2 - x[1]\nP.add_objective(f)\n\ng = x[0] > x[1]\nP.add_constraint(g)\n\nh = x[0] + x[1] == x[2]\nP.add_constraint(h)\n\nsampler = neal.SimulatedAnnealingSampler()\n\ndef objective(trial):\n    \n    w = [trial.suggest_float(\"w{}\".format(i), 0, 5) for i in range(2)]\n    qubo = P.compile(w)\n\n    result = sampler.sample_qubo(qubo.todict()).first\n    solution = P.solution(result.sample)\n\n    print(\"\\n\")\n    print(solution)\n\n    obj = w[0] + w[1] + 10 * sum(np.logical_not(solution[1]))\n    val = result.energy\n    \n    # Note that result.energy and the value of objective function may differ by a constant which appears when expanding the product of variables!\n\n    global best_solution, best_val\n    \n    if np.all(solution[1]) and val < best_val:\n        best_val = val\n        best_solution = copy(solution)\n    \n    return obj\n\nstudy = optuna.create_study(direction=\"minimize\")\nstudy.optimize(objective, n_trials=20)\n\nprint(\"\\n\\nBest Solutuion\")\nprint(best_solution)\n```\n\n\n\n## What kind of technique is used?\n\n\n\nThe core is as below. We leave it to the reader to consider how to use this to represent any bounded integer variable as a linear combination of a constant and a binary variable, and to convert an inequality into an equality.\n\n\n\nAlgorithm\n\n------\n\nInput: $n$\n\nOutput: $A(n)$\n\n\u200b        Define $A_0(n) \\leftarrow 2^{\\lfloor \\log_2 (n + 1) \\rfloor - 1}, n_1 \\leftarrow n - A_0(n), k \\leftarrow 0$\n\n\u200b        while $n_{k+1} \\neq 0$ do\n\n\u200b                $A_{k + 1}(n) \\leftarrow 2^{\\lfloor \\log_2 (n_{k + 1} + 1) \\rfloor - 1}$\t\n\n\u200b                $k \\leftarrow k + 1$\n\n\u200b                $n_{k + 1}\\leftarrow n_k - A_k(n)$\n\n\u200b        end while\n\n------\n\n\n\n*Lemma*\n\nFor all $n \\in \\mathbb N$, the sequence $A(n)$\u200b is finite and the length is at most\n\n\n$$\n2\\lfloor\\log_2(n +1)\\rfloor.\n$$\n\n\nMoreover, a function $f: [0,1]^k \\rightarrow \\mathbb N$ defined as:\n\n\n$$\nf(x_1,x_2,...,x_k):= \\sum_{i =1}^k A_i(n) x_i\n$$\n\n\ntakes the all numbers $0,...,n$ and no other values.\n\n\n\n*Proof.*\n\nSince $A_0(n)$ is the only power of two which satisfies $4A_0(n)> n+1 \\geq 2 A_0(n)$, \n\n\n$$\nn - A_0(n) \\geq A_0(n)-1\n$$\n\n\ni.e.\n\n\n$$\nA_1(n)=2^{\\lfloor\\log_2(n_1 +1)\\rfloor-1}\\geq \\frac{1}{2}A_0(n)\n$$\n\n\nholds if $n_1 \\neq 0$. Therefore if $A_0(n) \\geq 2$, then $A_1(n) = A_0(n)$ or $A_1(n) =\\frac{1}{2} A_0(n)$. Moreover, in the case that the first two numbers of $A(n)$\u200b is same, \n\n\n$$\nn_2=n-2A_1(n)<2A_1(n)-1\n$$\n\n\ni.e.\n\n\n$$\nA_2(n)=2^{\\lfloor\\log_2(n_2 +1)\\rfloor-1}<A_1(n).\n$$\n\n\nHence the same number appears at most two times in $A(n)$ and the exponent $\\lfloor\\log_2(n_k +1)\\rfloor-1$ is monotonically non-increasing, thus the length of $A(n)$ is at most\n\n\n$$\n2\\lfloor\\log_2(n +1)\\rfloor,\n$$\n\n\nmoreover by the same reason, we also conclude the sequence $A(n)$ includes all powers of two\nless than or equal to\n\n\n$$\n2^{\\lfloor\\log_2(n +1)\\rfloor-1}(= A_0(n)).\n$$\n\n\nTherefore, numbers $0,...,2A_0(n)-1$\u200b can be expressed as\n\n\n$$\n \\sum_{i=1}^kA_i(n)x_i\n$$\n\n\nand numbers $n-2A_0(n),...,n$\u200b can be expressed as\n\n\n$$\nn-\\sum_{i=1}^kA_i(n)y_i=\\sum_{i=1}^kA_i(n)(1-y_i).\n$$\n\n\nSince\n\n\n$$\nn-2A_0(n)< 2A_0(n) -1,\n$$\n\n\nfinally all numbers $0,...,n$\u200b\u200b can be expressed as\n\n\n$$\n\\sum_{i=1}^kA_i(n)x_i.\n$$\n\n<div style=\"text-align: right;\">\n\u25a1\n</div>\n\n",
    "bugtrack_url": null,
    "license": null,
    "summary": "Generate QUBO which can be input to dwave-neal simulated annealing solver and reconstruct the solution of the original problem.",
    "version": "0.0.19",
    "project_urls": {
        "Homepage": "https://github.com/enomotokan/quboassist"
    },
    "split_keywords": [
        "qubo",
        " simulated annealing"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "fca3480aec19ad4b0d8bcf6ca3e6dfa17fe0e6b788040faf5741984f4565976a",
                "md5": "a42e7d21bf7606ceeacf7974772c6ae0",
                "sha256": "54e57408c0b7d954b10e33373f37c54a30a2a5cde24fe913c9bd65fb04b847a9"
            },
            "downloads": -1,
            "filename": "quboassist-0.0.19-cp310-cp310-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "a42e7d21bf7606ceeacf7974772c6ae0",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.8",
            "size": 367252,
            "upload_time": "2024-11-20T02:41:36",
            "upload_time_iso_8601": "2024-11-20T02:41:36.533242Z",
            "url": "https://files.pythonhosted.org/packages/fc/a3/480aec19ad4b0d8bcf6ca3e6dfa17fe0e6b788040faf5741984f4565976a/quboassist-0.0.19-cp310-cp310-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "e26b0abed112dcc90935c1b6fafc8aabf8b8a608d2e71c1b58bcbb29faa34118",
                "md5": "04a07947d8c127aa04e7e14dfe89bb7f",
                "sha256": "d1a436510aead022434b4fea4a79819e278d43c79885abdb42338c8c12b901ca"
            },
            "downloads": -1,
            "filename": "quboassist-0.0.19-cp310-cp310-manylinux_2_34_x86_64.whl",
            "has_sig": false,
            "md5_digest": "04a07947d8c127aa04e7e14dfe89bb7f",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.8",
            "size": 430310,
            "upload_time": "2024-11-20T02:41:42",
            "upload_time_iso_8601": "2024-11-20T02:41:42.642395Z",
            "url": "https://files.pythonhosted.org/packages/e2/6b/0abed112dcc90935c1b6fafc8aabf8b8a608d2e71c1b58bcbb29faa34118/quboassist-0.0.19-cp310-cp310-manylinux_2_34_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "39e2a06471a552b9860c93e462eae724380ad23bbe495bc671daae0770d277da",
                "md5": "2ceb82994db6f0b6b8f21446935c60ea",
                "sha256": "88b84af387cc4dbcb0110d2d3314b85e6598f71486f014a36b1b7d69c9616243"
            },
            "downloads": -1,
            "filename": "quboassist-0.0.19-cp310-none-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "2ceb82994db6f0b6b8f21446935c60ea",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.8",
            "size": 267992,
            "upload_time": "2024-11-20T02:43:40",
            "upload_time_iso_8601": "2024-11-20T02:43:40.829208Z",
            "url": "https://files.pythonhosted.org/packages/39/e2/a06471a552b9860c93e462eae724380ad23bbe495bc671daae0770d277da/quboassist-0.0.19-cp310-none-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "3bfa3ac0c79549ed06e91ab2727c0cafad3f2996c6f1ffbb6d26c04ca0753ccf",
                "md5": "2a518ef94fb32fcbec4d1c7beb257730",
                "sha256": "4a834d169059f33419dadce86dbd6aaf5cf5e17ea21094365f5e37b59be8eaea"
            },
            "downloads": -1,
            "filename": "quboassist-0.0.19-cp311-cp311-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "2a518ef94fb32fcbec4d1c7beb257730",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.8",
            "size": 367322,
            "upload_time": "2024-11-20T02:41:50",
            "upload_time_iso_8601": "2024-11-20T02:41:50.346131Z",
            "url": "https://files.pythonhosted.org/packages/3b/fa/3ac0c79549ed06e91ab2727c0cafad3f2996c6f1ffbb6d26c04ca0753ccf/quboassist-0.0.19-cp311-cp311-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "1191390532baa25f1e594fee7e17271b298853e26ebcacb07daf892076c5db70",
                "md5": "1bfed043604ac0d06526d8aea6a46a57",
                "sha256": "a02b61ede11f478ac58fdffeea44da64a3ed3ab00b0a57351a7c0c56f2ce3d6f"
            },
            "downloads": -1,
            "filename": "quboassist-0.0.19-cp311-cp311-manylinux_2_34_x86_64.whl",
            "has_sig": false,
            "md5_digest": "1bfed043604ac0d06526d8aea6a46a57",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.8",
            "size": 429923,
            "upload_time": "2024-11-20T02:41:36",
            "upload_time_iso_8601": "2024-11-20T02:41:36.729207Z",
            "url": "https://files.pythonhosted.org/packages/11/91/390532baa25f1e594fee7e17271b298853e26ebcacb07daf892076c5db70/quboassist-0.0.19-cp311-cp311-manylinux_2_34_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "475ba28f05cb8e3325c1778422f1b9b73d5b6e3f73081e8d95ef55e8351969fa",
                "md5": "19ec977e25359746f07fb471b3f27244",
                "sha256": "d235dead29256c1fdd964652a6a8fd28f7c6e892b0f597b568154ff63b873f62"
            },
            "downloads": -1,
            "filename": "quboassist-0.0.19-cp311-none-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "19ec977e25359746f07fb471b3f27244",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.8",
            "size": 267477,
            "upload_time": "2024-11-20T02:43:41",
            "upload_time_iso_8601": "2024-11-20T02:43:41.352000Z",
            "url": "https://files.pythonhosted.org/packages/47/5b/a28f05cb8e3325c1778422f1b9b73d5b6e3f73081e8d95ef55e8351969fa/quboassist-0.0.19-cp311-none-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "73d5cf6e7248b9e6a403dd9a4b80c890d575f07e61456cc962eb2b02d7181f7c",
                "md5": "8dfcb2bae5782ed890e2c7da825dea10",
                "sha256": "95454bf677852f7cfff121d5a141c3d9d05bd0835d47b5666ef03a4bb2cd8fa2"
            },
            "downloads": -1,
            "filename": "quboassist-0.0.19-cp312-cp312-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "8dfcb2bae5782ed890e2c7da825dea10",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.8",
            "size": 366533,
            "upload_time": "2024-11-20T02:41:41",
            "upload_time_iso_8601": "2024-11-20T02:41:41.633442Z",
            "url": "https://files.pythonhosted.org/packages/73/d5/cf6e7248b9e6a403dd9a4b80c890d575f07e61456cc962eb2b02d7181f7c/quboassist-0.0.19-cp312-cp312-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "de990a90e4460f032e6608d970e998b7e0efee1ca9f04beff4621d7dee1899bc",
                "md5": "894b39400fdd252dea9975ba9ef85abf",
                "sha256": "44ed77a1138830316adf72811bb38e925353793376c8b03d1e1c9aff8ea4dbd4"
            },
            "downloads": -1,
            "filename": "quboassist-0.0.19-cp312-cp312-manylinux_2_34_x86_64.whl",
            "has_sig": false,
            "md5_digest": "894b39400fdd252dea9975ba9ef85abf",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.8",
            "size": 429812,
            "upload_time": "2024-11-20T02:41:44",
            "upload_time_iso_8601": "2024-11-20T02:41:44.483430Z",
            "url": "https://files.pythonhosted.org/packages/de/99/0a90e4460f032e6608d970e998b7e0efee1ca9f04beff4621d7dee1899bc/quboassist-0.0.19-cp312-cp312-manylinux_2_34_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "ae978bdd4e394a8d5f79ff08255ab1e4365431e50c0884900166999ca4a20481",
                "md5": "348e7c71e1adf6f550631215f31f521d",
                "sha256": "b6b817d24987234f99b0069c7f5606add52199685afc5854282e9030813ede8b"
            },
            "downloads": -1,
            "filename": "quboassist-0.0.19-cp312-none-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "348e7c71e1adf6f550631215f31f521d",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.8",
            "size": 266868,
            "upload_time": "2024-11-20T02:43:41",
            "upload_time_iso_8601": "2024-11-20T02:43:41.083615Z",
            "url": "https://files.pythonhosted.org/packages/ae/97/8bdd4e394a8d5f79ff08255ab1e4365431e50c0884900166999ca4a20481/quboassist-0.0.19-cp312-none-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "079b29259db79672cad2008c24686c97be6e03b9e442089cafe5e2e1e854efc2",
                "md5": "c19cce27b090fe57bac8c48a31fbc551",
                "sha256": "0e5b41069b071046370387673bdce3f0ebda88bd474e99af3fe94655174f17b8"
            },
            "downloads": -1,
            "filename": "quboassist-0.0.19-cp313-cp313-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "c19cce27b090fe57bac8c48a31fbc551",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.8",
            "size": 366315,
            "upload_time": "2024-11-20T02:41:38",
            "upload_time_iso_8601": "2024-11-20T02:41:38.493188Z",
            "url": "https://files.pythonhosted.org/packages/07/9b/29259db79672cad2008c24686c97be6e03b9e442089cafe5e2e1e854efc2/quboassist-0.0.19-cp313-cp313-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "f0c7f7e53756ea9c23298a84d441ae800bb5fca9f20b72b75e6b9aaea9a4f14a",
                "md5": "51c1fed62d1ab721ec19b77d9f24e9b5",
                "sha256": "66c3c3c7cc63ee235392ee151c8f4102bf8b11b05c23e088be0c1c8728a1eee5"
            },
            "downloads": -1,
            "filename": "quboassist-0.0.19-cp313-cp313-manylinux_2_34_x86_64.whl",
            "has_sig": false,
            "md5_digest": "51c1fed62d1ab721ec19b77d9f24e9b5",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.8",
            "size": 429681,
            "upload_time": "2024-11-20T02:41:48",
            "upload_time_iso_8601": "2024-11-20T02:41:48.180158Z",
            "url": "https://files.pythonhosted.org/packages/f0/c7/f7e53756ea9c23298a84d441ae800bb5fca9f20b72b75e6b9aaea9a4f14a/quboassist-0.0.19-cp313-cp313-manylinux_2_34_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "5d9facab2d1601fe4879c46844f5b70916337faf0cc7efa195233e90be73c552",
                "md5": "58ee01afa4882f881475f2605b404c7b",
                "sha256": "9c0512f823b5cd812a151627e1c11e5a60b776b75f7e281c1cde8021a9658b6e"
            },
            "downloads": -1,
            "filename": "quboassist-0.0.19-cp313-none-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "58ee01afa4882f881475f2605b404c7b",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.8",
            "size": 266715,
            "upload_time": "2024-11-20T02:43:37",
            "upload_time_iso_8601": "2024-11-20T02:43:37.987934Z",
            "url": "https://files.pythonhosted.org/packages/5d/9f/acab2d1601fe4879c46844f5b70916337faf0cc7efa195233e90be73c552/quboassist-0.0.19-cp313-none-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "ee6b53620b127ae159436f11dd5daa090a8c8c5796df31dd6a396f4d9df46b62",
                "md5": "d3f44c6f8424f95e8da9d448e7e4ab4c",
                "sha256": "d44d562ae9bc5676c50757728775a52a4c51eab9fe08c5163066a386f9a14115"
            },
            "downloads": -1,
            "filename": "quboassist-0.0.19-cp38-cp38-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "d3f44c6f8424f95e8da9d448e7e4ab4c",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.8",
            "size": 367665,
            "upload_time": "2024-11-20T02:42:03",
            "upload_time_iso_8601": "2024-11-20T02:42:03.354617Z",
            "url": "https://files.pythonhosted.org/packages/ee/6b/53620b127ae159436f11dd5daa090a8c8c5796df31dd6a396f4d9df46b62/quboassist-0.0.19-cp38-cp38-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "28eb09b1d0f26ee970fd281b03770f840daee6c35861ad1bc002daf1b26eb520",
                "md5": "cb0d304bb506bde6cdafd73e158dcc4c",
                "sha256": "a02a192c6d68cf67672ae846ae3c35083bf82549e65e5473de893f3a6fc2cf1b"
            },
            "downloads": -1,
            "filename": "quboassist-0.0.19-cp38-cp38-manylinux_2_34_x86_64.whl",
            "has_sig": false,
            "md5_digest": "cb0d304bb506bde6cdafd73e158dcc4c",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.8",
            "size": 431012,
            "upload_time": "2024-11-20T02:41:37",
            "upload_time_iso_8601": "2024-11-20T02:41:37.602179Z",
            "url": "https://files.pythonhosted.org/packages/28/eb/09b1d0f26ee970fd281b03770f840daee6c35861ad1bc002daf1b26eb520/quboassist-0.0.19-cp38-cp38-manylinux_2_34_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "844f613849ea55697ac42b0345b5071b09549caef4b97dfd27044a3df539791d",
                "md5": "3cfb9fbe93642ea78a074ff75ef079f1",
                "sha256": "9bb2543c6785bf89bac74be6002c7f0df7b814b041ca961c3149007a8b449747"
            },
            "downloads": -1,
            "filename": "quboassist-0.0.19-cp38-none-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "3cfb9fbe93642ea78a074ff75ef079f1",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.8",
            "size": 268136,
            "upload_time": "2024-11-20T02:43:36",
            "upload_time_iso_8601": "2024-11-20T02:43:36.692814Z",
            "url": "https://files.pythonhosted.org/packages/84/4f/613849ea55697ac42b0345b5071b09549caef4b97dfd27044a3df539791d/quboassist-0.0.19-cp38-none-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "0d07383fae513ec40f3651fda9d3e1785c5f45a966cb46d4b47a35ed03adff40",
                "md5": "61874a2bd422f5fee21abc30f83c1beb",
                "sha256": "d0b50ecc7fbf57905bdca5ba3ba646bc1ff04bbe30894e83f38bb388f30f2c15"
            },
            "downloads": -1,
            "filename": "quboassist-0.0.19-cp39-cp39-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "61874a2bd422f5fee21abc30f83c1beb",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.8",
            "size": 367737,
            "upload_time": "2024-11-20T02:42:10",
            "upload_time_iso_8601": "2024-11-20T02:42:10.322836Z",
            "url": "https://files.pythonhosted.org/packages/0d/07/383fae513ec40f3651fda9d3e1785c5f45a966cb46d4b47a35ed03adff40/quboassist-0.0.19-cp39-cp39-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "860cc59218aaccb5c4bb8b4a7f5312920cce4f9d7039fd4b5afeda7c1653f2c5",
                "md5": "4f44ec267bf7e8c0951326524d674f45",
                "sha256": "c02bb6f727c017bb61cd068de0703fa0b6c84edafcf267a1d89ce7997c4dc5f5"
            },
            "downloads": -1,
            "filename": "quboassist-0.0.19-cp39-cp39-manylinux_2_34_x86_64.whl",
            "has_sig": false,
            "md5_digest": "4f44ec267bf7e8c0951326524d674f45",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.8",
            "size": 431249,
            "upload_time": "2024-11-20T02:41:39",
            "upload_time_iso_8601": "2024-11-20T02:41:39.526346Z",
            "url": "https://files.pythonhosted.org/packages/86/0c/c59218aaccb5c4bb8b4a7f5312920cce4f9d7039fd4b5afeda7c1653f2c5/quboassist-0.0.19-cp39-cp39-manylinux_2_34_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "cb64daa8ade8ac50513783327241e1c025629a081825ffe03b3b40ba275b429b",
                "md5": "e9ccb29c2ccee0323023559922a7e669",
                "sha256": "c76eb27d78d88059cf921fa1cb0e1de622eda33a72376b9132f8a765f7a33aa7"
            },
            "downloads": -1,
            "filename": "quboassist-0.0.19-cp39-none-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "e9ccb29c2ccee0323023559922a7e669",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.8",
            "size": 268046,
            "upload_time": "2024-11-20T02:42:40",
            "upload_time_iso_8601": "2024-11-20T02:42:40.225492Z",
            "url": "https://files.pythonhosted.org/packages/cb/64/daa8ade8ac50513783327241e1c025629a081825ffe03b3b40ba275b429b/quboassist-0.0.19-cp39-none-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-11-20 02:41:36",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "enomotokan",
    "github_project": "quboassist",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "requirements": [],
    "lcname": "quboassist"
}
        
Elapsed time: 0.41335s