diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index 16064a59f..3037cd99e 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -36,7 +36,7 @@ RUN sh -c "$(wget -nv -O- https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/mast # upgrade pip and install package manager RUN python -m pip install --no-cache-dir --upgrade pip -RUN pip install --no-cache-dir poetry==1.4.0 +RUN pip install --no-cache-dir poetry==1.8.0 RUN poetry config virtualenvs.create false ### TEAR DOWN IMAGE SETUP ### diff --git a/.devcontainer/post-install.sh b/.devcontainer/post-install.sh old mode 100755 new mode 100644 diff --git a/.github/CHANGELOG.md b/.github/CHANGELOG.md index d3f312e76..3e9b608a9 100644 --- a/.github/CHANGELOG.md +++ b/.github/CHANGELOG.md @@ -1,4 +1,34 @@ -# Release 0.7.0 (current release) +# Release 0.7.1 (current release) + +### New features +* Added functions to generate the ``(A, b, c)`` triples for the Fock-Bargmann representation of + several states and gates. [(#338)](https://github.com/XanaduAI/MrMustard/pull/338) + +* Added support for python 3.11. [(#354)](https://github.com/XanaduAI/MrMustard/pull/354) + +### Breaking changes + +### Improvements + +### Bug fixes +* Fixing a bug in `_transform_gaussian` in transformation.py that modifies the input state's cov and means. +[(#349)](https://github.com/XanaduAI/MrMustard/pull/349) +* Fixing a bug in `general_dyne` in physics/gaussian.py that returns the wrong probability and outcomes with given projection. +[(#349)](https://github.com/XanaduAI/MrMustard/pull/349) + +### Documentation + +### Tests + +### Contributors +[Samuele Ferracin](https://github.com/SamFerracin), +[Yuan Yao](https://github.com/sylviemonet) +[Filippo Miatto](https://github.com/ziofil) + + +--- + +# Release 0.7.0 ### New features * Added a new interface for backends, as well as a `numpy` backend (which is now default). Users can run diff --git a/.github/workflows/builds.yml b/.github/workflows/builds.yml index fbbd693ee..c85891b9e 100644 --- a/.github/workflows/builds.yml +++ b/.github/workflows/builds.yml @@ -15,9 +15,10 @@ jobs: strategy: fail-fast: false matrix: - python-version: ['3.9', '3.10'] + python-version: ['3.9', '3.10', '3.11'] + backend: [numpy, tensorflow] concurrency: - group: ${{ github.workflow }}-${{ github.ref }}-${{ matrix.python-version }} + group: ${{ github.workflow }}-${{ github.ref }}-${{ matrix.python-version }}-${{ matrix.backend }} cancel-in-progress: true steps: @@ -32,7 +33,7 @@ jobs: - name: Build and install Mr Mustard run: | python -m pip install --no-cache-dir --upgrade pip - pip install --no-cache-dir poetry==1.4.0 + pip install --no-cache-dir poetry==1.8.0 poetry config virtualenvs.create false poetry build pip install dist/mrmustard*.whl @@ -53,4 +54,4 @@ jobs: run: julia --project="julia_pkg" -e "using Pkg; Pkg.instantiate()" - name: Run tests - run: python -m pytest tests -p no:warnings --tb=native --backend=tensorflow + run: python -m pytest tests -p no:warnings --tb=native --backend=${{ matrix.backend }} diff --git a/.github/workflows/format.yml b/.github/workflows/format.yml index 7d2457a96..ff5cfa45b 100644 --- a/.github/workflows/format.yml +++ b/.github/workflows/format.yml @@ -12,7 +12,7 @@ jobs: - name: Set up Python uses: actions/setup-python@v4 with: - python-version: 3.9 + python-version: 3.11 - name: Install black formatter run: | diff --git a/.github/workflows/tests_docs.yml b/.github/workflows/tests_docs.yml new file mode 100644 index 000000000..8b90c44ec --- /dev/null +++ b/.github/workflows/tests_docs.yml @@ -0,0 +1,43 @@ +name: Docs tests +on: + push: + branches: + - develop + pull_request: + paths: + - '.github/workflows/tests.yml' + - 'mrmustard/**' + - 'pyproject.toml' + - 'poetry.lock' + - 'pytest.ini' + +jobs: + docs: + runs-on: ubuntu-latest + concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + env: + HYPOTHESIS_PROFILE: ci + + steps: + - name: Checkout repo + uses: actions/checkout@v3 + + - name: Setup python + uses: actions/setup-python@v4 + with: + python-version: '3.11' + + - name: Install dependencies + run: | + python -m pip install --no-cache-dir --upgrade pip + pip install --no-cache-dir poetry==1.8.0 + poetry config virtualenvs.create false + poetry install --extras "ray" --with dev + + - name: Run tests + run: | + python -m pytest --doctest-modules mrmustard/physics/ansatze.py + python -m pytest --doctest-modules mrmustard/physics/representations.py + python -m pytest --doctest-modules mrmustard/lab_dev \ No newline at end of file diff --git a/.github/workflows/tests_numpy.yml b/.github/workflows/tests_numpy.yml index 399f3c233..1b2c6f5de 100644 --- a/.github/workflows/tests_numpy.yml +++ b/.github/workflows/tests_numpy.yml @@ -28,7 +28,7 @@ jobs: - name: Setup python uses: actions/setup-python@v4 with: - python-version: '3.9' + python-version: '3.11' - name: Setup Julia uses: julia-actions/setup-julia@v1 @@ -38,7 +38,7 @@ jobs: - name: Install dependencies run: | python -m pip install --no-cache-dir --upgrade pip - pip install --no-cache-dir poetry==1.4.0 + pip install --no-cache-dir poetry==1.8.0 poetry config virtualenvs.create false poetry install --extras "ray" --with dev julia --project="julia_pkg" -e "using Pkg; Pkg.instantiate()" diff --git a/.github/workflows/tests_tensorflow.yml b/.github/workflows/tests_tensorflow.yml index 34ec43d5e..78125e5dd 100644 --- a/.github/workflows/tests_tensorflow.yml +++ b/.github/workflows/tests_tensorflow.yml @@ -28,7 +28,7 @@ jobs: - name: Setup python uses: actions/setup-python@v4 with: - python-version: '3.9' + python-version: '3.11' - name: Setup Julia uses: julia-actions/setup-julia@v1 @@ -38,7 +38,7 @@ jobs: - name: Install dependencies run: | python -m pip install --no-cache-dir --upgrade pip - pip install --no-cache-dir poetry==1.4.0 + pip install --no-cache-dir poetry==1.8.0 poetry config virtualenvs.create false poetry install --extras "ray" --with dev julia --project="julia_pkg" -e "using Pkg; Pkg.instantiate()" diff --git a/.github/workflows/upload.yml b/.github/workflows/upload.yml index 4fc6bc37b..46a17939b 100644 --- a/.github/workflows/upload.yml +++ b/.github/workflows/upload.yml @@ -16,12 +16,12 @@ jobs: - name: Set up Python uses: actions/setup-python@v4 with: - python-version: 3.9 + python-version: 3.11 - name: Build and install Mr Mustard run: | python -m pip install --no-cache-dir --upgrade pip - pip install --no-cache-dir poetry==1.4.0 + pip install --no-cache-dir poetry==1.8.0 poetry config virtualenvs.create false poetry build pip install dist/mrmustard*.whl diff --git a/.readthedocs.yml b/.readthedocs.yml index dbf504ae7..a167c35ef 100644 --- a/.readthedocs.yml +++ b/.readthedocs.yml @@ -5,7 +5,7 @@ version: 2 build: os: ubuntu-22.04 tools: - python: "3.9" + python: "3.11" jobs: post_install: - "curl -fsSL https://install.julialang.org | sh -s -- --yes" diff --git a/doc/code/lab_dev.rst b/doc/code/lab_dev.rst new file mode 100644 index 000000000..3d490d3cb --- /dev/null +++ b/doc/code/lab_dev.rst @@ -0,0 +1,9 @@ +mrmustard.lab_dev +================= + +.. toctree:: + :maxdepth: 1 + + lab_dev/wires + +.. currentmodule:: mrmustard.lab_dev diff --git a/doc/code/lab_dev/wires.rst b/doc/code/lab_dev/wires.rst new file mode 100644 index 000000000..9b7bf82a6 --- /dev/null +++ b/doc/code/lab_dev/wires.rst @@ -0,0 +1,8 @@ +mrmustard.lab_dev.wires +======================= + +.. currentmodule:: mrmustard.lab_dev.wires + +.. automodapi:: mrmustard.lab_dev.wires + :no-heading: + :include-all-objects: \ No newline at end of file diff --git a/doc/code/physics.rst b/doc/code/physics.rst index 17f17587f..f6a814a97 100644 --- a/doc/code/physics.rst +++ b/doc/code/physics.rst @@ -5,10 +5,14 @@ mrmustard.physics :maxdepth: 1 physics/ansatze - physics/bargmann - physics/fock - physics/gaussian physics/representations + +.. toctree:: + :maxdepth: 1 + + physics/bargmann + physics/utils/fock_calculations + physics/utils/gaussian_calculations .. currentmodule:: mrmustard.physics diff --git a/doc/code/physics/ansatze.rst b/doc/code/physics/ansatze.rst index 1e2202c72..9d9c2c36b 100644 --- a/doc/code/physics/ansatze.rst +++ b/doc/code/physics/ansatze.rst @@ -1,5 +1,5 @@ -Ansatze -======= +The representations' Ansatze +============================ .. currentmodule:: mrmustard.physics.ansatze diff --git a/doc/code/physics/bargmann.rst b/doc/code/physics/bargmann.rst index 2b926d9ca..2562ef566 100644 --- a/doc/code/physics/bargmann.rst +++ b/doc/code/physics/bargmann.rst @@ -1,8 +1,8 @@ -Bargmann -======== +Calculations on Bargmann objects +================================ -.. currentmodule:: mrmustard.physics.bargmann +.. toctree:: + :maxdepth: 1 -.. automodapi:: mrmustard.physics.bargmann - :no-heading: - :include-all-objects: \ No newline at end of file + utils/triples + utils/bargmann_calculations diff --git a/doc/code/physics/representations.rst b/doc/code/physics/representations.rst index a908020fd..5901c23fc 100644 --- a/doc/code/physics/representations.rst +++ b/doc/code/physics/representations.rst @@ -1,5 +1,5 @@ -Representations -=============== +The Fock-Bargmann and Fock Representations +========================================== .. currentmodule:: mrmustard.physics.representations diff --git a/doc/code/physics/utils/bargmann_calculations.rst b/doc/code/physics/utils/bargmann_calculations.rst new file mode 100644 index 000000000..58b0ca717 --- /dev/null +++ b/doc/code/physics/utils/bargmann_calculations.rst @@ -0,0 +1,8 @@ +Calculations on Bargmann objects +================================ + +.. currentmodule:: mrmustard.physics.bargmann + +.. automodapi:: mrmustard.physics.bargmann + :no-heading: + :include-all-objects: \ No newline at end of file diff --git a/doc/code/physics/fock.rst b/doc/code/physics/utils/fock_calculations.rst similarity index 68% rename from doc/code/physics/fock.rst rename to doc/code/physics/utils/fock_calculations.rst index c8c1f58af..931d1fc88 100644 --- a/doc/code/physics/fock.rst +++ b/doc/code/physics/utils/fock_calculations.rst @@ -1,5 +1,5 @@ -Fock -==== +Calculations on Fock objects +============================ .. currentmodule:: mrmustard.physics.fock diff --git a/doc/code/physics/gaussian.rst b/doc/code/physics/utils/gaussian_calculations.rst similarity index 66% rename from doc/code/physics/gaussian.rst rename to doc/code/physics/utils/gaussian_calculations.rst index 2dcff352d..63ee6db97 100644 --- a/doc/code/physics/gaussian.rst +++ b/doc/code/physics/utils/gaussian_calculations.rst @@ -1,5 +1,5 @@ -Gaussian -========= +Calculations on Gaussian objects +================================ .. currentmodule:: mrmustard.physics.gaussian diff --git a/doc/code/physics/utils/triples.rst b/doc/code/physics/utils/triples.rst new file mode 100644 index 000000000..5c28803a9 --- /dev/null +++ b/doc/code/physics/utils/triples.rst @@ -0,0 +1,8 @@ +Abc triples for Bargmann representation +======================================= + +.. currentmodule:: mrmustard.physics.triples + +.. automodapi:: mrmustard.physics.triples + :no-heading: + :include-all-objects: \ No newline at end of file diff --git a/doc/index.rst b/doc/index.rst index 53934e9b1..38e9f7fe7 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -128,6 +128,7 @@ Mr Mustard supports the following in a fully differentiable way: code/mm code/lab + code/lab_dev code/physics code/math code/training diff --git a/mrmustard/lab/abstract/state.py b/mrmustard/lab/abstract/state.py index 27ef623e8..faf311790 100644 --- a/mrmustard/lab/abstract/state.py +++ b/mrmustard/lab/abstract/state.py @@ -591,7 +591,6 @@ def get_modes(self, item) -> State: fock_partitioned = fock.trace(self.dm(self.cutoffs), keep=item_idx) return State(dm=fock_partitioned, modes=item) - # TODO: refactor def __eq__(self, other) -> bool: # pylint: disable=too-many-return-statements r"""Returns whether the states are equal.""" if self.num_modes != other.num_modes: diff --git a/mrmustard/lab/abstract/transformation.py b/mrmustard/lab/abstract/transformation.py index 2a9b22340..9fa49f453 100644 --- a/mrmustard/lab/abstract/transformation.py +++ b/mrmustard/lab/abstract/transformation.py @@ -113,7 +113,9 @@ def _transform_gaussian(self, state: State, dual: bool) -> State: State: the transformed state """ X, Y, d = self.XYd(allow_none=False) if not dual else self.XYd_dual(allow_none=False) - cov, means = gaussian.CPTP(state.cov, state.means, X, Y, d, state.modes, self.modes) + cov, means = gaussian.CPTP( + math.astensor(state.cov), math.astensor(state.means), X, Y, d, state.modes, self.modes + ) new_state = State( cov=cov, means=means, modes=state.modes, _norm=state.norm ) # NOTE: assumes modes don't change diff --git a/mrmustard/lab_dev/wires.py b/mrmustard/lab_dev/wires.py new file mode 100644 index 000000000..31bf6ce55 --- /dev/null +++ b/mrmustard/lab_dev/wires.py @@ -0,0 +1,420 @@ +# Copyright 2023 Xanadu Quantum Technologies Inc. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +""" ``Wires`` class for supporting tensor network functionalities.""" + +from __future__ import annotations + +from typing import Iterable, Optional +from IPython.display import display, HTML +import numpy as np + +from mrmustard import settings + +__all__ = ["Wires"] + + +# pylint: disable=protected-access +class Wires: + r""" + A class with wire functionality for tensor network applications. + + In MrMustard, we represent circuit components as tensors in a tensor network. The wires of + these components describe how they connect with the surrounding components. For example, an + `N`-mode pure state has `N` ket wires on the output side, while a `N`-mode mixed state + has `N` ket wires and `N` bra wires on the output side. + + ``Wires`` objects store the information related to the wires of circuit components. Each wire + in a ``Wires`` object is specified by a numerical id, which is random and unique. When two different + ``Wires`` object have one or more wires with the same ids, we treat them as connected. Otherwise, + we treat them as disconnected. + + The list of all these ids can be accessed using the ``ids`` property. + + .. code-block:: + + >>> from mrmustard.lab_dev.wires import Wires + + >>> modes_out_bra=[0, 1] + >>> modes_in_bra=[1, 2] + >>> modes_out_ket=[0, 3] + >>> modes_in_ket=[1, 2, 3] + >>> w = Wires(modes_out_bra, modes_in_bra, modes_out_ket, modes_in_ket) + + >>> # access the modes + >>> modes = w.modes + >>> assert w.modes == [0, 1, 2, 3] + + >>> # access the ids + >>> ids = w.ids + >>> assert len(ids) == 9 + + >>> # get input/output subsets + >>> w_in = w.input + >>> assert w_in.modes == [1, 2, 3] + + >>> # get ket/bra subsets + >>> w_in_bra = w_in.bra + >>> assert w_in_bra.modes == [1, 2] + + The standard order for the list of ids is: + + - ids for all the output bra wires. + + - ids for all the input bra wires. + + - ids for all the output ket wires. + + - ids for all the input ket wires. + + .. code-block:: + + >>> assert w.output.bra.ids == w.ids[:2] + >>> assert w.input.bra.ids == w.ids[2:4] + >>> assert w.output.ket.ids == w.ids[4:6] + >>> assert w.input.ket.ids == w.ids[6:] + + To access the index of a su set of wires in standard order (i.e. skipping over wires not belonging to the subset), + one can use the ``indices`` attribute: + + .. code-block:: + + >>> w = Wires(modes_in_ket = [0,1], modes_out_ket = [0,1]) + + >>> assert w.indices == [0,1,2,3] + >>> assert w.input.indices == [2,3] + + Note that subsets return new ``Wires`` objects with the same ids as the original object. + + Args: + modes_out_bra: The output modes on the bra side. + modes_in_bra: The input modes on the bra side. + modes_out_ket: The output modes on the ket side. + modes_in_ket: The input modes on the ket side. + + Note that the order of the modes passed to initialize the object doesn't matter, + as they get sorted at init time. + """ + + def __init__( + self, + modes_out_bra: Optional[Iterable[int]] = None, + modes_in_bra: Optional[Iterable[int]] = None, + modes_out_ket: Optional[Iterable[int]] = None, + modes_in_ket: Optional[Iterable[int]] = None, + ) -> None: + modes_out_bra = modes_out_bra or [] + modes_in_bra = modes_in_bra or [] + modes_out_ket = modes_out_ket or [] + modes_in_ket = modes_in_ket or [] + + self._modes = sorted( + set(modes_out_bra) | set(modes_in_bra) | set(modes_out_ket) | set(modes_in_ket) + ) + randint = settings.rng.integers # MM random number generator + outbra = {m: randint(1, 2**62) if m in modes_out_bra else 0 for m in self._modes} + inbra = {m: randint(1, 2**62) if m in modes_in_bra else 0 for m in self._modes} + outket = {m: randint(1, 2**62) if m in modes_out_ket else 0 for m in self._modes} + inket = {m: randint(1, 2**62) if m in modes_in_ket else 0 for m in self._modes} + self._id_array = np.array([[outbra[m], inbra[m], outket[m], inket[m]] for m in self._modes]) + self._mask = np.ones_like(self._id_array) # multiplicative mask + + def _args(self): + r""" + Returns the input arguments needed to initialize the same ``Wires`` object + (with different ids). + """ + ob_modes = np.array(self._modes)[self._id_array[:, 0] > 0].tolist() + ib_modes = np.array(self._modes)[self._id_array[:, 1] > 0].tolist() + ok_modes = np.array(self._modes)[self._id_array[:, 2] > 0].tolist() + ik_modes = np.array(self._modes)[self._id_array[:, 3] > 0].tolist() + return tuple(ob_modes), tuple(ib_modes), tuple(ok_modes), tuple(ik_modes) + + @classmethod + def _from_data(cls, id_array, modes, mask=None): + r""" + Initializes ``Wires`` object from its private attributes. + """ + w = cls() + w._id_array = id_array + w._modes = modes + w._mask = mask if mask is not None else np.ones_like(w._id_array) + return w + + def _view(self, masked_rows: tuple[int, ...] = (), masked_cols: tuple[int, ...] = ()) -> Wires: + r""" + A masked view of this Wires object. + """ + w = self._from_data(self._id_array, self._modes, self._mask.copy()) + w._mask[masked_rows, :] = -1 + w._mask[:, masked_cols] = -1 + return w + + def _mode(self, mode: int) -> np.ndarray: + r""" + A slice of the id_array matrix at the given mode. + """ + return np.maximum(0, self.id_array[[self._modes.index(mode)]])[0] + + @property + def id_array(self) -> np.ndarray: + r""" + The id_array of the available wires in a two-dimensional array, where line ``j`` contains + the ids (in the standard order) for mode ``j``. + """ + return self._id_array * self._mask + + @property + def ids(self) -> list[int]: + r""" + The list of ids of the available wires in the standard order. + """ + flat = self.id_array.T.ravel() + return flat[flat > 0].tolist() + + @ids.setter + def ids(self, ids: list[int]): + r""" + Sets the ids of the available wires. + + Args: + ids: The new ids. + + Raises: + ValueError: If the number of ids does not match the expected number. + """ + if len(ids) != len(self.ids): + raise ValueError(f"wrong number of ids (expected {len(self.ids)}, got {len(ids)})") + self._id_array.flat[self.id_array.flatten() > 0] = ids + + @property + def modes(self) -> list[int]: + r""" + The list of modes of the populated wires. + """ + return [m for m in self._modes if any(self.id_array[self._modes.index(m)] > 0)] + + @property + def indices(self) -> list[int]: + r""" + The array of indices of this ``Wires`` in the standard order. The array of indices + of this ``Wires`` in the standard order. When a subset is selected, it skips the + indices of wires that do not belong to the subset. + + .. code-block:: + + >>> w = Wires(modes_in_ket = [0,1], modes_out_ket = [0,1]) + + >>> assert w.indices == [0,1,2,3] + >>> assert w.input.indices == [2,3] + """ + flat = self.id_array.T.ravel() + flat = flat[flat != 0] + return np.where(flat > 0)[0].tolist() + + @property + def input(self) -> Wires: + r""" + A view of this ``Wires`` object without output wires. + """ + return self._view(masked_cols=(0, 2)) + + @property + def output(self) -> Wires: + r""" + A view of this ``Wires`` object without input wires. + """ + return self._view(masked_cols=(1, 3)) + + @property + def ket(self) -> Wires: + r""" + A view of this ``Wires`` object without bra wires. + """ + return self._view(masked_cols=(0, 1)) + + @property + def bra(self) -> Wires: + r""" + A view of this ``Wires`` object without ket wires. + """ + return self._view(masked_cols=(2, 3)) + + @property + def adjoint(self) -> Wires: + r""" + The adjoint of this wires object, obtained by swapping ket and bra wires. + """ + return self._from_data(self._id_array[:, [2, 3, 0, 1]], self._modes, self._mask) + + @property + def dual(self) -> Wires: + r""" + The dual of this wires object, obtained by swapping input and output wires. + """ + return self._from_data(self._id_array[:, [1, 0, 3, 2]], self._modes, self._mask) + + def copy(self) -> Wires: + r""" + A copy of this ``Wires`` object, with new ids. + """ + w = Wires(*self._args()) + w._mask = self._mask.copy() + return w + + def __add__(self, other: Wires) -> Wires: + r""" + A new ``Wires`` object that combines the wires of ``self`` and those of ``other``. + + Args: + other: The wire to add. + + Raise: + ValueError: If the two ``Wires`` being added have an overlap that cannot be resolved. + """ + modes_rows = {} + all_modes = sorted(set(self.modes) | set(other.modes)) + for m in all_modes: + self_row = self.id_array[self._modes.index(m)] if m in self.modes else np.zeros(4) + other_row = other.id_array[other._modes.index(m)] if m in other.modes else np.zeros(4) + if np.any(np.where(self_row > 0) == np.where(other_row > 0)): + raise ValueError(f"wires overlap on mode {m}") + modes_rows[m] = [s if s > 0 else o for s, o in zip(self_row, other_row)] + combined_array = np.array([modes_rows[m] for m in sorted(modes_rows)]) + return self._from_data(combined_array, sorted(modes_rows), np.ones_like(combined_array)) + + def __bool__(self) -> bool: + r""" + Returns ``True`` if this ``Wires`` object has ids, ``False`` otherwise. + """ + return len(self.ids) > 0 + + def __getitem__(self, modes: Iterable[int] | int) -> Wires: + r""" + A view of this Wires object with wires only on the given modes. + """ + modes = [modes] if isinstance(modes, int) else modes + idxs = tuple(list(self._modes).index(m) for m in set(self._modes).difference(modes)) + return self._view(masked_rows=idxs) + + def __lshift__(self, other: Wires) -> Wires: + return (other.dual >> self.dual).dual # how cool is this + + @staticmethod + def _outin(self_in: int, self_out: int, other_in: int, other_out: int) -> np.ndarray: + r""" + Returns the ids of the composite object made by connecting an object self with ids + ``self_in`` and ``self_out`` to an object other with ids ``other_in`` and ``other_out``. + + Assumes that the configurations ``--|self| --|other|`` or ``|self|-- |other|--``, + which would lead to an overlap of wires, have already been excluded. + + Note that the order of the returned ids is ``[out, in]``, as per standard order. + """ + if bool(self_out) == bool( + other_in + ): # if the inner wires are either both there or both not there + return np.array([other_out, self_in], dtype=np.int64) + elif not self_in and not self_out: # no wires on self + return np.array([other_out, other_in], dtype=np.int64) + else: # no wires on other + return np.array([self_out, self_in], dtype=np.int64) + + def __rshift__(self, other: Wires) -> Wires: + r""" + A new Wires object with the wires of ``self`` and ``other`` combined as two + components in a circuit: the output of self connects to the input of other wherever + they match. All surviving wires are arranged in the standard order. + A ValueError is raised if there are any surviving wires that overlap. + """ + all_modes = sorted(set(self.modes) | set(other.modes)) + new_id_array = np.zeros((len(all_modes), 4), dtype=np.int64) + + for m in set(self.modes) & set(other.modes): + sob, sib, sok, sik = self._mode(m) # row of self + oob, oib, ook, oik = other._mode(m) # row of other + + out_bra_issue = sob and oob and not oib + out_ket_issue = sok and ook and not oik + if out_bra_issue or out_ket_issue: + raise ValueError(f"Output wire overlap at mode {m}") + in_bra_issue = oib and sib and not sob + in_ket_issue = oik and sik and not sok + if in_bra_issue or in_ket_issue: + raise ValueError(f"Input wire overlap at mode {m}") + + new_id_array[all_modes.index(m)] = np.hstack( + [self._outin(sib, sob, oib, oob), self._outin(sik, sok, oik, ook)] + ) + for m in set(self.modes) - set(other.modes): + new_id_array[all_modes.index(m)] = self._mode(m) + for m in set(other.modes) - set(self.modes): + new_id_array[all_modes.index(m)] = other._mode(m) + + return self._from_data(new_id_array, all_modes) + + def __repr__(self) -> str: + ob_modes, ib_modes, ok_modes, ik_modes = self._args() + return f"Wires({ob_modes}, {ib_modes}, {ok_modes}, {ik_modes})" + + def _repr_html_(self): # pragma: no cover + "A matrix plot of the id_array." + row_labels = map(str, self._modes) + col_labels = ["bra-out", "bra-in", "ket-out", "ket-in"] + array = np.abs(self.id_array) / (self.id_array + 1e-15) + idxs = (i for i in self.indices) + box_size = "60px" # Set the size of the squares + html = '' + # colors + active = "#5b9bd5" + inactive = "#d6e8f7" + + # Add column headers + html += "" + for label in [""] + col_labels: # Add an empty string for the top-left cell + html += f'' + html += "" + + # Initialize rows with row labels + rows_html = [ + f'' + for label in row_labels + ] + + # Add table cells (column by column) + for label, col in zip(col_labels, array.T): + for row_idx, value in enumerate(col): + color = ( + "white" + if np.isclose(value, 0) + else (active if np.isclose(value, 1) else inactive) + ) + cell_html = f'' + ) + else: + cell_html += '">' + rows_html[row_idx] += cell_html + + # Close the rows and add them to the HTML table + for row_html in rows_html: + row_html += "" + html += row_html + + html += "
{label}
{label}{str(next(idxs))}
" + display(HTML(html)) diff --git a/mrmustard/math/backend_manager.py b/mrmustard/math/backend_manager.py index f77dc510b..567cb8a3b 100644 --- a/mrmustard/math/backend_manager.py +++ b/mrmustard/math/backend_manager.py @@ -200,6 +200,25 @@ def abs(self, array: Tensor) -> Tensor: """ return self._apply("abs", (array,)) + def allclose(self, array1: Tensor, array2: Tensor, atol=1e-9) -> bool: + r""" + Whether two arrays are equal within tolerance. + + The two arrays are compaired element-wise. + + Args: + array1: An array. + array2: Another array. + atol: The absolute tolerance. + + Returns: + Whether two arrays are equal within tolerance. + + Raises: + ValueError: If the shape of the two arrays do not match. + """ + return self._apply("allclose", (array1, array2, atol)) + def any(self, array: Tensor) -> bool: r"""Returns ``True`` if any element of array is ``True``, ``False`` otherwise. @@ -903,6 +922,33 @@ def pow(self, x: Tensor, y: Tensor) -> Tensor: """ return self._apply("pow", (x, y)) + def kron(self, tensor1: Tensor, tensor2: Tensor) -> Tensor: + r""" + The Kroenecker product of the given tensors. + + Args: + tensor1: A tensor. + tensor2: Another tensor. + + Returns: + The Kroenecker product. + """ + return self._apply("kron", (tensor1, tensor2)) + + def prod(self, array: Tensor, axis=None) -> Tensor: + r""" + The product of all elements in ``array``. + + Args: + array: The array of elements to calculate the product of. + axis: The axis along which a product is performed. If ``None``, it calculates + the product of all elements in ``array``. + + Returns: + The product of the elements in ``array``. + """ + return self._apply("prod", (array, axis)) + def real(self, array: Tensor) -> Tensor: r"""The real part of ``array``. diff --git a/mrmustard/math/backend_numpy.py b/mrmustard/math/backend_numpy.py index dc1064342..e25655ded 100644 --- a/mrmustard/math/backend_numpy.py +++ b/mrmustard/math/backend_numpy.py @@ -59,6 +59,13 @@ def __repr__(self) -> str: def abs(self, array: np.ndarray) -> np.ndarray: return np.abs(array) + def allclose(self, array1: np.array, array2: np.array, atol: float) -> bool: + array1 = self.asnumpy(array1) + array2 = self.asnumpy(array2) + if array1.shape != array2.shape: + raise ValueError("Cannot compare arrays of different shapes.") + return np.allclose(array1, array2, atol=atol) + def any(self, array: np.ndarray) -> np.ndarray: return np.any(array) @@ -279,6 +286,12 @@ def pinv(matrix: np.ndarray) -> np.ndarray: def pow(self, x: np.ndarray, y: float) -> np.ndarray: return np.power(x, y) + def kron(self, tensor1: np.ndarray, tensor2: np.ndarray): + return np.kron(tensor1, tensor2) + + def prod(self, x: np.ndarray, axis: Union[None, int]): + return np.prod(x, axis=axis) + def real(self, array: np.ndarray) -> np.ndarray: return np.real(array) @@ -320,7 +333,7 @@ def tile(self, array: np.ndarray, repeats: Sequence[int]) -> np.ndarray: return np.tile(array, repeats) def trace(self, array: np.ndarray, dtype=None) -> np.ndarray: - return self.cast(np.trace(array), dtype) + return self.cast(np.trace(array, axis1=-1, axis2=-2), dtype) def transpose(self, a: np.ndarray, perm: Sequence[int] = None) -> Optional[np.ndarray]: if a is None: diff --git a/mrmustard/math/backend_tensorflow.py b/mrmustard/math/backend_tensorflow.py index 636b7459a..0e2f2a747 100644 --- a/mrmustard/math/backend_tensorflow.py +++ b/mrmustard/math/backend_tensorflow.py @@ -64,6 +64,13 @@ def __repr__(self) -> str: def abs(self, array: tf.Tensor) -> tf.Tensor: return tf.abs(array) + def allclose(self, array1: np.array, array2: np.array, atol: float) -> bool: + array1 = self.astensor(array1) + array2 = self.astensor(array2) + if array1.shape != array2.shape: + raise ValueError("Cannot compare arrays of different shapes.") + return tf.experimental.numpy.allclose(array1, array2, atol=atol) + def any(self, array: tf.Tensor) -> tf.Tensor: return tf.math.reduce_any(array) @@ -83,13 +90,13 @@ def astensor(self, array: Union[np.ndarray, tf.Tensor], dtype=None) -> tf.Tensor return tf.convert_to_tensor(array, dtype) def atleast_1d(self, array: tf.Tensor, dtype=None) -> tf.Tensor: - return tf.experimental.numpy.atleast_1d(self.astensor(array, dtype)) + return tf.experimental.numpy.atleast_1d(self.cast(self.astensor(array), dtype)) def atleast_2d(self, array: tf.Tensor, dtype=None) -> tf.Tensor: - return tf.experimental.numpy.atleast_2d(self.astensor(array, dtype)) + return tf.experimental.numpy.atleast_2d(self.cast(self.astensor(array), dtype)) def atleast_3d(self, array: tf.Tensor, dtype=None) -> tf.Tensor: - array = self.atleast_2d(self.atleast_1d(array, dtype)) + array = self.atleast_2d(self.atleast_1d(self.cast(self.astensor(array), dtype))) if len(array.shape) == 2: array = self.expand_dims(array, 0) return array @@ -281,6 +288,13 @@ def pinv(matrix: tf.Tensor) -> tf.Tensor: def pow(self, x: tf.Tensor, y: float) -> tf.Tensor: return tf.math.pow(x, y) + def kron(self, tensor1: tf.Tensor, tensor2: tf.Tensor): + tf.experimental.numpy.experimental_enable_numpy_behavior() + return tf.experimental.numpy.kron(tensor1, tensor2) + + def prod(self, x: tf.Tensor, axis: Union[None, int]): + return tf.math.reduce_prod(x, axis=axis) + def real(self, array: tf.Tensor) -> tf.Tensor: return tf.math.real(array) @@ -550,13 +564,7 @@ def hermite_renormalized_diagonal_reorderedAB( # The following import must come after running "jl = Julia(compiled_modules=False)" in settings.py from julia import Main as Main_julia # pylint: disable=import-outside-toplevel - ( - poly0, - poly2, - poly1010, - poly1001, - poly1, - ) = Main_julia.DiagonalAmps.fock_diagonal_amps( + (poly0, poly2, poly1010, poly1001, poly1) = Main_julia.DiagonalAmps.fock_diagonal_amps( A, B, C.item(), tuple(cutoffs), precision_bits ) @@ -672,10 +680,7 @@ def grad(dLdpoly): ) else: # julia (higher precision than complex128) dpoly_dC = poly0 / C.item() - ( - dpoly_dA, - dpoly_dB, - ) = Main_julia.LeftoverModeGrad.fock_1leftoverMode_grad( + (dpoly_dA, dpoly_dB) = Main_julia.LeftoverModeGrad.fock_1leftoverMode_grad( A, B, poly0, poly2, poly1010, poly1001, poly1, precision_bits ) diff --git a/mrmustard/physics/ansatze.py b/mrmustard/physics/ansatze.py index 79f99667f..52fd54036 100644 --- a/mrmustard/physics/ansatze.py +++ b/mrmustard/physics/ansatze.py @@ -12,6 +12,10 @@ # See the License for the specific language governing permissions and # limitations under the License. +""" +This module contains the classes for the available ansatze. +""" + from __future__ import annotations import itertools @@ -33,19 +37,21 @@ Vector, ) -__all__ = ["Ansatz", "PolyExpBase", "PolyExpAnsatz"] +__all__ = ["Ansatz", "ArrayAnsatz", "PolyExpBase", "PolyExpAnsatz"] class Ansatz(ABC): - r"""An Ansatz is a function over a continuous and/or discrete domain. - It supports many mathematical operations such as addition, subtraction, + r""" + A function over a continuous and/or discrete domain. + + An ansatz supports basic mathematical operations such as addition, subtraction, multiplication, division, negation, equality, etc. - Note that n-dimensional arrays are like functions defined over an integer lattice of points, - so this class also works for e.g. the Fock representation. + Note that ``n``-dimensional arrays are like functions defined over an integer lattice of points, + so this class also works for, e.g., the Fock representation. - This class is abstract. Concrete Ansatz classes will have to implement the - ``__call__``, ``__mul__``, ``__add__``, ``__sub__``, ``__neg__`` and ``__eq__`` methods. + This class is abstract. Concrete ``Ansatz`` classes have to implement the + ``__call__``, ``__mul__``, ``__add__``, ``__sub__``, ``__neg__``, and ``__eq__`` methods. """ @abstractmethod @@ -53,21 +59,18 @@ def __neg__(self) -> Ansatz: r""" Negates this ansatz. """ - ... @abstractmethod def __eq__(self, other: Ansatz) -> bool: r""" Whether this ansatz is equal to another ansatz. """ - ... @abstractmethod def __add__(self, other: Ansatz) -> Ansatz: r""" Sums this ansatz to another ansatz. """ - ... def __sub__(self, other: Ansatz) -> Ansatz: r""" @@ -83,21 +86,18 @@ def __call__(self, point: Any) -> Scalar: r""" Evaluates this ansatz at a given point in the domain. """ - ... @abstractmethod def __truediv__(self, other: Union[Scalar, Ansatz]) -> Ansatz: r""" Divides this ansatz by another ansatz or by a scalar. """ - ... @abstractmethod def __mul__(self, other: Union[Scalar, Ansatz]) -> Ansatz: r""" Multiplies this ansatz by another ansatz. """ - ... def __rmul__(self, other: Scalar) -> Ansatz: r""" @@ -123,7 +123,7 @@ class PolyExpBase(Ansatz): functionality by implementing the ``__add__`` method, which concatenates the batch dimensions. As this can blow up the number of terms in the representation, it is recommended to - run the `simplify()` method after adding terms together, which will combine together + run the `simplify()` method after adding terms together, which combines together terms that have the same exponential part. Args: @@ -162,6 +162,9 @@ def __add__(self, other: PolyExpBase) -> PolyExpBase: @property def degree(self) -> int: + r""" + The degree of this ansatz. + """ if self.array.ndim == 1: return 0 return self.array.shape[-1] - 1 @@ -193,7 +196,7 @@ def simplify(self) -> None: def simplify_v2(self) -> None: r""" - A different implementation that orders the batch dimension first. + A different implementation of ``simplify`` that orders the batch dimension first. """ if self._simplified: return @@ -233,6 +236,8 @@ def _order_batch(self): class PolyExpAnsatz(PolyExpBase): r""" + The ansatz of the Fock-Bargmann representation. + Represents the ansatz function: :math:`F(z) = \sum_i \textrm{poly}_i(z) \textrm{exp}(z^T A_i z / 2 + z^T b_i)` @@ -244,27 +249,32 @@ class PolyExpAnsatz(PolyExpBase): with ``k`` being a multi-index. The matrices :math:`A_i` and vectors :math:`b_i` are parameters of the exponential terms in the ansatz, and :math:`z` is a vector of variables. + .. code-block:: + + >>> from mrmustard.physics.ansatze import PolyExpAnsatz + + >>> A = np.array([[1.0, 0.0], [0.0, 1.0]]) + >>> b = np.array([1.0, 1.0]) + >>> c = np.array(1.0) + + >>> F = PolyExpAnsatz(A, b, c) + >>> z = np.array([1.0, 2.0]) + + >>> # calculate the value of the function at ``z`` + >>> val = F(z) + Args: A: The list of square matrices :math:`A_i` b: The list of vectors :math:`b_i` c: The array of coefficients for the polynomial terms in the ansatz. - .. code-block:: - - A = [np.array([[1.0, 0.0], [0.0, 1.0]])] - b = [np.array([1.0, 1.0])] - c = [np.array(1.0)] - F = PolyExpAnsatz(A, b, c) - z = np.array([1.0, 2.0]) - print(F(z)) # prints the value of F at z - """ def __init__( self, A: Optional[Batch[Matrix]] = None, b: Optional[Batch[Vector]] = None, - c: Batch[Tensor | Scalar] = [1.0], + c: Batch[Tensor | Scalar] = 1.0, name: str = "", ): self.name = name @@ -380,3 +390,133 @@ def __and__(self, other: PolyExpAnsatz) -> PolyExpAnsatz: bs = [math.concat([b1, b2], axis=-1) for b1 in self.b for b2 in other.b] cs = [math.outer(c1, c2) for c1 in self.c for c2 in other.c] return self.__class__(As, bs, cs) + + +class ArrayAnsatz(Ansatz): + r""" + The ansatz of the Fock-Bargmann representation. + + Represents the ansatz as a multidimensional array. + + Args: + array: A batched array. + + .. code-block :: + + >>> from mrmustard.physics.ansatze import ArrayAnsatz + + >>> array = np.random.random((2, 4, 5)) + >>> ansatz = ArrayAnsatz(array) + """ + + def __init__(self, array: Batch[Tensor]): + self.array = math.astensor(array) + + def __neg__(self) -> ArrayAnsatz: + r""" + Negates the values in the array. + """ + return self.__class__(array=-self.array) + + def __eq__(self, other: Ansatz) -> bool: + r""" + Whether this ansatz's array is equal to another ansatz's array. + + Note that the comparison is done by numpy allclose with numpy's default rtol and atol. + + Raises: + ValueError: If the arrays don't have the same shape. + """ + try: + return np.allclose(self.array, other.array) + except Exception as e: + raise TypeError(f"Cannot compare {self.__class__} and {other.__class__}.") from e + + def __add__(self, other: ArrayAnsatz) -> ArrayAnsatz: + r""" + Adds the array of this ansatz and the array of another ansatz. + + Args: + other: Another ansatz. + + Raises: + ValueError: If the arrays don't have the same shape. + + Returns: + ArrayAnsatz: The addition of this ansatz and other. + """ + try: + new_array = [a + b for a in self.array for b in other.array] + return self.__class__(array=math.astensor(new_array)) + except Exception as e: + raise TypeError(f"Cannot add {self.__class__} and {other.__class__}.") from e + + def __call__(self, point: Any) -> Scalar: + r""" + Evaluates this ansatz at a given point in the domain. + """ + raise AttributeError("Cannot plot ArrayAnsatz.") + + def __truediv__(self, other: Union[Scalar, ArrayAnsatz]) -> ArrayAnsatz: + r""" + Divides this ansatz by another ansatz. + + Args: + other: A scalar or another ansatz. + + Raises: + ValueError: If the arrays don't have the same shape. + + Returns: + ArrayAnsatz: The division of this ansatz and other. + """ + if isinstance(other, ArrayAnsatz): + try: + new_array = [a / b for a in self.array for b in other.array] + return self.__class__(array=math.astensor(new_array)) + except Exception as e: + raise TypeError(f"Cannot divide {self.__class__} and {other.__class__}.") from e + else: + return self.__class__(array=self.array / other) + + def __mul__(self, other: Union[Scalar, ArrayAnsatz]) -> ArrayAnsatz: + r""" + Multiplies this ansatz by another ansatz. + + Args: + other: A scalar or another ansatz. + + Raises: + ValueError: If both of array don't have the same shape. + + Returns: + ArrayAnsatz: The product of this ansatz and other. + """ + if isinstance(other, ArrayAnsatz): + try: + new_array = [a * b for a in self.array for b in other.array] + return self.__class__(array=math.astensor(new_array)) + except Exception as e: + raise TypeError(f"Cannot multiply {self.__class__} and {other.__class__}.") from e + else: + return self.__class__(array=self.array * other) + + def __and__(self, other: ArrayAnsatz) -> ArrayAnsatz: + r"""Tensor product of this ansatz with another ansatz. + + Args: + other: Another ansatz. + + Returns: + The tensor product of this ansatz and other. + Batch size is the product of two batches. + """ + new_array = [math.outer(a, b) for a in self.array for b in other.array] + return self.__class__(array=math.astensor(new_array)) + + @property + def conj(self): + r""" + The conjugate of this ansatz. + """ + return self.__class__(math.conj(self.array)) diff --git a/mrmustard/physics/bargmann.py b/mrmustard/physics/bargmann.py index fb798ba5b..af70bfa01 100644 --- a/mrmustard/physics/bargmann.py +++ b/mrmustard/physics/bargmann.py @@ -13,7 +13,7 @@ # limitations under the License. """ -This module contains functions for transforming to the Bargmann representation. +This module contains functions for performing calculations on objects in the Bargmann representations. """ from typing import Sequence, Tuple @@ -126,6 +126,11 @@ def complex_gaussian_integral( :math: `dmu(z) = \textrm{exp}(m * |z|^2) \frac{d^{2n}z}{\pi^n} = \frac{1}{\pi^n}\textrm{exp}(m * |z|^2) d\textrm{Re}(z) d\textrm{Im}(z)` + Note that the indices must be a complex variable pairs with each other (idx_z, idx_zconj) to make this contraction meaningful. + Please make sure the corresponding complex variable with respect to your Abc triples. + For examples, if the indices of Abc denotes the variables ``(\alpha, \beta, \alpha^*, \beta^*, \gamma, \eta)``, the contraction only works + with the indices between ``(\alpha, \alpha^*)`` pairs and ``(\beta, \beta^*)`` pairs. + Arguments: A,b,c: the ``(A,b,c)`` triple idx_z: the tuple of indices of the z variables @@ -133,27 +138,37 @@ def complex_gaussian_integral( measure: the exponent of the measure (default is -1: Bargmann measure) Returns: - The ``(A,b,c)`` triple of the result of the integral + The ``(A,b,c)`` triple of the result of the integral. + + Raises: + ValueError: If ``idx_z`` and ``idx_zconj`` have different lengths. """ A, b, c = Abc if len(idx_z) != len(idx_zconj): raise ValueError("idx_z and idx_zconj must have the same length") n = len(idx_z) idx = tuple(idx_z) + tuple(idx_zconj) + if not idx: + return A, b, c not_idx = tuple(i for i in range(A.shape[-1]) if i not in idx) I = math.eye(n, dtype=A.dtype) Z = math.zeros((n, n), dtype=A.dtype) X = math.block([[Z, I], [I, Z]]) M = math.gather(math.gather(A, idx, axis=-1), idx, axis=-2) + X * measure - D = math.gather(math.gather(A, idx, axis=-1), not_idx, axis=-2) - R = math.gather(math.gather(A, not_idx, axis=-1), not_idx, axis=-2) - bM = math.gather(b, idx, axis=-1) - bR = math.gather(b, not_idx, axis=-1) - A_post = R - math.matmul(D, math.inv(M), math.transpose(D)) - b_post = bR - math.matvec(D, math.solve(M, bM)) + not_idx = tuple(i for i in range(A.shape[-1]) if i not in idx) + if math.asnumpy(not_idx).shape != (0,): + D = math.gather(math.gather(A, idx, axis=-1), not_idx, axis=-2) + R = math.gather(math.gather(A, not_idx, axis=-1), not_idx, axis=-2) + bR = math.gather(b, not_idx, axis=-1) + A_post = R - math.matmul(D, math.inv(M), math.transpose(D)) + b_post = bR - math.matvec(D, math.solve(M, bM)) + else: + A_post = math.astensor([]) + b_post = math.astensor([]) + c_post = ( c * math.sqrt((-1) ** n / math.det(M)) * math.exp(-0.5 * math.sum(bM * math.solve(M, bM))) ) @@ -206,7 +221,12 @@ def contract_two_Abc( idx2: Sequence[int], ): r""" - Returns the contraction of two ``(A,b,c)`` triples. + Returns the contraction of two ``(A,b,c)`` triples with given indices. + + Note that the indices must be a complex variable pairs with each other to make this contraction meaningful. Please make sure + the corresponding complex variable with respect to your Abc triples. + For examples, if the indices of Abc1 denotes the variables ``(\alpha, \beta)``, the indices of Abc2 denotes the variables + ``(\alpha^*,\gamma)``, the contraction only works with ``idx1 = [0], idx2 = [0]``. Arguments: Abc1: the first ``(A,b,c)`` triple diff --git a/mrmustard/physics/fock.py b/mrmustard/physics/fock.py index cef6834cd..721a88728 100644 --- a/mrmustard/physics/fock.py +++ b/mrmustard/physics/fock.py @@ -15,7 +15,7 @@ # pylint: disable=redefined-outer-name """ -This module contains functions for performing calculations on Fock states. +This module contains functions for performing calculations on objects in the Fock representations. """ from functools import lru_cache diff --git a/mrmustard/physics/gaussian.py b/mrmustard/physics/gaussian.py index efeb3d77f..f5737c34a 100644 --- a/mrmustard/physics/gaussian.py +++ b/mrmustard/physics/gaussian.py @@ -13,7 +13,7 @@ # limitations under the License. """ -This module contains functions for performing calculations on Gaussian states. +This module contains functions for performing calculations on objects in the Gaussian representations. """ from typing import Any, Optional, Sequence, Tuple, Union @@ -585,11 +585,24 @@ def general_dyne( # covariances are divided by 2 to match tensorflow and MrMustard conventions # (MrMustard uses Serafini convention where `sigma_MM = 2 sigma_TF`) - pdf = math.MultivariateNormalTriL(loc=b, scale_tril=math.cholesky(reduced_cov / 2)) - outcome = ( - pdf.sample(dtype=cov.dtype) if proj_means is None else math.cast(proj_means, cov.dtype) - ) - prob = pdf.prob(outcome) + if proj_means is None: + pdf = math.MultivariateNormalTriL(loc=b, scale_tril=math.cholesky(reduced_cov / 2)) + outcome = ( + pdf.sample(dtype=cov.dtype) if proj_means is None else math.cast(proj_means, cov.dtype) + ) + prob = pdf.prob(outcome) + else: + # If the projector is already given: proj_means + # use the formula 5.139 in Serafini - Quantum Continuous Variables + # fixed by -0.5 on the exponential, added hbar and removed pi due to different convention + outcome = proj_means + prob = ( + settings.HBAR**M + * math.exp( + -0.5 * math.sum(math.solve(reduced_cov, (proj_means - b)) * (proj_means - b)) + ) + / math.sqrt(math.det(reduced_cov)) + ) # calculate conditional output state of unmeasured modes num_remaining_modes = N - M diff --git a/mrmustard/physics/representations.py b/mrmustard/physics/representations.py index 9434910b2..95e1863e4 100644 --- a/mrmustard/physics/representations.py +++ b/mrmustard/physics/representations.py @@ -12,30 +12,47 @@ # See the License for the specific language governing permissions and # limitations under the License. + +""" +This module contains the classes for the available representations. +""" + from __future__ import annotations -import numpy as np +from abc import ABC, abstractmethod from matplotlib import colors import matplotlib.pyplot as plt -from mrmustard import math -from mrmustard.physics import bargmann -from mrmustard.physics.ansatze import Ansatz, PolyExpAnsatz -from mrmustard.utils.typing import Batch, ComplexMatrix, ComplexTensor, ComplexVector, Scalar import numpy as np + from mrmustard import math +from mrmustard.physics import bargmann +from mrmustard.physics.ansatze import Ansatz, PolyExpAnsatz, ArrayAnsatz +from mrmustard.utils.typing import ( + Batch, + ComplexMatrix, + ComplexTensor, + ComplexVector, + Scalar, + Tensor, +) + +__all__ = ["Representation", "Bargmann", "Fock"] -class Representation: +class Representation(ABC): r""" A base class for representations. + + Representations can be initialized using the ``from_ansatz`` method, which automatically equips + them with all the functionality required to perform mathematical operations, such as equality, + multiplication, subtraction, etc. """ - def from_ansatz(self, ansatz: Ansatz) -> Representation: + @abstractmethod + def from_ansatz(cls, ansatz: Ansatz) -> Representation: # pragma: no cover r""" - Returns a representation object from an ansatz object. - To be implemented by subclasses. + Returns a representation from an ansatz. """ - raise NotImplementedError def __eq__(self, other: Representation) -> bool: r""" @@ -93,73 +110,107 @@ def __and__(self, other: Representation) -> Representation: class Bargmann(Representation): - r"""This class is the Fock-Bargmann representation of a broad class of quantum states, - transformations, measurements, channels, etc. + r""" + The Fock-Bargmann representation of a broad class of quantum states, transformations, + measurements, channels, etc. - The ansatz available in this representation is a linear combination of - exponentials of bilinear forms with a polynomial part: + The ansatz available in this representation is a linear combination of exponentials + of bilinear forms with a polynomial part: .. math:: F(z) = \sum_i \textrm{poly}_i(z) \textrm{exp}(z^T A_i z / 2 + z^T b_i) This function allows for vector space operations on Bargmann objects including - linear combinations, outer product, and inner product. - The inner product is defined as the contraction of two Bargmann objects across - marked indices. This can also be used to contract existing indices - in a single Bargmann object, e.g. to implement the partial trace. - - Note that the operations that change the shape of the ansatz (outer product (``&``) - and inner product (``@``)) do not automatically modify the ordering of the - combined or leftover indices. - - Examples: - .. code-block:: python - - A = math.astensor([[[1.0]]]) # 1x1x1 - b = math.astensor([[0.0]]) # 1x1 - c = math.astensor([0.9]) # 1 - psi1 = Bargmann(A, b, c) - psi2 = Bargmann(A, b, c) - psi3 = 1.3 * psi1 - 2.1 * psi2 # linear combination - assert psi3.A.shape == (2, 1, 1) # stacked along batch dimension - psi4 = psi1[0] @ psi2[0] # contract wires 0 on each (inner product) - assert psi4.A.shape == (1,) # A is 0x0 now (no wires left) - psi5 = psi1 & psi2 # outer product (tensor product) - rho = psi1.conj() & psi1 # outer product (this is now the density matrix) - assert rho.A.shape == (1, 2, 2) # we have two wires now - assert np.allclose(rho.trace((0,), (1,)), np.abs(c)**2) + linear combinations (``+``), outer product (``&``), and inner product (``@``). + + .. code-block :: + + >>> from mrmustard.physics.representations import Bargmann + >>> from mrmustard.physics.triples import displacement_gate_Abc, vacuum_state_Abc + + >>> # bargmann representation of one-mode vacuum + >>> rep_vac = Bargmann(*vacuum_state_Abc(1)) + + >>> # bargmann representation of one-mode dgate with gamma=1+0j + >>> rep_dgate = Bargmann(*displacement_gate_Abc(1)) + + The inner product is defined as the contraction of two Bargmann objects across marked indices. + Indices are marked using ``__getitem__``. Once the indices are marked for contraction, they are + be used the next time the inner product (``@``) is called. For example: + + .. code-block :: + + >>> import numpy as np + + >>> # mark indices for contraction + >>> idx_vac = [0] + >>> idx_rep = [1] + + >>> # bargmann representation of coh = vacuum >> dgate + >>> rep_coh = rep_vac[idx_vac] @ rep_dgate[idx_rep] + >>> assert np.allclose(rep_coh.A, [[0,],]) + >>> assert np.allclose(rep_coh.b, [1,]) + >>> assert np.allclose(rep_coh.c, 0.6065306597126334) + + This can also be used to contract existing indices in a single Bargmann object, e.g. + to implement the partial trace. + + .. code-block :: + + >>> trace = (rep_coh @ rep_coh.conj()).trace([0], [1]) + >>> assert np.allclose(trace.A, 0) + >>> assert np.allclose(trace.b, 0) + >>> assert trace.c == 1 + + The ``A``, ``b``, and ``c`` parameters can be batched to represent superpositions. + .. code-block :: + + >>> # bargmann representation of one-mode coherent state with gamma=1+0j + >>> A_plus = np.array([[0,],]) + >>> b_plus = np.array([1,]) + >>> c_plus = 0.6065306597126334 + + >>> # bargmann representation of one-mode coherent state with gamma=-1+0j + >>> A_minus = np.array([[0,],]) + >>> b_minus = np.array([-1,]) + >>> c_minus = 0.6065306597126334 + + >>> # bargmann representation of a superposition of coherent states + >>> A = [A_plus, A_minus] + >>> b = [b_plus, b_minus] + >>> c = [c_plus, c_minus] + >>> rep_coh_sup = Bargmann(A, b, c) + + Note that the operations that change the shape of the ansatz (outer product and inner + product) do not automatically modify the ordering of the combined or leftover indices. + However, the ``reordering`` method allows reordering the representation after the products + have been carried out. Args: - A: batch of quadratic coefficient :math:`A_i` - b: batch of linear coefficients :math:`b_i` - c: batch of arrays :math:`c_i` (default: [1.0]) + A: A batch of quadratic coefficient :math:`A_i`. + b: A batch of linear coefficients :math:`b_i`. + c: A batch of arrays :math:`c_i`. + + Note: The args can be passed non-batched, as they will be automatically broadcasted to the + correct batch shape. """ def __init__( self, A: Batch[ComplexMatrix], b: Batch[ComplexVector], - c: Batch[ComplexTensor] = [1.0], + c: Batch[ComplexTensor] = 1.0, ): - r"""Initializes the Bargmann representation. Args can be passed non-batched, - they will be automatically broadcasted to the correct batch shape. - - Args: - A: batch of quadratic coefficient :math:`A_i` - b: batch of linear coefficients :math:`b_i` - c: batch of arrays :math:`c_i` (default: [1.0]) - """ self._contract_idxs: tuple[int, ...] = () self.ansatz = PolyExpAnsatz(A, b, c) - def __call__(self, z: ComplexTensor) -> ComplexTensor: - r"""Evaluates the Bargmann function at the given array of points.""" - return self.ansatz(z) - - def from_ansatz(self, ansatz: PolyExpAnsatz) -> Bargmann: - r"""Returns a Bargmann object from an ansatz object.""" - return self.__class__(ansatz.A, ansatz.b, ansatz.c) + @classmethod + def from_ansatz(cls, ansatz: PolyExpAnsatz) -> Bargmann: # pylint: disable=arguments-differ + r""" + Returns a Bargmann object from an ansatz object. + """ + return cls(ansatz.A, ansatz.b, ansatz.c) @property def A(self) -> Batch[ComplexMatrix]: @@ -187,47 +238,16 @@ def conj(self): The conjugate of this Bargmann object. """ new = self.__class__(math.conj(self.A), math.conj(self.b), math.conj(self.c)) - new._contract_idxs = self._contract_idxs - return new - - def __getitem__(self, idx: int | tuple[int, ...]) -> Bargmann: - r"""Returns a copy of self with the given indices marked for contraction.""" - idx = (idx,) if isinstance(idx, int) else idx - for i in idx: - if i >= self.ansatz.dim: - raise IndexError( - f"Index {i} out of bounds for ansatz {self.ansatz.__class__.__qualname__} of dimension {self.ansatz.dim}." - ) - new = self.__class__(self.A, self.b, self.c) - new._contract_idxs = idx + new._contract_idxs = self._contract_idxs # pylint: disable=protected-access return new - def __matmul__(self, other: Bargmann) -> Bargmann: - r"""Implements the inner product of ansatze across the marked indices.""" - if self.ansatz.degree > 0 or other.ansatz.degree > 0: - raise NotImplementedError( - "Inner product of ansatze is only supported for ansatze with polynomial of degree 0." - ) - Abc = [] - for A1, b1, c1 in zip(self.A, self.b, self.c): - for A2, b2, c2 in zip(other.A, other.b, other.c): - Abc.append( - bargmann.contract_two_Abc( - (A1, b1, c1), - (A2, b2, c2), - self._contract_idxs, - other._contract_idxs, - ) - ) - A, b, c = zip(*Abc) - return self.__class__(math.astensor(A), math.astensor(b), math.astensor(c)) - def trace(self, idx_z: tuple[int, ...], idx_zconj: tuple[int, ...]) -> Bargmann: - r"""Implements the partial trace over the given index pairs. + r""" + The partial trace over the given index pairs. Args: - idx_z: indices to trace over - idx_zconj: indices to trace over + idx_z: The first part of the pairs of indices to trace over. + idx_zconj: The second part. Returns: Bargmann: the ansatz with the given indices traced over @@ -236,9 +256,6 @@ def trace(self, idx_z: tuple[int, ...], idx_zconj: tuple[int, ...]) -> Bargmann: raise NotImplementedError( "Partial trace is only supported for ansatze with polynomial of degree ``0``." ) - if len(idx_z) != len(idx_zconj): - msg = f"The number of indices to trace over must be the same for ``z`` and ``z*`` (got {len(idx_z)} and {len(idx_zconj)})." - raise ValueError(msg) A, b, c = [], [], [] for Abci in zip(self.A, self.b, self.c): Aij, bij, cij = bargmann.complex_gaussian_integral(Abci, idx_z, idx_zconj, measure=-1.0) @@ -248,8 +265,26 @@ def trace(self, idx_z: tuple[int, ...], idx_zconj: tuple[int, ...]) -> Bargmann: return self.__class__(math.astensor(A), math.astensor(b), math.astensor(c)) def reorder(self, order: tuple[int, ...] | list[int]) -> Bargmann: - r"""Reorders the indices of the A matrix and b vector of an (A,b,c) triple. - Returns a new Bargmann object.""" + r""" + Reorders the indices of the ``A`` matrix and ``b`` vector of the ``(A, b, c)`` triple in + this Bargmann object. + + .. code-block:: + + >>> from mrmustard.physics.representations import Bargmann + >>> from mrmustard.physics.triples import displacement_gate_Abc + + >>> rep_dgate1 = Bargmann(*displacement_gate_Abc([0.1, 0.2, 0.3])) + >>> rep_dgate2 = Bargmann(*displacement_gate_Abc([0.2, 0.3, 0.1])) + + >>> assert rep_dgate1.reorder([1, 2, 0, 4, 5, 3]) == rep_dgate2 + + Args: + order: The new order. + + Returns: + The reordered Bargmann object. + """ A, b, c = bargmann.reorder_abc((self.A, self.b, self.c), order) return self.__class__(A, b, c) @@ -260,21 +295,22 @@ def plot( log_scale: bool = False, xlim=(-2 * np.pi, 2 * np.pi), ylim=(-2 * np.pi, 2 * np.pi), - **kwargs, - ): # pragma: no cover - r"""Plots the Bargmann function F(z) on the complex plane. Phase is represented by color, - magnitude by brightness. The function can be multiplied by exp(-|z|^2) to represent - the Bargmann function times the measure function (for integration). + ) -> tuple[plt.figure.Figure, plt.axes.Axes]: # pragma: no cover + r""" + Plots the Bargmann function :math:`F(z)` on the complex plane. Phase is represented by + color, magnitude by brightness. The function can be multiplied by :math:`exp(-|z|^2)` + to represent the Bargmann function times the measure function (for integration). Args: - just_phase (bool): whether to plot only the phase of the Bargmann function - with_measure (bool): whether to plot the bargmann function times the measure function exp(-|z|^2) - log_scale (bool): whether to plot the log of the Bargmann function - xlim (tuple[float, float]): x limits of the plot - ylim (tuple[float, float]): y limits of the plot + just_phase: Whether to plot only the phase of the Bargmann function. + with_measure: Whether to plot the bargmann function times the measure function + :math:`exp(-|z|^2)`. + log_scale: Whether to plot the log of the Bargmann function. + xlim: The `x` limits of the plot. + ylim: The `y` limits of the plot. Returns: - tuple[matplotlib.figure.Figure, matplotlib.axes.Axes]: the figure and axes of the plot + The figure and axes of the plot """ # eval F(z) on a grid of complex numbers X, Y = np.mgrid[xlim[0] : xlim[1] : 400j, ylim[0] : ylim[1] : 400j] @@ -310,3 +346,192 @@ def plot( ax.set_title(f"${title}$") plt.show(block=False) return fig, ax + + def __call__(self, z: ComplexTensor) -> ComplexTensor: + r""" + Evaluates the Bargmann function at the given array of points. + + Args: + z: The array of points. + + Returns: + The value of the Bargmann function at ``z``. + """ + return self.ansatz(z) + + def __getitem__(self, idx: int | tuple[int, ...]) -> Bargmann: + r""" + A copy of self with the given indices marked for contraction. + """ + idx = (idx,) if isinstance(idx, int) else idx + for i in idx: + if i >= self.ansatz.dim: + raise IndexError( + f"Index {i} out of bounds for ansatz {self.ansatz.__class__.__qualname__} of dimension {self.ansatz.dim}." + ) + new = self.__class__(self.A, self.b, self.c) + new._contract_idxs = idx + return new + + def __matmul__(self, other: Bargmann) -> Bargmann: + r""" + The inner product of ansatze across the marked indices. + """ + if self.ansatz.degree > 0 or other.ansatz.degree > 0: + raise NotImplementedError( + "Inner product of ansatze is only supported for ansatze with polynomial of degree 0." + ) + Abc = [] + for A1, b1, c1 in zip(self.A, self.b, self.c): + for A2, b2, c2 in zip(other.A, other.b, other.c): + Abc.append( + bargmann.contract_two_Abc( + (A1, b1, c1), + (A2, b2, c2), + self._contract_idxs, + other._contract_idxs, + ) + ) + A, b, c = zip(*Abc) + return self.__class__(math.astensor(A), math.astensor(b), math.astensor(c)) + + +class Fock(Representation): + r""" + The Fock representation of a broad class of quantum states, transformations, measurements, + channels, etc. + + The ansatz available in this representation is ``ArrayAnsatz``. + + This function allows for vector space operations on Fock objects including + linear combinations, outer product (``&``), and inner product (``@``). + + .. code-block:: + + >>> # initialize Fock objects + >>> array1 = math.astensor(np.random.random((1,5,7,8))) # where 1 is the batch. + >>> array2 = math.astensor(np.random.random((1,5,7,8))) # where 1 is the batch. + >>> array3 = math.astensor(np.random.random((3,5,7,8))) # where 3 is the batch. + >>> fock1 = Fock(array1) + >>> fock2 = Fock(array2) + >>> fock3 = Fock(array3) + + >>> # linear combination can be done with the same batch dimension + >>> fock4 = 1.3 * fock1 - fock2 * 2.1 + + >>> # division by a scalar + >>> fock5 = fock1 / 1.3 + + >>> # inner product by contracting on marked indices + >>> fock6 = fock1[2] @ fock3[2] + + >>> # outer product (tensor product) + >>> fock7 = fock1 & fock3 + + >>> # conjugation + >>> fock8 = fock1.conj() + + Args: + array: the (batched) array in Fock representation. + batched: whether the array input has a batch dimension. + + Note: The args can be passed non-batched, as they will be automatically broadcasted to the + correct batch shape. + + """ + + def __init__(self, array: Batch[Tensor], batched=False): + self._contract_idxs: tuple[int, ...] = () + if not batched: + array = array[None, ...] + self.ansatz = ArrayAnsatz(array=array) + + @classmethod + def from_ansatz(cls, ansatz: ArrayAnsatz) -> Fock: # pylint: disable=arguments-differ + r""" + Returns a Fock object from an ansatz object. + """ + return cls(ansatz.array, batched=True) + + @property + def array(self) -> Batch[Tensor]: + r""" + The array from the ansatz. + """ + return self.ansatz.array + + def conj(self): + r""" + The conjugate of this Fock object. + """ + new = self.from_ansatz(self.ansatz.conj) + new._contract_idxs = self._contract_idxs # pylint: disable=protected-access + return new + + def __getitem__(self, idx: int | tuple[int, ...]) -> Fock: + r""" + Returns a copy of self with the given indices marked for contraction. + """ + idx = (idx,) if isinstance(idx, int) else idx + for i in idx: + if i >= len(self.array.shape): + raise IndexError( + f"Index {i} out of bounds for ansatz {self.ansatz.__class__.__qualname__} of dimension {self.ansatz.dim}." + ) + new = self.from_ansatz(self.ansatz) + new._contract_idxs = idx + return new + + def __matmul__(self, other: Fock) -> Fock: + r""" + Implements the inner product of ansatze across the marked indices. + + Batch: + The new Fock holds the tensor product batch of them. + + Order of index: + The new Fock's order is arranged as uncontracted elements in self and then other. + """ + axes = [list(self._contract_idxs), list(other._contract_idxs)] + new_array = [] + for i in range(self.array.shape[0]): + for j in range(other.array.shape[0]): + new_array.append(math.tensordot(self.array[i], other.array[j], axes)) + return self.from_ansatz(ArrayAnsatz(new_array)) + + def trace(self, idxs1: tuple[int, ...], idxs2: tuple[int, ...]) -> Fock: + r"""Implements the partial trace over the given index pairs. + + Args: + idxs1: The first part of the pairs of indices to trace over. + idxs2: The second part. + + Returns: + The traced-over Fock object. + """ + if len(idxs1) != len(idxs2) or not set(idxs1).isdisjoint(idxs2): + raise ValueError("idxs must be of equal length and disjoint") + order = ( + [0] + + [i + 1 for i in range(len(self.array.shape) - 1) if i not in idxs1 + idxs2] + + [i + 1 for i in idxs1] + + [i + 1 for i in idxs2] + ) + new_array = math.transpose(self.array, order) + n = np.prod(new_array.shape[-len(idxs2) :]) + new_array = math.reshape(new_array, new_array.shape[: -2 * len(idxs1)] + (n, n)) + return self.from_ansatz(ArrayAnsatz(math.trace(new_array))) + + def reorder(self, order: tuple[int, ...] | list[int]) -> Fock: + r""" + Reorders the indices of the array with the given order. + + Args: + order: The order. Does not need to refer to the batch dimension. + + Returns: + The reordered Fock. + """ + return self.from_ansatz( + ArrayAnsatz(math.transpose(self.array, [0] + [i + 1 for i in order])) + ) diff --git a/mrmustard/physics/triples.py b/mrmustard/physics/triples.py new file mode 100644 index 000000000..6cf67fbad --- /dev/null +++ b/mrmustard/physics/triples.py @@ -0,0 +1,460 @@ +# Copyright 2023 Xanadu Quantum Technologies Inc. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +""" +This module contains the ``(A, b, c)`` triples for the Fock-Bargmann representation of +various states and transformations. +""" + +from typing import Generator, Iterable, Union +from mrmustard import math +from mrmustard.utils.typing import Matrix, Vector, Scalar + +import numpy as np + + +# ~~~~~~~~~ +# Utilities +# ~~~~~~~~~ + + +def _X_matrix_for_unitary(n_modes: int) -> Matrix: + r""" + The X matrix for the order of unitaries. + """ + return math.cast(math.kron(math.astensor([[0, 1], [1, 0]]), math.eye(n_modes)), math.complex128) + + +def _vacuum_A_matrix(n_modes: int) -> Matrix: + r""" + The A matrix of the vacuum state. + """ + return math.zeros((n_modes, n_modes), math.complex128) + + +def _vacuum_B_vector(n_modes: int) -> Vector: + r""" + The B vector of the vacuum state. + """ + return math.zeros((n_modes,), math.complex128) + + +def _reshape(**kwargs) -> Generator: + r""" + A utility function to reshape parameters. + """ + names = list(kwargs.keys()) + vars = list(kwargs.values()) + + vars = [math.atleast_1d(var, math.complex128) for var in vars] + n_modes = max(len(var) for var in vars) + + for i, var in enumerate(vars): + if len(var) == 1: + var = math.tile(var, (n_modes,)) + else: + if len(var) != n_modes: + msg = f"Parameter {names[i]} has an incompatible shape." + raise ValueError(msg) + yield var + + +def _get_reshape_list_for_channel(num_modes: int): + r""" + A utility function to find out the reorder list for the channel. + """ + new_order = [[i, i + num_modes, i + num_modes * 2, i + num_modes * 3] for i in range(num_modes)] + return np.array(new_order).reshape(num_modes * 4) + + +# ~~~~~~~~~~~ +# Pure States +# ~~~~~~~~~~~ + + +def vacuum_state_Abc(n_modes: int) -> Union[Matrix, Vector, Scalar]: + r""" + The ``(A, b, c)`` triple of a tensor product of vacuum states on ``n_modes``. + + Args: + n_modes: The number of modes. + + Returns: + The ``(A, b, c)`` triple of the vacuum states. + """ + A = _vacuum_A_matrix(n_modes) + b = _vacuum_B_vector(n_modes) + c = 1.0 + 0j + + return A, b, c + + +def coherent_state_Abc( + x: Union[float, Iterable[float]], y: Union[float, Iterable[float]] = 0 +) -> Union[Matrix, Vector, Scalar]: + r""" + The ``(A, b, c)`` triple of a tensor product of pure coherent states. + + The number of modes depends on the length of the input parameters. + + If one of the input parameters has length ``1``, it is tiled so that its length matches + that of the other one. For example, passing ``x=[1,2,3]`` and ``y=1`` is equivalent to passing + ``x=[1,2,3]`` and ``y=[1,1,1]``. + + Args: + x: The real parts of the displacements, in units of :math:`\sqrt{\hbar}`. + y: The imaginary parts of the displacements, in units of :math:`\sqrt{\hbar}`. + + Returns: + The ``(A, b, c)`` triple of the pure coherent states. + """ + x, y = list(_reshape(x=x, y=y)) + n_modes = len(x) + + A = _vacuum_A_matrix(n_modes) + b = x + 1j * y + c = math.prod(math.exp(-0.5 * (x**2 + y**2))) + + return A, b, c + + +def squeezed_vacuum_state_Abc( + r: Union[float, Iterable[float]], phi: Union[float, Iterable[float]] = 0 +) -> Union[Matrix, Vector, Scalar]: + r""" + The ``(A, b, c)`` triple of a tensor product of squeezed vacuum states. + + The number of modes depends on the length of the input parameters. + + If one of the input parameters has length ``1``, it is tiled so that its length matches + that of the other one. For example, passing ``r=[1,2,3]`` and ``phi=1`` is equivalent to + passing ``r=[1,2,3]`` and ``phi=[1,1,1]``. + + Args: + r: The squeezing magnitudes. + phi: The squeezing angles. + + Returns: + The ``(A, b, c)`` triple of the squeezed vacuum states. + """ + r, phi = list(_reshape(r=r, phi=phi)) + n_modes = len(r) + + A = math.diag(-math.sinh(r) / math.cosh(r) * math.exp(1j * phi)) + b = _vacuum_B_vector(n_modes) + c = math.prod(1 / math.sqrt(math.cosh(r))) + + return A, b, c + + +def displaced_squeezed_vacuum_state_Abc( + x: Union[float, Iterable[float]], + y: Union[float, Iterable[float]] = 0, + r: Union[float, Iterable[float]] = 0, + phi: Union[float, Iterable[float]] = 0, +) -> Union[Matrix, Vector, Scalar]: + r""" + The ``(A, b, c)`` triple of a tensor product of displazed squeezed vacuum states. + + The number of modes depends on the length of the input parameters. + + If some of the input parameters have length ``1``, they are tiled so that their length + matches that of the other ones. For example, passing ``r=[1,2,3]`` and ``phi=1`` is equivalent + to passing ``r=[1,2,3]`` and ``phi=[1,1,1]``. + + Args: + r: The squeezing magnitudes. + phi: The squeezing angles. + x: The real parts of the displacements, in units of :math:`\sqrt{\hbar}`. + y: The imaginary parts of the displacements, in units of :math:`\sqrt{\hbar}`. + + Returns: + The ``(A, b, c)`` triple of the squeezed vacuum states. + """ + x, y, r, phi = list(_reshape(x=x, y=y, r=r, phi=phi)) + + A = math.diag(-math.sinh(r) / math.cosh(r) * math.exp(1j * phi)) + b = (x + 1j * y) + (x - 1j * y) * math.sinh(r) / math.cosh(r) * math.exp(1j * phi) + c = math.exp( + -0.5 * (x**2 + y**2) + - 0.5 * (x - 1j * y) ** 2 * math.sinh(r) / math.cosh(r) * math.exp(1j * phi) + ) + c = math.prod(c / math.sqrt(math.cosh(r))) + + return A, b, c + + +# ~~~~~~~~~~~~ +# Mixed States +# ~~~~~~~~~~~~ + + +def thermal_state_Abc(nbar: Union[int, Iterable[int]]) -> Union[Matrix, Vector, Scalar]: + r""" + The ``(A, b, c)`` triple of a tensor product of thermal states. + + The number of modes depends on the length of the input parameters. + + Args: + nbar: The average numbers of photons per mode. + + Returns: + The ``(A, b, c)`` triple of the thermal states. + """ + nbar = math.atleast_1d(nbar, math.complex128) + n_modes = len(nbar) + + A = math.astensor([[0, 1], [1, 0]], math.complex128) + A = np.kron((nbar / (nbar + 1)) * math.eye(n_modes, math.complex128), A) + c = math.prod([1 / (_nbar + 1) for _nbar in nbar]) + b = _vacuum_B_vector(n_modes * 2) + + return A, b, c + + +# ~~~~~~~~~~~~~~~~~~~~~~~~ +# Unitary transformations +# ~~~~~~~~~~~~~~~~~~~~~~~~ + + +def rotation_gate_Abc(theta: Union[float, Iterable[float]]) -> Union[Matrix, Vector, Scalar]: + r""" + The ``(A, b, c)`` triple of of a tensor product of rotation gates. + + The number of modes depends on the length of the input parameters. + + Args: + theta: The rotation angles. + + Returns: + The ``(A, b, c)`` triple of the rotation gates. + """ + theta = math.atleast_1d(theta, math.complex128) + n_modes = len(theta) + + A = math.astensor([[0, 1], [1, 0]], math.complex128) + A = np.kron(A, math.exp(1j * theta) * math.eye(n_modes, math.complex128)) + b = _vacuum_B_vector(n_modes * 2) + c = 1.0 + 0j + + return A, b, c + + +def displacement_gate_Abc( + x: Union[float, Iterable[float]], y: Union[float, Iterable[float]] = 0 +) -> Union[Matrix, Vector, Scalar]: + r""" + The ``(A, b, c)`` triple of a tensor product of displacement gates. + + The number of modes depends on the length of the input parameters. + + If one of the input parameters has length ``1``, it is tiled so that its length matches + that of the other one. For example, passing ``x=[1,2,3]`` and ``y=1`` is equivalent to + passing ``x=[1,2,3]`` and ``y=[1,1,1]``. + + Args: + x: The real parts of the displacements, in units of :math:`\sqrt{\hbar}`. + y: The imaginary parts of the displacements, in units of :math:`\sqrt{\hbar}`. + + Returns: + The ``(A, b, c)`` triple of the displacement gates. + """ + x, y = _reshape(x=x, y=y) + n_modes = len(x) + + A = _X_matrix_for_unitary(n_modes) + b = math.concat([x + 1j * y, -x + 1j * y], axis=0) + c = math.exp(-math.sum(x**2 + y**2) / 2) + + return A, b, c + + +def squeezing_gate_Abc( + r: Union[float, Iterable[float]], delta: Union[float, Iterable[float]] = 0 +) -> Union[Matrix, Vector, Scalar]: + r""" + The ``(A, b, c)`` triple of a tensor product of squeezing gates. + + The number of modes depends on the length of the input parameters. + + If one of the input parameters has length ``1``, it is tiled so that its length matches + that of the other one. For example, passing ``r=[1,2,3]`` and ``delta=1`` is equivalent to + passing ``r=[1,2,3]`` and ``delta=[1,1,1]``. + + Args: + r: The squeezing magnitudes. + delta: The squeezing angles. + + Returns: + The ``(A, b, c)`` triple of the squeezing gates. + """ + r, delta = _reshape(r=r, delta=delta) + n_modes = len(delta) + + tanhr = math.diag(math.sinh(r) / math.cosh(r)) + sechr = math.diag(1 / math.cosh(r)) + + A = math.block([[-math.exp(1j * delta) * tanhr, sechr], [sechr, math.exp(-1j * delta) * tanhr]]) + b = _vacuum_B_vector(n_modes * 2) + c = math.prod(1 / math.sqrt(math.cosh(r))) + + return A, b, c + + +def beamsplitter_gate_Abc( + theta: Union[float, Iterable[float]], phi: Union[float, Iterable[float]] = 0 +) -> Union[Matrix, Vector, Scalar]: + r""" + The ``(A, b, c)`` triple of a tensor product of two-mode beamsplitter gates. + + The number of modes depends on the length of the input parameters. + + If one of the input parameters has length ``1``, it is tiled so that its length matches + that of the other one. For example, passing ``theta=[1,2,3]`` and ``phi=1`` is equivalent to + passing ``theta=[1,2,3]`` and ``phi=[1,1,1]``. + + Args: + theta: The transmissivity parameters. + phi: The phase parameters. + + Returns: + The ``(A, b, c)`` triple of the beamsplitter gates. + """ + theta, phi = _reshape(theta=theta, phi=phi) + n_modes = 2 * len(theta) + + O_n = math.zeros((n_modes, n_modes), math.complex128) + costheta = math.diag(math.cos(theta)) + sintheta = math.diag(math.sin(theta)) + V = math.block( + [[costheta, -math.exp(-1j * phi) * sintheta], [math.exp(1j * phi) * sintheta, costheta]] + ) + + A = math.block([[O_n, V], [math.transpose(V), O_n]]) + b = _vacuum_B_vector(n_modes * 2) + c = 1.0 + 0j + + return A, b, c + + +# ~~~~~~~~~~ +# Channels +# ~~~~~~~~~~ + + +def attenuator_Abc(eta: Union[float, Iterable[float]]) -> Union[Matrix, Vector, Scalar]: + r""" + The ``(A, b, c)`` triple of of a tensor product of atternuators. + + The number of modes depends on the length of the input parameters. + + Args: + eta: The values of the transmissivities. + + Returns: + The ``(A, b, c)`` triple of the attenuator channels. + + Raises: + ValueError: If ``eta`` is larger than `1` or smaller than `0`. + """ + eta = math.atleast_1d(eta, math.complex128) + n_modes = len(eta) + + for e in eta: + if math.real(e) > 1 or math.real(e) < 0: + msg = "Transmissivity must be a float in the interval ``[0, 1]``" + raise ValueError(msg) + + O_n = math.zeros((n_modes, n_modes), math.complex128) + eta1 = math.diag(math.sqrt(eta)).reshape((n_modes, n_modes)).reshape((n_modes, n_modes)) + eta2 = math.eye(n_modes) - math.diag(eta).reshape((n_modes, n_modes)) + + A = math.block( + [ + [O_n, eta1, O_n, O_n], + [eta1, O_n, O_n, eta2], + [O_n, O_n, O_n, eta1], + [O_n, eta2, eta1, O_n], + ] + ) + reshape_list = _get_reshape_list_for_channel(n_modes) + + A = A[reshape_list, :][:, reshape_list] + b = _vacuum_B_vector(n_modes * 4) + c = 1.0 + 0j + + return A, b, c + + +def amplifier_Abc(g: Union[float, Iterable[float]]) -> Union[Matrix, Vector, Scalar]: + r""" + The ``(A, b, c)`` triple of a tensor product of amplifiers. + + The number of modes depends on the length of the input parameters. + + Args: + g: The values of the gains. + + Returns: + The ``(A, b, c)`` triple of the amplifier channels. + + Raises: + ValueError: If ``g`` is smaller than `1`. + """ + g = math.atleast_1d(g, math.complex128) + n_modes = len(g) + + for g_val in g: + if math.real(g_val) < 1: + msg = "Found amplifier with gain ``g`` smaller than `1`." + raise ValueError(msg) + + g = math.atleast_1d(g, math.complex128) + n_modes = len(g) + reshape_list = _get_reshape_list_for_channel(n_modes) + + O_n = math.zeros((n_modes, n_modes), math.complex128) + g1 = math.diag(math.astensor([1 / math.sqrt(g)])).reshape((n_modes, n_modes)) + g2 = math.diag(math.astensor([1 - 1 / g])).reshape((n_modes, n_modes)) + + A = math.block( + [ + [O_n, g1, g2, O_n], + [g1, O_n, O_n, O_n], + [g2, O_n, O_n, g1], + [O_n, O_n, g1, O_n], + ] + ) + A = A[reshape_list, :][:, reshape_list] + b = _vacuum_B_vector(n_modes * 4) + c = np.prod(1 / g) + + return A, b, c + + +def fock_damping_Abc(n_modes: int) -> Union[Matrix, Vector, Scalar]: + r""" + The ``(A, b, c)`` triple of a tensor product of Fock dampers. + + Args: + n_modes: The number of modes. + + Returns: + The ``(A, b, c)`` triple of the Fock damping channels. + """ + A = _X_matrix_for_unitary(n_modes * 2) + b = _vacuum_B_vector(n_modes * 4) + c = 1.0 + 0j + + return A, b, c diff --git a/poetry.lock b/poetry.lock index 9bab967b6..9c35ee667 100644 --- a/poetry.lock +++ b/poetry.lock @@ -37,31 +37,36 @@ files = [ ] [[package]] -name = "appdirs" -version = "1.4.4" -description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +name = "astroid" +version = "3.0.3" +description = "An abstract syntax tree for Python with inference support." optional = false -python-versions = "*" +python-versions = ">=3.8.0" files = [ - {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"}, - {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"}, + {file = "astroid-3.0.3-py3-none-any.whl", hash = "sha256:92fcf218b89f449cdf9f7b39a269f8d5d617b27be68434912e11e79203963a17"}, + {file = "astroid-3.0.3.tar.gz", hash = "sha256:4148645659b08b70d72460ed1921158027a9e53ae8b7234149b1400eddacbb93"}, ] +[package.dependencies] +typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.11\""} + [[package]] -name = "astroid" -version = "2.7.3" -description = "An abstract syntax tree for Python with inference support." +name = "asttokens" +version = "2.4.1" +description = "Annotate AST trees with source code positions" optional = false -python-versions = "~=3.6" +python-versions = "*" files = [ - {file = "astroid-2.7.3-py3-none-any.whl", hash = "sha256:dc1e8b28427d6bbef6b8842b18765ab58f558c42bb80540bd7648c98412af25e"}, - {file = "astroid-2.7.3.tar.gz", hash = "sha256:3b680ce0419b8a771aba6190139a3998d14b413852506d99aff8dc2bf65ee67c"}, + {file = "asttokens-2.4.1-py2.py3-none-any.whl", hash = "sha256:051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24"}, + {file = "asttokens-2.4.1.tar.gz", hash = "sha256:b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0"}, ] [package.dependencies] -lazy-object-proxy = ">=1.4.0" -setuptools = ">=20.0" -wrapt = ">=1.11,<1.13" +six = ">=1.12.0" + +[package.extras] +astroid = ["astroid (>=1,<2)", "astroid (>=2,<4)"] +test = ["astroid (>=1,<2)", "astroid (>=2,<4)", "pytest"] [[package]] name = "astunparse" @@ -113,33 +118,33 @@ dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"] [[package]] name = "black" -version = "24.1.1" +version = "24.2.0" description = "The uncompromising code formatter." optional = false python-versions = ">=3.8" files = [ - {file = "black-24.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2588021038bd5ada078de606f2a804cadd0a3cc6a79cb3e9bb3a8bf581325a4c"}, - {file = "black-24.1.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1a95915c98d6e32ca43809d46d932e2abc5f1f7d582ffbe65a5b4d1588af7445"}, - {file = "black-24.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fa6a0e965779c8f2afb286f9ef798df770ba2b6cee063c650b96adec22c056a"}, - {file = "black-24.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:5242ecd9e990aeb995b6d03dc3b2d112d4a78f2083e5a8e86d566340ae80fec4"}, - {file = "black-24.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:fc1ec9aa6f4d98d022101e015261c056ddebe3da6a8ccfc2c792cbe0349d48b7"}, - {file = "black-24.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0269dfdea12442022e88043d2910429bed717b2d04523867a85dacce535916b8"}, - {file = "black-24.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b3d64db762eae4a5ce04b6e3dd745dcca0fb9560eb931a5be97472e38652a161"}, - {file = "black-24.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:5d7b06ea8816cbd4becfe5f70accae953c53c0e53aa98730ceccb0395520ee5d"}, - {file = "black-24.1.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e2c8dfa14677f90d976f68e0c923947ae68fa3961d61ee30976c388adc0b02c8"}, - {file = "black-24.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a21725862d0e855ae05da1dd25e3825ed712eaaccef6b03017fe0853a01aa45e"}, - {file = "black-24.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07204d078e25327aad9ed2c64790d681238686bce254c910de640c7cc4fc3aa6"}, - {file = "black-24.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:a83fe522d9698d8f9a101b860b1ee154c1d25f8a82ceb807d319f085b2627c5b"}, - {file = "black-24.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:08b34e85170d368c37ca7bf81cf67ac863c9d1963b2c1780c39102187ec8dd62"}, - {file = "black-24.1.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7258c27115c1e3b5de9ac6c4f9957e3ee2c02c0b39222a24dc7aa03ba0e986f5"}, - {file = "black-24.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40657e1b78212d582a0edecafef133cf1dd02e6677f539b669db4746150d38f6"}, - {file = "black-24.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:e298d588744efda02379521a19639ebcd314fba7a49be22136204d7ed1782717"}, - {file = "black-24.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:34afe9da5056aa123b8bfda1664bfe6fb4e9c6f311d8e4a6eb089da9a9173bf9"}, - {file = "black-24.1.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:854c06fb86fd854140f37fb24dbf10621f5dab9e3b0c29a690ba595e3d543024"}, - {file = "black-24.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3897ae5a21ca132efa219c029cce5e6bfc9c3d34ed7e892113d199c0b1b444a2"}, - {file = "black-24.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:ecba2a15dfb2d97105be74bbfe5128bc5e9fa8477d8c46766505c1dda5883aac"}, - {file = "black-24.1.1-py3-none-any.whl", hash = "sha256:5cdc2e2195212208fbcae579b931407c1fa9997584f0a415421748aeafff1168"}, - {file = "black-24.1.1.tar.gz", hash = "sha256:48b5760dcbfe5cf97fd4fba23946681f3a81514c6ab8a45b50da67ac8fbc6c7b"}, + {file = "black-24.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6981eae48b3b33399c8757036c7f5d48a535b962a7c2310d19361edeef64ce29"}, + {file = "black-24.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d533d5e3259720fdbc1b37444491b024003e012c5173f7d06825a77508085430"}, + {file = "black-24.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:61a0391772490ddfb8a693c067df1ef5227257e72b0e4108482b8d41b5aee13f"}, + {file = "black-24.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:992e451b04667116680cb88f63449267c13e1ad134f30087dec8527242e9862a"}, + {file = "black-24.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:163baf4ef40e6897a2a9b83890e59141cc8c2a98f2dda5080dc15c00ee1e62cd"}, + {file = "black-24.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e37c99f89929af50ffaf912454b3e3b47fd64109659026b678c091a4cd450fb2"}, + {file = "black-24.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f9de21bafcba9683853f6c96c2d515e364aee631b178eaa5145fc1c61a3cc92"}, + {file = "black-24.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:9db528bccb9e8e20c08e716b3b09c6bdd64da0dd129b11e160bf082d4642ac23"}, + {file = "black-24.2.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d84f29eb3ee44859052073b7636533ec995bd0f64e2fb43aeceefc70090e752b"}, + {file = "black-24.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1e08fb9a15c914b81dd734ddd7fb10513016e5ce7e6704bdd5e1251ceee51ac9"}, + {file = "black-24.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:810d445ae6069ce64030c78ff6127cd9cd178a9ac3361435708b907d8a04c693"}, + {file = "black-24.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:ba15742a13de85e9b8f3239c8f807723991fbfae24bad92d34a2b12e81904982"}, + {file = "black-24.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7e53a8c630f71db01b28cd9602a1ada68c937cbf2c333e6ed041390d6968faf4"}, + {file = "black-24.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:93601c2deb321b4bad8f95df408e3fb3943d85012dddb6121336b8e24a0d1218"}, + {file = "black-24.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0057f800de6acc4407fe75bb147b0c2b5cbb7c3ed110d3e5999cd01184d53b0"}, + {file = "black-24.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:faf2ee02e6612577ba0181f4347bcbcf591eb122f7841ae5ba233d12c39dcb4d"}, + {file = "black-24.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:057c3dc602eaa6fdc451069bd027a1b2635028b575a6c3acfd63193ced20d9c8"}, + {file = "black-24.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:08654d0797e65f2423f850fc8e16a0ce50925f9337fb4a4a176a7aa4026e63f8"}, + {file = "black-24.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca610d29415ee1a30a3f30fab7a8f4144e9d34c89a235d81292a1edb2b55f540"}, + {file = "black-24.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:4dd76e9468d5536abd40ffbc7a247f83b2324f0c050556d9c371c2b9a9a95e31"}, + {file = "black-24.2.0-py3-none-any.whl", hash = "sha256:e8a6ae970537e67830776488bca52000eaa37fa63b9988e8c487458d9cd5ace6"}, + {file = "black-24.2.0.tar.gz", hash = "sha256:bce4f25c27c3435e4dace4815bcb2008b87e167e3bf4ee47ccdc5ce906eb4894"}, ] [package.dependencies] @@ -393,63 +398,63 @@ test-no-images = ["pytest", "pytest-cov", "pytest-xdist", "wurlitzer"] [[package]] name = "coverage" -version = "7.4.1" +version = "7.4.2" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.8" files = [ - {file = "coverage-7.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:077d366e724f24fc02dbfe9d946534357fda71af9764ff99d73c3c596001bbd7"}, - {file = "coverage-7.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0193657651f5399d433c92f8ae264aff31fc1d066deee4b831549526433f3f61"}, - {file = "coverage-7.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d17bbc946f52ca67adf72a5ee783cd7cd3477f8f8796f59b4974a9b59cacc9ee"}, - {file = "coverage-7.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a3277f5fa7483c927fe3a7b017b39351610265308f5267ac6d4c2b64cc1d8d25"}, - {file = "coverage-7.4.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6dceb61d40cbfcf45f51e59933c784a50846dc03211054bd76b421a713dcdf19"}, - {file = "coverage-7.4.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6008adeca04a445ea6ef31b2cbaf1d01d02986047606f7da266629afee982630"}, - {file = "coverage-7.4.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:c61f66d93d712f6e03369b6a7769233bfda880b12f417eefdd4f16d1deb2fc4c"}, - {file = "coverage-7.4.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b9bb62fac84d5f2ff523304e59e5c439955fb3b7f44e3d7b2085184db74d733b"}, - {file = "coverage-7.4.1-cp310-cp310-win32.whl", hash = "sha256:f86f368e1c7ce897bf2457b9eb61169a44e2ef797099fb5728482b8d69f3f016"}, - {file = "coverage-7.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:869b5046d41abfea3e381dd143407b0d29b8282a904a19cb908fa24d090cc018"}, - {file = "coverage-7.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b8ffb498a83d7e0305968289441914154fb0ef5d8b3157df02a90c6695978295"}, - {file = "coverage-7.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3cacfaefe6089d477264001f90f55b7881ba615953414999c46cc9713ff93c8c"}, - {file = "coverage-7.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d6850e6e36e332d5511a48a251790ddc545e16e8beaf046c03985c69ccb2676"}, - {file = "coverage-7.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18e961aa13b6d47f758cc5879383d27b5b3f3dcd9ce8cdbfdc2571fe86feb4dd"}, - {file = "coverage-7.4.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dfd1e1b9f0898817babf840b77ce9fe655ecbe8b1b327983df485b30df8cc011"}, - {file = "coverage-7.4.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6b00e21f86598b6330f0019b40fb397e705135040dbedc2ca9a93c7441178e74"}, - {file = "coverage-7.4.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:536d609c6963c50055bab766d9951b6c394759190d03311f3e9fcf194ca909e1"}, - {file = "coverage-7.4.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7ac8f8eb153724f84885a1374999b7e45734bf93a87d8df1e7ce2146860edef6"}, - {file = "coverage-7.4.1-cp311-cp311-win32.whl", hash = "sha256:f3771b23bb3675a06f5d885c3630b1d01ea6cac9e84a01aaf5508706dba546c5"}, - {file = "coverage-7.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:9d2f9d4cc2a53b38cabc2d6d80f7f9b7e3da26b2f53d48f05876fef7956b6968"}, - {file = "coverage-7.4.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f68ef3660677e6624c8cace943e4765545f8191313a07288a53d3da188bd8581"}, - {file = "coverage-7.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:23b27b8a698e749b61809fb637eb98ebf0e505710ec46a8aa6f1be7dc0dc43a6"}, - {file = "coverage-7.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e3424c554391dc9ef4a92ad28665756566a28fecf47308f91841f6c49288e66"}, - {file = "coverage-7.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e0860a348bf7004c812c8368d1fc7f77fe8e4c095d661a579196a9533778e156"}, - {file = "coverage-7.4.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe558371c1bdf3b8fa03e097c523fb9645b8730399c14fe7721ee9c9e2a545d3"}, - {file = "coverage-7.4.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3468cc8720402af37b6c6e7e2a9cdb9f6c16c728638a2ebc768ba1ef6f26c3a1"}, - {file = "coverage-7.4.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:02f2edb575d62172aa28fe00efe821ae31f25dc3d589055b3fb64d51e52e4ab1"}, - {file = "coverage-7.4.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ca6e61dc52f601d1d224526360cdeab0d0712ec104a2ce6cc5ccef6ed9a233bc"}, - {file = "coverage-7.4.1-cp312-cp312-win32.whl", hash = "sha256:ca7b26a5e456a843b9b6683eada193fc1f65c761b3a473941efe5a291f604c74"}, - {file = "coverage-7.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:85ccc5fa54c2ed64bd91ed3b4a627b9cce04646a659512a051fa82a92c04a448"}, - {file = "coverage-7.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8bdb0285a0202888d19ec6b6d23d5990410decb932b709f2b0dfe216d031d218"}, - {file = "coverage-7.4.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:918440dea04521f499721c039863ef95433314b1db00ff826a02580c1f503e45"}, - {file = "coverage-7.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:379d4c7abad5afbe9d88cc31ea8ca262296480a86af945b08214eb1a556a3e4d"}, - {file = "coverage-7.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b094116f0b6155e36a304ff912f89bbb5067157aff5f94060ff20bbabdc8da06"}, - {file = "coverage-7.4.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2f5968608b1fe2a1d00d01ad1017ee27efd99b3437e08b83ded9b7af3f6f766"}, - {file = "coverage-7.4.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:10e88e7f41e6197ea0429ae18f21ff521d4f4490aa33048f6c6f94c6045a6a75"}, - {file = "coverage-7.4.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a4a3907011d39dbc3e37bdc5df0a8c93853c369039b59efa33a7b6669de04c60"}, - {file = "coverage-7.4.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6d224f0c4c9c98290a6990259073f496fcec1b5cc613eecbd22786d398ded3ad"}, - {file = "coverage-7.4.1-cp38-cp38-win32.whl", hash = "sha256:23f5881362dcb0e1a92b84b3c2809bdc90db892332daab81ad8f642d8ed55042"}, - {file = "coverage-7.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:a07f61fc452c43cd5328b392e52555f7d1952400a1ad09086c4a8addccbd138d"}, - {file = "coverage-7.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8e738a492b6221f8dcf281b67129510835461132b03024830ac0e554311a5c54"}, - {file = "coverage-7.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:46342fed0fff72efcda77040b14728049200cbba1279e0bf1188f1f2078c1d70"}, - {file = "coverage-7.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9641e21670c68c7e57d2053ddf6c443e4f0a6e18e547e86af3fad0795414a628"}, - {file = "coverage-7.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aeb2c2688ed93b027eb0d26aa188ada34acb22dceea256d76390eea135083950"}, - {file = "coverage-7.4.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d12c923757de24e4e2110cf8832d83a886a4cf215c6e61ed506006872b43a6d1"}, - {file = "coverage-7.4.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0491275c3b9971cdbd28a4595c2cb5838f08036bca31765bad5e17edf900b2c7"}, - {file = "coverage-7.4.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:8dfc5e195bbef80aabd81596ef52a1277ee7143fe419efc3c4d8ba2754671756"}, - {file = "coverage-7.4.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1a78b656a4d12b0490ca72651fe4d9f5e07e3c6461063a9b6265ee45eb2bdd35"}, - {file = "coverage-7.4.1-cp39-cp39-win32.whl", hash = "sha256:f90515974b39f4dea2f27c0959688621b46d96d5a626cf9c53dbc653a895c05c"}, - {file = "coverage-7.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:64e723ca82a84053dd7bfcc986bdb34af8d9da83c521c19d6b472bc6880e191a"}, - {file = "coverage-7.4.1-pp38.pp39.pp310-none-any.whl", hash = "sha256:32a8d985462e37cfdab611a6f95b09d7c091d07668fdc26e47a725ee575fe166"}, - {file = "coverage-7.4.1.tar.gz", hash = "sha256:1ed4b95480952b1a26d863e546fa5094564aa0065e1e5f0d4d0041f293251d04"}, + {file = "coverage-7.4.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bf54c3e089179d9d23900e3efc86d46e4431188d9a657f345410eecdd0151f50"}, + {file = "coverage-7.4.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fe6e43c8b510719b48af7db9631b5fbac910ade4bd90e6378c85ac5ac706382c"}, + {file = "coverage-7.4.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b98c89db1b150d851a7840142d60d01d07677a18f0f46836e691c38134ed18b"}, + {file = "coverage-7.4.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c5f9683be6a5b19cd776ee4e2f2ffb411424819c69afab6b2db3a0a364ec6642"}, + {file = "coverage-7.4.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78cdcbf7b9cb83fe047ee09298e25b1cd1636824067166dc97ad0543b079d22f"}, + {file = "coverage-7.4.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:2599972b21911111114100d362aea9e70a88b258400672626efa2b9e2179609c"}, + {file = "coverage-7.4.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ef00d31b7569ed3cb2036f26565f1984b9fc08541731ce01012b02a4c238bf03"}, + {file = "coverage-7.4.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:20a875bfd8c282985c4720c32aa05056f77a68e6d8bbc5fe8632c5860ee0b49b"}, + {file = "coverage-7.4.2-cp310-cp310-win32.whl", hash = "sha256:b3f2b1eb229f23c82898eedfc3296137cf1f16bb145ceab3edfd17cbde273fb7"}, + {file = "coverage-7.4.2-cp310-cp310-win_amd64.whl", hash = "sha256:7df95fdd1432a5d2675ce630fef5f239939e2b3610fe2f2b5bf21fa505256fa3"}, + {file = "coverage-7.4.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a8ddbd158e069dded57738ea69b9744525181e99974c899b39f75b2b29a624e2"}, + {file = "coverage-7.4.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:81a5fb41b0d24447a47543b749adc34d45a2cf77b48ca74e5bf3de60a7bd9edc"}, + {file = "coverage-7.4.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2412e98e70f16243be41d20836abd5f3f32edef07cbf8f407f1b6e1ceae783ac"}, + {file = "coverage-7.4.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ddb79414c15c6f03f56cc68fa06994f047cf20207c31b5dad3f6bab54a0f66ef"}, + {file = "coverage-7.4.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf89ab85027427d351f1de918aff4b43f4eb5f33aff6835ed30322a86ac29c9e"}, + {file = "coverage-7.4.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a178b7b1ac0f1530bb28d2e51f88c0bab3e5949835851a60dda80bff6052510c"}, + {file = "coverage-7.4.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:06fe398145a2e91edaf1ab4eee66149c6776c6b25b136f4a86fcbbb09512fd10"}, + {file = "coverage-7.4.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:18cac867950943fe93d6cd56a67eb7dcd2d4a781a40f4c1e25d6f1ed98721a55"}, + {file = "coverage-7.4.2-cp311-cp311-win32.whl", hash = "sha256:f72cdd2586f9a769570d4b5714a3837b3a59a53b096bb954f1811f6a0afad305"}, + {file = "coverage-7.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:d779a48fac416387dd5673fc5b2d6bd903ed903faaa3247dc1865c65eaa5a93e"}, + {file = "coverage-7.4.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:adbdfcda2469d188d79771d5696dc54fab98a16d2ef7e0875013b5f56a251047"}, + {file = "coverage-7.4.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ac4bab32f396b03ebecfcf2971668da9275b3bb5f81b3b6ba96622f4ef3f6e17"}, + {file = "coverage-7.4.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:006d220ba2e1a45f1de083d5022d4955abb0aedd78904cd5a779b955b019ec73"}, + {file = "coverage-7.4.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3733545eb294e5ad274abe131d1e7e7de4ba17a144505c12feca48803fea5f64"}, + {file = "coverage-7.4.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42a9e754aa250fe61f0f99986399cec086d7e7a01dd82fd863a20af34cbce962"}, + {file = "coverage-7.4.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:2ed37e16cf35c8d6e0b430254574b8edd242a367a1b1531bd1adc99c6a5e00fe"}, + {file = "coverage-7.4.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:b953275d4edfab6cc0ed7139fa773dfb89e81fee1569a932f6020ce7c6da0e8f"}, + {file = "coverage-7.4.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:32b4ab7e6c924f945cbae5392832e93e4ceb81483fd6dc4aa8fb1a97b9d3e0e1"}, + {file = "coverage-7.4.2-cp312-cp312-win32.whl", hash = "sha256:f5df76c58977bc35a49515b2fbba84a1d952ff0ec784a4070334dfbec28a2def"}, + {file = "coverage-7.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:34423abbaad70fea9d0164add189eabaea679068ebdf693baa5c02d03e7db244"}, + {file = "coverage-7.4.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5b11f9c6587668e495cc7365f85c93bed34c3a81f9f08b0920b87a89acc13469"}, + {file = "coverage-7.4.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:51593a1f05c39332f623d64d910445fdec3d2ac2d96b37ce7f331882d5678ddf"}, + {file = "coverage-7.4.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69f1665165ba2fe7614e2f0c1aed71e14d83510bf67e2ee13df467d1c08bf1e8"}, + {file = "coverage-7.4.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3c8bbb95a699c80a167478478efe5e09ad31680931ec280bf2087905e3b95ec"}, + {file = "coverage-7.4.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:175f56572f25e1e1201d2b3e07b71ca4d201bf0b9cb8fad3f1dfae6a4188de86"}, + {file = "coverage-7.4.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8562ca91e8c40864942615b1d0b12289d3e745e6b2da901d133f52f2d510a1e3"}, + {file = "coverage-7.4.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:d9a1ef0f173e1a19738f154fb3644f90d0ada56fe6c9b422f992b04266c55d5a"}, + {file = "coverage-7.4.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f40ac873045db4fd98a6f40387d242bde2708a3f8167bd967ccd43ad46394ba2"}, + {file = "coverage-7.4.2-cp38-cp38-win32.whl", hash = "sha256:d1b750a8409bec61caa7824bfd64a8074b6d2d420433f64c161a8335796c7c6b"}, + {file = "coverage-7.4.2-cp38-cp38-win_amd64.whl", hash = "sha256:b4ae777bebaed89e3a7e80c4a03fac434a98a8abb5251b2a957d38fe3fd30088"}, + {file = "coverage-7.4.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3ff7f92ae5a456101ca8f48387fd3c56eb96353588e686286f50633a611afc95"}, + {file = "coverage-7.4.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:861d75402269ffda0b33af94694b8e0703563116b04c681b1832903fac8fd647"}, + {file = "coverage-7.4.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3507427d83fa961cbd73f11140f4a5ce84208d31756f7238d6257b2d3d868405"}, + {file = "coverage-7.4.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bf711d517e21fb5bc429f5c4308fbc430a8585ff2a43e88540264ae87871e36a"}, + {file = "coverage-7.4.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c00e54f0bd258ab25e7f731ca1d5144b0bf7bec0051abccd2bdcff65fa3262c9"}, + {file = "coverage-7.4.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f8e845d894e39fb53834da826078f6dc1a933b32b1478cf437007367efaf6f6a"}, + {file = "coverage-7.4.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:840456cb1067dc350af9080298c7c2cfdddcedc1cb1e0b30dceecdaf7be1a2d3"}, + {file = "coverage-7.4.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c11ca2df2206a4e3e4c4567f52594637392ed05d7c7fb73b4ea1c658ba560265"}, + {file = "coverage-7.4.2-cp39-cp39-win32.whl", hash = "sha256:3ff5bdb08d8938d336ce4088ca1a1e4b6c8cd3bef8bb3a4c0eb2f37406e49643"}, + {file = "coverage-7.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:ac9e95cefcf044c98d4e2c829cd0669918585755dd9a92e28a1a7012322d0a95"}, + {file = "coverage-7.4.2-pp38.pp39.pp310-none-any.whl", hash = "sha256:f593a4a90118d99014517c2679e04a4ef5aee2d81aa05c26c734d271065efcb6"}, + {file = "coverage-7.4.2.tar.gz", hash = "sha256:1a5ee18e3a8d766075ce9314ed1cb695414bae67df6a4b0805f5137d93d6f1cb"}, ] [package.dependencies] @@ -475,13 +480,13 @@ tests = ["pytest", "pytest-cov", "pytest-xdist"] [[package]] name = "dask" -version = "2024.1.1" +version = "2024.2.1" description = "Parallel PyData with Task Scheduling" optional = false python-versions = ">=3.9" files = [ - {file = "dask-2024.1.1-py3-none-any.whl", hash = "sha256:860ce2797905095beff0187c214840b80c77d752dcb9098a8283e3655a762bf5"}, - {file = "dask-2024.1.1.tar.gz", hash = "sha256:d0dc92e81ce68594a0a0ce23ba33f4d648f2c2f4217ab9b79068b7ecfb0416c7"}, + {file = "dask-2024.2.1-py3-none-any.whl", hash = "sha256:a13fcdeead3bab3576495023f83097adcffe2f03c371c241b5a1f0b232b35b38"}, + {file = "dask-2024.2.1.tar.gz", hash = "sha256:9504a1e9f5d8e5403fae931f9f1660d41f510f48895ccefce856ec6a4c2198d8"}, ] [package.dependencies] @@ -499,7 +504,7 @@ array = ["numpy (>=1.21)"] complete = ["dask[array,dataframe,diagnostics,distributed]", "lz4 (>=4.3.2)", "pyarrow (>=7.0)", "pyarrow-hotfix"] dataframe = ["dask[array]", "pandas (>=1.3)"] diagnostics = ["bokeh (>=2.4.2)", "jinja2 (>=2.10.3)"] -distributed = ["distributed (==2024.1.1)"] +distributed = ["distributed (==2024.2.1)"] test = ["pandas[test]", "pre-commit", "pytest", "pytest-cov", "pytest-rerunfailures", "pytest-timeout", "pytest-xdist"] [[package]] @@ -513,6 +518,21 @@ files = [ {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, ] +[[package]] +name = "dill" +version = "0.3.8" +description = "serialize all of Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "dill-0.3.8-py3-none-any.whl", hash = "sha256:c36ca9ffb54365bdd2f8eb3eff7d2a21237f8452b57ace88b1ac615b7e815bd7"}, + {file = "dill-0.3.8.tar.gz", hash = "sha256:3ebe3c479ad625c4553aca177444d89b486b1d84982eeacded644afc0cf797ca"}, +] + +[package.extras] +graph = ["objgraph (>=1.7.2)"] +profile = ["gprof2dot (>=2022.7.29)"] + [[package]] name = "dm-tree" version = "0.1.8" @@ -586,6 +606,20 @@ files = [ [package.extras] test = ["pytest (>=6)"] +[[package]] +name = "executing" +version = "2.0.1" +description = "Get the currently executing AST node of a frame, and other information" +optional = false +python-versions = ">=3.5" +files = [ + {file = "executing-2.0.1-py2.py3-none-any.whl", hash = "sha256:eac49ca94516ccc753f9fb5ce82603156e590b27525a8bc32cce8ae302eb61bc"}, + {file = "executing-2.0.1.tar.gz", hash = "sha256:35afe2ce3affba8ee97f2d69927fa823b08b472b7b994e36a52a964b93d16147"}, +] + +[package.extras] +tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich"] + [[package]] name = "filelock" version = "3.13.1" @@ -615,60 +649,60 @@ files = [ [[package]] name = "fonttools" -version = "4.47.2" +version = "4.49.0" description = "Tools to manipulate font files" optional = false python-versions = ">=3.8" files = [ - {file = "fonttools-4.47.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3b629108351d25512d4ea1a8393a2dba325b7b7d7308116b605ea3f8e1be88df"}, - {file = "fonttools-4.47.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c19044256c44fe299d9a73456aabee4b4d06c6b930287be93b533b4737d70aa1"}, - {file = "fonttools-4.47.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8be28c036b9f186e8c7eaf8a11b42373e7e4949f9e9f370202b9da4c4c3f56c"}, - {file = "fonttools-4.47.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f83a4daef6d2a202acb9bf572958f91cfde5b10c8ee7fb1d09a4c81e5d851fd8"}, - {file = "fonttools-4.47.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4a5a5318ba5365d992666ac4fe35365f93004109d18858a3e18ae46f67907670"}, - {file = "fonttools-4.47.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8f57ecd742545362a0f7186774b2d1c53423ed9ece67689c93a1055b236f638c"}, - {file = "fonttools-4.47.2-cp310-cp310-win32.whl", hash = "sha256:a1c154bb85dc9a4cf145250c88d112d88eb414bad81d4cb524d06258dea1bdc0"}, - {file = "fonttools-4.47.2-cp310-cp310-win_amd64.whl", hash = "sha256:3e2b95dce2ead58fb12524d0ca7d63a63459dd489e7e5838c3cd53557f8933e1"}, - {file = "fonttools-4.47.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:29495d6d109cdbabe73cfb6f419ce67080c3ef9ea1e08d5750240fd4b0c4763b"}, - {file = "fonttools-4.47.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0a1d313a415eaaba2b35d6cd33536560deeebd2ed758b9bfb89ab5d97dc5deac"}, - {file = "fonttools-4.47.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:90f898cdd67f52f18049250a6474185ef6544c91f27a7bee70d87d77a8daf89c"}, - {file = "fonttools-4.47.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3480eeb52770ff75140fe7d9a2ec33fb67b07efea0ab5129c7e0c6a639c40c70"}, - {file = "fonttools-4.47.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0255dbc128fee75fb9be364806b940ed450dd6838672a150d501ee86523ac61e"}, - {file = "fonttools-4.47.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f791446ff297fd5f1e2247c188de53c1bfb9dd7f0549eba55b73a3c2087a2703"}, - {file = "fonttools-4.47.2-cp311-cp311-win32.whl", hash = "sha256:740947906590a878a4bde7dd748e85fefa4d470a268b964748403b3ab2aeed6c"}, - {file = "fonttools-4.47.2-cp311-cp311-win_amd64.whl", hash = "sha256:63fbed184979f09a65aa9c88b395ca539c94287ba3a364517698462e13e457c9"}, - {file = "fonttools-4.47.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:4ec558c543609e71b2275c4894e93493f65d2f41c15fe1d089080c1d0bb4d635"}, - {file = "fonttools-4.47.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e040f905d542362e07e72e03612a6270c33d38281fd573160e1003e43718d68d"}, - {file = "fonttools-4.47.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6dd58cc03016b281bd2c74c84cdaa6bd3ce54c5a7f47478b7657b930ac3ed8eb"}, - {file = "fonttools-4.47.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32ab2e9702dff0dd4510c7bb958f265a8d3dd5c0e2547e7b5f7a3df4979abb07"}, - {file = "fonttools-4.47.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3a808f3c1d1df1f5bf39be869b6e0c263570cdafb5bdb2df66087733f566ea71"}, - {file = "fonttools-4.47.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ac71e2e201df041a2891067dc36256755b1229ae167edbdc419b16da78732c2f"}, - {file = "fonttools-4.47.2-cp312-cp312-win32.whl", hash = "sha256:69731e8bea0578b3c28fdb43dbf95b9386e2d49a399e9a4ad736b8e479b08085"}, - {file = "fonttools-4.47.2-cp312-cp312-win_amd64.whl", hash = "sha256:b3e1304e5f19ca861d86a72218ecce68f391646d85c851742d265787f55457a4"}, - {file = "fonttools-4.47.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:254d9a6f7be00212bf0c3159e0a420eb19c63793b2c05e049eb337f3023c5ecc"}, - {file = "fonttools-4.47.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:eabae77a07c41ae0b35184894202305c3ad211a93b2eb53837c2a1143c8bc952"}, - {file = "fonttools-4.47.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a86a5ab2873ed2575d0fcdf1828143cfc6b977ac448e3dc616bb1e3d20efbafa"}, - {file = "fonttools-4.47.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13819db8445a0cec8c3ff5f243af6418ab19175072a9a92f6cc8ca7d1452754b"}, - {file = "fonttools-4.47.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:4e743935139aa485fe3253fc33fe467eab6ea42583fa681223ea3f1a93dd01e6"}, - {file = "fonttools-4.47.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d49ce3ea7b7173faebc5664872243b40cf88814ca3eb135c4a3cdff66af71946"}, - {file = "fonttools-4.47.2-cp38-cp38-win32.whl", hash = "sha256:94208ea750e3f96e267f394d5588579bb64cc628e321dbb1d4243ffbc291b18b"}, - {file = "fonttools-4.47.2-cp38-cp38-win_amd64.whl", hash = "sha256:0f750037e02beb8b3569fbff701a572e62a685d2a0e840d75816592280e5feae"}, - {file = "fonttools-4.47.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3d71606c9321f6701642bd4746f99b6089e53d7e9817fc6b964e90d9c5f0ecc6"}, - {file = "fonttools-4.47.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:86e0427864c6c91cf77f16d1fb9bf1bbf7453e824589e8fb8461b6ee1144f506"}, - {file = "fonttools-4.47.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a00bd0e68e88987dcc047ea31c26d40a3c61185153b03457956a87e39d43c37"}, - {file = "fonttools-4.47.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a5d77479fb885ef38a16a253a2f4096bc3d14e63a56d6246bfdb56365a12b20c"}, - {file = "fonttools-4.47.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5465df494f20a7d01712b072ae3ee9ad2887004701b95cb2cc6dcb9c2c97a899"}, - {file = "fonttools-4.47.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4c811d3c73b6abac275babb8aa439206288f56fdb2c6f8835e3d7b70de8937a7"}, - {file = "fonttools-4.47.2-cp39-cp39-win32.whl", hash = "sha256:5b60e3afa9635e3dfd3ace2757039593e3bd3cf128be0ddb7a1ff4ac45fa5a50"}, - {file = "fonttools-4.47.2-cp39-cp39-win_amd64.whl", hash = "sha256:7ee48bd9d6b7e8f66866c9090807e3a4a56cf43ffad48962725a190e0dd774c8"}, - {file = "fonttools-4.47.2-py3-none-any.whl", hash = "sha256:7eb7ad665258fba68fd22228a09f347469d95a97fb88198e133595947a20a184"}, - {file = "fonttools-4.47.2.tar.gz", hash = "sha256:7df26dd3650e98ca45f1e29883c96a0b9f5bb6af8d632a6a108bc744fa0bd9b3"}, -] - -[package.extras] -all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0,<5)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "pycairo", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0)", "xattr", "zopfli (>=0.1.4)"] + {file = "fonttools-4.49.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d970ecca0aac90d399e458f0b7a8a597e08f95de021f17785fb68e2dc0b99717"}, + {file = "fonttools-4.49.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ac9a745b7609f489faa65e1dc842168c18530874a5f5b742ac3dd79e26bca8bc"}, + {file = "fonttools-4.49.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ba0e00620ca28d4ca11fc700806fd69144b463aa3275e1b36e56c7c09915559"}, + {file = "fonttools-4.49.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdee3ab220283057e7840d5fb768ad4c2ebe65bdba6f75d5d7bf47f4e0ed7d29"}, + {file = "fonttools-4.49.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ce7033cb61f2bb65d8849658d3786188afd80f53dad8366a7232654804529532"}, + {file = "fonttools-4.49.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:07bc5ea02bb7bc3aa40a1eb0481ce20e8d9b9642a9536cde0218290dd6085828"}, + {file = "fonttools-4.49.0-cp310-cp310-win32.whl", hash = "sha256:86eef6aab7fd7c6c8545f3ebd00fd1d6729ca1f63b0cb4d621bccb7d1d1c852b"}, + {file = "fonttools-4.49.0-cp310-cp310-win_amd64.whl", hash = "sha256:1fac1b7eebfce75ea663e860e7c5b4a8831b858c17acd68263bc156125201abf"}, + {file = "fonttools-4.49.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:edc0cce355984bb3c1d1e89d6a661934d39586bb32191ebff98c600f8957c63e"}, + {file = "fonttools-4.49.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:83a0d9336de2cba86d886507dd6e0153df333ac787377325a39a2797ec529814"}, + {file = "fonttools-4.49.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:36c8865bdb5cfeec88f5028e7e592370a0657b676c6f1d84a2108e0564f90e22"}, + {file = "fonttools-4.49.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33037d9e56e2562c710c8954d0f20d25b8386b397250d65581e544edc9d6b942"}, + {file = "fonttools-4.49.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8fb022d799b96df3eaa27263e9eea306bd3d437cc9aa981820850281a02b6c9a"}, + {file = "fonttools-4.49.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:33c584c0ef7dc54f5dd4f84082eabd8d09d1871a3d8ca2986b0c0c98165f8e86"}, + {file = "fonttools-4.49.0-cp311-cp311-win32.whl", hash = "sha256:cbe61b158deb09cffdd8540dc4a948d6e8f4d5b4f3bf5cd7db09bd6a61fee64e"}, + {file = "fonttools-4.49.0-cp311-cp311-win_amd64.whl", hash = "sha256:fc11e5114f3f978d0cea7e9853627935b30d451742eeb4239a81a677bdee6bf6"}, + {file = "fonttools-4.49.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:d647a0e697e5daa98c87993726da8281c7233d9d4ffe410812a4896c7c57c075"}, + {file = "fonttools-4.49.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f3bbe672df03563d1f3a691ae531f2e31f84061724c319652039e5a70927167e"}, + {file = "fonttools-4.49.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bebd91041dda0d511b0d303180ed36e31f4f54b106b1259b69fade68413aa7ff"}, + {file = "fonttools-4.49.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4145f91531fd43c50f9eb893faa08399816bb0b13c425667c48475c9f3a2b9b5"}, + {file = "fonttools-4.49.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ea329dafb9670ffbdf4dbc3b0e5c264104abcd8441d56de77f06967f032943cb"}, + {file = "fonttools-4.49.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:c076a9e548521ecc13d944b1d261ff3d7825048c338722a4bd126d22316087b7"}, + {file = "fonttools-4.49.0-cp312-cp312-win32.whl", hash = "sha256:b607ea1e96768d13be26d2b400d10d3ebd1456343eb5eaddd2f47d1c4bd00880"}, + {file = "fonttools-4.49.0-cp312-cp312-win_amd64.whl", hash = "sha256:a974c49a981e187381b9cc2c07c6b902d0079b88ff01aed34695ec5360767034"}, + {file = "fonttools-4.49.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:b85ec0bdd7bdaa5c1946398cbb541e90a6dfc51df76dfa88e0aaa41b335940cb"}, + {file = "fonttools-4.49.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:af20acbe198a8a790618ee42db192eb128afcdcc4e96d99993aca0b60d1faeb4"}, + {file = "fonttools-4.49.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d418b1fee41a1d14931f7ab4b92dc0bc323b490e41d7a333eec82c9f1780c75"}, + {file = "fonttools-4.49.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b44a52b8e6244b6548851b03b2b377a9702b88ddc21dcaf56a15a0393d425cb9"}, + {file = "fonttools-4.49.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:7c7125068e04a70739dad11857a4d47626f2b0bd54de39e8622e89701836eabd"}, + {file = "fonttools-4.49.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:29e89d0e1a7f18bc30f197cfadcbef5a13d99806447c7e245f5667579a808036"}, + {file = "fonttools-4.49.0-cp38-cp38-win32.whl", hash = "sha256:9d95fa0d22bf4f12d2fb7b07a46070cdfc19ef5a7b1c98bc172bfab5bf0d6844"}, + {file = "fonttools-4.49.0-cp38-cp38-win_amd64.whl", hash = "sha256:768947008b4dc552d02772e5ebd49e71430a466e2373008ce905f953afea755a"}, + {file = "fonttools-4.49.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:08877e355d3dde1c11973bb58d4acad1981e6d1140711230a4bfb40b2b937ccc"}, + {file = "fonttools-4.49.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fdb54b076f25d6b0f0298dc706acee5052de20c83530fa165b60d1f2e9cbe3cb"}, + {file = "fonttools-4.49.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0af65c720520710cc01c293f9c70bd69684365c6015cc3671db2b7d807fe51f2"}, + {file = "fonttools-4.49.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f255ce8ed7556658f6d23f6afd22a6d9bbc3edb9b96c96682124dc487e1bf42"}, + {file = "fonttools-4.49.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d00af0884c0e65f60dfaf9340e26658836b935052fdd0439952ae42e44fdd2be"}, + {file = "fonttools-4.49.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:263832fae27481d48dfafcc43174644b6706639661e242902ceb30553557e16c"}, + {file = "fonttools-4.49.0-cp39-cp39-win32.whl", hash = "sha256:0404faea044577a01bb82d47a8fa4bc7a54067fa7e324785dd65d200d6dd1133"}, + {file = "fonttools-4.49.0-cp39-cp39-win_amd64.whl", hash = "sha256:b050d362df50fc6e38ae3954d8c29bf2da52be384649ee8245fdb5186b620836"}, + {file = "fonttools-4.49.0-py3-none-any.whl", hash = "sha256:af281525e5dd7fa0b39fb1667b8d5ca0e2a9079967e14c4bfe90fd1cd13e0f18"}, + {file = "fonttools-4.49.0.tar.gz", hash = "sha256:ebf46e7f01b7af7861310417d7c49591a85d99146fc23a5ba82fdb28af156321"}, +] + +[package.extras] +all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "pycairo", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0)", "xattr", "zopfli (>=0.1.4)"] graphite = ["lz4 (>=1.7.4.2)"] interpolatable = ["munkres", "pycairo", "scipy"] -lxml = ["lxml (>=4.0,<5)"] +lxml = ["lxml (>=4.0)"] pathops = ["skia-pathops (>=0.5.0)"] plot = ["matplotlib"] repacker = ["uharfbuzz (>=0.23.0)"] @@ -766,13 +800,13 @@ files = [ [[package]] name = "fsspec" -version = "2023.12.2" +version = "2024.2.0" description = "File-system specification" optional = false python-versions = ">=3.8" files = [ - {file = "fsspec-2023.12.2-py3-none-any.whl", hash = "sha256:d800d87f72189a745fa3d6b033b9dc4a34ad069f60ca60b943a63599f5501960"}, - {file = "fsspec-2023.12.2.tar.gz", hash = "sha256:8548d39e8810b59c38014934f6b31e57f40c1b20f911f4cc2b85389c7e9bf0cb"}, + {file = "fsspec-2024.2.0-py3-none-any.whl", hash = "sha256:817f969556fa5916bc682e02ca2045f96ff7f586d45110fcb76022063ad2c7d8"}, + {file = "fsspec-2024.2.0.tar.gz", hash = "sha256:b6ad1a679f760dda52b1168c859d01b7b80648ea6f7f7c7f5a8a91dc3f3ecb84"}, ] [package.extras] @@ -790,7 +824,7 @@ github = ["requests"] gs = ["gcsfs"] gui = ["panel"] hdfs = ["pyarrow (>=1)"] -http = ["aiohttp (!=4.0.0a0,!=4.0.0a1)", "requests"] +http = ["aiohttp (!=4.0.0a0,!=4.0.0a1)"] libarchive = ["libarchive-c"] oci = ["ocifs"] s3 = ["s3fs"] @@ -812,13 +846,13 @@ files = [ [[package]] name = "google-auth" -version = "2.27.0" +version = "2.28.1" description = "Google Authentication Library" optional = false python-versions = ">=3.7" files = [ - {file = "google-auth-2.27.0.tar.gz", hash = "sha256:e863a56ccc2d8efa83df7a80272601e43487fa9a728a376205c86c26aaefa821"}, - {file = "google_auth-2.27.0-py2.py3-none-any.whl", hash = "sha256:8e4bad367015430ff253fe49d500fdc3396c1a434db5740828c728e45bcce245"}, + {file = "google-auth-2.28.1.tar.gz", hash = "sha256:34fc3046c257cedcf1622fc4b31fc2be7923d9b4d44973d481125ecc50d83885"}, + {file = "google_auth-2.28.1-py2.py3-none-any.whl", hash = "sha256:25141e2d7a14bfcba945f5e9827f98092716e99482562f15306e5b026e21aa72"}, ] [package.dependencies] @@ -835,13 +869,13 @@ requests = ["requests (>=2.20.0,<3.0.0.dev0)"] [[package]] name = "google-auth-oauthlib" -version = "1.0.0" +version = "1.2.0" description = "Google Authentication Library" optional = false python-versions = ">=3.6" files = [ - {file = "google-auth-oauthlib-1.0.0.tar.gz", hash = "sha256:e375064964820b47221a7e1b7ee1fd77051b6323c3f9e3e19785f78ab67ecfc5"}, - {file = "google_auth_oauthlib-1.0.0-py2.py3-none-any.whl", hash = "sha256:95880ca704928c300f48194d1770cf5b1462835b6e49db61445a520f793fd5fb"}, + {file = "google-auth-oauthlib-1.2.0.tar.gz", hash = "sha256:292d2d3783349f2b0734a0a0207b1e1e322ac193c2c09d8f7c613fb7cc501ea8"}, + {file = "google_auth_oauthlib-1.2.0-py2.py3-none-any.whl", hash = "sha256:297c1ce4cb13a99b5834c74a1fe03252e1e499716718b190f56bcb9c4abc4faf"}, ] [package.dependencies] @@ -1070,6 +1104,43 @@ files = [ {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, ] +[[package]] +name = "ipython" +version = "8.18.1" +description = "IPython: Productive Interactive Computing" +optional = false +python-versions = ">=3.9" +files = [ + {file = "ipython-8.18.1-py3-none-any.whl", hash = "sha256:e8267419d72d81955ec1177f8a29aaa90ac80ad647499201119e2f05e99aa397"}, + {file = "ipython-8.18.1.tar.gz", hash = "sha256:ca6f079bb33457c66e233e4580ebfc4128855b4cf6370dddd73842a9563e8a27"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +decorator = "*" +exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} +jedi = ">=0.16" +matplotlib-inline = "*" +pexpect = {version = ">4.3", markers = "sys_platform != \"win32\""} +prompt-toolkit = ">=3.0.41,<3.1.0" +pygments = ">=2.4.0" +stack-data = "*" +traitlets = ">=5" +typing-extensions = {version = "*", markers = "python_version < \"3.10\""} + +[package.extras] +all = ["black", "curio", "docrepr", "exceptiongroup", "ipykernel", "ipyparallel", "ipywidgets", "matplotlib", "matplotlib (!=3.2.0)", "nbconvert", "nbformat", "notebook", "numpy (>=1.22)", "pandas", "pickleshare", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio (<0.22)", "qtconsole", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "trio", "typing-extensions"] +black = ["black"] +doc = ["docrepr", "exceptiongroup", "ipykernel", "matplotlib", "pickleshare", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio (<0.22)", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "typing-extensions"] +kernel = ["ipykernel"] +nbconvert = ["nbconvert"] +nbformat = ["nbformat"] +notebook = ["ipywidgets", "notebook"] +parallel = ["ipyparallel"] +qtconsole = ["qtconsole"] +test = ["pickleshare", "pytest (<7.1)", "pytest-asyncio (<0.22)", "testpath"] +test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.22)", "pandas", "pickleshare", "pytest (<7.1)", "pytest-asyncio (<0.22)", "testpath", "trio"] + [[package]] name = "isort" version = "5.13.2" @@ -1084,6 +1155,25 @@ files = [ [package.extras] colors = ["colorama (>=0.4.6)"] +[[package]] +name = "jedi" +version = "0.19.1" +description = "An autocompletion tool for Python that can be used for text editors." +optional = false +python-versions = ">=3.6" +files = [ + {file = "jedi-0.19.1-py2.py3-none-any.whl", hash = "sha256:e983c654fe5c02867aef4cdfce5a2fbb4a50adc0af145f70504238f18ef5e7e0"}, + {file = "jedi-0.19.1.tar.gz", hash = "sha256:cf0496f3651bc65d7174ac1b7d043eff454892c708a87d1b683e57b569927ffd"}, +] + +[package.dependencies] +parso = ">=0.8.3,<0.9.0" + +[package.extras] +docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx (==1.8.5)", "sphinx-rtd-theme (==0.4.3)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"] +qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] +testing = ["Django", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] + [[package]] name = "jinja2" version = "3.1.3" @@ -1163,13 +1253,13 @@ test = ["ipython", "mock", "numpy", "pytest (>=4.4)"] [[package]] name = "keras" -version = "2.14.0" +version = "2.15.0" description = "Deep learning for humans." optional = false -python-versions = ">=3.9" +python-versions = ">=3.8" files = [ - {file = "keras-2.14.0-py3-none-any.whl", hash = "sha256:d7429d1d2131cc7eb1f2ea2ec330227c7d9d38dab3dfdf2e78defee4ecc43fcd"}, - {file = "keras-2.14.0.tar.gz", hash = "sha256:22788bdbc86d9988794fe9703bb5205141da797c4faeeb59497c58c3d94d34ed"}, + {file = "keras-2.15.0-py3-none-any.whl", hash = "sha256:2dcc6d2e30cf9c951064b63c1f4c404b966c59caf09e01f3549138ec8ee0dd1f"}, + {file = "keras-2.15.0.tar.gz", hash = "sha256:81871d298c064dc4ac6b58440fdae67bfcf47c8d7ad28580fab401834c06a575"}, ] [[package]] @@ -1299,52 +1389,6 @@ files = [ [package.dependencies] six = ">=1.4.1" -[[package]] -name = "lazy-object-proxy" -version = "1.10.0" -description = "A fast and thorough lazy object proxy." -optional = false -python-versions = ">=3.8" -files = [ - {file = "lazy-object-proxy-1.10.0.tar.gz", hash = "sha256:78247b6d45f43a52ef35c25b5581459e85117225408a4128a3daf8bf9648ac69"}, - {file = "lazy_object_proxy-1.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:855e068b0358ab916454464a884779c7ffa312b8925c6f7401e952dcf3b89977"}, - {file = "lazy_object_proxy-1.10.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab7004cf2e59f7c2e4345604a3e6ea0d92ac44e1c2375527d56492014e690c3"}, - {file = "lazy_object_proxy-1.10.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc0d2fc424e54c70c4bc06787e4072c4f3b1aa2f897dfdc34ce1013cf3ceef05"}, - {file = "lazy_object_proxy-1.10.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e2adb09778797da09d2b5ebdbceebf7dd32e2c96f79da9052b2e87b6ea495895"}, - {file = "lazy_object_proxy-1.10.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b1f711e2c6dcd4edd372cf5dec5c5a30d23bba06ee012093267b3376c079ec83"}, - {file = "lazy_object_proxy-1.10.0-cp310-cp310-win32.whl", hash = "sha256:76a095cfe6045c7d0ca77db9934e8f7b71b14645f0094ffcd842349ada5c5fb9"}, - {file = "lazy_object_proxy-1.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:b4f87d4ed9064b2628da63830986c3d2dca7501e6018347798313fcf028e2fd4"}, - {file = "lazy_object_proxy-1.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:fec03caabbc6b59ea4a638bee5fce7117be8e99a4103d9d5ad77f15d6f81020c"}, - {file = "lazy_object_proxy-1.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:02c83f957782cbbe8136bee26416686a6ae998c7b6191711a04da776dc9e47d4"}, - {file = "lazy_object_proxy-1.10.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:009e6bb1f1935a62889ddc8541514b6a9e1fcf302667dcb049a0be5c8f613e56"}, - {file = "lazy_object_proxy-1.10.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:75fc59fc450050b1b3c203c35020bc41bd2695ed692a392924c6ce180c6f1dc9"}, - {file = "lazy_object_proxy-1.10.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:782e2c9b2aab1708ffb07d4bf377d12901d7a1d99e5e410d648d892f8967ab1f"}, - {file = "lazy_object_proxy-1.10.0-cp311-cp311-win32.whl", hash = "sha256:edb45bb8278574710e68a6b021599a10ce730d156e5b254941754a9cc0b17d03"}, - {file = "lazy_object_proxy-1.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:e271058822765ad5e3bca7f05f2ace0de58a3f4e62045a8c90a0dfd2f8ad8cc6"}, - {file = "lazy_object_proxy-1.10.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e98c8af98d5707dcdecc9ab0863c0ea6e88545d42ca7c3feffb6b4d1e370c7ba"}, - {file = "lazy_object_proxy-1.10.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:952c81d415b9b80ea261d2372d2a4a2332a3890c2b83e0535f263ddfe43f0d43"}, - {file = "lazy_object_proxy-1.10.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80b39d3a151309efc8cc48675918891b865bdf742a8616a337cb0090791a0de9"}, - {file = "lazy_object_proxy-1.10.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:e221060b701e2aa2ea991542900dd13907a5c90fa80e199dbf5a03359019e7a3"}, - {file = "lazy_object_proxy-1.10.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:92f09ff65ecff3108e56526f9e2481b8116c0b9e1425325e13245abfd79bdb1b"}, - {file = "lazy_object_proxy-1.10.0-cp312-cp312-win32.whl", hash = "sha256:3ad54b9ddbe20ae9f7c1b29e52f123120772b06dbb18ec6be9101369d63a4074"}, - {file = "lazy_object_proxy-1.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:127a789c75151db6af398b8972178afe6bda7d6f68730c057fbbc2e96b08d282"}, - {file = "lazy_object_proxy-1.10.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9e4ed0518a14dd26092614412936920ad081a424bdcb54cc13349a8e2c6d106a"}, - {file = "lazy_object_proxy-1.10.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ad9e6ed739285919aa9661a5bbed0aaf410aa60231373c5579c6b4801bd883c"}, - {file = "lazy_object_proxy-1.10.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fc0a92c02fa1ca1e84fc60fa258458e5bf89d90a1ddaeb8ed9cc3147f417255"}, - {file = "lazy_object_proxy-1.10.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0aefc7591920bbd360d57ea03c995cebc204b424524a5bd78406f6e1b8b2a5d8"}, - {file = "lazy_object_proxy-1.10.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5faf03a7d8942bb4476e3b62fd0f4cf94eaf4618e304a19865abf89a35c0bbee"}, - {file = "lazy_object_proxy-1.10.0-cp38-cp38-win32.whl", hash = "sha256:e333e2324307a7b5d86adfa835bb500ee70bfcd1447384a822e96495796b0ca4"}, - {file = "lazy_object_proxy-1.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:cb73507defd385b7705c599a94474b1d5222a508e502553ef94114a143ec6696"}, - {file = "lazy_object_proxy-1.10.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:366c32fe5355ef5fc8a232c5436f4cc66e9d3e8967c01fb2e6302fd6627e3d94"}, - {file = "lazy_object_proxy-1.10.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2297f08f08a2bb0d32a4265e98a006643cd7233fb7983032bd61ac7a02956b3b"}, - {file = "lazy_object_proxy-1.10.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18dd842b49456aaa9a7cf535b04ca4571a302ff72ed8740d06b5adcd41fe0757"}, - {file = "lazy_object_proxy-1.10.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:217138197c170a2a74ca0e05bddcd5f1796c735c37d0eee33e43259b192aa424"}, - {file = "lazy_object_proxy-1.10.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9a3a87cf1e133e5b1994144c12ca4aa3d9698517fe1e2ca82977781b16955658"}, - {file = "lazy_object_proxy-1.10.0-cp39-cp39-win32.whl", hash = "sha256:30b339b2a743c5288405aa79a69e706a06e02958eab31859f7f3c04980853b70"}, - {file = "lazy_object_proxy-1.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:a899b10e17743683b293a729d3a11f2f399e8a90c73b089e29f5d0fe3509f0dd"}, - {file = "lazy_object_proxy-1.10.0-pp310.pp311.pp312.pp38.pp39-none-any.whl", hash = "sha256:80fa48bd89c8f2f456fc0765c11c23bf5af827febacd2f523ca5bc1893fcc09d"}, -] - [[package]] name = "libclang" version = "16.0.6" @@ -1367,39 +1411,32 @@ files = [ [[package]] name = "llvmlite" -version = "0.39.1" +version = "0.42.0" description = "lightweight wrapper around basic LLVM functionality" optional = false -python-versions = ">=3.7" +python-versions = ">=3.9" files = [ - {file = "llvmlite-0.39.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6717c7a6e93c9d2c3d07c07113ec80ae24af45cde536b34363d4bcd9188091d9"}, - {file = "llvmlite-0.39.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ddab526c5a2c4ccb8c9ec4821fcea7606933dc53f510e2a6eebb45a418d3488a"}, - {file = "llvmlite-0.39.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3f331a323d0f0ada6b10d60182ef06c20a2f01be21699999d204c5750ffd0b4"}, - {file = "llvmlite-0.39.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e2c00ff204afa721b0bb9835b5bf1ba7fba210eefcec5552a9e05a63219ba0dc"}, - {file = "llvmlite-0.39.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:16f56eb1eec3cda3a5c526bc3f63594fc24e0c8d219375afeb336f289764c6c7"}, - {file = "llvmlite-0.39.1-cp310-cp310-win32.whl", hash = "sha256:d0bfd18c324549c0fec2c5dc610fd024689de6f27c6cc67e4e24a07541d6e49b"}, - {file = "llvmlite-0.39.1-cp310-cp310-win_amd64.whl", hash = "sha256:7ebf1eb9badc2a397d4f6a6c8717447c81ac011db00064a00408bc83c923c0e4"}, - {file = "llvmlite-0.39.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6546bed4e02a1c3d53a22a0bced254b3b6894693318b16c16c8e43e29d6befb6"}, - {file = "llvmlite-0.39.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1578f5000fdce513712e99543c50e93758a954297575610f48cb1fd71b27c08a"}, - {file = "llvmlite-0.39.1-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3803f11ad5f6f6c3d2b545a303d68d9fabb1d50e06a8d6418e6fcd2d0df00959"}, - {file = "llvmlite-0.39.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50aea09a2b933dab7c9df92361b1844ad3145bfb8dd2deb9cd8b8917d59306fb"}, - {file = "llvmlite-0.39.1-cp37-cp37m-win32.whl", hash = "sha256:b1a0bbdb274fb683f993198775b957d29a6f07b45d184c571ef2a721ce4388cf"}, - {file = "llvmlite-0.39.1-cp37-cp37m-win_amd64.whl", hash = "sha256:e172c73fccf7d6db4bd6f7de963dedded900d1a5c6778733241d878ba613980e"}, - {file = "llvmlite-0.39.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e31f4b799d530255aaf0566e3da2df5bfc35d3cd9d6d5a3dcc251663656c27b1"}, - {file = "llvmlite-0.39.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:62c0ea22e0b9dffb020601bb65cb11dd967a095a488be73f07d8867f4e327ca5"}, - {file = "llvmlite-0.39.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9ffc84ade195abd4abcf0bd3b827b9140ae9ef90999429b9ea84d5df69c9058c"}, - {file = "llvmlite-0.39.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c0f158e4708dda6367d21cf15afc58de4ebce979c7a1aa2f6b977aae737e2a54"}, - {file = "llvmlite-0.39.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22d36591cd5d02038912321d9ab8e4668e53ae2211da5523f454e992b5e13c36"}, - {file = "llvmlite-0.39.1-cp38-cp38-win32.whl", hash = "sha256:4c6ebace910410daf0bebda09c1859504fc2f33d122e9a971c4c349c89cca630"}, - {file = "llvmlite-0.39.1-cp38-cp38-win_amd64.whl", hash = "sha256:fb62fc7016b592435d3e3a8f680e3ea8897c3c9e62e6e6cc58011e7a4801439e"}, - {file = "llvmlite-0.39.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fa9b26939ae553bf30a9f5c4c754db0fb2d2677327f2511e674aa2f5df941789"}, - {file = "llvmlite-0.39.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e4f212c018db951da3e1dc25c2651abc688221934739721f2dad5ff1dd5f90e7"}, - {file = "llvmlite-0.39.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39dc2160aed36e989610fc403487f11b8764b6650017ff367e45384dff88ffbf"}, - {file = "llvmlite-0.39.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1ec3d70b3e507515936e475d9811305f52d049281eaa6c8273448a61c9b5b7e2"}, - {file = "llvmlite-0.39.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:60f8dd1e76f47b3dbdee4b38d9189f3e020d22a173c00f930b52131001d801f9"}, - {file = "llvmlite-0.39.1-cp39-cp39-win32.whl", hash = "sha256:03aee0ccd81735696474dc4f8b6be60774892a2929d6c05d093d17392c237f32"}, - {file = "llvmlite-0.39.1-cp39-cp39-win_amd64.whl", hash = "sha256:3fc14e757bc07a919221f0cbaacb512704ce5774d7fcada793f1996d6bc75f2a"}, - {file = "llvmlite-0.39.1.tar.gz", hash = "sha256:b43abd7c82e805261c425d50335be9a6c4f84264e34d6d6e475207300005d572"}, + {file = "llvmlite-0.42.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3366938e1bf63d26c34fbfb4c8e8d2ded57d11e0567d5bb243d89aab1eb56098"}, + {file = "llvmlite-0.42.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c35da49666a21185d21b551fc3caf46a935d54d66969d32d72af109b5e7d2b6f"}, + {file = "llvmlite-0.42.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70f44ccc3c6220bd23e0ba698a63ec2a7d3205da0d848804807f37fc243e3f77"}, + {file = "llvmlite-0.42.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:763f8d8717a9073b9e0246998de89929071d15b47f254c10eef2310b9aac033d"}, + {file = "llvmlite-0.42.0-cp310-cp310-win_amd64.whl", hash = "sha256:8d90edf400b4ceb3a0e776b6c6e4656d05c7187c439587e06f86afceb66d2be5"}, + {file = "llvmlite-0.42.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ae511caed28beaf1252dbaf5f40e663f533b79ceb408c874c01754cafabb9cbf"}, + {file = "llvmlite-0.42.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:81e674c2fe85576e6c4474e8c7e7aba7901ac0196e864fe7985492b737dbab65"}, + {file = "llvmlite-0.42.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb3975787f13eb97629052edb5017f6c170eebc1c14a0433e8089e5db43bcce6"}, + {file = "llvmlite-0.42.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c5bece0cdf77f22379f19b1959ccd7aee518afa4afbd3656c6365865f84903f9"}, + {file = "llvmlite-0.42.0-cp311-cp311-win_amd64.whl", hash = "sha256:7e0c4c11c8c2aa9b0701f91b799cb9134a6a6de51444eff5a9087fc7c1384275"}, + {file = "llvmlite-0.42.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:08fa9ab02b0d0179c688a4216b8939138266519aaa0aa94f1195a8542faedb56"}, + {file = "llvmlite-0.42.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b2fce7d355068494d1e42202c7aff25d50c462584233013eb4470c33b995e3ee"}, + {file = "llvmlite-0.42.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ebe66a86dc44634b59a3bc860c7b20d26d9aaffcd30364ebe8ba79161a9121f4"}, + {file = "llvmlite-0.42.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d47494552559e00d81bfb836cf1c4d5a5062e54102cc5767d5aa1e77ccd2505c"}, + {file = "llvmlite-0.42.0-cp312-cp312-win_amd64.whl", hash = "sha256:05cb7e9b6ce69165ce4d1b994fbdedca0c62492e537b0cc86141b6e2c78d5888"}, + {file = "llvmlite-0.42.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bdd3888544538a94d7ec99e7c62a0cdd8833609c85f0c23fcb6c5c591aec60ad"}, + {file = "llvmlite-0.42.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d0936c2067a67fb8816c908d5457d63eba3e2b17e515c5fe00e5ee2bace06040"}, + {file = "llvmlite-0.42.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a78ab89f1924fc11482209f6799a7a3fc74ddc80425a7a3e0e8174af0e9e2301"}, + {file = "llvmlite-0.42.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7599b65c7af7abbc978dbf345712c60fd596aa5670496561cc10e8a71cebfb2"}, + {file = "llvmlite-0.42.0-cp39-cp39-win_amd64.whl", hash = "sha256:43d65cc4e206c2e902c1004dd5418417c4efa6c1d04df05c6c5675a27e8ca90e"}, + {file = "llvmlite-0.42.0.tar.gz", hash = "sha256:f92b09243c0cc3f457da8b983f67bd8e1295d0f5b3746c7a1861d7a99403854a"}, ] [[package]] @@ -1517,39 +1554,39 @@ files = [ [[package]] name = "matplotlib" -version = "3.8.2" +version = "3.8.3" description = "Python plotting package" optional = false python-versions = ">=3.9" files = [ - {file = "matplotlib-3.8.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:09796f89fb71a0c0e1e2f4bdaf63fb2cefc84446bb963ecdeb40dfee7dfa98c7"}, - {file = "matplotlib-3.8.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6f9c6976748a25e8b9be51ea028df49b8e561eed7809146da7a47dbecebab367"}, - {file = "matplotlib-3.8.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b78e4f2cedf303869b782071b55fdde5987fda3038e9d09e58c91cc261b5ad18"}, - {file = "matplotlib-3.8.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e208f46cf6576a7624195aa047cb344a7f802e113bb1a06cfd4bee431de5e31"}, - {file = "matplotlib-3.8.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:46a569130ff53798ea5f50afce7406e91fdc471ca1e0e26ba976a8c734c9427a"}, - {file = "matplotlib-3.8.2-cp310-cp310-win_amd64.whl", hash = "sha256:830f00640c965c5b7f6bc32f0d4ce0c36dfe0379f7dd65b07a00c801713ec40a"}, - {file = "matplotlib-3.8.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d86593ccf546223eb75a39b44c32788e6f6440d13cfc4750c1c15d0fcb850b63"}, - {file = "matplotlib-3.8.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9a5430836811b7652991939012f43d2808a2db9b64ee240387e8c43e2e5578c8"}, - {file = "matplotlib-3.8.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9576723858a78751d5aacd2497b8aef29ffea6d1c95981505877f7ac28215c6"}, - {file = "matplotlib-3.8.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ba9cbd8ac6cf422f3102622b20f8552d601bf8837e49a3afed188d560152788"}, - {file = "matplotlib-3.8.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:03f9d160a29e0b65c0790bb07f4f45d6a181b1ac33eb1bb0dd225986450148f0"}, - {file = "matplotlib-3.8.2-cp311-cp311-win_amd64.whl", hash = "sha256:3773002da767f0a9323ba1a9b9b5d00d6257dbd2a93107233167cfb581f64717"}, - {file = "matplotlib-3.8.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:4c318c1e95e2f5926fba326f68177dee364aa791d6df022ceb91b8221bd0a627"}, - {file = "matplotlib-3.8.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:091275d18d942cf1ee9609c830a1bc36610607d8223b1b981c37d5c9fc3e46a4"}, - {file = "matplotlib-3.8.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b0f3b8ea0e99e233a4bcc44590f01604840d833c280ebb8fe5554fd3e6cfe8d"}, - {file = "matplotlib-3.8.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7b1704a530395aaf73912be741c04d181f82ca78084fbd80bc737be04848331"}, - {file = "matplotlib-3.8.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:533b0e3b0c6768eef8cbe4b583731ce25a91ab54a22f830db2b031e83cca9213"}, - {file = "matplotlib-3.8.2-cp312-cp312-win_amd64.whl", hash = "sha256:0f4fc5d72b75e2c18e55eb32292659cf731d9d5b312a6eb036506304f4675630"}, - {file = "matplotlib-3.8.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:deaed9ad4da0b1aea77fe0aa0cebb9ef611c70b3177be936a95e5d01fa05094f"}, - {file = "matplotlib-3.8.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:172f4d0fbac3383d39164c6caafd3255ce6fa58f08fc392513a0b1d3b89c4f89"}, - {file = "matplotlib-3.8.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7d36c2209d9136cd8e02fab1c0ddc185ce79bc914c45054a9f514e44c787917"}, - {file = "matplotlib-3.8.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5864bdd7da445e4e5e011b199bb67168cdad10b501750367c496420f2ad00843"}, - {file = "matplotlib-3.8.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ef8345b48e95cee45ff25192ed1f4857273117917a4dcd48e3905619bcd9c9b8"}, - {file = "matplotlib-3.8.2-cp39-cp39-win_amd64.whl", hash = "sha256:7c48d9e221b637c017232e3760ed30b4e8d5dfd081daf327e829bf2a72c731b4"}, - {file = "matplotlib-3.8.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:aa11b3c6928a1e496c1a79917d51d4cd5d04f8a2e75f21df4949eeefdf697f4b"}, - {file = "matplotlib-3.8.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d1095fecf99eeb7384dabad4bf44b965f929a5f6079654b681193edf7169ec20"}, - {file = "matplotlib-3.8.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:bddfb1db89bfaa855912261c805bd0e10218923cc262b9159a49c29a7a1c1afa"}, - {file = "matplotlib-3.8.2.tar.gz", hash = "sha256:01a978b871b881ee76017152f1f1a0cbf6bd5f7b8ff8c96df0df1bd57d8755a1"}, + {file = "matplotlib-3.8.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:cf60138ccc8004f117ab2a2bad513cc4d122e55864b4fe7adf4db20ca68a078f"}, + {file = "matplotlib-3.8.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5f557156f7116be3340cdeef7f128fa99b0d5d287d5f41a16e169819dcf22357"}, + {file = "matplotlib-3.8.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f386cf162b059809ecfac3bcc491a9ea17da69fa35c8ded8ad154cd4b933d5ec"}, + {file = "matplotlib-3.8.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b3c5f96f57b0369c288bf6f9b5274ba45787f7e0589a34d24bdbaf6d3344632f"}, + {file = "matplotlib-3.8.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:83e0f72e2c116ca7e571c57aa29b0fe697d4c6425c4e87c6e994159e0c008635"}, + {file = "matplotlib-3.8.3-cp310-cp310-win_amd64.whl", hash = "sha256:1c5c8290074ba31a41db1dc332dc2b62def469ff33766cbe325d32a3ee291aea"}, + {file = "matplotlib-3.8.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:5184e07c7e1d6d1481862ee361905b7059f7fe065fc837f7c3dc11eeb3f2f900"}, + {file = "matplotlib-3.8.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d7e7e0993d0758933b1a241a432b42c2db22dfa37d4108342ab4afb9557cbe3e"}, + {file = "matplotlib-3.8.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:04b36ad07eac9740fc76c2aa16edf94e50b297d6eb4c081e3add863de4bb19a7"}, + {file = "matplotlib-3.8.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c42dae72a62f14982f1474f7e5c9959fc4bc70c9de11cc5244c6e766200ba65"}, + {file = "matplotlib-3.8.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:bf5932eee0d428192c40b7eac1399d608f5d995f975cdb9d1e6b48539a5ad8d0"}, + {file = "matplotlib-3.8.3-cp311-cp311-win_amd64.whl", hash = "sha256:40321634e3a05ed02abf7c7b47a50be50b53ef3eaa3a573847431a545585b407"}, + {file = "matplotlib-3.8.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:09074f8057917d17ab52c242fdf4916f30e99959c1908958b1fc6032e2d0f6d4"}, + {file = "matplotlib-3.8.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5745f6d0fb5acfabbb2790318db03809a253096e98c91b9a31969df28ee604aa"}, + {file = "matplotlib-3.8.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b97653d869a71721b639714b42d87cda4cfee0ee74b47c569e4874c7590c55c5"}, + {file = "matplotlib-3.8.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:242489efdb75b690c9c2e70bb5c6550727058c8a614e4c7716f363c27e10bba1"}, + {file = "matplotlib-3.8.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:83c0653c64b73926730bd9ea14aa0f50f202ba187c307a881673bad4985967b7"}, + {file = "matplotlib-3.8.3-cp312-cp312-win_amd64.whl", hash = "sha256:ef6c1025a570354297d6c15f7d0f296d95f88bd3850066b7f1e7b4f2f4c13a39"}, + {file = "matplotlib-3.8.3-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:c4af3f7317f8a1009bbb2d0bf23dfaba859eb7dd4ccbd604eba146dccaaaf0a4"}, + {file = "matplotlib-3.8.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4c6e00a65d017d26009bac6808f637b75ceade3e1ff91a138576f6b3065eeeba"}, + {file = "matplotlib-3.8.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e7b49ab49a3bea17802df6872f8d44f664ba8f9be0632a60c99b20b6db2165b7"}, + {file = "matplotlib-3.8.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6728dde0a3997396b053602dbd907a9bd64ec7d5cf99e728b404083698d3ca01"}, + {file = "matplotlib-3.8.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:813925d08fb86aba139f2d31864928d67511f64e5945ca909ad5bc09a96189bb"}, + {file = "matplotlib-3.8.3-cp39-cp39-win_amd64.whl", hash = "sha256:cd3a0c2be76f4e7be03d34a14d49ded6acf22ef61f88da600a18a5cd8b3c5f3c"}, + {file = "matplotlib-3.8.3-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:fa93695d5c08544f4a0dfd0965f378e7afc410d8672816aff1e81be1f45dbf2e"}, + {file = "matplotlib-3.8.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e9764df0e8778f06414b9d281a75235c1e85071f64bb5d71564b97c1306a2afc"}, + {file = "matplotlib-3.8.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:5e431a09e6fab4012b01fc155db0ce6dccacdbabe8198197f523a4ef4805eb26"}, + {file = "matplotlib-3.8.3.tar.gz", hash = "sha256:7b416239e9ae38be54b028abbf9048aff5054a9aba5416bef0bd17f9162ce161"}, ] [package.dependencies] @@ -1564,15 +1601,29 @@ pillow = ">=8" pyparsing = ">=2.3.1" python-dateutil = ">=2.7" +[[package]] +name = "matplotlib-inline" +version = "0.1.6" +description = "Inline Matplotlib backend for Jupyter" +optional = false +python-versions = ">=3.5" +files = [ + {file = "matplotlib-inline-0.1.6.tar.gz", hash = "sha256:f887e5f10ba98e8d2b150ddcf4702c1e5f8b3a20005eb0f74bfdbd360ee6f304"}, + {file = "matplotlib_inline-0.1.6-py3-none-any.whl", hash = "sha256:f1f41aab5328aa5aaea9b16d083b128102f8712542f819fe7e6a420ff581b311"}, +] + +[package.dependencies] +traitlets = "*" + [[package]] name = "mccabe" -version = "0.6.1" +version = "0.7.0" description = "McCabe checker, plugin for flake8" optional = false -python-versions = "*" +python-versions = ">=3.6" files = [ - {file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"}, - {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"}, + {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, + {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, ] [[package]] @@ -1614,7 +1665,8 @@ files = [ [package.dependencies] numpy = [ - {version = ">=1.21.2", markers = "python_version > \"3.9\""}, + {version = ">=1.23.3", markers = "python_version > \"3.10\""}, + {version = ">=1.21.2", markers = "python_version > \"3.9\" and python_version <= \"3.10\""}, {version = ">1.20", markers = "python_version <= \"3.9\""}, ] @@ -1734,81 +1786,81 @@ test = ["pytest (>=7.2)", "pytest-cov (>=4.0)"] [[package]] name = "numba" -version = "0.56.4" +version = "0.59.0" description = "compiling Python code using LLVM" optional = false -python-versions = ">=3.7" +python-versions = ">=3.9" files = [ - {file = "numba-0.56.4-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:9f62672145f8669ec08762895fe85f4cf0ead08ce3164667f2b94b2f62ab23c3"}, - {file = "numba-0.56.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c602d015478b7958408d788ba00a50272649c5186ea8baa6cf71d4a1c761bba1"}, - {file = "numba-0.56.4-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:85dbaed7a05ff96492b69a8900c5ba605551afb9b27774f7f10511095451137c"}, - {file = "numba-0.56.4-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:f4cfc3a19d1e26448032049c79fc60331b104f694cf570a9e94f4e2c9d0932bb"}, - {file = "numba-0.56.4-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4e08e203b163ace08bad500b0c16f6092b1eb34fd1fce4feaf31a67a3a5ecf3b"}, - {file = "numba-0.56.4-cp310-cp310-win32.whl", hash = "sha256:0611e6d3eebe4cb903f1a836ffdb2bda8d18482bcd0a0dcc56e79e2aa3fefef5"}, - {file = "numba-0.56.4-cp310-cp310-win_amd64.whl", hash = "sha256:fbfb45e7b297749029cb28694abf437a78695a100e7c2033983d69f0ba2698d4"}, - {file = "numba-0.56.4-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:3cb1a07a082a61df80a468f232e452d818f5ae254b40c26390054e4e868556e0"}, - {file = "numba-0.56.4-cp37-cp37m-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d69ad934e13c15684e7887100a8f5f0f61d7a8e57e0fd29d9993210089a5b531"}, - {file = "numba-0.56.4-cp37-cp37m-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:dbcc847bac2d225265d054993a7f910fda66e73d6662fe7156452cac0325b073"}, - {file = "numba-0.56.4-cp37-cp37m-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8a95ca9cc77ea4571081f6594e08bd272b66060634b8324e99cd1843020364f9"}, - {file = "numba-0.56.4-cp37-cp37m-win32.whl", hash = "sha256:fcdf84ba3ed8124eb7234adfbb8792f311991cbf8aed1cad4b1b1a7ee08380c1"}, - {file = "numba-0.56.4-cp37-cp37m-win_amd64.whl", hash = "sha256:42f9e1be942b215df7e6cc9948cf9c15bb8170acc8286c063a9e57994ef82fd1"}, - {file = "numba-0.56.4-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:553da2ce74e8862e18a72a209ed3b6d2924403bdd0fb341fa891c6455545ba7c"}, - {file = "numba-0.56.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4373da9757049db7c90591e9ec55a2e97b2b36ba7ae3bf9c956a513374077470"}, - {file = "numba-0.56.4-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3a993349b90569518739009d8f4b523dfedd7e0049e6838c0e17435c3e70dcc4"}, - {file = "numba-0.56.4-cp38-cp38-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:720886b852a2d62619ae3900fe71f1852c62db4f287d0c275a60219e1643fc04"}, - {file = "numba-0.56.4-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e64d338b504c9394a4a34942df4627e1e6cb07396ee3b49fe7b8d6420aa5104f"}, - {file = "numba-0.56.4-cp38-cp38-win32.whl", hash = "sha256:03fe94cd31e96185cce2fae005334a8cc712fc2ba7756e52dff8c9400718173f"}, - {file = "numba-0.56.4-cp38-cp38-win_amd64.whl", hash = "sha256:91f021145a8081f881996818474ef737800bcc613ffb1e618a655725a0f9e246"}, - {file = "numba-0.56.4-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:d0ae9270a7a5cc0ede63cd234b4ff1ce166c7a749b91dbbf45e0000c56d3eade"}, - {file = "numba-0.56.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c75e8a5f810ce80a0cfad6e74ee94f9fde9b40c81312949bf356b7304ef20740"}, - {file = "numba-0.56.4-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a12ef323c0f2101529d455cfde7f4135eaa147bad17afe10b48634f796d96abd"}, - {file = "numba-0.56.4-cp39-cp39-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:03634579d10a6129181129de293dd6b5eaabee86881369d24d63f8fe352dd6cb"}, - {file = "numba-0.56.4-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0240f9026b015e336069329839208ebd70ec34ae5bfbf402e4fcc8e06197528e"}, - {file = "numba-0.56.4-cp39-cp39-win32.whl", hash = "sha256:14dbbabf6ffcd96ee2ac827389afa59a70ffa9f089576500434c34abf9b054a4"}, - {file = "numba-0.56.4-cp39-cp39-win_amd64.whl", hash = "sha256:0da583c532cd72feefd8e551435747e0e0fbb3c0530357e6845fcc11e38d6aea"}, - {file = "numba-0.56.4.tar.gz", hash = "sha256:32d9fef412c81483d7efe0ceb6cf4d3310fde8b624a9cecca00f790573ac96ee"}, -] - -[package.dependencies] -llvmlite = "==0.39.*" -numpy = ">=1.18,<1.24" -setuptools = "*" + {file = "numba-0.59.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8d061d800473fb8fef76a455221f4ad649a53f5e0f96e3f6c8b8553ee6fa98fa"}, + {file = "numba-0.59.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c086a434e7d3891ce5dfd3d1e7ee8102ac1e733962098578b507864120559ceb"}, + {file = "numba-0.59.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:9e20736bf62e61f8353fb71b0d3a1efba636c7a303d511600fc57648b55823ed"}, + {file = "numba-0.59.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e86e6786aec31d2002122199486e10bbc0dc40f78d76364cded375912b13614c"}, + {file = "numba-0.59.0-cp310-cp310-win_amd64.whl", hash = "sha256:0307ee91b24500bb7e64d8a109848baf3a3905df48ce142b8ac60aaa406a0400"}, + {file = "numba-0.59.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d540f69a8245fb714419c2209e9af6104e568eb97623adc8943642e61f5d6d8e"}, + {file = "numba-0.59.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1192d6b2906bf3ff72b1d97458724d98860ab86a91abdd4cfd9328432b661e31"}, + {file = "numba-0.59.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:90efb436d3413809fcd15298c6d395cb7d98184350472588356ccf19db9e37c8"}, + {file = "numba-0.59.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cd3dac45e25d927dcb65d44fb3a973994f5add2b15add13337844afe669dd1ba"}, + {file = "numba-0.59.0-cp311-cp311-win_amd64.whl", hash = "sha256:753dc601a159861808cc3207bad5c17724d3b69552fd22768fddbf302a817a4c"}, + {file = "numba-0.59.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ce62bc0e6dd5264e7ff7f34f41786889fa81a6b860662f824aa7532537a7bee0"}, + {file = "numba-0.59.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8cbef55b73741b5eea2dbaf1b0590b14977ca95a13a07d200b794f8f6833a01c"}, + {file = "numba-0.59.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:70d26ba589f764be45ea8c272caa467dbe882b9676f6749fe6f42678091f5f21"}, + {file = "numba-0.59.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e125f7d69968118c28ec0eed9fbedd75440e64214b8d2eac033c22c04db48492"}, + {file = "numba-0.59.0-cp312-cp312-win_amd64.whl", hash = "sha256:4981659220b61a03c1e557654027d271f56f3087448967a55c79a0e5f926de62"}, + {file = "numba-0.59.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fe4d7562d1eed754a7511ed7ba962067f198f86909741c5c6e18c4f1819b1f47"}, + {file = "numba-0.59.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6feb1504bb432280f900deaf4b1dadcee68812209500ed3f81c375cbceab24dc"}, + {file = "numba-0.59.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:944faad25ee23ea9dda582bfb0189fb9f4fc232359a80ab2a028b94c14ce2b1d"}, + {file = "numba-0.59.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5516a469514bfae52a9d7989db4940653a5cbfac106f44cb9c50133b7ad6224b"}, + {file = "numba-0.59.0-cp39-cp39-win_amd64.whl", hash = "sha256:32bd0a41525ec0b1b853da244808f4e5333867df3c43c30c33f89cf20b9c2b63"}, + {file = "numba-0.59.0.tar.gz", hash = "sha256:12b9b064a3e4ad00e2371fc5212ef0396c80f41caec9b5ec391c8b04b6eaf2a8"}, +] + +[package.dependencies] +llvmlite = "==0.42.*" +numpy = ">=1.22,<1.27" [[package]] name = "numpy" -version = "1.23.5" -description = "NumPy is the fundamental package for array computing with Python." +version = "1.26.4" +description = "Fundamental package for array computing in Python" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "numpy-1.23.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9c88793f78fca17da0145455f0d7826bcb9f37da4764af27ac945488116efe63"}, - {file = "numpy-1.23.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e9f4c4e51567b616be64e05d517c79a8a22f3606499941d97bb76f2ca59f982d"}, - {file = "numpy-1.23.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7903ba8ab592b82014713c491f6c5d3a1cde5b4a3bf116404e08f5b52f6daf43"}, - {file = "numpy-1.23.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e05b1c973a9f858c74367553e236f287e749465f773328c8ef31abe18f691e1"}, - {file = "numpy-1.23.5-cp310-cp310-win32.whl", hash = "sha256:522e26bbf6377e4d76403826ed689c295b0b238f46c28a7251ab94716da0b280"}, - {file = "numpy-1.23.5-cp310-cp310-win_amd64.whl", hash = "sha256:dbee87b469018961d1ad79b1a5d50c0ae850000b639bcb1b694e9981083243b6"}, - {file = "numpy-1.23.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ce571367b6dfe60af04e04a1834ca2dc5f46004ac1cc756fb95319f64c095a96"}, - {file = "numpy-1.23.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:56e454c7833e94ec9769fa0f86e6ff8e42ee38ce0ce1fa4cbb747ea7e06d56aa"}, - {file = "numpy-1.23.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5039f55555e1eab31124a5768898c9e22c25a65c1e0037f4d7c495a45778c9f2"}, - {file = "numpy-1.23.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58f545efd1108e647604a1b5aa809591ccd2540f468a880bedb97247e72db387"}, - {file = "numpy-1.23.5-cp311-cp311-win32.whl", hash = "sha256:b2a9ab7c279c91974f756c84c365a669a887efa287365a8e2c418f8b3ba73fb0"}, - {file = "numpy-1.23.5-cp311-cp311-win_amd64.whl", hash = "sha256:0cbe9848fad08baf71de1a39e12d1b6310f1d5b2d0ea4de051058e6e1076852d"}, - {file = "numpy-1.23.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f063b69b090c9d918f9df0a12116029e274daf0181df392839661c4c7ec9018a"}, - {file = "numpy-1.23.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0aaee12d8883552fadfc41e96b4c82ee7d794949e2a7c3b3a7201e968c7ecab9"}, - {file = "numpy-1.23.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:92c8c1e89a1f5028a4c6d9e3ccbe311b6ba53694811269b992c0b224269e2398"}, - {file = "numpy-1.23.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d208a0f8729f3fb790ed18a003f3a57895b989b40ea4dce4717e9cf4af62c6bb"}, - {file = "numpy-1.23.5-cp38-cp38-win32.whl", hash = "sha256:06005a2ef6014e9956c09ba07654f9837d9e26696a0470e42beedadb78c11b07"}, - {file = "numpy-1.23.5-cp38-cp38-win_amd64.whl", hash = "sha256:ca51fcfcc5f9354c45f400059e88bc09215fb71a48d3768fb80e357f3b457e1e"}, - {file = "numpy-1.23.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8969bfd28e85c81f3f94eb4a66bc2cf1dbdc5c18efc320af34bffc54d6b1e38f"}, - {file = "numpy-1.23.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a7ac231a08bb37f852849bbb387a20a57574a97cfc7b6cabb488a4fc8be176de"}, - {file = "numpy-1.23.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf837dc63ba5c06dc8797c398db1e223a466c7ece27a1f7b5232ba3466aafe3d"}, - {file = "numpy-1.23.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33161613d2269025873025b33e879825ec7b1d831317e68f4f2f0f84ed14c719"}, - {file = "numpy-1.23.5-cp39-cp39-win32.whl", hash = "sha256:af1da88f6bc3d2338ebbf0e22fe487821ea4d8e89053e25fa59d1d79786e7481"}, - {file = "numpy-1.23.5-cp39-cp39-win_amd64.whl", hash = "sha256:09b7847f7e83ca37c6e627682f145856de331049013853f344f37b0c9690e3df"}, - {file = "numpy-1.23.5-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:abdde9f795cf292fb9651ed48185503a2ff29be87770c3b8e2a14b0cd7aa16f8"}, - {file = "numpy-1.23.5-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f9a909a8bae284d46bbfdefbdd4a262ba19d3bc9921b1e76126b1d21c3c34135"}, - {file = "numpy-1.23.5-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:01dd17cbb340bf0fc23981e52e1d18a9d4050792e8fb8363cecbf066a84b827d"}, - {file = "numpy-1.23.5.tar.gz", hash = "sha256:1b1766d6f397c18153d40015ddfc79ddb715cabadc04d2d228d4e5a8bc4ded1a"}, + {file = "numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0"}, + {file = "numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2"}, + {file = "numpy-1.26.4-cp310-cp310-win32.whl", hash = "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07"}, + {file = "numpy-1.26.4-cp310-cp310-win_amd64.whl", hash = "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a"}, + {file = "numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20"}, + {file = "numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0"}, + {file = "numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110"}, + {file = "numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7349ab0fa0c429c82442a27a9673fc802ffdb7c7775fad780226cb234965e53c"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:52b8b60467cd7dd1e9ed082188b4e6bb35aa5cdd01777621a1658910745b90be"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5241e0a80d808d70546c697135da2c613f30e28251ff8307eb72ba696945764"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:679b0076f67ecc0138fd2ede3a8fd196dddc2ad3254069bcb9faf9a79b1cebcd"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47711010ad8555514b434df65f7d7b076bb8261df1ca9bb78f53d3b2db02e95c"}, + {file = "numpy-1.26.4-cp39-cp39-win32.whl", hash = "sha256:a354325ee03388678242a4d7ebcd08b5c727033fcff3b2f536aea978e15ee9e6"}, + {file = "numpy-1.26.4-cp39-cp39-win_amd64.whl", hash = "sha256:3373d5d70a5fe74a2c1bb6d2cfd9609ecf686d47a2d7b1d37a8f3b6bf6003aea"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0"}, + {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, ] [[package]] @@ -1858,44 +1910,47 @@ files = [ [[package]] name = "pandas" -version = "2.2.0" +version = "2.2.1" description = "Powerful data structures for data analysis, time series, and statistics" optional = true python-versions = ">=3.9" files = [ - {file = "pandas-2.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8108ee1712bb4fa2c16981fba7e68b3f6ea330277f5ca34fa8d557e986a11670"}, - {file = "pandas-2.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:736da9ad4033aeab51d067fc3bd69a0ba36f5a60f66a527b3d72e2030e63280a"}, - {file = "pandas-2.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38e0b4fc3ddceb56ec8a287313bc22abe17ab0eb184069f08fc6a9352a769b18"}, - {file = "pandas-2.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20404d2adefe92aed3b38da41d0847a143a09be982a31b85bc7dd565bdba0f4e"}, - {file = "pandas-2.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7ea3ee3f125032bfcade3a4cf85131ed064b4f8dd23e5ce6fa16473e48ebcaf5"}, - {file = "pandas-2.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f9670b3ac00a387620489dfc1bca66db47a787f4e55911f1293063a78b108df1"}, - {file = "pandas-2.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:5a946f210383c7e6d16312d30b238fd508d80d927014f3b33fb5b15c2f895430"}, - {file = "pandas-2.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a1b438fa26b208005c997e78672f1aa8138f67002e833312e6230f3e57fa87d5"}, - {file = "pandas-2.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8ce2fbc8d9bf303ce54a476116165220a1fedf15985b09656b4b4275300e920b"}, - {file = "pandas-2.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2707514a7bec41a4ab81f2ccce8b382961a29fbe9492eab1305bb075b2b1ff4f"}, - {file = "pandas-2.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85793cbdc2d5bc32620dc8ffa715423f0c680dacacf55056ba13454a5be5de88"}, - {file = "pandas-2.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:cfd6c2491dc821b10c716ad6776e7ab311f7df5d16038d0b7458bc0b67dc10f3"}, - {file = "pandas-2.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a146b9dcacc3123aa2b399df1a284de5f46287a4ab4fbfc237eac98a92ebcb71"}, - {file = "pandas-2.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:fbc1b53c0e1fdf16388c33c3cca160f798d38aea2978004dd3f4d3dec56454c9"}, - {file = "pandas-2.2.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a41d06f308a024981dcaa6c41f2f2be46a6b186b902c94c2674e8cb5c42985bc"}, - {file = "pandas-2.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:159205c99d7a5ce89ecfc37cb08ed179de7783737cea403b295b5eda8e9c56d1"}, - {file = "pandas-2.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb1e1f3861ea9132b32f2133788f3b14911b68102d562715d71bd0013bc45440"}, - {file = "pandas-2.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:761cb99b42a69005dec2b08854fb1d4888fdf7b05db23a8c5a099e4b886a2106"}, - {file = "pandas-2.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a20628faaf444da122b2a64b1e5360cde100ee6283ae8effa0d8745153809a2e"}, - {file = "pandas-2.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:f5be5d03ea2073627e7111f61b9f1f0d9625dc3c4d8dda72cc827b0c58a1d042"}, - {file = "pandas-2.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:a626795722d893ed6aacb64d2401d017ddc8a2341b49e0384ab9bf7112bdec30"}, - {file = "pandas-2.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9f66419d4a41132eb7e9a73dcec9486cf5019f52d90dd35547af11bc58f8637d"}, - {file = "pandas-2.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:57abcaeda83fb80d447f28ab0cc7b32b13978f6f733875ebd1ed14f8fbc0f4ab"}, - {file = "pandas-2.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e60f1f7dba3c2d5ca159e18c46a34e7ca7247a73b5dd1a22b6d59707ed6b899a"}, - {file = "pandas-2.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb61dc8567b798b969bcc1fc964788f5a68214d333cade8319c7ab33e2b5d88a"}, - {file = "pandas-2.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:52826b5f4ed658fa2b729264d63f6732b8b29949c7fd234510d57c61dbeadfcd"}, - {file = "pandas-2.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bde2bc699dbd80d7bc7f9cab1e23a95c4375de615860ca089f34e7c64f4a8de7"}, - {file = "pandas-2.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:3de918a754bbf2da2381e8a3dcc45eede8cd7775b047b923f9006d5f876802ae"}, - {file = "pandas-2.2.0.tar.gz", hash = "sha256:30b83f7c3eb217fb4d1b494a57a2fda5444f17834f5df2de6b2ffff68dc3c8e2"}, -] - -[package.dependencies] -numpy = {version = ">=1.22.4,<2", markers = "python_version < \"3.11\""} + {file = "pandas-2.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8df8612be9cd1c7797c93e1c5df861b2ddda0b48b08f2c3eaa0702cf88fb5f88"}, + {file = "pandas-2.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0f573ab277252ed9aaf38240f3b54cfc90fff8e5cab70411ee1d03f5d51f3944"}, + {file = "pandas-2.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f02a3a6c83df4026e55b63c1f06476c9aa3ed6af3d89b4f04ea656ccdaaaa359"}, + {file = "pandas-2.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c38ce92cb22a4bea4e3929429aa1067a454dcc9c335799af93ba9be21b6beb51"}, + {file = "pandas-2.2.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:c2ce852e1cf2509a69e98358e8458775f89599566ac3775e70419b98615f4b06"}, + {file = "pandas-2.2.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:53680dc9b2519cbf609c62db3ed7c0b499077c7fefda564e330286e619ff0dd9"}, + {file = "pandas-2.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:94e714a1cca63e4f5939cdce5f29ba8d415d85166be3441165edd427dc9f6bc0"}, + {file = "pandas-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f821213d48f4ab353d20ebc24e4faf94ba40d76680642fb7ce2ea31a3ad94f9b"}, + {file = "pandas-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c70e00c2d894cb230e5c15e4b1e1e6b2b478e09cf27cc593a11ef955b9ecc81a"}, + {file = "pandas-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e97fbb5387c69209f134893abc788a6486dbf2f9e511070ca05eed4b930b1b02"}, + {file = "pandas-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:101d0eb9c5361aa0146f500773395a03839a5e6ecde4d4b6ced88b7e5a1a6403"}, + {file = "pandas-2.2.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:7d2ed41c319c9fb4fd454fe25372028dfa417aacb9790f68171b2e3f06eae8cd"}, + {file = "pandas-2.2.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:af5d3c00557d657c8773ef9ee702c61dd13b9d7426794c9dfeb1dc4a0bf0ebc7"}, + {file = "pandas-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:06cf591dbaefb6da9de8472535b185cba556d0ce2e6ed28e21d919704fef1a9e"}, + {file = "pandas-2.2.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:88ecb5c01bb9ca927ebc4098136038519aa5d66b44671861ffab754cae75102c"}, + {file = "pandas-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:04f6ec3baec203c13e3f8b139fb0f9f86cd8c0b94603ae3ae8ce9a422e9f5bee"}, + {file = "pandas-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a935a90a76c44fe170d01e90a3594beef9e9a6220021acfb26053d01426f7dc2"}, + {file = "pandas-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c391f594aae2fd9f679d419e9a4d5ba4bce5bb13f6a989195656e7dc4b95c8f0"}, + {file = "pandas-2.2.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9d1265545f579edf3f8f0cb6f89f234f5e44ba725a34d86535b1a1d38decbccc"}, + {file = "pandas-2.2.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:11940e9e3056576ac3244baef2fedade891977bcc1cb7e5cc8f8cc7d603edc89"}, + {file = "pandas-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:4acf681325ee1c7f950d058b05a820441075b0dd9a2adf5c4835b9bc056bf4fb"}, + {file = "pandas-2.2.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9bd8a40f47080825af4317d0340c656744f2bfdb6819f818e6ba3cd24c0e1397"}, + {file = "pandas-2.2.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:df0c37ebd19e11d089ceba66eba59a168242fc6b7155cba4ffffa6eccdfb8f16"}, + {file = "pandas-2.2.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:739cc70eaf17d57608639e74d63387b0d8594ce02f69e7a0b046f117974b3019"}, + {file = "pandas-2.2.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f9d3558d263073ed95e46f4650becff0c5e1ffe0fc3a015de3c79283dfbdb3df"}, + {file = "pandas-2.2.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4aa1d8707812a658debf03824016bf5ea0d516afdea29b7dc14cf687bc4d4ec6"}, + {file = "pandas-2.2.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:76f27a809cda87e07f192f001d11adc2b930e93a2b0c4a236fde5429527423be"}, + {file = "pandas-2.2.1-cp39-cp39-win_amd64.whl", hash = "sha256:1ba21b1d5c0e43416218db63037dbe1a01fc101dc6e6024bcad08123e48004ab"}, + {file = "pandas-2.2.1.tar.gz", hash = "sha256:0ab90f87093c13f3e8fa45b48ba9f39181046e8f3317d3aadb2fffbb1b978572"}, +] + +[package.dependencies] +numpy = [ + {version = ">=1.22.4,<2", markers = "python_version < \"3.11\""}, + {version = ">=1.23.2,<2", markers = "python_version == \"3.11\""}, +] python-dateutil = ">=2.8.2" pytz = ">=2020.1" tzdata = ">=2022.7" @@ -1919,11 +1974,27 @@ parquet = ["pyarrow (>=10.0.1)"] performance = ["bottleneck (>=1.3.6)", "numba (>=0.56.4)", "numexpr (>=2.8.4)"] plot = ["matplotlib (>=3.6.3)"] postgresql = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "psycopg2 (>=2.9.6)"] +pyarrow = ["pyarrow (>=10.0.1)"] spss = ["pyreadstat (>=1.2.0)"] sql-other = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)"] test = ["hypothesis (>=6.46.1)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)"] xml = ["lxml (>=4.9.2)"] +[[package]] +name = "parso" +version = "0.8.3" +description = "A Python Parser" +optional = false +python-versions = ">=3.6" +files = [ + {file = "parso-0.8.3-py2.py3-none-any.whl", hash = "sha256:c001d4636cd3aecdaf33cbb40aebb59b094be2a74c556778ef5576c175e19e75"}, + {file = "parso-0.8.3.tar.gz", hash = "sha256:8c07be290bb59f03588915921e29e8a50002acaf2cdc5fa0e0114f91709fafa0"}, +] + +[package.extras] +qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] +testing = ["docopt", "pytest (<6.0.0)"] + [[package]] name = "partd" version = "1.4.1" @@ -1953,6 +2024,20 @@ files = [ {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, ] +[[package]] +name = "pexpect" +version = "4.9.0" +description = "Pexpect allows easy control of interactive console applications." +optional = false +python-versions = "*" +files = [ + {file = "pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523"}, + {file = "pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f"}, +] + +[package.dependencies] +ptyprocess = ">=0.5" + [[package]] name = "pillow" version = "10.2.0" @@ -2068,26 +2153,65 @@ files = [ dev = ["pre-commit", "tox"] testing = ["pytest", "pytest-benchmark"] +[[package]] +name = "prompt-toolkit" +version = "3.0.43" +description = "Library for building powerful interactive command lines in Python" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "prompt_toolkit-3.0.43-py3-none-any.whl", hash = "sha256:a11a29cb3bf0a28a387fe5122cdb649816a957cd9261dcedf8c9f1fef33eacf6"}, + {file = "prompt_toolkit-3.0.43.tar.gz", hash = "sha256:3527b7af26106cbc65a040bcc84839a3566ec1b051bb0bfe953631e704b0ff7d"}, +] + +[package.dependencies] +wcwidth = "*" + [[package]] name = "protobuf" -version = "4.25.2" +version = "4.25.3" description = "" optional = false python-versions = ">=3.8" files = [ - {file = "protobuf-4.25.2-cp310-abi3-win32.whl", hash = "sha256:b50c949608682b12efb0b2717f53256f03636af5f60ac0c1d900df6213910fd6"}, - {file = "protobuf-4.25.2-cp310-abi3-win_amd64.whl", hash = "sha256:8f62574857ee1de9f770baf04dde4165e30b15ad97ba03ceac65f760ff018ac9"}, - {file = "protobuf-4.25.2-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:2db9f8fa64fbdcdc93767d3cf81e0f2aef176284071507e3ede160811502fd3d"}, - {file = "protobuf-4.25.2-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:10894a2885b7175d3984f2be8d9850712c57d5e7587a2410720af8be56cdaf62"}, - {file = "protobuf-4.25.2-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:fc381d1dd0516343f1440019cedf08a7405f791cd49eef4ae1ea06520bc1c020"}, - {file = "protobuf-4.25.2-cp38-cp38-win32.whl", hash = "sha256:33a1aeef4b1927431d1be780e87b641e322b88d654203a9e9d93f218ee359e61"}, - {file = "protobuf-4.25.2-cp38-cp38-win_amd64.whl", hash = "sha256:47f3de503fe7c1245f6f03bea7e8d3ec11c6c4a2ea9ef910e3221c8a15516d62"}, - {file = "protobuf-4.25.2-cp39-cp39-win32.whl", hash = "sha256:5e5c933b4c30a988b52e0b7c02641760a5ba046edc5e43d3b94a74c9fc57c1b3"}, - {file = "protobuf-4.25.2-cp39-cp39-win_amd64.whl", hash = "sha256:d66a769b8d687df9024f2985d5137a337f957a0916cf5464d1513eee96a63ff0"}, - {file = "protobuf-4.25.2-py3-none-any.whl", hash = "sha256:a8b7a98d4ce823303145bf3c1a8bdb0f2f4642a414b196f04ad9853ed0c8f830"}, - {file = "protobuf-4.25.2.tar.gz", hash = "sha256:fe599e175cb347efc8ee524bcd4b902d11f7262c0e569ececcb89995c15f0a5e"}, + {file = "protobuf-4.25.3-cp310-abi3-win32.whl", hash = "sha256:d4198877797a83cbfe9bffa3803602bbe1625dc30d8a097365dbc762e5790faa"}, + {file = "protobuf-4.25.3-cp310-abi3-win_amd64.whl", hash = "sha256:209ba4cc916bab46f64e56b85b090607a676f66b473e6b762e6f1d9d591eb2e8"}, + {file = "protobuf-4.25.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:f1279ab38ecbfae7e456a108c5c0681e4956d5b1090027c1de0f934dfdb4b35c"}, + {file = "protobuf-4.25.3-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:e7cb0ae90dd83727f0c0718634ed56837bfeeee29a5f82a7514c03ee1364c019"}, + {file = "protobuf-4.25.3-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:7c8daa26095f82482307bc717364e7c13f4f1c99659be82890dcfc215194554d"}, + {file = "protobuf-4.25.3-cp38-cp38-win32.whl", hash = "sha256:f4f118245c4a087776e0a8408be33cf09f6c547442c00395fbfb116fac2f8ac2"}, + {file = "protobuf-4.25.3-cp38-cp38-win_amd64.whl", hash = "sha256:c053062984e61144385022e53678fbded7aea14ebb3e0305ae3592fb219ccfa4"}, + {file = "protobuf-4.25.3-cp39-cp39-win32.whl", hash = "sha256:19b270aeaa0099f16d3ca02628546b8baefe2955bbe23224aaf856134eccf1e4"}, + {file = "protobuf-4.25.3-cp39-cp39-win_amd64.whl", hash = "sha256:e3c97a1555fd6388f857770ff8b9703083de6bf1f9274a002a332d65fbb56c8c"}, + {file = "protobuf-4.25.3-py3-none-any.whl", hash = "sha256:f0700d54bcf45424477e46a9f0944155b46fb0639d69728739c0e47bab83f2b9"}, + {file = "protobuf-4.25.3.tar.gz", hash = "sha256:25b5d0b42fd000320bd7830b349e3b696435f3b329810427a6bcce6a5492cc5c"}, +] + +[[package]] +name = "ptyprocess" +version = "0.7.0" +description = "Run a subprocess in a pseudo terminal" +optional = false +python-versions = "*" +files = [ + {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, + {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, +] + +[[package]] +name = "pure-eval" +version = "0.2.2" +description = "Safely evaluate AST nodes without side effects" +optional = false +python-versions = "*" +files = [ + {file = "pure_eval-0.2.2-py3-none-any.whl", hash = "sha256:01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350"}, + {file = "pure_eval-0.2.2.tar.gz", hash = "sha256:2b45320af6dfaa1750f543d714b6d1c520a1688dec6fd24d339063ce0aaa9ac3"}, ] +[package.extras] +tests = ["pytest"] + [[package]] name = "pyaml" version = "23.12.0" @@ -2229,22 +2353,32 @@ windows-terminal = ["colorama (>=0.4.6)"] [[package]] name = "pylint" -version = "2.10.0" +version = "3.0.3" description = "python code static checker" optional = false -python-versions = "~=3.6" +python-versions = ">=3.8.0" files = [ - {file = "pylint-2.10.0-py3-none-any.whl", hash = "sha256:2d01c6de5ea20443e3f7ed8ae285f75b2d4da92e840f10118ddb7da18a1e09df"}, - {file = "pylint-2.10.0.tar.gz", hash = "sha256:dcf4a5dd7bc98c68790323f783d792423c1946e7a4a195e44d7b2c2d386f457d"}, + {file = "pylint-3.0.3-py3-none-any.whl", hash = "sha256:7a1585285aefc5165db81083c3e06363a27448f6b467b3b0f30dbd0ac1f73810"}, + {file = "pylint-3.0.3.tar.gz", hash = "sha256:58c2398b0301e049609a8429789ec6edf3aabe9b6c5fec916acd18639c16de8b"}, ] [package.dependencies] -appdirs = ">=1.4.0" -astroid = ">=2.7.2,<2.8" -colorama = {version = "*", markers = "sys_platform == \"win32\""} -isort = ">=4.2.5,<6" -mccabe = ">=0.6,<0.7" -toml = ">=0.7.1" +astroid = ">=3.0.1,<=3.1.0-dev0" +colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} +dill = [ + {version = ">=0.2", markers = "python_version < \"3.11\""}, + {version = ">=0.3.6", markers = "python_version >= \"3.11\""}, +] +isort = ">=4.2.5,<5.13.0 || >5.13.0,<6" +mccabe = ">=0.6,<0.8" +platformdirs = ">=2.2.0" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} +tomlkit = ">=0.10.1" +typing-extensions = {version = ">=3.10.0", markers = "python_version < \"3.10\""} + +[package.extras] +spelling = ["pyenchant (>=3.2,<4.0)"] +testutils = ["gitpython (>3)"] [[package]] name = "pyparsing" @@ -2386,31 +2520,31 @@ files = [ [[package]] name = "ray" -version = "2.9.1" +version = "2.9.3" description = "Ray provides a simple, universal API for building distributed applications." optional = true python-versions = ">=3.8" files = [ - {file = "ray-2.9.1-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:586d462e555ba51840fbfce4d62b0ed886930e520517b34a88befeb4fb4c244a"}, - {file = "ray-2.9.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:eb3dbb0639fedf2bc2b98784bb94dbdc2c2a470c91c6b54e12c51d0a0069aebf"}, - {file = "ray-2.9.1-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:74a1d12117e87ffd7411fadb96b40bf66ca7d32fdb2049cd3dd66705a0923f9e"}, - {file = "ray-2.9.1-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:50436361012cefdd90ebb8c920711cb334cf64d7a5677c9b72e60d8c9e23ee70"}, - {file = "ray-2.9.1-cp310-cp310-win_amd64.whl", hash = "sha256:8760d406d782cbf6684c2b98c09bd4893a14c009c2287cbe65aa11cb6e7a571f"}, - {file = "ray-2.9.1-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:cd974b141088b752d1eed4d6d0cf94e8ed63b97d5f1d5f5844970f3f373dde87"}, - {file = "ray-2.9.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9e9d99496effa490f94e43c10a09964146269733cd24610d3b6902b566190a9b"}, - {file = "ray-2.9.1-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:1907649d69efdc1b9ffbc03db086f6d768216cb73908ebd4038ac5030effef9e"}, - {file = "ray-2.9.1-cp311-cp311-manylinux2014_x86_64.whl", hash = "sha256:fabc520990c1b98dde592813d62737e5e817460e0ac359f32ba029ace292cbe2"}, - {file = "ray-2.9.1-cp311-cp311-win_amd64.whl", hash = "sha256:bb0c83c0f40a5ab4139f9357d3fd4ef8a2e8b46f5c023fe45f305fe2297c520c"}, - {file = "ray-2.9.1-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:e7b1f3284b35aa98968ba8cdc8ea43f6a0afe42090711f2db678d3f73c5cb8f9"}, - {file = "ray-2.9.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:38b7a3282783f74cfd232b0e04bfde40e51e13bf3f83423ce97b2ae577a4a345"}, - {file = "ray-2.9.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:177a5a018d9ff0eef822b279f7af62ca5f5935e4d83246105868017ee298faae"}, - {file = "ray-2.9.1-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:917efa43b88d5f5de19a5ffa7c4aa0aa28399a0c33595d83c26d5b9f79dfb861"}, - {file = "ray-2.9.1-cp38-cp38-win_amd64.whl", hash = "sha256:94961e948763a101d99f9e9cfe8ba1d789f5ca030ebc8089fbf02da1d085f870"}, - {file = "ray-2.9.1-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:9efc8a2035521c5d66b625222a7b03c7759f1c0969d382697fd688577bea21a4"}, - {file = "ray-2.9.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4aa6a66fb20a35ded74674ad8d48e813afd4e65a0bc8ccd99e981bccf656ce13"}, - {file = "ray-2.9.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f063f0140bc1ea0b02f8ee59abd8e964866c1ca6c768a2b0fd19b691cf9feace"}, - {file = "ray-2.9.1-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:334c47ca24dbe59e295e2d46152c09ff113f2c2cde873181da11c24dfdacfcfb"}, - {file = "ray-2.9.1-cp39-cp39-win_amd64.whl", hash = "sha256:c2e360743ae25babfcb436250275550fd96a567c830393ff5dd7fc708875c4c9"}, + {file = "ray-2.9.3-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:09b4d3f3cacc66f256695a5f72960111815cee3986bdcf7a9c3f6f0fac144100"}, + {file = "ray-2.9.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:287eed74fa536651aa799c4295e1b27eee1650f29236fa94487985b76bffff35"}, + {file = "ray-2.9.3-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:d5334fb43468f56a52ebd8fb30f39bbc6d2a6a16ecf3d9f78be59952aa533b6a"}, + {file = "ray-2.9.3-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:c54e35eb78816c722a58f31d75f5ec82834433fa639ecf70daee0d7b182598ca"}, + {file = "ray-2.9.3-cp310-cp310-win_amd64.whl", hash = "sha256:266f890ea8bb6ce417a4890ae495082eece45ac1c1ad0db92a5f6fb52792a3bc"}, + {file = "ray-2.9.3-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:8e72b92122c612f54224ffb33ef34f437aec59f370382882f4519b6fd55bb349"}, + {file = "ray-2.9.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:615a5b8d17a69713178cdb2184c4f6d11c5d3a1a5a358bd3617f9404d782323e"}, + {file = "ray-2.9.3-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:b493412cf3f38861f517664312da40d622baa7deb8b5a9811ca1b1fb60bd444a"}, + {file = "ray-2.9.3-cp311-cp311-manylinux2014_x86_64.whl", hash = "sha256:747343a1115f7b851da287e0e2b1cd3c703c843c9dd1f522c1e47bfc76e14c9e"}, + {file = "ray-2.9.3-cp311-cp311-win_amd64.whl", hash = "sha256:606dded40b17350b2d29b1fc0cb7be7085a8f39c9576a63e450d86fc5670f01a"}, + {file = "ray-2.9.3-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:d3219d341b4f32ff9cb747783615fbdabe45a202d6e50f9a8510470d117ba40e"}, + {file = "ray-2.9.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fb4bb8db188155671125facc8ed89d1d70314959c66f2bf8dba6f087ab3024e2"}, + {file = "ray-2.9.3-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:cc064f1760775600a2edd281fcbe70f2b84ec09c9b6fd3f0cf21cbe6e0e34269"}, + {file = "ray-2.9.3-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:41f3b8d6c8ff57875dbf8b2b1c9bb8bbd7c6fc0b6c2048772ddd704f53eec653"}, + {file = "ray-2.9.3-cp38-cp38-win_amd64.whl", hash = "sha256:06fedfd0bfb875cd504870a9960a244f41d202a61388edd23b7a8513bb007de2"}, + {file = "ray-2.9.3-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:0b892cdbc7bdd3cebb5ee71811c468b922b3c99e65aeb890a522af36f1933350"}, + {file = "ray-2.9.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f597662dafd3c5b91b41f892acb1ef12e69732ced845f40060c3455192e1bd29"}, + {file = "ray-2.9.3-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:febae4acb05b132f9c49cd3b2a9dd8bfaa1cb8a52ef75f734659469956efe9f1"}, + {file = "ray-2.9.3-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:859e7be3cfcc1eb52762aa0065a3c7c57002e67e23f2858b40cf5f3081e13391"}, + {file = "ray-2.9.3-cp39-cp39-win_amd64.whl", hash = "sha256:2befd5f928c896357170bf46ac1ab197509561dce1cc733db9b235e02039dfe7"}, ] [package.dependencies] @@ -2430,16 +2564,16 @@ requests = "*" tensorboardX = {version = ">=1.9", optional = true, markers = "extra == \"tune\""} [package.extras] -air = ["aiohttp (>=3.7)", "aiohttp-cors", "aiorwlock", "colorful", "fastapi", "fsspec", "gpustat (>=1.0.0)", "grpcio (>=1.32.0)", "grpcio (>=1.42.0)", "numpy (>=1.20)", "opencensus", "pandas", "pandas (>=1.3)", "prometheus-client (>=0.7.1)", "py-spy (>=0.2.0)", "pyarrow (>=6.0.1)", "pydantic (<2.0.dev0 || >=2.5.dev0,<3)", "requests", "smart-open", "starlette", "tensorboardX (>=1.9)", "uvicorn[standard]", "virtualenv (>=20.0.24,!=20.21.1)", "watchfiles"] -all = ["aiohttp (>=3.7)", "aiohttp-cors", "aiorwlock", "colorful", "dm-tree", "fastapi", "fsspec", "gpustat (>=1.0.0)", "grpcio (!=1.56.0)", "grpcio (>=1.32.0)", "grpcio (>=1.42.0)", "gymnasium (==0.28.1)", "lz4", "numpy (>=1.20)", "opencensus", "opentelemetry-api", "opentelemetry-exporter-otlp", "opentelemetry-sdk", "pandas", "pandas (>=1.3)", "prometheus-client (>=0.7.1)", "py-spy (>=0.2.0)", "pyarrow (>=6.0.1)", "pydantic (<2.0.dev0 || >=2.5.dev0,<3)", "pyyaml", "ray-cpp (==2.9.1)", "requests", "rich", "scikit-image", "scipy", "smart-open", "starlette", "tensorboardX (>=1.9)", "typer", "uvicorn[standard]", "virtualenv (>=20.0.24,!=20.21.1)", "watchfiles"] +air = ["aiohttp (>=3.7)", "aiohttp-cors", "aiorwlock", "colorful", "fastapi (<=0.108.0)", "fsspec", "gpustat (>=1.0.0)", "grpcio (>=1.32.0)", "grpcio (>=1.42.0)", "numpy (>=1.20)", "opencensus", "pandas", "pandas (>=1.3)", "prometheus-client (>=0.7.1)", "py-spy (>=0.2.0)", "pyarrow (>=6.0.1)", "pydantic (<2.0.dev0 || >=2.5.dev0,<3)", "requests", "smart-open", "starlette", "tensorboardX (>=1.9)", "uvicorn[standard]", "virtualenv (>=20.0.24,!=20.21.1)", "watchfiles"] +all = ["aiohttp (>=3.7)", "aiohttp-cors", "aiorwlock", "colorful", "dm-tree", "fastapi (<=0.108.0)", "fsspec", "gpustat (>=1.0.0)", "grpcio (!=1.56.0)", "grpcio (>=1.32.0)", "grpcio (>=1.42.0)", "gymnasium (==0.28.1)", "lz4", "numpy (>=1.20)", "opencensus", "opentelemetry-api", "opentelemetry-exporter-otlp", "opentelemetry-sdk", "pandas", "pandas (>=1.3)", "prometheus-client (>=0.7.1)", "py-spy (>=0.2.0)", "pyarrow (>=6.0.1)", "pydantic (<2.0.dev0 || >=2.5.dev0,<3)", "pyyaml", "ray-cpp (==2.9.3)", "requests", "rich", "scikit-image", "scipy", "smart-open", "starlette", "tensorboardX (>=1.9)", "typer", "uvicorn[standard]", "virtualenv (>=20.0.24,!=20.21.1)", "watchfiles"] client = ["grpcio (!=1.56.0)"] -cpp = ["ray-cpp (==2.9.1)"] +cpp = ["ray-cpp (==2.9.3)"] data = ["fsspec", "numpy (>=1.20)", "pandas (>=1.3)", "pyarrow (>=6.0.1)"] default = ["aiohttp (>=3.7)", "aiohttp-cors", "colorful", "gpustat (>=1.0.0)", "grpcio (>=1.32.0)", "grpcio (>=1.42.0)", "opencensus", "prometheus-client (>=0.7.1)", "py-spy (>=0.2.0)", "pydantic (<2.0.dev0 || >=2.5.dev0,<3)", "requests", "smart-open", "virtualenv (>=20.0.24,!=20.21.1)"] observability = ["opentelemetry-api", "opentelemetry-exporter-otlp", "opentelemetry-sdk"] rllib = ["dm-tree", "fsspec", "gymnasium (==0.28.1)", "lz4", "pandas", "pyarrow (>=6.0.1)", "pyyaml", "requests", "rich", "scikit-image", "scipy", "tensorboardX (>=1.9)", "typer"] -serve = ["aiohttp (>=3.7)", "aiohttp-cors", "aiorwlock", "colorful", "fastapi", "gpustat (>=1.0.0)", "grpcio (>=1.32.0)", "grpcio (>=1.42.0)", "opencensus", "prometheus-client (>=0.7.1)", "py-spy (>=0.2.0)", "pydantic (<2.0.dev0 || >=2.5.dev0,<3)", "requests", "smart-open", "starlette", "uvicorn[standard]", "virtualenv (>=20.0.24,!=20.21.1)", "watchfiles"] -serve-grpc = ["aiohttp (>=3.7)", "aiohttp-cors", "aiorwlock", "colorful", "fastapi", "gpustat (>=1.0.0)", "grpcio (>=1.32.0)", "grpcio (>=1.42.0)", "opencensus", "prometheus-client (>=0.7.1)", "py-spy (>=0.2.0)", "pydantic (<2.0.dev0 || >=2.5.dev0,<3)", "requests", "smart-open", "starlette", "uvicorn[standard]", "virtualenv (>=20.0.24,!=20.21.1)", "watchfiles"] +serve = ["aiohttp (>=3.7)", "aiohttp-cors", "aiorwlock", "colorful", "fastapi (<=0.108.0)", "gpustat (>=1.0.0)", "grpcio (>=1.32.0)", "grpcio (>=1.42.0)", "opencensus", "prometheus-client (>=0.7.1)", "py-spy (>=0.2.0)", "pydantic (<2.0.dev0 || >=2.5.dev0,<3)", "requests", "smart-open", "starlette", "uvicorn[standard]", "virtualenv (>=20.0.24,!=20.21.1)", "watchfiles"] +serve-grpc = ["aiohttp (>=3.7)", "aiohttp-cors", "aiorwlock", "colorful", "fastapi (<=0.108.0)", "gpustat (>=1.0.0)", "grpcio (>=1.32.0)", "grpcio (>=1.42.0)", "opencensus", "prometheus-client (>=0.7.1)", "py-spy (>=0.2.0)", "pydantic (<2.0.dev0 || >=2.5.dev0,<3)", "requests", "smart-open", "starlette", "uvicorn[standard]", "virtualenv (>=20.0.24,!=20.21.1)", "watchfiles"] train = ["fsspec", "pandas", "pyarrow (>=6.0.1)", "requests", "tensorboardX (>=1.9)"] tune = ["fsspec", "pandas", "pyarrow (>=6.0.1)", "requests", "tensorboardX (>=1.9)"] @@ -2518,110 +2652,110 @@ jupyter = ["ipywidgets (>=7.5.1,<8.0.0)"] [[package]] name = "rpds-py" -version = "0.17.1" +version = "0.18.0" description = "Python bindings to Rust's persistent data structures (rpds)" optional = true python-versions = ">=3.8" files = [ - {file = "rpds_py-0.17.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:4128980a14ed805e1b91a7ed551250282a8ddf8201a4e9f8f5b7e6225f54170d"}, - {file = "rpds_py-0.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ff1dcb8e8bc2261a088821b2595ef031c91d499a0c1b031c152d43fe0a6ecec8"}, - {file = "rpds_py-0.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d65e6b4f1443048eb7e833c2accb4fa7ee67cc7d54f31b4f0555b474758bee55"}, - {file = "rpds_py-0.17.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a71169d505af63bb4d20d23a8fbd4c6ce272e7bce6cc31f617152aa784436f29"}, - {file = "rpds_py-0.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:436474f17733c7dca0fbf096d36ae65277e8645039df12a0fa52445ca494729d"}, - {file = "rpds_py-0.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:10162fe3f5f47c37ebf6d8ff5a2368508fe22007e3077bf25b9c7d803454d921"}, - {file = "rpds_py-0.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:720215373a280f78a1814becb1312d4e4d1077b1202a56d2b0815e95ccb99ce9"}, - {file = "rpds_py-0.17.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:70fcc6c2906cfa5c6a552ba7ae2ce64b6c32f437d8f3f8eea49925b278a61453"}, - {file = "rpds_py-0.17.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:91e5a8200e65aaac342a791272c564dffcf1281abd635d304d6c4e6b495f29dc"}, - {file = "rpds_py-0.17.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:99f567dae93e10be2daaa896e07513dd4bf9c2ecf0576e0533ac36ba3b1d5394"}, - {file = "rpds_py-0.17.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:24e4900a6643f87058a27320f81336d527ccfe503984528edde4bb660c8c8d59"}, - {file = "rpds_py-0.17.1-cp310-none-win32.whl", hash = "sha256:0bfb09bf41fe7c51413f563373e5f537eaa653d7adc4830399d4e9bdc199959d"}, - {file = "rpds_py-0.17.1-cp310-none-win_amd64.whl", hash = "sha256:20de7b7179e2031a04042e85dc463a93a82bc177eeba5ddd13ff746325558aa6"}, - {file = "rpds_py-0.17.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:65dcf105c1943cba45d19207ef51b8bc46d232a381e94dd38719d52d3980015b"}, - {file = "rpds_py-0.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:01f58a7306b64e0a4fe042047dd2b7d411ee82e54240284bab63e325762c1147"}, - {file = "rpds_py-0.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:071bc28c589b86bc6351a339114fb7a029f5cddbaca34103aa573eba7b482382"}, - {file = "rpds_py-0.17.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ae35e8e6801c5ab071b992cb2da958eee76340e6926ec693b5ff7d6381441745"}, - {file = "rpds_py-0.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:149c5cd24f729e3567b56e1795f74577aa3126c14c11e457bec1b1c90d212e38"}, - {file = "rpds_py-0.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e796051f2070f47230c745d0a77a91088fbee2cc0502e9b796b9c6471983718c"}, - {file = "rpds_py-0.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:60e820ee1004327609b28db8307acc27f5f2e9a0b185b2064c5f23e815f248f8"}, - {file = "rpds_py-0.17.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1957a2ab607f9added64478a6982742eb29f109d89d065fa44e01691a20fc20a"}, - {file = "rpds_py-0.17.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8587fd64c2a91c33cdc39d0cebdaf30e79491cc029a37fcd458ba863f8815383"}, - {file = "rpds_py-0.17.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4dc889a9d8a34758d0fcc9ac86adb97bab3fb7f0c4d29794357eb147536483fd"}, - {file = "rpds_py-0.17.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:2953937f83820376b5979318840f3ee47477d94c17b940fe31d9458d79ae7eea"}, - {file = "rpds_py-0.17.1-cp311-none-win32.whl", hash = "sha256:1bfcad3109c1e5ba3cbe2f421614e70439f72897515a96c462ea657261b96518"}, - {file = "rpds_py-0.17.1-cp311-none-win_amd64.whl", hash = "sha256:99da0a4686ada4ed0f778120a0ea8d066de1a0a92ab0d13ae68492a437db78bf"}, - {file = "rpds_py-0.17.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:1dc29db3900cb1bb40353772417800f29c3d078dbc8024fd64655a04ee3c4bdf"}, - {file = "rpds_py-0.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:82ada4a8ed9e82e443fcef87e22a3eed3654dd3adf6e3b3a0deb70f03e86142a"}, - {file = "rpds_py-0.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d36b2b59e8cc6e576f8f7b671e32f2ff43153f0ad6d0201250a7c07f25d570e"}, - {file = "rpds_py-0.17.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3677fcca7fb728c86a78660c7fb1b07b69b281964673f486ae72860e13f512ad"}, - {file = "rpds_py-0.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:516fb8c77805159e97a689e2f1c80655c7658f5af601c34ffdb916605598cda2"}, - {file = "rpds_py-0.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:df3b6f45ba4515632c5064e35ca7f31d51d13d1479673185ba8f9fefbbed58b9"}, - {file = "rpds_py-0.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a967dd6afda7715d911c25a6ba1517975acd8d1092b2f326718725461a3d33f9"}, - {file = "rpds_py-0.17.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:dbbb95e6fc91ea3102505d111b327004d1c4ce98d56a4a02e82cd451f9f57140"}, - {file = "rpds_py-0.17.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:02866e060219514940342a1f84303a1ef7a1dad0ac311792fbbe19b521b489d2"}, - {file = "rpds_py-0.17.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:2528ff96d09f12e638695f3a2e0c609c7b84c6df7c5ae9bfeb9252b6fa686253"}, - {file = "rpds_py-0.17.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:bd345a13ce06e94c753dab52f8e71e5252aec1e4f8022d24d56decd31e1b9b23"}, - {file = "rpds_py-0.17.1-cp312-none-win32.whl", hash = "sha256:2a792b2e1d3038daa83fa474d559acfd6dc1e3650ee93b2662ddc17dbff20ad1"}, - {file = "rpds_py-0.17.1-cp312-none-win_amd64.whl", hash = "sha256:292f7344a3301802e7c25c53792fae7d1593cb0e50964e7bcdcc5cf533d634e3"}, - {file = "rpds_py-0.17.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:8ffe53e1d8ef2520ebcf0c9fec15bb721da59e8ef283b6ff3079613b1e30513d"}, - {file = "rpds_py-0.17.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4341bd7579611cf50e7b20bb8c2e23512a3dc79de987a1f411cb458ab670eb90"}, - {file = "rpds_py-0.17.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f4eb548daf4836e3b2c662033bfbfc551db58d30fd8fe660314f86bf8510b93"}, - {file = "rpds_py-0.17.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b686f25377f9c006acbac63f61614416a6317133ab7fafe5de5f7dc8a06d42eb"}, - {file = "rpds_py-0.17.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4e21b76075c01d65d0f0f34302b5a7457d95721d5e0667aea65e5bb3ab415c25"}, - {file = "rpds_py-0.17.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b86b21b348f7e5485fae740d845c65a880f5d1eda1e063bc59bef92d1f7d0c55"}, - {file = "rpds_py-0.17.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f175e95a197f6a4059b50757a3dca33b32b61691bdbd22c29e8a8d21d3914cae"}, - {file = "rpds_py-0.17.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1701fc54460ae2e5efc1dd6350eafd7a760f516df8dbe51d4a1c79d69472fbd4"}, - {file = "rpds_py-0.17.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:9051e3d2af8f55b42061603e29e744724cb5f65b128a491446cc029b3e2ea896"}, - {file = "rpds_py-0.17.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:7450dbd659fed6dd41d1a7d47ed767e893ba402af8ae664c157c255ec6067fde"}, - {file = "rpds_py-0.17.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:5a024fa96d541fd7edaa0e9d904601c6445e95a729a2900c5aec6555fe921ed6"}, - {file = "rpds_py-0.17.1-cp38-none-win32.whl", hash = "sha256:da1ead63368c04a9bded7904757dfcae01eba0e0f9bc41d3d7f57ebf1c04015a"}, - {file = "rpds_py-0.17.1-cp38-none-win_amd64.whl", hash = "sha256:841320e1841bb53fada91c9725e766bb25009cfd4144e92298db296fb6c894fb"}, - {file = "rpds_py-0.17.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:f6c43b6f97209e370124baf2bf40bb1e8edc25311a158867eb1c3a5d449ebc7a"}, - {file = "rpds_py-0.17.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5e7d63ec01fe7c76c2dbb7e972fece45acbb8836e72682bde138e7e039906e2c"}, - {file = "rpds_py-0.17.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81038ff87a4e04c22e1d81f947c6ac46f122e0c80460b9006e6517c4d842a6ec"}, - {file = "rpds_py-0.17.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:810685321f4a304b2b55577c915bece4c4a06dfe38f6e62d9cc1d6ca8ee86b99"}, - {file = "rpds_py-0.17.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:25f071737dae674ca8937a73d0f43f5a52e92c2d178330b4c0bb6ab05586ffa6"}, - {file = "rpds_py-0.17.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aa5bfb13f1e89151ade0eb812f7b0d7a4d643406caaad65ce1cbabe0a66d695f"}, - {file = "rpds_py-0.17.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dfe07308b311a8293a0d5ef4e61411c5c20f682db6b5e73de6c7c8824272c256"}, - {file = "rpds_py-0.17.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a000133a90eea274a6f28adc3084643263b1e7c1a5a66eb0a0a7a36aa757ed74"}, - {file = "rpds_py-0.17.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:5d0e8a6434a3fbf77d11448c9c25b2f25244226cfbec1a5159947cac5b8c5fa4"}, - {file = "rpds_py-0.17.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:efa767c220d94aa4ac3a6dd3aeb986e9f229eaf5bce92d8b1b3018d06bed3772"}, - {file = "rpds_py-0.17.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:dbc56680ecf585a384fbd93cd42bc82668b77cb525343170a2d86dafaed2a84b"}, - {file = "rpds_py-0.17.1-cp39-none-win32.whl", hash = "sha256:270987bc22e7e5a962b1094953ae901395e8c1e1e83ad016c5cfcfff75a15a3f"}, - {file = "rpds_py-0.17.1-cp39-none-win_amd64.whl", hash = "sha256:2a7b2f2f56a16a6d62e55354dd329d929560442bd92e87397b7a9586a32e3e76"}, - {file = "rpds_py-0.17.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:a3264e3e858de4fc601741498215835ff324ff2482fd4e4af61b46512dd7fc83"}, - {file = "rpds_py-0.17.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:f2f3b28b40fddcb6c1f1f6c88c6f3769cd933fa493ceb79da45968a21dccc920"}, - {file = "rpds_py-0.17.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9584f8f52010295a4a417221861df9bea4c72d9632562b6e59b3c7b87a1522b7"}, - {file = "rpds_py-0.17.1-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c64602e8be701c6cfe42064b71c84ce62ce66ddc6422c15463fd8127db3d8066"}, - {file = "rpds_py-0.17.1-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:060f412230d5f19fc8c8b75f315931b408d8ebf56aec33ef4168d1b9e54200b1"}, - {file = "rpds_py-0.17.1-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b9412abdf0ba70faa6e2ee6c0cc62a8defb772e78860cef419865917d86c7342"}, - {file = "rpds_py-0.17.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9737bdaa0ad33d34c0efc718741abaafce62fadae72c8b251df9b0c823c63b22"}, - {file = "rpds_py-0.17.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9f0e4dc0f17dcea4ab9d13ac5c666b6b5337042b4d8f27e01b70fae41dd65c57"}, - {file = "rpds_py-0.17.1-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:1db228102ab9d1ff4c64148c96320d0be7044fa28bd865a9ce628ce98da5973d"}, - {file = "rpds_py-0.17.1-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:d8bbd8e56f3ba25a7d0cf980fc42b34028848a53a0e36c9918550e0280b9d0b6"}, - {file = "rpds_py-0.17.1-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:be22ae34d68544df293152b7e50895ba70d2a833ad9566932d750d3625918b82"}, - {file = "rpds_py-0.17.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:bf046179d011e6114daf12a534d874958b039342b347348a78b7cdf0dd9d6041"}, - {file = "rpds_py-0.17.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:1a746a6d49665058a5896000e8d9d2f1a6acba8a03b389c1e4c06e11e0b7f40d"}, - {file = "rpds_py-0.17.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f0b8bf5b8db49d8fd40f54772a1dcf262e8be0ad2ab0206b5a2ec109c176c0a4"}, - {file = "rpds_py-0.17.1-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f7f4cb1f173385e8a39c29510dd11a78bf44e360fb75610594973f5ea141028b"}, - {file = "rpds_py-0.17.1-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7fbd70cb8b54fe745301921b0816c08b6d917593429dfc437fd024b5ba713c58"}, - {file = "rpds_py-0.17.1-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9bdf1303df671179eaf2cb41e8515a07fc78d9d00f111eadbe3e14262f59c3d0"}, - {file = "rpds_py-0.17.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fad059a4bd14c45776600d223ec194e77db6c20255578bb5bcdd7c18fd169361"}, - {file = "rpds_py-0.17.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3664d126d3388a887db44c2e293f87d500c4184ec43d5d14d2d2babdb4c64cad"}, - {file = "rpds_py-0.17.1-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:698ea95a60c8b16b58be9d854c9f993c639f5c214cf9ba782eca53a8789d6b19"}, - {file = "rpds_py-0.17.1-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:c3d2010656999b63e628a3c694f23020322b4178c450dc478558a2b6ef3cb9bb"}, - {file = "rpds_py-0.17.1-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:938eab7323a736533f015e6069a7d53ef2dcc841e4e533b782c2bfb9fb12d84b"}, - {file = "rpds_py-0.17.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:1e626b365293a2142a62b9a614e1f8e331b28f3ca57b9f05ebbf4cf2a0f0bdc5"}, - {file = "rpds_py-0.17.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:380e0df2e9d5d5d339803cfc6d183a5442ad7ab3c63c2a0982e8c824566c5ccc"}, - {file = "rpds_py-0.17.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b760a56e080a826c2e5af09002c1a037382ed21d03134eb6294812dda268c811"}, - {file = "rpds_py-0.17.1-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5576ee2f3a309d2bb403ec292d5958ce03953b0e57a11d224c1f134feaf8c40f"}, - {file = "rpds_py-0.17.1-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1f3c3461ebb4c4f1bbc70b15d20b565759f97a5aaf13af811fcefc892e9197ba"}, - {file = "rpds_py-0.17.1-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:637b802f3f069a64436d432117a7e58fab414b4e27a7e81049817ae94de45d8d"}, - {file = "rpds_py-0.17.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffee088ea9b593cc6160518ba9bd319b5475e5f3e578e4552d63818773c6f56a"}, - {file = "rpds_py-0.17.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3ac732390d529d8469b831949c78085b034bff67f584559340008d0f6041a049"}, - {file = "rpds_py-0.17.1-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:93432e747fb07fa567ad9cc7aaadd6e29710e515aabf939dfbed8046041346c6"}, - {file = "rpds_py-0.17.1-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:7b7d9ca34542099b4e185b3c2a2b2eda2e318a7dbde0b0d83357a6d4421b5296"}, - {file = "rpds_py-0.17.1-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:0387ce69ba06e43df54e43968090f3626e231e4bc9150e4c3246947567695f68"}, - {file = "rpds_py-0.17.1.tar.gz", hash = "sha256:0210b2668f24c078307260bf88bdac9d6f1093635df5123789bfee4d8d7fc8e7"}, + {file = "rpds_py-0.18.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:5b4e7d8d6c9b2e8ee2d55c90b59c707ca59bc30058269b3db7b1f8df5763557e"}, + {file = "rpds_py-0.18.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c463ed05f9dfb9baebef68048aed8dcdc94411e4bf3d33a39ba97e271624f8f7"}, + {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01e36a39af54a30f28b73096dd39b6802eddd04c90dbe161c1b8dbe22353189f"}, + {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d62dec4976954a23d7f91f2f4530852b0c7608116c257833922a896101336c51"}, + {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dd18772815d5f008fa03d2b9a681ae38d5ae9f0e599f7dda233c439fcaa00d40"}, + {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:923d39efa3cfb7279a0327e337a7958bff00cc447fd07a25cddb0a1cc9a6d2da"}, + {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39514da80f971362f9267c600b6d459bfbbc549cffc2cef8e47474fddc9b45b1"}, + {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a34d557a42aa28bd5c48a023c570219ba2593bcbbb8dc1b98d8cf5d529ab1434"}, + {file = "rpds_py-0.18.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:93df1de2f7f7239dc9cc5a4a12408ee1598725036bd2dedadc14d94525192fc3"}, + {file = "rpds_py-0.18.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:34b18ba135c687f4dac449aa5157d36e2cbb7c03cbea4ddbd88604e076aa836e"}, + {file = "rpds_py-0.18.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c0b5dcf9193625afd8ecc92312d6ed78781c46ecbf39af9ad4681fc9f464af88"}, + {file = "rpds_py-0.18.0-cp310-none-win32.whl", hash = "sha256:c4325ff0442a12113a6379af66978c3fe562f846763287ef66bdc1d57925d337"}, + {file = "rpds_py-0.18.0-cp310-none-win_amd64.whl", hash = "sha256:7223a2a5fe0d217e60a60cdae28d6949140dde9c3bcc714063c5b463065e3d66"}, + {file = "rpds_py-0.18.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:3a96e0c6a41dcdba3a0a581bbf6c44bb863f27c541547fb4b9711fd8cf0ffad4"}, + {file = "rpds_py-0.18.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30f43887bbae0d49113cbaab729a112251a940e9b274536613097ab8b4899cf6"}, + {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fcb25daa9219b4cf3a0ab24b0eb9a5cc8949ed4dc72acb8fa16b7e1681aa3c58"}, + {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d68c93e381010662ab873fea609bf6c0f428b6d0bb00f2c6939782e0818d37bf"}, + {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b34b7aa8b261c1dbf7720b5d6f01f38243e9b9daf7e6b8bc1fd4657000062f2c"}, + {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2e6d75ab12b0bbab7215e5d40f1e5b738aa539598db27ef83b2ec46747df90e1"}, + {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b8612cd233543a3781bc659c731b9d607de65890085098986dfd573fc2befe5"}, + {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:aec493917dd45e3c69d00a8874e7cbed844efd935595ef78a0f25f14312e33c6"}, + {file = "rpds_py-0.18.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:661d25cbffaf8cc42e971dd570d87cb29a665f49f4abe1f9e76be9a5182c4688"}, + {file = "rpds_py-0.18.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1df3659d26f539ac74fb3b0c481cdf9d725386e3552c6fa2974f4d33d78e544b"}, + {file = "rpds_py-0.18.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a1ce3ba137ed54f83e56fb983a5859a27d43a40188ba798993812fed73c70836"}, + {file = "rpds_py-0.18.0-cp311-none-win32.whl", hash = "sha256:69e64831e22a6b377772e7fb337533c365085b31619005802a79242fee620bc1"}, + {file = "rpds_py-0.18.0-cp311-none-win_amd64.whl", hash = "sha256:998e33ad22dc7ec7e030b3df701c43630b5bc0d8fbc2267653577e3fec279afa"}, + {file = "rpds_py-0.18.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:7f2facbd386dd60cbbf1a794181e6aa0bd429bd78bfdf775436020172e2a23f0"}, + {file = "rpds_py-0.18.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1d9a5be316c15ffb2b3c405c4ff14448c36b4435be062a7f578ccd8b01f0c4d8"}, + {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd5bf1af8efe569654bbef5a3e0a56eca45f87cfcffab31dd8dde70da5982475"}, + {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5417558f6887e9b6b65b4527232553c139b57ec42c64570569b155262ac0754f"}, + {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:56a737287efecafc16f6d067c2ea0117abadcd078d58721f967952db329a3e5c"}, + {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8f03bccbd8586e9dd37219bce4d4e0d3ab492e6b3b533e973fa08a112cb2ffc9"}, + {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4457a94da0d5c53dc4b3e4de1158bdab077db23c53232f37a3cb7afdb053a4e3"}, + {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0ab39c1ba9023914297dd88ec3b3b3c3f33671baeb6acf82ad7ce883f6e8e157"}, + {file = "rpds_py-0.18.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9d54553c1136b50fd12cc17e5b11ad07374c316df307e4cfd6441bea5fb68496"}, + {file = "rpds_py-0.18.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0af039631b6de0397ab2ba16eaf2872e9f8fca391b44d3d8cac317860a700a3f"}, + {file = "rpds_py-0.18.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:84ffab12db93b5f6bad84c712c92060a2d321b35c3c9960b43d08d0f639d60d7"}, + {file = "rpds_py-0.18.0-cp312-none-win32.whl", hash = "sha256:685537e07897f173abcf67258bee3c05c374fa6fff89d4c7e42fb391b0605e98"}, + {file = "rpds_py-0.18.0-cp312-none-win_amd64.whl", hash = "sha256:e003b002ec72c8d5a3e3da2989c7d6065b47d9eaa70cd8808b5384fbb970f4ec"}, + {file = "rpds_py-0.18.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:08f9ad53c3f31dfb4baa00da22f1e862900f45908383c062c27628754af2e88e"}, + {file = "rpds_py-0.18.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c0013fe6b46aa496a6749c77e00a3eb07952832ad6166bd481c74bda0dcb6d58"}, + {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e32a92116d4f2a80b629778280103d2a510a5b3f6314ceccd6e38006b5e92dcb"}, + {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e541ec6f2ec456934fd279a3120f856cd0aedd209fc3852eca563f81738f6861"}, + {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bed88b9a458e354014d662d47e7a5baafd7ff81c780fd91584a10d6ec842cb73"}, + {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2644e47de560eb7bd55c20fc59f6daa04682655c58d08185a9b95c1970fa1e07"}, + {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e8916ae4c720529e18afa0b879473049e95949bf97042e938530e072fde061d"}, + {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:465a3eb5659338cf2a9243e50ad9b2296fa15061736d6e26240e713522b6235c"}, + {file = "rpds_py-0.18.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:ea7d4a99f3b38c37eac212dbd6ec42b7a5ec51e2c74b5d3223e43c811609e65f"}, + {file = "rpds_py-0.18.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:67071a6171e92b6da534b8ae326505f7c18022c6f19072a81dcf40db2638767c"}, + {file = "rpds_py-0.18.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:41ef53e7c58aa4ef281da975f62c258950f54b76ec8e45941e93a3d1d8580594"}, + {file = "rpds_py-0.18.0-cp38-none-win32.whl", hash = "sha256:fdea4952db2793c4ad0bdccd27c1d8fdd1423a92f04598bc39425bcc2b8ee46e"}, + {file = "rpds_py-0.18.0-cp38-none-win_amd64.whl", hash = "sha256:7cd863afe7336c62ec78d7d1349a2f34c007a3cc6c2369d667c65aeec412a5b1"}, + {file = "rpds_py-0.18.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:5307def11a35f5ae4581a0b658b0af8178c65c530e94893345bebf41cc139d33"}, + {file = "rpds_py-0.18.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:77f195baa60a54ef9d2de16fbbfd3ff8b04edc0c0140a761b56c267ac11aa467"}, + {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39f5441553f1c2aed4de4377178ad8ff8f9d733723d6c66d983d75341de265ab"}, + {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9a00312dea9310d4cb7dbd7787e722d2e86a95c2db92fbd7d0155f97127bcb40"}, + {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8f2fc11e8fe034ee3c34d316d0ad8808f45bc3b9ce5857ff29d513f3ff2923a1"}, + {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:586f8204935b9ec884500498ccc91aa869fc652c40c093bd9e1471fbcc25c022"}, + {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ddc2f4dfd396c7bfa18e6ce371cba60e4cf9d2e5cdb71376aa2da264605b60b9"}, + {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5ddcba87675b6d509139d1b521e0c8250e967e63b5909a7e8f8944d0f90ff36f"}, + {file = "rpds_py-0.18.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:7bd339195d84439cbe5771546fe8a4e8a7a045417d8f9de9a368c434e42a721e"}, + {file = "rpds_py-0.18.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:d7c36232a90d4755b720fbd76739d8891732b18cf240a9c645d75f00639a9024"}, + {file = "rpds_py-0.18.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:6b0817e34942b2ca527b0e9298373e7cc75f429e8da2055607f4931fded23e20"}, + {file = "rpds_py-0.18.0-cp39-none-win32.whl", hash = "sha256:99f70b740dc04d09e6b2699b675874367885217a2e9f782bdf5395632ac663b7"}, + {file = "rpds_py-0.18.0-cp39-none-win_amd64.whl", hash = "sha256:6ef687afab047554a2d366e112dd187b62d261d49eb79b77e386f94644363294"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ad36cfb355e24f1bd37cac88c112cd7730873f20fb0bdaf8ba59eedf8216079f"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:36b3ee798c58ace201289024b52788161e1ea133e4ac93fba7d49da5fec0ef9e"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8a2f084546cc59ea99fda8e070be2fd140c3092dc11524a71aa8f0f3d5a55ca"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e4461d0f003a0aa9be2bdd1b798a041f177189c1a0f7619fe8c95ad08d9a45d7"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8db715ebe3bb7d86d77ac1826f7d67ec11a70dbd2376b7cc214199360517b641"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:793968759cd0d96cac1e367afd70c235867831983f876a53389ad869b043c948"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66e6a3af5a75363d2c9a48b07cb27c4ea542938b1a2e93b15a503cdfa8490795"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6ef0befbb5d79cf32d0266f5cff01545602344eda89480e1dd88aca964260b18"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:1d4acf42190d449d5e89654d5c1ed3a4f17925eec71f05e2a41414689cda02d1"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:a5f446dd5055667aabaee78487f2b5ab72e244f9bc0b2ffebfeec79051679984"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:9dbbeb27f4e70bfd9eec1be5477517365afe05a9b2c441a0b21929ee61048124"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:22806714311a69fd0af9b35b7be97c18a0fc2826e6827dbb3a8c94eac6cf7eeb"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:b34ae4636dfc4e76a438ab826a0d1eed2589ca7d9a1b2d5bb546978ac6485461"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c8370641f1a7f0e0669ddccca22f1da893cef7628396431eb445d46d893e5cd"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c8362467a0fdeccd47935f22c256bec5e6abe543bf0d66e3d3d57a8fb5731863"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:11a8c85ef4a07a7638180bf04fe189d12757c696eb41f310d2426895356dcf05"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b316144e85316da2723f9d8dc75bada12fa58489a527091fa1d5a612643d1a0e"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf1ea2e34868f6fbf070e1af291c8180480310173de0b0c43fc38a02929fc0e3"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e546e768d08ad55b20b11dbb78a745151acbd938f8f00d0cfbabe8b0199b9880"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:4901165d170a5fde6f589acb90a6b33629ad1ec976d4529e769c6f3d885e3e80"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:618a3d6cae6ef8ec88bb76dd80b83cfe415ad4f1d942ca2a903bf6b6ff97a2da"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:ed4eb745efbff0a8e9587d22a84be94a5eb7d2d99c02dacf7bd0911713ed14dd"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:6c81e5f372cd0dc5dc4809553d34f832f60a46034a5f187756d9b90586c2c307"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:43fbac5f22e25bee1d482c97474f930a353542855f05c1161fd804c9dc74a09d"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d7faa6f14017c0b1e69f5e2c357b998731ea75a442ab3841c0dbbbfe902d2c4"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:08231ac30a842bd04daabc4d71fddd7e6d26189406d5a69535638e4dcb88fe76"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:044a3e61a7c2dafacae99d1e722cc2d4c05280790ec5a05031b3876809d89a5c"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3f26b5bd1079acdb0c7a5645e350fe54d16b17bfc5e71f371c449383d3342e17"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:482103aed1dfe2f3b71a58eff35ba105289b8d862551ea576bd15479aba01f66"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1374f4129f9bcca53a1bba0bb86bf78325a0374577cf7e9e4cd046b1e6f20e24"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:635dc434ff724b178cb192c70016cc0ad25a275228f749ee0daf0eddbc8183b1"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:bc362ee4e314870a70f4ae88772d72d877246537d9f8cb8f7eacf10884862432"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:4832d7d380477521a8c1644bbab6588dfedea5e30a7d967b5fb75977c45fd77f"}, + {file = "rpds_py-0.18.0.tar.gz", hash = "sha256:42821446ee7a76f5d9f71f9e33a4fb2ffd724bb3e7f93386150b61a43115788d"}, ] [[package]] @@ -2640,57 +2774,37 @@ pyasn1 = ">=0.1.3" [[package]] name = "scikit-learn" -version = "1.4.0" +version = "1.4.1.post1" description = "A set of python modules for machine learning and data mining" optional = true python-versions = ">=3.9" files = [ - {file = "scikit-learn-1.4.0.tar.gz", hash = "sha256:d4373c984eba20e393216edd51a3e3eede56cbe93d4247516d205643c3b93121"}, - {file = "scikit_learn-1.4.0-1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:fce93a7473e2f4ee4cc280210968288d6a7d7ad8dc6fa7bb7892145e407085f9"}, - {file = "scikit_learn-1.4.0-1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:d77df3d1e15fc37a9329999979fa7868ba8655dbab21fe97fc7ddabac9e08cc7"}, - {file = "scikit_learn-1.4.0-1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2404659fedec40eeafa310cd14d613e564d13dbf8f3c752d31c095195ec05de6"}, - {file = "scikit_learn-1.4.0-1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e98632da8f6410e6fb6bf66937712c949b4010600ccd3f22a5388a83e610cc3c"}, - {file = "scikit_learn-1.4.0-1-cp310-cp310-win_amd64.whl", hash = "sha256:11b3b140f70fbc9f6a08884631ae8dd60a4bb2d7d6d1de92738ea42b740d8992"}, - {file = "scikit_learn-1.4.0-1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a8341eabdc754d5ab91641a7763243845e96b6d68e03e472531e88a4f1b09f21"}, - {file = "scikit_learn-1.4.0-1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:d1f6bce875ac2bb6b52514f67c185c564ccd299a05b65b7bab091a4c13dde12d"}, - {file = "scikit_learn-1.4.0-1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c408b46b2fd61952d519ea1af2f8f0a7a703e1433923ab1704c4131520b2083b"}, - {file = "scikit_learn-1.4.0-1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b465dd1dcd237b7b1dcd1a9048ccbf70a98c659474324fa708464c3a2533fad"}, - {file = "scikit_learn-1.4.0-1-cp311-cp311-win_amd64.whl", hash = "sha256:0db8e22c42f7980fe5eb22069b1f84c48966f3e0d23a01afde5999e3987a2501"}, - {file = "scikit_learn-1.4.0-1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e7eef6ea2ed289af40e88c0be9f7704ca8b5de18508a06897c3fe21e0905efdf"}, - {file = "scikit_learn-1.4.0-1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:349669b01435bc4dbf25c6410b0892073befdaec52637d1a1d1ff53865dc8db3"}, - {file = "scikit_learn-1.4.0-1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d439c584e58434d0350701bd33f6c10b309e851fccaf41c121aed55f6851d8cf"}, - {file = "scikit_learn-1.4.0-1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0e2427d9ef46477625ab9b55c1882844fe6fc500f418c3f8e650200182457bc"}, - {file = "scikit_learn-1.4.0-1-cp312-cp312-win_amd64.whl", hash = "sha256:d3d75343940e7bf9b85c830c93d34039fa015eeb341c5c0b4cd7a90dadfe00d4"}, - {file = "scikit_learn-1.4.0-1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:76986d22e884ab062b1beecdd92379656e9d3789ecc1f9870923c178de55f9fe"}, - {file = "scikit_learn-1.4.0-1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:e22446ad89f1cb7657f0d849dcdc345b48e2d10afa3daf2925fdb740f85b714c"}, - {file = "scikit_learn-1.4.0-1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:74812c9eabb265be69d738a8ea8d4884917a59637fcbf88a5f0e9020498bc6b3"}, - {file = "scikit_learn-1.4.0-1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aad2a63e0dd386b92da3270887a29b308af4d7c750d8c4995dfd9a4798691bcc"}, - {file = "scikit_learn-1.4.0-1-cp39-cp39-win_amd64.whl", hash = "sha256:53b9e29177897c37e2ff9d4ba6ca12fdb156e22523e463db05def303f5c72b5c"}, - {file = "scikit_learn-1.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:cb8f044a8f5962613ce1feb4351d66f8d784bd072d36393582f351859b065f7d"}, - {file = "scikit_learn-1.4.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:a6372c90bbf302387792108379f1ec77719c1618d88496d0df30cb8e370b4661"}, - {file = "scikit_learn-1.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:785ce3c352bf697adfda357c3922c94517a9376002971bc5ea50896144bc8916"}, - {file = "scikit_learn-1.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0aba2a20d89936d6e72d95d05e3bf1db55bca5c5920926ad7b92c34f5e7d3bbe"}, - {file = "scikit_learn-1.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:2bac5d56b992f8f06816f2cd321eb86071c6f6d44bb4b1cb3d626525820d754b"}, - {file = "scikit_learn-1.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:27ae4b0f1b2c77107c096a7e05b33458354107b47775428d1f11b23e30a73e8a"}, - {file = "scikit_learn-1.4.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:5c5c62ffb52c3ffb755eb21fa74cc2cbf2c521bd53f5c04eaa10011dbecf5f80"}, - {file = "scikit_learn-1.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f0d2018ac6fa055dab65fe8a485967990d33c672d55bc254c56c35287b02fab"}, - {file = "scikit_learn-1.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:91a8918c415c4b4bf1d60c38d32958849a9191c2428ab35d30b78354085c7c7a"}, - {file = "scikit_learn-1.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:80a21de63275f8bcd7877b3e781679d2ff1eddfed515a599f95b2502a3283d42"}, - {file = "scikit_learn-1.4.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:0f33bbafb310c26b81c4d41ecaebdbc1f63498a3f13461d50ed9a2e8f24d28e4"}, - {file = "scikit_learn-1.4.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:8b6ac1442ec714b4911e5aef8afd82c691b5c88b525ea58299d455acc4e8dcec"}, - {file = "scikit_learn-1.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:05fc5915b716c6cc60a438c250108e9a9445b522975ed37e416d5ea4f9a63381"}, - {file = "scikit_learn-1.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:842b7d6989f3c574685e18da6f91223eb32301d0f93903dd399894250835a6f7"}, - {file = "scikit_learn-1.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:88bcb586fdff865372df1bc6be88bb7e6f9e0aa080dab9f54f5cac7eca8e2b6b"}, - {file = "scikit_learn-1.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f77674647dd31f56cb12ed13ed25b6ed43a056fffef051715022d2ebffd7a7d1"}, - {file = "scikit_learn-1.4.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:833999872e2920ce00f3a50839946bdac7539454e200eb6db54898a41f4bfd43"}, - {file = "scikit_learn-1.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:970ec697accaef10fb4f51763f3a7b1250f9f0553cf05514d0e94905322a0172"}, - {file = "scikit_learn-1.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:923d778f378ebacca2c672ab1740e5a413e437fb45ab45ab02578f8b689e5d43"}, - {file = "scikit_learn-1.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:1d041bc95006b545b59e458399e3175ab11ca7a03dc9a74a573ac891f5df1489"}, + {file = "scikit-learn-1.4.1.post1.tar.gz", hash = "sha256:93d3d496ff1965470f9977d05e5ec3376fb1e63b10e4fda5e39d23c2d8969a30"}, + {file = "scikit_learn-1.4.1.post1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c540aaf44729ab5cd4bd5e394f2b375e65ceaea9cdd8c195788e70433d91bbc5"}, + {file = "scikit_learn-1.4.1.post1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:4310bff71aa98b45b46cd26fa641309deb73a5d1c0461d181587ad4f30ea3c36"}, + {file = "scikit_learn-1.4.1.post1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f43dd527dabff5521af2786a2f8de5ba381e182ec7292663508901cf6ceaf6e"}, + {file = "scikit_learn-1.4.1.post1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c02e27d65b0c7dc32f2c5eb601aaf5530b7a02bfbe92438188624524878336f2"}, + {file = "scikit_learn-1.4.1.post1-cp310-cp310-win_amd64.whl", hash = "sha256:629e09f772ad42f657ca60a1a52342eef786218dd20cf1369a3b8d085e55ef8f"}, + {file = "scikit_learn-1.4.1.post1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6145dfd9605b0b50ae72cdf72b61a2acd87501369a763b0d73d004710ebb76b5"}, + {file = "scikit_learn-1.4.1.post1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:1afed6951bc9d2053c6ee9a518a466cbc9b07c6a3f9d43bfe734192b6125d508"}, + {file = "scikit_learn-1.4.1.post1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce03506ccf5f96b7e9030fea7eb148999b254c44c10182ac55857bc9b5d4815f"}, + {file = "scikit_learn-1.4.1.post1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ba516fcdc73d60e7f48cbb0bccb9acbdb21807de3651531208aac73c758e3ab"}, + {file = "scikit_learn-1.4.1.post1-cp311-cp311-win_amd64.whl", hash = "sha256:78cd27b4669513b50db4f683ef41ea35b5dddc797bd2bbd990d49897fd1c8a46"}, + {file = "scikit_learn-1.4.1.post1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a1e289f33f613cefe6707dead50db31930530dc386b6ccff176c786335a7b01c"}, + {file = "scikit_learn-1.4.1.post1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:0df87de9ce1c0140f2818beef310fb2e2afdc1e66fc9ad587965577f17733649"}, + {file = "scikit_learn-1.4.1.post1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:712c1c69c45b58ef21635360b3d0a680ff7d83ac95b6f9b82cf9294070cda710"}, + {file = "scikit_learn-1.4.1.post1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1754b0c2409d6ed5a3380512d0adcf182a01363c669033a2b55cca429ed86a81"}, + {file = "scikit_learn-1.4.1.post1-cp312-cp312-win_amd64.whl", hash = "sha256:1d491ef66e37f4e812db7e6c8286520c2c3fc61b34bf5e59b67b4ce528de93af"}, + {file = "scikit_learn-1.4.1.post1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:aa0029b78ef59af22cfbd833e8ace8526e4df90212db7ceccbea582ebb5d6794"}, + {file = "scikit_learn-1.4.1.post1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:14e4c88436ac96bf69eb6d746ac76a574c314a23c6961b7d344b38877f20fee1"}, + {file = "scikit_learn-1.4.1.post1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7cd3a77c32879311f2aa93466d3c288c955ef71d191503cf0677c3340ae8ae0"}, + {file = "scikit_learn-1.4.1.post1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2a3ee19211ded1a52ee37b0a7b373a8bfc66f95353af058a210b692bd4cda0dd"}, + {file = "scikit_learn-1.4.1.post1-cp39-cp39-win_amd64.whl", hash = "sha256:234b6bda70fdcae9e4abbbe028582ce99c280458665a155eed0b820599377d25"}, ] [package.dependencies] joblib = ">=1.2.0" -numpy = ">=1.19.5" +numpy = ">=1.19.5,<2.0" scipy = ">=1.6.0" threadpoolctl = ">=2.0.0" @@ -2765,19 +2879,19 @@ test = ["asv", "gmpy2", "hypothesis", "mpmath", "pooch", "pytest", "pytest-cov", [[package]] name = "setuptools" -version = "69.0.3" +version = "69.1.1" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "setuptools-69.0.3-py3-none-any.whl", hash = "sha256:385eb4edd9c9d5c17540511303e39a147ce2fc04bc55289c322b9e5904fe2c05"}, - {file = "setuptools-69.0.3.tar.gz", hash = "sha256:be1af57fc409f93647f2e8e4573a142ed38724b8cdd389706a867bb4efcf1e78"}, + {file = "setuptools-69.1.1-py3-none-any.whl", hash = "sha256:02fa291a0471b3a18b2b2481ed902af520c69e8ae0919c13da936542754b4c56"}, + {file = "setuptools-69.1.1.tar.gz", hash = "sha256:5c0806c7d9af348e6dd3777b4f4dbb42c7ad85b190104837488eab9a7c945cf8"}, ] [package.extras] docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] -testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.1)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.2)", "pip (>=19.1)", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff (>=0.2.1)", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.2)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] [[package]] name = "six" @@ -3034,6 +3148,25 @@ lint = ["docutils-stubs", "flake8", "mypy"] standalone = ["Sphinx (>=5)"] test = ["pytest"] +[[package]] +name = "stack-data" +version = "0.6.3" +description = "Extract data from python stack frames and tracebacks for informative displays" +optional = false +python-versions = "*" +files = [ + {file = "stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695"}, + {file = "stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9"}, +] + +[package.dependencies] +asttokens = ">=2.1.0" +executing = ">=1.2.0" +pure-eval = "*" + +[package.extras] +tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] + [[package]] name = "sympy" version = "1.12" @@ -3050,22 +3183,22 @@ mpmath = ">=0.19" [[package]] name = "tensorboard" -version = "2.14.1" +version = "2.15.2" description = "TensorBoard lets you watch Tensors Flow" optional = false python-versions = ">=3.9" files = [ - {file = "tensorboard-2.14.1-py3-none-any.whl", hash = "sha256:3db108fb58f023b6439880e177743c5f1e703e9eeb5fb7d597871f949f85fd58"}, + {file = "tensorboard-2.15.2-py3-none-any.whl", hash = "sha256:a6f6443728064d962caea6d34653e220e34ef8df764cb06a8212c17e1a8f0622"}, ] [package.dependencies] absl-py = ">=0.4" google-auth = ">=1.6.3,<3" -google-auth-oauthlib = ">=0.5,<1.1" +google-auth-oauthlib = ">=0.5,<2" grpcio = ">=1.48.2" markdown = ">=2.6.8" numpy = ">=1.12.0" -protobuf = ">=3.19.6" +protobuf = ">=3.19.6,<4.24.0 || >4.24.0" requests = ">=2.21.0,<3" setuptools = ">=41.0.0" six = ">1.9" @@ -3102,26 +3235,26 @@ protobuf = ">=3.20" [[package]] name = "tensorflow" -version = "2.14.1" +version = "2.15.0" description = "TensorFlow is an open source machine learning framework for everyone." optional = false python-versions = ">=3.9" files = [ - {file = "tensorflow-2.14.1-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:f6e9ac1e53db30f1759148f731f87b9d12da5ce0f153fc49406824efd486aae7"}, - {file = "tensorflow-2.14.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:7156bf1f7311dada7dba5345b526a38e6f4e4f4b8509bee162a24342bf6571b2"}, - {file = "tensorflow-2.14.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f5781aadad5b46e2de4e373b0ca15a852b90d58982270a6db02ec52e4986316d"}, - {file = "tensorflow-2.14.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a955c42164eff4d751732c1274ca4bf059db60c9e2362098ce1eed7177c3fe9"}, - {file = "tensorflow-2.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:4be5f4327a6e854f64b4dcfd08a51c5fc7cc3fea8c76c5bf5c0c3deb002d5221"}, - {file = "tensorflow-2.14.1-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:597dd6665a91b3d4b881f0d40277eb55b65b04567553206a46e7db9cfa067310"}, - {file = "tensorflow-2.14.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:9833e61423ad2726f81e3fc770558b81d5f0a454bdb2dad717c5474ea837ce91"}, - {file = "tensorflow-2.14.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:14a48a087954722d9e73086e8ce28a14b1f9f889ea5845c7c0bf30d8747ab6e2"}, - {file = "tensorflow-2.14.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9aa05a98450fa5bc4efd529383b7d15c10ec12b0238a6744baa1508c4bfa4d5"}, - {file = "tensorflow-2.14.1-cp311-cp311-win_amd64.whl", hash = "sha256:11958d12e39d44a9f5fc753fc312dd1726a8506f2d2606e01421ca4ee9dc5c55"}, - {file = "tensorflow-2.14.1-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:d95404f78a8d5e3d2481383dbe2d2286341ccf9bc5cbb19d857c646494d860c6"}, - {file = "tensorflow-2.14.1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:511c4c5bfb2af17c6ca22663f98a7267c4386bf5486fbe78ee2d21482a6fa822"}, - {file = "tensorflow-2.14.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f66d2990157cf27f80c730878cb8befa8ed9716223494037d31c80fbe5f64370"}, - {file = "tensorflow-2.14.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9ab2747f75aba0327bfe6092b963694f1001781e5d2c0d251dfeed02b0c3bba"}, - {file = "tensorflow-2.14.1-cp39-cp39-win_amd64.whl", hash = "sha256:7f5c9215bc00ba88f1cde1399f8160a5cb865c20ad71a1d5a6869f9fad62d9a5"}, + {file = "tensorflow-2.15.0-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:9b248e0f4316b3a3c54cd1f83edfb7a761d473060c1972a8ea31a90d5de3aa72"}, + {file = "tensorflow-2.15.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:eaf420d8b8ec1d4bd75859be7d7545d8e7052726eed8456fdbba63718e7e07ea"}, + {file = "tensorflow-2.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e98aab454fc73ff1900314821e5bafbf20840ada2004c8caccf4d92e0e12a628"}, + {file = "tensorflow-2.15.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed601b43df9b7d9bed0203b34bcb9356efd4f671eaaac1046b7166a2afee0cf8"}, + {file = "tensorflow-2.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:2d88f8b71f4a8d9ab9dc7c8e42b14ca0f53d1daab0f989b8f2918907c2891f41"}, + {file = "tensorflow-2.15.0-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:1e0716622ed7af867d8b1997b00a2940f1a1587dee923ff53efa2ee506992f32"}, + {file = "tensorflow-2.15.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:124930e7d4f5d74c61a5c80d642a26c22fe0c42fdd383fe9ee5803c3ac9ed4ce"}, + {file = "tensorflow-2.15.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:852efeb4d18beedac0120c4f2d4f4dccf4c090bb6740c5199d395ff609e85e98"}, + {file = "tensorflow-2.15.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dee8ec2b2c6c942ae65d25746e53cdc475e82d5fcbbb3009ce47f5963d69ebfc"}, + {file = "tensorflow-2.15.0-cp311-cp311-win_amd64.whl", hash = "sha256:e05a48006930e4e9e68468e7affed3bbce8a1c7fe6df86500496ad1558804a78"}, + {file = "tensorflow-2.15.0-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:2cfcdde1ff3c01be617e99ce9783c49cb11da5796ce32a31855412bd092c0bcf"}, + {file = "tensorflow-2.15.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:896bda03f722700a9918d144aee5152a75f1be5e6c5045fd0683b8318a3fc9d9"}, + {file = "tensorflow-2.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e7697b005ce48fec8b2ee8cf25bcbd138f16b5e17f99f7c01a6ea3f2429f86c6"}, + {file = "tensorflow-2.15.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3fa865956d96b7614f247c36e4c22b1543ba5ce656fbe8e4f6266ae7a4917132"}, + {file = "tensorflow-2.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:01108746e1bbfcd48dfabf7f51ddca7693b91ea6821f6f62a27b5a5ebf0817c5"}, ] [package.dependencies] @@ -3132,35 +3265,35 @@ gast = ">=0.2.1,<0.5.0 || >0.5.0,<0.5.1 || >0.5.1,<0.5.2 || >0.5.2" google-pasta = ">=0.1.1" grpcio = ">=1.24.3,<2.0" h5py = ">=2.9.0" -keras = ">=2.14.0,<2.15" +keras = ">=2.15.0,<2.16" libclang = ">=13.0.0" -ml-dtypes = "0.2.0" +ml-dtypes = ">=0.2.0,<0.3.0" numpy = ">=1.23.5,<2.0.0" opt-einsum = ">=2.3.2" packaging = "*" protobuf = ">=3.20.3,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" setuptools = "*" six = ">=1.12.0" -tensorboard = ">=2.14,<2.15" -tensorflow-estimator = ">=2.14.0,<2.15" +tensorboard = ">=2.15,<2.16" +tensorflow-estimator = ">=2.15.0,<2.16" tensorflow-io-gcs-filesystem = ">=0.23.1" termcolor = ">=1.1.0" typing-extensions = ">=3.6.6" wrapt = ">=1.11.0,<1.15" [package.extras] -and-cuda = ["nvidia-cublas-cu11 (==11.11.3.6)", "nvidia-cuda-cupti-cu11 (==11.8.87)", "nvidia-cuda-nvcc-cu11 (==11.8.89)", "nvidia-cuda-runtime-cu11 (==11.8.89)", "nvidia-cudnn-cu11 (==8.7.0.84)", "nvidia-cufft-cu11 (==10.9.0.58)", "nvidia-curand-cu11 (==10.3.0.86)", "nvidia-cusolver-cu11 (==11.4.1.48)", "nvidia-cusparse-cu11 (==11.7.5.86)", "nvidia-nccl-cu11 (==2.16.5)", "tensorrt (==8.5.3.1)"] +and-cuda = ["nvidia-cublas-cu12 (==12.2.5.6)", "nvidia-cuda-cupti-cu12 (==12.2.142)", "nvidia-cuda-nvcc-cu12 (==12.2.140)", "nvidia-cuda-nvrtc-cu12 (==12.2.140)", "nvidia-cuda-runtime-cu12 (==12.2.140)", "nvidia-cudnn-cu12 (==8.9.4.25)", "nvidia-cufft-cu12 (==11.0.8.103)", "nvidia-curand-cu12 (==10.3.3.141)", "nvidia-cusolver-cu12 (==11.5.2.141)", "nvidia-cusparse-cu12 (==12.1.2.141)", "nvidia-nccl-cu12 (==2.16.5)", "nvidia-nvjitlink-cu12 (==12.2.140)", "tensorrt (==8.6.1.post1)", "tensorrt-bindings (==8.6.1)", "tensorrt-libs (==8.6.1)"] [[package]] name = "tensorflow-cpu-aws" -version = "2.14.1" +version = "2.15.0" description = "TensorFlow is an open source machine learning framework for everyone." optional = false python-versions = ">=3.9" files = [ - {file = "tensorflow_cpu_aws-2.14.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2e35e9d90fc448973b39cd2b76a03a66de88700424a40dcc0ff90b8d40b1a3a"}, - {file = "tensorflow_cpu_aws-2.14.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:618af0ac57a7bb6b51c9b409c2838c9910ca2fd2ae2b1f986ae98ebf59a919e5"}, - {file = "tensorflow_cpu_aws-2.14.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7e65af267aed15f4a59a8fd7a3ffe11ce43a71a33b0cd27122015b134443d872"}, + {file = "tensorflow_cpu_aws-2.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a751f4d6a16360347851d2e680b8bfddb8ab7799723f1fd5c171fa1f2e8c04aa"}, + {file = "tensorflow_cpu_aws-2.15.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e60763a3140306f9d6a793fbe888cea0f7da158f1c1fb4984a6e050aa75d5ce9"}, + {file = "tensorflow_cpu_aws-2.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c34f814a545f4263223c654e2c5cba0d4f0252f8a78d18db5c3fcff8a5a31d5c"}, ] [package.dependencies] @@ -3171,45 +3304,45 @@ gast = ">=0.2.1,<0.5.0 || >0.5.0,<0.5.1 || >0.5.1,<0.5.2 || >0.5.2" google-pasta = ">=0.1.1" grpcio = ">=1.24.3,<2.0" h5py = ">=2.9.0" -keras = ">=2.14.0,<2.15" +keras = ">=2.15.0,<2.16" libclang = ">=13.0.0" -ml-dtypes = "0.2.0" +ml-dtypes = ">=0.2.0,<0.3.0" numpy = ">=1.23.5,<2.0.0" opt-einsum = ">=2.3.2" packaging = "*" protobuf = ">=3.20.3,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" setuptools = "*" six = ">=1.12.0" -tensorboard = ">=2.14,<2.15" -tensorflow-estimator = ">=2.14.0,<2.15" +tensorboard = ">=2.15,<2.16" +tensorflow-estimator = ">=2.15.0,<2.16" tensorflow-io-gcs-filesystem = ">=0.23.1" termcolor = ">=1.1.0" typing-extensions = ">=3.6.6" wrapt = ">=1.11.0,<1.15" [package.extras] -and-cuda = ["nvidia-cublas-cu11 (==11.11.3.6)", "nvidia-cuda-cupti-cu11 (==11.8.87)", "nvidia-cuda-nvcc-cu11 (==11.8.89)", "nvidia-cuda-runtime-cu11 (==11.8.89)", "nvidia-cudnn-cu11 (==8.7.0.84)", "nvidia-cufft-cu11 (==10.9.0.58)", "nvidia-curand-cu11 (==10.3.0.86)", "nvidia-cusolver-cu11 (==11.4.1.48)", "nvidia-cusparse-cu11 (==11.7.5.86)", "nvidia-nccl-cu11 (==2.16.5)", "tensorrt (==8.5.3.1)"] +and-cuda = ["nvidia-cublas-cu12 (==12.2.5.6)", "nvidia-cuda-cupti-cu12 (==12.2.142)", "nvidia-cuda-nvcc-cu12 (==12.2.140)", "nvidia-cuda-nvrtc-cu12 (==12.2.140)", "nvidia-cuda-runtime-cu12 (==12.2.140)", "nvidia-cudnn-cu12 (==8.9.4.25)", "nvidia-cufft-cu12 (==11.0.8.103)", "nvidia-curand-cu12 (==10.3.3.141)", "nvidia-cusolver-cu12 (==11.5.2.141)", "nvidia-cusparse-cu12 (==12.1.2.141)", "nvidia-nccl-cu12 (==2.16.5)", "nvidia-nvjitlink-cu12 (==12.2.140)", "tensorrt (==8.6.1.post1)", "tensorrt-bindings (==8.6.1)", "tensorrt-libs (==8.6.1)"] [[package]] name = "tensorflow-estimator" -version = "2.14.0" +version = "2.15.0" description = "TensorFlow Estimator." optional = false python-versions = ">=3.7" files = [ - {file = "tensorflow_estimator-2.14.0-py2.py3-none-any.whl", hash = "sha256:820bf57c24aa631abb1bbe4371739ed77edb11361d61381fd8e790115ac0fd57"}, + {file = "tensorflow_estimator-2.15.0-py2.py3-none-any.whl", hash = "sha256:aedf21eec7fb2dc91150fc91a1ce12bc44dbb72278a08b58e79ff87c9e28f153"}, ] [[package]] name = "tensorflow-intel" -version = "2.14.1" +version = "2.15.0" description = "TensorFlow is an open source machine learning framework for everyone." optional = false python-versions = ">=3.9" files = [ - {file = "tensorflow_intel-2.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:d53589eed39607059923e660dfdb28dc65a4b89bec5889a78941bf8ec936d716"}, - {file = "tensorflow_intel-2.14.1-cp311-cp311-win_amd64.whl", hash = "sha256:dc4b0fb2cf2768104630357e9c06b801163e31db22ef2fd0419a0c09ae2e2315"}, - {file = "tensorflow_intel-2.14.1-cp39-cp39-win_amd64.whl", hash = "sha256:78c11785eaa1047ac2e4746c86286f6629df0289e73616ce052a82761e1de678"}, + {file = "tensorflow_intel-2.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:66f9078b5a64e9c05e9f7a77fb0fb8d21c5be006da2e5e380b61bea8f10a4774"}, + {file = "tensorflow_intel-2.15.0-cp311-cp311-win_amd64.whl", hash = "sha256:4710b0ea84defaafc0d6cc51162ebef8b07da015fc68375661451861c5bf4421"}, + {file = "tensorflow_intel-2.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:ebbc3220c9919a0b43f5ccb94bdced5236edc30dab31d4905e2991b67f26298e"}, ] [package.dependencies] @@ -3220,24 +3353,24 @@ gast = ">=0.2.1,<0.5.0 || >0.5.0,<0.5.1 || >0.5.1,<0.5.2 || >0.5.2" google-pasta = ">=0.1.1" grpcio = ">=1.24.3,<2.0" h5py = ">=2.9.0" -keras = ">=2.14.0,<2.15" +keras = ">=2.15.0,<2.16" libclang = ">=13.0.0" -ml-dtypes = "0.2.0" +ml-dtypes = ">=0.2.0,<0.3.0" numpy = ">=1.23.5,<2.0.0" opt-einsum = ">=2.3.2" packaging = "*" protobuf = ">=3.20.3,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" setuptools = "*" six = ">=1.12.0" -tensorboard = ">=2.14,<2.15" -tensorflow-estimator = ">=2.14.0,<2.15" +tensorboard = ">=2.15,<2.16" +tensorflow-estimator = ">=2.15.0,<2.16" tensorflow-io-gcs-filesystem = ">=0.23.1" termcolor = ">=1.1.0" typing-extensions = ">=3.6.6" wrapt = ">=1.11.0,<1.15" [package.extras] -and-cuda = ["nvidia-cublas-cu11 (==11.11.3.6)", "nvidia-cuda-cupti-cu11 (==11.8.87)", "nvidia-cuda-nvcc-cu11 (==11.8.89)", "nvidia-cuda-runtime-cu11 (==11.8.89)", "nvidia-cudnn-cu11 (==8.7.0.84)", "nvidia-cufft-cu11 (==10.9.0.58)", "nvidia-curand-cu11 (==10.3.0.86)", "nvidia-cusolver-cu11 (==11.4.1.48)", "nvidia-cusparse-cu11 (==11.7.5.86)", "nvidia-nccl-cu11 (==2.16.5)", "tensorrt (==8.5.3.1)"] +and-cuda = ["nvidia-cublas-cu12 (==12.2.5.6)", "nvidia-cuda-cupti-cu12 (==12.2.142)", "nvidia-cuda-nvcc-cu12 (==12.2.140)", "nvidia-cuda-nvrtc-cu12 (==12.2.140)", "nvidia-cuda-runtime-cu12 (==12.2.140)", "nvidia-cudnn-cu12 (==8.9.4.25)", "nvidia-cufft-cu12 (==11.0.8.103)", "nvidia-curand-cu12 (==10.3.3.141)", "nvidia-cusolver-cu12 (==11.5.2.141)", "nvidia-cusparse-cu12 (==12.1.2.141)", "nvidia-nccl-cu12 (==2.16.5)", "nvidia-nvjitlink-cu12 (==12.2.140)", "tensorrt (==8.6.1.post1)", "tensorrt-bindings (==8.6.1)", "tensorrt-libs (==8.6.1)"] [[package]] name = "tensorflow-io-gcs-filesystem" @@ -3276,40 +3409,43 @@ tensorflow-rocm = ["tensorflow-rocm (>=2.11.0,<2.12.0)"] [[package]] name = "tensorflow-io-gcs-filesystem" -version = "0.35.0" +version = "0.36.0" description = "TensorFlow IO" optional = false python-versions = ">=3.7, <3.12" files = [ - {file = "tensorflow_io_gcs_filesystem-0.35.0-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:5521721b38105496d4b43a4ffb0af5b04cc4873d464f26fbceddf8d63815ce98"}, - {file = "tensorflow_io_gcs_filesystem-0.35.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd8f30908bf8b7b2a017d6b145720d105aff7f998422671b71729708ec7b2fe4"}, - {file = "tensorflow_io_gcs_filesystem-0.35.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac8f1de60fdf9c734aea967b98555e366ac8743f77bca15c49eff023f587076b"}, - {file = "tensorflow_io_gcs_filesystem-0.35.0-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:35b6eca7225c815d962254327195f191d88c3c9c2278a5ab23e0ac834acbadbb"}, - {file = "tensorflow_io_gcs_filesystem-0.35.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6e997389bfe008210cbd97c0c738d64282a2f03ad4d0536013bb0a9efde0c283"}, - {file = "tensorflow_io_gcs_filesystem-0.35.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8fb3402fb1457482c386ea19371bc76383412ae9ea4396edb1e8adb4ba76f21"}, - {file = "tensorflow_io_gcs_filesystem-0.35.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb6bf8f5b40207ecb17e7fdc3b4fc824a8361267c14e9528c1688e16de135cb7"}, - {file = "tensorflow_io_gcs_filesystem-0.35.0-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:c4f786eebd98d401565374722f2e67f3878675b0d87489cbaa13c70ee6ac370a"}, - {file = "tensorflow_io_gcs_filesystem-0.35.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0fce1466bdb91096b6d22e7df17358ba228bcb92db5cff83f2f9f1c68eb26788"}, - {file = "tensorflow_io_gcs_filesystem-0.35.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1856fe321fdb75f3386d92109c60db6ef097f610b450f9cc69d76444fb9980d1"}, + {file = "tensorflow_io_gcs_filesystem-0.36.0-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:702c6df62b38095ff613c433546d9424d4f33902a5ab26b00fd26457e27a99fa"}, + {file = "tensorflow_io_gcs_filesystem-0.36.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:e9b8aaca2789af356c42afda0f52380f82e5abb2f3c0b85087833fcfe03875d8"}, + {file = "tensorflow_io_gcs_filesystem-0.36.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c477aed96864ceae77d7051c3b687f28813aba7320fc5dd552164fad6ec8d1a1"}, + {file = "tensorflow_io_gcs_filesystem-0.36.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be1ff92559dfa23048b01179a1827081947583f5c6f9986ccac471df8a29322a"}, + {file = "tensorflow_io_gcs_filesystem-0.36.0-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:72c3ca4b8c0d8dbdd970699d05a100107cf200317ad8e6a8373e2c37225cd552"}, + {file = "tensorflow_io_gcs_filesystem-0.36.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:848e8e89a0f49258c7782189c938d8d1162d989da1a80c79f95c7af3ef6006c8"}, + {file = "tensorflow_io_gcs_filesystem-0.36.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d72db1ab03edb65fa1e98d06e504ccbc64282d38ab3589afb6db66dc448d1c1"}, + {file = "tensorflow_io_gcs_filesystem-0.36.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bd4d946b5fa23220daa473a80e511a5fb27493d7e49d17dff0bb43bb0a31f32"}, + {file = "tensorflow_io_gcs_filesystem-0.36.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fa346fd1dd9f57848b73874007440504f060fadd689fa1cc29cc49817d0eeaf3"}, + {file = "tensorflow_io_gcs_filesystem-0.36.0-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:0a4437824424a4423cf86162cb8b21b1bec24698194332748b50bb952e62ab9f"}, + {file = "tensorflow_io_gcs_filesystem-0.36.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:31806bd7ac2db789161bc720747de22947063265561a4c17be54698fd9780b03"}, + {file = "tensorflow_io_gcs_filesystem-0.36.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc0e57976c1aa035af6281f0330cfb8dd50eee2f63412ecc84d60ff5075d29b7"}, + {file = "tensorflow_io_gcs_filesystem-0.36.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e97ff5c280eb10f699098ae21057be2b146d39e8a906cd5db91f2ea6c34e47d0"}, ] [package.extras] -tensorflow = ["tensorflow (>=2.14.0,<2.15.0)"] -tensorflow-aarch64 = ["tensorflow-aarch64 (>=2.14.0,<2.15.0)"] -tensorflow-cpu = ["tensorflow-cpu (>=2.14.0,<2.15.0)"] -tensorflow-gpu = ["tensorflow-gpu (>=2.14.0,<2.15.0)"] -tensorflow-rocm = ["tensorflow-rocm (>=2.14.0,<2.15.0)"] +tensorflow = ["tensorflow (>=2.15.0,<2.16.0)"] +tensorflow-aarch64 = ["tensorflow-aarch64 (>=2.15.0,<2.16.0)"] +tensorflow-cpu = ["tensorflow-cpu (>=2.15.0,<2.16.0)"] +tensorflow-gpu = ["tensorflow-gpu (>=2.15.0,<2.16.0)"] +tensorflow-rocm = ["tensorflow-rocm (>=2.15.0,<2.16.0)"] [[package]] name = "tensorflow-macos" -version = "2.14.1" +version = "2.15.0" description = "TensorFlow is an open source machine learning framework for everyone." optional = false python-versions = ">=3.9" files = [ - {file = "tensorflow_macos-2.14.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:5b9832df0852fa534cbd3362b6e00ba1c9d4b541fdfd987d0bba3927229435bc"}, - {file = "tensorflow_macos-2.14.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:428f071cf9e901c8182be9f7278a79beea6f9e4b687bf0d5e8e8faefb7bcc760"}, - {file = "tensorflow_macos-2.14.1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:4d7ce47f3c593f71eaa98ed3c8fe3c83b6010cc63d06aaf12037845196d06d85"}, + {file = "tensorflow_macos-2.15.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:cdfb4cd80ddfdf189212f4e3747a4404702d58cc6a346ab8887bd567ca3284f8"}, + {file = "tensorflow_macos-2.15.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:6933b6a298bcce3b302fa55c6943a2e2caba44601d0e5d0a86cae248fd90da8f"}, + {file = "tensorflow_macos-2.15.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:9bffd0da3f63ef5f16b198aa225eec1220c199ec937ba6bddcd34bc5bda13fd2"}, ] [package.dependencies] @@ -3320,24 +3456,24 @@ gast = ">=0.2.1,<0.5.0 || >0.5.0,<0.5.1 || >0.5.1,<0.5.2 || >0.5.2" google-pasta = ">=0.1.1" grpcio = ">=1.24.3,<2.0" h5py = ">=2.9.0" -keras = ">=2.14.0,<2.15" +keras = ">=2.15.0,<2.16" libclang = ">=13.0.0" -ml-dtypes = "0.2.0" +ml-dtypes = ">=0.2.0,<0.3.0" numpy = ">=1.23.5,<2.0.0" opt-einsum = ">=2.3.2" packaging = "*" protobuf = ">=3.20.3,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" setuptools = "*" six = ">=1.12.0" -tensorboard = ">=2.14,<2.15" -tensorflow-estimator = ">=2.14.0,<2.15" +tensorboard = ">=2.15,<2.16" +tensorflow-estimator = ">=2.15.0,<2.16" tensorflow-io-gcs-filesystem = ">=0.23.1" termcolor = ">=1.1.0" typing-extensions = ">=3.6.6" wrapt = ">=1.11.0,<1.15" [package.extras] -and-cuda = ["nvidia-cublas-cu11 (==11.11.3.6)", "nvidia-cuda-cupti-cu11 (==11.8.87)", "nvidia-cuda-nvcc-cu11 (==11.8.89)", "nvidia-cuda-runtime-cu11 (==11.8.89)", "nvidia-cudnn-cu11 (==8.7.0.84)", "nvidia-cufft-cu11 (==10.9.0.58)", "nvidia-curand-cu11 (==10.3.0.86)", "nvidia-cusolver-cu11 (==11.4.1.48)", "nvidia-cusparse-cu11 (==11.7.5.86)", "nvidia-nccl-cu11 (==2.16.5)", "tensorrt (==8.5.3.1)"] +and-cuda = ["nvidia-cublas-cu12 (==12.2.5.6)", "nvidia-cuda-cupti-cu12 (==12.2.142)", "nvidia-cuda-nvcc-cu12 (==12.2.140)", "nvidia-cuda-nvrtc-cu12 (==12.2.140)", "nvidia-cuda-runtime-cu12 (==12.2.140)", "nvidia-cudnn-cu12 (==8.9.4.25)", "nvidia-cufft-cu12 (==11.0.8.103)", "nvidia-curand-cu12 (==10.3.3.141)", "nvidia-cusolver-cu12 (==11.5.2.141)", "nvidia-cusparse-cu12 (==12.1.2.141)", "nvidia-nccl-cu12 (==2.16.5)", "nvidia-nvjitlink-cu12 (==12.2.140)", "tensorrt (==8.6.1.post1)", "tensorrt-bindings (==8.6.1)", "tensorrt-libs (==8.6.1)"] [[package]] name = "tensorflow-probability" @@ -3396,24 +3532,13 @@ sympy = ">=1.5.1" [[package]] name = "threadpoolctl" -version = "3.2.0" +version = "3.3.0" description = "threadpoolctl" optional = true python-versions = ">=3.8" files = [ - {file = "threadpoolctl-3.2.0-py3-none-any.whl", hash = "sha256:2b7818516e423bdaebb97c723f86a7c6b0a83d3f3b0970328d66f4d9104dc032"}, - {file = "threadpoolctl-3.2.0.tar.gz", hash = "sha256:c96a0ba3bdddeaca37dc4cc7344aafad41cdb8c313f74fdfe387a867bba93355"}, -] - -[[package]] -name = "toml" -version = "0.10.2" -description = "Python Library for Tom's Obvious, Minimal Language" -optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" -files = [ - {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, - {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, + {file = "threadpoolctl-3.3.0-py3-none-any.whl", hash = "sha256:6155be1f4a39f31a18ea70f94a77e0ccd57dced08122ea61109e7da89883781e"}, + {file = "threadpoolctl-3.3.0.tar.gz", hash = "sha256:5dac632b4fa2d43f42130267929af3ba01399ef4bd1882918e92dbc30365d30c"}, ] [[package]] @@ -3427,6 +3552,17 @@ files = [ {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, ] +[[package]] +name = "tomlkit" +version = "0.12.3" +description = "Style preserving TOML library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tomlkit-0.12.3-py3-none-any.whl", hash = "sha256:b0a645a9156dc7cb5d3a1f0d4bab66db287fcb8e0430bdd4664a095ea16414ba"}, + {file = "tomlkit-0.12.3.tar.gz", hash = "sha256:75baf5012d06501f07bee5bf8e801b9f343e7aac5a92581f20f80ce632e6b5a4"}, +] + [[package]] name = "toolz" version = "0.12.1" @@ -3438,6 +3574,21 @@ files = [ {file = "toolz-0.12.1.tar.gz", hash = "sha256:ecca342664893f177a13dac0e6b41cbd8ac25a358e5f215316d43e2100224f4d"}, ] +[[package]] +name = "traitlets" +version = "5.14.1" +description = "Traitlets Python configuration system" +optional = false +python-versions = ">=3.8" +files = [ + {file = "traitlets-5.14.1-py3-none-any.whl", hash = "sha256:2e5a030e6eff91737c643231bfcf04a65b0132078dad75e4936700b213652e74"}, + {file = "traitlets-5.14.1.tar.gz", hash = "sha256:8585105b371a04b8316a43d5ce29c098575c2e477850b62b848b964f1444527e"}, +] + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] +test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0,<7.5)", "pytest-mock", "pytest-mypy-testing"] + [[package]] name = "typing-extensions" version = "4.9.0" @@ -3451,24 +3602,24 @@ files = [ [[package]] name = "tzdata" -version = "2023.4" +version = "2024.1" description = "Provider of IANA time zone data" optional = true python-versions = ">=2" files = [ - {file = "tzdata-2023.4-py2.py3-none-any.whl", hash = "sha256:aa3ace4329eeacda5b7beb7ea08ece826c28d761cda36e747cfbf97996d39bf3"}, - {file = "tzdata-2023.4.tar.gz", hash = "sha256:dd54c94f294765522c77399649b4fefd95522479a664a0cec87f41bebc6148c9"}, + {file = "tzdata-2024.1-py2.py3-none-any.whl", hash = "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252"}, + {file = "tzdata-2024.1.tar.gz", hash = "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd"}, ] [[package]] name = "urllib3" -version = "2.2.0" +version = "2.2.1" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.8" files = [ - {file = "urllib3-2.2.0-py3-none-any.whl", hash = "sha256:ce3711610ddce217e6d113a2732fafad960a03fd0318c91faa79481e35c11224"}, - {file = "urllib3-2.2.0.tar.gz", hash = "sha256:051d961ad0c62a94e50ecf1af379c3aba230c66c710493493560c0c223c49f20"}, + {file = "urllib3-2.2.1-py3-none-any.whl", hash = "sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d"}, + {file = "urllib3-2.2.1.tar.gz", hash = "sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19"}, ] [package.extras] @@ -3477,6 +3628,17 @@ h2 = ["h2 (>=4,<5)"] socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] zstd = ["zstandard (>=0.18.0)"] +[[package]] +name = "wcwidth" +version = "0.2.13" +description = "Measures the displayed width of unicode strings in a terminal" +optional = false +python-versions = "*" +files = [ + {file = "wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859"}, + {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, +] + [[package]] name = "werkzeug" version = "3.0.1" @@ -3510,12 +3672,85 @@ test = ["pytest (>=6.0.0)", "setuptools (>=65)"] [[package]] name = "wrapt" -version = "1.12.1" +version = "1.14.1" description = "Module for decorators, wrappers and monkey patching." optional = false -python-versions = "*" -files = [ - {file = "wrapt-1.12.1.tar.gz", hash = "sha256:b62ffa81fb85f4332a4f609cab4ac40709470da05643a082ec1eb88e6d9b97d7"}, +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" +files = [ + {file = "wrapt-1.14.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:1b376b3f4896e7930f1f772ac4b064ac12598d1c38d04907e696cc4d794b43d3"}, + {file = "wrapt-1.14.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:903500616422a40a98a5a3c4ff4ed9d0066f3b4c951fa286018ecdf0750194ef"}, + {file = "wrapt-1.14.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5a9a0d155deafd9448baff28c08e150d9b24ff010e899311ddd63c45c2445e28"}, + {file = "wrapt-1.14.1-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:ddaea91abf8b0d13443f6dac52e89051a5063c7d014710dcb4d4abb2ff811a59"}, + {file = "wrapt-1.14.1-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:36f582d0c6bc99d5f39cd3ac2a9062e57f3cf606ade29a0a0d6b323462f4dd87"}, + {file = "wrapt-1.14.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:7ef58fb89674095bfc57c4069e95d7a31cfdc0939e2a579882ac7d55aadfd2a1"}, + {file = "wrapt-1.14.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:e2f83e18fe2f4c9e7db597e988f72712c0c3676d337d8b101f6758107c42425b"}, + {file = "wrapt-1.14.1-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:ee2b1b1769f6707a8a445162ea16dddf74285c3964f605877a20e38545c3c462"}, + {file = "wrapt-1.14.1-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:833b58d5d0b7e5b9832869f039203389ac7cbf01765639c7309fd50ef619e0b1"}, + {file = "wrapt-1.14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:80bb5c256f1415f747011dc3604b59bc1f91c6e7150bd7db03b19170ee06b320"}, + {file = "wrapt-1.14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:07f7a7d0f388028b2df1d916e94bbb40624c59b48ecc6cbc232546706fac74c2"}, + {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:02b41b633c6261feff8ddd8d11c711df6842aba629fdd3da10249a53211a72c4"}, + {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2fe803deacd09a233e4762a1adcea5db5d31e6be577a43352936179d14d90069"}, + {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:257fd78c513e0fb5cdbe058c27a0624c9884e735bbd131935fd49e9fe719d310"}, + {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4fcc4649dc762cddacd193e6b55bc02edca674067f5f98166d7713b193932b7f"}, + {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:11871514607b15cfeb87c547a49bca19fde402f32e2b1c24a632506c0a756656"}, + {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8ad85f7f4e20964db4daadcab70b47ab05c7c1cf2a7c1e51087bfaa83831854c"}, + {file = "wrapt-1.14.1-cp310-cp310-win32.whl", hash = "sha256:a9a52172be0b5aae932bef82a79ec0a0ce87288c7d132946d645eba03f0ad8a8"}, + {file = "wrapt-1.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:6d323e1554b3d22cfc03cd3243b5bb815a51f5249fdcbb86fda4bf62bab9e164"}, + {file = "wrapt-1.14.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ecee4132c6cd2ce5308e21672015ddfed1ff975ad0ac8d27168ea82e71413f55"}, + {file = "wrapt-1.14.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2020f391008ef874c6d9e208b24f28e31bcb85ccff4f335f15a3251d222b92d9"}, + {file = "wrapt-1.14.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2feecf86e1f7a86517cab34ae6c2f081fd2d0dac860cb0c0ded96d799d20b335"}, + {file = "wrapt-1.14.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:240b1686f38ae665d1b15475966fe0472f78e71b1b4903c143a842659c8e4cb9"}, + {file = "wrapt-1.14.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9008dad07d71f68487c91e96579c8567c98ca4c3881b9b113bc7b33e9fd78b8"}, + {file = "wrapt-1.14.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6447e9f3ba72f8e2b985a1da758767698efa72723d5b59accefd716e9e8272bf"}, + {file = "wrapt-1.14.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:acae32e13a4153809db37405f5eba5bac5fbe2e2ba61ab227926a22901051c0a"}, + {file = "wrapt-1.14.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:49ef582b7a1152ae2766557f0550a9fcbf7bbd76f43fbdc94dd3bf07cc7168be"}, + {file = "wrapt-1.14.1-cp311-cp311-win32.whl", hash = "sha256:358fe87cc899c6bb0ddc185bf3dbfa4ba646f05b1b0b9b5a27c2cb92c2cea204"}, + {file = "wrapt-1.14.1-cp311-cp311-win_amd64.whl", hash = "sha256:26046cd03936ae745a502abf44dac702a5e6880b2b01c29aea8ddf3353b68224"}, + {file = "wrapt-1.14.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:43ca3bbbe97af00f49efb06e352eae40434ca9d915906f77def219b88e85d907"}, + {file = "wrapt-1.14.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:6b1a564e6cb69922c7fe3a678b9f9a3c54e72b469875aa8018f18b4d1dd1adf3"}, + {file = "wrapt-1.14.1-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:00b6d4ea20a906c0ca56d84f93065b398ab74b927a7a3dbd470f6fc503f95dc3"}, + {file = "wrapt-1.14.1-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:a85d2b46be66a71bedde836d9e41859879cc54a2a04fad1191eb50c2066f6e9d"}, + {file = "wrapt-1.14.1-cp35-cp35m-win32.whl", hash = "sha256:dbcda74c67263139358f4d188ae5faae95c30929281bc6866d00573783c422b7"}, + {file = "wrapt-1.14.1-cp35-cp35m-win_amd64.whl", hash = "sha256:b21bb4c09ffabfa0e85e3a6b623e19b80e7acd709b9f91452b8297ace2a8ab00"}, + {file = "wrapt-1.14.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:9e0fd32e0148dd5dea6af5fee42beb949098564cc23211a88d799e434255a1f4"}, + {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9736af4641846491aedb3c3f56b9bc5568d92b0692303b5a305301a95dfd38b1"}, + {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b02d65b9ccf0ef6c34cba6cf5bf2aab1bb2f49c6090bafeecc9cd81ad4ea1c1"}, + {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21ac0156c4b089b330b7666db40feee30a5d52634cc4560e1905d6529a3897ff"}, + {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:9f3e6f9e05148ff90002b884fbc2a86bd303ae847e472f44ecc06c2cd2fcdb2d"}, + {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:6e743de5e9c3d1b7185870f480587b75b1cb604832e380d64f9504a0535912d1"}, + {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:d79d7d5dc8a32b7093e81e97dad755127ff77bcc899e845f41bf71747af0c569"}, + {file = "wrapt-1.14.1-cp36-cp36m-win32.whl", hash = "sha256:81b19725065dcb43df02b37e03278c011a09e49757287dca60c5aecdd5a0b8ed"}, + {file = "wrapt-1.14.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b014c23646a467558be7da3d6b9fa409b2c567d2110599b7cf9a0c5992b3b471"}, + {file = "wrapt-1.14.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:88bd7b6bd70a5b6803c1abf6bca012f7ed963e58c68d76ee20b9d751c74a3248"}, + {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5901a312f4d14c59918c221323068fad0540e34324925c8475263841dbdfe68"}, + {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d77c85fedff92cf788face9bfa3ebaa364448ebb1d765302e9af11bf449ca36d"}, + {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d649d616e5c6a678b26d15ece345354f7c2286acd6db868e65fcc5ff7c24a77"}, + {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7d2872609603cb35ca513d7404a94d6d608fc13211563571117046c9d2bcc3d7"}, + {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:ee6acae74a2b91865910eef5e7de37dc6895ad96fa23603d1d27ea69df545015"}, + {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2b39d38039a1fdad98c87279b48bc5dce2c0ca0d73483b12cb72aa9609278e8a"}, + {file = "wrapt-1.14.1-cp37-cp37m-win32.whl", hash = "sha256:60db23fa423575eeb65ea430cee741acb7c26a1365d103f7b0f6ec412b893853"}, + {file = "wrapt-1.14.1-cp37-cp37m-win_amd64.whl", hash = "sha256:709fe01086a55cf79d20f741f39325018f4df051ef39fe921b1ebe780a66184c"}, + {file = "wrapt-1.14.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8c0ce1e99116d5ab21355d8ebe53d9460366704ea38ae4d9f6933188f327b456"}, + {file = "wrapt-1.14.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e3fb1677c720409d5f671e39bac6c9e0e422584e5f518bfd50aa4cbbea02433f"}, + {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:642c2e7a804fcf18c222e1060df25fc210b9c58db7c91416fb055897fc27e8cc"}, + {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b7c050ae976e286906dd3f26009e117eb000fb2cf3533398c5ad9ccc86867b1"}, + {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef3f72c9666bba2bab70d2a8b79f2c6d2c1a42a7f7e2b0ec83bb2f9e383950af"}, + {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:01c205616a89d09827986bc4e859bcabd64f5a0662a7fe95e0d359424e0e071b"}, + {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5a0f54ce2c092aaf439813735584b9537cad479575a09892b8352fea5e988dc0"}, + {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2cf71233a0ed05ccdabe209c606fe0bac7379fdcf687f39b944420d2a09fdb57"}, + {file = "wrapt-1.14.1-cp38-cp38-win32.whl", hash = "sha256:aa31fdcc33fef9eb2552cbcbfee7773d5a6792c137b359e82879c101e98584c5"}, + {file = "wrapt-1.14.1-cp38-cp38-win_amd64.whl", hash = "sha256:d1967f46ea8f2db647c786e78d8cc7e4313dbd1b0aca360592d8027b8508e24d"}, + {file = "wrapt-1.14.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3232822c7d98d23895ccc443bbdf57c7412c5a65996c30442ebe6ed3df335383"}, + {file = "wrapt-1.14.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:988635d122aaf2bdcef9e795435662bcd65b02f4f4c1ae37fbee7401c440b3a7"}, + {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cca3c2cdadb362116235fdbd411735de4328c61425b0aa9f872fd76d02c4e86"}, + {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d52a25136894c63de15a35bc0bdc5adb4b0e173b9c0d07a2be9d3ca64a332735"}, + {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40e7bc81c9e2b2734ea4bc1aceb8a8f0ceaac7c5299bc5d69e37c44d9081d43b"}, + {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b9b7a708dd92306328117d8c4b62e2194d00c365f18eff11a9b53c6f923b01e3"}, + {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6a9a25751acb379b466ff6be78a315e2b439d4c94c1e99cb7266d40a537995d3"}, + {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:34aa51c45f28ba7f12accd624225e2b1e5a3a45206aa191f6f9aac931d9d56fe"}, + {file = "wrapt-1.14.1-cp39-cp39-win32.whl", hash = "sha256:dee0ce50c6a2dd9056c20db781e9c1cfd33e77d2d569f5d1d9321c641bb903d5"}, + {file = "wrapt-1.14.1-cp39-cp39-win_amd64.whl", hash = "sha256:dee60e1de1898bde3b238f18340eec6148986da0455d8ba7848d50470a7a32fb"}, + {file = "wrapt-1.14.1.tar.gz", hash = "sha256:380a85cf89e0e69b7cfbe2ea9f765f004ff419f34194018a6827ac0e3edfed4d"}, ] [[package]] @@ -3554,5 +3789,5 @@ ray = ["ray", "scikit-optimize"] [metadata] lock-version = "2.0" -python-versions = ">=3.9,<3.11" -content-hash = "970e86ff1dd5fc529221b750bc6be686fecf8a48dbf4d063046bf05d5171d092" +python-versions = ">=3.9,<3.12" +content-hash = "f2a9aa2c43e002f889e182fd66c4fb61d21d923c359f3b66d581bf63cac93d8e" diff --git a/pyproject.toml b/pyproject.toml index 3fdd13c08..d20963ab6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mrmustard" -version = "0.7.0" +version = "0.7.1" description = "Differentiable quantum Gaussian circuits" authors = ["Xanadu "] license = "Apache License 2.0" @@ -20,16 +20,17 @@ classifiers = [ "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3 :: Only", "Topic :: Scientific/Engineering :: Physics", ] [tool.poetry.dependencies] -python = ">=3.9,<3.11" +python = ">=3.9,<3.12" grpcio = "1.60.0" numpy = "^1.23.5" scipy = "^1.8.0" -numba = "^0.56.4" +numba = "^0.59" thewalrus = "^0.21.0" rich = "^10.15.1" matplotlib = "^3.5.0" @@ -37,6 +38,7 @@ ray = { version = "^2.5.0", extras = ["tune"], optional = true } scikit-optimize = { version = "^0.9.0", optional = true } networkx = "^3.1" julia = "0.6.1" +ipython = ">=8.18.1" ###################### The Tensorflow Section ###################### # Dedicated for making sure that poetry can install tensorflow on all platforms. @@ -71,7 +73,7 @@ optional = true pytest = "8.0" pytest-cov ="3.0.0" hypothesis = "6.31.6" -pylint = "2.10.0" +pylint = "^3.0" black = ">=22.1.0" [tool.poetry.group.doc] diff --git a/tests/random.py b/tests/random.py index 0c4552ebf..e29e2c32f 100644 --- a/tests/random.py +++ b/tests/random.py @@ -68,19 +68,28 @@ size = st.integers(min_value=1, max_value=9) -@st.composite -def Abc_triple(draw, n=None): - n = n or draw(size) - - # Complex symmetric matrix A - A = draw(arrays(dtype=complex, shape=(n, n), elements=complex_number)) - A = 0.5 * (A + A.T) # Make it symmetric +def Abc_triple(n: int): + r""" + Produces a random ``(A, b, c)`` triple for ``n`` modes. + """ + min_magnitude = 1e-9 + max_magnitude = 1 + + # complex symmetric matrix A + A = np.random.uniform(min_magnitude, max_magnitude, (n, n)) + 1.0j * np.random.uniform( + min_magnitude, max_magnitude, (n, n) + ) + A = 0.5 * (A + A.T) # make it symmetric - # Complex vector b - b = draw(arrays(dtype=complex, shape=n, elements=complex_number)) + # complex vector b + b = np.random.uniform(min_magnitude, max_magnitude, (n,)) + 1.0j * np.random.uniform( + min_magnitude, max_magnitude, (n,) + ) - # Complex scalar c - c = draw(complex_number) + # complex scalar c + c = np.random.uniform(min_magnitude, max_magnitude, (1,)) + 1.0j * np.random.uniform( + min_magnitude, max_magnitude, (1,) + ) return A, b, c @@ -88,7 +97,7 @@ def Abc_triple(draw, n=None): @st.composite def vector(draw, length): r"""Return a vector of length `length`.""" - return draw(arrays(np.float, (length,), elements=st.floats(min_value=-1.0, max_value=1.0))) + return draw(arrays(np.float64, (length,), elements=st.floats(min_value=-1.0, max_value=1.0))) @st.composite @@ -103,7 +112,7 @@ def list_of_ints(draw, N): def matrix(draw, rows, cols): """Return a strategy for generating matrices of shape `rows` x `cols`.""" elements = st.floats(allow_infinity=False, allow_nan=False, max_value=1e10, min_value=-1e10) - return draw(arrays(np.float, (rows, cols), elements=elements)) + return draw(arrays(np.float64, (rows, cols), elements=elements)) @st.composite diff --git a/tests/test_lab/test_detectors.py b/tests/test_lab/test_detectors.py index 15f32c932..cab09e5a0 100644 --- a/tests/test_lab/test_detectors.py +++ b/tests/test_lab/test_detectors.py @@ -418,3 +418,13 @@ def test_norm_2mode_gaussian_normalized(self): """Checks that after projection the norm of the leftover state is as expected.""" leftover = Coherent(x=[2.0, 2.0]) << Coherent(x=1.0, normalize=True)[0] assert np.isclose(1.0, physics.norm(leftover), atol=1e-5) + + +class TestProjectionOnState: + r"""Tests the cases that the projection state is given.""" + + def test_vacuum_project_on_vacuum(self): + """Tests that the probability of Vacuum that projects on Vacuum is 1.0.""" + assert np.allclose(Vacuum(3) << Vacuum(3), 1.0) + assert np.allclose(Vacuum(3) << Coherent([0, 0, 0]), 1.0) + assert np.allclose(Vacuum(3) << Fock([0, 0, 0]), 1.0) diff --git a/tests/test_lab/test_state.py b/tests/test_lab/test_state.py index d7cb690e8..489c4e922 100644 --- a/tests/test_lab/test_state.py +++ b/tests/test_lab/test_state.py @@ -1,7 +1,7 @@ import numpy as np from mrmustard import math -from mrmustard.lab import Attenuator, Coherent, Gaussian +from mrmustard.lab import Attenuator, Coherent, Gaussian, Vacuum, Dgate from mrmustard.lab.abstract.state import mikkel_plot @@ -58,3 +58,14 @@ def test_mikkel_plot(): assert fig is not None assert axs is not None + + +def test_rshift(): + """Tests that right shifr of the state will not change the state object. This was a bug (PR349).""" + vac0 = Vacuum(1) + vac0_cov_original = vac0.cov + vac0_means_original = vac0.means + d1 = Dgate(0.1, 0.1) + _ = vac0 >> d1 + assert np.all(vac0_cov_original == vac0.cov) + assert np.all(vac0_means_original == vac0.means) diff --git a/tests/test_lab/test_states.py b/tests/test_lab/test_states.py index a513f8ed1..8f24d65f3 100644 --- a/tests/test_lab/test_states.py +++ b/tests/test_lab/test_states.py @@ -39,7 +39,7 @@ @st.composite def xy_arrays(draw): length = draw(st.integers(2, 10)) - return draw(arrays(dtype=np.float, shape=(2, length), elements=st.floats(-5.0, 5.0))) + return draw(arrays(dtype=np.float64, shape=(2, length), elements=st.floats(-5.0, 5.0))) @given(nmodes, st.floats(0.1, 5.0)) diff --git a/tests/test_lab_dev/test_wires.py b/tests/test_lab_dev/test_wires.py new file mode 100644 index 000000000..160f130af --- /dev/null +++ b/tests/test_lab_dev/test_wires.py @@ -0,0 +1,181 @@ +# Copyright 2023 Xanadu Quantum Technologies Inc. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Tests for Wires class.""" + +# pylint: disable=protected-access, missing-function-docstring + +import numpy as np +import pytest + +from mrmustard.lab_dev.wires import Wires + + +class TestWires: + r""" + Tests for the Wires class. + """ + + @pytest.mark.parametrize("modes_out_bra", [[0], [1, 2]]) + @pytest.mark.parametrize("modes_in_bra", [None, [1], [2, 3]]) + @pytest.mark.parametrize("modes_out_ket", [None, [2], [3, 4]]) + @pytest.mark.parametrize("modes_in_ket", [None, [3], [4, 5]]) + def test_init(self, modes_out_bra, modes_in_bra, modes_out_ket, modes_in_ket): + w = Wires(modes_out_bra, modes_in_bra, modes_out_ket, modes_in_ket) + + modes_out_bra = modes_out_bra or [] + modes_in_bra = modes_in_bra or [] + modes_out_ket = modes_out_ket or [] + modes_in_ket = modes_in_ket or [] + modes = list( + set(modes_out_bra) | set(modes_in_bra) | set(modes_out_ket) | set(modes_in_ket) + ) + + assert w.modes == modes + assert w.output.bra.modes == modes_out_bra + assert w.input.bra.modes == modes_in_bra + assert w.output.ket.modes == modes_out_ket + assert w.input.ket.modes == modes_in_ket + + def test_args(self): + w = Wires([0], [1], [2], [3]) + assert w._args() == ((0,), (1,), (2,), (3,)) + + def test_from_data(self): + id_array = [[1, 2, 0, 0], [0, 3, 4, 0], [0, 0, 5, 0], [0, 0, 0, 6]] + modes = [5, 6, 7, 8] + w = Wires._from_data(id_array, modes) + + assert np.allclose(w.id_array, id_array) + assert w.ids == [1, 2, 3, 4, 5, 6] + assert w.modes == modes + + def test_view(self): + w = Wires([0], [0], [0], [0]) + assert set(w.ids) == set(w._view().ids) + + def test_view_can_edit_original(self): + w = Wires([0], [0], [0], [0]) + w._view().ids = [9, 99, 999, 9999] + assert w.ids == [9, 99, 999, 9999] + + def test_wire_subsets(self): + w = Wires([0], [1], [2], [3]) + assert w.output.bra.modes == [0] + assert w.input.bra.modes == [1] + assert w.output.ket.modes == [2] + assert w.input.ket.modes == [3] + + w = Wires([10], [11], [12], [13]) + assert w[10].ids == w.output.bra.ids + assert w[11].ids == w.input.bra.ids + assert w[12].ids == w.output.ket.ids + assert w[13].ids == w.input.ket.ids + + def test_id_array(self): + w = Wires([0, 1], [2], [3, 4, 5], [6]) + assert w.id_array.shape == (7, 4) + + def test_ids(self): + w = Wires([0, 1], [2], [3, 4, 5], [6]) + + assert w.output.bra.ids == w.ids[:2] + assert w.input.bra.ids == [w.ids[2]] + assert w.output.ket.ids == w.ids[3:6] + assert w.input.ket.ids == [w.ids[-1]] + + def test_ids_setter(self): + w1 = Wires([0, 1], [2], [3, 4, 5], [6]) + w2 = Wires([0, 1], [2], [3, 4, 5], [6]) + + assert w1.ids != w2.ids + + w1.ids = w2.ids + assert w1.ids == w2.ids + + def test_indices(self): + w = Wires([0, 1, 2], [3, 4, 5], [6, 7], [8]) + + assert w.output.indices == [0, 1, 2, 6, 7] + assert w.bra.indices == [0, 1, 2, 3, 4, 5] + assert w.input.indices == [3, 4, 5, 8] + assert w.ket.indices == [6, 7, 8] + + def test_adjoint(self): + w = Wires([0, 1, 2], [3, 4, 5], [6, 7], [8]) + w_adj = w.adjoint + + assert w.input.ket.modes == w_adj.input.bra.modes + assert w.output.ket.modes == w_adj.output.bra.modes + assert w.input.bra.modes == w_adj.input.ket.modes + assert w.output.bra.modes == w_adj.output.ket.modes + + def test_dual(self): + w = Wires([0, 1, 2], [3, 4, 5], [6, 7], [8]) + w_d = w.dual + + assert w.input.ket.modes == w_d.output.ket.modes + assert w.output.ket.modes == w_d.input.ket.modes + assert w.input.bra.modes == w_d.output.bra.modes + assert w.output.bra.modes == w_d.input.bra.modes + + def test_copy(self): + w = Wires([0, 1, 2], [3, 4, 5], [6, 7], [8]) + w_cp = w.copy() + + assert w.input.ket.modes == w_cp.input.ket.modes + assert w.output.ket.modes == w_cp.output.ket.modes + assert w.input.bra.modes == w_cp.input.bra.modes + assert w.output.bra.modes == w_cp.output.bra.modes + + def test_add(self): + w1 = Wires([0], [1], [2], [3]) + w2 = Wires([1], [2], [3], [4]) + w12 = Wires([0, 1], [1, 2], [2, 3], [3, 4]) + + assert (w1 + w2).modes == w12.modes + + def test_add_error(self): + w1 = Wires([0], [1], [2], [3]) + w2 = Wires([0], [2], [3], [4]) + with pytest.raises(Exception): + w1 + w2 # pylint: disable=pointless-statement + + def test_bool(self): + assert Wires([0]) + assert not Wires([0]).input + + def test_getitem(self): + w = Wires([0, 1], [0, 1]) + w0 = w[0] + w1 = w[1] + + assert w0.modes == [0] + assert w0.ids == [w.ids[0], w.ids[2]] + + assert w1.modes == [1] + assert w1.ids == [w.ids[1], w.ids[3]] + + def test_rshift(self): + # contracts 1,1 on bra side + # contracts 3,3 and 13,13 on ket side (note order doesn't matter) + u = Wires([1, 5], [2, 6, 15], [3, 7, 13], [4, 8]) + v = Wires([0, 9, 14], [1, 10], [2, 11], [13, 3, 12]) + assert (u >> v)._args() == ((0, 5, 9, 14), (2, 6, 10, 15), (2, 7, 11), (4, 8, 12)) + + def test_rshift_error(self): + u = Wires([], [], [0], []) # only output wire + v = Wires([], [], [0], []) # only output wire + with pytest.raises(ValueError): + u >> v # pylint: disable=pointless-statement diff --git a/tests/test_math/test_backend_manager.py b/tests/test_math/test_backend_manager.py index 44017d63b..827f350e7 100644 --- a/tests/test_math/test_backend_manager.py +++ b/tests/test_math/test_backend_manager.py @@ -65,6 +65,30 @@ def test_abs(self, l): res = math.asnumpy(math.abs(np.array(l))) assert np.allclose(res, np.abs(arr)) + def test_allclose(self): + r""" + Tests the ``allclose`` method. + """ + arr1 = [1, 2, 3] + arr2 = [1, 2, 3] + arr3 = [1.01, 2, 3] + arr4 = [2, 3, 1] + + assert math.allclose(arr1, arr2) + assert not math.allclose(arr1, arr3) + assert math.allclose(arr1, arr3, 1e-2) + assert not math.allclose(arr1, arr4) + + def test_allclose_error(self): + r""" + Tests the error of ``allclose`` method. + """ + arr1 = [1, 2, 3] + arr2 = [[1, 2, 3]] + + with pytest.raises(ValueError, match="Cannot compare"): + math.allclose(arr1, arr2) + @pytest.mark.parametrize("l", lists) def test_any(self, l): r""" @@ -513,6 +537,23 @@ def test_pow(self): arr = np.array([1.0, 2.0, 3.0, 4.0]) assert np.allclose(math.asnumpy(math.pow(arr, 2)), math.pow(arr, 2)) + def test_kron(self): + r""" + Tests the ``kron`` method. + """ + t1 = math.astensor([[0, 1], [1, 0]]) + t2 = math.eye(2) + kron = [[0, 0, 1, 0], [0, 0, 0, 1], [1, 0, 0, 0], [0, 1, 0, 0]] + assert np.allclose(math.kron(t1, t2), kron) + + def test_prod(self): + r""" + Tests the ``prod`` method. + """ + assert np.allclose(math.prod([1]), 1) + assert np.allclose(math.prod([[2, 2], [3, 3]], axis=0), [6, 6]) + assert np.allclose(math.prod([[2, 2], [3, 3]], axis=1), [4, 9]) + def test_real(self): r""" Tests the ``real`` method. diff --git a/tests/test_math/test_parameters.py b/tests/test_math/test_parameters.py index be8a24ba4..b0f44c5f2 100644 --- a/tests/test_math/test_parameters.py +++ b/tests/test_math/test_parameters.py @@ -57,10 +57,10 @@ def test_is_const(self): """ const = Constant(1, "const") - with pytest.raises(AttributeError, match="can't set attribute"): + with pytest.raises(AttributeError): const.value = 2 - with pytest.raises(AttributeError, match="can't set attribute"): + with pytest.raises(AttributeError): const.name = "const2" @@ -102,10 +102,10 @@ def test_is_variable(self): var.update_fn = update_orthogonal assert var.update_fn == update_orthogonal - with pytest.raises(AttributeError, match="can't set attribute"): + with pytest.raises(AttributeError): var.name = "var2" - with pytest.raises(AttributeError, match="can't set attribute"): + with pytest.raises(AttributeError): var.bounds = (0, 1) def test_static_methods(self): diff --git a/tests/test_physics/test_ansatz.py b/tests/test_physics/test_ansatz.py index fe62113a3..452f8dfdb 100644 --- a/tests/test_physics/test_ansatz.py +++ b/tests/test_physics/test_ansatz.py @@ -12,146 +12,274 @@ # See the License for the specific language governing permissions and # limitations under the License. +"""This module contains tests for ``Ansatz`` objects.""" + +# pylint: disable = missing-function-docstring, pointless-statement, comparison-with-itself + import numpy as np -from hypothesis import given -from hypothesis import strategies as st -from hypothesis.extra.numpy import arrays +import pytest from mrmustard import math -from mrmustard.physics.ansatze import PolyExpAnsatz -from tests.random import Abc_triple, complex_number - - -@given(Abc=Abc_triple()) -def test_PolyExpAnsatz(Abc): - """Test that the PolyExpAnsatz class is initialized correctly""" - A, b, c = Abc - ansatz = PolyExpAnsatz(A, b, c) - assert np.allclose(ansatz.mat[0], A) - assert np.allclose(ansatz.vec[0], b) - assert np.allclose(ansatz.array[0], c) - - -# test adding two PolyExpAnsatz objects -@given(Abc1=Abc_triple(5), Abc2=Abc_triple(5)) -def test_PolyExpAnsatz_add(Abc1, Abc2): - """Test that we can add two PolyExpAnsatz objects""" - A1, b1, c1 = Abc1 - A2, b2, c2 = Abc2 - ansatz = PolyExpAnsatz(A1, b1, c1) - ansatz2 = PolyExpAnsatz(A2, b2, c2) - ansatz3 = ansatz + ansatz2 - assert np.allclose(ansatz3.mat[0], A1) - assert np.allclose(ansatz3.vec[0], b1) - assert np.allclose(ansatz3.array[0], c1) - assert np.allclose(ansatz3.mat[1], A2) - assert np.allclose(ansatz3.vec[1], b2) - assert np.allclose(ansatz3.array[1], c2) - - -# test multiplying two PolyExpAnsatz objects -@given(Abc1=Abc_triple(4), Abc2=Abc_triple(4)) -def test_PolyExpAnsatz_mul(Abc1, Abc2): - """Test that we can multiply two PolyExpAnsatz objects""" - A1, b1, c1 = Abc1 - A2, b2, c2 = Abc2 - ansatz = PolyExpAnsatz(A1, b1, c1) - ansatz2 = PolyExpAnsatz(A2, b2, c2) - ansatz3 = ansatz * ansatz2 - assert np.allclose(ansatz3.mat[0], A1 + A2) - assert np.allclose(ansatz3.vec[0], b1 + b2) - assert np.allclose(ansatz3.array[0], c1 * c2) - - -# test multiplying a PolyExpAnsatz object by a scalar -@given(Abc=Abc_triple(), d=complex_number) -def test_PolyExpAnsatz_mul_scalar(Abc, d): - """Test that we can multiply a PolyExpAnsatz object by a scalar""" - A, b, c = Abc - ansatz = PolyExpAnsatz(A, b, c) - ansatz2 = ansatz * d - assert np.allclose(ansatz2.mat[0], A) - assert np.allclose(ansatz2.vec[0], b) - assert np.allclose(ansatz2.array[0], d * c) - - -# test calling the PolyExpAnsatz object -@given(Abc=Abc_triple()) -def test_PolyExpAnsatz_call(Abc): - """Test that we can call the PolyExpAnsatz object""" - A, b, c = Abc - ansatz = PolyExpAnsatz(A, b, c) - assert np.allclose(ansatz(z=math.zeros_like(b)), c) - - -# test tensor product of two PolyExpAnsatz objects -@given(Abc1=Abc_triple(6), Abc2=Abc_triple(6)) -def test_PolyExpAnsatz_kron(Abc1, Abc2): - """Test that we can tensor product two PolyExpAnsatz objects""" - A1, b1, c1 = Abc1 - A2, b2, c2 = Abc2 - ansatz = PolyExpAnsatz(A1, b1, c1) - ansatz2 = PolyExpAnsatz(A2, b2, c2) - ansatz3 = ansatz & ansatz2 - assert np.allclose(ansatz3.mat[0], math.block_diag(A1, A2)) - assert np.allclose(ansatz3.vec[0], math.concat([b1, b2], -1)) - assert np.allclose(ansatz3.array[0], c1 * c2) - - -# test equality -@given(Abc=Abc_triple()) -def test_PolyExpAnsatz_eq(Abc): - """Test that we can compare two PolyExpAnsatz objects""" - A, b, c = Abc - ansatz = PolyExpAnsatz(A, b, c) - ansatz2 = PolyExpAnsatz(2 * A, 2 * b, 2 * c) - assert ansatz == ansatz - assert ansatz2 == ansatz2 - assert ansatz != ansatz2 - assert ansatz2 != ansatz - - -# test simplify -@given(Abc=Abc_triple()) -def test_PolyExpAnsatz_simplify(Abc): - """Test that we can simplify a PolyExpAnsatz object""" - A, b, c = Abc - ansatz = PolyExpAnsatz(A, b, c) - ansatz = ansatz + ansatz - assert np.allclose(ansatz.A[0], ansatz.A[1]) - assert np.allclose(ansatz.A[0], A) - assert np.allclose(ansatz.b[0], ansatz.b[1]) - assert np.allclose(ansatz.b[0], b) - ansatz.simplify() - assert len(ansatz.A) == 1 - assert len(ansatz.b) == 1 - assert ansatz.c == 2 * c - - -def test_order_batch(): - ansatz = PolyExpAnsatz( - A=[np.array([[0]]), np.array([[1]])], b=[np.array([1]), np.array([0])], c=[1, 2] - ) - ansatz._order_batch() - assert np.allclose(ansatz.A[0], np.array([[1]])) - assert np.allclose(ansatz.b[0], np.array([0])) - assert ansatz.c[0] == 2 - assert np.allclose(ansatz.A[1], np.array([[0]])) - assert np.allclose(ansatz.b[1], np.array([1])) - assert ansatz.c[1] == 1 - - -@given(Abc=Abc_triple()) -def test_PolyExpAnsatz_simplify_v2(Abc): - """Test that we can simplify a PolyExpAnsatz object""" - A, b, c = Abc - ansatz = PolyExpAnsatz(A, b, c) - ansatz = ansatz + ansatz - assert np.allclose(ansatz.A[0], ansatz.A[1]) - assert np.allclose(ansatz.A[0], A) - assert np.allclose(ansatz.b[0], ansatz.b[1]) - assert np.allclose(ansatz.b[0], b) - ansatz.simplify_v2() - assert len(ansatz.A) == 1 - assert len(ansatz.b) == 1 - assert np.allclose(ansatz.c, 2 * c) +from mrmustard.physics.ansatze import PolyExpAnsatz, ArrayAnsatz +from ..random import Abc_triple + + +class TestPolyExpAnsatz: + r""" + Tests the ``PolyExpAnsatz`` class. + """ + + Abc_n1 = Abc_triple(1) + Abc_n2 = Abc_triple(2) + Abc_n3 = Abc_triple(3) + + @pytest.mark.parametrize("triple", [Abc_n1, Abc_n2, Abc_n3]) + def test_init(self, triple): + A, b, c = triple + ansatz = PolyExpAnsatz(A, b, c) + assert np.allclose(ansatz.mat[0], A) + assert np.allclose(ansatz.vec[0], b) + assert np.allclose(ansatz.array[0], c) + + def test_add(self): + A1, b1, c1 = Abc_triple(5) + A2, b2, c2 = Abc_triple(5) + + ansatz = PolyExpAnsatz(A1, b1, c1) + ansatz2 = PolyExpAnsatz(A2, b2, c2) + ansatz3 = ansatz + ansatz2 + + assert np.allclose(ansatz3.mat[0], A1) + assert np.allclose(ansatz3.vec[0], b1) + assert np.allclose(ansatz3.array[0], c1) + assert np.allclose(ansatz3.mat[1], A2) + assert np.allclose(ansatz3.vec[1], b2) + assert np.allclose(ansatz3.array[1], c2) + + def test_mul(self): + A1, b1, c1 = Abc_triple(5) + A2, b2, c2 = Abc_triple(5) + + ansatz = PolyExpAnsatz(A1, b1, c1) + ansatz2 = PolyExpAnsatz(A2, b2, c2) + ansatz3 = ansatz * ansatz2 + + assert np.allclose(ansatz3.mat[0], A1 + A2) + assert np.allclose(ansatz3.vec[0], b1 + b2) + assert np.allclose(ansatz3.array[0], c1 * c2) + + def test_mul_scalar(self): + A, b, c = Abc_triple(5) + d = 0.1 + + ansatz = PolyExpAnsatz(A, b, c) + ansatz2 = ansatz * d + + assert np.allclose(ansatz2.mat[0], A) + assert np.allclose(ansatz2.vec[0], b) + assert np.allclose(ansatz2.array[0], d * c) + + def test_call(self): + A, b, c = Abc_triple(5) + ansatz = PolyExpAnsatz(A, b, c) + + assert np.allclose(ansatz(z=math.zeros_like(b)), c) + + def test_and(self): + A1, b1, c1 = Abc_triple(6) + A2, b2, c2 = Abc_triple(6) + + ansatz = PolyExpAnsatz(A1, b1, c1) + ansatz2 = PolyExpAnsatz(A2, b2, c2) + ansatz3 = ansatz & ansatz2 + + assert np.allclose(ansatz3.mat[0], math.block_diag(A1, A2)) + assert np.allclose(ansatz3.vec[0], math.concat([b1, b2], -1)) + assert np.allclose(ansatz3.array[0], c1 * c2) + + def test_eq(self): + A, b, c = Abc_triple(5) + + ansatz = PolyExpAnsatz(A, b, c) + ansatz2 = PolyExpAnsatz(2 * A, 2 * b, 2 * c) + + assert ansatz == ansatz + assert ansatz2 == ansatz2 + assert ansatz != ansatz2 + assert ansatz2 != ansatz + + def test_simplify(self): + A, b, c = Abc_triple(5) + + ansatz = PolyExpAnsatz(A, b, c) + ansatz = ansatz + ansatz + + assert np.allclose(ansatz.A[0], ansatz.A[1]) + assert np.allclose(ansatz.A[0], A) + assert np.allclose(ansatz.b[0], ansatz.b[1]) + assert np.allclose(ansatz.b[0], b) + + ansatz.simplify() + assert len(ansatz.A) == 1 + assert len(ansatz.b) == 1 + assert ansatz.c == 2 * c + + def test_simplify_v2(self): + A, b, c = Abc_triple(5) + + ansatz = PolyExpAnsatz(A, b, c) + ansatz = ansatz + ansatz + + assert np.allclose(ansatz.A[0], ansatz.A[1]) + assert np.allclose(ansatz.A[0], A) + assert np.allclose(ansatz.b[0], ansatz.b[1]) + assert np.allclose(ansatz.b[0], b) + + ansatz.simplify_v2() + assert len(ansatz.A) == 1 + assert len(ansatz.b) == 1 + assert np.allclose(ansatz.c, 2 * c) + + def test_order_batch(self): + ansatz = PolyExpAnsatz( + A=[np.array([[0]]), np.array([[1]])], b=[np.array([1]), np.array([0])], c=[1, 2] + ) + ansatz._order_batch() # pylint: disable=protected-access + + assert np.allclose(ansatz.A[0], np.array([[1]])) + assert np.allclose(ansatz.b[0], np.array([0])) + assert ansatz.c[0] == 2 + assert np.allclose(ansatz.A[1], np.array([[0]])) + assert np.allclose(ansatz.b[1], np.array([1])) + assert ansatz.c[1] == 1 + + +class TestArrayAnsatz: + r"""Tests all algebra related to ArrayAnsatz.""" + + def test_init_(self): + array = np.random.random((2, 4, 5)) + aa = ArrayAnsatz(array=array) + assert isinstance(aa, ArrayAnsatz) + assert np.allclose(aa.array, array) + + def test_neg(self): + array = np.random.random((2, 4, 5)) + aa = ArrayAnsatz(array=array) + minusaa = -aa + assert isinstance(minusaa, ArrayAnsatz) + assert np.allclose(minusaa.array, -array) + + def test_equal(self): + array = np.random.random((2, 4, 5)) + aa1 = ArrayAnsatz(array=array) + aa2 = ArrayAnsatz(array=array) + assert aa1 == aa2 + + def test_add(self): + array = np.arange(8).reshape(2, 2, 2) + array2 = np.arange(8).reshape(2, 2, 2) + aa1 = ArrayAnsatz(array=array) + aa2 = ArrayAnsatz(array=array2) + aa1_add_aa2 = aa1 + aa2 + assert isinstance(aa1_add_aa2, ArrayAnsatz) + assert aa1_add_aa2.array.shape == (4, 2, 2) + assert np.allclose(aa1_add_aa2.array[0], np.array([[0, 2], [4, 6]])) + assert np.allclose(aa1_add_aa2.array[1], np.array([[4, 6], [8, 10]])) + assert np.allclose(aa1_add_aa2.array[2], np.array([[4, 6], [8, 10]])) + assert np.allclose(aa1_add_aa2.array[3], np.array([[8, 10], [12, 14]])) + + def test_and(self): + array = np.arange(8).reshape(2, 2, 2) + array2 = np.arange(8).reshape(2, 2, 2) + aa1 = ArrayAnsatz(array=array) + aa2 = ArrayAnsatz(array=array2) + aa1_and_aa2 = aa1 & aa2 + assert isinstance(aa1_and_aa2, ArrayAnsatz) + assert aa1_and_aa2.array.shape == (4, 2, 2, 2, 2) + assert np.allclose( + aa1_and_aa2.array[0], + np.array([[[[0, 0], [0, 0]], [[0, 1], [2, 3]]], [[[0, 2], [4, 6]], [[0, 3], [6, 9]]]]), + ) + assert np.allclose( + aa1_and_aa2.array[1], + np.array( + [[[[0, 0], [0, 0]], [[4, 5], [6, 7]]], [[[8, 10], [12, 14]], [[12, 15], [18, 21]]]] + ), + ) + assert np.allclose( + aa1_and_aa2.array[2], + np.array( + [[[[0, 4], [8, 12]], [[0, 5], [10, 15]]], [[[0, 6], [12, 18]], [[0, 7], [14, 21]]]] + ), + ) + assert np.allclose( + aa1_and_aa2.array[3], + np.array( + [ + [[[16, 20], [24, 28]], [[20, 25], [30, 35]]], + [[[24, 30], [36, 42]], [[28, 35], [42, 49]]], + ] + ), + ) + + def test_mul_a_scalar(self): + array = np.random.random((2, 4, 5)) + aa1 = ArrayAnsatz(array=array) + aa1_scalar = aa1 * 8 + assert isinstance(aa1_scalar, ArrayAnsatz) + assert np.allclose(aa1_scalar.array, array * 8) + + def test_mul(self): + array = np.arange(8).reshape(2, 2, 2) + array2 = np.arange(8).reshape(2, 2, 2) + aa1 = ArrayAnsatz(array=array) + aa2 = ArrayAnsatz(array=array2) + aa1_mul_aa2 = aa1 * aa2 + assert isinstance(aa1_mul_aa2, ArrayAnsatz) + assert aa1_mul_aa2.array.shape == (4, 2, 2) + assert np.allclose(aa1_mul_aa2.array[0], np.array([[0, 1], [4, 9]])) + assert np.allclose(aa1_mul_aa2.array[1], np.array([[0, 5], [12, 21]])) + assert np.allclose(aa1_mul_aa2.array[2], np.array([[0, 5], [12, 21]])) + assert np.allclose(aa1_mul_aa2.array[3], np.array([[16, 25], [36, 49]])) + + def test_truediv_a_scalar(self): + array = np.random.random((2, 4, 5)) + aa1 = ArrayAnsatz(array=array) + aa1_scalar = aa1 / 6 + assert isinstance(aa1_scalar, ArrayAnsatz) + assert np.allclose(aa1_scalar.array, array / 6) + + def test_div(self): + array = np.arange(9)[1:].reshape(2, 2, 2) + array2 = np.arange(9)[1:].reshape(2, 2, 2) + aa1 = ArrayAnsatz(array=array) + aa2 = ArrayAnsatz(array=array2) + aa1_div_aa2 = aa1 / aa2 + assert isinstance(aa1_div_aa2, ArrayAnsatz) + assert aa1_div_aa2.array.shape == (4, 2, 2) + assert np.allclose(aa1_div_aa2.array[0], np.array([[1.0, 1.0], [1.0, 1.0]])) + assert np.allclose(aa1_div_aa2.array[1], np.array([[0.2, 0.33333], [0.42857143, 0.5]])) + assert np.allclose(aa1_div_aa2.array[2], np.array([[5.0, 3.0], [2.33333333, 2.0]])) + assert np.allclose(aa1_div_aa2.array[3], np.array([[1.0, 1.0], [1.0, 1.0]])) + + def test_algebra_with_different_shape_of_array_raise_errors(self): + array = np.random.random((2, 4, 5)) + array2 = np.random.random((3, 4, 8, 9)) + aa1 = ArrayAnsatz(array=array) + aa2 = ArrayAnsatz(array=array2) + + with pytest.raises(Exception): + aa1 + aa2 + + with pytest.raises(Exception): + aa1 - aa2 + + with pytest.raises(Exception): + aa1 * aa2 + + with pytest.raises(Exception): + aa1 / aa2 + + with pytest.raises(Exception): + aa1 == aa2 diff --git a/tests/test_physics/test_bargmann.py b/tests/test_physics/test_bargmann.py new file mode 100644 index 000000000..05bb5be80 --- /dev/null +++ b/tests/test_physics/test_bargmann.py @@ -0,0 +1,152 @@ +import numpy as np +import pytest + +from mrmustard import math +from mrmustard.lab import Attenuator, Dgate, Gaussian, Ggate +from mrmustard.physics.bargmann import ( + complex_gaussian_integral, + contract_two_Abc, + join_Abc, + wigner_to_bargmann_Choi, + wigner_to_bargmann_psi, + wigner_to_bargmann_rho, + wigner_to_bargmann_U, + reorder_abc, +) +from mrmustard.physics import triples + + +def test_reorder_abc(): + """Test that the reorder_abc function works correctly""" + A = np.array([[1, 2], [2, 3]]) + b = np.array([4, 5]) + c = np.array(6) + same = reorder_abc((A, b, c), (0, 1)) + assert all(np.allclose(x, y) for x, y in zip(same, (A, b, c))) + flipped = reorder_abc((A, b, c), (1, 0)) + assert all(np.allclose(x, y) for x, y in zip(flipped, (A[[1, 0], :][:, [1, 0]], b[[1, 0]], c))) + c = np.array([[6, 7], [8, 9]]) + flipped = reorder_abc((A, b, c), (1, 0)) # test transposition of c + assert all( + np.allclose(x, y) for x, y in zip(flipped, (A[[1, 0], :][:, [1, 0]], b[[1, 0]], c.T)) + ) + + +def test_wigner_to_bargmann_psi(): + """Test that the Bargmann representation of a ket is correct""" + G = Gaussian(2) >> Dgate(0.1, 0.2) + + for x, y in zip(G.bargmann(), wigner_to_bargmann_psi(G.cov, G.means)): + assert np.allclose(x, y) + + +def test_wigner_to_bargmann_rho(): + """Test that the Bargmann representation of a dm is correct""" + G = Gaussian(2) >> Dgate(0.1, 0.2) >> Attenuator(0.9) + + for x, y in zip(G.bargmann(), wigner_to_bargmann_rho(G.cov, G.means)): + assert np.allclose(x, y) + + +def test_wigner_to_bargmann_U(): + """Test that the Bargmann representation of a unitary is correct""" + G = Ggate(2) >> Dgate(0.1, 0.2) + X, _, d = G.XYd(allow_none=False) + for x, y in zip(G.bargmann(), wigner_to_bargmann_U(X, d)): + assert np.allclose(x, y) + + +def test_wigner_to_bargmann_choi(): + """Test that the Bargmann representation of a Choi matrix is correct""" + G = Ggate(2) >> Dgate(0.1, 0.2) >> Attenuator(0.9) + X, Y, d = G.XYd(allow_none=False) + for x, y in zip(G.bargmann(), wigner_to_bargmann_Choi(X, Y, d)): + assert np.allclose(x, y) + + +def test_bargmann_numpy_state(): + """Tests that the numpy option of the bargmann method of State works correctly""" + state = Gaussian(1) + assert all(isinstance(thing, np.ndarray) for thing in state.bargmann(numpy=True)) + + +def test_bargmann_numpy_transformation(): + """Tests that the numpy option of the bargmann method of State works correctly""" + transformation = Ggate(1) + assert all(isinstance(thing, np.ndarray) for thing in transformation.bargmann(numpy=True)) + + +def test_join_Abc(): + """Tests the ``join_Abc`` method.""" + A1, b1, c1 = triples.vacuum_state_Abc(2) + A2, b2, c2 = triples.displacement_gate_Abc(x=[0.1, 0.2], y=0.3) + + joined_Abc = join_Abc((A1, b1, c1), (A2, b2, c2)) + assert np.allclose(joined_Abc[0], math.block_diag(A1, A2)) + assert np.allclose(joined_Abc[1], math.concat([b1, b2], axis=-1)) + assert np.allclose(joined_Abc[2], math.outer(c1, c2)) + + A12 = math.block_diag(A1, A2) + b12 = math.concat([b1, b2], axis=-1) + c12 = math.outer(c1, c2) + return A12, b12, c12 + + +def test_complex_gaussian_integral(): + """Tests the ``complex_gaussian_integral`` method.""" + A1, b1, c1 = triples.vacuum_state_Abc(2) + A2, b2, c2 = triples.displacement_gate_Abc(x=[0.1, 0.2], y=0.3) + A3, b3, c3 = triples.displaced_squeezed_vacuum_state_Abc(x=[0.1, 0.2], y=0.3) + + joined_Abc = join_Abc((A1, b1, c1), (A2, b2, c2)) + + res1 = complex_gaussian_integral(joined_Abc, [], []) + assert np.allclose(res1[0], joined_Abc[0]) + assert np.allclose(res1[1], joined_Abc[1]) + assert np.allclose(res1[2], joined_Abc[2]) + + res2 = complex_gaussian_integral(joined_Abc, [0, 1], [4, 5]) + assert np.allclose(res2[0], A3) + assert np.allclose(res2[1], b3) + assert np.allclose(res2[2], c3) + + res3 = complex_gaussian_integral(join_Abc((A1, b1, c1), (A1, b1, c1)), [0, 1], [2, 3]) + assert np.allclose(res3[0], 0) + assert np.allclose(res3[1], 0) + assert np.allclose(res3[2], 1) + + +def test_complex_gaussian_integral_error(): + """Tests the error of the ``complex_gaussian_integral`` method.""" + A1, b1, c1 = triples.vacuum_state_Abc(2) + A2, b2, c2 = triples.displacement_gate_Abc(x=[0.1, 0.2], y=0.3) + + with pytest.raises(ValueError, match="idx_z and idx_zconj must have the same length"): + complex_gaussian_integral( + join_Abc((A1, b1, c1), (A2, b2, c2)), + [0, 1], + [ + 4, + ], + ) + + +def test_contract_two_Abc(): + """Tests the error of the ``contract_two_Abc`` method.""" + A1, b1, c1 = triples.vacuum_state_Abc(2) + A2, b2, c2 = triples.displacement_gate_Abc(x=[0.1, 0.2], y=0.3) + + res1 = contract_two_Abc((A1, b1, c1), (A2, b2, c2), [], []) + assert np.allclose(res1[0], math.block_diag(A1, A2)) + assert np.allclose(res1[1], [0, 0, 0.1 + 0.3j, 0.2 + 0.3j, -0.1 + 0.3j, -0.2 + 0.3j]) + assert np.allclose(res1[2], c1 * c2) + + res2 = contract_two_Abc((A1, b1, c1), (A2, b2, c2), [0, 1], [2, 3]) + assert np.allclose(res2[0], math.zeros((2, 2))) + assert np.allclose(res2[1], [0.1 + 0.3j, 0.2 + 0.3j]) + assert np.allclose(res2[2], c1 * c2) + + res3 = contract_two_Abc((A1, b1, c1), (A2, b2, c2), [0, 1], [0, 1]) + assert np.allclose(res3[0], math.zeros((2, 2))) + assert np.allclose(res3[1], [-0.1 + 0.3j, -0.2 + 0.3j]) + assert np.allclose(res3[2], c1 * c2) diff --git a/tests/test_physics/test_bargmann/test_bargmann_repr.py b/tests/test_physics/test_bargmann/test_bargmann_repr.py deleted file mode 100644 index e1680a61f..000000000 --- a/tests/test_physics/test_bargmann/test_bargmann_repr.py +++ /dev/null @@ -1,177 +0,0 @@ -import numpy as np - -from mrmustard import math -from mrmustard.lab import Attenuator, Coherent, Gaussian, Ggate, Dgate -from mrmustard.physics.bargmann import contract_two_Abc, reorder_abc, wigner_to_bargmann_rho -from mrmustard.physics.representations import Bargmann -from tests.random import random_Ggate, single_mode_unitary_gate, n_mode_mixed_state, Abc_triple -from hypothesis import given - - -def test_make_cat(): - r"test adding two coherent states via the Bargmann representation" - cat = Bargmann(*Coherent(1.0).bargmann()) + Bargmann(*Coherent(-1.0).bargmann()) - assert np.allclose(cat.A[0], cat.A[1]) - assert np.allclose(cat.b[0], -cat.b[1]) - - -def test_muldiv_with_another_Bargmann(): - r"test multiplying and dividing two Bargmann representations" - Abc1 = Bargmann(*(Gaussian(1) >> Dgate(0.1, 0.2)).bargmann()) - Abc2 = Bargmann(*(Gaussian(1) >> Dgate(0.4, 0.1)).bargmann()) - s1 = Abc1 * Abc2 - s2 = Abc1 / Abc2 - assert np.allclose(s1.A[0], Abc1.A[0] + Abc2.A[0]) - assert np.allclose(s1.b[0], Abc1.b[0] + Abc2.b[0]) - assert np.allclose(s1.c[0], Abc1.c[0] * Abc2.c[0]) - assert np.allclose(s2.A[0], Abc1.A[0] - Abc2.A[0]) - assert np.allclose(s2.b[0], Abc1.b[0] - Abc2.b[0]) - assert np.allclose(s2.c[0], Abc1.c[0] / Abc2.c[0]) - - -def test_muldiv_with_scalar(): - r"test multiplying and dividing a Bargmann representation with a scalar" - s1 = Bargmann(*Coherent(1.0).bargmann()) * 2.0 - s2 = Bargmann(*Coherent(1.0).bargmann()) / 3.0 - s3 = 4.0 * Bargmann(*Coherent(1.0).bargmann()) - assert np.allclose(s1.c, Coherent(1.0).bargmann()[2] * 2.0) - assert np.allclose(s2.c, Coherent(1.0).bargmann()[2] / 3.0) - assert np.allclose(s3.c, Coherent(1.0).bargmann()[2] * 4.0) - - -@given(Abc=Abc_triple(3)) -def test_reorder_indices(Abc): - r"""Test that we can reorder the indices of the A matrix and b vector of an (A,b,c) triple""" - barg = Bargmann(*Abc) - barg = barg.reorder((0, 2, 1)) - assert np.allclose(barg.A[0], Abc[0][[0, 2, 1], :][:, [0, 2, 1]]) - assert np.allclose(barg.b[0], Abc[1][[0, 2, 1]]) - - -@given(Abc=Abc_triple()) -def test_call(Abc): - r"""Test that we can call the PolyExpAnsatz object""" - A, b, c = Abc - barg = Bargmann(A, b, c) - assert np.allclose(barg(z=math.zeros_like(b)), c) - - -def test_subtract(): - r"test subtracting two coherent states via the Bargmann representation" - cat = Bargmann(*Coherent(1.0).bargmann()) - Bargmann(*Coherent(-1.0).bargmann()) - assert np.allclose(cat.A[0], cat.A[1]) - assert np.allclose(cat.b[0], -cat.b[1]) - - -def test_abc_contraction_2mode_psi_U(): - "tests that the abc contraction works for U|psi>" - psi = Gaussian(2) - U = Ggate(2) - A1, b1, c1 = psi.bargmann() # out1ket, out2ket - A2, b2, c2 = U.bargmann() # out1ket, out2ket, in1ket, in2ket - A_abc, b_abc, c_abc = contract_two_Abc((A1, b1, c1), (A2, b2, c2), (0, 1), (2, 3)) - A_mm, b_mm, c_mm = (psi >> U).bargmann() - assert np.allclose(A_abc, A_mm) - assert np.allclose(b_abc, b_mm) - assert np.allclose(abs(c_abc), abs(c_mm)) - - -def test_abc_contraction_2mode_rho_phi(): - "tests that the abc contraction works for rho >> phi" - rho = Gaussian(2) >> Attenuator([0.1, 0.2]) >> Ggate(2) >> Attenuator([0.4, 0.9]) - phi = Ggate(2) >> Attenuator([0.3, 0.4]) >> Ggate(2) - # out1bra, out2bra, out1ket, out2ket - A1, b1, c1 = rho.bargmann() - # out1bra, out2bra, in1bra, in2bra, out1ket, out2ket, in1ket, in2ket - A2, b2, c2 = phi.bargmann() - - A_abc, b_abc, c_abc = contract_two_Abc((A1, b1, c1), (A2, b2, c2), (0, 1, 2, 3), (2, 3, 6, 7)) - - A_mm, b_mm, c_mm = (rho >> phi).bargmann() - - assert np.allclose(A_abc, A_mm) - assert np.allclose(b_abc, b_mm) - assert np.allclose(c_abc, c_mm) - - -def test_abc_contraction_3mode_rho_2mode_U(): - "tests that the abc contraction works for U rho U_dagger" - rho = Gaussian(3) >> Attenuator([0.1, 0.2, 0.4]) >> Ggate(3) >> Attenuator([0.4, 0.5, 0.9]) - U = Ggate(2) - # out1bra, out2bra, out3bra, out1ket, out2ket, out3ket - A1, b1, c1 = rho.bargmann() - # out1ket, out2ket, in1ket, in2ket - A2, b2, c2 = U.bargmann() - A_abc, b_abc, c_abc = contract_two_Abc( - (A2, b2, c2), (A1, b1, c1), (2, 3), (4, 5) - ) # left in out1ket_U, out2ket_U, out1bra_rho, out2bra_rho, out3bra_rho, out1ket_rho - A_abc, b_abc, c_abc = contract_two_Abc( - (A_abc, b_abc, c_abc), - (math.conj(A2), math.conj(b2), math.conj(c2)), - (3, 4), - (2, 3), - ) # left in out1ket_U, out2ket_U, out1bra_rho, out1ket_rho, out1bra_U, out2bra_U - A_abc, b_abc, c_abc = reorder_abc((A_abc, b_abc, c_abc), (2, 4, 5, 3, 0, 1)) - A_mm, b_mm, c_mm = (rho >> U[1, 2]).bargmann() - assert np.allclose(A_abc, A_mm) - assert np.allclose(b_abc, b_mm) - assert np.allclose(c_abc, c_mm) - - -def test_Bargmann_2mode_psi_U(): - "tests that the Bargmann representation works for U|psi>" - psi = Gaussian(2) - U = Ggate(2) - A1, b1, c1 = psi.bargmann() # out1ket, out2ket - A2, b2, c2 = U.bargmann() # out1ket, out2ket, in1ket, in2ket - Abc1 = Bargmann(A1, b1, c1) - Abc2 = Bargmann(A2, b2, c2) - psiU = Abc1[0, 1] @ Abc2[2, 3] - A_abc, b_abc, c_abc = psiU.A[0], psiU.b[0], psiU.c[0] - A_mm, b_mm, c_mm = (psi >> U).bargmann() - assert np.allclose(A_abc, A_mm) - assert np.allclose(b_abc, b_mm) - assert np.allclose(abs(c_abc), abs(c_mm)) - - -@given(G1=random_Ggate(num_modes=1), G2=random_Ggate(num_modes=1)) -def test_composition_GG(G1, G2): - r"""Test that the composition of two G gates is the same - as the composition of their Bargmann representations""" - a12, b12, c12 = (G1 >> G2).bargmann() - composed = Bargmann(*G2.bargmann())[1] @ Bargmann(*G1.bargmann())[0] - assert np.allclose(composed.A[0], a12) - assert np.allclose(composed.b[0], b12) - assert np.allclose(np.abs(composed.c[0]), np.abs(c12)) - - -@given(G1=single_mode_unitary_gate(), G2=single_mode_unitary_gate()) -def test_composition_all(G1, G2): - r"""Test that the composition of any two gates is the same - as the composition of their Bargmann representations""" - a12, b12, c12 = (G1 >> G2).bargmann() - composed = Bargmann(*G2.bargmann())[1] @ Bargmann(*G1.bargmann())[0] - assert np.allclose(composed.A[0], a12) - assert np.allclose(composed.b[0], b12) - assert np.allclose(np.abs(composed.c[0]), np.abs(c12)) - - -@given(rho=n_mode_mixed_state(num_modes=2)) -def test_partial_trace_2mode_state(rho): - r"""Test that the partial trace of a 2-mode state works""" - rho01 = Bargmann(*wigner_to_bargmann_rho(rho.cov, rho.means)) - rho1 = rho01.trace([0], [2]) - rho0 = rho01.trace([1], [3]) - assert rho1 == Bargmann(*rho.get_modes(1).bargmann()) - assert rho0 == Bargmann(*rho.get_modes(0).bargmann()) - - -@given(rho=n_mode_mixed_state(num_modes=3)) -def test_partial_trace_3mode_state(rho): - r"""Test that the partial trace of a 3-mode state works""" - rho = rho >> Attenuator([0.9, 0.9, 0.9]) - rho012 = Bargmann(*wigner_to_bargmann_rho(rho.cov, rho.means)) - rho12 = rho012.trace([0], [3]) - rho2 = rho012.trace([0, 1], [3, 4]) - assert np.allclose(rho12.b, Bargmann(*rho.get_modes([1, 2]).bargmann()).b) - assert rho2 == Bargmann(*rho.get_modes(2).bargmann()) diff --git a/tests/test_physics/test_bargmann/test_bargmann_utils.py b/tests/test_physics/test_bargmann/test_bargmann_utils.py deleted file mode 100644 index b978a4ce1..000000000 --- a/tests/test_physics/test_bargmann/test_bargmann_utils.py +++ /dev/null @@ -1,70 +0,0 @@ -import numpy as np - -from mrmustard.lab import Attenuator, Dgate, Gaussian, Ggate -from mrmustard.physics.bargmann import ( - wigner_to_bargmann_Choi, - wigner_to_bargmann_psi, - wigner_to_bargmann_rho, - wigner_to_bargmann_U, - reorder_abc, -) - - -def test_reorder_abc(): - """Test that the reorder_abc function works correctly""" - A = np.array([[1, 2], [2, 3]]) - b = np.array([4, 5]) - c = np.array(6) - same = reorder_abc((A, b, c), (0, 1)) - assert all(np.allclose(x, y) for x, y in zip(same, (A, b, c))) - flipped = reorder_abc((A, b, c), (1, 0)) - assert all(np.allclose(x, y) for x, y in zip(flipped, (A[[1, 0], :][:, [1, 0]], b[[1, 0]], c))) - c = np.array([[6, 7], [8, 9]]) - flipped = reorder_abc((A, b, c), (1, 0)) # test transposition of c - assert all( - np.allclose(x, y) for x, y in zip(flipped, (A[[1, 0], :][:, [1, 0]], b[[1, 0]], c.T)) - ) - - -def test_wigner_to_bargmann_psi(): - """Test that the Bargmann representation of a ket is correct""" - G = Gaussian(2) >> Dgate(0.1, 0.2) - - for x, y in zip(G.bargmann(), wigner_to_bargmann_psi(G.cov, G.means)): - assert np.allclose(x, y) - - -def test_wigner_to_bargmann_rho(): - """Test that the Bargmann representation of a dm is correct""" - G = Gaussian(2) >> Dgate(0.1, 0.2) >> Attenuator(0.9) - - for x, y in zip(G.bargmann(), wigner_to_bargmann_rho(G.cov, G.means)): - assert np.allclose(x, y) - - -def test_wigner_to_bargmann_U(): - """Test that the Bargmann representation of a unitary is correct""" - G = Ggate(2) >> Dgate(0.1, 0.2) - X, _, d = G.XYd(allow_none=False) - for x, y in zip(G.bargmann(), wigner_to_bargmann_U(X, d)): - assert np.allclose(x, y) - - -def test_wigner_to_bargmann_choi(): - """Test that the Bargmann representation of a Choi matrix is correct""" - G = Ggate(2) >> Dgate(0.1, 0.2) >> Attenuator(0.9) - X, Y, d = G.XYd(allow_none=False) - for x, y in zip(G.bargmann(), wigner_to_bargmann_Choi(X, Y, d)): - assert np.allclose(x, y) - - -def test_bargmann_numpy_state(): - """Tests that the numpy option of the bargmann method of State works correctly""" - state = Gaussian(1) - assert all(isinstance(thing, np.ndarray) for thing in state.bargmann(numpy=True)) - - -def test_bargmann_numpy_transformation(): - """Tests that the numpy option of the bargmann method of State works correctly""" - transformation = Ggate(1) - assert all(isinstance(thing, np.ndarray) for thing in transformation.bargmann(numpy=True)) diff --git a/tests/test_physics/test_fock/test_fock.py b/tests/test_physics/test_fock.py similarity index 100% rename from tests/test_physics/test_fock/test_fock.py rename to tests/test_physics/test_fock.py diff --git a/tests/test_physics/test_fock/__init__.py b/tests/test_physics/test_fock/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/tests/test_physics/test_representations.py b/tests/test_physics/test_representations.py new file mode 100644 index 000000000..870d9396f --- /dev/null +++ b/tests/test_physics/test_representations.py @@ -0,0 +1,288 @@ +# Copyright 2022 Xanadu Quantum Technologies Inc. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""This module contains tests for ``Representation`` objects.""" + +import numpy as np +import pytest + +from mrmustard import math +from mrmustard.physics.bargmann import contract_two_Abc, complex_gaussian_integral +from mrmustard.physics.representations import Bargmann, Fock +from ..random import Abc_triple + +# pylint: disable = missing-function-docstring + + +class TestBargmannRepresentation: + r""" + Tests the Bargmann Representation. + """ + + Abc_n1 = Abc_triple(1) + Abc_n2 = Abc_triple(2) + Abc_n3 = Abc_triple(3) + + @pytest.mark.parametrize("triple", [Abc_n1, Abc_n2, Abc_n3]) + def test_init_non_batched(self, triple): + A, b, c = triple + bargmann = Bargmann(*triple) + + assert np.allclose(bargmann.A, A) + assert np.allclose(bargmann.b, b) + assert np.allclose(bargmann.c, c) + + @pytest.mark.parametrize("triple", [Abc_n1, Abc_n2, Abc_n3]) + def test_init_from_ansatz(self, triple): + bargmann1 = Bargmann(*triple) + bargmann2 = Bargmann.from_ansatz(bargmann1.ansatz) + + assert bargmann1 == bargmann2 + + @pytest.mark.parametrize("triple", [Abc_n1, Abc_n2, Abc_n3]) + def test_conj(self, triple): + A, b, c = triple + bargmann = Bargmann(*triple).conj() + + assert np.allclose(bargmann.A, math.conj(A)) + assert np.allclose(bargmann.b, math.conj(b)) + assert np.allclose(bargmann.c, math.conj(c)) + + @pytest.mark.parametrize("n", [1, 2, 3]) + def test_and(self, n): + triple1 = Abc_triple(n) + triple2 = Abc_triple(n) + + bargmann = Bargmann(*triple1) & Bargmann(*triple2) + + assert bargmann.A.shape == (1, 2 * n, 2 * n) + assert bargmann.b.shape == (1, 2 * n) + assert bargmann.c.shape == (1,) + + @pytest.mark.parametrize("scalar", [0.5, 1.2]) + @pytest.mark.parametrize("triple", [Abc_n1, Abc_n2, Abc_n3]) + def test_mul_with_scalar(self, scalar, triple): + bargmann1 = Bargmann(*triple) + bargmann_mul = bargmann1 * scalar + + assert np.allclose(bargmann1.A, bargmann_mul.A) + assert np.allclose(bargmann1.b, bargmann_mul.b) + assert np.allclose(bargmann1.c * scalar, bargmann_mul.c) + + @pytest.mark.parametrize("n", [1, 2, 3]) + def test_mul(self, n): + triple1 = Abc_triple(n) + triple2 = Abc_triple(n) + + bargmann1 = Bargmann(*triple1) + bargmann2 = Bargmann(*triple2) + bargmann_mul = bargmann1 * bargmann2 + + assert np.allclose(bargmann_mul.A, bargmann1.A + bargmann2.A) + assert np.allclose(bargmann_mul.b, bargmann1.b + bargmann2.b) + assert np.allclose(bargmann_mul.c, bargmann1.c * bargmann2.c) + + @pytest.mark.parametrize("scalar", [0.5, 1.2]) + @pytest.mark.parametrize("triple", [Abc_n1, Abc_n2, Abc_n3]) + def test_div_with_scalar(self, scalar, triple): + bargmann1 = Bargmann(*triple) + bargmann_div = bargmann1 / scalar + + assert np.allclose(bargmann1.A, bargmann_div.A) + assert np.allclose(bargmann1.b, bargmann_div.b) + assert np.allclose(bargmann1.c / scalar, bargmann_div.c) + + @pytest.mark.parametrize("n", [1, 2, 3]) + def test_div(self, n): + triple1 = Abc_triple(n) + triple2 = Abc_triple(n) + + bargmann1 = Bargmann(*triple1) + bargmann2 = Bargmann(*triple2) + bargmann_div = bargmann1 / bargmann2 + + assert np.allclose(bargmann_div.A, bargmann1.A - bargmann2.A) + assert np.allclose(bargmann_div.b, bargmann1.b - bargmann2.b) + assert np.allclose(bargmann_div.c, bargmann1.c / bargmann2.c) + + @pytest.mark.parametrize("n", [1, 2, 3]) + def test_add(self, n): + triple1 = Abc_triple(n) + triple2 = Abc_triple(n) + + bargmann1 = Bargmann(*triple1) + bargmann2 = Bargmann(*triple2) + bargmann_add = bargmann1 + bargmann2 + + assert np.allclose(bargmann_add.A, math.concat([bargmann1.A, bargmann2.A], axis=0)) + assert np.allclose(bargmann_add.b, math.concat([bargmann1.b, bargmann2.b], axis=0)) + assert np.allclose(bargmann_add.c, math.concat([bargmann1.c, bargmann2.c], axis=0)) + + @pytest.mark.parametrize("n", [1, 2, 3]) + def test_sub(self, n): + triple1 = Abc_triple(n) + triple2 = Abc_triple(n) + + bargmann1 = Bargmann(*triple1) + bargmann2 = Bargmann(*triple2) + bargmann_add = bargmann1 - bargmann2 + + assert np.allclose(bargmann_add.A, math.concat([bargmann1.A, bargmann2.A], axis=0)) + assert np.allclose(bargmann_add.b, math.concat([bargmann1.b, bargmann2.b], axis=0)) + assert np.allclose(bargmann_add.c, math.concat([bargmann1.c, -bargmann2.c], axis=0)) + + def test_trace(self): + triple = Abc_triple(4) + bargmann = Bargmann(*triple).trace([0], [2]) + A, b, c = complex_gaussian_integral(triple, [0], [2]) + + assert np.allclose(bargmann.A, A) + assert np.allclose(bargmann.b, b) + assert np.allclose(bargmann.c, c) + + def test_reorder(self): + triple = Abc_triple(3) + bargmann = Bargmann(*triple).reorder((0, 2, 1)) + + assert np.allclose(bargmann.A[0], triple[0][[0, 2, 1], :][:, [0, 2, 1]]) + assert np.allclose(bargmann.b[0], triple[1][[0, 2, 1]]) + + @pytest.mark.parametrize("triple", [Abc_n1, Abc_n2, Abc_n3]) + def test_call(self, triple): + bargmann = Bargmann(*triple) + + assert bargmann(0.1 + 0.2j) == bargmann.ansatz(0.1 + 0.2j) + + def test_matmul(self): + triple1 = Abc_triple(3) + triple2 = Abc_triple(3) + + res1 = Bargmann(*triple1) @ Bargmann(*triple2) + exp1 = contract_two_Abc(triple1, triple2, [], []) + assert np.allclose(res1.A, exp1[0]) + assert np.allclose(res1.b, exp1[1]) + assert np.allclose(res1.c, exp1[2]) + + +class TestFockRepresentation: + r"""Tests the Fock Representation.""" + + array578 = np.random.random((5, 7, 8)) + array1578 = np.random.random((1, 5, 7, 8)) + array2578 = np.random.random((2, 5, 7, 8)) + array5578 = np.random.random((5, 5, 7, 8)) + + def test_init_batched(self): + fock = Fock(self.array1578, batched=True) + assert isinstance(fock, Fock) + assert np.allclose(fock.array, self.array1578) + + def test_init_non_batched(self): + fock = Fock(self.array578, batched=False) + assert isinstance(fock, Fock) + assert fock.array.shape == (1, 5, 7, 8) + assert np.allclose(fock.array[0, :, :, :], self.array578) + + def test_init_from_ansatz(self): + fock1 = Fock(self.array5578) + fock2 = Fock.from_ansatz(fock1.ansatz) + assert fock1 == fock2 + + def test_and(self): + fock1 = Fock(self.array1578, batched=True) + fock2 = Fock(self.array5578, batched=True) + fock_test = fock1 & fock2 + assert fock_test.array.shape == (5, 5, 7, 8, 5, 7, 8) + assert np.allclose( + math.reshape(fock_test.array, -1), + math.reshape(np.einsum("bcde, pfgh -> bpcdefgh", self.array1578, self.array5578), -1), + ) + + def test_multiply_a_scalar(self): + fock1 = Fock(self.array1578, batched=True) + fock_test = 1.3 * fock1 + assert np.allclose(fock_test.array, 1.3 * self.array1578) + + def test_mul(self): + fock1 = Fock(self.array1578, batched=True) + fock2 = Fock(self.array5578, batched=True) + fock1_mul_fock2 = fock1 * fock2 + assert fock1_mul_fock2.array.shape == (5, 5, 7, 8) + assert np.allclose( + math.reshape(fock1_mul_fock2.array, -1), + math.reshape(np.einsum("bcde, pcde -> bpcde", self.array1578, self.array5578), -1), + ) + + def test_divide_on_a_scalar(self): + fock1 = Fock(self.array1578, batched=True) + fock_test = fock1 / 1.5 + assert np.allclose(fock_test.array, self.array1578 / 1.5) + + def test_truediv(self): + fock1 = Fock(self.array1578, batched=True) + fock2 = Fock(self.array5578, batched=True) + fock1_mul_fock2 = fock1 / fock2 + assert fock1_mul_fock2.array.shape == (5, 5, 7, 8) + assert np.allclose( + math.reshape(fock1_mul_fock2.array, -1), + math.reshape(np.einsum("bcde, pcde -> bpcde", self.array1578, 1 / self.array5578), -1), + ) + + def test_conj(self): + fock = Fock(self.array1578, batched=True) + fock_conj = fock.conj() + assert np.allclose(fock_conj.array, np.conj(self.array1578)) + + def test_matmul(self): + array2 = math.astensor(np.random.random((5, 6, 7, 8, 10))) + fock1 = Fock(self.array2578, batched=True) + fock2 = Fock(array2, batched=True) + fock_test = fock1[2] @ fock2[2] + assert fock_test.array.shape == (10, 5, 7, 6, 7, 10) + assert np.allclose( + math.reshape(fock_test.array, -1), + math.reshape(np.einsum("bcde, pfgeh -> bpcdfgh", self.array2578, array2), -1), + ) + + def test_add(self): + fock1 = Fock(self.array2578, batched=True) + fock2 = Fock(self.array5578, batched=True) + fock1_add_fock2 = fock1 + fock2 + assert fock1_add_fock2.array.shape == (10, 5, 7, 8) + assert np.allclose(fock1_add_fock2.array[0], self.array2578[0] + self.array5578[0]) + assert np.allclose(fock1_add_fock2.array[4], self.array2578[0] + self.array5578[4]) + assert np.allclose(fock1_add_fock2.array[5], self.array2578[1] + self.array5578[0]) + + def test_sub(self): + fock1 = Fock(self.array2578, batched=True) + fock2 = Fock(self.array5578, batched=True) + fock1_sub_fock2 = fock1 - fock2 + assert fock1_sub_fock2.array.shape == (10, 5, 7, 8) + assert np.allclose(fock1_sub_fock2.array[0], self.array2578[0] - self.array5578[0]) + assert np.allclose(fock1_sub_fock2.array[4], self.array2578[0] - self.array5578[4]) + assert np.allclose(fock1_sub_fock2.array[9], self.array2578[1] - self.array5578[4]) + + def test_trace(self): + array1 = math.astensor(np.random.random((2, 5, 5, 1, 7, 4, 1, 7, 3))) + fock1 = Fock(array1, batched=True) + fock2 = fock1.trace(idxs1=[0, 3], idxs2=[1, 6]) + assert fock2.array.shape == (2, 1, 4, 1, 3) + assert np.allclose(fock2.array, np.einsum("bccefghfj -> beghj", array1)) + + def test_reorder(self): + array1 = math.astensor(np.arange(8).reshape((1, 2, 2, 2))) + fock1 = Fock(array1, batched=True) + fock2 = fock1.reorder(order=(2, 1, 0)) + assert np.allclose(fock2.array, np.array([[[[0, 4], [2, 6]], [[1, 5], [3, 7]]]])) + assert np.allclose(fock2.array, np.arange(8).reshape((1, 2, 2, 2), order="F")) diff --git a/tests/test_physics/test_triples.py b/tests/test_physics/test_triples.py new file mode 100644 index 000000000..fe5517cdf --- /dev/null +++ b/tests/test_physics/test_triples.py @@ -0,0 +1,290 @@ +# Copyright 2023 Xanadu Quantum Technologies Inc. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Tests the Bargmann triples.""" + + +import numpy as np +import pytest + +from mrmustard import math +from mrmustard.physics import triples + + +# pylint: disable = missing-function-docstring +class TestTriples: + r""" + Tests the Bargmann triples. + """ + + def test_incompatible_shapes(self): + match = "incompatible shape" + + with pytest.raises(ValueError, match=match): + triples.coherent_state_Abc([1, 2], [3, 4, 5]) + + with pytest.raises(ValueError, match=match): + triples.coherent_state_Abc([1, 2], [3, 4, 5]) + + with pytest.raises(ValueError, match=match): + triples.squeezed_vacuum_state_Abc([1, 2], [3, 4, 5]) + + with pytest.raises(ValueError, match=match): + triples.displaced_squeezed_vacuum_state_Abc([1, 2], [3, 4, 5], 6, 7) + + @pytest.mark.parametrize("n_modes", [1, 3]) + def test_vacuum_state_Abc(self, n_modes): + A, b, c = triples.vacuum_state_Abc(n_modes) + + assert math.allclose(A, np.zeros((n_modes, n_modes))) + assert math.allclose(b, np.zeros(n_modes)) + assert math.allclose(c, 1.0) + + def test_coherent_state_Abc(self): + A1, b1, c1 = triples.coherent_state_Abc(0.1, 0.2) + assert math.allclose(A1, np.zeros((1, 1))) + assert math.allclose(b1, [0.1 + 0.2j]) + assert math.allclose(c1, 0.97530991) + + A2, b2, c2 = triples.coherent_state_Abc(0.1, [0.2, 0.3]) + assert math.allclose(A2, np.zeros((2, 2))) + assert math.allclose(b2, [0.1 + 0.2j, 0.1 + 0.3j]) + assert math.allclose(c2, 0.9277434863) + + A3, b3, c3 = triples.coherent_state_Abc(0.1) + assert math.allclose(A3, np.zeros((1, 1))) + assert math.allclose(b3, [0.1]) + assert math.allclose(c3, 0.9950124791926823) + + def test_squeezed_vacuum_state_Abc(self): + A1, b1, c1 = triples.squeezed_vacuum_state_Abc(0.1, 0.2) + assert math.allclose(A1, [[-0.09768127 - 0.01980097j]]) + assert math.allclose(b1, np.zeros(1)) + assert math.allclose(c1, 0.9975072676192522) + + A2, b2, c2 = triples.squeezed_vacuum_state_Abc(0.1, [0.2, 0.3]) + assert math.allclose(A2, [[-0.09768127 - 0.01980097j, 0], [0, -0.09521647 - 0.02945391j]]) + assert math.allclose(b2, np.zeros(2)) + assert math.allclose(c2, 0.9950207489532265) + + A3, b3, c3 = triples.squeezed_vacuum_state_Abc(0.1) + assert math.allclose(A3, [[-0.09966799]]) + assert math.allclose(b3, np.zeros(1)) + assert math.allclose(c3, 0.9975072676192522) + + def test_displaced_squeezed_vacuum_state_Abc(self): + A1, b1, c1 = triples.displaced_squeezed_vacuum_state_Abc(0.1, 0.2, 0.3, 0.4) + assert math.allclose(A1, [[-0.26831668 - 0.11344247j]]) + assert math.allclose(b1, [0.14952016 + 0.15768091j]) + assert math.allclose(c1, 0.95557745 + 0.00675411j) + + A2, b2, c2 = triples.displaced_squeezed_vacuum_state_Abc(0.1, 0.2, 0.3, [0.4, 0.5]) + assert math.allclose(A2, [[-0.26831668 - 0.11344247j, 0], [0, -0.25565087 - 0.13966271j]]) + assert math.allclose(b2, [0.14952016 + 0.15768091j, 0.15349763 + 0.1628361j]) + assert math.allclose(c2, 0.912428762764038 + 0.013026652993991094j) + + A3, b3, c3 = triples.displaced_squeezed_vacuum_state_Abc([0.1, 0.2]) + A3_correct, b3_correct, c3_correct = triples.coherent_state_Abc([0.1, 0.2]) + assert math.allclose(A3, A3_correct) + assert math.allclose(b3, b3_correct) + assert math.allclose(c3, c3_correct) + + def test_thermal_state_Abc(self): + A1, b1, c1 = triples.thermal_state_Abc(0.1) + assert math.allclose(A1, [[0, 0.09090909], [0.09090909, 0]]) + assert math.allclose(b1, np.zeros(2)) + assert math.allclose(c1, 1 / (0.1 + 1)) + + A2, b2, c2 = triples.thermal_state_Abc([0.1, 0.2]) + assert math.allclose( + A2, + [ + [0, 0.09090909, 0, 0], + [0.09090909, 0, 0, 0], + [0, 0, 0, 0.16666667], + [0, 0, 0.16666667, 0], + ], + ) + assert math.allclose(b2, np.zeros(4)) + assert math.allclose(c2, 1 / (0.1 + 1) / (0.2 + 1)) + + def test_rotation_gate_Abc(self): + A1, b1, c1 = triples.rotation_gate_Abc(0.1) + assert math.allclose(A1, [[0, 0.99500417 + 0.09983342j], [0.99500417 + 0.09983342j, 0]]) + assert math.allclose(b1, np.zeros(2)) + assert math.allclose(c1, 1.0) + + A2, b2, c2 = triples.rotation_gate_Abc([0.1, 0.2]) + g1 = 0.99500417 + 0.09983342j + g2 = 0.98006658 + 0.19866933j + assert math.allclose(A2, [[0, 0, g1, 0], [0, 0, 0, g2], [g1, 0, 0, 0], [0, g2, 0, 0]]) + assert math.allclose(b2, np.zeros(4)) + assert math.allclose(c2, 1.0) + + def test_displacement_gate_Abc(self): + A1, b1, c1 = triples.displacement_gate_Abc(0.1, 0.1) + assert math.allclose(A1, [[0, 1], [1, 0]]) + assert math.allclose(b1, [0.1 + 0.1j, -0.1 + 0.1j]) + assert math.allclose(c1, 0.990049833749168) + + A2, b2, c2 = triples.displacement_gate_Abc([0.1, 0.2], 0.1) + assert math.allclose(A2, [[0, 0, 1, 0], [0, 0, 0, 1], [1, 0, 0, 0], [0, 1, 0, 0]]) + assert math.allclose(b2, [0.1 + 0.1j, 0.2 + 0.1j, -0.1 + 0.1j, -0.2 + 0.1j]) + assert math.allclose(c2, 0.9656054162575665) + + A3, b3, c3 = triples.displacement_gate_Abc(x=[0.1, 0.2]) + assert math.allclose(A3, [[0, 0, 1, 0], [0, 0, 0, 1], [1, 0, 0, 0], [0, 1, 0, 0]]) + assert math.allclose(b3, [0.1, 0.2, -0.1, -0.2]) + assert math.allclose(c3, 0.9753099120283327) + + def test_squeezing_gate_Abc(self): + A1, b1, c1 = triples.squeezing_gate_Abc(0.1, 0.2) + assert math.allclose( + A1, + [[-0.09768127 - 1.98009738e-02j, 0.99502075], [0.99502075, 0.09768127 - 0.01980097j]], + ) + assert math.allclose(b1, np.zeros(2)) + assert math.allclose(c1, 0.9975072676192522) + + A2, b2, c2 = triples.squeezing_gate_Abc([0.1, 0.3], 0.2) + assert math.allclose( + A2, + [ + [-0.09768127 - 1.98009738e-02j, 0, 0.99502075, 0], + [0, -0.28550576 - 5.78748818e-02j, 0, 0.95662791], + [0.99502075, 0, 0.09768127 - 1.98009738e-02j, 0], + [0, 0.95662791, 0, 0.28550576 - 5.78748818e-02j], + ], + ) + assert math.allclose(b2, np.zeros(4)) + assert math.allclose(c2, 0.9756354961606032) + + A3, b3, c3 = triples.squeezing_gate_Abc(0.1) + assert math.allclose( + A3, [[-0.09966799 + 0.0j, 0.99502075 + 0.0j], [0.99502075 + 0.0j, 0.09966799 + 0.0j]] + ) + assert math.allclose(b3, np.zeros(2)) + assert math.allclose(c3, 0.9975072676192522) + + def test_beamsplitter_gate_Abc(self): + A1, b1, c1 = triples.beamsplitter_gate_Abc(0.1, 0.2) + A_exp = [ + [0, 0, 0.99500417, -0.0978434 + 0.01983384j], + [0.0, 0, 0.0978434 + 0.01983384j, 0.99500417], + [0.99500417, 0.0978434 + 0.01983384j, 0, 0], + [-0.0978434 + 0.01983384j, 0.99500417, 0, 0], + ] + assert math.allclose(A1, A_exp) + assert math.allclose(b1, np.zeros((4))) + assert math.allclose(c1, 1) + + A2, b2, c2 = triples.beamsplitter_gate_Abc(0.1, [0.2, 0.2]) + O_4 = np.zeros((4, 4)) + V = np.array( + [ + [0.99500417, 0, -0.0978434 + 0.01983384j, 0], + [0, 0.99500417, 0, -0.0978434 + 0.01983384j], + [0.0978434 + 0.01983384j, 0, 0.99500417, 0], + [0, 0.0978434 + 0.01983384j, 0, 0.99500417], + ] + ) + A_exp = np.block([[O_4, V], [V.T, O_4]]) + assert math.allclose(A2, A_exp) + assert math.allclose(b2, np.zeros((8))) + assert math.allclose(c2, 1) + + A3, b3, c3 = triples.beamsplitter_gate_Abc(0.1) + A_exp = [ + [0, 0, 9.95004165e-01, -9.98334166e-02], + [0.0, 0, 9.98334166e-02, 9.95004165e-01], + [9.95004165e-01, 9.98334166e-02, 0, 0], + [-9.98334166e-02, 9.95004165e-01, 0, 0], + ] + assert math.allclose(A3, A_exp) + assert math.allclose(b3, np.zeros((4))) + assert math.allclose(c3, 1) + + def test_attenuator_Abc(self): + A1, b1, c1 = triples.attenuator_Abc(0.1) + e = 0.31622777 + assert math.allclose(A1, [[0, e, 0, 0], [e, 0, 0, 0.9], [0, 0, 0, e], [0, 0.9, e, 0]]) + assert math.allclose(b1, np.zeros((4))) + assert math.allclose(c1, 1.0) + + A2, b2, c2 = triples.attenuator_Abc([0.1, 1]) + e = 0.31622777 + assert math.allclose( + A2, + [ + [0, e, 0, 0, 0, 0, 0, 0], + [e, 0, 0, 0.9, 0, 0, 0, 0], + [0, 0, 0, e, 0, 0, 0, 0], + [0, 0.9, e, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 1, 0, 0], + [0, 0, 0, 0, 1, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 1], + [0, 0, 0, 0, 0, 0, 1, 0], + ], + ) + assert math.allclose(b2, np.zeros(8)) + assert math.allclose(c2, 1.0) + + def test_attenuator_Abc_error(self): + with pytest.raises(ValueError, match="in the interval"): + triples.attenuator_Abc(2) + + with pytest.raises(ValueError, match="in the interval"): + triples.attenuator_Abc(-2) + + def test_amplifier_Abc(self): + A1, b1, c1 = triples.amplifier_Abc(2) + assert math.allclose( + A1, + [ + [0, 0.70710678, 0.5, 0], + [0.70710678, 0, 0, 0], + [0.5, 0, 0, 0.70710678], + [0.0, 0, 0.70710678, 0], + ], + ) + assert math.allclose(b1, np.zeros(4)) + assert math.allclose(c1, 0.5) + + A2, b2, c2 = triples.amplifier_Abc([2, 1]) + assert math.allclose( + A2, + [ + [0, 0.70710678, 0.5, 0, 0, 0, 0, 0], + [0.70710678, 0, 0, 0, 0, 0, 0, 0], + [0.5, 0, 0, 0.70710678, 0, 0, 0, 0], + [0.0, 0, 0.70710678, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 1, 0, 0], + [0, 0, 0, 0, 1, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 1], + [0, 0, 0, 0, 0, 0, 1, 0], + ], + ) + assert math.allclose(b2, np.zeros(8)) + assert math.allclose(c2, 0.5) + + def test_amplifier_Abc_error(self): + with pytest.raises(ValueError, match="smaller than"): + triples.amplifier_Abc(0.1) + + @pytest.mark.parametrize("n_modes", [1, 2, 3]) + def test_fock_damping_Abc(self, n_modes): + A1, b1, c1 = triples.fock_damping_Abc(n_modes) + assert math.allclose(A1, np.kron(math.astensor([[0, 1], [1, 0]]), math.eye(2 * n_modes))) + assert math.allclose(b1, np.zeros((4 * n_modes))) + assert math.allclose(c1, 1)