diff --git a/.dir-locals.el b/.dir-locals.el index f5fce12..54101ba 100644 --- a/.dir-locals.el +++ b/.dir-locals.el @@ -1,22 +1,22 @@ ((python-mode (eval . (setq flycheck-python-flake8-executable - (expand-file-name "venv/bin/python" (locate-dominating-file - default-directory - ".dir-locals.el")))) + (expand-file-name ".venv/bin/python" (locate-dominating-file + default-directory + ".dir-locals.el")))) (eval . (setq flycheck-python-pylint-executable - (expand-file-name "venv/bin/python" (locate-dominating-file - default-directory - ".dir-locals.el")))) + (expand-file-name ".venv/bin/python" (locate-dominating-file + default-directory + ".dir-locals.el")))) (eval . (setq flycheck-python-mypy-executable - (expand-file-name "venv/bin/mypy" (locate-dominating-file - default-directory - ".dir-locals.el")))) + (expand-file-name ".venv/bin/mypy" (locate-dominating-file + default-directory + ".dir-locals.el")))) (eval . (setq flycheck-python-pycompile-executable - (expand-file-name "venv/bin/python" (locate-dominating-file - default-directory - ".dir-locals.el"))))) + (expand-file-name ".venv/bin/python" (locate-dominating-file + default-directory + ".dir-locals.el"))))) (rst-mode (eval . (setq flycheck-rst-sphinx-executable - (expand-file-name "venv/bin/sphinx-build" (locate-dominating-file - default-directory - ".dir-locals.el")))))) + (expand-file-name ".venv/bin/sphinx-build" (locate-dominating-file + default-directory + ".dir-locals.el")))))) diff --git a/.zenodo.json b/.zenodo.json index abdcf7d..34052f3 100644 --- a/.zenodo.json +++ b/.zenodo.json @@ -50,9 +50,9 @@ "related_identifiers": [ { - "identifier": "arXiv:2308.12358", + "identifier": "https://doi.org/10.21468/SciPostPhysLectNotes.86", "relation": "isDocumentedBy", - "resource_type": "publication-preprint" + "resource_type": "publication-article" }, { "identifier": "https://varipeps.readthedocs.io/en/stable/", @@ -61,7 +61,15 @@ } ], - "keywords": ["peps", "tensor-networks", "variational-optimization"], + "keywords": [ + "physics", + "automatic-differentiation", + "peps", + "tensor-networks", + "variational-optimization", + "quantum-many-body", + "quantum-many-body-physics" + ], "communities": [ {"identifier": "crc183"} diff --git a/CITATION.cff b/CITATION.cff index 5a952ed..dace5c3 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -26,8 +26,8 @@ authors: family-names: Finn identifiers: - type: doi - value: 10.48550/arXiv.2308.12358 - description: arXiv preprint of the description of the method + value: 10.21468/SciPostPhysLectNotes.86 + description: Journal article with the description of the method - type: doi value: 10.5281/zenodo.10852390 description: Zenodo DOI for current version of the code @@ -37,7 +37,11 @@ abstract: >- A versatile tensor network library for variational ground state simulations in two spatial dimensions keywords: + - physics + - automatic-differentiation - peps - tensor-networks - variational-optimization + - quantum-many-body + - quantum-many-body-physics license: GPL-3.0-or-later diff --git a/README.md b/README.md index 13b558c..3fe0553 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,7 @@ [![DOI](https://zenodo.org/badge/773767511.svg)](https://zenodo.org/doi/10.5281/zenodo.10852390) [![Documentation Status](https://readthedocs.org/projects/varipeps/badge/?version=latest)](https://varipeps.readthedocs.io/en/stable/?badge=latest) +[![PyPI - Version](https://img.shields.io/pypi/v/varipeps)](https://pypi.org/project/variPEPS/) variPEPS is the Python variant of the tensor network library developed for variational ground state simulations in two spatial dimensions applying gradient @@ -17,19 +18,6 @@ The current version of the variPEPS Python package is available on [PyPI](https: $ python3 -m pip install variPEPS ``` -### Installation using poetry - -The dependencies in this project are managed by poetry and the tool can also be used to install the package including a fixed set of dependencies with a specific version. For more details how poetry is operating, please see the [upstream documentation](http://python-poetry.org/docs/). - -To install dependencies you can just run in the main folder of the variPEPS project: -```bash -$ poetry install -``` -or if you do not need the development packages: -```bash -$ poetry install --no-dev -``` - ## Usage For detailed information how to use the package we want to point out to the [documentation of the project](https://varipeps.readthedocs.io/en/stable). @@ -37,18 +25,20 @@ For detailed information how to use the package we want to point out to the [doc ## Citation We are happy if you want to use the framework for your research. For the citation of our work we ask to use the following references (the publication with the method description, the Zenodo reference for this Git repository and the repository itself): -* J. Naumann, E. L. Weerda, M. Rizzi, J. Eisert, and P. Schmoll, variPEPS -- a versatile tensor network library for variational ground state simulations in two spatial dimensions (2023), [arXiv:2308.12358](https://arxiv.org/abs/2308.12358). +* J. Naumann, E. L. Weerda, M. Rizzi, J. Eisert, and P. Schmoll, An introduction to infinite projected entangled-pair state methods for variational ground state simulations using automatic differentiation, SciPost Phys. Lect. Notes 86 (2024), doi:[10.21468/SciPostPhysLectNotes.86](https://doi.org/10.21468/SciPostPhysLectNotes.86). * J. Naumann, P. Schmoll, F. Wilde, and F. Krein, [variPEPS (Python version)](https://zenodo.org/doi/10.5281/zenodo.10852390), Zenodo. The BibTeX code for these references are: ```bibtex -@misc{naumann23_varipeps, - title = {variPEPS -- a versatile tensor network library for variational ground state simulations in two spatial dimensions}, - author = {Jan Naumann and Erik Lennart Weerda and Matteo Rizzi and Jens Eisert and Philipp Schmoll}, - year = {2023}, - eprint = {2308.12358}, - archivePrefix = {arXiv}, - primaryClass = {cond-mat.str-el} +@article{10.21468/SciPostPhysLectNotes.86, + title={{An introduction to infinite projected entangled-pair state methods for variational ground state simulations using automatic differentiation}}, + author={Jan Naumann and Erik Lennart Weerda and Matteo Rizzi and Jens Eisert and Philipp Schmoll}, + journal={SciPost Phys. Lect. Notes}, + pages={86}, + year={2024}, + publisher={SciPost}, + doi={10.21468/SciPostPhysLectNotes.86}, + url={https://scipost.org/10.21468/SciPostPhysLectNotes.86}, } @software{naumann24_varipeps_python, diff --git a/docs/source/api/expectation/four_sites.rst b/docs/source/api/expectation/four_sites.rst new file mode 100644 index 0000000..0e7c861 --- /dev/null +++ b/docs/source/api/expectation/four_sites.rst @@ -0,0 +1,12 @@ +.. _varipeps_expectation_four_sites: + +.. currentmodule:: varipeps.expectation.four_sites + +Calculation of four sites expectation values +============================================ + +.. automodule:: varipeps.expectation.four_sites + :members: + :undoc-members: + :show-inheritance: + :special-members: __call__ diff --git a/docs/source/api/expectation/index.rst b/docs/source/api/expectation/index.rst index 93b30c2..375ae65 100644 --- a/docs/source/api/expectation/index.rst +++ b/docs/source/api/expectation/index.rst @@ -14,6 +14,7 @@ Calculation of expectation values (:mod:`varipeps.expectation`) one_site two_sites three_sites + four_sites spiral_helpers .. automodule:: varipeps.expectation diff --git a/docs/source/examples.rst b/docs/source/examples.rst new file mode 100644 index 0000000..ef6ed08 --- /dev/null +++ b/docs/source/examples.rst @@ -0,0 +1,243 @@ +.. _examples: + + +Examples +======== + +We provide several examples in the `examples/ folder of the variPEPS Git repository `_ that demonstrate how to use the code for variational energy optimization in typical 2D many-body problems. + +.. In this section we want to elaborately walk through the example for the Heisenberg AFM on the 2d square lattice to explain a typical usage of the library. + +Heisenberg antiferromagnet on the square lattice +------------------------------------------------ + +.. figure:: /images/square_lattice.* + :align: center + :width: 60% + :alt: Two dimensional square lattice with red links indicating horizontal and + blue links indicating vertical interactions. + + Two dimensional square lattice + +The Hamiltonian for the Heisenberg antiferromagnet with constant exchange +interaction strength :math:`J>0` is defined as: + +.. math:: + + H = J \sum_{\langle i j \rangle} \vec{S}_i \vec{S}_j , + +where :math:`\langle i j \rangle` denotes the sum over all nearest neighbors in +the lattice. + +Our aim is now to find the ground state of the model using the variational iPEPS +code of the variPEPS library. + +Loading of relevant Python modules +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. code-block:: python + + import varipeps + import jax + import jax.numpy as jnp + +First of all we have to load the relevant Python modules for our simulation. The +:obj:`varipeps` module includes the full library to perform the variational +optimization. Internally it is based on the :obj:`jax` framework and its +:obj:`numpy`-like interface to execute the calculations. Since we will need +arrays to define for example the Hamiltonian, we load this numpy +interface as well. + +variPEPS config settings +^^^^^^^^^^^^^^^^^^^^^^^^ + +.. code-block:: python + + # Config Setting + + ## Set maximal steps for the CTMRG routine + varipeps.config.ctmrg_max_steps = 100 + ## Set convergence threshold for the CTMRG routine + varipeps.config.ctmrg_convergence_eps = 1e-7 + ## Select the method used to calculate the (full) projectors in the CTMRG routine + varipeps.config.ctmrg_full_projector_method = ( + varipeps.config.Projector_Method.FISHMAN + ) + ## Enable dynamic increase of CTMRG environment bond dimension + varipeps.config.ctmrg_heuristic_increase_chi = True + ## Increase CTMRG enviroment bond dimension if truncation error exceeds this value + varipeps.config.ctmrg_heuristic_increase_chi_threshold = 1e-4 + + ## Set maximal steps for the fix point routine in the gradient calculation + varipeps.config.ad_custom_max_steps = 100 + ## Set convergence threshold for the fix point routine in the gradient calculation + varipeps.config.ad_custom_convergence_eps = 5e-8 + + ## Enable/Disable printing of the convergence of the single CTMRG/gradient fix point steps. + ## Useful to enable this during debugging, should be disabled for batch runs + varipeps.config.ctmrg_print_steps = True + varipeps.config.ad_custom_print_steps = False + + ## Select the method used to calculate the descent direction during optimization + varipeps.config.optimizer_method = varipeps.config.Optimizing_Methods.CG + ## Set maximal number of steps for the optimization routine + varipeps.config.optimizer_max_steps = 2000 + +The :obj:`varipeps` library allows to configure a large number of numerical +parameters to fine-tune the simulation. In this example we include several +options commonly used in an optimization run. For a detailed +description of the configurable options we refer to the API description of the +config class: :obj:`varipeps.config.VariPEPS_Config`. + +Model parameters +^^^^^^^^^^^^^^^^ + +.. code-block:: python + + # Set constants for the simulation + modelName = "HeisenbergModel" + # Interaction strength + J = 1 + # iPEPS bond dimension + chiB = 2 + # Physical dimension + p = 2 + # Maximal enviroment bond dimension + maxChi = 36 + # Start value for enviroment bond dimension + startChi = chiB**2 if chiB**2 < maxChi else maxChi + +In this block we define imporant parameters for the model we want to simulate, such as as the interaction strength, the physical dimension of our tensor network and the iPEPS bond dimension. In the last two lines the initial and the maximal enviroment bond dimension is defined. A feature of the variPEPS library is that it not only supports simulation at a fixed enviroment bond dimension, but also a heurisitic increase/decrease of the dimension up to a maximal value. The dynamic change is controlled by the truncation error in the CTMRG projector calculation (increase if the truncation errror becomes too large, decrease if it becomes insignificant). For example, in the config block above the parameter ``ctmrg_heuristic_increase_chi_threshold`` is set to the threshold at which to increase the refinement parameter. The maximal bond dimension ``maxChi`` ensures that the parameter does now grow unbounded, to the point where the memory and computational resources are exhausted. + +Constructing the Hamiltonian +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. code-block:: python + + # define spin-1/2 matrices + Id = jnp.eye(2) + Sx = jnp.array([[0, 1], [1, 0]]) / 2 + Sy = jnp.array([[0, -1j], [1j, 0]]) / 2 + Sz = jnp.array([[1, 0], [0, -1]]) / 2 + + # construct Hamiltonian terms + hamiltonianGates = J * (jnp.kron(Sx, Sx) + jnp.kron(Sy, Sy) + jnp.kron(Sz, Sz)) + + # create function to compute expectation values for the square Heisenberg AFM + exp_func = varipeps.expectation.Two_Sites_Expectation_Value( + horizontal_gates=(hamiltonianGates,), + vertical_gates=(hamiltonianGates,), + ) + +Here the Hamiltonian is constructed for our model. The Heisenberg AFM on the +square lattice can be described by the sum of the spin-spin interactions on +the horizontal and vertical bonds. Since we assume a constant +interaction strength for all bonds in our example, the expectation value can be calculated by +the same two-site interaction gate applied in all nearest neighbor +directions. The expectation function ``exp_func`` is later used in the +optimization to calculate the energy expectation value, which in turn is used as cost function to obtain +the ground state. + +Initial unit cell construction +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. code-block:: python + + # Unit cell structure + structure = [[0, 1], [1, 0]] + +Here we define the unit cell structure which is used to simulate our model. In +this example we assume a +:math:`\scriptsize{\begin{matrix}A&B\\B&A\end{matrix}}`-structure, i.e. a two-site antiferromagnetic state. + +.. code-block:: python + + # Create random initialization for the iPEPS unit cell + unitcell = varipeps.peps.PEPS_Unit_Cell.random( + structure, # Unit cell structure + p, # Physical dimension + chiB, # iPEPS bond dimension + startChi, # Start value for enviroment bond dimension + float, # Data type for the tensors: `float` (real) or `complex` tensors + max_chi=maxChi, # Maximal enviroment bond dimension + ) + +Using the unit cell structure and the model parameter defined above, we can +generate an initial unit cell. Here we initialize the iPEPS tensors with random +numbers. Other ways to initialize the tensors are provided, for example loading results +from a simple update calculation. + +Run the optimization +^^^^^^^^^^^^^^^^^^^^ + +.. code-block:: python + + # Run optimization + result = varipeps.optimization.optimize_peps_network( + unitcell, + exp_func, + autosave_filename=f"data/autosave_square_chiB_{chiB:d}.hdf5", + ) + +This function call executes the main function of the library, the variational energy +optimization to obtain a good ground state candidate. The function offers several options +to customize the optimization for different iPEPS ansätze, such as the spiral iPEPS +approach. In our example, we only need to provide the initial unit cell, the function +for calculating the energy expectation value, and a file path for autosaving the +optimization process, enabling the restoration of interrupted simulations. + +Evaluate the results +^^^^^^^^^^^^^^^^^^^^ + +In this section we show some exemplary evaluation of the result of the optimization. + +.. code-block:: python + + # Calculate magnetic expectation values + Mag_Gates = [Sx, Sy, Sz] + + + def calc_magnetic(unitcell): + mag_result = [] + for ti, t in enumerate(unitcell.get_unique_tensors()): + r = varipeps.expectation.one_site.calc_one_site_multi_gates( + t.tensor, t, Mag_Gates + ) + mag_result += r + return mag_result + + + magnetic_exp_values = calc_magnetic(result.unitcell) + +We assume for our example that we are interested in the single-site spin +expectation values. These could be used to analyse the :math:`z`-magnetization +or the staggered magnetization of our model at/near the ground state. + +.. code-block:: python + + # Define some auxiliary data which should be stored along the final iPEPS unit cell + auxiliary_data = { + "best_energy": result.fun, + "best_run": result.best_run, + "magnetic_exp_values": magnetic_exp_values, + } + for k in sorted(result.max_trunc_error_list.keys()): + auxiliary_data[f"max_trunc_error_list_{k:d}"] = result.max_trunc_error_list[k] + auxiliary_data[f"step_energies_{k:d}"] = result.step_energies[k] + auxiliary_data[f"step_chi_{k:d}"] = result.step_chi[k] + auxiliary_data[f"step_conv_{k:d}"] = result.step_conv[k] + auxiliary_data[f"step_runtime_{k:d}"] = result.step_runtime[k] + + # save full iPEPS state + result.unitcell.save_to_file( + f"data/heisenberg_square_J_{J:d}_chiB_{chiB:d}_chiMax_{chiM:d}.hdf5", + auxiliary_data=auxiliary_data, + ) + +Finally, we want to save the unit cell with the optimized tensors to a file for +further analysis. The library allows to store the data directly into a +HDF5 file along with user-supplied auxiliary data. Here, for example, we not only +want to store the plain tensors but also the calculated energy, meta information +from the optimization run (e.g. energy per step or the runtime per step) and the +calculated magnetic expectation values. At a later examination of the results, +these data can be easily loaded along with the tensors of the tensor network. diff --git a/docs/source/general.rst b/docs/source/general.rst new file mode 100644 index 0000000..e64f2f6 --- /dev/null +++ b/docs/source/general.rst @@ -0,0 +1,59 @@ +.. _general: + + +Introduction +============ + +variPEPS is a Python tensor network library developed for variational ground +state simulations in two spatial dimensions applying gradient optimization using +automatic differentation. + +For a detailed report on the method, please see `our open-access publication on +SciPost (doi:10.21468/SciPostPhysLectNotes.86) +`_. + +Installation using pip +====================== + +The current version of the variPEPS Python package is available on `PyPI +`_. It can be easily installed using the +Python package manager pip: + +.. code-block:: console + + $ python3 -m pip install variPEPS + +Usage +===== + +The :obj:`varipeps` module is organized in several submodules corresponding to +the different features. For a variational optimization the most important parts +are (a full overview can be found in the :ref:`_api`): + +* :obj:`varipeps.peps`: To define iPEPS unit cell and the tensors on each site, + the library provides in this submodule the abstractions to define such a unit + cell. +* :obj:`varipeps.expectation`: In this submodule the helper functions to define + and calculate common expecation functions on the iPEPS unit + cell. Particularly, the function can be used to define the Hamiltonian terms + of the model of interest. +* :obj:`varipeps.mapping`: If not only interactions on the square lattice are of + interest but also models on other 2d lattices, in this submodule one can find + mappings of other lattices. Also the files there can be a good starting point + to implement even more lattices. +* :obj:`varipeps.optimization`: The submodule providing the optimization + algorithm and interface of the library. In almost all cases, one will interact + with this part by the main function + :obj:`varipeps.optimization.optimize_peps_network`. + +All these different modules can be seen in action in the :ref:`_examples` +section of the documentation where exemplary code is discussed in detail. + +Citation +======== + +We are happy if you want to use the framework for your research. To cite our +work we provide a list of our preferred references on the `GitHub page of the +project +`_. Please +check there for a current list. diff --git a/docs/source/images/square_lattice.pdf b/docs/source/images/square_lattice.pdf new file mode 100644 index 0000000..52f2b82 Binary files /dev/null and b/docs/source/images/square_lattice.pdf differ diff --git a/docs/source/images/square_lattice.svg b/docs/source/images/square_lattice.svg new file mode 100644 index 0000000..b29cd27 --- /dev/null +++ b/docs/source/images/square_lattice.svg @@ -0,0 +1,548 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/source/images/square_lattice.tex b/docs/source/images/square_lattice.tex new file mode 100644 index 0000000..9cdab86 --- /dev/null +++ b/docs/source/images/square_lattice.tex @@ -0,0 +1,36 @@ +\documentclass[tikz]{standalone} + +\usepackage{amsfonts} +\usepackage{amsmath} +\usepackage{braket} + +\usepackage{tikz} +\usetikzlibrary{calc, decorations, positioning} + +\definecolor{googleR}{HTML}{DB4437} +\definecolor{googleG}{HTML}{0F9D58} +\definecolor{googleB}{HTML}{4285F4} + +% main document +\begin{document} + \begin{tikzpicture}[] + \foreach \y in {-0.75, -0.25, +0.25} { + \foreach \x in {-1.5, -0.5, +0.5, +1.5} { + \begin{scope}[shift = {(2*\x + 2*\y, 2*\y)}] + \draw[thick, googleR] (-1.00, 0) to (-0.00, 0); + \draw[thick, googleR] (+0.00, 0) to (+1.00, 0); + \draw[thick, googleB] (-0.50, -0.50) to (0, 0); + \draw[thick, googleB] (0, 0) to (+0.50, +0.50); + \draw[thick] (0, 0) to (0, -0.50); + \draw[thick, fill = googleG] (0,0) circle (0.15); + % \draw[thick, googleG] (-0.15, 0) to (+0.15, 0); + \end{scope} + } + } + \end{tikzpicture} +\end{document} + +%%% Local Variables: +%%% mode: latex +%%% TeX-master: t +%%% End: diff --git a/docs/source/index.rst b/docs/source/index.rst index 98dcf23..fce287a 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -3,9 +3,11 @@ Variational PEPS .. toctree:: :maxdepth: 2 - :caption: Design + :caption: VariPEPS + general design/features + examples .. toctree:: :maxdepth: 2 diff --git a/examples/heisenberg_afm_square.py b/examples/heisenberg_afm_square.py new file mode 100644 index 0000000..ad79448 --- /dev/null +++ b/examples/heisenberg_afm_square.py @@ -0,0 +1,110 @@ +import varipeps +import jax +import jax.numpy as jnp + +# Config Setting +## Set maximal steps for the CTMRG routine +varipeps.config.ad_custom_max_steps = 100 +## Set maximal steps for the fix point routine in the gradient calculation +varipeps.config.ctmrg_max_steps = 100 +## Set convergence threshold for the CTMRG routine +varipeps.config.ctmrg_convergence_eps = 1e-7 +## Set convergence threshold for the fix point routine in the gradient calculation +varipeps.config.ad_custom_convergence_eps = 5e-8 +## Enable/Disable printing of the convergence of the single CTMRG/gradient fix point steps. +## Useful to enable this during debugging, should be disabled for batch runs +varipeps.config.ctmrg_print_steps = True +varipeps.config.ad_custom_print_steps = False +## Select the method used to calculate the descent direction during optimization +varipeps.config.optimizer_method = varipeps.config.Optimizing_Methods.CG +## Select the method used to calculate the (full) projectors in the CTMRG routine +varipeps.config.ctmrg_full_projector_method = ( + varipeps.config.Projector_Method.FISHMAN +) +## Set maximal steps for the optimization routine +varipeps.config.optimizer_max_steps = 2000 +## Increase enviroment bond dimension if truncation error is below this value +varipeps.config.ctmrg_heuristic_increase_chi_threshold = 1e-4 + +# Set constants for the simulation +modelName = "HeisenbergModel" +# Interaction strength +J = 1 +# iPEPS bond dimension +chiB = 2 +# Physical dimension +p = 2 +# Maximal enviroment bond dimension +maxChi = 36 +# Start value for enviroment bond dimension +startChi = chiB**2 if chiB**2 < maxChi else maxChi + +# define spin-1/2 matrices +Id = jnp.eye(2) +Sx = jnp.array([[0, 1], [1, 0]]) / 2 +Sy = jnp.array([[0, -1j], [1j, 0]]) / 2 +Sz = jnp.array([[1, 0], [0, -1]]) / 2 + +# construct Hamiltonian terms +hamiltonianGates = J * (jnp.kron(Sx, Sx) + jnp.kron(Sy, Sy) + jnp.kron(Sz, Sz)) + +# create function to compute expectation values for the square Heisenberg AFM +exp_func = varipeps.expectation.Two_Sites_Expectation_Value( + horizontal_gates=(hamiltonianGates,), + vertical_gates=(hamiltonianGates,), +) + +# Unit cell structure +structure = [[0, 1], [1, 0]] + +# Create random initialization for the iPEPS unit cell +unitcell = varipeps.peps.PEPS_Unit_Cell.random( + structure, # Unit cell structure + p, # Physical dimension + chiB, # iPEPS bond dimension + startChi, # Start value for enviroment bond dimension + float, # Data type for the tensors: float (real) or complex tensors + max_chi=maxChi, # Maximal enviroment bond dimension +) + +# Run optimization +result = varipeps.optimization.optimize_peps_network( + unitcell, + exp_func, + autosave_filename=f"data/autosave_square_chiB_{chiB:d}.hdf5", +) + +# Calculate magnetic expectation values +Mag_Gates = [Sx, Sy, Sz] + + +def calc_magnetic(unitcell): + mag_result = [] + for ti, t in enumerate(unitcell.get_unique_tensors()): + r = varipeps.expectation.one_site.calc_one_site_multi_gates( + t.tensor, t, Mag_Gates + ) + mag_result += r + return mag_result + + +magnetic_exp_values = calc_magnetic(result.unitcell) + +# Define some auxiliary data which should be stored along the final iPEPS unit cell +auxiliary_data = { + "best_energy": result.fun, + "best_run": result.best_run, + "magnetic_exp_values": magnetic_exp_values, +} +for k in sorted(result.max_trunc_error_list.keys()): + auxiliary_data[f"max_trunc_error_list_{k:d}"] = result.max_trunc_error_list[k] + auxiliary_data[f"step_energies_{k:d}"] = result.step_energies[k] + auxiliary_data[f"step_chi_{k:d}"] = result.step_chi[k] + auxiliary_data[f"step_conv_{k:d}"] = result.step_conv[k] + auxiliary_data[f"step_runtime_{k:d}"] = result.step_runtime[k] + +# save full iPEPS state +result.unitcell.save_to_file( + f"data/heisenberg_square_J_{J:d}_chiB_{chiB:d}_chiMax_{chiM:d}.hdf5", + auxiliary_data=auxiliary_data, +) diff --git a/poetry.lock b/poetry.lock deleted file mode 100644 index 1acac5e..0000000 --- a/poetry.lock +++ /dev/null @@ -1,2825 +0,0 @@ -# This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand. - -[[package]] -name = "anyio" -version = "4.3.0" -description = "High level compatibility layer for multiple asynchronous event loop implementations" -optional = false -python-versions = ">=3.8" -files = [ - {file = "anyio-4.3.0-py3-none-any.whl", hash = "sha256:048e05d0f6caeed70d731f3db756d35dcc1f35747c8c403364a8332c630441b8"}, - {file = "anyio-4.3.0.tar.gz", hash = "sha256:f75253795a87df48568485fd18cdd2a3fa5c4f7c5be8e5e36637733fce06fed6"}, -] - -[package.dependencies] -exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""} -idna = ">=2.8" -sniffio = ">=1.1" -typing-extensions = {version = ">=4.1", markers = "python_version < \"3.11\""} - -[package.extras] -doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] -test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] -trio = ["trio (>=0.23)"] - -[[package]] -name = "appnope" -version = "0.1.4" -description = "Disable App Nap on macOS >= 10.9" -optional = false -python-versions = ">=3.6" -files = [ - {file = "appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c"}, - {file = "appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee"}, -] - -[[package]] -name = "argon2-cffi" -version = "23.1.0" -description = "Argon2 for Python" -optional = false -python-versions = ">=3.7" -files = [ - {file = "argon2_cffi-23.1.0-py3-none-any.whl", hash = "sha256:c670642b78ba29641818ab2e68bd4e6a78ba53b7eff7b4c3815ae16abf91c7ea"}, - {file = "argon2_cffi-23.1.0.tar.gz", hash = "sha256:879c3e79a2729ce768ebb7d36d4609e3a78a4ca2ec3a9f12286ca057e3d0db08"}, -] - -[package.dependencies] -argon2-cffi-bindings = "*" - -[package.extras] -dev = ["argon2-cffi[tests,typing]", "tox (>4)"] -docs = ["furo", "myst-parser", "sphinx", "sphinx-copybutton", "sphinx-notfound-page"] -tests = ["hypothesis", "pytest"] -typing = ["mypy"] - -[[package]] -name = "argon2-cffi-bindings" -version = "21.2.0" -description = "Low-level CFFI bindings for Argon2" -optional = false -python-versions = ">=3.6" -files = [ - {file = "argon2-cffi-bindings-21.2.0.tar.gz", hash = "sha256:bb89ceffa6c791807d1305ceb77dbfacc5aa499891d2c55661c6459651fc39e3"}, - {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ccb949252cb2ab3a08c02024acb77cfb179492d5701c7cbdbfd776124d4d2367"}, - {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9524464572e12979364b7d600abf96181d3541da11e23ddf565a32e70bd4dc0d"}, - {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b746dba803a79238e925d9046a63aa26bf86ab2a2fe74ce6b009a1c3f5c8f2ae"}, - {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58ed19212051f49a523abb1dbe954337dc82d947fb6e5a0da60f7c8471a8476c"}, - {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:bd46088725ef7f58b5a1ef7ca06647ebaf0eb4baff7d1d0d177c6cc8744abd86"}, - {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_i686.whl", hash = "sha256:8cd69c07dd875537a824deec19f978e0f2078fdda07fd5c42ac29668dda5f40f"}, - {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:f1152ac548bd5b8bcecfb0b0371f082037e47128653df2e8ba6e914d384f3c3e"}, - {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-win32.whl", hash = "sha256:603ca0aba86b1349b147cab91ae970c63118a0f30444d4bc80355937c950c082"}, - {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-win_amd64.whl", hash = "sha256:b2ef1c30440dbbcba7a5dc3e319408b59676e2e039e2ae11a8775ecf482b192f"}, - {file = "argon2_cffi_bindings-21.2.0-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e415e3f62c8d124ee16018e491a009937f8cf7ebf5eb430ffc5de21b900dad93"}, - {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3e385d1c39c520c08b53d63300c3ecc28622f076f4c2b0e6d7e796e9f6502194"}, - {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c3e3cc67fdb7d82c4718f19b4e7a87123caf8a93fde7e23cf66ac0337d3cb3f"}, - {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a22ad9800121b71099d0fb0a65323810a15f2e292f2ba450810a7316e128ee5"}, - {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f9f8b450ed0547e3d473fdc8612083fd08dd2120d6ac8f73828df9b7d45bb351"}, - {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:93f9bf70084f97245ba10ee36575f0c3f1e7d7724d67d8e5b08e61787c320ed7"}, - {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3b9ef65804859d335dc6b31582cad2c5166f0c3e7975f324d9ffaa34ee7e6583"}, - {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4966ef5848d820776f5f562a7d45fdd70c2f330c961d0d745b784034bd9f48d"}, - {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20ef543a89dee4db46a1a6e206cd015360e5a75822f76df533845c3cbaf72670"}, - {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ed2937d286e2ad0cc79a7087d3c272832865f779430e0cc2b4f3718d3159b0cb"}, - {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:5e00316dabdaea0b2dd82d141cc66889ced0cdcbfa599e8b471cf22c620c329a"}, -] - -[package.dependencies] -cffi = ">=1.0.1" - -[package.extras] -dev = ["cogapp", "pre-commit", "pytest", "wheel"] -tests = ["pytest"] - -[[package]] -name = "arrow" -version = "1.3.0" -description = "Better dates & times for Python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "arrow-1.3.0-py3-none-any.whl", hash = "sha256:c728b120ebc00eb84e01882a6f5e7927a53960aa990ce7dd2b10f39005a67f80"}, - {file = "arrow-1.3.0.tar.gz", hash = "sha256:d4540617648cb5f895730f1ad8c82a65f2dad0166f57b75f3ca54759c4d67a85"}, -] - -[package.dependencies] -python-dateutil = ">=2.7.0" -types-python-dateutil = ">=2.8.10" - -[package.extras] -doc = ["doc8", "sphinx (>=7.0.0)", "sphinx-autobuild", "sphinx-autodoc-typehints", "sphinx_rtd_theme (>=1.3.0)"] -test = ["dateparser (==1.*)", "pre-commit", "pytest", "pytest-cov", "pytest-mock", "pytz (==2021.1)", "simplejson (==3.*)"] - -[[package]] -name = "astroid" -version = "3.1.0" -description = "An abstract syntax tree for Python with inference support." -optional = false -python-versions = ">=3.8.0" -files = [ - {file = "astroid-3.1.0-py3-none-any.whl", hash = "sha256:951798f922990137ac090c53af473db7ab4e70c770e6d7fae0cec59f74411819"}, - {file = "astroid-3.1.0.tar.gz", hash = "sha256:ac248253bfa4bd924a0de213707e7ebeeb3138abeb48d798784ead1e56d419d4"}, -] - -[package.dependencies] -typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.11\""} - -[[package]] -name = "asttokens" -version = "2.4.1" -description = "Annotate AST trees with source code positions" -optional = false -python-versions = "*" -files = [ - {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] -six = ">=1.12.0" - -[package.extras] -astroid = ["astroid (>=1,<2)", "astroid (>=2,<4)"] -test = ["astroid (>=1,<2)", "astroid (>=2,<4)", "pytest"] - -[[package]] -name = "async-lru" -version = "2.0.4" -description = "Simple LRU cache for asyncio" -optional = false -python-versions = ">=3.8" -files = [ - {file = "async-lru-2.0.4.tar.gz", hash = "sha256:b8a59a5df60805ff63220b2a0c5b5393da5521b113cd5465a44eb037d81a5627"}, - {file = "async_lru-2.0.4-py3-none-any.whl", hash = "sha256:ff02944ce3c288c5be660c42dbcca0742b32c3b279d6dceda655190240b99224"}, -] - -[package.dependencies] -typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.11\""} - -[[package]] -name = "attrs" -version = "23.2.0" -description = "Classes Without Boilerplate" -optional = false -python-versions = ">=3.7" -files = [ - {file = "attrs-23.2.0-py3-none-any.whl", hash = "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1"}, - {file = "attrs-23.2.0.tar.gz", hash = "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30"}, -] - -[package.extras] -cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] -dev = ["attrs[tests]", "pre-commit"] -docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] -tests = ["attrs[tests-no-zope]", "zope-interface"] -tests-mypy = ["mypy (>=1.6)", "pytest-mypy-plugins"] -tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist[psutil]"] - -[[package]] -name = "babel" -version = "2.15.0" -description = "Internationalization utilities" -optional = false -python-versions = ">=3.8" -files = [ - {file = "Babel-2.15.0-py3-none-any.whl", hash = "sha256:08706bdad8d0a3413266ab61bd6c34d0c28d6e1e7badf40a2cebe67644e2e1fb"}, - {file = "babel-2.15.0.tar.gz", hash = "sha256:8daf0e265d05768bc6c7a314cf1321e9a123afc328cc635c18622a2f30a04413"}, -] - -[package.extras] -dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"] - -[[package]] -name = "beautifulsoup4" -version = "4.12.3" -description = "Screen-scraping library" -optional = false -python-versions = ">=3.6.0" -files = [ - {file = "beautifulsoup4-4.12.3-py3-none-any.whl", hash = "sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed"}, - {file = "beautifulsoup4-4.12.3.tar.gz", hash = "sha256:74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051"}, -] - -[package.dependencies] -soupsieve = ">1.2" - -[package.extras] -cchardet = ["cchardet"] -chardet = ["chardet"] -charset-normalizer = ["charset-normalizer"] -html5lib = ["html5lib"] -lxml = ["lxml"] - -[[package]] -name = "black" -version = "24.4.2" -description = "The uncompromising code formatter." -optional = false -python-versions = ">=3.8" -files = [ - {file = "black-24.4.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dd1b5a14e417189db4c7b64a6540f31730713d173f0b63e55fabd52d61d8fdce"}, - {file = "black-24.4.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e537d281831ad0e71007dcdcbe50a71470b978c453fa41ce77186bbe0ed6021"}, - {file = "black-24.4.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eaea3008c281f1038edb473c1aa8ed8143a5535ff18f978a318f10302b254063"}, - {file = "black-24.4.2-cp310-cp310-win_amd64.whl", hash = "sha256:7768a0dbf16a39aa5e9a3ded568bb545c8c2727396d063bbaf847df05b08cd96"}, - {file = "black-24.4.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:257d724c2c9b1660f353b36c802ccece186a30accc7742c176d29c146df6e474"}, - {file = "black-24.4.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bdde6f877a18f24844e381d45e9947a49e97933573ac9d4345399be37621e26c"}, - {file = "black-24.4.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e151054aa00bad1f4e1f04919542885f89f5f7d086b8a59e5000e6c616896ffb"}, - {file = "black-24.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:7e122b1c4fb252fd85df3ca93578732b4749d9be076593076ef4d07a0233c3e1"}, - {file = "black-24.4.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:accf49e151c8ed2c0cdc528691838afd217c50412534e876a19270fea1e28e2d"}, - {file = "black-24.4.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:88c57dc656038f1ab9f92b3eb5335ee9b021412feaa46330d5eba4e51fe49b04"}, - {file = "black-24.4.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be8bef99eb46d5021bf053114442914baeb3649a89dc5f3a555c88737e5e98fc"}, - {file = "black-24.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:415e686e87dbbe6f4cd5ef0fbf764af7b89f9057b97c908742b6008cc554b9c0"}, - {file = "black-24.4.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bf10f7310db693bb62692609b397e8d67257c55f949abde4c67f9cc574492cc7"}, - {file = "black-24.4.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:98e123f1d5cfd42f886624d84464f7756f60ff6eab89ae845210631714f6db94"}, - {file = "black-24.4.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48a85f2cb5e6799a9ef05347b476cce6c182d6c71ee36925a6c194d074336ef8"}, - {file = "black-24.4.2-cp38-cp38-win_amd64.whl", hash = "sha256:b1530ae42e9d6d5b670a34db49a94115a64596bc77710b1d05e9801e62ca0a7c"}, - {file = "black-24.4.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:37aae07b029fa0174d39daf02748b379399b909652a806e5708199bd93899da1"}, - {file = "black-24.4.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:da33a1a5e49c4122ccdfd56cd021ff1ebc4a1ec4e2d01594fef9b6f267a9e741"}, - {file = "black-24.4.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef703f83fc32e131e9bcc0a5094cfe85599e7109f896fe8bc96cc402f3eb4b6e"}, - {file = "black-24.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:b9176b9832e84308818a99a561e90aa479e73c523b3f77afd07913380ae2eab7"}, - {file = "black-24.4.2-py3-none-any.whl", hash = "sha256:d36ed1124bb81b32f8614555b34cc4259c3fbc7eec17870e8ff8ded335b58d8c"}, - {file = "black-24.4.2.tar.gz", hash = "sha256:c872b53057f000085da66a19c55d68f6f8ddcac2642392ad3a355878406fbd4d"}, -] - -[package.dependencies] -click = ">=8.0.0" -mypy-extensions = ">=0.4.3" -packaging = ">=22.0" -pathspec = ">=0.9.0" -platformdirs = ">=2" -tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} -typing-extensions = {version = ">=4.0.1", markers = "python_version < \"3.11\""} - -[package.extras] -colorama = ["colorama (>=0.4.3)"] -d = ["aiohttp (>=3.7.4)", "aiohttp (>=3.7.4,!=3.9.0)"] -jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] -uvloop = ["uvloop (>=0.15.2)"] - -[[package]] -name = "bleach" -version = "6.1.0" -description = "An easy safelist-based HTML-sanitizing tool." -optional = false -python-versions = ">=3.8" -files = [ - {file = "bleach-6.1.0-py3-none-any.whl", hash = "sha256:3225f354cfc436b9789c66c4ee030194bee0568fbf9cbdad3bc8b5c26c5f12b6"}, - {file = "bleach-6.1.0.tar.gz", hash = "sha256:0a31f1837963c41d46bbf1331b8778e1308ea0791db03cc4e7357b97cf42a8fe"}, -] - -[package.dependencies] -six = ">=1.9.0" -webencodings = "*" - -[package.extras] -css = ["tinycss2 (>=1.1.0,<1.3)"] - -[[package]] -name = "certifi" -version = "2024.2.2" -description = "Python package for providing Mozilla's CA Bundle." -optional = false -python-versions = ">=3.6" -files = [ - {file = "certifi-2024.2.2-py3-none-any.whl", hash = "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1"}, - {file = "certifi-2024.2.2.tar.gz", hash = "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f"}, -] - -[[package]] -name = "cffi" -version = "1.16.0" -description = "Foreign Function Interface for Python calling C code." -optional = false -python-versions = ">=3.8" -files = [ - {file = "cffi-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088"}, - {file = "cffi-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614"}, - {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743"}, - {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d"}, - {file = "cffi-1.16.0-cp310-cp310-win32.whl", hash = "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a"}, - {file = "cffi-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1"}, - {file = "cffi-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404"}, - {file = "cffi-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e"}, - {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc"}, - {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb"}, - {file = "cffi-1.16.0-cp311-cp311-win32.whl", hash = "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab"}, - {file = "cffi-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba"}, - {file = "cffi-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956"}, - {file = "cffi-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969"}, - {file = "cffi-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520"}, - {file = "cffi-1.16.0-cp312-cp312-win32.whl", hash = "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b"}, - {file = "cffi-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235"}, - {file = "cffi-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324"}, - {file = "cffi-1.16.0-cp38-cp38-win32.whl", hash = "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a"}, - {file = "cffi-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36"}, - {file = "cffi-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed"}, - {file = "cffi-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098"}, - {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000"}, - {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe"}, - {file = "cffi-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4"}, - {file = "cffi-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8"}, - {file = "cffi-1.16.0.tar.gz", hash = "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0"}, -] - -[package.dependencies] -pycparser = "*" - -[[package]] -name = "charset-normalizer" -version = "3.3.2" -description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -optional = false -python-versions = ">=3.7.0" -files = [ - {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, - {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, -] - -[[package]] -name = "click" -version = "8.1.7" -description = "Composable command line interface toolkit" -optional = false -python-versions = ">=3.7" -files = [ - {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, - {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, -] - -[package.dependencies] -colorama = {version = "*", markers = "platform_system == \"Windows\""} - -[[package]] -name = "colorama" -version = "0.4.6" -description = "Cross-platform colored terminal text." -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" -files = [ - {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, - {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, -] - -[[package]] -name = "comm" -version = "0.2.2" -description = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc." -optional = false -python-versions = ">=3.8" -files = [ - {file = "comm-0.2.2-py3-none-any.whl", hash = "sha256:e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3"}, - {file = "comm-0.2.2.tar.gz", hash = "sha256:3fd7a84065306e07bea1773df6eb8282de51ba82f77c72f9c85716ab11fe980e"}, -] - -[package.dependencies] -traitlets = ">=4" - -[package.extras] -test = ["pytest"] - -[[package]] -name = "debugpy" -version = "1.8.1" -description = "An implementation of the Debug Adapter Protocol for Python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "debugpy-1.8.1-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:3bda0f1e943d386cc7a0e71bfa59f4137909e2ed947fb3946c506e113000f741"}, - {file = "debugpy-1.8.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dda73bf69ea479c8577a0448f8c707691152e6c4de7f0c4dec5a4bc11dee516e"}, - {file = "debugpy-1.8.1-cp310-cp310-win32.whl", hash = "sha256:3a79c6f62adef994b2dbe9fc2cc9cc3864a23575b6e387339ab739873bea53d0"}, - {file = "debugpy-1.8.1-cp310-cp310-win_amd64.whl", hash = "sha256:7eb7bd2b56ea3bedb009616d9e2f64aab8fc7000d481faec3cd26c98a964bcdd"}, - {file = "debugpy-1.8.1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:016a9fcfc2c6b57f939673c874310d8581d51a0fe0858e7fac4e240c5eb743cb"}, - {file = "debugpy-1.8.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd97ed11a4c7f6d042d320ce03d83b20c3fb40da892f994bc041bbc415d7a099"}, - {file = "debugpy-1.8.1-cp311-cp311-win32.whl", hash = "sha256:0de56aba8249c28a300bdb0672a9b94785074eb82eb672db66c8144fff673146"}, - {file = "debugpy-1.8.1-cp311-cp311-win_amd64.whl", hash = "sha256:1a9fe0829c2b854757b4fd0a338d93bc17249a3bf69ecf765c61d4c522bb92a8"}, - {file = "debugpy-1.8.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:3ebb70ba1a6524d19fa7bb122f44b74170c447d5746a503e36adc244a20ac539"}, - {file = "debugpy-1.8.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2e658a9630f27534e63922ebf655a6ab60c370f4d2fc5c02a5b19baf4410ace"}, - {file = "debugpy-1.8.1-cp312-cp312-win32.whl", hash = "sha256:caad2846e21188797a1f17fc09c31b84c7c3c23baf2516fed5b40b378515bbf0"}, - {file = "debugpy-1.8.1-cp312-cp312-win_amd64.whl", hash = "sha256:edcc9f58ec0fd121a25bc950d4578df47428d72e1a0d66c07403b04eb93bcf98"}, - {file = "debugpy-1.8.1-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:7a3afa222f6fd3d9dfecd52729bc2e12c93e22a7491405a0ecbf9e1d32d45b39"}, - {file = "debugpy-1.8.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d915a18f0597ef685e88bb35e5d7ab968964b7befefe1aaea1eb5b2640b586c7"}, - {file = "debugpy-1.8.1-cp38-cp38-win32.whl", hash = "sha256:92116039b5500633cc8d44ecc187abe2dfa9b90f7a82bbf81d079fcdd506bae9"}, - {file = "debugpy-1.8.1-cp38-cp38-win_amd64.whl", hash = "sha256:e38beb7992b5afd9d5244e96ad5fa9135e94993b0c551ceebf3fe1a5d9beb234"}, - {file = "debugpy-1.8.1-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:bfb20cb57486c8e4793d41996652e5a6a885b4d9175dd369045dad59eaacea42"}, - {file = "debugpy-1.8.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efd3fdd3f67a7e576dd869c184c5dd71d9aaa36ded271939da352880c012e703"}, - {file = "debugpy-1.8.1-cp39-cp39-win32.whl", hash = "sha256:58911e8521ca0c785ac7a0539f1e77e0ce2df753f786188f382229278b4cdf23"}, - {file = "debugpy-1.8.1-cp39-cp39-win_amd64.whl", hash = "sha256:6df9aa9599eb05ca179fb0b810282255202a66835c6efb1d112d21ecb830ddd3"}, - {file = "debugpy-1.8.1-py2.py3-none-any.whl", hash = "sha256:28acbe2241222b87e255260c76741e1fbf04fdc3b6d094fcf57b6c6f75ce1242"}, - {file = "debugpy-1.8.1.zip", hash = "sha256:f696d6be15be87aef621917585f9bb94b1dc9e8aced570db1b8a6fc14e8f9b42"}, -] - -[[package]] -name = "decorator" -version = "5.1.1" -description = "Decorators for Humans" -optional = false -python-versions = ">=3.5" -files = [ - {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, - {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, -] - -[[package]] -name = "defusedxml" -version = "0.7.1" -description = "XML bomb protection for Python stdlib modules" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -files = [ - {file = "defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61"}, - {file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"}, -] - -[[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 = "exceptiongroup" -version = "1.2.1" -description = "Backport of PEP 654 (exception groups)" -optional = false -python-versions = ">=3.7" -files = [ - {file = "exceptiongroup-1.2.1-py3-none-any.whl", hash = "sha256:5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad"}, - {file = "exceptiongroup-1.2.1.tar.gz", hash = "sha256:a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16"}, -] - -[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 = "fastjsonschema" -version = "2.19.1" -description = "Fastest Python implementation of JSON schema" -optional = false -python-versions = "*" -files = [ - {file = "fastjsonschema-2.19.1-py3-none-any.whl", hash = "sha256:3672b47bc94178c9f23dbb654bf47440155d4db9df5f7bc47643315f9c405cd0"}, - {file = "fastjsonschema-2.19.1.tar.gz", hash = "sha256:e3126a94bdc4623d3de4485f8d468a12f02a67921315ddc87836d6e456dc789d"}, -] - -[package.extras] -devel = ["colorama", "json-spec", "jsonschema", "pylint", "pytest", "pytest-benchmark", "pytest-cache", "validictory"] - -[[package]] -name = "flake8" -version = "7.0.0" -description = "the modular source code checker: pep8 pyflakes and co" -optional = false -python-versions = ">=3.8.1" -files = [ - {file = "flake8-7.0.0-py2.py3-none-any.whl", hash = "sha256:a6dfbb75e03252917f2473ea9653f7cd799c3064e54d4c8140044c5c065f53c3"}, - {file = "flake8-7.0.0.tar.gz", hash = "sha256:33f96621059e65eec474169085dc92bf26e7b2d47366b70be2f67ab80dc25132"}, -] - -[package.dependencies] -mccabe = ">=0.7.0,<0.8.0" -pycodestyle = ">=2.11.0,<2.12.0" -pyflakes = ">=3.2.0,<3.3.0" - -[[package]] -name = "fqdn" -version = "1.5.1" -description = "Validates fully-qualified domain names against RFC 1123, so that they are acceptable to modern bowsers" -optional = false -python-versions = ">=2.7, !=3.0, !=3.1, !=3.2, !=3.3, !=3.4, <4" -files = [ - {file = "fqdn-1.5.1-py3-none-any.whl", hash = "sha256:3a179af3761e4df6eb2e026ff9e1a3033d3587bf980a0b1b2e1e5d08d7358014"}, - {file = "fqdn-1.5.1.tar.gz", hash = "sha256:105ed3677e767fb5ca086a0c1f4bb66ebc3c100be518f0e0d755d9eae164d89f"}, -] - -[[package]] -name = "graphviz" -version = "0.20.3" -description = "Simple Python interface for Graphviz" -optional = false -python-versions = ">=3.8" -files = [ - {file = "graphviz-0.20.3-py3-none-any.whl", hash = "sha256:81f848f2904515d8cd359cc611faba817598d2feaac4027b266aa3eda7b3dde5"}, - {file = "graphviz-0.20.3.zip", hash = "sha256:09d6bc81e6a9fa392e7ba52135a9d49f1ed62526f96499325930e87ca1b5925d"}, -] - -[package.extras] -dev = ["flake8", "pep8-naming", "tox (>=3)", "twine", "wheel"] -docs = ["sphinx (>=5,<7)", "sphinx-autodoc-typehints", "sphinx-rtd-theme"] -test = ["coverage", "pytest (>=7,<8.1)", "pytest-cov", "pytest-mock (>=3)"] - -[[package]] -name = "h11" -version = "0.14.0" -description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" -optional = false -python-versions = ">=3.7" -files = [ - {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, - {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, -] - -[[package]] -name = "h5py" -version = "3.11.0" -description = "Read and write HDF5 files from Python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "h5py-3.11.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1625fd24ad6cfc9c1ccd44a66dac2396e7ee74940776792772819fc69f3a3731"}, - {file = "h5py-3.11.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c072655ad1d5fe9ef462445d3e77a8166cbfa5e599045f8aa3c19b75315f10e5"}, - {file = "h5py-3.11.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77b19a40788e3e362b54af4dcf9e6fde59ca016db2c61360aa30b47c7b7cef00"}, - {file = "h5py-3.11.0-cp310-cp310-win_amd64.whl", hash = "sha256:ef4e2f338fc763f50a8113890f455e1a70acd42a4d083370ceb80c463d803972"}, - {file = "h5py-3.11.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:bbd732a08187a9e2a6ecf9e8af713f1d68256ee0f7c8b652a32795670fb481ba"}, - {file = "h5py-3.11.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:75bd7b3d93fbeee40860fd70cdc88df4464e06b70a5ad9ce1446f5f32eb84007"}, - {file = "h5py-3.11.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:52c416f8eb0daae39dabe71415cb531f95dce2d81e1f61a74537a50c63b28ab3"}, - {file = "h5py-3.11.0-cp311-cp311-win_amd64.whl", hash = "sha256:083e0329ae534a264940d6513f47f5ada617da536d8dccbafc3026aefc33c90e"}, - {file = "h5py-3.11.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a76cae64080210389a571c7d13c94a1a6cf8cb75153044fd1f822a962c97aeab"}, - {file = "h5py-3.11.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f3736fe21da2b7d8a13fe8fe415f1272d2a1ccdeff4849c1421d2fb30fd533bc"}, - {file = "h5py-3.11.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa6ae84a14103e8dc19266ef4c3e5d7c00b68f21d07f2966f0ca7bdb6c2761fb"}, - {file = "h5py-3.11.0-cp312-cp312-win_amd64.whl", hash = "sha256:21dbdc5343f53b2e25404673c4f00a3335aef25521bd5fa8c707ec3833934892"}, - {file = "h5py-3.11.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:754c0c2e373d13d6309f408325343b642eb0f40f1a6ad21779cfa9502209e150"}, - {file = "h5py-3.11.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:731839240c59ba219d4cb3bc5880d438248533366f102402cfa0621b71796b62"}, - {file = "h5py-3.11.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ec9df3dd2018904c4cc06331951e274f3f3fd091e6d6cc350aaa90fa9b42a76"}, - {file = "h5py-3.11.0-cp38-cp38-win_amd64.whl", hash = "sha256:55106b04e2c83dfb73dc8732e9abad69d83a436b5b82b773481d95d17b9685e1"}, - {file = "h5py-3.11.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f4e025e852754ca833401777c25888acb96889ee2c27e7e629a19aee288833f0"}, - {file = "h5py-3.11.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6c4b760082626120031d7902cd983d8c1f424cdba2809f1067511ef283629d4b"}, - {file = "h5py-3.11.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67462d0669f8f5459529de179f7771bd697389fcb3faab54d63bf788599a48ea"}, - {file = "h5py-3.11.0-cp39-cp39-win_amd64.whl", hash = "sha256:d9c944d364688f827dc889cf83f1fca311caf4fa50b19f009d1f2b525edd33a3"}, - {file = "h5py-3.11.0.tar.gz", hash = "sha256:7b7e8f78072a2edec87c9836f25f34203fd492a4475709a18b417a33cfb21fa9"}, -] - -[package.dependencies] -numpy = ">=1.17.3" - -[[package]] -name = "httpcore" -version = "1.0.5" -description = "A minimal low-level HTTP client." -optional = false -python-versions = ">=3.8" -files = [ - {file = "httpcore-1.0.5-py3-none-any.whl", hash = "sha256:421f18bac248b25d310f3cacd198d55b8e6125c107797b609ff9b7a6ba7991b5"}, - {file = "httpcore-1.0.5.tar.gz", hash = "sha256:34a38e2f9291467ee3b44e89dd52615370e152954ba21721378a87b2960f7a61"}, -] - -[package.dependencies] -certifi = "*" -h11 = ">=0.13,<0.15" - -[package.extras] -asyncio = ["anyio (>=4.0,<5.0)"] -http2 = ["h2 (>=3,<5)"] -socks = ["socksio (==1.*)"] -trio = ["trio (>=0.22.0,<0.26.0)"] - -[[package]] -name = "httpx" -version = "0.27.0" -description = "The next generation HTTP client." -optional = false -python-versions = ">=3.8" -files = [ - {file = "httpx-0.27.0-py3-none-any.whl", hash = "sha256:71d5465162c13681bff01ad59b2cc68dd838ea1f10e51574bac27103f00c91a5"}, - {file = "httpx-0.27.0.tar.gz", hash = "sha256:a0cb88a46f32dc874e04ee956e4c2764aba2aa228f650b06788ba6bda2962ab5"}, -] - -[package.dependencies] -anyio = "*" -certifi = "*" -httpcore = "==1.*" -idna = "*" -sniffio = "*" - -[package.extras] -brotli = ["brotli", "brotlicffi"] -cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] -http2 = ["h2 (>=3,<5)"] -socks = ["socksio (==1.*)"] - -[[package]] -name = "idna" -version = "3.7" -description = "Internationalized Domain Names in Applications (IDNA)" -optional = false -python-versions = ">=3.5" -files = [ - {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, - {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, -] - -[[package]] -name = "importlib-metadata" -version = "7.1.0" -description = "Read metadata from Python packages" -optional = false -python-versions = ">=3.8" -files = [ - {file = "importlib_metadata-7.1.0-py3-none-any.whl", hash = "sha256:30962b96c0c223483ed6cc7280e7f0199feb01a0e40cfae4d4450fc6fab1f570"}, - {file = "importlib_metadata-7.1.0.tar.gz", hash = "sha256:b78938b926ee8d5f020fc4772d487045805a55ddbad2ecf21c6d60938dc7fcd2"}, -] - -[package.dependencies] -zipp = ">=0.5" - -[package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -perf = ["ipython"] -testing = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-perf (>=0.9.2)", "pytest-ruff (>=0.2.1)"] - -[[package]] -name = "ipykernel" -version = "6.29.4" -description = "IPython Kernel for Jupyter" -optional = false -python-versions = ">=3.8" -files = [ - {file = "ipykernel-6.29.4-py3-none-any.whl", hash = "sha256:1181e653d95c6808039c509ef8e67c4126b3b3af7781496c7cbfb5ed938a27da"}, - {file = "ipykernel-6.29.4.tar.gz", hash = "sha256:3d44070060f9475ac2092b760123fadf105d2e2493c24848b6691a7c4f42af5c"}, -] - -[package.dependencies] -appnope = {version = "*", markers = "platform_system == \"Darwin\""} -comm = ">=0.1.1" -debugpy = ">=1.6.5" -ipython = ">=7.23.1" -jupyter-client = ">=6.1.12" -jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" -matplotlib-inline = ">=0.1" -nest-asyncio = "*" -packaging = "*" -psutil = "*" -pyzmq = ">=24" -tornado = ">=6.1" -traitlets = ">=5.4.0" - -[package.extras] -cov = ["coverage[toml]", "curio", "matplotlib", "pytest-cov", "trio"] -docs = ["myst-parser", "pydata-sphinx-theme", "sphinx", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "trio"] -pyqt5 = ["pyqt5"] -pyside6 = ["pyside6"] -test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0)", "pytest-asyncio (>=0.23.5)", "pytest-cov", "pytest-timeout"] - -[[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 = "ipywidgets" -version = "8.1.2" -description = "Jupyter interactive widgets" -optional = false -python-versions = ">=3.7" -files = [ - {file = "ipywidgets-8.1.2-py3-none-any.whl", hash = "sha256:bbe43850d79fb5e906b14801d6c01402857996864d1e5b6fa62dd2ee35559f60"}, - {file = "ipywidgets-8.1.2.tar.gz", hash = "sha256:d0b9b41e49bae926a866e613a39b0f0097745d2b9f1f3dd406641b4a57ec42c9"}, -] - -[package.dependencies] -comm = ">=0.1.3" -ipython = ">=6.1.0" -jupyterlab-widgets = ">=3.0.10,<3.1.0" -traitlets = ">=4.3.1" -widgetsnbextension = ">=4.0.10,<4.1.0" - -[package.extras] -test = ["ipykernel", "jsonschema", "pytest (>=3.6.0)", "pytest-cov", "pytz"] - -[[package]] -name = "isoduration" -version = "20.11.0" -description = "Operations with ISO 8601 durations" -optional = false -python-versions = ">=3.7" -files = [ - {file = "isoduration-20.11.0-py3-none-any.whl", hash = "sha256:b2904c2a4228c3d44f409c8ae8e2370eb21a26f7ac2ec5446df141dde3452042"}, - {file = "isoduration-20.11.0.tar.gz", hash = "sha256:ac2f9015137935279eac671f94f89eb00584f940f5dc49462a0c4ee692ba1bd9"}, -] - -[package.dependencies] -arrow = ">=0.15.0" - -[[package]] -name = "isort" -version = "5.13.2" -description = "A Python utility / library to sort Python imports." -optional = false -python-versions = ">=3.8.0" -files = [ - {file = "isort-5.13.2-py3-none-any.whl", hash = "sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6"}, - {file = "isort-5.13.2.tar.gz", hash = "sha256:48fdfcb9face5d58a4f6dde2e72a1fb8dcaf8ab26f95ab49fab84c2ddefb0109"}, -] - -[package.extras] -colors = ["colorama (>=0.4.6)"] - -[[package]] -name = "jax" -version = "0.4.26" -description = "Differentiate, compile, and transform Numpy code." -optional = false -python-versions = ">=3.9" -files = [ - {file = "jax-0.4.26-py3-none-any.whl", hash = "sha256:50dc795148ee6b0735b48b477e5abc556aa3a4c7af5d6940dad08024a908b02f"}, - {file = "jax-0.4.26.tar.gz", hash = "sha256:2cce025d0a279ec630d550524749bc8efe25d2ff47240d2a7d4cfbc5090c5383"}, -] - -[package.dependencies] -importlib-metadata = {version = ">=4.6", markers = "python_version < \"3.10\""} -jaxlib = {version = "0.4.26", optional = true, markers = "extra == \"cpu\""} -ml-dtypes = ">=0.2.0" -numpy = [ - {version = ">=1.22", markers = "python_version < \"3.11\""}, - {version = ">=1.23.2", markers = "python_version >= \"3.11\""}, - {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, -] -opt-einsum = "*" -scipy = [ - {version = ">=1.9", markers = "python_version < \"3.12\""}, - {version = ">=1.11.1", markers = "python_version >= \"3.12\""}, -] - -[package.extras] -australis = ["protobuf (>=3.13,<4)"] -ci = ["jaxlib (==0.4.25)"] -cpu = ["jaxlib (==0.4.26)"] -cuda = ["jaxlib (==0.4.26+cuda12.cudnn89)"] -cuda12 = ["jax-cuda12-plugin (==0.4.26)", "jaxlib (==0.4.26)", "nvidia-cublas-cu12 (>=12.1.3.1)", "nvidia-cuda-cupti-cu12 (>=12.1.105)", "nvidia-cuda-nvcc-cu12 (>=12.1.105)", "nvidia-cuda-runtime-cu12 (>=12.1.105)", "nvidia-cudnn-cu12 (>=8.9.2.26,<9.0)", "nvidia-cufft-cu12 (>=11.0.2.54)", "nvidia-cusolver-cu12 (>=11.4.5.107)", "nvidia-cusparse-cu12 (>=12.1.0.106)", "nvidia-nccl-cu12 (>=2.18.1)", "nvidia-nvjitlink-cu12 (>=12.1.105)"] -cuda12-cudnn89 = ["jaxlib (==0.4.26+cuda12.cudnn89)"] -cuda12-local = ["jaxlib (==0.4.26+cuda12.cudnn89)"] -cuda12-pip = ["jaxlib (==0.4.26+cuda12.cudnn89)", "nvidia-cublas-cu12 (>=12.1.3.1)", "nvidia-cuda-cupti-cu12 (>=12.1.105)", "nvidia-cuda-nvcc-cu12 (>=12.1.105)", "nvidia-cuda-runtime-cu12 (>=12.1.105)", "nvidia-cudnn-cu12 (>=8.9.2.26,<9.0)", "nvidia-cufft-cu12 (>=11.0.2.54)", "nvidia-cusolver-cu12 (>=11.4.5.107)", "nvidia-cusparse-cu12 (>=12.1.0.106)", "nvidia-nccl-cu12 (>=2.18.1)", "nvidia-nvjitlink-cu12 (>=12.1.105)"] -minimum-jaxlib = ["jaxlib (==0.4.20)"] -tpu = ["jaxlib (==0.4.26)", "libtpu-nightly (==0.1.dev20240403)", "requests"] - -[[package]] -name = "jaxlib" -version = "0.4.26" -description = "XLA library for JAX" -optional = false -python-versions = ">=3.9" -files = [ - {file = "jaxlib-0.4.26-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:f9060fd81d1b2a2c2069e998db2be04853c40a244ab9edb1caf1c5cbd2f70881"}, - {file = "jaxlib-0.4.26-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e61ded57e05764350f7065583d85ab9270e7f7ed6b9f9d9394fe6ff64d96aab7"}, - {file = "jaxlib-0.4.26-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:d483aff58898bf37e341d6241cecb3e107aebe4ca237fe6267d4c18b7c09ea90"}, - {file = "jaxlib-0.4.26-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:22e943ed10faa7d85fd804ddc20581bf6fbcc60e114435c3b3327b9f1ebff895"}, - {file = "jaxlib-0.4.26-cp310-cp310-win_amd64.whl", hash = "sha256:eb0cc16efc6313eb100688a38078061caa3c907ebfa1d315485a08fd27f374dc"}, - {file = "jaxlib-0.4.26-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:de4b9a54cd96e6a732c1cf65ae2defdf6a01558a15db8bf6dbd8f40d363b085d"}, - {file = "jaxlib-0.4.26-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8cbdcb95ac73f80ea3a82a53b8f0621f37dfb01ab0203de6fc6691a4e2396984"}, - {file = "jaxlib-0.4.26-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:6754ee0d4dd44f708c3826c51ce648c5e08cfc56cabf23d4f3b428971ab00094"}, - {file = "jaxlib-0.4.26-cp311-cp311-manylinux2014_x86_64.whl", hash = "sha256:3069da7d75f5b4dd15350fffe6e6b86ca09c4b9fde60b10515edb09cef653335"}, - {file = "jaxlib-0.4.26-cp311-cp311-win_amd64.whl", hash = "sha256:516d2b573975bd666278badd650620d5edf3abb835978459d78f135e95419b04"}, - {file = "jaxlib-0.4.26-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:2c66fe8285fed13bcd44b7e10aa90a25a4a58af82450a4b18d0f1573c04a7797"}, - {file = "jaxlib-0.4.26-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9275761ae907ec0e812031bbae644f7a217e314e62d518c85d60ce686d3a3b0b"}, - {file = "jaxlib-0.4.26-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:597df919f00646d3f9c6feb2a39c9fa0fca00032f19cfe758916db3db30d416a"}, - {file = "jaxlib-0.4.26-cp312-cp312-manylinux2014_x86_64.whl", hash = "sha256:f084dd65f2b3cd804102d9cecf938d876cbbd54cb95308634020fc71b98fac79"}, - {file = "jaxlib-0.4.26-cp312-cp312-win_amd64.whl", hash = "sha256:72f117535d6dbc568adbcf6e1740037e0fe1d6e5b9558ea4158556005cf72bfc"}, - {file = "jaxlib-0.4.26-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:0fea35b04cce0a6a758fd005132c02122dd49be5914d70c7d54e8eafdf3f352b"}, - {file = "jaxlib-0.4.26-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:520f71795c411b41cbea13488f1b17610780d7d9afc02ac5f9931a8c975780cb"}, - {file = "jaxlib-0.4.26-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:d7bbb75f8e63c5ada57a386b7bfaac301f689149ba132509ccd0c865b2ebd4d2"}, - {file = "jaxlib-0.4.26-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:80b2440072da25d85634e98f755b8381781bd4c1ab4023b2ae0956c360124080"}, - {file = "jaxlib-0.4.26-cp39-cp39-win_amd64.whl", hash = "sha256:96c9a183d7a56572a5c1508de317a05badddfbbc8370a8fa8a2e548d5e059dc3"}, -] - -[package.dependencies] -ml-dtypes = ">=0.2.0" -numpy = ">=1.22" -scipy = [ - {version = ">=1.9", markers = "python_version < \"3.12\""}, - {version = ">=1.11.1", markers = "python_version >= \"3.12\""}, -] - -[package.extras] -cuda12-pip = ["nvidia-cublas-cu12 (>=12.1.3.1)", "nvidia-cuda-cupti-cu12 (>=12.1.105)", "nvidia-cuda-nvcc-cu12 (>=12.1.105)", "nvidia-cuda-runtime-cu12 (>=12.1.105)", "nvidia-cudnn-cu12 (>=8.9.2.26,<9.0)", "nvidia-cufft-cu12 (>=11.0.2.54)", "nvidia-cusolver-cu12 (>=11.4.5.107)", "nvidia-cusparse-cu12 (>=12.1.0.106)", "nvidia-nccl-cu12 (>=2.18.1)", "nvidia-nvjitlink-cu12 (>=12.1.105)"] - -[[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.4" -description = "A very fast and expressive template engine." -optional = false -python-versions = ">=3.7" -files = [ - {file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"}, - {file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"}, -] - -[package.dependencies] -MarkupSafe = ">=2.0" - -[package.extras] -i18n = ["Babel (>=2.7)"] - -[[package]] -name = "json5" -version = "0.9.25" -description = "A Python implementation of the JSON5 data format." -optional = false -python-versions = ">=3.8" -files = [ - {file = "json5-0.9.25-py3-none-any.whl", hash = "sha256:34ed7d834b1341a86987ed52f3f76cd8ee184394906b6e22a1e0deb9ab294e8f"}, - {file = "json5-0.9.25.tar.gz", hash = "sha256:548e41b9be043f9426776f05df8635a00fe06104ea51ed24b67f908856e151ae"}, -] - -[[package]] -name = "jsonpointer" -version = "2.4" -description = "Identify specific nodes in a JSON document (RFC 6901)" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*" -files = [ - {file = "jsonpointer-2.4-py2.py3-none-any.whl", hash = "sha256:15d51bba20eea3165644553647711d150376234112651b4f1811022aecad7d7a"}, - {file = "jsonpointer-2.4.tar.gz", hash = "sha256:585cee82b70211fa9e6043b7bb89db6e1aa49524340dde8ad6b63206ea689d88"}, -] - -[[package]] -name = "jsonschema" -version = "4.22.0" -description = "An implementation of JSON Schema validation for Python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "jsonschema-4.22.0-py3-none-any.whl", hash = "sha256:ff4cfd6b1367a40e7bc6411caec72effadd3db0bbe5017de188f2d6108335802"}, - {file = "jsonschema-4.22.0.tar.gz", hash = "sha256:5b22d434a45935119af990552c862e5d6d564e8f6601206b305a61fdf661a2b7"}, -] - -[package.dependencies] -attrs = ">=22.2.0" -fqdn = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} -idna = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} -isoduration = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} -jsonpointer = {version = ">1.13", optional = true, markers = "extra == \"format-nongpl\""} -jsonschema-specifications = ">=2023.03.6" -referencing = ">=0.28.4" -rfc3339-validator = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} -rfc3986-validator = {version = ">0.1.0", optional = true, markers = "extra == \"format-nongpl\""} -rpds-py = ">=0.7.1" -uri-template = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} -webcolors = {version = ">=1.11", optional = true, markers = "extra == \"format-nongpl\""} - -[package.extras] -format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] -format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=1.11)"] - -[[package]] -name = "jsonschema-specifications" -version = "2023.12.1" -description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" -optional = false -python-versions = ">=3.8" -files = [ - {file = "jsonschema_specifications-2023.12.1-py3-none-any.whl", hash = "sha256:87e4fdf3a94858b8a2ba2778d9ba57d8a9cafca7c7489c46ba0d30a8bc6a9c3c"}, - {file = "jsonschema_specifications-2023.12.1.tar.gz", hash = "sha256:48a76787b3e70f5ed53f1160d2b81f586e4ca6d1548c5de7085d1682674764cc"}, -] - -[package.dependencies] -referencing = ">=0.31.0" - -[[package]] -name = "jupyter" -version = "1.0.0" -description = "Jupyter metapackage. Install all the Jupyter components in one go." -optional = false -python-versions = "*" -files = [ - {file = "jupyter-1.0.0-py2.py3-none-any.whl", hash = "sha256:5b290f93b98ffbc21c0c7e749f054b3267782166d72fa5e3ed1ed4eaf34a2b78"}, - {file = "jupyter-1.0.0.tar.gz", hash = "sha256:d9dc4b3318f310e34c82951ea5d6683f67bed7def4b259fafbfe4f1beb1d8e5f"}, - {file = "jupyter-1.0.0.zip", hash = "sha256:3e1f86076bbb7c8c207829390305a2b1fe836d471ed54be66a3b8c41e7f46cc7"}, -] - -[package.dependencies] -ipykernel = "*" -ipywidgets = "*" -jupyter-console = "*" -nbconvert = "*" -notebook = "*" -qtconsole = "*" - -[[package]] -name = "jupyter-client" -version = "8.6.1" -description = "Jupyter protocol implementation and client libraries" -optional = false -python-versions = ">=3.8" -files = [ - {file = "jupyter_client-8.6.1-py3-none-any.whl", hash = "sha256:3b7bd22f058434e3b9a7ea4b1500ed47de2713872288c0d511d19926f99b459f"}, - {file = "jupyter_client-8.6.1.tar.gz", hash = "sha256:e842515e2bab8e19186d89fdfea7abd15e39dd581f94e399f00e2af5a1652d3f"}, -] - -[package.dependencies] -importlib-metadata = {version = ">=4.8.3", markers = "python_version < \"3.10\""} -jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" -python-dateutil = ">=2.8.2" -pyzmq = ">=23.0" -tornado = ">=6.2" -traitlets = ">=5.3" - -[package.extras] -docs = ["ipykernel", "myst-parser", "pydata-sphinx-theme", "sphinx (>=4)", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] -test = ["coverage", "ipykernel (>=6.14)", "mypy", "paramiko", "pre-commit", "pytest", "pytest-cov", "pytest-jupyter[client] (>=0.4.1)", "pytest-timeout"] - -[[package]] -name = "jupyter-console" -version = "6.6.3" -description = "Jupyter terminal console" -optional = false -python-versions = ">=3.7" -files = [ - {file = "jupyter_console-6.6.3-py3-none-any.whl", hash = "sha256:309d33409fcc92ffdad25f0bcdf9a4a9daa61b6f341177570fdac03de5352485"}, - {file = "jupyter_console-6.6.3.tar.gz", hash = "sha256:566a4bf31c87adbfadf22cdf846e3069b59a71ed5da71d6ba4d8aaad14a53539"}, -] - -[package.dependencies] -ipykernel = ">=6.14" -ipython = "*" -jupyter-client = ">=7.0.0" -jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" -prompt-toolkit = ">=3.0.30" -pygments = "*" -pyzmq = ">=17" -traitlets = ">=5.4" - -[package.extras] -test = ["flaky", "pexpect", "pytest"] - -[[package]] -name = "jupyter-core" -version = "5.7.2" -description = "Jupyter core package. A base package on which Jupyter projects rely." -optional = false -python-versions = ">=3.8" -files = [ - {file = "jupyter_core-5.7.2-py3-none-any.whl", hash = "sha256:4f7315d2f6b4bcf2e3e7cb6e46772eba760ae459cd1f59d29eb57b0a01bd7409"}, - {file = "jupyter_core-5.7.2.tar.gz", hash = "sha256:aa5f8d32bbf6b431ac830496da7392035d6f61b4f54872f15c4bd2a9c3f536d9"}, -] - -[package.dependencies] -platformdirs = ">=2.5" -pywin32 = {version = ">=300", markers = "sys_platform == \"win32\" and platform_python_implementation != \"PyPy\""} -traitlets = ">=5.3" - -[package.extras] -docs = ["myst-parser", "pydata-sphinx-theme", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "traitlets"] -test = ["ipykernel", "pre-commit", "pytest (<8)", "pytest-cov", "pytest-timeout"] - -[[package]] -name = "jupyter-events" -version = "0.10.0" -description = "Jupyter Event System library" -optional = false -python-versions = ">=3.8" -files = [ - {file = "jupyter_events-0.10.0-py3-none-any.whl", hash = "sha256:4b72130875e59d57716d327ea70d3ebc3af1944d3717e5a498b8a06c6c159960"}, - {file = "jupyter_events-0.10.0.tar.gz", hash = "sha256:670b8229d3cc882ec782144ed22e0d29e1c2d639263f92ca8383e66682845e22"}, -] - -[package.dependencies] -jsonschema = {version = ">=4.18.0", extras = ["format-nongpl"]} -python-json-logger = ">=2.0.4" -pyyaml = ">=5.3" -referencing = "*" -rfc3339-validator = "*" -rfc3986-validator = ">=0.1.1" -traitlets = ">=5.3" - -[package.extras] -cli = ["click", "rich"] -docs = ["jupyterlite-sphinx", "myst-parser", "pydata-sphinx-theme", "sphinxcontrib-spelling"] -test = ["click", "pre-commit", "pytest (>=7.0)", "pytest-asyncio (>=0.19.0)", "pytest-console-scripts", "rich"] - -[[package]] -name = "jupyter-lsp" -version = "2.2.5" -description = "Multi-Language Server WebSocket proxy for Jupyter Notebook/Lab server" -optional = false -python-versions = ">=3.8" -files = [ - {file = "jupyter-lsp-2.2.5.tar.gz", hash = "sha256:793147a05ad446f809fd53ef1cd19a9f5256fd0a2d6b7ce943a982cb4f545001"}, - {file = "jupyter_lsp-2.2.5-py3-none-any.whl", hash = "sha256:45fbddbd505f3fbfb0b6cb2f1bc5e15e83ab7c79cd6e89416b248cb3c00c11da"}, -] - -[package.dependencies] -importlib-metadata = {version = ">=4.8.3", markers = "python_version < \"3.10\""} -jupyter-server = ">=1.1.2" - -[[package]] -name = "jupyter-server" -version = "2.14.0" -description = "The backend—i.e. core services, APIs, and REST endpoints—to Jupyter web applications." -optional = false -python-versions = ">=3.8" -files = [ - {file = "jupyter_server-2.14.0-py3-none-any.whl", hash = "sha256:fb6be52c713e80e004fac34b35a0990d6d36ba06fd0a2b2ed82b899143a64210"}, - {file = "jupyter_server-2.14.0.tar.gz", hash = "sha256:659154cea512083434fd7c93b7fe0897af7a2fd0b9dd4749282b42eaac4ae677"}, -] - -[package.dependencies] -anyio = ">=3.1.0" -argon2-cffi = ">=21.1" -jinja2 = ">=3.0.3" -jupyter-client = ">=7.4.4" -jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" -jupyter-events = ">=0.9.0" -jupyter-server-terminals = ">=0.4.4" -nbconvert = ">=6.4.4" -nbformat = ">=5.3.0" -overrides = ">=5.0" -packaging = ">=22.0" -prometheus-client = ">=0.9" -pywinpty = {version = ">=2.0.1", markers = "os_name == \"nt\""} -pyzmq = ">=24" -send2trash = ">=1.8.2" -terminado = ">=0.8.3" -tornado = ">=6.2.0" -traitlets = ">=5.6.0" -websocket-client = ">=1.7" - -[package.extras] -docs = ["ipykernel", "jinja2", "jupyter-client", "jupyter-server", "myst-parser", "nbformat", "prometheus-client", "pydata-sphinx-theme", "send2trash", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-openapi (>=0.8.0)", "sphinxcontrib-spelling", "sphinxemoji", "tornado", "typing-extensions"] -test = ["flaky", "ipykernel", "pre-commit", "pytest (>=7.0,<9)", "pytest-console-scripts", "pytest-jupyter[server] (>=0.7)", "pytest-timeout", "requests"] - -[[package]] -name = "jupyter-server-terminals" -version = "0.5.3" -description = "A Jupyter Server Extension Providing Terminals." -optional = false -python-versions = ">=3.8" -files = [ - {file = "jupyter_server_terminals-0.5.3-py3-none-any.whl", hash = "sha256:41ee0d7dc0ebf2809c668e0fc726dfaf258fcd3e769568996ca731b6194ae9aa"}, - {file = "jupyter_server_terminals-0.5.3.tar.gz", hash = "sha256:5ae0295167220e9ace0edcfdb212afd2b01ee8d179fe6f23c899590e9b8a5269"}, -] - -[package.dependencies] -pywinpty = {version = ">=2.0.3", markers = "os_name == \"nt\""} -terminado = ">=0.8.3" - -[package.extras] -docs = ["jinja2", "jupyter-server", "mistune (<4.0)", "myst-parser", "nbformat", "packaging", "pydata-sphinx-theme", "sphinxcontrib-github-alt", "sphinxcontrib-openapi", "sphinxcontrib-spelling", "sphinxemoji", "tornado"] -test = ["jupyter-server (>=2.0.0)", "pytest (>=7.0)", "pytest-jupyter[server] (>=0.5.3)", "pytest-timeout"] - -[[package]] -name = "jupyterlab" -version = "4.1.8" -description = "JupyterLab computational environment" -optional = false -python-versions = ">=3.8" -files = [ - {file = "jupyterlab-4.1.8-py3-none-any.whl", hash = "sha256:c3baf3a2f91f89d110ed5786cd18672b9a357129d4e389d2a0dead15e11a4d2c"}, - {file = "jupyterlab-4.1.8.tar.gz", hash = "sha256:3384aded8680e7ce504fd63b8bb89a39df21c9c7694d9e7dc4a68742cdb30f9b"}, -] - -[package.dependencies] -async-lru = ">=1.0.0" -httpx = ">=0.25.0" -importlib-metadata = {version = ">=4.8.3", markers = "python_version < \"3.10\""} -ipykernel = ">=6.5.0" -jinja2 = ">=3.0.3" -jupyter-core = "*" -jupyter-lsp = ">=2.0.0" -jupyter-server = ">=2.4.0,<3" -jupyterlab-server = ">=2.27.1,<3" -notebook-shim = ">=0.2" -packaging = "*" -tomli = {version = ">=1.2.2", markers = "python_version < \"3.11\""} -tornado = ">=6.2.0" -traitlets = "*" - -[package.extras] -dev = ["build", "bump2version", "coverage", "hatch", "pre-commit", "pytest-cov", "ruff (==0.2.0)"] -docs = ["jsx-lexer", "myst-parser", "pydata-sphinx-theme (>=0.13.0)", "pytest", "pytest-check-links", "pytest-jupyter", "sphinx (>=1.8,<7.3.0)", "sphinx-copybutton"] -docs-screenshots = ["altair (==5.2.0)", "ipython (==8.16.1)", "ipywidgets (==8.1.1)", "jupyterlab-geojson (==3.4.0)", "jupyterlab-language-pack-zh-cn (==4.0.post6)", "matplotlib (==3.8.2)", "nbconvert (>=7.0.0)", "pandas (==2.2.0)", "scipy (==1.12.0)", "vega-datasets (==0.9.0)"] -test = ["coverage", "pytest (>=7.0)", "pytest-check-links (>=0.7)", "pytest-console-scripts", "pytest-cov", "pytest-jupyter (>=0.5.3)", "pytest-timeout", "pytest-tornasync", "requests", "requests-cache", "virtualenv"] -upgrade-extension = ["copier (>=8.0,<9.0)", "jinja2-time (<0.3)", "pydantic (<2.0)", "pyyaml-include (<2.0)", "tomli-w (<2.0)"] - -[[package]] -name = "jupyterlab-pygments" -version = "0.3.0" -description = "Pygments theme using JupyterLab CSS variables" -optional = false -python-versions = ">=3.8" -files = [ - {file = "jupyterlab_pygments-0.3.0-py3-none-any.whl", hash = "sha256:841a89020971da1d8693f1a99997aefc5dc424bb1b251fd6322462a1b8842780"}, - {file = "jupyterlab_pygments-0.3.0.tar.gz", hash = "sha256:721aca4d9029252b11cfa9d185e5b5af4d54772bb8072f9b7036f4170054d35d"}, -] - -[[package]] -name = "jupyterlab-server" -version = "2.27.1" -description = "A set of server components for JupyterLab and JupyterLab like applications." -optional = false -python-versions = ">=3.8" -files = [ - {file = "jupyterlab_server-2.27.1-py3-none-any.whl", hash = "sha256:f5e26156e5258b24d532c84e7c74cc212e203bff93eb856f81c24c16daeecc75"}, - {file = "jupyterlab_server-2.27.1.tar.gz", hash = "sha256:097b5ac709b676c7284ac9c5e373f11930a561f52cd5a86e4fc7e5a9c8a8631d"}, -] - -[package.dependencies] -babel = ">=2.10" -importlib-metadata = {version = ">=4.8.3", markers = "python_version < \"3.10\""} -jinja2 = ">=3.0.3" -json5 = ">=0.9.0" -jsonschema = ">=4.18.0" -jupyter-server = ">=1.21,<3" -packaging = ">=21.3" -requests = ">=2.31" - -[package.extras] -docs = ["autodoc-traits", "jinja2 (<3.2.0)", "mistune (<4)", "myst-parser", "pydata-sphinx-theme", "sphinx", "sphinx-copybutton", "sphinxcontrib-openapi (>0.8)"] -openapi = ["openapi-core (>=0.18.0,<0.19.0)", "ruamel-yaml"] -test = ["hatch", "ipykernel", "openapi-core (>=0.18.0,<0.19.0)", "openapi-spec-validator (>=0.6.0,<0.8.0)", "pytest (>=7.0,<8)", "pytest-console-scripts", "pytest-cov", "pytest-jupyter[server] (>=0.6.2)", "pytest-timeout", "requests-mock", "ruamel-yaml", "sphinxcontrib-spelling", "strict-rfc3339", "werkzeug"] - -[[package]] -name = "jupyterlab-widgets" -version = "3.0.10" -description = "Jupyter interactive widgets for JupyterLab" -optional = false -python-versions = ">=3.7" -files = [ - {file = "jupyterlab_widgets-3.0.10-py3-none-any.whl", hash = "sha256:dd61f3ae7a5a7f80299e14585ce6cf3d6925a96c9103c978eda293197730cb64"}, - {file = "jupyterlab_widgets-3.0.10.tar.gz", hash = "sha256:04f2ac04976727e4f9d0fa91cdc2f1ab860f965e504c29dbd6a65c882c9d04c0"}, -] - -[[package]] -name = "markupsafe" -version = "2.1.5" -description = "Safely add untrusted strings to HTML/XML markup." -optional = false -python-versions = ">=3.7" -files = [ - {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-win32.whl", hash = "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5"}, - {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, -] - -[[package]] -name = "matplotlib-inline" -version = "0.1.7" -description = "Inline Matplotlib backend for Jupyter" -optional = false -python-versions = ">=3.8" -files = [ - {file = "matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca"}, - {file = "matplotlib_inline-0.1.7.tar.gz", hash = "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90"}, -] - -[package.dependencies] -traitlets = "*" - -[[package]] -name = "mccabe" -version = "0.7.0" -description = "McCabe checker, plugin for flake8" -optional = false -python-versions = ">=3.6" -files = [ - {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, - {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, -] - -[[package]] -name = "mistune" -version = "3.0.2" -description = "A sane and fast Markdown parser with useful plugins and renderers" -optional = false -python-versions = ">=3.7" -files = [ - {file = "mistune-3.0.2-py3-none-any.whl", hash = "sha256:71481854c30fdbc938963d3605b72501f5c10a9320ecd412c121c163a1c7d205"}, - {file = "mistune-3.0.2.tar.gz", hash = "sha256:fc7f93ded930c92394ef2cb6f04a8aabab4117a91449e72dcc8dfa646a508be8"}, -] - -[[package]] -name = "ml-dtypes" -version = "0.4.0" -description = "" -optional = false -python-versions = ">=3.9" -files = [ - {file = "ml_dtypes-0.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:93afe37f3a879d652ec9ef1fc47612388890660a2657fbb5747256c3b818fd81"}, - {file = "ml_dtypes-0.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2bb83fd064db43e67e67d021e547698af4c8d5c6190f2e9b1c53c09f6ff5531d"}, - {file = "ml_dtypes-0.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:03e7cda6ef164eed0abb31df69d2c00c3a5ab3e2610b6d4c42183a43329c72a5"}, - {file = "ml_dtypes-0.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:a15d96d090aebb55ee85173d1775ae325a001aab607a76c8ea0b964ccd6b5364"}, - {file = "ml_dtypes-0.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:bdf689be7351cc3c95110c910c1b864002f113e682e44508910c849e144f3df1"}, - {file = "ml_dtypes-0.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c83e4d443962d891d51669ff241d5aaad10a8d3d37a81c5532a45419885d591c"}, - {file = "ml_dtypes-0.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1e2f4237b459a63c97c2c9f449baa637d7e4c20addff6a9bac486f22432f3b6"}, - {file = "ml_dtypes-0.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:75b4faf99d0711b81f393db36d210b4255fd419f6f790bc6c1b461f95ffb7a9e"}, - {file = "ml_dtypes-0.4.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:ee9f91d4c4f9959a7e1051c141dc565f39e54435618152219769e24f5e9a4d06"}, - {file = "ml_dtypes-0.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad6849a2db386b38e4d54fe13eb3293464561780531a918f8ef4c8169170dd49"}, - {file = "ml_dtypes-0.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eaa32979ebfde3a0d7c947cafbf79edc1ec77ac05ad0780ee86c1d8df70f2259"}, - {file = "ml_dtypes-0.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:3b67ec73a697c88c1122038e0de46520e48dc2ec876d42cf61bc5efe3c0b7675"}, - {file = "ml_dtypes-0.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:41affb38fdfe146e3db226cf2953021184d6f0c4ffab52136613e9601706e368"}, - {file = "ml_dtypes-0.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:43cf4356a0fe2eeac6d289018d0734e17a403bdf1fd911953c125dd0358edcc0"}, - {file = "ml_dtypes-0.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1724ddcdf5edbaf615a62110af47407f1719b8d02e68ccee60683acb5f74da1"}, - {file = "ml_dtypes-0.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:723af6346447268a3cf0b7356e963d80ecb5732b5279b2aa3fa4b9fc8297c85e"}, - {file = "ml_dtypes-0.4.0.tar.gz", hash = "sha256:eaf197e72f4f7176a19fe3cb8b61846b38c6757607e7bf9cd4b1d84cd3e74deb"}, -] - -[package.dependencies] -numpy = [ - {version = ">1.20", markers = "python_version < \"3.10\""}, - {version = ">=1.21.2", markers = "python_version >= \"3.10\""}, - {version = ">=1.23.3", markers = "python_version >= \"3.11\""}, - {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, -] - -[package.extras] -dev = ["absl-py", "pyink", "pylint (>=2.6.0)", "pytest", "pytest-xdist"] - -[[package]] -name = "mypy" -version = "1.10.0" -description = "Optional static typing for Python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "mypy-1.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:da1cbf08fb3b851ab3b9523a884c232774008267b1f83371ace57f412fe308c2"}, - {file = "mypy-1.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:12b6bfc1b1a66095ab413160a6e520e1dc076a28f3e22f7fb25ba3b000b4ef99"}, - {file = "mypy-1.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e36fb078cce9904c7989b9693e41cb9711e0600139ce3970c6ef814b6ebc2b2"}, - {file = "mypy-1.10.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2b0695d605ddcd3eb2f736cd8b4e388288c21e7de85001e9f85df9187f2b50f9"}, - {file = "mypy-1.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:cd777b780312ddb135bceb9bc8722a73ec95e042f911cc279e2ec3c667076051"}, - {file = "mypy-1.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3be66771aa5c97602f382230165b856c231d1277c511c9a8dd058be4784472e1"}, - {file = "mypy-1.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8b2cbaca148d0754a54d44121b5825ae71868c7592a53b7292eeb0f3fdae95ee"}, - {file = "mypy-1.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ec404a7cbe9fc0e92cb0e67f55ce0c025014e26d33e54d9e506a0f2d07fe5de"}, - {file = "mypy-1.10.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e22e1527dc3d4aa94311d246b59e47f6455b8729f4968765ac1eacf9a4760bc7"}, - {file = "mypy-1.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:a87dbfa85971e8d59c9cc1fcf534efe664d8949e4c0b6b44e8ca548e746a8d53"}, - {file = "mypy-1.10.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a781f6ad4bab20eef8b65174a57e5203f4be627b46291f4589879bf4e257b97b"}, - {file = "mypy-1.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b808e12113505b97d9023b0b5e0c0705a90571c6feefc6f215c1df9381256e30"}, - {file = "mypy-1.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f55583b12156c399dce2df7d16f8a5095291354f1e839c252ec6c0611e86e2e"}, - {file = "mypy-1.10.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4cf18f9d0efa1b16478c4c129eabec36148032575391095f73cae2e722fcf9d5"}, - {file = "mypy-1.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:bc6ac273b23c6b82da3bb25f4136c4fd42665f17f2cd850771cb600bdd2ebeda"}, - {file = "mypy-1.10.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9fd50226364cd2737351c79807775136b0abe084433b55b2e29181a4c3c878c0"}, - {file = "mypy-1.10.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f90cff89eea89273727d8783fef5d4a934be2fdca11b47def50cf5d311aff727"}, - {file = "mypy-1.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fcfc70599efde5c67862a07a1aaf50e55bce629ace26bb19dc17cece5dd31ca4"}, - {file = "mypy-1.10.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:075cbf81f3e134eadaf247de187bd604748171d6b79736fa9b6c9685b4083061"}, - {file = "mypy-1.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:3f298531bca95ff615b6e9f2fc0333aae27fa48052903a0ac90215021cdcfa4f"}, - {file = "mypy-1.10.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fa7ef5244615a2523b56c034becde4e9e3f9b034854c93639adb667ec9ec2976"}, - {file = "mypy-1.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3236a4c8f535a0631f85f5fcdffba71c7feeef76a6002fcba7c1a8e57c8be1ec"}, - {file = "mypy-1.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a2b5cdbb5dd35aa08ea9114436e0d79aceb2f38e32c21684dcf8e24e1e92821"}, - {file = "mypy-1.10.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:92f93b21c0fe73dc00abf91022234c79d793318b8a96faac147cd579c1671746"}, - {file = "mypy-1.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:28d0e038361b45f099cc086d9dd99c15ff14d0188f44ac883010e172ce86c38a"}, - {file = "mypy-1.10.0-py3-none-any.whl", hash = "sha256:f8c083976eb530019175aabadb60921e73b4f45736760826aa1689dda8208aee"}, - {file = "mypy-1.10.0.tar.gz", hash = "sha256:3d087fcbec056c4ee34974da493a826ce316947485cef3901f511848e687c131"}, -] - -[package.dependencies] -mypy-extensions = ">=1.0.0" -tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} -typing-extensions = ">=4.1.0" - -[package.extras] -dmypy = ["psutil (>=4.0)"] -install-types = ["pip"] -mypyc = ["setuptools (>=50)"] -reports = ["lxml"] - -[[package]] -name = "mypy-extensions" -version = "1.0.0" -description = "Type system extensions for programs checked with the mypy type checker." -optional = false -python-versions = ">=3.5" -files = [ - {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, - {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, -] - -[[package]] -name = "nbclient" -version = "0.10.0" -description = "A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor." -optional = false -python-versions = ">=3.8.0" -files = [ - {file = "nbclient-0.10.0-py3-none-any.whl", hash = "sha256:f13e3529332a1f1f81d82a53210322476a168bb7090a0289c795fe9cc11c9d3f"}, - {file = "nbclient-0.10.0.tar.gz", hash = "sha256:4b3f1b7dba531e498449c4db4f53da339c91d449dc11e9af3a43b4eb5c5abb09"}, -] - -[package.dependencies] -jupyter-client = ">=6.1.12" -jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" -nbformat = ">=5.1" -traitlets = ">=5.4" - -[package.extras] -dev = ["pre-commit"] -docs = ["autodoc-traits", "mock", "moto", "myst-parser", "nbclient[test]", "sphinx (>=1.7)", "sphinx-book-theme", "sphinxcontrib-spelling"] -test = ["flaky", "ipykernel (>=6.19.3)", "ipython", "ipywidgets", "nbconvert (>=7.0.0)", "pytest (>=7.0,<8)", "pytest-asyncio", "pytest-cov (>=4.0)", "testpath", "xmltodict"] - -[[package]] -name = "nbconvert" -version = "7.16.4" -description = "Converting Jupyter Notebooks (.ipynb files) to other formats. Output formats include asciidoc, html, latex, markdown, pdf, py, rst, script. nbconvert can be used both as a Python library (`import nbconvert`) or as a command line tool (invoked as `jupyter nbconvert ...`)." -optional = false -python-versions = ">=3.8" -files = [ - {file = "nbconvert-7.16.4-py3-none-any.whl", hash = "sha256:05873c620fe520b6322bf8a5ad562692343fe3452abda5765c7a34b7d1aa3eb3"}, - {file = "nbconvert-7.16.4.tar.gz", hash = "sha256:86ca91ba266b0a448dc96fa6c5b9d98affabde2867b363258703536807f9f7f4"}, -] - -[package.dependencies] -beautifulsoup4 = "*" -bleach = "!=5.0.0" -defusedxml = "*" -importlib-metadata = {version = ">=3.6", markers = "python_version < \"3.10\""} -jinja2 = ">=3.0" -jupyter-core = ">=4.7" -jupyterlab-pygments = "*" -markupsafe = ">=2.0" -mistune = ">=2.0.3,<4" -nbclient = ">=0.5.0" -nbformat = ">=5.7" -packaging = "*" -pandocfilters = ">=1.4.1" -pygments = ">=2.4.1" -tinycss2 = "*" -traitlets = ">=5.1" - -[package.extras] -all = ["flaky", "ipykernel", "ipython", "ipywidgets (>=7.5)", "myst-parser", "nbsphinx (>=0.2.12)", "playwright", "pydata-sphinx-theme", "pyqtwebengine (>=5.15)", "pytest (>=7)", "sphinx (==5.0.2)", "sphinxcontrib-spelling", "tornado (>=6.1)"] -docs = ["ipykernel", "ipython", "myst-parser", "nbsphinx (>=0.2.12)", "pydata-sphinx-theme", "sphinx (==5.0.2)", "sphinxcontrib-spelling"] -qtpdf = ["pyqtwebengine (>=5.15)"] -qtpng = ["pyqtwebengine (>=5.15)"] -serve = ["tornado (>=6.1)"] -test = ["flaky", "ipykernel", "ipywidgets (>=7.5)", "pytest (>=7)"] -webpdf = ["playwright"] - -[[package]] -name = "nbformat" -version = "5.10.4" -description = "The Jupyter Notebook format" -optional = false -python-versions = ">=3.8" -files = [ - {file = "nbformat-5.10.4-py3-none-any.whl", hash = "sha256:3b48d6c8fbca4b299bf3982ea7db1af21580e4fec269ad087b9e81588891200b"}, - {file = "nbformat-5.10.4.tar.gz", hash = "sha256:322168b14f937a5d11362988ecac2a4952d3d8e3a2cbeb2319584631226d5b3a"}, -] - -[package.dependencies] -fastjsonschema = ">=2.15" -jsonschema = ">=2.6" -jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" -traitlets = ">=5.1" - -[package.extras] -docs = ["myst-parser", "pydata-sphinx-theme", "sphinx", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] -test = ["pep440", "pre-commit", "pytest", "testpath"] - -[[package]] -name = "nest-asyncio" -version = "1.6.0" -description = "Patch asyncio to allow nested event loops" -optional = false -python-versions = ">=3.5" -files = [ - {file = "nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c"}, - {file = "nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe"}, -] - -[[package]] -name = "notebook" -version = "7.1.3" -description = "Jupyter Notebook - A web-based notebook environment for interactive computing" -optional = false -python-versions = ">=3.8" -files = [ - {file = "notebook-7.1.3-py3-none-any.whl", hash = "sha256:919b911e59f41f6e3857ce93c9d93535ba66bb090059712770e5968c07e1004d"}, - {file = "notebook-7.1.3.tar.gz", hash = "sha256:41fcebff44cf7bb9377180808bcbae066629b55d8c7722f1ebbe75ca44f9cfc1"}, -] - -[package.dependencies] -jupyter-server = ">=2.4.0,<3" -jupyterlab = ">=4.1.1,<4.2" -jupyterlab-server = ">=2.22.1,<3" -notebook-shim = ">=0.2,<0.3" -tornado = ">=6.2.0" - -[package.extras] -dev = ["hatch", "pre-commit"] -docs = ["myst-parser", "nbsphinx", "pydata-sphinx-theme", "sphinx (>=1.3.6)", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] -test = ["importlib-resources (>=5.0)", "ipykernel", "jupyter-server[test] (>=2.4.0,<3)", "jupyterlab-server[test] (>=2.22.1,<3)", "nbval", "pytest (>=7.0)", "pytest-console-scripts", "pytest-timeout", "pytest-tornasync", "requests"] - -[[package]] -name = "notebook-shim" -version = "0.2.4" -description = "A shim layer for notebook traits and config" -optional = false -python-versions = ">=3.7" -files = [ - {file = "notebook_shim-0.2.4-py3-none-any.whl", hash = "sha256:411a5be4e9dc882a074ccbcae671eda64cceb068767e9a3419096986560e1cef"}, - {file = "notebook_shim-0.2.4.tar.gz", hash = "sha256:b4b2cfa1b65d98307ca24361f5b30fe785b53c3fd07b7a47e89acb5e6ac638cb"}, -] - -[package.dependencies] -jupyter-server = ">=1.8,<3" - -[package.extras] -test = ["pytest", "pytest-console-scripts", "pytest-jupyter", "pytest-tornasync"] - -[[package]] -name = "numpy" -version = "1.26.4" -description = "Fundamental package for array computing in Python" -optional = false -python-versions = ">=3.9" -files = [ - {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]] -name = "opt-einsum" -version = "3.3.0" -description = "Optimizing numpys einsum function" -optional = false -python-versions = ">=3.5" -files = [ - {file = "opt_einsum-3.3.0-py3-none-any.whl", hash = "sha256:2455e59e3947d3c275477df7f5205b30635e266fe6dc300e3d9f9646bfcea147"}, - {file = "opt_einsum-3.3.0.tar.gz", hash = "sha256:59f6475f77bbc37dcf7cd748519c0ec60722e91e63ca114e68821c0c54a46549"}, -] - -[package.dependencies] -numpy = ">=1.7" - -[package.extras] -docs = ["numpydoc", "sphinx (==1.2.3)", "sphinx-rtd-theme", "sphinxcontrib-napoleon"] -tests = ["pytest", "pytest-cov", "pytest-pep8"] - -[[package]] -name = "overrides" -version = "7.7.0" -description = "A decorator to automatically detect mismatch when overriding a method." -optional = false -python-versions = ">=3.6" -files = [ - {file = "overrides-7.7.0-py3-none-any.whl", hash = "sha256:c7ed9d062f78b8e4c1a7b70bd8796b35ead4d9f510227ef9c5dc7626c60d7e49"}, - {file = "overrides-7.7.0.tar.gz", hash = "sha256:55158fa3d93b98cc75299b1e67078ad9003ca27945c76162c1c0766d6f91820a"}, -] - -[[package]] -name = "packaging" -version = "24.0" -description = "Core utilities for Python packages" -optional = false -python-versions = ">=3.7" -files = [ - {file = "packaging-24.0-py3-none-any.whl", hash = "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5"}, - {file = "packaging-24.0.tar.gz", hash = "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9"}, -] - -[[package]] -name = "pandocfilters" -version = "1.5.1" -description = "Utilities for writing pandoc filters in python" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "pandocfilters-1.5.1-py2.py3-none-any.whl", hash = "sha256:93be382804a9cdb0a7267585f157e5d1731bbe5545a85b268d6f5fe6232de2bc"}, - {file = "pandocfilters-1.5.1.tar.gz", hash = "sha256:002b4a555ee4ebc03f8b66307e287fa492e4a77b4ea14d3f934328297bb4939e"}, -] - -[[package]] -name = "parso" -version = "0.8.4" -description = "A Python Parser" -optional = false -python-versions = ">=3.6" -files = [ - {file = "parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18"}, - {file = "parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d"}, -] - -[package.extras] -qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] -testing = ["docopt", "pytest"] - -[[package]] -name = "pastel" -version = "0.2.1" -description = "Bring colors to your terminal." -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "pastel-0.2.1-py2.py3-none-any.whl", hash = "sha256:4349225fcdf6c2bb34d483e523475de5bb04a5c10ef711263452cb37d7dd4364"}, - {file = "pastel-0.2.1.tar.gz", hash = "sha256:e6581ac04e973cac858828c6202c1e1e81fee1dc7de7683f3e1ffe0bfd8a573d"}, -] - -[[package]] -name = "pathspec" -version = "0.12.1" -description = "Utility library for gitignore style pattern matching of file paths." -optional = false -python-versions = ">=3.8" -files = [ - {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, - {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 = "platformdirs" -version = "4.2.1" -description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." -optional = false -python-versions = ">=3.8" -files = [ - {file = "platformdirs-4.2.1-py3-none-any.whl", hash = "sha256:17d5a1161b3fd67b390023cb2d3b026bbd40abde6fdb052dfbd3a29c3ba22ee1"}, - {file = "platformdirs-4.2.1.tar.gz", hash = "sha256:031cd18d4ec63ec53e82dceaac0417d218a6863f7745dfcc9efe7793b7039bdf"}, -] - -[package.extras] -docs = ["furo (>=2023.9.10)", "proselint (>=0.13)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"] -type = ["mypy (>=1.8)"] - -[[package]] -name = "poethepoet" -version = "0.26.1" -description = "A task runner that works well with poetry." -optional = false -python-versions = ">=3.8" -files = [ - {file = "poethepoet-0.26.1-py3-none-any.whl", hash = "sha256:aa43b443fec5d17d7e76771cccd484e5285805301721a74f059c483ad3276edd"}, - {file = "poethepoet-0.26.1.tar.gz", hash = "sha256:aaad8541f6072617a60bcff2562d00779b58b353bd0f1847b06d8d0f2b6dc192"}, -] - -[package.dependencies] -pastel = ">=0.2.1,<0.3.0" -tomli = ">=1.2.2" - -[package.extras] -poetry-plugin = ["poetry (>=1.0,<2.0)"] - -[[package]] -name = "prometheus-client" -version = "0.20.0" -description = "Python client for the Prometheus monitoring system." -optional = false -python-versions = ">=3.8" -files = [ - {file = "prometheus_client-0.20.0-py3-none-any.whl", hash = "sha256:cde524a85bce83ca359cc837f28b8c0db5cac7aa653a588fd7e84ba061c329e7"}, - {file = "prometheus_client-0.20.0.tar.gz", hash = "sha256:287629d00b147a32dcb2be0b9df905da599b2d82f80377083ec8463309a4bb89"}, -] - -[package.extras] -twisted = ["twisted"] - -[[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 = "psutil" -version = "5.9.8" -description = "Cross-platform lib for process and system monitoring in Python." -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" -files = [ - {file = "psutil-5.9.8-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:26bd09967ae00920df88e0352a91cff1a78f8d69b3ecabbfe733610c0af486c8"}, - {file = "psutil-5.9.8-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:05806de88103b25903dff19bb6692bd2e714ccf9e668d050d144012055cbca73"}, - {file = "psutil-5.9.8-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:611052c4bc70432ec770d5d54f64206aa7203a101ec273a0cd82418c86503bb7"}, - {file = "psutil-5.9.8-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:50187900d73c1381ba1454cf40308c2bf6f34268518b3f36a9b663ca87e65e36"}, - {file = "psutil-5.9.8-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:02615ed8c5ea222323408ceba16c60e99c3f91639b07da6373fb7e6539abc56d"}, - {file = "psutil-5.9.8-cp27-none-win32.whl", hash = "sha256:36f435891adb138ed3c9e58c6af3e2e6ca9ac2f365efe1f9cfef2794e6c93b4e"}, - {file = "psutil-5.9.8-cp27-none-win_amd64.whl", hash = "sha256:bd1184ceb3f87651a67b2708d4c3338e9b10c5df903f2e3776b62303b26cb631"}, - {file = "psutil-5.9.8-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:aee678c8720623dc456fa20659af736241f575d79429a0e5e9cf88ae0605cc81"}, - {file = "psutil-5.9.8-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8cb6403ce6d8e047495a701dc7c5bd788add903f8986d523e3e20b98b733e421"}, - {file = "psutil-5.9.8-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d06016f7f8625a1825ba3732081d77c94589dca78b7a3fc072194851e88461a4"}, - {file = "psutil-5.9.8-cp36-cp36m-win32.whl", hash = "sha256:7d79560ad97af658a0f6adfef8b834b53f64746d45b403f225b85c5c2c140eee"}, - {file = "psutil-5.9.8-cp36-cp36m-win_amd64.whl", hash = "sha256:27cc40c3493bb10de1be4b3f07cae4c010ce715290a5be22b98493509c6299e2"}, - {file = "psutil-5.9.8-cp37-abi3-win32.whl", hash = "sha256:bc56c2a1b0d15aa3eaa5a60c9f3f8e3e565303b465dbf57a1b730e7a2b9844e0"}, - {file = "psutil-5.9.8-cp37-abi3-win_amd64.whl", hash = "sha256:8db4c1b57507eef143a15a6884ca10f7c73876cdf5d51e713151c1236a0e68cf"}, - {file = "psutil-5.9.8-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:d16bbddf0693323b8c6123dd804100241da461e41d6e332fb0ba6058f630f8c8"}, - {file = "psutil-5.9.8.tar.gz", hash = "sha256:6be126e3225486dff286a8fb9a06246a5253f4c7c53b475ea5f5ac934e64194c"}, -] - -[package.extras] -test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"] - -[[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 = "pycodestyle" -version = "2.11.1" -description = "Python style guide checker" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pycodestyle-2.11.1-py2.py3-none-any.whl", hash = "sha256:44fe31000b2d866f2e41841b18528a505fbd7fef9017b04eff4e2648a0fadc67"}, - {file = "pycodestyle-2.11.1.tar.gz", hash = "sha256:41ba0e7afc9752dfb53ced5489e89f8186be00e599e712660695b7a75ff2663f"}, -] - -[[package]] -name = "pycparser" -version = "2.22" -description = "C parser in Python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, - {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, -] - -[[package]] -name = "pyflakes" -version = "3.2.0" -description = "passive checker of Python programs" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pyflakes-3.2.0-py2.py3-none-any.whl", hash = "sha256:84b5be138a2dfbb40689ca07e2152deb896a65c3a3e24c251c5c62489568074a"}, - {file = "pyflakes-3.2.0.tar.gz", hash = "sha256:1c61603ff154621fb2a9172037d84dca3500def8c8b630657d1701f026f8af3f"}, -] - -[[package]] -name = "pygments" -version = "2.18.0" -description = "Pygments is a syntax highlighting package written in Python." -optional = false -python-versions = ">=3.8" -files = [ - {file = "pygments-2.18.0-py3-none-any.whl", hash = "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a"}, - {file = "pygments-2.18.0.tar.gz", hash = "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199"}, -] - -[package.extras] -windows-terminal = ["colorama (>=0.4.6)"] - -[[package]] -name = "pylint" -version = "3.1.0" -description = "python code static checker" -optional = false -python-versions = ">=3.8.0" -files = [ - {file = "pylint-3.1.0-py3-none-any.whl", hash = "sha256:507a5b60953874766d8a366e8e8c7af63e058b26345cfcb5f91f89d987fd6b74"}, - {file = "pylint-3.1.0.tar.gz", hash = "sha256:6a69beb4a6f63debebaab0a3477ecd0f559aa726af4954fc948c51f7a2549e23"}, -] - -[package.dependencies] -astroid = ">=3.1.0,<=3.2.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\""}, - {version = ">=0.3.7", markers = "python_version >= \"3.12\""}, -] -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 = "python-dateutil" -version = "2.9.0.post0" -description = "Extensions to the standard Python datetime module" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" -files = [ - {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, - {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, -] - -[package.dependencies] -six = ">=1.5" - -[[package]] -name = "python-json-logger" -version = "2.0.7" -description = "A python library adding a json log formatter" -optional = false -python-versions = ">=3.6" -files = [ - {file = "python-json-logger-2.0.7.tar.gz", hash = "sha256:23e7ec02d34237c5aa1e29a070193a4ea87583bb4e7f8fd06d3de8264c4b2e1c"}, - {file = "python_json_logger-2.0.7-py3-none-any.whl", hash = "sha256:f380b826a991ebbe3de4d897aeec42760035ac760345e57b812938dc8b35e2bd"}, -] - -[[package]] -name = "pywin32" -version = "306" -description = "Python for Window Extensions" -optional = false -python-versions = "*" -files = [ - {file = "pywin32-306-cp310-cp310-win32.whl", hash = "sha256:06d3420a5155ba65f0b72f2699b5bacf3109f36acbe8923765c22938a69dfc8d"}, - {file = "pywin32-306-cp310-cp310-win_amd64.whl", hash = "sha256:84f4471dbca1887ea3803d8848a1616429ac94a4a8d05f4bc9c5dcfd42ca99c8"}, - {file = "pywin32-306-cp311-cp311-win32.whl", hash = "sha256:e65028133d15b64d2ed8f06dd9fbc268352478d4f9289e69c190ecd6818b6407"}, - {file = "pywin32-306-cp311-cp311-win_amd64.whl", hash = "sha256:a7639f51c184c0272e93f244eb24dafca9b1855707d94c192d4a0b4c01e1100e"}, - {file = "pywin32-306-cp311-cp311-win_arm64.whl", hash = "sha256:70dba0c913d19f942a2db25217d9a1b726c278f483a919f1abfed79c9cf64d3a"}, - {file = "pywin32-306-cp312-cp312-win32.whl", hash = "sha256:383229d515657f4e3ed1343da8be101000562bf514591ff383ae940cad65458b"}, - {file = "pywin32-306-cp312-cp312-win_amd64.whl", hash = "sha256:37257794c1ad39ee9be652da0462dc2e394c8159dfd913a8a4e8eb6fd346da0e"}, - {file = "pywin32-306-cp312-cp312-win_arm64.whl", hash = "sha256:5821ec52f6d321aa59e2db7e0a35b997de60c201943557d108af9d4ae1ec7040"}, - {file = "pywin32-306-cp37-cp37m-win32.whl", hash = "sha256:1c73ea9a0d2283d889001998059f5eaaba3b6238f767c9cf2833b13e6a685f65"}, - {file = "pywin32-306-cp37-cp37m-win_amd64.whl", hash = "sha256:72c5f621542d7bdd4fdb716227be0dd3f8565c11b280be6315b06ace35487d36"}, - {file = "pywin32-306-cp38-cp38-win32.whl", hash = "sha256:e4c092e2589b5cf0d365849e73e02c391c1349958c5ac3e9d5ccb9a28e017b3a"}, - {file = "pywin32-306-cp38-cp38-win_amd64.whl", hash = "sha256:e8ac1ae3601bee6ca9f7cb4b5363bf1c0badb935ef243c4733ff9a393b1690c0"}, - {file = "pywin32-306-cp39-cp39-win32.whl", hash = "sha256:e25fd5b485b55ac9c057f67d94bc203f3f6595078d1fb3b458c9c28b7153a802"}, - {file = "pywin32-306-cp39-cp39-win_amd64.whl", hash = "sha256:39b61c15272833b5c329a2989999dcae836b1eed650252ab1b7bfbe1d59f30f4"}, -] - -[[package]] -name = "pywinpty" -version = "2.0.13" -description = "Pseudo terminal support for Windows from Python." -optional = false -python-versions = ">=3.8" -files = [ - {file = "pywinpty-2.0.13-cp310-none-win_amd64.whl", hash = "sha256:697bff211fb5a6508fee2dc6ff174ce03f34a9a233df9d8b5fe9c8ce4d5eaf56"}, - {file = "pywinpty-2.0.13-cp311-none-win_amd64.whl", hash = "sha256:b96fb14698db1284db84ca38c79f15b4cfdc3172065b5137383910567591fa99"}, - {file = "pywinpty-2.0.13-cp312-none-win_amd64.whl", hash = "sha256:2fd876b82ca750bb1333236ce98488c1be96b08f4f7647cfdf4129dfad83c2d4"}, - {file = "pywinpty-2.0.13-cp38-none-win_amd64.whl", hash = "sha256:61d420c2116c0212808d31625611b51caf621fe67f8a6377e2e8b617ea1c1f7d"}, - {file = "pywinpty-2.0.13-cp39-none-win_amd64.whl", hash = "sha256:71cb613a9ee24174730ac7ae439fd179ca34ccb8c5349e8d7b72ab5dea2c6f4b"}, - {file = "pywinpty-2.0.13.tar.gz", hash = "sha256:c34e32351a3313ddd0d7da23d27f835c860d32fe4ac814d372a3ea9594f41dde"}, -] - -[[package]] -name = "pyyaml" -version = "6.0.1" -description = "YAML parser and emitter for Python" -optional = false -python-versions = ">=3.6" -files = [ - {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, - {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, - {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, - {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, - {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, - {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, - {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, - {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, - {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, - {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, - {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, - {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, - {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, - {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, - {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, - {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, - {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, - {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, - {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, - {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, - {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, - {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, - {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, - {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, - {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, - {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, - {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, - {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, - {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, -] - -[[package]] -name = "pyzmq" -version = "26.0.3" -description = "Python bindings for 0MQ" -optional = false -python-versions = ">=3.7" -files = [ - {file = "pyzmq-26.0.3-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:44dd6fc3034f1eaa72ece33588867df9e006a7303725a12d64c3dff92330f625"}, - {file = "pyzmq-26.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:acb704195a71ac5ea5ecf2811c9ee19ecdc62b91878528302dd0be1b9451cc90"}, - {file = "pyzmq-26.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5dbb9c997932473a27afa93954bb77a9f9b786b4ccf718d903f35da3232317de"}, - {file = "pyzmq-26.0.3-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6bcb34f869d431799c3ee7d516554797f7760cb2198ecaa89c3f176f72d062be"}, - {file = "pyzmq-26.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38ece17ec5f20d7d9b442e5174ae9f020365d01ba7c112205a4d59cf19dc38ee"}, - {file = "pyzmq-26.0.3-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:ba6e5e6588e49139a0979d03a7deb9c734bde647b9a8808f26acf9c547cab1bf"}, - {file = "pyzmq-26.0.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3bf8b000a4e2967e6dfdd8656cd0757d18c7e5ce3d16339e550bd462f4857e59"}, - {file = "pyzmq-26.0.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:2136f64fbb86451dbbf70223635a468272dd20075f988a102bf8a3f194a411dc"}, - {file = "pyzmq-26.0.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e8918973fbd34e7814f59143c5f600ecd38b8038161239fd1a3d33d5817a38b8"}, - {file = "pyzmq-26.0.3-cp310-cp310-win32.whl", hash = "sha256:0aaf982e68a7ac284377d051c742610220fd06d330dcd4c4dbb4cdd77c22a537"}, - {file = "pyzmq-26.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:f1a9b7d00fdf60b4039f4455afd031fe85ee8305b019334b72dcf73c567edc47"}, - {file = "pyzmq-26.0.3-cp310-cp310-win_arm64.whl", hash = "sha256:80b12f25d805a919d53efc0a5ad7c0c0326f13b4eae981a5d7b7cc343318ebb7"}, - {file = "pyzmq-26.0.3-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:a72a84570f84c374b4c287183debc776dc319d3e8ce6b6a0041ce2e400de3f32"}, - {file = "pyzmq-26.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7ca684ee649b55fd8f378127ac8462fb6c85f251c2fb027eb3c887e8ee347bcd"}, - {file = "pyzmq-26.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e222562dc0f38571c8b1ffdae9d7adb866363134299264a1958d077800b193b7"}, - {file = "pyzmq-26.0.3-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f17cde1db0754c35a91ac00b22b25c11da6eec5746431d6e5092f0cd31a3fea9"}, - {file = "pyzmq-26.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b7c0c0b3244bb2275abe255d4a30c050d541c6cb18b870975553f1fb6f37527"}, - {file = "pyzmq-26.0.3-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:ac97a21de3712afe6a6c071abfad40a6224fd14fa6ff0ff8d0c6e6cd4e2f807a"}, - {file = "pyzmq-26.0.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:88b88282e55fa39dd556d7fc04160bcf39dea015f78e0cecec8ff4f06c1fc2b5"}, - {file = "pyzmq-26.0.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:72b67f966b57dbd18dcc7efbc1c7fc9f5f983e572db1877081f075004614fcdd"}, - {file = "pyzmq-26.0.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f4b6cecbbf3b7380f3b61de3a7b93cb721125dc125c854c14ddc91225ba52f83"}, - {file = "pyzmq-26.0.3-cp311-cp311-win32.whl", hash = "sha256:eed56b6a39216d31ff8cd2f1d048b5bf1700e4b32a01b14379c3b6dde9ce3aa3"}, - {file = "pyzmq-26.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:3191d312c73e3cfd0f0afdf51df8405aafeb0bad71e7ed8f68b24b63c4f36500"}, - {file = "pyzmq-26.0.3-cp311-cp311-win_arm64.whl", hash = "sha256:b6907da3017ef55139cf0e417c5123a84c7332520e73a6902ff1f79046cd3b94"}, - {file = "pyzmq-26.0.3-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:068ca17214038ae986d68f4a7021f97e187ed278ab6dccb79f837d765a54d753"}, - {file = "pyzmq-26.0.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:7821d44fe07335bea256b9f1f41474a642ca55fa671dfd9f00af8d68a920c2d4"}, - {file = "pyzmq-26.0.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eeb438a26d87c123bb318e5f2b3d86a36060b01f22fbdffd8cf247d52f7c9a2b"}, - {file = "pyzmq-26.0.3-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:69ea9d6d9baa25a4dc9cef5e2b77b8537827b122214f210dd925132e34ae9b12"}, - {file = "pyzmq-26.0.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7daa3e1369355766dea11f1d8ef829905c3b9da886ea3152788dc25ee6079e02"}, - {file = "pyzmq-26.0.3-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:6ca7a9a06b52d0e38ccf6bca1aeff7be178917893f3883f37b75589d42c4ac20"}, - {file = "pyzmq-26.0.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1b7d0e124948daa4d9686d421ef5087c0516bc6179fdcf8828b8444f8e461a77"}, - {file = "pyzmq-26.0.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:e746524418b70f38550f2190eeee834db8850088c834d4c8406fbb9bc1ae10b2"}, - {file = "pyzmq-26.0.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:6b3146f9ae6af82c47a5282ac8803523d381b3b21caeae0327ed2f7ecb718798"}, - {file = "pyzmq-26.0.3-cp312-cp312-win32.whl", hash = "sha256:2b291d1230845871c00c8462c50565a9cd6026fe1228e77ca934470bb7d70ea0"}, - {file = "pyzmq-26.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:926838a535c2c1ea21c903f909a9a54e675c2126728c21381a94ddf37c3cbddf"}, - {file = "pyzmq-26.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:5bf6c237f8c681dfb91b17f8435b2735951f0d1fad10cc5dfd96db110243370b"}, - {file = "pyzmq-26.0.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0c0991f5a96a8e620f7691e61178cd8f457b49e17b7d9cfa2067e2a0a89fc1d5"}, - {file = "pyzmq-26.0.3-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:dbf012d8fcb9f2cf0643b65df3b355fdd74fc0035d70bb5c845e9e30a3a4654b"}, - {file = "pyzmq-26.0.3-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:01fbfbeb8249a68d257f601deb50c70c929dc2dfe683b754659569e502fbd3aa"}, - {file = "pyzmq-26.0.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c8eb19abe87029c18f226d42b8a2c9efdd139d08f8bf6e085dd9075446db450"}, - {file = "pyzmq-26.0.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:5344b896e79800af86ad643408ca9aa303a017f6ebff8cee5a3163c1e9aec987"}, - {file = "pyzmq-26.0.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:204e0f176fd1d067671157d049466869b3ae1fc51e354708b0dc41cf94e23a3a"}, - {file = "pyzmq-26.0.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:a42db008d58530efa3b881eeee4991146de0b790e095f7ae43ba5cc612decbc5"}, - {file = "pyzmq-26.0.3-cp37-cp37m-win32.whl", hash = "sha256:8d7a498671ca87e32b54cb47c82a92b40130a26c5197d392720a1bce1b3c77cf"}, - {file = "pyzmq-26.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:3b4032a96410bdc760061b14ed6a33613ffb7f702181ba999df5d16fb96ba16a"}, - {file = "pyzmq-26.0.3-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:2cc4e280098c1b192c42a849de8de2c8e0f3a84086a76ec5b07bfee29bda7d18"}, - {file = "pyzmq-26.0.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5bde86a2ed3ce587fa2b207424ce15b9a83a9fa14422dcc1c5356a13aed3df9d"}, - {file = "pyzmq-26.0.3-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:34106f68e20e6ff253c9f596ea50397dbd8699828d55e8fa18bd4323d8d966e6"}, - {file = "pyzmq-26.0.3-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ebbbd0e728af5db9b04e56389e2299a57ea8b9dd15c9759153ee2455b32be6ad"}, - {file = "pyzmq-26.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f6b1d1c631e5940cac5a0b22c5379c86e8df6a4ec277c7a856b714021ab6cfad"}, - {file = "pyzmq-26.0.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e891ce81edd463b3b4c3b885c5603c00141151dd9c6936d98a680c8c72fe5c67"}, - {file = "pyzmq-26.0.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:9b273ecfbc590a1b98f014ae41e5cf723932f3b53ba9367cfb676f838038b32c"}, - {file = "pyzmq-26.0.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b32bff85fb02a75ea0b68f21e2412255b5731f3f389ed9aecc13a6752f58ac97"}, - {file = "pyzmq-26.0.3-cp38-cp38-win32.whl", hash = "sha256:f6c21c00478a7bea93caaaef9e7629145d4153b15a8653e8bb4609d4bc70dbfc"}, - {file = "pyzmq-26.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:3401613148d93ef0fd9aabdbddb212de3db7a4475367f49f590c837355343972"}, - {file = "pyzmq-26.0.3-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:2ed8357f4c6e0daa4f3baf31832df8a33334e0fe5b020a61bc8b345a3db7a606"}, - {file = "pyzmq-26.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c1c8f2a2ca45292084c75bb6d3a25545cff0ed931ed228d3a1810ae3758f975f"}, - {file = "pyzmq-26.0.3-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:b63731993cdddcc8e087c64e9cf003f909262b359110070183d7f3025d1c56b5"}, - {file = "pyzmq-26.0.3-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b3cd31f859b662ac5d7f4226ec7d8bd60384fa037fc02aee6ff0b53ba29a3ba8"}, - {file = "pyzmq-26.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:115f8359402fa527cf47708d6f8a0f8234f0e9ca0cab7c18c9c189c194dbf620"}, - {file = "pyzmq-26.0.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:715bdf952b9533ba13dfcf1f431a8f49e63cecc31d91d007bc1deb914f47d0e4"}, - {file = "pyzmq-26.0.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:e1258c639e00bf5e8a522fec6c3eaa3e30cf1c23a2f21a586be7e04d50c9acab"}, - {file = "pyzmq-26.0.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:15c59e780be8f30a60816a9adab900c12a58d79c1ac742b4a8df044ab2a6d920"}, - {file = "pyzmq-26.0.3-cp39-cp39-win32.whl", hash = "sha256:d0cdde3c78d8ab5b46595054e5def32a755fc028685add5ddc7403e9f6de9879"}, - {file = "pyzmq-26.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:ce828058d482ef860746bf532822842e0ff484e27f540ef5c813d516dd8896d2"}, - {file = "pyzmq-26.0.3-cp39-cp39-win_arm64.whl", hash = "sha256:788f15721c64109cf720791714dc14afd0f449d63f3a5487724f024345067381"}, - {file = "pyzmq-26.0.3-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2c18645ef6294d99b256806e34653e86236eb266278c8ec8112622b61db255de"}, - {file = "pyzmq-26.0.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7e6bc96ebe49604df3ec2c6389cc3876cabe475e6bfc84ced1bf4e630662cb35"}, - {file = "pyzmq-26.0.3-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:971e8990c5cc4ddcff26e149398fc7b0f6a042306e82500f5e8db3b10ce69f84"}, - {file = "pyzmq-26.0.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8416c23161abd94cc7da80c734ad7c9f5dbebdadfdaa77dad78244457448223"}, - {file = "pyzmq-26.0.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:082a2988364b60bb5de809373098361cf1dbb239623e39e46cb18bc035ed9c0c"}, - {file = "pyzmq-26.0.3-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d57dfbf9737763b3a60d26e6800e02e04284926329aee8fb01049635e957fe81"}, - {file = "pyzmq-26.0.3-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:77a85dca4c2430ac04dc2a2185c2deb3858a34fe7f403d0a946fa56970cf60a1"}, - {file = "pyzmq-26.0.3-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4c82a6d952a1d555bf4be42b6532927d2a5686dd3c3e280e5f63225ab47ac1f5"}, - {file = "pyzmq-26.0.3-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4496b1282c70c442809fc1b151977c3d967bfb33e4e17cedbf226d97de18f709"}, - {file = "pyzmq-26.0.3-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:e4946d6bdb7ba972dfda282f9127e5756d4f299028b1566d1245fa0d438847e6"}, - {file = "pyzmq-26.0.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:03c0ae165e700364b266876d712acb1ac02693acd920afa67da2ebb91a0b3c09"}, - {file = "pyzmq-26.0.3-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:3e3070e680f79887d60feeda051a58d0ac36622e1759f305a41059eff62c6da7"}, - {file = "pyzmq-26.0.3-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6ca08b840fe95d1c2bd9ab92dac5685f949fc6f9ae820ec16193e5ddf603c3b2"}, - {file = "pyzmq-26.0.3-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e76654e9dbfb835b3518f9938e565c7806976c07b37c33526b574cc1a1050480"}, - {file = "pyzmq-26.0.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:871587bdadd1075b112e697173e946a07d722459d20716ceb3d1bd6c64bd08ce"}, - {file = "pyzmq-26.0.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d0a2d1bd63a4ad79483049b26514e70fa618ce6115220da9efdff63688808b17"}, - {file = "pyzmq-26.0.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0270b49b6847f0d106d64b5086e9ad5dc8a902413b5dbbb15d12b60f9c1747a4"}, - {file = "pyzmq-26.0.3-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:703c60b9910488d3d0954ca585c34f541e506a091a41930e663a098d3b794c67"}, - {file = "pyzmq-26.0.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:74423631b6be371edfbf7eabb02ab995c2563fee60a80a30829176842e71722a"}, - {file = "pyzmq-26.0.3-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:4adfbb5451196842a88fda3612e2c0414134874bffb1c2ce83ab4242ec9e027d"}, - {file = "pyzmq-26.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:3516119f4f9b8671083a70b6afaa0a070f5683e431ab3dc26e9215620d7ca1ad"}, - {file = "pyzmq-26.0.3.tar.gz", hash = "sha256:dba7d9f2e047dfa2bca3b01f4f84aa5246725203d6284e3790f2ca15fba6b40a"}, -] - -[package.dependencies] -cffi = {version = "*", markers = "implementation_name == \"pypy\""} - -[[package]] -name = "qtconsole" -version = "5.5.2" -description = "Jupyter Qt console" -optional = false -python-versions = ">=3.8" -files = [ - {file = "qtconsole-5.5.2-py3-none-any.whl", hash = "sha256:42d745f3d05d36240244a04e1e1ec2a86d5d9b6edb16dbdef582ccb629e87e0b"}, - {file = "qtconsole-5.5.2.tar.gz", hash = "sha256:6b5fb11274b297463706af84dcbbd5c92273b1f619e6d25d08874b0a88516989"}, -] - -[package.dependencies] -ipykernel = ">=4.1" -jupyter-client = ">=4.1" -jupyter-core = "*" -packaging = "*" -pygments = "*" -pyzmq = ">=17.1" -qtpy = ">=2.4.0" -traitlets = "<5.2.1 || >5.2.1,<5.2.2 || >5.2.2" - -[package.extras] -doc = ["Sphinx (>=1.3)"] -test = ["flaky", "pytest", "pytest-qt"] - -[[package]] -name = "qtpy" -version = "2.4.1" -description = "Provides an abstraction layer on top of the various Qt bindings (PyQt5/6 and PySide2/6)." -optional = false -python-versions = ">=3.7" -files = [ - {file = "QtPy-2.4.1-py3-none-any.whl", hash = "sha256:1c1d8c4fa2c884ae742b069151b0abe15b3f70491f3972698c683b8e38de839b"}, - {file = "QtPy-2.4.1.tar.gz", hash = "sha256:a5a15ffd519550a1361bdc56ffc07fda56a6af7292f17c7b395d4083af632987"}, -] - -[package.dependencies] -packaging = "*" - -[package.extras] -test = ["pytest (>=6,!=7.0.0,!=7.0.1)", "pytest-cov (>=3.0.0)", "pytest-qt"] - -[[package]] -name = "referencing" -version = "0.35.1" -description = "JSON Referencing + Python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "referencing-0.35.1-py3-none-any.whl", hash = "sha256:eda6d3234d62814d1c64e305c1331c9a3a6132da475ab6382eaa997b21ee75de"}, - {file = "referencing-0.35.1.tar.gz", hash = "sha256:25b42124a6c8b632a425174f24087783efb348a6f1e0008e63cd4466fedf703c"}, -] - -[package.dependencies] -attrs = ">=22.2.0" -rpds-py = ">=0.7.0" - -[[package]] -name = "requests" -version = "2.31.0" -description = "Python HTTP for Humans." -optional = false -python-versions = ">=3.7" -files = [ - {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, - {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, -] - -[package.dependencies] -certifi = ">=2017.4.17" -charset-normalizer = ">=2,<4" -idna = ">=2.5,<4" -urllib3 = ">=1.21.1,<3" - -[package.extras] -socks = ["PySocks (>=1.5.6,!=1.5.7)"] -use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] - -[[package]] -name = "rfc3339-validator" -version = "0.1.4" -description = "A pure python RFC3339 validator" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -files = [ - {file = "rfc3339_validator-0.1.4-py2.py3-none-any.whl", hash = "sha256:24f6ec1eda14ef823da9e36ec7113124b39c04d50a4d3d3a3c2859577e7791fa"}, - {file = "rfc3339_validator-0.1.4.tar.gz", hash = "sha256:138a2abdf93304ad60530167e51d2dfb9549521a836871b88d7f4695d0022f6b"}, -] - -[package.dependencies] -six = "*" - -[[package]] -name = "rfc3986-validator" -version = "0.1.1" -description = "Pure python rfc3986 validator" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -files = [ - {file = "rfc3986_validator-0.1.1-py2.py3-none-any.whl", hash = "sha256:2f235c432ef459970b4306369336b9d5dbdda31b510ca1e327636e01f528bfa9"}, - {file = "rfc3986_validator-0.1.1.tar.gz", hash = "sha256:3d44bde7921b3b9ec3ae4e3adca370438eccebc676456449b145d533b240d055"}, -] - -[[package]] -name = "rpds-py" -version = "0.18.1" -description = "Python bindings to Rust's persistent data structures (rpds)" -optional = false -python-versions = ">=3.8" -files = [ - {file = "rpds_py-0.18.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:d31dea506d718693b6b2cffc0648a8929bdc51c70a311b2770f09611caa10d53"}, - {file = "rpds_py-0.18.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:732672fbc449bab754e0b15356c077cc31566df874964d4801ab14f71951ea80"}, - {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a98a1f0552b5f227a3d6422dbd61bc6f30db170939bd87ed14f3c339aa6c7c9"}, - {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7f1944ce16401aad1e3f7d312247b3d5de7981f634dc9dfe90da72b87d37887d"}, - {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:38e14fb4e370885c4ecd734f093a2225ee52dc384b86fa55fe3f74638b2cfb09"}, - {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08d74b184f9ab6289b87b19fe6a6d1a97fbfea84b8a3e745e87a5de3029bf944"}, - {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d70129cef4a8d979caa37e7fe957202e7eee8ea02c5e16455bc9808a59c6b2f0"}, - {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ce0bb20e3a11bd04461324a6a798af34d503f8d6f1aa3d2aa8901ceaf039176d"}, - {file = "rpds_py-0.18.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:81c5196a790032e0fc2464c0b4ab95f8610f96f1f2fa3d4deacce6a79852da60"}, - {file = "rpds_py-0.18.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:f3027be483868c99b4985fda802a57a67fdf30c5d9a50338d9db646d590198da"}, - {file = "rpds_py-0.18.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d44607f98caa2961bab4fa3c4309724b185b464cdc3ba6f3d7340bac3ec97cc1"}, - {file = "rpds_py-0.18.1-cp310-none-win32.whl", hash = "sha256:c273e795e7a0f1fddd46e1e3cb8be15634c29ae8ff31c196debb620e1edb9333"}, - {file = "rpds_py-0.18.1-cp310-none-win_amd64.whl", hash = "sha256:8352f48d511de5f973e4f2f9412736d7dea76c69faa6d36bcf885b50c758ab9a"}, - {file = "rpds_py-0.18.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:6b5ff7e1d63a8281654b5e2896d7f08799378e594f09cf3674e832ecaf396ce8"}, - {file = "rpds_py-0.18.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8927638a4d4137a289e41d0fd631551e89fa346d6dbcfc31ad627557d03ceb6d"}, - {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:154bf5c93d79558b44e5b50cc354aa0459e518e83677791e6adb0b039b7aa6a7"}, - {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:07f2139741e5deb2c5154a7b9629bc5aa48c766b643c1a6750d16f865a82c5fc"}, - {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8c7672e9fba7425f79019db9945b16e308ed8bc89348c23d955c8c0540da0a07"}, - {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:489bdfe1abd0406eba6b3bb4fdc87c7fa40f1031de073d0cfb744634cc8fa261"}, - {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c20f05e8e3d4fc76875fc9cb8cf24b90a63f5a1b4c5b9273f0e8225e169b100"}, - {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:967342e045564cef76dfcf1edb700b1e20838d83b1aa02ab313e6a497cf923b8"}, - {file = "rpds_py-0.18.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2cc7c1a47f3a63282ab0f422d90ddac4aa3034e39fc66a559ab93041e6505da7"}, - {file = "rpds_py-0.18.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f7afbfee1157e0f9376c00bb232e80a60e59ed716e3211a80cb8506550671e6e"}, - {file = "rpds_py-0.18.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9e6934d70dc50f9f8ea47081ceafdec09245fd9f6032669c3b45705dea096b88"}, - {file = "rpds_py-0.18.1-cp311-none-win32.whl", hash = "sha256:c69882964516dc143083d3795cb508e806b09fc3800fd0d4cddc1df6c36e76bb"}, - {file = "rpds_py-0.18.1-cp311-none-win_amd64.whl", hash = "sha256:70a838f7754483bcdc830444952fd89645569e7452e3226de4a613a4c1793fb2"}, - {file = "rpds_py-0.18.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:3dd3cd86e1db5aadd334e011eba4e29d37a104b403e8ca24dcd6703c68ca55b3"}, - {file = "rpds_py-0.18.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:05f3d615099bd9b13ecf2fc9cf2d839ad3f20239c678f461c753e93755d629ee"}, - {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35b2b771b13eee8729a5049c976197ff58a27a3829c018a04341bcf1ae409b2b"}, - {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ee17cd26b97d537af8f33635ef38be873073d516fd425e80559f4585a7b90c43"}, - {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b646bf655b135ccf4522ed43d6902af37d3f5dbcf0da66c769a2b3938b9d8184"}, - {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:19ba472b9606c36716062c023afa2484d1e4220548751bda14f725a7de17b4f6"}, - {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e30ac5e329098903262dc5bdd7e2086e0256aa762cc8b744f9e7bf2a427d3f8"}, - {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d58ad6317d188c43750cb76e9deacf6051d0f884d87dc6518e0280438648a9ac"}, - {file = "rpds_py-0.18.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e1735502458621921cee039c47318cb90b51d532c2766593be6207eec53e5c4c"}, - {file = "rpds_py-0.18.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:f5bab211605d91db0e2995a17b5c6ee5edec1270e46223e513eaa20da20076ac"}, - {file = "rpds_py-0.18.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2fc24a329a717f9e2448f8cd1f960f9dac4e45b6224d60734edeb67499bab03a"}, - {file = "rpds_py-0.18.1-cp312-none-win32.whl", hash = "sha256:1805d5901779662d599d0e2e4159d8a82c0b05faa86ef9222bf974572286b2b6"}, - {file = "rpds_py-0.18.1-cp312-none-win_amd64.whl", hash = "sha256:720edcb916df872d80f80a1cc5ea9058300b97721efda8651efcd938a9c70a72"}, - {file = "rpds_py-0.18.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:c827576e2fa017a081346dce87d532a5310241648eb3700af9a571a6e9fc7e74"}, - {file = "rpds_py-0.18.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:aa3679e751408d75a0b4d8d26d6647b6d9326f5e35c00a7ccd82b78ef64f65f8"}, - {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0abeee75434e2ee2d142d650d1e54ac1f8b01e6e6abdde8ffd6eeac6e9c38e20"}, - {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed402d6153c5d519a0faf1bb69898e97fb31613b49da27a84a13935ea9164dfc"}, - {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:338dee44b0cef8b70fd2ef54b4e09bb1b97fc6c3a58fea5db6cc083fd9fc2724"}, - {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7750569d9526199c5b97e5a9f8d96a13300950d910cf04a861d96f4273d5b104"}, - {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:607345bd5912aacc0c5a63d45a1f73fef29e697884f7e861094e443187c02be5"}, - {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:207c82978115baa1fd8d706d720b4a4d2b0913df1c78c85ba73fe6c5804505f0"}, - {file = "rpds_py-0.18.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:6d1e42d2735d437e7e80bab4d78eb2e459af48c0a46e686ea35f690b93db792d"}, - {file = "rpds_py-0.18.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:5463c47c08630007dc0fe99fb480ea4f34a89712410592380425a9b4e1611d8e"}, - {file = "rpds_py-0.18.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:06d218939e1bf2ca50e6b0ec700ffe755e5216a8230ab3e87c059ebb4ea06afc"}, - {file = "rpds_py-0.18.1-cp38-none-win32.whl", hash = "sha256:312fe69b4fe1ffbe76520a7676b1e5ac06ddf7826d764cc10265c3b53f96dbe9"}, - {file = "rpds_py-0.18.1-cp38-none-win_amd64.whl", hash = "sha256:9437ca26784120a279f3137ee080b0e717012c42921eb07861b412340f85bae2"}, - {file = "rpds_py-0.18.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:19e515b78c3fc1039dd7da0a33c28c3154458f947f4dc198d3c72db2b6b5dc93"}, - {file = "rpds_py-0.18.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a7b28c5b066bca9a4eb4e2f2663012debe680f097979d880657f00e1c30875a0"}, - {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:673fdbbf668dd958eff750e500495ef3f611e2ecc209464f661bc82e9838991e"}, - {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d960de62227635d2e61068f42a6cb6aae91a7fe00fca0e3aeed17667c8a34611"}, - {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:352a88dc7892f1da66b6027af06a2e7e5d53fe05924cc2cfc56495b586a10b72"}, - {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4e0ee01ad8260184db21468a6e1c37afa0529acc12c3a697ee498d3c2c4dcaf3"}, - {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4c39ad2f512b4041343ea3c7894339e4ca7839ac38ca83d68a832fc8b3748ab"}, - {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:aaa71ee43a703c321906813bb252f69524f02aa05bf4eec85f0c41d5d62d0f4c"}, - {file = "rpds_py-0.18.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:6cd8098517c64a85e790657e7b1e509b9fe07487fd358e19431cb120f7d96338"}, - {file = "rpds_py-0.18.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:4adec039b8e2928983f885c53b7cc4cda8965b62b6596501a0308d2703f8af1b"}, - {file = "rpds_py-0.18.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:32b7daaa3e9389db3695964ce8e566e3413b0c43e3394c05e4b243a4cd7bef26"}, - {file = "rpds_py-0.18.1-cp39-none-win32.whl", hash = "sha256:2625f03b105328729f9450c8badda34d5243231eef6535f80064d57035738360"}, - {file = "rpds_py-0.18.1-cp39-none-win_amd64.whl", hash = "sha256:bf18932d0003c8c4d51a39f244231986ab23ee057d235a12b2684ea26a353590"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:cbfbea39ba64f5e53ae2915de36f130588bba71245b418060ec3330ebf85678e"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:a3d456ff2a6a4d2adcdf3c1c960a36f4fd2fec6e3b4902a42a384d17cf4e7a65"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7700936ef9d006b7ef605dc53aa364da2de5a3aa65516a1f3ce73bf82ecfc7ae"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:51584acc5916212e1bf45edd17f3a6b05fe0cbb40482d25e619f824dccb679de"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:942695a206a58d2575033ff1e42b12b2aece98d6003c6bc739fbf33d1773b12f"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b906b5f58892813e5ba5c6056d6a5ad08f358ba49f046d910ad992196ea61397"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6f8e3fecca256fefc91bb6765a693d96692459d7d4c644660a9fff32e517843"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7732770412bab81c5a9f6d20aeb60ae943a9b36dcd990d876a773526468e7163"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:bd1105b50ede37461c1d51b9698c4f4be6e13e69a908ab7751e3807985fc0346"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:618916f5535784960f3ecf8111581f4ad31d347c3de66d02e728de460a46303c"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:17c6d2155e2423f7e79e3bb18151c686d40db42d8645e7977442170c360194d4"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:6c4c4c3f878df21faf5fac86eda32671c27889e13570645a9eea0a1abdd50922"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:fab6ce90574645a0d6c58890e9bcaac8d94dff54fb51c69e5522a7358b80ab64"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:531796fb842b53f2695e94dc338929e9f9dbf473b64710c28af5a160b2a8927d"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:740884bc62a5e2bbb31e584f5d23b32320fd75d79f916f15a788d527a5e83644"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:998125738de0158f088aef3cb264a34251908dd2e5d9966774fdab7402edfab7"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e2be6e9dd4111d5b31ba3b74d17da54a8319d8168890fbaea4b9e5c3de630ae5"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d0cee71bc618cd93716f3c1bf56653740d2d13ddbd47673efa8bf41435a60daa"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2c3caec4ec5cd1d18e5dd6ae5194d24ed12785212a90b37f5f7f06b8bedd7139"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:27bba383e8c5231cd559affe169ca0b96ec78d39909ffd817f28b166d7ddd4d8"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:a888e8bdb45916234b99da2d859566f1e8a1d2275a801bb8e4a9644e3c7e7909"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:6031b25fb1b06327b43d841f33842b383beba399884f8228a6bb3df3088485ff"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:48c2faaa8adfacefcbfdb5f2e2e7bdad081e5ace8d182e5f4ade971f128e6bb3"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:d85164315bd68c0806768dc6bb0429c6f95c354f87485ee3593c4f6b14def2bd"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6afd80f6c79893cfc0574956f78a0add8c76e3696f2d6a15bca2c66c415cf2d4"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fa242ac1ff583e4ec7771141606aafc92b361cd90a05c30d93e343a0c2d82a89"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d21be4770ff4e08698e1e8e0bce06edb6ea0626e7c8f560bc08222880aca6a6f"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c45a639e93a0c5d4b788b2613bd637468edd62f8f95ebc6fcc303d58ab3f0a8"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:910e71711d1055b2768181efa0a17537b2622afeb0424116619817007f8a2b10"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b9bb1f182a97880f6078283b3505a707057c42bf55d8fca604f70dedfdc0772a"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:1d54f74f40b1f7aaa595a02ff42ef38ca654b1469bef7d52867da474243cc633"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:8d2e182c9ee01135e11e9676e9a62dfad791a7a467738f06726872374a83db49"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:636a15acc588f70fda1661234761f9ed9ad79ebed3f2125d44be0862708b666e"}, - {file = "rpds_py-0.18.1.tar.gz", hash = "sha256:dc48b479d540770c811fbd1eb9ba2bb66951863e448efec2e2c102625328e92f"}, -] - -[[package]] -name = "scipy" -version = "1.13.0" -description = "Fundamental algorithms for scientific computing in Python" -optional = false -python-versions = ">=3.9" -files = [ - {file = "scipy-1.13.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ba419578ab343a4e0a77c0ef82f088238a93eef141b2b8017e46149776dfad4d"}, - {file = "scipy-1.13.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:22789b56a999265431c417d462e5b7f2b487e831ca7bef5edeb56efe4c93f86e"}, - {file = "scipy-1.13.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:05f1432ba070e90d42d7fd836462c50bf98bd08bed0aa616c359eed8a04e3922"}, - {file = "scipy-1.13.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8434f6f3fa49f631fae84afee424e2483289dfc30a47755b4b4e6b07b2633a4"}, - {file = "scipy-1.13.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:dcbb9ea49b0167de4167c40eeee6e167caeef11effb0670b554d10b1e693a8b9"}, - {file = "scipy-1.13.0-cp310-cp310-win_amd64.whl", hash = "sha256:1d2f7bb14c178f8b13ebae93f67e42b0a6b0fc50eba1cd8021c9b6e08e8fb1cd"}, - {file = "scipy-1.13.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0fbcf8abaf5aa2dc8d6400566c1a727aed338b5fe880cde64907596a89d576fa"}, - {file = "scipy-1.13.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:5e4a756355522eb60fcd61f8372ac2549073c8788f6114449b37e9e8104f15a5"}, - {file = "scipy-1.13.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5acd8e1dbd8dbe38d0004b1497019b2dbbc3d70691e65d69615f8a7292865d7"}, - {file = "scipy-1.13.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ff7dad5d24a8045d836671e082a490848e8639cabb3dbdacb29f943a678683d"}, - {file = "scipy-1.13.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4dca18c3ffee287ddd3bc8f1dabaf45f5305c5afc9f8ab9cbfab855e70b2df5c"}, - {file = "scipy-1.13.0-cp311-cp311-win_amd64.whl", hash = "sha256:a2f471de4d01200718b2b8927f7d76b5d9bde18047ea0fa8bd15c5ba3f26a1d6"}, - {file = "scipy-1.13.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d0de696f589681c2802f9090fff730c218f7c51ff49bf252b6a97ec4a5d19e8b"}, - {file = "scipy-1.13.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:b2a3ff461ec4756b7e8e42e1c681077349a038f0686132d623fa404c0bee2551"}, - {file = "scipy-1.13.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6bf9fe63e7a4bf01d3645b13ff2aa6dea023d38993f42aaac81a18b1bda7a82a"}, - {file = "scipy-1.13.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e7626dfd91cdea5714f343ce1176b6c4745155d234f1033584154f60ef1ff42"}, - {file = "scipy-1.13.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:109d391d720fcebf2fbe008621952b08e52907cf4c8c7efc7376822151820820"}, - {file = "scipy-1.13.0-cp312-cp312-win_amd64.whl", hash = "sha256:8930ae3ea371d6b91c203b1032b9600d69c568e537b7988a3073dfe4d4774f21"}, - {file = "scipy-1.13.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5407708195cb38d70fd2d6bb04b1b9dd5c92297d86e9f9daae1576bd9e06f602"}, - {file = "scipy-1.13.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:ac38c4c92951ac0f729c4c48c9e13eb3675d9986cc0c83943784d7390d540c78"}, - {file = "scipy-1.13.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09c74543c4fbeb67af6ce457f6a6a28e5d3739a87f62412e4a16e46f164f0ae5"}, - {file = "scipy-1.13.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28e286bf9ac422d6beb559bc61312c348ca9b0f0dae0d7c5afde7f722d6ea13d"}, - {file = "scipy-1.13.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:33fde20efc380bd23a78a4d26d59fc8704e9b5fd9b08841693eb46716ba13d86"}, - {file = "scipy-1.13.0-cp39-cp39-win_amd64.whl", hash = "sha256:45c08bec71d3546d606989ba6e7daa6f0992918171e2a6f7fbedfa7361c2de1e"}, - {file = "scipy-1.13.0.tar.gz", hash = "sha256:58569af537ea29d3f78e5abd18398459f195546bb3be23d16677fb26616cc11e"}, -] - -[package.dependencies] -numpy = ">=1.22.4,<2.3" - -[package.extras] -dev = ["cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy", "pycodestyle", "pydevtool", "rich-click", "ruff", "types-psutil", "typing_extensions"] -doc = ["jupyterlite-pyodide-kernel", "jupyterlite-sphinx (>=0.12.0)", "jupytext", "matplotlib (>=3.5)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (>=0.15.2)", "sphinx (>=5.0.0)", "sphinx-design (>=0.4.0)"] -test = ["array-api-strict", "asv", "gmpy2", "hypothesis (>=6.30)", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] - -[[package]] -name = "send2trash" -version = "1.8.3" -description = "Send file to trash natively under Mac OS X, Windows and Linux" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" -files = [ - {file = "Send2Trash-1.8.3-py3-none-any.whl", hash = "sha256:0c31227e0bd08961c7665474a3d1ef7193929fedda4233843689baa056be46c9"}, - {file = "Send2Trash-1.8.3.tar.gz", hash = "sha256:b18e7a3966d99871aefeb00cfbcfdced55ce4871194810fc71f4aa484b953abf"}, -] - -[package.extras] -nativelib = ["pyobjc-framework-Cocoa", "pywin32"] -objc = ["pyobjc-framework-Cocoa"] -win32 = ["pywin32"] - -[[package]] -name = "six" -version = "1.16.0" -description = "Python 2 and 3 compatibility utilities" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" -files = [ - {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, - {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, -] - -[[package]] -name = "sniffio" -version = "1.3.1" -description = "Sniff out which async library your code is running under" -optional = false -python-versions = ">=3.7" -files = [ - {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, - {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, -] - -[[package]] -name = "soupsieve" -version = "2.5" -description = "A modern CSS selector implementation for Beautiful Soup." -optional = false -python-versions = ">=3.8" -files = [ - {file = "soupsieve-2.5-py3-none-any.whl", hash = "sha256:eaa337ff55a1579b6549dc679565eac1e3d000563bcb1c8ab0d0fefbc0c2cdc7"}, - {file = "soupsieve-2.5.tar.gz", hash = "sha256:5663d5a7b3bfaeee0bc4372e7fc48f9cff4940b3eec54a6451cc5299f1097690"}, -] - -[[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 = "tensornetwork" -version = "0.4.6" -description = "A high level tensor network API for accelerated tensor network calculations." -optional = false -python-versions = ">=3.7.0" -files = [ - {file = "tensornetwork-0.4.6-py3-none-any.whl", hash = "sha256:33f777ea6b9579d010806b3a1ef02f4f9ff5f0707f0ceb681591ee6eb7a01b03"}, - {file = "tensornetwork-0.4.6.tar.gz", hash = "sha256:c5af810bf6c2480e1b1f3d98ccf262c5ffb5c3c513be6611f4fdd2258bbc7704"}, -] - -[package.dependencies] -graphviz = ">=0.11.1" -h5py = ">=2.9.0" -numpy = ">=1.17" -opt-einsum = ">=2.3.0" -scipy = ">=1.1" - -[[package]] -name = "terminado" -version = "0.18.1" -description = "Tornado websocket backend for the Xterm.js Javascript terminal emulator library." -optional = false -python-versions = ">=3.8" -files = [ - {file = "terminado-0.18.1-py3-none-any.whl", hash = "sha256:a4468e1b37bb318f8a86514f65814e1afc977cf29b3992a4500d9dd305dcceb0"}, - {file = "terminado-0.18.1.tar.gz", hash = "sha256:de09f2c4b85de4765f7714688fff57d3e75bad1f909b589fde880460c753fd2e"}, -] - -[package.dependencies] -ptyprocess = {version = "*", markers = "os_name != \"nt\""} -pywinpty = {version = ">=1.1.0", markers = "os_name == \"nt\""} -tornado = ">=6.1.0" - -[package.extras] -docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] -test = ["pre-commit", "pytest (>=7.0)", "pytest-timeout"] -typing = ["mypy (>=1.6,<2.0)", "traitlets (>=5.11.1)"] - -[[package]] -name = "tinycss2" -version = "1.3.0" -description = "A tiny CSS parser" -optional = false -python-versions = ">=3.8" -files = [ - {file = "tinycss2-1.3.0-py3-none-any.whl", hash = "sha256:54a8dbdffb334d536851be0226030e9505965bb2f30f21a4a82c55fb2a80fae7"}, - {file = "tinycss2-1.3.0.tar.gz", hash = "sha256:152f9acabd296a8375fbca5b84c961ff95971fcfc32e79550c8df8e29118c54d"}, -] - -[package.dependencies] -webencodings = ">=0.4" - -[package.extras] -doc = ["sphinx", "sphinx_rtd_theme"] -test = ["pytest", "ruff"] - -[[package]] -name = "tomli" -version = "2.0.1" -description = "A lil' TOML parser" -optional = false -python-versions = ">=3.7" -files = [ - {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, - {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, -] - -[[package]] -name = "tomlkit" -version = "0.12.4" -description = "Style preserving TOML library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "tomlkit-0.12.4-py3-none-any.whl", hash = "sha256:5cd82d48a3dd89dee1f9d64420aa20ae65cfbd00668d6f094d7578a78efbb77b"}, - {file = "tomlkit-0.12.4.tar.gz", hash = "sha256:7ca1cfc12232806517a8515047ba66a19369e71edf2439d0f5824f91032b6cc3"}, -] - -[[package]] -name = "tornado" -version = "6.4" -description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." -optional = false -python-versions = ">= 3.8" -files = [ - {file = "tornado-6.4-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:02ccefc7d8211e5a7f9e8bc3f9e5b0ad6262ba2fbb683a6443ecc804e5224ce0"}, - {file = "tornado-6.4-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:27787de946a9cffd63ce5814c33f734c627a87072ec7eed71f7fc4417bb16263"}, - {file = "tornado-6.4-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f7894c581ecdcf91666a0912f18ce5e757213999e183ebfc2c3fdbf4d5bd764e"}, - {file = "tornado-6.4-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e43bc2e5370a6a8e413e1e1cd0c91bedc5bd62a74a532371042a18ef19e10579"}, - {file = "tornado-6.4-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0251554cdd50b4b44362f73ad5ba7126fc5b2c2895cc62b14a1c2d7ea32f212"}, - {file = "tornado-6.4-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:fd03192e287fbd0899dd8f81c6fb9cbbc69194d2074b38f384cb6fa72b80e9c2"}, - {file = "tornado-6.4-cp38-abi3-musllinux_1_1_i686.whl", hash = "sha256:88b84956273fbd73420e6d4b8d5ccbe913c65d31351b4c004ae362eba06e1f78"}, - {file = "tornado-6.4-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:71ddfc23a0e03ef2df1c1397d859868d158c8276a0603b96cf86892bff58149f"}, - {file = "tornado-6.4-cp38-abi3-win32.whl", hash = "sha256:6f8a6c77900f5ae93d8b4ae1196472d0ccc2775cc1dfdc9e7727889145c45052"}, - {file = "tornado-6.4-cp38-abi3-win_amd64.whl", hash = "sha256:10aeaa8006333433da48dec9fe417877f8bcc21f48dda8d661ae79da357b2a63"}, - {file = "tornado-6.4.tar.gz", hash = "sha256:72291fa6e6bc84e626589f1c29d90a5a6d593ef5ae68052ee2ef000dfd273dee"}, -] - -[[package]] -name = "tqdm" -version = "4.66.4" -description = "Fast, Extensible Progress Meter" -optional = false -python-versions = ">=3.7" -files = [ - {file = "tqdm-4.66.4-py3-none-any.whl", hash = "sha256:b75ca56b413b030bc3f00af51fd2c1a1a5eac6a0c1cca83cbb37a5c52abce644"}, - {file = "tqdm-4.66.4.tar.gz", hash = "sha256:e4d936c9de8727928f3be6079590e97d9abfe8d39a590be678eb5919ffc186bb"}, -] - -[package.dependencies] -colorama = {version = "*", markers = "platform_system == \"Windows\""} -ipywidgets = {version = ">=6", optional = true, markers = "extra == \"notebook\""} - -[package.extras] -dev = ["pytest (>=6)", "pytest-cov", "pytest-timeout", "pytest-xdist"] -notebook = ["ipywidgets (>=6)"] -slack = ["slack-sdk"] -telegram = ["requests"] - -[[package]] -name = "tqdm-loggable" -version = "0.1.4" -description = "TQDM progress bar friendliness for non-interactive terminals and logging output" -optional = false -python-versions = ">=3.8,<4.0" -files = [ - {file = "tqdm_loggable-0.1.4-py3-none-any.whl", hash = "sha256:54fde4e7e146157b2c71230fbed2d981c362741fbcc6230dc632abbf4500094c"}, - {file = "tqdm_loggable-0.1.4.tar.gz", hash = "sha256:ab5a4a29c5a0398c328455b099e3faf1c93113e8db6e04cb3de9ba539d0a593c"}, -] - -[package.dependencies] -tqdm = ">=4.64.1,<5.0.0" - -[[package]] -name = "traitlets" -version = "5.14.3" -description = "Traitlets Python configuration system" -optional = false -python-versions = ">=3.8" -files = [ - {file = "traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f"}, - {file = "traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7"}, -] - -[package.extras] -docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] -test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0,<8.2)", "pytest-mock", "pytest-mypy-testing"] - -[[package]] -name = "types-python-dateutil" -version = "2.9.0.20240316" -description = "Typing stubs for python-dateutil" -optional = false -python-versions = ">=3.8" -files = [ - {file = "types-python-dateutil-2.9.0.20240316.tar.gz", hash = "sha256:5d2f2e240b86905e40944dd787db6da9263f0deabef1076ddaed797351ec0202"}, - {file = "types_python_dateutil-2.9.0.20240316-py3-none-any.whl", hash = "sha256:6b8cb66d960771ce5ff974e9dd45e38facb81718cc1e208b10b1baccbfdbee3b"}, -] - -[[package]] -name = "typing-extensions" -version = "4.11.0" -description = "Backported and Experimental Type Hints for Python 3.8+" -optional = false -python-versions = ">=3.8" -files = [ - {file = "typing_extensions-4.11.0-py3-none-any.whl", hash = "sha256:c1f94d72897edaf4ce775bb7558d5b79d8126906a14ea5ed1635921406c0387a"}, - {file = "typing_extensions-4.11.0.tar.gz", hash = "sha256:83f085bd5ca59c80295fc2a82ab5dac679cbe02b9f33f7d83af68e241bea51b0"}, -] - -[[package]] -name = "uri-template" -version = "1.3.0" -description = "RFC 6570 URI Template Processor" -optional = false -python-versions = ">=3.7" -files = [ - {file = "uri-template-1.3.0.tar.gz", hash = "sha256:0e00f8eb65e18c7de20d595a14336e9f337ead580c70934141624b6d1ffdacc7"}, - {file = "uri_template-1.3.0-py3-none-any.whl", hash = "sha256:a44a133ea12d44a0c0f06d7d42a52d71282e77e2f937d8abd5655b8d56fc1363"}, -] - -[package.extras] -dev = ["flake8", "flake8-annotations", "flake8-bandit", "flake8-bugbear", "flake8-commas", "flake8-comprehensions", "flake8-continuation", "flake8-datetimez", "flake8-docstrings", "flake8-import-order", "flake8-literal", "flake8-modern-annotations", "flake8-noqa", "flake8-pyproject", "flake8-requirements", "flake8-typechecking-import", "flake8-use-fstring", "mypy", "pep8-naming", "types-PyYAML"] - -[[package]] -name = "urllib3" -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.1-py3-none-any.whl", hash = "sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d"}, - {file = "urllib3-2.2.1.tar.gz", hash = "sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19"}, -] - -[package.extras] -brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] -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 = "webcolors" -version = "1.13" -description = "A library for working with the color formats defined by HTML and CSS." -optional = false -python-versions = ">=3.7" -files = [ - {file = "webcolors-1.13-py3-none-any.whl", hash = "sha256:29bc7e8752c0a1bd4a1f03c14d6e6a72e93d82193738fa860cbff59d0fcc11bf"}, - {file = "webcolors-1.13.tar.gz", hash = "sha256:c225b674c83fa923be93d235330ce0300373d02885cef23238813b0d5668304a"}, -] - -[package.extras] -docs = ["furo", "sphinx", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-notfound-page", "sphinxext-opengraph"] -tests = ["pytest", "pytest-cov"] - -[[package]] -name = "webencodings" -version = "0.5.1" -description = "Character encoding aliases for legacy web content" -optional = false -python-versions = "*" -files = [ - {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, - {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, -] - -[[package]] -name = "websocket-client" -version = "1.8.0" -description = "WebSocket client for Python with low level API options" -optional = false -python-versions = ">=3.8" -files = [ - {file = "websocket_client-1.8.0-py3-none-any.whl", hash = "sha256:17b44cc997f5c498e809b22cdf2d9c7a9e71c02c8cc2b6c56e7c2d1239bfa526"}, - {file = "websocket_client-1.8.0.tar.gz", hash = "sha256:3239df9f44da632f96012472805d40a23281a991027ce11d2f45a6f24ac4c3da"}, -] - -[package.extras] -docs = ["Sphinx (>=6.0)", "myst-parser (>=2.0.0)", "sphinx-rtd-theme (>=1.1.0)"] -optional = ["python-socks", "wsaccel"] -test = ["websockets"] - -[[package]] -name = "widgetsnbextension" -version = "4.0.10" -description = "Jupyter interactive widgets for Jupyter Notebook" -optional = false -python-versions = ">=3.7" -files = [ - {file = "widgetsnbextension-4.0.10-py3-none-any.whl", hash = "sha256:d37c3724ec32d8c48400a435ecfa7d3e259995201fbefa37163124a9fcb393cc"}, - {file = "widgetsnbextension-4.0.10.tar.gz", hash = "sha256:64196c5ff3b9a9183a8e699a4227fb0b7002f252c814098e66c4d1cd0644688f"}, -] - -[[package]] -name = "zipp" -version = "3.18.1" -description = "Backport of pathlib-compatible object wrapper for zip files" -optional = false -python-versions = ">=3.8" -files = [ - {file = "zipp-3.18.1-py3-none-any.whl", hash = "sha256:206f5a15f2af3dbaee80769fb7dc6f249695e940acca08dfb2a4769fe61e538b"}, - {file = "zipp-3.18.1.tar.gz", hash = "sha256:2884ed22e7d8961de1c9a05142eb69a247f120291bc0206a00a7642f09b5b715"}, -] - -[package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] - -[metadata] -lock-version = "2.0" -python-versions = ">=3.9,<4.0" -content-hash = "ee1e79ec745fd2a4108f2144091502a49462a6898a6e9c72a76043a9c7841bee" diff --git a/pyproject.toml b/pyproject.toml index 7ceb644..281407b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,36 +1,54 @@ -[tool.poetry] +[project] name = "variPEPS" -version = "0.6.0" +version = "1.0.1" description = "Versatile tensor network library for variational ground state simulations in two spatial dimensions" -authors = ["Jan Naumann ", "Philipp Schmoll ", "Frederik Wilde", "Finn Krein"] +authors = [ + {name = "Jan Naumann", email = "j.naumann@fu-berlin.de"}, + {name = "Philipp Schmoll", email = "philipp.schmoll@fu-berlin.de"}, + {name = "Frederik Wilde"}, + {name = "Finn Krein"} +] license = "GPL-3.0-or-later" readme = "README.md" -repository = "https://github.com/variPEPS/variPEPS_Python" -documentation = "https://varipeps.readthedocs.io/en/stable/" -packages = [{include = "varipeps"}] +requires-python = ">=3.10" +dependencies = [ + "numpy >= 1.21.2", + "scipy >= 1.7.1", + "jax[cpu]>=0.5.3", + "tensornetwork >= 0.4.5", + "h5py >= 3.6.0", + "tqdm[notebook] >= 4.64.1", + "tqdm-loggable >= 0.1.3", +] +keywords = [ + "physics", + "automatic-differentiation", + "peps", + "tensor-networks", + "variational-optimization", + "quantum-many-body", + "quantum-many-body-physics" +] +classifiers = [ + "Programming Language :: Python :: 3", + "Intended Audience :: Science/Research", + "Topic :: Scientific/Engineering :: Physics", +] -[tool.poetry.dependencies] -python = ">=3.9,<4.0" -numpy = ">=1.21.2" -scipy = ">=1.7.1" -jax = {extras = ["cpu"], version = ">=0.3.16"} -tensornetwork = ">=0.4.5" -poethepoet = ">=0.10.0" -h5py = ">=3.6.0" -tqdm = {extras = ["notebook"], version = ">=4.64.1"} -tqdm-loggable = "^0.1.3" +[project.urls] +Documentation = "https://varipeps.readthedocs.io/en/stable/" +Repository = "https://github.com/variPEPS/variPEPS_Python" +Issues = "https://github.com/variPEPS/variPEPS_Python/issues" -[tool.poetry.dev-dependencies] -black = ">=21.8-beta.0" -ipython = ">=7.27.0" -pylint = ">=2.10.2" -flake8 = ">=3.9.2" -mypy = ">=0.910" -jupyter = ">=1.0.0" +[dependency-groups] +dev = [ + "black>=24.10.0", + "flake8>=7.1.1", + "ipython>=8.31.0", + "mypy>=1.14.1", + "pylint>=3.3.3", +] [build-system] -requires = ["poetry-core"] -build-backend = "poetry.core.masonry.api" - -[tool.poe.tasks] -use-cuda = "pip install --upgrade 'jax[cuda]' -f https://storage.googleapis.com/jax-releases/jax_cuda_releases.html" +requires = ["hatchling"] +build-backend = "hatchling.build" diff --git a/uv.lock b/uv.lock new file mode 100644 index 0000000..ba41d2e --- /dev/null +++ b/uv.lock @@ -0,0 +1,877 @@ +version = 1 +requires-python = ">=3.10" +resolution-markers = [ + "python_full_version >= '3.13'", + "python_full_version == '3.12.*'", + "python_full_version == '3.11.*'", + "python_full_version < '3.11'", +] + +[[package]] +name = "astroid" +version = "3.3.9" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/39/33/536530122a22a7504b159bccaf30a1f76aa19d23028bd8b5009eb9b2efea/astroid-3.3.9.tar.gz", hash = "sha256:622cc8e3048684aa42c820d9d218978021c3c3d174fb03a9f0d615921744f550", size = 398731 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/de/80/c749efbd8eef5ea77c7d6f1956e8fbfb51963b7f93ef79647afd4d9886e3/astroid-3.3.9-py3-none-any.whl", hash = "sha256:d05bfd0acba96a7bd43e222828b7d9bc1e138aaeb0649707908d3702a9831248", size = 275339 }, +] + +[[package]] +name = "asttokens" +version = "3.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4a/e7/82da0a03e7ba5141f05cce0d302e6eed121ae055e0456ca228bf693984bc/asttokens-3.0.0.tar.gz", hash = "sha256:0dcd8baa8d62b0c1d118b399b2ddba3c4aff271d0d7a9e0d4c1681c79035bbc7", size = 61978 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/25/8a/c46dcc25341b5bce5472c718902eb3d38600a903b14fa6aeecef3f21a46f/asttokens-3.0.0-py3-none-any.whl", hash = "sha256:e3078351a059199dd5138cb1c706e6430c05eff2ff136af5eb4790f9d28932e2", size = 26918 }, +] + +[[package]] +name = "black" +version = "25.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "mypy-extensions" }, + { name = "packaging" }, + { name = "pathspec" }, + { name = "platformdirs" }, + { name = "tomli", marker = "python_full_version < '3.11'" }, + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/94/49/26a7b0f3f35da4b5a65f081943b7bcd22d7002f5f0fb8098ec1ff21cb6ef/black-25.1.0.tar.gz", hash = "sha256:33496d5cd1222ad73391352b4ae8da15253c5de89b93a80b3e2c8d9a19ec2666", size = 649449 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4d/3b/4ba3f93ac8d90410423fdd31d7541ada9bcee1df32fb90d26de41ed40e1d/black-25.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:759e7ec1e050a15f89b770cefbf91ebee8917aac5c20483bc2d80a6c3a04df32", size = 1629419 }, + { url = "https://files.pythonhosted.org/packages/b4/02/0bde0485146a8a5e694daed47561785e8b77a0466ccc1f3e485d5ef2925e/black-25.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e519ecf93120f34243e6b0054db49c00a35f84f195d5bce7e9f5cfc578fc2da", size = 1461080 }, + { url = "https://files.pythonhosted.org/packages/52/0e/abdf75183c830eaca7589144ff96d49bce73d7ec6ad12ef62185cc0f79a2/black-25.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:055e59b198df7ac0b7efca5ad7ff2516bca343276c466be72eb04a3bcc1f82d7", size = 1766886 }, + { url = "https://files.pythonhosted.org/packages/dc/a6/97d8bb65b1d8a41f8a6736222ba0a334db7b7b77b8023ab4568288f23973/black-25.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:db8ea9917d6f8fc62abd90d944920d95e73c83a5ee3383493e35d271aca872e9", size = 1419404 }, + { url = "https://files.pythonhosted.org/packages/7e/4f/87f596aca05c3ce5b94b8663dbfe242a12843caaa82dd3f85f1ffdc3f177/black-25.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a39337598244de4bae26475f77dda852ea00a93bd4c728e09eacd827ec929df0", size = 1614372 }, + { url = "https://files.pythonhosted.org/packages/e7/d0/2c34c36190b741c59c901e56ab7f6e54dad8df05a6272a9747ecef7c6036/black-25.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:96c1c7cd856bba8e20094e36e0f948718dc688dba4a9d78c3adde52b9e6c2299", size = 1442865 }, + { url = "https://files.pythonhosted.org/packages/21/d4/7518c72262468430ead45cf22bd86c883a6448b9eb43672765d69a8f1248/black-25.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bce2e264d59c91e52d8000d507eb20a9aca4a778731a08cfff7e5ac4a4bb7096", size = 1749699 }, + { url = "https://files.pythonhosted.org/packages/58/db/4f5beb989b547f79096e035c4981ceb36ac2b552d0ac5f2620e941501c99/black-25.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:172b1dbff09f86ce6f4eb8edf9dede08b1fce58ba194c87d7a4f1a5aa2f5b3c2", size = 1428028 }, + { url = "https://files.pythonhosted.org/packages/83/71/3fe4741df7adf015ad8dfa082dd36c94ca86bb21f25608eb247b4afb15b2/black-25.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4b60580e829091e6f9238c848ea6750efed72140b91b048770b64e74fe04908b", size = 1650988 }, + { url = "https://files.pythonhosted.org/packages/13/f3/89aac8a83d73937ccd39bbe8fc6ac8860c11cfa0af5b1c96d081facac844/black-25.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1e2978f6df243b155ef5fa7e558a43037c3079093ed5d10fd84c43900f2d8ecc", size = 1453985 }, + { url = "https://files.pythonhosted.org/packages/6f/22/b99efca33f1f3a1d2552c714b1e1b5ae92efac6c43e790ad539a163d1754/black-25.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3b48735872ec535027d979e8dcb20bf4f70b5ac75a8ea99f127c106a7d7aba9f", size = 1783816 }, + { url = "https://files.pythonhosted.org/packages/18/7e/a27c3ad3822b6f2e0e00d63d58ff6299a99a5b3aee69fa77cd4b0076b261/black-25.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:ea0213189960bda9cf99be5b8c8ce66bb054af5e9e861249cd23471bd7b0b3ba", size = 1440860 }, + { url = "https://files.pythonhosted.org/packages/98/87/0edf98916640efa5d0696e1abb0a8357b52e69e82322628f25bf14d263d1/black-25.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8f0b18a02996a836cc9c9c78e5babec10930862827b1b724ddfe98ccf2f2fe4f", size = 1650673 }, + { url = "https://files.pythonhosted.org/packages/52/e5/f7bf17207cf87fa6e9b676576749c6b6ed0d70f179a3d812c997870291c3/black-25.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:afebb7098bfbc70037a053b91ae8437c3857482d3a690fefc03e9ff7aa9a5fd3", size = 1453190 }, + { url = "https://files.pythonhosted.org/packages/e3/ee/adda3d46d4a9120772fae6de454c8495603c37c4c3b9c60f25b1ab6401fe/black-25.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:030b9759066a4ee5e5aca28c3c77f9c64789cdd4de8ac1df642c40b708be6171", size = 1782926 }, + { url = "https://files.pythonhosted.org/packages/cc/64/94eb5f45dcb997d2082f097a3944cfc7fe87e071907f677e80788a2d7b7a/black-25.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:a22f402b410566e2d1c950708c77ebf5ebd5d0d88a6a2e87c86d9fb48afa0d18", size = 1442613 }, + { url = "https://files.pythonhosted.org/packages/09/71/54e999902aed72baf26bca0d50781b01838251a462612966e9fc4891eadd/black-25.1.0-py3-none-any.whl", hash = "sha256:95e8176dae143ba9097f351d174fdaf0ccd29efb414b362ae3fd72bf0f710717", size = 207646 }, +] + +[[package]] +name = "click" +version = "8.1.8" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b9/2e/0090cbf739cee7d23781ad4b89a9894a41538e4fcf4c31dcdd705b78eb8b/click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a", size = 226593 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/d4/7ebdbd03970677812aac39c869717059dbb71a4cfc033ca6e5221787892c/click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2", size = 98188 }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 }, +] + +[[package]] +name = "comm" +version = "0.2.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e9/a8/fb783cb0abe2b5fded9f55e5703015cdf1c9c85b3669087c538dd15a6a86/comm-0.2.2.tar.gz", hash = "sha256:3fd7a84065306e07bea1773df6eb8282de51ba82f77c72f9c85716ab11fe980e", size = 6210 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e6/75/49e5bfe642f71f272236b5b2d2691cf915a7283cc0ceda56357b61daa538/comm-0.2.2-py3-none-any.whl", hash = "sha256:e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3", size = 7180 }, +] + +[[package]] +name = "decorator" +version = "5.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/43/fa/6d96a0978d19e17b68d634497769987b16c8f4cd0a7a05048bec693caa6b/decorator-5.2.1.tar.gz", hash = "sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360", size = 56711 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a", size = 9190 }, +] + +[[package]] +name = "dill" +version = "0.3.9" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/70/43/86fe3f9e130c4137b0f1b50784dd70a5087b911fe07fa81e53e0c4c47fea/dill-0.3.9.tar.gz", hash = "sha256:81aa267dddf68cbfe8029c42ca9ec6a4ab3b22371d1c450abc54422577b4512c", size = 187000 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/46/d1/e73b6ad76f0b1fb7f23c35c6d95dbc506a9c8804f43dda8cb5b0fa6331fd/dill-0.3.9-py3-none-any.whl", hash = "sha256:468dff3b89520b474c0397703366b7b95eebe6303f108adf9b19da1f702be87a", size = 119418 }, +] + +[[package]] +name = "exceptiongroup" +version = "1.2.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/09/35/2495c4ac46b980e4ca1f6ad6db102322ef3ad2410b79fdde159a4b0f3b92/exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc", size = 28883 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/02/cc/b7e31358aac6ed1ef2bb790a9746ac2c69bcb3c8588b41616914eb106eaf/exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b", size = 16453 }, +] + +[[package]] +name = "executing" +version = "2.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/91/50/a9d80c47ff289c611ff12e63f7c5d13942c65d68125160cefd768c73e6e4/executing-2.2.0.tar.gz", hash = "sha256:5d108c028108fe2551d1a7b2e8b713341e2cb4fc0aa7dcf966fa4327a5226755", size = 978693 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/8f/c4d9bafc34ad7ad5d8dc16dd1347ee0e507a52c3adb6bfa8887e1c6a26ba/executing-2.2.0-py2.py3-none-any.whl", hash = "sha256:11387150cad388d62750327a53d3339fad4888b39a6fe233c3afbb54ecffd3aa", size = 26702 }, +] + +[[package]] +name = "flake8" +version = "7.1.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mccabe" }, + { name = "pycodestyle" }, + { name = "pyflakes" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/58/16/3f2a0bb700ad65ac9663262905a025917c020a3f92f014d2ba8964b4602c/flake8-7.1.2.tar.gz", hash = "sha256:c586ffd0b41540951ae41af572e6790dbd49fc12b3aa2541685d253d9bd504bd", size = 48119 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/35/f8/08d37b2cd89da306e3520bd27f8a85692122b42b56c0c2c3784ff09c022f/flake8-7.1.2-py2.py3-none-any.whl", hash = "sha256:1cbc62e65536f65e6d754dfe6f1bada7f5cf392d6f5db3c2b85892466c3e7c1a", size = 57745 }, +] + +[[package]] +name = "graphviz" +version = "0.20.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fa/83/5a40d19b8347f017e417710907f824915fba411a9befd092e52746b63e9f/graphviz-0.20.3.zip", hash = "sha256:09d6bc81e6a9fa392e7ba52135a9d49f1ed62526f96499325930e87ca1b5925d", size = 256455 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/00/be/d59db2d1d52697c6adc9eacaf50e8965b6345cc143f671e1ed068818d5cf/graphviz-0.20.3-py3-none-any.whl", hash = "sha256:81f848f2904515d8cd359cc611faba817598d2feaac4027b266aa3eda7b3dde5", size = 47126 }, +] + +[[package]] +name = "h5py" +version = "3.13.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/03/2e/a22d6a8bfa6f8be33e7febd985680fba531562795f0a9077ed1eb047bfb0/h5py-3.13.0.tar.gz", hash = "sha256:1870e46518720023da85d0895a1960ff2ce398c5671eac3b1a41ec696b7105c3", size = 414876 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/02/8a/bc76588ff1a254e939ce48f30655a8f79fac614ca8bd1eda1a79fa276671/h5py-3.13.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5540daee2b236d9569c950b417f13fd112d51d78b4c43012de05774908dff3f5", size = 3413286 }, + { url = "https://files.pythonhosted.org/packages/19/bd/9f249ecc6c517b2796330b0aab7d2351a108fdbd00d4bb847c0877b5533e/h5py-3.13.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:10894c55d46df502d82a7a4ed38f9c3fdbcb93efb42e25d275193e093071fade", size = 2915673 }, + { url = "https://files.pythonhosted.org/packages/72/71/0dd079208d7d3c3988cebc0776c2de58b4d51d8eeb6eab871330133dfee6/h5py-3.13.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb267ce4b83f9c42560e9ff4d30f60f7ae492eacf9c7ede849edf8c1b860e16b", size = 4283822 }, + { url = "https://files.pythonhosted.org/packages/d8/fa/0b6a59a1043c53d5d287effa02303bd248905ee82b25143c7caad8b340ad/h5py-3.13.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2cf6a231a07c14acd504a945a6e9ec115e0007f675bde5e0de30a4dc8d86a31", size = 4548100 }, + { url = "https://files.pythonhosted.org/packages/12/42/ad555a7ff7836c943fe97009405566dc77bcd2a17816227c10bd067a3ee1/h5py-3.13.0-cp310-cp310-win_amd64.whl", hash = "sha256:851ae3a8563d87a5a0dc49c2e2529c75b8842582ccaefbf84297d2cfceeacd61", size = 2950547 }, + { url = "https://files.pythonhosted.org/packages/86/2b/50b15fdefb577d073b49699e6ea6a0a77a3a1016c2b67e2149fc50124a10/h5py-3.13.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8a8e38ef4ceb969f832cc230c0cf808c613cc47e31e768fd7b1106c55afa1cb8", size = 3422922 }, + { url = "https://files.pythonhosted.org/packages/94/59/36d87a559cab9c59b59088d52e86008d27a9602ce3afc9d3b51823014bf3/h5py-3.13.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f35640e81b03c02a88b8bf99fb6a9d3023cc52f7c627694db2f379e0028f2868", size = 2921619 }, + { url = "https://files.pythonhosted.org/packages/37/ef/6f80b19682c0b0835bbee7b253bec9c16af9004f2fd6427b1dd858100273/h5py-3.13.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:337af114616f3656da0c83b68fcf53ecd9ce9989a700b0883a6e7c483c3235d4", size = 4259366 }, + { url = "https://files.pythonhosted.org/packages/03/71/c99f662d4832c8835453cf3476f95daa28372023bda4aa1fca9e97c24f09/h5py-3.13.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:782ff0ac39f455f21fd1c8ebc007328f65f43d56718a89327eec76677ebf238a", size = 4509058 }, + { url = "https://files.pythonhosted.org/packages/56/89/e3ff23e07131ff73a72a349be9639e4de84e163af89c1c218b939459a98a/h5py-3.13.0-cp311-cp311-win_amd64.whl", hash = "sha256:22ffe2a25770a2d67213a1b94f58006c14dce06933a42d2aaa0318c5868d1508", size = 2966428 }, + { url = "https://files.pythonhosted.org/packages/d8/20/438f6366ba4ded80eadb38f8927f5e2cd6d2e087179552f20ae3dbcd5d5b/h5py-3.13.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:477c58307b6b9a2509c59c57811afb9f598aedede24a67da808262dfa0ee37b4", size = 3384442 }, + { url = "https://files.pythonhosted.org/packages/10/13/cc1cb7231399617d9951233eb12fddd396ff5d4f7f057ee5d2b1ca0ee7e7/h5py-3.13.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:57c4c74f627c616f02b7aec608a8c706fe08cb5b0ba7c08555a4eb1dde20805a", size = 2917567 }, + { url = "https://files.pythonhosted.org/packages/9e/d9/aed99e1c858dc698489f916eeb7c07513bc864885d28ab3689d572ba0ea0/h5py-3.13.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:357e6dc20b101a805ccfd0024731fbaf6e8718c18c09baf3b5e4e9d198d13fca", size = 4669544 }, + { url = "https://files.pythonhosted.org/packages/a7/da/3c137006ff5f0433f0fb076b1ebe4a7bf7b5ee1e8811b5486af98b500dd5/h5py-3.13.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d6f13f9b5ce549448c01e4dfe08ea8d1772e6078799af2c1c8d09e941230a90d", size = 4932139 }, + { url = "https://files.pythonhosted.org/packages/25/61/d897952629cae131c19d4c41b2521e7dd6382f2d7177c87615c2e6dced1a/h5py-3.13.0-cp312-cp312-win_amd64.whl", hash = "sha256:21daf38171753899b5905f3d82c99b0b1ec2cbbe282a037cad431feb620e62ec", size = 2954179 }, + { url = "https://files.pythonhosted.org/packages/60/43/f276f27921919a9144074320ce4ca40882fc67b3cfee81c3f5c7df083e97/h5py-3.13.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e520ec76de00943dd017c8ea3f354fa1d2f542eac994811943a8faedf2a7d5cb", size = 3358040 }, + { url = "https://files.pythonhosted.org/packages/1b/86/ad4a4cf781b08d4572be8bbdd8f108bb97b266a14835c640dc43dafc0729/h5py-3.13.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e79d8368cd9295045956bfb436656bea3f915beaa11d342e9f79f129f5178763", size = 2892766 }, + { url = "https://files.pythonhosted.org/packages/69/84/4c6367d6b58deaf0fa84999ec819e7578eee96cea6cbd613640d0625ed5e/h5py-3.13.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56dd172d862e850823c4af02dc4ddbc308f042b85472ffdaca67f1598dff4a57", size = 4664255 }, + { url = "https://files.pythonhosted.org/packages/fd/41/bc2df86b72965775f6d621e0ee269a5f3ac23e8f870abf519de9c7d93b4d/h5py-3.13.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be949b46b7388074c5acae017fbbe3e5ba303fd9daaa52157fdfef30bbdacadd", size = 4927580 }, + { url = "https://files.pythonhosted.org/packages/97/34/165b87ea55184770a0c1fcdb7e017199974ad2e271451fd045cfe35f3add/h5py-3.13.0-cp313-cp313-win_amd64.whl", hash = "sha256:4f97ecde7ac6513b21cd95efdfc38dc6d19f96f6ca6f2a30550e94e551458e0a", size = 2940890 }, +] + +[[package]] +name = "ipython" +version = "8.34.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.11'", +] +dependencies = [ + { name = "colorama", marker = "python_full_version < '3.11' and sys_platform == 'win32'" }, + { name = "decorator", marker = "python_full_version < '3.11'" }, + { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, + { name = "jedi", marker = "python_full_version < '3.11'" }, + { name = "matplotlib-inline", marker = "python_full_version < '3.11'" }, + { name = "pexpect", marker = "python_full_version < '3.11' and sys_platform != 'emscripten' and sys_platform != 'win32'" }, + { name = "prompt-toolkit", marker = "python_full_version < '3.11'" }, + { name = "pygments", marker = "python_full_version < '3.11'" }, + { name = "stack-data", marker = "python_full_version < '3.11'" }, + { name = "traitlets", marker = "python_full_version < '3.11'" }, + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/13/18/1a60aa62e9d272fcd7e658a89e1c148da10e1a5d38edcbcd834b52ca7492/ipython-8.34.0.tar.gz", hash = "sha256:c31d658e754673ecc6514583e7dda8069e47136eb62458816b7d1e6625948b5a", size = 5508477 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/78/45615356bb973904856808183ae2a5fba1f360e9d682314d79766f4b88f2/ipython-8.34.0-py3-none-any.whl", hash = "sha256:0419883fa46e0baa182c5d50ebb8d6b49df1889fdb70750ad6d8cfe678eda6e3", size = 826731 }, +] + +[[package]] +name = "ipython" +version = "9.0.2" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.13'", + "python_full_version == '3.12.*'", + "python_full_version == '3.11.*'", +] +dependencies = [ + { name = "colorama", marker = "python_full_version >= '3.11' and sys_platform == 'win32'" }, + { name = "decorator", marker = "python_full_version >= '3.11'" }, + { name = "ipython-pygments-lexers", marker = "python_full_version >= '3.11'" }, + { name = "jedi", marker = "python_full_version >= '3.11'" }, + { name = "matplotlib-inline", marker = "python_full_version >= '3.11'" }, + { name = "pexpect", marker = "python_full_version >= '3.11' and sys_platform != 'emscripten' and sys_platform != 'win32'" }, + { name = "prompt-toolkit", marker = "python_full_version >= '3.11'" }, + { name = "pygments", marker = "python_full_version >= '3.11'" }, + { name = "stack-data", marker = "python_full_version >= '3.11'" }, + { name = "traitlets", marker = "python_full_version >= '3.11'" }, + { name = "typing-extensions", marker = "python_full_version == '3.11.*'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7d/ce/012a0f40ca58a966f87a6e894d6828e2817657cbdf522b02a5d3a87d92ce/ipython-9.0.2.tar.gz", hash = "sha256:ec7b479e3e5656bf4f58c652c120494df1820f4f28f522fb7ca09e213c2aab52", size = 4366102 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/20/3a/917cb9e72f4e1a4ea13c862533205ae1319bd664119189ee5cc9e4e95ebf/ipython-9.0.2-py3-none-any.whl", hash = "sha256:143ef3ea6fb1e1bffb4c74b114051de653ffb7737a3f7ab1670e657ca6ae8c44", size = 600524 }, +] + +[[package]] +name = "ipython-pygments-lexers" +version = "1.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pygments", marker = "python_full_version >= '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ef/4c/5dd1d8af08107f88c7f741ead7a40854b8ac24ddf9ae850afbcf698aa552/ipython_pygments_lexers-1.1.1.tar.gz", hash = "sha256:09c0138009e56b6854f9535736f4171d855c8c08a563a0dcd8022f78355c7e81", size = 8393 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl", hash = "sha256:a9462224a505ade19a605f71f8fa63c2048833ce50abc86768a0d81d876dc81c", size = 8074 }, +] + +[[package]] +name = "ipywidgets" +version = "8.1.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "comm" }, + { name = "ipython", version = "8.34.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "ipython", version = "9.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "jupyterlab-widgets" }, + { name = "traitlets" }, + { name = "widgetsnbextension" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c7/4c/dab2a281b07596a5fc220d49827fe6c794c66f1493d7a74f1df0640f2cc5/ipywidgets-8.1.5.tar.gz", hash = "sha256:870e43b1a35656a80c18c9503bbf2d16802db1cb487eec6fab27d683381dde17", size = 116723 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/22/2d/9c0b76f2f9cc0ebede1b9371b6f317243028ed60b90705863d493bae622e/ipywidgets-8.1.5-py3-none-any.whl", hash = "sha256:3290f526f87ae6e77655555baba4f36681c555b8bdbbff430b70e52c34c86245", size = 139767 }, +] + +[[package]] +name = "isort" +version = "6.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b8/21/1e2a441f74a653a144224d7d21afe8f4169e6c7c20bb13aec3a2dc3815e0/isort-6.0.1.tar.gz", hash = "sha256:1cb5df28dfbc742e490c5e41bad6da41b805b0a8be7bc93cd0fb2a8a890ac450", size = 821955 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c1/11/114d0a5f4dabbdcedc1125dee0888514c3c3b16d3e9facad87ed96fad97c/isort-6.0.1-py3-none-any.whl", hash = "sha256:2dc5d7f65c9678d94c88dfc29161a320eec67328bc97aad576874cb4be1e9615", size = 94186 }, +] + +[[package]] +name = "jax" +version = "0.5.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jaxlib" }, + { name = "ml-dtypes" }, + { name = "numpy" }, + { name = "opt-einsum" }, + { name = "scipy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/13/e5/dabb73ab10330e9535aba14fc668b04a46fcd8e78f06567c4f4f1adce340/jax-0.5.3.tar.gz", hash = "sha256:f17fcb0fd61dc289394af6ce4de2dada2312f2689bb0d73642c6f026a95fbb2c", size = 2072748 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/86/bb/fdc6513a9aada13fd21e9860e2adee5f6eea2b4f0a145b219288875acb26/jax-0.5.3-py3-none-any.whl", hash = "sha256:1483dc237b4f47e41755d69429e8c3c138736716147cd43bb2b99b259d4e3c41", size = 2406371 }, +] + +[[package]] +name = "jaxlib" +version = "0.5.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ml-dtypes" }, + { name = "numpy" }, + { name = "scipy" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/2e/12/b1da8468ad843b30976b0e87c6b344ee621fb75ef8bbd39156a303f59059/jaxlib-0.5.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:48ff5c89fb8a0fe04d475e9ddc074b4879a91d7ab68a51cec5cd1e87f81e6c47", size = 63694868 }, + { url = "https://files.pythonhosted.org/packages/0e/a5/378d71e8bcffbb229a0952d713a2ed766c959a04777abc0ee01b5aac29b7/jaxlib-0.5.3-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:972400db4af6e85270d81db5e6e620d31395f0472e510c50dfcd4cb3f72b7220", size = 95766664 }, + { url = "https://files.pythonhosted.org/packages/f1/86/1edf85f425532cbba0180d969f396590dd266909e4dfb0e95f8ee9a8e5fe/jaxlib-0.5.3-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:52be6c9775aff738a61170d8c047505c75bb799a45518e66a7a0908127b11785", size = 105118562 }, + { url = "https://files.pythonhosted.org/packages/61/84/427cd89dd7904a4c923a3fc5494daec8d42d824c1a40d7a5d1c985e2f5ac/jaxlib-0.5.3-cp310-cp310-win_amd64.whl", hash = "sha256:b41a6fcaeb374fabc4ee7e74cfed60843bdab607cd54f60a68b7f7655cde2b66", size = 65766784 }, + { url = "https://files.pythonhosted.org/packages/c2/f2/d9397f264141f2289e229b2faf3b3ddb6397b014a09abe234367814f9697/jaxlib-0.5.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b62bd8b29e5a4f9bfaa57c8daf6e04820b2c994f448f3dec602d64255545e9f2", size = 63696815 }, + { url = "https://files.pythonhosted.org/packages/e8/91/04bf391a21ccfb299b9952f91d5c082e5f9877221e5d98592875af4a50e4/jaxlib-0.5.3-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:a4666f81d72c060ed3e581ded116a9caa9b0a70a148a54cb12a1d3afca3624b5", size = 95770114 }, + { url = "https://files.pythonhosted.org/packages/67/de/50debb40944baa5ba459604578f8c721be9f38c78ef9e8902895566e6a66/jaxlib-0.5.3-cp311-cp311-manylinux2014_x86_64.whl", hash = "sha256:29e1530fc81833216f1e28b578d0c59697654f72ee31c7a44ed7753baf5ac466", size = 105119259 }, + { url = "https://files.pythonhosted.org/packages/20/91/d73c842d1e5cc6b914bb521006d668fbfda4c53cd4424ce9c3a097f6c071/jaxlib-0.5.3-cp311-cp311-win_amd64.whl", hash = "sha256:8eb54e38d789557579f900ea3d70f104a440f8555a9681ed45f4a122dcbfd92e", size = 65765739 }, + { url = "https://files.pythonhosted.org/packages/d5/a5/646af791ccf75641b4df84fb6cb6e3914b0df87ec5fa5f82397fd5dc30ee/jaxlib-0.5.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d394dbde4a1c6bd67501cfb29d3819a10b900cb534cc0fc603319f7092f24cfa", size = 63711839 }, + { url = "https://files.pythonhosted.org/packages/53/8c/cbd861e40f0efe7923962ade21919fddcea43fae2794634833e800009b14/jaxlib-0.5.3-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:bddf6360377aa1c792e47fd87f307c342e331e5ff3582f940b1bca00f6b4bc73", size = 95764647 }, + { url = "https://files.pythonhosted.org/packages/3e/03/bace4acec295febca9329b3d2dd927b8ac74841e620e0d675f76109b805b/jaxlib-0.5.3-cp312-cp312-manylinux2014_x86_64.whl", hash = "sha256:5a5e88ab1cd6fdf78d69abe3544e8f09cce200dd339bb85fbe3c2ea67f2a5e68", size = 105132789 }, + { url = "https://files.pythonhosted.org/packages/79/f8/34568ec75f53d55b68649b6e1d6befd976fb9646e607954477264f5379ce/jaxlib-0.5.3-cp312-cp312-win_amd64.whl", hash = "sha256:520665929649f29f7d948d4070dbaf3e032a4c1f7c11f2863eac73320fcee784", size = 65789714 }, + { url = "https://files.pythonhosted.org/packages/b4/d0/ed6007cd17dc0f37f950f89e785092d9f0541f3fa6021d029657955206b5/jaxlib-0.5.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:31321c25282a06a6dfc940507bc14d0a0ac838d8ced6c07aa00a7fae34ce7b3f", size = 63710483 }, + { url = "https://files.pythonhosted.org/packages/36/8f/cafdf24170084de897ffe2a030241c2ba72d12eede85b940a81a94cab156/jaxlib-0.5.3-cp313-cp313-manylinux2014_aarch64.whl", hash = "sha256:e904b92dedfbc7e545725a8d7676987030ae9c069001d94701bc109c6dab4100", size = 95765995 }, + { url = "https://files.pythonhosted.org/packages/86/c7/fc0755ebd999c7c66ac4203d99f958d5ffc0a34eb270f57932ca0213bb54/jaxlib-0.5.3-cp313-cp313-manylinux2014_x86_64.whl", hash = "sha256:bb7593cb7fffcb13963f22fa5229ed960b8fb4ae5ec3b0820048cbd67f1e8e31", size = 105130796 }, + { url = "https://files.pythonhosted.org/packages/83/98/e32da21a490dc408d172ba246d6c47428482fe50d771c3f813e5fc063781/jaxlib-0.5.3-cp313-cp313-win_amd64.whl", hash = "sha256:8019f73a10b1290f988dd3768c684f3a8a147239091c3b790ce7e47e3bbc00bd", size = 65792205 }, +] + +[[package]] +name = "jedi" +version = "0.19.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "parso" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/72/3a/79a912fbd4d8dd6fbb02bf69afd3bb72cf0c729bb3063c6f4498603db17a/jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0", size = 1231287 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9", size = 1572278 }, +] + +[[package]] +name = "jupyterlab-widgets" +version = "3.0.13" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/59/73/fa26bbb747a9ea4fca6b01453aa22990d52ab62dd61384f1ac0dc9d4e7ba/jupyterlab_widgets-3.0.13.tar.gz", hash = "sha256:a2966d385328c1942b683a8cd96b89b8dd82c8b8f81dda902bb2bc06d46f5bed", size = 203556 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a9/93/858e87edc634d628e5d752ba944c2833133a28fa87bb093e6832ced36a3e/jupyterlab_widgets-3.0.13-py3-none-any.whl", hash = "sha256:e3cda2c233ce144192f1e29914ad522b2f4c40e77214b0cc97377ca3d323db54", size = 214392 }, +] + +[[package]] +name = "matplotlib-inline" +version = "0.1.7" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/99/5b/a36a337438a14116b16480db471ad061c36c3694df7c2084a0da7ba538b7/matplotlib_inline-0.1.7.tar.gz", hash = "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90", size = 8159 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8f/8e/9ad090d3553c280a8060fbf6e24dc1c0c29704ee7d1c372f0c174aa59285/matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca", size = 9899 }, +] + +[[package]] +name = "mccabe" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/ff/0ffefdcac38932a54d2b5eed4e0ba8a408f215002cd178ad1df0f2806ff8/mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325", size = 9658 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/27/1a/1f68f9ba0c207934b35b86a8ca3aad8395a3d6dd7921c0686e23853ff5a9/mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e", size = 7350 }, +] + +[[package]] +name = "ml-dtypes" +version = "0.5.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/32/49/6e67c334872d2c114df3020e579f3718c333198f8312290e09ec0216703a/ml_dtypes-0.5.1.tar.gz", hash = "sha256:ac5b58559bb84a95848ed6984eb8013249f90b6bab62aa5acbad876e256002c9", size = 698772 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/88/11ebdbc75445eeb5b6869b708a0d787d1ed812ff86c2170bbfb95febdce1/ml_dtypes-0.5.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:bd73f51957949069573ff783563486339a9285d72e2f36c18e0c1aa9ca7eb190", size = 671450 }, + { url = "https://files.pythonhosted.org/packages/a4/a4/9321cae435d6140f9b0e7af8334456a854b60e3a9c6101280a16e3594965/ml_dtypes-0.5.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:810512e2eccdfc3b41eefa3a27402371a3411453a1efc7e9c000318196140fed", size = 4621075 }, + { url = "https://files.pythonhosted.org/packages/16/d8/4502e12c6a10d42e13a552e8d97f20198e3cf82a0d1411ad50be56a5077c/ml_dtypes-0.5.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:141b2ea2f20bb10802ddca55d91fe21231ef49715cfc971998e8f2a9838f3dbe", size = 4738414 }, + { url = "https://files.pythonhosted.org/packages/6b/7e/bc54ae885e4d702e60a4bf50aa9066ff35e9c66b5213d11091f6bffb3036/ml_dtypes-0.5.1-cp310-cp310-win_amd64.whl", hash = "sha256:26ebcc69d7b779c8f129393e99732961b5cc33fcff84090451f448c89b0e01b4", size = 209718 }, + { url = "https://files.pythonhosted.org/packages/c9/fd/691335926126bb9beeb030b61a28f462773dcf16b8e8a2253b599013a303/ml_dtypes-0.5.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:023ce2f502efd4d6c1e0472cc58ce3640d051d40e71e27386bed33901e201327", size = 671448 }, + { url = "https://files.pythonhosted.org/packages/ff/a6/63832d91f2feb250d865d069ba1a5d0c686b1f308d1c74ce9764472c5e22/ml_dtypes-0.5.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7000b6e4d8ef07542c05044ec5d8bbae1df083b3f56822c3da63993a113e716f", size = 4625792 }, + { url = "https://files.pythonhosted.org/packages/cc/2a/5421fd3dbe6eef9b844cc9d05f568b9fb568503a2e51cb1eb4443d9fc56b/ml_dtypes-0.5.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c09526488c3a9e8b7a23a388d4974b670a9a3dd40c5c8a61db5593ce9b725bab", size = 4743893 }, + { url = "https://files.pythonhosted.org/packages/60/30/d3f0fc9499a22801219679a7f3f8d59f1429943c6261f445fb4bfce20718/ml_dtypes-0.5.1-cp311-cp311-win_amd64.whl", hash = "sha256:15ad0f3b0323ce96c24637a88a6f44f6713c64032f27277b069f285c3cf66478", size = 209712 }, + { url = "https://files.pythonhosted.org/packages/47/56/1bb21218e1e692506c220ffabd456af9733fba7aa1b14f73899979f4cc20/ml_dtypes-0.5.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:6f462f5eca22fb66d7ff9c4744a3db4463af06c49816c4b6ac89b16bfcdc592e", size = 670372 }, + { url = "https://files.pythonhosted.org/packages/20/95/d8bd96a3b60e00bf31bd78ca4bdd2d6bbaf5acb09b42844432d719d34061/ml_dtypes-0.5.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f76232163b5b9c34291b54621ee60417601e2e4802a188a0ea7157cd9b323f4", size = 4635946 }, + { url = "https://files.pythonhosted.org/packages/08/57/5d58fad4124192b1be42f68bd0c0ddaa26e44a730ff8c9337adade2f5632/ml_dtypes-0.5.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad4953c5eb9c25a56d11a913c2011d7e580a435ef5145f804d98efa14477d390", size = 4694804 }, + { url = "https://files.pythonhosted.org/packages/38/bc/c4260e4a6c6bf684d0313308de1c860467275221d5e7daf69b3fcddfdd0b/ml_dtypes-0.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:9626d0bca1fb387d5791ca36bacbba298c5ef554747b7ebeafefb4564fc83566", size = 210853 }, + { url = "https://files.pythonhosted.org/packages/0f/92/bb6a3d18e16fddd18ce6d5f480e1919b33338c70e18cba831c6ae59812ee/ml_dtypes-0.5.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:12651420130ee7cc13059fc56dac6ad300c3af3848b802d475148c9defd27c23", size = 667696 }, + { url = "https://files.pythonhosted.org/packages/6d/29/cfc89d842767e9a51146043b0fa18332c2b38f8831447e6cb1160e3c6102/ml_dtypes-0.5.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9945669d3dadf8acb40ec2e57d38c985d8c285ea73af57fc5b09872c516106d", size = 4638365 }, + { url = "https://files.pythonhosted.org/packages/be/26/adc36e3ea09603d9f6d114894e1c1b7b8e8a9ef6d0b031cc270c6624a37c/ml_dtypes-0.5.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf9975bda82a99dc935f2ae4c83846d86df8fd6ba179614acac8e686910851da", size = 4702722 }, + { url = "https://files.pythonhosted.org/packages/da/8a/a2b9375c94077e5a488a624a195621407846f504068ce22ccf805c674156/ml_dtypes-0.5.1-cp313-cp313-win_amd64.whl", hash = "sha256:fd918d4e6a4e0c110e2e05be7a7814d10dc1b95872accbf6512b80a109b71ae1", size = 210850 }, + { url = "https://files.pythonhosted.org/packages/52/38/703169100fdde27957f061d4d0ea3e00525775a09acaccf7e655d9609d55/ml_dtypes-0.5.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:05f23447a1c20ddf4dc7c2c661aa9ed93fcb2658f1017c204d1e758714dc28a8", size = 693043 }, + { url = "https://files.pythonhosted.org/packages/28/ff/4e234c9c23e0d456f5da5a326c103bf890c746d93351524d987e41f438b3/ml_dtypes-0.5.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b7fbe5571fdf28fd3aaab3ef4aafc847de9ebf263be959958c1ca58ec8eadf5", size = 4903946 }, + { url = "https://files.pythonhosted.org/packages/b7/45/c1a1ccfdd02bc4173ca0f4a2d327683a27df85797b885eb1da1ca325b85c/ml_dtypes-0.5.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d13755f8e8445b3870114e5b6240facaa7cb0c3361e54beba3e07fa912a6e12b", size = 5052731 }, +] + +[[package]] +name = "mypy" +version = "1.15.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mypy-extensions" }, + { name = "tomli", marker = "python_full_version < '3.11'" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ce/43/d5e49a86afa64bd3839ea0d5b9c7103487007d728e1293f52525d6d5486a/mypy-1.15.0.tar.gz", hash = "sha256:404534629d51d3efea5c800ee7c42b72a6554d6c400e6a79eafe15d11341fd43", size = 3239717 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/68/f8/65a7ce8d0e09b6329ad0c8d40330d100ea343bd4dd04c4f8ae26462d0a17/mypy-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:979e4e1a006511dacf628e36fadfecbcc0160a8af6ca7dad2f5025529e082c13", size = 10738433 }, + { url = "https://files.pythonhosted.org/packages/b4/95/9c0ecb8eacfe048583706249439ff52105b3f552ea9c4024166c03224270/mypy-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c4bb0e1bd29f7d34efcccd71cf733580191e9a264a2202b0239da95984c5b559", size = 9861472 }, + { url = "https://files.pythonhosted.org/packages/84/09/9ec95e982e282e20c0d5407bc65031dfd0f0f8ecc66b69538296e06fcbee/mypy-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:be68172e9fd9ad8fb876c6389f16d1c1b5f100ffa779f77b1fb2176fcc9ab95b", size = 11611424 }, + { url = "https://files.pythonhosted.org/packages/78/13/f7d14e55865036a1e6a0a69580c240f43bc1f37407fe9235c0d4ef25ffb0/mypy-1.15.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c7be1e46525adfa0d97681432ee9fcd61a3964c2446795714699a998d193f1a3", size = 12365450 }, + { url = "https://files.pythonhosted.org/packages/48/e1/301a73852d40c241e915ac6d7bcd7fedd47d519246db2d7b86b9d7e7a0cb/mypy-1.15.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:2e2c2e6d3593f6451b18588848e66260ff62ccca522dd231cd4dd59b0160668b", size = 12551765 }, + { url = "https://files.pythonhosted.org/packages/77/ba/c37bc323ae5fe7f3f15a28e06ab012cd0b7552886118943e90b15af31195/mypy-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:6983aae8b2f653e098edb77f893f7b6aca69f6cffb19b2cc7443f23cce5f4828", size = 9274701 }, + { url = "https://files.pythonhosted.org/packages/03/bc/f6339726c627bd7ca1ce0fa56c9ae2d0144604a319e0e339bdadafbbb599/mypy-1.15.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2922d42e16d6de288022e5ca321cd0618b238cfc5570e0263e5ba0a77dbef56f", size = 10662338 }, + { url = "https://files.pythonhosted.org/packages/e2/90/8dcf506ca1a09b0d17555cc00cd69aee402c203911410136cd716559efe7/mypy-1.15.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2ee2d57e01a7c35de00f4634ba1bbf015185b219e4dc5909e281016df43f5ee5", size = 9787540 }, + { url = "https://files.pythonhosted.org/packages/05/05/a10f9479681e5da09ef2f9426f650d7b550d4bafbef683b69aad1ba87457/mypy-1.15.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:973500e0774b85d9689715feeffcc980193086551110fd678ebe1f4342fb7c5e", size = 11538051 }, + { url = "https://files.pythonhosted.org/packages/e9/9a/1f7d18b30edd57441a6411fcbc0c6869448d1a4bacbaee60656ac0fc29c8/mypy-1.15.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5a95fb17c13e29d2d5195869262f8125dfdb5c134dc8d9a9d0aecf7525b10c2c", size = 12286751 }, + { url = "https://files.pythonhosted.org/packages/72/af/19ff499b6f1dafcaf56f9881f7a965ac2f474f69f6f618b5175b044299f5/mypy-1.15.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1905f494bfd7d85a23a88c5d97840888a7bd516545fc5aaedff0267e0bb54e2f", size = 12421783 }, + { url = "https://files.pythonhosted.org/packages/96/39/11b57431a1f686c1aed54bf794870efe0f6aeca11aca281a0bd87a5ad42c/mypy-1.15.0-cp311-cp311-win_amd64.whl", hash = "sha256:c9817fa23833ff189db061e6d2eff49b2f3b6ed9856b4a0a73046e41932d744f", size = 9265618 }, + { url = "https://files.pythonhosted.org/packages/98/3a/03c74331c5eb8bd025734e04c9840532226775c47a2c39b56a0c8d4f128d/mypy-1.15.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:aea39e0583d05124836ea645f412e88a5c7d0fd77a6d694b60d9b6b2d9f184fd", size = 10793981 }, + { url = "https://files.pythonhosted.org/packages/f0/1a/41759b18f2cfd568848a37c89030aeb03534411eef981df621d8fad08a1d/mypy-1.15.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2f2147ab812b75e5b5499b01ade1f4a81489a147c01585cda36019102538615f", size = 9749175 }, + { url = "https://files.pythonhosted.org/packages/12/7e/873481abf1ef112c582db832740f4c11b2bfa510e829d6da29b0ab8c3f9c/mypy-1.15.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ce436f4c6d218a070048ed6a44c0bbb10cd2cc5e272b29e7845f6a2f57ee4464", size = 11455675 }, + { url = "https://files.pythonhosted.org/packages/b3/d0/92ae4cde706923a2d3f2d6c39629134063ff64b9dedca9c1388363da072d/mypy-1.15.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8023ff13985661b50a5928fc7a5ca15f3d1affb41e5f0a9952cb68ef090b31ee", size = 12410020 }, + { url = "https://files.pythonhosted.org/packages/46/8b/df49974b337cce35f828ba6fda228152d6db45fed4c86ba56ffe442434fd/mypy-1.15.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1124a18bc11a6a62887e3e137f37f53fbae476dc36c185d549d4f837a2a6a14e", size = 12498582 }, + { url = "https://files.pythonhosted.org/packages/13/50/da5203fcf6c53044a0b699939f31075c45ae8a4cadf538a9069b165c1050/mypy-1.15.0-cp312-cp312-win_amd64.whl", hash = "sha256:171a9ca9a40cd1843abeca0e405bc1940cd9b305eaeea2dda769ba096932bb22", size = 9366614 }, + { url = "https://files.pythonhosted.org/packages/6a/9b/fd2e05d6ffff24d912f150b87db9e364fa8282045c875654ce7e32fffa66/mypy-1.15.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:93faf3fdb04768d44bf28693293f3904bbb555d076b781ad2530214ee53e3445", size = 10788592 }, + { url = "https://files.pythonhosted.org/packages/74/37/b246d711c28a03ead1fd906bbc7106659aed7c089d55fe40dd58db812628/mypy-1.15.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:811aeccadfb730024c5d3e326b2fbe9249bb7413553f15499a4050f7c30e801d", size = 9753611 }, + { url = "https://files.pythonhosted.org/packages/a6/ac/395808a92e10cfdac8003c3de9a2ab6dc7cde6c0d2a4df3df1b815ffd067/mypy-1.15.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:98b7b9b9aedb65fe628c62a6dc57f6d5088ef2dfca37903a7d9ee374d03acca5", size = 11438443 }, + { url = "https://files.pythonhosted.org/packages/d2/8b/801aa06445d2de3895f59e476f38f3f8d610ef5d6908245f07d002676cbf/mypy-1.15.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c43a7682e24b4f576d93072216bf56eeff70d9140241f9edec0c104d0c515036", size = 12402541 }, + { url = "https://files.pythonhosted.org/packages/c7/67/5a4268782eb77344cc613a4cf23540928e41f018a9a1ec4c6882baf20ab8/mypy-1.15.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:baefc32840a9f00babd83251560e0ae1573e2f9d1b067719479bfb0e987c6357", size = 12494348 }, + { url = "https://files.pythonhosted.org/packages/83/3e/57bb447f7bbbfaabf1712d96f9df142624a386d98fb026a761532526057e/mypy-1.15.0-cp313-cp313-win_amd64.whl", hash = "sha256:b9378e2c00146c44793c98b8d5a61039a048e31f429fb0eb546d93f4b000bedf", size = 9373648 }, + { url = "https://files.pythonhosted.org/packages/09/4e/a7d65c7322c510de2c409ff3828b03354a7c43f5a8ed458a7a131b41c7b9/mypy-1.15.0-py3-none-any.whl", hash = "sha256:5469affef548bd1895d86d3bf10ce2b44e33d86923c29e4d675b3e323437ea3e", size = 2221777 }, +] + +[[package]] +name = "mypy-extensions" +version = "1.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/98/a4/1ab47638b92648243faf97a5aeb6ea83059cc3624972ab6b8d2316078d3f/mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782", size = 4433 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/e2/5d3f6ada4297caebe1a2add3b126fe800c96f56dbe5d1988a2cbe0b267aa/mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d", size = 4695 }, +] + +[[package]] +name = "numpy" +version = "2.2.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e1/78/31103410a57bc2c2b93a3597340a8119588571f6a4539067546cb9a0bfac/numpy-2.2.4.tar.gz", hash = "sha256:9ba03692a45d3eef66559efe1d1096c4b9b75c0986b5dff5530c378fb8331d4f", size = 20270701 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/89/a79e86e5c1433926ed7d60cb267fb64aa578b6101ab645800fd43b4801de/numpy-2.2.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8146f3550d627252269ac42ae660281d673eb6f8b32f113538e0cc2a9aed42b9", size = 21250661 }, + { url = "https://files.pythonhosted.org/packages/79/c2/f50921beb8afd60ed9589ad880332cfefdb805422210d327fb48f12b7a81/numpy-2.2.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e642d86b8f956098b564a45e6f6ce68a22c2c97a04f5acd3f221f57b8cb850ae", size = 14389926 }, + { url = "https://files.pythonhosted.org/packages/c7/b9/2c4e96130b0b0f97b0ef4a06d6dae3b39d058b21a5e2fa2decd7fd6b1c8f/numpy-2.2.4-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:a84eda42bd12edc36eb5b53bbcc9b406820d3353f1994b6cfe453a33ff101775", size = 5428329 }, + { url = "https://files.pythonhosted.org/packages/7f/a5/3d7094aa898f4fc5c84cdfb26beeae780352d43f5d8bdec966c4393d644c/numpy-2.2.4-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:4ba5054787e89c59c593a4169830ab362ac2bee8a969249dc56e5d7d20ff8df9", size = 6963559 }, + { url = "https://files.pythonhosted.org/packages/4c/22/fb1be710a14434c09080dd4a0acc08939f612ec02efcb04b9e210474782d/numpy-2.2.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7716e4a9b7af82c06a2543c53ca476fa0b57e4d760481273e09da04b74ee6ee2", size = 14368066 }, + { url = "https://files.pythonhosted.org/packages/c2/07/2e5cc71193e3ef3a219ffcf6ca4858e46ea2be09c026ddd480d596b32867/numpy-2.2.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:adf8c1d66f432ce577d0197dceaac2ac00c0759f573f28516246351c58a85020", size = 16417040 }, + { url = "https://files.pythonhosted.org/packages/1a/97/3b1537776ad9a6d1a41813818343745e8dd928a2916d4c9edcd9a8af1dac/numpy-2.2.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:218f061d2faa73621fa23d6359442b0fc658d5b9a70801373625d958259eaca3", size = 15879862 }, + { url = "https://files.pythonhosted.org/packages/b0/b7/4472f603dd45ef36ff3d8e84e84fe02d9467c78f92cc121633dce6da307b/numpy-2.2.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:df2f57871a96bbc1b69733cd4c51dc33bea66146b8c63cacbfed73eec0883017", size = 18206032 }, + { url = "https://files.pythonhosted.org/packages/0d/bd/6a092963fb82e6c5aa0d0440635827bbb2910da229545473bbb58c537ed3/numpy-2.2.4-cp310-cp310-win32.whl", hash = "sha256:a0258ad1f44f138b791327961caedffbf9612bfa504ab9597157806faa95194a", size = 6608517 }, + { url = "https://files.pythonhosted.org/packages/01/e3/cb04627bc2a1638948bc13e818df26495aa18e20d5be1ed95ab2b10b6847/numpy-2.2.4-cp310-cp310-win_amd64.whl", hash = "sha256:0d54974f9cf14acf49c60f0f7f4084b6579d24d439453d5fc5805d46a165b542", size = 12943498 }, + { url = "https://files.pythonhosted.org/packages/16/fb/09e778ee3a8ea0d4dc8329cca0a9c9e65fed847d08e37eba74cb7ed4b252/numpy-2.2.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e9e0a277bb2eb5d8a7407e14688b85fd8ad628ee4e0c7930415687b6564207a4", size = 21254989 }, + { url = "https://files.pythonhosted.org/packages/a2/0a/1212befdbecab5d80eca3cde47d304cad986ad4eec7d85a42e0b6d2cc2ef/numpy-2.2.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9eeea959168ea555e556b8188da5fa7831e21d91ce031e95ce23747b7609f8a4", size = 14425910 }, + { url = "https://files.pythonhosted.org/packages/2b/3e/e7247c1d4f15086bb106c8d43c925b0b2ea20270224f5186fa48d4fb5cbd/numpy-2.2.4-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:bd3ad3b0a40e713fc68f99ecfd07124195333f1e689387c180813f0e94309d6f", size = 5426490 }, + { url = "https://files.pythonhosted.org/packages/5d/fa/aa7cd6be51419b894c5787a8a93c3302a1ed4f82d35beb0613ec15bdd0e2/numpy-2.2.4-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:cf28633d64294969c019c6df4ff37f5698e8326db68cc2b66576a51fad634880", size = 6967754 }, + { url = "https://files.pythonhosted.org/packages/d5/ee/96457c943265de9fadeb3d2ffdbab003f7fba13d971084a9876affcda095/numpy-2.2.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2fa8fa7697ad1646b5c93de1719965844e004fcad23c91228aca1cf0800044a1", size = 14373079 }, + { url = "https://files.pythonhosted.org/packages/c5/5c/ceefca458559f0ccc7a982319f37ed07b0d7b526964ae6cc61f8ad1b6119/numpy-2.2.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f4162988a360a29af158aeb4a2f4f09ffed6a969c9776f8f3bdee9b06a8ab7e5", size = 16428819 }, + { url = "https://files.pythonhosted.org/packages/22/31/9b2ac8eee99e001eb6add9fa27514ef5e9faf176169057a12860af52704c/numpy-2.2.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:892c10d6a73e0f14935c31229e03325a7b3093fafd6ce0af704be7f894d95687", size = 15881470 }, + { url = "https://files.pythonhosted.org/packages/f0/dc/8569b5f25ff30484b555ad8a3f537e0225d091abec386c9420cf5f7a2976/numpy-2.2.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:db1f1c22173ac1c58db249ae48aa7ead29f534b9a948bc56828337aa84a32ed6", size = 18218144 }, + { url = "https://files.pythonhosted.org/packages/5e/05/463c023a39bdeb9bb43a99e7dee2c664cb68d5bb87d14f92482b9f6011cc/numpy-2.2.4-cp311-cp311-win32.whl", hash = "sha256:ea2bb7e2ae9e37d96835b3576a4fa4b3a97592fbea8ef7c3587078b0068b8f09", size = 6606368 }, + { url = "https://files.pythonhosted.org/packages/8b/72/10c1d2d82101c468a28adc35de6c77b308f288cfd0b88e1070f15b98e00c/numpy-2.2.4-cp311-cp311-win_amd64.whl", hash = "sha256:f7de08cbe5551911886d1ab60de58448c6df0f67d9feb7d1fb21e9875ef95e91", size = 12947526 }, + { url = "https://files.pythonhosted.org/packages/a2/30/182db21d4f2a95904cec1a6f779479ea1ac07c0647f064dea454ec650c42/numpy-2.2.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a7b9084668aa0f64e64bd00d27ba5146ef1c3a8835f3bd912e7a9e01326804c4", size = 20947156 }, + { url = "https://files.pythonhosted.org/packages/24/6d/9483566acfbda6c62c6bc74b6e981c777229d2af93c8eb2469b26ac1b7bc/numpy-2.2.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:dbe512c511956b893d2dacd007d955a3f03d555ae05cfa3ff1c1ff6df8851854", size = 14133092 }, + { url = "https://files.pythonhosted.org/packages/27/f6/dba8a258acbf9d2bed2525cdcbb9493ef9bae5199d7a9cb92ee7e9b2aea6/numpy-2.2.4-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:bb649f8b207ab07caebba230d851b579a3c8711a851d29efe15008e31bb4de24", size = 5163515 }, + { url = "https://files.pythonhosted.org/packages/62/30/82116199d1c249446723c68f2c9da40d7f062551036f50b8c4caa42ae252/numpy-2.2.4-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:f34dc300df798742b3d06515aa2a0aee20941c13579d7a2f2e10af01ae4901ee", size = 6696558 }, + { url = "https://files.pythonhosted.org/packages/0e/b2/54122b3c6df5df3e87582b2e9430f1bdb63af4023c739ba300164c9ae503/numpy-2.2.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3f7ac96b16955634e223b579a3e5798df59007ca43e8d451a0e6a50f6bfdfba", size = 14084742 }, + { url = "https://files.pythonhosted.org/packages/02/e2/e2cbb8d634151aab9528ef7b8bab52ee4ab10e076509285602c2a3a686e0/numpy-2.2.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f92084defa704deadd4e0a5ab1dc52d8ac9e8a8ef617f3fbb853e79b0ea3592", size = 16134051 }, + { url = "https://files.pythonhosted.org/packages/8e/21/efd47800e4affc993e8be50c1b768de038363dd88865920439ef7b422c60/numpy-2.2.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7a4e84a6283b36632e2a5b56e121961f6542ab886bc9e12f8f9818b3c266bfbb", size = 15578972 }, + { url = "https://files.pythonhosted.org/packages/04/1e/f8bb88f6157045dd5d9b27ccf433d016981032690969aa5c19e332b138c0/numpy-2.2.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:11c43995255eb4127115956495f43e9343736edb7fcdb0d973defd9de14cd84f", size = 17898106 }, + { url = "https://files.pythonhosted.org/packages/2b/93/df59a5a3897c1f036ae8ff845e45f4081bb06943039ae28a3c1c7c780f22/numpy-2.2.4-cp312-cp312-win32.whl", hash = "sha256:65ef3468b53269eb5fdb3a5c09508c032b793da03251d5f8722b1194f1790c00", size = 6311190 }, + { url = "https://files.pythonhosted.org/packages/46/69/8c4f928741c2a8efa255fdc7e9097527c6dc4e4df147e3cadc5d9357ce85/numpy-2.2.4-cp312-cp312-win_amd64.whl", hash = "sha256:2aad3c17ed2ff455b8eaafe06bcdae0062a1db77cb99f4b9cbb5f4ecb13c5146", size = 12644305 }, + { url = "https://files.pythonhosted.org/packages/2a/d0/bd5ad792e78017f5decfb2ecc947422a3669a34f775679a76317af671ffc/numpy-2.2.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1cf4e5c6a278d620dee9ddeb487dc6a860f9b199eadeecc567f777daace1e9e7", size = 20933623 }, + { url = "https://files.pythonhosted.org/packages/c3/bc/2b3545766337b95409868f8e62053135bdc7fa2ce630aba983a2aa60b559/numpy-2.2.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1974afec0b479e50438fc3648974268f972e2d908ddb6d7fb634598cdb8260a0", size = 14148681 }, + { url = "https://files.pythonhosted.org/packages/6a/70/67b24d68a56551d43a6ec9fe8c5f91b526d4c1a46a6387b956bf2d64744e/numpy-2.2.4-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:79bd5f0a02aa16808fcbc79a9a376a147cc1045f7dfe44c6e7d53fa8b8a79392", size = 5148759 }, + { url = "https://files.pythonhosted.org/packages/1c/8b/e2fc8a75fcb7be12d90b31477c9356c0cbb44abce7ffb36be39a0017afad/numpy-2.2.4-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:3387dd7232804b341165cedcb90694565a6015433ee076c6754775e85d86f1fc", size = 6683092 }, + { url = "https://files.pythonhosted.org/packages/13/73/41b7b27f169ecf368b52533edb72e56a133f9e86256e809e169362553b49/numpy-2.2.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f527d8fdb0286fd2fd97a2a96c6be17ba4232da346931d967a0630050dfd298", size = 14081422 }, + { url = "https://files.pythonhosted.org/packages/4b/04/e208ff3ae3ddfbafc05910f89546382f15a3f10186b1f56bd99f159689c2/numpy-2.2.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bce43e386c16898b91e162e5baaad90c4b06f9dcbe36282490032cec98dc8ae7", size = 16132202 }, + { url = "https://files.pythonhosted.org/packages/fe/bc/2218160574d862d5e55f803d88ddcad88beff94791f9c5f86d67bd8fbf1c/numpy-2.2.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:31504f970f563d99f71a3512d0c01a645b692b12a63630d6aafa0939e52361e6", size = 15573131 }, + { url = "https://files.pythonhosted.org/packages/a5/78/97c775bc4f05abc8a8426436b7cb1be806a02a2994b195945600855e3a25/numpy-2.2.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:81413336ef121a6ba746892fad881a83351ee3e1e4011f52e97fba79233611fd", size = 17894270 }, + { url = "https://files.pythonhosted.org/packages/b9/eb/38c06217a5f6de27dcb41524ca95a44e395e6a1decdc0c99fec0832ce6ae/numpy-2.2.4-cp313-cp313-win32.whl", hash = "sha256:f486038e44caa08dbd97275a9a35a283a8f1d2f0ee60ac260a1790e76660833c", size = 6308141 }, + { url = "https://files.pythonhosted.org/packages/52/17/d0dd10ab6d125c6d11ffb6dfa3423c3571befab8358d4f85cd4471964fcd/numpy-2.2.4-cp313-cp313-win_amd64.whl", hash = "sha256:207a2b8441cc8b6a2a78c9ddc64d00d20c303d79fba08c577752f080c4007ee3", size = 12636885 }, + { url = "https://files.pythonhosted.org/packages/fa/e2/793288ede17a0fdc921172916efb40f3cbc2aa97e76c5c84aba6dc7e8747/numpy-2.2.4-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:8120575cb4882318c791f839a4fd66161a6fa46f3f0a5e613071aae35b5dd8f8", size = 20961829 }, + { url = "https://files.pythonhosted.org/packages/3a/75/bb4573f6c462afd1ea5cbedcc362fe3e9bdbcc57aefd37c681be1155fbaa/numpy-2.2.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a761ba0fa886a7bb33c6c8f6f20213735cb19642c580a931c625ee377ee8bd39", size = 14161419 }, + { url = "https://files.pythonhosted.org/packages/03/68/07b4cd01090ca46c7a336958b413cdbe75002286295f2addea767b7f16c9/numpy-2.2.4-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:ac0280f1ba4a4bfff363a99a6aceed4f8e123f8a9b234c89140f5e894e452ecd", size = 5196414 }, + { url = "https://files.pythonhosted.org/packages/a5/fd/d4a29478d622fedff5c4b4b4cedfc37a00691079623c0575978d2446db9e/numpy-2.2.4-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:879cf3a9a2b53a4672a168c21375166171bc3932b7e21f622201811c43cdd3b0", size = 6709379 }, + { url = "https://files.pythonhosted.org/packages/41/78/96dddb75bb9be730b87c72f30ffdd62611aba234e4e460576a068c98eff6/numpy-2.2.4-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f05d4198c1bacc9124018109c5fba2f3201dbe7ab6e92ff100494f236209c960", size = 14051725 }, + { url = "https://files.pythonhosted.org/packages/00/06/5306b8199bffac2a29d9119c11f457f6c7d41115a335b78d3f86fad4dbe8/numpy-2.2.4-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2f085ce2e813a50dfd0e01fbfc0c12bbe5d2063d99f8b29da30e544fb6483b8", size = 16101638 }, + { url = "https://files.pythonhosted.org/packages/fa/03/74c5b631ee1ded596945c12027649e6344614144369fd3ec1aaced782882/numpy-2.2.4-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:92bda934a791c01d6d9d8e038363c50918ef7c40601552a58ac84c9613a665bc", size = 15571717 }, + { url = "https://files.pythonhosted.org/packages/cb/dc/4fc7c0283abe0981e3b89f9b332a134e237dd476b0c018e1e21083310c31/numpy-2.2.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ee4d528022f4c5ff67332469e10efe06a267e32f4067dc76bb7e2cddf3cd25ff", size = 17879998 }, + { url = "https://files.pythonhosted.org/packages/e5/2b/878576190c5cfa29ed896b518cc516aecc7c98a919e20706c12480465f43/numpy-2.2.4-cp313-cp313t-win32.whl", hash = "sha256:05c076d531e9998e7e694c36e8b349969c56eadd2cdcd07242958489d79a7286", size = 6366896 }, + { url = "https://files.pythonhosted.org/packages/3e/05/eb7eec66b95cf697f08c754ef26c3549d03ebd682819f794cb039574a0a6/numpy-2.2.4-cp313-cp313t-win_amd64.whl", hash = "sha256:188dcbca89834cc2e14eb2f106c96d6d46f200fe0200310fc29089657379c58d", size = 12739119 }, + { url = "https://files.pythonhosted.org/packages/b2/5c/f09c33a511aff41a098e6ef3498465d95f6360621034a3d95f47edbc9119/numpy-2.2.4-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7051ee569db5fbac144335e0f3b9c2337e0c8d5c9fee015f259a5bd70772b7e8", size = 21081956 }, + { url = "https://files.pythonhosted.org/packages/ba/30/74c48b3b6494c4b820b7fa1781d441e94d87a08daa5b35d222f06ba41a6f/numpy-2.2.4-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:ab2939cd5bec30a7430cbdb2287b63151b77cf9624de0532d629c9a1c59b1d5c", size = 6827143 }, + { url = "https://files.pythonhosted.org/packages/54/f5/ab0d2f48b490535c7a80e05da4a98902b632369efc04f0e47bb31ca97d8f/numpy-2.2.4-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d0f35b19894a9e08639fd60a1ec1978cb7f5f7f1eace62f38dd36be8aecdef4d", size = 16233350 }, + { url = "https://files.pythonhosted.org/packages/3b/3a/2f6d8c1f8e45d496bca6baaec93208035faeb40d5735c25afac092ec9a12/numpy-2.2.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:b4adfbbc64014976d2f91084915ca4e626fbf2057fb81af209c1a6d776d23e3d", size = 12857565 }, +] + +[[package]] +name = "opt-einsum" +version = "3.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8c/b9/2ac072041e899a52f20cf9510850ff58295003aa75525e58343591b0cbfb/opt_einsum-3.4.0.tar.gz", hash = "sha256:96ca72f1b886d148241348783498194c577fa30a8faac108586b14f1ba4473ac", size = 63004 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/23/cd/066e86230ae37ed0be70aae89aabf03ca8d9f39c8aea0dec8029455b5540/opt_einsum-3.4.0-py3-none-any.whl", hash = "sha256:69bb92469f86a1565195ece4ac0323943e83477171b91d24c35afe028a90d7cd", size = 71932 }, +] + +[[package]] +name = "packaging" +version = "24.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d0/63/68dbb6eb2de9cb10ee4c9c14a0148804425e13c4fb20d61cce69f53106da/packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f", size = 163950 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", size = 65451 }, +] + +[[package]] +name = "parso" +version = "0.8.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/66/94/68e2e17afaa9169cf6412ab0f28623903be73d1b32e208d9e8e541bb086d/parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d", size = 400609 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c6/ac/dac4a63f978e4dcb3c6d3a78c4d8e0192a113d288502a1216950c41b1027/parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18", size = 103650 }, +] + +[[package]] +name = "pathspec" +version = "0.12.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ca/bc/f35b8446f4531a7cb215605d100cd88b7ac6f44ab3fc94870c120ab3adbf/pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712", size = 51043 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", size = 31191 }, +] + +[[package]] +name = "pexpect" +version = "4.9.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ptyprocess" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/42/92/cc564bf6381ff43ce1f4d06852fc19a2f11d180f23dc32d9588bee2f149d/pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f", size = 166450 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", size = 63772 }, +] + +[[package]] +name = "platformdirs" +version = "4.3.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b6/2d/7d512a3913d60623e7eb945c6d1b4f0bddf1d0b7ada5225274c87e5b53d1/platformdirs-4.3.7.tar.gz", hash = "sha256:eb437d586b6a0986388f0d6f74aa0cde27b48d0e3d66843640bfb6bdcdb6e351", size = 21291 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6d/45/59578566b3275b8fd9157885918fcd0c4d74162928a5310926887b856a51/platformdirs-4.3.7-py3-none-any.whl", hash = "sha256:a03875334331946f13c549dbd8f4bac7a13a50a895a0eb1e8c6a8ace80d40a94", size = 18499 }, +] + +[[package]] +name = "prompt-toolkit" +version = "3.0.50" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "wcwidth" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a1/e1/bd15cb8ffdcfeeb2bdc215de3c3cffca11408d829e4b8416dcfe71ba8854/prompt_toolkit-3.0.50.tar.gz", hash = "sha256:544748f3860a2623ca5cd6d2795e7a14f3d0e1c3c9728359013f79877fc89bab", size = 429087 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e4/ea/d836f008d33151c7a1f62caf3d8dd782e4d15f6a43897f64480c2b8de2ad/prompt_toolkit-3.0.50-py3-none-any.whl", hash = "sha256:9b6427eb19e479d98acff65196a307c555eb567989e6d88ebbb1b509d9779198", size = 387816 }, +] + +[[package]] +name = "ptyprocess" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/20/e5/16ff212c1e452235a90aeb09066144d0c5a6a8c0834397e03f5224495c4e/ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220", size = 70762 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", size = 13993 }, +] + +[[package]] +name = "pure-eval" +version = "0.2.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cd/05/0a34433a064256a578f1783a10da6df098ceaa4a57bbeaa96a6c0352786b/pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42", size = 19752 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0", size = 11842 }, +] + +[[package]] +name = "pycodestyle" +version = "2.12.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/43/aa/210b2c9aedd8c1cbeea31a50e42050ad56187754b34eb214c46709445801/pycodestyle-2.12.1.tar.gz", hash = "sha256:6838eae08bbce4f6accd5d5572075c63626a15ee3e6f842df996bf62f6d73521", size = 39232 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3a/d8/a211b3f85e99a0daa2ddec96c949cac6824bd305b040571b82a03dd62636/pycodestyle-2.12.1-py2.py3-none-any.whl", hash = "sha256:46f0fb92069a7c28ab7bb558f05bfc0110dac69a0cd23c61ea0040283a9d78b3", size = 31284 }, +] + +[[package]] +name = "pyflakes" +version = "3.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/57/f9/669d8c9c86613c9d568757c7f5824bd3197d7b1c6c27553bc5618a27cce2/pyflakes-3.2.0.tar.gz", hash = "sha256:1c61603ff154621fb2a9172037d84dca3500def8c8b630657d1701f026f8af3f", size = 63788 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d4/d7/f1b7db88d8e4417c5d47adad627a93547f44bdc9028372dbd2313f34a855/pyflakes-3.2.0-py2.py3-none-any.whl", hash = "sha256:84b5be138a2dfbb40689ca07e2152deb896a65c3a3e24c251c5c62489568074a", size = 62725 }, +] + +[[package]] +name = "pygments" +version = "2.19.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7c/2d/c3338d48ea6cc0feb8446d8e6937e1408088a72a39937982cc6111d17f84/pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f", size = 4968581 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c", size = 1225293 }, +] + +[[package]] +name = "pylint" +version = "3.3.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "astroid" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "dill" }, + { name = "isort" }, + { name = "mccabe" }, + { name = "platformdirs" }, + { name = "tomli", marker = "python_full_version < '3.11'" }, + { name = "tomlkit" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/69/a7/113d02340afb9dcbb0c8b25454e9538cd08f0ebf3e510df4ed916caa1a89/pylint-3.3.6.tar.gz", hash = "sha256:b634a041aac33706d56a0d217e6587228c66427e20ec21a019bc4cdee48c040a", size = 1519586 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/31/21/9537fc94aee9ec7316a230a49895266cf02d78aa29b0a2efbc39566e0935/pylint-3.3.6-py3-none-any.whl", hash = "sha256:8b7c2d3e86ae3f94fb27703d521dd0b9b6b378775991f504d7c3a6275aa0a6a6", size = 522462 }, +] + +[[package]] +name = "scipy" +version = "1.15.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b7/b9/31ba9cd990e626574baf93fbc1ac61cf9ed54faafd04c479117517661637/scipy-1.15.2.tar.gz", hash = "sha256:cd58a314d92838f7e6f755c8a2167ead4f27e1fd5c1251fd54289569ef3495ec", size = 59417316 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/95/df/ef233fff6838fe6f7840d69b5ef9f20d2b5c912a8727b21ebf876cb15d54/scipy-1.15.2-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:a2ec871edaa863e8213ea5df811cd600734f6400b4af272e1c011e69401218e9", size = 38692502 }, + { url = "https://files.pythonhosted.org/packages/5c/20/acdd4efb8a68b842968f7bc5611b1aeb819794508771ad104de418701422/scipy-1.15.2-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:6f223753c6ea76983af380787611ae1291e3ceb23917393079dcc746ba60cfb5", size = 30085508 }, + { url = "https://files.pythonhosted.org/packages/42/55/39cf96ca7126f1e78ee72a6344ebdc6702fc47d037319ad93221063e6cf4/scipy-1.15.2-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:ecf797d2d798cf7c838c6d98321061eb3e72a74710e6c40540f0e8087e3b499e", size = 22359166 }, + { url = "https://files.pythonhosted.org/packages/51/48/708d26a4ab8a1441536bf2dfcad1df0ca14a69f010fba3ccbdfc02df7185/scipy-1.15.2-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:9b18aa747da280664642997e65aab1dd19d0c3d17068a04b3fe34e2559196cb9", size = 25112047 }, + { url = "https://files.pythonhosted.org/packages/dd/65/f9c5755b995ad892020381b8ae11f16d18616208e388621dfacc11df6de6/scipy-1.15.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87994da02e73549dfecaed9e09a4f9d58a045a053865679aeb8d6d43747d4df3", size = 35536214 }, + { url = "https://files.pythonhosted.org/packages/de/3c/c96d904b9892beec978562f64d8cc43f9cca0842e65bd3cd1b7f7389b0ba/scipy-1.15.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:69ea6e56d00977f355c0f84eba69877b6df084516c602d93a33812aa04d90a3d", size = 37646981 }, + { url = "https://files.pythonhosted.org/packages/3d/74/c2d8a24d18acdeae69ed02e132b9bc1bb67b7bee90feee1afe05a68f9d67/scipy-1.15.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:888307125ea0c4466287191e5606a2c910963405ce9671448ff9c81c53f85f58", size = 37230048 }, + { url = "https://files.pythonhosted.org/packages/42/19/0aa4ce80eca82d487987eff0bc754f014dec10d20de2f66754fa4ea70204/scipy-1.15.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9412f5e408b397ff5641080ed1e798623dbe1ec0d78e72c9eca8992976fa65aa", size = 40010322 }, + { url = "https://files.pythonhosted.org/packages/d0/d2/f0683b7e992be44d1475cc144d1f1eeae63c73a14f862974b4db64af635e/scipy-1.15.2-cp310-cp310-win_amd64.whl", hash = "sha256:b5e025e903b4f166ea03b109bb241355b9c42c279ea694d8864d033727205e65", size = 41233385 }, + { url = "https://files.pythonhosted.org/packages/40/1f/bf0a5f338bda7c35c08b4ed0df797e7bafe8a78a97275e9f439aceb46193/scipy-1.15.2-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:92233b2df6938147be6fa8824b8136f29a18f016ecde986666be5f4d686a91a4", size = 38703651 }, + { url = "https://files.pythonhosted.org/packages/de/54/db126aad3874601048c2c20ae3d8a433dbfd7ba8381551e6f62606d9bd8e/scipy-1.15.2-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:62ca1ff3eb513e09ed17a5736929429189adf16d2d740f44e53270cc800ecff1", size = 30102038 }, + { url = "https://files.pythonhosted.org/packages/61/d8/84da3fffefb6c7d5a16968fe5b9f24c98606b165bb801bb0b8bc3985200f/scipy-1.15.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:4c6676490ad76d1c2894d77f976144b41bd1a4052107902238047fb6a473e971", size = 22375518 }, + { url = "https://files.pythonhosted.org/packages/44/78/25535a6e63d3b9c4c90147371aedb5d04c72f3aee3a34451f2dc27c0c07f/scipy-1.15.2-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:a8bf5cb4a25046ac61d38f8d3c3426ec11ebc350246a4642f2f315fe95bda655", size = 25142523 }, + { url = "https://files.pythonhosted.org/packages/e0/22/4b4a26fe1cd9ed0bc2b2cb87b17d57e32ab72c346949eaf9288001f8aa8e/scipy-1.15.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a8e34cf4c188b6dd004654f88586d78f95639e48a25dfae9c5e34a6dc34547e", size = 35491547 }, + { url = "https://files.pythonhosted.org/packages/32/ea/564bacc26b676c06a00266a3f25fdfe91a9d9a2532ccea7ce6dd394541bc/scipy-1.15.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28a0d2c2075946346e4408b211240764759e0fabaeb08d871639b5f3b1aca8a0", size = 37634077 }, + { url = "https://files.pythonhosted.org/packages/43/c2/bfd4e60668897a303b0ffb7191e965a5da4056f0d98acfb6ba529678f0fb/scipy-1.15.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:42dabaaa798e987c425ed76062794e93a243be8f0f20fff6e7a89f4d61cb3d40", size = 37231657 }, + { url = "https://files.pythonhosted.org/packages/4a/75/5f13050bf4f84c931bcab4f4e83c212a36876c3c2244475db34e4b5fe1a6/scipy-1.15.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6f5e296ec63c5da6ba6fa0343ea73fd51b8b3e1a300b0a8cae3ed4b1122c7462", size = 40035857 }, + { url = "https://files.pythonhosted.org/packages/b9/8b/7ec1832b09dbc88f3db411f8cdd47db04505c4b72c99b11c920a8f0479c3/scipy-1.15.2-cp311-cp311-win_amd64.whl", hash = "sha256:597a0c7008b21c035831c39927406c6181bcf8f60a73f36219b69d010aa04737", size = 41217654 }, + { url = "https://files.pythonhosted.org/packages/4b/5d/3c78815cbab499610f26b5bae6aed33e227225a9fa5290008a733a64f6fc/scipy-1.15.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c4697a10da8f8765bb7c83e24a470da5797e37041edfd77fd95ba3811a47c4fd", size = 38756184 }, + { url = "https://files.pythonhosted.org/packages/37/20/3d04eb066b471b6e171827548b9ddb3c21c6bbea72a4d84fc5989933910b/scipy-1.15.2-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:869269b767d5ee7ea6991ed7e22b3ca1f22de73ab9a49c44bad338b725603301", size = 30163558 }, + { url = "https://files.pythonhosted.org/packages/a4/98/e5c964526c929ef1f795d4c343b2ff98634ad2051bd2bbadfef9e772e413/scipy-1.15.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:bad78d580270a4d32470563ea86c6590b465cb98f83d760ff5b0990cb5518a93", size = 22437211 }, + { url = "https://files.pythonhosted.org/packages/1d/cd/1dc7371e29195ecbf5222f9afeedb210e0a75057d8afbd942aa6cf8c8eca/scipy-1.15.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:b09ae80010f52efddb15551025f9016c910296cf70adbf03ce2a8704f3a5ad20", size = 25232260 }, + { url = "https://files.pythonhosted.org/packages/f0/24/1a181a9e5050090e0b5138c5f496fee33293c342b788d02586bc410c6477/scipy-1.15.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a6fd6eac1ce74a9f77a7fc724080d507c5812d61e72bd5e4c489b042455865e", size = 35198095 }, + { url = "https://files.pythonhosted.org/packages/c0/53/eaada1a414c026673eb983f8b4a55fe5eb172725d33d62c1b21f63ff6ca4/scipy-1.15.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b871df1fe1a3ba85d90e22742b93584f8d2b8e6124f8372ab15c71b73e428b8", size = 37297371 }, + { url = "https://files.pythonhosted.org/packages/e9/06/0449b744892ed22b7e7b9a1994a866e64895363572677a316a9042af1fe5/scipy-1.15.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:03205d57a28e18dfd39f0377d5002725bf1f19a46f444108c29bdb246b6c8a11", size = 36872390 }, + { url = "https://files.pythonhosted.org/packages/6a/6f/a8ac3cfd9505ec695c1bc35edc034d13afbd2fc1882a7c6b473e280397bb/scipy-1.15.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:601881dfb761311045b03114c5fe718a12634e5608c3b403737ae463c9885d53", size = 39700276 }, + { url = "https://files.pythonhosted.org/packages/f5/6f/e6e5aff77ea2a48dd96808bb51d7450875af154ee7cbe72188afb0b37929/scipy-1.15.2-cp312-cp312-win_amd64.whl", hash = "sha256:e7c68b6a43259ba0aab737237876e5c2c549a031ddb7abc28c7b47f22e202ded", size = 40942317 }, + { url = "https://files.pythonhosted.org/packages/53/40/09319f6e0f276ea2754196185f95cd191cb852288440ce035d5c3a931ea2/scipy-1.15.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:01edfac9f0798ad6b46d9c4c9ca0e0ad23dbf0b1eb70e96adb9fa7f525eff0bf", size = 38717587 }, + { url = "https://files.pythonhosted.org/packages/fe/c3/2854f40ecd19585d65afaef601e5e1f8dbf6758b2f95b5ea93d38655a2c6/scipy-1.15.2-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:08b57a9336b8e79b305a143c3655cc5bdbe6d5ece3378578888d2afbb51c4e37", size = 30100266 }, + { url = "https://files.pythonhosted.org/packages/dd/b1/f9fe6e3c828cb5930b5fe74cb479de5f3d66d682fa8adb77249acaf545b8/scipy-1.15.2-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:54c462098484e7466362a9f1672d20888f724911a74c22ae35b61f9c5919183d", size = 22373768 }, + { url = "https://files.pythonhosted.org/packages/15/9d/a60db8c795700414c3f681908a2b911e031e024d93214f2d23c6dae174ab/scipy-1.15.2-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:cf72ff559a53a6a6d77bd8eefd12a17995ffa44ad86c77a5df96f533d4e6c6bb", size = 25154719 }, + { url = "https://files.pythonhosted.org/packages/37/3b/9bda92a85cd93f19f9ed90ade84aa1e51657e29988317fabdd44544f1dd4/scipy-1.15.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9de9d1416b3d9e7df9923ab23cd2fe714244af10b763975bea9e4f2e81cebd27", size = 35163195 }, + { url = "https://files.pythonhosted.org/packages/03/5a/fc34bf1aa14dc7c0e701691fa8685f3faec80e57d816615e3625f28feb43/scipy-1.15.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb530e4794fc8ea76a4a21ccb67dea33e5e0e60f07fc38a49e821e1eae3b71a0", size = 37255404 }, + { url = "https://files.pythonhosted.org/packages/4a/71/472eac45440cee134c8a180dbe4c01b3ec247e0338b7c759e6cd71f199a7/scipy-1.15.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5ea7ed46d437fc52350b028b1d44e002646e28f3e8ddc714011aaf87330f2f32", size = 36860011 }, + { url = "https://files.pythonhosted.org/packages/01/b3/21f890f4f42daf20e4d3aaa18182dddb9192771cd47445aaae2e318f6738/scipy-1.15.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:11e7ad32cf184b74380f43d3c0a706f49358b904fa7d5345f16ddf993609184d", size = 39657406 }, + { url = "https://files.pythonhosted.org/packages/0d/76/77cf2ac1f2a9cc00c073d49e1e16244e389dd88e2490c91d84e1e3e4d126/scipy-1.15.2-cp313-cp313-win_amd64.whl", hash = "sha256:a5080a79dfb9b78b768cebf3c9dcbc7b665c5875793569f48bf0e2b1d7f68f6f", size = 40961243 }, + { url = "https://files.pythonhosted.org/packages/4c/4b/a57f8ddcf48e129e6054fa9899a2a86d1fc6b07a0e15c7eebff7ca94533f/scipy-1.15.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:447ce30cee6a9d5d1379087c9e474628dab3db4a67484be1b7dc3196bfb2fac9", size = 38870286 }, + { url = "https://files.pythonhosted.org/packages/0c/43/c304d69a56c91ad5f188c0714f6a97b9c1fed93128c691148621274a3a68/scipy-1.15.2-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:c90ebe8aaa4397eaefa8455a8182b164a6cc1d59ad53f79943f266d99f68687f", size = 30141634 }, + { url = "https://files.pythonhosted.org/packages/44/1a/6c21b45d2548eb73be9b9bff421aaaa7e85e22c1f9b3bc44b23485dfce0a/scipy-1.15.2-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:def751dd08243934c884a3221156d63e15234a3155cf25978b0a668409d45eb6", size = 22415179 }, + { url = "https://files.pythonhosted.org/packages/74/4b/aefac4bba80ef815b64f55da06f62f92be5d03b467f2ce3668071799429a/scipy-1.15.2-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:302093e7dfb120e55515936cb55618ee0b895f8bcaf18ff81eca086c17bd80af", size = 25126412 }, + { url = "https://files.pythonhosted.org/packages/b1/53/1cbb148e6e8f1660aacd9f0a9dfa2b05e9ff1cb54b4386fe868477972ac2/scipy-1.15.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7cd5b77413e1855351cdde594eca99c1f4a588c2d63711388b6a1f1c01f62274", size = 34952867 }, + { url = "https://files.pythonhosted.org/packages/2c/23/e0eb7f31a9c13cf2dca083828b97992dd22f8184c6ce4fec5deec0c81fcf/scipy-1.15.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d0194c37037707b2afa7a2f2a924cf7bac3dc292d51b6a925e5fcb89bc5c776", size = 36890009 }, + { url = "https://files.pythonhosted.org/packages/03/f3/e699e19cabe96bbac5189c04aaa970718f0105cff03d458dc5e2b6bd1e8c/scipy-1.15.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:bae43364d600fdc3ac327db99659dcb79e6e7ecd279a75fe1266669d9a652828", size = 36545159 }, + { url = "https://files.pythonhosted.org/packages/af/f5/ab3838e56fe5cc22383d6fcf2336e48c8fe33e944b9037fbf6cbdf5a11f8/scipy-1.15.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f031846580d9acccd0044efd1a90e6f4df3a6e12b4b6bd694a7bc03a89892b28", size = 39136566 }, + { url = "https://files.pythonhosted.org/packages/0a/c8/b3f566db71461cabd4b2d5b39bcc24a7e1c119535c8361f81426be39bb47/scipy-1.15.2-cp313-cp313t-win_amd64.whl", hash = "sha256:fe8a9eb875d430d81755472c5ba75e84acc980e4a8f6204d402849234d3017db", size = 40477705 }, +] + +[[package]] +name = "stack-data" +version = "0.6.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "asttokens" }, + { name = "executing" }, + { name = "pure-eval" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/28/e3/55dcc2cfbc3ca9c29519eb6884dd1415ecb53b0e934862d3559ddcb7e20b/stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9", size = 44707 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695", size = 24521 }, +] + +[[package]] +name = "tensornetwork" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "graphviz" }, + { name = "h5py" }, + { name = "numpy" }, + { name = "opt-einsum" }, + { name = "scipy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/93/32/55c2af4e7a6257a55e6598dd199ff3aa3ca567785c67948b2dfeb5019ae7/tensornetwork-0.4.6.tar.gz", hash = "sha256:c5af810bf6c2480e1b1f3d98ccf262c5ffb5c3c513be6611f4fdd2258bbc7704", size = 184920 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/85/75c4733e9fd7832aac61a6f7d1a473ead56769951344bacf6b4be379254f/tensornetwork-0.4.6-py3-none-any.whl", hash = "sha256:33f777ea6b9579d010806b3a1ef02f4f9ff5f0707f0ceb681591ee6eb7a01b03", size = 364293 }, +] + +[[package]] +name = "tomli" +version = "2.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/18/87/302344fed471e44a87289cf4967697d07e532f2421fdaf868a303cbae4ff/tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff", size = 17175 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/43/ca/75707e6efa2b37c77dadb324ae7d9571cb424e61ea73fad7c56c2d14527f/tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249", size = 131077 }, + { url = "https://files.pythonhosted.org/packages/c7/16/51ae563a8615d472fdbffc43a3f3d46588c264ac4f024f63f01283becfbb/tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6", size = 123429 }, + { url = "https://files.pythonhosted.org/packages/f1/dd/4f6cd1e7b160041db83c694abc78e100473c15d54620083dbd5aae7b990e/tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a", size = 226067 }, + { url = "https://files.pythonhosted.org/packages/a9/6b/c54ede5dc70d648cc6361eaf429304b02f2871a345bbdd51e993d6cdf550/tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee", size = 236030 }, + { url = "https://files.pythonhosted.org/packages/1f/47/999514fa49cfaf7a92c805a86c3c43f4215621855d151b61c602abb38091/tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e", size = 240898 }, + { url = "https://files.pythonhosted.org/packages/73/41/0a01279a7ae09ee1573b423318e7934674ce06eb33f50936655071d81a24/tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4", size = 229894 }, + { url = "https://files.pythonhosted.org/packages/55/18/5d8bc5b0a0362311ce4d18830a5d28943667599a60d20118074ea1b01bb7/tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106", size = 245319 }, + { url = "https://files.pythonhosted.org/packages/92/a3/7ade0576d17f3cdf5ff44d61390d4b3febb8a9fc2b480c75c47ea048c646/tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8", size = 238273 }, + { url = "https://files.pythonhosted.org/packages/72/6f/fa64ef058ac1446a1e51110c375339b3ec6be245af9d14c87c4a6412dd32/tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff", size = 98310 }, + { url = "https://files.pythonhosted.org/packages/6a/1c/4a2dcde4a51b81be3530565e92eda625d94dafb46dbeb15069df4caffc34/tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b", size = 108309 }, + { url = "https://files.pythonhosted.org/packages/52/e1/f8af4c2fcde17500422858155aeb0d7e93477a0d59a98e56cbfe75070fd0/tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea", size = 132762 }, + { url = "https://files.pythonhosted.org/packages/03/b8/152c68bb84fc00396b83e7bbddd5ec0bd3dd409db4195e2a9b3e398ad2e3/tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8", size = 123453 }, + { url = "https://files.pythonhosted.org/packages/c8/d6/fc9267af9166f79ac528ff7e8c55c8181ded34eb4b0e93daa767b8841573/tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192", size = 233486 }, + { url = "https://files.pythonhosted.org/packages/5c/51/51c3f2884d7bab89af25f678447ea7d297b53b5a3b5730a7cb2ef6069f07/tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222", size = 242349 }, + { url = "https://files.pythonhosted.org/packages/ab/df/bfa89627d13a5cc22402e441e8a931ef2108403db390ff3345c05253935e/tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77", size = 252159 }, + { url = "https://files.pythonhosted.org/packages/9e/6e/fa2b916dced65763a5168c6ccb91066f7639bdc88b48adda990db10c8c0b/tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6", size = 237243 }, + { url = "https://files.pythonhosted.org/packages/b4/04/885d3b1f650e1153cbb93a6a9782c58a972b94ea4483ae4ac5cedd5e4a09/tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd", size = 259645 }, + { url = "https://files.pythonhosted.org/packages/9c/de/6b432d66e986e501586da298e28ebeefd3edc2c780f3ad73d22566034239/tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e", size = 244584 }, + { url = "https://files.pythonhosted.org/packages/1c/9a/47c0449b98e6e7d1be6cbac02f93dd79003234ddc4aaab6ba07a9a7482e2/tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98", size = 98875 }, + { url = "https://files.pythonhosted.org/packages/ef/60/9b9638f081c6f1261e2688bd487625cd1e660d0a85bd469e91d8db969734/tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4", size = 109418 }, + { url = "https://files.pythonhosted.org/packages/04/90/2ee5f2e0362cb8a0b6499dc44f4d7d48f8fff06d28ba46e6f1eaa61a1388/tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7", size = 132708 }, + { url = "https://files.pythonhosted.org/packages/c0/ec/46b4108816de6b385141f082ba99e315501ccd0a2ea23db4a100dd3990ea/tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c", size = 123582 }, + { url = "https://files.pythonhosted.org/packages/a0/bd/b470466d0137b37b68d24556c38a0cc819e8febe392d5b199dcd7f578365/tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13", size = 232543 }, + { url = "https://files.pythonhosted.org/packages/d9/e5/82e80ff3b751373f7cead2815bcbe2d51c895b3c990686741a8e56ec42ab/tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281", size = 241691 }, + { url = "https://files.pythonhosted.org/packages/05/7e/2a110bc2713557d6a1bfb06af23dd01e7dde52b6ee7dadc589868f9abfac/tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272", size = 251170 }, + { url = "https://files.pythonhosted.org/packages/64/7b/22d713946efe00e0adbcdfd6d1aa119ae03fd0b60ebed51ebb3fa9f5a2e5/tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140", size = 236530 }, + { url = "https://files.pythonhosted.org/packages/38/31/3a76f67da4b0cf37b742ca76beaf819dca0ebef26d78fc794a576e08accf/tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2", size = 258666 }, + { url = "https://files.pythonhosted.org/packages/07/10/5af1293da642aded87e8a988753945d0cf7e00a9452d3911dd3bb354c9e2/tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744", size = 243954 }, + { url = "https://files.pythonhosted.org/packages/5b/b9/1ed31d167be802da0fc95020d04cd27b7d7065cc6fbefdd2f9186f60d7bd/tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec", size = 98724 }, + { url = "https://files.pythonhosted.org/packages/c7/32/b0963458706accd9afcfeb867c0f9175a741bf7b19cd424230714d722198/tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69", size = 109383 }, + { url = "https://files.pythonhosted.org/packages/6e/c2/61d3e0f47e2b74ef40a68b9e6ad5984f6241a942f7cd3bbfbdbd03861ea9/tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc", size = 14257 }, +] + +[[package]] +name = "tomlkit" +version = "0.13.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b1/09/a439bec5888f00a54b8b9f05fa94d7f901d6735ef4e55dcec9bc37b5d8fa/tomlkit-0.13.2.tar.gz", hash = "sha256:fff5fe59a87295b278abd31bec92c15d9bc4a06885ab12bcea52c71119392e79", size = 192885 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f9/b6/a447b5e4ec71e13871be01ba81f5dfc9d0af7e473da256ff46bc0e24026f/tomlkit-0.13.2-py3-none-any.whl", hash = "sha256:7a974427f6e119197f670fbbbeae7bef749a6c14e793db934baefc1b5f03efde", size = 37955 }, +] + +[[package]] +name = "tqdm" +version = "4.67.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a8/4b/29b4ef32e036bb34e4ab51796dd745cdba7ed47ad142a9f4a1eb8e0c744d/tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2", size = 169737 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2", size = 78540 }, +] + +[package.optional-dependencies] +notebook = [ + { name = "ipywidgets" }, +] + +[[package]] +name = "tqdm-loggable" +version = "0.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "tqdm" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/65/96/d924c326727dbdcac6043065dba08b1455aaaca4f7ef1e79d4fea889b34d/tqdm_loggable-0.2.tar.gz", hash = "sha256:175abec3e1f63bbd2eac192fa5da075e80c7bb715d7ccf3cd1a29b7ab5af0617", size = 7442 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/12/1f/1acb36a85797beba22934f124be6b51a7c18a4f408ce31443bec073181c7/tqdm_loggable-0.2-py3-none-any.whl", hash = "sha256:9703046302b93a667166487759e6f3f49597e86c89eb132ba1f31caa07bf0941", size = 9264 }, +] + +[[package]] +name = "traitlets" +version = "5.14.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/eb/79/72064e6a701c2183016abbbfedaba506d81e30e232a68c9f0d6f6fcd1574/traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7", size = 161621 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f", size = 85359 }, +] + +[[package]] +name = "typing-extensions" +version = "4.12.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/df/db/f35a00659bc03fec321ba8bce9420de607a1d37f8342eee1863174c69557/typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8", size = 85321 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", size = 37438 }, +] + +[[package]] +name = "varipeps" +version = "1.0.0" +source = { editable = "." } +dependencies = [ + { name = "h5py" }, + { name = "jax" }, + { name = "numpy" }, + { name = "scipy" }, + { name = "tensornetwork" }, + { name = "tqdm", extra = ["notebook"] }, + { name = "tqdm-loggable" }, +] + +[package.dev-dependencies] +dev = [ + { name = "black" }, + { name = "flake8" }, + { name = "ipython", version = "8.34.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "ipython", version = "9.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "mypy" }, + { name = "pylint" }, +] + +[package.metadata] +requires-dist = [ + { name = "h5py", specifier = ">=3.6.0" }, + { name = "jax", extras = ["cpu"], specifier = ">=0.5.3" }, + { name = "numpy", specifier = ">=1.21.2" }, + { name = "scipy", specifier = ">=1.7.1" }, + { name = "tensornetwork", specifier = ">=0.4.5" }, + { name = "tqdm", extras = ["notebook"], specifier = ">=4.64.1" }, + { name = "tqdm-loggable", specifier = ">=0.1.3" }, +] + +[package.metadata.requires-dev] +dev = [ + { name = "black", specifier = ">=24.10.0" }, + { name = "flake8", specifier = ">=7.1.1" }, + { name = "ipython", specifier = ">=8.31.0" }, + { name = "mypy", specifier = ">=1.14.1" }, + { name = "pylint", specifier = ">=3.3.3" }, +] + +[[package]] +name = "wcwidth" +version = "0.2.13" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6c/63/53559446a878410fc5a5974feb13d31d78d752eb18aeba59c7fef1af7598/wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5", size = 101301 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859", size = 34166 }, +] + +[[package]] +name = "widgetsnbextension" +version = "4.0.13" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/56/fc/238c424fd7f4ebb25f8b1da9a934a3ad7c848286732ae04263661eb0fc03/widgetsnbextension-4.0.13.tar.gz", hash = "sha256:ffcb67bc9febd10234a362795f643927f4e0c05d9342c727b65d2384f8feacb6", size = 1164730 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/21/02/88b65cc394961a60c43c70517066b6b679738caf78506a5da7b88ffcb643/widgetsnbextension-4.0.13-py3-none-any.whl", hash = "sha256:74b2692e8500525cc38c2b877236ba51d34541e6385eeed5aec15a70f88a6c71", size = 2335872 }, +] diff --git a/varipeps/__init__.py b/varipeps/__init__.py index 3229c12..fabe24a 100644 --- a/varipeps/__init__.py +++ b/varipeps/__init__.py @@ -1,9 +1,10 @@ # First import config so it is usable in other parts of the module -from . import config +from .config import wrapper as config from .config import config as varipeps_config from .global_state import global_state as varipeps_global_state from . import contractions +from . import corrlength from . import ctmrg from . import expectation from . import mapping @@ -25,3 +26,4 @@ del datetime del tqdm_logging +del jax_config diff --git a/varipeps/config.py b/varipeps/config.py index 7ca252a..4be8a11 100644 --- a/varipeps/config.py +++ b/varipeps/config.py @@ -3,7 +3,7 @@ from jax.tree_util import register_pytree_node_class -from typing import TypeVar, Tuple, Any, Type +from typing import TypeVar, Tuple, Any, Type, NoReturn T_VariPEPS_Config = TypeVar("T_VariPEPS_Config", bound="VariPEPS_Config") @@ -21,6 +21,7 @@ class Line_Search_Methods(IntEnum): SIMPLE = auto() #: Simple line search method ARMIJO = auto() #: Armijo line search method WOLFE = auto() #: Wolfe line search method + HAGERZHANG = auto() #: Hager-Zhang line search method @unique @@ -155,6 +156,27 @@ class VariPEPS_Config: line_search_use_last_step_size (:obj:`bool`): Flag if the line search should start from the step size of the previous optimizer step. + line_search_hager_zhang_quad_step (:obj:`bool`): + Use QuadStep method in Hager-Zhang line search to find initial + step size. + line_search_hager_zhang_delta (:obj:`float`): + Constant used in Hager-Zhang line search method. + line_search_hager_zhang_sigma (:obj:`float`): + Constant used in Hager-Zhang line search method. + line_search_hager_zhang_psi_0 (:obj:`float`): + Constant used in Hager-Zhang line search method. + line_search_hager_zhang_psi_1 (:obj:`float`): + Constant used in Hager-Zhang line search method. + line_search_hager_zhang_psi_2 (:obj:`float`): + Constant used in Hager-Zhang line search method. + line_search_hager_zhang_eps (:obj:`float`): + Constant used in Hager-Zhang line search method. + line_search_hager_zhang_theta (:obj:`float`): + Constant used in Hager-Zhang line search method. + line_search_hager_zhang_gamma (:obj:`float`): + Constant used in Hager-Zhang line search method. + line_search_hager_zhang_rho (:obj:`float`): + Constant used in Hager-Zhang line search method. basinhopping_niter (:obj:`int`): Value for parameter `niter` of :obj:`scipy.optimize.basinhopping`. See this function for details. @@ -214,14 +236,25 @@ class VariPEPS_Config: optimizer_reuse_env_eps: float = 1e-3 # Line search - line_search_method: Line_Search_Methods = Line_Search_Methods.WOLFE + line_search_method: Line_Search_Methods = Line_Search_Methods.HAGERZHANG line_search_initial_step_size: float = 1.0 line_search_reduction_factor: float = 0.5 - line_search_max_steps: int = 20 + line_search_max_steps: int = 40 line_search_armijo_const: float = 1e-4 line_search_wolfe_const: float = 0.9 line_search_use_last_step_size: bool = False + line_search_hager_zhang_quad_step: bool = True + line_search_hager_zhang_delta: float = 0.1 + line_search_hager_zhang_sigma: float = 0.9 + line_search_hager_zhang_psi_0: float = 0.01 + line_search_hager_zhang_psi_1: float = 0.1 + line_search_hager_zhang_psi_2: float = 2.0 + line_search_hager_zhang_eps: float = 1e-6 + line_search_hager_zhang_theta: float = 0.5 + line_search_hager_zhang_gamma: float = 0.66 + line_search_hager_zhang_rho: float = 5 + # Basinhopping basinhopping_niter: int = 20 basinhopping_T: float = 0.001 @@ -230,6 +263,25 @@ class VariPEPS_Config: # Spiral PEPS spiral_wavevector_type: Wavevector_Type = Wavevector_Type.TWO_PI_POSITIVE_ONLY + def update(self, name: str, value: Any) -> NoReturn: + self.__setattr__(name, value) + + def __setattr__(self, name: str, value: Any) -> NoReturn: + try: + field = self.__dataclass_fields__[name] + except KeyError as e: + raise KeyError(f"Unknown config option '{name}'.") from e + + if not type(value) is field.type: + if field.type is float and type(value) is int: + pass + else: + raise TypeError( + f"Type mismatch for option '{name}', got '{type(value)}', expected '{field.type}'." + ) + + super().__setattr__(name, value) + def tree_flatten(self) -> Tuple[Tuple[Any, ...], Tuple[Any, ...]]: aux_data = ( {name: getattr(self, name) for name in self.__dataclass_fields__.keys()}, @@ -249,3 +301,35 @@ def tree_unflatten( config = VariPEPS_Config() + + +class ConfigModuleWrapper: + __slots__ = { + "Optimizing_Methods", + "Line_Search_Methods", + "Projector_Method", + "Wavevector_Type", + "VariPEPS_Config", + "config", + } + + def __init__(self): + for e in self.__slots__: + setattr(self, e, globals()[e]) + + def __getattr__(self, name: str) -> Any: + if name.startswith("__") or name in self.__slots__: + return super().__getattr__(name) + else: + return getattr(self.config, name) + + def __setattr__(self, name: str, value: Any) -> NoReturn: + if not name.startswith("__") and name not in self.__slots__: + setattr(self.config, name, value) + elif not hasattr(self, name): + super().__setattr__(name, value) + else: + raise AttributeError(f"Attribute '{name}' is write-protected.") + + +wrapper = ConfigModuleWrapper() diff --git a/varipeps/contractions/definitions.py b/varipeps/contractions/definitions.py index 7ccd5a0..67dddd2 100644 --- a/varipeps/contractions/definitions.py +++ b/varipeps/contractions/definitions.py @@ -503,6 +503,67 @@ def _prepare_defs(cls): ], } + density_matrix_two_sites_horizontal_rectangle: Definition = { + "tensors": [ + ["tensor", "tensor_conj", "T1"], # top_middle + ["tensor", "tensor_conj", "T3"], # bottom_middle + "top_left", + "top_right", + "bottom_left", + "bottom_right", + ], + "network": [ + [ + (5, 11, 9, 19, 6), # tensor + (7, 13, 9, 20, 8), # tensor_conj + (4, 6, 8, 18), # T1 + ], + [ + (10, 16, 14, 25, 11), # tensor + (12, 17, 14, 26, 13), # tensor_conj + (15, 24, 17, 16), # T3 + ], + (-1, -3, 1, 2, 3, 4, 5, 7), # top_left + (18, 19, 20, 21, 22, 23), # top_right + ( + 15, + 12, + 10, + 1, + 2, + 3, + ), # bottom_left + (-2, -4, 21, 22, 23, 24, 26, 25), # bottom_right + ], + } + + density_matrix_two_sites_vertical_rectangle: Definition = { + "tensors": [ + ["tensor", "tensor_conj", "T4"], + ["tensor", "tensor_conj", "T2"], + "top_left", + "top_right", + "bottom_left", + "bottom_right", + ], + "network": [ + [ + (6, 19, 9, 11, 5), # tensor + (8, 20, 9, 13, 7), # tensor_conj + (18, 8, 6, 4), # T4 + ], + [ + (11, 22, 14, 16, 10), # tensor + (13, 23, 14, 17, 12), # tensor_conj + (16, 17, 21, 15), # T2 + ], + (-1, -3, 4, 5, 7, 1, 2, 3), # top_left + (1, 2, 3, 15, 12, 10), # top_right + (24, 25, 26, 18, 19, 20), # bottom_left + (-2, -4, 21, 23, 22, 24, 25, 26), # bottom_right + ], + } + density_matrix_four_sites_top_left: Definition = { "tensors": [["tensor", "tensor_conj", "T4", "C1", "T1"]], "network": [ @@ -726,28 +787,880 @@ def _prepare_defs(cls): \\ """ - ctmrg_bottom_right_large_d: Definition = { - "tensors": [["tensor", "tensor_conj", "T2", "T3", "C3"]], + ctmrg_bottom_right_large_d: Definition = { + "tensors": [["tensor", "tensor_conj", "T2", "T3", "C3"]], + "network": [ + [ + (-6, 4, 3, 5, -3), # tensor + (-5, 6, 3, 7, -2), # tensor_conj + (5, 7, 2, -1), # T2 + (-4, 1, 6, 4), # T3 + (1, 2), # C3 + ] + ], + } + """ + .. figure:: /images/ctmrg_bottom_right_large_d.* + :align: center + :width: 60% + :alt: Contraction for bottom right CTM corner for high dimensions with contraction order shown. + + Contraction for bottom right CTM corner for high physical dimensions. + + \\ + """ + + ctmrg_split_transfer_top: Definition = { + "tensors": [ + [ + "tensor", + "tensor_conj", + "T4_bra", + "T4_ket", + "C1", + "T1_ket", + "T1_bra", + "C2", + "T2_ket", + "T2_bra", + ] + ], + "network": [ + [ + (6, -2, 12, 8, 5), # tensor + (10, -4, 12, 14, 11), # tensor_conj + (-1, 10, 9), # T4_bra + (9, 6, 1), # T4_ket + (1, 2), # C1 + (2, 5, 7), # T1_ket + (7, 11, 3), # T1_bra + (3, 4), # C2 + (13, 8, 4), # T2_ket + (-3, 14, 13), # T2_bra + ] + ], + } + + ctmrg_split_transfer_bottom: Definition = { + "tensors": [ + [ + "tensor", + "tensor_conj", + "T2_ket", + "T2_bra", + "C3", + "T3_bra", + "T3_ket", + "C4", + "T4_bra", + "T4_ket", + ] + ], + "network": [ + [ + (14, 11, 12, 10, -4), # tensor + (8, 5, 12, 6, -2), # tensor_conj + (9, 10, -1), # T2_ket + (4, 6, 9), # T2_bra + (3, 4), # C3 + (7, 5, 3), # T3_bra + (2, 11, 7), # T3_ket + (2, 1), # C4 + (1, 8, 13), # T4_bra + (13, 14, -3), # T4_ket + ] + ], + } + + ctmrg_split_transfer_left: Definition = { + "tensors": [ + [ + "tensor", + "tensor_conj", + "T3_bra", + "T3_ket", + "C4", + "T4_bra", + "T4_ket", + "C1", + "T1_ket", + "T1_bra", + ] + ], + "network": [ + [ + (5, 8, 12, -4, 6), # tensor + (11, 14, 12, -2, 10), # tensor_conj + (13, 14, -1), # T3_bra + (1, 8, 13), # T3_ket + (1, 2), # C4 + (2, 11, 7), # T4_bra + (7, 5, 3), # T4_ket + (3, 4), # C1 + (4, 6, 9), # T1_ket + (9, 10, -3), # T1_bra + ] + ], + } + + ctmrg_split_transfer_right: Definition = { + "tensors": [ + [ + "tensor", + "tensor_conj", + "T1_ket", + "T1_bra", + "C2", + "T2_ket", + "T2_bra", + "C3", + "T3_bra", + "T3_ket", + ] + ], + "network": [ + [ + (-2, 10, 12, 11, 14), # tensor + (-4, 5, 12, 6, 8), # tensor_conj + (-1, 14, 13), # T1_ket + (13, 8, 1), # T1_bra + (1, 2), # C2 + (7, 11, 2), # T2_ket + (3, 6, 7), # T2_bra + (4, 3), # C3 + (9, 5, 4), # T3_bra + (-3, 10, 9), # T3_ket + ] + ], + } + + ctmrg_split_transfer_top_full: Definition = { + "tensors": [ + [ + "tensor", + "tensor_conj", + "T4_bra", + "T4_ket", + "C1", + "T1_ket", + "T1_bra", + ], + [ + "tensor", + "tensor_conj", + "T1_ket", + "T1_bra", + "C2", + "T2_ket", + "T2_bra", + ], + "projector_left_bottom_ket", + "projector_right_bottom_bra", + ], + "network": [ + [ + (4, 7, 10, 23, 5), # tensor + (9, -2, 10, 24, 11), # tensor_conj + (1, 9, 6), # T4_bra + (6, 4, 3), # T4_ket + (3, 2), # C1 + (2, 5, 8), # T1_ket + (8, 11, 25), # T1_bra + ], + [ + (23, -4, 20, 21, 22), # tensor + (24, 15, 20, 16, 18), # tensor_conj + (25, 22, 19), # T1_ket + (19, 18, 13), # T1_bra + (13, 12), # C2 + (17, 21, 12), # T2_ket + (14, 16, 17), # T2_bra + ], + (-1, 1, 7), # projector_left_bottom_ket + (14, 15, -3), # projector_right_bottom_bra + ], + } + + ctmrg_split_transfer_left_top_half: Definition = { + "tensors": [ + [ + "tensor", + "tensor_conj", + "T4_bra", + "T4_ket", + "C1", + "T1_ket", + "T1_bra", + ], + "projector_left_bottom_ket", + "projector_top_right_ket", + ], + "network": [ + [ + (5, 8, 13, 10, 6), # tensor + (11, -2, 13, -4, 12), # tensor_conj + (1, 11, 7), # T4_bra + (7, 5, 2), # T4_ket + (2, 3), # C1 + (3, 6, 9), # T1_ket + (9, 12, 4), # T1_bra + ], + (-1, 1, 8), # projector_left_bottom_ket + (4, 10, -3), # projector_top_right_ket + ], + } + + ctmrg_split_transfer_right_top_half: Definition = { + "tensors": [ + [ + "tensor", + "tensor_conj", + "T1_ket", + "T1_bra", + "C2", + "T2_ket", + "T2_bra", + ], + "projector_top_left_ket", + "projector_right_bottom_bra", + ], + "network": [ + [ + (5, -4, 13, 8, 6), # tensor + (-2, 10, 13, 9, 12), # tensor_conj + (1, 6, 7), # T1_ket + (7, 12, 2), # T1_bra + (2, 3), # C2 + (11, 8, 3), # T2_ket + (4, 9, 11), # T2_bra + ], + (-1, 1, 5), # projector_top_left_ket + (4, 10, -3), # projector_right_bottom_bra + ], + } + + ctmrg_split_transfer_bottom_full: Definition = { + "tensors": [ + [ + "tensor", + "tensor_conj", + "T4_ket", + "T4_bra", + "C4", + "T3_ket", + "T3_bra", + ], + [ + "tensor", + "tensor_conj", + "T3_ket", + "T3_bra", + "C3", + "T2_bra", + "T2_ket", + ], + "projector_left_top_ket", + "projector_right_top_bra", + ], + "network": [ + [ + (16, 18, 20, 25, 15), # tensor + (21, 22, 20, 24, -4), # tensor_conj + (17, 16, 14), # T4_ket + (12, 21, 17), # T4_bra + (13, 12), # C4 + (13, 18, 19), # T3_ket + (19, 22, 23), # T3_bra + ], + [ + (25, 11, 10, 9, -2), # tensor + (24, 5, 10, 4, 7), # tensor_conj + (23, 11, 8), # T3_ket + (8, 5, 2), # T3_bra + (2, 3), # C3 + (3, 4, 6), # T2_bra + (6, 9, 1), # T2_ket + ], + (14, 15, -3), # projector_left_top_ket + (-1, 1, 7), # projector_right_top_bra + ], + } + + ctmrg_split_transfer_left_bottom_half: Definition = { + "tensors": [ + [ + "tensor", + "tensor_conj", + "T4_ket", + "T4_bra", + "C4", + "T3_ket", + "T3_bra", + ], + "projector_left_top_ket", + "projector_bottom_right_bra", + ], + "network": [ + [ + (5, 8, 13, -2, 6), # tensor + (12, 10, 13, 9, -4), # tensor_conj + (7, 5, 1), # T4_ket + (2, 12, 7), # T4_bra + (3, 2), # C4 + (3, 8, 11), # T3_ket + (11, 10, 4), # T3_bra + ], + (1, 6, -3), # projector_left_top_ket + (-1, 4, 9), # projector_bottom_right_bra + ], + } + + ctmrg_split_transfer_right_bottom_half: Definition = { + "tensors": [ + [ + "tensor", + "tensor_conj", + "T3_ket", + "T3_bra", + "C3", + "T2_bra", + "T2_ket", + ], + "projector_bottom_right_bra", + "projector_right_top_bra", + ], + "network": [ + [ + (-4, 11, 13, 12, -2), # tensor + (8, 5, 13, 6, 10), # tensor_conj + (1, 11, 7), # T3_ket + (7, 5, 2), # T3_bra + (2, 3), # C3 + (3, 6, 9), # T2_bra + (9, 12, 4), # T2_ket + ], + (1, 8, -3), # projector_bottom_right_bra + (-1, 4, 10), # projector_right_top_bra + ], + } + + ctmrg_split_transfer_left_full: Definition = { + "tensors": [ + [ + "tensor", + "tensor_conj", + "T1_bra", + "T1_ket", + "C1", + "T4_ket", + "T4_bra", + ], + [ + "tensor", + "tensor_conj", + "T4_ket", + "T4_bra", + "C4", + "T3_ket", + "T3_bra", + ], + "projector_top_right_ket", + "projector_bottom_right_bra", + ], + "network": [ + [ + (4, 24, 10, 7, 5), # tensor + (11, 25, 10, -4, 9), # tensor_conj + (6, 9, 1), # T1_bra + (3, 5, 6), # T1_ket + (2, 3), # C1 + (8, 4, 2), # T4_ket + (23, 11, 8), # T4_bra + ], + [ + (22, 21, 20, -2, 24), # tensor + (18, 16, 20, 15, 25), # tensor_conj + (19, 22, 23), # T4_ket + (13, 18, 19), # T4_bra + (12, 13), # C4 + (12, 21, 17), # T3_ket + (17, 16, 14), # T3_bra + ], + (1, 7, -3), # projector_top_right_ket + (-1, 14, 15), # projector_bottom_right_bra + ], + } + + ctmrg_split_transfer_right_full: Definition = { + "tensors": [ + [ + "tensor", + "tensor_conj", + "T1_ket", + "T1_bra", + "C2", + "T2_ket", + "T2_bra", + ], + [ + "tensor", + "tensor_conj", + "T2_ket", + "T2_bra", + "C3", + "T3_bra", + "T3_ket", + ], + "projector_top_left_ket", + "projector_bottom_left_bra", + ], + "network": [ + [ + (15, 25, 20, 18, 16), # tensor + (-2, 24, 20, 22, 21), # tensor_conj + (14, 16, 17), # T1_ket + (17, 21, 12), # T1_bra + (12, 13), # C2 + (19, 18, 13), # T2_ket + (23, 22, 19), # T2_bra + ], + [ + (-4, 9, 10, 11, 25), # tensor + (7, 5, 10, 4, 24), # tensor_conj + (8, 11, 23), # T2_ket + (2, 4, 8), # T2_bra + (3, 2), # C3 + (6, 5, 3), # T3_bra + (1, 9, 6), # T3_ket + ], + (-1, 14, 15), # projector_top_left_ket + (1, 7, -3), # projector_bottom_left_bra + ], + } + + ctmrg_split_transfer_phys_left_top: Definition = { + "tensors": [ + [ + "tensor", + "T4_ket", + "C1", + "T1_ket", + "T1_bra", + ] + ], + "network": [ + [ + (3, -2, -4, -6, 4), # tensor + (-1, 3, 1), # T4_ket + (1, 2), # C1 + (2, 4, 5), # T1_ket + (5, -3, -5), # T1_bra + ] + ], + } + + ctmrg_split_transfer_phys_left_bottom: Definition = { + "tensors": [ + [ + "tensor_conj", + "T4_bra", + "C4", + "T3_ket", + "T3_bra", + ] + ], + "network": [ + [ + (4, 5, -6, -2, -5), # tensor + (1, 4, -3), # T4_bra + (2, 1), # C4 + (2, -4, 3), # T3_ket + (3, 5, -1), # T3_bra + ] + ], + } + + ctmrg_split_transfer_phys_right_top: Definition = { + "tensors": [ + [ + "tensor", + "T1_ket", + "T1_bra", + "C2", + "T2_ket", + ] + ], + "network": [ + [ + (-2, -4, -6, 4, 5), # tensor + (-1, 5, 3), # T1_ket + (3, -5, 2), # T1_bra + (2, 1), # C2 + (-3, 4, 1), # T2_ket + ] + ], + } + + ctmrg_split_transfer_phys_right_bottom: Definition = { + "tensors": [ + [ + "tensor_conj", + "T2_bra", + "C3", + "T3_bra", + "T3_ket", + ] + ], + "network": [ + [ + (-6, 4, -4, 3, -3), # tensor_conj + (1, 3, -1), # T2_bra + (2, 1), # C3 + (5, 4, 2), # T3_bra + (-5, -2, 5), # T3_ket + ] + ], + } + + ctmrg_split_transfer_phys_top_left: Definition = { + "tensors": [ + [ + "tensor", + "T4_bra", + "T4_ket", + "C1", + "T1_ket", + ] + ], + "network": [ + [ + (4, -2, -6, -4, 3), # tensor + (-1, -5, 5), # T4_bra + (5, 4, 2), # T4_ket + (2, 1), # C1 + (1, 3, -3), # T1_ket + ] + ], + } + + ctmrg_split_transfer_phys_top_right: Definition = { + "tensors": [ + [ + "tensor_conj", + "T1_bra", + "C2", + "T2_ket", + "T2_bra", + ] + ], + "network": [ + [ + (-3, -6, -4, 5, 4), # tensor_conj + (-1, 4, 1), # T1_bra + (1, 2), # C2 + (3, -2, 2), # T2_ket + (-5, 5, 3), # T2_bra + ] + ], + } + + ctmrg_split_transfer_phys_bottom_left: Definition = { + "tensors": [ + [ + "tensor", + "T4_ket", + "T4_bra", + "C4", + "T3_ket", + ] + ], + "network": [ + [ + (5, 4, -4, -2, -6), # tensor + (3, 5, -5), # T4_ket + (2, -3, 3), # T4_bra + (1, 2), # C4 + (1, 4, -1), # T3_ket + ] + ], + } + + ctmrg_split_transfer_phys_bottom_right: Definition = { + "tensors": [ + [ + "tensor_conj", + "T3_bra", + "C3", + "T2_bra", + "T2_ket", + ] + ], + "network": [ + [ + (-5, 4, -6, 3, -2), # tensor_conj + (-3, 4, 2), # T3_bra + (2, 1), # C3 + (1, 3, 5), # T2_bra + (5, -4, -1), # T2_ket + ] + ], + } + + ctmrg_split_transfer_phys_top: Definition = { + "tensors": [ + [ + "tensor", + "T4_ket", + "C1", + "T1_ket", + "T1_bra", + "C2", + "T2_ket", + ] + ], + "network": [ + [ + (5, -2, -5, 8, 6), # tensor + (-1, 5, 1), # T4_ket + (1, 2), # C1 + (2, 6, 7), # T1_ket + (7, -4, 3), # T1_bra + (3, 4), # C2 + (-3, 8, 4), # T2_ket + ] + ], + } + + ctmrg_split_transfer_phys_bottom: Definition = { + "tensors": [ + [ + "tensor_conj", + "T2_bra", + "C3", + "T3_bra", + "T3_ket", + "C4", + "T4_bra", + ] + ], + "network": [ + [ + (8, 6, -3, 5, -2), # tensor_conj + (1, 5, -1), # T2_bra + (2, 1), # C3 + (7, 6, 2), # T3_bra + (3, -5, 7), # T3_ket + (3, 4), # C4 + (4, 8, -4), # T4_bra + ] + ], + } + + ctmrg_split_transfer_phys_left: Definition = { + "tensors": [ + [ + "tensor", + "T3_ket", + "C4", + "T4_bra", + "T4_ket", + "C1", + "T1_ket", + ] + ], + "network": [ + [ + (6, 8, -3, -5, 5), # tensor + (4, 8, -1), # T3_ket + (4, 3), # C4 + (3, -2, 7), # T4_bra + (7, 6, 2), # T4_ket + (2, 1), # C1 + (1, 5, -4), # T1_ket + ] + ], + } + + ctmrg_split_transfer_phys_right: Definition = { + "tensors": [ + [ + "tensor_conj", + "T1_bra", + "C2", + "T2_ket", + "T2_bra", + "C3", + "T3_bra", + ] + ], + "network": [ + [ + (-4, 5, -5, 6, 8), # tensor_conj + (-1, 8, 4), # T1_bra + (4, 3), # C2 + (7, -2, 3), # T2_ket + (2, 6, 7), # T2_bra + (1, 2), # C3 + (-3, 5, 1), # T3_bra + ] + ], + } + + ctmrg_split_transfer_phys_top_full: Definition = { + "tensors": [ + [ + "tensor", + "T4_ket", + "C1", + "T1_ket", + "T1_bra", + ], + [ + "tensor", + "T1_ket", + "T1_bra", + "C2", + "T2_ket", + ], + "projector_left_bottom_ket", + "projector_right_bottom_bra", + ], + "network": [ + [ + (3, 6, -3, 16, 4), # tensor + (5, 3, 1), # T4_ket + (1, 2), # C1 + (2, 4, 7), # T1_ket + (7, -2, 15), # T1_bra + ], + [ + (16, -5, -6, 13, 14), # tensor + (15, 14, 12), # T1_ket + (12, 11, 8), # T1_bra + (8, 9), # C2 + (10, 13, 9), # T2_ket + ], + (-1, 5, 6), # projector_left_bottom_phys + (10, 11, -4), # projector_right_bottom_phys + ], + } + + ctmrg_split_transfer_phys_bottom_full: Definition = { + "tensors": [ + [ + "tensor_conj", + "T4_bra", + "C4", + "T3_ket", + "T3_bra", + ], + [ + "tensor_conj", + "T3_ket", + "T3_bra", + "C3", + "T2_bra", + ], + "projector_left_top_phys", + "projector_right_top_phys", + ], + "network": [ + [ + (13, 14, -6, 16, -5), # tensor_conj + (9, 13, 10), # T4_bra + (8, 9), # C4 + (8, 11, 12), # T3_ket + (12, 14, 15), # T3_bra + ], + [ + (16, 4, -3, 3, 6), # tensor_conj + (15, -2, 7), # T3_ket + (7, 4, 2), # T3_bra + (2, 1), # C3 + (1, 3, 5), # T2_bra + ], + (10, 11, -4), # projector_left_top_phys + (-1, 5, 6), # projector_right_top_phys + ], + } + + ctmrg_split_transfer_phys_left_full: Definition = { + "tensors": [ + [ + "tensor", + "T1_ket", + "C1", + "T4_ket", + "T4_bra", + ], + [ + "tensor", + "T4_ket", + "T4_bra", + "C4", + "T3_ket", + ], + "projector_top_right_phys", + "projector_bottom_right_phys", + ], + "network": [ + [ + (4, 16, -6, 6, 3), # tensor + (1, 3, 5), # T1_ket + (2, 1), # C1 + (7, 4, 2), # T4_ket + (15, -5, 7), # T4_bra + ], + [ + (14, 13, -3, -2, 16), # tensor + (12, 14, 15), # T4_ket + (8, 11, 12), # T4_bra + (9, 8), # C4 + (9, 13, 10), # T3_ket + ], + (5, 6, -4), # projector_top_right_phys + (-1, 10, 11), # projector_bottom_right_phys + ], + } + + ctmrg_split_transfer_phys_right_full: Definition = { + "tensors": [ + [ + "tensor_conj", + "T1_bra", + "C2", + "T2_ket", + "T2_bra", + ], + [ + "tensor_conj", + "T2_ket", + "T2_bra", + "C3", + "T3_bra", + ], + "projector_top_left_phys", + "projector_bottom_left_phys", + ], "network": [ [ - (-6, 4, 3, 5, -3), # tensor - (-5, 6, 3, 7, -2), # tensor_conj - (5, 7, 2, -1), # T2 - (-4, 1, 6, 4), # T3 + (-2, 16, -3, 14, 13), # tensor_conj + (10, 13, 9), # T1_bra + (9, 8), # C2 + (12, 11, 8), # T2_ket + (15, 14, 12), # T2_bra + ], + [ + (6, 3, -6, 4, 16), # tensor_conj + (7, -5, 15), # T2_ket + (2, 4, 7), # T2_bra (1, 2), # C3 - ] + (5, 3, 1), # T3_bra + ], + (-1, 10, 11), # projector_top_left_phys + (5, 6, -4), # projector_bottom_left_phys ], } - """ - .. figure:: /images/ctmrg_bottom_right_large_d.* - :align: center - :width: 60% - :alt: Contraction for bottom right CTM corner for high dimensions with contraction order shown. - - Contraction for bottom right CTM corner for high physical dimensions. - - \\ - """ ctmrg_absorption_left_C1: Definition = { "tensors": [["C1", "T1"], "projector_left_bottom"], @@ -1597,6 +2510,390 @@ def _prepare_defs(cls): \\ """ + ctmrg_split_transfer_absorption_left_C1: Definition = { + "tensors": [ + ["C1", "T1_ket", "T1_bra"], + "projector_left_bottom_ket", + "projector_left_bottom_bra", + ], + "network": [ + [ + (2, 1), # C1 + (1, 3, 4), # T1_ket + (4, 6, -2), # T1_bra + ], + (5, 2, 3), # projector_left_bottom_ket + (-1, 5, 6), # projector_left_bottom_bra + ], + } + + ctmrg_split_transfer_absorption_left_T4: Definition = { + "tensors": [ + ["tensor", "tensor_conj", "T4_ket", "T4_bra"], + "projector_left_top_ket", + "projector_left_top_bra", + "projector_left_bottom_ket", + "projector_left_bottom_bra", + ], + "network": [ + [ + (4, 6, 10, -3, 3), # tensor + (9, 12, 10, -2, 8), # tensor_conj + (5, 4, 1), # T4_ket + (2, 9, 5), # T4_bra + ], + (1, 3, 7), # projector_left_top_ket + (7, 8, -4), # projector_left_top_bra + (11, 2, 6), # projector_left_bottom_ket + (-1, 11, 12), # projector_left_bottom_bra + ], + } + + ctmrg_split_transfer_absorption_left_T4_ket: Definition = { + "tensors": [ + ["tensor", "T4_ket"], + "projector_left_top_ket", + "projector_left_top_bra", + "projector_left_bottom_phys_ket", + "projector_left_bottom_phys_bra", + ], + "network": [ + [ + (3, 5, 7, -2, 2), # tensor + (4, 3, 1), # T4_ket + ], + (1, 2, 8), # projector_left_top_ket + (8, 9, -3), # projector_left_top_bra + (6, 4, 5), # projector_left_bottom_phys_ket + (-1, 6, 9, 7), # projector_left_bottom_phys_bra + ], + } + + ctmrg_split_transfer_absorption_left_T4_bra: Definition = { + "tensors": [ + ["tensor_conj", "T4_bra"], + "projector_left_top_phys_ket", + "projector_left_top_phys_bra", + "projector_left_bottom_ket", + "projector_left_bottom_bra", + ], + "network": [ + [ + (6, 9, 7, -2, 5), # tensor_conj + (2, 6, 1), # T4_bra + ], + (1, 3, 4), # projector_left_top_phys_ket + (4, 5, 7, -3), # projector_left_top_phys_bra + (8, 2, 3), # projector_left_bottom_ket + (-1, 8, 9), # projector_left_bottom_bra + ], + } + + ctmrg_split_transfer_absorption_left_C4: Definition = { + "tensors": [ + ["T3_ket", "T3_bra", "C4"], + "projector_left_top_ket", + "projector_left_top_bra", + ], + "network": [ + [ + (1, 3, 4), # T3_ket + (4, 6, -1), # T3_bra + (1, 2), # C4 + ], + (2, 3, 5), # projector_left_top_ket + (5, 6, -2), # projector_left_top_bra + ], + } + + ctmrg_split_transfer_absorption_right_C2: Definition = { + "tensors": [ + ["T1_ket", "T1_bra", "C2"], + "projector_right_bottom_ket", + "projector_right_bottom_bra", + ], + "network": [ + [ + (-1, 6, 4), # T1_ket + (4, 3, 1), # T1_bra + (1, 2), # C2 + ], + (5, 6, -2), # projector_right_bottom_ket + (2, 3, 5), # projector_right_bottom_bra + ], + } + + ctmrg_split_transfer_absorption_right_T2: Definition = { + "tensors": [ + ["tensor", "tensor_conj", "T2_ket", "T2_bra"], + "projector_right_top_ket", + "projector_right_top_bra", + "projector_right_bottom_ket", + "projector_right_bottom_bra", + ], + "network": [ + [ + (-3, 8, 10, 9, 12), # tensor + (-2, 3, 10, 4, 6), # tensor_conj + (5, 9, 2), # T2_ket + (1, 4, 5), # T2_bra + ], + (-4, 11, 12), # projector_right_top_ket + (11, 2, 6), # projector_right_top_bra + (7, 8, -1), # projector_right_bottom_ket + (1, 3, 7), # projector_right_bottom_bra + ], + } + + ctmrg_split_transfer_absorption_right_T2_ket: Definition = { + "tensors": [ + ["tensor", "T2_ket"], + "projector_right_top_ket", + "projector_right_top_bra", + "projector_right_bottom_phys_ket", + "projector_right_bottom_phys_bra", + ], + "network": [ + [ + (-2, 5, 7, 6, 9), # tensor + (1, 6, 2), # T2_ket + ], + (-3, 8, 9), # projector_right_top_ket + (8, 2, 3), # projector_right_top_bra + (4, 5, 7, -1), # projector_right_bottom_phys_ket + (1, 3, 4), # projector_right_bottom_phys_bra + ], + } + + ctmrg_split_transfer_absorption_right_T2_bra: Definition = { + "tensors": [ + ["tensor_conj", "T2_bra"], + "projector_right_top_phys_ket", + "projector_right_top_phys_bra", + "projector_right_bottom_ket", + "projector_right_bottom_bra", + ], + "network": [ + [ + (-2, 2, 7, 3, 5), # tensor_conj + (1, 3, 4), # T2_bra + ], + (-3, 6, 9, 7), # projector_right_top_phys_ket + (6, 4, 5), # projector_right_top_phys_bra + (8, 9, -1), # projector_right_bottom_ket + (1, 2, 8), # projector_right_bottom_bra + ], + } + + ctmrg_split_transfer_absorption_right_C3: Definition = { + "tensors": [ + ["C3", "T3_ket", "T3_bra"], + "projector_right_top_ket", + "projector_right_top_bra", + ], + "network": [ + [ + (1, 2), # C3 + (-1, 6, 4), # T3_ket + (4, 3, 1), # T3_bra + ], + (-2, 5, 6), # projector_right_top_ket + (5, 2, 3), # projector_right_top_bra + ], + } + + ctmrg_split_transfer_absorption_top_C1: Definition = { + "tensors": [ + ["T4_ket", "T4_bra", "C1"], + "projector_top_right_ket", + "projector_top_right_bra", + ], + "network": [ + [ + (4, 3, 1), # T4_ket + (-1, 6, 4), # T4_bra + (1, 2), # C1 + ], + (2, 3, 5), # projector_top_right_ket + (5, 6, -2), # projector_top_right_bra + ], + } + + ctmrg_split_transfer_absorption_top_T1: Definition = { + "tensors": [ + ["tensor", "tensor_conj", "T1_ket", "T1_bra"], + "projector_top_left_ket", + "projector_top_left_bra", + "projector_top_right_ket", + "projector_top_right_bra", + ], + "network": [ + [ + (3, -2, 10, 6, 4), # tensor + (8, -3, 10, 12, 9), # tensor_conj + (1, 4, 5), # T1_ket + (5, 9, 2), # T1_bra + ], + (7, 1, 3), # projector_top_left_ket + (-1, 7, 8), # projector_top_left_bra + (2, 6, 11), # projector_top_right_ket + (11, 12, -4), # projector_top_right_bra + ], + } + + ctmrg_split_transfer_absorption_top_T1_ket: Definition = { + "tensors": [ + ["tensor", "T1_ket"], + "projector_top_left_ket", + "projector_top_left_bra", + "projector_top_right_phys_ket", + "projector_top_right_phys_bra", + ], + "network": [ + [ + (2, -2, 7, 5, 3), # tensor + (1, 3, 4), # T1_ket + ], + (8, 1, 2), # projector_top_left_ket + (-1, 8, 9), # projector_top_left_bra + (4, 5, 6), # projector_top_right_phys_ket + (6, 9, 7, -3), # projector_top_right_phys_bra + ], + } + + ctmrg_split_transfer_absorption_top_T1_bra: Definition = { + "tensors": [ + ["tensor_conj", "T1_bra"], + "projector_top_left_phys_ket", + "projector_top_left_phys_bra", + "projector_top_right_ket", + "projector_top_right_bra", + ], + "network": [ + [ + (5, -2, 7, 9, 6), # tensor_conj + (1, 6, 2), # T1_bra + ], + (4, 1, 3), # projector_top_left_phys_ket + (-1, 4, 5, 7), # projector_top_left_phys_bra + (2, 3, 8), # projector_top_right_ket + (8, 9, -3), # projector_top_right_bra + ], + } + + ctmrg_split_transfer_absorption_top_C2: Definition = { + "tensors": [ + ["C2", "T2_ket", "T2_bra"], + "projector_top_left_ket", + "projector_top_left_bra", + ], + "network": [ + [ + (2, 1), # C2 + (4, 3, 1), # T2_ket + (-2, 6, 4), # T2_bra + ], + (5, 2, 3), # projector_top_left_ket + (-1, 5, 6), # projector_top_left_bra + ], + } + + ctmrg_split_transfer_absorption_bottom_C4: Definition = { + "tensors": [ + ["C4", "T4_ket", "T4_bra"], + "projector_bottom_right_ket", + "projector_bottom_right_bra", + ], + "network": [ + [ + (2, 1), # C4 + (4, 6, -2), # T4_ket + (1, 3, 4), # T4_bra + ], + (-1, 5, 6), # projector_bottom_right_ket + (5, 2, 3), # projector_bottom_right_bra + ], + } + + ctmrg_split_transfer_absorption_bottom_T3: Definition = { + "tensors": [ + ["tensor", "tensor_conj", "T3_ket", "T3_bra"], + "projector_bottom_left_ket", + "projector_bottom_left_bra", + "projector_bottom_right_ket", + "projector_bottom_right_bra", + ], + "network": [ + [ + (12, 9, 10, 8, -2), # tensor + (6, 4, 10, 3, -3), # tensor_conj + (2, 9, 5), # T3_ket + (5, 4, 1), # T3_bra + ], + (11, 12, -1), # projector_bottom_left_ket + (2, 6, 11), # projector_bottom_left_bra + (-4, 7, 8), # projector_bottom_right_ket + (7, 1, 3), # projector_bottom_right_bra + ], + } + + ctmrg_split_transfer_absorption_bottom_T3_ket: Definition = { + "tensors": [ + ["tensor", "T3_ket"], + "projector_bottom_left_ket", + "projector_bottom_left_bra", + "projector_bottom_right_phys_ket", + "projector_bottom_right_phys_bra", + ], + "network": [ + [ + (9, 6, 7, 5, -2), # tensor + (2, 6, 1), # T3_ket + ], + (8, 9, -1), # projector_bottom_left_ket + (2, 3, 8), # projector_bottom_left_bra + (-3, 4, 5, 7), # projector_bottom_right_phys_ket + (4, 1, 3), # projector_bottom_right_phys_bra + ], + } + + ctmrg_split_transfer_absorption_bottom_T3_bra: Definition = { + "tensors": [ + ["tensor_conj", "T3_bra"], + "projector_bottom_left_phys_ket", + "projector_bottom_left_phys_bra", + "projector_bottom_right_ket", + "projector_bottom_right_bra", + ], + "network": [ + [ + (5, 3, 7, 2, -2), # tensor_conj + (4, 3, 1), # T3_bra + ], + (6, 9, 7, -1), # projector_bottom_left_phys_ket + (4, 5, 6), # projector_bottom_left_phys_bra + (-3, 8, 9), # projector_bottom_right_ket + (8, 1, 2), # projector_bottom_right_bra + ], + } + + ctmrg_split_transfer_absorption_bottom_C3: Definition = { + "tensors": [ + ["T2_ket", "T2_bra", "C3"], + "projector_bottom_left_ket", + "projector_bottom_left_bra", + ], + "network": [ + [ + (4, 6, -2), # T2_ket + (1, 3, 4), # T2_bra + (2, 1), # C3 + ], + (5, 6, -1), # projector_bottom_left_ket + (2, 3, 5), # projector_bottom_left_bra + ], + } + ctmrg_gauge_fix_T1: Definition = { "tensors": [["T1"], "left_unitary", "right_unitary"], "network": [ @@ -1886,5 +3183,99 @@ def _prepare_defs(cls): ], } + corrlength_transfer_right: Definition = { + "tensors": [["tensor", "tensor_conj", "T1", "T3"]], + "network": [ + [ + (-2, 4, 1, -6, 2), # tensor + (-3, 5, 1, -7, 3), # tensor_conj + (-1, 2, 3, -5), # T1 + (-4, -8, 5, 4), # T3 + ] + ], + } + + corrlength_vector_left: Definition = { + "tensors": [["C1", "T4", "C4"]], + "network": [ + [ + (1, -1), # C1 + (2, -3, -2, 1), # T4 + (-4, 2), # C4 + ] + ], + } + + corrlength_vector_right: Definition = { + "tensors": [["C2", "T2", "C3"]], + "network": [ + [ + (-1, 1), # C2 + (-2, -3, 2, 1), # T2 + (-4, 2), # C3 + ] + ], + } + + corrlength_transfer_bottom: Definition = { + "tensors": [["tensor", "tensor_conj", "T4", "T2"]], + "network": [ + [ + (2, -6, 1, 4, -2), # tensor + (3, -7, 1, 5, -3), # tensor_conj + (-5, 3, 2, -1), # T4 + (4, 5, -8, -4), # T2 + ] + ], + } + + corrlength_vector_top: Definition = { + "tensors": [["C1", "T1", "C2"]], + "network": [ + [ + (-1, 1), # C1 + (1, -2, -3, 2), # T1 + (2, -4), # C2 + ] + ], + } + + corrlength_vector_bottom: Definition = { + "tensors": [["C4", "T3", "C3"]], + "network": [ + [ + (1, -1), # C4 + (1, 2, -3, -2), # T3 + (2, -4), # C3 + ] + ], + } + + corrlength_absorb_one_column: Definition = { + "tensors": [["tensor", "tensor_conj", "T1", "T3"], "vec"], + "network": [ + [ + (3, 8, 2, -2, 4), # tensor + (5, 9, 2, -3, 6), # tensor_conj + (1, 4, 6, -1), # T1 + (7, -4, 9, 8), # T3 + ], + [1, 3, 5, 7], # vec + ], + } + + corrlength_absorb_one_row: Definition = { + "tensors": [["tensor", "tensor_conj", "T4", "T2"], "vec"], + "network": [ + [ + (4, -2, 2, 8, 3), # tensor + (6, -3, 2, 9, 5), # tensor_conj + (-1, 6, 4, 1), # T4 + (8, 9, -4, 7), # T3 + ], + [1, 3, 5, 7], # vec + ], + } + Definitions._prepare_defs() diff --git a/varipeps/corrlength/__init__.py b/varipeps/corrlength/__init__.py new file mode 100644 index 0000000..cbb4dbf --- /dev/null +++ b/varipeps/corrlength/__init__.py @@ -0,0 +1,2 @@ +from . import corrlength +from .corrlength import calculate_correlation_length diff --git a/varipeps/corrlength/corrlength.py b/varipeps/corrlength/corrlength.py new file mode 100644 index 0000000..65c63db --- /dev/null +++ b/varipeps/corrlength/corrlength.py @@ -0,0 +1,88 @@ +import numpy as np +from scipy.sparse.linalg import LinearOperator, eigs + +import jax.numpy as jnp +from jaxlib.xla_extension import XlaRuntimeError + +from varipeps.contractions import apply_contraction_jitted +from varipeps.peps import PEPS_Unit_Cell + + +def calculate_correlation_length(unitcell: PEPS_Unit_Cell): + initial_vector_left = apply_contraction_jitted( + "corrlength_vector_left", + (unitcell[0, 0][0][0].tensor,), + (unitcell[0, 0][0][0],), + (), + ) + initial_vector_left = initial_vector_left.reshape(-1) + + initial_vector_top = apply_contraction_jitted( + "corrlength_vector_top", + (unitcell[0, 0][0][0].tensor,), + (unitcell[0, 0][0][0],), + (), + ) + initial_vector_top = initial_vector_top.reshape(-1) + + def left_matvec(vec): + vec = jnp.asarray(vec) + for _, view in unitcell.iter_one_row(0): + if vec.ndim != 4: + vec = vec.reshape( + view[0, 0][0][0].T1.shape[0], + view[0, 0][0][0].tensor.shape[0], + view[0, 0][0][0].tensor.shape[0], + view[0, 0][0][0].T3.shape[0], + ) + vec = apply_contraction_jitted( + "corrlength_absorb_one_column", + (view[0, 0][0][0].tensor,), + (view[0, 0][0][0],), + (vec,), + ) + return vec.reshape(-1) + + left_lin_op = LinearOperator( + (initial_vector_left.shape[0], initial_vector_left.shape[0]), + matvec=left_matvec, + ) + + eig_left, eigvec_left = eigs(left_lin_op, k=5, v0=initial_vector_left, which="LM") + + eig_left = eig_left[np.argsort(np.abs(eig_left))[::-1]] + eig_left /= np.abs(eig_left[0]) + + corr_len_left = -1 / np.log(np.abs(eig_left[1])) + + def top_matvec(vec): + vec = jnp.asarray(vec) + for _, view in unitcell.iter_one_column(0): + if vec.ndim != 4: + vec = vec.reshape( + view[0, 0][0][0].T4.shape[3], + view[0, 0][0][0].tensor.shape[4], + view[0, 0][0][0].tensor.shape[4], + view[0, 0][0][0].T2.shape[3], + ) + vec = apply_contraction_jitted( + "corrlength_absorb_one_row", + (view[0, 0][0][0].tensor,), + (view[0, 0][0][0],), + (vec,), + ) + return vec.reshape(-1) + + top_lin_op = LinearOperator( + (initial_vector_top.shape[0], initial_vector_top.shape[0]), + matvec=top_matvec, + ) + + eig_top, eigvec_top = eigs(top_lin_op, k=5, v0=initial_vector_top, which="LM") + + eig_top = eig_top[np.argsort(np.abs(eig_top))[::-1]] + eig_top /= np.abs(eig_top[0]) + + corr_len_top = -1 / np.log(np.abs(eig_top[1])) + + return (corr_len_left, eig_left), (corr_len_top, eig_top) diff --git a/varipeps/ctmrg/absorption.py b/varipeps/ctmrg/absorption.py index ae38295..15e6bec 100644 --- a/varipeps/ctmrg/absorption.py +++ b/varipeps/ctmrg/absorption.py @@ -16,12 +16,15 @@ calc_right_projectors, calc_top_projectors, calc_bottom_projectors, + calc_left_projectors_split_transfer, + calc_right_projectors_split_transfer, + calc_top_projectors_split_transfer, + calc_bottom_projectors_split_transfer, ) from varipeps.expectation.one_site import calc_one_site_single_gate_obj from varipeps.config import VariPEPS_Config from varipeps.global_state import VariPEPS_Global_State - from typing import Sequence, Tuple, List, Dict, Literal CTMRG_Orientation = Literal["top-left", "top-right", "bottom-left", "bottom-right"] @@ -61,6 +64,36 @@ def _get_ctmrg_2x2_structure( return view_tensors, view_tensor_objs +def _get_ctmrg_2x1_structure( + peps_tensors: Sequence[jnp.ndarray], + view: PEPS_Unit_Cell, +) -> Tuple[List[List[jnp.ndarray]], List[List[PEPS_Tensor]]]: + x_slice = slice(0, 2, None) + y_slice = slice(0, 1, None) + + indices = view.get_indices((x_slice, y_slice)) + view_tensors = _tensor_list_from_indices(peps_tensors, indices) + + view_tensor_objs = view[x_slice, y_slice] + + return view_tensors, view_tensor_objs + + +def _get_ctmrg_1x2_structure( + peps_tensors: Sequence[jnp.ndarray], + view: PEPS_Unit_Cell, +) -> Tuple[List[List[jnp.ndarray]], List[List[PEPS_Tensor]]]: + x_slice = slice(0, 1, None) + y_slice = slice(0, 2, None) + + indices = view.get_indices((x_slice, y_slice)) + view_tensors = _tensor_list_from_indices(peps_tensors, indices) + + view_tensor_objs = view[x_slice, y_slice] + + return view_tensors, view_tensor_objs + + def _post_process_CTM_tensors(a: jnp.ndarray, config: VariPEPS_Config) -> jnp.ndarray: a = a / jnp.linalg.norm(a) a_abs = jnp.abs(a) @@ -158,6 +191,7 @@ class definition for details. T4_projector_top = left_projectors.get_projector(x, y, -1, 0).top T4_projector_bottom = left_projectors.get_projector(x, y, 0, 0).bottom + if ( working_tensor_obj.d > working_tensor_obj.chi or working_tensor_obj.d > working_tensor_obj.D[0] ** 2 @@ -237,7 +271,7 @@ class definition for details. right_proj, smallest_S = calc_right_projectors( *_get_ctmrg_2x2_structure(peps_tensors, view, "top-right"), config, - state + state, ) right_projectors[(x, y)] = right_proj smallest_S_list.append(smallest_S) @@ -437,7 +471,7 @@ class definition for details. bottom_proj, smallest_S = calc_bottom_projectors( *_get_ctmrg_2x2_structure(peps_tensors, view, "bottom-left"), config, - state + state, ) bottom_projectors[(x, y)] = bottom_proj smallest_S_list.append(smallest_S) @@ -637,3 +671,581 @@ class definition for details. ord=jnp.inf, ) return result, norm_smallest_S + + +def do_left_absorption_split_transfer( + peps_tensors: Sequence[jnp.ndarray], + unitcell: PEPS_Unit_Cell, + config: VariPEPS_Config, + state: VariPEPS_Global_State, +) -> PEPS_Unit_Cell: + """ + Calculate the left CTMRG tensors after one absorption step and returns + the updated unitcell. This functions uses the CTMRG method with split + transfer matrices for the bra and ket layer. + + Args: + peps_tensors (:term:`sequence` of :obj:`jax.numpy.ndarray`): + The sequence of unique PEPS tensors the unitcell consists of. + unitcell (:obj:`~varipeps.peps.PEPS_Unit_Cell`): + The unitcell to work on. + Returns: + :obj:`~varipeps.peps.PEPS_Unit_Cell`: + New instance of the unitcell with the updated left CTMRG tensors of + all elements of the unitcell. + """ + max_x, max_y = unitcell.get_size() + left_projectors = Projector_Dict(max_x=max_x, max_y=max_y) + + working_unitcell = unitcell.copy() + + smallest_S_list = [] + + for y, iter_columns in working_unitcell.iter_all_columns(only_unique=True): + column_views = [view for view in iter_columns] + + for x, view in column_views: + ( + left_proj, + smallest_S_ket, + smallest_S_bra, + smallest_S_phys_ket, + smallest_S_phys_bra, + ) = calc_left_projectors_split_transfer( + *_get_ctmrg_2x2_structure(peps_tensors, view, "top-left"), config, state + ) + left_projectors[(x, y)] = left_proj + smallest_S_list.append(smallest_S_ket) + smallest_S_list.append(smallest_S_bra) + smallest_S_list.append(smallest_S_phys_ket) + smallest_S_list.append(smallest_S_phys_bra) + + new_C1_list = [] + new_T4_ket_list = [] + new_T4_bra_list = [] + new_C4_list = [] + new_T4_tmp_list = [] + + for x, view in column_views: + working_tensor = peps_tensors[view.get_indices((0, 0))[0][0]] + working_tensor_obj = view[0, 0][0][0] + + C1_ket_projector = left_projectors.get_projector(x, y, -1, 0).bottom_ket + C1_bra_projector = left_projectors.get_projector(x, y, -1, 0).bottom_bra + new_C1_tmp = apply_contraction( + "ctmrg_split_transfer_absorption_left_C1", + [working_tensor], + [working_tensor_obj], + [C1_ket_projector, C1_bra_projector], + ) + new_C1_list.append(_post_process_CTM_tensors(new_C1_tmp, config)) + + T4_ket_projector_top = left_projectors.get_projector(x, y, -1, 0).top_ket + T4_bra_projector_top = left_projectors.get_projector(x, y, -1, 0).top_bra + T4_phys_ket_projector_top = left_projectors.get_projector( + x, y, 0, 0 + ).top_phys_ket + T4_phys_bra_projector_top = left_projectors.get_projector( + x, y, 0, 0 + ).top_phys_bra + T4_ket_projector_bottom = left_projectors.get_projector( + x, y, 0, 0 + ).bottom_ket + T4_bra_projector_bottom = left_projectors.get_projector( + x, y, 0, 0 + ).bottom_bra + T4_phys_ket_projector_bottom = left_projectors.get_projector( + x, y, 0, 0 + ).bottom_phys_ket + T4_phys_bra_projector_bottom = left_projectors.get_projector( + x, y, 0, 0 + ).bottom_phys_bra + + new_T4_ket = apply_contraction_jitted( + "ctmrg_split_transfer_absorption_left_T4_ket", + [working_tensor], + [working_tensor_obj], + [ + T4_ket_projector_top, + T4_bra_projector_top, + T4_phys_ket_projector_bottom, + T4_phys_bra_projector_bottom, + ], + ) + + new_T4_bra = apply_contraction_jitted( + "ctmrg_split_transfer_absorption_left_T4_bra", + [working_tensor], + [working_tensor_obj], + [ + T4_phys_ket_projector_top, + T4_phys_bra_projector_top, + T4_ket_projector_bottom, + T4_bra_projector_bottom, + ], + ) + + new_T4_ket_list.append(_post_process_CTM_tensors(new_T4_ket, config)) + new_T4_bra_list.append(_post_process_CTM_tensors(new_T4_bra, config)) + + C4_ket_projector = left_projectors.get_projector(x, y, 0, 0).top_ket + C4_bra_projector = left_projectors.get_projector(x, y, 0, 0).top_bra + new_C4_tmp = apply_contraction_jitted( + "ctmrg_split_transfer_absorption_left_C4", + [working_tensor], + [working_tensor_obj], + [C4_ket_projector, C4_bra_projector], + ) + new_C4_list.append(_post_process_CTM_tensors(new_C4_tmp, config)) + + for x, view in column_views: + view[0, 1] = view[0, 1][0][0].replace_left_env_tensors( + new_C1_list[x], new_T4_ket_list[x], new_T4_bra_list[x], new_C4_list[x] + ) + + return working_unitcell, smallest_S_list # , new_T4_tmp_list + + +def do_right_absorption_split_transfer( + peps_tensors: Sequence[jnp.ndarray], + unitcell: PEPS_Unit_Cell, + config: VariPEPS_Config, + state: VariPEPS_Global_State, +) -> PEPS_Unit_Cell: + """ + Calculate the right CTMRG tensors after one absorption step and returns + the updated unitcell. This functions uses the CTMRG method with split + transfer matrices for the bra and ket layer. + + Args: + peps_tensors (:term:`sequence` of :obj:`jax.numpy.ndarray`): + The sequence of unique PEPS tensors the unitcell consists of. + unitcell (:obj:`~varipeps.peps.PEPS_Unit_Cell`): + The unitcell to work on. + Returns: + :obj:`~varipeps.peps.PEPS_Unit_Cell`: + New instance of the unitcell with the updated right CTMRG tensors of + all elements of the unitcell. + """ + max_x, max_y = unitcell.get_size() + right_projectors = Projector_Dict(max_x=max_x, max_y=max_y) + + working_unitcell = unitcell.copy() + + smallest_S_list = [] + + for y, iter_columns in working_unitcell.iter_all_columns( + reverse=True, only_unique=True + ): + column_views = [view for view in iter_columns] + + for x, view in column_views: + ( + right_proj, + smallest_S_ket, + smallest_S_bra, + smallest_S_phys_ket, + smallest_S_phys_bra, + ) = calc_right_projectors_split_transfer( + *_get_ctmrg_2x2_structure(peps_tensors, view, "top-right"), + config, + state, + ) + right_projectors[(x, y)] = right_proj + smallest_S_list.append(smallest_S_ket) + smallest_S_list.append(smallest_S_bra) + smallest_S_list.append(smallest_S_phys_ket) + smallest_S_list.append(smallest_S_phys_bra) + + new_C2_list = [] + new_T2_ket_list = [] + new_T2_bra_list = [] + new_C3_list = [] + + for x, view in column_views: + working_tensor = peps_tensors[view.get_indices((0, 0))[0][0]] + working_tensor_obj = view[0, 0][0][0] + + C2_ket_projector = right_projectors.get_projector(x, y, -1, 0).bottom_ket + C2_bra_projector = right_projectors.get_projector(x, y, -1, 0).bottom_bra + new_C2_tmp = apply_contraction( + "ctmrg_split_transfer_absorption_right_C2", + [working_tensor], + [working_tensor_obj], + [C2_ket_projector, C2_bra_projector], + ) + new_C2_list.append(_post_process_CTM_tensors(new_C2_tmp, config)) + + T2_ket_projector_top = right_projectors.get_projector(x, y, -1, 0).top_ket + T2_bra_projector_top = right_projectors.get_projector(x, y, -1, 0).top_bra + T2_phys_ket_projector_top = right_projectors.get_projector( + x, y, 0, 0 + ).top_phys_ket + T2_phys_bra_projector_top = right_projectors.get_projector( + x, y, 0, 0 + ).top_phys_bra + T2_ket_projector_bottom = right_projectors.get_projector( + x, y, 0, 0 + ).bottom_ket + T2_bra_projector_bottom = right_projectors.get_projector( + x, y, 0, 0 + ).bottom_bra + T2_phys_ket_projector_bottom = right_projectors.get_projector( + x, y, 0, 0 + ).bottom_phys_ket + T2_phys_bra_projector_bottom = right_projectors.get_projector( + x, y, 0, 0 + ).bottom_phys_bra + + new_T2_ket = apply_contraction_jitted( + "ctmrg_split_transfer_absorption_right_T2_ket", + [working_tensor], + [working_tensor_obj], + [ + T2_ket_projector_top, + T2_bra_projector_top, + T2_phys_ket_projector_bottom, + T2_phys_bra_projector_bottom, + ], + ) + + new_T2_bra = apply_contraction_jitted( + "ctmrg_split_transfer_absorption_right_T2_bra", + [working_tensor], + [working_tensor_obj], + [ + T2_phys_ket_projector_top, + T2_phys_bra_projector_top, + T2_ket_projector_bottom, + T2_bra_projector_bottom, + ], + ) + + new_T2_ket_list.append(_post_process_CTM_tensors(new_T2_ket, config)) + new_T2_bra_list.append(_post_process_CTM_tensors(new_T2_bra, config)) + + C3_ket_projector = right_projectors.get_projector(x, y, 0, 0).top_ket + C3_bra_projector = right_projectors.get_projector(x, y, 0, 0).top_bra + new_C3_tmp = apply_contraction_jitted( + "ctmrg_split_transfer_absorption_right_C3", + [working_tensor], + [working_tensor_obj], + [C3_ket_projector, C3_bra_projector], + ) + new_C3_list.append(_post_process_CTM_tensors(new_C3_tmp, config)) + + for x, view in column_views: + view[0, -1] = view[0, -1][0][0].replace_right_env_tensors( + new_C2_list[x], new_T2_ket_list[x], new_T2_bra_list[x], new_C3_list[x] + ) + + return working_unitcell, smallest_S_list + + +def do_top_absorption_split_transfer( + peps_tensors: Sequence[jnp.ndarray], + unitcell: PEPS_Unit_Cell, + config: VariPEPS_Config, + state: VariPEPS_Global_State, +) -> PEPS_Unit_Cell: + """ + Calculate the top CTMRG tensors after one absorption step and returns + the updated unitcell. This functions uses the CTMRG method with split + transfer matrices for the bra and ket layer. + + Args: + peps_tensors (:term:`sequence` of :obj:`jax.numpy.ndarray`): + The sequence of unique PEPS tensors the unitcell consists of. + unitcell (:obj:`~varipeps.peps.PEPS_Unit_Cell`): + The unitcell to work on. + Returns: + :obj:`~varipeps.peps.PEPS_Unit_Cell`: + New instance of the unitcell with the updated top CTMRG tensors of + all elements of the unitcell. + """ + max_x, max_y = unitcell.get_size() + top_projectors = Projector_Dict(max_x=max_x, max_y=max_y) + + working_unitcell = unitcell.copy() + + smallest_S_list = [] + + for x, iter_rows in working_unitcell.iter_all_rows(only_unique=True): + row_views = [view for view in iter_rows] + + for y, view in row_views: + ( + top_proj, + smallest_S_ket, + smallest_S_bra, + smallest_S_phys_ket, + smallest_S_phys_bra, + ) = calc_top_projectors_split_transfer( + *_get_ctmrg_2x2_structure(peps_tensors, view, "top-left"), config, state + ) + top_projectors[(x, y)] = top_proj + smallest_S_list.append(smallest_S_ket) + smallest_S_list.append(smallest_S_bra) + smallest_S_list.append(smallest_S_phys_ket) + smallest_S_list.append(smallest_S_phys_bra) + + new_C1_list = [] + new_T1_ket_list = [] + new_T1_bra_list = [] + new_C2_list = [] + + for y, view in row_views: + working_tensor = peps_tensors[view.get_indices((0, 0))[0][0]] + working_tensor_obj = view[0, 0][0][0] + + C1_ket_projector = top_projectors.get_projector(x, y, 0, -1).right_ket + C1_bra_projector = top_projectors.get_projector(x, y, 0, -1).right_bra + new_C1_tmp = apply_contraction( + "ctmrg_split_transfer_absorption_top_C1", + [working_tensor], + [working_tensor_obj], + [C1_ket_projector, C1_bra_projector], + ) + new_C1_list.append(_post_process_CTM_tensors(new_C1_tmp, config)) + + T1_ket_projector_left = top_projectors.get_projector(x, y, 0, -1).left_ket + T1_bra_projector_left = top_projectors.get_projector(x, y, 0, -1).left_bra + T1_phys_ket_projector_left = top_projectors.get_projector( + x, y, 0, 0 + ).left_phys_ket + T1_phys_bra_projector_left = top_projectors.get_projector( + x, y, 0, 0 + ).left_phys_bra + T1_ket_projector_right = top_projectors.get_projector(x, y, 0, 0).right_ket + T1_bra_projector_right = top_projectors.get_projector(x, y, 0, 0).right_bra + T1_phys_ket_projector_right = top_projectors.get_projector( + x, y, 0, 0 + ).right_phys_ket + T1_phys_bra_projector_right = top_projectors.get_projector( + x, y, 0, 0 + ).right_phys_bra + + new_T1_ket = apply_contraction_jitted( + "ctmrg_split_transfer_absorption_top_T1_ket", + [working_tensor], + [working_tensor_obj], + [ + T1_ket_projector_left, + T1_bra_projector_left, + T1_phys_ket_projector_right, + T1_phys_bra_projector_right, + ], + ) + + new_T1_bra = apply_contraction_jitted( + "ctmrg_split_transfer_absorption_top_T1_bra", + [working_tensor], + [working_tensor_obj], + [ + T1_phys_ket_projector_left, + T1_phys_bra_projector_left, + T1_ket_projector_right, + T1_bra_projector_right, + ], + ) + + new_T1_ket_list.append(_post_process_CTM_tensors(new_T1_ket, config)) + new_T1_bra_list.append(_post_process_CTM_tensors(new_T1_bra, config)) + + C2_ket_projector = top_projectors.get_projector(x, y, 0, 0).left_ket + C2_bra_projector = top_projectors.get_projector(x, y, 0, 0).left_bra + new_C2_tmp = apply_contraction_jitted( + "ctmrg_split_transfer_absorption_top_C2", + [working_tensor], + [working_tensor_obj], + [C2_ket_projector, C2_bra_projector], + ) + new_C2_list.append(_post_process_CTM_tensors(new_C2_tmp, config)) + + for y, view in row_views: + view[1, 0] = view[1, 0][0][0].replace_top_env_tensors( + new_C1_list[y], new_T1_ket_list[y], new_T1_bra_list[y], new_C2_list[y] + ) + + return working_unitcell, smallest_S_list + + +def do_bottom_absorption_split_transfer( + peps_tensors: Sequence[jnp.ndarray], + unitcell: PEPS_Unit_Cell, + config: VariPEPS_Config, + state: VariPEPS_Global_State, +) -> PEPS_Unit_Cell: + """ + Calculate the left CTMRG tensors after one absorption step and returns + the updated unitcell. This functions uses the CTMRG method with split + transfer matrices for the bra and ket layer. + + Args: + peps_tensors (:term:`sequence` of :obj:`jax.numpy.ndarray`): + The sequence of unique PEPS tensors the unitcell consists of. + unitcell (:obj:`~varipeps.peps.PEPS_Unit_Cell`): + The unitcell to work on. + Returns: + :obj:`~varipeps.peps.PEPS_Unit_Cell`: + New instance of the unitcell with the updated left CTMRG tensors of + all elements of the unitcell. + """ + max_x, max_y = unitcell.get_size() + bottom_projectors = Projector_Dict(max_x=max_x, max_y=max_y) + + working_unitcell = unitcell.copy() + + smallest_S_list = [] + + for x, iter_rows in working_unitcell.iter_all_rows(reverse=True, only_unique=True): + row_views = [view for view in iter_rows] + + for y, view in row_views: + ( + bottom_proj, + smallest_S_ket, + smallest_S_bra, + smallest_S_phys_ket, + smallest_S_phys_bra, + ) = calc_bottom_projectors_split_transfer( + *_get_ctmrg_2x2_structure(peps_tensors, view, "bottom-left"), + config, + state, + ) + bottom_projectors[(x, y)] = bottom_proj + smallest_S_list.append(smallest_S_ket) + smallest_S_list.append(smallest_S_bra) + smallest_S_list.append(smallest_S_phys_ket) + smallest_S_list.append(smallest_S_phys_bra) + + new_C4_list = [] + new_T3_ket_list = [] + new_T3_bra_list = [] + new_C3_list = [] + + for y, view in row_views: + working_tensor = peps_tensors[view.get_indices((0, 0))[0][0]] + working_tensor_obj = view[0, 0][0][0] + + C4_ket_projector = bottom_projectors.get_projector(x, y, 0, -1).right_ket + C4_bra_projector = bottom_projectors.get_projector(x, y, 0, -1).right_bra + new_C4_tmp = apply_contraction( + "ctmrg_split_transfer_absorption_bottom_C4", + [working_tensor], + [working_tensor_obj], + [C4_ket_projector, C4_bra_projector], + ) + new_C4_list.append(_post_process_CTM_tensors(new_C4_tmp, config)) + + T3_ket_projector_left = bottom_projectors.get_projector( + x, y, 0, -1 + ).left_ket + T3_bra_projector_left = bottom_projectors.get_projector( + x, y, 0, -1 + ).left_bra + T3_phys_ket_projector_left = bottom_projectors.get_projector( + x, y, 0, 0 + ).left_phys_ket + T3_phys_bra_projector_left = bottom_projectors.get_projector( + x, y, 0, 0 + ).left_phys_bra + T3_ket_projector_right = bottom_projectors.get_projector( + x, y, 0, 0 + ).right_ket + T3_bra_projector_right = bottom_projectors.get_projector( + x, y, 0, 0 + ).right_bra + T3_phys_ket_projector_right = bottom_projectors.get_projector( + x, y, 0, 0 + ).right_phys_ket + T3_phys_bra_projector_right = bottom_projectors.get_projector( + x, y, 0, 0 + ).right_phys_bra + + new_T3_ket = apply_contraction_jitted( + "ctmrg_split_transfer_absorption_bottom_T3_ket", + [working_tensor], + [working_tensor_obj], + [ + T3_ket_projector_left, + T3_bra_projector_left, + T3_phys_ket_projector_right, + T3_phys_bra_projector_right, + ], + ) + + new_T3_bra = apply_contraction_jitted( + "ctmrg_split_transfer_absorption_bottom_T3_bra", + [working_tensor], + [working_tensor_obj], + [ + T3_phys_ket_projector_left, + T3_phys_bra_projector_left, + T3_ket_projector_right, + T3_bra_projector_right, + ], + ) + + new_T3_ket_list.append(_post_process_CTM_tensors(new_T3_ket, config)) + new_T3_bra_list.append(_post_process_CTM_tensors(new_T3_bra, config)) + + C3_ket_projector = bottom_projectors.get_projector(x, y, 0, 0).left_ket + C3_bra_projector = bottom_projectors.get_projector(x, y, 0, 0).left_bra + new_C3_tmp = apply_contraction_jitted( + "ctmrg_split_transfer_absorption_bottom_C3", + [working_tensor], + [working_tensor_obj], + [C3_ket_projector, C3_bra_projector], + ) + new_C3_list.append(_post_process_CTM_tensors(new_C3_tmp, config)) + + for y, view in row_views: + view[-1, 0] = view[-1, 0][0][0].replace_bottom_env_tensors( + new_C4_list[y], new_T3_ket_list[y], new_T3_bra_list[y], new_C3_list[y] + ) + + return working_unitcell, smallest_S_list + + +def do_absorption_step_split_transfer( + peps_tensors: Sequence[jnp.ndarray], + unitcell: PEPS_Unit_Cell, + config: VariPEPS_Config, + state: VariPEPS_Global_State, +) -> PEPS_Unit_Cell: + """ + Calculate the all CTMRG tensors after one absorption step and returns + the updated unitcell. This functions uses the CTMRG method with split + transfer matrices for the bra and ket layer. + + Args: + peps_tensors (:term:`sequence` of :obj:`jax.numpy.ndarray`): + The sequence of unique PEPS tensors the unitcell consists of. + unitcell (:obj:`~varipeps.peps.PEPS_Unit_Cell`): + The unitcell to work on. + Returns: + :obj:`~varipeps.peps.PEPS_Unit_Cell`: + New instance of the unitcell with the all updated CTMRG tensors of + all elements of the unitcell. + """ + result, left_smallest_S = do_left_absorption_split_transfer( + peps_tensors, unitcell, config, state + ) + result, top_smallest_S = do_top_absorption_split_transfer( + peps_tensors, result, config, state + ) + result, right_smallest_S = do_right_absorption_split_transfer( + peps_tensors, result, config, state + ) + result, bottom_smallest_S = do_bottom_absorption_split_transfer( + peps_tensors, result, config, state + ) + norm_smallest_S = jnp.linalg.norm( + jnp.asarray( + left_smallest_S + top_smallest_S + right_smallest_S + bottom_smallest_S + ), + ord=jnp.inf, + ) + + return result, norm_smallest_S diff --git a/varipeps/ctmrg/projectors.py b/varipeps/ctmrg/projectors.py index 3ac85d5..139f7b6 100644 --- a/varipeps/ctmrg/projectors.py +++ b/varipeps/ctmrg/projectors.py @@ -5,7 +5,7 @@ from jax import jit, checkpoint from varipeps.peps import PEPS_Tensor -from varipeps.contractions import apply_contraction +from varipeps.contractions import apply_contraction, apply_contraction_jitted from varipeps import varipeps_config from varipeps.utils.func_cache import Checkpointing_Cache from varipeps.utils.svd import gauge_fixed_svd @@ -14,11 +14,18 @@ Right_Projectors, Top_Projectors, Bottom_Projectors, + Left_Projectors_Split_Transfer, + Right_Projectors_Split_Transfer, + Top_Projectors_Split_Transfer, + Bottom_Projectors_Split_Transfer, ) from varipeps.config import Projector_Method, VariPEPS_Config from varipeps.global_state import VariPEPS_Global_State -from typing import Sequence, Tuple, TypeVar +from typing import Sequence, Tuple, TypeVar, Optional + +from varipeps.utils.debug_print import debug_print +import jax.debug class _Projectors_Func_Cache: @@ -98,7 +105,7 @@ def _calc_ctmrg_quarters( def _truncated_SVD( matrix: jnp.ndarray, chi: int, truncation_eps: float -) -> Tuple[jnp.ndarray, jnp.ndarray, jnp.ndarray]: +) -> Tuple[jnp.ndarray, jnp.ndarray, jnp.ndarray, jnp.ndarray]: U, S, Vh = gauge_fixed_svd(matrix) # Truncate the singular values @@ -247,6 +254,200 @@ def _fishman_vertical_cut( return left_U, left_S, left_Vh, right_U, right_S, right_Vh +def _split_transfer_fishman(first_tensor, second_tensor, truncation_eps): + if first_tensor.ndim == 5: + first_tensor_ketbra = first_tensor.reshape( + first_tensor.shape[0] * first_tensor.shape[1], + first_tensor.shape[2] * first_tensor.shape[3] * first_tensor.shape[4], + ) + + second_tensor_ketbra = second_tensor.reshape( + second_tensor.shape[0] * second_tensor.shape[1] * second_tensor.shape[2], + second_tensor.shape[3] * second_tensor.shape[4], + ) + elif first_tensor.ndim == 6: + first_tensor_ketbra = first_tensor.reshape( + first_tensor.shape[0] * first_tensor.shape[1] * first_tensor.shape[2], + first_tensor.shape[3] * first_tensor.shape[4] * first_tensor.shape[5], + ) + + second_tensor_ketbra = second_tensor.reshape( + second_tensor.shape[0] * second_tensor.shape[1] * second_tensor.shape[2], + second_tensor.shape[3] * second_tensor.shape[4] * second_tensor.shape[5], + ) + else: + first_tensor_ketbra = first_tensor.reshape( + first_tensor.shape[0] * first_tensor.shape[1], + first_tensor.shape[2] * first_tensor.shape[3], + ) + + second_tensor_ketbra = second_tensor.reshape( + second_tensor.shape[0] * second_tensor.shape[1], + second_tensor.shape[2] * second_tensor.shape[3], + ) + + first_ketbra_U, first_ketbra_S, first_ketbra_Vh = gauge_fixed_svd( + first_tensor_ketbra + ) + first_ketbra_S = jnp.where( + (first_ketbra_S / first_ketbra_S[0]) >= truncation_eps, first_ketbra_S, 0 + ) + first_ketbra_S /= jnp.sum(first_ketbra_S) + first_ketbra_S = jnp.where( + first_ketbra_S == 0, + 0, + jnp.sqrt(jnp.where(first_ketbra_S == 0, 1, first_ketbra_S)), + ) + if first_tensor.ndim == 5: + first_ketbra_U = first_ketbra_U.reshape( + first_tensor.shape[0], first_tensor.shape[1], first_ketbra_U.shape[-1] + ) + first_ketbra_Vh = first_ketbra_Vh.reshape( + first_ketbra_Vh.shape[0], + first_tensor.shape[2], + first_tensor.shape[3], + first_tensor.shape[4], + ) + elif first_tensor.ndim == 6: + first_ketbra_U = first_ketbra_U.reshape( + first_tensor.shape[0], + first_tensor.shape[1], + first_tensor.shape[2], + first_ketbra_U.shape[-1], + ) + first_ketbra_Vh = first_ketbra_Vh.reshape( + first_ketbra_Vh.shape[0], + first_tensor.shape[3], + first_tensor.shape[4], + first_tensor.shape[5], + ) + else: + first_ketbra_U = first_ketbra_U.reshape( + first_tensor.shape[0], first_tensor.shape[1], first_ketbra_U.shape[-1] + ) + first_ketbra_Vh = first_ketbra_Vh.reshape( + first_ketbra_Vh.shape[0], first_tensor.shape[2], first_tensor.shape[3] + ) + + second_ketbra_U, second_ketbra_S, second_ketbra_Vh = gauge_fixed_svd( + second_tensor_ketbra + ) + second_ketbra_S = jnp.where( + (second_ketbra_S / second_ketbra_S[0]) >= truncation_eps, second_ketbra_S, 0 + ) + second_ketbra_S /= jnp.sum(second_ketbra_S) + second_ketbra_S = jnp.where( + second_ketbra_S == 0, + 0, + jnp.sqrt(jnp.where(second_ketbra_S == 0, 1, second_ketbra_S)), + ) + if second_tensor.ndim == 5: + second_ketbra_U = second_ketbra_U.reshape( + second_tensor.shape[0], + second_tensor.shape[1], + second_tensor.shape[2], + second_ketbra_U.shape[-1], + ) + second_ketbra_Vh = second_ketbra_Vh.reshape( + second_ketbra_Vh.shape[0], second_tensor.shape[3], second_tensor.shape[4] + ) + elif first_tensor.ndim == 6: + second_ketbra_U = second_ketbra_U.reshape( + second_tensor.shape[0], + second_tensor.shape[1], + second_tensor.shape[2], + second_ketbra_U.shape[-1], + ) + second_ketbra_Vh = second_ketbra_Vh.reshape( + second_ketbra_Vh.shape[0], + second_tensor.shape[3], + second_tensor.shape[4], + second_tensor.shape[5], + ) + else: + second_ketbra_U = second_ketbra_U.reshape( + second_tensor.shape[0], second_tensor.shape[1], second_ketbra_U.shape[-1] + ) + second_ketbra_Vh = second_ketbra_Vh.reshape( + second_ketbra_Vh.shape[0], second_tensor.shape[2], second_tensor.shape[3] + ) + + return ( + first_ketbra_U, + first_ketbra_S, + first_ketbra_Vh, + second_ketbra_U, + second_ketbra_S, + second_ketbra_Vh, + ) + + +def _horizontal_cut_split_transfer( + peps_tensors: Sequence[Sequence[jnp.ndarray]], + peps_tensor_objs: Sequence[Sequence[PEPS_Tensor]], + fishman: bool = False, + truncation_eps: Optional[float] = None, + offset: int = 0, +): + top_tensor = apply_contraction_jitted( + "ctmrg_split_transfer_top", + [peps_tensors[0][0 + offset]], + [peps_tensor_objs[0][0 + offset]], + [], + ) + + bottom_tensor = apply_contraction_jitted( + "ctmrg_split_transfer_bottom", + [peps_tensors[1][0 + offset]], + [peps_tensor_objs[1][0 + offset]], + [], + ) + + top_tensor /= jnp.linalg.norm(top_tensor) + bottom_tensor /= jnp.linalg.norm(bottom_tensor) + + if fishman: + return _split_transfer_fishman(top_tensor, bottom_tensor, truncation_eps) + + return ( + top_tensor, + bottom_tensor, + ) + + +def _vertical_cut_split_transfer( + peps_tensors: Sequence[Sequence[jnp.ndarray]], + peps_tensor_objs: Sequence[Sequence[PEPS_Tensor]], + fishman: bool = False, + truncation_eps: Optional[float] = None, + offset: int = 0, +): + left_tensor = apply_contraction_jitted( + "ctmrg_split_transfer_left", + [peps_tensors[0 + offset][0]], + [peps_tensor_objs[0 + offset][0]], + [], + ) + + right_tensor = apply_contraction_jitted( + "ctmrg_split_transfer_right", + [peps_tensors[0 + offset][1]], + [peps_tensor_objs[0 + offset][1]], + [], + ) + + left_tensor /= jnp.linalg.norm(left_tensor) + right_tensor /= jnp.linalg.norm(right_tensor) + + if fishman: + return _split_transfer_fishman(left_tensor, right_tensor, truncation_eps) + + return ( + left_tensor, + right_tensor, + ) + + @partial(jit, static_argnums=(4, 5, 6), inline=True) def _left_projectors_workhorse( top_left: jnp.ndarray, @@ -717,3 +918,1608 @@ class definition for details. ), chi, ) + + +def _split_transfer_workhorse( + first_ketbra: jnp.ndarray, + second_ketbra: jnp.ndarray, + chi: int, + truncation_eps: float, + fishman_input: bool = False, +): + if fishman_input and first_ketbra.ndim == 4: + first_ketbra_matrix = first_ketbra.reshape( + first_ketbra.shape[0], + first_ketbra.shape[1] * first_ketbra.shape[2] * first_ketbra.shape[3], + ) + + second_ketbra_matrix = second_ketbra.reshape( + second_ketbra.shape[0] * second_ketbra.shape[1] * second_ketbra.shape[2], + second_ketbra.shape[3], + ) + elif first_ketbra.ndim == 4: + first_ketbra_matrix = first_ketbra.reshape( + first_ketbra.shape[0] * first_ketbra.shape[1], + first_ketbra.shape[2] * first_ketbra.shape[3], + ) + + second_ketbra_matrix = second_ketbra.reshape( + second_ketbra.shape[0] * second_ketbra.shape[1], + second_ketbra.shape[2] * second_ketbra.shape[3], + ) + elif first_ketbra.ndim == 3: + first_ketbra_matrix = first_ketbra.reshape( + first_ketbra.shape[0], + first_ketbra.shape[1] * first_ketbra.shape[2], + ) + + second_ketbra_matrix = second_ketbra.reshape( + second_ketbra.shape[0] * second_ketbra.shape[1], + second_ketbra.shape[2], + ) + elif first_ketbra.ndim == 5: + first_ketbra_matrix = first_ketbra.reshape( + first_ketbra.shape[0] * first_ketbra.shape[1] * first_ketbra.shape[2], + first_ketbra.shape[3] * first_ketbra.shape[4], + ) + second_ketbra_matrix = second_ketbra.reshape( + second_ketbra.shape[0] * second_ketbra.shape[1], + second_ketbra.shape[2] * second_ketbra.shape[3] * second_ketbra.shape[4], + ) + elif first_ketbra.ndim == 6: + first_ketbra_matrix = first_ketbra.reshape( + first_ketbra.shape[0] * first_ketbra.shape[1] * first_ketbra.shape[2], + first_ketbra.shape[3] * first_ketbra.shape[4] * first_ketbra.shape[5], + ) + second_ketbra_matrix = second_ketbra.reshape( + second_ketbra.shape[0] * second_ketbra.shape[1] * second_ketbra.shape[2], + second_ketbra.shape[3] * second_ketbra.shape[4] * second_ketbra.shape[5], + ) + else: + raise ValueError("Invalid dimension of the input tensor") + + product_matrix_ketbra = jnp.dot(first_ketbra_matrix, second_ketbra_matrix) + S_inv_sqrt_ketbra, U_ketbra, Vh_ketbra, smallest_S_ketbra = _truncated_SVD( + product_matrix_ketbra, chi, truncation_eps + ) + + projector_first_ketbra = jnp.dot( + U_ketbra.transpose().conj() * S_inv_sqrt_ketbra[:, jnp.newaxis], + first_ketbra_matrix, + ) + projector_second_ketbra = jnp.dot( + second_ketbra_matrix, Vh_ketbra.transpose().conj() * S_inv_sqrt_ketbra + ) + + if first_ketbra.ndim == 6: + projector_first_ketbra = projector_first_ketbra.reshape( + projector_first_ketbra.shape[0], + first_ketbra.shape[3], + first_ketbra.shape[4], + first_ketbra.shape[5], + ) + projector_second_ketbra = projector_second_ketbra.reshape( + second_ketbra.shape[0], + second_ketbra.shape[1], + second_ketbra.shape[2], + projector_second_ketbra.shape[1], + ) + else: + if fishman_input and first_ketbra.ndim == 4: + projector_first_ketbra = projector_first_ketbra.reshape( + projector_first_ketbra.shape[0], + first_ketbra.shape[1], + first_ketbra.shape[2], + first_ketbra.shape[3], + ) + elif first_ketbra.ndim == 4: + projector_first_ketbra = projector_first_ketbra.reshape( + projector_first_ketbra.shape[0], + first_ketbra.shape[2], + first_ketbra.shape[3], + ) + elif first_ketbra.ndim == 5: + projector_first_ketbra = projector_first_ketbra.reshape( + projector_first_ketbra.shape[0], + first_ketbra.shape[3], + first_ketbra.shape[4], + ) + else: + projector_first_ketbra = projector_first_ketbra.reshape( + projector_first_ketbra.shape[0], + first_ketbra.shape[1], + first_ketbra.shape[2], + ) + + if fishman_input and first_ketbra.ndim == 4: + projector_second_ketbra = projector_second_ketbra.reshape( + second_ketbra.shape[0], + second_ketbra.shape[1], + second_ketbra.shape[2], + projector_second_ketbra.shape[1], + ) + else: + projector_second_ketbra = projector_second_ketbra.reshape( + second_ketbra.shape[0], + second_ketbra.shape[1], + projector_second_ketbra.shape[1], + ) + + return ( + projector_first_ketbra, + projector_second_ketbra, + smallest_S_ketbra, + ) + + +def calc_left_projectors_split_transfer( + peps_tensors: Sequence[Sequence[jnp.ndarray]], + peps_tensor_objs: Sequence[Sequence[PEPS_Tensor]], + config: VariPEPS_Config, + state: VariPEPS_Global_State, +) -> Left_Projectors_Split_Transfer: + """ + Calculate the left projectors for the CTMRG method. This functions uses the + CTMRG method with split transfer matrices for the bra and ket layer. + + Args: + peps_tensors (:term:`sequence` of :term:`sequence` of :obj:`jax.numpy.ndarray`): + Nested list of the PEPS tensor arrays. The row (first) index corresponds + to the x axis, the column (second) index to y. + peps_tensor_objs (:term:`sequence` of :term:`sequence` of :obj:`~varipeps.peps.PEPS_Tensor`): + Nested list of the PEPS tensor objects. Same format as for `peps_tensors`. + Returns: + :obj:`tuple`\ (:obj:`jax.numpy.ndarray`, :obj:`jax.numpy.ndarray`): + The left top and bottom projectors for both layer. + """ + if config.checkpointing_projectors: + raise NotImplementedError( + "Checkpointing not implemented for split transfer matrices approach." + ) + + chi = _check_chi(peps_tensor_objs) + + projector_method = ( + config.ctmrg_full_projector_method + if state.ctmrg_projector_method is None + else state.ctmrg_projector_method + ) + truncation_eps = ( + config.ctmrg_truncation_eps + if state.ctmrg_effective_truncation_eps is None + else state.ctmrg_effective_truncation_eps + ) + + if projector_method is Projector_Method.FULL: + ( + top_tensor_ketbra_left, + bottom_tensor_ketbra_left, + ) = _horizontal_cut_split_transfer(peps_tensors, peps_tensor_objs) + + ( + top_tensor_ketbra_right, + bottom_tensor_ketbra_right, + ) = _horizontal_cut_split_transfer(peps_tensors, peps_tensor_objs, offset=1) + elif projector_method is Projector_Method.HALF: + ( + top_tensor_ketbra_left, + bottom_tensor_ketbra_left, + ) = _horizontal_cut_split_transfer(peps_tensors, peps_tensor_objs) + + ( + left_tensor_ketbra_top, + right_tensor_ketbra_top, + ) = _vertical_cut_split_transfer(peps_tensors, peps_tensor_objs) + + ( + left_tensor_ketbra_bottom, + right_tensor_ketbra_bottom, + ) = _vertical_cut_split_transfer(peps_tensors, peps_tensor_objs, offset=1) + elif projector_method is Projector_Method.FISHMAN: + ( + top_ketbra_U, + top_ketbra_S, + _, + _, + bottom_ketbra_S, + bottom_ketbra_Vh, + ) = _horizontal_cut_split_transfer( + peps_tensors, peps_tensor_objs, True, truncation_eps + ) + + top_tensor_ketbra_left = ( + top_ketbra_U * top_ketbra_S[jnp.newaxis, jnp.newaxis, :] + ) + bottom_tensor_ketbra_left = ( + bottom_ketbra_S[:, jnp.newaxis, jnp.newaxis] * bottom_ketbra_Vh + ) + + ( + _, + top_ketbra_S, + top_ketbra_Vh, + bottom_ketbra_U, + bottom_ketbra_S, + _, + ) = _horizontal_cut_split_transfer( + peps_tensors, peps_tensor_objs, True, truncation_eps, offset=1 + ) + top_tensor_ketbra_right = ( + top_ketbra_S[:, jnp.newaxis, jnp.newaxis] * top_ketbra_Vh + ) + bottom_tensor_ketbra_right = ( + bottom_ketbra_U * bottom_ketbra_S[jnp.newaxis, jnp.newaxis, :] + ) + else: + raise ValueError("Invalid projector method!") + + ( + projector_left_bottom_ket, + projector_left_top_ket, + smallest_S_ket, + ) = _split_transfer_workhorse( + bottom_tensor_ketbra_left, + top_tensor_ketbra_left, + chi, + truncation_eps, + ) + + if ( + projector_method is Projector_Method.FULL + or projector_method is Projector_Method.FISHMAN + ): + ( + projector_right_top_bra, + projector_right_bottom_bra, + _, + ) = _split_transfer_workhorse( + top_tensor_ketbra_right, + bottom_tensor_ketbra_right, + chi, + truncation_eps, + ) + + top_tensor_bra_left = apply_contraction_jitted( + "ctmrg_split_transfer_top_full", + [peps_tensors[0][0], peps_tensors[0][1]], + [peps_tensor_objs[0][0], peps_tensor_objs[0][1]], + [projector_left_bottom_ket, projector_right_bottom_bra], + ) + + bottom_tensor_bra_left = apply_contraction_jitted( + "ctmrg_split_transfer_bottom_full", + [peps_tensors[1][0], peps_tensors[1][1]], + [peps_tensor_objs[1][0], peps_tensor_objs[1][1]], + [projector_left_top_ket, projector_right_top_bra], + ) + + top_tensor_bra_left /= jnp.linalg.norm(top_tensor_bra_left) + bottom_tensor_bra_left /= jnp.linalg.norm(bottom_tensor_bra_left) + elif projector_method is Projector_Method.HALF: + ( + _, + projector_top_right_ket, + _, + ) = _split_transfer_workhorse( + left_tensor_ketbra_top, + right_tensor_ketbra_top, + chi, + truncation_eps, + ) + + ( + projector_bottom_right_bra, + _, + _, + ) = _split_transfer_workhorse( + right_tensor_ketbra_bottom, + left_tensor_ketbra_bottom, + chi, + truncation_eps, + ) + + top_tensor_bra_left = apply_contraction_jitted( + "ctmrg_split_transfer_left_top_half", + [peps_tensors[0][0]], + [peps_tensor_objs[0][0]], + [projector_left_bottom_ket, projector_top_right_ket], + ) + + bottom_tensor_bra_left = apply_contraction_jitted( + "ctmrg_split_transfer_left_bottom_half", + [peps_tensors[1][0]], + [peps_tensor_objs[1][0]], + [projector_left_top_ket, projector_bottom_right_bra], + ) + + top_tensor_bra_left /= jnp.linalg.norm(top_tensor_bra_left) + bottom_tensor_bra_left /= jnp.linalg.norm(bottom_tensor_bra_left) + + if projector_method is Projector_Method.FISHMAN: + ( + top_bra_U, + top_bra_S, + _, + _, + bottom_bra_S, + bottom_bra_Vh, + ) = _split_transfer_fishman( + top_tensor_bra_left, bottom_tensor_bra_left, truncation_eps + ) + + top_tensor_bra_left = top_bra_U * top_bra_S[jnp.newaxis, jnp.newaxis, :] + bottom_tensor_bra_left = ( + bottom_bra_S[:, jnp.newaxis, jnp.newaxis] * bottom_bra_Vh + ) + + ( + projector_left_bottom_bra, + projector_left_top_bra, + smallest_S_bra, + ) = _split_transfer_workhorse( + bottom_tensor_bra_left, + top_tensor_bra_left, + chi, + truncation_eps, + ) + + top_tensor_phys_ket_left = apply_contraction_jitted( + "ctmrg_split_transfer_phys_top", + [peps_tensors[0][0]], + [peps_tensor_objs[0][0]], + [], + ) + bottom_tensor_phys_ket_left = apply_contraction_jitted( + "ctmrg_split_transfer_phys_bottom", + [peps_tensors[0][0]], + [peps_tensor_objs[0][0]], + [], + ) + + top_tensor_phys_bra_right = apply_contraction_jitted( + "ctmrg_split_transfer_phys_top", + [peps_tensors[0][1]], + [peps_tensor_objs[0][1]], + [], + ) + bottom_tensor_phys_bra_right = apply_contraction_jitted( + "ctmrg_split_transfer_phys_bottom", + [peps_tensors[0][1]], + [peps_tensor_objs[0][1]], + [], + ) + top_tensor_phys_bra_right = top_tensor_phys_bra_right.transpose(0, 1, 4, 2, 3) + bottom_tensor_phys_bra_right = bottom_tensor_phys_bra_right.transpose(0, 1, 4, 2, 3) + + top_tensor_phys_ket_left /= jnp.linalg.norm(top_tensor_phys_ket_left) + bottom_tensor_phys_ket_left /= jnp.linalg.norm(bottom_tensor_phys_ket_left) + top_tensor_phys_bra_right /= jnp.linalg.norm(top_tensor_phys_bra_right) + bottom_tensor_phys_bra_right /= jnp.linalg.norm(bottom_tensor_phys_bra_right) + + if ( + projector_method is Projector_Method.FISHMAN + or projector_method is Projector_Method.HALF + ): + ( + top_phys_ket_U, + top_phys_ket_S, + _, + _, + bottom_phys_ket_S, + bottom_phys_ket_Vh, + ) = _split_transfer_fishman( + top_tensor_phys_ket_left, bottom_tensor_phys_ket_left, truncation_eps + ) + + top_tensor_phys_ket_left = ( + top_phys_ket_U * top_phys_ket_S[jnp.newaxis, jnp.newaxis, :] + ) + bottom_tensor_phys_ket_left = ( + bottom_phys_ket_S[:, jnp.newaxis, jnp.newaxis] * bottom_phys_ket_Vh + ) + + ( + bottom_phys_bra_U, + bottom_phys_bra_S, + _, + _, + top_phys_bra_S, + top_phys_bra_Vh, + ) = _split_transfer_fishman( + bottom_tensor_phys_bra_right, top_tensor_phys_bra_right, truncation_eps + ) + top_tensor_phys_bra_right = ( + top_phys_bra_S[:, jnp.newaxis, jnp.newaxis] * top_phys_bra_Vh + ) + bottom_tensor_phys_bra_right = ( + bottom_phys_bra_U * bottom_phys_bra_S[jnp.newaxis, jnp.newaxis, :] + ) + + ( + projector_left_bottom_phys_ket, + projector_left_top_phys_ket, + smallest_S_phys_ket, + ) = _split_transfer_workhorse( + bottom_tensor_phys_ket_left, + top_tensor_phys_ket_left, + peps_tensor_objs[0][0].interlayer_chi, + truncation_eps, + ) + + ( + projector_right_top_phys_bra, + projector_right_bottom_phys_bra, + _, + ) = _split_transfer_workhorse( + top_tensor_phys_bra_right, + bottom_tensor_phys_bra_right, + peps_tensor_objs[0][1].interlayer_chi, + truncation_eps, + ) + + top_tensor_phys_bra_left = apply_contraction_jitted( + "ctmrg_split_transfer_phys_top_full", + [peps_tensors[0][0], peps_tensors[0][1]], + [peps_tensor_objs[0][0], peps_tensor_objs[0][1]], + [projector_left_bottom_phys_ket, projector_right_bottom_phys_bra], + ) + bottom_tensor_phys_bra_left = apply_contraction_jitted( + "ctmrg_split_transfer_phys_bottom_full", + [peps_tensors[0][0], peps_tensors[0][1]], + [peps_tensor_objs[0][0], peps_tensor_objs[0][1]], + [projector_left_top_phys_ket, projector_right_top_phys_bra], + ) + top_tensor_phys_bra_left /= jnp.linalg.norm(top_tensor_phys_bra_left) + bottom_tensor_phys_bra_left /= jnp.linalg.norm(bottom_tensor_phys_bra_left) + + if projector_method is Projector_Method.FISHMAN: + ( + top_phys_bra_U, + top_phys_bra_S, + _, + _, + bottom_phys_bra_S, + bottom_phys_bra_Vh, + ) = _split_transfer_fishman( + top_tensor_phys_bra_left, bottom_tensor_phys_bra_left, truncation_eps + ) + + top_tensor_phys_bra_left = ( + top_phys_bra_U * top_phys_bra_S[jnp.newaxis, jnp.newaxis, jnp.newaxis, :] + ) + bottom_tensor_phys_bra_left = ( + bottom_phys_bra_S[:, jnp.newaxis, jnp.newaxis, jnp.newaxis] + * bottom_phys_bra_Vh + ) + + ( + projector_left_bottom_phys_bra, + projector_left_top_phys_bra, + smallest_S_phys_bra, + ) = _split_transfer_workhorse( + bottom_tensor_phys_bra_left, + top_tensor_phys_bra_left, + peps_tensor_objs[0][0].interlayer_chi, + truncation_eps, + fishman_input=projector_method is Projector_Method.FISHMAN, + ) + + return ( + Left_Projectors_Split_Transfer( + top_ket=projector_left_top_ket, + bottom_ket=projector_left_bottom_ket, + top_bra=projector_left_top_bra, + bottom_bra=projector_left_bottom_bra, + top_phys_ket=projector_left_top_phys_ket, + bottom_phys_ket=projector_left_bottom_phys_ket, + top_phys_bra=projector_left_top_phys_bra, + bottom_phys_bra=projector_left_bottom_phys_bra, + ), + smallest_S_ket, + smallest_S_bra, + smallest_S_phys_ket, + smallest_S_phys_bra, + ) + + +def calc_right_projectors_split_transfer( + peps_tensors: Sequence[Sequence[jnp.ndarray]], + peps_tensor_objs: Sequence[Sequence[PEPS_Tensor]], + config: VariPEPS_Config, + state: VariPEPS_Global_State, +) -> Right_Projectors_Split_Transfer: + """ + Calculate the right projectors for the CTMRG method. This functions uses the + CTMRG method with split transfer matrices for the bra and ket layer. + + Args: + peps_tensors (:term:`sequence` of :term:`sequence` of :obj:`jax.numpy.ndarray`): + Nested list of the PEPS tensor arrays. The row (first) index corresponds + to the x axis, the column (second) index to y. + peps_tensor_objs (:term:`sequence` of :term:`sequence` of :obj:`~varipeps.peps.PEPS_Tensor`): + Nested list of the PEPS tensor objects. Same format as for `peps_tensors`. + Returns: + :obj:`tuple`\ (:obj:`jax.numpy.ndarray`, :obj:`jax.numpy.ndarray`): + The left top and bottom projectors for both layer. + """ + if config.checkpointing_projectors: + raise NotImplementedError( + "Checkpointing not implemented for split transfer matrices approach." + ) + + chi = _check_chi(peps_tensor_objs) + + projector_method = ( + config.ctmrg_full_projector_method + if state.ctmrg_projector_method is None + else state.ctmrg_projector_method + ) + truncation_eps = ( + config.ctmrg_truncation_eps + if state.ctmrg_effective_truncation_eps is None + else state.ctmrg_effective_truncation_eps + ) + + if projector_method is Projector_Method.FULL: + ( + top_tensor_ketbra_left, + bottom_tensor_ketbra_left, + ) = _horizontal_cut_split_transfer(peps_tensors, peps_tensor_objs) + + ( + top_tensor_ketbra_right, + bottom_tensor_ketbra_right, + ) = _horizontal_cut_split_transfer(peps_tensors, peps_tensor_objs, offset=1) + elif projector_method is Projector_Method.HALF: + ( + top_tensor_ketbra_right, + bottom_tensor_ketbra_right, + ) = _horizontal_cut_split_transfer(peps_tensors, peps_tensor_objs, offset=1) + + ( + left_tensor_ketbra_top, + right_tensor_ketbra_top, + ) = _vertical_cut_split_transfer(peps_tensors, peps_tensor_objs) + + ( + left_tensor_ketbra_bottom, + right_tensor_ketbra_bottom, + ) = _vertical_cut_split_transfer(peps_tensors, peps_tensor_objs, offset=1) + elif projector_method is Projector_Method.FISHMAN: + ( + top_ketbra_U, + top_ketbra_S, + _, + _, + bottom_ketbra_S, + bottom_ketbra_Vh, + ) = _horizontal_cut_split_transfer( + peps_tensors, peps_tensor_objs, True, truncation_eps + ) + + top_tensor_ketbra_left = ( + top_ketbra_U * top_ketbra_S[jnp.newaxis, jnp.newaxis, :] + ) + bottom_tensor_ketbra_left = ( + bottom_ketbra_S[:, jnp.newaxis, jnp.newaxis] * bottom_ketbra_Vh + ) + + ( + _, + top_ketbra_S, + top_ketbra_Vh, + bottom_ketbra_U, + bottom_ketbra_S, + _, + ) = _horizontal_cut_split_transfer( + peps_tensors, peps_tensor_objs, True, truncation_eps, offset=1 + ) + top_tensor_ketbra_right = ( + top_ketbra_S[:, jnp.newaxis, jnp.newaxis] * top_ketbra_Vh + ) + bottom_tensor_ketbra_right = ( + bottom_ketbra_U * bottom_ketbra_S[jnp.newaxis, jnp.newaxis, :] + ) + else: + raise ValueError("Invalid projector method!") + + ( + projector_right_top_bra, + projector_right_bottom_bra, + smallest_S_bra, + ) = _split_transfer_workhorse( + top_tensor_ketbra_right, + bottom_tensor_ketbra_right, + chi, + truncation_eps, + ) + + if ( + projector_method is Projector_Method.FULL + or projector_method is Projector_Method.FISHMAN + ): + ( + projector_left_bottom_ket, + projector_left_top_ket, + _, + ) = _split_transfer_workhorse( + bottom_tensor_ketbra_left, + top_tensor_ketbra_left, + chi, + truncation_eps, + ) + + top_tensor_ket_right = apply_contraction_jitted( + "ctmrg_split_transfer_top_full", + [peps_tensors[0][0], peps_tensors[0][1]], + [peps_tensor_objs[0][0], peps_tensor_objs[0][1]], + [projector_left_bottom_ket, projector_right_bottom_bra], + ) + + bottom_tensor_ket_right = apply_contraction_jitted( + "ctmrg_split_transfer_bottom_full", + [peps_tensors[1][0], peps_tensors[1][1]], + [peps_tensor_objs[1][0], peps_tensor_objs[1][1]], + [projector_left_top_ket, projector_right_top_bra], + ) + + top_tensor_ket_right /= jnp.linalg.norm(top_tensor_ket_right) + bottom_tensor_ket_right /= jnp.linalg.norm(bottom_tensor_ket_right) + elif projector_method is Projector_Method.HALF: + ( + projector_top_left_ket, + _, + _, + ) = _split_transfer_workhorse( + left_tensor_ketbra_top, + right_tensor_ketbra_top, + chi, + truncation_eps, + ) + + ( + _, + projector_bottom_left_bra, + _, + ) = _split_transfer_workhorse( + right_tensor_ketbra_bottom, + left_tensor_ketbra_bottom, + chi, + truncation_eps, + ) + + top_tensor_ket_right = apply_contraction_jitted( + "ctmrg_split_transfer_right_top_half", + [peps_tensors[0][1]], + [peps_tensor_objs[0][1]], + [projector_top_left_ket, projector_right_bottom_bra], + ) + + bottom_tensor_ket_right = apply_contraction_jitted( + "ctmrg_split_transfer_right_bottom_half", + [peps_tensors[1][1]], + [peps_tensor_objs[1][1]], + [projector_bottom_left_bra, projector_right_top_bra], + ) + + top_tensor_ket_right /= jnp.linalg.norm(top_tensor_ket_right) + bottom_tensor_ket_right /= jnp.linalg.norm(bottom_tensor_ket_right) + + if projector_method is Projector_Method.FISHMAN: + ( + _, + top_ket_S, + top_ket_Vh, + bottom_ket_U, + bottom_ket_S, + _, + ) = _split_transfer_fishman( + top_tensor_ket_right, bottom_tensor_ket_right, truncation_eps + ) + + top_tensor_ket_right = top_ket_S[:, jnp.newaxis, jnp.newaxis] * top_ket_Vh + bottom_tensor_ket_right = ( + bottom_ket_U * bottom_ket_S[jnp.newaxis, jnp.newaxis, :] + ) + + ( + projector_right_top_ket, + projector_right_bottom_ket, + smallest_S_ket, + ) = _split_transfer_workhorse( + top_tensor_ket_right, + bottom_tensor_ket_right, + chi, + truncation_eps, + ) + + top_tensor_phys_ket_left = apply_contraction_jitted( + "ctmrg_split_transfer_phys_top", + [peps_tensors[0][0]], + [peps_tensor_objs[0][0]], + [], + ) + bottom_tensor_phys_ket_left = apply_contraction_jitted( + "ctmrg_split_transfer_phys_bottom", + [peps_tensors[0][0]], + [peps_tensor_objs[0][0]], + [], + ) + + top_tensor_phys_bra_right = apply_contraction_jitted( + "ctmrg_split_transfer_phys_top", + [peps_tensors[0][1]], + [peps_tensor_objs[0][1]], + [], + ) + bottom_tensor_phys_bra_right = apply_contraction_jitted( + "ctmrg_split_transfer_phys_bottom", + [peps_tensors[0][1]], + [peps_tensor_objs[0][1]], + [], + ) + top_tensor_phys_bra_right = top_tensor_phys_bra_right.transpose(0, 1, 4, 2, 3) + bottom_tensor_phys_bra_right = bottom_tensor_phys_bra_right.transpose(0, 1, 4, 2, 3) + + top_tensor_phys_ket_left /= jnp.linalg.norm(top_tensor_phys_ket_left) + bottom_tensor_phys_ket_left /= jnp.linalg.norm(bottom_tensor_phys_ket_left) + top_tensor_phys_bra_right /= jnp.linalg.norm(top_tensor_phys_bra_right) + bottom_tensor_phys_bra_right /= jnp.linalg.norm(bottom_tensor_phys_bra_right) + + if ( + projector_method is Projector_Method.FISHMAN + or projector_method is Projector_Method.HALF + ): + ( + top_phys_ket_U, + top_phys_ket_S, + _, + _, + bottom_phys_ket_S, + bottom_phys_ket_Vh, + ) = _split_transfer_fishman( + top_tensor_phys_ket_left, bottom_tensor_phys_ket_left, truncation_eps + ) + + top_tensor_phys_ket_left = ( + top_phys_ket_U * top_phys_ket_S[jnp.newaxis, jnp.newaxis, :] + ) + bottom_tensor_phys_ket_left = ( + bottom_phys_ket_S[:, jnp.newaxis, jnp.newaxis] * bottom_phys_ket_Vh + ) + + ( + bottom_phys_bra_U, + bottom_phys_bra_S, + _, + _, + top_phys_bra_S, + top_phys_bra_Vh, + ) = _split_transfer_fishman( + bottom_tensor_phys_bra_right, top_tensor_phys_bra_right, truncation_eps + ) + top_tensor_phys_bra_right = ( + top_phys_bra_S[:, jnp.newaxis, jnp.newaxis] * top_phys_bra_Vh + ) + bottom_tensor_phys_bra_right = ( + bottom_phys_bra_U * bottom_phys_bra_S[jnp.newaxis, jnp.newaxis, :] + ) + + ( + projector_left_bottom_phys_ket, + projector_left_top_phys_ket, + _, + ) = _split_transfer_workhorse( + bottom_tensor_phys_ket_left, + top_tensor_phys_ket_left, + peps_tensor_objs[0][0].interlayer_chi, + truncation_eps, + ) + + ( + projector_right_top_phys_bra, + projector_right_bottom_phys_bra, + smallest_S_phys_bra, + ) = _split_transfer_workhorse( + top_tensor_phys_bra_right, + bottom_tensor_phys_bra_right, + peps_tensor_objs[0][1].interlayer_chi, + truncation_eps, + ) + + top_tensor_phys_ket_right = apply_contraction_jitted( + "ctmrg_split_transfer_phys_top_full", + [peps_tensors[0][0], peps_tensors[0][1]], + [peps_tensor_objs[0][0], peps_tensor_objs[0][1]], + [projector_left_bottom_phys_ket, projector_right_bottom_phys_bra], + ) + bottom_tensor_phys_ket_right = apply_contraction_jitted( + "ctmrg_split_transfer_phys_bottom_full", + [peps_tensors[0][0], peps_tensors[0][1]], + [peps_tensor_objs[0][0], peps_tensor_objs[0][1]], + [projector_left_top_phys_ket, projector_right_top_phys_bra], + ) + top_tensor_phys_ket_right /= jnp.linalg.norm(top_tensor_phys_ket_right) + bottom_tensor_phys_ket_right /= jnp.linalg.norm(bottom_tensor_phys_ket_right) + + if projector_method is Projector_Method.FISHMAN: + ( + bottom_phys_ket_U, + bottom_phys_ket_S, + _, + _, + top_phys_ket_S, + top_phys_ket_Vh, + ) = _split_transfer_fishman( + bottom_tensor_phys_ket_right, top_tensor_phys_ket_right, truncation_eps + ) + + top_tensor_phys_ket_right = ( + top_phys_ket_S[:, jnp.newaxis, jnp.newaxis, jnp.newaxis] * top_phys_ket_Vh + ) + bottom_tensor_phys_ket_right = ( + bottom_phys_ket_U + * bottom_phys_ket_S[jnp.newaxis, jnp.newaxis, jnp.newaxis, :] + ) + + ( + projector_right_top_phys_ket, + projector_right_bottom_phys_ket, + smallest_S_phys_ket, + ) = _split_transfer_workhorse( + top_tensor_phys_ket_right, + bottom_tensor_phys_ket_right, + peps_tensor_objs[0][1].interlayer_chi, + truncation_eps, + fishman_input=projector_method is Projector_Method.FISHMAN, + ) + + return ( + Right_Projectors_Split_Transfer( + top_ket=projector_right_top_ket, + bottom_ket=projector_right_bottom_ket, + top_bra=projector_right_top_bra, + bottom_bra=projector_right_bottom_bra, + top_phys_ket=projector_right_top_phys_ket, + bottom_phys_ket=projector_right_bottom_phys_ket, + top_phys_bra=projector_right_top_phys_bra, + bottom_phys_bra=projector_right_bottom_phys_bra, + ), + smallest_S_ket, + smallest_S_bra, + smallest_S_phys_ket, + smallest_S_phys_bra, + ) + + +def calc_top_projectors_split_transfer( + peps_tensors: Sequence[Sequence[jnp.ndarray]], + peps_tensor_objs: Sequence[Sequence[PEPS_Tensor]], + config: VariPEPS_Config, + state: VariPEPS_Global_State, +) -> Top_Projectors_Split_Transfer: + """ + Calculate the top projectors for the CTMRG method. This functions uses the + CTMRG method with split transfer matrices for the bra and ket layer. + + Args: + peps_tensors (:term:`sequence` of :term:`sequence` of :obj:`jax.numpy.ndarray`): + Nested list of the PEPS tensor arrays. The row (first) index corresponds + to the x axis, the column (second) index to y. + peps_tensor_objs (:term:`sequence` of :term:`sequence` of :obj:`~varipeps.peps.PEPS_Tensor`): + Nested list of the PEPS tensor objects. Same format as for `peps_tensors`. + Returns: + :obj:`tuple`\ (:obj:`jax.numpy.ndarray`, :obj:`jax.numpy.ndarray`): + The left top and bottom projectors for both layer. + """ + if config.checkpointing_projectors: + raise NotImplementedError( + "Checkpointing not implemented for split transfer matrices approach." + ) + + chi = _check_chi(peps_tensor_objs) + + projector_method = ( + config.ctmrg_full_projector_method + if state.ctmrg_projector_method is None + else state.ctmrg_projector_method + ) + truncation_eps = ( + config.ctmrg_truncation_eps + if state.ctmrg_effective_truncation_eps is None + else state.ctmrg_effective_truncation_eps + ) + + if projector_method is Projector_Method.FULL: + ( + left_tensor_ketbra_top, + right_tensor_ketbra_top, + ) = _vertical_cut_split_transfer(peps_tensors, peps_tensor_objs) + + ( + left_tensor_ketbra_bottom, + right_tensor_ketbra_bottom, + ) = _vertical_cut_split_transfer(peps_tensors, peps_tensor_objs, offset=1) + elif projector_method is Projector_Method.HALF: + ( + left_tensor_ketbra_top, + right_tensor_ketbra_top, + ) = _vertical_cut_split_transfer(peps_tensors, peps_tensor_objs) + + ( + top_tensor_ketbra_left, + bottom_tensor_ketbra_left, + ) = _horizontal_cut_split_transfer(peps_tensors, peps_tensor_objs) + + ( + top_tensor_ketbra_right, + bottom_tensor_ketbra_right, + ) = _horizontal_cut_split_transfer(peps_tensors, peps_tensor_objs, offset=1) + elif projector_method is Projector_Method.FISHMAN: + ( + _, + left_ketbra_S, + left_ketbra_Vh, + right_ketbra_U, + right_ketbra_S, + _, + ) = _vertical_cut_split_transfer( + peps_tensors, peps_tensor_objs, True, truncation_eps + ) + + left_tensor_ketbra_top = ( + left_ketbra_S[:, jnp.newaxis, jnp.newaxis] * left_ketbra_Vh + ) + right_tensor_ketbra_top = ( + right_ketbra_U * right_ketbra_S[jnp.newaxis, jnp.newaxis, :] + ) + + ( + left_ketbra_U, + left_ketbra_S, + _, + _, + right_ketbra_S, + right_ketbra_Vh, + ) = _vertical_cut_split_transfer( + peps_tensors, peps_tensor_objs, True, truncation_eps, offset=1 + ) + left_tensor_ketbra_bottom = ( + left_ketbra_U * left_ketbra_S[jnp.newaxis, jnp.newaxis, :] + ) + right_tensor_ketbra_bottom = ( + right_ketbra_S[:, jnp.newaxis, jnp.newaxis] * right_ketbra_Vh + ) + else: + raise ValueError("Invalid projector method!") + + ( + projector_top_left_ket, + projector_top_right_ket, + smallest_S_ket, + ) = _split_transfer_workhorse( + left_tensor_ketbra_top, + right_tensor_ketbra_top, + chi, + truncation_eps, + ) + + if ( + projector_method is Projector_Method.FULL + or projector_method is Projector_Method.FISHMAN + ): + ( + projector_bottom_right_bra, + projector_bottom_left_bra, + _, + ) = _split_transfer_workhorse( + right_tensor_ketbra_bottom, + left_tensor_ketbra_bottom, + chi, + truncation_eps, + ) + + left_tensor_bra_top = apply_contraction_jitted( + "ctmrg_split_transfer_left_full", + [peps_tensors[0][0], peps_tensors[1][0]], + [peps_tensor_objs[0][0], peps_tensor_objs[1][0]], + [projector_top_right_ket, projector_bottom_right_bra], + ) + + right_tensor_bra_top = apply_contraction_jitted( + "ctmrg_split_transfer_right_full", + [peps_tensors[0][1], peps_tensors[1][1]], + [peps_tensor_objs[0][1], peps_tensor_objs[1][1]], + [projector_top_left_ket, projector_bottom_left_bra], + ) + + left_tensor_bra_top /= jnp.linalg.norm(left_tensor_bra_top) + right_tensor_bra_top /= jnp.linalg.norm(right_tensor_bra_top) + elif projector_method is Projector_Method.HALF: + ( + projector_left_bottom_ket, + _, + _, + ) = _split_transfer_workhorse( + bottom_tensor_ketbra_left, + top_tensor_ketbra_left, + chi, + truncation_eps, + ) + + ( + _, + projector_right_bottom_bra, + _, + ) = _split_transfer_workhorse( + top_tensor_ketbra_right, + bottom_tensor_ketbra_right, + chi, + truncation_eps, + ) + + left_tensor_bra_top = apply_contraction_jitted( + "ctmrg_split_transfer_left_top_half", + [peps_tensors[0][0]], + [peps_tensor_objs[0][0]], + [projector_left_bottom_ket, projector_top_right_ket], + ) + + right_tensor_bra_top = apply_contraction_jitted( + "ctmrg_split_transfer_right_top_half", + [peps_tensors[0][1]], + [peps_tensor_objs[0][1]], + [projector_top_left_ket, projector_right_bottom_bra], + ) + + left_tensor_bra_top /= jnp.linalg.norm(left_tensor_bra_top) + right_tensor_bra_top /= jnp.linalg.norm(right_tensor_bra_top) + + if projector_method is Projector_Method.FISHMAN: + ( + _, + left_bra_S, + left_bra_Vh, + right_bra_U, + right_bra_S, + _, + ) = _split_transfer_fishman( + left_tensor_bra_top, right_tensor_bra_top, truncation_eps + ) + + left_tensor_bra_top = left_bra_S[:, jnp.newaxis, jnp.newaxis] * left_bra_Vh + right_tensor_bra_top = right_bra_U * right_bra_S[jnp.newaxis, jnp.newaxis, :] + + ( + projector_top_left_bra, + projector_top_right_bra, + smallest_S_bra, + ) = _split_transfer_workhorse( + left_tensor_bra_top, + right_tensor_bra_top, + chi, + truncation_eps, + ) + + left_tensor_phys_ket_top = apply_contraction_jitted( + "ctmrg_split_transfer_phys_left", + [peps_tensors[0][0]], + [peps_tensor_objs[0][0]], + [], + ) + right_tensor_phys_ket_top = apply_contraction_jitted( + "ctmrg_split_transfer_phys_right", + [peps_tensors[0][0]], + [peps_tensor_objs[0][0]], + [], + ) + + left_tensor_phys_bra_bottom = apply_contraction_jitted( + "ctmrg_split_transfer_phys_left", + [peps_tensors[1][0]], + [peps_tensor_objs[1][0]], + [], + ) + right_tensor_phys_bra_bottom = apply_contraction_jitted( + "ctmrg_split_transfer_phys_right", + [peps_tensors[1][0]], + [peps_tensor_objs[1][0]], + [], + ) + left_tensor_phys_bra_bottom = left_tensor_phys_bra_bottom.transpose(0, 1, 4, 2, 3) + right_tensor_phys_bra_bottom = right_tensor_phys_bra_bottom.transpose(0, 1, 4, 2, 3) + + left_tensor_phys_ket_top /= jnp.linalg.norm(left_tensor_phys_ket_top) + right_tensor_phys_ket_top /= jnp.linalg.norm(right_tensor_phys_ket_top) + left_tensor_phys_bra_bottom /= jnp.linalg.norm(left_tensor_phys_bra_bottom) + right_tensor_phys_bra_bottom /= jnp.linalg.norm(right_tensor_phys_bra_bottom) + + if ( + projector_method is Projector_Method.FISHMAN + or projector_method is Projector_Method.HALF + ): + ( + right_phys_ket_U, + right_phys_ket_S, + _, + _, + left_phys_ket_S, + left_phys_ket_Vh, + ) = _split_transfer_fishman( + right_tensor_phys_ket_top, left_tensor_phys_ket_top, truncation_eps + ) + + right_tensor_phys_ket_top = ( + right_phys_ket_U * right_phys_ket_S[jnp.newaxis, jnp.newaxis, :] + ) + left_tensor_phys_ket_top = ( + left_phys_ket_S[:, jnp.newaxis, jnp.newaxis] * left_phys_ket_Vh + ) + + ( + left_phys_bra_U, + left_phys_bra_S, + _, + _, + right_phys_bra_S, + right_phys_bra_Vh, + ) = _split_transfer_fishman( + left_tensor_phys_bra_bottom, right_tensor_phys_bra_bottom, truncation_eps + ) + left_tensor_phys_bra_bottom = ( + left_phys_bra_U * left_phys_bra_S[jnp.newaxis, jnp.newaxis, :] + ) + right_tensor_phys_bra_bottom = ( + right_phys_bra_S[:, jnp.newaxis, jnp.newaxis] * right_phys_bra_Vh + ) + + ( + projector_top_left_phys_ket, + projector_top_right_phys_ket, + smallest_S_phys_ket, + ) = _split_transfer_workhorse( + left_tensor_phys_ket_top, + right_tensor_phys_ket_top, + peps_tensor_objs[0][0].interlayer_chi, + truncation_eps, + ) + + ( + projector_bottom_right_phys_bra, + projector_bottom_left_phys_bra, + _, + ) = _split_transfer_workhorse( + right_tensor_phys_bra_bottom, + left_tensor_phys_bra_bottom, + peps_tensor_objs[1][0].interlayer_chi, + truncation_eps, + ) + + left_tensor_phys_bra_top = apply_contraction_jitted( + "ctmrg_split_transfer_phys_left_full", + [peps_tensors[0][0], peps_tensors[1][0]], + [peps_tensor_objs[0][0], peps_tensor_objs[1][0]], + [projector_top_right_phys_ket, projector_bottom_right_phys_bra], + ) + right_tensor_phys_bra_top = apply_contraction_jitted( + "ctmrg_split_transfer_phys_right_full", + [peps_tensors[0][0], peps_tensors[1][0]], + [peps_tensor_objs[0][0], peps_tensor_objs[1][0]], + [projector_top_left_phys_ket, projector_bottom_left_phys_bra], + ) + left_tensor_phys_bra_top /= jnp.linalg.norm(left_tensor_phys_bra_top) + right_tensor_phys_bra_top /= jnp.linalg.norm(right_tensor_phys_bra_top) + + if projector_method is Projector_Method.FISHMAN: + ( + right_phys_bra_U, + right_phys_bra_S, + _, + _, + left_phys_bra_S, + left_phys_bra_Vh, + ) = _split_transfer_fishman( + right_tensor_phys_bra_top, left_tensor_phys_bra_top, truncation_eps + ) + + right_tensor_phys_bra_top = ( + right_phys_bra_U + * right_phys_bra_S[jnp.newaxis, jnp.newaxis, jnp.newaxis, :] + ) + left_tensor_phys_bra_top = ( + left_phys_bra_S[:, jnp.newaxis, jnp.newaxis, jnp.newaxis] * left_phys_bra_Vh + ) + + ( + projector_top_left_phys_bra, + projector_top_right_phys_bra, + smallest_S_phys_bra, + ) = _split_transfer_workhorse( + left_tensor_phys_bra_top, + right_tensor_phys_bra_top, + peps_tensor_objs[0][0].interlayer_chi, + truncation_eps, + fishman_input=projector_method is Projector_Method.FISHMAN, + ) + + return ( + Top_Projectors_Split_Transfer( + left_ket=projector_top_left_ket, + right_ket=projector_top_right_ket, + left_bra=projector_top_left_bra, + right_bra=projector_top_right_bra, + left_phys_ket=projector_top_left_phys_ket, + right_phys_ket=projector_top_right_phys_ket, + left_phys_bra=projector_top_left_phys_bra, + right_phys_bra=projector_top_right_phys_bra, + ), + smallest_S_ket, + smallest_S_bra, + smallest_S_phys_ket, + smallest_S_phys_bra, + ) + + +def calc_bottom_projectors_split_transfer( + peps_tensors: Sequence[Sequence[jnp.ndarray]], + peps_tensor_objs: Sequence[Sequence[PEPS_Tensor]], + config: VariPEPS_Config, + state: VariPEPS_Global_State, +) -> Bottom_Projectors_Split_Transfer: + """ + Calculate the bottom projectors for the CTMRG method. This functions uses the + CTMRG method with split transfer matrices for the bra and ket layer. + + Args: + peps_tensors (:term:`sequence` of :term:`sequence` of :obj:`jax.numpy.ndarray`): + Nested list of the PEPS tensor arrays. The row (first) index corresponds + to the x axis, the column (second) index to y. + peps_tensor_objs (:term:`sequence` of :term:`sequence` of :obj:`~varipeps.peps.PEPS_Tensor`): + Nested list of the PEPS tensor objects. Same format as for `peps_tensors`. + Returns: + :obj:`tuple`\ (:obj:`jax.numpy.ndarray`, :obj:`jax.numpy.ndarray`): + The left top and bottom projectors for both layer. + """ + chi = _check_chi(peps_tensor_objs) + + projector_method = ( + config.ctmrg_full_projector_method + if state.ctmrg_projector_method is None + else state.ctmrg_projector_method + ) + truncation_eps = ( + config.ctmrg_truncation_eps + if state.ctmrg_effective_truncation_eps is None + else state.ctmrg_effective_truncation_eps + ) + + if projector_method is Projector_Method.FULL: + ( + left_tensor_ketbra_top, + right_tensor_ketbra_top, + ) = _vertical_cut_split_transfer(peps_tensors, peps_tensor_objs) + + ( + left_tensor_ketbra_bottom, + right_tensor_ketbra_bottom, + ) = _vertical_cut_split_transfer(peps_tensors, peps_tensor_objs, offset=1) + elif projector_method is Projector_Method.HALF: + ( + left_tensor_ketbra_bottom, + right_tensor_ketbra_bottom, + ) = _vertical_cut_split_transfer(peps_tensors, peps_tensor_objs, offset=1) + + ( + top_tensor_ketbra_left, + bottom_tensor_ketbra_left, + ) = _horizontal_cut_split_transfer(peps_tensors, peps_tensor_objs) + + ( + top_tensor_ketbra_right, + bottom_tensor_ketbra_right, + ) = _horizontal_cut_split_transfer(peps_tensors, peps_tensor_objs, offset=1) + elif projector_method is Projector_Method.FISHMAN: + ( + _, + left_ketbra_S, + left_ketbra_Vh, + right_ketbra_U, + right_ketbra_S, + _, + ) = _vertical_cut_split_transfer( + peps_tensors, peps_tensor_objs, True, truncation_eps + ) + + left_tensor_ketbra_top = ( + left_ketbra_S[:, jnp.newaxis, jnp.newaxis] * left_ketbra_Vh + ) + right_tensor_ketbra_top = ( + right_ketbra_U * right_ketbra_S[jnp.newaxis, jnp.newaxis, :] + ) + + ( + left_ketbra_U, + left_ketbra_S, + _, + _, + right_ketbra_S, + right_ketbra_Vh, + ) = _vertical_cut_split_transfer( + peps_tensors, peps_tensor_objs, True, truncation_eps, offset=1 + ) + left_tensor_ketbra_bottom = ( + left_ketbra_U * left_ketbra_S[jnp.newaxis, jnp.newaxis, :] + ) + right_tensor_ketbra_bottom = ( + right_ketbra_S[:, jnp.newaxis, jnp.newaxis] * right_ketbra_Vh + ) + else: + raise ValueError("Invalid projector method!") + + ( + projector_bottom_right_bra, + projector_bottom_left_bra, + smallest_S_bra, + ) = _split_transfer_workhorse( + right_tensor_ketbra_bottom, + left_tensor_ketbra_bottom, + chi, + truncation_eps, + ) + + if ( + projector_method is Projector_Method.FULL + or projector_method is Projector_Method.FISHMAN + ): + ( + projector_top_left_ket, + projector_top_right_ket, + _, + ) = _split_transfer_workhorse( + left_tensor_ketbra_top, + right_tensor_ketbra_top, + chi, + truncation_eps, + ) + + left_tensor_ket_bottom = apply_contraction_jitted( + "ctmrg_split_transfer_left_full", + [peps_tensors[0][0], peps_tensors[1][0]], + [peps_tensor_objs[0][0], peps_tensor_objs[1][0]], + [projector_top_right_ket, projector_bottom_right_bra], + ) + + right_tensor_ket_bottom = apply_contraction_jitted( + "ctmrg_split_transfer_right_full", + [peps_tensors[0][1], peps_tensors[1][1]], + [peps_tensor_objs[0][1], peps_tensor_objs[1][1]], + [projector_top_left_ket, projector_bottom_left_bra], + ) + + left_tensor_ket_bottom /= jnp.linalg.norm(left_tensor_ket_bottom) + right_tensor_ket_bottom /= jnp.linalg.norm(right_tensor_ket_bottom) + elif projector_method is Projector_Method.HALF: + ( + _, + projector_left_top_ket, + _, + ) = _split_transfer_workhorse( + bottom_tensor_ketbra_left, + top_tensor_ketbra_left, + chi, + truncation_eps, + ) + + ( + projector_right_top_bra, + _, + _, + ) = _split_transfer_workhorse( + top_tensor_ketbra_right, + bottom_tensor_ketbra_right, + chi, + truncation_eps, + ) + + left_tensor_ket_bottom = apply_contraction_jitted( + "ctmrg_split_transfer_bottom_full", + [peps_tensors[1][0], peps_tensors[1][1]], + [peps_tensor_objs[1][0], peps_tensor_objs[1][1]], + [projector_left_top_ket, projector_right_top_bra], + ) + + right_tensor_ket_bottom = apply_contraction_jitted( + "ctmrg_split_transfer_right_bottom_half", + [peps_tensors[1][1]], + [peps_tensor_objs[1][1]], + [projector_bottom_left_bra, projector_right_top_bra], + ) + + left_tensor_ket_bottom /= jnp.linalg.norm(left_tensor_ket_bottom) + right_tensor_ket_bottom /= jnp.linalg.norm(right_tensor_ket_bottom) + + if projector_method is Projector_Method.FISHMAN: + ( + left_ket_U, + left_ket_S, + _, + _, + right_ket_S, + right_ket_Vh, + ) = _split_transfer_fishman( + left_tensor_ket_bottom, right_tensor_ket_bottom, truncation_eps + ) + + left_tensor_ket_bottom = left_ket_U * left_ket_S[jnp.newaxis, jnp.newaxis, :] + right_tensor_ket_bottom = ( + right_ket_S[:, jnp.newaxis, jnp.newaxis] * right_ket_Vh + ) + + ( + projector_bottom_right_ket, + projector_bottom_left_ket, + smallest_S_ket, + ) = _split_transfer_workhorse( + right_tensor_ket_bottom, + left_tensor_ket_bottom, + chi, + truncation_eps, + ) + + left_tensor_phys_ket_top = apply_contraction_jitted( + "ctmrg_split_transfer_phys_left", + [peps_tensors[0][0]], + [peps_tensor_objs[0][0]], + [], + ) + right_tensor_phys_ket_top = apply_contraction_jitted( + "ctmrg_split_transfer_phys_right", + [peps_tensors[0][0]], + [peps_tensor_objs[0][0]], + [], + ) + + left_tensor_phys_bra_bottom = apply_contraction_jitted( + "ctmrg_split_transfer_phys_left", + [peps_tensors[1][0]], + [peps_tensor_objs[1][0]], + [], + ) + right_tensor_phys_bra_bottom = apply_contraction_jitted( + "ctmrg_split_transfer_phys_right", + [peps_tensors[1][0]], + [peps_tensor_objs[1][0]], + [], + ) + left_tensor_phys_bra_bottom = left_tensor_phys_bra_bottom.transpose(0, 1, 4, 2, 3) + right_tensor_phys_bra_bottom = right_tensor_phys_bra_bottom.transpose(0, 1, 4, 2, 3) + + left_tensor_phys_ket_top /= jnp.linalg.norm(left_tensor_phys_ket_top) + right_tensor_phys_ket_top /= jnp.linalg.norm(right_tensor_phys_ket_top) + left_tensor_phys_bra_bottom /= jnp.linalg.norm(left_tensor_phys_bra_bottom) + right_tensor_phys_bra_bottom /= jnp.linalg.norm(right_tensor_phys_bra_bottom) + + if ( + projector_method is Projector_Method.FISHMAN + or projector_method is Projector_Method.HALF + ): + ( + right_phys_ket_U, + right_phys_ket_S, + _, + _, + left_phys_ket_S, + left_phys_ket_Vh, + ) = _split_transfer_fishman( + right_tensor_phys_ket_top, left_tensor_phys_ket_top, truncation_eps + ) + + right_tensor_phys_ket_top = ( + right_phys_ket_U * right_phys_ket_S[jnp.newaxis, jnp.newaxis, :] + ) + left_tensor_phys_ket_top = ( + left_phys_ket_S[:, jnp.newaxis, jnp.newaxis] * left_phys_ket_Vh + ) + + ( + left_phys_bra_U, + left_phys_bra_S, + _, + _, + right_phys_bra_S, + right_phys_bra_Vh, + ) = _split_transfer_fishman( + left_tensor_phys_bra_bottom, right_tensor_phys_bra_bottom, truncation_eps + ) + left_tensor_phys_bra_bottom = ( + left_phys_bra_U * left_phys_bra_S[jnp.newaxis, jnp.newaxis, :] + ) + right_tensor_phys_bra_bottom = ( + right_phys_bra_S[:, jnp.newaxis, jnp.newaxis] * right_phys_bra_Vh + ) + + ( + projector_top_left_phys_ket, + projector_top_right_phys_ket, + _, + ) = _split_transfer_workhorse( + left_tensor_phys_ket_top, + right_tensor_phys_ket_top, + peps_tensor_objs[0][0].interlayer_chi, + truncation_eps, + ) + + ( + projector_bottom_right_phys_bra, + projector_bottom_left_phys_bra, + smallest_S_phys_bra, + ) = _split_transfer_workhorse( + right_tensor_phys_bra_bottom, + left_tensor_phys_bra_bottom, + peps_tensor_objs[1][0].interlayer_chi, + truncation_eps, + ) + + left_tensor_phys_ket_bottom = apply_contraction_jitted( + "ctmrg_split_transfer_phys_left_full", + [peps_tensors[0][0], peps_tensors[1][0]], + [peps_tensor_objs[0][0], peps_tensor_objs[1][0]], + [projector_top_right_phys_ket, projector_bottom_right_phys_bra], + ) + right_tensor_phys_ket_bottom = apply_contraction_jitted( + "ctmrg_split_transfer_phys_right_full", + [peps_tensors[0][0], peps_tensors[1][0]], + [peps_tensor_objs[0][0], peps_tensor_objs[1][0]], + [projector_top_left_phys_ket, projector_bottom_left_phys_bra], + ) + left_tensor_phys_ket_bottom /= jnp.linalg.norm(left_tensor_phys_ket_bottom) + right_tensor_phys_ket_bottom /= jnp.linalg.norm(right_tensor_phys_ket_bottom) + + if projector_method is Projector_Method.FISHMAN: + ( + left_phys_bra_U, + left_phys_bra_S, + _, + _, + right_phys_bra_S, + right_phys_bra_Vh, + ) = _split_transfer_fishman( + left_tensor_phys_ket_bottom, right_tensor_phys_ket_bottom, truncation_eps + ) + + left_tensor_phys_ket_bottom = ( + left_phys_bra_U * left_phys_bra_S[jnp.newaxis, jnp.newaxis, jnp.newaxis, :] + ) + right_tensor_phys_ket_bottom = ( + right_phys_bra_S[:, jnp.newaxis, jnp.newaxis, jnp.newaxis] + * right_phys_bra_Vh + ) + + ( + projector_bottom_right_phys_ket, + projector_bottom_left_phys_ket, + smallest_S_phys_ket, + ) = _split_transfer_workhorse( + right_tensor_phys_ket_bottom, + left_tensor_phys_ket_bottom, + peps_tensor_objs[1][0].interlayer_chi, + truncation_eps, + fishman_input=projector_method is Projector_Method.FISHMAN, + ) + + return ( + Bottom_Projectors_Split_Transfer( + left_ket=projector_bottom_left_ket, + right_ket=projector_bottom_right_ket, + left_bra=projector_bottom_left_bra, + right_bra=projector_bottom_right_bra, + left_phys_ket=projector_bottom_left_phys_ket, + right_phys_ket=projector_bottom_right_phys_ket, + left_phys_bra=projector_bottom_left_phys_bra, + right_phys_bra=projector_bottom_right_phys_bra, + ), + smallest_S_ket, + smallest_S_bra, + smallest_S_phys_ket, + smallest_S_phys_bra, + ) diff --git a/varipeps/ctmrg/routine.py b/varipeps/ctmrg/routine.py index 78da6b8..f2e8758 100644 --- a/varipeps/ctmrg/routine.py +++ b/varipeps/ctmrg/routine.py @@ -8,9 +8,9 @@ import jax.debug as jdebug from varipeps import varipeps_config, varipeps_global_state -from varipeps.peps import PEPS_Tensor, PEPS_Unit_Cell +from varipeps.peps import PEPS_Tensor, PEPS_Tensor_Split_Transfer, PEPS_Unit_Cell from varipeps.utils.debug_print import debug_print -from .absorption import do_absorption_step +from .absorption import do_absorption_step, do_absorption_step_split_transfer from typing import Sequence, Tuple, List, Optional @@ -25,6 +25,14 @@ class CTM_Enum(enum.IntEnum): T2 = enum.auto() T3 = enum.auto() T4 = enum.auto() + T1_ket = enum.auto() + T1_bra = enum.auto() + T2_ket = enum.auto() + T2_bra = enum.auto() + T3_ket = enum.auto() + T3_bra = enum.auto() + T4_ket = enum.auto() + T4_bra = enum.auto() class CTMRGNotConvergedError(Exception): @@ -79,15 +87,20 @@ def _calc_corner_svds( return step_corner_svd -@partial(jit, static_argnums=(3,), inline=True) +@partial(jit, static_argnums=(3, 4), inline=True) def _is_element_wise_converged( old_peps_tensors: List[PEPS_Tensor], new_peps_tensors: List[PEPS_Tensor], eps: float, verbose: bool = False, + split_transfer: bool = False, ) -> Tuple[bool, float, Optional[List[Tuple[int, CTM_Enum, float]]]]: result = 0 - measure = jnp.zeros((len(old_peps_tensors), 8), dtype=jnp.float64) + + if split_transfer: + measure = jnp.zeros((len(old_peps_tensors), 12), dtype=jnp.float64) + else: + measure = jnp.zeros((len(old_peps_tensors), 8), dtype=jnp.float64) verbose_data = [] if verbose else None @@ -144,73 +157,210 @@ def _is_element_wise_converged( if verbose: verbose_data.append((ti, CTM_Enum.C4, jnp.amax(diff))) - old_shape = old_peps_tensors[ti].T1.shape - new_shape = new_peps_tensors[ti].T1.shape - diff = jnp.abs( - new_peps_tensors[ti].T1[ - : old_shape[0], : old_shape[1], : old_shape[2], : old_shape[3] - ] - - old_peps_tensors[ti].T1[ - : new_shape[0], : new_shape[1], : new_shape[2], : new_shape[3] - ] - ) - result += jnp.sum(diff > eps) - measure = measure.at[ti, 4].set( - jnp.linalg.norm(diff), indices_are_sorted=True, unique_indices=True - ) - if verbose: - verbose_data.append((ti, CTM_Enum.T1, jnp.amax(diff))) - - old_shape = old_peps_tensors[ti].T2.shape - new_shape = new_peps_tensors[ti].T2.shape - diff = jnp.abs( - new_peps_tensors[ti].T2[ - : old_shape[0], : old_shape[1], : old_shape[2], : old_shape[3] - ] - - old_peps_tensors[ti].T2[ - : new_shape[0], : new_shape[1], : new_shape[2], : new_shape[3] - ] - ) - result += jnp.sum(diff > eps) - measure = measure.at[ti, 5].set( - jnp.linalg.norm(diff), indices_are_sorted=True, unique_indices=True - ) - if verbose: - verbose_data.append((ti, CTM_Enum.T2, jnp.amax(diff))) - - old_shape = old_peps_tensors[ti].T3.shape - new_shape = new_peps_tensors[ti].T3.shape - diff = jnp.abs( - new_peps_tensors[ti].T3[ - : old_shape[0], : old_shape[1], : old_shape[2], : old_shape[3] - ] - - old_peps_tensors[ti].T3[ - : new_shape[0], : new_shape[1], : new_shape[2], : new_shape[3] - ] - ) - result += jnp.sum(diff > eps) - measure = measure.at[ti, 6].set( - jnp.linalg.norm(diff), indices_are_sorted=True, unique_indices=True - ) - if verbose: - verbose_data.append((ti, CTM_Enum.T3, jnp.amax(diff))) - - old_shape = old_peps_tensors[ti].T4.shape - new_shape = new_peps_tensors[ti].T4.shape - diff = jnp.abs( - new_peps_tensors[ti].T4[ - : old_shape[0], : old_shape[1], : old_shape[2], : old_shape[3] - ] - - old_peps_tensors[ti].T4[ - : new_shape[0], : new_shape[1], : new_shape[2], : new_shape[3] - ] - ) - result += jnp.sum(diff > eps) - measure = measure.at[ti, 7].set( - jnp.linalg.norm(diff), indices_are_sorted=True, unique_indices=True - ) - if verbose: - verbose_data.append((ti, CTM_Enum.T4, jnp.amax(diff))) + if split_transfer: + old_shape = old_peps_tensors[ti].T1_ket.shape + new_shape = new_peps_tensors[ti].T1_ket.shape + diff = jnp.abs( + new_peps_tensors[ti].T1_ket[ + : old_shape[0], : old_shape[1], : old_shape[2] + ] + - old_peps_tensors[ti].T1_ket[ + : new_shape[0], : new_shape[1], : new_shape[2] + ] + ) + result += jnp.sum(diff > eps) + measure = measure.at[ti, 4].set( + jnp.linalg.norm(diff), indices_are_sorted=True, unique_indices=True + ) + if verbose: + verbose_data.append((ti, CTM_Enum.T1_ket, jnp.amax(diff))) + + old_shape = old_peps_tensors[ti].T1_bra.shape + new_shape = new_peps_tensors[ti].T1_bra.shape + diff = jnp.abs( + new_peps_tensors[ti].T1_bra[ + : old_shape[0], : old_shape[1], : old_shape[2] + ] + - old_peps_tensors[ti].T1_bra[ + : new_shape[0], : new_shape[1], : new_shape[2] + ] + ) + result += jnp.sum(diff > eps) + measure = measure.at[ti, 5].set( + jnp.linalg.norm(diff), indices_are_sorted=True, unique_indices=True + ) + if verbose: + verbose_data.append((ti, CTM_Enum.T1_bra, jnp.amax(diff))) + + old_shape = old_peps_tensors[ti].T2_ket.shape + new_shape = new_peps_tensors[ti].T2_ket.shape + diff = jnp.abs( + new_peps_tensors[ti].T2_ket[ + : old_shape[0], : old_shape[1], : old_shape[2] + ] + - old_peps_tensors[ti].T2_ket[ + : new_shape[0], : new_shape[1], : new_shape[2] + ] + ) + result += jnp.sum(diff > eps) + measure = measure.at[ti, 6].set( + jnp.linalg.norm(diff), indices_are_sorted=True, unique_indices=True + ) + if verbose: + verbose_data.append((ti, CTM_Enum.T2_ket, jnp.amax(diff))) + + old_shape = old_peps_tensors[ti].T2_bra.shape + new_shape = new_peps_tensors[ti].T2_bra.shape + diff = jnp.abs( + new_peps_tensors[ti].T2_bra[ + : old_shape[0], : old_shape[1], : old_shape[2] + ] + - old_peps_tensors[ti].T2_bra[ + : new_shape[0], : new_shape[1], : new_shape[2] + ] + ) + result += jnp.sum(diff > eps) + measure = measure.at[ti, 7].set( + jnp.linalg.norm(diff), indices_are_sorted=True, unique_indices=True + ) + if verbose: + verbose_data.append((ti, CTM_Enum.T2_bra, jnp.amax(diff))) + + old_shape = old_peps_tensors[ti].T3_ket.shape + new_shape = new_peps_tensors[ti].T3_ket.shape + diff = jnp.abs( + new_peps_tensors[ti].T3_ket[ + : old_shape[0], : old_shape[1], : old_shape[2] + ] + - old_peps_tensors[ti].T3_ket[ + : new_shape[0], : new_shape[1], : new_shape[2] + ] + ) + result += jnp.sum(diff > eps) + measure = measure.at[ti, 8].set( + jnp.linalg.norm(diff), indices_are_sorted=True, unique_indices=True + ) + if verbose: + verbose_data.append((ti, CTM_Enum.T3_ket, jnp.amax(diff))) + + old_shape = old_peps_tensors[ti].T3_bra.shape + new_shape = new_peps_tensors[ti].T3_bra.shape + diff = jnp.abs( + new_peps_tensors[ti].T3_bra[ + : old_shape[0], : old_shape[1], : old_shape[2] + ] + - old_peps_tensors[ti].T3_bra[ + : new_shape[0], : new_shape[1], : new_shape[2] + ] + ) + result += jnp.sum(diff > eps) + measure = measure.at[ti, 9].set( + jnp.linalg.norm(diff), indices_are_sorted=True, unique_indices=True + ) + if verbose: + verbose_data.append((ti, CTM_Enum.T3_bra, jnp.amax(diff))) + + old_shape = old_peps_tensors[ti].T4_ket.shape + new_shape = new_peps_tensors[ti].T4_ket.shape + diff = jnp.abs( + new_peps_tensors[ti].T4_ket[ + : old_shape[0], : old_shape[1], : old_shape[2] + ] + - old_peps_tensors[ti].T4_ket[ + : new_shape[0], : new_shape[1], : new_shape[2] + ] + ) + result += jnp.sum(diff > eps) + measure = measure.at[ti, 10].set( + jnp.linalg.norm(diff), indices_are_sorted=True, unique_indices=True + ) + if verbose: + verbose_data.append((ti, CTM_Enum.T4_ket, jnp.amax(diff))) + + old_shape = old_peps_tensors[ti].T4_bra.shape + new_shape = new_peps_tensors[ti].T4_bra.shape + diff = jnp.abs( + new_peps_tensors[ti].T4_bra[ + : old_shape[0], : old_shape[1], : old_shape[2] + ] + - old_peps_tensors[ti].T4_bra[ + : new_shape[0], : new_shape[1], : new_shape[2] + ] + ) + result += jnp.sum(diff > eps) + measure = measure.at[ti, 11].set( + jnp.linalg.norm(diff), indices_are_sorted=True, unique_indices=True + ) + if verbose: + verbose_data.append((ti, CTM_Enum.T4_bra, jnp.amax(diff))) + else: + old_shape = old_peps_tensors[ti].T1.shape + new_shape = new_peps_tensors[ti].T1.shape + diff = jnp.abs( + new_peps_tensors[ti].T1[ + : old_shape[0], : old_shape[1], : old_shape[2], : old_shape[3] + ] + - old_peps_tensors[ti].T1[ + : new_shape[0], : new_shape[1], : new_shape[2], : new_shape[3] + ] + ) + result += jnp.sum(diff > eps) + measure = measure.at[ti, 4].set( + jnp.linalg.norm(diff), indices_are_sorted=True, unique_indices=True + ) + if verbose: + verbose_data.append((ti, CTM_Enum.T1, jnp.amax(diff))) + + old_shape = old_peps_tensors[ti].T2.shape + new_shape = new_peps_tensors[ti].T2.shape + diff = jnp.abs( + new_peps_tensors[ti].T2[ + : old_shape[0], : old_shape[1], : old_shape[2], : old_shape[3] + ] + - old_peps_tensors[ti].T2[ + : new_shape[0], : new_shape[1], : new_shape[2], : new_shape[3] + ] + ) + result += jnp.sum(diff > eps) + measure = measure.at[ti, 5].set( + jnp.linalg.norm(diff), indices_are_sorted=True, unique_indices=True + ) + if verbose: + verbose_data.append((ti, CTM_Enum.T2, jnp.amax(diff))) + + old_shape = old_peps_tensors[ti].T3.shape + new_shape = new_peps_tensors[ti].T3.shape + diff = jnp.abs( + new_peps_tensors[ti].T3[ + : old_shape[0], : old_shape[1], : old_shape[2], : old_shape[3] + ] + - old_peps_tensors[ti].T3[ + : new_shape[0], : new_shape[1], : new_shape[2], : new_shape[3] + ] + ) + result += jnp.sum(diff > eps) + measure = measure.at[ti, 6].set( + jnp.linalg.norm(diff), indices_are_sorted=True, unique_indices=True + ) + if verbose: + verbose_data.append((ti, CTM_Enum.T3, jnp.amax(diff))) + + old_shape = old_peps_tensors[ti].T4.shape + new_shape = new_peps_tensors[ti].T4.shape + diff = jnp.abs( + new_peps_tensors[ti].T4[ + : old_shape[0], : old_shape[1], : old_shape[2], : old_shape[3] + ] + - old_peps_tensors[ti].T4[ + : new_shape[0], : new_shape[1], : new_shape[2], : new_shape[3] + ] + ) + result += jnp.sum(diff > eps) + measure = measure.at[ti, 7].set( + jnp.linalg.norm(diff), indices_are_sorted=True, unique_indices=True + ) + if verbose: + verbose_data.append((ti, CTM_Enum.T4, jnp.amax(diff))) return result == 0, jnp.linalg.norm(measure), verbose_data @@ -230,9 +380,14 @@ def _ctmrg_body_func(carry): config, ) = carry - w_unitcell, norm_smallest_S = do_absorption_step( - w_tensors, w_unitcell_last_step, config, state - ) + if w_unitcell_last_step.is_split_transfer(): + w_unitcell, norm_smallest_S = do_absorption_step_split_transfer( + w_tensors, w_unitcell_last_step, config, state + ) + else: + w_unitcell, norm_smallest_S = do_absorption_step( + w_tensors, w_unitcell_last_step, config, state + ) def elementwise_func(old, new, old_corner, conv_eps, config): converged, measure, verbose_data = _is_element_wise_converged( @@ -240,6 +395,7 @@ def elementwise_func(old, new, old_corner, conv_eps, config): new, conv_eps, verbose=config.ctmrg_verbose_output, + split_transfer=w_unitcell.is_split_transfer(), ) return converged, measure, verbose_data, old_corner @@ -381,8 +537,20 @@ def calc_ctmrg_env( tmp_count = 0 corner_singular_vals = None - while any( - i.C1.shape[0] != i.chi for i in working_unitcell.get_unique_tensors() + while tmp_count < varipeps_config.ctmrg_max_steps and ( + any( + getattr(i, j).shape[0] != i.chi or getattr(i, j).shape[1] != i.chi + for i in working_unitcell.get_unique_tensors() + for j in ("C1", "C2", "C3", "C4") + ) + or ( + hasattr(working_unitcell.get_unique_tensors()[0], "T4_ket") + and any( + getattr(i, j).shape[0] != i.interlayer_chi + for i in working_unitcell.get_unique_tensors() + for j in ("T1_bra", "T2_ket", "T3_bra", "T4_ket") + ) + ) ): ( _, @@ -392,7 +560,7 @@ def calc_ctmrg_env( _, tmp_count, _, - _, + norm_smallest_S, _, _, ) = _ctmrg_body_func( @@ -410,24 +578,30 @@ def calc_ctmrg_env( ) ) - working_unitcell, converged, end_count, norm_smallest_S = _ctmrg_while_wrapper( - ( - peps_tensors, - working_unitcell, - False, - ( - corner_singular_vals - if corner_singular_vals is not None - else init_corner_singular_vals - ), - eps, - tmp_count, - enforce_elementwise_convergence, - jnp.inf, - varipeps_global_state, - varipeps_config, + if tmp_count < varipeps_config.ctmrg_max_steps: + working_unitcell, converged, end_count, norm_smallest_S = ( + _ctmrg_while_wrapper( + ( + peps_tensors, + working_unitcell, + False, + ( + corner_singular_vals + if corner_singular_vals is not None + else init_corner_singular_vals + ), + eps, + tmp_count, + enforce_elementwise_convergence, + jnp.inf, + varipeps_global_state, + varipeps_config, + ) + ) ) - ) + else: + converged = False + end_count = tmp_count current_truncation_eps = ( varipeps_config.ctmrg_truncation_eps @@ -608,6 +782,7 @@ def _ctmrg_rev_while_body(carry): bar_fixed_point.get_unique_tensors(), config.ad_custom_convergence_eps, verbose=config.ad_custom_verbose_output, + split_transfer=bar_fixed_point.is_split_transfer(), ) count += 1 @@ -628,15 +803,31 @@ def _ctmrg_rev_while_body(carry): @jit def _ctmrg_rev_workhorse(peps_tensors, new_unitcell, new_unitcell_bar, config, state): - _, vjp_peps_tensors = vjp( - lambda t: do_absorption_step(t, new_unitcell, config, state), peps_tensors - ) + if new_unitcell.is_split_transfer(): + _, vjp_peps_tensors = vjp( + lambda t: do_absorption_step_split_transfer(t, new_unitcell, config, state), + peps_tensors, + ) - vjp_env = tree_util.Partial( - vjp(lambda u: do_absorption_step(peps_tensors, u, config, state), new_unitcell)[ - 1 - ] - ) + vjp_env = tree_util.Partial( + vjp( + lambda u: do_absorption_step_split_transfer( + peps_tensors, u, config, state + ), + new_unitcell, + )[1] + ) + else: + _, vjp_peps_tensors = vjp( + lambda t: do_absorption_step(t, new_unitcell, config, state), peps_tensors + ) + + vjp_env = tree_util.Partial( + vjp( + lambda u: do_absorption_step(peps_tensors, u, config, state), + new_unitcell, + )[1] + ) def cond_func(carry): _, _, _, converged, count, config, state = carry diff --git a/varipeps/ctmrg/structure_factor_absorption.py b/varipeps/ctmrg/structure_factor_absorption.py index 5a9a526..1429749 100644 --- a/varipeps/ctmrg/structure_factor_absorption.py +++ b/varipeps/ctmrg/structure_factor_absorption.py @@ -313,7 +313,7 @@ class definition for details. right_proj, smallest_S = calc_right_projectors( *_get_ctmrg_2x2_structure(peps_tensors, view, "top-right"), config, - state + state, ) right_projectors[(x, y)] = right_proj smallest_S_list.append(smallest_S) @@ -683,7 +683,7 @@ class definition for details. bottom_proj, smallest_S = calc_bottom_projectors( *_get_ctmrg_2x2_structure(peps_tensors, view, "bottom-left"), config, - state + state, ) bottom_projectors[(x, y)] = bottom_proj smallest_S_list.append(smallest_S) diff --git a/varipeps/expectation/__init__.py b/varipeps/expectation/__init__.py index 8c3a142..fe5c02b 100644 --- a/varipeps/expectation/__init__.py +++ b/varipeps/expectation/__init__.py @@ -4,6 +4,7 @@ from . import one_site from . import two_sites from . import three_sites +from . import four_sites from .model import Expectation_Model from .one_site import One_Site_Expectation_Value diff --git a/varipeps/expectation/four_sites.py b/varipeps/expectation/four_sites.py new file mode 100644 index 0000000..4b05ec2 --- /dev/null +++ b/varipeps/expectation/four_sites.py @@ -0,0 +1,119 @@ +from functools import partial + +import jax.numpy as jnp +from jax import jit + +from varipeps.peps import PEPS_Tensor +from varipeps.contractions import apply_contraction_jitted + +from typing import Sequence, List, Tuple, Literal + +Corner_Literal = Literal["top-left", "top-right", "bottom-left", "bottom-right"] + + +@partial(jit, static_argnums=(5,)) +def _four_sites_quadrat_workhorse( + top_left: jnp.ndarray, + top_right: jnp.ndarray, + bottom_left: jnp.ndarray, + bottom_right: jnp.ndarray, + gates: Tuple[jnp.ndarray, ...], + real_result: bool = False, +) -> List[jnp.ndarray]: + density_matrix = jnp.tensordot(top_left, top_right, ((5, 6, 7), (2, 3, 4))) + density_matrix = jnp.tensordot(density_matrix, bottom_left, ((2, 3, 4), (5, 6, 7))) + density_matrix = jnp.tensordot( + density_matrix, bottom_right, ((4, 5, 6, 9, 10, 11), (2, 3, 4, 5, 6, 7)) + ) + + density_matrix = density_matrix.transpose(0, 2, 4, 6, 1, 3, 5, 7) + density_matrix = density_matrix.reshape( + density_matrix.shape[0] + * density_matrix.shape[1] + * density_matrix.shape[2] + * density_matrix.shape[3], + density_matrix.shape[4] + * density_matrix.shape[5] + * density_matrix.shape[6] + * density_matrix.shape[7], + ) + + norm = jnp.trace(density_matrix) + + if real_result: + return [ + jnp.real(jnp.tensordot(density_matrix, g, ((0, 1), (0, 1))) / norm) + for g in gates + ] + else: + return [ + jnp.tensordot(density_matrix, g, ((0, 1), (0, 1))) / norm for g in gates + ] + + +def calc_four_sites_quadrat_multiple_gates( + peps_tensors: Sequence[jnp.ndarray], + peps_tensor_objs: Sequence[PEPS_Tensor], + gates: Sequence[jnp.ndarray], +) -> List[jnp.ndarray]: + """ + Calculate the four site expectation values for three as quadrat ordered + PEPS tensor and their environment. + + The order of the PEPS sequence have to be + [top-left, top-right, bottom-left, bottom-right]. + + The gate is applied in the order [top-left, top-right, bottom-left, bottom-right]. + + Args: + peps_tensors (:term:`sequence` of :obj:`jax.numpy.ndarray`): + The PEPS tensor arrays. Have to be the same objects as the tensor + attribute of the `peps_tensor_obj` argument. + peps_tensor_objs (:term:`sequence` of :obj:`~varipeps.peps.PEPS_Tensor`): + PEPS tensor objects. + gates (:term:`sequence` of :obj:`jax.numpy.ndarray`): + Sequence with the gates which should be applied to the PEPS tensors. + Gates are expected to be a matrix with first axis corresponding to + the Hilbert space and the second axis corresponding to the dual room. + Returns: + :obj:`list` of :obj:`jax.numpy.ndarray`: + List with the calculated expectation values of each gate. + """ + density_matrix_top_left = apply_contraction_jitted( + "density_matrix_four_sites_top_left", + [peps_tensors[0]], + [peps_tensor_objs[0]], + [], + ) + + density_matrix_top_right = apply_contraction_jitted( + "density_matrix_four_sites_top_right", + [peps_tensors[1]], + [peps_tensor_objs[1]], + [], + ) + + density_matrix_bottom_left = apply_contraction_jitted( + "density_matrix_four_sites_bottom_left", + [peps_tensors[2]], + [peps_tensor_objs[2]], + [], + ) + + density_matrix_bottom_right = apply_contraction_jitted( + "density_matrix_four_sites_bottom_right", + [peps_tensors[3]], + [peps_tensor_objs[3]], + [], + ) + + real_result = all(jnp.allclose(g, g.T.conj()) for g in gates) + + return _four_sites_quadrat_workhorse( + density_matrix_top_left, + density_matrix_top_right, + density_matrix_bottom_left, + density_matrix_bottom_right, + tuple(gates), + real_result, + ) diff --git a/varipeps/expectation/spiral_helpers.py b/varipeps/expectation/spiral_helpers.py index 4b20172..8779f91 100644 --- a/varipeps/expectation/spiral_helpers.py +++ b/varipeps/expectation/spiral_helpers.py @@ -29,7 +29,8 @@ def apply_unitary( gate (:obj:`jax.numpy.ndarray`): The gate which should be updated with the unitary operator. delta_r (:obj:`jax.numpy.ndarray`): - Vector for the spatial difference. + Vector for the spatial difference. Can be a sequence if the spatial + difference are different for the single indices. q (:term:`sequence` of :obj:`jax.numpy.ndarray`): Sequence with the relevant wavevector for the different indices of the gate. @@ -52,13 +53,17 @@ def apply_unitary( :obj:`jax.numpy.ndarray`: The updated gate with the unitary applied. """ - if len(q) != len(apply_to_index): + if isinstance(delta_r, jnp.ndarray): + delta_r = (delta_r,) * len(apply_to_index) + + if len(q) != len(apply_to_index) or len(q) != len(delta_r): raise ValueError("Length mismatch!") working_gate = gate.reshape((phys_d,) * 2 * number_sites) for index, i in enumerate(apply_to_index): w_q = q[index] + w_r = delta_r[index] if w_q.ndim == 0: w_q = jnp.array((w_q, w_q)) @@ -72,8 +77,8 @@ def apply_unitary( else: raise ValueError("Unknown wavevector type!") - # U = jsp.linalg.expm(1j * jnp.pi * jnp.dot(w_q, delta_r) * unitary_operator) - U = jnp.exp(1j * jnp.pi * jnp.dot(w_q, delta_r) * unitary_operator_D) + # U = jsp.linalg.expm(1j * jnp.pi * jnp.dot(w_q, w_r) * unitary_operator) + U = jnp.exp(1j * jnp.pi * jnp.dot(w_q, w_r) * unitary_operator_D) U = jnp.dot( unitary_operator_sigma * U[jnp.newaxis, :], unitary_operator_sigma.T.conj() ) diff --git a/varipeps/expectation/two_sites.py b/varipeps/expectation/two_sites.py index 0016d91..5a316ae 100644 --- a/varipeps/expectation/two_sites.py +++ b/varipeps/expectation/two_sites.py @@ -8,7 +8,7 @@ from varipeps import varipeps_config from varipeps.peps import PEPS_Tensor, PEPS_Unit_Cell -from varipeps.contractions import apply_contraction +from varipeps.contractions import apply_contraction, apply_contraction_jitted from .model import Expectation_Model from .spiral_helpers import apply_unitary @@ -87,6 +87,30 @@ def _two_site_diagonal_workhorse( ] +@partial(jit, static_argnums=(2,)) +def _two_site_full_density_workhorse( + density_matrix: jnp.ndarray, + gates: Tuple[jnp.ndarray, ...], + real_result: bool = False, +) -> List[jnp.ndarray]: + density_matrix = density_matrix.reshape( + density_matrix.shape[0] * density_matrix.shape[1], + density_matrix.shape[2] * density_matrix.shape[3], + ) + + norm = jnp.trace(density_matrix) + + if real_result: + return [ + jnp.real(jnp.tensordot(density_matrix, g, ((0, 1), (0, 1))) / norm) + for g in gates + ] + else: + return [ + jnp.tensordot(density_matrix, g, ((0, 1), (0, 1))) / norm for g in gates + ] + + def calc_two_sites_horizontal_multiple_gates( peps_tensors: Sequence[jnp.ndarray], peps_tensor_objs: Sequence[PEPS_Tensor], @@ -411,6 +435,144 @@ def calc_two_sites_diagonal_top_right_bottom_left_single_gate( )[0] +def calc_two_sites_diagonal_horizontal_rectangle_multiple_gates( + peps_tensors: Sequence[jnp.ndarray], + peps_tensor_objs: Sequence[PEPS_Tensor], + gates: Sequence[jnp.ndarray], +) -> List[jnp.ndarray]: + """ + Calculate the two site expectation values for two from top left to the + bottom right site of in a 2x3 horizontal rectangle ordered PEPS tensors and + their environment. + + The order of the PEPS sequence have to be + [top-left, top-middle, top-right, bottom-left, bottom-middle, bottom-right]. + + Args: + peps_tensors (:term:`sequence` of :obj:`jax.numpy.ndarray`): + The PEPS tensor arrays. Have to be the same objects as the tensor + attribute of the `peps_tensor_obj` argument. + peps_tensor_objs (:term:`sequence` of :obj:`~varipeps.peps.PEPS_Tensor`): + PEPS tensor objects. + gates (:term:`sequence` of :obj:`jax.numpy.ndarray`): + Sequence with the gates which should be applied to the PEPS tensors. + Gates are expected to be a matrix with first axis corresponding to + the Hilbert space and the second axis corresponding to the dual room. + Returns: + :obj:`list` of :obj:`jax.numpy.ndarray`: + List with the calculated expectation values of each gate. + """ + + density_matrix_top_left = apply_contraction_jitted( + "density_matrix_four_sites_top_left", + [peps_tensors[0]], + [peps_tensor_objs[0]], + [], + ) + + traced_density_matrix_top_right = apply_contraction_jitted( + "ctmrg_top_right", [peps_tensors[2]], [peps_tensor_objs[2]], [] + ) + + traced_density_matrix_bottom_left = apply_contraction_jitted( + "ctmrg_bottom_left", [peps_tensors[3]], [peps_tensor_objs[3]], [] + ) + + density_matrix_bottom_right = apply_contraction_jitted( + "density_matrix_four_sites_bottom_right", + [peps_tensors[5]], + [peps_tensor_objs[5]], + [], + ) + + full_density_matrix = apply_contraction_jitted( + "density_matrix_two_sites_horizontal_rectangle", + [peps_tensors[1], peps_tensors[4]], + [peps_tensor_objs[1], peps_tensor_objs[4]], + [ + density_matrix_top_left, + traced_density_matrix_top_right, + traced_density_matrix_bottom_left, + density_matrix_bottom_right, + ], + ) + + real_result = all(jnp.allclose(g, g.T.conj()) for g in gates) + + return _two_site_full_density_workhorse( + full_density_matrix, tuple(gates), real_result + ) + + +def calc_two_sites_diagonal_vertical_rectangle_multiple_gates( + peps_tensors: Sequence[jnp.ndarray], + peps_tensor_objs: Sequence[PEPS_Tensor], + gates: Sequence[jnp.ndarray], +) -> List[jnp.ndarray]: + """ + Calculate the two site expectation values for two from top left to the + bottom right site of in a 3x2 vertical rectangle ordered PEPS tensors and + their environment. + + The order of the PEPS sequence have to be + [top-left, top-right, middle-left, middle-right, bottom-left, bottom-right]. + + Args: + peps_tensors (:term:`sequence` of :obj:`jax.numpy.ndarray`): + The PEPS tensor arrays. Have to be the same objects as the tensor + attribute of the `peps_tensor_obj` argument. + peps_tensor_objs (:term:`sequence` of :obj:`~varipeps.peps.PEPS_Tensor`): + PEPS tensor objects. + gates (:term:`sequence` of :obj:`jax.numpy.ndarray`): + Sequence with the gates which should be applied to the PEPS tensors. + Gates are expected to be a matrix with first axis corresponding to + the Hilbert space and the second axis corresponding to the dual room. + Returns: + :obj:`list` of :obj:`jax.numpy.ndarray`: + List with the calculated expectation values of each gate. + """ + + density_matrix_top_left = apply_contraction_jitted( + "density_matrix_four_sites_top_left", + [peps_tensors[0]], + [peps_tensor_objs[0]], + [], + ) + + traced_density_matrix_top_right = apply_contraction_jitted( + "ctmrg_top_right", [peps_tensors[1]], [peps_tensor_objs[1]], [] + ) + + traced_density_matrix_bottom_left = apply_contraction_jitted( + "ctmrg_bottom_left", [peps_tensors[4]], [peps_tensor_objs[4]], [] + ) + + density_matrix_bottom_right = apply_contraction_jitted( + "density_matrix_four_sites_bottom_right", + [peps_tensors[5]], + [peps_tensor_objs[5]], + [], + ) + + full_density_matrix = apply_contraction_jitted( + "density_matrix_two_sites_vertical_rectangle", + [peps_tensors[2], peps_tensors[3]], + [peps_tensor_objs[2], peps_tensor_objs[3]], + [ + density_matrix_top_left, + traced_density_matrix_top_right, + traced_density_matrix_bottom_left, + density_matrix_bottom_right, + ], + ) + + real_result = all(jnp.allclose(g, g.T.conj()) for g in gates) + + return _two_site_full_density_workhorse( + full_density_matrix, tuple(gates), real_result + ) + + @dataclass class Two_Sites_Expectation_Value(Expectation_Model): horizontal_gates: Sequence[jnp.ndarray] diff --git a/varipeps/mapping/honeycomb.py b/varipeps/mapping/honeycomb.py index 9063d35..5ef9cc5 100644 --- a/varipeps/mapping/honeycomb.py +++ b/varipeps/mapping/honeycomb.py @@ -8,12 +8,14 @@ from jax import jit import jax.util +from varipeps import varipeps_config import varipeps.config from varipeps.peps import PEPS_Tensor, PEPS_Unit_Cell from varipeps.contractions import apply_contraction, Definitions from varipeps.expectation.model import Expectation_Model from varipeps.expectation.one_site import calc_one_site_multi_gates from varipeps.expectation.two_sites import _two_site_workhorse +from varipeps.expectation.spiral_helpers import apply_unitary from varipeps.typing import Tensor from varipeps.mapping import Map_To_PEPS_Model from varipeps.utils.random import PEPS_Random_Number_Generator @@ -111,8 +113,18 @@ def __post_init__(self) -> None: self._y_tuple = tuple(self.y_gates) self._z_tuple = tuple(self.z_gates) + self._result_type = ( + jnp.float64 + if all(jnp.allclose(g, g.T.conj()) for g in self.x_gates) + and all(jnp.allclose(g, g.T.conj()) for g in self.y_gates) + and all(jnp.allclose(g, g.T.conj()) for g in self.z_gates) + else jnp.complex128 + ) + if self.is_spiral_peps: - raise NotImplementedError + self._spiral_D, self._spiral_sigma = jnp.linalg.eigh( + self.spiral_unitary_operator + ) def __call__( self, @@ -124,15 +136,8 @@ def __call__( only_unique: bool = True, return_single_gate_results: bool = False, ) -> Union[jnp.ndarray, List[jnp.ndarray]]: - result_type = ( - jnp.float64 - if all(jnp.allclose(g, jnp.real(g)) for g in self.x_gates) - and all(jnp.allclose(g, jnp.real(g)) for g in self.y_gates) - and all(jnp.allclose(g, jnp.real(g)) for g in self.z_gates) - else jnp.complex128 - ) result = [ - jnp.array(0, dtype=result_type) + jnp.array(0, dtype=self._result_type) for _ in range( max( len(self.x_gates), @@ -142,6 +147,44 @@ def __call__( ) ] + if self.is_spiral_peps: + if isinstance(spiral_vectors, jnp.ndarray): + spiral_vectors = (spiral_vectors,) + if len(spiral_vectors) != 1: + raise ValueError("Length mismatch for spiral vectors!") + + working_h_gates = tuple( + apply_unitary( + h, + jnp.array((0, 1)), + spiral_vectors, + self._spiral_D, + self._spiral_sigma, + self.real_d, + 2, + (1,), + varipeps_config.spiral_wavevector_type, + ) + for h in self._y_tuple + ) + working_v_gates = tuple( + apply_unitary( + v, + jnp.array((1, 0)), + spiral_vectors, + self._spiral_D, + self._spiral_sigma, + self.real_d, + 2, + (1,), + varipeps_config.spiral_wavevector_type, + ) + for v in self._z_tuple + ) + else: + working_h_gates = self._y_tuple + working_v_gates = self._z_tuple + for x, iter_rows in unitcell.iter_all_rows(only_unique=only_unique): for y, view in iter_rows: # On site x term @@ -196,8 +239,8 @@ def __call__( step_result_y = _two_site_workhorse( density_matrix_left, density_matrix_right, - self._y_tuple, - result_type is jnp.float64, + working_h_gates, + self._result_type is jnp.float64, ) for sr_i, sr in enumerate(step_result_y): @@ -241,8 +284,8 @@ def __call__( step_result_z = _two_site_workhorse( density_matrix_top, density_matrix_bottom, - self._z_tuple, - result_type is jnp.float64, + working_v_gates, + self._result_type is jnp.float64, ) for sr_i, sr in enumerate(step_result_z): diff --git a/varipeps/mapping/triangular.py b/varipeps/mapping/triangular.py index 06edb98..540caed 100644 --- a/varipeps/mapping/triangular.py +++ b/varipeps/mapping/triangular.py @@ -1,4 +1,6 @@ +import collections.abc from dataclasses import dataclass +from functools import partial from os import PathLike import jax.numpy as jnp @@ -6,19 +8,26 @@ import jax.util import h5py +from varipeps import varipeps_config import varipeps.config from varipeps.peps import PEPS_Tensor, PEPS_Unit_Cell -from varipeps.contractions import apply_contraction +from varipeps.contractions import apply_contraction, apply_contraction_jitted from varipeps.expectation.model import Expectation_Model from varipeps.expectation.two_sites import ( calc_two_sites_vertical_multiple_gates, calc_two_sites_horizontal_multiple_gates, calc_two_sites_diagonal_top_left_bottom_right_multiple_gates, + calc_two_sites_diagonal_horizontal_rectangle_multiple_gates, + calc_two_sites_diagonal_vertical_rectangle_multiple_gates, ) +from varipeps.expectation.four_sites import calc_four_sites_quadrat_multiple_gates +from varipeps.expectation.spiral_helpers import apply_unitary from varipeps.typing import Tensor from varipeps.utils.random import PEPS_Random_Number_Generator from varipeps.mapping import Map_To_PEPS_Model +from varipeps.utils.debug_print import debug_print + from typing import ( Sequence, Union, @@ -55,12 +64,15 @@ class Triangular_Expectation_Value(Expectation_Model): \\ Args: - nearest_neighbor_gates (:term:`sequence` of :obj:`jax.numpy.ndarray`): - Sequence with the gates that should be applied to each nearest + horizontal_gates (:term:`sequence` of :obj:`jax.numpy.ndarray`): + Sequence with the gates that should be applied to each nearest horizontal + neighbor. + vertical_gates (:term:`sequence` of :obj:`jax.numpy.ndarray`): + Sequence with the gates that should be applied to each nearest vertical + neighbor. + diagonal_gates (:term:`sequence` of :obj:`jax.numpy.ndarray`): + Sequence with the gates that should be applied to each nearest diagonal neighbor. - downward_triangle_gates (:term:`sequence` of :obj:`jax.numpy.ndarray`): - Sequence with the gates that should be applied to the downward - triangles. normalization_factor (:obj:`int`): Factor which should be used to normalize the calculated values. If for example three sites are mapped into one PEPS site this @@ -72,15 +84,46 @@ class Triangular_Expectation_Value(Expectation_Model): if spiral iPEPS ansatz is used. """ - nearest_neighbor_gates: Sequence[jnp.ndarray] + horizontal_gates: Sequence[jnp.ndarray] + vertical_gates: Sequence[jnp.ndarray] + diagonal_gates: Sequence[jnp.ndarray] + real_d: int normalization_factor: int = 1 is_spiral_peps: bool = False spiral_unitary_operator: Optional[jnp.ndarray] = None def __post_init__(self) -> None: - if isinstance(self.nearest_neighbor_gates, jnp.ndarray): - self.nearest_neighbor_gates = (self.nearest_neighbor_gates,) + if isinstance(self.horizontal_gates, jnp.ndarray): + self.horizontal_gates = (self.horizontal_gates,) + else: + self.horizontal_gates = tuple(self.horizontal_gates) + + if isinstance(self.vertical_gates, jnp.ndarray): + self.vertical_gates = (self.vertical_gates,) + else: + self.vertical_gates = tuple(self.vertical_gates) + + if isinstance(self.diagonal_gates, jnp.ndarray): + self.diagonal_gates = (self.diagonal_gates,) + else: + self.diagonal_gates = tuple(self.diagonal_gates) + + self._result_type = ( + jnp.float64 + if all( + jnp.allclose(g, g.T.conj()) + for g in self.horizontal_gates + + self.vertical_gates + + self.diagonal_gates + ) + else jnp.complex128 + ) + + if self.is_spiral_peps: + self._spiral_D, self._spiral_sigma = jnp.linalg.eigh( + self.spiral_unitary_operator + ) def __call__( self, @@ -92,16 +135,68 @@ def __call__( only_unique: bool = True, return_single_gate_results: bool = False, ) -> Union[jnp.ndarray, List[jnp.ndarray]]: - result_type = ( - jnp.float64 - if all(jnp.allclose(g, jnp.real(g)) for g in self.nearest_neighbor_gates) - else jnp.complex128 - ) result = [ - jnp.array(0, dtype=result_type) - for _ in range(len(self.nearest_neighbor_gates)) + jnp.array(0, dtype=self._result_type) + for _ in range(len(self.horizontal_gates)) ] + if self.is_spiral_peps: + if ( + isinstance(spiral_vectors, collections.abc.Sequence) + and len(spiral_vectors) == 1 + ): + spiral_vectors = spiral_vectors[0] + + if not isinstance(spiral_vectors, jnp.ndarray): + raise ValueError("Expect spiral vector as single jax.numpy array.") + + working_h_gates = tuple( + apply_unitary( + h, + jnp.array((0, 1)), + (spiral_vectors,), + self._spiral_D, + self._spiral_sigma, + self.real_d, + 2, + (1,), + varipeps_config.spiral_wavevector_type, + ) + for h in self.horizontal_gates + ) + working_v_gates = tuple( + apply_unitary( + v, + jnp.array((1, 0)), + (spiral_vectors,), + self._spiral_D, + self._spiral_sigma, + self.real_d, + 2, + (1,), + varipeps_config.spiral_wavevector_type, + ) + for v in self.vertical_gates + ) + working_d_gates = tuple( + apply_unitary( + d, + jnp.array((1, 1)), + (spiral_vectors,), + self._spiral_D, + self._spiral_sigma, + self.real_d, + 2, + (1,), + varipeps_config.spiral_wavevector_type, + ) + for d in self.diagonal_gates + ) + else: + working_h_gates = self.horizontal_gates + working_v_gates = self.vertical_gates + working_d_gates = self.diagonal_gates + for x, iter_rows in unitcell.iter_all_rows(only_unique=only_unique): for y, view in iter_rows: x_tensors_i = view.get_indices((slice(0, 2, None), 0)) @@ -109,7 +204,7 @@ def __call__( x_tensor_objs = [t for tl in view[:2, 0] for t in tl] step_result_x = calc_two_sites_vertical_multiple_gates( - x_tensors, x_tensor_objs, self.nearest_neighbor_gates + x_tensors, x_tensor_objs, working_v_gates ) y_tensors_i = view.get_indices((0, slice(0, 2, None))) @@ -117,7 +212,7 @@ def __call__( y_tensor_objs = [t for tl in view[0, :2] for t in tl] step_result_y = calc_two_sites_horizontal_multiple_gates( - y_tensors, y_tensor_objs, self.nearest_neighbor_gates + y_tensors, y_tensor_objs, working_h_gates ) diagonal_tensors_i = view.get_indices( @@ -132,7 +227,7 @@ def __call__( calc_two_sites_diagonal_top_left_bottom_right_multiple_gates( diagonal_tensors, diagonal_tensor_objs, - self.nearest_neighbor_gates, + working_d_gates, ) ) @@ -522,3 +617,352 @@ def autosave_wrapper( ) else: cls.save_to_file(filename, tensors, unitcell, auxiliary_data=auxiliary_data) + + +@partial(jit, static_argnums=(2, 3)) +def _calc_quadrat_gate_next_nearest( + nearest_gates: Sequence[jnp.ndarray], + next_nearest_gates: Sequence[jnp.ndarray], + d: int, + result_length: int, +): + result = [None] * result_length + + single_gates = [None] * result_length + + Id_other_sites = jnp.eye(d**2) + + for i, (n_e, n_n_e) in enumerate( + jax.util.safe_zip(nearest_gates, next_nearest_gates) + ): + nearest_34 = jnp.kron(Id_other_sites, n_e) + + nearest_13 = nearest_34.reshape(d, d, d, d, d, d, d, d) + nearest_14 = nearest_34.reshape(d, d, d, d, d, d, d, d) + + nearest_13 = nearest_13.transpose(2, 0, 3, 1, 6, 4, 7, 5) + nearest_13 = nearest_13.reshape(d**4, d**4) + + nearest_14 = nearest_14.transpose(2, 0, 1, 3, 6, 4, 5, 7) + nearest_14 = nearest_14.reshape(d**4, d**4) + + next_nearest_23 = jnp.kron(n_n_e, Id_other_sites) + next_nearest_23 = next_nearest_23.reshape(d, d, d, d, d, d, d, d) + next_nearest_23 = next_nearest_23.transpose(2, 0, 1, 3, 6, 4, 5, 7) + next_nearest_23 = next_nearest_23.reshape(d**4, d**4) + + result[i] = nearest_13 + nearest_14 + nearest_34 + next_nearest_23 + + single_gates[i] = (nearest_13, nearest_14, nearest_34, next_nearest_23) + + return result, single_gates + + +@dataclass +class Triangular_Next_Nearest_Expectation_Value(Expectation_Model): + """ + Class to calculate expectation values for a triangular structure with + next-nearest interactions. + + Args: + nearest_neighbor_gates (:term:`sequence` of :obj:`jax.numpy.ndarray`): + Sequence with the gates that should be applied to each nearest + neighbor. + next_nearest_neighbor_gates (:term:`sequence` of :obj:`jax.numpy.ndarray`): + Sequence with the gates that should be applied to each next-nearest + neighbor. + real_d (:obj:`int`): + Physical dimension of a single site before mapping. + normalization_factor (:obj:`int`): + Factor which should be used to normalize the calculated values. + For a single layer triangular structure this should be normally 1. + is_spiral_peps (:obj:`bool`): + Flag if the expectation value is for a spiral iPEPS ansatz. + spiral_unitary_operator (:obj:`jax.numpy.ndarray`): + Operator used to generate unitary for spiral iPEPS ansatz. Required + if spiral iPEPS ansatz is used. + """ + + nearest_neighbor_gates: Sequence[jnp.ndarray] + next_nearest_neighbor_gates: Sequence[jnp.ndarray] + real_d: int + normalization_factor: int = 1 + + is_spiral_peps: bool = False + spiral_unitary_operator: Optional[jnp.ndarray] = None + + def __post_init__(self) -> None: + if isinstance(self.nearest_neighbor_gates, jnp.ndarray): + self.nearest_neighbor_gates = (self.nearest_neighbor_gates,) + if isinstance(self.next_nearest_neighbor_gates, jnp.ndarray): + self.next_nearest_neighbor_gates = (self.next_nearest_neighbor_gates,) + if len(self.nearest_neighbor_gates) != len(self.next_nearest_neighbor_gates): + raise ValueError("Length mismatch for sequence of gates.") + + tmp_result = _calc_quadrat_gate_next_nearest( + self.nearest_neighbor_gates, + self.next_nearest_neighbor_gates, + self.real_d, + len(self.nearest_neighbor_gates), + ) + self._quadrat_tuple, self._quadrat_single_gates = tuple(tmp_result[0]), tuple( + tmp_result[1] + ) + + self._result_type = ( + jnp.float64 + if all( + jnp.allclose(g, g.T.conj()) + for g in self.nearest_neighbor_gates + self.next_nearest_neighbor_gates + ) + else jnp.complex128 + ) + + if self.is_spiral_peps: + self._spiral_D, self._spiral_sigma = jnp.linalg.eigh( + self.spiral_unitary_operator + ) + + def __call__( + self, + peps_tensors: Sequence[jnp.ndarray], + unitcell: PEPS_Unit_Cell, + spiral_vectors: Optional[Union[jnp.ndarray, Sequence[jnp.ndarray]]] = None, + *, + normalize_by_size: bool = True, + only_unique: bool = True, + return_single_gate_results: bool = False, + ) -> Union[jnp.ndarray, List[jnp.ndarray]]: + result = [ + jnp.array(0, dtype=self._result_type) + for _ in range(len(self.nearest_neighbor_gates)) + ] + + if return_single_gate_results: + single_gates_result = [dict()] * len(self.nearest_neighbor_gates) + + if self.is_spiral_peps: + if ( + isinstance(spiral_vectors, collections.abc.Sequence) + and len(spiral_vectors) == 1 + ): + spiral_vectors = spiral_vectors[0] + + if not isinstance(spiral_vectors, jnp.ndarray): + raise ValueError("Expect spiral vector as single jax.numpy array.") + + working_q_gates = tuple( + apply_unitary( + q, + (jnp.array((0, 1)), jnp.array((1, 0)), jnp.array((1, 1))), + (spiral_vectors, spiral_vectors, spiral_vectors), + self._spiral_D, + self._spiral_sigma, + self.real_d, + 4, + (1, 2, 3), + varipeps_config.spiral_wavevector_type, + ) + for q in self._quadrat_tuple + ) + + working_next_horizontal_gates = tuple( + apply_unitary( + e, + jnp.array((1, 2)), + (spiral_vectors,), + self._spiral_D, + self._spiral_sigma, + self.real_d, + 2, + (1,), + varipeps_config.spiral_wavevector_type, + ) + for e in self.next_nearest_neighbor_gates + ) + + working_next_vertical_gates = tuple( + apply_unitary( + e, + jnp.array((2, 1)), + (spiral_vectors,), + self._spiral_D, + self._spiral_sigma, + self.real_d, + 2, + (1,), + varipeps_config.spiral_wavevector_type, + ) + for e in self.next_nearest_neighbor_gates + ) + + if return_single_gate_results: + working_q_single_gates = tuple( + e + for q in self._quadrat_single_gates + for e in ( + apply_unitary( + q[0], + jnp.array((1, 0)), + (spiral_vectors,), + self._spiral_D, + self._spiral_sigma, + self.real_d, + 4, + (2,), + varipeps_config.spiral_wavevector_type, + ), + apply_unitary( + q[1], + jnp.array((1, 1)), + (spiral_vectors,), + self._spiral_D, + self._spiral_sigma, + self.real_d, + 4, + (3,), + varipeps_config.spiral_wavevector_type, + ), + apply_unitary( + q[2], + (jnp.array((1, 0)), jnp.array((1, 1))), + (spiral_vectors, spiral_vectors), + self._spiral_D, + self._spiral_sigma, + self.real_d, + 4, + (2, 3), + varipeps_config.spiral_wavevector_type, + ), + apply_unitary( + q[3], + (jnp.array((0, 1)), jnp.array((1, 0))), + (spiral_vectors, spiral_vectors), + self._spiral_D, + self._spiral_sigma, + self.real_d, + 4, + (1, 2), + varipeps_config.spiral_wavevector_type, + ), + ) + ) + else: + working_q_gates = self._quadrat_tuple + working_next_horizontal_gates = self.next_nearest_neighbor_gates + working_next_vertical_gates = self.next_nearest_neighbor_gates + + if return_single_gate_results: + working_q_single_gates = tuple( + q for e in self._quadrat_single_gates for q in e + ) + + for x, iter_rows in unitcell.iter_all_rows(only_unique=only_unique): + for y, view in iter_rows: + quadrat_tensors_i = view.get_indices( + (slice(0, 2, None), slice(0, 2, None)) + ) + quadrat_tensors = [ + peps_tensors[i] for j in quadrat_tensors_i for i in j + ] + quadrat_tensor_objs = [t for tl in view[:2, :2] for t in tl] + + if return_single_gate_results: + step_result_quadrat = calc_four_sites_quadrat_multiple_gates( + quadrat_tensors, + quadrat_tensor_objs, + working_q_gates + working_q_single_gates, + ) + else: + step_result_quadrat = calc_four_sites_quadrat_multiple_gates( + quadrat_tensors, + quadrat_tensor_objs, + working_q_gates, + ) + + horizontal_rect_tensors_i = view.get_indices( + (slice(0, 2, None), slice(0, 3, None)) + ) + horizontal_rect_tensors = [ + peps_tensors[i] for j in horizontal_rect_tensors_i for i in j + ] + horizontal_rect_tensor_objs = [t for tl in view[:2, :3] for t in tl] + + step_result_horizontal_rect = ( + calc_two_sites_diagonal_horizontal_rectangle_multiple_gates( + horizontal_rect_tensors, + horizontal_rect_tensor_objs, + working_next_horizontal_gates, + ) + ) + + vertical_rect_tensors_i = view.get_indices( + (slice(0, 3, None), slice(0, 2, None)) + ) + vertical_rect_tensors = [ + peps_tensors[i] for j in vertical_rect_tensors_i for i in j + ] + vertical_rect_tensor_objs = [t for tl in view[:3, :2] for t in tl] + + step_result_vertical_rect = ( + calc_two_sites_diagonal_vertical_rectangle_multiple_gates( + vertical_rect_tensors, + vertical_rect_tensor_objs, + working_next_vertical_gates, + ) + ) + + for sr_i, (sr_q, sr_h, sr_v) in enumerate( + jax.util.safe_zip( + step_result_quadrat[: len(self.nearest_neighbor_gates)], + step_result_horizontal_rect[: len(self.nearest_neighbor_gates)], + step_result_vertical_rect[: len(self.nearest_neighbor_gates)], + ) + ): + result[sr_i] += sr_q + sr_h + sr_v + + if return_single_gate_results: + for sr_i in range(len(self.nearest_neighbor_gates)): + index_quadrat = ( + len(self.nearest_neighbor_gates) + + len(self._quadrat_single_gates[0]) * sr_i + ) + + single_gates_result[sr_i][(x, y)] = dict( + zip( + ( + "nearest_13", + "nearest_14", + "nearest_34", + "next_nearest_23", + "next_nearest_horizontal_rect", + "next_nearest_vertical_rect", + ), + ( + step_result_quadrat[ + index_quadrat : ( + index_quadrat + + len(self._quadrat_single_gates[0]) + ) + ] + + step_result_horizontal_rect[sr_i : sr_i + 1] + + step_result_vertical_rect[sr_i : sr_i + 1] + ), + ) + ) + + if normalize_by_size: + if only_unique: + size = unitcell.get_len_unique_tensors() + else: + size = unitcell.get_size()[0] * unitcell.get_size()[1] + size = size * self.normalization_factor + result = [r / size for r in result] + + if len(result) == 1: + result = result[0] + + if return_single_gate_results: + return result, single_gates_result + else: + return result diff --git a/varipeps/optimization/inner_function.py b/varipeps/optimization/inner_function.py index f8254a2..21d9fe2 100644 --- a/varipeps/optimization/inner_function.py +++ b/varipeps/optimization/inner_function.py @@ -94,30 +94,55 @@ def calc_ctmrg_expectation( :obj:`tuple`\ (:obj:`jax.numpy.ndarray`, :obj:`~varipeps.peps.PEPS_Unit_Cell`): Tuple consisting of the calculated expectation value and the new unitcell. """ + state_split_transfer = unitcell.is_split_transfer() + spiral_vectors = additional_input.get("spiral_vectors") if expectation_func.is_spiral_peps and spiral_vectors is None: peps_tensors, unitcell, spiral_vectors = _map_tensors( input_tensors, unitcell, convert_to_unitcell_func, True ) + + if any(i.size == 1 for i in spiral_vectors): + spiral_vectors_x = additional_input.get("spiral_vectors_x") + spiral_vectors_y = additional_input.get("spiral_vectors_y") + if spiral_vectors_x is not None: + if isinstance(spiral_vectors_x, jnp.ndarray): + spiral_vectors_x = (spiral_vectors_x,) + spiral_vectors = tuple( + jnp.array((sx, sy)) + for sx, sy in safe_zip(spiral_vectors_x, spiral_vectors) + ) + elif spiral_vectors_y is not None: + if isinstance(spiral_vectors_y, jnp.ndarray): + spiral_vectors_y = (spiral_vectors_y,) + spiral_vectors = tuple( + jnp.array((sx, sy)) + for sx, sy in safe_zip(spiral_vectors, spiral_vectors_y) + ) else: peps_tensors, unitcell = _map_tensors( input_tensors, unitcell, convert_to_unitcell_func, False ) + if state_split_transfer != unitcell.is_split_transfer(): + raise ValueError("Map function is not split transfer aware. Please fix that!") + new_unitcell, max_trunc_error = calc_ctmrg_env( peps_tensors, unitcell, enforce_elementwise_convergence=enforce_elementwise_convergence, ) + exp_unitcell = new_unitcell.convert_to_full_transfer() + if expectation_func.is_spiral_peps: return cast( - jnp.ndarray, expectation_func(peps_tensors, new_unitcell, spiral_vectors) + jnp.ndarray, expectation_func(peps_tensors, exp_unitcell, spiral_vectors) ), ( new_unitcell, max_trunc_error, ) - return cast(jnp.ndarray, expectation_func(peps_tensors, new_unitcell)), ( + return cast(jnp.ndarray, expectation_func(peps_tensors, exp_unitcell)), ( new_unitcell, max_trunc_error, ) @@ -170,16 +195,39 @@ def calc_preconverged_ctmrg_value_and_grad( unitcell. 2. The calculated gradient. """ + state_split_transfer = unitcell.is_split_transfer() + spiral_vectors = additional_input.get("spiral_vectors") if expectation_func.is_spiral_peps and spiral_vectors is None: peps_tensors, unitcell, spiral_vectors = _map_tensors( input_tensors, unitcell, convert_to_unitcell_func, True ) + + if any(i.size == 1 for i in spiral_vectors): + spiral_vectors_x = additional_input.get("spiral_vectors_x") + spiral_vectors_y = additional_input.get("spiral_vectors_y") + if spiral_vectors_x is not None: + if isinstance(spiral_vectors_x, jnp.ndarray): + spiral_vectors_x = (spiral_vectors_x,) + spiral_vectors = tuple( + jnp.array((sx, sy)) + for sx, sy in safe_zip(spiral_vectors_x, spiral_vectors) + ) + elif spiral_vectors_y is not None: + if isinstance(spiral_vectors_y, jnp.ndarray): + spiral_vectors_y = (spiral_vectors_y,) + spiral_vectors = tuple( + jnp.array((sx, sy)) + for sx, sy in safe_zip(spiral_vectors, spiral_vectors_y) + ) else: peps_tensors, unitcell = _map_tensors( input_tensors, unitcell, convert_to_unitcell_func, False ) + if state_split_transfer != unitcell.is_split_transfer(): + raise ValueError("Map function is not split transfer aware. Please fix that!") + if calc_preconverged: preconverged_unitcell, _ = calc_ctmrg_env( peps_tensors, @@ -229,26 +277,51 @@ def calc_ctmrg_expectation_custom( :obj:`tuple`\ (:obj:`jax.numpy.ndarray`, :obj:`~varipeps.peps.PEPS_Unit_Cell`): Tuple consisting of the calculated expectation value and the new unitcell. """ + state_split_transfer = unitcell.is_split_transfer() + spiral_vectors = additional_input.get("spiral_vectors") if expectation_func.is_spiral_peps and spiral_vectors is None: peps_tensors, unitcell, spiral_vectors = _map_tensors( input_tensors, unitcell, convert_to_unitcell_func, True ) + + if any(i.size == 1 for i in spiral_vectors): + spiral_vectors_x = additional_input.get("spiral_vectors_x") + spiral_vectors_y = additional_input.get("spiral_vectors_y") + if spiral_vectors_x is not None: + if isinstance(spiral_vectors_x, jnp.ndarray): + spiral_vectors_x = (spiral_vectors_x,) + spiral_vectors = tuple( + jnp.array((sx, sy)) + for sx, sy in safe_zip(spiral_vectors_x, spiral_vectors) + ) + elif spiral_vectors_y is not None: + if isinstance(spiral_vectors_y, jnp.ndarray): + spiral_vectors_y = (spiral_vectors_y,) + spiral_vectors = tuple( + jnp.array((sx, sy)) + for sx, sy in safe_zip(spiral_vectors, spiral_vectors_y) + ) else: peps_tensors, unitcell = _map_tensors( input_tensors, unitcell, convert_to_unitcell_func, False ) + if state_split_transfer != unitcell.is_split_transfer(): + raise ValueError("Map function is not split transfer aware. Please fix that!") + new_unitcell, max_trunc_error = calc_ctmrg_env_custom_rule(peps_tensors, unitcell) + exp_unitcell = new_unitcell.convert_to_full_transfer() + if expectation_func.is_spiral_peps: return cast( - jnp.ndarray, expectation_func(peps_tensors, new_unitcell, spiral_vectors) + jnp.ndarray, expectation_func(peps_tensors, exp_unitcell, spiral_vectors) ), ( new_unitcell, max_trunc_error, ) - return cast(jnp.ndarray, expectation_func(peps_tensors, new_unitcell)), ( + return cast(jnp.ndarray, expectation_func(peps_tensors, exp_unitcell)), ( new_unitcell, max_trunc_error, ) diff --git a/varipeps/optimization/line_search.py b/varipeps/optimization/line_search.py index 67b21e6..bf5624d 100644 --- a/varipeps/optimization/line_search.py +++ b/varipeps/optimization/line_search.py @@ -1,3 +1,5 @@ +import enum + from tqdm_loggable.auto import tqdm import jax.numpy as jnp @@ -40,6 +42,46 @@ def _line_search_new_tensors(peps_tensors, descent_dir, alpha): return [peps_tensors[i] + alpha * descent_dir[i] for i in range(len(peps_tensors))] +def _get_new_unitcell( + new_tensors, + unitcell, + spiral_indices, + convert_to_unitcell_func, + generate_unitcell, + reinitialize_env_as_identities, +): + if spiral_indices is not None: + for i in spiral_indices: + if ( + varipeps_config.spiral_wavevector_type + is Wavevector_Type.TWO_PI_POSITIVE_ONLY + ): + new_tensors[i] = new_tensors[i] % 2 + elif ( + varipeps_config.spiral_wavevector_type + is Wavevector_Type.TWO_PI_SYMMETRIC + ): + new_tensors[i] = new_tensors[i] % 4 - 2 + else: + raise ValueError("Unknown wavevector type!") + + if convert_to_unitcell_func is None or generate_unitcell: + unitcell_tensors = unitcell.get_unique_tensors() + new_unitcell = unitcell.replace_unique_tensors( + [ + unitcell_tensors[i].replace_tensor( + new_tensors[i], + reinitialize_env_as_identities=reinitialize_env_as_identities, + ) + for i in range(unitcell.get_len_unique_tensors()) + ] + ) + else: + new_unitcell = None + + return new_tensors, new_unitcell + + @jit def _armijo_value(current_val, descent_dir, gradient, alpha, const_factor): descent_dir_real, _ = ravel_pytree(descent_dir) @@ -131,6 +173,103 @@ def _wolfe_new_alpha( ) +@jit +def _hager_zhang_initial_zero(input_tensors, gradient, config): + input_tensors_real, _ = ravel_pytree(input_tensors) + gradient_real, _ = ravel_pytree(gradient) + + if jnp.iscomplexobj(input_tensors_real): + input_tensors_real = jnp.concatenate( + (jnp.real(input_tensors_real), jnp.imag(input_tensors_real)) + ) + gradient_real = jnp.concatenate( + (jnp.real(gradient_real), jnp.imag(gradient_real)) + ) + + result = config.line_search_hager_zhang_psi_0 + result *= jnp.linalg.norm(input_tensors_real, ord=jnp.inf) + result /= jnp.linalg.norm(gradient_real, ord=jnp.inf) + + result = jnp.where(result == 0, config.line_search_initial_step_size, result) + + return result + + +class _Hager_Zhang_Initial_State(enum.Enum): + NOT_FOUND = enum.auto() + FOUND = enum.auto() + SCALAR_LOWER_VALUE_GREATER = enum.auto() + + +class _Hager_Zhang_State(enum.Enum): + NONE = enum.auto() + UPDATE = enum.auto() + UPDATE_INNER = enum.auto() + + +@jit +def _hager_zhang_initial_quad_step_inner( + old_value, new_value, gradient, descent_direction, alpha, fallback_alpha +): + g_d_term = _scalar_descent_grad(descent_direction, gradient) + + sum_term = old_value + alpha * g_d_term + sum_term -= new_value + + alpha = jnp.where( + sum_term < 0, alpha**2 * g_d_term / (2 * sum_term), fallback_alpha + ) + + return alpha + + +def _hager_zhang_initial_quad_step( + input_tensors, + unitcell, + gradient, + descent_direction, + old_alpha, + old_value, + spiral_indices, + convert_to_unitcell_func, + generate_unitcell, + expectation_func, + additional_input, + reinitialize_env_as_identities, + enforce_elementwise_convergence, +): + alpha = varipeps_config.line_search_hager_zhang_psi_1 * old_alpha + + new_tensors = _line_search_new_tensors(input_tensors, descent_direction, alpha) + new_tensors, new_unitcell = _get_new_unitcell( + new_tensors, + unitcell, + spiral_indices, + convert_to_unitcell_func, + generate_unitcell, + reinitialize_env_as_identities, + ) + + new_value, (new_unitcell, _) = calc_ctmrg_expectation( + new_tensors, + new_unitcell, + expectation_func, + convert_to_unitcell_func, + additional_input, + enforce_elementwise_convergence=enforce_elementwise_convergence, + ) + + fallback_alpha = varipeps_config.line_search_hager_zhang_psi_2 * old_alpha + + return jnp.where( + new_value <= old_value, + _hager_zhang_initial_quad_step_inner( + old_value, new_value, gradient, descent_direction, alpha, fallback_alpha + ), + fallback_alpha, + ) + + class NoSuitableStepSizeError(Exception): pass @@ -142,7 +281,7 @@ def line_search( gradient: jnp.ndarray, descent_direction: jnp.ndarray, current_value: Union[float, jnp.ndarray], - last_step_size: Union[float, jnp.ndarray], + last_step_size: Optional[Union[float, jnp.ndarray]] = None, convert_to_unitcell_func: Optional[Map_To_PEPS_Model] = None, generate_unitcell: bool = False, spiral_indices: Optional[Sequence[int]] = None, @@ -196,11 +335,6 @@ def line_search( :obj:`RuntimeError`: The line search does not converge. """ - alpha = ( - last_step_size - if last_step_size is not None and varipeps_config.line_search_use_last_step_size - else varipeps_config.line_search_initial_step_size - ) has_been_increased = False incrementation_not_helped = False enforce_elementwise_convergence = ( @@ -208,11 +342,56 @@ def line_search( or varipeps_config.ad_use_custom_vjp ) + if varipeps_config.line_search_method is Line_Search_Methods.HAGERZHANG: + if last_step_size is None: + alpha = _hager_zhang_initial_zero(input_tensors, gradient, varipeps_config) + elif varipeps_config.line_search_hager_zhang_quad_step: + try: + alpha = _hager_zhang_initial_quad_step( + input_tensors, + unitcell, + gradient, + descent_direction, + last_step_size, + current_value, + spiral_indices, + convert_to_unitcell_func, + generate_unitcell, + expectation_func, + additional_input, + reinitialize_env_as_identities, + enforce_elementwise_convergence, + ) + except CTMRGNotConvergedError: + alpha = varipeps_config.line_search_hager_zhang_psi_2 * last_step_size + else: + alpha = varipeps_config.line_search_hager_zhang_psi_2 * last_step_size + else: + alpha = ( + last_step_size + if last_step_size is not None + and varipeps_config.line_search_use_last_step_size + else varipeps_config.line_search_initial_step_size + ) + wolfe_upper_bound = None wolfe_lower_bound = None wolfe_alpha_last_step = 0 wolfe_descent_new_grad = _scalar_descent_grad(descent_direction, gradient) + hager_zhang_lower_bound = 0 + hager_zhang_lower_bound_value = current_value + hager_zhang_lower_bound_grad = gradient + hager_zhang_lower_bound_des_grad = wolfe_descent_new_grad + hager_zhang_upper_bound = alpha + hager_zhang_upper_bound_value = None + hager_zhang_upper_bound_grad = None + hager_zhang_upper_bound_des_grad = None + hager_zhang_alpha_last_step = 0 + hager_zhang_initial_found = _Hager_Zhang_Initial_State.NOT_FOUND + hager_zhang_descent_grad = wolfe_descent_new_grad + hager_zhang_state = _Hager_Zhang_State.NONE + new_value = current_value tmp_value = None @@ -232,34 +411,14 @@ def line_search( while count < varipeps_config.line_search_max_steps: new_tensors = _line_search_new_tensors(input_tensors, descent_direction, alpha) - if spiral_indices is not None: - for i in spiral_indices: - if ( - varipeps_config.spiral_wavevector_type - is Wavevector_Type.TWO_PI_POSITIVE_ONLY - ): - new_tensors[i] = new_tensors[i] % 2 - elif ( - varipeps_config.spiral_wavevector_type - is Wavevector_Type.TWO_PI_SYMMETRIC - ): - new_tensors[i] = new_tensors[i] % 4 - 2 - else: - raise ValueError("Unknown wavevector type!") - - if convert_to_unitcell_func is None or generate_unitcell: - unitcell_tensors = unitcell.get_unique_tensors() - new_unitcell = unitcell.replace_unique_tensors( - [ - unitcell_tensors[i].replace_tensor( - new_tensors[i], - reinitialize_env_as_identities=reinitialize_env_as_identities, - ) - for i in range(unitcell.get_len_unique_tensors()) - ] - ) - else: - new_unitcell = None + new_tensors, new_unitcell = _get_new_unitcell( + new_tensors, + unitcell, + spiral_indices, + convert_to_unitcell_func, + generate_unitcell, + reinitialize_env_as_identities, + ) if ( varipeps_config.line_search_method is Line_Search_Methods.SIMPLE @@ -335,7 +494,10 @@ def line_search( signal_reset_descent_dir = True except CTMRGNotConvergedError: new_value = jnp.inf - elif varipeps_config.line_search_method is Line_Search_Methods.WOLFE: + elif ( + varipeps_config.line_search_method is Line_Search_Methods.WOLFE + or varipeps_config.line_search_method is Line_Search_Methods.HAGERZHANG + ): wolfe_value_last_step = new_value try: @@ -428,6 +590,164 @@ def line_search( else: raise ValueError("Unknown line search method.") + if varipeps_config.line_search_method is Line_Search_Methods.HAGERZHANG: + descent_new_grad = _scalar_descent_grad(descent_direction, new_gradient) + + hz_wolfe_1_left = ( + varipeps_config.line_search_hager_zhang_delta * hager_zhang_descent_grad + ) + hz_wolfe_1_right = (new_value - current_value) / alpha + + hz_wolfe_2_right = ( + varipeps_config.line_search_hager_zhang_sigma * hager_zhang_descent_grad + ) + + if descent_new_grad >= hz_wolfe_2_right: + if hz_wolfe_1_left >= hz_wolfe_1_right and new_value <= ( + current_value + varipeps_config.line_search_hager_zhang_eps + ): + break + + hz_approx_wolfe_left = ( + 2 * varipeps_config.line_search_hager_zhang_delta - 1 + ) * hager_zhang_descent_grad + + if hz_approx_wolfe_left >= hager_zhang_descent_grad and new_value <= ( + current_value + varipeps_config.line_search_hager_zhang_eps + ): + break + + if ( + varipeps_config.line_search_method is Line_Search_Methods.HAGERZHANG + and hager_zhang_initial_found is not _Hager_Zhang_Initial_State.FOUND + ): + if ( + hager_zhang_initial_found + is _Hager_Zhang_Initial_State.SCALAR_LOWER_VALUE_GREATER + ): + if descent_new_grad >= 0: + hager_zhang_upper_bound = alpha + hager_zhang_upper_bound_value = new_value + hager_zhang_upper_bound_grad = new_gradient + hager_zhang_upper_bound_des_grad = descent_new_grad + hager_zhang_initial_found = _Hager_Zhang_Initial_State.FOUND + elif new_value <= ( + current_value + varipeps_config.line_search_hager_zhang_eps + ): + hager_zhang_lower_bound = alpha + hager_zhang_lower_bound_value = new_value + hager_zhang_lower_bound_grad = new_gradient + hager_zhang_lower_bound_des_grad = descent_new_grad + alpha = ( + (1 - varipeps_config.line_search_hager_zhang_theta) + * hager_zhang_lower_bound + + varipeps_config.line_search_hager_zhang_theta + * hager_zhang_upper_bound + ) + + if tmp_value is not None: + current_value, unitcell, gradient, descent_direction = ( + tmp_value, + tmp_unitcell, + tmp_gradient, + tmp_descent_direction, + ) + tmp_value, tmp_unitcell, tmp_gradient, tmp_descent_direction = ( + None, + None, + None, + None, + ) + signal_reset_descent_dir = False + + count += 1 + continue + else: + hager_zhang_upper_bound = alpha + hager_zhang_upper_bound_value = new_value + hager_zhang_upper_bound_grad = new_gradient + hager_zhang_upper_bound_des_grad = descent_new_grad + alpha = ( + (1 - varipeps_config.line_search_hager_zhang_theta) + * hager_zhang_lower_bound + + varipeps_config.line_search_hager_zhang_theta + * hager_zhang_upper_bound + ) + + if tmp_value is not None: + current_value, unitcell, gradient, descent_direction = ( + tmp_value, + tmp_unitcell, + tmp_gradient, + tmp_descent_direction, + ) + tmp_value, tmp_unitcell, tmp_gradient, tmp_descent_direction = ( + None, + None, + None, + None, + ) + signal_reset_descent_dir = False + count += 1 + continue + elif descent_new_grad >= 0: + hager_zhang_upper_bound = alpha + hager_zhang_upper_bound_value = new_value + hager_zhang_upper_bound_grad = new_gradient + hager_zhang_upper_bound_des_grad = descent_new_grad + hager_zhang_initial_found = _Hager_Zhang_Initial_State.FOUND + elif descent_new_grad < 0 and new_value > ( + current_value + varipeps_config.line_search_hager_zhang_eps + ): + alpha = varipeps_config.line_search_hager_zhang_theta * alpha + hager_zhang_initial_found = ( + _Hager_Zhang_Initial_State.SCALAR_LOWER_VALUE_GREATER + ) + + if tmp_value is not None: + current_value, unitcell, gradient, descent_direction = ( + tmp_value, + tmp_unitcell, + tmp_gradient, + tmp_descent_direction, + ) + tmp_value, tmp_unitcell, tmp_gradient, tmp_descent_direction = ( + None, + None, + None, + None, + ) + signal_reset_descent_dir = False + count += 1 + continue + else: + if new_value <= ( + current_value + varipeps_config.line_search_hager_zhang_eps + ): + hager_zhang_lower_bound = alpha + hager_zhang_lower_bound_value = new_value + hager_zhang_lower_bound_grad = new_gradient + hager_zhang_lower_bound_des_grad = descent_new_grad + + alpha *= varipeps_config.line_search_hager_zhang_rho + + if tmp_value is not None: + current_value, unitcell, gradient, descent_direction = ( + tmp_value, + tmp_unitcell, + tmp_gradient, + tmp_descent_direction, + ) + tmp_value, tmp_unitcell, tmp_gradient, tmp_descent_direction = ( + None, + None, + None, + None, + ) + signal_reset_descent_dir = False + count += 1 + continue + if varipeps_config.line_search_method is Line_Search_Methods.SIMPLE: smaller_value_found = ( new_value <= current_value or (new_value - current_value) <= 1e-13 @@ -560,20 +880,235 @@ def line_search( jnp.fmax(wolfe_lower_bound, wolfe_upper_bound), ) wolfe_alpha_last_step = tmp_alpha + elif varipeps_config.line_search_method is Line_Search_Methods.HAGERZHANG: + if hager_zhang_state is _Hager_Zhang_State.UPDATE: + if descent_new_grad >= 0: + hager_zhang_upper_bound = alpha + hager_zhang_upper_bound_value = new_value + hager_zhang_upper_bound_grad = new_gradient + hager_zhang_upper_bound_des_grad = descent_new_grad + hager_zhang_state = _Hager_Zhang_State.NONE + elif new_value <= ( + current_value + varipeps_config.line_search_hager_zhang_eps + ): + hager_zhang_lower_bound = alpha + hager_zhang_lower_bound_value = new_value + hager_zhang_lower_bound_grad = new_gradient + hager_zhang_lower_bound_des_grad = descent_new_grad + hager_zhang_state = _Hager_Zhang_State.NONE + else: + hager_zhang_upper_bound = alpha + hager_zhang_upper_bound_value = new_value + hager_zhang_upper_bound_grad = new_gradient + hager_zhang_upper_bound_des_grad = _scalar_descent_grad( + descent_direction, new_gradient + ) + alpha = ( + (1 - varipeps_config.line_search_hager_zhang_theta) + * hager_zhang_lower_bound + + varipeps_config.line_search_hager_zhang_theta + * hager_zhang_upper_bound + ) + hager_zhang_state = _Hager_Zhang_State.UPDATE_INNER - if tmp_value is not None: - current_value = tmp_value - tmp_value = None + if tmp_value is not None: + current_value, unitcell, gradient, descent_direction = ( + tmp_value, + tmp_unitcell, + tmp_gradient, + tmp_descent_direction, + ) + tmp_value, tmp_unitcell, tmp_gradient, tmp_descent_direction = ( + None, + None, + None, + None, + ) + signal_reset_descent_dir = False + count += 1 + continue + elif hager_zhang_state is _Hager_Zhang_State.UPDATE_INNER: + if descent_new_grad >= 0: + hager_zhang_upper_bound = alpha + hager_zhang_upper_bound_value = new_value + hager_zhang_upper_bound_grad = new_gradient + hager_zhang_upper_bound_des_grad = descent_new_grad + hager_zhang_state = _Hager_Zhang_State.NONE + elif new_value <= ( + current_value + varipeps_config.line_search_hager_zhang_eps + ): + hager_zhang_lower_bound = alpha + hager_zhang_lower_bound_value = new_value + hager_zhang_lower_bound_grad = new_gradient + hager_zhang_lower_bound_des_grad = descent_new_grad + alpha = ( + (1 - varipeps_config.line_search_hager_zhang_theta) + * hager_zhang_lower_bound + + varipeps_config.line_search_hager_zhang_theta + * hager_zhang_upper_bound + ) + + if tmp_value is not None: + current_value, unitcell, gradient, descent_direction = ( + tmp_value, + tmp_unitcell, + tmp_gradient, + tmp_descent_direction, + ) + tmp_value, tmp_unitcell, tmp_gradient, tmp_descent_direction = ( + None, + None, + None, + None, + ) + signal_reset_descent_dir = False + count += 1 + continue + else: + hager_zhang_upper_bound = alpha + hager_zhang_upper_bound_value = new_value + hager_zhang_upper_bound_grad = new_gradient + hager_zhang_upper_bound_des_grad = _scalar_descent_grad( + descent_direction, new_gradient + ) + alpha = ( + (1 - varipeps_config.line_search_hager_zhang_theta) + * hager_zhang_lower_bound + + varipeps_config.line_search_hager_zhang_theta + * hager_zhang_upper_bound + ) + + if tmp_value is not None: + current_value, unitcell, gradient, descent_direction = ( + tmp_value, + tmp_unitcell, + tmp_gradient, + tmp_descent_direction, + ) + tmp_value, tmp_unitcell, tmp_gradient, tmp_descent_direction = ( + None, + None, + None, + None, + ) + signal_reset_descent_dir = False + count += 1 + continue + else: + alpha = hager_zhang_lower_bound * hager_zhang_upper_bound_des_grad + alpha -= hager_zhang_upper_bound * hager_zhang_lower_bound_des_grad + alpha /= ( + hager_zhang_upper_bound_des_grad - hager_zhang_lower_bound_des_grad + ) + + hz_secant_alpha = alpha - unitcell = tmp_unitcell - tmp_unitcell = None + hz_secant_lower = hager_zhang_lower_bound + hz_secant_lower_value = hager_zhang_lower_bound_value + hz_secant_lower_grad = hager_zhang_lower_bound_grad + hz_secant_lower_des_grad = hager_zhang_lower_bound_des_grad - gradient = tmp_gradient - tmp_gradient = None + hz_secant_upper = hager_zhang_upper_bound + hz_secant_upper_value = hager_zhang_upper_bound_value + hz_secant_upper_grad = hager_zhang_upper_bound_grad + hz_secant_upper_des_grad = hager_zhang_upper_bound_des_grad - descent_direction = tmp_descent_direction - tmp_descent_direction = None + if hager_zhang_lower_bound < alpha < hager_zhang_upper_bound: + hager_zhang_state = _Hager_Zhang_State.UPDATE + if tmp_value is not None: + current_value, unitcell, gradient, descent_direction = ( + tmp_value, + tmp_unitcell, + tmp_gradient, + tmp_descent_direction, + ) + tmp_value, tmp_unitcell, tmp_gradient, tmp_descent_direction = ( + None, + None, + None, + None, + ) + signal_reset_descent_dir = False + count += 1 + continue + + if hz_secant_alpha is not None and ( + hz_secant_alpha == hager_zhang_lower_bound + or hz_secant_alpha == hager_zhang_upper_bound + ): + if hz_secant_alpha == hager_zhang_lower_bound: + alpha = hz_secant_lower * hager_zhang_lower_bound_des_grad + alpha -= hager_zhang_lower_bound * hz_secant_lower_des_grad + alpha /= hager_zhang_lower_bound_des_grad - hz_secant_lower_des_grad + else: + alpha = hz_secant_upper * hager_zhang_upper_bound_des_grad + alpha -= hager_zhang_upper_bound * hz_secant_upper_des_grad + alpha /= hager_zhang_upper_bound_des_grad - hz_secant_upper_des_grad + + hz_secant_alpha = None + + if hager_zhang_lower_bound < alpha < hager_zhang_upper_bound: + hager_zhang_state = _Hager_Zhang_State.UPDATE + + if tmp_value is not None: + current_value, unitcell, gradient, descent_direction = ( + tmp_value, + tmp_unitcell, + tmp_gradient, + tmp_descent_direction, + ) + tmp_value, tmp_unitcell, tmp_gradient, tmp_descent_direction = ( + None, + None, + None, + None, + ) + signal_reset_descent_dir = False + count += 1 + continue + hz_secant_alpha = None + + if hz_secant_lower is not None and ( + (hager_zhang_upper_bound - hager_zhang_lower_bound) + > varipeps_config.line_search_hager_zhang_gamma + * (hz_secant_upper - hz_secant_lower) + ): + alpha = (hager_zhang_lower_bound + hager_zhang_upper_bound) / 2 + hz_secant_lower = None + hager_zhang_state = _Hager_Zhang_State.UPDATE + + if tmp_value is not None: + current_value, unitcell, gradient, descent_direction = ( + tmp_value, + tmp_unitcell, + tmp_gradient, + tmp_descent_direction, + ) + tmp_value, tmp_unitcell, tmp_gradient, tmp_descent_direction = ( + None, + None, + None, + None, + ) + signal_reset_descent_dir = False + count += 1 + continue + hz_secant_lower = None + + if tmp_value is not None: + current_value, unitcell, gradient, descent_direction = ( + tmp_value, + tmp_unitcell, + tmp_gradient, + tmp_descent_direction, + ) + tmp_value, tmp_unitcell, tmp_gradient, tmp_descent_direction = ( + None, + None, + None, + None, + ) signal_reset_descent_dir = False count += 1 diff --git a/varipeps/optimization/optimizer.py b/varipeps/optimization/optimizer.py index 7926617..f17f7b8 100644 --- a/varipeps/optimization/optimizer.py +++ b/varipeps/optimization/optimizer.py @@ -2,6 +2,7 @@ from collections import deque from functools import partial from os import PathLike +import time from scipy.optimize import OptimizeResult @@ -11,6 +12,7 @@ import jax.numpy as jnp from jax.lax import scan from jax.flatten_util import ravel_pytree +from jax.util import safe_zip from varipeps import varipeps_config, varipeps_global_state from varipeps.config import Optimizing_Methods @@ -209,11 +211,12 @@ def _autosave_wrapper( step_energies, step_chi, step_conv, + step_runtime, spiral_indices, additional_input, ): auxiliary_data = { - "best_run": best_run if best_run is not None else 0, + "best_run": jnp.array(best_run if best_run is not None else 0), "current_energy": working_value, } @@ -222,17 +225,45 @@ def _autosave_wrapper( auxiliary_data[f"step_energies_{k:d}"] = step_energies[k] auxiliary_data[f"step_chi_{k:d}"] = step_chi[k] auxiliary_data[f"step_conv_{k:d}"] = step_conv[k] + auxiliary_data[f"step_runtime_{k:d}"] = step_runtime[k] + spiral_vectors = None if spiral_indices is not None: - for spiral_i in spiral_indices: - auxiliary_data[f"spiral_vector_{spiral_i:d}"] = working_tensors[spiral_i] + spiral_vectors = [working_tensors[spiral_i] for spiral_i in spiral_indices] + + if any(i.size == 1 for i in spiral_vectors): + spiral_vectors_x = additional_input.get("spiral_vectors_x") + spiral_vectors_y = additional_input.get("spiral_vectors_y") + if spiral_vectors_x is not None: + if isinstance(spiral_vectors_x, jnp.ndarray): + spiral_vectors_x = (spiral_vectors_x,) + spiral_vectors = tuple( + jnp.array((sx, sy)) + for sx, sy in safe_zip(spiral_vectors_x, spiral_vectors) + ) + elif spiral_vectors_y is not None: + if isinstance(spiral_vectors_y, jnp.ndarray): + spiral_vectors_y = (spiral_vectors_y,) + spiral_vectors = tuple( + jnp.array((sx, sy)) + for sx, sy in safe_zip(spiral_vectors, spiral_vectors_y) + ) elif additional_input.get("spiral_vectors") is not None: - add_input_spiral = additional_input.get("spiral_vectors") - if isinstance(add_input_spiral, jnp.ndarray): - add_input_spiral = (add_input_spiral,) - for spiral_i, elem in enumerate(add_input_spiral): - spiral_i += 1 - auxiliary_data[f"spiral_vector_{spiral_i:d}"] = elem + spiral_vectors = additional_input.get("spiral_vectors") + if isinstance(spiral_vectors, jnp.ndarray): + spiral_vectors = (spiral_vectors,) + + if spiral_vectors is not None: + spiral_vectors = [ + e if e.size == 2 else jnp.array((e, e)).reshape(2) for e in spiral_vectors + ] + + if len(spiral_vectors) == 1: + auxiliary_data["spiral_vector"] = spiral_vectors[0] + else: + for spiral_i, vec in enumerate(spiral_vectors): + spiral_i += 1 + auxiliary_data[f"spiral_vector_{spiral_i:d}"] = vec autosave_func( autosave_filename, @@ -354,14 +385,13 @@ def random_noise(a): l_bfgs_grad_cache = deque(maxlen=varipeps_config.optimizer_l_bfgs_maxlen + 1) count = 0 - linesearch_step: Union[float, jnp.ndarray] = ( - varipeps_config.line_search_initial_step_size - ) + linesearch_step: Optional[Union[float, jnp.ndarray]] = None working_value: Union[float, jnp.ndarray] max_trunc_error_list = {random_noise_retries: []} step_energies = {random_noise_retries: []} step_chi = {random_noise_retries: []} step_conv = {random_noise_retries: []} + step_runtime = {random_noise_retries: []} if ( varipeps_config.optimizer_preconverge_with_half_projectors @@ -373,6 +403,8 @@ def random_noise(a): with tqdm(desc="Optimizing PEPS state") as pbar: while count < varipeps_config.optimizer_max_steps: + runtime_start = time.perf_counter() + try: if varipeps_config.ad_use_custom_vjp: ( @@ -400,15 +432,71 @@ def random_noise(a): except (CTMRGNotConvergedError, CTMRGGradientNotConvergedError) as e: varipeps_global_state.ctmrg_projector_method = None - return OptimizeResult( - success=False, - message=str(type(e)), - x=working_tensors, - fun=working_value, - unitcell=working_unitcell, - nit=count, - max_trunc_error_list=max_trunc_error_list, - ) + if random_noise_retries == 0: + return OptimizeResult( + success=False, + message=str(type(e)), + x=working_tensors, + fun=working_value, + unitcell=working_unitcell, + nit=count, + max_trunc_error_list=max_trunc_error_list, + step_energies=step_energies, + step_chi=step_chi, + step_conv=step_conv, + step_runtime=step_runtime, + best_run=0, + ) + elif ( + random_noise_retries + >= varipeps_config.optimizer_random_noise_max_retries + ): + working_value = jnp.inf + break + else: + if isinstance(input_tensors, PEPS_Unit_Cell) or ( + isinstance(input_tensors, collections.abc.Sequence) + and isinstance(input_tensors[0], PEPS_Unit_Cell) + ): + working_tensors = ( + cast( + List[jnp.ndarray], + [i.tensor for i in best_unitcell.get_unique_tensors()], + ) + + best_tensors[best_unitcell.get_len_unique_tensors() :] + ) + + working_tensors = [random_noise(i) for i in working_tensors] + + working_tensors_obj = [ + e.replace_tensor(working_tensors[i]) + for i, e in enumerate(best_unitcell.get_unique_tensors()) + ] + + working_unitcell = best_unitcell.replace_unique_tensors( + working_tensors_obj + ) + else: + working_tensors = [random_noise(i) for i in best_tensors] + working_unitcell = None + + descent_dir = None + working_gradient = None + signal_reset_descent_dir = True + count = 0 + random_noise_retries += 1 + old_descent_dir = descent_dir + old_gradient = working_gradient + + step_energies[random_noise_retries] = [] + step_chi[random_noise_retries] = [] + step_conv[random_noise_retries] = [] + max_trunc_error_list[random_noise_retries] = [] + + pbar.reset() + pbar.refresh() + + continue working_gradient = [elem.conj() for elem in working_gradient_seq] @@ -496,6 +584,9 @@ def random_noise(a): conv > varipeps_config.optimizer_reuse_env_eps, ) except NoSuitableStepSizeError: + runtime = time.perf_counter() - runtime_start + step_runtime[random_noise_retries].append(runtime) + if varipeps_config.optimizer_fail_if_no_step_size_found: raise else: @@ -506,6 +597,12 @@ def random_noise(a): ) and random_noise_retries < varipeps_config.optimizer_random_noise_max_retries + and not ( + varipeps_config.optimizer_preconverge_with_half_projectors + and not varipeps_global_state.basinhopping_disable_half_projector + and varipeps_global_state.ctmrg_projector_method + is Projector_Method.HALF + ) ): tqdm.write( "Convergence is not sufficient. Retry with some random noise on best result." @@ -529,6 +626,7 @@ def random_noise(a): step_energies, step_chi, step_conv, + step_runtime, spiral_indices, additional_input, ) @@ -567,45 +665,37 @@ def random_noise(a): descent_dir = None working_gradient = None signal_reset_descent_dir = True - count = -1 + count = 0 random_noise_retries += 1 + old_descent_dir = descent_dir + old_gradient = working_gradient step_energies[random_noise_retries] = [] step_chi[random_noise_retries] = [] step_conv[random_noise_retries] = [] max_trunc_error_list[random_noise_retries] = [] + step_runtime[random_noise_retries] = [] pbar.reset() pbar.refresh() + + continue else: conv = 0 else: + runtime = time.perf_counter() - runtime_start + step_runtime[random_noise_retries].append(runtime) max_trunc_error_list[random_noise_retries].append(max_trunc_error) step_energies[random_noise_retries].append(working_value) step_chi[random_noise_retries].append( working_unitcell.get_unique_tensors()[0].chi ) - if conv < varipeps_config.optimizer_convergence_eps: - working_value, ( - working_unitcell, - max_trunc_error, - ) = calc_ctmrg_expectation( - working_tensors, - working_unitcell, - expectation_func, - convert_to_unitcell_func, - additional_input, - enforce_elementwise_convergence=varipeps_config.ad_use_custom_vjp, - ) - varipeps_global_state.ctmrg_projector_method = None - max_trunc_error_list[random_noise_retries][-1] = max_trunc_error - step_energies[random_noise_retries][-1] = working_value - break - if ( varipeps_config.optimizer_preconverge_with_half_projectors and not varipeps_global_state.basinhopping_disable_half_projector + and varipeps_global_state.ctmrg_projector_method + is Projector_Method.HALF and conv < varipeps_config.optimizer_preconverge_with_half_projectors_eps ): @@ -613,7 +703,27 @@ def random_noise(a): varipeps_config.ctmrg_full_projector_method ) - working_value, working_unitcell, _ = calc_ctmrg_expectation( + working_value, (working_unitcell, max_trunc_error) = ( + calc_ctmrg_expectation( + working_tensors, + working_unitcell, + expectation_func, + convert_to_unitcell_func, + additional_input, + enforce_elementwise_convergence=varipeps_config.ad_use_custom_vjp, + ) + ) + descent_dir = None + working_gradient = None + signal_reset_descent_dir = True + conv = jnp.inf + linesearch_step = None + + if conv < varipeps_config.optimizer_convergence_eps: + working_value, ( + working_unitcell, + max_trunc_error, + ) = calc_ctmrg_expectation( working_tensors, working_unitcell, expectation_func, @@ -621,9 +731,18 @@ def random_noise(a): additional_input, enforce_elementwise_convergence=varipeps_config.ad_use_custom_vjp, ) - descent_dir = None - working_gradient = None - signal_reset_descent_dir = True + + try: + max_trunc_error_list[random_noise_retries][-1] = max_trunc_error + except IndexError: + max_trunc_error_list[random_noise_retries].append(max_trunc_error) + + try: + step_energies[random_noise_retries][-1] = working_value + except IndexError: + step_energies[random_noise_retries].append(working_value) + + break old_descent_dir = descent_dir old_gradient = working_gradient @@ -636,7 +755,11 @@ def random_noise(a): "Energy": f"{working_value:0.10f}", "Retries": random_noise_retries, "Convergence": f"{conv:0.8f}", - "Line search step": f"{linesearch_step:0.8f}", + "Line search step": ( + f"{linesearch_step:0.8f}" + if linesearch_step is not None + else "0" + ), "Max. trunc. err.": f"{max_trunc_error:0.8g}", } ) @@ -655,31 +778,74 @@ def random_noise(a): step_energies, step_chi, step_conv, + step_runtime, spiral_indices, additional_input, ) + if working_value < best_value and not ( + varipeps_config.optimizer_preconverge_with_half_projectors + and not varipeps_global_state.basinhopping_disable_half_projector + and varipeps_global_state.ctmrg_projector_method + is Projector_Method.HALF + ): + _autosave_wrapper( + autosave_func, + autosave_filename, + working_tensors, + working_unitcell, + working_value, + "best", + random_noise_retries, + max_trunc_error_list, + step_energies, + step_chi, + step_conv, + step_runtime, + spiral_indices, + additional_input, + ) + + if working_value < best_value and not ( + varipeps_config.optimizer_preconverge_with_half_projectors + and not varipeps_global_state.basinhopping_disable_half_projector + and varipeps_global_state.ctmrg_projector_method + is Projector_Method.HALF + ): + best_value = working_value + best_tensors = working_tensors + best_unitcell = working_unitcell + best_run = random_noise_retries + if working_value < best_value: best_value = working_value best_tensors = working_tensors best_unitcell = working_unitcell best_run = random_noise_retries - _autosave_wrapper( - autosave_func, - autosave_filename, - working_tensors, - working_unitcell, - working_value, - "best", - best_run, - max_trunc_error_list, - step_energies, - step_chi, - step_conv, - spiral_indices, - additional_input, - ) + if not ( + varipeps_config.optimizer_preconverge_with_half_projectors + and not varipeps_global_state.basinhopping_disable_half_projector + and varipeps_global_state.ctmrg_projector_method is Projector_Method.HALF + ): + _autosave_wrapper( + autosave_func, + autosave_filename, + working_tensors, + working_unitcell, + working_value, + "best", + best_run, + max_trunc_error_list, + step_energies, + step_chi, + step_conv, + step_runtime, + spiral_indices, + additional_input, + ) + + varipeps_global_state.ctmrg_projector_method = None print(f"Best energy result found: {best_value}") @@ -693,5 +859,6 @@ def random_noise(a): step_energies=step_energies, step_chi=step_chi, step_conv=step_conv, + step_runtime=step_runtime, best_run=best_run, ) diff --git a/varipeps/peps/__init__.py b/varipeps/peps/__init__.py index 4ab0d7c..fcdbfdf 100644 --- a/varipeps/peps/__init__.py +++ b/varipeps/peps/__init__.py @@ -1,4 +1,8 @@ from . import tensor from . import unitcell -from .tensor import PEPS_Tensor, PEPS_Tensor_Structure_Factor +from .tensor import ( + PEPS_Tensor, + PEPS_Tensor_Structure_Factor, + PEPS_Tensor_Split_Transfer, +) from .unitcell import PEPS_Unit_Cell diff --git a/varipeps/peps/tensor.py b/varipeps/peps/tensor.py index 2d570db..0ed7f9c 100644 --- a/varipeps/peps/tensor.py +++ b/varipeps/peps/tensor.py @@ -14,15 +14,19 @@ import h5py from varipeps.utils.random import PEPS_Random_Number_Generator +from varipeps.utils.svd import gauge_fixed_svd import typing from typing import TypeVar, Type, Union, Optional, Sequence, Tuple, Any from varipeps.typing import Tensor, is_tensor T_PEPS_Tensor = TypeVar("T_PEPS_Tensor", bound="PEPS_Tensor") +T_PEPS_Tensor_Split_Transfer = TypeVar( + "T_PEPS_Tensor_Split_Transfer", bound="PEPS_Tensor_Split_Transfer" +) -@dataclass(frozen=True) +@dataclass @register_pytree_node_class class PEPS_Tensor: """ @@ -64,16 +68,16 @@ class PEPS_Tensor: C3: Tensor C4: Tensor - T1: Tensor - T2: Tensor - T3: Tensor - T4: Tensor - d: int D: Tuple[int, int, int, int] chi: int max_chi: int + T1: Tensor + T2: Tensor + T3: Tensor + T4: Tensor + sanity_checks: bool = True def __post_init__(self) -> None: @@ -124,6 +128,38 @@ def __post_init__(self) -> None: "At least one transfer tensors mismatch bond dimensions of PEPS tensor." ) + @property + def left_upper_transfer_shape(self) -> Tensor: + return self.T4.shape[3] + + @property + def left_lower_transfer_shape(self) -> Tensor: + return self.T4.shape[0] + + @property + def right_upper_transfer_shape(self) -> Tensor: + return self.T2.shape[3] + + @property + def right_lower_transfer_shape(self) -> Tensor: + return self.T2.shape[2] + + @property + def top_left_transfer_shape(self) -> Tensor: + return self.T1.shape[0] + + @property + def top_right_transfer_shape(self) -> Tensor: + return self.T1.shape[3] + + @property + def bottom_left_transfer_shape(self) -> Tensor: + return self.T3.shape[0] + + @property + def bottom_right_transfer_shape(self) -> Tensor: + return self.T3.shape[1] + @classmethod def from_tensor( cls: Type[T_PEPS_Tensor], @@ -399,6 +435,7 @@ def change_chi( new_chi: int, *, reinitialize_env_as_identities: bool = True, + reset_max_chi: bool = False, ) -> T_PEPS_Tensor: """ Change the environment bond dimension and returns new object of the class. @@ -409,11 +446,15 @@ def change_chi( Keyword args: reinitialize_env_as_identities (:obj:`bool`): Reinitialize the CTM tensors as identities if decreasing the dimension. + reset_max_chi (:obj:`bool`): + Set maximal bond dimension to the same new value. Returns: :obj:`~varipeps.peps.PEPS_Tensor`: New instance of the class with the increased value. """ - if new_chi > self.max_chi: + new_max_chi = new_chi if reset_max_chi else self.max_chi + + if new_chi > new_max_chi: raise ValueError( "Increase above the max value for environment bond dimension." ) @@ -440,7 +481,7 @@ def change_chi( d=self.d, D=self.D, chi=new_chi, - max_chi=self.max_chi, + max_chi=new_max_chi, ) else: return type(self)( @@ -456,7 +497,7 @@ def change_chi( d=self.d, D=self.D, chi=new_chi, - max_chi=self.max_chi, + max_chi=new_max_chi, ) def increase_max_chi( @@ -1064,6 +1105,36 @@ def load_from_group(cls: Type[T_PEPS_Tensor], grp: h5py.Group) -> T_PEPS_Tensor: max_chi=max_chi, ) + @property + def is_split_transfer(self: T_PEPS_Tensor) -> bool: + return False + + def convert_to_split_transfer( + self: T_PEPS_Tensor, interlayer_chi: Optional[int] = None + ) -> T_PEPS_Tensor_Split_Transfer: + if interlayer_chi is None: + interlayer_chi = self.chi + + return PEPS_Tensor_Split_Transfer( + tensor=self.tensor, + C1=self.C1, + C2=self.C2, + C3=self.C3, + C4=self.C4, + T1=self.T1, + T2=self.T2, + T3=self.T3, + T4=self.T4, + d=self.d, + D=self.D, + chi=self.chi, + max_chi=self.max_chi, + interlayer_chi=interlayer_chi, + ) + + def convert_to_full_transfer(self: T_PEPS_Tensor) -> T_PEPS_Tensor: + return self + def tree_flatten(self) -> Tuple[Tuple[Any, ...], Tuple[Any, ...]]: data = ( self.tensor, @@ -1105,7 +1176,7 @@ def tree_unflatten( ) -@dataclass(frozen=True) +@dataclass @register_pytree_node_class class PEPS_Tensor_Structure_Factor(PEPS_Tensor): """ @@ -1319,6 +1390,7 @@ def change_chi( new_chi: int, *, reinitialize_env_as_identities: bool = True, + reset_max_chi: bool = False, ) -> T_PEPS_Tensor: """ Change the environment bond dimension and returns new object of the class. @@ -1329,11 +1401,15 @@ def change_chi( Keyword args: reinitialize_env_as_identities (:obj:`bool`): Reinitialize the CTM tensors as identities if decreasing the dimension. + reset_max_chi (:obj:`bool`): + Set maximal bond dimension to the same new value. Returns: :obj:`~varipeps.peps.PEPS_Tensor`: New instance of the class with the increased value. """ - if new_chi > self.max_chi: + new_max_chi = new_chi if reset_max_chi else self.max_chi + + if new_chi > new_max_chi: raise ValueError( "Increase above the max value for environment bond dimension." ) @@ -1376,7 +1452,7 @@ def change_chi( d=self.d, D=self.D, chi=new_chi, - max_chi=self.max_chi, + max_chi=new_max_chi, ) else: return type(self)( @@ -1400,7 +1476,7 @@ def change_chi( d=self.d, D=self.D, chi=new_chi, - max_chi=self.max_chi, + max_chi=new_max_chi, ) def increase_max_chi( @@ -1838,3 +1914,972 @@ def tree_unflatten( max_chi=max_chi, sanity_checks=False, ) + + +@dataclass +@register_pytree_node_class +class PEPS_Tensor_Split_Transfer(PEPS_Tensor): + T1: Optional[Tensor] = None + T2: Optional[Tensor] = None + T3: Optional[Tensor] = None + T4: Optional[Tensor] = None + + T1_ket: Optional[Tensor] = None + T1_bra: Optional[Tensor] = None + T2_ket: Optional[Tensor] = None + T2_bra: Optional[Tensor] = None + T3_ket: Optional[Tensor] = None + T3_bra: Optional[Tensor] = None + T4_ket: Optional[Tensor] = None + T4_bra: Optional[Tensor] = None + + interlayer_chi: Optional[int] = None + + def __post_init__(self) -> None: + if any( + e is None + for e in ( + self.T1_ket, + self.T1_bra, + self.T2_ket, + self.T2_bra, + self.T3_ket, + self.T3_bra, + self.T4_ket, + self.T4_bra, + ) + ): + self._split_up_T1(self.T1) + self._split_up_T2(self.T2) + self._split_up_T3(self.T3) + self._split_up_T4(self.T4) + self.T1 = None + self.T2 = None + self.T3 = None + self.T4 = None + + if self.interlayer_chi is None: + self.interlayer_chi = self.chi + + if not self.sanity_checks: + return + + if not len(self.D) == 4: + raise ValueError( + "The bond dimension of the PEPS tensor has to be a tuple of four entries." + ) + + if ( + self.tensor.shape[0] != self.D[0] + or self.tensor.shape[1] != self.D[1] + or self.tensor.shape[3] != self.D[2] + or self.tensor.shape[4] != self.D[3] + ): + raise ValueError("Bond dimension sequence mismatches tensor.") + + # if not ( + # self.T1.shape[1] == self.T1.shape[2] == self.D[3] + # and self.T2.shape[0] == self.T2.shape[1] == self.D[2] + # and self.T3.shape[2] == self.T3.shape[3] == self.D[1] + # and self.T4.shape[1] == self.T4.shape[2] == self.D[0] + # ): + # raise ValueError( + # "At least one transfer tensors mismatch bond dimensions of PEPS tensor." + # ) + + @classmethod + def from_tensor( + cls: Type[T_PEPS_Tensor], + tensor: Tensor, + d: int, + D: Union[int, Sequence[int]], + chi: int, + interlayer_chi: Optional[int] = None, + max_chi: Optional[int] = None, + *, + ctm_tensors_are_identities: bool = True, + normalize: bool = True, + seed: Optional[int] = None, + backend: str = "jax", + ) -> T_PEPS_Tensor: + """ + Initialize a PEPS tensor object with a given tensor and new CTM tensors. + + Args: + tensor (:obj:`numpy.ndarray` or :obj:`jax.numpy.ndarray`): + PEPS tensor to initialize the object with + d (:obj:`int`): + Physical dimension + D (:obj:`int` or :term:`sequence` of :obj:`int`): + Bond dimensions for the PEPS tensor + chi (:obj:`int`): + Bond dimension for the environment tensors + interlayer_chi (:obj:`int`): + Bond dimension for the interlayer bonds of the environment tensors + max_chi (:obj:`int`): + Maximal allowed bond dimension for the environment tensors + Keyword args: + ctm_tensors_are_identities (:obj:`bool`, optional): + Flag if the CTM tensors are initialized as identities. Otherwise, + they are initialized randomly. Defaults to True. + normalize (:obj:`bool`, optional): + Flag if the generated tensors are normalized. Defaults to True. + seed (:obj:`int`, optional): + Seed for the random number generator. + backend (:obj:`str`, optional): + Backend for the generated tensors (may be ``jax`` or ``numpy``). + Defaults to ``jax``. + Returns: + PEPS_Tensor: + Instance of PEPS_Tensor with the randomly initialized tensors. + """ + if not is_tensor(tensor): + raise ValueError("Invalid argument for tensor.") + + if isinstance(D, int): + D = (D,) * 4 + elif isinstance(D, collections.abc.Sequence) and not isinstance(D, tuple): + D = tuple(D) + + if not all(isinstance(i, int) for i in D) or not len(D) == 4: + raise ValueError("Invalid argument for D.") + + if ( + tensor.shape[0] != D[0] + or tensor.shape[1] != D[1] + or tensor.shape[3] != D[2] + or tensor.shape[4] != D[3] + or tensor.shape[2] != d + ): + raise ValueError("Tensor dimensions mismatch the dimension arguments.") + + if interlayer_chi is None: + interlayer_chi = chi + if max_chi is None: + max_chi = chi + + dtype = tensor.dtype + + if ctm_tensors_are_identities: + C1 = jnp.ones((1, 1), dtype=dtype) + C2 = jnp.ones((1, 1), dtype=dtype) + C3 = jnp.ones((1, 1), dtype=dtype) + C4 = jnp.ones((1, 1), dtype=dtype) + + T1 = jnp.eye(D[3], dtype=dtype).reshape(1, D[3], D[3], 1) + T2 = jnp.eye(D[2], dtype=dtype).reshape(D[2], D[2], 1, 1) + T3 = jnp.eye(D[1], dtype=dtype).reshape(1, 1, D[1], D[1]) + T4 = jnp.eye(D[0], dtype=dtype).reshape(1, D[0], D[0], 1) + + return cls( + tensor=tensor, + C1=C1, + C2=C2, + C3=C3, + C4=C4, + T1=T1, + T2=T2, + T3=T3, + T4=T4, + d=d, + D=D, # type: ignore + chi=chi, + interlayer_chi=interlayer_chi, + max_chi=max_chi, + ) + else: + rng = PEPS_Random_Number_Generator.get_generator(seed, backend=backend) + + C1 = rng.block((chi, chi), dtype, normalize=normalize) + C2 = rng.block((chi, chi), dtype, normalize=normalize) + C3 = rng.block((chi, chi), dtype, normalize=normalize) + C4 = rng.block((chi, chi), dtype, normalize=normalize) + + T1_ket = rng.block((chi, D[3], interlayer_chi), dtype, normalize=normalize) + T1_bra = rng.block((interlayer_chi, D[3], chi), dtype, normalize=normalize) + T2_ket = rng.block((interlayer_chi, D[2], chi), dtype, normalize=normalize) + T2_bra = rng.block((chi, D[2], interlayer_chi), dtype, normalize=normalize) + T3_ket = rng.block((chi, D[1], interlayer_chi), dtype, normalize=normalize) + T3_bra = rng.block((interlayer_chi, D[1], chi), dtype, normalize=normalize) + T4_ket = rng.block((interlayer_chi, D[0], chi), dtype, normalize=normalize) + T4_bra = rng.block((chi, D[0], interlayer_chi), dtype, normalize=normalize) + + return cls( + tensor=tensor, + C1=C1, + C2=C2, + C3=C3, + C4=C4, + T1_ket=T1_ket, + T1_bra=T1_bra, + T2_ket=T2_ket, + T2_bra=T2_bra, + T3_ket=T3_ket, + T3_bra=T3_bra, + T4_ket=T4_ket, + T4_bra=T4_bra, + d=d, + D=D, # type: ignore + chi=chi, + interlayer_chi=interlayer_chi, + max_chi=max_chi, + ) + + @property + def left_upper_transfer_shape(self) -> Tensor: + return self.T4_ket.shape[2] + + @property + def left_lower_transfer_shape(self) -> Tensor: + return self.T4_bra.shape[0] + + @property + def right_upper_transfer_shape(self) -> Tensor: + return self.T2_ket.shape[2] + + @property + def right_lower_transfer_shape(self) -> Tensor: + return self.T2_bra.shape[0] + + @property + def top_left_transfer_shape(self) -> Tensor: + return self.T1_ket.shape[0] + + @property + def top_right_transfer_shape(self) -> Tensor: + return self.T1_bra.shape[2] + + @property + def bottom_left_transfer_shape(self) -> Tensor: + return self.T3_ket.shape[0] + + @property + def bottom_right_transfer_shape(self) -> Tensor: + return self.T3_bra.shape[2] + + def _split_up_T1(self, T1): + tmp_T1 = T1.reshape(T1.shape[0] * T1.shape[1], T1.shape[2] * T1.shape[3]) + + self.T1_ket, T1_S, self.T1_bra = gauge_fixed_svd(tmp_T1) + + self.T1_ket = self.T1_ket[:, : self.interlayer_chi] + T1_S = jnp.sqrt(T1_S[: self.interlayer_chi]) + self.T1_bra = self.T1_bra[: self.interlayer_chi, :] + + self.T1_ket = self.T1_ket * T1_S[jnp.newaxis, :] + self.T1_bra = T1_S[:, jnp.newaxis] * self.T1_bra + + self.T1_ket = self.T1_ket.reshape( + T1.shape[0], T1.shape[1], self.T1_ket.shape[1] + ) + self.T1_bra = self.T1_bra.reshape( + self.T1_bra.shape[0], T1.shape[2], T1.shape[3] + ) + + def _split_up_T2(self, T2): + tmp_T2 = T2.transpose(2, 1, 0, 3) + tmp_T2 = tmp_T2.reshape( + tmp_T2.shape[0] * tmp_T2.shape[1], tmp_T2.shape[2] * tmp_T2.shape[3] + ) + + self.T2_bra, T2_S, self.T2_ket = gauge_fixed_svd(tmp_T2) + + self.T2_bra = self.T2_bra[:, : self.interlayer_chi] + T2_S = jnp.sqrt(T2_S[: self.interlayer_chi]) + self.T2_ket = self.T2_ket[: self.interlayer_chi, :] + + self.T2_bra = self.T2_bra * T2_S[jnp.newaxis, :] + self.T2_ket = T2_S[:, jnp.newaxis] * self.T2_ket + + self.T2_bra = self.T2_bra.reshape( + T2.shape[2], T2.shape[1], self.T2_bra.shape[1] + ) + self.T2_ket = self.T2_ket.reshape( + self.T2_ket.shape[0], T2.shape[0], T2.shape[3] + ) + + def _split_up_T3(self, T3): + tmp_T3 = T3.transpose(0, 3, 2, 1) + tmp_T3 = tmp_T3.reshape( + tmp_T3.shape[0] * tmp_T3.shape[1], tmp_T3.shape[2] * tmp_T3.shape[3] + ) + + self.T3_ket, T3_S, self.T3_bra = gauge_fixed_svd(tmp_T3) + + self.T3_ket = self.T3_ket[:, : self.interlayer_chi] + T3_S = jnp.sqrt(T3_S[: self.interlayer_chi]) + self.T3_bra = self.T3_bra[: self.interlayer_chi, :] + + self.T3_ket = self.T3_ket * T3_S[jnp.newaxis, :] + self.T3_bra = T3_S[:, jnp.newaxis] * self.T3_bra + + self.T3_ket = self.T3_ket.reshape( + T3.shape[0], T3.shape[3], self.T3_ket.shape[1] + ) + self.T3_bra = self.T3_bra.reshape( + self.T3_bra.shape[0], T3.shape[2], T3.shape[1] + ) + + def _split_up_T4(self, T4): + tmp_T4 = T4.reshape(T4.shape[0] * T4.shape[1], T4.shape[2] * T4.shape[3]) + + self.T4_bra, T4_S, self.T4_ket = gauge_fixed_svd(tmp_T4) + + self.T4_bra = self.T4_bra[:, : self.interlayer_chi] + T4_S = jnp.sqrt(T4_S[: self.interlayer_chi]) + self.T4_ket = self.T4_ket[: self.interlayer_chi, :] + + self.T4_bra = self.T4_bra * T4_S[jnp.newaxis, :] + self.T4_ket = T4_S[:, jnp.newaxis] * self.T4_ket + + self.T4_bra = self.T4_bra.reshape( + T4.shape[0], T4.shape[1], self.T4_bra.shape[1] + ) + self.T4_ket = self.T4_ket.reshape( + self.T4_ket.shape[0], T4.shape[2], T4.shape[3] + ) + + def replace_tensor( + self: T_PEPS_Tensor_Split_Transfer, + new_tensor: Tensor, + *, + reinitialize_env_as_identities: bool = True, + ) -> T_PEPS_Tensor_Split_Transfer: + """ + Replace the PEPS tensor and returns new object of the class. + + Args: + new_tensor (:obj:`numpy.ndarray` or :obj:`jax.numpy.ndarray`): + New PEPS tensor. + Keyword args: + reinitialize_env_as_identities (:obj:`bool`): + Reinitialize the CTM tensors as identities. + Returns: + :obj:`~peps_ad.peps.PEPS_Tensor_Split_Transfer`: + New instance of the class with the tensor replaced. + """ + if reinitialize_env_as_identities: + return type(self)( + tensor=new_tensor, + C1=jnp.ones((1, 1), dtype=self.C1.dtype), + C2=jnp.ones((1, 1), dtype=self.C2.dtype), + C3=jnp.ones((1, 1), dtype=self.C3.dtype), + C4=jnp.ones((1, 1), dtype=self.C4.dtype), + T1=jnp.eye(self.D[3], dtype=self.T1_ket.dtype).reshape( + 1, self.D[3], self.D[3], 1 + ), + T2=jnp.eye(self.D[2], dtype=self.T2_ket.dtype).reshape( + self.D[2], self.D[2], 1, 1 + ), + T3=jnp.eye(self.D[1], dtype=self.T3_ket.dtype).reshape( + 1, 1, self.D[1], self.D[1] + ), + T4=jnp.eye(self.D[0], dtype=self.T4_ket.dtype).reshape( + 1, self.D[0], self.D[0], 1 + ), + d=self.d, + D=self.D, + chi=self.chi, + max_chi=self.max_chi, + interlayer_chi=self.interlayer_chi, + ) + else: + return type(self)( + tensor=new_tensor, + C1=self.C1, + C2=self.C2, + C3=self.C3, + C4=self.C4, + T1_ket=self.T1_ket, + T1_bra=self.T1_bra, + T2_ket=self.T2_ket, + T2_bra=self.T2_bra, + T3_ket=self.T3_ket, + T3_bra=self.T3_bra, + T4_ket=self.T4_ket, + T4_bra=self.T4_bra, + d=self.d, + D=self.D, + chi=self.chi, + max_chi=self.max_chi, + interlayer_chi=self.interlayer_chi, + ) + + def change_chi( + self: T_PEPS_Tensor_Split_Transfer, + new_chi: int, + *, + reinitialize_env_as_identities: bool = True, + reset_max_chi: bool = False, + reset_interlayer_chi: bool = True, + ) -> T_PEPS_Tensor_Split_Transfer: + """ + Change the environment bond dimension and returns new object of the class. + + Args: + new_chi (:obj:`int`): + New value for environment bond dimension. + Keyword args: + reinitialize_env_as_identities (:obj:`bool`): + Reinitialize the CTM tensors as identities if decreasing the dimension. + reset_max_chi (:obj:`bool`): + Set maximal bond dimension to the same new value. + reset_interlayer_chi (:obj:`bool`): + Set interlayer bond dimension to the same new value. + Returns: + :obj:`~peps_ad.peps.PEPS_Tensor_Split_Transfer`: + New instance of the class with the increased value. + """ + new_max_chi = new_chi if reset_max_chi else self.max_chi + + if new_chi > new_max_chi: + raise ValueError( + "Increase above the max value for environment bond dimension." + ) + + new_interlayer_chi = new_chi if reset_interlayer_chi else self.interlayer_chi + + if new_chi < self.chi and reinitialize_env_as_identities: + return type(self)( + tensor=self.tensor, + C1=jnp.ones((1, 1), dtype=self.C1.dtype), + C2=jnp.ones((1, 1), dtype=self.C2.dtype), + C3=jnp.ones((1, 1), dtype=self.C3.dtype), + C4=jnp.ones((1, 1), dtype=self.C4.dtype), + T1=jnp.eye(self.D[3], dtype=self.T1_ket.dtype).reshape( + 1, self.D[3], self.D[3], 1 + ), + T2=jnp.eye(self.D[2], dtype=self.T2_ket.dtype).reshape( + self.D[2], self.D[2], 1, 1 + ), + T3=jnp.eye(self.D[1], dtype=self.T3_ket.dtype).reshape( + 1, 1, self.D[1], self.D[1] + ), + T4=jnp.eye(self.D[0], dtype=self.T4_ket.dtype).reshape( + 1, self.D[0], self.D[0], 1 + ), + d=self.d, + D=self.D, + chi=new_chi, + max_chi=new_max_chi, + interlayer_chi=new_interlayer_chi, + ) + else: + return type(self)( + tensor=self.tensor, + C1=self.C1, + C2=self.C2, + C3=self.C3, + C4=self.C4, + T1_ket=self.T1_ket, + T1_bra=self.T1_bra, + T2_ket=self.T2_ket, + T2_bra=self.T2_bra, + T3_ket=self.T3_ket, + T3_bra=self.T3_bra, + T4_ket=self.T4_ket, + T4_bra=self.T4_bra, + d=self.d, + D=self.D, + chi=new_chi, + max_chi=new_max_chi, + interlayer_chi=new_interlayer_chi, + ) + + def increase_max_chi( + self: T_PEPS_Tensor_Split_Transfer, + new_max_chi: int, + ) -> T_PEPS_Tensor_Split_Transfer: + """ + Change the maximal environment bond dimension and returns new object of the class. + + Args: + new_max_chi (:obj:`int`): + New value for maximal environment bond dimension. + Returns: + :obj:`~peps_ad.peps.PEPS_Tensor_Split_Transfer`: + New instance of the class with the increased value. + """ + if new_max_chi < self.max_chi: + raise ValueError( + "Decrease below the old max value for environment bond dimension." + ) + + return type(self)( + tensor=self.tensor, + C1=self.C1, + C2=self.C2, + C3=self.C3, + C4=self.C4, + T1_ket=self.T1_ket, + T1_bra=self.T1_bra, + T2_ket=self.T2_ket, + T2_bra=self.T2_bra, + T3_ket=self.T3_ket, + T3_bra=self.T3_bra, + T4_ket=self.T4_ket, + T4_bra=self.T4_bra, + d=self.d, + D=self.D, + chi=self.chi, + max_chi=new_max_chi, + interlayer_chi=self.interlayer_chi, + ) + + def replace_left_env_tensors( + self: T_PEPS_Tensor_Split_Transfer, + new_C1: Tensor, + new_T4_ket: Tensor, + new_T4_bra: Tensor, + new_C4: Tensor, + ) -> T_PEPS_Tensor_Split_Transfer: + """ + Replace the left CTMRG tensors and returns new object of the class. + + Args: + new_C1 (:obj:`numpy.ndarray` or :obj:`jax.numpy.ndarray`): + New C1 tensor. + new_T4_ket (:obj:`numpy.ndarray` or :obj:`jax.numpy.ndarray`): + New ket T4 tensor. + new_T4_bra (:obj:`numpy.ndarray` or :obj:`jax.numpy.ndarray`): + New bra T4 tensor. + new_C4 (:obj:`numpy.ndarray` or :obj:`jax.numpy.ndarray`): + New C4 tensor. + Returns: + :obj:`~peps_ad.peps.PEPS_Tensor_Split_Transfer`: + New instance of the class with the tensors replaced. + """ + return type(self)( + tensor=self.tensor, + C1=new_C1, + C2=self.C2, + C3=self.C3, + C4=new_C4, + T1_ket=self.T1_ket, + T1_bra=self.T1_bra, + T2_ket=self.T2_ket, + T2_bra=self.T2_bra, + T3_ket=self.T3_ket, + T3_bra=self.T3_bra, + T4_ket=new_T4_ket, + T4_bra=new_T4_bra, + d=self.d, + D=self.D, + chi=self.chi, + max_chi=self.max_chi, + interlayer_chi=self.interlayer_chi, + ) + + def replace_right_env_tensors( + self: T_PEPS_Tensor_Split_Transfer, + new_C2: Tensor, + new_T2_ket: Tensor, + new_T2_bra: Tensor, + new_C3: Tensor, + ) -> T_PEPS_Tensor_Split_Transfer: + """ + Replace the right CTMRG tensors and returns new object of the class. + + Args: + new_C2 (:obj:`numpy.ndarray` or :obj:`jax.numpy.ndarray`): + New C2 tensor. + new_T2_ket (:obj:`numpy.ndarray` or :obj:`jax.numpy.ndarray`): + New ket T2 tensor. + new_T2_bra (:obj:`numpy.ndarray` or :obj:`jax.numpy.ndarray`): + New bra T2 tensor. + new_C3 (:obj:`numpy.ndarray` or :obj:`jax.numpy.ndarray`): + New C3 tensor. + Returns: + :obj:`~peps_ad.peps.PEPS_Tensor_Split_Transfer`: + New instance of the class with the tensors replaced. + """ + return type(self)( + tensor=self.tensor, + C1=self.C1, + C2=new_C2, + C3=new_C3, + C4=self.C4, + T1_ket=self.T1_ket, + T1_bra=self.T1_bra, + T2_ket=new_T2_ket, + T2_bra=new_T2_bra, + T3_ket=self.T3_ket, + T3_bra=self.T3_bra, + T4_ket=self.T4_ket, + T4_bra=self.T4_bra, + d=self.d, + D=self.D, + chi=self.chi, + max_chi=self.max_chi, + interlayer_chi=self.interlayer_chi, + ) + + def replace_top_env_tensors( + self: T_PEPS_Tensor_Split_Transfer, + new_C1: Tensor, + new_T1_ket: Tensor, + new_T1_bra: Tensor, + new_C2: Tensor, + ) -> T_PEPS_Tensor_Split_Transfer: + """ + Replace the top CTMRG tensors and returns new object of the class. + + Args: + new_C1 (:obj:`numpy.ndarray` or :obj:`jax.numpy.ndarray`): + New C1 tensor. + new_T1_ket (:obj:`numpy.ndarray` or :obj:`jax.numpy.ndarray`): + New ket T1 tensor. + new_T1_bra (:obj:`numpy.ndarray` or :obj:`jax.numpy.ndarray`): + New bra T1 tensor. + new_C2 (:obj:`numpy.ndarray` or :obj:`jax.numpy.ndarray`): + New C2 tensor. + Returns: + :obj:`~peps_ad.peps.PEPS_Tensor_Split_Transfer`: + New instance of the class with the tensors replaced. + """ + return type(self)( + tensor=self.tensor, + C1=new_C1, + C2=new_C2, + C3=self.C3, + C4=self.C4, + T1_ket=new_T1_ket, + T1_bra=new_T1_bra, + T2_ket=self.T2_ket, + T2_bra=self.T2_bra, + T3_ket=self.T3_ket, + T3_bra=self.T3_bra, + T4_ket=self.T4_ket, + T4_bra=self.T4_bra, + d=self.d, + D=self.D, + chi=self.chi, + max_chi=self.max_chi, + interlayer_chi=self.interlayer_chi, + ) + + def replace_bottom_env_tensors( + self: T_PEPS_Tensor_Split_Transfer, + new_C4: Tensor, + new_T3_ket: Tensor, + new_T3_bra: Tensor, + new_C3: Tensor, + ) -> T_PEPS_Tensor_Split_Transfer: + """ + Replace the bottom CTMRG tensors and returns new object of the class. + + Args: + new_C4 (:obj:`numpy.ndarray` or :obj:`jax.numpy.ndarray`): + New C4 tensor. + new_T3_ket (:obj:`numpy.ndarray` or :obj:`jax.numpy.ndarray`): + New ket T3 tensor. + new_T3_bra (:obj:`numpy.ndarray` or :obj:`jax.numpy.ndarray`): + New bra T3 tensor. + new_C3 (:obj:`numpy.ndarray` or :obj:`jax.numpy.ndarray`): + New C3 tensor. + Returns: + :obj:`~peps_ad.peps.PEPS_Tensor_Split_Transfer`: + New instance of the class with the tensors replaced. + """ + return type(self)( + tensor=self.tensor, + C1=self.C1, + C2=self.C2, + C3=new_C3, + C4=new_C4, + T1_ket=self.T1_ket, + T1_bra=self.T1_bra, + T2_ket=self.T2_ket, + T2_bra=self.T2_bra, + T3_ket=new_T3_ket, + T3_bra=new_T3_bra, + T4_ket=self.T4_ket, + T4_bra=self.T4_bra, + d=self.d, + D=self.D, + chi=self.chi, + max_chi=self.max_chi, + interlayer_chi=self.interlayer_chi, + ) + + def __add__( + self: T_PEPS_Tensor_Split_Transfer, + other: T_PEPS_Tensor_Split_Transfer, + *, + checks: bool = True, + ) -> T_PEPS_Tensor_Split_Transfer: + """ + Add the environment tensors of two PEPS tensors. + + Args: + other (:obj:`~peps_ad.peps.PEPS_Tensor_Split_Transfer`): + Other PEPS tensor object which should be added to this one. + Keyword args: + checks (:obj:`bool`): + Enable checks that the addition of the two tensor objects makes + sense. Maybe disabled for jax transformations. + Returns: + :obj:`~peps_ad.peps.PEPS_Tensor_Split_Transfer`: + New instance with the added env tensors. + """ + if checks and ( + self.tensor is not other.tensor + or self.d != other.d + or self.D != other.D + or self.chi != other.chi + ): + raise ValueError( + "Both PEPS tensors must have the same tensor, d, D and chi values." + ) + + return type(self)( + tensor=self.tensor, + C1=self.C1 + other.C1, + C2=self.C2 + other.C2, + C3=self.C3 + other.C3, + C4=self.C4 + other.C4, + T1_ket=self.T1_ket + other.T1_ket, + T1_bra=self.T1_bra + other.T1_bra, + T2_ket=self.T2_ket + other.T2_ket, + T2_bra=self.T2_bra + other.T2_bra, + T3_ket=self.T3_ket + other.T3_ket, + T3_bra=self.T3_bra + other.T3_bra, + T4_ket=self.T4_ket + other.T4_ket, + T4_bra=self.T4_bra + other.T4_bra, + d=self.d, + D=self.D, + chi=self.chi, + max_chi=self.max_chi, + interlayer_chi=self.interlayer_chi, + ) + + @classmethod + def zeros_like( + cls: Type[T_PEPS_Tensor_Split_Transfer], t: T_PEPS_Tensor_Split_Transfer + ) -> T_PEPS_Tensor_Split_Transfer: + """ + Create a PEPS tensor with same shape as another one but with zeros + everywhere. + + Args: + t (:obj:`~peps_ad.peps.PEPS_Tensor_Split_Transfer`): + Other PEPS tensor object whose shape should be copied. + Returns: + :obj:`~peps_ad.peps.PEPS_Tensor_Split_Transfer`: + New instance with the zero initialized tensors. + """ + return cls( + tensor=jnp.zeros_like(t.tensor), + C1=jnp.zeros_like(t.C1), + C2=jnp.zeros_like(t.C2), + C3=jnp.zeros_like(t.C3), + C4=jnp.zeros_like(t.C4), + T1_ket=jnp.zeros_like(t.T1_ket), + T1_bra=jnp.zeros_like(t.T1_bra), + T2_ket=jnp.zeros_like(t.T2_ket), + T2_bra=jnp.zeros_like(t.T2_bra), + T3_ket=jnp.zeros_like(t.T3_ket), + T3_bra=jnp.zeros_like(t.T3_bra), + T4_ket=jnp.zeros_like(t.T4_ket), + T4_bra=jnp.zeros_like(t.T4_bra), + d=t.d, + D=t.D, + chi=t.chi, + max_chi=t.max_chi, + interlayer_chi=t.interlayer_chi, + ) + + def save_to_group(self, grp: h5py.Group) -> None: + """ + Store the PEPS tensor into a HDF5 group. + + Args: + grp (:obj:`h5py.Group`): + HDF5 group object to save the data into. + """ + grp.attrs["d"] = self.d + grp.attrs["D"] = self.D + grp.attrs["chi"] = self.chi + grp.attrs["max_chi"] = self.max_chi + grp.attrs["interlayer_chi"] = self.interlayer_chi + grp.create_dataset( + "tensor", data=self.tensor, compression="gzip", compression_opts=6 + ) + grp.create_dataset("C1", data=self.C1, compression="gzip", compression_opts=6) + grp.create_dataset("C2", data=self.C2, compression="gzip", compression_opts=6) + grp.create_dataset("C3", data=self.C3, compression="gzip", compression_opts=6) + grp.create_dataset("C4", data=self.C4, compression="gzip", compression_opts=6) + grp.create_dataset( + "T1_ket", data=self.T1_ket, compression="gzip", compression_opts=6 + ) + grp.create_dataset( + "T1_bra", data=self.T1_bra, compression="gzip", compression_opts=6 + ) + grp.create_dataset( + "T2_ket", data=self.T2_ket, compression="gzip", compression_opts=6 + ) + grp.create_dataset( + "T2_bra", data=self.T2_bra, compression="gzip", compression_opts=6 + ) + grp.create_dataset( + "T3_ket", data=self.T3_ket, compression="gzip", compression_opts=6 + ) + grp.create_dataset( + "T3_bra", data=self.T3_bra, compression="gzip", compression_opts=6 + ) + grp.create_dataset( + "T4_ket", data=self.T4_ket, compression="gzip", compression_opts=6 + ) + grp.create_dataset( + "T4_bra", data=self.T4_bra, compression="gzip", compression_opts=6 + ) + + @classmethod + def load_from_group( + cls: Type[T_PEPS_Tensor_Split_Transfer], grp: h5py.Group + ) -> T_PEPS_Tensor_Split_Transfer: + """ + Load the PEPS tensor from a HDF5 group. + + Args: + grp (:obj:`h5py.Group`): + HDF5 group object to load the data from. + """ + d = int(grp.attrs["d"]) + D = tuple(int(i) for i in grp.attrs["D"]) + chi = int(grp.attrs["chi"]) + max_chi = int(grp.attrs["max_chi"]) + interlayer_chi = int(grp.attrs["interlayer_chi"]) + + tensor = jnp.asarray(grp["tensor"]) + C1 = jnp.asarray(grp["C1"]) + C2 = jnp.asarray(grp["C2"]) + C3 = jnp.asarray(grp["C3"]) + C4 = jnp.asarray(grp["C4"]) + T1_ket = jnp.asarray(grp["T1_ket"]) + T1_bra = jnp.asarray(grp["T1_bra"]) + T2_ket = jnp.asarray(grp["T2_ket"]) + T2_bra = jnp.asarray(grp["T2_bra"]) + T3_ket = jnp.asarray(grp["T3_ket"]) + T3_bra = jnp.asarray(grp["T3_bra"]) + T4_ket = jnp.asarray(grp["T4_ket"]) + T4_bra = jnp.asarray(grp["T4_bra"]) + + return cls( + tensor=tensor, + C1=C1, + C2=C2, + C3=C3, + C4=C4, + T1_ket=T1_ket, + T1_bra=T1_bra, + T2_ket=T2_ket, + T2_bra=T2_bra, + T3_ket=T3_ket, + T3_bra=T3_bra, + T4_ket=T4_ket, + T4_bra=T4_bra, + d=d, + D=D, + chi=chi, + max_chi=max_chi, + interlayer_chi=interlayer_chi, + ) + + @property + def is_split_transfer(self: T_PEPS_Tensor_Split_Transfer) -> bool: + return True + + def convert_to_split_transfer( + self: T_PEPS_Tensor_Split_Transfer, + ) -> T_PEPS_Tensor_Split_Transfer: + return self + + def convert_to_full_transfer(self: T_PEPS_Tensor_Split_Transfer) -> T_PEPS_Tensor: + T1 = jnp.tensordot(self.T1_ket, self.T1_bra, ((2,), (0,))) + T2 = jnp.tensordot(self.T2_bra, self.T2_ket, ((2,), (0,))) + T2 = T2.transpose(2, 1, 0, 3) + T3 = jnp.tensordot(self.T3_ket, self.T3_bra, ((2,), (0,))) + T3 = T3.transpose(0, 3, 2, 1) + T4 = jnp.tensordot(self.T4_bra, self.T4_ket, ((2,), (0,))) + + return PEPS_Tensor( + tensor=self.tensor, + C1=self.C1, + C2=self.C2, + C3=self.C3, + C4=self.C4, + T1=T1, + T2=T2, + T3=T3, + T4=T4, + d=self.d, + D=self.D, + chi=self.chi, + max_chi=self.max_chi, + ) + + def tree_flatten(self) -> Tuple[Tuple[Any, ...], Tuple[Any, ...]]: + data = ( + self.tensor, + self.C1, + self.C2, + self.C3, + self.C4, + self.T1_ket, + self.T1_bra, + self.T2_ket, + self.T2_bra, + self.T3_ket, + self.T3_bra, + self.T4_ket, + self.T4_bra, + ) + aux_data = (self.d, self.D, self.chi, self.max_chi, self.interlayer_chi) + + return (data, aux_data) + + @classmethod + def tree_unflatten( + cls: Type[T_PEPS_Tensor_Split_Transfer], + aux_data: Tuple[Any, ...], + children: Tuple[Any, ...], + ) -> T_PEPS_Tensor_Split_Transfer: + ( + tensor, + C1, + C2, + C3, + C4, + T1_ket, + T1_bra, + T2_ket, + T2_bra, + T3_ket, + T3_bra, + T4_ket, + T4_bra, + ) = children + d, D, chi, max_chi, interlayer_chi = aux_data + + return cls( + tensor=tensor, + C1=C1, + C2=C2, + C3=C3, + C4=C4, + T1_ket=T1_ket, + T1_bra=T1_bra, + T2_ket=T2_ket, + T2_bra=T2_bra, + T3_ket=T3_ket, + T3_bra=T3_bra, + T4_ket=T4_ket, + T4_bra=T4_bra, + d=d, + D=D, + chi=chi, + max_chi=max_chi, + interlayer_chi=interlayer_chi, + sanity_checks=False, + ) diff --git a/varipeps/peps/unitcell.py b/varipeps/peps/unitcell.py index 7dde59e..f6104b3 100644 --- a/varipeps/peps/unitcell.py +++ b/varipeps/peps/unitcell.py @@ -16,7 +16,7 @@ import jax.numpy as jnp from jax.tree_util import register_pytree_node_class -from .tensor import PEPS_Tensor +from .tensor import PEPS_Tensor, PEPS_Tensor_Split_Transfer import varipeps from varipeps.utils.random import PEPS_Random_Number_Generator from varipeps.utils.periodic_indices import calculate_periodic_indices @@ -150,10 +150,21 @@ def load_from_group( HDF5 group object to load the data from. """ structure = tuple(tuple(int(j) for j in i) for i in grp["structure"]) - peps_tensors = [ - PEPS_Tensor.load_from_group(grp["peps_tensors"][f"t_{ti:d}"]) - for ti in range(grp["peps_tensors"].attrs["len"]) - ] + try: + peps_tensors = [ + PEPS_Tensor.load_from_group(grp["peps_tensors"][f"t_{ti:d}"]) + for ti in range(grp["peps_tensors"].attrs["len"]) + ] + except KeyError as e: + try: + peps_tensors = [ + PEPS_Tensor_Split_Transfer.load_from_group( + grp["peps_tensors"][f"t_{ti:d}"] + ) + for ti in range(grp["peps_tensors"].attrs["len"]) + ] + except KeyError: + raise e return cls(structure=structure, peps_tensors=peps_tensors) @@ -200,7 +211,7 @@ def __post_init__(self): @staticmethod def _check_structure( - structure: Tuple[Tuple[int, ...], ...] + structure: Tuple[Tuple[int, ...], ...], ) -> Tuple[Tuple[Tuple[int, ...], ...], jnp.ndarray]: structure = np.array(structure) @@ -450,19 +461,84 @@ def replace_unique_tensors( sanity_checks=False, ) - def change_chi(self: T_PEPS_Unit_Cell, new_chi: int) -> T_PEPS_Unit_Cell: + def is_split_transfer(self: T_PEPS_Unit_Cell) -> bool: + return all(t.is_split_transfer for t in self.data.peps_tensors) + + def convert_to_split_transfer( + self: T_PEPS_Unit_Cell, interlayer_chi: Optional[int] = None + ) -> T_PEPS_Unit_Cell: + """ + Convert the list of unique tensors to the split transfer ansatz. + + Args: + interlayer_chi (:obj:`int`, optional): + Bond dimension for the interlayer index in the split transfer + ansatz. If set to None, the same value as for the enviroment + bond dimension is used. + Returns: + PEPS_Unit_Cell: + New instance of PEPS unit cell with the new unique tensor list. + """ + if self.is_split_transfer(): + return self + + new_unique_tensors = type(self.data.peps_tensors)( + t.convert_to_split_transfer(interlayer_chi) for t in self.data.peps_tensors + ) + + new_data = self.data.replace_peps_tensors(new_unique_tensors) + + return type(self)( + data=new_data, + real_ix=self.real_ix, + real_iy=self.real_iy, + sanity_checks=False, + ) + + def convert_to_full_transfer(self: T_PEPS_Unit_Cell) -> T_PEPS_Unit_Cell: + """ + Convert the list of unique tensors to the full transfer ansatz. + + Returns: + PEPS_Unit_Cell: + New instance of PEPS unit cell with the new unique tensor list. + """ + if not self.is_split_transfer(): + return self + + new_unique_tensors = type(self.data.peps_tensors)( + t.convert_to_full_transfer() for t in self.data.peps_tensors + ) + + new_data = self.data.replace_peps_tensors(new_unique_tensors) + + return type(self)( + data=new_data, + real_ix=self.real_ix, + real_iy=self.real_iy, + sanity_checks=False, + ) + + def change_chi( + self: T_PEPS_Unit_Cell, + new_chi: int, + reset_max_chi: bool = False, + ) -> T_PEPS_Unit_Cell: """ Change environment bond dimension of all tensors in the unit cell. Args: new_chi (:obj:`int`): New value for the environment bond dimension. + reset_max_chi (:obj:`bool`): + Set maximal bond dimension to the same new value. Returns: PEPS_Unit_Cell: New instance of PEPS unit cell with the new tensor list. """ new_unique_tensors = type(self.data.peps_tensors)( - t.change_chi(new_chi) for t in self.data.peps_tensors + t.change_chi(new_chi, reset_max_chi=reset_max_chi) + for t in self.data.peps_tensors ) new_data = self.data.replace_peps_tensors(new_unique_tensors) diff --git a/varipeps/utils/debug_print.py b/varipeps/utils/debug_print.py index 719b657..f7f02d4 100644 --- a/varipeps/utils/debug_print.py +++ b/varipeps/utils/debug_print.py @@ -12,7 +12,7 @@ def _format_print_callback(fmt: str, *args, **kwargs): tqdm.write(fmt.format(*args, **kwargs)) -def debug_print(fmt: str, *args, ordered: bool = False, **kwargs) -> None: +def debug_print(fmt: str, *args, ordered: bool = True, **kwargs) -> None: """ Prints values and works in staged out JAX functions. diff --git a/varipeps/utils/projector_dict.py b/varipeps/utils/projector_dict.py index b6c1c5d..77b863d 100644 --- a/varipeps/utils/projector_dict.py +++ b/varipeps/utils/projector_dict.py @@ -9,6 +9,59 @@ Top_Projectors = namedtuple("Top_Projectors", ("left", "right")) Bottom_Projectors = namedtuple("Bottom_Projectors", ("left", "right")) +Left_Projectors_Split_Transfer = namedtuple( + "Left_Projectors_Split_Transfer", + ( + "top_ket", + "top_bra", + "top_phys_ket", + "top_phys_bra", + "bottom_ket", + "bottom_bra", + "bottom_phys_ket", + "bottom_phys_bra", + ), +) +Right_Projectors_Split_Transfer = namedtuple( + "Right_Projectors_Split_Transfer", + ( + "top_ket", + "top_bra", + "top_phys_ket", + "top_phys_bra", + "bottom_ket", + "bottom_bra", + "bottom_phys_ket", + "bottom_phys_bra", + ), +) +Top_Projectors_Split_Transfer = namedtuple( + "Top_Projectors_Split_Transfer", + ( + "left_ket", + "left_bra", + "left_phys_ket", + "left_phys_bra", + "right_ket", + "right_bra", + "right_phys_ket", + "right_phys_bra", + ), +) +Bottom_Projectors_Split_Transfer = namedtuple( + "Bottom_Projectors_Split_Transfer", + ( + "left_ket", + "left_bra", + "left_phys_ket", + "left_phys_bra", + "right_ket", + "right_bra", + "right_phys_ket", + "right_phys_bra", + ), +) + Unit_Cell_Bond_Dim_Projectors = namedtuple( "Unit_Cell_Bond_Dim_Projectors", ("left", "right", "top", "bottom") ) @@ -17,6 +70,14 @@ "T_Projector", Left_Projectors, Right_Projectors, Top_Projectors, Bottom_Projectors ) +T_Projector_Split_Transfer = TypeVar( + "T_Projector_Split_Transfer", + Left_Projectors_Split_Transfer, + Right_Projectors_Split_Transfer, + Top_Projectors_Split_Transfer, + Bottom_Projectors_Split_Transfer, +) + @dataclass class Projector_Dict(collections.abc.MutableMapping): diff --git a/varipeps/utils/random.py b/varipeps/utils/random.py index 8778e53..bb6cf29 100644 --- a/varipeps/utils/random.py +++ b/varipeps/utils/random.py @@ -163,3 +163,20 @@ def block( if normalize: block /= jnp.linalg.norm(block) return block + + def positive_block( + self, dim: Sequence[int], dtype: Type[np.number], *, normalize: bool = True + ) -> jnp.ndarray: + if jnp.dtype(dtype) is jnp.dtype(jnp.complex64) or jnp.dtype( + dtype + ) is jnp.dtype(jnp.complex128): + self.key, key1, key2 = jax.random.split(self.key, 3) + block = jax.random.uniform(key1, dim, minval=0, maxval=1).astype( + dtype + ) + 1j * jax.random.uniform(key2, dim, minval=0, maxval=1).astype(dtype) + else: + self.key, key1 = jax.random.split(self.key, 2) + block = jax.random.uniform(key1, dim, dtype=dtype, minval=0, maxval=1) + if normalize: + block /= jnp.linalg.norm(block) + return block diff --git a/varipeps/utils/svd.py b/varipeps/utils/svd.py index 293737c..d9da4d0 100644 --- a/varipeps/utils/svd.py +++ b/varipeps/utils/svd.py @@ -24,14 +24,30 @@ def _H(x): def svd_wrapper(a): check_arraylike("jnp.linalg.svd", a) (a,) = promote_dtypes_inexact(jnp.asarray(a)) - return lax_svd(a, full_matrices=False, compute_uv=True) + + result = lax_svd(a, full_matrices=False, compute_uv=True) + + result = lax.cond( + jnp.isnan(jnp.sum(result[1])), + lambda matrix, _: lax_svd( + matrix, + full_matrices=False, + compute_uv=True, + algorithm=lax.linalg.SvdAlgorithm.QR, + ), + lambda _, res: res, + a, + result, + ) + + return result @svd_wrapper.defjvp def _svd_jvp_rule(primals, tangents): (A,) = primals (dA,) = tangents - U, s, Vt = lax_svd(A, full_matrices=False, compute_uv=True) + U, s, Vt = svd_wrapper(A) Ut, V = _H(U), _H(Vt) s_dim = s[..., None, :] @@ -39,6 +55,7 @@ def _svd_jvp_rule(primals, tangents): ds = jnp.real(jnp.diagonal(dS, 0, -2, -1)) s_diffs = (s_dim + _T(s_dim)) * (s_dim - _T(s_dim)) + # s_diffs = jnp.where(s_diffs / (s[0] ** 2) >= 1e-12, s_diffs, 0) s_diffs_zeros = jnp.ones((), dtype=A.dtype) * ( s_diffs == 0.0 ) # is 1. where s_diffs is 0. and is 0. everywhere else