diff --git a/doc/source/api-reference/qibo.rst b/doc/source/api-reference/qibo.rst index 8a3fe4f245..a4c0491877 100644 --- a/doc/source/api-reference/qibo.rst +++ b/doc/source/api-reference/qibo.rst @@ -194,23 +194,6 @@ Iterative Quantum Amplitude Estimation (IQAE) :member-order: bysource -Double Bracket Iteration algorithm for Diagonalization -"""""""""""""""""""""""""""""""""""""""""""""""""""""" - -The Double Bracket Flow (DBF) has been presented `here `_ -as a novel strategy for preparing eigenstates of a quantum system. We implement in -Qibo a discretized version of the algorithm, which executes sequential Double -Bracket Iterations. - -.. autoclass:: qibo.models.dbi.double_bracket.DoubleBracketGeneratorType - :members: - :member-order: bysource - -.. autoclass:: qibo.models.dbi.double_bracket.DoubleBracketIteration - :members: - :member-order: bysource - - .. _timeevolution: Time evolution diff --git a/doc/source/code-examples/tutorials/dbi/README.md b/doc/source/code-examples/tutorials/dbi/README.md deleted file mode 120000 index 50b9e9eaec..0000000000 --- a/doc/source/code-examples/tutorials/dbi/README.md +++ /dev/null @@ -1 +0,0 @@ -../../../../../examples/dbi/README.md \ No newline at end of file diff --git a/doc/source/code-examples/tutorials/dbi/dbi_tutorial_basic_intro.ipynb b/doc/source/code-examples/tutorials/dbi/dbi_tutorial_basic_intro.ipynb deleted file mode 120000 index 79ea4d0ea8..0000000000 --- a/doc/source/code-examples/tutorials/dbi/dbi_tutorial_basic_intro.ipynb +++ /dev/null @@ -1 +0,0 @@ -../../../../../examples/dbi/dbi_tutorial_basic_intro.ipynb \ No newline at end of file diff --git a/examples/dbi/README.md b/examples/dbi/README.md deleted file mode 100644 index 76640ff99f..0000000000 --- a/examples/dbi/README.md +++ /dev/null @@ -1,58 +0,0 @@ -# Double-bracket quantum algorithms - -Qibo features a model implementing double-bracke quantum algorithms (DBQAs) which are helpful for approximating eigenstates based on the ability to run the evolution under the input Hamiltonian. - -More specifically, given a Hamiltonian $H_0$, how can we find a circuit which after applying to the reference state (usually $|0\rangle^{\otimes L}$ for $L$ qubits) will approximate an eigenstate? - -A standard way is to run variational quantum circuits. For example, Qibo already features the `VQE` model [2] which provides the implementation of the variational quantum eigensolver framework. -DBQAs allow to go beyond VQE in that they take a different approach to compiling the quantum circuit approximating the eigenstate. - -## What is the unitary of DBQA? - -Given $H_0$ we begin by assuming that we were given a diagonal and hermitian operator $D_0$ and a time $s_0$. -The `dbi` module provides numerical strategies for selecting them. -For any such choice we define the bracket -$$ W_0 = [D_0, H_0]$$ -and the double-bracket rotation (DBR) of the input Hamiltonian to time $s$ -$$H_0(s) = e^{sW} H e^{- s W}$$ - -### Why are double-bracket rotations useful? -We can show that the magnitude of the off-diagonal norms will decrease. -For this let us set the notation that $\sigma(A)$ is the restriction to the off-diagonal of the matrix A. -In `numpy` this can be implemented by `\sigma(A) = A-np.diag(A)`. In Qibo we implement this as -https://github.com/qiboteam/qibo/blob/8c9c610f5f2190b243dc9120a518a7612709bdbc/src/qibo/models/dbi/double_bracket.py#L145-L147 -which is part of the basic `DoubleBracketIteration` class in the `dbi` module. - -With this notation we next use the Hilbert-Schmidt scalar product and norm to measure the progress of diagonalization - $$||\sigma(H_0(s))||^2- ||\sigma (H_0 )||^2= -2s \langle W, [H,\sigma(H)\rangle+O(s^2)$$ -This equation tells us that as long as the scalar product $\langle W, [H,\sigma(H)\rangle$ is positive then after the DBR the magnitude of the off-diagonal couplings in $H_0(s)$ is less than in $H_0$. - -For the implementation of the DBR unitary $U_0(s) = e^{-s W_0}$ see -https://github.com/qiboteam/qibo/blob/363a6e5e689e5b907a7602bd1cc8d9811c60ee69/src/qibo/models/dbi/double_bracket.py#L68 - -### How to choose $D$? - -For theoretical considerations the canonical bracket is useful. -For this we need the notation of the dephasing channel $\Delta(H)$ which is equivalent to `np.diag(h)`. - $M = [\Delta(H),\sigma(H)]= [H,\sigma(H)]= [\Delta(H),H]$ - The canonical bracket appears on its own in the monotonicity relation above and gives an unconditional reduction of the magnitude of the off-diagonal terms - $$||\sigma(H_0(s))||^2- ||\sigma (H_0 )||^2= -2s ||M||^2+O(s^2)$$ -- the multi qubit Pauli Z generator with $Z(\mu) = (Z_1)^{\mu_1}\ldots (Z_L)^{\mu_L}$ where we optimize over all binary strings $\mu\in \{0,1\}^L$ -- the magnetic field $D = \sum_i B_i Z_i$ -- the two qubit Ising model $D = \sum_i B_i Z_i + \sum_{i,j} J_{i,j} Z_i Z_j$, please follow the tutorial by Matteo and use the QIBO ising model for that with $h=0$ - - -### How to choose s? - -The theory above shows that in generic cases the DBR will have a linear diagonalization effect (as quantified by $||\sigma(H_0(s))||$). -This can be further expanded with Taylor expansion and the Qibo implementation comes with methods for fitting the first local minimum. -Additionally a grid search for the optimal step is provided for an exhaustive evaluation and hyperopt can be used for a more efficient 'unstructured' optimization; additionally simulated annealing is provided which sometimes outperforms hyperopt (and grid search), see example notebooks. -The latter methods may output DBR durations $s_k$ which correspond to secondary local minima. - - - - - -[1] https://arxiv.org/abs/2206.11772 - -[2] https://github.com/qiboteam/vqe-sun diff --git a/examples/dbi/dbi_tutorial_basic_intro.ipynb b/examples/dbi/dbi_tutorial_basic_intro.ipynb deleted file mode 100644 index 5a722341ea..0000000000 --- a/examples/dbi/dbi_tutorial_basic_intro.ipynb +++ /dev/null @@ -1,782 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "2a33581d", - "metadata": {}, - "source": [ - "## Double-Bracket Iteration diagonalization algorithm\n", - "\n", - "In this example we present the `Qibo`'s implementation of the Double-Bracket Iteration (DBI) algorithm, which can be used to prepare the eigenstates of a quantum system. \n", - "\n", - "#### The initial setup\n", - "\n", - "At first we import some useful packages." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "62d9723f", - "metadata": {}, - "outputs": [], - "source": [ - "# uncomment this line if seaborn is not installed\n", - "# !python -m pip install seaborn" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "b80b4738", - "metadata": {}, - "outputs": [], - "source": [ - "from copy import deepcopy\n", - "\n", - "import numpy as np\n", - "import matplotlib.pyplot as plt\n", - "import seaborn as sns\n", - "\n", - "import optuna\n", - "\n", - "from qibo import hamiltonians, set_backend\n", - "from qibo.models.dbi.double_bracket import DoubleBracketGeneratorType, DoubleBracketIteration, DoubleBracketScheduling" - ] - }, - { - "cell_type": "markdown", - "id": "a5e25f51", - "metadata": {}, - "source": [ - "Here we define a simple plotting function useful to keep track of the diagonalization process." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "933d9a00", - "metadata": {}, - "outputs": [], - "source": [ - "def visualize_matrix(matrix, title=\"\"):\n", - " \"\"\"Visualize hamiltonian in a heatmap form.\"\"\"\n", - " fig, ax = plt.subplots(figsize=(5,5))\n", - " ax.set_title(title)\n", - " try:\n", - " im = ax.imshow(np.absolute(matrix), cmap=\"inferno\")\n", - " except TypeError:\n", - " im = ax.imshow(np.absolute(matrix.get()), cmap=\"inferno\")\n", - " fig.colorbar(im, ax=ax)\n", - "\n", - "def visualize_drift(h0, h):\n", - " \"\"\"Visualize drift of the evolved hamiltonian w.r.t. h0.\"\"\"\n", - " fig, ax = plt.subplots(figsize=(5,5))\n", - " ax.set_title(r\"Drift: $|\\hat{H}_0 - \\hat{H}_{\\ell}|$\")\n", - " try:\n", - " im = ax.imshow(np.absolute(h0 - h), cmap=\"inferno\")\n", - " except TypeError:\n", - " im = ax.imshow(np.absolute((h0 - h).get()), cmap=\"inferno\")\n", - "\n", - " fig.colorbar(im, ax=ax)\n", - "\n", - "def plot_histories(histories, labels):\n", - " \"\"\"Plot off-diagonal norm histories over a sequential evolution.\"\"\"\n", - " colors = sns.color_palette(\"inferno\", n_colors=len(histories)).as_hex()\n", - " plt.figure(figsize=(5,5*6/8))\n", - " for i, (h, l) in enumerate(zip(histories, labels)):\n", - " plt.plot(h, lw=2, color=colors[i], label=l, marker='.')\n", - " plt.legend()\n", - " plt.xlabel(\"Iterations\")\n", - " plt.ylabel(r\"$\\| \\sigma(\\hat{H}) \\|^2$\")\n", - " plt.title(\"Loss function histories\")\n", - " plt.grid(True)\n", - " plt.show()" - ] - }, - { - "cell_type": "markdown", - "id": "4efd4a97", - "metadata": {}, - "source": [ - "We need to define a target hamiltonian which we aim to diagonalize. As an example, we consider the Transverse Field Ising Model (TFIM):\n", - "$$ H_{\\rm TFIM} = - \\sum_{q=0}^{N}\\bigl( Z_i Z_{i+1} + h X_i \\bigr),$$\n", - "which is already implemented in `Qibo`. For this tutorial we set $N=6$ and $h=3$." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "7125940f", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[Qibo 0.2.12|INFO|2024-09-06 12:03:17]: Using numpy backend on /CPU:0\n" - ] - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "# set the qibo backend (we suggest qibojit if N >= 20)\n", - "set_backend(\"numpy\")\n", - "\n", - "# hamiltonian parameters\n", - "nqubits = 5\n", - "h = 3\n", - "\n", - "# define the hamiltonian\n", - "h = hamiltonians.TFIM(nqubits=nqubits, h=h)\n", - "\n", - "# vosualize the matrix\n", - "visualize_matrix(h.matrix, title=\"Target hamiltonian\")" - ] - }, - { - "cell_type": "markdown", - "id": "c2ca8392", - "metadata": {}, - "source": [ - "#### The generator of the evolution\n", - "\n", - "The model is implemented following the procedure presented in [1], and the first practical step is to define the generator of the iteration $\\hat{\\mathcal{U}}_{\\ell}$, which executes one diagonalization step $$\\hat{H}_{\\ell} = \\hat{\\mathcal{U}}_{\\ell}^{\\dagger} \\hat{H} \\hat{\\mathcal{U}}_{\\ell}.$$\n", - "In `Qibo`, we define the iteration type through a `DoubleBracketGeneratorType` object, which can be chosen between one of the following:\n", - "- `canonical`: the generator of the iteration at step $k+1$ is defined using the commutator between the off diagonal part $\\sigma(\\hat{H_k})$ and the diagonal part $\\Delta(\\hat{H}_k)$ of the target evolved hamiltonian:\n", - " $$\\hat{\\mathcal{U}}_{k+1}=\\exp\\bigl\\{s[\\Delta(\\hat{H}_k), \\sigma(\\hat{H}_k)]\\bigr\\}.$$ \n", - "- `single_commutator`: the evolution follows a similar procedure of the previous point in this list, but any additional matrix $D_k$ can be used to control the evolution at each step:\n", - " $$ \\hat{\\mathcal{U}}_{k+1}=\\exp\\bigl\\{s[D_k, \\hat{H}_k]\\bigr\\}. $$\n", - "- `group_commutator`: the following group commutator is used to compute the evolution:\n", - " $$ \\hat{\\mathcal{U}}_{k+1}= e^{is\\hat{H_k}} e^{isD_k} e^{-is\\hat{H_k}} e^{-isD_k}, $$\n", - "which approximates the canonical commutator for small $s$.\n", - "\n", - "In order to set one of this evolution generators one can do as follow:" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "1adafc19", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "DoubleBracketGeneratorType.canonical\n", - "DoubleBracketGeneratorType.single_commutator\n", - "DoubleBracketGeneratorType.group_commutator\n", - "DoubleBracketGeneratorType.group_commutator_third_order\n" - ] - } - ], - "source": [ - "# we have a look inside the DoubleBracketGeneratorType class\n", - "for generator in DoubleBracketGeneratorType:\n", - " print(generator)" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "8a4d0e9d", - "metadata": {}, - "outputs": [], - "source": [ - "# here we set the canonical generator\n", - "iterationtype = DoubleBracketGeneratorType.canonical" - ] - }, - { - "cell_type": "markdown", - "id": "a5527622", - "metadata": {}, - "source": [ - "#### The `DoubleBracketIteration` class\n", - "\n", - "A `DoubleBracketIteration` object can be initialize by calling the `qibo.models.double_braket.DoubleBracketIteration` model and passing the target hamiltonian and the generator type we want to use to perform the evolutionary steps." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "9521c464", - "metadata": {}, - "outputs": [], - "source": [ - "dbf = DoubleBracketIteration(hamiltonian=deepcopy(h), mode=iterationtype)" - ] - }, - { - "cell_type": "markdown", - "id": "a262c69f", - "metadata": {}, - "source": [ - "#### `DoubleBracketIteration` features" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "290e5828", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Backend: numpy\n" - ] - } - ], - "source": [ - "# on which qibo backend am I running the algorithm?\n", - "print(f\"Backend: {dbf.backend}\")" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "3e2b9950", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Initial form of the target hamiltonian:\n", - "[[-5.-0.j -3.-0.j -3.-0.j ... -0.-0.j -0.-0.j -0.-0.j]\n", - " [-3.-0.j -1.-0.j -0.-0.j ... -0.-0.j -0.-0.j -0.-0.j]\n", - " [-3.-0.j -0.-0.j -1.-0.j ... -0.-0.j -0.-0.j -0.-0.j]\n", - " ...\n", - " [-0.-0.j -0.-0.j -0.-0.j ... -1.-0.j -0.-0.j -3.-0.j]\n", - " [-0.-0.j -0.-0.j -0.-0.j ... -0.-0.j -1.-0.j -3.-0.j]\n", - " [-0.-0.j -0.-0.j -0.-0.j ... -3.-0.j -3.-0.j -5.-0.j]]\n" - ] - } - ], - "source": [ - "# the initial target hamiltonian is a qibo hamiltonian\n", - "# thus the matrix can be accessed typing h.matrix\n", - "print(f\"Initial form of the target hamiltonian:\\n{dbf.h0.matrix}\")" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "638ba4b5", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "# let's visualize it in a more graphical way\n", - "visualize_matrix(dbf.h0.matrix, r\"$H_0$\")" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "08f0c466", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAcgAAAGiCAYAAABjzlbWAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy80BEi2AAAACXBIWXMAAA9hAAAPYQGoP6dpAABFYklEQVR4nO3df1hUVf4H8PeAMKgwg6gwoKiYLlIKJgSN/VIhwfqWrGyp0aosi2sLVtD2A9fEcjfsh4oWydNqmiVp7LNpmVEEod9yxBwj04g1v7aQOGCygGDAwNzvH8bUyB2YYWYcLr5f+5xn5c65534u8zx8Oueec65MEAQBREREZMLF2QEQERH1R0yQREREIpggiYiIRDBBEhERiWCCJCIiEsEESUREJIIJkoiISAQTJBERkQgmSCIiIhFMkERERCKYIImIyGq5ubkYN24cPDw8EBUVhSNHjpite/LkSSQkJGDcuHGQyWTIycnpU5utra1ITU3F8OHD4enpiYSEBNTW1trztkwwQRIRkVV2796NjIwMZGVl4dixYwgLC0NsbCzq6upE61+6dAnjx4/H2rVroVKp+txmeno63n//fRQUFODAgQOoqanBvHnzHHKPAACBiIjICpGRkUJqaqrx587OTiEgIEDIzs7u9dyxY8cKGzZssLrNhoYGwc3NTSgoKDDWqaioEAAIGo3Ghrsxb5DjUi8RETlKa2sr2tvb7dKWIAiQyWQmx+RyOeRyebe67e3t0Gq1yMzMNB5zcXFBTEwMNBpNn65vSZtarRZ6vR4xMTHGOpMmTcKYMWOg0Whw88039+naPWGCJCKSmNbWVgQFqaDTNdqlPU9PTzQ3N5scy8rKwurVq7vV/fHHH9HZ2Qk/Pz+T435+fvj222/7dH1L2tTpdHB3d4e3t3e3Ojqdrk/X7Q0TJBGRxLS3t0Ona8T//WcDFIrBNrXV1PQTxo9NR3V1NRQKhfG4WO/xWsMESUQkUQrFYJsT5C9tKUwSpDkjRoyAq6trt9mjtbW1Zifg2KNNlUqF9vZ2NDQ0mPQibblubziLlYhIogShwy7FGu7u7ggPD0dxcbHxmMFgQHFxMdRqdZ/uw5I2w8PD4ebmZlKnsrISVVVVfb5ub9iDJCKSKEHohCB02tyGtTIyMrB48WJEREQgMjISOTk5aGlpQVJSEgBg0aJFGDVqFLKzswFcHhL+5ptvjP8+e/YsysvL4enpiQkTJljUplKpRHJyMjIyMuDj4wOFQoHly5dDrVY7ZIIOwARJRERWmj9/Ps6fP49Vq1ZBp9Nh6tSpKCwsNE6yqaqqgovLLwOUNTU1uPHGG40/v/TSS3jppZdwxx13oLS01KI2AWDDhg1wcXFBQkIC2traEBsbi1dffdVh9ykTBEFwWOtERGR3TU1NUCqV0P24zi6TdFQjHkNjY6NFzyCvJexBEhFJVF+eIYq1QeI4SYeIiEgEEyQRgHXr1mH//v3ODqNHUoiRrq7Lk3RsncVq2ySfgYxDrHTNKygowOrVq+Hm5oZTp05h+PDhzg6pGynESFefYOiAYLBxiNXG8wcy9iDpmtbW1oYnn3wSW7duxZ133omsrCxnh9SNFGIkGoiYIOmalpOTg8mTJ+P+++/Hpk2b8M477xjXa/UXUoiRnETosE8hUVzmQUQkMV3LPH6oWQGFwsPGtloxOuA5LvMQwR4kERGRCCZIumq2b98OmUyG77//3uT4F198genTp2Po0KGQyWQoLy+32zXHjRsn+sqeawl/BwOYoQMw6G0sHGI1hwmSetSV1LqKh4cHAgICEBsbi02bNuHixYs2ta/X63Hfffehvr4eGzZswJtvvomxY8fi0KFDWL16NRoaGuxzI1f46KOPIJPJkJ+fL/r5vffei6FDh8JgMDjk+paQQozkXM7YrPxawmUeZJFnn30WQUFB0Ov10Ol0KC0txaOPPor169fjvffeQ2hoaK9t/P73v8eCBQtM3jN3+vRp/Oc//8E//vEP/PGPfzQeP3ToEJ555hksWbKk2wtS7eGrr74CAERERIh+rtVqMXnyZJP9JK82KcRINJAxQZJF5syZY/KHOjMzEyUlJfif//kf3HvvvaioqMDgweJ7Qra0tGDo0KFwdXWFq6uryWd1dXUA4JAk2JPjx49DoVBg4sSJ3T7T6XSoqanB3XfffVVjupIUYiQnM3QABtfe6/XWBonif3pSn82aNQtPP/00/vOf/+Ctt94CAKxevRoymQzffPMNHnjgAQwbNgy33norgO7PIJcsWYI77rgDAHDfffdBJpNhxowZWL16NR5//HEAQFBQkHF4t+u8b7/9FlVVVTbF/tVXX+HGG2+ETCbr9plWqwUAhIWF2XQNW0khRnIyQ4d9ColiD5Js8vvf/x4rVqzAxx9/jJSUFOPx++67DxMnTsRzzz0HcyuJ/vSnP2HUqFF47rnn8PDDD+Omm26Cn58f/Pz88O9//xtvv/02NmzYgBEjRgAARo4cCQAICQkxeU2Otdrb21FZWYmFCxfiu+++6/Z5SUkJAFg0bOwoUoiRaKBjgiSbjB49GkqlEqdPnzY5HhYWZnZySRe1Wo22tjY899xzuO222/C73/3O+Nm0adPw9ttvIz4+HuPGjbNrzN988w30ej127NiBHTt2mK3nzOQjhRipP+i0w0J/7sVqDhMk2czT07PbbNZly5Y57Hq27m1x/PhxAJd3qBk1alS3z5ctWwYvLy8olUqr2zYYDGhvb7eorlwuFx0+dXSMNHDIDB2QGWx7UibjEKtZTJBks+bmZvj6+pocCwoKclI0vfvqq6/g6uqKZcuWmcyoBYCffvoJ//3vf43PTQHg/PnzWLJkCUpLSzF69Gi8+uqriI6OFm374MGDmDlzpkVxVFRUYNKkSXaJEQCSkpJw4sQJlJWVcWYrkR0wQZJNfvjhBzQ2NmLChAkmx83NaO0Pjh8/juuuu65b4gEuJy2DwWAydJmamgqVSoXz58/jk08+wf33349Tp07Bx8en2/mTJk3Ctm3bLIrD39/fbjEeOnQIDQ0NkMlk0Ov1oufRAGToAGzsQXKSjnlMkGSTN998EwAQGxtr13bNDT3aw/Hjx3HLLbeIfnby5EkAv8wObW5uxp49e/B///d/GDJkCO69915MmTIFe/fuRVJSUrfzVSoVlixZclVjBIC9e/di7ty5eOWVV5gcryVMkA7FcRjqs5KSEqxZswZBQUFITEy0a9tDhw4FANGddGxZ5qHT6VBXV4cbbrhB9PMrk8+pU6fg6emJ0aNHG+tMmTLFWM8RrI0RAEpLS9HZ2Yk777zTYXERXWvYgySLfPjhh/j222/R0dGB2tpalJSUoKioCGPHjsV7770HDw/b3ihwpfDwcADAX//6VyxYsABubm645557MHToUJuWeXTtTtNT8vH09MR1110H4HIP8so3HCgUCly4cMHqazsqxs7OTtTU1ODTTz/lnqvXGJnQAZlg4yQdbjVnFhMkWWTVqlUAAHd3d/j4+GDKlCnIyclBUlISvLy87H69m266CWvWrEFeXh4KCwthMBhw5swZY8+yr7pmh/aUfCZPnmwc4vX09ERTU5NJnaamJnh6etoUhz1jrK2thYuLC9zc3Lo9C6YBzmAADDYu0+BevmbxfZA0oI0bNw5Llizpc8+qubkZPj4+OHPmjHG5xcyZM7Fo0SLRZ5DO8O9//xtTp07Ft99+izFjxnT73NbfAfU/Xe+DPPvNfVB4udnW1kU9Rl1fwPdBiuAzSKIeeHp6Yu7cucjKysJPP/2Effv24fjx45g7d66zQzM6duwYfvOb3yAwMBDFxcXODoeuosvrIG0vJI4JkqgXr776KmpqajB8+HBkZGRg9+7doks8nKG9vR379+/H7NmzMWPGjG7DwTTAGTrtU0gUn0ES9WLkyJHYv3+/s8MQ5e7u3uNWdETUd0yQNKB1vQHkWsbfwQBm6AAMNq4Z5hCrWUyQREQSJTN02mEvVg6xmsNnkERERCL6XQ/SYDCgpqYGXl5eDt1ujIjoahEEARcvXkRAQIB9N5IXOm3fak5gD9Kcfpcga2pqEBgY6OwwiIjsrrq62mTbQlvJDAabh0hl3CjALIclyNzcXLz44ovQ6XQICwvDyy+/jMjIyF7P69qVJX/qXRjiatsCWCKi/uBSpx4PlO93yK5T5DgOSZC7d+9GRkYG8vLyEBUVhZycHMTGxqKysrLbewOv1DWsOsTVDUMHMUES0cBh98dGhk47zGLlEKs5Dpmks379eqSkpCApKQnXX3898vLyMGTIELz++uuOuBwR0TXp8ixW2wuJs3uCbG9vh1arRUxMzC8XcXFBTEwMNBpNt/ptbW1oamoyKURERM5m9wT5448/orOzE35+fibH/fz8oNPputXPzs6GUqk0Fk7QISKyELeacyinr4PMzMxEY2OjsVRXVzs7JCIiSeAQq2PZPUGOGDECrq6uqK2tNTleW1sLlUrVrb5cLodCoTApRETUv+Xm5mLcuHHw8PBAVFQUjhw50mP9goICTJo0CR4eHpgyZUq3/Y1lMploefHFF411xo0b1+3ztWvXOuT+AAckSHd3d4SHh5u8dsdgMKC4uBhqtdrelyMiunY5aYi1a6VCVlYWjh07hrCwMMTGxqKurk60/qFDh7Bw4UIkJyfjyy+/RHx8POLj43HixAljnXPnzpmU119/HTKZDAkJCSZtPfvssyb1li9fbnX8lnLIEGtGRgb+8Y9/4I033kBFRQUeeughtLS09JsXzBIRDQQyg/DzZgG2FMHq61q7UmHjxo2Ii4vD448/jpCQEKxZswbTpk3DK6+8YqyjUqlMyt69ezFz5kyMHz/epC0vLy+TekOHDrU6fks5JEHOnz8fL730ElatWoWpU6eivLwchYWF3SbuEBFR/3DlaoK2tjbRetauVAAAjUZjUh8AYmNjzdavra3FBx98gOTk5G6frV27FsOHD8eNN96IF198ER0djnsbicN20klLS0NaWpqjmiciIkMnYOtOcT8PsV65giArKwurV6/uVr2nlQrffvut6CV0Op3FKxsA4I033oCXlxfmzZtncvzhhx/GtGnT4OPjg0OHDiEzMxPnzp3D+vXre7zFvup3e7ESEZGFBDskyJ83K6+urjaZJCmXy21suO9ef/11JCYmwsPDw+R4RkaG8d+hoaFwd3fHn/70J2RnZzskXiZIIiKyeBWBtSsVgMvPFy2t/7//+7+orKzE7t27e40lKioKHR0d+P777xEcHNxrfWs5fR0kERH1jUww2KVYoy8rFdRqtUl9ACgqKhKtv3XrVoSHhyMsLKzXWMrLy+Hi4tLrHt99xR4kEZFU2fEZpDUyMjKwePFiREREIDIyEjk5OSYrFRYtWoRRo0YhOzsbAPDII4/gjjvuwLp163D33Xdj165dOHr0KF577TWTdpuamlBQUIB169Z1u6ZGo0FZWRlmzpwJLy8vaDQapKen48EHH8SwYcP6cOO9Y4IkIiKrzJ8/H+fPn8eqVaug0+kwdepUk5UKVVVVJi+Gnj59OvLz87Fy5UqsWLECEydOxJ49ezB58mSTdnft2gVBELBw4cJu15TL5di1axdWr16NtrY2BAUFIT093eS5pL3JBEGwfhGMAzU1NUGpVGJP+Fy+7oqIBoSWDj3itXvR2Nhol93Cuv5O/vjhRCiGutrWVksnRsw5ZbfYBhL2IImIpMpgsMP7IG0dox24OEmHiIhIBHuQREQSdXmrONvbIHFMkEREUmUw2GEWKxOkORxiJSIiEsEeJBGRVLEH6VBMkEREUsUE6VAcYiUiIhLBHiQRkVQJnUAfXnhs2gZ7kOYwQRIRSRSXeTgWh1iJiIhEsAdJRCRVnKTjUEyQRERSxQTpUBxiJSIiEsEeJBGRVBkE23uAts6CHcCYIImIpMog2GGIlQnSHA6xEhERiWAPkohIquzywmT2IM1hgiQikiomSIfiECsREZEI9iCJiKSKk3QcigmSiEiqBAMg2DjEKjBBmsMhViIiIhHsQRIRSZVghyFW9iDNYoIkIpIqPoN0KA6xEhERiWAPkohIqtiDdCgmSCIiiRIMl4utbZA4DrESERGJYA+SiEiqOMTqUEyQRERSZYAdEqQ9AhmYOMRKREQkwu4JcvXq1ZDJZCZl0qRJ9r4MEREZ7FRIlEOGWG+44QZ88sknv1xkEEdyiYjsTvi52NoGiXJI5ho0aBBUKpVFddva2tDW1mb8uampyREhERERWcUhzyBPnTqFgIAAjB8/HomJiaiqqjJbNzs7G0ql0lgCAwMdERIR0YAjGGR2KSTO7gkyKioK27dvR2FhITZv3owzZ87gtttuw8WLF0XrZ2ZmorGx0Viqq6vtHRIR0cDEZ5AOZfcEOWfOHNx3330IDQ1FbGws9u/fj4aGBrzzzjui9eVyORQKhUkhIqL+LTc3F+PGjYOHhweioqJw5MiRHusXFBRg0qRJ8PDwwJQpU7B//36Tz5csWdJtgmdcXJxJnfr6eiQmJkKhUMDb2xvJyclobm62+711cfgyD29vb/zmN7/Bd9995+hLERFdWwQZYLCx9OGFy7t370ZGRgaysrJw7NgxhIWFITY2FnV1daL1Dx06hIULFyI5ORlffvkl4uPjER8fjxMnTpjUi4uLw7lz54zl7bffNvk8MTERJ0+eRFFREfbt24eDBw9i6dKlVsdvKYcnyObmZpw+fRr+/v6OvhQR0TXFWc8g169fj5SUFCQlJeH6669HXl4ehgwZgtdff120/saNGxEXF4fHH38cISEhWLNmDaZNm4ZXXnnFpJ5cLodKpTKWYcOGGT+rqKhAYWEhtmzZgqioKNx66614+eWXsWvXLtTU1Fh9D5awe4L8y1/+ggMHDuD777/HoUOH8Nvf/haurq5YuHChvS9FRER20tTUZFJ+vbrg19rb26HVahETE2M85uLigpiYGGg0GtFzNBqNSX0AiI2N7Va/tLQUvr6+CA4OxkMPPYQLFy6YtOHt7Y2IiAjjsZiYGLi4uKCsrMzq+7WE3RPkDz/8gIULFyI4OBj3338/hg8fjsOHD2PkyJH2vhQR0bXN1uHVrgIgMDDQZEVBdna26CV//PFHdHZ2ws/Pz+S4n58fdDqd6Dk6na7X+nFxcdixYweKi4vx/PPP48CBA5gzZw46OzuNbfj6+pq0MWjQIPj4+Ji9rq3svg5y165d9m6SiIjECH17hmjaxuX/q66uNpkkKZfLbWvXSgsWLDD+e8qUKQgNDcV1112H0tJSREdHX9VYunAvViIi6raawFyCHDFiBFxdXVFbW2tyvLa21uwGMSqVyqr6ADB+/HiMGDHCOMFTpVJ1mwTU0dGB+vp6izemsRYTJBGRRDljko67uzvCw8NRXFxsPGYwGFBcXAy1Wi16jlqtNqkPAEVFRWbrA5cf1124cME4wVOtVqOhoQFardZYp6SkBAaDAVFRUVbdg6W4SSoRkVQZXIzPEPvehvWbsWZkZGDx4sWIiIhAZGQkcnJy0NLSgqSkJADAokWLMGrUKONzzEceeQR33HEH1q1bh7vvvhu7du3C0aNH8dprrwG4vNrhmWeeQUJCAlQqFU6fPo0nnngCEyZMQGxsLAAgJCQEcXFxSElJQV5eHvR6PdLS0rBgwQIEBATY9jswgwmSiIisMn/+fJw/fx6rVq2CTqfD1KlTUVhYaJyIU1VVBReXXwYop0+fjvz8fKxcuRIrVqzAxIkTsWfPHkyePBkA4OrqiuPHj+ONN95AQ0MDAgICMHv2bKxZs8ZkqHfnzp1IS0tDdHQ0XFxckJCQgE2bNjnsPmWCIPSrvdybmpqgVCqxJ3wuhg5yc3Y4REQ2a+nQI167F42NjXbZLazr72Td0wooPGzrQTa1CvBd02S32AYS9iCJiCRKEGQQbJzF2r+6SP0LJ+kQERGJYA+SiEiqnDRJ51rBBElEJFGCATa/z1FggjSLQ6xEREQi2IMkIpIqQWb7EKutW9UNYEyQREQSZZ9ZrEyQ5nCIlYiISAR7kEREUmVwuVxsasM+oQxETJBERBLVl83GxdogcRxiJSIiEsEeJBGRRHGSjmMxQRIRSRWfQToUh1iJiIhEsAdJRCRRnKTjWEyQREQSxWeQjsUhViIiIhHsQRIRSRUn6TgUEyQRkUTxGaRjcYiViIhIBHuQREQSxUk6jsUESUQkVYIdnkEK9gllIOIQKxERkQj2IImIJIqTdByLCZKISKIEwfZniAKHWM3iECsREZEI9iCJiKTKDkOs4BCrWUyQREQSJQguEATbBgIFjrGaxSFWIiIiEexBEhFJlUFm+xAph1jNYoIkIpIo7qTjWBxiJSIiEmF1gjx48CDuueceBAQEQCaTYc+ePSafC4KAVatWwd/fH4MHD0ZMTAxOnTplr3iJiOhnXRsF2FpInNUJsqWlBWFhYcjNzRX9/IUXXsCmTZuQl5eHsrIyDB06FLGxsWhtbbU5WCIi+kXXLFZbC4mz+hnknDlzMGfOHNHPBEFATk4OVq5ciblz5wIAduzYAT8/P+zZswcLFiywLVoiIqKrxK7/6XDmzBnodDrExMQYjymVSkRFRUGj0Yie09bWhqamJpNCRES94xCrY9k1Qep0OgCAn5+fyXE/Pz/jZ1fKzs6GUqk0lsDAQHuGREQ0YHXNYrW1kDinDz5nZmaisbHRWKqrq50dEhER9SI3Nxfjxo2Dh4cHoqKicOTIkR7rFxQUYNKkSfDw8MCUKVOwf/9+42d6vR5PPvkkpkyZgqFDhyIgIACLFi1CTU2NSRvjxo2DTCYzKWvXrnXI/QF2TpAqlQoAUFtba3K8trbW+NmV5HI5FAqFSSEiot45qwe5e/duZGRkICsrC8eOHUNYWBhiY2NRV1cnWv/QoUNYuHAhkpOT8eWXXyI+Ph7x8fE4ceIEAODSpUs4duwYnn76aRw7dgz/+te/UFlZiXvvvbdbW88++yzOnTtnLMuXL7c6fkvZNUEGBQVBpVKhuLjYeKypqQllZWVQq9X2vBQR0TVPEOzwDLIPCXL9+vVISUlBUlISrr/+euTl5WHIkCF4/fXXRetv3LgRcXFxePzxxxESEoI1a9Zg2rRpeOWVVwBcnqtSVFSE+++/H8HBwbj55pvxyiuvQKvVoqqqyqQtLy8vqFQqYxk6dKj1vzgLWZ0gm5ubUV5ejvLycgCXJ+aUl5ejqqoKMpkMjz76KP72t7/hvffew9dff41FixYhICAA8fHxdg6diIjs5crJkm1tbaL12tvbodVqTSZjuri4ICYmxuxkTI1GY1IfAGJjY83WB4DGxkbIZDJ4e3ubHF+7di2GDx+OG2+8ES+++CI6OjosvEPrWb3M4+jRo5g5c6bx54yMDADA4sWLsX37djzxxBNoaWnB0qVL0dDQgFtvvRWFhYXw8PCwX9RERGTXt3lcOUEyKysLq1ev7lb/xx9/RGdnp+hkzG+//Vb0GjqdzqrJm62trXjyySexcOFCk8duDz/8MKZNmwYfHx8cOnQImZmZOHfuHNavX9/rffaF1QlyxowZPb4eRSaT4dlnn8Wzzz5rU2BERNQzeyzT6Dq/urraJBnJ5XKb2u0rvV6P+++/H4IgYPPmzSafdXXIACA0NBTu7u7405/+hOzsbIfE6/RZrERE5HxXTpY0l3BGjBgBV1dXqyZjqlQqi+p3Jcf//Oc/KCoq6nXSZlRUFDo6OvD999/3cnd9wwRJRCRRzpjF6u7ujvDwcJPJmAaDAcXFxWYnY6rVapP6AFBUVGRSvys5njp1Cp988gmGDx/eayzl5eVwcXGBr6+vVfdgKb7uiohIopz1uquMjAwsXrwYERERiIyMRE5ODlpaWpCUlAQAWLRoEUaNGoXs7GwAwCOPPII77rgD69atw913341du3bh6NGjeO211wBcTo6/+93vcOzYMezbtw+dnZ3G55M+Pj5wd3eHRqNBWVkZZs6cCS8vL2g0GqSnp+PBBx/EsGHDbPodmMMESUREVpk/fz7Onz+PVatWQafTYerUqSgsLDROxKmqqoKLyy8DlNOnT0d+fj5WrlyJFStWYOLEidizZw8mT54MADh79izee+89AMDUqVNNrvXpp59ixowZkMvl2LVrF1avXo22tjYEBQUhPT3d5LmkvcmEnmbcOEFTUxOUSiX2hM/F0EFuzg6HiMhmLR16xGv3orGx0S6boXT9nTx+bzi83Gzr51zUdyD0Pa3dYhtI2IMkIpIoZw2xXis4SYeIiEgEe5BERBJln40C2E8yhwmSiEiiDIIMBhuHSG09fyDjfzoQERGJYA+SiEiq7LDVHGw9fwBjgiQikijOYnUsDrESERGJYA+SiEii2IN0LCZIIiKJYoJ0LA6xEhERiWAPkohIogyCCww2LvS39fyBjAmSiEiiBMH2ZR4cYjWP/+lAREQkgj1IIiKJ4iQdx2KCJCKSKCZIx+IQKxERkQj2IImIJIpv83AsJkgiIoniEKtjcYiViIhIBHuQREQSxR6kYzFBEhFJFJ9BOhaHWImIiESwB0lEJFGCYPsQqSDYKZgBiAmSiEii+AzSsTjESkREJII9SCIiiRLsMEmHPUjzmCCJiCSKQ6yOxSFWIiIiEexBEhFJFHuQjsUESUQkUdwowLE4xEpERCSCPUgiIoniEKtjWd2DPHjwIO655x4EBARAJpNhz549Jp8vWbIEMpnMpMTFxdkrXiIi+lnXEKuthcRZnSBbWloQFhaG3Nxcs3Xi4uJw7tw5Y3n77bdtCpKIiOhqs3qIdc6cOZgzZ06PdeRyOVQqlUXttbW1oa2tzfhzU1OTtSEREV2TBMggwMYhVhvPH8gcMkmntLQUvr6+CA4OxkMPPYQLFy6YrZudnQ2lUmksgYGBjgiJiGjA6XoGaWshcXZPkHFxcdixYweKi4vx/PPP48CBA5gzZw46OztF62dmZqKxsdFYqqur7R0SERHZWW5uLsaNGwcPDw9ERUXhyJEjPdYvKCjApEmT4OHhgSlTpmD//v0mnwuCgFWrVsHf3x+DBw9GTEwMTp06ZVKnvr4eiYmJUCgU8Pb2RnJyMpqbm+1+b13sniAXLFiAe++9F1OmTEF8fDz27duHL774AqWlpaL15XI5FAqFSSEiot45a5LO7t27kZGRgaysLBw7dgxhYWGIjY1FXV2daP1Dhw5h4cKFSE5Oxpdffon4+HjEx8fjxIkTxjovvPACNm3ahLy8PJSVlWHo0KGIjY1Fa2ursU5iYiJOnjyJoqIi7Nu3DwcPHsTSpUut/8VZyOHrIMePH48RI0bgu+++c/SliIiuKc4aYl2/fj1SUlKQlJSE66+/Hnl5eRgyZAhef/110fobN25EXFwcHn/8cYSEhGDNmjWYNm0aXnnllZ/vQ0BOTg5WrlyJuXPnIjQ0FDt27EBNTY1xpURFRQUKCwuxZcsWREVF4dZbb8XLL7+MXbt2oaamps+/w544PEH+8MMPuHDhAvz9/R19KSIi6qOmpiaT8uvJk7/W3t4OrVaLmJgY4zEXFxfExMRAo9GInqPRaEzqA0BsbKyx/pkzZ6DT6UzqKJVKREVFGetoNBp4e3sjIiLCWCcmJgYuLi4oKyvr2033wuoE2dzcjPLycpSXlwO4fGPl5eWoqqpCc3MzHn/8cRw+fBjff/89iouLMXfuXEyYMAGxsbH2jp2I6JpmgB2GWH+exRoYGGgyYTI7O1v0mj/++CM6Ozvh5+dnctzPzw86nU70HJ1O12P9rv/vrY6vr6/J54MGDYKPj4/Z69rK6mUeR48excyZM40/Z2RkAAAWL16MzZs34/jx43jjjTfQ0NCAgIAAzJ49G2vWrIFcLrdf1EREZFfV1dUmc0D4N7sPCXLGjBkQBMHs5x999JFNARERkWXsudWcpZMkR4wYAVdXV9TW1pocr62tNbv+XaVS9Vi/6/9ra2tNHsfV1tZi6tSpxjpXTgLq6OhAfX29xevurcXNyomIJMoAmV2KNdzd3REeHo7i4uJf4jAYUFxcDLVaLXqOWq02qQ8ARUVFxvpBQUFQqVQmdZqamlBWVmaso1ar0dDQAK1Wa6xTUlICg8GAqKgoq+7BUtysnIiIrJKRkYHFixcjIiICkZGRyMnJQUtLC5KSkgAAixYtwqhRo4zPMR955BHccccdWLduHe6++27s2rULR48exWuvvQYAkMlkePTRR/G3v/0NEydORFBQEJ5++mkEBAQgPj4eABASEoK4uDikpKQgLy8Per0eaWlpWLBgAQICAhxyn0yQRERSZY+dcPpw/vz583H+/HmsWrUKOp0OU6dORWFhoXGSTVVVFVxcfhmgnD59OvLz87Fy5UqsWLECEydOxJ49ezB58mRjnSeeeAItLS1YunQpGhoacOutt6KwsBAeHh7GOjt37kRaWhqio6Ph4uKChIQEbNq0yYab75lM6OmBohM0NTVBqVRiT/hcDB3k5uxwiIhs1tKhR7x2LxobG+2yGUrX38l3pv4OQ1xt+zt5qVOP+8v/abfYBhI+gyQiIhLBIVYiIoniC5MdiwmSiEiiDD8XW9sgcRxiJSIiEsEeJBGRRHGI1bGYIImIJMogoE+vq7qyDRLHIVYiIiIR7EESEUmUABkEK7eKE2uDxDFBEhFJVNcrq2xtg8RxiJWIiEgEe5BERBJ1eZKO7W2QOCZIIiKJ4jNIx+IQKxERkQj2IImIJIqTdByLCZKISKIE4XKxtQ0SxyFWIiIiEexBEhFJlAAZDJyk4zBMkEREEsXNyh2LQ6xEREQi2IMkIpIozmJ1LCZIIiKJEn4utrZB4jjESkREJII9SCIiieIQq2MxQRIRSZTh52JrGySOQ6xEREQi2IMkIpIoroN0LCZIIiKJ4jNIx+IQKxERkQj2IImIJIrrIB2LCZKISKI4xOpYHGIlIiISwR4kEZFEcR2kYzFBEhFJFJd5OJZVQ6zZ2dm46aab4OXlBV9fX8THx6OystKkTmtrK1JTUzF8+HB4enoiISEBtbW1dg2aiIjI0axKkAcOHEBqaioOHz6MoqIi6PV6zJ49Gy0tLcY66enpeP/991FQUIADBw6gpqYG8+bNs3vgRETXOgG/DLP2tXAWq3lWDbEWFhaa/Lx9+3b4+vpCq9Xi9ttvR2NjI7Zu3Yr8/HzMmjULALBt2zaEhITg8OHDuPnmm+0XORHRNU6AHYZYwSFWc2yaxdrY2AgA8PHxAQBotVro9XrExMQY60yaNAljxoyBRqMRbaOtrQ1NTU0mhYiIyNn6nCANBgMeffRR3HLLLZg8eTIAQKfTwd3dHd7e3iZ1/fz8oNPpRNvJzs6GUqk0lsDAwL6GRER0TTEI9ikkrs8JMjU1FSdOnMCuXbtsCiAzMxONjY3GUl1dbVN7RETXCsFOxVHq6+uRmJgIhUIBb29vJCcno7m5ucdzepvo+dVXX2HhwoUIDAzE4MGDERISgo0bN5q0UVpaCplM1q2Y66iZ06dlHmlpadi3bx8OHjyI0aNHG4+rVCq0t7ejoaHBpBdZW1sLlUol2pZcLodcLu9LGERE1I8lJibi3LlzxkmdSUlJWLp0KfLz882ek56ejg8++AAFBQVQKpVIS0vDvHnz8PnnnwO4/CjP19cXb731FgIDA3Ho0CEsXboUrq6uSEtLM2mrsrISCoXC+LOvr69V8VuVIAVBwPLly/Huu++itLQUQUFBJp+Hh4fDzc0NxcXFSEhIMAZYVVUFtVptVWBERNQze241d+X8D1s7LxUVFSgsLMQXX3yBiIgIAMDLL7+Mu+66Cy+99BICAgK6nWPJRM8//OEPJueMHz8eGo0G//rXv7olSF9f326P/Kxh1RBramoq3nrrLeTn58PLyws6nQ46nQ4//fQTAECpVCI5ORkZGRn49NNPodVqkZSUBLVazRmsRER2ZusSj1/vxBMYGGgyHyQ7O9um2DQaDby9vY3JEQBiYmLg4uKCsrIy0XP6MtETuJxYuyaL/trUqVPh7++PO++809gDtYZVPcjNmzcDAGbMmGFyfNu2bViyZAkAYMOGDXBxcUFCQgLa2toQGxuLV1991erAiIjo6qmurjYZjrT10ZdOp+s2pDlo0CD4+PiYfRbYl4mehw4dwu7du/HBBx8Yj/n7+yMvLw8RERFoa2vDli1bMGPGDJSVlWHatGkW34PVQ6y98fDwQG5uLnJzc61pmoiIrGTPreYUCoVJgjTnqaeewvPPP99jnYqKCptistSJEycwd+5cZGVlYfbs2cbjwcHBCA4ONv48ffp0nD59Ghs2bMCbb75pcfvci5WISKKcsVn5Y489ZhwxNGf8+PFQqVSoq6szOd7R0YH6+nqzkzatmej5zTffIDo6GkuXLsXKlSt7jTsyMhKfffZZr/V+jQmSiIgsNnLkSIwcObLXemq1Gg0NDdBqtQgPDwcAlJSUwGAwICoqSvQcSyd6njx5ErNmzcLixYvx97//3aK4y8vL4e/vb1HdLkyQREQSJQiXi61tOEJISAji4uKQkpKCvLw86PV6pKWlYcGCBcYZrGfPnkV0dDR27NiByMhIk4mePj4+UCgUWL58uclEzxMnTmDWrFmIjY1FRkaG8dmkq6urMXHn5OQgKCgIN9xwA1pbW7FlyxaUlJTg448/tuoemCCJiCTKABkMNu6lauv5Pdm5cyfS0tIQHR1tnLy5adMm4+d6vR6VlZW4dOmS8VhvEz3/+c9/4vz583jrrbfw1ltvGY+PHTsW33//PQCgvb0djz32GM6ePYshQ4YgNDQUn3zyCWbOnGlV/DLBkpk3V1FTUxOUSiX2hM/F0EFuzg6HiMhmLR16xGv3orGx0aKJML3p+ju5YsxSeLi429RWq6Edz1W9ZrfYBhL2IImIJMoee6lyL1bzmCCJiKTKDs8g+UJI82x63RUREdFAxR4kEZFE9fdJOlLHBElEJFH9eZnHQMAhViIiIhHsQRIRSZQztpq7ljBBEhFJFJd5OBaHWImIiESwB0lEJFECbF/GyA6keUyQREQSdXmI1cZlHsyQZnGIlYiISAR7kEREEsV1kI7FBElEJFFc5uFYHGIlIiISwR4kEZFEcYjVsZggiYgkikOsjsUhViIiIhHsQRIRSZRgh63mOMRqHhMkEZFEcScdx+IQKxERkQj2IImIJIpv83AsJkgiIoniMg/H4hArERGRCPYgiYgkiusgHYsJkohIovgM0rE4xEpERCSCPUgiIoniOkjHYoIkIpIoDrE6FodYiYiIRLAHSUQkUVwH6VhMkEREEsVlHo7FIVYiIiIRViXI7Oxs3HTTTfDy8oKvry/i4+NRWVlpUmfGjBmQyWQmZdmyZXYNmoiIfu5BCjYWZ99EP2ZVgjxw4ABSU1Nx+PBhFBUVQa/XY/bs2WhpaTGpl5KSgnPnzhnLCy+8YNegiYjol2UethYSZ9UzyMLCQpOft2/fDl9fX2i1Wtx+++3G40OGDIFKpbKozba2NrS1tRl/bmpqsiYkIiIih7DpGWRjYyMAwMfHx+T4zp07MWLECEyePBmZmZm4dOmS2Tays7OhVCqNJTAw0JaQiIiuGYKtw6t2mAU7kPU5QRoMBjz66KO45ZZbMHnyZOPxBx54AG+99RY+/fRTZGZm4s0338SDDz5otp3MzEw0NjYaS3V1dV9DIiK6pnQt87C1OEp9fT0SExOhUCjg7e2N5ORkNDc393hOa2srUlNTMXz4cHh6eiIhIQG1tbUmda6c5yKTybBr1y6TOqWlpZg2bRrkcjkmTJiA7du3Wx1/n5d5pKam4sSJE/jss89Mji9dutT47ylTpsDf3x/R0dE4ffo0rrvuum7tyOVyyOXyvoZBRET9VGJiIs6dO2ecs5KUlISlS5ciPz/f7Dnp6en44IMPUFBQAKVSibS0NMybNw+ff/65Sb1t27YhLi7O+LO3t7fx32fOnMHdd9+NZcuWYefOnSguLsYf//hH+Pv7IzY21uL4+5Qg09LSsG/fPhw8eBCjR4/usW5UVBQA4LvvvhNNkERE1Df2XAd55fwPWzsvFRUVKCwsxBdffIGIiAgAwMsvv4y77roLL730EgICArqd09jYiK1btyI/Px+zZs0CcDkRhoSE4PDhw7j55puNdb29vc3OdcnLy0NQUBDWrVsHAAgJCcFnn32GDRs2WJUgrRpiFQQBaWlpePfdd1FSUoKgoKBezykvLwcA+Pv7W3MpIiLqxeXniIKN5XJbgYGBJvNBsrOzbYpNo9HA29vbmBwBICYmBi4uLigrKxM9R6vVQq/XIyYmxnhs0qRJGDNmDDQajUnd1NRUjBgxApGRkXj99dch/GqsWKPRmLQBALGxsd3a6I1VPcjU1FTk5+dj79698PLygk6nAwAolUoMHjwYp0+fRn5+Pu666y4MHz4cx48fR3p6Om6//XaEhoZaFRgREV091dXVUCgUxp9tffSl0+ng6+trcmzQoEHw8fEx5g6xc9zd3U2GSwHAz8/P5Jxnn30Ws2bNwpAhQ/Dxxx/jz3/+M5qbm/Hwww8b2/Hz8+vWRlNTE3766ScMHjzYonuwKkFu3rwZwOXNAH5t27ZtWLJkCdzd3fHJJ58gJycHLS0tCAwMREJCAlauXGnNZYiIyAL2fN2VQqEwSZDmPPXUU3j++ed7rFNRUWFjVD17+umnjf++8cYb0dLSghdffNGYIO3FqgQp9DLdKTAwEAcOHLApICIisow9dsKx9nVXjz32GJYsWdJjnfHjx0OlUqGurs7keEdHB+rr680+O1SpVGhvb0dDQ4NJL7K2trbHtfVRUVFYs2YN2traIJfLoVKpus18ra2thUKhsLj3CHCzciIissLIkSMxcuTIXuup1Wo0NDRAq9UiPDwcAFBSUgKDwWCcvHml8PBwuLm5obi4GAkJCQCAyspKVFVVQa1Wm71WeXk5hg0bZhwWVqvV2L9/v0mdoqKiHtsQwwRJRCRRws//s7UNRwgJCUFcXBxSUlKQl5cHvV6PtLQ0LFiwwDiD9ezZs4iOjsaOHTsQGRkJpVKJ5ORkZGRkwMfHBwqFAsuXL4darTbOYH3//fdRW1uLm2++GR4eHigqKsJzzz2Hv/zlL8ZrL1u2DK+88gqeeOIJ/OEPf0BJSQneeecdfPDBB1bdAxMkEZFEOWOI1Ro7d+5EWloaoqOj4eLigoSEBGzatMn4uV6vR2Vlpcluaxs2bDDWbWtrQ2xsLF599VXj525ubsjNzUV6ejoEQcCECROwfv16pKSkGOsEBQXhgw8+QHp6OjZu3IjRo0djy5YtVi3xAACZ0NuDxausqakJSqUSe8LnYuggN2eHQ0Rks5YOPeK1e9HY2GjRRJjedP2dvMtzKdxk7ja1pRfasb/5NbvFNpCwB0lEJFF8YbJjMUESEUmUINjhGWT/GkTsV2x6mwcREdFAxR4kEZFEcYjVsZggiYgkikOsjsUhViIiIhHsQRIRSZQA24dI2X80jwmSiEiiDIIAg40pzsAhVrM4xEpERCSCPUgiIonqz3uxDgRMkEREEsVlHo7FIVYiIiIR7EESEUmUAXaYpMMhVrOYIImIJIqzWB2LQ6xEREQi2IMkIpIozmJ1LCZIIiKJ4jNIx+IQKxERkQj2IImIJIo9SMdigiQikig+g3QsDrESERGJYA+SiEiiBDsMsbIHaR4TJBGRRBlkBshktu2mauBurGZxiJWIiEgEe5BERBJlgAAZZ7E6DBMkEZFECT8v9LC1DRLHIVYiIiIR7EESEUmUAbDDECuZwwRJRCRRnMXqWBxiJSIiEsEeJBGRRBlggMzGHiB7kOYxQRIRSRQTpGNxiJWIiEiEVQly8+bNCA0NhUKhgEKhgFqtxocffmj8vLW1FampqRg+fDg8PT2RkJCA2tpauwdNRES/rIO0tZA4qxLk6NGjsXbtWmi1Whw9ehSzZs3C3LlzcfLkSQBAeno63n//fRQUFODAgQOoqanBvHnzHBI4EdG1ziAz2KWQOKueQd5zzz0mP//973/H5s2bcfjwYYwePRpbt25Ffn4+Zs2aBQDYtm0bQkJCcPjwYdx8882ibba1taGtrc34c1NTk7X3QEREZHd9fgbZ2dmJXbt2oaWlBWq1GlqtFnq9HjExMcY6kyZNwpgxY6DRaMy2k52dDaVSaSyBgYF9DYmI6JoiwGDz/zjEap7VCfLrr7+Gp6cn5HI5li1bhnfffRfXX389dDod3N3d4e3tbVLfz88POp3ObHuZmZlobGw0lurqaqtvgojoWiSg0y7FUerr65GYmAiFQgFvb28kJyejubm5x3N6m8uyfft2yGQy0VJXVwcAKC0tFf28p1wkxuplHsHBwSgvL0djYyP++c9/YvHixThw4IC1zRjJ5XLI5fI+n09ERP1TYmIizp07h6KiIuj1eiQlJWHp0qXIz883e056ejo++OADFBQUQKlUIi0tDfPmzcPnn38OAJg/fz7i4uJMzlmyZAlaW1vh6+trcryyshIKhcL485Wf98bqBOnu7o4JEyYAAMLDw/HFF19g48aNmD9/Ptrb29HQ0GDSi6ytrYVKpbL2MkRE1IvLaxjtsw7yyvkftnZeKioqUFhYiC+++AIREREAgJdffhl33XUXXnrpJQQEBHQ7p7Gxsde5LIMHD8bgwYON55w/fx4lJSXYunVrt/Z8fX27jWpaw+Z1kAaDAW1tbQgPD4ebmxuKi4uNn1VWVqKqqgpqtdrWyxAR0RUMdnoKCQCBgYEm80Gys7Ntik2j0cDb29uYHAEgJiYGLi4uKCsrEz2nL3NZduzYgSFDhuB3v/tdt8+mTp0Kf39/3HnnncYeqDWs6kFmZmZizpw5GDNmDC5evIj8/HyUlpbio48+glKpRHJyMjIyMuDj4wOFQoHly5dDrVabncFKRET9Q3V1tclwpK2PvnQ6XbchzUGDBsHHx8fss8C+zGXZunUrHnjgAZNepb+/P/Ly8hAREYG2tjZs2bIFM2bMQFlZGaZNm2bxPViVIOvq6rBo0SKcO3cOSqUSoaGh+Oijj3DnnXcCADZs2AAXFxckJCSgra0NsbGxePXVV625BBERWejyJBuZzW0AMG4A05unnnoKzz//fI91KioqbIrJUhqNBhUVFXjzzTdNjgcHByM4ONj48/Tp03H69Gls2LChW92eWJUgxcZ4f83DwwO5ubnIzc21plkiIuoDez6DtNRjjz2GJUuW9Fhn/PjxUKlUxlmlXTo6OlBfX292XopKpbJqLsuWLVswdepUhIeH9xp3ZGQkPvvss17r/Ro3KyciIouNHDkSI0eO7LWeWq1GQ0MDtFqtMYGVlJTAYDAgKipK9Jxfz2VJSEgAYH4uS3NzM9555x2Ln5WWl5fD39/forpdmCCJiCTKHnupOmqjgJCQEMTFxSElJQV5eXnQ6/VIS0vDggULjDNYz549i+joaOzYsQORkZFWzWXZvXs3Ojo68OCDD3a7dk5ODoKCgnDDDTegtbUVW7ZsQUlJCT7++GOr7oEJkohIogzoBGx8Bmlw4EYBO3fuRFpaGqKjo43zUzZt2mT8XK/Xo7KyEpcuXTIes3Quy9atWzFv3jzRZRzt7e147LHHcPbsWQwZMgShoaH45JNPMHPmTKvilwmCIFh1hoM1NTVBqVRiT/hcDB3k5uxwiIhs1tKhR7x2LxobGy2aCNObrr+TfkOnw0VmWz/HIHSgtuWQ3WIbSNiDJCKSqP48xDoQMEESEUmUQbDDEKvguCFWqet3CbJrxPdSp97JkRAR2UfX37N+9kSLetHvEuTFixcBAA+U73dyJERE9nXx4kUolUq7tcchVsfqdwkyICAA1dXV8PLygkx2eeigqakJgYGB3bZCkhKp34PU4wekfw+M3/n6eg+CIODixYuiG3Tb4nKCtG2IlAnSvH6XIF1cXDB69GjRzyzdCqk/k/o9SD1+QPr3wPidry/3YM+eI10d/S5BEhGRZQTBAIOte7EK7EGawwRJRCRRl4dHbd2snAnSHJvfB3k1yOVyZGVl2fz6FWeS+j1IPX5A+vfA+J1vINwDWa7f7aRDREQ969pJR+lxPWQyV5vaEoRONLZ+w510RHCIlYhIoi4/geQQq6NIYoiViIjoamMPkohIoi7PQOUsVkdhgiQikihbNwmwVxsDFYdYiYiIREgiQebm5mLcuHHw8PBAVFQUjhw54uyQLLJ69WrIZDKTMmnSJGeH1aODBw/innvuQUBAAGQyGfbs2WPyuSAIWLVqFfz9/TF48GDExMTg1KlTzglWRG/xL1mypNt3EhcX55xgRWRnZ+Omm26Cl5cXfH19ER8fj8rKSpM6ra2tSE1NxfDhw+Hp6YmEhATU1tY6KeLuLLmHGTNmdPseli1b5qSITW3evBmhoaHG3XLUajU+/PBD4+f96fcvCAIEwWBj4UIGc/p9gty9ezcyMjKQlZWFY8eOISwsDLGxsairq3N2aBa54YYbcO7cOWP57LPPnB1Sj1paWhAWFobc3FzRz1944QVs2rQJeXl5KCsrw9ChQxEbG4vW1tarHKm43uIHgLi4OJPv5O23376KEfbswIEDSE1NxeHDh1FUVAS9Xo/Zs2ejpaXFWCc9PR3vv/8+CgoKcODAAdTU1GDevHlOjNqUJfcAACkpKSbfwwsvvOCkiE2NHj0aa9euhVarxdGjRzFr1izMnTsXJ0+eBNC/fv9dm5XbWsgMoZ+LjIwUUlNTjT93dnYKAQEBQnZ2thOjskxWVpYQFhbm7DD6DIDw7rvvGn82GAyCSqUSXnzxReOxhoYGQS6XC2+//bYTIuzZlfELgiAsXrxYmDt3rlPi6Yu6ujoBgHDgwAFBEC7/vt3c3ISCggJjnYqKCgGAoNFonBVmj668B0EQhDvuuEN45JFHnBeUlYYNGyZs2bKl3/z+GxsbBQDCYPdxwhD5eJvKYPdxAgChsbHxqsUvFf26B9ne3g6tVouYmBjjMRcXF8TExECj0TgxMsudOnUKAQEBGD9+PBITE1FVVeXskPrszJkz0Ol0Jt+HUqlEVFSUZL4PACgtLYWvry+Cg4Px0EMP4cKFC84OyazGxkYAgI+PDwBAq9VCr9ebfAeTJk3CmDFj+u13cOU9dNm5cydGjBiByZMnIzMzE5cuXXJGeD3q7OzErl270NLSArVa3e9+/4LQaZdC4vr1LNYff/wRnZ2d8PPzMznu5+eHb7/91klRWS4qKgrbt29HcHAwzp07h2eeeQa33XYbTpw4AS8vL2eHZzWdTgcAot9H12f9XVxcHObNm4egoCCcPn0aK1aswJw5c6DRaODqatuOJPZmMBjw6KOP4pZbbsHkyZMBXP4O3N3d4e3tbVK3v34HYvcAAA888ADGjh2LgIAAHD9+HE8++SQqKyvxr3/9y4nR/uLrr7+GWq1Ga2srPD098e677+L6669HeXl5v/r922OJBpd5mNevE6TUzZkzx/jv0NBQREVFYezYsXjnnXeQnJzsxMiuXQsWLDD+e8qUKQgNDcV1112H0tJSREdHOzGy7lJTU3HixIl+/9y6J+buYenSpcZ/T5kyBf7+/oiOjsbp06dx3XXXXe0wuwkODkZ5eTkaGxvxz3/+E4sXL8aBAwecHRZdZf16iHXEiBFwdXXtNkOstrYWKpXKSVH1nbe3N37zm9/gu+++c3YofdL1Ox8o3wcAjB8/HiNGjOh330laWhr27duHTz/91OT9qCqVCu3t7WhoaDCp3x+/A3P3ICYqKgoA+s334O7ujgkTJiA8PBzZ2dkICwvDxo0b+93vn5N0HKtfJ0h3d3eEh4ejuLjYeMxgMKC4uBhqtdqJkfVNc3MzTp8+DX9/f2eH0idBQUFQqVQm30dTUxPKysok+X0AwA8//IALFy70m+9EEASkpaXh3XffRUlJCYKCgkw+Dw8Ph5ubm8l3UFlZiaqqqn7zHfR2D2LKy8sBoN98D1cyGAxoa2vrd79/25d4GDjE2oN+P8SakZGBxYsXIyIiApGRkcjJyUFLSwuSkpKcHVqv/vKXv+Cee+7B2LFjUVNTg6ysLLi6umLhwoXODs2s5uZmk/+KP3PmDMrLy+Hj44MxY8bg0Ucfxd/+9jdMnDgRQUFBePrppxEQEID4+HjnBf0rPcXv4+ODZ555BgkJCVCpVDh9+jSeeOIJTJgwAbGxsU6M+hepqanIz8/H3r174eXlZXyupVQqMXjwYCiVSiQnJyMjIwM+Pj5QKBRYvnw51Go1br75ZidHf1lv93D69Gnk5+fjrrvuwvDhw3H8+HGkp6fj9ttvR2hoqJOjBzIzMzFnzhyMGTMGFy9eRH5+PkpLS/HRRx9J4vdPduTsabSWePnll4UxY8YI7u7uQmRkpHD48GFnh2SR+fPnC/7+/oK7u7swatQoYf78+cJ3333n7LB69OmnnwoAupXFixcLgnB5qcfTTz8t+Pn5CXK5XIiOjhYqKyudG/Sv9BT/pUuXhNmzZwsjR44U3NzchLFjxwopKSmCTqdzdthGYrEDELZt22as89NPPwl//vOfhWHDhglDhgwRfvvb3wrnzp1zXtBX6O0eqqqqhNtvv13w8fER5HK5MGHCBOHxxx/vN8sM/vCHPwhjx44V3N3dhZEjRwrR0dHCxx9/bPy8P/z+u5Z5DHIdKbgN8rOpDHIdyWUeZvB9kEREEtP1PkhXFx/IZLY9KRMEAzoN9XwfpIh+/QySiIjIWfr9M0giIjJHAGyehcpBRHOYIImIJMo+74NkgjSHQ6xEREQi2IMkIpKoy4v8bexBcojVLCZIIiLJsj1B8hmkeRxiJSIiEsEeJBGRVNlhkg44SccsJkgiIoniM0jH4hArERGRCPYgiYgki5N0HIk9SCIiyRIuP0O0pTgwQdbX1yMxMREKhQLe3t5ITk5Gc3Nzj+e89tprmDFjBhQKBWQyWbd3b1ra7vHjx3HbbbfBw8MDgYGBeOGFF6yOnwmSiIgcIjExESdPnkRRURH27duHgwcPYunSpT2ec+nSJcTFxWHFihV9brepqQmzZ8/G2LFjodVq8eKLL2L16tV47bXXrLsBJ79NhIiIrNT1uivAVQAG2VhcHfK6q2+++UYAIHzxxRfGYx9++KEgk8mEs2fP9np+16vr/vvf/1rd7quvvioMGzZMaGtrM9Z58sknheDgYKvugT1IIiJJM/sKTgvLZU1NTSalra3Npqg0Gg28vb0RERFhPBYTEwMXFxeUlZU5tF2NRoPbb78d7u7uxjqxsbGorKzEf//7X4uvxQRJRCQx7u7uUKlUADrtUjw9PREYGAilUmks2dnZNsWo0+ng6+trcmzQoEHw8fGBTqdzaLs6nQ5+fn4mdbp+tubanMVKRCQxHh4eOHPmDNrb2+3SniAIkMlMZ8PK5XLRuk899RSef/75HturqKiwS1zOxgRJRCRBHh4e8PDwuOrXfeyxx7BkyZIe64wfPx4qlQp1dXUmxzs6OlBfX/9z77dvLGlXpVKhtrbWpE7Xz9ZcmwmSiIgsNnLkSIwcObLXemq1Gg0NDdBqtQgPDwcAlJSUwGAwICoqqs/Xt6RdtVqNv/71r9Dr9XBzcwMAFBUVITg4GMOGDbP4WnwGSUREdhcSEoK4uDikpKTgyJEj+Pzzz5GWloYFCxYgICAAAHD27FlMmjQJR44cMZ6n0+lQXl6O7777DgDw9ddfo7y8HPX19Ra3+8ADD8Dd3R3Jyck4efIkdu/ejY0bNyIjI8O6m7BqzisREZGFLly4ICxcuFDw9PQUFAqFkJSUJFy8eNH4+ZkzZwQAwqeffmo8lpWVJTrddtu2bRa3KwiC8NVXXwm33nqrIJfLhVGjRglr1661On6ZIHArdyIioitxiJWIiEgEEyQREZEIJkgiIiIRTJBEREQimCCJiIhEMEESERGJYIIkIiISwQRJREQkggmSiIhIBBMkERGRCCZIIiIiEf8PsllLZ28TyJgAAAAASUVORK5CYII=", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "# since we didn't perform yet any evolutionary step they are the same\n", - "visualize_drift(dbf.h0.matrix, dbf.h.matrix)" - ] - }, - { - "cell_type": "markdown", - "id": "bb5f10da", - "metadata": {}, - "source": [ - "which shows $\\hat{H}$ is now identical to $\\hat{H}_0$ since no evolution step has been performed yet." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "90e6fdff", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "# diagonal part of the H target\n", - "visualize_matrix(dbf.diagonal_h_matrix)" - ] - }, - { - "cell_type": "markdown", - "id": "a0101ae0", - "metadata": {}, - "source": [ - "The Hilbert-Schmidt norm of a Hamiltonian is defined as:\n", - "\n", - "$\\langle A\\rangle_{HS}=\\sqrt{A^\\dagger A}$" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "0d90c8b5", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "HS norm of the off diagonal part of H: 37.94733192202055\n" - ] - } - ], - "source": [ - "# Hilbert-Schmidt norm of the off-diagonal part\n", - "# which we want to bring to be close to zero\n", - "print(f\"HS norm of the off diagonal part of H: {dbf.off_diagonal_norm}\")" - ] - }, - { - "cell_type": "markdown", - "id": "a1d1eb77", - "metadata": {}, - "source": [ - "Finally, the energy fluctuation of the system at step $k$ over a given state $\\mu$\n", - "\n", - "$$ \\Xi(\\mu) = \\sqrt{\\langle \\mu | \\hat{H}_k^2 | \\mu \\rangle - \\langle \\mu | \\hat{H}_k | \\mu \\rangle^2} $$\n", - "\n", - "can be computed:" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "id": "13710cc2", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "6.708203932499369" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# define a quantum state\n", - "# for example the ground state of a multi-qubit Z hamiltonian\n", - "Z = hamiltonians.Z(nqubits=nqubits)\n", - "state = Z.ground_state()\n", - "\n", - "# compute energy fluctuations using current H and given state\n", - "dbf.energy_fluctuation(state)" - ] - }, - { - "cell_type": "markdown", - "id": "4d34e1e3", - "metadata": {}, - "source": [ - "#### Call the `DoubleBracketIteration` to perform a DBF iteration\n", - "\n", - "If the DBF object is called, a Double Bracket Iteration iteration is performed. This can be done customizing the iteration by setting the iteration step and the desired `DoubleBracketGeneratorType`. If no generator is provided, the one passed at the initialization time is used (default is `DoubleBracketGeneratorType.canonical`)." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "id": "a7749a96", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Initial value of the off-diagonal norm: 37.94733192202055\n", - "One step later off-diagonal norm: 34.179717587686405\n" - ] - } - ], - "source": [ - "# perform one evolution step\n", - "\n", - "# initial value of the off-diagonal norm\n", - "print(f\"Initial value of the off-diagonal norm: {dbf.off_diagonal_norm}\")\n", - "\n", - "dbf(step=0.01, mode=iterationtype)\n", - "\n", - "# after one step\n", - "print(f\"One step later off-diagonal norm: {dbf.off_diagonal_norm}\")" - ] - }, - { - "cell_type": "markdown", - "id": "dab441bb", - "metadata": {}, - "source": [ - "We can check now if something happened by plotting the drift:" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "id": "fc01baa4", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "visualize_drift(dbf.h0.matrix, dbf.h.matrix)" - ] - }, - { - "cell_type": "markdown", - "id": "9223433b", - "metadata": {}, - "source": [ - "The set step can be good, but maybe not the best one. In order to do this choice in a wiser way, we can call the DBF hyperoptimization routine to search for a better initial step. The `dbf.hyperopt_step` method is built on top of the [`hyperopt`](https://hyperopt.github.io/hyperopt/) package. Any algorithm or sampling space provided by the official package can be used. We are going to use the default options (we sample new steps from a uniform space following a _Tree of Parzen estimators algorithm_)." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "id": "0d7b86d3", - "metadata": {}, - "outputs": [], - "source": [ - "# restart\n", - "dbf.h = dbf.h0\n", - "\n", - "# optimization of the step, we allow to search in [1e-5, 1]\n", - "step = dbf.choose_step(\n", - " scheduling=DoubleBracketScheduling.hyperopt,\n", - " step_min = 1e-5,\n", - " step_max = 1,\n", - " optimizer = optuna.samplers.TPESampler(),\n", - " max_evals = 1000,\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "id": "1b9b1431", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "visualize_matrix(dbf.h.matrix)" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "id": "52fa3599", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "visualize_drift(dbf.h0.matrix, dbf.h.matrix)" - ] - }, - { - "cell_type": "markdown", - "id": "084c3bcb", - "metadata": {}, - "source": [ - "#### Let's evolve the model for `NSTEPS`\n", - "\n", - "We know recover the initial hamiltonian, and we perform a sequence of DBF iteration steps, in order to show how this mechanism can lead to a proper diagonalization of the target hamiltonian.\n", - "\n", - "#### Method 1: fixed step" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "id": "d1f197b1", - "metadata": {}, - "outputs": [], - "source": [ - "# restart\n", - "dbf_1 = DoubleBracketIteration(hamiltonian=deepcopy(h), mode=iterationtype)\n", - "off_diagonal_norm_history = [dbf_1.off_diagonal_norm]\n", - "histories, labels = [], [\"Fixed step\"]\n", - "\n", - "# set the number of evolution steps\n", - "NSTEPS = 20\n", - "step = 0.005\n", - "\n", - "for s in range(NSTEPS):\n", - " dbf_1(step=step)\n", - " off_diagonal_norm_history.append(dbf_1.off_diagonal_norm)\n", - "\n", - "histories.append(off_diagonal_norm_history)" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "id": "c115c222", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "plot_histories(histories, labels)" - ] - }, - { - "cell_type": "markdown", - "id": "233ba431", - "metadata": {}, - "source": [ - "#### Method 2: optimizing the step" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "id": "4e0fc1c2", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "New optimized step at iteration 1/20: 0.00934294935664311\n", - "New optimized step at iteration 2/20: 0.009364588177233102\n", - "New optimized step at iteration 3/20: 0.005985356940597437\n", - "New optimized step at iteration 4/20: 0.011472840984366184\n", - "New optimized step at iteration 5/20: 0.006802887431910996\n", - "New optimized step at iteration 6/20: 0.010837702507351613\n", - "New optimized step at iteration 7/20: 0.006624471861894687\n", - "New optimized step at iteration 8/20: 0.00870720701470905\n", - "New optimized step at iteration 9/20: 0.005748706054245771\n", - "New optimized step at iteration 10/20: 0.009512049459920756\n", - "New optimized step at iteration 11/20: 0.004887478565382978\n", - "New optimized step at iteration 12/20: 0.011309993175156744\n", - "New optimized step at iteration 13/20: 0.0017896288977535153\n", - "New optimized step at iteration 14/20: 0.0003944795659594491\n", - "New optimized step at iteration 15/20: 0.0006390700306615794\n", - "New optimized step at iteration 16/20: 0.0008772593599309826\n", - "New optimized step at iteration 17/20: 0.012559015937191706\n", - "New optimized step at iteration 18/20: 0.003294180889937215\n", - "New optimized step at iteration 19/20: 0.002707744316510693\n" - ] - } - ], - "source": [ - "# restart\n", - "dbf_2 = DoubleBracketIteration(hamiltonian=deepcopy(h), mode=iterationtype, scheduling=DoubleBracketScheduling.hyperopt)\n", - "off_diagonal_norm_history = [dbf_2.off_diagonal_norm]\n", - "\n", - "# set the number of evolution steps\n", - "NSTEPS = 20\n", - "\n", - "# optimize first step\n", - "step = dbf_2.choose_step(\n", - " step_min = 1e-5,\n", - " step_max = 1,\n", - " optimizer = optuna.samplers.TPESampler(),\n", - " max_evals = 1000,\n", - ")\n", - "\n", - "for s in range(NSTEPS):\n", - " if s != 0:\n", - " step = dbf_2.choose_step(\n", - " step_min = 1e-5,\n", - " step_max = 1,\n", - " optimizer = optuna.samplers.TPESampler(),\n", - " max_evals = 1000,\n", - " )\n", - " print(f\"New optimized step at iteration {s}/{NSTEPS}: {step}\")\n", - " dbf_2(step=step)\n", - " off_diagonal_norm_history.append(dbf_2.off_diagonal_norm)\n", - "\n", - "histories.append(off_diagonal_norm_history)\n", - "labels.append(\"Optimizing step\")" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "id": "40e31e97", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "plot_histories(histories, labels)" - ] - }, - { - "cell_type": "markdown", - "id": "0de78acd", - "metadata": {}, - "source": [ - "The hyperoptimization can lead to a faster convergence of the algorithm." - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "id": "baab0ab5", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "visualize_matrix(dbf_1.h.matrix)" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "id": "2bc9ac69", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "visualize_matrix(dbf_2.h.matrix)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "310c0bad-4eeb-4940-8c18-5921dfb4d157", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.0" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/poetry.lock b/poetry.lock index 1ce3aa0f83..76015414ca 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.7.0 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. [[package]] name = "alabaster" @@ -43,24 +43,24 @@ files = [ [[package]] name = "anyio" -version = "4.6.2.post1" +version = "4.7.0" description = "High level compatibility layer for multiple asynchronous event loop implementations" optional = false python-versions = ">=3.9" files = [ - {file = "anyio-4.6.2.post1-py3-none-any.whl", hash = "sha256:6d170c36fba3bdd840c73d3868c1e777e33676a69c3a72cf0a0d5d6d8009b61d"}, - {file = "anyio-4.6.2.post1.tar.gz", hash = "sha256:4c8bc31ccdb51c7f7bd251f51c609e038d63e34219b44aa86e47576389880b4c"}, + {file = "anyio-4.7.0-py3-none-any.whl", hash = "sha256:ea60c3723ab42ba6fff7e8ccb0488c898ec538ff4df1f1d5e642c3601d07e352"}, + {file = "anyio-4.7.0.tar.gz", hash = "sha256:2f834749c602966b7d456a7567cafcb309f96482b5081d14ac93ccd457f9dd48"}, ] [package.dependencies] exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""} idna = ">=2.8" sniffio = ">=1.1" -typing-extensions = {version = ">=4.1", markers = "python_version < \"3.11\""} +typing_extensions = {version = ">=4.5", markers = "python_version < \"3.13\""} [package.extras] -doc = ["Sphinx (>=7.4,<8.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] -test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "truststore (>=0.9.1)", "uvloop (>=0.21.0b1)"] +doc = ["Sphinx (>=7.4,<8.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx_rtd_theme"] +test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "truststore (>=0.9.1)", "uvloop (>=0.21)"] trio = ["trio (>=0.26.1)"] [[package]] @@ -90,21 +90,18 @@ typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.11\""} [[package]] name = "asttokens" -version = "2.4.1" +version = "3.0.0" description = "Annotate AST trees with source code positions" optional = false -python-versions = "*" +python-versions = ">=3.8" files = [ - {file = "asttokens-2.4.1-py2.py3-none-any.whl", hash = "sha256:051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24"}, - {file = "asttokens-2.4.1.tar.gz", hash = "sha256:b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0"}, + {file = "asttokens-3.0.0-py3-none-any.whl", hash = "sha256:e3078351a059199dd5138cb1c706e6430c05eff2ff136af5eb4790f9d28932e2"}, + {file = "asttokens-3.0.0.tar.gz", hash = "sha256:0dcd8baa8d62b0c1d118b399b2ddba3c4aff271d0d7a9e0d4c1681c79035bbc7"}, ] -[package.dependencies] -six = ">=1.12.0" - [package.extras] -astroid = ["astroid (>=1,<2)", "astroid (>=2,<4)"] -test = ["astroid (>=1,<2)", "astroid (>=2,<4)", "pytest"] +astroid = ["astroid (>=2,<4)"] +test = ["astroid (>=2,<4)", "pytest", "pytest-cov", "pytest-xdist"] [[package]] name = "attrs" @@ -203,13 +200,13 @@ files = [ [[package]] name = "certifi" -version = "2024.8.30" +version = "2024.12.14" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2024.8.30-py3-none-any.whl", hash = "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8"}, - {file = "certifi-2024.8.30.tar.gz", hash = "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9"}, + {file = "certifi-2024.12.14-py3-none-any.whl", hash = "sha256:1275f7a45be9464efc1173084eaa30f866fe2e47d389406136d332ed4967ec56"}, + {file = "certifi-2024.12.14.tar.gz", hash = "sha256:b650d30f370c2b724812bee08008be0c4163b163ddaec3f2546c1caf65f191db"}, ] [[package]] @@ -738,73 +735,73 @@ test = ["altair", "baytune", "chocolate", "dask", "distributed", "kahypar", "mat [[package]] name = "coverage" -version = "7.6.7" +version = "7.6.9" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.9" files = [ - {file = "coverage-7.6.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:108bb458827765d538abcbf8288599fee07d2743357bdd9b9dad456c287e121e"}, - {file = "coverage-7.6.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c973b2fe4dc445cb865ab369df7521df9c27bf40715c837a113edaa2aa9faf45"}, - {file = "coverage-7.6.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c6b24007c4bcd0b19fac25763a7cac5035c735ae017e9a349b927cfc88f31c1"}, - {file = "coverage-7.6.7-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:acbb8af78f8f91b3b51f58f288c0994ba63c646bc1a8a22ad072e4e7e0a49f1c"}, - {file = "coverage-7.6.7-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad32a981bcdedb8d2ace03b05e4fd8dace8901eec64a532b00b15217d3677dd2"}, - {file = "coverage-7.6.7-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:34d23e28ccb26236718a3a78ba72744212aa383141961dd6825f6595005c8b06"}, - {file = "coverage-7.6.7-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e25bacb53a8c7325e34d45dddd2f2fbae0dbc230d0e2642e264a64e17322a777"}, - {file = "coverage-7.6.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:af05bbba896c4472a29408455fe31b3797b4d8648ed0a2ccac03e074a77e2314"}, - {file = "coverage-7.6.7-cp310-cp310-win32.whl", hash = "sha256:796c9b107d11d2d69e1849b2dfe41730134b526a49d3acb98ca02f4985eeff7a"}, - {file = "coverage-7.6.7-cp310-cp310-win_amd64.whl", hash = "sha256:987a8e3da7da4eed10a20491cf790589a8e5e07656b6dc22d3814c4d88faf163"}, - {file = "coverage-7.6.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7e61b0e77ff4dddebb35a0e8bb5a68bf0f8b872407d8d9f0c726b65dfabe2469"}, - {file = "coverage-7.6.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1a5407a75ca4abc20d6252efeb238377a71ce7bda849c26c7a9bece8680a5d99"}, - {file = "coverage-7.6.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df002e59f2d29e889c37abd0b9ee0d0e6e38c24f5f55d71ff0e09e3412a340ec"}, - {file = "coverage-7.6.7-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:673184b3156cba06154825f25af33baa2671ddae6343f23175764e65a8c4c30b"}, - {file = "coverage-7.6.7-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e69ad502f1a2243f739f5bd60565d14a278be58be4c137d90799f2c263e7049a"}, - {file = "coverage-7.6.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:60dcf7605c50ea72a14490d0756daffef77a5be15ed1b9fea468b1c7bda1bc3b"}, - {file = "coverage-7.6.7-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:9c2eb378bebb2c8f65befcb5147877fc1c9fbc640fc0aad3add759b5df79d55d"}, - {file = "coverage-7.6.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3c0317288f032221d35fa4cbc35d9f4923ff0dfd176c79c9b356e8ef8ef2dff4"}, - {file = "coverage-7.6.7-cp311-cp311-win32.whl", hash = "sha256:951aade8297358f3618a6e0660dc74f6b52233c42089d28525749fc8267dccd2"}, - {file = "coverage-7.6.7-cp311-cp311-win_amd64.whl", hash = "sha256:5e444b8e88339a2a67ce07d41faabb1d60d1004820cee5a2c2b54e2d8e429a0f"}, - {file = "coverage-7.6.7-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f07ff574986bc3edb80e2c36391678a271d555f91fd1d332a1e0f4b5ea4b6ea9"}, - {file = "coverage-7.6.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:49ed5ee4109258973630c1f9d099c7e72c5c36605029f3a91fe9982c6076c82b"}, - {file = "coverage-7.6.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3e8796434a8106b3ac025fd15417315d7a58ee3e600ad4dbcfddc3f4b14342c"}, - {file = "coverage-7.6.7-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a3b925300484a3294d1c70f6b2b810d6526f2929de954e5b6be2bf8caa1f12c1"}, - {file = "coverage-7.6.7-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c42ec2c522e3ddd683dec5cdce8e62817afb648caedad9da725001fa530d354"}, - {file = "coverage-7.6.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0266b62cbea568bd5e93a4da364d05de422110cbed5056d69339bd5af5685433"}, - {file = "coverage-7.6.7-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e5f2a0f161d126ccc7038f1f3029184dbdf8f018230af17ef6fd6a707a5b881f"}, - {file = "coverage-7.6.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c132b5a22821f9b143f87446805e13580b67c670a548b96da945a8f6b4f2efbb"}, - {file = "coverage-7.6.7-cp312-cp312-win32.whl", hash = "sha256:7c07de0d2a110f02af30883cd7dddbe704887617d5c27cf373362667445a4c76"}, - {file = "coverage-7.6.7-cp312-cp312-win_amd64.whl", hash = "sha256:fd49c01e5057a451c30c9b892948976f5d38f2cbd04dc556a82743ba8e27ed8c"}, - {file = "coverage-7.6.7-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:46f21663e358beae6b368429ffadf14ed0a329996248a847a4322fb2e35d64d3"}, - {file = "coverage-7.6.7-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:40cca284c7c310d622a1677f105e8507441d1bb7c226f41978ba7c86979609ab"}, - {file = "coverage-7.6.7-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77256ad2345c29fe59ae861aa11cfc74579c88d4e8dbf121cbe46b8e32aec808"}, - {file = "coverage-7.6.7-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:87ea64b9fa52bf395272e54020537990a28078478167ade6c61da7ac04dc14bc"}, - {file = "coverage-7.6.7-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d608a7808793e3615e54e9267519351c3ae204a6d85764d8337bd95993581a8"}, - {file = "coverage-7.6.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdd94501d65adc5c24f8a1a0eda110452ba62b3f4aeaba01e021c1ed9cb8f34a"}, - {file = "coverage-7.6.7-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:82c809a62e953867cf57e0548c2b8464207f5f3a6ff0e1e961683e79b89f2c55"}, - {file = "coverage-7.6.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:bb684694e99d0b791a43e9fc0fa58efc15ec357ac48d25b619f207c41f2fd384"}, - {file = "coverage-7.6.7-cp313-cp313-win32.whl", hash = "sha256:963e4a08cbb0af6623e61492c0ec4c0ec5c5cf74db5f6564f98248d27ee57d30"}, - {file = "coverage-7.6.7-cp313-cp313-win_amd64.whl", hash = "sha256:14045b8bfd5909196a90da145a37f9d335a5d988a83db34e80f41e965fb7cb42"}, - {file = "coverage-7.6.7-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:f2c7a045eef561e9544359a0bf5784b44e55cefc7261a20e730baa9220c83413"}, - {file = "coverage-7.6.7-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5dd4e4a49d9c72a38d18d641135d2fb0bdf7b726ca60a103836b3d00a1182acd"}, - {file = "coverage-7.6.7-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c95e0fa3d1547cb6f021ab72f5c23402da2358beec0a8e6d19a368bd7b0fb37"}, - {file = "coverage-7.6.7-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f63e21ed474edd23f7501f89b53280014436e383a14b9bd77a648366c81dce7b"}, - {file = "coverage-7.6.7-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ead9b9605c54d15be228687552916c89c9683c215370c4a44f1f217d2adcc34d"}, - {file = "coverage-7.6.7-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:0573f5cbf39114270842d01872952d301027d2d6e2d84013f30966313cadb529"}, - {file = "coverage-7.6.7-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:e2c8e3384c12dfa19fa9a52f23eb091a8fad93b5b81a41b14c17c78e23dd1d8b"}, - {file = "coverage-7.6.7-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:70a56a2ec1869e6e9fa69ef6b76b1a8a7ef709972b9cc473f9ce9d26b5997ce3"}, - {file = "coverage-7.6.7-cp313-cp313t-win32.whl", hash = "sha256:dbba8210f5067398b2c4d96b4e64d8fb943644d5eb70be0d989067c8ca40c0f8"}, - {file = "coverage-7.6.7-cp313-cp313t-win_amd64.whl", hash = "sha256:dfd14bcae0c94004baba5184d1c935ae0d1231b8409eb6c103a5fd75e8ecdc56"}, - {file = "coverage-7.6.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:37a15573f988b67f7348916077c6d8ad43adb75e478d0910957394df397d2874"}, - {file = "coverage-7.6.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b6cce5c76985f81da3769c52203ee94722cd5d5889731cd70d31fee939b74bf0"}, - {file = "coverage-7.6.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ab9763d291a17b527ac6fd11d1a9a9c358280adb320e9c2672a97af346ac2c"}, - {file = "coverage-7.6.7-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6cf96ceaa275f071f1bea3067f8fd43bec184a25a962c754024c973af871e1b7"}, - {file = "coverage-7.6.7-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aee9cf6b0134d6f932d219ce253ef0e624f4fa588ee64830fcba193269e4daa3"}, - {file = "coverage-7.6.7-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2bc3e45c16564cc72de09e37413262b9f99167803e5e48c6156bccdfb22c8327"}, - {file = "coverage-7.6.7-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:623e6965dcf4e28a3debaa6fcf4b99ee06d27218f46d43befe4db1c70841551c"}, - {file = "coverage-7.6.7-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:850cfd2d6fc26f8346f422920ac204e1d28814e32e3a58c19c91980fa74d8289"}, - {file = "coverage-7.6.7-cp39-cp39-win32.whl", hash = "sha256:c296263093f099da4f51b3dff1eff5d4959b527d4f2f419e16508c5da9e15e8c"}, - {file = "coverage-7.6.7-cp39-cp39-win_amd64.whl", hash = "sha256:90746521206c88bdb305a4bf3342b1b7316ab80f804d40c536fc7d329301ee13"}, - {file = "coverage-7.6.7-pp39.pp310-none-any.whl", hash = "sha256:0ddcb70b3a3a57581b450571b31cb774f23eb9519c2aaa6176d3a84c9fc57671"}, - {file = "coverage-7.6.7.tar.gz", hash = "sha256:d79d4826e41441c9a118ff045e4bccb9fdbdcb1d02413e7ea6eb5c87b5439d24"}, + {file = "coverage-7.6.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:85d9636f72e8991a1706b2b55b06c27545448baf9f6dbf51c4004609aacd7dcb"}, + {file = "coverage-7.6.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:608a7fd78c67bee8936378299a6cb9f5149bb80238c7a566fc3e6717a4e68710"}, + {file = "coverage-7.6.9-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96d636c77af18b5cb664ddf12dab9b15a0cfe9c0bde715da38698c8cea748bfa"}, + {file = "coverage-7.6.9-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d75cded8a3cff93da9edc31446872d2997e327921d8eed86641efafd350e1df1"}, + {file = "coverage-7.6.9-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f7b15f589593110ae767ce997775d645b47e5cbbf54fd322f8ebea6277466cec"}, + {file = "coverage-7.6.9-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:44349150f6811b44b25574839b39ae35291f6496eb795b7366fef3bd3cf112d3"}, + {file = "coverage-7.6.9-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:d891c136b5b310d0e702e186d70cd16d1119ea8927347045124cb286b29297e5"}, + {file = "coverage-7.6.9-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:db1dab894cc139f67822a92910466531de5ea6034ddfd2b11c0d4c6257168073"}, + {file = "coverage-7.6.9-cp310-cp310-win32.whl", hash = "sha256:41ff7b0da5af71a51b53f501a3bac65fb0ec311ebed1632e58fc6107f03b9198"}, + {file = "coverage-7.6.9-cp310-cp310-win_amd64.whl", hash = "sha256:35371f8438028fdccfaf3570b31d98e8d9eda8bb1d6ab9473f5a390969e98717"}, + {file = "coverage-7.6.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:932fc826442132dde42ee52cf66d941f581c685a6313feebed358411238f60f9"}, + {file = "coverage-7.6.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:085161be5f3b30fd9b3e7b9a8c301f935c8313dcf928a07b116324abea2c1c2c"}, + {file = "coverage-7.6.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ccc660a77e1c2bf24ddbce969af9447a9474790160cfb23de6be4fa88e3951c7"}, + {file = "coverage-7.6.9-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c69e42c892c018cd3c8d90da61d845f50a8243062b19d228189b0224150018a9"}, + {file = "coverage-7.6.9-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0824a28ec542a0be22f60c6ac36d679e0e262e5353203bea81d44ee81fe9c6d4"}, + {file = "coverage-7.6.9-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4401ae5fc52ad8d26d2a5d8a7428b0f0c72431683f8e63e42e70606374c311a1"}, + {file = "coverage-7.6.9-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:98caba4476a6c8d59ec1eb00c7dd862ba9beca34085642d46ed503cc2d440d4b"}, + {file = "coverage-7.6.9-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ee5defd1733fd6ec08b168bd4f5387d5b322f45ca9e0e6c817ea6c4cd36313e3"}, + {file = "coverage-7.6.9-cp311-cp311-win32.whl", hash = "sha256:f2d1ec60d6d256bdf298cb86b78dd715980828f50c46701abc3b0a2b3f8a0dc0"}, + {file = "coverage-7.6.9-cp311-cp311-win_amd64.whl", hash = "sha256:0d59fd927b1f04de57a2ba0137166d31c1a6dd9e764ad4af552912d70428c92b"}, + {file = "coverage-7.6.9-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:99e266ae0b5d15f1ca8d278a668df6f51cc4b854513daab5cae695ed7b721cf8"}, + {file = "coverage-7.6.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9901d36492009a0a9b94b20e52ebfc8453bf49bb2b27bca2c9706f8b4f5a554a"}, + {file = "coverage-7.6.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:abd3e72dd5b97e3af4246cdada7738ef0e608168de952b837b8dd7e90341f015"}, + {file = "coverage-7.6.9-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ff74026a461eb0660366fb01c650c1d00f833a086b336bdad7ab00cc952072b3"}, + {file = "coverage-7.6.9-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65dad5a248823a4996724a88eb51d4b31587aa7aa428562dbe459c684e5787ae"}, + {file = "coverage-7.6.9-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:22be16571504c9ccea919fcedb459d5ab20d41172056206eb2994e2ff06118a4"}, + {file = "coverage-7.6.9-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f957943bc718b87144ecaee70762bc2bc3f1a7a53c7b861103546d3a403f0a6"}, + {file = "coverage-7.6.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0ae1387db4aecb1f485fb70a6c0148c6cdaebb6038f1d40089b1fc84a5db556f"}, + {file = "coverage-7.6.9-cp312-cp312-win32.whl", hash = "sha256:1a330812d9cc7ac2182586f6d41b4d0fadf9be9049f350e0efb275c8ee8eb692"}, + {file = "coverage-7.6.9-cp312-cp312-win_amd64.whl", hash = "sha256:b12c6b18269ca471eedd41c1b6a1065b2f7827508edb9a7ed5555e9a56dcfc97"}, + {file = "coverage-7.6.9-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:899b8cd4781c400454f2f64f7776a5d87bbd7b3e7f7bda0cb18f857bb1334664"}, + {file = "coverage-7.6.9-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:61f70dc68bd36810972e55bbbe83674ea073dd1dcc121040a08cdf3416c5349c"}, + {file = "coverage-7.6.9-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a289d23d4c46f1a82d5db4abeb40b9b5be91731ee19a379d15790e53031c014"}, + {file = "coverage-7.6.9-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e216d8044a356fc0337c7a2a0536d6de07888d7bcda76febcb8adc50bdbbd00"}, + {file = "coverage-7.6.9-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c026eb44f744acaa2bda7493dad903aa5bf5fc4f2554293a798d5606710055d"}, + {file = "coverage-7.6.9-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e77363e8425325384f9d49272c54045bbed2f478e9dd698dbc65dbc37860eb0a"}, + {file = "coverage-7.6.9-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:777abfab476cf83b5177b84d7486497e034eb9eaea0d746ce0c1268c71652077"}, + {file = "coverage-7.6.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:447af20e25fdbe16f26e84eb714ba21d98868705cb138252d28bc400381f6ffb"}, + {file = "coverage-7.6.9-cp313-cp313-win32.whl", hash = "sha256:d872ec5aeb086cbea771c573600d47944eea2dcba8be5f3ee649bfe3cb8dc9ba"}, + {file = "coverage-7.6.9-cp313-cp313-win_amd64.whl", hash = "sha256:fd1213c86e48dfdc5a0cc676551db467495a95a662d2396ecd58e719191446e1"}, + {file = "coverage-7.6.9-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:ba9e7484d286cd5a43744e5f47b0b3fb457865baf07bafc6bee91896364e1419"}, + {file = "coverage-7.6.9-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e5ea1cf0872ee455c03e5674b5bca5e3e68e159379c1af0903e89f5eba9ccc3a"}, + {file = "coverage-7.6.9-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d10e07aa2b91835d6abec555ec8b2733347956991901eea6ffac295f83a30e4"}, + {file = "coverage-7.6.9-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:13a9e2d3ee855db3dd6ea1ba5203316a1b1fd8eaeffc37c5b54987e61e4194ae"}, + {file = "coverage-7.6.9-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c38bf15a40ccf5619fa2fe8f26106c7e8e080d7760aeccb3722664c8656b030"}, + {file = "coverage-7.6.9-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:d5275455b3e4627c8e7154feaf7ee0743c2e7af82f6e3b561967b1cca755a0be"}, + {file = "coverage-7.6.9-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:8f8770dfc6e2c6a2d4569f411015c8d751c980d17a14b0530da2d7f27ffdd88e"}, + {file = "coverage-7.6.9-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8d2dfa71665a29b153a9681edb1c8d9c1ea50dfc2375fb4dac99ea7e21a0bcd9"}, + {file = "coverage-7.6.9-cp313-cp313t-win32.whl", hash = "sha256:5e6b86b5847a016d0fbd31ffe1001b63355ed309651851295315031ea7eb5a9b"}, + {file = "coverage-7.6.9-cp313-cp313t-win_amd64.whl", hash = "sha256:97ddc94d46088304772d21b060041c97fc16bdda13c6c7f9d8fcd8d5ae0d8611"}, + {file = "coverage-7.6.9-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:adb697c0bd35100dc690de83154627fbab1f4f3c0386df266dded865fc50a902"}, + {file = "coverage-7.6.9-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:be57b6d56e49c2739cdf776839a92330e933dd5e5d929966fbbd380c77f060be"}, + {file = "coverage-7.6.9-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1592791f8204ae9166de22ba7e6705fa4ebd02936c09436a1bb85aabca3e599"}, + {file = "coverage-7.6.9-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4e12ae8cc979cf83d258acb5e1f1cf2f3f83524d1564a49d20b8bec14b637f08"}, + {file = "coverage-7.6.9-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb5555cff66c4d3d6213a296b360f9e1a8e323e74e0426b6c10ed7f4d021e464"}, + {file = "coverage-7.6.9-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:b9389a429e0e5142e69d5bf4a435dd688c14478a19bb901735cdf75e57b13845"}, + {file = "coverage-7.6.9-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:592ac539812e9b46046620341498caf09ca21023c41c893e1eb9dbda00a70cbf"}, + {file = "coverage-7.6.9-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a27801adef24cc30871da98a105f77995e13a25a505a0161911f6aafbd66e678"}, + {file = "coverage-7.6.9-cp39-cp39-win32.whl", hash = "sha256:8e3c3e38930cfb729cb8137d7f055e5a473ddaf1217966aa6238c88bd9fd50e6"}, + {file = "coverage-7.6.9-cp39-cp39-win_amd64.whl", hash = "sha256:e28bf44afa2b187cc9f41749138a64435bf340adfcacb5b2290c070ce99839d4"}, + {file = "coverage-7.6.9-pp39.pp310-none-any.whl", hash = "sha256:f3ca78518bc6bc92828cd11867b121891d75cae4ea9e908d72030609b996db1b"}, + {file = "coverage-7.6.9.tar.gz", hash = "sha256:4a8d8977b0c6ef5aeadcb644da9e69ae0dcfe66ec7f368c89c72e058bd71164d"}, ] [package.dependencies] @@ -1011,97 +1008,111 @@ tests = ["pytest", "pytest-cov", "pytest-xdist"] [[package]] name = "cytoolz" -version = "1.0.0" +version = "1.0.1" description = "Cython implementation of Toolz: High performance functional utilities" optional = false python-versions = ">=3.8" files = [ - {file = "cytoolz-1.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ecf5a887acb8f079ab1b81612b1c889bcbe6611aa7804fd2df46ed310aa5a345"}, - {file = "cytoolz-1.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ef0ef30c1e091d4d59d14d8108a16d50bd227be5d52a47da891da5019ac2f8e4"}, - {file = "cytoolz-1.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7df2dfd679f0517a96ced1cdd22f5c6c6aeeed28d928a82a02bf4c3fd6fd7ac4"}, - {file = "cytoolz-1.0.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8c51452c938e610f57551aa96e34924169c9100c0448bac88c2fb395cbd3538c"}, - {file = "cytoolz-1.0.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6433f03910c5e5345d82d6299457c26bf33821224ebb837c6b09d9cdbc414a6c"}, - {file = "cytoolz-1.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:389ec328bb535f09e71dfe658bf0041f17194ca4cedaacd39bafe7893497a819"}, - {file = "cytoolz-1.0.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c64658e1209517ce4b54c1c9269a508b289d8d55fc742760e4b8579eacf09a33"}, - {file = "cytoolz-1.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f6039a9bd5bb988762458b9ca82b39e60ca5e5baae2ba93913990dcc5d19fa88"}, - {file = "cytoolz-1.0.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:85c9c8c4465ed1b2c8d67003809aec9627b129cb531d2f6cf0bbfe39952e7e4d"}, - {file = "cytoolz-1.0.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:49375aad431d76650f94877afb92f09f58b6ff9055079ef4f2cd55313f5a1b39"}, - {file = "cytoolz-1.0.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:4c45106171c824a61e755355520b646cb35a1987b34bbf5789443823ee137f63"}, - {file = "cytoolz-1.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3b319a7f0fed5db07d189db4046162ebc183c108df3562a65ba6ebe862d1f634"}, - {file = "cytoolz-1.0.0-cp310-cp310-win32.whl", hash = "sha256:9770e1b09748ad0d751853d994991e2592a9f8c464a87014365f80dac2e83faa"}, - {file = "cytoolz-1.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:20194dd02954c00c1f0755e636be75a20781f91a4ac9270c7f747e82d3c7f5a5"}, - {file = "cytoolz-1.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:dffc22fd2c91be64dbdbc462d0786f8e8ac9a275cfa1869a1084d1867d4f67e0"}, - {file = "cytoolz-1.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a99e7e29274e293f4ffe20e07f76c2ac753a78f1b40c1828dfc54b2981b2f6c4"}, - {file = "cytoolz-1.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c507a3e0a45c41d66b43f96797290d75d1e7a8549aa03a4a6b8854fdf3f7b8d8"}, - {file = "cytoolz-1.0.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:643a593ec272ef7429099e1182a22f64ec2696c00d295d2a5be390db1b7ff176"}, - {file = "cytoolz-1.0.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6ce38e2e42cbae30446190c59b92a8a9029e1806fd79eaf88f48b0fe33003893"}, - {file = "cytoolz-1.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:810a6a168b8c5ecb412fbae3dd6f7ed6c6253a63caf4174ee9794ebd29b2224f"}, - {file = "cytoolz-1.0.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0ce8a2a85c0741c1b19b16e6782c4a5abc54c3caecda66793447112ab2fa9884"}, - {file = "cytoolz-1.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ea4ac72e6b830861035c4c7999af8e55813f57c6d1913a3d93cc4a6babc27bf7"}, - {file = "cytoolz-1.0.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:a09cdfb21dfb38aa04df43e7546a41f673377eb5485da88ceb784e327ec7603b"}, - {file = "cytoolz-1.0.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:658dd85deb375ff7af990a674e5c9058cef1c9d1f5dc89bc87b77be499348144"}, - {file = "cytoolz-1.0.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:9715d1ff5576919d10b68f17241375f6a1eec8961c25b78a83e6ef1487053f39"}, - {file = "cytoolz-1.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f370a1f1f1afc5c1c8cc5edc1cfe0ba444263a0772af7ce094be8e734f41769d"}, - {file = "cytoolz-1.0.0-cp311-cp311-win32.whl", hash = "sha256:dbb2ec1177dca700f3db2127e572da20de280c214fc587b2a11c717fc421af56"}, - {file = "cytoolz-1.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:0983eee73df86e54bb4a79fcc4996aa8b8368fdbf43897f02f9c3bf39c4dc4fb"}, - {file = "cytoolz-1.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:10e3986066dc379e30e225b230754d9f5996aa8d84c2accc69c473c21d261e46"}, - {file = "cytoolz-1.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:16576f1bb143ee2cb9f719fcc4b845879fb121f9075c7c5e8a5ff4854bd02fc6"}, - {file = "cytoolz-1.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3faa25a1840b984315e8b3ae517312375f4273ffc9a2f035f548b7f916884f37"}, - {file = "cytoolz-1.0.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:781fce70a277b20fd95dc66811d1a97bb07b611ceea9bda8b7dd3c6a4b05d59a"}, - {file = "cytoolz-1.0.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7a562c25338eb24d419d1e80a7ae12133844ce6fdeb4ab54459daf250088a1b2"}, - {file = "cytoolz-1.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f29d8330aaf070304f7cd5cb7e73e198753624eb0aec278557cccd460c699b5b"}, - {file = "cytoolz-1.0.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:98a96c54aa55ed9c7cdb23c2f0df39a7b4ee518ac54888480b5bdb5ef69c7ef0"}, - {file = "cytoolz-1.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:287d6d7f475882c2ddcbedf8da9a9b37d85b77690779a2d1cdceb5ae3998d52e"}, - {file = "cytoolz-1.0.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:05a871688df749b982839239fcd3f8ec3b3b4853775d575ff9cd335fa7c75035"}, - {file = "cytoolz-1.0.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:28bb88e1e2f7d6d4b8e0890b06d292c568984d717de3e8381f2ca1dd12af6470"}, - {file = "cytoolz-1.0.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:576a4f1fc73d8836b10458b583f915849da6e4f7914f4ecb623ad95c2508cad5"}, - {file = "cytoolz-1.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:509ed3799c47e4ada14f63e41e8f540ac6e2dab97d5d7298934e6abb9d3830ec"}, - {file = "cytoolz-1.0.0-cp312-cp312-win32.whl", hash = "sha256:9ce25f02b910630f6dc2540dd1e26c9326027ddde6c59f8cab07c56acc70714c"}, - {file = "cytoolz-1.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:7e53cfcce87e05b7f0ae2fb2b3e5820048cd0bb7b701e92bd8f75c9fbb7c9ae9"}, - {file = "cytoolz-1.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7d56569dfe67a39ce74ffff0dc12cf0a3d1aae709667a303fe8f2dd5fd004fdf"}, - {file = "cytoolz-1.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:035c8bb4706dcf93a89fb35feadff67e9301935bf6bb864cd2366923b69d9a29"}, - {file = "cytoolz-1.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:27c684799708bdc7ee7acfaf464836e1b4dec0996815c1d5efd6a92a4356a562"}, - {file = "cytoolz-1.0.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:44ab57cfc922b15d94899f980d76759ef9e0256912dfab70bf2561bea9cd5b19"}, - {file = "cytoolz-1.0.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:478af5ecc066da093d7660b23d0b465a7f44179739937afbded8af00af412eb6"}, - {file = "cytoolz-1.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da1f82a7828a42468ea2820a25b6e56461361390c29dcd4d68beccfa1b71066b"}, - {file = "cytoolz-1.0.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6c371b3114d38ee717780b239179e88d5d358fe759a00dcf07691b8922bbc762"}, - {file = "cytoolz-1.0.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:90b343b2f3b3e77c3832ba19b0b17e95412a5b2e715b05c23a55ba525d1fca49"}, - {file = "cytoolz-1.0.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:89a554a9ba112403232a54e15e46ff218b33020f3f45c4baf6520ab198b7ad93"}, - {file = "cytoolz-1.0.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:0d603f5e2b1072166745ecdd81384a75757a96a704a5642231eb51969f919d5f"}, - {file = "cytoolz-1.0.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:122ef2425bd3c0419e6e5260d0b18cd25cf74de589cd0184e4a63b24a4641e2e"}, - {file = "cytoolz-1.0.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:8819f1f97ebe36efcaf4b550e21677c46ac8a41bed482cf66845f377dd20700d"}, - {file = "cytoolz-1.0.0-cp38-cp38-win32.whl", hash = "sha256:fcddbb853770dd6e270d89ea8742f0aa42c255a274b9e1620eb04e019b79785e"}, - {file = "cytoolz-1.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:ca526905a014a38cc23ae78635dc51d0462c5c24425b22c08beed9ff2ee03845"}, - {file = "cytoolz-1.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:05df5ff1cdd198fb57e7368623662578c950be0b14883cadfb9ee4098415e1e5"}, - {file = "cytoolz-1.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:04a84778f48ebddb26948971dc60948907c876ba33b13f9cbb014fe65b341fc2"}, - {file = "cytoolz-1.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f65283b618b4c4df759f57bcf8483865a73f7f268e6d76886c743407c8d26c1c"}, - {file = "cytoolz-1.0.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:388cd07ee9a9e504c735a0a933e53c98586a1c301a64af81f7aa7ff40c747520"}, - {file = "cytoolz-1.0.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:06d09e9569cfdfc5c082806d4b4582db8023a3ce034097008622bcbac7236f38"}, - {file = "cytoolz-1.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9502bd9e37779cc9893cbab515a474c2ab6af61ed22ac2f7e16033db18fcaa85"}, - {file = "cytoolz-1.0.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:364c2fda148def38003b2c86e8adde1d2aab12411dd50872c244a815262e2fda"}, - {file = "cytoolz-1.0.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:9b2e945617325242687189966335e785dc0fae316f4c1825baacf56e5a97e65f"}, - {file = "cytoolz-1.0.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:0f16907fdc724c55b16776bdb7e629deae81d500fe48cfc3861231753b271355"}, - {file = "cytoolz-1.0.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:d3206c81ca3ba2d7b8fe78f2e116e3028e721148be753308e88dcbbc370bca52"}, - {file = "cytoolz-1.0.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:becce4b13e110b5ac6b23753dcd0c977f4fdccffa31898296e13fd1109e517e3"}, - {file = "cytoolz-1.0.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:69a7e5e98fd446079b8b8ec5987aec9a31ec3570a6f494baefa6800b783eaf22"}, - {file = "cytoolz-1.0.0-cp39-cp39-win32.whl", hash = "sha256:b1707b6c3a91676ac83a28a231a14b337dbb4436b937e6b3e4fd44209852a48b"}, - {file = "cytoolz-1.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:11d48b8521ef5fe92e099f4fc00717b5d0789c3c90d5d84031b6d3b17dee1700"}, - {file = "cytoolz-1.0.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:e672712d5dc3094afc6fb346dd4e9c18c1f3c69608ddb8cf3b9f8428f9c26a5c"}, - {file = "cytoolz-1.0.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:86fb208bfb7420e1d0d20065d661310e4a8a6884851d4044f47d37ed4cd7410e"}, - {file = "cytoolz-1.0.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6dbe5fe3b835859fc559eb59bf2775b5a108f7f2cfab0966f3202859d787d8fd"}, - {file = "cytoolz-1.0.0-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0cace092dfda174eed09ed871793beb5b65633963bcda5b1632c73a5aceea1ce"}, - {file = "cytoolz-1.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:f7a9d816af3be9725c70efe0a6e4352a45d3877751b395014b8eb2f79d7d8d9d"}, - {file = "cytoolz-1.0.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:caa7ef840847a23b379e6146760e3a22f15f445656af97e55a435c592125cfa5"}, - {file = "cytoolz-1.0.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:921082fff09ff6e40c12c87b49be044492b2d6bb01d47783995813b76680c7b2"}, - {file = "cytoolz-1.0.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a32f1356f3b64dda883583383966948604ac69ca0b7fbcf5f28856e5f9133b4e"}, - {file = "cytoolz-1.0.0-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9af793b1738e4191d15a92e1793f1ffea9f6461022c7b2442f3cb1ea0a4f758a"}, - {file = "cytoolz-1.0.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:51dfda3983fcc59075c534ce54ca041bb3c80e827ada5d4f25ff7b4049777f94"}, - {file = "cytoolz-1.0.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:acfb8780c04d29423d14aaab74cd1b7b4beaba32f676e7ace02c9acfbf532aba"}, - {file = "cytoolz-1.0.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99f39dcc46416dca3eb23664b73187b77fb52cd8ba2ddd8020a292d8f449db67"}, - {file = "cytoolz-1.0.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c0d56b3721977806dcf1a68b0ecd56feb382fdb0f632af1a9fc5ab9b662b32c6"}, - {file = "cytoolz-1.0.0-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45d346620abc8c83ae634136e700432ad6202faffcc24c5ab70b87392dcda8a1"}, - {file = "cytoolz-1.0.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:df0c81197fc130de94c09fc6f024a6a19c98ba8fe55c17f1e45ebba2e9229079"}, - {file = "cytoolz-1.0.0.tar.gz", hash = "sha256:eb453b30182152f9917a5189b7d99046b6ce90cdf8aeb0feff4b2683e600defd"}, + {file = "cytoolz-1.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:cec9af61f71fc3853eb5dca3d42eb07d1f48a4599fa502cbe92adde85f74b042"}, + {file = "cytoolz-1.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:140bbd649dbda01e91add7642149a5987a7c3ccc251f2263de894b89f50b6608"}, + {file = "cytoolz-1.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e90124bdc42ff58b88cdea1d24a6bc5f776414a314cc4d94f25c88badb3a16d1"}, + {file = "cytoolz-1.0.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e74801b751e28f7c5cc3ad264c123954a051f546f2fdfe089f5aa7a12ccfa6da"}, + {file = "cytoolz-1.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:582dad4545ddfb5127494ef23f3fa4855f1673a35d50c66f7638e9fb49805089"}, + {file = "cytoolz-1.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd7bd0618e16efe03bd12f19c2a26a27e6e6b75d7105adb7be1cd2a53fa755d8"}, + {file = "cytoolz-1.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d74cca6acf1c4af58b2e4a89cc565ed61c5e201de2e434748c93e5a0f5c541a5"}, + {file = "cytoolz-1.0.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:823a3763828d8d457f542b2a45d75d6b4ced5e470b5c7cf2ed66a02f508ed442"}, + {file = "cytoolz-1.0.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:51633a14e6844c61db1d68c1ffd077cf949f5c99c60ed5f1e265b9e2966f1b52"}, + {file = "cytoolz-1.0.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:f3ec9b01c45348f1d0d712507d54c2bfd69c62fbd7c9ef555c9d8298693c2432"}, + {file = "cytoolz-1.0.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:1855022b712a9c7a5bce354517ab4727a38095f81e2d23d3eabaf1daeb6a3b3c"}, + {file = "cytoolz-1.0.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9930f7288c4866a1dc1cc87174f0c6ff4cad1671eb1f6306808aa6c445857d78"}, + {file = "cytoolz-1.0.1-cp310-cp310-win32.whl", hash = "sha256:a9baad795d72fadc3445ccd0f122abfdbdf94269157e6d6d4835636dad318804"}, + {file = "cytoolz-1.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:ad95b386a84e18e1f6136f6d343d2509d4c3aae9f5a536f3dc96808fcc56a8cf"}, + {file = "cytoolz-1.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2d958d4f04d9d7018e5c1850790d9d8e68b31c9a2deebca74b903706fdddd2b6"}, + {file = "cytoolz-1.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0f445b8b731fc0ecb1865b8e68a070084eb95d735d04f5b6c851db2daf3048ab"}, + {file = "cytoolz-1.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f546a96460a7e28eb2ec439f4664fa646c9b3e51c6ebad9a59d3922bbe65e30"}, + {file = "cytoolz-1.0.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0317681dd065532d21836f860b0563b199ee716f55d0c1f10de3ce7100c78a3b"}, + {file = "cytoolz-1.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0c0ef52febd5a7821a3fd8d10f21d460d1a3d2992f724ba9c91fbd7a96745d41"}, + {file = "cytoolz-1.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5ebaf419acf2de73b643cf96108702b8aef8e825cf4f63209ceb078d5fbbbfd"}, + {file = "cytoolz-1.0.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5f7f04eeb4088947585c92d6185a618b25ad4a0f8f66ea30c8db83cf94a425e3"}, + {file = "cytoolz-1.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:f61928803bb501c17914b82d457c6f50fe838b173fb40d39c38d5961185bd6c7"}, + {file = "cytoolz-1.0.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:d2960cb4fa01ccb985ad1280db41f90dc97a80b397af970a15d5a5de403c8c61"}, + {file = "cytoolz-1.0.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:b2b407cc3e9defa8df5eb46644f6f136586f70ba49eba96f43de67b9a0984fd3"}, + {file = "cytoolz-1.0.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:8245f929144d4d3bd7b972c9593300195c6cea246b81b4c46053c48b3f044580"}, + {file = "cytoolz-1.0.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e37385db03af65763933befe89fa70faf25301effc3b0485fec1c15d4ce4f052"}, + {file = "cytoolz-1.0.1-cp311-cp311-win32.whl", hash = "sha256:50f9c530f83e3e574fc95c264c3350adde8145f4f8fc8099f65f00cc595e5ead"}, + {file = "cytoolz-1.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:b7f6b617454b4326af7bd3c7c49b0fc80767f134eb9fd6449917a058d17a0e3c"}, + {file = "cytoolz-1.0.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fcb8f7d0d65db1269022e7e0428471edee8c937bc288ebdcb72f13eaa67c2fe4"}, + {file = "cytoolz-1.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:207d4e4b445e087e65556196ff472ff134370d9a275d591724142e255f384662"}, + {file = "cytoolz-1.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21cdf6bac6fd843f3b20280a66fd8df20dea4c58eb7214a2cd8957ec176f0bb3"}, + {file = "cytoolz-1.0.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4a55ec098036c0dea9f3bdc021f8acd9d105a945227d0811589f0573f21c9ce1"}, + {file = "cytoolz-1.0.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a13ab79ff4ce202e03ab646a2134696988b554b6dc4b71451e948403db1331d8"}, + {file = "cytoolz-1.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e2d944799026e1ff08a83241f1027a2d9276c41f7a74224cd98b7df6e03957d"}, + {file = "cytoolz-1.0.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88ba85834cd523b91fdf10325e1e6d71c798de36ea9bdc187ca7bd146420de6f"}, + {file = "cytoolz-1.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5a750b1af7e8bf6727f588940b690d69e25dc47cce5ce467925a76561317eaf7"}, + {file = "cytoolz-1.0.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:44a71870f7eae31d263d08b87da7c2bf1176f78892ed8bdade2c2850478cb126"}, + {file = "cytoolz-1.0.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c8231b9abbd8e368e036f4cc2e16902c9482d4cf9e02a6147ed0e9a3cd4a9ab0"}, + {file = "cytoolz-1.0.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:aa87599ccc755de5a096a4d6c34984de6cd9dc928a0c5eaa7607457317aeaf9b"}, + {file = "cytoolz-1.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:67cd16537df51baabde3baa770ab7b8d16839c4d21219d5b96ac59fb012ebd2d"}, + {file = "cytoolz-1.0.1-cp312-cp312-win32.whl", hash = "sha256:fb988c333f05ee30ad4693fe4da55d95ec0bb05775d2b60191236493ea2e01f9"}, + {file = "cytoolz-1.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:8f89c48d8e5aec55ffd566a8ec858706d70ed0c6a50228eca30986bfa5b4da8b"}, + {file = "cytoolz-1.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6944bb93b287032a4c5ca6879b69bcd07df46f3079cf8393958cf0b0454f50c0"}, + {file = "cytoolz-1.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e027260fd2fc5cb041277158ac294fc13dca640714527219f702fb459a59823a"}, + {file = "cytoolz-1.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88662c0e07250d26f5af9bc95911e6137e124a5c1ec2ce4a5d74de96718ab242"}, + {file = "cytoolz-1.0.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:309dffa78b0961b4c0cf55674b828fbbc793cf2d816277a5c8293c0c16155296"}, + {file = "cytoolz-1.0.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:edb34246e6eb40343c5860fc51b24937698e4fa1ee415917a73ad772a9a1746b"}, + {file = "cytoolz-1.0.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a54da7a8e4348a18d45d4d5bc84af6c716d7f131113a4f1cc45569d37edff1b"}, + {file = "cytoolz-1.0.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:241c679c3b1913c0f7259cf1d9639bed5084c86d0051641d537a0980548aa266"}, + {file = "cytoolz-1.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5bfc860251a8f280ac79696fc3343cfc3a7c30b94199e0240b6c9e5b6b01a2a5"}, + {file = "cytoolz-1.0.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:c8edd1547014050c1bdad3ff85d25c82bd1c2a3c96830c6181521eb78b9a42b3"}, + {file = "cytoolz-1.0.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:b349bf6162e8de215403d7f35f8a9b4b1853dc2a48e6e1a609a5b1a16868b296"}, + {file = "cytoolz-1.0.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:1b18b35256219b6c3dd0fa037741b85d0bea39c552eab0775816e85a52834140"}, + {file = "cytoolz-1.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:738b2350f340ff8af883eb301054eb724997f795d20d90daec7911c389d61581"}, + {file = "cytoolz-1.0.1-cp313-cp313-win32.whl", hash = "sha256:9cbd9c103df54fcca42be55ef40e7baea624ac30ee0b8bf1149f21146d1078d9"}, + {file = "cytoolz-1.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:90e577e08d3a4308186d9e1ec06876d4756b1e8164b92971c69739ea17e15297"}, + {file = "cytoolz-1.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f3a509e4ac8e711703c368476b9bbce921fcef6ebb87fa3501525f7000e44185"}, + {file = "cytoolz-1.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a7eecab6373e933dfbf4fdc0601d8fd7614f8de76793912a103b5fccf98170cd"}, + {file = "cytoolz-1.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e55ed62087f6e3e30917b5f55350c3b6be6470b849c6566018419cd159d2cebc"}, + {file = "cytoolz-1.0.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:43de33d99a4ccc07234cecd81f385456b55b0ea9c39c9eebf42f024c313728a5"}, + {file = "cytoolz-1.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:139bed875828e1727018aa0982aa140e055cbafccb7fd89faf45cbb4f2a21514"}, + {file = "cytoolz-1.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22c12671194b518aa8ce2f4422bd5064f25ab57f410ba0b78705d0a219f4a97a"}, + {file = "cytoolz-1.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:79888f2f7dc25709cd5d37b032a8833741e6a3692c8823be181d542b5999128e"}, + {file = "cytoolz-1.0.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:51628b4eb41fa25bd428f8f7b5b74fbb05f3ae65fbd265019a0dd1ded4fdf12a"}, + {file = "cytoolz-1.0.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:1db9eb7179285403d2fb56ba1ff6ec35a44921b5e2fa5ca19d69f3f9f0285ea5"}, + {file = "cytoolz-1.0.1-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:08ab7efae08e55812340bfd1b3f09f63848fe291675e2105eab1aa5327d3a16e"}, + {file = "cytoolz-1.0.1-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:e5fdc5264f884e7c0a1711a81dff112708a64b9c8561654ee578bfdccec6be09"}, + {file = "cytoolz-1.0.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:90d6a2e6ab891043ee655ec99d5e77455a9bee9e1131bdfcfb745edde81200dd"}, + {file = "cytoolz-1.0.1-cp38-cp38-win32.whl", hash = "sha256:08946e083faa5147751b34fbf78ab931f149ef758af5c1092932b459e18dcf5c"}, + {file = "cytoolz-1.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:a91b4e10a9c03796c0dc93e47ebe25bb41ecc6fafc3cf5197c603cf767a3d44d"}, + {file = "cytoolz-1.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:980c323e626ba298b77ae62871b2de7c50b9d7219e2ddf706f52dd34b8be7349"}, + {file = "cytoolz-1.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:45f6fa1b512bc2a0f2de5123db932df06c7f69d12874fe06d67772b2828e2c8b"}, + {file = "cytoolz-1.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f93f42d9100c415155ad1f71b0de362541afd4ac95e3153467c4c79972521b6b"}, + {file = "cytoolz-1.0.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a76d20dec9c090cdf4746255bbf06a762e8cc29b5c9c1d138c380bbdb3122ade"}, + {file = "cytoolz-1.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:239039585487c69aa50c5b78f6a422016297e9dea39755761202fb9f0530fe87"}, + {file = "cytoolz-1.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c28307640ca2ab57b9fbf0a834b9bf563958cd9e038378c3a559f45f13c3c541"}, + {file = "cytoolz-1.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:454880477bb901cee3a60f6324ec48c95d45acc7fecbaa9d49a5af737ded0595"}, + {file = "cytoolz-1.0.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:902115d1b1f360fd81e44def30ac309b8641661150fcbdde18ead446982ada6a"}, + {file = "cytoolz-1.0.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:e68e6b38473a3a79cee431baa22be31cac39f7df1bf23eaa737eaff42e213883"}, + {file = "cytoolz-1.0.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:32fba3f63fcb76095b0a22f4bdcc22bc62a2bd2d28d58bf02fd21754c155a3ec"}, + {file = "cytoolz-1.0.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:0724ba4cf41eb40b6cf75250820ab069e44bdf4183ff78857aaf4f0061551075"}, + {file = "cytoolz-1.0.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c42420e0686f887040d5230420ed44f0e960ccbfa29a0d65a3acd9ca52459209"}, + {file = "cytoolz-1.0.1-cp39-cp39-win32.whl", hash = "sha256:4ba8b16358ea56b1fe8e637ec421e36580866f2e787910bac1cf0a6997424a34"}, + {file = "cytoolz-1.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:92d27f84bf44586853d9562bfa3610ecec000149d030f793b4cb614fd9da1813"}, + {file = "cytoolz-1.0.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:83d19d55738ad9c60763b94f3f6d3c6e4de979aeb8d76841c1401081e0e58d96"}, + {file = "cytoolz-1.0.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f112a71fad6ea824578e6393765ce5c054603afe1471a5c753ff6c67fd872d10"}, + {file = "cytoolz-1.0.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5a515df8f8aa6e1eaaf397761a6e4aff2eef73b5f920aedf271416d5471ae5ee"}, + {file = "cytoolz-1.0.1-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:92c398e7b7023460bea2edffe5fcd0a76029580f06c3f6938ac3d198b47156f3"}, + {file = "cytoolz-1.0.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:3237e56211e03b13df47435b2369f5df281e02b04ad80a948ebd199b7bc10a47"}, + {file = "cytoolz-1.0.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ba0d1da50aab1909b165f615ba1125c8b01fcc30d606c42a61c42ea0269b5e2c"}, + {file = "cytoolz-1.0.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25b6e8dec29aa5a390092d193abd673e027d2c0b50774ae816a31454286c45c7"}, + {file = "cytoolz-1.0.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:36cd6989ebb2f18fe9af8f13e3c61064b9f741a40d83dc5afeb0322338ad25f2"}, + {file = "cytoolz-1.0.1-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a47394f8ab7fca3201f40de61fdeea20a2baffb101485ae14901ea89c3f6c95d"}, + {file = "cytoolz-1.0.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:d00ac423542af944302e034e618fb055a0c4e87ba704cd6a79eacfa6ac83a3c9"}, + {file = "cytoolz-1.0.1-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:a5ca923d1fa632f7a4fb33c0766c6fba7f87141a055c305c3e47e256fb99c413"}, + {file = "cytoolz-1.0.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:058bf996bcae9aad3acaeeb937d42e0c77c081081e67e24e9578a6a353cb7fb2"}, + {file = "cytoolz-1.0.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:69e2a1f41a3dad94a17aef4a5cc003323359b9f0a9d63d4cc867cb5690a2551d"}, + {file = "cytoolz-1.0.1-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67daeeeadb012ec2b59d63cb29c4f2a2023b0c4957c3342d354b8bb44b209e9a"}, + {file = "cytoolz-1.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:54d3d36bbf0d4344d1afa22c58725d1668e30ff9de3a8f56b03db1a6da0acb11"}, + {file = "cytoolz-1.0.1.tar.gz", hash = "sha256:89cc3161b89e1bb3ed7636f74ed2e55984fd35516904fc878cae216e42b2c7d6"}, ] [package.dependencies] @@ -1112,37 +1123,37 @@ cython = ["cython"] [[package]] name = "debugpy" -version = "1.8.8" +version = "1.8.11" description = "An implementation of the Debug Adapter Protocol for Python" optional = false python-versions = ">=3.8" files = [ - {file = "debugpy-1.8.8-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:e59b1607c51b71545cb3496876544f7186a7a27c00b436a62f285603cc68d1c6"}, - {file = "debugpy-1.8.8-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a6531d952b565b7cb2fbd1ef5df3d333cf160b44f37547a4e7cf73666aca5d8d"}, - {file = "debugpy-1.8.8-cp310-cp310-win32.whl", hash = "sha256:b01f4a5e5c5fb1d34f4ccba99a20ed01eabc45a4684f4948b5db17a319dfb23f"}, - {file = "debugpy-1.8.8-cp310-cp310-win_amd64.whl", hash = "sha256:535f4fb1c024ddca5913bb0eb17880c8f24ba28aa2c225059db145ee557035e9"}, - {file = "debugpy-1.8.8-cp311-cp311-macosx_14_0_universal2.whl", hash = "sha256:c399023146e40ae373753a58d1be0a98bf6397fadc737b97ad612886b53df318"}, - {file = "debugpy-1.8.8-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:09cc7b162586ea2171eea055985da2702b0723f6f907a423c9b2da5996ad67ba"}, - {file = "debugpy-1.8.8-cp311-cp311-win32.whl", hash = "sha256:eea8821d998ebeb02f0625dd0d76839ddde8cbf8152ebbe289dd7acf2cdc6b98"}, - {file = "debugpy-1.8.8-cp311-cp311-win_amd64.whl", hash = "sha256:d4483836da2a533f4b1454dffc9f668096ac0433de855f0c22cdce8c9f7e10c4"}, - {file = "debugpy-1.8.8-cp312-cp312-macosx_14_0_universal2.whl", hash = "sha256:0cc94186340be87b9ac5a707184ec8f36547fb66636d1029ff4f1cc020e53996"}, - {file = "debugpy-1.8.8-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64674e95916e53c2e9540a056e5f489e0ad4872645399d778f7c598eacb7b7f9"}, - {file = "debugpy-1.8.8-cp312-cp312-win32.whl", hash = "sha256:5c6e885dbf12015aed73770f29dec7023cb310d0dc2ba8bfbeb5c8e43f80edc9"}, - {file = "debugpy-1.8.8-cp312-cp312-win_amd64.whl", hash = "sha256:19ffbd84e757a6ca0113574d1bf5a2298b3947320a3e9d7d8dc3377f02d9f864"}, - {file = "debugpy-1.8.8-cp313-cp313-macosx_14_0_universal2.whl", hash = "sha256:705cd123a773d184860ed8dae99becd879dfec361098edbefb5fc0d3683eb804"}, - {file = "debugpy-1.8.8-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:890fd16803f50aa9cb1a9b9b25b5ec321656dd6b78157c74283de241993d086f"}, - {file = "debugpy-1.8.8-cp313-cp313-win32.whl", hash = "sha256:90244598214bbe704aa47556ec591d2f9869ff9e042e301a2859c57106649add"}, - {file = "debugpy-1.8.8-cp313-cp313-win_amd64.whl", hash = "sha256:4b93e4832fd4a759a0c465c967214ed0c8a6e8914bced63a28ddb0dd8c5f078b"}, - {file = "debugpy-1.8.8-cp38-cp38-macosx_14_0_x86_64.whl", hash = "sha256:143ef07940aeb8e7316de48f5ed9447644da5203726fca378f3a6952a50a9eae"}, - {file = "debugpy-1.8.8-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f95651bdcbfd3b27a408869a53fbefcc2bcae13b694daee5f1365b1b83a00113"}, - {file = "debugpy-1.8.8-cp38-cp38-win32.whl", hash = "sha256:26b461123a030e82602a750fb24d7801776aa81cd78404e54ab60e8b5fecdad5"}, - {file = "debugpy-1.8.8-cp38-cp38-win_amd64.whl", hash = "sha256:f3cbf1833e644a3100eadb6120f25be8a532035e8245584c4f7532937edc652a"}, - {file = "debugpy-1.8.8-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:53709d4ec586b525724819dc6af1a7703502f7e06f34ded7157f7b1f963bb854"}, - {file = "debugpy-1.8.8-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a9c013077a3a0000e83d97cf9cc9328d2b0bbb31f56b0e99ea3662d29d7a6a2"}, - {file = "debugpy-1.8.8-cp39-cp39-win32.whl", hash = "sha256:ffe94dd5e9a6739a75f0b85316dc185560db3e97afa6b215628d1b6a17561cb2"}, - {file = "debugpy-1.8.8-cp39-cp39-win_amd64.whl", hash = "sha256:5c0e5a38c7f9b481bf31277d2f74d2109292179081f11108e668195ef926c0f9"}, - {file = "debugpy-1.8.8-py2.py3-none-any.whl", hash = "sha256:ec684553aba5b4066d4de510859922419febc710df7bba04fe9e7ef3de15d34f"}, - {file = "debugpy-1.8.8.zip", hash = "sha256:e6355385db85cbd666be703a96ab7351bc9e6c61d694893206f8001e22aee091"}, + {file = "debugpy-1.8.11-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:2b26fefc4e31ff85593d68b9022e35e8925714a10ab4858fb1b577a8a48cb8cd"}, + {file = "debugpy-1.8.11-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:61bc8b3b265e6949855300e84dc93d02d7a3a637f2aec6d382afd4ceb9120c9f"}, + {file = "debugpy-1.8.11-cp310-cp310-win32.whl", hash = "sha256:c928bbf47f65288574b78518449edaa46c82572d340e2750889bbf8cd92f3737"}, + {file = "debugpy-1.8.11-cp310-cp310-win_amd64.whl", hash = "sha256:8da1db4ca4f22583e834dcabdc7832e56fe16275253ee53ba66627b86e304da1"}, + {file = "debugpy-1.8.11-cp311-cp311-macosx_14_0_universal2.whl", hash = "sha256:85de8474ad53ad546ff1c7c7c89230db215b9b8a02754d41cb5a76f70d0be296"}, + {file = "debugpy-1.8.11-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ffc382e4afa4aee367bf413f55ed17bd91b191dcaf979890af239dda435f2a1"}, + {file = "debugpy-1.8.11-cp311-cp311-win32.whl", hash = "sha256:40499a9979c55f72f4eb2fc38695419546b62594f8af194b879d2a18439c97a9"}, + {file = "debugpy-1.8.11-cp311-cp311-win_amd64.whl", hash = "sha256:987bce16e86efa86f747d5151c54e91b3c1e36acc03ce1ddb50f9d09d16ded0e"}, + {file = "debugpy-1.8.11-cp312-cp312-macosx_14_0_universal2.whl", hash = "sha256:84e511a7545d11683d32cdb8f809ef63fc17ea2a00455cc62d0a4dbb4ed1c308"}, + {file = "debugpy-1.8.11-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce291a5aca4985d82875d6779f61375e959208cdf09fcec40001e65fb0a54768"}, + {file = "debugpy-1.8.11-cp312-cp312-win32.whl", hash = "sha256:28e45b3f827d3bf2592f3cf7ae63282e859f3259db44ed2b129093ca0ac7940b"}, + {file = "debugpy-1.8.11-cp312-cp312-win_amd64.whl", hash = "sha256:44b1b8e6253bceada11f714acf4309ffb98bfa9ac55e4fce14f9e5d4484287a1"}, + {file = "debugpy-1.8.11-cp313-cp313-macosx_14_0_universal2.whl", hash = "sha256:8988f7163e4381b0da7696f37eec7aca19deb02e500245df68a7159739bbd0d3"}, + {file = "debugpy-1.8.11-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c1f6a173d1140e557347419767d2b14ac1c9cd847e0b4c5444c7f3144697e4e"}, + {file = "debugpy-1.8.11-cp313-cp313-win32.whl", hash = "sha256:bb3b15e25891f38da3ca0740271e63ab9db61f41d4d8541745cfc1824252cb28"}, + {file = "debugpy-1.8.11-cp313-cp313-win_amd64.whl", hash = "sha256:d8768edcbeb34da9e11bcb8b5c2e0958d25218df7a6e56adf415ef262cd7b6d1"}, + {file = "debugpy-1.8.11-cp38-cp38-macosx_14_0_x86_64.whl", hash = "sha256:ad7efe588c8f5cf940f40c3de0cd683cc5b76819446abaa50dc0829a30c094db"}, + {file = "debugpy-1.8.11-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:189058d03a40103a57144752652b3ab08ff02b7595d0ce1f651b9acc3a3a35a0"}, + {file = "debugpy-1.8.11-cp38-cp38-win32.whl", hash = "sha256:32db46ba45849daed7ccf3f2e26f7a386867b077f39b2a974bb5c4c2c3b0a280"}, + {file = "debugpy-1.8.11-cp38-cp38-win_amd64.whl", hash = "sha256:116bf8342062246ca749013df4f6ea106f23bc159305843491f64672a55af2e5"}, + {file = "debugpy-1.8.11-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:654130ca6ad5de73d978057eaf9e582244ff72d4574b3e106fb8d3d2a0d32458"}, + {file = "debugpy-1.8.11-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23dc34c5e03b0212fa3c49a874df2b8b1b8fda95160bd79c01eb3ab51ea8d851"}, + {file = "debugpy-1.8.11-cp39-cp39-win32.whl", hash = "sha256:52d8a3166c9f2815bfae05f386114b0b2d274456980d41f320299a8d9a5615a7"}, + {file = "debugpy-1.8.11-cp39-cp39-win_amd64.whl", hash = "sha256:52c3cf9ecda273a19cc092961ee34eb9ba8687d67ba34cc7b79a521c1c64c4c0"}, + {file = "debugpy-1.8.11-py2.py3-none-any.whl", hash = "sha256:0e22f846f4211383e6a416d04b4c13ed174d24cc5d43f5fd52e7821d0ebc8920"}, + {file = "debugpy-1.8.11.tar.gz", hash = "sha256:6ad2688b69235c43b020e04fecccdf6a96c8943ca9c2fb340b8adc103c655e57"}, ] [[package]] @@ -1269,13 +1280,13 @@ pyrepl = ">=0.8.2" [[package]] name = "fastjsonschema" -version = "2.20.0" +version = "2.21.1" description = "Fastest Python implementation of JSON schema" optional = false python-versions = "*" files = [ - {file = "fastjsonschema-2.20.0-py3-none-any.whl", hash = "sha256:5875f0b0fa7a0043a91e93a9b8f793bcbbba9691e7fd83dca95c28ba26d21f0a"}, - {file = "fastjsonschema-2.20.0.tar.gz", hash = "sha256:3d48fc5300ee96f5d116f10fe6f28d938e6008f59a6a025c2649475b87f76a23"}, + {file = "fastjsonschema-2.21.1-py3-none-any.whl", hash = "sha256:c9e5b7e908310918cf494a434eeb31384dd84a98b57a30bcb1f535015b554667"}, + {file = "fastjsonschema-2.21.1.tar.gz", hash = "sha256:794d4f0a58f848961ba16af7b9c85a3e88cd360df008c59aac6fc5ae9323b5d4"}, ] [package.extras] @@ -1283,86 +1294,80 @@ devel = ["colorama", "json-spec", "jsonschema", "pylint", "pytest", "pytest-benc [[package]] name = "fastrlock" -version = "0.8.2" +version = "0.8.3" description = "Fast, re-entrant optimistic lock implemented in Cython" optional = false python-versions = "*" files = [ - {file = "fastrlock-0.8.2-cp27-cp27m-macosx_10_15_x86_64.whl", hash = "sha256:94e348c72a1fd1f8191f25ea056448e4f5a87b8fbf005b39d290dcb0581a48cd"}, - {file = "fastrlock-0.8.2-cp27-cp27m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2d5595903444c854b99c42122b87edfe8a37cd698a4eae32f4fd1d2a7b6c115d"}, - {file = "fastrlock-0.8.2-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:e4bbde174a0aff5f6eeba75cf8c4c5d2a316316bc21f03a0bddca0fc3659a6f3"}, - {file = "fastrlock-0.8.2-cp27-cp27mu-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7a2ccaf88ac0db153e84305d1ef0aa138cea82c6a88309066f6eaa3bc98636cd"}, - {file = "fastrlock-0.8.2-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:31a27a2edf482df72b91fe6c6438314d2c65290aa7becc55589d156c9b91f0da"}, - {file = "fastrlock-0.8.2-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:e9904b5b37c3e5bb4a245c56bc4b7e497da57ffb8528f4fc39af9dcb168ee2e1"}, - {file = "fastrlock-0.8.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:43a241655e83e4603a152192cf022d5ca348c2f4e56dfb02e5c9c4c1a32f9cdb"}, - {file = "fastrlock-0.8.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9121a894d74e65557e47e777060a495ab85f4b903e80dd73a3c940ba042920d7"}, - {file = "fastrlock-0.8.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_24_i686.whl", hash = "sha256:11bbbbc526363955aeddb9eec4cee2a0012322b7b2f15b54f44454fcf4fd398a"}, - {file = "fastrlock-0.8.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:27786c62a400e282756ae1b090bcd7cfa35f28270cff65a9e7b27a5327a32561"}, - {file = "fastrlock-0.8.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:08315bde19d0c2e6b06593d5a418be3dc8f9b1ee721afa96867b9853fceb45cf"}, - {file = "fastrlock-0.8.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e8b49b5743ede51e0bcf6805741f39f5e0e0fd6a172ba460cb39e3097ba803bb"}, - {file = "fastrlock-0.8.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b443e73a4dfc7b6e0800ea4c13567b9694358e86f53bb2612a51c9e727cac67b"}, - {file = "fastrlock-0.8.2-cp310-cp310-win_amd64.whl", hash = "sha256:b3853ed4ce522598dc886160a7bab432a093051af85891fa2f5577c1dcac8ed6"}, - {file = "fastrlock-0.8.2-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:790fc19bccbd39426060047e53629f171a44745613bf360a045e9f9c8c4a2cea"}, - {file = "fastrlock-0.8.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:dbdce852e6bb66e1b8c36679d482971d69d93acf1785657522e51b7de30c3356"}, - {file = "fastrlock-0.8.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d47713ffe6d4a627fbf078be9836a95ac106b4a0543e3841572c91e292a5d885"}, - {file = "fastrlock-0.8.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_24_i686.whl", hash = "sha256:ea96503b918fceaf40443182742b8964d47b65c5ebdea532893cb9479620000c"}, - {file = "fastrlock-0.8.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:c6bffa978793bea5e1b00e677062e53a62255439339591b70e209fa1552d5ee0"}, - {file = "fastrlock-0.8.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:75c07726c8b1a52147fd7987d6baaa318c5dced1416c3f25593e40f56e10755b"}, - {file = "fastrlock-0.8.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:88f079335e9da631efa64486c8207564a7bcd0c00526bb9e842e9d5b7e50a6cc"}, - {file = "fastrlock-0.8.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4fb2e77ff04bc4beb71d63c8e064f052ce5a6ea1e001d528d4d7f4b37d736f2e"}, - {file = "fastrlock-0.8.2-cp311-cp311-win_amd64.whl", hash = "sha256:b4c9083ea89ab236b06e9ef2263971db3b4b507195fc7d5eecab95828dcae325"}, - {file = "fastrlock-0.8.2-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:98195866d3a9949915935d40a88e4f1c166e82e378f622c88025f2938624a90a"}, - {file = "fastrlock-0.8.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b22ea9bf5f9fad2b0077e944a7813f91593a4f61adf8faf734a70aed3f2b3a40"}, - {file = "fastrlock-0.8.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dcc1bf0ac8a194313cf6e645e300a8a379674ceed8e0b1e910a2de3e3c28989e"}, - {file = "fastrlock-0.8.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a3dcc876050b8f5cbc0ee84ef1e7f0c1dfe7c148f10098828bc4403683c33f10"}, - {file = "fastrlock-0.8.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:685e656048b59d8dfde8c601f188ad53a4d719eb97080cafc8696cda6d75865e"}, - {file = "fastrlock-0.8.2-cp312-cp312-win_amd64.whl", hash = "sha256:fb5363cf0fddd9b50525ddbf64a1e1b28ec4c6dfb28670a940cb1cf988a6786b"}, - {file = "fastrlock-0.8.2-cp35-cp35m-macosx_10_15_x86_64.whl", hash = "sha256:a74f5a92fa6e51c4f3c69b29c4662088b97be12f40652a21109605a175c81824"}, - {file = "fastrlock-0.8.2-cp35-cp35m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ccf39ad5702e33e4d335b48ef9d56e21619b529b7f7471b5211419f380329b62"}, - {file = "fastrlock-0.8.2-cp35-cp35m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:66f2662c640bb71a1016a031eea6eef9d25c2bcdf7ffd1d1ddc5a58f9a1ced04"}, - {file = "fastrlock-0.8.2-cp36-cp36m-macosx_10_15_x86_64.whl", hash = "sha256:17734e2e5af4c07ddb0fb10bd484e062c22de3be6b67940b9cc6ec2f18fa61ba"}, - {file = "fastrlock-0.8.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:ab91b0c36e95d42e1041a4907e3eefd06c482d53af3c7a77be7e214cc7cd4a63"}, - {file = "fastrlock-0.8.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b32fdf874868326351a75b1e4c02f97e802147119ae44c52d3d9da193ec34f5b"}, - {file = "fastrlock-0.8.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_24_i686.whl", hash = "sha256:2074548a335fcf7d19ebb18d9208da9e33b06f745754466a7e001d2b1c58dd19"}, - {file = "fastrlock-0.8.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4fb04442b6d1e2b36c774919c6bcbe3339c61b337261d4bd57e27932589095af"}, - {file = "fastrlock-0.8.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:1fed2f4797ad68e9982038423018cf08bec5f4ce9fed63a94a790773ed6a795c"}, - {file = "fastrlock-0.8.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e380ec4e6d8b26e389713995a43cb7fe56baea2d25fe073d4998c4821a026211"}, - {file = "fastrlock-0.8.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:25945f962c7bd808415cfde3da624d4399d4ea71ed8918538375f16bceb79e1c"}, - {file = "fastrlock-0.8.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:2c1719ddc8218b01e82fb2e82e8451bd65076cb96d7bef4477194bbb4305a968"}, - {file = "fastrlock-0.8.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:5460c5ee6ced6d61ec8cd2324ebbe793a4960c4ffa2131ffff480e3b61c99ec5"}, - {file = "fastrlock-0.8.2-cp36-cp36m-win_amd64.whl", hash = "sha256:33145acbad8317584cd64588131c7e1e286beef6280c0009b4544c91fce171d2"}, - {file = "fastrlock-0.8.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:59344c1d46b7dec97d3f22f1cc930fafe8980b3c5bc9c9765c56738a5f1559e4"}, - {file = "fastrlock-0.8.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b2a1c354f13f22b737621d914f3b4a8434ae69d3027a775e94b3e671756112f9"}, - {file = "fastrlock-0.8.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_24_i686.whl", hash = "sha256:cf81e0278b645004388873e0a1f9e3bc4c9ab8c18e377b14ed1a544be4b18c9a"}, - {file = "fastrlock-0.8.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1b15430b93d7eb3d56f6ff690d2ebecb79ed0e58248427717eba150a508d1cd7"}, - {file = "fastrlock-0.8.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:067edb0a0805bf61e17a251d5046af59f6e9d2b8ad01222e0ef7a0b7937d5548"}, - {file = "fastrlock-0.8.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:eb31fe390f03f7ae886dcc374f1099ec88526631a4cb891d399b68181f154ff0"}, - {file = "fastrlock-0.8.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:643e1e65b4f5b284427e61a894d876d10459820e93aa1e724dfb415117be24e0"}, - {file = "fastrlock-0.8.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:5dfb78dd600a12f23fc0c3ec58f81336229fdc74501ecf378d1ce5b3f2f313ea"}, - {file = "fastrlock-0.8.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:b8ca0fe21458457077e4cb2d81e1ebdb146a00b3e9e2db6180a773f7ea905032"}, - {file = "fastrlock-0.8.2-cp37-cp37m-win_amd64.whl", hash = "sha256:d918dfe473291e8bfd8e13223ea5cb9b317bd9f50c280923776c377f7c64b428"}, - {file = "fastrlock-0.8.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:c393af77c659a38bffbca215c0bcc8629ba4299568308dd7e4ff65d62cabed39"}, - {file = "fastrlock-0.8.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:73426f5eb2ecc10626c67cf86bd0af9e00d53e80e5c67d5ce8e18376d6abfa09"}, - {file = "fastrlock-0.8.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_24_i686.whl", hash = "sha256:320fd55bafee3eb069cfb5d6491f811a912758387ef2193840e2663e80e16f48"}, - {file = "fastrlock-0.8.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8c1c91a68926421f5ccbc82c85f83bd3ba593b121a46a1b9a554b3f0dd67a4bf"}, - {file = "fastrlock-0.8.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:ad1bc61c7f6b0e58106aaab034916b6cb041757f708b07fbcdd9d6e1ac629225"}, - {file = "fastrlock-0.8.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:87f4e01b042c84e6090dbc4fbe3415ddd69f6bc0130382323f9d3f1b8dd71b46"}, - {file = "fastrlock-0.8.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:d34546ad2e4a480b94b6797bcc5a322b3c705c4c74c3e4e545c4a3841c1b2d59"}, - {file = "fastrlock-0.8.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ebb32d776b61acd49f859a1d16b9e3d84e7b46d0d92aebd58acd54dc38e96664"}, - {file = "fastrlock-0.8.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:30bdbe4662992348132d03996700e1cf910d141d629179b967b146a22942264e"}, - {file = "fastrlock-0.8.2-cp38-cp38-win_amd64.whl", hash = "sha256:07ed3c7b3867c05a3d6be4ced200c7767000f3431b9be6da66972822dd86e8be"}, - {file = "fastrlock-0.8.2-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:ddf5d247f686aec853ddcc9a1234bfcc6f57b0a0670d2ad82fc25d8ae7e6a15f"}, - {file = "fastrlock-0.8.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:7269bb3fc15587b0c191eecd95831d771a7d80f0c48929e560806b038ff3066c"}, - {file = "fastrlock-0.8.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:adcb9e77aa132cc6c9de2ffe7cf880a20aa8cdba21d367d1da1a412f57bddd5d"}, - {file = "fastrlock-0.8.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_24_i686.whl", hash = "sha256:a3b8b5d2935403f1b4b25ae324560e94b59593a38c0d2e7b6c9872126a9622ed"}, - {file = "fastrlock-0.8.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2587cedbb36c7988e707d83f0f1175c1f882f362b5ebbee25d70218ea33d220d"}, - {file = "fastrlock-0.8.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:9af691a9861027181d4de07ed74f0aee12a9650ac60d0a07f4320bff84b5d95f"}, - {file = "fastrlock-0.8.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:99dd6652bd6f730beadf74ef769d38c6bbd8ee6d1c15c8d138ea680b0594387f"}, - {file = "fastrlock-0.8.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:4d63b6596368dab9e0cc66bf047e7182a56f33b34db141816a4f21f5bf958228"}, - {file = "fastrlock-0.8.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ff75c90663d6e8996610d435e71487daa853871ad1770dd83dc0f2fc4997241e"}, - {file = "fastrlock-0.8.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e27c3cd27fbd25e5223c5c992b300cd4ee8f0a75c6f222ce65838138d853712c"}, - {file = "fastrlock-0.8.2-cp39-cp39-win_amd64.whl", hash = "sha256:dd961a32a7182c3891cdebca417fda67496d5d5de6ae636962254d22723bdf52"}, - {file = "fastrlock-0.8.2.tar.gz", hash = "sha256:644ec9215cf9c4df8028d8511379a15d9c1af3e16d80e47f1b6fdc6ba118356a"}, + {file = "fastrlock-0.8.3-cp27-cp27m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bbbe31cb60ec32672969651bf68333680dacaebe1a1ec7952b8f5e6e23a70aa5"}, + {file = "fastrlock-0.8.3-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:45055702fe9bff719cdc62caa849aa7dbe9e3968306025f639ec62ef03c65e88"}, + {file = "fastrlock-0.8.3-cp27-cp27mu-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ac4fcc9b43160f7f64b49bd7ecfd129faf0793c1c8c6f0f56788c3bacae7f54a"}, + {file = "fastrlock-0.8.3-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:d3ebb29de71bf9e330c2769c34a6b5e69d560126f02994e6c09635a2784f6de3"}, + {file = "fastrlock-0.8.3-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:cc5fa9166e05409f64a804d5b6d01af670979cdb12cd2594f555cb33cdc155bd"}, + {file = "fastrlock-0.8.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:7a77ebb0a24535ef4f167da2c5ee35d9be1e96ae192137e9dc3ff75b8dfc08a5"}, + {file = "fastrlock-0.8.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_24_i686.whl", hash = "sha256:d51f7fb0db8dab341b7f03a39a3031678cf4a98b18533b176c533c122bfce47d"}, + {file = "fastrlock-0.8.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:767ec79b7f6ed9b9a00eb9ff62f2a51f56fdb221c5092ab2dadec34a9ccbfc6e"}, + {file = "fastrlock-0.8.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0d6a77b3f396f7d41094ef09606f65ae57feeb713f4285e8e417f4021617ca62"}, + {file = "fastrlock-0.8.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:92577ff82ef4a94c5667d6d2841f017820932bc59f31ffd83e4a2c56c1738f90"}, + {file = "fastrlock-0.8.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3df8514086e16bb7c66169156a8066dc152f3be892c7817e85bf09a27fa2ada2"}, + {file = "fastrlock-0.8.3-cp310-cp310-win_amd64.whl", hash = "sha256:001fd86bcac78c79658bac496e8a17472d64d558cd2227fdc768aa77f877fe40"}, + {file = "fastrlock-0.8.3-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:f68c551cf8a34b6460a3a0eba44bd7897ebfc820854e19970c52a76bf064a59f"}, + {file = "fastrlock-0.8.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:55d42f6286b9d867370af4c27bc70d04ce2d342fe450c4a4fcce14440514e695"}, + {file = "fastrlock-0.8.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_24_i686.whl", hash = "sha256:bbc3bf96dcbd68392366c477f78c9d5c47e5d9290cb115feea19f20a43ef6d05"}, + {file = "fastrlock-0.8.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:77ab8a98417a1f467dafcd2226718f7ca0cf18d4b64732f838b8c2b3e4b55cb5"}, + {file = "fastrlock-0.8.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:04bb5eef8f460d13b8c0084ea5a9d3aab2c0573991c880c0a34a56bb14951d30"}, + {file = "fastrlock-0.8.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8c9d459ce344c21ff03268212a1845aa37feab634d242131bc16c2a2355d5f65"}, + {file = "fastrlock-0.8.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:33e6fa4af4f3af3e9c747ec72d1eadc0b7ba2035456c2afb51c24d9e8a56f8fd"}, + {file = "fastrlock-0.8.3-cp311-cp311-win_amd64.whl", hash = "sha256:5e5f1665d8e70f4c5b4a67f2db202f354abc80a321ce5a26ac1493f055e3ae2c"}, + {file = "fastrlock-0.8.3-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:8cb2cf04352ea8575d496f31b3b88c42c7976e8e58cdd7d1550dfba80ca039da"}, + {file = "fastrlock-0.8.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:85a49a1f1e020097d087e1963e42cea6f307897d5ebe2cb6daf4af47ffdd3eed"}, + {file = "fastrlock-0.8.3-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5f13ec08f1adb1aa916c384b05ecb7dbebb8df9ea81abd045f60941c6283a670"}, + {file = "fastrlock-0.8.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0ea4e53a04980d646def0f5e4b5e8bd8c7884288464acab0b37ca0c65c482bfe"}, + {file = "fastrlock-0.8.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:38340f6635bd4ee2a4fb02a3a725759fe921f2ca846cb9ca44531ba739cc17b4"}, + {file = "fastrlock-0.8.3-cp312-cp312-win_amd64.whl", hash = "sha256:da06d43e1625e2ffddd303edcd6d2cd068e1c486f5fd0102b3f079c44eb13e2c"}, + {file = "fastrlock-0.8.3-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:5264088185ca8e6bc83181dff521eee94d078c269c7d557cc8d9ed5952b7be45"}, + {file = "fastrlock-0.8.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4a98ba46b3e14927550c4baa36b752d0d2f7387b8534864a8767f83cce75c160"}, + {file = "fastrlock-0.8.3-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dbdea6deeccea1917c6017d353987231c4e46c93d5338ca3e66d6cd88fbce259"}, + {file = "fastrlock-0.8.3-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c6e5bfecbc0d72ff07e43fed81671747914d6794e0926700677ed26d894d4f4f"}, + {file = "fastrlock-0.8.3-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:2a83d558470c520ed21462d304e77a12639859b205759221c8144dd2896b958a"}, + {file = "fastrlock-0.8.3-cp313-cp313-win_amd64.whl", hash = "sha256:8d1d6a28291b4ace2a66bd7b49a9ed9c762467617febdd9ab356b867ed901af8"}, + {file = "fastrlock-0.8.3-cp35-cp35m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a0eadc772353cfa464b34c814b2a97c4f3c0ba0ed7b8e1c2e0ad3ebba84bf8e0"}, + {file = "fastrlock-0.8.3-cp35-cp35m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:350f517a7d22d383f8ef76652b0609dc79de6693880a99bafc8a05c100e8c5e7"}, + {file = "fastrlock-0.8.3-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_24_i686.whl", hash = "sha256:924abbf21eba69c1b35c04278f3ca081e8de1ef5933355756e86e05499123238"}, + {file = "fastrlock-0.8.3-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a8fd6727c1e0952ba93fdc5975753781039772be6c1a3911a3afc87b53460dc0"}, + {file = "fastrlock-0.8.3-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:9c2c24856d2adc60ab398780f7b7cd8a091e4bd0c0e3bb3e67f12bef2800f377"}, + {file = "fastrlock-0.8.3-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f2b84b2fe858e64946e54e0e918b8a0e77fc7b09ca960ae1e50a130e8fbc9af8"}, + {file = "fastrlock-0.8.3-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:963123bafc41c9fba72e57145917a3f23086b5d631b6cda9cf858c428a606ff9"}, + {file = "fastrlock-0.8.3-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:314e787532ce555a7362d3c438f0a680cd88a82c69b655e7181a4dd5e67712f5"}, + {file = "fastrlock-0.8.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:494fc374afd0b6c7281c87f2ded9607c2731fc0057ec63bd3ba4451e7b7cb642"}, + {file = "fastrlock-0.8.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_24_i686.whl", hash = "sha256:da53350b90a67d5431df726816b041f1f96fd558ad6e2fc64948e13be3c7c29a"}, + {file = "fastrlock-0.8.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cdee8c02c20a0b17dbc52f54c48ede3bd421985e5d9cef5cd2136b14da967996"}, + {file = "fastrlock-0.8.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:558b538221e9c5502bb8725a1f51157ec38467a20498212838e385807e4d1b89"}, + {file = "fastrlock-0.8.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b6ac082d670e195ad53ec8d0c5d2e87648f8838b0d48f7d44a6e696b8a9528e2"}, + {file = "fastrlock-0.8.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:d7edaf0071a6a98340fc2ec45b0ba37b7a16ed7761479aab577e41e09b3565e1"}, + {file = "fastrlock-0.8.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:9c4068f21fddc47393a3526ce95b180a2f4e1ac286db8d9e59e56771da50c815"}, + {file = "fastrlock-0.8.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d7f359bb989c01a5875e8dbde9acab37b9da0943b60ef97ba9887c4598eb3009"}, + {file = "fastrlock-0.8.3-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:239e85cbebda16f14be92468ce648d0bc25e2442a3d11818deca59a7c43a4416"}, + {file = "fastrlock-0.8.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:5eef1d32d7614e0ceb6db198cf53df2a5830685cccbcf141a3e116faca967384"}, + {file = "fastrlock-0.8.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_24_i686.whl", hash = "sha256:80876d9e04e8e35abbdb3e1a81a56558f4d5cf90c8592e428d4d12efce048347"}, + {file = "fastrlock-0.8.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:24522689f4b5311afad0c8f998daec84a3dbe3a70cf821a615a763f843903030"}, + {file = "fastrlock-0.8.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:de8c90c1a23fbe929d8a9628a6c1f0f1d8af6019e786354a682a26fa22ea21be"}, + {file = "fastrlock-0.8.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e0ceefadde046a5f6a261bfeaf25de9e0eba3ee790a9795b1fa9634111d3220e"}, + {file = "fastrlock-0.8.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1dd7f1520f7424793c812e1a4090570f8ff312725dbaf10a925b688aef7425f1"}, + {file = "fastrlock-0.8.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:15e13a8b01a3bbf25f1615a6ac1d6ed40ad3bcb8db134ee5ffa7360214a8bc5c"}, + {file = "fastrlock-0.8.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fcb50e195ec981c92d0211a201704aecbd9e4f9451aea3a6f71ac5b1ec2c98cf"}, + {file = "fastrlock-0.8.3-cp38-cp38-win_amd64.whl", hash = "sha256:3e77a3d0ca5b29695d86b7d03ea88029c0ed8905cfee658eb36052df3861855a"}, + {file = "fastrlock-0.8.3-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:668fad1c8322badbc8543673892f80ee563f3da9113e60e256ae9ddd5b23daa4"}, + {file = "fastrlock-0.8.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:40b328369005a0b32de14b699192aed32f549c2d2b27a5e1f614fb7ac4cec4e9"}, + {file = "fastrlock-0.8.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_24_i686.whl", hash = "sha256:6cbfb6f7731b5a280851c93883624424068fa5b22c2f546d8ae6f1fd9311e36d"}, + {file = "fastrlock-0.8.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1fced4cb0b3f1616be68092b70a56e9173713a4a943d02e90eb9c7897a7b5e07"}, + {file = "fastrlock-0.8.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:387b2ac642938a20170a50f528817026c561882ea33306c5cbe750ae10d0a7c2"}, + {file = "fastrlock-0.8.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5a0d31840a28d66573047d2df410eb971135a2461fb952894bf51c9533cbfea5"}, + {file = "fastrlock-0.8.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:0a9dc6fa73174f974dfb22778d05a44445b611a41d5d3776b0d5daa9e50225c6"}, + {file = "fastrlock-0.8.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9842b7722e4923fe76b08d8c58a9415a9a50d4c29b80673cffeae4874ea6626a"}, + {file = "fastrlock-0.8.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:05029d7080c0c61a81d5fee78e842c9a1bf22552cd56129451a252655290dcef"}, + {file = "fastrlock-0.8.3-cp39-cp39-win_amd64.whl", hash = "sha256:accd897ab2799024bb87b489c0f087d6000b89af1f184a66e996d3d96a025a3b"}, + {file = "fastrlock-0.8.3.tar.gz", hash = "sha256:4af6734d92eaa3ab4373e6c9a1dd0d5ad1304e172b1521733c6c3b3d73c8fa5d"}, ] [[package]] @@ -1383,61 +1388,61 @@ typing = ["typing-extensions (>=4.12.2)"] [[package]] name = "fonttools" -version = "4.55.0" +version = "4.55.3" description = "Tools to manipulate font files" optional = false python-versions = ">=3.8" files = [ - {file = "fonttools-4.55.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:51c029d4c0608a21a3d3d169dfc3fb776fde38f00b35ca11fdab63ba10a16f61"}, - {file = "fonttools-4.55.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bca35b4e411362feab28e576ea10f11268b1aeed883b9f22ed05675b1e06ac69"}, - {file = "fonttools-4.55.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9ce4ba6981e10f7e0ccff6348e9775ce25ffadbee70c9fd1a3737e3e9f5fa74f"}, - {file = "fonttools-4.55.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31d00f9852a6051dac23294a4cf2df80ced85d1d173a61ba90a3d8f5abc63c60"}, - {file = "fonttools-4.55.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e198e494ca6e11f254bac37a680473a311a88cd40e58f9cc4dc4911dfb686ec6"}, - {file = "fonttools-4.55.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7208856f61770895e79732e1dcbe49d77bd5783adf73ae35f87fcc267df9db81"}, - {file = "fonttools-4.55.0-cp310-cp310-win32.whl", hash = "sha256:e7e6a352ff9e46e8ef8a3b1fe2c4478f8a553e1b5a479f2e899f9dc5f2055880"}, - {file = "fonttools-4.55.0-cp310-cp310-win_amd64.whl", hash = "sha256:636caaeefe586d7c84b5ee0734c1a5ab2dae619dc21c5cf336f304ddb8f6001b"}, - {file = "fonttools-4.55.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:fa34aa175c91477485c44ddfbb51827d470011e558dfd5c7309eb31bef19ec51"}, - {file = "fonttools-4.55.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:37dbb3fdc2ef7302d3199fb12468481cbebaee849e4b04bc55b77c24e3c49189"}, - {file = "fonttools-4.55.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5263d8e7ef3c0ae87fbce7f3ec2f546dc898d44a337e95695af2cd5ea21a967"}, - {file = "fonttools-4.55.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f307f6b5bf9e86891213b293e538d292cd1677e06d9faaa4bf9c086ad5f132f6"}, - {file = "fonttools-4.55.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:f0a4b52238e7b54f998d6a56b46a2c56b59c74d4f8a6747fb9d4042190f37cd3"}, - {file = "fonttools-4.55.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3e569711464f777a5d4ef522e781dc33f8095ab5efd7548958b36079a9f2f88c"}, - {file = "fonttools-4.55.0-cp311-cp311-win32.whl", hash = "sha256:2b3ab90ec0f7b76c983950ac601b58949f47aca14c3f21eed858b38d7ec42b05"}, - {file = "fonttools-4.55.0-cp311-cp311-win_amd64.whl", hash = "sha256:aa046f6a63bb2ad521004b2769095d4c9480c02c1efa7d7796b37826508980b6"}, - {file = "fonttools-4.55.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:838d2d8870f84fc785528a692e724f2379d5abd3fc9dad4d32f91cf99b41e4a7"}, - {file = "fonttools-4.55.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f46b863d74bab7bb0d395f3b68d3f52a03444964e67ce5c43ce43a75efce9246"}, - {file = "fonttools-4.55.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33b52a9cfe4e658e21b1f669f7309b4067910321757fec53802ca8f6eae96a5a"}, - {file = "fonttools-4.55.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:732a9a63d6ea4a81b1b25a1f2e5e143761b40c2e1b79bb2b68e4893f45139a40"}, - {file = "fonttools-4.55.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7dd91ac3fcb4c491bb4763b820bcab6c41c784111c24172616f02f4bc227c17d"}, - {file = "fonttools-4.55.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1f0e115281a32ff532118aa851ef497a1b7cda617f4621c1cdf81ace3e36fb0c"}, - {file = "fonttools-4.55.0-cp312-cp312-win32.whl", hash = "sha256:6c99b5205844f48a05cb58d4a8110a44d3038c67ed1d79eb733c4953c628b0f6"}, - {file = "fonttools-4.55.0-cp312-cp312-win_amd64.whl", hash = "sha256:f8c8c76037d05652510ae45be1cd8fb5dd2fd9afec92a25374ac82255993d57c"}, - {file = "fonttools-4.55.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8118dc571921dc9e4b288d9cb423ceaf886d195a2e5329cc427df82bba872cd9"}, - {file = "fonttools-4.55.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:01124f2ca6c29fad4132d930da69158d3f49b2350e4a779e1efbe0e82bd63f6c"}, - {file = "fonttools-4.55.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81ffd58d2691f11f7c8438796e9f21c374828805d33e83ff4b76e4635633674c"}, - {file = "fonttools-4.55.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5435e5f1eb893c35c2bc2b9cd3c9596b0fcb0a59e7a14121562986dd4c47b8dd"}, - {file = "fonttools-4.55.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d12081729280c39d001edd0f4f06d696014c26e6e9a0a55488fabc37c28945e4"}, - {file = "fonttools-4.55.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a7ad1f1b98ab6cb927ab924a38a8649f1ffd7525c75fe5b594f5dab17af70e18"}, - {file = "fonttools-4.55.0-cp313-cp313-win32.whl", hash = "sha256:abe62987c37630dca69a104266277216de1023cf570c1643bb3a19a9509e7a1b"}, - {file = "fonttools-4.55.0-cp313-cp313-win_amd64.whl", hash = "sha256:2863555ba90b573e4201feaf87a7e71ca3b97c05aa4d63548a4b69ea16c9e998"}, - {file = "fonttools-4.55.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:00f7cf55ad58a57ba421b6a40945b85ac7cc73094fb4949c41171d3619a3a47e"}, - {file = "fonttools-4.55.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f27526042efd6f67bfb0cc2f1610fa20364396f8b1fc5edb9f45bb815fb090b2"}, - {file = "fonttools-4.55.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8e67974326af6a8879dc2a4ec63ab2910a1c1a9680ccd63e4a690950fceddbe"}, - {file = "fonttools-4.55.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:61dc0a13451143c5e987dec5254d9d428f3c2789a549a7cf4f815b63b310c1cc"}, - {file = "fonttools-4.55.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:b2e526b325a903868c62155a6a7e24df53f6ce4c5c3160214d8fe1be2c41b478"}, - {file = "fonttools-4.55.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:b7ef9068a1297714e6fefe5932c33b058aa1d45a2b8be32a4c6dee602ae22b5c"}, - {file = "fonttools-4.55.0-cp38-cp38-win32.whl", hash = "sha256:55718e8071be35dff098976bc249fc243b58efa263768c611be17fe55975d40a"}, - {file = "fonttools-4.55.0-cp38-cp38-win_amd64.whl", hash = "sha256:553bd4f8cc327f310c20158e345e8174c8eed49937fb047a8bda51daf2c353c8"}, - {file = "fonttools-4.55.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3f901cef813f7c318b77d1c5c14cf7403bae5cb977cede023e22ba4316f0a8f6"}, - {file = "fonttools-4.55.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8c9679fc0dd7e8a5351d321d8d29a498255e69387590a86b596a45659a39eb0d"}, - {file = "fonttools-4.55.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd2820a8b632f3307ebb0bf57948511c2208e34a4939cf978333bc0a3f11f838"}, - {file = "fonttools-4.55.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23bbbb49bec613a32ed1b43df0f2b172313cee690c2509f1af8fdedcf0a17438"}, - {file = "fonttools-4.55.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:a656652e1f5d55b9728937a7e7d509b73d23109cddd4e89ee4f49bde03b736c6"}, - {file = "fonttools-4.55.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:f50a1f455902208486fbca47ce33054208a4e437b38da49d6721ce2fef732fcf"}, - {file = "fonttools-4.55.0-cp39-cp39-win32.whl", hash = "sha256:161d1ac54c73d82a3cded44202d0218ab007fde8cf194a23d3dd83f7177a2f03"}, - {file = "fonttools-4.55.0-cp39-cp39-win_amd64.whl", hash = "sha256:ca7fd6987c68414fece41c96836e945e1f320cda56fc96ffdc16e54a44ec57a2"}, - {file = "fonttools-4.55.0-py3-none-any.whl", hash = "sha256:12db5888cd4dd3fcc9f0ee60c6edd3c7e1fd44b7dd0f31381ea03df68f8a153f"}, - {file = "fonttools-4.55.0.tar.gz", hash = "sha256:7636acc6ab733572d5e7eec922b254ead611f1cdad17be3f0be7418e8bfaca71"}, + {file = "fonttools-4.55.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1dcc07934a2165ccdc3a5a608db56fb3c24b609658a5b340aee4ecf3ba679dc0"}, + {file = "fonttools-4.55.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f7d66c15ba875432a2d2fb419523f5d3d347f91f48f57b8b08a2dfc3c39b8a3f"}, + {file = "fonttools-4.55.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:27e4ae3592e62eba83cd2c4ccd9462dcfa603ff78e09110680a5444c6925d841"}, + {file = "fonttools-4.55.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:62d65a3022c35e404d19ca14f291c89cc5890032ff04f6c17af0bd1927299674"}, + {file = "fonttools-4.55.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d342e88764fb201286d185093781bf6628bbe380a913c24adf772d901baa8276"}, + {file = "fonttools-4.55.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:dd68c87a2bfe37c5b33bcda0fba39b65a353876d3b9006fde3adae31f97b3ef5"}, + {file = "fonttools-4.55.3-cp310-cp310-win32.whl", hash = "sha256:1bc7ad24ff98846282eef1cbeac05d013c2154f977a79886bb943015d2b1b261"}, + {file = "fonttools-4.55.3-cp310-cp310-win_amd64.whl", hash = "sha256:b54baf65c52952db65df39fcd4820668d0ef4766c0ccdf32879b77f7c804d5c5"}, + {file = "fonttools-4.55.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8c4491699bad88efe95772543cd49870cf756b019ad56294f6498982408ab03e"}, + {file = "fonttools-4.55.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5323a22eabddf4b24f66d26894f1229261021dacd9d29e89f7872dd8c63f0b8b"}, + {file = "fonttools-4.55.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5480673f599ad410695ca2ddef2dfefe9df779a9a5cda89503881e503c9c7d90"}, + {file = "fonttools-4.55.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da9da6d65cd7aa6b0f806556f4985bcbf603bf0c5c590e61b43aa3e5a0f822d0"}, + {file = "fonttools-4.55.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e894b5bd60d9f473bed7a8f506515549cc194de08064d829464088d23097331b"}, + {file = "fonttools-4.55.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:aee3b57643827e237ff6ec6d28d9ff9766bd8b21e08cd13bff479e13d4b14765"}, + {file = "fonttools-4.55.3-cp311-cp311-win32.whl", hash = "sha256:eb6ca911c4c17eb51853143624d8dc87cdcdf12a711fc38bf5bd21521e79715f"}, + {file = "fonttools-4.55.3-cp311-cp311-win_amd64.whl", hash = "sha256:6314bf82c54c53c71805318fcf6786d986461622dd926d92a465199ff54b1b72"}, + {file = "fonttools-4.55.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:f9e736f60f4911061235603a6119e72053073a12c6d7904011df2d8fad2c0e35"}, + {file = "fonttools-4.55.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7a8aa2c5e5b8b3bcb2e4538d929f6589a5c6bdb84fd16e2ed92649fb5454f11c"}, + {file = "fonttools-4.55.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:07f8288aacf0a38d174445fc78377a97fb0b83cfe352a90c9d9c1400571963c7"}, + {file = "fonttools-4.55.3-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8d5e8916c0970fbc0f6f1bece0063363bb5857a7f170121a4493e31c3db3314"}, + {file = "fonttools-4.55.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ae3b6600565b2d80b7c05acb8e24d2b26ac407b27a3f2e078229721ba5698427"}, + {file = "fonttools-4.55.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:54153c49913f45065c8d9e6d0c101396725c5621c8aee744719300f79771d75a"}, + {file = "fonttools-4.55.3-cp312-cp312-win32.whl", hash = "sha256:827e95fdbbd3e51f8b459af5ea10ecb4e30af50221ca103bea68218e9615de07"}, + {file = "fonttools-4.55.3-cp312-cp312-win_amd64.whl", hash = "sha256:e6e8766eeeb2de759e862004aa11a9ea3d6f6d5ec710551a88b476192b64fd54"}, + {file = "fonttools-4.55.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a430178ad3e650e695167cb53242dae3477b35c95bef6525b074d87493c4bf29"}, + {file = "fonttools-4.55.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:529cef2ce91dc44f8e407cc567fae6e49a1786f2fefefa73a294704c415322a4"}, + {file = "fonttools-4.55.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e75f12c82127486fac2d8bfbf5bf058202f54bf4f158d367e41647b972342ca"}, + {file = "fonttools-4.55.3-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:859c358ebf41db18fb72342d3080bce67c02b39e86b9fbcf1610cca14984841b"}, + {file = "fonttools-4.55.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:546565028e244a701f73df6d8dd6be489d01617863ec0c6a42fa25bf45d43048"}, + {file = "fonttools-4.55.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:aca318b77f23523309eec4475d1fbbb00a6b133eb766a8bdc401faba91261abe"}, + {file = "fonttools-4.55.3-cp313-cp313-win32.whl", hash = "sha256:8c5ec45428edaa7022f1c949a632a6f298edc7b481312fc7dc258921e9399628"}, + {file = "fonttools-4.55.3-cp313-cp313-win_amd64.whl", hash = "sha256:11e5de1ee0d95af4ae23c1a138b184b7f06e0b6abacabf1d0db41c90b03d834b"}, + {file = "fonttools-4.55.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:caf8230f3e10f8f5d7593eb6d252a37caf58c480b19a17e250a63dad63834cf3"}, + {file = "fonttools-4.55.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b586ab5b15b6097f2fb71cafa3c98edfd0dba1ad8027229e7b1e204a58b0e09d"}, + {file = "fonttools-4.55.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a8c2794ded89399cc2169c4d0bf7941247b8d5932b2659e09834adfbb01589aa"}, + {file = "fonttools-4.55.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf4fe7c124aa3f4e4c1940880156e13f2f4d98170d35c749e6b4f119a872551e"}, + {file = "fonttools-4.55.3-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:86721fbc389ef5cc1e2f477019e5069e8e4421e8d9576e9c26f840dbb04678de"}, + {file = "fonttools-4.55.3-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:89bdc5d88bdeec1b15af790810e267e8332d92561dce4f0748c2b95c9bdf3926"}, + {file = "fonttools-4.55.3-cp38-cp38-win32.whl", hash = "sha256:bc5dbb4685e51235ef487e4bd501ddfc49be5aede5e40f4cefcccabc6e60fb4b"}, + {file = "fonttools-4.55.3-cp38-cp38-win_amd64.whl", hash = "sha256:cd70de1a52a8ee2d1877b6293af8a2484ac82514f10b1c67c1c5762d38073e56"}, + {file = "fonttools-4.55.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:bdcc9f04b36c6c20978d3f060e5323a43f6222accc4e7fcbef3f428e216d96af"}, + {file = "fonttools-4.55.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c3ca99e0d460eff46e033cd3992a969658c3169ffcd533e0a39c63a38beb6831"}, + {file = "fonttools-4.55.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22f38464daa6cdb7b6aebd14ab06609328fe1e9705bb0fcc7d1e69de7109ee02"}, + {file = "fonttools-4.55.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed63959d00b61959b035c7d47f9313c2c1ece090ff63afea702fe86de00dbed4"}, + {file = "fonttools-4.55.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:5e8d657cd7326eeaba27de2740e847c6b39dde2f8d7cd7cc56f6aad404ddf0bd"}, + {file = "fonttools-4.55.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:fb594b5a99943042c702c550d5494bdd7577f6ef19b0bc73877c948a63184a32"}, + {file = "fonttools-4.55.3-cp39-cp39-win32.whl", hash = "sha256:dc5294a3d5c84226e3dbba1b6f61d7ad813a8c0238fceea4e09aa04848c3d851"}, + {file = "fonttools-4.55.3-cp39-cp39-win_amd64.whl", hash = "sha256:aedbeb1db64496d098e6be92b2e63b5fac4e53b1b92032dfc6988e1ea9134a4d"}, + {file = "fonttools-4.55.3-py3-none-any.whl", hash = "sha256:f412604ccbeee81b091b420272841e5ec5ef68967a9790e80bffd0e30b8e2977"}, + {file = "fonttools-4.55.3.tar.gz", hash = "sha256:3983313c2a04d6cc1fe9251f8fc647754cf49a61dac6cb1e7249ae67afaafc45"}, ] [package.extras] @@ -1512,13 +1517,13 @@ sphinx-basic-ng = "*" [[package]] name = "google-api-core" -version = "2.23.0" +version = "2.24.0" description = "Google API client core library" optional = false python-versions = ">=3.7" files = [ - {file = "google_api_core-2.23.0-py3-none-any.whl", hash = "sha256:c20100d4c4c41070cf365f1d8ddf5365915291b5eb11b83829fbd1c999b5122f"}, - {file = "google_api_core-2.23.0.tar.gz", hash = "sha256:2ceb087315e6af43f256704b871d99326b1f12a9d6ce99beaedec99ba26a0ace"}, + {file = "google_api_core-2.24.0-py3-none-any.whl", hash = "sha256:10d82ac0fca69c82a25b3efdeefccf6f28e02ebb97925a8cce8edbfe379929d9"}, + {file = "google_api_core-2.24.0.tar.gz", hash = "sha256:e255640547a597a4da010876d333208ddac417d60add22b6851a0c66a831fcaf"}, ] [package.dependencies] @@ -1544,13 +1549,13 @@ grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] [[package]] name = "google-auth" -version = "2.36.0" +version = "2.37.0" description = "Google Authentication Library" optional = false python-versions = ">=3.7" files = [ - {file = "google_auth-2.36.0-py2.py3-none-any.whl", hash = "sha256:51a15d47028b66fd36e5c64a82d2d57480075bccc7da37cde257fc94177a61fb"}, - {file = "google_auth-2.36.0.tar.gz", hash = "sha256:545e9618f2df0bcbb7dcbc45a546485b1212624716975a1ea5ae8149ce769ab1"}, + {file = "google_auth-2.37.0-py2.py3-none-any.whl", hash = "sha256:42664f18290a6be591be5329a96fe30184be1a1badb7292a7f686a9659de9ca0"}, + {file = "google_auth-2.37.0.tar.gz", hash = "sha256:0054623abf1f9c83492c63d3f47e77f0a544caa3d40b2d98e099a611c2dd5d00"}, ] [package.dependencies] @@ -1561,6 +1566,7 @@ rsa = ">=3.1.4,<5" [package.extras] aiohttp = ["aiohttp (>=3.6.2,<4.0.0.dev0)", "requests (>=2.20.0,<3.0.0.dev0)"] enterprise-cert = ["cryptography", "pyopenssl"] +pyjwt = ["cryptography (>=38.0.3)", "pyjwt (>=2.0)"] pyopenssl = ["cryptography (>=38.0.3)", "pyopenssl (>=20.0.0)"] reauth = ["pyu2f (>=0.1.5)"] requests = ["requests (>=2.20.0,<3.0.0.dev0)"] @@ -1670,85 +1676,85 @@ test = ["objgraph", "psutil"] [[package]] name = "grpcio" -version = "1.68.0" +version = "1.68.1" description = "HTTP/2-based RPC framework" optional = false python-versions = ">=3.8" files = [ - {file = "grpcio-1.68.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:619b5d0f29f4f5351440e9343224c3e19912c21aeda44e0c49d0d147a8d01544"}, - {file = "grpcio-1.68.0-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:a59f5822f9459bed098ffbceb2713abbf7c6fd13f2b9243461da5c338d0cd6c3"}, - {file = "grpcio-1.68.0-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:c03d89df516128febc5a7e760d675b478ba25802447624edf7aa13b1e7b11e2a"}, - {file = "grpcio-1.68.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44bcbebb24363d587472089b89e2ea0ab2e2b4df0e4856ba4c0b087c82412121"}, - {file = "grpcio-1.68.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:79f81b7fbfb136247b70465bd836fa1733043fdee539cd6031cb499e9608a110"}, - {file = "grpcio-1.68.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:88fb2925789cfe6daa20900260ef0a1d0a61283dfb2d2fffe6194396a354c618"}, - {file = "grpcio-1.68.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:99f06232b5c9138593ae6f2e355054318717d32a9c09cdc5a2885540835067a1"}, - {file = "grpcio-1.68.0-cp310-cp310-win32.whl", hash = "sha256:a6213d2f7a22c3c30a479fb5e249b6b7e648e17f364598ff64d08a5136fe488b"}, - {file = "grpcio-1.68.0-cp310-cp310-win_amd64.whl", hash = "sha256:15327ab81131ef9b94cb9f45b5bd98803a179c7c61205c8c0ac9aff9d6c4e82a"}, - {file = "grpcio-1.68.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:3b2b559beb2d433129441783e5f42e3be40a9e1a89ec906efabf26591c5cd415"}, - {file = "grpcio-1.68.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e46541de8425a4d6829ac6c5d9b16c03c292105fe9ebf78cb1c31e8d242f9155"}, - {file = "grpcio-1.68.0-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:c1245651f3c9ea92a2db4f95d37b7597db6b246d5892bca6ee8c0e90d76fb73c"}, - {file = "grpcio-1.68.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f1931c7aa85be0fa6cea6af388e576f3bf6baee9e5d481c586980c774debcb4"}, - {file = "grpcio-1.68.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b0ff09c81e3aded7a183bc6473639b46b6caa9c1901d6f5e2cba24b95e59e30"}, - {file = "grpcio-1.68.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:8c73f9fbbaee1a132487e31585aa83987ddf626426d703ebcb9a528cf231c9b1"}, - {file = "grpcio-1.68.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6b2f98165ea2790ea159393a2246b56f580d24d7da0d0342c18a085299c40a75"}, - {file = "grpcio-1.68.0-cp311-cp311-win32.whl", hash = "sha256:e1e7ed311afb351ff0d0e583a66fcb39675be112d61e7cfd6c8269884a98afbc"}, - {file = "grpcio-1.68.0-cp311-cp311-win_amd64.whl", hash = "sha256:e0d2f68eaa0a755edd9a47d40e50dba6df2bceda66960dee1218da81a2834d27"}, - {file = "grpcio-1.68.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:8af6137cc4ae8e421690d276e7627cfc726d4293f6607acf9ea7260bd8fc3d7d"}, - {file = "grpcio-1.68.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:4028b8e9a3bff6f377698587d642e24bd221810c06579a18420a17688e421af7"}, - {file = "grpcio-1.68.0-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:f60fa2adf281fd73ae3a50677572521edca34ba373a45b457b5ebe87c2d01e1d"}, - {file = "grpcio-1.68.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e18589e747c1e70b60fab6767ff99b2d0c359ea1db8a2cb524477f93cdbedf5b"}, - {file = "grpcio-1.68.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e0d30f3fee9372796f54d3100b31ee70972eaadcc87314be369360248a3dcffe"}, - {file = "grpcio-1.68.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:7e0a3e72c0e9a1acab77bef14a73a416630b7fd2cbd893c0a873edc47c42c8cd"}, - {file = "grpcio-1.68.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a831dcc343440969aaa812004685ed322cdb526cd197112d0db303b0da1e8659"}, - {file = "grpcio-1.68.0-cp312-cp312-win32.whl", hash = "sha256:5a180328e92b9a0050958ced34dddcb86fec5a8b332f5a229e353dafc16cd332"}, - {file = "grpcio-1.68.0-cp312-cp312-win_amd64.whl", hash = "sha256:2bddd04a790b69f7a7385f6a112f46ea0b34c4746f361ebafe9ca0be567c78e9"}, - {file = "grpcio-1.68.0-cp313-cp313-linux_armv7l.whl", hash = "sha256:fc05759ffbd7875e0ff2bd877be1438dfe97c9312bbc558c8284a9afa1d0f40e"}, - {file = "grpcio-1.68.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:15fa1fe25d365a13bc6d52fcac0e3ee1f9baebdde2c9b3b2425f8a4979fccea1"}, - {file = "grpcio-1.68.0-cp313-cp313-manylinux_2_17_aarch64.whl", hash = "sha256:32a9cb4686eb2e89d97022ecb9e1606d132f85c444354c17a7dbde4a455e4a3b"}, - {file = "grpcio-1.68.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dba037ff8d284c8e7ea9a510c8ae0f5b016004f13c3648f72411c464b67ff2fb"}, - {file = "grpcio-1.68.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0efbbd849867e0e569af09e165363ade75cf84f5229b2698d53cf22c7a4f9e21"}, - {file = "grpcio-1.68.0-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:4e300e6978df0b65cc2d100c54e097c10dfc7018b9bd890bbbf08022d47f766d"}, - {file = "grpcio-1.68.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:6f9c7ad1a23e1047f827385f4713b5b8c6c7d325705be1dd3e31fb00dcb2f665"}, - {file = "grpcio-1.68.0-cp313-cp313-win32.whl", hash = "sha256:3ac7f10850fd0487fcce169c3c55509101c3bde2a3b454869639df2176b60a03"}, - {file = "grpcio-1.68.0-cp313-cp313-win_amd64.whl", hash = "sha256:afbf45a62ba85a720491bfe9b2642f8761ff348006f5ef67e4622621f116b04a"}, - {file = "grpcio-1.68.0-cp38-cp38-linux_armv7l.whl", hash = "sha256:f8f695d9576ce836eab27ba7401c60acaf9ef6cf2f70dfe5462055ba3df02cc3"}, - {file = "grpcio-1.68.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:9fe1b141cda52f2ca73e17d2d3c6a9f3f3a0c255c216b50ce616e9dca7e3441d"}, - {file = "grpcio-1.68.0-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:4df81d78fd1646bf94ced4fb4cd0a7fe2e91608089c522ef17bc7db26e64effd"}, - {file = "grpcio-1.68.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:46a2d74d4dd8993151c6cd585594c082abe74112c8e4175ddda4106f2ceb022f"}, - {file = "grpcio-1.68.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a17278d977746472698460c63abf333e1d806bd41f2224f90dbe9460101c9796"}, - {file = "grpcio-1.68.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:15377bce516b1c861c35e18eaa1c280692bf563264836cece693c0f169b48829"}, - {file = "grpcio-1.68.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:cc5f0a4f5904b8c25729a0498886b797feb817d1fd3812554ffa39551112c161"}, - {file = "grpcio-1.68.0-cp38-cp38-win32.whl", hash = "sha256:def1a60a111d24376e4b753db39705adbe9483ef4ca4761f825639d884d5da78"}, - {file = "grpcio-1.68.0-cp38-cp38-win_amd64.whl", hash = "sha256:55d3b52fd41ec5772a953612db4e70ae741a6d6ed640c4c89a64f017a1ac02b5"}, - {file = "grpcio-1.68.0-cp39-cp39-linux_armv7l.whl", hash = "sha256:0d230852ba97654453d290e98d6aa61cb48fa5fafb474fb4c4298d8721809354"}, - {file = "grpcio-1.68.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:50992f214264e207e07222703c17d9cfdcc2c46ed5a1ea86843d440148ebbe10"}, - {file = "grpcio-1.68.0-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:14331e5c27ed3545360464a139ed279aa09db088f6e9502e95ad4bfa852bb116"}, - {file = "grpcio-1.68.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f84890b205692ea813653ece4ac9afa2139eae136e419231b0eec7c39fdbe4c2"}, - {file = "grpcio-1.68.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b0cf343c6f4f6aa44863e13ec9ddfe299e0be68f87d68e777328bff785897b05"}, - {file = "grpcio-1.68.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:fd2c2d47969daa0e27eadaf15c13b5e92605c5e5953d23c06d0b5239a2f176d3"}, - {file = "grpcio-1.68.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:18668e36e7f4045820f069997834e94e8275910b1f03e078a6020bd464cb2363"}, - {file = "grpcio-1.68.0-cp39-cp39-win32.whl", hash = "sha256:2af76ab7c427aaa26aa9187c3e3c42f38d3771f91a20f99657d992afada2294a"}, - {file = "grpcio-1.68.0-cp39-cp39-win_amd64.whl", hash = "sha256:e694b5928b7b33ca2d3b4d5f9bf8b5888906f181daff6b406f4938f3a997a490"}, - {file = "grpcio-1.68.0.tar.gz", hash = "sha256:7e7483d39b4a4fddb9906671e9ea21aaad4f031cdfc349fec76bdfa1e404543a"}, + {file = "grpcio-1.68.1-cp310-cp310-linux_armv7l.whl", hash = "sha256:d35740e3f45f60f3c37b1e6f2f4702c23867b9ce21c6410254c9c682237da68d"}, + {file = "grpcio-1.68.1-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:d99abcd61760ebb34bdff37e5a3ba333c5cc09feda8c1ad42547bea0416ada78"}, + {file = "grpcio-1.68.1-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:f8261fa2a5f679abeb2a0a93ad056d765cdca1c47745eda3f2d87f874ff4b8c9"}, + {file = "grpcio-1.68.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0feb02205a27caca128627bd1df4ee7212db051019a9afa76f4bb6a1a80ca95e"}, + {file = "grpcio-1.68.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:919d7f18f63bcad3a0f81146188e90274fde800a94e35d42ffe9eadf6a9a6330"}, + {file = "grpcio-1.68.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:963cc8d7d79b12c56008aabd8b457f400952dbea8997dd185f155e2f228db079"}, + {file = "grpcio-1.68.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ccf2ebd2de2d6661e2520dae293298a3803a98ebfc099275f113ce1f6c2a80f1"}, + {file = "grpcio-1.68.1-cp310-cp310-win32.whl", hash = "sha256:2cc1fd04af8399971bcd4f43bd98c22d01029ea2e56e69c34daf2bf8470e47f5"}, + {file = "grpcio-1.68.1-cp310-cp310-win_amd64.whl", hash = "sha256:ee2e743e51cb964b4975de572aa8fb95b633f496f9fcb5e257893df3be854746"}, + {file = "grpcio-1.68.1-cp311-cp311-linux_armv7l.whl", hash = "sha256:55857c71641064f01ff0541a1776bfe04a59db5558e82897d35a7793e525774c"}, + {file = "grpcio-1.68.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4b177f5547f1b995826ef529d2eef89cca2f830dd8b2c99ffd5fde4da734ba73"}, + {file = "grpcio-1.68.1-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:3522c77d7e6606d6665ec8d50e867f13f946a4e00c7df46768f1c85089eae515"}, + {file = "grpcio-1.68.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9d1fae6bbf0816415b81db1e82fb3bf56f7857273c84dcbe68cbe046e58e1ccd"}, + {file = "grpcio-1.68.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:298ee7f80e26f9483f0b6f94cc0a046caf54400a11b644713bb5b3d8eb387600"}, + {file = "grpcio-1.68.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:cbb5780e2e740b6b4f2d208e90453591036ff80c02cc605fea1af8e6fc6b1bbe"}, + {file = "grpcio-1.68.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ddda1aa22495d8acd9dfbafff2866438d12faec4d024ebc2e656784d96328ad0"}, + {file = "grpcio-1.68.1-cp311-cp311-win32.whl", hash = "sha256:b33bd114fa5a83f03ec6b7b262ef9f5cac549d4126f1dc702078767b10c46ed9"}, + {file = "grpcio-1.68.1-cp311-cp311-win_amd64.whl", hash = "sha256:7f20ebec257af55694d8f993e162ddf0d36bd82d4e57f74b31c67b3c6d63d8b2"}, + {file = "grpcio-1.68.1-cp312-cp312-linux_armv7l.whl", hash = "sha256:8829924fffb25386995a31998ccbbeaa7367223e647e0122043dfc485a87c666"}, + {file = "grpcio-1.68.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:3aed6544e4d523cd6b3119b0916cef3d15ef2da51e088211e4d1eb91a6c7f4f1"}, + {file = "grpcio-1.68.1-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:4efac5481c696d5cb124ff1c119a78bddbfdd13fc499e3bc0ca81e95fc573684"}, + {file = "grpcio-1.68.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ab2d912ca39c51f46baf2a0d92aa265aa96b2443266fc50d234fa88bf877d8e"}, + {file = "grpcio-1.68.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95c87ce2a97434dffe7327a4071839ab8e8bffd0054cc74cbe971fba98aedd60"}, + {file = "grpcio-1.68.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:e4842e4872ae4ae0f5497bf60a0498fa778c192cc7a9e87877abd2814aca9475"}, + {file = "grpcio-1.68.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:255b1635b0ed81e9f91da4fcc8d43b7ea5520090b9a9ad9340d147066d1d3613"}, + {file = "grpcio-1.68.1-cp312-cp312-win32.whl", hash = "sha256:7dfc914cc31c906297b30463dde0b9be48e36939575eaf2a0a22a8096e69afe5"}, + {file = "grpcio-1.68.1-cp312-cp312-win_amd64.whl", hash = "sha256:a0c8ddabef9c8f41617f213e527254c41e8b96ea9d387c632af878d05db9229c"}, + {file = "grpcio-1.68.1-cp313-cp313-linux_armv7l.whl", hash = "sha256:a47faedc9ea2e7a3b6569795c040aae5895a19dde0c728a48d3c5d7995fda385"}, + {file = "grpcio-1.68.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:390eee4225a661c5cd133c09f5da1ee3c84498dc265fd292a6912b65c421c78c"}, + {file = "grpcio-1.68.1-cp313-cp313-manylinux_2_17_aarch64.whl", hash = "sha256:66a24f3d45c33550703f0abb8b656515b0ab777970fa275693a2f6dc8e35f1c1"}, + {file = "grpcio-1.68.1-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c08079b4934b0bf0a8847f42c197b1d12cba6495a3d43febd7e99ecd1cdc8d54"}, + {file = "grpcio-1.68.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8720c25cd9ac25dd04ee02b69256d0ce35bf8a0f29e20577427355272230965a"}, + {file = "grpcio-1.68.1-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:04cfd68bf4f38f5bb959ee2361a7546916bd9a50f78617a346b3aeb2b42e2161"}, + {file = "grpcio-1.68.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:c28848761a6520c5c6071d2904a18d339a796ebe6b800adc8b3f474c5ce3c3ad"}, + {file = "grpcio-1.68.1-cp313-cp313-win32.whl", hash = "sha256:77d65165fc35cff6e954e7fd4229e05ec76102d4406d4576528d3a3635fc6172"}, + {file = "grpcio-1.68.1-cp313-cp313-win_amd64.whl", hash = "sha256:a8040f85dcb9830d8bbb033ae66d272614cec6faceee88d37a88a9bd1a7a704e"}, + {file = "grpcio-1.68.1-cp38-cp38-linux_armv7l.whl", hash = "sha256:eeb38ff04ab6e5756a2aef6ad8d94e89bb4a51ef96e20f45c44ba190fa0bcaad"}, + {file = "grpcio-1.68.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8a3869a6661ec8f81d93f4597da50336718bde9eb13267a699ac7e0a1d6d0bea"}, + {file = "grpcio-1.68.1-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:2c4cec6177bf325eb6faa6bd834d2ff6aa8bb3b29012cceb4937b86f8b74323c"}, + {file = "grpcio-1.68.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:12941d533f3cd45d46f202e3667be8ebf6bcb3573629c7ec12c3e211d99cfccf"}, + {file = "grpcio-1.68.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80af6f1e69c5e68a2be529990684abdd31ed6622e988bf18850075c81bb1ad6e"}, + {file = "grpcio-1.68.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:e8dbe3e00771bfe3d04feed8210fc6617006d06d9a2679b74605b9fed3e8362c"}, + {file = "grpcio-1.68.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:83bbf5807dc3ee94ce1de2dfe8a356e1d74101e4b9d7aa8c720cc4818a34aded"}, + {file = "grpcio-1.68.1-cp38-cp38-win32.whl", hash = "sha256:8cb620037a2fd9eeee97b4531880e439ebfcd6d7d78f2e7dcc3726428ab5ef63"}, + {file = "grpcio-1.68.1-cp38-cp38-win_amd64.whl", hash = "sha256:52fbf85aa71263380d330f4fce9f013c0798242e31ede05fcee7fbe40ccfc20d"}, + {file = "grpcio-1.68.1-cp39-cp39-linux_armv7l.whl", hash = "sha256:cb400138e73969eb5e0535d1d06cae6a6f7a15f2cc74add320e2130b8179211a"}, + {file = "grpcio-1.68.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a1b988b40f2fd9de5c820f3a701a43339d8dcf2cb2f1ca137e2c02671cc83ac1"}, + {file = "grpcio-1.68.1-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:96f473cdacfdd506008a5d7579c9f6a7ff245a9ade92c3c0265eb76cc591914f"}, + {file = "grpcio-1.68.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:37ea3be171f3cf3e7b7e412a98b77685eba9d4fd67421f4a34686a63a65d99f9"}, + {file = "grpcio-1.68.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ceb56c4285754e33bb3c2fa777d055e96e6932351a3082ce3559be47f8024f0"}, + {file = "grpcio-1.68.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:dffd29a2961f3263a16d73945b57cd44a8fd0b235740cb14056f0612329b345e"}, + {file = "grpcio-1.68.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:025f790c056815b3bf53da850dd70ebb849fd755a4b1ac822cb65cd631e37d43"}, + {file = "grpcio-1.68.1-cp39-cp39-win32.whl", hash = "sha256:1098f03dedc3b9810810568060dea4ac0822b4062f537b0f53aa015269be0a76"}, + {file = "grpcio-1.68.1-cp39-cp39-win_amd64.whl", hash = "sha256:334ab917792904245a028f10e803fcd5b6f36a7b2173a820c0b5b076555825e1"}, + {file = "grpcio-1.68.1.tar.gz", hash = "sha256:44a8502dd5de653ae6a73e2de50a401d84184f0331d0ac3daeb044e66d5c5054"}, ] [package.extras] -protobuf = ["grpcio-tools (>=1.68.0)"] +protobuf = ["grpcio-tools (>=1.68.1)"] [[package]] name = "grpcio-status" -version = "1.68.0" +version = "1.68.1" description = "Status proto mapping for gRPC" optional = false python-versions = ">=3.8" files = [ - {file = "grpcio_status-1.68.0-py3-none-any.whl", hash = "sha256:0a71b15d989f02df803b4ba85c5bf1f43aeaa58ac021e5f9974b8cadc41f784d"}, - {file = "grpcio_status-1.68.0.tar.gz", hash = "sha256:8369823de22ab6a2cddb3804669c149ae7a71819e127c2dca7c2322028d52bea"}, + {file = "grpcio_status-1.68.1-py3-none-any.whl", hash = "sha256:66f3d8847f665acfd56221333d66f7ad8927903d87242a482996bdb45e8d28fd"}, + {file = "grpcio_status-1.68.1.tar.gz", hash = "sha256:e1378d036c81a1610d7b4c7a146cd663dd13fcc915cf4d7d053929dba5bbb6e1"}, ] [package.dependencies] googleapis-common-protos = ">=1.5.5" -grpcio = ">=1.68.0" +grpcio = ">=1.68.1" protobuf = ">=5.26.1,<6.0dev" [[package]] @@ -2401,13 +2407,13 @@ files = [ [[package]] name = "mako" -version = "1.3.6" +version = "1.3.8" description = "A super-fast templating language that borrows the best ideas from the existing templating languages." optional = false python-versions = ">=3.8" files = [ - {file = "Mako-1.3.6-py3-none-any.whl", hash = "sha256:a91198468092a2f1a0de86ca92690fb0cfc43ca90ee17e15d93662b4c04b241a"}, - {file = "mako-1.3.6.tar.gz", hash = "sha256:9ec3a1583713479fae654f83ed9fa8c9a4c16b7bb0daba0e6bbebff50c0d983d"}, + {file = "Mako-1.3.8-py3-none-any.whl", hash = "sha256:42f48953c7eb91332040ff567eb7eea69b22e7a4affbc5ba8e845e8f730f6627"}, + {file = "mako-1.3.8.tar.gz", hash = "sha256:577b97e414580d3e088d47c2dbbe9594aa7a5146ed2875d4dfa9075af2dd3cc8"}, ] [package.dependencies] @@ -2508,51 +2514,52 @@ files = [ [[package]] name = "matplotlib" -version = "3.9.2" +version = "3.9.4" description = "Python plotting package" optional = false python-versions = ">=3.9" files = [ - {file = "matplotlib-3.9.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:9d78bbc0cbc891ad55b4f39a48c22182e9bdaea7fc0e5dbd364f49f729ca1bbb"}, - {file = "matplotlib-3.9.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c375cc72229614632c87355366bdf2570c2dac01ac66b8ad048d2dabadf2d0d4"}, - {file = "matplotlib-3.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d94ff717eb2bd0b58fe66380bd8b14ac35f48a98e7c6765117fe67fb7684e64"}, - {file = "matplotlib-3.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab68d50c06938ef28681073327795c5db99bb4666214d2d5f880ed11aeaded66"}, - {file = "matplotlib-3.9.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:65aacf95b62272d568044531e41de26285d54aec8cb859031f511f84bd8b495a"}, - {file = "matplotlib-3.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:3fd595f34aa8a55b7fc8bf9ebea8aa665a84c82d275190a61118d33fbc82ccae"}, - {file = "matplotlib-3.9.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d8dd059447824eec055e829258ab092b56bb0579fc3164fa09c64f3acd478772"}, - {file = "matplotlib-3.9.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c797dac8bb9c7a3fd3382b16fe8f215b4cf0f22adccea36f1545a6d7be310b41"}, - {file = "matplotlib-3.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d719465db13267bcef19ea8954a971db03b9f48b4647e3860e4bc8e6ed86610f"}, - {file = "matplotlib-3.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8912ef7c2362f7193b5819d17dae8629b34a95c58603d781329712ada83f9447"}, - {file = "matplotlib-3.9.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7741f26a58a240f43bee74965c4882b6c93df3e7eb3de160126d8c8f53a6ae6e"}, - {file = "matplotlib-3.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:ae82a14dab96fbfad7965403c643cafe6515e386de723e498cf3eeb1e0b70cc7"}, - {file = "matplotlib-3.9.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:ac43031375a65c3196bee99f6001e7fa5bdfb00ddf43379d3c0609bdca042df9"}, - {file = "matplotlib-3.9.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:be0fc24a5e4531ae4d8e858a1a548c1fe33b176bb13eff7f9d0d38ce5112a27d"}, - {file = "matplotlib-3.9.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf81de2926c2db243c9b2cbc3917619a0fc85796c6ba4e58f541df814bbf83c7"}, - {file = "matplotlib-3.9.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6ee45bc4245533111ced13f1f2cace1e7f89d1c793390392a80c139d6cf0e6c"}, - {file = "matplotlib-3.9.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:306c8dfc73239f0e72ac50e5a9cf19cc4e8e331dd0c54f5e69ca8758550f1e1e"}, - {file = "matplotlib-3.9.2-cp312-cp312-win_amd64.whl", hash = "sha256:5413401594cfaff0052f9d8b1aafc6d305b4bd7c4331dccd18f561ff7e1d3bd3"}, - {file = "matplotlib-3.9.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:18128cc08f0d3cfff10b76baa2f296fc28c4607368a8402de61bb3f2eb33c7d9"}, - {file = "matplotlib-3.9.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4876d7d40219e8ae8bb70f9263bcbe5714415acfdf781086601211335e24f8aa"}, - {file = "matplotlib-3.9.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d9f07a80deab4bb0b82858a9e9ad53d1382fd122be8cde11080f4e7dfedb38b"}, - {file = "matplotlib-3.9.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f7c0410f181a531ec4e93bbc27692f2c71a15c2da16766f5ba9761e7ae518413"}, - {file = "matplotlib-3.9.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:909645cce2dc28b735674ce0931a4ac94e12f5b13f6bb0b5a5e65e7cea2c192b"}, - {file = "matplotlib-3.9.2-cp313-cp313-win_amd64.whl", hash = "sha256:f32c7410c7f246838a77d6d1eff0c0f87f3cb0e7c4247aebea71a6d5a68cab49"}, - {file = "matplotlib-3.9.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:37e51dd1c2db16ede9cfd7b5cabdfc818b2c6397c83f8b10e0e797501c963a03"}, - {file = "matplotlib-3.9.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:b82c5045cebcecd8496a4d694d43f9cc84aeeb49fe2133e036b207abe73f4d30"}, - {file = "matplotlib-3.9.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f053c40f94bc51bc03832a41b4f153d83f2062d88c72b5e79997072594e97e51"}, - {file = "matplotlib-3.9.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dbe196377a8248972f5cede786d4c5508ed5f5ca4a1e09b44bda889958b33f8c"}, - {file = "matplotlib-3.9.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:5816b1e1fe8c192cbc013f8f3e3368ac56fbecf02fb41b8f8559303f24c5015e"}, - {file = "matplotlib-3.9.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:cef2a73d06601437be399908cf13aee74e86932a5ccc6ccdf173408ebc5f6bb2"}, - {file = "matplotlib-3.9.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e0830e188029c14e891fadd99702fd90d317df294c3298aad682739c5533721a"}, - {file = "matplotlib-3.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:03ba9c1299c920964e8d3857ba27173b4dbb51ca4bab47ffc2c2ba0eb5e2cbc5"}, - {file = "matplotlib-3.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1cd93b91ab47a3616b4d3c42b52f8363b88ca021e340804c6ab2536344fad9ca"}, - {file = "matplotlib-3.9.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:6d1ce5ed2aefcdce11904fc5bbea7d9c21fff3d5f543841edf3dea84451a09ea"}, - {file = "matplotlib-3.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:b2696efdc08648536efd4e1601b5fd491fd47f4db97a5fbfd175549a7365c1b2"}, - {file = "matplotlib-3.9.2-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:d52a3b618cb1cbb769ce2ee1dcdb333c3ab6e823944e9a2d36e37253815f9556"}, - {file = "matplotlib-3.9.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:039082812cacd6c6bec8e17a9c1e6baca230d4116d522e81e1f63a74d01d2e21"}, - {file = "matplotlib-3.9.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6758baae2ed64f2331d4fd19be38b7b4eae3ecec210049a26b6a4f3ae1c85dcc"}, - {file = "matplotlib-3.9.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:050598c2b29e0b9832cde72bcf97627bf00262adbc4a54e2b856426bb2ef0697"}, - {file = "matplotlib-3.9.2.tar.gz", hash = "sha256:96ab43906269ca64a6366934106fa01534454a69e471b7bf3d79083981aaab92"}, + {file = "matplotlib-3.9.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:c5fdd7abfb706dfa8d307af64a87f1a862879ec3cd8d0ec8637458f0885b9c50"}, + {file = "matplotlib-3.9.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d89bc4e85e40a71d1477780366c27fb7c6494d293e1617788986f74e2a03d7ff"}, + {file = "matplotlib-3.9.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ddf9f3c26aae695c5daafbf6b94e4c1a30d6cd617ba594bbbded3b33a1fcfa26"}, + {file = "matplotlib-3.9.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18ebcf248030173b59a868fda1fe42397253f6698995b55e81e1f57431d85e50"}, + {file = "matplotlib-3.9.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:974896ec43c672ec23f3f8c648981e8bc880ee163146e0312a9b8def2fac66f5"}, + {file = "matplotlib-3.9.4-cp310-cp310-win_amd64.whl", hash = "sha256:4598c394ae9711cec135639374e70871fa36b56afae17bdf032a345be552a88d"}, + {file = "matplotlib-3.9.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d4dd29641d9fb8bc4492420c5480398dd40a09afd73aebe4eb9d0071a05fbe0c"}, + {file = "matplotlib-3.9.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30e5b22e8bcfb95442bf7d48b0d7f3bdf4a450cbf68986ea45fca3d11ae9d099"}, + {file = "matplotlib-3.9.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2bb0030d1d447fd56dcc23b4c64a26e44e898f0416276cac1ebc25522e0ac249"}, + {file = "matplotlib-3.9.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aca90ed222ac3565d2752b83dbb27627480d27662671e4d39da72e97f657a423"}, + {file = "matplotlib-3.9.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a181b2aa2906c608fcae72f977a4a2d76e385578939891b91c2550c39ecf361e"}, + {file = "matplotlib-3.9.4-cp311-cp311-win_amd64.whl", hash = "sha256:1f6882828231eca17f501c4dcd98a05abb3f03d157fbc0769c6911fe08b6cfd3"}, + {file = "matplotlib-3.9.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:dfc48d67e6661378a21c2983200a654b72b5c5cdbd5d2cf6e5e1ece860f0cc70"}, + {file = "matplotlib-3.9.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:47aef0fab8332d02d68e786eba8113ffd6f862182ea2999379dec9e237b7e483"}, + {file = "matplotlib-3.9.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fba1f52c6b7dc764097f52fd9ab627b90db452c9feb653a59945de16752e965f"}, + {file = "matplotlib-3.9.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:173ac3748acaac21afcc3fa1633924609ba1b87749006bc25051c52c422a5d00"}, + {file = "matplotlib-3.9.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:320edea0cadc07007765e33f878b13b3738ffa9745c5f707705692df70ffe0e0"}, + {file = "matplotlib-3.9.4-cp312-cp312-win_amd64.whl", hash = "sha256:a4a4cfc82330b27042a7169533da7991e8789d180dd5b3daeaee57d75cd5a03b"}, + {file = "matplotlib-3.9.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:37eeffeeca3c940985b80f5b9a7b95ea35671e0e7405001f249848d2b62351b6"}, + {file = "matplotlib-3.9.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3e7465ac859ee4abcb0d836137cd8414e7bb7ad330d905abced457217d4f0f45"}, + {file = "matplotlib-3.9.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4c12302c34afa0cf061bea23b331e747e5e554b0fa595c96e01c7b75bc3b858"}, + {file = "matplotlib-3.9.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b8c97917f21b75e72108b97707ba3d48f171541a74aa2a56df7a40626bafc64"}, + {file = "matplotlib-3.9.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0229803bd7e19271b03cb09f27db76c918c467aa4ce2ae168171bc67c3f508df"}, + {file = "matplotlib-3.9.4-cp313-cp313-win_amd64.whl", hash = "sha256:7c0d8ef442ebf56ff5e206f8083d08252ee738e04f3dc88ea882853a05488799"}, + {file = "matplotlib-3.9.4-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:a04c3b00066a688834356d196136349cb32f5e1003c55ac419e91585168b88fb"}, + {file = "matplotlib-3.9.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:04c519587f6c210626741a1e9a68eefc05966ede24205db8982841826af5871a"}, + {file = "matplotlib-3.9.4-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:308afbf1a228b8b525fcd5cec17f246bbbb63b175a3ef6eb7b4d33287ca0cf0c"}, + {file = "matplotlib-3.9.4-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ddb3b02246ddcffd3ce98e88fed5b238bc5faff10dbbaa42090ea13241d15764"}, + {file = "matplotlib-3.9.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8a75287e9cb9eee48cb79ec1d806f75b29c0fde978cb7223a1f4c5848d696041"}, + {file = "matplotlib-3.9.4-cp313-cp313t-win_amd64.whl", hash = "sha256:488deb7af140f0ba86da003e66e10d55ff915e152c78b4b66d231638400b1965"}, + {file = "matplotlib-3.9.4-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:3c3724d89a387ddf78ff88d2a30ca78ac2b4c89cf37f2db4bd453c34799e933c"}, + {file = "matplotlib-3.9.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d5f0a8430ffe23d7e32cfd86445864ccad141797f7d25b7c41759a5b5d17cfd7"}, + {file = "matplotlib-3.9.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6bb0141a21aef3b64b633dc4d16cbd5fc538b727e4958be82a0e1c92a234160e"}, + {file = "matplotlib-3.9.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:57aa235109e9eed52e2c2949db17da185383fa71083c00c6c143a60e07e0888c"}, + {file = "matplotlib-3.9.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b18c600061477ccfdd1e6fd050c33d8be82431700f3452b297a56d9ed7037abb"}, + {file = "matplotlib-3.9.4-cp39-cp39-win_amd64.whl", hash = "sha256:ef5f2d1b67d2d2145ff75e10f8c008bfbf71d45137c4b648c87193e7dd053eac"}, + {file = "matplotlib-3.9.4-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:44e0ed786d769d85bc787b0606a53f2d8d2d1d3c8a2608237365e9121c1a338c"}, + {file = "matplotlib-3.9.4-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:09debb9ce941eb23ecdbe7eab972b1c3e0276dcf01688073faff7b0f61d6c6ca"}, + {file = "matplotlib-3.9.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bcc53cf157a657bfd03afab14774d54ba73aa84d42cfe2480c91bd94873952db"}, + {file = "matplotlib-3.9.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:ad45da51be7ad02387801fd154ef74d942f49fe3fcd26a64c94842ba7ec0d865"}, + {file = "matplotlib-3.9.4.tar.gz", hash = "sha256:1e00e8be7393cbdc6fedfa8a6fba02cf3e83814b285db1c60b906a023ba41bc3"}, ] [package.dependencies] @@ -2568,7 +2575,7 @@ pyparsing = ">=2.3.1" python-dateutil = ">=2.7" [package.extras] -dev = ["meson-python (>=0.13.1)", "numpy (>=1.25)", "pybind11 (>=2.6)", "setuptools (>=64)", "setuptools_scm (>=7)"] +dev = ["meson-python (>=0.13.1,<0.17.0)", "numpy (>=1.25)", "pybind11 (>=2.6,!=2.13.3)", "setuptools (>=64)", "setuptools_scm (>=7)"] [[package]] name = "matplotlib-inline" @@ -2757,13 +2764,13 @@ files = [ [[package]] name = "nbclient" -version = "0.10.0" +version = "0.10.1" description = "A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor." optional = false python-versions = ">=3.8.0" files = [ - {file = "nbclient-0.10.0-py3-none-any.whl", hash = "sha256:f13e3529332a1f1f81d82a53210322476a168bb7090a0289c795fe9cc11c9d3f"}, - {file = "nbclient-0.10.0.tar.gz", hash = "sha256:4b3f1b7dba531e498449c4db4f53da339c91d449dc11e9af3a43b4eb5c5abb09"}, + {file = "nbclient-0.10.1-py3-none-any.whl", hash = "sha256:949019b9240d66897e442888cfb618f69ef23dc71c01cb5fced8499c2cfc084d"}, + {file = "nbclient-0.10.1.tar.gz", hash = "sha256:3e93e348ab27e712acd46fccd809139e356eb9a31aab641d1a7991a6eb4e6f68"}, ] [package.dependencies] @@ -2774,7 +2781,7 @@ traitlets = ">=5.4" [package.extras] dev = ["pre-commit"] -docs = ["autodoc-traits", "mock", "moto", "myst-parser", "nbclient[test]", "sphinx (>=1.7)", "sphinx-book-theme", "sphinxcontrib-spelling"] +docs = ["autodoc-traits", "flaky", "ipykernel (>=6.19.3)", "ipython", "ipywidgets", "mock", "moto", "myst-parser", "nbconvert (>=7.0.0)", "pytest (>=7.0,<8)", "pytest-asyncio", "pytest-cov (>=4.0)", "sphinx (>=1.7)", "sphinx-book-theme", "sphinxcontrib-spelling", "testpath", "xmltodict"] test = ["flaky", "ipykernel (>=6.19.3)", "ipython", "ipywidgets", "nbconvert (>=7.0.0)", "pytest (>=7.0,<8)", "pytest-asyncio", "pytest-cov (>=4.0)", "testpath", "xmltodict"] [[package]] @@ -3085,14 +3092,14 @@ files = [ [[package]] name = "nvidia-nvjitlink-cu12" -version = "12.6.77" +version = "12.6.85" description = "Nvidia JIT LTO Library" optional = false python-versions = ">=3" files = [ - {file = "nvidia_nvjitlink_cu12-12.6.77-py3-none-manylinux2014_aarch64.whl", hash = "sha256:3bf10d85bb1801e9c894c6e197e44dd137d2a0a9e43f8450e9ad13f2df0dd52d"}, - {file = "nvidia_nvjitlink_cu12-12.6.77-py3-none-manylinux2014_x86_64.whl", hash = "sha256:9ae346d16203ae4ea513be416495167a0101d33d2d14935aa9c1829a3fb45142"}, - {file = "nvidia_nvjitlink_cu12-12.6.77-py3-none-win_amd64.whl", hash = "sha256:410718cd44962bed862a31dd0318620f6f9a8b28a6291967bcfcb446a6516771"}, + {file = "nvidia_nvjitlink_cu12-12.6.85-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl", hash = "sha256:eedc36df9e88b682efe4309aa16b5b4e78c2407eac59e8c10a6a47535164369a"}, + {file = "nvidia_nvjitlink_cu12-12.6.85-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cf4eaa7d4b6b543ffd69d6abfb11efdeb2db48270d94dfd3a452c24150829e41"}, + {file = "nvidia_nvjitlink_cu12-12.6.85-py3-none-win_amd64.whl", hash = "sha256:e61120e52ed675747825cdd16febc6a0730537451d867ee58bee3853b1b13d1c"}, ] [[package]] @@ -3488,22 +3495,22 @@ testing = ["google-api-core (>=1.31.5)"] [[package]] name = "protobuf" -version = "5.28.3" +version = "5.29.2" description = "" optional = false python-versions = ">=3.8" files = [ - {file = "protobuf-5.28.3-cp310-abi3-win32.whl", hash = "sha256:0c4eec6f987338617072592b97943fdbe30d019c56126493111cf24344c1cc24"}, - {file = "protobuf-5.28.3-cp310-abi3-win_amd64.whl", hash = "sha256:91fba8f445723fcf400fdbe9ca796b19d3b1242cd873907979b9ed71e4afe868"}, - {file = "protobuf-5.28.3-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:a3f6857551e53ce35e60b403b8a27b0295f7d6eb63d10484f12bc6879c715687"}, - {file = "protobuf-5.28.3-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:3fa2de6b8b29d12c61911505d893afe7320ce7ccba4df913e2971461fa36d584"}, - {file = "protobuf-5.28.3-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:712319fbdddb46f21abb66cd33cb9e491a5763b2febd8f228251add221981135"}, - {file = "protobuf-5.28.3-cp38-cp38-win32.whl", hash = "sha256:3e6101d095dfd119513cde7259aa703d16c6bbdfae2554dfe5cfdbe94e32d548"}, - {file = "protobuf-5.28.3-cp38-cp38-win_amd64.whl", hash = "sha256:27b246b3723692bf1068d5734ddaf2fccc2cdd6e0c9b47fe099244d80200593b"}, - {file = "protobuf-5.28.3-cp39-cp39-win32.whl", hash = "sha256:135658402f71bbd49500322c0f736145731b16fc79dc8f367ab544a17eab4535"}, - {file = "protobuf-5.28.3-cp39-cp39-win_amd64.whl", hash = "sha256:70585a70fc2dd4818c51287ceef5bdba6387f88a578c86d47bb34669b5552c36"}, - {file = "protobuf-5.28.3-py3-none-any.whl", hash = "sha256:cee1757663fa32a1ee673434fcf3bf24dd54763c79690201208bafec62f19eed"}, - {file = "protobuf-5.28.3.tar.gz", hash = "sha256:64badbc49180a5e401f373f9ce7ab1d18b63f7dd4a9cdc43c92b9f0b481cef7b"}, + {file = "protobuf-5.29.2-cp310-abi3-win32.whl", hash = "sha256:c12ba8249f5624300cf51c3d0bfe5be71a60c63e4dcf51ffe9a68771d958c851"}, + {file = "protobuf-5.29.2-cp310-abi3-win_amd64.whl", hash = "sha256:842de6d9241134a973aab719ab42b008a18a90f9f07f06ba480df268f86432f9"}, + {file = "protobuf-5.29.2-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:a0c53d78383c851bfa97eb42e3703aefdc96d2036a41482ffd55dc5f529466eb"}, + {file = "protobuf-5.29.2-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:494229ecd8c9009dd71eda5fd57528395d1eacdf307dbece6c12ad0dd09e912e"}, + {file = "protobuf-5.29.2-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:b6b0d416bbbb9d4fbf9d0561dbfc4e324fd522f61f7af0fe0f282ab67b22477e"}, + {file = "protobuf-5.29.2-cp38-cp38-win32.whl", hash = "sha256:e621a98c0201a7c8afe89d9646859859be97cb22b8bf1d8eacfd90d5bda2eb19"}, + {file = "protobuf-5.29.2-cp38-cp38-win_amd64.whl", hash = "sha256:13d6d617a2a9e0e82a88113d7191a1baa1e42c2cc6f5f1398d3b054c8e7e714a"}, + {file = "protobuf-5.29.2-cp39-cp39-win32.whl", hash = "sha256:36000f97ea1e76e8398a3f02936aac2a5d2b111aae9920ec1b769fc4a222c4d9"}, + {file = "protobuf-5.29.2-cp39-cp39-win_amd64.whl", hash = "sha256:2d2e674c58a06311c8e99e74be43e7f3a8d1e2b2fdf845eaa347fbd866f23355"}, + {file = "protobuf-5.29.2-py3-none-any.whl", hash = "sha256:fde4554c0e578a5a0bcc9a276339594848d1e89f9ea47b4427c80e5d72f90181"}, + {file = "protobuf-5.29.2.tar.gz", hash = "sha256:b2cc8e8bb7c9326996f0e160137b0861f1a82162502658df2951209d0cb0309e"}, ] [[package]] @@ -3704,13 +3711,13 @@ windows-terminal = ["colorama (>=0.4.6)"] [[package]] name = "pyjwt" -version = "2.10.0" +version = "2.10.1" description = "JSON Web Token implementation in Python" optional = false python-versions = ">=3.9" files = [ - {file = "PyJWT-2.10.0-py3-none-any.whl", hash = "sha256:543b77207db656de204372350926bed5a86201c4cbff159f623f79c7bb487a15"}, - {file = "pyjwt-2.10.0.tar.gz", hash = "sha256:7628a7eb7938959ac1b26e819a1df0fd3259505627b575e4bad6d08f76db695c"}, + {file = "PyJWT-2.10.1-py3-none-any.whl", hash = "sha256:dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb"}, + {file = "pyjwt-2.10.1.tar.gz", hash = "sha256:3cc5772eb20009233caf06e9d8a0577824723b44e6648ee0a2aedb6cf9381953"}, ] [package.extras] @@ -4275,7 +4282,7 @@ qibo = {git = "https://github.com/qiboteam/qibo"} type = "git" url = "https://github.com/qiboteam/qiboml.git" reference = "HEAD" -resolved_reference = "3e52004c497ca738730e21aa5a2ca8c2f6044398" +resolved_reference = "2a01b41180cb9955e7d953988851e378328b9594" [[package]] name = "qibotn" @@ -4301,13 +4308,13 @@ resolved_reference = "4f547726b616f73d074abf77811644cf2cb54383" [[package]] name = "quimb" -version = "1.9.0" +version = "1.10.0" description = "Quantum information and many-body library." optional = false python-versions = ">=3.9" files = [ - {file = "quimb-1.9.0-py3-none-any.whl", hash = "sha256:edb2f621948410e8ba6fa30b023888a4b6fe46682ebf0cdb7acafe2d87b964d9"}, - {file = "quimb-1.9.0.tar.gz", hash = "sha256:f5a769e0403094f4fbccd9833648e48e7fac209a43b329b0586e7c4332a1b963"}, + {file = "quimb-1.10.0-py3-none-any.whl", hash = "sha256:4d270e71c9f03a4a41862682fbffcd076c61d7e40c4b3785a31ae869ce8830c4"}, + {file = "quimb-1.10.0.tar.gz", hash = "sha256:e79f1be2f9895d966479ccabbd5ec087fc047baad83d3fb08fed264e2d7cc3ff"}, ] [package.dependencies] @@ -4330,32 +4337,32 @@ tests = ["coverage", "pytest", "pytest-cov"] [[package]] name = "qulacs" -version = "0.6.10" +version = "0.6.11" description = "Quantum circuit simulator for research" optional = false python-versions = "*" files = [ - {file = "qulacs-0.6.10-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f3c9e60929947f68117fa4e19b097490377a9fe2482d527444d0201a89d9a87b"}, - {file = "qulacs-0.6.10-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:89c8857e283c0e1627a12a155a1b5ed593cf32f8037a291e2297e044d75a82d3"}, - {file = "qulacs-0.6.10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c80a45202ceff76fcc3a0f2f21125d1187fa6baddc51c969cfb0949b2a3ba9e"}, - {file = "qulacs-0.6.10-cp310-cp310-win_amd64.whl", hash = "sha256:c72571328ca3fbc94b4277feaf8629781580e9b22da471b4355f01dd135a52a8"}, - {file = "qulacs-0.6.10-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:08a8d044c3d9ebb8c393ed11bd5e92ee30e8ca485016b9e0c1e7a8fd4fac9d21"}, - {file = "qulacs-0.6.10-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:43d4cab074fb0a85d21b621d9c951c31a9a21ac361ce34056b39a758245b8a95"}, - {file = "qulacs-0.6.10-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76ca215e00fe956aa0f12c2a0fcbecd9283fe571b2cc36e3c68bdd1f48ca406a"}, - {file = "qulacs-0.6.10-cp311-cp311-win_amd64.whl", hash = "sha256:acefb66da0bf563169b135865efb9d85f9f4428b02503d08fa6cc6289d6d9aec"}, - {file = "qulacs-0.6.10-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:04d68f4b3616741f4cf3f03fd63a964118d560204b15e6ef331e71b64a8a7d72"}, - {file = "qulacs-0.6.10-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e378ebb421dcc926f7e040dad326756b2ca6b921598fd6bfe66ceeb5e5a4b8e2"}, - {file = "qulacs-0.6.10-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca8bd30828571d5a83f408f995030efee2350020cc8351d5695139dd0ddeac18"}, - {file = "qulacs-0.6.10-cp312-cp312-win_amd64.whl", hash = "sha256:354458f1576fa88806cc31b692ea56a935fd62fb01cfd351c01aa80c0e6a61f6"}, - {file = "qulacs-0.6.10-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3ffd975f04f0583e75d792a3adc9268f23251e86f192e6d411350684699ad794"}, - {file = "qulacs-0.6.10-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6c9c0d7204a400e6eb7dc10fdfbf26949622e67cc7ae22e80d9f4a74577ef31c"}, - {file = "qulacs-0.6.10-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f66ef094aba52281348f929b5ce9f55b39a50e8c9d7a7f9e98564a4ae372cac"}, - {file = "qulacs-0.6.10-cp38-cp38-win_amd64.whl", hash = "sha256:1a0e1293e8619921791be2150a5db633585ad20f1ef2ad718f0fd41af8900ed9"}, - {file = "qulacs-0.6.10-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4ce590b72bffb992d158022fde34f264c7d44c78a40546be9e58465765a3f962"}, - {file = "qulacs-0.6.10-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8410fdcc8477fd970cba6ab9b83e1d3a03cdf3d28ac0d3ec146c939d67c13c40"}, - {file = "qulacs-0.6.10-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:287b5f756faa3842d6b4cc20c0ab000b6a9f63891f3aaaf7a069537e02dccfe4"}, - {file = "qulacs-0.6.10-cp39-cp39-win_amd64.whl", hash = "sha256:e8a7afbdaf53b54e925f96d5bb7bf3acd885fa9037ac8d4ee83a0053c90b29b1"}, - {file = "qulacs-0.6.10.tar.gz", hash = "sha256:e7a872f0497b22ac3e64a9074a6b5572d5cb426864ac27f5cbfd11527959cd96"}, + {file = "qulacs-0.6.11-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:35b007c96fc357b64d7c0c2fb5f6a7337708cca1180658607904a408e62037da"}, + {file = "qulacs-0.6.11-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:56fb790d9ee6f24b39ed691d906983b54b7992f7a011b2c6c436188c5ce626ab"}, + {file = "qulacs-0.6.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:117813f4238e4594a72468823bad715361983742ea8d1948a2aaf62965460f20"}, + {file = "qulacs-0.6.11-cp310-cp310-win_amd64.whl", hash = "sha256:b199964dbaf6785233a39d4cde8f0e139bf360c75f8f99b31c0bb37179eacd84"}, + {file = "qulacs-0.6.11-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:50431a7571504f620127e564947ab03d3be32a2b0fcca5c7f9391bab125601a2"}, + {file = "qulacs-0.6.11-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:db64865730f099fd4e880453c8874cb593c42a036007465ce59208240b9f83b3"}, + {file = "qulacs-0.6.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bf675de5f608824a84f107f48472df2d4a4133ae1b0d5c13d8157a47b6efa78"}, + {file = "qulacs-0.6.11-cp311-cp311-win_amd64.whl", hash = "sha256:98a5b6957807c4e5f6ad12f5bad71a4b90d8211c80c38b074304f58dad7b0988"}, + {file = "qulacs-0.6.11-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:739b1a63ef909caa5f579cba78dc77e3ab00cfe261b3384f81f4591b9aa3458c"}, + {file = "qulacs-0.6.11-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a1df7d8e5fd3c402ab7214a3e2486e33fb0b1f0b9a0cfcd0c0e568871dff09"}, + {file = "qulacs-0.6.11-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6da7a659c73c0a575af16ab7bd9ef1673a24fc5baf8e82b1401a798b82406362"}, + {file = "qulacs-0.6.11-cp312-cp312-win_amd64.whl", hash = "sha256:07e6ff93d875907423aedea41cadaa5c7ee96001d4a79603ecdb725bfedc33c7"}, + {file = "qulacs-0.6.11-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:98c8e5981317c3c2e8fd8c7d9824067306e1a794ff1a0f5545096c298b090cb6"}, + {file = "qulacs-0.6.11-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:07b5e714aeefa177a7b39d2430d06afddbf92778cc0fc7d18c3cae4271de94e7"}, + {file = "qulacs-0.6.11-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97b1b72a6d47e525c5d7ff4a9a9fe2d3f7cd61051ea9d4a177dd006588fe4c62"}, + {file = "qulacs-0.6.11-cp38-cp38-win_amd64.whl", hash = "sha256:f943b07e8d299376fb032920d70fa66c62d2f99f2c6da7a1175c4a60858c1bee"}, + {file = "qulacs-0.6.11-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:42abca915c49b082df7e85c7e6d86dfe62f173fcdb82f9f65830a79ee2467cfe"}, + {file = "qulacs-0.6.11-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9241e1e97298515dc0466eabc87aabb8ee00a1134c64973cb03581b9a3aa1e7c"}, + {file = "qulacs-0.6.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:679d13a65d2f68587b5bde2a0cefa7e8cc0d3f0075561ecdb1d130cff36e2c5b"}, + {file = "qulacs-0.6.11-cp39-cp39-win_amd64.whl", hash = "sha256:2c2f10adefcbb667fbea7a0b1db59f876190f508eb843965bb8a8f59d5b0a1c5"}, + {file = "qulacs-0.6.11.tar.gz", hash = "sha256:3dfa030c6d90e78c8dfe840423a53fb1d7e7e4a63bb7180e1b46a4d25d2c72bf"}, ] [package.dependencies] @@ -4506,30 +4513,40 @@ files = [ {file = "ruamel.yaml.clib-0.2.12-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:a606ef75a60ecf3d924613892cc603b154178ee25abb3055db5062da811fd969"}, {file = "ruamel.yaml.clib-0.2.12-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd5415dded15c3822597455bc02bcd66e81ef8b7a48cb71a33628fc9fdde39df"}, {file = "ruamel.yaml.clib-0.2.12-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f66efbc1caa63c088dead1c4170d148eabc9b80d95fb75b6c92ac0aad2437d76"}, + {file = "ruamel.yaml.clib-0.2.12-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:22353049ba4181685023b25b5b51a574bce33e7f51c759371a7422dcae5402a6"}, + {file = "ruamel.yaml.clib-0.2.12-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:932205970b9f9991b34f55136be327501903f7c66830e9760a8ffb15b07f05cd"}, {file = "ruamel.yaml.clib-0.2.12-cp310-cp310-win32.whl", hash = "sha256:3eac5a91891ceb88138c113f9db04f3cebdae277f5d44eaa3651a4f573e6a5da"}, {file = "ruamel.yaml.clib-0.2.12-cp310-cp310-win_amd64.whl", hash = "sha256:ab007f2f5a87bd08ab1499bdf96f3d5c6ad4dcfa364884cb4549aa0154b13a28"}, {file = "ruamel.yaml.clib-0.2.12-cp311-cp311-macosx_13_0_arm64.whl", hash = "sha256:4a6679521a58256a90b0d89e03992c15144c5f3858f40d7c18886023d7943db6"}, {file = "ruamel.yaml.clib-0.2.12-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:d84318609196d6bd6da0edfa25cedfbabd8dbde5140a0a23af29ad4b8f91fb1e"}, {file = "ruamel.yaml.clib-0.2.12-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb43a269eb827806502c7c8efb7ae7e9e9d0573257a46e8e952f4d4caba4f31e"}, {file = "ruamel.yaml.clib-0.2.12-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:811ea1594b8a0fb466172c384267a4e5e367298af6b228931f273b111f17ef52"}, + {file = "ruamel.yaml.clib-0.2.12-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:cf12567a7b565cbf65d438dec6cfbe2917d3c1bdddfce84a9930b7d35ea59642"}, + {file = "ruamel.yaml.clib-0.2.12-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7dd5adc8b930b12c8fc5b99e2d535a09889941aa0d0bd06f4749e9a9397c71d2"}, {file = "ruamel.yaml.clib-0.2.12-cp311-cp311-win32.whl", hash = "sha256:bd0a08f0bab19093c54e18a14a10b4322e1eacc5217056f3c063bd2f59853ce4"}, {file = "ruamel.yaml.clib-0.2.12-cp311-cp311-win_amd64.whl", hash = "sha256:a274fb2cb086c7a3dea4322ec27f4cb5cc4b6298adb583ab0e211a4682f241eb"}, {file = "ruamel.yaml.clib-0.2.12-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:20b0f8dc160ba83b6dcc0e256846e1a02d044e13f7ea74a3d1d56ede4e48c632"}, {file = "ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:943f32bc9dedb3abff9879edc134901df92cfce2c3d5c9348f172f62eb2d771d"}, {file = "ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95c3829bb364fdb8e0332c9931ecf57d9be3519241323c5274bd82f709cebc0c"}, {file = "ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:749c16fcc4a2b09f28843cda5a193e0283e47454b63ec4b81eaa2242f50e4ccd"}, + {file = "ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bf165fef1f223beae7333275156ab2022cffe255dcc51c27f066b4370da81e31"}, + {file = "ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:32621c177bbf782ca5a18ba4d7af0f1082a3f6e517ac2a18b3974d4edf349680"}, {file = "ruamel.yaml.clib-0.2.12-cp312-cp312-win32.whl", hash = "sha256:e8c4ebfcfd57177b572e2040777b8abc537cdef58a2120e830124946aa9b42c5"}, {file = "ruamel.yaml.clib-0.2.12-cp312-cp312-win_amd64.whl", hash = "sha256:0467c5965282c62203273b838ae77c0d29d7638c8a4e3a1c8bdd3602c10904e4"}, {file = "ruamel.yaml.clib-0.2.12-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:4c8c5d82f50bb53986a5e02d1b3092b03622c02c2eb78e29bec33fd9593bae1a"}, {file = "ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux2014_aarch64.whl", hash = "sha256:e7e3736715fbf53e9be2a79eb4db68e4ed857017344d697e8b9749444ae57475"}, {file = "ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b7e75b4965e1d4690e93021adfcecccbca7d61c7bddd8e22406ef2ff20d74ef"}, {file = "ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96777d473c05ee3e5e3c3e999f5d23c6f4ec5b0c38c098b3a5229085f74236c6"}, + {file = "ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:3bc2a80e6420ca8b7d3590791e2dfc709c88ab9152c00eeb511c9875ce5778bf"}, + {file = "ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:e188d2699864c11c36cdfdada94d781fd5d6b0071cd9c427bceb08ad3d7c70e1"}, {file = "ruamel.yaml.clib-0.2.12-cp313-cp313-win32.whl", hash = "sha256:6442cb36270b3afb1b4951f060eccca1ce49f3d087ca1ca4563a6eb479cb3de6"}, {file = "ruamel.yaml.clib-0.2.12-cp313-cp313-win_amd64.whl", hash = "sha256:e5b8daf27af0b90da7bb903a876477a9e6d7270be6146906b276605997c7e9a3"}, {file = "ruamel.yaml.clib-0.2.12-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:fc4b630cd3fa2cf7fce38afa91d7cfe844a9f75d7f0f36393fa98815e911d987"}, {file = "ruamel.yaml.clib-0.2.12-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:bc5f1e1c28e966d61d2519f2a3d451ba989f9ea0f2307de7bc45baa526de9e45"}, {file = "ruamel.yaml.clib-0.2.12-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a0e060aace4c24dcaf71023bbd7d42674e3b230f7e7b97317baf1e953e5b519"}, {file = "ruamel.yaml.clib-0.2.12-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e2f1c3765db32be59d18ab3953f43ab62a761327aafc1594a2a1fbe038b8b8a7"}, + {file = "ruamel.yaml.clib-0.2.12-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:d85252669dc32f98ebcd5d36768f5d4faeaeaa2d655ac0473be490ecdae3c285"}, + {file = "ruamel.yaml.clib-0.2.12-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e143ada795c341b56de9418c58d028989093ee611aa27ffb9b7f609c00d813ed"}, {file = "ruamel.yaml.clib-0.2.12-cp39-cp39-win32.whl", hash = "sha256:beffaed67936fbbeffd10966a4eb53c402fafd3d6833770516bf7314bc6ffa12"}, {file = "ruamel.yaml.clib-0.2.12-cp39-cp39-win_amd64.whl", hash = "sha256:040ae85536960525ea62868b642bdb0c2cc6021c9f9d507810c0c604e66f5a7b"}, {file = "ruamel.yaml.clib-0.2.12.tar.gz", hash = "sha256:6c8fbb13ec503f99a91901ab46e0b07ae7941cd527393187039aec586fdfd36f"}, @@ -4537,37 +4554,41 @@ files = [ [[package]] name = "scikit-learn" -version = "1.5.2" +version = "1.6.0" description = "A set of python modules for machine learning and data mining" optional = false python-versions = ">=3.9" files = [ - {file = "scikit_learn-1.5.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:299406827fb9a4f862626d0fe6c122f5f87f8910b86fe5daa4c32dcd742139b6"}, - {file = "scikit_learn-1.5.2-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:2d4cad1119c77930b235579ad0dc25e65c917e756fe80cab96aa3b9428bd3fb0"}, - {file = "scikit_learn-1.5.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c412ccc2ad9bf3755915e3908e677b367ebc8d010acbb3f182814524f2e5540"}, - {file = "scikit_learn-1.5.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a686885a4b3818d9e62904d91b57fa757fc2bed3e465c8b177be652f4dd37c8"}, - {file = "scikit_learn-1.5.2-cp310-cp310-win_amd64.whl", hash = "sha256:c15b1ca23d7c5f33cc2cb0a0d6aaacf893792271cddff0edbd6a40e8319bc113"}, - {file = "scikit_learn-1.5.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:03b6158efa3faaf1feea3faa884c840ebd61b6484167c711548fce208ea09445"}, - {file = "scikit_learn-1.5.2-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:1ff45e26928d3b4eb767a8f14a9a6efbf1cbff7c05d1fb0f95f211a89fd4f5de"}, - {file = "scikit_learn-1.5.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f763897fe92d0e903aa4847b0aec0e68cadfff77e8a0687cabd946c89d17e675"}, - {file = "scikit_learn-1.5.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8b0ccd4a902836493e026c03256e8b206656f91fbcc4fde28c57a5b752561f1"}, - {file = "scikit_learn-1.5.2-cp311-cp311-win_amd64.whl", hash = "sha256:6c16d84a0d45e4894832b3c4d0bf73050939e21b99b01b6fd59cbb0cf39163b6"}, - {file = "scikit_learn-1.5.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f932a02c3f4956dfb981391ab24bda1dbd90fe3d628e4b42caef3e041c67707a"}, - {file = "scikit_learn-1.5.2-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:3b923d119d65b7bd555c73be5423bf06c0105678ce7e1f558cb4b40b0a5502b1"}, - {file = "scikit_learn-1.5.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f60021ec1574e56632be2a36b946f8143bf4e5e6af4a06d85281adc22938e0dd"}, - {file = "scikit_learn-1.5.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:394397841449853c2290a32050382edaec3da89e35b3e03d6cc966aebc6a8ae6"}, - {file = "scikit_learn-1.5.2-cp312-cp312-win_amd64.whl", hash = "sha256:57cc1786cfd6bd118220a92ede80270132aa353647684efa385a74244a41e3b1"}, - {file = "scikit_learn-1.5.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e9a702e2de732bbb20d3bad29ebd77fc05a6b427dc49964300340e4c9328b3f5"}, - {file = "scikit_learn-1.5.2-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:b0768ad641981f5d3a198430a1d31c3e044ed2e8a6f22166b4d546a5116d7908"}, - {file = "scikit_learn-1.5.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:178ddd0a5cb0044464fc1bfc4cca5b1833bfc7bb022d70b05db8530da4bb3dd3"}, - {file = "scikit_learn-1.5.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f7284ade780084d94505632241bf78c44ab3b6f1e8ccab3d2af58e0e950f9c12"}, - {file = "scikit_learn-1.5.2-cp313-cp313-win_amd64.whl", hash = "sha256:b7b0f9a0b1040830d38c39b91b3a44e1b643f4b36e36567b80b7c6bd2202a27f"}, - {file = "scikit_learn-1.5.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:757c7d514ddb00ae249832fe87100d9c73c6ea91423802872d9e74970a0e40b9"}, - {file = "scikit_learn-1.5.2-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:52788f48b5d8bca5c0736c175fa6bdaab2ef00a8f536cda698db61bd89c551c1"}, - {file = "scikit_learn-1.5.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:643964678f4b5fbdc95cbf8aec638acc7aa70f5f79ee2cdad1eec3df4ba6ead8"}, - {file = "scikit_learn-1.5.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca64b3089a6d9b9363cd3546f8978229dcbb737aceb2c12144ee3f70f95684b7"}, - {file = "scikit_learn-1.5.2-cp39-cp39-win_amd64.whl", hash = "sha256:3bed4909ba187aca80580fe2ef370d9180dcf18e621a27c4cf2ef10d279a7efe"}, - {file = "scikit_learn-1.5.2.tar.gz", hash = "sha256:b4237ed7b3fdd0a4882792e68ef2545d5baa50aca3bb45aa7df468138ad8f94d"}, + {file = "scikit_learn-1.6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:366fb3fa47dce90afed3d6106183f4978d6f24cfd595c2373424171b915ee718"}, + {file = "scikit_learn-1.6.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:59cd96a8d9f8dfd546f5d6e9787e1b989e981388d7803abbc9efdcde61e47460"}, + {file = "scikit_learn-1.6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efa7a579606c73a0b3d210e33ea410ea9e1af7933fe324cb7e6fbafae4ea5948"}, + {file = "scikit_learn-1.6.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a46d3ca0f11a540b8eaddaf5e38172d8cd65a86cb3e3632161ec96c0cffb774c"}, + {file = "scikit_learn-1.6.0-cp310-cp310-win_amd64.whl", hash = "sha256:5be4577769c5dde6e1b53de8e6520f9b664ab5861dd57acee47ad119fd7405d6"}, + {file = "scikit_learn-1.6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1f50b4f24cf12a81c3c09958ae3b864d7534934ca66ded3822de4996d25d7285"}, + {file = "scikit_learn-1.6.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:eb9ae21f387826da14b0b9cb1034f5048ddb9182da429c689f5f4a87dc96930b"}, + {file = "scikit_learn-1.6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0baa91eeb8c32632628874a5c91885eaedd23b71504d24227925080da075837a"}, + {file = "scikit_learn-1.6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c716d13ba0a2f8762d96ff78d3e0cde90bc9c9b5c13d6ab6bb9b2d6ca6705fd"}, + {file = "scikit_learn-1.6.0-cp311-cp311-win_amd64.whl", hash = "sha256:9aafd94bafc841b626681e626be27bf1233d5a0f20f0a6fdb4bee1a1963c6643"}, + {file = "scikit_learn-1.6.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:04a5ba45c12a5ff81518aa4f1604e826a45d20e53da47b15871526cda4ff5174"}, + {file = "scikit_learn-1.6.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:21fadfc2ad7a1ce8bd1d90f23d17875b84ec765eecbbfc924ff11fb73db582ce"}, + {file = "scikit_learn-1.6.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:30f34bb5fde90e020653bb84dcb38b6c83f90c70680dbd8c38bd9becbad7a127"}, + {file = "scikit_learn-1.6.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1dad624cffe3062276a0881d4e441bc9e3b19d02d17757cd6ae79a9d192a0027"}, + {file = "scikit_learn-1.6.0-cp312-cp312-win_amd64.whl", hash = "sha256:2fce7950a3fad85e0a61dc403df0f9345b53432ac0e47c50da210d22c60b6d85"}, + {file = "scikit_learn-1.6.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e5453b2e87ef8accedc5a8a4e6709f887ca01896cd7cc8a174fe39bd4bb00aef"}, + {file = "scikit_learn-1.6.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:5fe11794236fb83bead2af26a87ced5d26e3370b8487430818b915dafab1724e"}, + {file = "scikit_learn-1.6.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:61fe3dcec0d82ae280877a818ab652f4988371e32dd5451e75251bece79668b1"}, + {file = "scikit_learn-1.6.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b44e3a51e181933bdf9a4953cc69c6025b40d2b49e238233f149b98849beb4bf"}, + {file = "scikit_learn-1.6.0-cp313-cp313-win_amd64.whl", hash = "sha256:a17860a562bac54384454d40b3f6155200c1c737c9399e6a97962c63fce503ac"}, + {file = "scikit_learn-1.6.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:98717d3c152f6842d36a70f21e1468fb2f1a2f8f2624d9a3f382211798516426"}, + {file = "scikit_learn-1.6.0-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:34e20bfac8ff0ebe0ff20fb16a4d6df5dc4cc9ce383e00c2ab67a526a3c67b18"}, + {file = "scikit_learn-1.6.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eba06d75815406091419e06dd650b91ebd1c5f836392a0d833ff36447c2b1bfa"}, + {file = "scikit_learn-1.6.0-cp313-cp313t-win_amd64.whl", hash = "sha256:b6916d1cec1ff163c7d281e699d7a6a709da2f2c5ec7b10547e08cc788ddd3ae"}, + {file = "scikit_learn-1.6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:66b1cf721a9f07f518eb545098226796c399c64abdcbf91c2b95d625068363da"}, + {file = "scikit_learn-1.6.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:7b35b60cf4cd6564b636e4a40516b3c61a4fa7a8b1f7a3ce80c38ebe04750bc3"}, + {file = "scikit_learn-1.6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a73b1c2038c93bc7f4bf21f6c9828d5116c5d2268f7a20cfbbd41d3074d52083"}, + {file = "scikit_learn-1.6.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c3fa7d3dd5a0ec2d0baba0d644916fa2ab180ee37850c5d536245df916946bd"}, + {file = "scikit_learn-1.6.0-cp39-cp39-win_amd64.whl", hash = "sha256:df778486a32518cda33818b7e3ce48c78cef1d5f640a6bc9d97c6d2e71449a51"}, + {file = "scikit_learn-1.6.0.tar.gz", hash = "sha256:9d58481f9f7499dff4196927aedd4285a0baec8caa3790efbe205f13de37dd6e"}, ] [package.dependencies] @@ -4579,11 +4600,11 @@ threadpoolctl = ">=3.1.0" [package.extras] benchmark = ["matplotlib (>=3.3.4)", "memory_profiler (>=0.57.0)", "pandas (>=1.1.5)"] build = ["cython (>=3.0.10)", "meson-python (>=0.16.0)", "numpy (>=1.19.5)", "scipy (>=1.6.0)"] -docs = ["Pillow (>=7.1.2)", "matplotlib (>=3.3.4)", "memory_profiler (>=0.57.0)", "numpydoc (>=1.2.0)", "pandas (>=1.1.5)", "plotly (>=5.14.0)", "polars (>=0.20.30)", "pooch (>=1.6.0)", "pydata-sphinx-theme (>=0.15.3)", "scikit-image (>=0.17.2)", "seaborn (>=0.9.0)", "sphinx (>=7.3.7)", "sphinx-copybutton (>=0.5.2)", "sphinx-design (>=0.5.0)", "sphinx-design (>=0.6.0)", "sphinx-gallery (>=0.16.0)", "sphinx-prompt (>=1.4.0)", "sphinx-remove-toctrees (>=1.0.0.post1)", "sphinxcontrib-sass (>=0.3.4)", "sphinxext-opengraph (>=0.9.1)"] +docs = ["Pillow (>=7.1.2)", "matplotlib (>=3.3.4)", "memory_profiler (>=0.57.0)", "numpydoc (>=1.2.0)", "pandas (>=1.1.5)", "plotly (>=5.14.0)", "polars (>=0.20.30)", "pooch (>=1.6.0)", "pydata-sphinx-theme (>=0.15.3)", "scikit-image (>=0.17.2)", "seaborn (>=0.9.0)", "sphinx (>=7.3.7)", "sphinx-copybutton (>=0.5.2)", "sphinx-design (>=0.5.0)", "sphinx-design (>=0.6.0)", "sphinx-gallery (>=0.17.1)", "sphinx-prompt (>=1.4.0)", "sphinx-remove-toctrees (>=1.0.0.post1)", "sphinxcontrib-sass (>=0.3.4)", "sphinxext-opengraph (>=0.9.1)", "towncrier (>=24.8.0)"] examples = ["matplotlib (>=3.3.4)", "pandas (>=1.1.5)", "plotly (>=5.14.0)", "pooch (>=1.6.0)", "scikit-image (>=0.17.2)", "seaborn (>=0.9.0)"] install = ["joblib (>=1.2.0)", "numpy (>=1.19.5)", "scipy (>=1.6.0)", "threadpoolctl (>=3.1.0)"] maintenance = ["conda-lock (==2.5.6)"] -tests = ["black (>=24.3.0)", "matplotlib (>=3.3.4)", "mypy (>=1.9)", "numpydoc (>=1.2.0)", "pandas (>=1.1.5)", "polars (>=0.20.30)", "pooch (>=1.6.0)", "pyamg (>=4.0.0)", "pyarrow (>=12.0.0)", "pytest (>=7.1.2)", "pytest-cov (>=2.9.0)", "ruff (>=0.2.1)", "scikit-image (>=0.17.2)"] +tests = ["black (>=24.3.0)", "matplotlib (>=3.3.4)", "mypy (>=1.9)", "numpydoc (>=1.2.0)", "pandas (>=1.1.5)", "polars (>=0.20.30)", "pooch (>=1.6.0)", "pyamg (>=4.0.0)", "pyarrow (>=12.0.0)", "pytest (>=7.1.2)", "pytest-cov (>=2.9.0)", "ruff (>=0.5.1)", "scikit-image (>=0.17.2)"] [[package]] name = "scipy" @@ -4650,13 +4671,13 @@ stats = ["scipy (>=1.7)", "statsmodels (>=0.12)"] [[package]] name = "six" -version = "1.16.0" +version = "1.17.0" description = "Python 2 and 3 compatibility utilities" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" files = [ - {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, - {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, + {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, + {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, ] [[package]] @@ -5157,13 +5178,43 @@ files = [ [[package]] name = "tomli" -version = "2.1.0" +version = "2.2.1" description = "A lil' TOML parser" optional = false python-versions = ">=3.8" files = [ - {file = "tomli-2.1.0-py3-none-any.whl", hash = "sha256:a5c57c3d1c56f5ccdf89f6523458f60ef716e210fc47c4cfb188c5ba473e0391"}, - {file = "tomli-2.1.0.tar.gz", hash = "sha256:3f646cae2aec94e17d04973e4249548320197cfabdf130015d023de4b74d8ab8"}, + {file = "tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249"}, + {file = "tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6"}, + {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a"}, + {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee"}, + {file = "tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e"}, + {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4"}, + {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106"}, + {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8"}, + {file = "tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff"}, + {file = "tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b"}, + {file = "tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea"}, + {file = "tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8"}, + {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192"}, + {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222"}, + {file = "tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77"}, + {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6"}, + {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd"}, + {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e"}, + {file = "tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98"}, + {file = "tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4"}, + {file = "tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7"}, + {file = "tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c"}, + {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13"}, + {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281"}, + {file = "tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272"}, + {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140"}, + {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2"}, + {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744"}, + {file = "tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec"}, + {file = "tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69"}, + {file = "tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc"}, + {file = "tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff"}, ] [[package]] @@ -5244,40 +5295,40 @@ optree = ["optree (>=0.9.1)"] [[package]] name = "tornado" -version = "6.4.1" +version = "6.4.2" description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." optional = false python-versions = ">=3.8" files = [ - {file = "tornado-6.4.1-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:163b0aafc8e23d8cdc3c9dfb24c5368af84a81e3364745ccb4427669bf84aec8"}, - {file = "tornado-6.4.1-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:6d5ce3437e18a2b66fbadb183c1d3364fb03f2be71299e7d10dbeeb69f4b2a14"}, - {file = "tornado-6.4.1-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2e20b9113cd7293f164dc46fffb13535266e713cdb87bd2d15ddb336e96cfc4"}, - {file = "tornado-6.4.1-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8ae50a504a740365267b2a8d1a90c9fbc86b780a39170feca9bcc1787ff80842"}, - {file = "tornado-6.4.1-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:613bf4ddf5c7a95509218b149b555621497a6cc0d46ac341b30bd9ec19eac7f3"}, - {file = "tornado-6.4.1-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:25486eb223babe3eed4b8aecbac33b37e3dd6d776bc730ca14e1bf93888b979f"}, - {file = "tornado-6.4.1-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:454db8a7ecfcf2ff6042dde58404164d969b6f5d58b926da15e6b23817950fc4"}, - {file = "tornado-6.4.1-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a02a08cc7a9314b006f653ce40483b9b3c12cda222d6a46d4ac63bb6c9057698"}, - {file = "tornado-6.4.1-cp38-abi3-win32.whl", hash = "sha256:d9a566c40b89757c9aa8e6f032bcdb8ca8795d7c1a9762910c722b1635c9de4d"}, - {file = "tornado-6.4.1-cp38-abi3-win_amd64.whl", hash = "sha256:b24b8982ed444378d7f21d563f4180a2de31ced9d8d84443907a0a64da2072e7"}, - {file = "tornado-6.4.1.tar.gz", hash = "sha256:92d3ab53183d8c50f8204a51e6f91d18a15d5ef261e84d452800d4ff6fc504e9"}, + {file = "tornado-6.4.2-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e828cce1123e9e44ae2a50a9de3055497ab1d0aeb440c5ac23064d9e44880da1"}, + {file = "tornado-6.4.2-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:072ce12ada169c5b00b7d92a99ba089447ccc993ea2143c9ede887e0937aa803"}, + {file = "tornado-6.4.2-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a017d239bd1bb0919f72af256a970624241f070496635784d9bf0db640d3fec"}, + {file = "tornado-6.4.2-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c36e62ce8f63409301537222faffcef7dfc5284f27eec227389f2ad11b09d946"}, + {file = "tornado-6.4.2-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bca9eb02196e789c9cb5c3c7c0f04fb447dc2adffd95265b2c7223a8a615ccbf"}, + {file = "tornado-6.4.2-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:304463bd0772442ff4d0f5149c6f1c2135a1fae045adf070821c6cdc76980634"}, + {file = "tornado-6.4.2-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:c82c46813ba483a385ab2a99caeaedf92585a1f90defb5693351fa7e4ea0bf73"}, + {file = "tornado-6.4.2-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:932d195ca9015956fa502c6b56af9eb06106140d844a335590c1ec7f5277d10c"}, + {file = "tornado-6.4.2-cp38-abi3-win32.whl", hash = "sha256:2876cef82e6c5978fde1e0d5b1f919d756968d5b4282418f3146b79b58556482"}, + {file = "tornado-6.4.2-cp38-abi3-win_amd64.whl", hash = "sha256:908b71bf3ff37d81073356a5fadcc660eb10c1476ee6e2725588626ce7e5ca38"}, + {file = "tornado-6.4.2.tar.gz", hash = "sha256:92bad5b4746e9879fd7bf1eb21dce4e3fc5128d71601f80005afa39237ad620b"}, ] [[package]] name = "tqdm" -version = "4.67.0" +version = "4.67.1" description = "Fast, Extensible Progress Meter" optional = false python-versions = ">=3.7" files = [ - {file = "tqdm-4.67.0-py3-none-any.whl", hash = "sha256:0cd8af9d56911acab92182e88d763100d4788bdf421d251616040cc4d44863be"}, - {file = "tqdm-4.67.0.tar.gz", hash = "sha256:fe5a6f95e6fe0b9755e9469b77b9c3cf850048224ecaa8293d7d2d31f97d869a"}, + {file = "tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2"}, + {file = "tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2"}, ] [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} [package.extras] -dev = ["pytest (>=6)", "pytest-cov", "pytest-timeout", "pytest-xdist"] +dev = ["nbval", "pytest (>=6)", "pytest-asyncio (>=0.24)", "pytest-cov", "pytest-timeout"] discord = ["requests"] notebook = ["ipywidgets (>=6)"] slack = ["slack-sdk"] @@ -5334,13 +5385,13 @@ files = [ [[package]] name = "types-python-dateutil" -version = "2.9.0.20241003" +version = "2.9.0.20241206" description = "Typing stubs for python-dateutil" optional = false python-versions = ">=3.8" files = [ - {file = "types-python-dateutil-2.9.0.20241003.tar.gz", hash = "sha256:58cb85449b2a56d6684e41aeefb4c4280631246a0da1a719bdbe6f3fb0317446"}, - {file = "types_python_dateutil-2.9.0.20241003-py3-none-any.whl", hash = "sha256:250e1d8e80e7bbc3a6c99b907762711d1a1cdd00e978ad39cb5940f6f0a87f3d"}, + {file = "types_python_dateutil-2.9.0.20241206-py3-none-any.whl", hash = "sha256:e248a4bc70a486d3e3ec84d0dc30eec3a5f979d6e7ee4123ae043eedbb987f53"}, + {file = "types_python_dateutil-2.9.0.20241206.tar.gz", hash = "sha256:18f493414c26ffba692a72369fea7a154c502646301ebfe3d56a04b3767284cb"}, ] [[package]] @@ -5445,81 +5496,76 @@ test = ["pytest"] [[package]] name = "wrapt" -version = "1.16.0" +version = "1.17.0" description = "Module for decorators, wrappers and monkey patching." optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "wrapt-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ffa565331890b90056c01db69c0fe634a776f8019c143a5ae265f9c6bc4bd6d4"}, - {file = "wrapt-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e4fdb9275308292e880dcbeb12546df7f3e0f96c6b41197e0cf37d2826359020"}, - {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb2dee3874a500de01c93d5c71415fcaef1d858370d405824783e7a8ef5db440"}, - {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2a88e6010048489cda82b1326889ec075a8c856c2e6a256072b28eaee3ccf487"}, - {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac83a914ebaf589b69f7d0a1277602ff494e21f4c2f743313414378f8f50a4cf"}, - {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:73aa7d98215d39b8455f103de64391cb79dfcad601701a3aa0dddacf74911d72"}, - {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:807cc8543a477ab7422f1120a217054f958a66ef7314f76dd9e77d3f02cdccd0"}, - {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bf5703fdeb350e36885f2875d853ce13172ae281c56e509f4e6eca049bdfb136"}, - {file = "wrapt-1.16.0-cp310-cp310-win32.whl", hash = "sha256:f6b2d0c6703c988d334f297aa5df18c45e97b0af3679bb75059e0e0bd8b1069d"}, - {file = "wrapt-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:decbfa2f618fa8ed81c95ee18a387ff973143c656ef800c9f24fb7e9c16054e2"}, - {file = "wrapt-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1a5db485fe2de4403f13fafdc231b0dbae5eca4359232d2efc79025527375b09"}, - {file = "wrapt-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:75ea7d0ee2a15733684badb16de6794894ed9c55aa5e9903260922f0482e687d"}, - {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a452f9ca3e3267cd4d0fcf2edd0d035b1934ac2bd7e0e57ac91ad6b95c0c6389"}, - {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:43aa59eadec7890d9958748db829df269f0368521ba6dc68cc172d5d03ed8060"}, - {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72554a23c78a8e7aa02abbd699d129eead8b147a23c56e08d08dfc29cfdddca1"}, - {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d2efee35b4b0a347e0d99d28e884dfd82797852d62fcd7ebdeee26f3ceb72cf3"}, - {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:6dcfcffe73710be01d90cae08c3e548d90932d37b39ef83969ae135d36ef3956"}, - {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:eb6e651000a19c96f452c85132811d25e9264d836951022d6e81df2fff38337d"}, - {file = "wrapt-1.16.0-cp311-cp311-win32.whl", hash = "sha256:66027d667efe95cc4fa945af59f92c5a02c6f5bb6012bff9e60542c74c75c362"}, - {file = "wrapt-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:aefbc4cb0a54f91af643660a0a150ce2c090d3652cf4052a5397fb2de549cd89"}, - {file = "wrapt-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5eb404d89131ec9b4f748fa5cfb5346802e5ee8836f57d516576e61f304f3b7b"}, - {file = "wrapt-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9090c9e676d5236a6948330e83cb89969f433b1943a558968f659ead07cb3b36"}, - {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94265b00870aa407bd0cbcfd536f17ecde43b94fb8d228560a1e9d3041462d73"}, - {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2058f813d4f2b5e3a9eb2eb3faf8f1d99b81c3e51aeda4b168406443e8ba809"}, - {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98b5e1f498a8ca1858a1cdbffb023bfd954da4e3fa2c0cb5853d40014557248b"}, - {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:14d7dc606219cdd7405133c713f2c218d4252f2a469003f8c46bb92d5d095d81"}, - {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:49aac49dc4782cb04f58986e81ea0b4768e4ff197b57324dcbd7699c5dfb40b9"}, - {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:418abb18146475c310d7a6dc71143d6f7adec5b004ac9ce08dc7a34e2babdc5c"}, - {file = "wrapt-1.16.0-cp312-cp312-win32.whl", hash = "sha256:685f568fa5e627e93f3b52fda002c7ed2fa1800b50ce51f6ed1d572d8ab3e7fc"}, - {file = "wrapt-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:dcdba5c86e368442528f7060039eda390cc4091bfd1dca41e8046af7c910dda8"}, - {file = "wrapt-1.16.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d462f28826f4657968ae51d2181a074dfe03c200d6131690b7d65d55b0f360f8"}, - {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a33a747400b94b6d6b8a165e4480264a64a78c8a4c734b62136062e9a248dd39"}, - {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3646eefa23daeba62643a58aac816945cadc0afaf21800a1421eeba5f6cfb9c"}, - {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ebf019be5c09d400cf7b024aa52b1f3aeebeff51550d007e92c3c1c4afc2a40"}, - {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:0d2691979e93d06a95a26257adb7bfd0c93818e89b1406f5a28f36e0d8c1e1fc"}, - {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:1acd723ee2a8826f3d53910255643e33673e1d11db84ce5880675954183ec47e"}, - {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:bc57efac2da352a51cc4658878a68d2b1b67dbe9d33c36cb826ca449d80a8465"}, - {file = "wrapt-1.16.0-cp36-cp36m-win32.whl", hash = "sha256:da4813f751142436b075ed7aa012a8778aa43a99f7b36afe9b742d3ed8bdc95e"}, - {file = "wrapt-1.16.0-cp36-cp36m-win_amd64.whl", hash = "sha256:6f6eac2360f2d543cc875a0e5efd413b6cbd483cb3ad7ebf888884a6e0d2e966"}, - {file = "wrapt-1.16.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a0ea261ce52b5952bf669684a251a66df239ec6d441ccb59ec7afa882265d593"}, - {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bd2d7ff69a2cac767fbf7a2b206add2e9a210e57947dd7ce03e25d03d2de292"}, - {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9159485323798c8dc530a224bd3ffcf76659319ccc7bbd52e01e73bd0241a0c5"}, - {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a86373cf37cd7764f2201b76496aba58a52e76dedfaa698ef9e9688bfd9e41cf"}, - {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:73870c364c11f03ed072dda68ff7aea6d2a3a5c3fe250d917a429c7432e15228"}, - {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b935ae30c6e7400022b50f8d359c03ed233d45b725cfdd299462f41ee5ffba6f"}, - {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:db98ad84a55eb09b3c32a96c576476777e87c520a34e2519d3e59c44710c002c"}, - {file = "wrapt-1.16.0-cp37-cp37m-win32.whl", hash = "sha256:9153ed35fc5e4fa3b2fe97bddaa7cbec0ed22412b85bcdaf54aeba92ea37428c"}, - {file = "wrapt-1.16.0-cp37-cp37m-win_amd64.whl", hash = "sha256:66dfbaa7cfa3eb707bbfcd46dab2bc6207b005cbc9caa2199bcbc81d95071a00"}, - {file = "wrapt-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1dd50a2696ff89f57bd8847647a1c363b687d3d796dc30d4dd4a9d1689a706f0"}, - {file = "wrapt-1.16.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:44a2754372e32ab315734c6c73b24351d06e77ffff6ae27d2ecf14cf3d229202"}, - {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e9723528b9f787dc59168369e42ae1c3b0d3fadb2f1a71de14531d321ee05b0"}, - {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dbed418ba5c3dce92619656802cc5355cb679e58d0d89b50f116e4a9d5a9603e"}, - {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:941988b89b4fd6b41c3f0bfb20e92bd23746579736b7343283297c4c8cbae68f"}, - {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6a42cd0cfa8ffc1915aef79cb4284f6383d8a3e9dcca70c445dcfdd639d51267"}, - {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1ca9b6085e4f866bd584fb135a041bfc32cab916e69f714a7d1d397f8c4891ca"}, - {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d5e49454f19ef621089e204f862388d29e6e8d8b162efce05208913dde5b9ad6"}, - {file = "wrapt-1.16.0-cp38-cp38-win32.whl", hash = "sha256:c31f72b1b6624c9d863fc095da460802f43a7c6868c5dda140f51da24fd47d7b"}, - {file = "wrapt-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:490b0ee15c1a55be9c1bd8609b8cecd60e325f0575fc98f50058eae366e01f41"}, - {file = "wrapt-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9b201ae332c3637a42f02d1045e1d0cccfdc41f1f2f801dafbaa7e9b4797bfc2"}, - {file = "wrapt-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2076fad65c6736184e77d7d4729b63a6d1ae0b70da4868adeec40989858eb3fb"}, - {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5cd603b575ebceca7da5a3a251e69561bec509e0b46e4993e1cac402b7247b8"}, - {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b47cfad9e9bbbed2339081f4e346c93ecd7ab504299403320bf85f7f85c7d46c"}, - {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8212564d49c50eb4565e502814f694e240c55551a5f1bc841d4fcaabb0a9b8a"}, - {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5f15814a33e42b04e3de432e573aa557f9f0f56458745c2074952f564c50e664"}, - {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db2e408d983b0e61e238cf579c09ef7020560441906ca990fe8412153e3b291f"}, - {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:edfad1d29c73f9b863ebe7082ae9321374ccb10879eeabc84ba3b69f2579d537"}, - {file = "wrapt-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed867c42c268f876097248e05b6117a65bcd1e63b779e916fe2e33cd6fd0d3c3"}, - {file = "wrapt-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:eb1b046be06b0fce7249f1d025cd359b4b80fc1c3e24ad9eca33e0dcdb2e4a35"}, - {file = "wrapt-1.16.0-py3-none-any.whl", hash = "sha256:6906c4100a8fcbf2fa735f6059214bb13b97f75b1a61777fcf6432121ef12ef1"}, - {file = "wrapt-1.16.0.tar.gz", hash = "sha256:5f370f952971e7d17c7d1ead40e49f32345a7f7a5373571ef44d800d06b1899d"}, + {file = "wrapt-1.17.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2a0c23b8319848426f305f9cb0c98a6e32ee68a36264f45948ccf8e7d2b941f8"}, + {file = "wrapt-1.17.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1ca5f060e205f72bec57faae5bd817a1560fcfc4af03f414b08fa29106b7e2d"}, + {file = "wrapt-1.17.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e185ec6060e301a7e5f8461c86fb3640a7beb1a0f0208ffde7a65ec4074931df"}, + {file = "wrapt-1.17.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb90765dd91aed05b53cd7a87bd7f5c188fcd95960914bae0d32c5e7f899719d"}, + {file = "wrapt-1.17.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:879591c2b5ab0a7184258274c42a126b74a2c3d5a329df16d69f9cee07bba6ea"}, + {file = "wrapt-1.17.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:fce6fee67c318fdfb7f285c29a82d84782ae2579c0e1b385b7f36c6e8074fffb"}, + {file = "wrapt-1.17.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:0698d3a86f68abc894d537887b9bbf84d29bcfbc759e23f4644be27acf6da301"}, + {file = "wrapt-1.17.0-cp310-cp310-win32.whl", hash = "sha256:69d093792dc34a9c4c8a70e4973a3361c7a7578e9cd86961b2bbf38ca71e4e22"}, + {file = "wrapt-1.17.0-cp310-cp310-win_amd64.whl", hash = "sha256:f28b29dc158ca5d6ac396c8e0a2ef45c4e97bb7e65522bfc04c989e6fe814575"}, + {file = "wrapt-1.17.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:74bf625b1b4caaa7bad51d9003f8b07a468a704e0644a700e936c357c17dd45a"}, + {file = "wrapt-1.17.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f2a28eb35cf99d5f5bd12f5dd44a0f41d206db226535b37b0c60e9da162c3ed"}, + {file = "wrapt-1.17.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:81b1289e99cf4bad07c23393ab447e5e96db0ab50974a280f7954b071d41b489"}, + {file = "wrapt-1.17.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f2939cd4a2a52ca32bc0b359015718472d7f6de870760342e7ba295be9ebaf9"}, + {file = "wrapt-1.17.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6a9653131bda68a1f029c52157fd81e11f07d485df55410401f745007bd6d339"}, + {file = "wrapt-1.17.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4e4b4385363de9052dac1a67bfb535c376f3d19c238b5f36bddc95efae15e12d"}, + {file = "wrapt-1.17.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bdf62d25234290db1837875d4dceb2151e4ea7f9fff2ed41c0fde23ed542eb5b"}, + {file = "wrapt-1.17.0-cp311-cp311-win32.whl", hash = "sha256:5d8fd17635b262448ab8f99230fe4dac991af1dabdbb92f7a70a6afac8a7e346"}, + {file = "wrapt-1.17.0-cp311-cp311-win_amd64.whl", hash = "sha256:92a3d214d5e53cb1db8b015f30d544bc9d3f7179a05feb8f16df713cecc2620a"}, + {file = "wrapt-1.17.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:89fc28495896097622c3fc238915c79365dd0ede02f9a82ce436b13bd0ab7569"}, + {file = "wrapt-1.17.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:875d240fdbdbe9e11f9831901fb8719da0bd4e6131f83aa9f69b96d18fae7504"}, + {file = "wrapt-1.17.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5ed16d95fd142e9c72b6c10b06514ad30e846a0d0917ab406186541fe68b451"}, + {file = "wrapt-1.17.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18b956061b8db634120b58f668592a772e87e2e78bc1f6a906cfcaa0cc7991c1"}, + {file = "wrapt-1.17.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:daba396199399ccabafbfc509037ac635a6bc18510ad1add8fd16d4739cdd106"}, + {file = "wrapt-1.17.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:4d63f4d446e10ad19ed01188d6c1e1bb134cde8c18b0aa2acfd973d41fcc5ada"}, + {file = "wrapt-1.17.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8a5e7cc39a45fc430af1aefc4d77ee6bad72c5bcdb1322cfde852c15192b8bd4"}, + {file = "wrapt-1.17.0-cp312-cp312-win32.whl", hash = "sha256:0a0a1a1ec28b641f2a3a2c35cbe86c00051c04fffcfcc577ffcdd707df3f8635"}, + {file = "wrapt-1.17.0-cp312-cp312-win_amd64.whl", hash = "sha256:3c34f6896a01b84bab196f7119770fd8466c8ae3dfa73c59c0bb281e7b588ce7"}, + {file = "wrapt-1.17.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:714c12485aa52efbc0fc0ade1e9ab3a70343db82627f90f2ecbc898fdf0bb181"}, + {file = "wrapt-1.17.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da427d311782324a376cacb47c1a4adc43f99fd9d996ffc1b3e8529c4074d393"}, + {file = "wrapt-1.17.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba1739fb38441a27a676f4de4123d3e858e494fac05868b7a281c0a383c098f4"}, + {file = "wrapt-1.17.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e711fc1acc7468463bc084d1b68561e40d1eaa135d8c509a65dd534403d83d7b"}, + {file = "wrapt-1.17.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:140ea00c87fafc42739bd74a94a5a9003f8e72c27c47cd4f61d8e05e6dec8721"}, + {file = "wrapt-1.17.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:73a96fd11d2b2e77d623a7f26e004cc31f131a365add1ce1ce9a19e55a1eef90"}, + {file = "wrapt-1.17.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0b48554952f0f387984da81ccfa73b62e52817a4386d070c75e4db7d43a28c4a"}, + {file = "wrapt-1.17.0-cp313-cp313-win32.whl", hash = "sha256:498fec8da10e3e62edd1e7368f4b24aa362ac0ad931e678332d1b209aec93045"}, + {file = "wrapt-1.17.0-cp313-cp313-win_amd64.whl", hash = "sha256:fd136bb85f4568fffca995bd3c8d52080b1e5b225dbf1c2b17b66b4c5fa02838"}, + {file = "wrapt-1.17.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:17fcf043d0b4724858f25b8826c36e08f9fb2e475410bece0ec44a22d533da9b"}, + {file = "wrapt-1.17.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4a557d97f12813dc5e18dad9fa765ae44ddd56a672bb5de4825527c847d6379"}, + {file = "wrapt-1.17.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0229b247b0fc7dee0d36176cbb79dbaf2a9eb7ecc50ec3121f40ef443155fb1d"}, + {file = "wrapt-1.17.0-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8425cfce27b8b20c9b89d77fb50e368d8306a90bf2b6eef2cdf5cd5083adf83f"}, + {file = "wrapt-1.17.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9c900108df470060174108012de06d45f514aa4ec21a191e7ab42988ff42a86c"}, + {file = "wrapt-1.17.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:4e547b447073fc0dbfcbff15154c1be8823d10dab4ad401bdb1575e3fdedff1b"}, + {file = "wrapt-1.17.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:914f66f3b6fc7b915d46c1cc424bc2441841083de01b90f9e81109c9759e43ab"}, + {file = "wrapt-1.17.0-cp313-cp313t-win32.whl", hash = "sha256:a4192b45dff127c7d69b3bdfb4d3e47b64179a0b9900b6351859f3001397dabf"}, + {file = "wrapt-1.17.0-cp313-cp313t-win_amd64.whl", hash = "sha256:4f643df3d4419ea3f856c5c3f40fec1d65ea2e89ec812c83f7767c8730f9827a"}, + {file = "wrapt-1.17.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:69c40d4655e078ede067a7095544bcec5a963566e17503e75a3a3e0fe2803b13"}, + {file = "wrapt-1.17.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f495b6754358979379f84534f8dd7a43ff8cff2558dcdea4a148a6e713a758f"}, + {file = "wrapt-1.17.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:baa7ef4e0886a6f482e00d1d5bcd37c201b383f1d314643dfb0367169f94f04c"}, + {file = "wrapt-1.17.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8fc931382e56627ec4acb01e09ce66e5c03c384ca52606111cee50d931a342d"}, + {file = "wrapt-1.17.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:8f8909cdb9f1b237786c09a810e24ee5e15ef17019f7cecb207ce205b9b5fcce"}, + {file = "wrapt-1.17.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:ad47b095f0bdc5585bced35bd088cbfe4177236c7df9984b3cc46b391cc60627"}, + {file = "wrapt-1.17.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:948a9bd0fb2c5120457b07e59c8d7210cbc8703243225dbd78f4dfc13c8d2d1f"}, + {file = "wrapt-1.17.0-cp38-cp38-win32.whl", hash = "sha256:5ae271862b2142f4bc687bdbfcc942e2473a89999a54231aa1c2c676e28f29ea"}, + {file = "wrapt-1.17.0-cp38-cp38-win_amd64.whl", hash = "sha256:f335579a1b485c834849e9075191c9898e0731af45705c2ebf70e0cd5d58beed"}, + {file = "wrapt-1.17.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d751300b94e35b6016d4b1e7d0e7bbc3b5e1751e2405ef908316c2a9024008a1"}, + {file = "wrapt-1.17.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7264cbb4a18dc4acfd73b63e4bcfec9c9802614572025bdd44d0721983fc1d9c"}, + {file = "wrapt-1.17.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:33539c6f5b96cf0b1105a0ff4cf5db9332e773bb521cc804a90e58dc49b10578"}, + {file = "wrapt-1.17.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c30970bdee1cad6a8da2044febd824ef6dc4cc0b19e39af3085c763fdec7de33"}, + {file = "wrapt-1.17.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:bc7f729a72b16ee21795a943f85c6244971724819819a41ddbaeb691b2dd85ad"}, + {file = "wrapt-1.17.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:6ff02a91c4fc9b6a94e1c9c20f62ea06a7e375f42fe57587f004d1078ac86ca9"}, + {file = "wrapt-1.17.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:2dfb7cff84e72e7bf975b06b4989477873dcf160b2fd89959c629535df53d4e0"}, + {file = "wrapt-1.17.0-cp39-cp39-win32.whl", hash = "sha256:2399408ac33ffd5b200480ee858baa58d77dd30e0dd0cab6a8a9547135f30a88"}, + {file = "wrapt-1.17.0-cp39-cp39-win_amd64.whl", hash = "sha256:4f763a29ee6a20c529496a20a7bcb16a73de27f5da6a843249c7047daf135977"}, + {file = "wrapt-1.17.0-py3-none-any.whl", hash = "sha256:d2c63b93548eda58abf5188e505ffed0229bf675f7c3090f8e36ad55b8cbc371"}, + {file = "wrapt-1.17.0.tar.gz", hash = "sha256:16187aa2317c731170a88ef35e8937ae0f533c402872c1ee5e6d079fcf320801"}, ] [[package]] diff --git a/src/qibo/backends/abstract.py b/src/qibo/backends/abstract.py index 9cf431016f..2c91139486 100644 --- a/src/qibo/backends/abstract.py +++ b/src/qibo/backends/abstract.py @@ -303,8 +303,8 @@ def sample_frequencies(self, probabilities, nshots): # pragma: no cover raise_error(NotImplementedError) @abc.abstractmethod - def calculate_norm(self, state, order=2): # pragma: no cover - """Calculate norm of a state vector. + def calculate_vector_norm(self, state, order=2): # pragma: no cover + """Calculate norm of an :math:`1`-dimensional array. For specifications on possible values of the parameter ``order`` for the ``tensorflow`` backend, please refer to @@ -315,9 +315,10 @@ def calculate_norm(self, state, order=2): # pragma: no cover raise_error(NotImplementedError) @abc.abstractmethod - def calculate_norm_density_matrix(self, state, order="nuc"): # pragma: no cover - """Calculate norm of a density matrix. Default is the ``nuclear`` norm. + def calculate_matrix_norm(self, state, order="nuc"): # pragma: no cover + """Calculate norm of a :math:`2`-dimensional array. + Default is the ``nuclear`` norm. If ``order="nuc"``, it returns the nuclear norm of ``state``, assuming ``state`` is Hermitian (also known as trace norm). For specifications on the other possible values of the diff --git a/src/qibo/backends/numpy.py b/src/qibo/backends/numpy.py index daef2a4606..9845dc4728 100644 --- a/src/qibo/backends/numpy.py +++ b/src/qibo/backends/numpy.py @@ -719,11 +719,11 @@ def apply_bitflips(self, noiseless_samples, bitflip_probabilities): noisy_samples = noisy_samples - noiseless_samples * flip_1 return noisy_samples - def calculate_norm(self, state, order=2): + def calculate_vector_norm(self, state, order=2): state = self.cast(state) return self.np.linalg.norm(state, order) - def calculate_norm_density_matrix(self, state, order="nuc"): + def calculate_matrix_norm(self, state, order="nuc"): state = self.cast(state) return self.np.linalg.norm(state, ord=order) diff --git a/src/qibo/callbacks.py b/src/qibo/callbacks.py index 315db67429..6c03834b6b 100644 --- a/src/qibo/callbacks.py +++ b/src/qibo/callbacks.py @@ -183,12 +183,12 @@ class Norm(Callback): """ def apply(self, backend, state): - norm = backend.calculate_norm(state) + norm = backend.calculate_vector_norm(state) self.append(norm) return norm def apply_density_matrix(self, backend, state): - norm = backend.calculate_norm_density_matrix(state) + norm = backend.calculate_matrix_norm(state) self.append(norm) return norm diff --git a/src/qibo/gates/gates.py b/src/qibo/gates/gates.py index 618279c897..1a56e8cdfb 100644 --- a/src/qibo/gates/gates.py +++ b/src/qibo/gates/gates.py @@ -1384,6 +1384,14 @@ def __init__(self, q0, q1, theta, trainable=True): def qasm_label(self): return "cry" + def decompose(self) -> List[Gate]: + """Decomposition of :math:`\\text{CRY}` gate.""" + from qibo.transpiler.decompositions import ( # pylint: disable=C0415 + standard_decompositions, + ) + + return standard_decompositions(self) + class CRZ(_CRn_): """Controlled rotation around the Z-axis for the Bloch sphere. diff --git a/src/qibo/hamiltonians/hamiltonians.py b/src/qibo/hamiltonians/hamiltonians.py index 9c8abe111f..d844a85ac8 100644 --- a/src/qibo/hamiltonians/hamiltonians.py +++ b/src/qibo/hamiltonians/hamiltonians.py @@ -543,9 +543,7 @@ def calculate_dense(self): def expectation(self, state, normalize=False): return Hamiltonian.expectation(self, state, normalize) - def expectation_from_circuit( - self, circuit: "Circuit", qubit_map: dict = None, nshots: int = 1000 - ) -> float: + def expectation_from_circuit(self, circuit: "Circuit", nshots: int = 1000) -> float: """ Calculate the expectation value from a circuit. This even works for observables not completely diagonal in the computational @@ -560,70 +558,63 @@ def expectation_from_circuit( Args: circuit (Circuit): input circuit. - qubit_map (dict): qubit map, defaults to ``{0: 0, 1: 1, ..., n: n}`` nshots (int): number of shots, defaults to 1000. Returns: (float): the calculated expectation value. """ - from qibo import Circuit, gates - - if qubit_map is None: - qubit_map = list(range(self.nqubits)) + from qibo import gates rotated_circuits = [] coefficients = [] Z_observables = [] - q_maps = [] + qubit_maps = [] for term in self.terms: # store coefficient coefficients.append(term.coefficient) + # Only care about non-I terms + non_identity_factors = [ + factor for factor in term.factors if factor.name[0] != "I" + ] # build diagonal observable Z_observables.append( SymbolicHamiltonian( - prod([Z(q) for q in term.target_qubits]), + prod(Z(factor.target_qubit) for factor in non_identity_factors), nqubits=circuit.nqubits, backend=self.backend, ) ) + # Get the qubits we want to measure for each term + qubit_map = sorted(factor.target_qubit for factor in non_identity_factors) # prepare the measurement basis and append it to the circuit measurements = [ gates.M(factor.target_qubit, basis=factor.gate.__class__) - for factor in set(term.factors) + for factor in non_identity_factors ] circ_copy = circuit.copy(True) circ_copy.add(measurements) rotated_circuits.append(circ_copy) - # map the original qubits into 0, 1, 2, ... - q_maps.append( - dict( - zip( - [qubit_map[q] for q in term.target_qubits], - range(len(term.target_qubits)), - ) - ) - ) + # for mapping the obtained sample frequencies to the original qubits + qubit_maps.append(qubit_map) frequencies = [ result.frequencies() for result in self.backend.execute_circuits(rotated_circuits, nshots=nshots) ] return sum( - [ - coeff * obs.expectation_from_samples(freq, qmap) - for coeff, freq, obs, qmap in zip( - coefficients, frequencies, Z_observables, q_maps - ) - ] + coeff * obs.expectation_from_samples(freq, qubit_map) + for coeff, freq, obs, qubit_map in zip( + coefficients, frequencies, Z_observables, qubit_maps + ) ) - def expectation_from_samples(self, freq: dict, qubit_map: dict = None) -> float: + def expectation_from_samples(self, freq: dict, qubit_map: list = None) -> float: """ Calculate the expectation value from the samples. The observable has to be diagonal in the computational basis. Args: freq (dict): input frequencies of the samples. - qubit_map (dict): qubit map. + qubit_map (list): qubit map. Returns: (float): the calculated expectation value. @@ -645,11 +636,13 @@ def expectation_from_samples(self, freq: dict, qubit_map: dict = None) -> float: ) expvals = [] for term in self.terms: - qubits = term.target_qubits + qubits = { + factor.target_qubit for factor in term.factors if factor.name[0] != "I" + } expvals.extend( [ term.coefficient.real - * (-1) ** [state[qubit_map[q]] for q in qubits].count("1") + * (-1) ** [state[qubit_map.index(q)] for q in qubits].count("1") for state in keys ] ) diff --git a/src/qibo/models/dbi/__init__.py b/src/qibo/models/dbi/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/src/qibo/models/dbi/double_bracket.py b/src/qibo/models/dbi/double_bracket.py deleted file mode 100644 index ccaacca39d..0000000000 --- a/src/qibo/models/dbi/double_bracket.py +++ /dev/null @@ -1,377 +0,0 @@ -from copy import copy -from enum import Enum, auto -from typing import Optional - -import numpy as np -import optuna - -from qibo.config import raise_error -from qibo.hamiltonians import Hamiltonian -from qibo.models.dbi.utils import * -from qibo.models.dbi.utils_scheduling import ( - grid_search_step, - hyperopt_step, - polynomial_step, - simulated_annealing_step, -) -from qibo.quantum_info.linalg_operations import commutator, matrix_exponentiation - - -class DoubleBracketGeneratorType(Enum): - """Define DBF evolution.""" - - canonical = auto() - """Use canonical commutator.""" - single_commutator = auto() - """Use single commutator.""" - group_commutator = auto() - """Use group commutator approximation""" - group_commutator_third_order = auto() - """Implements Eq. (8) of Ref. [1], i.e. - - .. math:: - e^{\\frac{\\sqrt{5}-1}{2}isH} \\, - e^{\\frac{\\sqrt{5}-1}{2}isD} \\, - e^{-isH} \\, - e^{isD} \\, - e^{\\frac{3-\\sqrt{5}}{2}isH} \\, - e^{isD} \\approx e^{-s^2[H,D]} + O(s^4) \\, . - - :math:`s` must be taken as :math:`\\sqrt{s}` to approximate the flow using the commutator. - """ - - -class DoubleBracketCostFunction(str, Enum): - """Define the DBI cost function.""" - - off_diagonal_norm = "off_diagonal_norm" - """Use off-diagonal norm as cost function.""" - least_squares = "least_squares" - """Use least squares as cost function.""" - energy_fluctuation = "energy_fluctuation" - """Use energy fluctuation as cost function.""" - - -class DoubleBracketScheduling(Enum): - """Define the DBI scheduling strategies.""" - - hyperopt = hyperopt_step - """Use optuna package to hyperoptimize the DBI step.""" - grid_search = grid_search_step - """Use greedy grid search.""" - polynomial_approximation = polynomial_step - """Use polynomial expansion (analytical) of the loss function.""" - simulated_annealing = simulated_annealing_step - """Use simulated annealing algorithm""" - - -class DoubleBracketIteration: - """ - Class implementing the Double Bracket iteration algorithm. For more details, see Ref. [1]. - - Args: - hamiltonian (:class:`qibo.hamiltonians.Hamiltonian`): starting Hamiltonian. - mode (:class:`qibo.models.dbi.double_bracket.DoubleBracketGeneratorType`): - type of generator of the evolution. - scheduling (:class:`qibo.models.dbi.double_bracket.DoubleBracketScheduling`): - type of scheduling strategy. - cost (:class:`qibo.models.dbi.double_bracket.DoubleBracketCostFunction`): - type of cost function. - ref_state (ndarray): reference state for computing the energy fluctuation. - - Example: - .. testcode:: - - from qibo.models.dbi.double_bracket import DoubleBracketIteration, DoubleBracketGeneratorType - from qibo.quantum_info import random_hermitian - from qibo.hamiltonians import Hamiltonian - - nqubits = 4 - h0 = random_hermitian(2**nqubits, seed=2) - dbf = DoubleBracketIteration(Hamiltonian(nqubits=nqubits, matrix=h0)) - - # diagonalized matrix - dbf.h - - References: - 1. M. Gluza, *Double-bracket quantum algorithms for diagonalization*. - `arXiv:2206.11772 [quant-ph] `_. - """ - - def __init__( - self, - hamiltonian, - mode=DoubleBracketGeneratorType.canonical, - scheduling=DoubleBracketScheduling.grid_search, - cost=DoubleBracketCostFunction.off_diagonal_norm, - ref_state=None, - ): - self.h = hamiltonian - self.h0 = copy(self.h) - self.mode = mode - self.scheduling = scheduling - self.cost = cost - self.ref_state = ref_state - - def __call__(self, step: float, mode=None, d=None): - """We use the following convention: - - .. math:: - H^{'} = U^{\\dagger} \\, H \\, U \\, , - - where :math:`U=e^{-s\\,W}`, and :math:`W =[D, H]` (or depending on ``mode`` an - approximation, see `eval_dbr_unitary`). If :math:`s > 0`, then, - for :math:`D = \\Delta(H)`, the GWW DBR will give a :math:`\\sigma`-decrease. - - References: - 1. M. Gluza, *Double-bracket quantum algorithms for diagonalization*. - `arXiv:2206.11772 [quant-ph] `_.""" - - operator = self.eval_dbr_unitary(step, mode, d) - operator_dagger = self.backend.cast( - np.array(np.matrix(self.backend.to_numpy(operator)).getH()) - ) - self.h.matrix = operator_dagger @ self.h.matrix @ operator - return operator - - def eval_dbr_unitary( - self, - step: float, - mode=None, - d=None, - ): - """In :meth:`qibo.models.dbi.double_bracket.DoubleBracketIteration.__call__`, - we are working in the following convention: - - .. math:: - H^{'} = U^{\\dagger} \\, H \\, U \\, , - - where :math:`U = e^{-s\\,W}`, and :math:`W = [D, H]` - (or an approximation of that by a group commutator). - That is convenient because if we switch from the DBI in the Heisenberg picture for the - Hamiltonian, we get that the transformation of the state is - :math:`|\\psi'\\rangle = U \\, |\\psi\\rangle`, so that - - .. math:: - \\langle H\\rangle_{\\psi'} = \\langle H' \\rangle_\\psi \\, , - - i.e. when writing the unitary acting on the state dagger notation is avoided). - The group commutator must approximate :math:`U = e^{-s\\, [D,H]}`. - This is achieved by setting :math:`r = \\sqrt{s}` so that - - .. math:: - V = e^{-i\\,r\\,H} \\, e^{i\\,r\\,D} \\, e^{i\\,r\\,H} \\, e^{-i\\,r\\,D} - - because - - .. math:: - e^{-i\\,r\\,H} \\, D \\, e^{i\\,r\\,H} = D + i\\,r\\,[D, H] +O(r^2) - - so - - .. math:: - V \\approx \\exp\\left(i\\,r\\,D + i^2 \\, r^2 \\, [D, H] + O(r^2) -i\\,r\\,D\\right) \\approx U \\, . - - See the Appendix in Ref. [1] for the complete derivation. - - References: - 1. M. Gluza, *Double-bracket quantum algorithms for diagonalization*. - `arXiv:2206.11772 [quant-ph] `_. - """ - if mode is None: - mode = self.mode - - if mode is DoubleBracketGeneratorType.canonical: - operator = matrix_exponentiation( - -1.0j * step, - self.commutator(self.diagonal_h_matrix, self.h.matrix), - backend=self.backend, - ) - elif mode is DoubleBracketGeneratorType.single_commutator: - if d is None: - d = self.diagonal_h_matrix - operator = matrix_exponentiation( - -1.0j * step, - self.commutator(self.backend.cast(d), self.h.matrix), - backend=self.backend, - ) - elif mode is DoubleBracketGeneratorType.group_commutator: - if d is None: - d = self.diagonal_h_matrix - operator = ( - self.h.exp(step) - @ matrix_exponentiation(-step, d, backend=self.backend) - @ self.h.exp(-step) - @ matrix_exponentiation(step, d, backend=self.backend) - ) - elif mode is DoubleBracketGeneratorType.group_commutator_third_order: - if d is None: - d = self.diagonal_h_matrix - operator = ( - self.h.exp(-step * (np.sqrt(5) - 1) / 2) - @ matrix_exponentiation( - -step * (np.sqrt(5) - 1) / 2, d, backend=self.backend - ) - @ self.h.exp(step) - @ matrix_exponentiation( - step * (np.sqrt(5) + 1) / 2, d, backend=self.backend - ) - @ self.h.exp(-step * (3 - np.sqrt(5)) / 2) - @ matrix_exponentiation(-step, d, backend=self.backend) - ) - operator = ( - matrix_exponentiation(step, d, backend=self.backend) - @ self.h.exp(step * (3 - np.sqrt(5)) / 2) - @ matrix_exponentiation( - -step * (np.sqrt(5) + 1) / 2, d, backend=self.backend - ) - @ self.h.exp(-step) - @ matrix_exponentiation( - step * (np.sqrt(5) - 1) / 2, d, backend=self.backend - ) - @ self.h.exp(step * (np.sqrt(5) - 1) / 2) - ) - else: - raise_error( - NotImplementedError, f"The mode {mode} is not supported" - ) # pragma: no cover - - return operator - - @staticmethod - def commutator(a, b): - """Compute commutator between two arrays.""" - return commutator(a, b) - - @property - def diagonal_h_matrix(self): - """Diagonal H matrix.""" - return self.backend.cast(np.diag(np.diag(self.backend.to_numpy(self.h.matrix)))) - - @property - def off_diag_h(self): - """Off-diagonal H matrix.""" - return self.h.matrix - self.diagonal_h_matrix - - @property - def off_diagonal_norm(self): - """Hilbert Schmidt norm of off-diagonal part of H matrix, namely :math:`\\text{Tr}(\\sqrt{A^{\\dagger} A})`.""" - off_diag_h_dag = self.backend.cast( - np.matrix(self.backend.to_numpy(self.off_diag_h)).getH() - ) - return np.sqrt( - np.real(np.trace(self.backend.to_numpy(off_diag_h_dag @ self.off_diag_h))) - ) - - @property - def backend(self): - """Get Hamiltonian's backend.""" - return self.h0.backend - - @property - def nqubits(self): - """Number of qubits.""" - return self.h.nqubits - - def least_squares(self, d: np.array): - """Least squares cost function.""" - d = self.backend.to_numpy(d) - return np.real( - 0.5 * np.linalg.norm(d) ** 2 - - np.trace(self.backend.to_numpy(self.h.matrix) @ d) - ) - - def choose_step( - self, - d: Optional[np.array] = None, - scheduling: Optional[DoubleBracketScheduling] = None, - **kwargs, - ): - """Calculate the optimal step using respective the `scheduling` methods.""" - if scheduling is None: - scheduling = self.scheduling - step = scheduling(self, d=d, **kwargs) - # TODO: write test for this case - if ( - step is None - and scheduling is DoubleBracketScheduling.polynomial_approximation - ): # pragma: no cover - kwargs["n"] = kwargs.get("n", 3) - kwargs["n"] += 1 - # if n==n_max, return None - step = scheduling(self, d=d, **kwargs) - # if for a given polynomial order n, no solution is found, we increase the order of the polynomial by 1 - return step - - def loss(self, step: float, d: np.array = None, look_ahead: int = 1): - """ - Compute loss function distance between `look_ahead` steps. - - Args: - step (float): iteration step. - d (np.array): diagonal operator, use canonical by default. - look_ahead (int): number of iteration steps to compute the loss function; - """ - # copy initial hamiltonian - h_copy = copy(self.h) - - for _ in range(look_ahead): - self.__call__(mode=self.mode, step=step, d=d) - - # loss values depending on the cost function - if self.cost is DoubleBracketCostFunction.off_diagonal_norm: - loss = self.off_diagonal_norm - elif self.cost is DoubleBracketCostFunction.least_squares: - loss = self.least_squares(d) - elif self.cost == DoubleBracketCostFunction.energy_fluctuation: - loss = self.energy_fluctuation(self.ref_state) - - # set back the initial configuration - self.h = h_copy - - return loss - - def energy_fluctuation(self, state): - """ - Evaluate energy fluctuation. - - .. math:: - \\Xi(\\mu) = \\sqrt{\\langle\\mu|\\hat{H}^2|\\mu\\rangle - \\langle\\mu|\\hat{H}|\\mu\\rangle^2} \\, - - for a given state :math:`|\\mu\\rangle`. - - Args: - state (np.ndarray): quantum state to be used to compute the energy fluctuation with H. - """ - return self.h.energy_fluctuation(state) - - def sigma(self, h: np.array): - """Returns the off-diagonal restriction of matrix `h`.""" - return self.backend.cast(h) - self.backend.cast( - np.diag(np.diag(self.backend.to_numpy(h))) - ) - - def generate_gamma_list(self, n: int, d: np.array): - r"""Computes the n-nested Gamma functions, where $\Gamma_k=[W,...,[W,[W,H]]...]$, where we take k nested commutators with $W = [D, H]$""" - W = self.commutator(self.backend.cast(d), self.sigma(self.h.matrix)) - gamma_list = [self.h.matrix] - for _ in range(n - 1): - gamma_list.append(self.commutator(W, gamma_list[-1])) - return gamma_list - - def cost_expansion(self, d, n): - d = self.backend.cast(d) - - if self.cost is DoubleBracketCostFunction.off_diagonal_norm: - coef = off_diagonal_norm_polynomial_expansion_coef(self, d, n) - elif self.cost is DoubleBracketCostFunction.least_squares: - coef = least_squares_polynomial_expansion_coef( - self, d, n, backend=self.backend - ) - elif self.cost is DoubleBracketCostFunction.energy_fluctuation: - coef = energy_fluctuation_polynomial_expansion_coef( - self, d, n, self.ref_state - ) - else: # pragma: no cover - raise ValueError(f"Cost function {self.cost} not recognized.") - return coef diff --git a/src/qibo/models/dbi/utils.py b/src/qibo/models/dbi/utils.py deleted file mode 100644 index 4a04c7a4f8..0000000000 --- a/src/qibo/models/dbi/utils.py +++ /dev/null @@ -1,286 +0,0 @@ -import math -from enum import Enum, auto -from itertools import combinations, product - -import numpy as np - -from qibo import symbols -from qibo.backends import _check_backend -from qibo.hamiltonians import SymbolicHamiltonian - - -def generate_Z_operators(nqubits: int, backend=None): - """Generate a dictionary containing 1) all possible products of Pauli Z operators for L = n_qubits and 2) their respective names. - Return: Dictionary with operator names (str) as keys and operators (np.array) as values - - Example: - .. testcode:: - - from qibo.models.dbi.utils import generate_Z_operators - from qibo.models.dbi.double_bracket import DoubleBracketIteration - from qibo.quantum_info import random_hermitian - from qibo.hamiltonians import Hamiltonian - import numpy as np - - nqubits = 4 - h0 = random_hermitian(2**nqubits) - dbi = DoubleBracketIteration(Hamiltonian(nqubits=nqubits, matrix=h0)) - generate_Z = generate_Z_operators(nqubits) - Z_ops = list(generate_Z.values()) - - delta_h0 = dbi.diagonal_h_matrix - dephasing_channel = (sum([Z_op @ h0 @ Z_op for Z_op in Z_ops])+h0)/2**nqubits - norm_diff = np.linalg.norm(delta_h0 - dephasing_channel) - """ - - backend = _check_backend(backend) - # list of tuples, e.g. ('Z','I','Z') - combination_strings = product("ZI", repeat=nqubits) - output_dict = {} - - for zi_string_combination in combination_strings: - # except for the identity - if "Z" in zi_string_combination: - op_name = "".join(zi_string_combination) - tensor_op = str_to_symbolic(op_name) - # append in output_dict - output_dict[op_name] = SymbolicHamiltonian( - tensor_op, backend=backend - ).dense.matrix - return output_dict - - -def str_to_symbolic(name: str): - """Convert string into symbolic hamiltonian. - Example: - .. testcode:: - - from qibo.models.dbi.utils import str_to_symbolic - op_name = "ZYXZI" - # returns 5-qubit symbolic hamiltonian - ZIXZI_op = str_to_symbolic(op_name) - """ - tensor_op = 1 - for qubit, char in enumerate(name): - tensor_op *= getattr(symbols, char)(qubit) - return tensor_op - - -def cs_angle_sgn(dbi_object, d, backend=None): - """Calculates the sign of Cauchy-Schwarz Angle :math:`\\langle W(Z), W({\\rm canonical}) \\rangle_{\\rm HS}`.""" - backend = _check_backend(backend) - d = backend.cast(d) - norm = backend.np.trace( - backend.np.matmul( - backend.np.conj( - dbi_object.commutator(dbi_object.diagonal_h_matrix, dbi_object.h.matrix) - ).T, - dbi_object.commutator(d, dbi_object.h.matrix), - ) - ) - return backend.np.real(backend.np.sign(norm)) - - -def decompose_into_pauli_basis(h_matrix: np.array, pauli_operators: list, backend=None): - """finds the decomposition of hamiltonian `h_matrix` into Pauli-Z operators""" - nqubits = int(np.log2(h_matrix.shape[0])) - backend = _check_backend(backend) - decomposition = [] - for Z_i in pauli_operators: - expect = backend.np.trace(h_matrix @ Z_i) / 2**nqubits - decomposition.append(expect) - return decomposition - - -def generate_pauli_index(nqubits, order): - """ - Generate all possible combinations of qubits for a given order of Pauli operators. - """ - if order == 1: - return list(range(nqubits)) - else: - indices = list(range(nqubits)) - return indices + [ - comb for i in range(2, order + 1) for comb in combinations(indices, i) - ] - - -def generate_pauli_operator_dict( - nqubits: int, - parameterization_order: int = 1, - symbols_pauli=symbols.Z, - backend=None, -): - """Generates a dictionary containing Pauli `symbols_pauli` operators of locality `parameterization_order` for `nqubits` qubits. - - Args: - nqubits (int): number of qubits in the system. - parameterization_order (int, optional): the locality of the operators generated. Defaults to 1. - symbols_pauli (qibo.symbols, optional): the symbol of the intended Pauli operator. Defaults to symbols.Z. - - Returns: - pauli_operator_dict (dictionary): dictionary with structure {"operator_name": operator} - - Example: - pauli_operator_dict = generate_pauli_operator_dict) - """ - backend = _check_backend(backend) - pauli_index = generate_pauli_index(nqubits, order=parameterization_order) - pauli_operators = [ - generate_pauli_operators(nqubits, symbols_pauli, index, backend=backend) - for index in pauli_index - ] - return {index: operator for index, operator in zip(pauli_index, pauli_operators)} - - -def generate_pauli_operators(nqubits, symbols_pauli, positions, backend=None): - # generate matrix of an nqubit-pauli operator with `symbols_pauli` at `positions` - if isinstance(positions, int): - return SymbolicHamiltonian( - symbols_pauli(positions), - nqubits=nqubits, - backend=backend, - ).dense.matrix - else: - terms = [symbols_pauli(pos) for pos in positions] - return SymbolicHamiltonian( - math.prod(terms), nqubits=nqubits, backend=backend - ).dense.matrix - - -class ParameterizationTypes(Enum): - """Define types of parameterization for diagonal operator.""" - - pauli = auto() - """Uses Pauli-Z operators (magnetic field).""" - computational = auto() - """Uses computational basis.""" - - -def params_to_diagonal_operator( - params: np.array, - nqubits: int, - parameterization: ParameterizationTypes = ParameterizationTypes.pauli, - pauli_parameterization_order: int = 1, - normalize: bool = False, - pauli_operator_dict: dict = None, - backend=None, -): - r"""Creates the $D$ operator for the double-bracket iteration ansatz depending on the parameterization type.""" - backend = _check_backend(backend) - if parameterization is ParameterizationTypes.pauli: - # raise error if dimension mismatch - d = sum( - [ - backend.to_numpy(params[i]) - * backend.to_numpy(list(pauli_operator_dict.values())[i]) - for i in range(nqubits) - ] - ) - elif parameterization is ParameterizationTypes.computational: - d = np.zeros((len(params), len(params))) - for i in range(len(params)): - d[i, i] = backend.to_numpy(params[i]) - - # TODO: write proper tests for normalize=True - if normalize: # pragma: no cover - d = d / np.linalg.norm(d) - return backend.cast(d) - - -def off_diagonal_norm_polynomial_expansion_coef(dbi_object, d, n): - # generate Gamma's where $\Gamma_{k+1}=[W, \Gamma_{k}], $\Gamma_0=H - W = dbi_object.commutator( - dbi_object.backend.cast(d), dbi_object.sigma(dbi_object.h.matrix) - ) - gamma_list = dbi_object.generate_gamma_list(n + 2, d) - sigma_gamma_list = list(map(dbi_object.sigma, gamma_list)) - gamma_list_np = list(map(dbi_object.backend.to_numpy, sigma_gamma_list)) - exp_list = np.array([1 / math.factorial(k) for k in range(n + 1)]) - # coefficients for rotation with [W,H] and H - c1 = exp_list.reshape((-1, 1, 1)) * gamma_list_np[1:] - c2 = exp_list.reshape((-1, 1, 1)) * gamma_list_np[:-1] - # product coefficient - trace_coefficients = [0] * (2 * n + 1) - for k in range(n + 1): - for j in range(n + 1): - power = k + j - product_matrix = c1[k] @ c2[j] - trace_coefficients[power] += 2 * np.trace(product_matrix) - # coefficients from high to low (n:0) - coef = list(reversed(trace_coefficients[: n + 1])) - return coef - - -def least_squares_polynomial_expansion_coef(dbi_object, d, n: int = 3, backend=None): - """Return the Taylor expansion coefficients of least square cost of `dbi_object.h` and diagonal operator `d` with respect to double bracket rotation duration `s`.""" - # generate Gamma's where $\Gamma_{k+1}=[W, \Gamma_{k}], $\Gamma_0=H - backend = _check_backend(backend) - Gamma_list = dbi_object.generate_gamma_list(n + 1, d) - exp_list = np.array([1 / math.factorial(k) for k in range(n + 1)]) - # coefficients - coef = np.empty(n) - for i in range(n): - coef[i] = backend.np.real( - exp_list[i] - * backend.np.trace(dbi_object.backend.cast(d) @ Gamma_list[i + 1]) - ) - coef = list(reversed(coef)) - return coef - - -def energy_fluctuation_polynomial_expansion_coef( - dbi_object, d: np.array, n: int = 3, state=0 -): - """Return the Taylor expansion coefficients of energy fluctuation of `dbi_object` with respect to double bracket rotation duration `s`.""" - # generate Gamma's where $\Gamma_{k+1}=[W, \Gamma_{k}], $\Gamma_0=H - Gamma_list = dbi_object.generate_gamma_list(n + 1, d) - # coefficients - coef = np.empty(3) - state_cast = dbi_object.backend.cast(state) - state_dag = dbi_object.backend.cast(state.conj().T) - - def variance(a): - """Calculates the variance of a matrix A with respect to a state: - Var($A$) = $\\langle\\mu|A^2|\\mu\rangle-\\langle\\mu|A|\\mu\rangle^2$""" - b = a @ a - return state_dag @ b @ state_cast - (state_dag @ a @ state_cast) ** 2 - - def covariance(a, b): - """This is a generalization of the notion of covariance, needed for the polynomial expansion of the energy fluctuation, - applied to two operators A and B with respect to a state: - Cov($A,B$) = $\\langle\\mu|AB|\\mu\rangle-\\langle\\mu|A|\\mu\rangle\\langle\\mu|B|\\mu\rangle$ - """ - - c = a @ b + b @ a - return ( - state_dag @ c @ state_cast - - 2 * state_dag @ a @ state_cast * state_dag @ b @ state_cast - ) - - coef[0] = np.real(2 * covariance(Gamma_list[0], Gamma_list[1])) - coef[1] = np.real(2 * variance(Gamma_list[1])) - coef[2] = np.real( - covariance(Gamma_list[0], Gamma_list[3]) - + 3 * covariance(Gamma_list[1], Gamma_list[2]) - ) - coef = list(reversed(coef)) - return coef - - -def copy_dbi_object(dbi_object): - """ - Return a copy of the DoubleBracketIteration object. - This is necessary for the `select_best_dbr_generator` function as pytorch do not support deepcopy for leaf tensors. - """ - from copy import copy, deepcopy # pylint: disable=import-outside-toplevel - - dbi_class = dbi_object.__class__ - new = dbi_class.__new__(dbi_class) - - # Manually copy h and h0 as they may be torch tensors - new.h, new.h0 = copy(dbi_object.h), copy(dbi_object.h0) - # Deepcopy the rest of the attributes - for attr in ("mode", "scheduling", "cost", "ref_state"): - setattr(new, attr, deepcopy(getattr(dbi_object, attr, None))) - return new diff --git a/src/qibo/models/dbi/utils_dbr_strategies.py b/src/qibo/models/dbi/utils_dbr_strategies.py deleted file mode 100644 index 3f7ff06221..0000000000 --- a/src/qibo/models/dbi/utils_dbr_strategies.py +++ /dev/null @@ -1,262 +0,0 @@ -import optuna - -from qibo.backends import _check_backend -from qibo.models.dbi.double_bracket import * -from qibo.models.dbi.utils import * - - -def select_best_dbr_generator( - dbi_object: DoubleBracketIteration, - d_list: list, - step: Optional[float] = None, - compare_canonical: bool = True, - scheduling: DoubleBracketScheduling = None, - **kwargs, -): - """Selects the best double bracket rotation generator from a list and execute the rotation. - - Args: - dbi_object (`DoubleBracketIteration`): the target DoubleBracketIteration object. - d_list (list): list of diagonal operators (np.array) to select from. - step (float): fixed iteration duration. - Defaults to ``None``, optimize with `scheduling` method and `choose_step` function. - compare_canonical (boolean): if `True`, the diagonalization effect with operators from `d_list` is compared with the canonical bracket. - scheduling (`DoubleBracketScheduling`): scheduling method for finding the optimal step. - - Returns: - The updated dbi_object (`DoubleBracketIteration`), index of the optimal diagonal operator (int), respective step duration (float), and sign (int). - - Example: - from qibo.hamiltonians import Hamiltonian - from qibo.models.dbi.double_bracket import * - from qibo.models.dbi.utils_dbr_strategies import select_best_dbr_generator - from qibo.quantum_info import random_hermitian - - nqubits = 3 - NSTEPS = 3 - h0 = random_hermitian(2**nqubits) - dbi = DoubleBracketIteration( - Hamiltonian(nqubits, h0), - mode=DoubleBracketGeneratorType.single_commutator, - ) - initial_off_diagonal_norm = dbi.off_diagonal_norm - generate_local_Z = generate_Z_operators(nqubits) - Z_ops = list(generate_local_Z.values()) - for _ in range(NSTEPS): - dbi, idx, step, flip_sign = select_best_dbr_generator( - dbi, Z_ops, compare_canonical=True - ) - """ - if scheduling is None: - scheduling = dbi_object.scheduling - - if compare_canonical: - norms_off_diagonal_restriction = [dbi_object.off_diagonal_norm] * ( - len(d_list) + 1 - ) - optimal_steps = np.zeros(len(d_list) + 1) - flip_list = np.ones(len(d_list) + 1) - else: - norms_off_diagonal_restriction = [dbi_object.off_diagonal_norm] * (len(d_list)) - optimal_steps = np.zeros(len(d_list)) - flip_list = np.ones(len(d_list)) - - for i, d in enumerate(d_list): - # prescribed step durations - dbi_eval = copy_dbi_object(dbi_object) - d = dbi_eval.backend.cast(d) - flip_list[i] = cs_angle_sgn(dbi_eval, d, backend=dbi_object.backend) - if flip_list[i] != 0: - if step is None: - step_best = dbi_eval.choose_step( - d=flip_list[i] * d, scheduling=scheduling, **kwargs - ) - else: - step_best = step - dbi_eval(step=step_best, d=flip_list[i] * d) - optimal_steps[i] = step_best - norms_off_diagonal_restriction[i] = dbi_eval.off_diagonal_norm - # canonical - if compare_canonical is True: - dbi_eval = copy_dbi_object(dbi_object) - dbi_eval.mode = DoubleBracketGeneratorType.canonical - if step is None: - step_best = dbi_eval.choose_step(scheduling=scheduling, **kwargs) - else: - step_best = step - dbi_eval(step=step_best) - optimal_steps[-1] = step_best - norms_off_diagonal_restriction[-1] = dbi_eval.off_diagonal_norm - # find best d - idx_max_loss = np.argmin(norms_off_diagonal_restriction) - flip = flip_list[idx_max_loss] - step_optimal = optimal_steps[idx_max_loss] - dbi_eval = copy_dbi_object(dbi_object) - if idx_max_loss == len(d_list) and compare_canonical is True: - # canonical - dbi_eval(step=step_optimal, mode=DoubleBracketGeneratorType.canonical) - - else: - d_optimal = flip * d_list[idx_max_loss] - dbi_eval(step=step_optimal, d=d_optimal) - return dbi_eval, idx_max_loss, step_optimal, flip - - -def gradient_numerical( - dbi_object: DoubleBracketIteration, - d_params: list, - parameterization: ParameterizationTypes, - s: float = 1e-2, - delta: float = 1e-3, - backend=None, - **kwargs, -): - r""" - Gradient of the DBI with respect to the parametrization of D. A simple finite difference is used to calculate the gradient. - - Args: - dbi_object (DoubleBracketIteration): DoubleBracketIteration object. - d_params (np.array): Parameters for the ansatz (note that the dimension must be 2**nqubits for full ansazt and nqubits for Pauli ansatz). - s (float): A short flow duration for finding the numerical gradient. - delta (float): Step size for numerical gradient. - Returns: - grad (np.array): Gradient of the D operator. - """ - backend = _check_backend(backend) - nqubits = dbi_object.nqubits - grad = np.zeros(len(d_params)) - d = params_to_diagonal_operator( - d_params, nqubits, parameterization=parameterization, **kwargs, backend=backend - ) - for i in range(len(d_params)): - params_new = backend.to_numpy(d_params).copy() - params_new[i] = params_new[i] + delta - d_new = params_to_diagonal_operator( - params_new, - nqubits, - parameterization=parameterization, - **kwargs, - backend=backend, - ) - # find the increment of a very small step - grad[i] = (dbi_object.loss(s, d_new) - dbi_object.loss(s, d)) / delta - return grad - - -def gradient_descent( - dbi_object: DoubleBracketIteration, - iterations: int, - d_params: list, - parameterization: ParameterizationTypes, - pauli_operator_dict: dict = None, - pauli_parameterization_order: int = 1, - normalize: bool = False, - lr_min: float = 1e-5, - lr_max: float = 1, - max_evals: int = 100, - space: callable = None, - optimizer: optuna.samplers.BaseSampler = optuna.samplers.TPESampler(), - verbose: bool = False, - backend=None, -): - r"""Numerical gradient descent method for variating diagonal operator in each double bracket rotation. - - Args: - dbi_object (DoubleBracketIteration): the target double bracket object. - iterations (int): number of double bracket rotations. - d_params (list): the parameters for the initial diagonal operator. - parameterization (ParameterizationTypes): the parameterization method for diagonal operator. - Options include pauli and computational. - pauli_operator_dict (dictionary, optional): dictionary of "name": Pauli-operator for Pauli-based parameterization type. - Defaults to None. - pauli_parameterization_order (int, optional): the order of parameterization or locality in Pauli basis. Defaults to 1. - normalize (bool, optional): option to normalize the diagonal operator. Defaults to False. - lr_min (float, optional): the minimal gradient step. Defaults to 1e-5. - lr_max (float, optional): the maximal gradient step. Defaults to 1. - max_evals (int, optional): maximum number of evaluations for `lr` using `optuna`. Defaults to 100. - space (callable, optional): evalutation space for `optuna`. Defaults to None. - optimizer (optuna.samplers.BaseSampler, optional): optimizer option for `optuna`. Defaults to `TPESampler()`. - verbose (bool, optional): option for printing `optuna` process. Defaults to False. - - Returns: - loss_hist (list): list of history losses of `dbi_object` throughout the double bracket rotations. - d_params_hist (list): list of history of `d` parameters after gradient descent. - s_hist (list): list of history of optimal `s` found. - """ - backend = _check_backend(backend) - - nqubits = dbi_object.nqubits - if ( - parameterization is ParameterizationTypes.pauli and pauli_operator_dict is None - ): # pragma: no cover - pauli_operator_dict = generate_pauli_operator_dict( - nqubits=nqubits, parameterization_order=pauli_parameterization_order - ) - - d = params_to_diagonal_operator( - d_params, - nqubits, - parameterization=parameterization, - pauli_operator_dict=pauli_operator_dict, - normalize=normalize, - backend=backend, - ) - - loss_hist = [dbi_object.loss(0.0, d=d)] - d_params_hist = [d_params] - s_hist = [0] - - s = dbi_object.choose_step(d=d) - dbi_object(step=s, d=d) - - for _ in range(iterations): - grad = gradient_numerical( - dbi_object, - d_params, - parameterization, - pauli_operator_dict=pauli_operator_dict, - pauli_parameterization_order=pauli_parameterization_order, - normalize=normalize, - backend=backend, - ) - - def func_loss_to_lr(trial): - lr = trial.suggest_loguniform("lr", lr_min, lr_max) - d_params_eval = [d_params[j] - grad[j] * lr for j in range(len(grad))] - d_eval = params_to_diagonal_operator( - d_params_eval, - nqubits, - parameterization=parameterization, - pauli_operator_dict=pauli_operator_dict, - normalize=normalize, - backend=backend, - ) - return dbi_object.loss(step=s, d=d_eval) - - # create a study using the specified optimizer (sampler) - study = optuna.create_study(sampler=optimizer, direction="minimize") - - # optimize the function - study.optimize(func_loss_to_lr, n_trials=max_evals) - - # get the best learning rate - lr = study.best_params["lr"] - - d_params = [d_params[j] - grad[j] * lr for j in range(len(grad))] - d = params_to_diagonal_operator( - d_params, - nqubits, - parameterization=parameterization, - pauli_operator_dict=pauli_operator_dict, - normalize=normalize, - backend=backend, - ) - s = dbi_object.choose_step(d=d) - dbi_object(step=s, d=d) - - # record history - loss_hist.append(dbi_object.loss(0.0, d=d)) - d_params_hist.append(d_params) - s_hist.append(s) - - return loss_hist, d_params_hist, s_hist diff --git a/src/qibo/models/dbi/utils_scheduling.py b/src/qibo/models/dbi/utils_scheduling.py deleted file mode 100644 index 1f08ca2e04..0000000000 --- a/src/qibo/models/dbi/utils_scheduling.py +++ /dev/null @@ -1,209 +0,0 @@ -import math -from typing import Optional - -import numpy as np -import optuna - -error = 1e-3 - - -def grid_search_step( - dbi_object, - step_min: float = 1e-5, - step_max: float = 1, - num_evals: int = 100, - space: Optional[np.array] = None, - d: Optional[np.array] = None, -): - """ - Greedy optimization of the iteration step. - - Args: - step_min: lower bound of the search grid; - step_max: upper bound of the search grid; - mnum_evals: number of iterations between step_min and step_max; - d: diagonal operator for generating double-bracket iterations. - - Returns: - (float): optimized best iteration step (minimizing off-diagonal norm). - """ - if space is None: - space = np.linspace(step_min, step_max, num_evals) - - if d is None: - d = dbi_object.diagonal_h_matrix - - loss_list = [dbi_object.loss(step, d=d) for step in space] - - idx_max_loss = np.argmin(loss_list) - return space[idx_max_loss] - - -def hyperopt_step( - self, - step_min: float = 1e-5, - step_max: float = 1, - max_evals: int = 1000, - look_ahead: int = 1, - verbose: bool = False, - d: np.array = None, - optimizer: optuna.samplers.BaseSampler = None, -): - """ - Optimize iteration step using Optuna. - - Args: - step_min: lower bound of the search grid; - step_max: upper bound of the search grid; - max_evals: maximum number of trials done by the optimizer; - look_ahead: number of iteration steps to compute the loss function; - verbose: level of verbosity; - d: diagonal operator for generating double-bracket iterations; - optimizer: Optuna sampler for the search algorithm (e.g., - optuna.samplers.TPESampler()). - See: https://optuna.readthedocs.io/en/stable/reference/samplers/index.html - - Returns: - (float): optimized best iteration step. - """ - optuna.logging.set_verbosity(optuna.logging.WARNING) - - def objective(trial): - step = trial.suggest_float("step", step_min, step_max) - return self.loss(step, d=d, look_ahead=look_ahead) - - if optimizer is None: - optimizer = optuna.samplers.TPESampler() - - study = optuna.create_study(direction="minimize", sampler=optimizer) - study.optimize(objective, n_trials=max_evals, show_progress_bar=verbose) - - return study.best_params["step"] - - -def polynomial_step( - dbi_object, - n: int = 2, - n_max: int = 5, - d: np.array = None, - coef: Optional[list] = None, - cost: Optional[str] = None, -): - r""" - Optimizes iteration step by solving the n_th order polynomial expansion of the loss function. - e.g. $n=2$: $2\Trace(\sigma(\Gamma_1 + s\Gamma_2 + s^2/2\Gamma_3)\sigma(\Gamma_0 + s\Gamma_1 + s^2/2\Gamma_2)) - Args: - n (int, optional): the order to which the loss function is expanded. Defaults to 4. - n_max (int, optional): maximum order allowed for recurring calls of `polynomial_step`. Defaults to 5. - d (np.array, optional): diagonal operator, default as $\delta(H)$. - backup_scheduling (`DoubleBracketScheduling`): the scheduling method to use in case no real positive roots are found. - """ - if cost is None: - cost = dbi_object.cost - - if d is None: - d = dbi_object.diagonal_h_matrix - - if n > n_max: - raise ValueError( - "No solution can be found with polynomial approximation. Increase `n_max` or use other scheduling methods." - ) - if coef is None: - coef = dbi_object.cost_expansion(d=d, n=n) - roots = np.roots(coef) - real_positive_roots = [ - np.real(root) for root in roots if np.imag(root) < 1e-3 and np.real(root) > 0 - ] - # solution exists, return minimum s - if len(real_positive_roots) > 0: - losses = [dbi_object.loss(step=root, d=d) for root in real_positive_roots] - return real_positive_roots[losses.index(min(losses))] - # solution does not exist, return None - else: - return None - - -def simulated_annealing_step( - dbi_object, - d: Optional[np.array] = None, - initial_s=None, - step_min=1e-5, - step_max=1, - s_jump_range=None, - s_jump_range_divident=5, - initial_temp=1, - cooling_rate=0.85, - min_temp=1e-5, - max_iter=200, -): - """ - Perform a single step of simulated annealing optimization. - - Parameters: - dbi_object: DBI object - The object representing the problem to be optimized. - d: Optional[np.array], optional - The diagonal matrix 'd' used in optimization. If None, it uses the diagonal - matrix 'diagonal_h_matrix' from dbi_object. - initial_s: float or None, optional - Initial value for 's', the step size. If None, it is initialized using - polynomial_step function with 'n=4'. If 'polynomial_step' returns None, - 'initial_s' is set to 'step_min'. - step_min: float, optional - Minimum value for the step size 's'. - step_max: float, optional - Maximum value for the step size 's'. - s_jump_range: float or None, optional - Range for the random jump in step size. If None, it's calculated based on - 'step_min', 'step_max', and 's_jump_range_divident'. - s_jump_range_divident: int, optional - Dividend to determine the range for random jump in step size. - initial_temp: float, optional - Initial temperature for simulated annealing. - cooling_rate: float, optional - Rate at which temperature decreases in simulated annealing. - min_temp: float, optional - Minimum temperature threshold for termination of simulated annealing. - max_iter: int, optional - Maximum number of iterations for simulated annealing. - - Returns: - float: - The optimized step size 's'. - """ - - if d is None: - d = dbi_object.diagonal_h_matrix - if initial_s is None: - initial_s = polynomial_step(dbi_object=dbi_object, d=d, n=4) - # TODO: implement test to catch this if statement - if initial_s is None: # pragma: no cover - initial_s = step_min - if s_jump_range is None: - s_jump_range = (step_max - step_min) / s_jump_range_divident - current_s = initial_s - current_loss = dbi_object.loss(d=d, step=current_s) - temp = initial_temp - - for _ in range(max_iter): - candidate_s = max( - step_min, - min( - current_s + np.random.uniform(-1 * s_jump_range, s_jump_range), step_max - ), - ) - candidate_loss = dbi_object.loss(d=d, step=candidate_s) - - # Calculate change in loss - delta_loss = candidate_loss - current_loss - - # Determine if the candidate solution is an improvement - if delta_loss < 0 or np.random.rand() < math.exp(-delta_loss / temp): - current_s = candidate_s - current_loss = candidate_loss - # Cool down - temp *= cooling_rate - if temp < min_temp or current_s > step_max or current_s < step_min: - break - - return current_s diff --git a/src/qibo/models/evolution.py b/src/qibo/models/evolution.py index 0a53e4917e..71f73ad59a 100644 --- a/src/qibo/models/evolution.py +++ b/src/qibo/models/evolution.py @@ -81,7 +81,7 @@ def __init__(self, hamiltonian, dt, solver="exp", callbacks=[], accelerators=Non def _create_normalize_state(self, solver): if "rk" in solver: log.info("Normalizing state during RK solution.") - return lambda s: s / self.backend.calculate_norm(s) + return lambda s: s / self.backend.calculate_vector_norm(s) else: return lambda s: s diff --git a/src/qibo/quantum_info/entropies.py b/src/qibo/quantum_info/entropies.py index 48767896d0..be3eaaec21 100644 --- a/src/qibo/quantum_info/entropies.py +++ b/src/qibo/quantum_info/entropies.py @@ -783,7 +783,7 @@ def renyi_entropy(state, alpha: Union[float, int], base: float = 2, backend=None if alpha == np.inf: return ( -1 - * backend.np.log2(backend.calculate_norm_density_matrix(state, order=2)) + * backend.np.log2(backend.calculate_matrix_norm(state, order=2)) / np.log2(base) ) @@ -890,7 +890,7 @@ def relative_renyi_entropy( new_target = matrix_power(target, 0.5, backend=backend) log = backend.np.log2( - backend.calculate_norm_density_matrix(new_state @ new_target, order=1) + backend.calculate_matrix_norm(new_state @ new_target, order=1) ) return -2 * log / np.log2(base) diff --git a/src/qibo/quantum_info/metrics.py b/src/qibo/quantum_info/metrics.py index 61503cb48c..6ba3997583 100644 --- a/src/qibo/quantum_info/metrics.py +++ b/src/qibo/quantum_info/metrics.py @@ -34,7 +34,7 @@ def purity(state, backend=None): ) if len(state.shape) == 1: - pur = backend.np.real(backend.calculate_norm(state)) ** 2 + pur = backend.np.real(backend.calculate_vector_norm(state)) ** 2 else: pur = backend.np.real(backend.np.trace(backend.np.matmul(state, state))) return float(pur) @@ -109,7 +109,7 @@ def trace_distance(state, target, check_hermitian: bool = False, backend=None): if check_hermitian is True: hermitian = bool( float( - backend.calculate_norm_density_matrix( + backend.calculate_matrix_norm( backend.np.transpose(backend.np.conj(difference), (1, 0)) - difference, order=2, @@ -440,7 +440,7 @@ def process_fidelity(channel, target=None, check_unitary: bool = False, backend= if check_unitary is True: norm_channel = float( - backend.calculate_norm_density_matrix( + backend.calculate_matrix_norm( backend.np.matmul( backend.np.conj(backend.np.transpose(channel, (1, 0))), channel ) @@ -451,7 +451,7 @@ def process_fidelity(channel, target=None, check_unitary: bool = False, backend= raise_error(TypeError, "Channel is not unitary and Target is None.") if target is not None: norm_target = float( - backend.calculate_norm( + backend.calculate_vector_norm( backend.np.matmul( backend.np.conj(backend.np.transpose(target, (1, 0))), target ) @@ -762,7 +762,7 @@ def expressibility( circuit.nqubits, power_t, samples=None, backend=backend ) - pqc_integral(circuit, power_t, samples, backend=backend) - fid = float(backend.calculate_norm(deviation, order=order)) + fid = float(backend.calculate_vector_norm(deviation, order=order)) return fid @@ -929,9 +929,7 @@ def _check_hermitian(matrix, backend=None): """ backend = _check_backend(backend) - norm = backend.calculate_norm_density_matrix( - backend.np.conj(matrix).T - matrix, order=2 - ) + norm = backend.calculate_matrix_norm(backend.np.conj(matrix).T - matrix, order=2) hermitian = bool(float(norm) <= PRECISION_TOL) diff --git a/src/qibo/quantum_info/quantum_networks.py b/src/qibo/quantum_info/quantum_networks.py index 0976094978..b37bb63fa6 100644 --- a/src/qibo/quantum_info/quantum_networks.py +++ b/src/qibo/quantum_info/quantum_networks.py @@ -298,7 +298,7 @@ def is_hermitian( adjoint = self._backend.np.transpose(reshaped) mat_diff = self._backend.np.conj(adjoint) - reshaped - norm = self._backend.calculate_norm_density_matrix(mat_diff, order=order) + norm = self._backend.calculate_matrix_norm(mat_diff, order=order) return float(norm) <= precision_tol @@ -787,7 +787,7 @@ def is_causal( sub_comb = self._tensordot(reduced, trace_in, axes=(-1, 0)) expected = self._tensordot(sub_comb, trace_in / dim_in, axes=0) - norm = self._backend.calculate_norm(reduced - expected, order=order) + norm = self._backend.calculate_vector_norm(reduced - expected, order=order) if float(norm) > precision_tol: return False @@ -926,7 +926,7 @@ def is_unital( sub_comb = self._tensordot(reduced, trace_out, axes=(0, 0)) expected = self._tensordot(trace_out / dim_out, sub_comb, axes=0) - norm = self._backend.calculate_norm((reduced - expected), order=order) + norm = self._backend.calculate_vector_norm((reduced - expected), order=order) if float(norm) > precision_tol: return False diff --git a/src/qibo/quantum_info/superoperator_transformations.py b/src/qibo/quantum_info/superoperator_transformations.py index fa7d2902ba..2f38caf1c7 100644 --- a/src/qibo/quantum_info/superoperator_transformations.py +++ b/src/qibo/quantum_info/superoperator_transformations.py @@ -517,7 +517,7 @@ def choi_to_kraus( if validate_cp: norm = float( - backend.calculate_norm_density_matrix( + backend.calculate_matrix_norm( choi_super_op - backend.np.conj(choi_super_op).T, order=2 ) ) @@ -2132,7 +2132,7 @@ def function(x0, operators): for prob, oper in zip(x0, operators): operator = operator + prob * oper - return float(backend.calculate_norm_density_matrix(target - operator, order=2)) + return float(backend.calculate_matrix_norm(target - operator, order=2)) # initial parameters as flat distribution x0 = [1.0 / (len(kraus_ops) + 1)] * len(kraus_ops) diff --git a/src/qibo/quantum_info/utils.py b/src/qibo/quantum_info/utils.py index 273e9af9dc..3e1cd1f1ba 100644 --- a/src/qibo/quantum_info/utils.py +++ b/src/qibo/quantum_info/utils.py @@ -251,7 +251,7 @@ def hellinger_distance(prob_dist_p, prob_dist_q, validate: bool = False, backend raise_error(ValueError, "Second probability array must sum to 1.") distance = float( - backend.calculate_norm( + backend.calculate_vector_norm( backend.np.sqrt(prob_dist_p) - backend.np.sqrt(prob_dist_q) ) / np.sqrt(2) @@ -386,7 +386,7 @@ def total_variation_distance( if backend.np.abs(backend.np.sum(prob_dist_q) - 1.0) > PRECISION_TOL: raise_error(ValueError, "Second probability array must sum to 1.") - tvd = backend.calculate_norm(prob_dist_p - prob_dist_q, order=1) + tvd = backend.calculate_vector_norm(prob_dist_p - prob_dist_q, order=1) return tvd / 2 diff --git a/src/qibo/transpiler/decompositions.py b/src/qibo/transpiler/decompositions.py index 47cec5cec0..43ab7092fe 100644 --- a/src/qibo/transpiler/decompositions.py +++ b/src/qibo/transpiler/decompositions.py @@ -493,6 +493,16 @@ def _decomposition_generalized_RBS(ins, outs, theta, phi, controls): standard_decompositions.add( gates.CSXDG, [gates.H(1), gates.CU1(0, 1, -np.pi / 2), gates.H(1)] ) +standard_decompositions.add( + gates.CRY, + lambda gate: [ + gates.RY(1, gate.parameters[0] / 4), + gates.CNOT(0, 1), + gates.RY(1, -gate.parameters[0] / 2), + gates.CNOT(0, 1), + gates.RY(1, gate.parameters[0] / 4), + ], +) standard_decompositions.add( gates.RZX, lambda gate: [ diff --git a/src/qibo/transpiler/placer.py b/src/qibo/transpiler/placer.py index 1399f85ea2..c67e664fc2 100644 --- a/src/qibo/transpiler/placer.py +++ b/src/qibo/transpiler/placer.py @@ -126,7 +126,7 @@ def __call__(self, circuit: Circuit): """ assert_placement(circuit, self.connectivity) gates_qubits_pairs = _find_gates_qubits_pairs(circuit) - if len(gates_qubits_pairs) < 3: + if len(gates_qubits_pairs) < 2: raise_error( ValueError, "Circuit must contain at least two two-qubit gates " diff --git a/src/qibo/transpiler/unitary_decompositions.py b/src/qibo/transpiler/unitary_decompositions.py index 40bda6d296..b31560373b 100644 --- a/src/qibo/transpiler/unitary_decompositions.py +++ b/src/qibo/transpiler/unitary_decompositions.py @@ -97,9 +97,7 @@ def calculate_single_qubit_unitaries(psi, backend=None): """ psi_magic = backend.np.matmul(backend.np.conj(backend.cast(magic_basis)).T, psi) if ( - backend.np.real( - backend.calculate_norm_density_matrix(backend.np.imag(psi_magic)) - ) + backend.np.real(backend.calculate_matrix_norm(backend.np.imag(psi_magic))) > 1e-6 ): # pragma: no cover raise_error(NotImplementedError, "Given state is not real in the magic basis.") diff --git a/tests/test_gates_channels.py b/tests/test_gates_channels.py index a1a7974541..a16a3f5441 100644 --- a/tests/test_gates_channels.py +++ b/tests/test_gates_channels.py @@ -108,7 +108,7 @@ def test_kraus_channel(backend, pauli_order): backend.assert_allclose( float( - backend.calculate_norm_density_matrix( + backend.calculate_matrix_norm( channel.to_liouville(backend=backend) - test_superop, order=2 ) ) @@ -117,7 +117,7 @@ def test_kraus_channel(backend, pauli_order): ) backend.assert_allclose( float( - backend.calculate_norm_density_matrix( + backend.calculate_matrix_norm( channel.to_choi(backend=backend) - test_choi, order=2 ) ) @@ -126,7 +126,7 @@ def test_kraus_channel(backend, pauli_order): ) backend.assert_allclose( float( - backend.calculate_norm( + backend.calculate_vector_norm( channel.to_pauli_liouville(pauli_order=pauli_order, backend=backend) - test_pauli ) @@ -240,7 +240,7 @@ def test_pauli_noise_channel(backend, pauli_order): normalize=True, pauli_order=pauli_order, backend=backend ) norm = float( - backend.calculate_norm_density_matrix( + backend.calculate_matrix_norm( backend.to_numpy(liouville) - test_representation, order=2 ) ) @@ -383,9 +383,7 @@ def test_thermal_relaxation_channel(backend, t_1, t_2, time, excpop): target_state = backend.cast(target_state, dtype=target_state.dtype) backend.assert_allclose( - float( - backend.calculate_norm_density_matrix(final_state - target_state, order=2) - ) + float(backend.calculate_matrix_norm(final_state - target_state, order=2)) < PRECISION_TOL, True, ) diff --git a/tests/test_gates_gates.py b/tests/test_gates_gates.py index f47f26d613..ccd04dd939 100644 --- a/tests/test_gates_gates.py +++ b/tests/test_gates_gates.py @@ -698,6 +698,9 @@ def test_cun(backend, name, params): gate = getattr(gates, name)(0, 1, **params) + if name == "CRY": + decomposition = gate.decompose() + assert gate.unitary if name != "CU2": @@ -722,6 +725,12 @@ def test_cun(backend, name, params): backend.assert_allclose(final_state, target_state, atol=1e-6) + if name == "CRY": + matrix = Circuit(2) + matrix.add(decomposition) + matrix = matrix.unitary(backend=backend) + backend.assert_allclose(matrix, _matrix, atol=1e-10) + def test_swap(backend): final_state = apply_gates(backend, [gates.X(1), gates.SWAP(0, 1)], nqubits=2) diff --git a/tests/test_hamiltonians.py b/tests/test_hamiltonians.py index 5d96ac464c..33fa884767 100644 --- a/tests/test_hamiltonians.py +++ b/tests/test_hamiltonians.py @@ -295,7 +295,7 @@ def test_hamiltonian_expectation_from_circuit(backend): backend.set_seed(12) nshots = 4 * 10**6 - observable = X(0) * Z(1) + Y(0) * X(2) / 2 - Z(0) * (1 - Y(1)) ** 3 + observable = I(0) * Z(1) + X(0) * Z(1) + Y(0) * X(2) / 2 - Z(0) * (1 - Y(1)) ** 3 exp, H, c = non_exact_expectation_test_setup(backend, observable) exp_from_samples = H.expectation_from_circuit(c, nshots=nshots) backend.assert_allclose(exp, exp_from_samples, atol=1e-2) diff --git a/tests/test_hamiltonians_symbolic.py b/tests/test_hamiltonians_symbolic.py index a3b82d7b66..00da0f0b35 100644 --- a/tests/test_hamiltonians_symbolic.py +++ b/tests/test_hamiltonians_symbolic.py @@ -286,25 +286,29 @@ def test_symbolic_hamiltonian_state_expectation_different_nqubits( local_ev = local_ham.expectation(state) -def test_hamiltonian_expectation_from_samples(backend): +@pytest.mark.parametrize( + "observable,qubit_map", + [ + (2 * Z(0) * Z(3) + Z(0) * Z(2), [0, 1, 2, 3]), + (Z(1) + Z(3), [0, 1, 3]), + ], +) +def test_hamiltonian_expectation_from_samples(backend, observable, qubit_map): """Test Hamiltonian expectation value calculation.""" backend.set_seed(0) - obs0 = 2 * Z(0) * Z(1) + Z(0) * Z(2) - obs1 = 2 * Z(0) * Z(1) + Z(0) * Z(2) * I(3) - h0 = SymbolicHamiltonian(obs0, backend=backend) - h1 = SymbolicHamiltonian(obs1, backend=backend) + hamiltonian = SymbolicHamiltonian(observable, backend=backend) c = Circuit(4) c.add(gates.RX(0, np.random.rand())) c.add(gates.RX(1, np.random.rand())) c.add(gates.RX(2, np.random.rand())) c.add(gates.RX(3, np.random.rand())) - c.add(gates.M(0, 1, 2, 3)) + c.add(gates.M(*qubit_map)) nshots = 10**5 result = backend.execute_circuit(c, nshots=nshots) freq = result.frequencies(binary=True) - ev0 = h0.expectation_from_samples(freq, qubit_map=None) - ev1 = h1.expectation(result.state()) - backend.assert_allclose(ev0, ev1, atol=20 / np.sqrt(nshots)) + from_samples = hamiltonian.expectation_from_samples(freq, qubit_map=qubit_map) + from_state = hamiltonian.expectation(result.state()) + backend.assert_allclose(from_samples, from_state, atol=20 / np.sqrt(nshots)) @pytest.mark.parametrize("density_matrix", [False, True]) diff --git a/tests/test_models_dbi.py b/tests/test_models_dbi.py deleted file mode 100644 index d19168caa9..0000000000 --- a/tests/test_models_dbi.py +++ /dev/null @@ -1,293 +0,0 @@ -"""Testing DoubleBracketIteration model""" - -import numpy as np -import pytest - -from qibo import hamiltonians -from qibo.hamiltonians import Hamiltonian -from qibo.models.dbi.double_bracket import ( - DoubleBracketCostFunction, - DoubleBracketGeneratorType, - DoubleBracketIteration, - DoubleBracketScheduling, -) -from qibo.models.dbi.utils import * -from qibo.models.dbi.utils_dbr_strategies import ( - gradient_descent, - select_best_dbr_generator, -) -from qibo.models.dbi.utils_scheduling import polynomial_step -from qibo.quantum_info import random_hermitian - -NSTEPS = 3 -seed = 10 -"""Number of steps for evolution.""" - - -@pytest.mark.parametrize("nqubits", [1, 2]) -def test_double_bracket_iteration_canonical(backend, nqubits): - """Check default (canonical) mode.""" - h0 = random_hermitian(2**nqubits, backend=backend, seed=seed) - dbi = DoubleBracketIteration( - Hamiltonian(nqubits, h0, backend=backend), - mode=DoubleBracketGeneratorType.canonical, - ) - initial_off_diagonal_norm = dbi.off_diagonal_norm - for _ in range(NSTEPS): - dbi(step=np.sqrt(0.001)) - - assert initial_off_diagonal_norm > dbi.off_diagonal_norm - - -@pytest.mark.parametrize("nqubits", [1, 2]) -def test_double_bracket_iteration_group_commutator(backend, nqubits): - """Check group commutator mode.""" - h0 = random_hermitian(2**nqubits, backend=backend, seed=seed) - d = backend.cast(np.diag(np.diag(backend.to_numpy(h0)))) - dbi = DoubleBracketIteration( - Hamiltonian(nqubits, h0, backend=backend), - mode=DoubleBracketGeneratorType.group_commutator, - ) - initial_off_diagonal_norm = dbi.off_diagonal_norm - - # test first iteration with default d - dbi(mode=DoubleBracketGeneratorType.group_commutator, step=0.01) - for _ in range(NSTEPS): - dbi(step=0.01, d=d) - - assert initial_off_diagonal_norm > dbi.off_diagonal_norm - - -@pytest.mark.parametrize("nqubits", [1, 2]) -def test_double_bracket_iteration_group_commutator_3rd_order(backend, nqubits): - """Check 3rd order group commutator mode.""" - h0 = random_hermitian(2**nqubits, backend=backend, seed=seed) - d = backend.cast(np.diag(np.diag(backend.to_numpy(h0)))) - dbi = DoubleBracketIteration( - Hamiltonian(nqubits, h0, backend=backend), - mode=DoubleBracketGeneratorType.group_commutator_third_order, - ) - initial_off_diagonal_norm = dbi.off_diagonal_norm - - # test first iteration with default d - dbi(mode=DoubleBracketGeneratorType.group_commutator_third_order, step=0.01) - for _ in range(NSTEPS): - dbi(step=0.01, d=d) - - assert initial_off_diagonal_norm > dbi.off_diagonal_norm - - -@pytest.mark.parametrize("nqubits", [1, 2]) -def test_double_bracket_iteration_single_commutator(backend, nqubits): - """Check single commutator mode.""" - h0 = random_hermitian(2**nqubits, backend=backend, seed=seed) - d = backend.cast(np.diag(np.diag(backend.to_numpy(h0)))) - dbi = DoubleBracketIteration( - Hamiltonian(nqubits, h0, backend=backend), - mode=DoubleBracketGeneratorType.single_commutator, - ) - initial_off_diagonal_norm = dbi.off_diagonal_norm - - # test first iteration with default d - dbi(mode=DoubleBracketGeneratorType.single_commutator, step=0.01) - - for _ in range(NSTEPS): - dbi(step=0.01, d=d) - - assert initial_off_diagonal_norm > dbi.off_diagonal_norm - - -@pytest.mark.parametrize("nqubits", [2, 3]) -@pytest.mark.parametrize( - "scheduling", - [ - DoubleBracketScheduling.grid_search, - DoubleBracketScheduling.hyperopt, - DoubleBracketScheduling.simulated_annealing, - ], -) -def test_variational_scheduling(backend, nqubits, scheduling): - """Check schduling options.""" - h = 2 - - # define the hamiltonian - h0 = hamiltonians.TFIM(nqubits=nqubits, h=h) - dbi = DoubleBracketIteration(h0, scheduling=scheduling) - # find initial best step with look_ahead = 1 - initial_off_diagonal_norm = dbi.off_diagonal_norm - for _ in range(NSTEPS): - step = dbi.choose_step() - dbi(step=step) - assert initial_off_diagonal_norm > dbi.off_diagonal_norm - - -@pytest.mark.parametrize( - "cost", - [ - DoubleBracketCostFunction.off_diagonal_norm, - DoubleBracketCostFunction.least_squares, - ], -) -def test_polynomial_cost_function(backend, cost): - nqubits = 2 - h0 = random_hermitian(2**nqubits, backend=backend, seed=seed) - dbi = DoubleBracketIteration( - Hamiltonian(nqubits, h0, backend=backend), - mode=DoubleBracketGeneratorType.single_commutator, - cost=cost, - scheduling=DoubleBracketScheduling.polynomial_approximation, - ) - initial_off_diagonal_norm = dbi.off_diagonal_norm - for i in range(NSTEPS): - s = dbi.choose_step(d=dbi.diagonal_h_matrix, n=5) - dbi(step=s, d=dbi.off_diag_h) - assert initial_off_diagonal_norm > dbi.off_diagonal_norm - - -def test_polynomial_energy_fluctuation(backend): - nqubits = 4 - h0 = random_hermitian(2**nqubits, seed=seed, backend=backend) - state = np.zeros(2**nqubits) - state[0] = 1 - dbi = DoubleBracketIteration( - Hamiltonian(nqubits, h0, backend=backend), - mode=DoubleBracketGeneratorType.single_commutator, - cost=DoubleBracketCostFunction.energy_fluctuation, - scheduling=DoubleBracketScheduling.polynomial_approximation, - ref_state=state, - ) - for i in range(NSTEPS): - s = dbi.choose_step(d=dbi.diagonal_h_matrix, n=5) - dbi(step=s, d=dbi.diagonal_h_matrix) - assert dbi.energy_fluctuation(state=state) < dbi.h0.energy_fluctuation(state=state) - - -@pytest.mark.parametrize("nqubits", [5, 6]) -def test_polynomial_fail_cases(backend, nqubits): - h0 = random_hermitian(2**nqubits, backend=backend, seed=seed) - dbi = DoubleBracketIteration( - Hamiltonian(nqubits, h0, backend=backend), - mode=DoubleBracketGeneratorType.single_commutator, - scheduling=DoubleBracketScheduling.polynomial_approximation, - ) - with pytest.raises(ValueError): - polynomial_step(dbi, n=2, n_max=1) - assert polynomial_step(dbi, n=1) is None - - -def test_least_squares(backend): - """Check least squares cost function.""" - nqubits = 4 - h0 = random_hermitian(2**nqubits, backend=backend, seed=seed) - dbi = DoubleBracketIteration( - Hamiltonian(nqubits, h0, backend=backend), - cost=DoubleBracketCostFunction.least_squares, - ) - d = np.diag(np.linspace(1, 2**nqubits, 2**nqubits)) / 2**nqubits - initial_potential = dbi.least_squares(d=d) - step = dbi.choose_step(d=d) - dbi(d=d, step=step) - assert dbi.least_squares(d=d) < initial_potential - - -@pytest.mark.parametrize("compare_canonical", [True, False]) -@pytest.mark.parametrize("step", [None, 1e-3]) -@pytest.mark.parametrize("nqubits", [2, 3]) -def test_select_best_dbr_generator(backend, nqubits, step, compare_canonical): - h0 = random_hermitian(2**nqubits, backend=backend, seed=seed) - dbi = DoubleBracketIteration( - Hamiltonian(nqubits, h0, backend=backend), - mode=DoubleBracketGeneratorType.single_commutator, - ) - initial_off_diagonal_norm = dbi.off_diagonal_norm - generate_local_Z = generate_Z_operators(nqubits, backend=backend) - Z_ops = list(generate_local_Z.values()) - for _ in range(NSTEPS): - dbi, idx, step, flip_sign = select_best_dbr_generator( - dbi, - Z_ops, - compare_canonical=compare_canonical, - step=step, - ) - assert dbi.off_diagonal_norm < initial_off_diagonal_norm - - -@pytest.mark.parametrize("step", [None, 1e-3]) -def test_params_to_diagonal_operator(backend, step): - nqubits = 2 - pauli_operator_dict = generate_pauli_operator_dict( - nqubits, parameterization_order=1, backend=backend - ) - params = [1, 2, 3] - operator_pauli = sum( - [params[i] * list(pauli_operator_dict.values())[i] for i in range(nqubits)] - ) - backend.assert_allclose( - operator_pauli, - params_to_diagonal_operator( - params, - nqubits=nqubits, - parameterization=ParameterizationTypes.pauli, - pauli_operator_dict=pauli_operator_dict, - backend=backend, - ), - ) - operator_element = params_to_diagonal_operator( - params, - nqubits=nqubits, - parameterization=ParameterizationTypes.computational, - backend=backend, - ) - for i in range(len(params)): - backend.assert_allclose( - backend.cast(backend.to_numpy(operator_element).diagonal())[i], params[i] - ) - - -@pytest.mark.parametrize("order", [1, 2]) -def test_gradient_descent(backend, order): - nqubits = 2 - h0 = random_hermitian(2**nqubits, seed=seed, backend=backend) - dbi = DoubleBracketIteration( - Hamiltonian(nqubits, h0, backend=backend), - mode=DoubleBracketGeneratorType.single_commutator, - scheduling=DoubleBracketScheduling.hyperopt, - cost=DoubleBracketCostFunction.off_diagonal_norm, - ) - initial_off_diagonal_norm = dbi.off_diagonal_norm - pauli_operator_dict = generate_pauli_operator_dict( - nqubits, - parameterization_order=order, - backend=backend, - ) - pauli_operators = list(pauli_operator_dict.values()) - # let initial d be approximation of $\Delta(H) - d_coef_pauli = decompose_into_pauli_basis( - dbi.diagonal_h_matrix, pauli_operators=pauli_operators, backend=backend - ) - d_pauli = sum([d_coef_pauli[i] * pauli_operators[i] for i in range(nqubits)]) - loss_hist_pauli, d_params_hist_pauli, s_hist_pauli = gradient_descent( - dbi, - NSTEPS, - d_coef_pauli, - ParameterizationTypes.pauli, - pauli_operator_dict=pauli_operator_dict, - pauli_parameterization_order=order, - backend=backend, - ) - assert loss_hist_pauli[-1] < initial_off_diagonal_norm - - # computational basis - d_coef_computational_partial = backend.cast(backend.to_numpy(d_pauli).diagonal()) - ( - loss_hist_computational_partial, - _, - _, - ) = gradient_descent( - dbi, - NSTEPS, - d_coef_computational_partial, - ParameterizationTypes.computational, - backend=backend, - ) - assert loss_hist_computational_partial[-1] < initial_off_diagonal_norm diff --git a/tests/test_models_dbi_utils.py b/tests/test_models_dbi_utils.py deleted file mode 100644 index 29d1b1058b..0000000000 --- a/tests/test_models_dbi_utils.py +++ /dev/null @@ -1,61 +0,0 @@ -""""Testing utils for DoubleBracketIteration model""" - -import numpy as np -import pytest - -from qibo.hamiltonians import Hamiltonian -from qibo.models.dbi.double_bracket import ( - DoubleBracketGeneratorType, - DoubleBracketIteration, -) -from qibo.models.dbi.utils import * -from qibo.models.dbi.utils_dbr_strategies import select_best_dbr_generator -from qibo.quantum_info import random_hermitian - -NSTEPS = 5 -"""Number of steps for evolution.""" - - -@pytest.mark.parametrize("nqubits", [1, 2]) -def test_generate_Z_operators(backend, nqubits): - h0 = random_hermitian(2**nqubits, backend=backend) - dbi = DoubleBracketIteration( - Hamiltonian(nqubits=nqubits, matrix=h0, backend=backend) - ) - generate_Z = generate_Z_operators(nqubits, backend=backend) - Z_ops = list(generate_Z.values()) - - delta_h0 = dbi.diagonal_h_matrix - dephasing_channel = (sum([Z_op @ h0 @ Z_op for Z_op in Z_ops]) + h0) / 2**nqubits - norm_diff = np.linalg.norm(backend.to_numpy(delta_h0 - dephasing_channel)) - - assert norm_diff < 1e-3 - - -@pytest.mark.parametrize("nqubits", [1, 2]) -@pytest.mark.parametrize("step", [0.1, 0.2]) -def test_select_best_dbr_generator(backend, nqubits, step): - h0 = random_hermitian(2**nqubits, seed=1, backend=backend) - dbi = DoubleBracketIteration( - Hamiltonian(nqubits, h0, backend=backend), - mode=DoubleBracketGeneratorType.single_commutator, - ) - generate_Z = generate_Z_operators(nqubits, backend=backend) - Z_ops = list(generate_Z.values()) - initial_off_diagonal_norm = dbi.off_diagonal_norm - - for _ in range(NSTEPS): - dbi, idx, step_optimize, flip = select_best_dbr_generator( - dbi, Z_ops, step=step, compare_canonical=True, max_evals=5 - ) - - assert initial_off_diagonal_norm > dbi.off_diagonal_norm - - -def test_copy_dbi(backend): - h0 = random_hermitian(4, seed=1, backend=backend) - dbi = DoubleBracketIteration(Hamiltonian(2, h0, backend=backend)) - dbi_copy = copy_dbi_object(dbi) - - assert dbi is not dbi_copy - assert dbi.h.nqubits == dbi_copy.h.nqubits diff --git a/tests/test_models_encodings.py b/tests/test_models_encodings.py index 164e287e57..9adc68f3f7 100644 --- a/tests/test_models_encodings.py +++ b/tests/test_models_encodings.py @@ -138,7 +138,7 @@ def test_unary_encoder(backend, nqubits, architecture, kind): backend.assert_allclose( state, - backend.cast(data, dtype=np.float64) / backend.calculate_norm(data, 2), + backend.cast(data, dtype=np.float64) / backend.calculate_vector_norm(data, 2), rtol=1e-5, ) diff --git a/tests/test_quantum_info_entropies.py b/tests/test_quantum_info_entropies.py index 7c289009f9..9eff0e01fe 100644 --- a/tests/test_quantum_info_entropies.py +++ b/tests/test_quantum_info_entropies.py @@ -590,7 +590,7 @@ def test_renyi_entropy(backend, alpha, base): elif alpha == 1.0: target = von_neumann_entropy(state, base=base, backend=backend) elif alpha == np.inf: - target = backend.calculate_norm_density_matrix(state, order=2) + target = backend.calculate_matrix_norm(state, order=2) target = -1 * backend.np.log2(target) / np.log2(base) else: target = np.log2( @@ -687,9 +687,7 @@ def test_relative_renyi_entropy(backend, alpha, base, state_flag, target_flag): new_target = matrix_power(target_outer, 0.5, backend=backend) log = backend.np.log2( - backend.calculate_norm_density_matrix( - new_state @ new_target, order=1 - ) + backend.calculate_matrix_norm(new_state @ new_target, order=1) ) log = -2 * log / np.log2(base) diff --git a/tests/test_quantum_info_random.py b/tests/test_quantum_info_random.py index 3d2b6d92dd..8f2054bade 100644 --- a/tests/test_quantum_info_random.py +++ b/tests/test_quantum_info_random.py @@ -112,14 +112,14 @@ def test_random_hermitian(backend): dims = 4 matrix = random_hermitian(dims, backend=backend) matrix_dagger = backend.np.conj(matrix).T - norm = float(backend.calculate_norm_density_matrix(matrix - matrix_dagger, order=2)) + norm = float(backend.calculate_matrix_norm(matrix - matrix_dagger, order=2)) backend.assert_allclose(norm < PRECISION_TOL, True) # test if function returns semidefinite Hermitian operator dims = 4 matrix = random_hermitian(dims, semidefinite=True, backend=backend) matrix_dagger = backend.np.conj(matrix).T - norm = float(backend.calculate_norm_density_matrix(matrix - matrix_dagger, order=2)) + norm = float(backend.calculate_matrix_norm(matrix - matrix_dagger, order=2)) backend.assert_allclose(norm < PRECISION_TOL, True) eigenvalues = np.linalg.eigvalsh(backend.to_numpy(matrix)) @@ -130,7 +130,7 @@ def test_random_hermitian(backend): dims = 4 matrix = random_hermitian(dims, normalize=True, backend=backend) matrix_dagger = backend.np.conj(matrix).T - norm = float(backend.calculate_norm_density_matrix(matrix - matrix_dagger, order=2)) + norm = float(backend.calculate_matrix_norm(matrix - matrix_dagger, order=2)) backend.assert_allclose(norm < PRECISION_TOL, True) eigenvalues = np.linalg.eigvalsh(backend.to_numpy(matrix)) @@ -141,7 +141,7 @@ def test_random_hermitian(backend): dims = 4 matrix = random_hermitian(dims, semidefinite=True, normalize=True, backend=backend) matrix_dagger = backend.np.conj(matrix).T - norm = float(backend.calculate_norm(matrix - matrix_dagger, order=2)) + norm = float(backend.calculate_vector_norm(matrix - matrix_dagger, order=2)) backend.assert_allclose(norm < PRECISION_TOL, True) eigenvalues = np.linalg.eigvalsh(backend.to_numpy(matrix)) @@ -177,9 +177,7 @@ def test_random_unitary(backend, measure): if backend.platform == "pytorch" else np.linalg.inv(matrix) ) - norm = float( - backend.calculate_norm_density_matrix(matrix_inv - matrix_dagger, order=2) - ) + norm = float(backend.calculate_matrix_norm(matrix_inv - matrix_dagger, order=2)) backend.assert_allclose(norm < PRECISION_TOL, True) @@ -275,9 +273,9 @@ def test_random_density_matrix(backend, dims, pure, metric, basis, normalize): test = random_density_matrix(dims=dims, normalize=True) else: norm_function = ( - backend.calculate_norm_density_matrix + backend.calculate_matrix_norm if basis is None - else backend.calculate_norm + else backend.calculate_vector_norm ) state = random_density_matrix( dims, @@ -415,9 +413,7 @@ def test_pauli_single(backend): backend.assert_allclose( np.abs( - backend.to_numpy( - backend.calculate_norm_density_matrix(matrix - result, order=2) - ) + backend.to_numpy(backend.calculate_matrix_norm(matrix - result, order=2)) ) < PRECISION_TOL, True, @@ -457,20 +453,14 @@ def test_random_pauli( if subset is None: backend.assert_allclose( float( - backend.calculate_norm_density_matrix( - matrix - result_complete_set, order=2 - ) + backend.calculate_matrix_norm(matrix - result_complete_set, order=2) ) < PRECISION_TOL, True, ) else: backend.assert_allclose( - float( - backend.calculate_norm_density_matrix( - matrix - result_subset, order=2 - ) - ) + float(backend.calculate_matrix_norm(matrix - result_subset, order=2)) < PRECISION_TOL, True, ) @@ -482,20 +472,14 @@ def test_random_pauli( if subset is None: backend.assert_allclose( float( - backend.calculate_norm_density_matrix( - matrix - result_complete_set, order=2 - ) + backend.calculate_matrix_norm(matrix - result_complete_set, order=2) ) < PRECISION_TOL, True, ) else: backend.assert_allclose( - float( - backend.calculate_norm_density_matrix( - matrix - result_subset, order=2 - ) - ) + float(backend.calculate_matrix_norm(matrix - result_subset, order=2)) < PRECISION_TOL, True, ) diff --git a/tests/test_quantum_info_utils.py b/tests/test_quantum_info_utils.py index f9b8c0ff2b..7a38ad0f32 100644 --- a/tests/test_quantum_info_utils.py +++ b/tests/test_quantum_info_utils.py @@ -167,7 +167,7 @@ def test_hellinger(backend, validate, kind): prob_q = backend.cast(prob_q, dtype=prob_q.dtype) target = float( - backend.calculate_norm(backend.np.sqrt(prob_p) - backend.np.sqrt(prob_q)) + backend.calculate_vector_norm(backend.np.sqrt(prob_p) - backend.np.sqrt(prob_q)) / np.sqrt(2) ) @@ -242,7 +242,7 @@ def test_total_variation_distance(backend, validate, kind): prob_p = backend.cast(prob_p, dtype=prob_p.dtype) prob_q = backend.cast(prob_q, dtype=prob_q.dtype) - target = float(backend.calculate_norm(prob_p - prob_q, order=1) / 2) + target = float(backend.calculate_vector_norm(prob_p - prob_q, order=1) / 2) prob_p = ( kind(prob_p) if kind is not None else backend.cast(prob_p, dtype=prob_p.dtype) diff --git a/tests/test_transpiler_placer.py b/tests/test_transpiler_placer.py index 13fef50904..65dcbd7bbd 100644 --- a/tests/test_transpiler_placer.py +++ b/tests/test_transpiler_placer.py @@ -93,6 +93,16 @@ def test_subgraph_restricted(star_connectivity): assert_placement(circuit, restricted_connectivity) +def test_subgraph_leasttwoqubitgates(star_connectivity): + circuit = Circuit(5) + circuit.add(gates.CNOT(0, 3)) + circuit.add(gates.CNOT(1, 2)) + connectivity = star_connectivity() + placer = Subgraph(connectivity=connectivity) + placer(circuit) + assert_placement(circuit, connectivity) + + @pytest.mark.parametrize("reps", [1, 10, 100]) @pytest.mark.parametrize("names", [["A", "B", "C", "D", "E"], [0, 1, 2, 3, 4]]) def test_random(reps, names, star_connectivity):