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'{label} | '
+ html += "
"
+
+ # Initialize rows with row labels
+ rows_html = [
+ f'{label} | '
+ 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'{str(next(idxs))} | '
+ )
+ 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 += "
"
+ 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)