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/.github/workflows/release.yml b/.github/workflows/release.yml index d6d6b01..04e3539 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -6,41 +6,77 @@ # separate terms of service, privacy policy, and support # documentation. -name: Upload Python Package +name: Build and upload Python Package on: + workflow_dispatch: + pull_request: + push: + branches: + - main release: - types: [published] + types: + - published permissions: contents: read jobs: - build: - name: Build distribution - runs-on: ubuntu-latest + build_wheels: + name: Build wheels for ${{ matrix.os }} + runs-on: ${{ matrix.runs-on }} + strategy: + matrix: + os: [ linux-intel, linux-arm, macos-arm, windows ] + include: + - archs: auto64 + platform: auto + - os: linux-intel + runs-on: ubuntu-latest + - os: linux-arm + runs-on: ubuntu-24.04-arm + - os: windows + runs-on: windows-latest + - os: macos-arm + # macos-14+ (including latest) are ARM64 runners + runs-on: macos-latest + archs: auto,universal2 steps: - uses: actions/checkout@v4 - - name: Set up Python - uses: actions/setup-python@v5 + + - name: Build wheels + uses: pypa/cibuildwheel@v2.23.3 + env: + CIBW_PLATFORM: ${{ matrix.platform }} + CIBW_ARCHS: ${{ matrix.archs }} + MACOSX_DEPLOYMENT_TARGET: "11.0" + + - uses: actions/upload-artifact@v4 with: - python-version: "3.x" - - name: Install pypa/build - run: python3 -m pip install build --user - - name: Build a binary wheel and a source tarball - run: python3 -m build - - name: Store the distribution packages - uses: actions/upload-artifact@v4 + name: cibw-wheels-${{ matrix.os }}-${{ strategy.job-index }} + path: ./wheelhouse/*.whl + + build_sdist: + name: Build source distribution + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Build sdist + run: pipx run build --sdist + + - uses: actions/upload-artifact@v4 with: - name: python-package-distributions - path: dist/ + name: cibw-sdist + path: dist/*.tar.gz publish-to-pypi: name: Publish Python distribution to PyPI if: startsWith(github.ref, 'refs/tags/') # only publish to PyPI on tag pushes needs: - - build + - build_wheels + - build_sdist runs-on: ubuntu-latest environment: release permissions: @@ -49,7 +85,8 @@ jobs: - name: Download the dist file uses: actions/download-artifact@v4 with: - name: python-package-distributions - path: dist/ + pattern: cibw-* + path: dist + merge-multiple: true - name: Publish distribution to PyPI uses: pypa/gh-action-pypi-publish@release/v1 diff --git a/.zenodo.json b/.zenodo.json index abdcf7d..99281ed 100644 --- a/.zenodo.json +++ b/.zenodo.json @@ -50,7 +50,12 @@ "related_identifiers": [ { - "identifier": "arXiv:2308.12358", + "identifier": "https://doi.org/10.21468/SciPostPhysLectNotes.86", + "relation": "isDocumentedBy", + "resource_type": "publication-article" + }, + { + "identifier": "arXiv:2502.10298", "relation": "isDocumentedBy", "resource_type": "publication-preprint" }, @@ -61,7 +66,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..e2d5bea 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -26,8 +26,11 @@ 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.48550/arXiv.2502.10298 + description: Prepribt with the description of the split-CTMRG method - type: doi value: 10.5281/zenodo.10852390 description: Zenodo DOI for current version of the code @@ -37,7 +40,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/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..569f3bd --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,60 @@ +# Set the minimum CMake version and policies for highest tested version +cmake_minimum_required(VERSION 3.15...3.27) + +# Set default build type in CMake if skbuild is set +message(STATUS "CMAKE_BUILD_TYPE set to '${CMAKE_BUILD_TYPE}'") + +# Set up the project and ensure there is a working C++ compiler +project(varipeps_extensions LANGUAGES CXX) + +# Try to import all Python components potentially needed by nanobind +find_package(Python 3.10 + REQUIRED COMPONENTS Interpreter Development.Module + OPTIONAL_COMPONENTS Development.SABIModule) + +# Import nanobind through CMake's find_package mechanism +execute_process( + COMMAND /usr/bin/env python3 -m nanobind --cmake_dir + OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_VARIABLE nanobind_ROOT) +find_package(nanobind CONFIG REQUIRED) + +# Find jaxlib include dir +IF (WIN32) + execute_process( + COMMAND python -c "import inspect; import jaxlib; import pathlib; p = pathlib.Path(inspect.getfile(jaxlib)); print(p.parent / 'include')" + OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_VARIABLE jaxlib_INCLUDE_DIR) +ELSE() + execute_process( + COMMAND /usr/bin/env python3 -c "import inspect; import jaxlib; import pathlib; p = pathlib.Path(inspect.getfile(jaxlib)); print(p.parent / 'include')" + OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_VARIABLE jaxlib_INCLUDE_DIR) +ENDIF() + + +# We are now ready to compile the actual extension module +nanobind_add_module( + # Name of the extension + _svd_only_u_vt + + # Target the stable ABI for Python 3.12+, which reduces + # the number of binary wheels that must be built. This + # does nothing on older Python versions + STABLE_ABI + + # Build libnanobind statically and merge it into the + # extension (which itself remains a shared library) + # + # If your project builds multiple extensions, you can + # replace this flag by NB_SHARED to conserve space by + # reusing a shared libnanobind across libraries + NB_STATIC + + # Source code goes here + varipeps/utils/extensions/svd_ffi.cpp +) + +target_include_directories(_svd_only_u_vt PRIVATE "${jaxlib_INCLUDE_DIR}") + +# target_link_libraries(_svd_only_vt PRIVATE lapack) + +# Install directive for scikit-build-core +install(TARGETS _svd_only_u_vt LIBRARY DESTINATION varipeps/utils/extensions) diff --git a/README.md b/README.md index 13b558c..190209b 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,30 @@ 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}, +} + +@misc{naumann2025variationallyoptimizinginfiniteprojected, + title={Variationally optimizing infinite projected entangled-pair states at large bond dimensions: A split-CTMRG approach}, + author={Jan Naumann and Erik Lennart Weerda and Jens Eisert and Matteo Rizzi and Philipp Schmoll}, + year={2025}, + eprint={2502.10298}, + archivePrefix={arXiv}, + primaryClass={cond-mat.str-el}, + url={https://arxiv.org/abs/2502.10298}, } @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..d7c272d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,36 +1,72 @@ -[tool.poetry] +[project] name = "variPEPS" -version = "0.6.0" +version = "1.0.4" 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" +requires = ["hatchling", "scikit-build-core>=0.11.0", "nanobind>=2.7.0", "jaxlib>=0.5.3"] +build-backend = "hatchling.build" -[tool.poe.tasks] -use-cuda = "pip install --upgrade 'jax[cuda]' -f https://storage.googleapis.com/jax-releases/jax_cuda_releases.html" +[tool.scikit-build] +# Protect the configuration against future changes in scikit-build-core +minimum-version = "build-system.requires" +# Setuptools-style build caching in a local directory +build-dir = "build/{wheel_tag}" + +[tool.scikit-build.cmake] +build-type = "Release" + +[tool.hatch.build.targets.wheel.hooks.scikit-build] +experimental = true + +[tool.cibuildwheel] +# Enable free-threaded support +enable = ["cpython-freethreading"] +# Disable building PyPy, musllinux and thread-freethreading on Mac and Windows wheels +skip = ["pp*", "*musllinux*", "*t-macosx*", "*t-win*"] diff --git a/uv.lock b/uv.lock new file mode 100644 index 0000000..fe80462 --- /dev/null +++ b/uv.lock @@ -0,0 +1,956 @@ +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.10" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/00/c2/9b2de9ed027f9fe5734a6c0c0a601289d796b3caaf1e372e23fa88a73047/astroid-3.3.10.tar.gz", hash = "sha256:c332157953060c6deb9caa57303ae0d20b0fbdb2e59b4a4f2a6ba49d0a7961ce", size = 398941 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/15/58/5260205b9968c20b6457ed82f48f9e3d6edf2f1f95103161798b73aeccf0/astroid-3.3.10-py3-none-any.whl", hash = "sha256:104fb9cb9b27ea95e847a94c003be03a9e039334a8ebca5ee27dafaf5c5711eb", size = 275388 }, +] + +[[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.2.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/60/6c/8ca2efa64cf75a977a0d7fac081354553ebe483345c734fb6b6515d96bbc/click-8.2.1.tar.gz", hash = "sha256:27c491cc05d968d271d5a1db13e3b5a184636d9d930f148c50b038f0d0646202", size = 286342 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/85/32/10bb5764d90a8eee674e9dc6f4db6a0ab47c8c4d0d83c27f7c39ac415a4d/click-8.2.1-py3-none-any.whl", hash = "sha256:61a3265b914e850b85317d0b3109c7f8cd35a670f963866005d6ef1d5175a12b", size = 102215 }, +] + +[[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.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/12/80/630b4b88364e9a8c8c5797f4602d0f76ef820909ee32f0bacb9f90654042/dill-0.4.0.tar.gz", hash = "sha256:0633f1d2df477324f53a895b02c901fb961bdbf65a17122586ea7019292cbcf0", size = 186976 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/50/3d/9373ad9c56321fdab5b41197068e1d8c25883b3fea29dd361f9b55116869/dill-0.4.0-py3-none-any.whl", hash = "sha256:44f54bf6412c2c8464c14e8243eb163690a9800dbe2c367330883b19c7561049", size = 119668 }, +] + +[[package]] +name = "exceptiongroup" +version = "1.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0b/9f/a65090624ecf468cdca03533906e7c69ed7588582240cfe7cc9e770b50eb/exceptiongroup-1.3.0.tar.gz", hash = "sha256:b241f5885f560bc56a59ee63ca4c6a8bfa46ae4ad651af316d4e81817bb9fd88", size = 29749 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/36/f4/c6e662dade71f56cd2f3735141b265c3c79293c109549c1e6933b0651ffc/exceptiongroup-1.3.0-py3-none-any.whl", hash = "sha256:4d111e6e0c13d0644cad6ddaa7ed0261a0b36971f6d23e7ec9b4b9097da78a10", size = 16674 }, +] + +[[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.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mccabe" }, + { name = "pycodestyle" }, + { name = "pyflakes" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e7/c4/5842fc9fc94584c455543540af62fd9900faade32511fab650e9891ec225/flake8-7.2.0.tar.gz", hash = "sha256:fa558ae3f6f7dbf2b4f22663e5343b6b6023620461f8d4ff2019ef4b5ee70426", size = 48177 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/83/5c/0627be4c9976d56b1217cb5187b7504e7fd7d3503f8bfd312a04077bd4f7/flake8-7.2.0-py2.py3-none-any.whl", hash = "sha256:93b92ba5bdb60754a6da14fa3b93a9361fd00a59632ada61fd7b130436c40343", size = 57786 }, +] + +[[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.14.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.3.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5d/57/dfb3c5c3f1bf5f5ef2e59a22dec4ff1f3d7408b55bfcefcfb0ea69ef21c6/h5py-3.14.0.tar.gz", hash = "sha256:2372116b2e0d5d3e5e705b7f663f7c8d96fa79a4052d250484ef91d24d6a08f4", size = 424323 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/52/89/06cbb421e01dea2e338b3154326523c05d9698f89a01f9d9b65e1ec3fb18/h5py-3.14.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:24df6b2622f426857bda88683b16630014588a0e4155cba44e872eb011c4eaed", size = 3332522 }, + { url = "https://files.pythonhosted.org/packages/c3/e7/6c860b002329e408348735bfd0459e7b12f712c83d357abeef3ef404eaa9/h5py-3.14.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6ff2389961ee5872de697054dd5a033b04284afc3fb52dc51d94561ece2c10c6", size = 2831051 }, + { url = "https://files.pythonhosted.org/packages/fa/cd/3dd38cdb7cc9266dc4d85f27f0261680cb62f553f1523167ad7454e32b11/h5py-3.14.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:016e89d3be4c44f8d5e115fab60548e518ecd9efe9fa5c5324505a90773e6f03", size = 4324677 }, + { url = "https://files.pythonhosted.org/packages/b1/45/e1a754dc7cd465ba35e438e28557119221ac89b20aaebef48282654e3dc7/h5py-3.14.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1223b902ef0b5d90bcc8a4778218d6d6cd0f5561861611eda59fa6c52b922f4d", size = 4557272 }, + { url = "https://files.pythonhosted.org/packages/5c/06/f9506c1531645829d302c420851b78bb717af808dde11212c113585fae42/h5py-3.14.0-cp310-cp310-win_amd64.whl", hash = "sha256:852b81f71df4bb9e27d407b43071d1da330d6a7094a588efa50ef02553fa7ce4", size = 2866734 }, + { url = "https://files.pythonhosted.org/packages/61/1b/ad24a8ce846cf0519695c10491e99969d9d203b9632c4fcd5004b1641c2e/h5py-3.14.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f30dbc58f2a0efeec6c8836c97f6c94afd769023f44e2bb0ed7b17a16ec46088", size = 3352382 }, + { url = "https://files.pythonhosted.org/packages/36/5b/a066e459ca48b47cc73a5c668e9924d9619da9e3c500d9fb9c29c03858ec/h5py-3.14.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:543877d7f3d8f8a9828ed5df6a0b78ca3d8846244b9702e99ed0d53610b583a8", size = 2852492 }, + { url = "https://files.pythonhosted.org/packages/08/0c/5e6aaf221557314bc15ba0e0da92e40b24af97ab162076c8ae009320a42b/h5py-3.14.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c497600c0496548810047257e36360ff551df8b59156d3a4181072eed47d8ad", size = 4298002 }, + { url = "https://files.pythonhosted.org/packages/21/d4/d461649cafd5137088fb7f8e78fdc6621bb0c4ff2c090a389f68e8edc136/h5py-3.14.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:723a40ee6505bd354bfd26385f2dae7bbfa87655f4e61bab175a49d72ebfc06b", size = 4516618 }, + { url = "https://files.pythonhosted.org/packages/db/0c/6c3f879a0f8e891625817637fad902da6e764e36919ed091dc77529004ac/h5py-3.14.0-cp311-cp311-win_amd64.whl", hash = "sha256:d2744b520440a996f2dae97f901caa8a953afc055db4673a993f2d87d7f38713", size = 2874888 }, + { url = "https://files.pythonhosted.org/packages/3e/77/8f651053c1843391e38a189ccf50df7e261ef8cd8bfd8baba0cbe694f7c3/h5py-3.14.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e0045115d83272090b0717c555a31398c2c089b87d212ceba800d3dc5d952e23", size = 3312740 }, + { url = "https://files.pythonhosted.org/packages/ff/10/20436a6cf419b31124e59fefc78d74cb061ccb22213226a583928a65d715/h5py-3.14.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6da62509b7e1d71a7d110478aa25d245dd32c8d9a1daee9d2a42dba8717b047a", size = 2829207 }, + { url = "https://files.pythonhosted.org/packages/3f/19/c8bfe8543bfdd7ccfafd46d8cfd96fce53d6c33e9c7921f375530ee1d39a/h5py-3.14.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:554ef0ced3571366d4d383427c00c966c360e178b5fb5ee5bb31a435c424db0c", size = 4708455 }, + { url = "https://files.pythonhosted.org/packages/86/f9/f00de11c82c88bfc1ef22633557bfba9e271e0cb3189ad704183fc4a2644/h5py-3.14.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0cbd41f4e3761f150aa5b662df991868ca533872c95467216f2bec5fcad84882", size = 4929422 }, + { url = "https://files.pythonhosted.org/packages/7a/6d/6426d5d456f593c94b96fa942a9b3988ce4d65ebaf57d7273e452a7222e8/h5py-3.14.0-cp312-cp312-win_amd64.whl", hash = "sha256:bf4897d67e613ecf5bdfbdab39a1158a64df105827da70ea1d90243d796d367f", size = 2862845 }, + { url = "https://files.pythonhosted.org/packages/6c/c2/7efe82d09ca10afd77cd7c286e42342d520c049a8c43650194928bcc635c/h5py-3.14.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:aa4b7bbce683379b7bf80aaba68e17e23396100336a8d500206520052be2f812", size = 3289245 }, + { url = "https://files.pythonhosted.org/packages/4f/31/f570fab1239b0d9441024b92b6ad03bb414ffa69101a985e4c83d37608bd/h5py-3.14.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ef9603a501a04fcd0ba28dd8f0995303d26a77a980a1f9474b3417543d4c6174", size = 2807335 }, + { url = "https://files.pythonhosted.org/packages/0d/ce/3a21d87896bc7e3e9255e0ad5583ae31ae9e6b4b00e0bcb2a67e2b6acdbc/h5py-3.14.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8cbaf6910fa3983c46172666b0b8da7b7bd90d764399ca983236f2400436eeb", size = 4700675 }, + { url = "https://files.pythonhosted.org/packages/e7/ec/86f59025306dcc6deee5fda54d980d077075b8d9889aac80f158bd585f1b/h5py-3.14.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d90e6445ab7c146d7f7981b11895d70bc1dd91278a4f9f9028bc0c95e4a53f13", size = 4921632 }, + { url = "https://files.pythonhosted.org/packages/3f/6d/0084ed0b78d4fd3e7530c32491f2884140d9b06365dac8a08de726421d4a/h5py-3.14.0-cp313-cp313-win_amd64.whl", hash = "sha256:ae18e3de237a7a830adb76aaa68ad438d85fe6e19e0d99944a3ce46b772c69b3", size = 2852929 }, +] + +[[package]] +name = "ipython" +version = "8.37.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/85/31/10ac88f3357fc276dc8a64e8880c82e80e7459326ae1d0a211b40abf6665/ipython-8.37.0.tar.gz", hash = "sha256:ca815841e1a41a1e6b73a0b08f3038af9b2252564d01fc405356d34033012216", size = 5606088 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/91/d0/274fbf7b0b12643cbbc001ce13e6a5b1607ac4929d1b11c72460152c9fc3/ipython-8.37.0-py3-none-any.whl", hash = "sha256:ed87326596b878932dbcb171e3e698845434d8c61b8d8cd474bf663041a9dcf2", size = 831864 }, +] + +[[package]] +name = "ipython" +version = "9.3.0" +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/dc/09/4c7e06b96fbd203e06567b60fb41b06db606b6a82db6db7b2c85bb72a15c/ipython-9.3.0.tar.gz", hash = "sha256:79eb896f9f23f50ad16c3bc205f686f6e030ad246cc309c6279a242b14afe9d8", size = 4426460 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3c/99/9ed3d52d00f1846679e3aa12e2326ac7044b5e7f90dc822b60115fa533ca/ipython-9.3.0-py3-none-any.whl", hash = "sha256:1a0b6dd9221a1f5dddf725b57ac0cb6fddc7b5f470576231ae9162b9b3455a04", size = 605320 }, +] + +[[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.7" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "comm" }, + { name = "ipython", version = "8.37.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "ipython", version = "9.3.0", 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/3e/48/d3dbac45c2814cb73812f98dd6b38bbcc957a4e7bb31d6ea9c03bf94ed87/ipywidgets-8.1.7.tar.gz", hash = "sha256:15f1ac050b9ccbefd45dccfbb2ef6bed0029d8278682d569d71b8dd96bee0376", size = 116721 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/58/6a/9166369a2f092bd286d24e6307de555d63616e8ddb373ebad2b5635ca4cd/ipywidgets-8.1.7-py3-none-any.whl", hash = "sha256:764f2602d25471c213919b8a1997df04bef869251db4ca8efba1b76b1bd9f7bb", size = 139806 }, +] + +[[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.6.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jaxlib" }, + { name = "ml-dtypes" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.3.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "opt-einsum" }, + { name = "scipy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a3/b9/6d3d88fbab17696d00824ecac3d67feea1ff0abe12d3ebe64166a311ac04/jax-0.6.1.tar.gz", hash = "sha256:c4dcb93e1d34f80cf7adfa81f3fdab62a5068b69107b7a6117f8742ab37b6779", size = 2062260 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/dc/89/99805cd801919b4535e023bfe2de651f5a3ec4f5846a867cbc08006db455/jax-0.6.1-py3-none-any.whl", hash = "sha256:69a4e4506caa5466702bdfd0d7a13d1f9b7281d473885721100a3087fcabf8f9", size = 2394773 }, +] + +[[package]] +name = "jaxlib" +version = "0.6.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ml-dtypes" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.3.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "scipy" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/bb/75/f16efee0f23acef960c18af326d608cff2e27aefabffdc652ccec3004ff2/jaxlib-0.6.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:277cc7e9d657d0893a559261277b3eae916ad7fa73e300a629261fb537dca0f1", size = 53770292 }, + { url = "https://files.pythonhosted.org/packages/03/06/a135aa4747922bf79caf7132293f625e7921e27369bbbd24bd847c35140d/jaxlib-0.6.1-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:8106dc316eb440d07b9d4628a0c8e2acf76da5606742c9f5c33104aaa77b0ac2", size = 78686142 }, + { url = "https://files.pythonhosted.org/packages/17/c0/edc1c36586202a9ef2b0341d999cff5737e47a239e56440be650860f87f8/jaxlib-0.6.1-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:7ae5815ada71b69532ce443a11160a3ed25c67e82a294a0d89af9d4d27429434", size = 89047535 }, + { url = "https://files.pythonhosted.org/packages/43/2e/b9303b425efe12c144e9eb0a9aa59978020fecf20c1591f09e3181610680/jaxlib-0.6.1-cp310-cp310-win_amd64.whl", hash = "sha256:3301addee156f55d1f8079f80b314d89b80094740b7d64e5ec6e7ef2e1febbd7", size = 56824544 }, + { url = "https://files.pythonhosted.org/packages/80/62/a3ceb8f8dedb43b4f672b9f2f766029a9f94a016ee6d6974894ab0420eb0/jaxlib-0.6.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:02bac5153389f01616516a9fd1dcd6038d23ee50681dac14e4ddbc43ccb3133a", size = 53771693 }, + { url = "https://files.pythonhosted.org/packages/7d/40/eae51c403e98353e44aa1eaebf9522baf0488bccfc6f91dfe9d4f448c2ef/jaxlib-0.6.1-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:5a90ee7c59b2c00773026fbf918269c7a8676a6a81a34a03af919f7d7bdce9a8", size = 78689747 }, + { url = "https://files.pythonhosted.org/packages/6e/6a/94aeafd16d610b09dff8d917b8bdf5f985a6aa2b1a414bc1cfdf5421c09d/jaxlib-0.6.1-cp311-cp311-manylinux2014_x86_64.whl", hash = "sha256:11fcc4b1c741a1e0057f2ffa77d5a82bfe7ee97c3864ed88df67493e789b9173", size = 89050151 }, + { url = "https://files.pythonhosted.org/packages/e0/5e/f3aaf20ec803227eeb73ac06e2b451e338240f83fa9fb97fc9faaed1a520/jaxlib-0.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:2168217ec37bf951ca33377d3e0953178ba5cade95f194211d9ab2d53dcd2201", size = 56825361 }, + { url = "https://files.pythonhosted.org/packages/83/76/fec2772816bad8ee3f7b450bf3e0927d5e158c45a57b6cd92a48b80bfb1a/jaxlib-0.6.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e14195c23eecd559a61c31027b4172e912e5a50f630320918ffdfae83090ca5a", size = 53787339 }, + { url = "https://files.pythonhosted.org/packages/f2/ca/957fdfe2f10477004edca87cd392de21f1d5d3030773601ccd3a0ed0cf72/jaxlib-0.6.1-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:b58c29fe747622b70946ea87823ad39202cc83da3d93a5293b432173b738a868", size = 78695871 }, + { url = "https://files.pythonhosted.org/packages/79/7b/bb5e24fc929513e3c310b3054d6588b1b6bbf241b5ca12f6eb3d51458981/jaxlib-0.6.1-cp312-cp312-manylinux2014_x86_64.whl", hash = "sha256:d039124468565bbf39363b1504c190e6719e6af89a7948dee256f1dee813bb94", size = 89068176 }, + { url = "https://files.pythonhosted.org/packages/1b/12/2bc629d530ee1b333edc81a1d68d262bad2f813ce60fdd46e98d48cc8a20/jaxlib-0.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:76d6f65f3153ffb70e20a76b915d4431823cf70a786d86ba1b76a9c5bf66a0a4", size = 56851131 }, + { url = "https://files.pythonhosted.org/packages/8a/b8/6d540bd4b05d1fdfdb140772ea337051d16fb22fd6636d1be88a2848a930/jaxlib-0.6.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f4ca75d9d47a2e90099adfede0e9c926b83ef703d349b3289b8c88e861c09e5d", size = 53790062 }, + { url = "https://files.pythonhosted.org/packages/61/03/3fde775865a7d972bb9b23f584b0017aa61104ea6ffc32855b3c0297ca63/jaxlib-0.6.1-cp313-cp313-manylinux2014_aarch64.whl", hash = "sha256:d0c343c51b1052593edb603ddf58cf7f98812b2951ae6c45bd6e93e3e1f2f621", size = 78694596 }, + { url = "https://files.pythonhosted.org/packages/59/89/b0a229bf0bd333ef1a5690682deee86f3b38f55613f1423bb2eb26b2d15c/jaxlib-0.6.1-cp313-cp313-manylinux2014_x86_64.whl", hash = "sha256:e734be70fe3e1fa2a31415362721189d974d10a66b0f5396c84585587d101b15", size = 89067270 }, + { url = "https://files.pythonhosted.org/packages/f2/ea/cf861b8971f4362be8948fd0ef61a55866b8cc6f562ae0c9671a9d289f99/jaxlib-0.6.1-cp313-cp313-win_amd64.whl", hash = "sha256:b12c8842b2dfc0770ca3785e183f7bed3fa1c2596c720591dbfbe29a05045108", size = 56850186 }, + { url = "https://files.pythonhosted.org/packages/03/46/2495a0e387646d1d702d66aa5fd1675f392e959a7d8790b68dca33a8dad0/jaxlib-0.6.1-cp313-cp313t-manylinux2014_aarch64.whl", hash = "sha256:acfe91eb44c29dbbd1f1f65f9bd66e1aef4483f57ad5e3d645129f3ec9ecde2a", size = 78837195 }, + { url = "https://files.pythonhosted.org/packages/f2/d7/dccc6354589ebe6a78f591dbdf15f2ef41c81084e5d051a3d2d1674ecb8f/jaxlib-0.6.1-cp313-cp313t-manylinux2014_x86_64.whl", hash = "sha256:5e4f49113a527bcbac70c9e7074e95d8abfa35c3d67c2fed01f77a7abfd317aa", size = 89194164 }, +] + +[[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.15" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b9/7d/160595ca88ee87ac6ba95d82177d29ec60aaa63821d3077babb22ce031a5/jupyterlab_widgets-3.0.15.tar.gz", hash = "sha256:2920888a0c2922351a9202817957a68c07d99673504d6cd37345299e971bb08b", size = 213149 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/43/6a/ca128561b22b60bd5a0c4ea26649e68c8556b82bc70a0c396eebc977fe86/jupyterlab_widgets-3.0.15-py3-none-any.whl", hash = "sha256:d59023d7d7ef71400d51e6fee9a88867f6e65e10a4201605d2d7f3e8f012a31c", size = 216571 }, +] + +[[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", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.3.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, +] +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.16.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mypy-extensions" }, + { name = "pathspec" }, + { name = "tomli", marker = "python_full_version < '3.11'" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d4/38/13c2f1abae94d5ea0354e146b95a1be9b2137a0d506728e0da037c4276f6/mypy-1.16.0.tar.gz", hash = "sha256:84b94283f817e2aa6350a14b4a8fb2a35a53c286f97c9d30f53b63620e7af8ab", size = 3323139 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/64/5e/a0485f0608a3d67029d3d73cec209278b025e3493a3acfda3ef3a88540fd/mypy-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7909541fef256527e5ee9c0a7e2aeed78b6cda72ba44298d1334fe7881b05c5c", size = 10967416 }, + { url = "https://files.pythonhosted.org/packages/4b/53/5837c221f74c0d53a4bfc3003296f8179c3a2a7f336d7de7bbafbe96b688/mypy-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e71d6f0090c2256c713ed3d52711d01859c82608b5d68d4fa01a3fe30df95571", size = 10087654 }, + { url = "https://files.pythonhosted.org/packages/29/59/5fd2400352c3093bed4c09017fe671d26bc5bb7e6ef2d4bf85f2a2488104/mypy-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:936ccfdd749af4766be824268bfe22d1db9eb2f34a3ea1d00ffbe5b5265f5491", size = 11875192 }, + { url = "https://files.pythonhosted.org/packages/ad/3e/4bfec74663a64c2012f3e278dbc29ffe82b121bc551758590d1b6449ec0c/mypy-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4086883a73166631307fdd330c4a9080ce24913d4f4c5ec596c601b3a4bdd777", size = 12612939 }, + { url = "https://files.pythonhosted.org/packages/88/1f/fecbe3dcba4bf2ca34c26ca016383a9676711907f8db4da8354925cbb08f/mypy-1.16.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:feec38097f71797da0231997e0de3a58108c51845399669ebc532c815f93866b", size = 12874719 }, + { url = "https://files.pythonhosted.org/packages/f3/51/c2d280601cd816c43dfa512a759270d5a5ef638d7ac9bea9134c8305a12f/mypy-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:09a8da6a0ee9a9770b8ff61b39c0bb07971cda90e7297f4213741b48a0cc8d93", size = 9487053 }, + { url = "https://files.pythonhosted.org/packages/24/c4/ff2f79db7075c274fe85b5fff8797d29c6b61b8854c39e3b7feb556aa377/mypy-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9f826aaa7ff8443bac6a494cf743f591488ea940dd360e7dd330e30dd772a5ab", size = 10884498 }, + { url = "https://files.pythonhosted.org/packages/02/07/12198e83006235f10f6a7808917376b5d6240a2fd5dce740fe5d2ebf3247/mypy-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:82d056e6faa508501af333a6af192c700b33e15865bda49611e3d7d8358ebea2", size = 10011755 }, + { url = "https://files.pythonhosted.org/packages/f1/9b/5fd5801a72b5d6fb6ec0105ea1d0e01ab2d4971893076e558d4b6d6b5f80/mypy-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:089bedc02307c2548eb51f426e085546db1fa7dd87fbb7c9fa561575cf6eb1ff", size = 11800138 }, + { url = "https://files.pythonhosted.org/packages/2e/81/a117441ea5dfc3746431e51d78a4aca569c677aa225bca2cc05a7c239b61/mypy-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6a2322896003ba66bbd1318c10d3afdfe24e78ef12ea10e2acd985e9d684a666", size = 12533156 }, + { url = "https://files.pythonhosted.org/packages/3f/38/88ec57c6c86014d3f06251e00f397b5a7daa6888884d0abf187e4f5f587f/mypy-1.16.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:021a68568082c5b36e977d54e8f1de978baf401a33884ffcea09bd8e88a98f4c", size = 12742426 }, + { url = "https://files.pythonhosted.org/packages/bd/53/7e9d528433d56e6f6f77ccf24af6ce570986c2d98a5839e4c2009ef47283/mypy-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:54066fed302d83bf5128632d05b4ec68412e1f03ef2c300434057d66866cea4b", size = 9478319 }, + { url = "https://files.pythonhosted.org/packages/70/cf/158e5055e60ca2be23aec54a3010f89dcffd788732634b344fc9cb1e85a0/mypy-1.16.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c5436d11e89a3ad16ce8afe752f0f373ae9620841c50883dc96f8b8805620b13", size = 11062927 }, + { url = "https://files.pythonhosted.org/packages/94/34/cfff7a56be1609f5d10ef386342ce3494158e4d506516890142007e6472c/mypy-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f2622af30bf01d8fc36466231bdd203d120d7a599a6d88fb22bdcb9dbff84090", size = 10083082 }, + { url = "https://files.pythonhosted.org/packages/b3/7f/7242062ec6288c33d8ad89574df87c3903d394870e5e6ba1699317a65075/mypy-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d045d33c284e10a038f5e29faca055b90eee87da3fc63b8889085744ebabb5a1", size = 11828306 }, + { url = "https://files.pythonhosted.org/packages/6f/5f/b392f7b4f659f5b619ce5994c5c43caab3d80df2296ae54fa888b3d17f5a/mypy-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b4968f14f44c62e2ec4a038c8797a87315be8df7740dc3ee8d3bfe1c6bf5dba8", size = 12702764 }, + { url = "https://files.pythonhosted.org/packages/9b/c0/7646ef3a00fa39ac9bc0938626d9ff29d19d733011be929cfea59d82d136/mypy-1.16.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:eb14a4a871bb8efb1e4a50360d4e3c8d6c601e7a31028a2c79f9bb659b63d730", size = 12896233 }, + { url = "https://files.pythonhosted.org/packages/6d/38/52f4b808b3fef7f0ef840ee8ff6ce5b5d77381e65425758d515cdd4f5bb5/mypy-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:bd4e1ebe126152a7bbaa4daedd781c90c8f9643c79b9748caa270ad542f12bec", size = 9565547 }, + { url = "https://files.pythonhosted.org/packages/97/9c/ca03bdbefbaa03b264b9318a98950a9c683e06472226b55472f96ebbc53d/mypy-1.16.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a9e056237c89f1587a3be1a3a70a06a698d25e2479b9a2f57325ddaaffc3567b", size = 11059753 }, + { url = "https://files.pythonhosted.org/packages/36/92/79a969b8302cfe316027c88f7dc6fee70129490a370b3f6eb11d777749d0/mypy-1.16.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0b07e107affb9ee6ce1f342c07f51552d126c32cd62955f59a7db94a51ad12c0", size = 10073338 }, + { url = "https://files.pythonhosted.org/packages/14/9b/a943f09319167da0552d5cd722104096a9c99270719b1afeea60d11610aa/mypy-1.16.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c6fb60cbd85dc65d4d63d37cb5c86f4e3a301ec605f606ae3a9173e5cf34997b", size = 11827764 }, + { url = "https://files.pythonhosted.org/packages/ec/64/ff75e71c65a0cb6ee737287c7913ea155845a556c64144c65b811afdb9c7/mypy-1.16.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a7e32297a437cc915599e0578fa6bc68ae6a8dc059c9e009c628e1c47f91495d", size = 12701356 }, + { url = "https://files.pythonhosted.org/packages/0a/ad/0e93c18987a1182c350f7a5fab70550852f9fabe30ecb63bfbe51b602074/mypy-1.16.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:afe420c9380ccec31e744e8baff0d406c846683681025db3531b32db56962d52", size = 12900745 }, + { url = "https://files.pythonhosted.org/packages/28/5d/036c278d7a013e97e33f08c047fe5583ab4f1fc47c9a49f985f1cdd2a2d7/mypy-1.16.0-cp313-cp313-win_amd64.whl", hash = "sha256:55f9076c6ce55dd3f8cd0c6fff26a008ca8e5131b89d5ba6d86bd3f47e736eeb", size = 9572200 }, + { url = "https://files.pythonhosted.org/packages/99/a3/6ed10530dec8e0fdc890d81361260c9ef1f5e5c217ad8c9b21ecb2b8366b/mypy-1.16.0-py3-none-any.whl", hash = "sha256:29e1499864a3888bca5c1542f2d7232c6e586295183320caa95758fc84034031", size = 2265773 }, +] + +[[package]] +name = "mypy-extensions" +version = "1.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/6e/371856a3fb9d31ca8dac321cda606860fa4548858c0cc45d9d1d4ca2628b/mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558", size = 6343 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", size = 4963 }, +] + +[[package]] +name = "numpy" +version = "2.2.6" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.11'", +] +sdist = { url = "https://files.pythonhosted.org/packages/76/21/7d2a95e4bba9dc13d043ee156a356c0a8f0c6309dff6b21b4d71a073b8a8/numpy-2.2.6.tar.gz", hash = "sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd", size = 20276440 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9a/3e/ed6db5be21ce87955c0cbd3009f2803f59fa08df21b5df06862e2d8e2bdd/numpy-2.2.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b412caa66f72040e6d268491a59f2c43bf03eb6c96dd8f0307829feb7fa2b6fb", size = 21165245 }, + { url = "https://files.pythonhosted.org/packages/22/c2/4b9221495b2a132cc9d2eb862e21d42a009f5a60e45fc44b00118c174bff/numpy-2.2.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e41fd67c52b86603a91c1a505ebaef50b3314de0213461c7a6e99c9a3beff90", size = 14360048 }, + { url = "https://files.pythonhosted.org/packages/fd/77/dc2fcfc66943c6410e2bf598062f5959372735ffda175b39906d54f02349/numpy-2.2.6-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:37e990a01ae6ec7fe7fa1c26c55ecb672dd98b19c3d0e1d1f326fa13cb38d163", size = 5340542 }, + { url = "https://files.pythonhosted.org/packages/7a/4f/1cb5fdc353a5f5cc7feb692db9b8ec2c3d6405453f982435efc52561df58/numpy-2.2.6-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:5a6429d4be8ca66d889b7cf70f536a397dc45ba6faeb5f8c5427935d9592e9cf", size = 6878301 }, + { url = "https://files.pythonhosted.org/packages/eb/17/96a3acd228cec142fcb8723bd3cc39c2a474f7dcf0a5d16731980bcafa95/numpy-2.2.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efd28d4e9cd7d7a8d39074a4d44c63eda73401580c5c76acda2ce969e0a38e83", size = 14297320 }, + { url = "https://files.pythonhosted.org/packages/b4/63/3de6a34ad7ad6646ac7d2f55ebc6ad439dbbf9c4370017c50cf403fb19b5/numpy-2.2.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc7b73d02efb0e18c000e9ad8b83480dfcd5dfd11065997ed4c6747470ae8915", size = 16801050 }, + { url = "https://files.pythonhosted.org/packages/07/b6/89d837eddef52b3d0cec5c6ba0456c1bf1b9ef6a6672fc2b7873c3ec4e2e/numpy-2.2.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:74d4531beb257d2c3f4b261bfb0fc09e0f9ebb8842d82a7b4209415896adc680", size = 15807034 }, + { url = "https://files.pythonhosted.org/packages/01/c8/dc6ae86e3c61cfec1f178e5c9f7858584049b6093f843bca541f94120920/numpy-2.2.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8fc377d995680230e83241d8a96def29f204b5782f371c532579b4f20607a289", size = 18614185 }, + { url = "https://files.pythonhosted.org/packages/5b/c5/0064b1b7e7c89137b471ccec1fd2282fceaae0ab3a9550f2568782d80357/numpy-2.2.6-cp310-cp310-win32.whl", hash = "sha256:b093dd74e50a8cba3e873868d9e93a85b78e0daf2e98c6797566ad8044e8363d", size = 6527149 }, + { url = "https://files.pythonhosted.org/packages/a3/dd/4b822569d6b96c39d1215dbae0582fd99954dcbcf0c1a13c61783feaca3f/numpy-2.2.6-cp310-cp310-win_amd64.whl", hash = "sha256:f0fd6321b839904e15c46e0d257fdd101dd7f530fe03fd6359c1ea63738703f3", size = 12904620 }, + { url = "https://files.pythonhosted.org/packages/da/a8/4f83e2aa666a9fbf56d6118faaaf5f1974d456b1823fda0a176eff722839/numpy-2.2.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f9f1adb22318e121c5c69a09142811a201ef17ab257a1e66ca3025065b7f53ae", size = 21176963 }, + { url = "https://files.pythonhosted.org/packages/b3/2b/64e1affc7972decb74c9e29e5649fac940514910960ba25cd9af4488b66c/numpy-2.2.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c820a93b0255bc360f53eca31a0e676fd1101f673dda8da93454a12e23fc5f7a", size = 14406743 }, + { url = "https://files.pythonhosted.org/packages/4a/9f/0121e375000b5e50ffdd8b25bf78d8e1a5aa4cca3f185d41265198c7b834/numpy-2.2.6-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:3d70692235e759f260c3d837193090014aebdf026dfd167834bcba43e30c2a42", size = 5352616 }, + { url = "https://files.pythonhosted.org/packages/31/0d/b48c405c91693635fbe2dcd7bc84a33a602add5f63286e024d3b6741411c/numpy-2.2.6-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:481b49095335f8eed42e39e8041327c05b0f6f4780488f61286ed3c01368d491", size = 6889579 }, + { url = "https://files.pythonhosted.org/packages/52/b8/7f0554d49b565d0171eab6e99001846882000883998e7b7d9f0d98b1f934/numpy-2.2.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b64d8d4d17135e00c8e346e0a738deb17e754230d7e0810ac5012750bbd85a5a", size = 14312005 }, + { url = "https://files.pythonhosted.org/packages/b3/dd/2238b898e51bd6d389b7389ffb20d7f4c10066d80351187ec8e303a5a475/numpy-2.2.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba10f8411898fc418a521833e014a77d3ca01c15b0c6cdcce6a0d2897e6dbbdf", size = 16821570 }, + { url = "https://files.pythonhosted.org/packages/83/6c/44d0325722cf644f191042bf47eedad61c1e6df2432ed65cbe28509d404e/numpy-2.2.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:bd48227a919f1bafbdda0583705e547892342c26fb127219d60a5c36882609d1", size = 15818548 }, + { url = "https://files.pythonhosted.org/packages/ae/9d/81e8216030ce66be25279098789b665d49ff19eef08bfa8cb96d4957f422/numpy-2.2.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9551a499bf125c1d4f9e250377c1ee2eddd02e01eac6644c080162c0c51778ab", size = 18620521 }, + { url = "https://files.pythonhosted.org/packages/6a/fd/e19617b9530b031db51b0926eed5345ce8ddc669bb3bc0044b23e275ebe8/numpy-2.2.6-cp311-cp311-win32.whl", hash = "sha256:0678000bb9ac1475cd454c6b8c799206af8107e310843532b04d49649c717a47", size = 6525866 }, + { url = "https://files.pythonhosted.org/packages/31/0a/f354fb7176b81747d870f7991dc763e157a934c717b67b58456bc63da3df/numpy-2.2.6-cp311-cp311-win_amd64.whl", hash = "sha256:e8213002e427c69c45a52bbd94163084025f533a55a59d6f9c5b820774ef3303", size = 12907455 }, + { url = "https://files.pythonhosted.org/packages/82/5d/c00588b6cf18e1da539b45d3598d3557084990dcc4331960c15ee776ee41/numpy-2.2.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:41c5a21f4a04fa86436124d388f6ed60a9343a6f767fced1a8a71c3fbca038ff", size = 20875348 }, + { url = "https://files.pythonhosted.org/packages/66/ee/560deadcdde6c2f90200450d5938f63a34b37e27ebff162810f716f6a230/numpy-2.2.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:de749064336d37e340f640b05f24e9e3dd678c57318c7289d222a8a2f543e90c", size = 14119362 }, + { url = "https://files.pythonhosted.org/packages/3c/65/4baa99f1c53b30adf0acd9a5519078871ddde8d2339dc5a7fde80d9d87da/numpy-2.2.6-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:894b3a42502226a1cac872f840030665f33326fc3dac8e57c607905773cdcde3", size = 5084103 }, + { url = "https://files.pythonhosted.org/packages/cc/89/e5a34c071a0570cc40c9a54eb472d113eea6d002e9ae12bb3a8407fb912e/numpy-2.2.6-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:71594f7c51a18e728451bb50cc60a3ce4e6538822731b2933209a1f3614e9282", size = 6625382 }, + { url = "https://files.pythonhosted.org/packages/f8/35/8c80729f1ff76b3921d5c9487c7ac3de9b2a103b1cd05e905b3090513510/numpy-2.2.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2618db89be1b4e05f7a1a847a9c1c0abd63e63a1607d892dd54668dd92faf87", size = 14018462 }, + { url = "https://files.pythonhosted.org/packages/8c/3d/1e1db36cfd41f895d266b103df00ca5b3cbe965184df824dec5c08c6b803/numpy-2.2.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd83c01228a688733f1ded5201c678f0c53ecc1006ffbc404db9f7a899ac6249", size = 16527618 }, + { url = "https://files.pythonhosted.org/packages/61/c6/03ed30992602c85aa3cd95b9070a514f8b3c33e31124694438d88809ae36/numpy-2.2.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:37c0ca431f82cd5fa716eca9506aefcabc247fb27ba69c5062a6d3ade8cf8f49", size = 15505511 }, + { url = "https://files.pythonhosted.org/packages/b7/25/5761d832a81df431e260719ec45de696414266613c9ee268394dd5ad8236/numpy-2.2.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fe27749d33bb772c80dcd84ae7e8df2adc920ae8297400dabec45f0dedb3f6de", size = 18313783 }, + { url = "https://files.pythonhosted.org/packages/57/0a/72d5a3527c5ebffcd47bde9162c39fae1f90138c961e5296491ce778e682/numpy-2.2.6-cp312-cp312-win32.whl", hash = "sha256:4eeaae00d789f66c7a25ac5f34b71a7035bb474e679f410e5e1a94deb24cf2d4", size = 6246506 }, + { url = "https://files.pythonhosted.org/packages/36/fa/8c9210162ca1b88529ab76b41ba02d433fd54fecaf6feb70ef9f124683f1/numpy-2.2.6-cp312-cp312-win_amd64.whl", hash = "sha256:c1f9540be57940698ed329904db803cf7a402f3fc200bfe599334c9bd84a40b2", size = 12614190 }, + { url = "https://files.pythonhosted.org/packages/f9/5c/6657823f4f594f72b5471f1db1ab12e26e890bb2e41897522d134d2a3e81/numpy-2.2.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0811bb762109d9708cca4d0b13c4f67146e3c3b7cf8d34018c722adb2d957c84", size = 20867828 }, + { url = "https://files.pythonhosted.org/packages/dc/9e/14520dc3dadf3c803473bd07e9b2bd1b69bc583cb2497b47000fed2fa92f/numpy-2.2.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:287cc3162b6f01463ccd86be154f284d0893d2b3ed7292439ea97eafa8170e0b", size = 14143006 }, + { url = "https://files.pythonhosted.org/packages/4f/06/7e96c57d90bebdce9918412087fc22ca9851cceaf5567a45c1f404480e9e/numpy-2.2.6-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:f1372f041402e37e5e633e586f62aa53de2eac8d98cbfb822806ce4bbefcb74d", size = 5076765 }, + { url = "https://files.pythonhosted.org/packages/73/ed/63d920c23b4289fdac96ddbdd6132e9427790977d5457cd132f18e76eae0/numpy-2.2.6-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:55a4d33fa519660d69614a9fad433be87e5252f4b03850642f88993f7b2ca566", size = 6617736 }, + { url = "https://files.pythonhosted.org/packages/85/c5/e19c8f99d83fd377ec8c7e0cf627a8049746da54afc24ef0a0cb73d5dfb5/numpy-2.2.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f92729c95468a2f4f15e9bb94c432a9229d0d50de67304399627a943201baa2f", size = 14010719 }, + { url = "https://files.pythonhosted.org/packages/19/49/4df9123aafa7b539317bf6d342cb6d227e49f7a35b99c287a6109b13dd93/numpy-2.2.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bc23a79bfabc5d056d106f9befb8d50c31ced2fbc70eedb8155aec74a45798f", size = 16526072 }, + { url = "https://files.pythonhosted.org/packages/b2/6c/04b5f47f4f32f7c2b0e7260442a8cbcf8168b0e1a41ff1495da42f42a14f/numpy-2.2.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e3143e4451880bed956e706a3220b4e5cf6172ef05fcc397f6f36a550b1dd868", size = 15503213 }, + { url = "https://files.pythonhosted.org/packages/17/0a/5cd92e352c1307640d5b6fec1b2ffb06cd0dabe7d7b8227f97933d378422/numpy-2.2.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b4f13750ce79751586ae2eb824ba7e1e8dba64784086c98cdbbcc6a42112ce0d", size = 18316632 }, + { url = "https://files.pythonhosted.org/packages/f0/3b/5cba2b1d88760ef86596ad0f3d484b1cbff7c115ae2429678465057c5155/numpy-2.2.6-cp313-cp313-win32.whl", hash = "sha256:5beb72339d9d4fa36522fc63802f469b13cdbe4fdab4a288f0c441b74272ebfd", size = 6244532 }, + { url = "https://files.pythonhosted.org/packages/cb/3b/d58c12eafcb298d4e6d0d40216866ab15f59e55d148a5658bb3132311fcf/numpy-2.2.6-cp313-cp313-win_amd64.whl", hash = "sha256:b0544343a702fa80c95ad5d3d608ea3599dd54d4632df855e4c8d24eb6ecfa1c", size = 12610885 }, + { url = "https://files.pythonhosted.org/packages/6b/9e/4bf918b818e516322db999ac25d00c75788ddfd2d2ade4fa66f1f38097e1/numpy-2.2.6-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0bca768cd85ae743b2affdc762d617eddf3bcf8724435498a1e80132d04879e6", size = 20963467 }, + { url = "https://files.pythonhosted.org/packages/61/66/d2de6b291507517ff2e438e13ff7b1e2cdbdb7cb40b3ed475377aece69f9/numpy-2.2.6-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:fc0c5673685c508a142ca65209b4e79ed6740a4ed6b2267dbba90f34b0b3cfda", size = 14225144 }, + { url = "https://files.pythonhosted.org/packages/e4/25/480387655407ead912e28ba3a820bc69af9adf13bcbe40b299d454ec011f/numpy-2.2.6-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:5bd4fc3ac8926b3819797a7c0e2631eb889b4118a9898c84f585a54d475b7e40", size = 5200217 }, + { url = "https://files.pythonhosted.org/packages/aa/4a/6e313b5108f53dcbf3aca0c0f3e9c92f4c10ce57a0a721851f9785872895/numpy-2.2.6-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:fee4236c876c4e8369388054d02d0e9bb84821feb1a64dd59e137e6511a551f8", size = 6712014 }, + { url = "https://files.pythonhosted.org/packages/b7/30/172c2d5c4be71fdf476e9de553443cf8e25feddbe185e0bd88b096915bcc/numpy-2.2.6-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1dda9c7e08dc141e0247a5b8f49cf05984955246a327d4c48bda16821947b2f", size = 14077935 }, + { url = "https://files.pythonhosted.org/packages/12/fb/9e743f8d4e4d3c710902cf87af3512082ae3d43b945d5d16563f26ec251d/numpy-2.2.6-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f447e6acb680fd307f40d3da4852208af94afdfab89cf850986c3ca00562f4fa", size = 16600122 }, + { url = "https://files.pythonhosted.org/packages/12/75/ee20da0e58d3a66f204f38916757e01e33a9737d0b22373b3eb5a27358f9/numpy-2.2.6-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:389d771b1623ec92636b0786bc4ae56abafad4a4c513d36a55dce14bd9ce8571", size = 15586143 }, + { url = "https://files.pythonhosted.org/packages/76/95/bef5b37f29fc5e739947e9ce5179ad402875633308504a52d188302319c8/numpy-2.2.6-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8e9ace4a37db23421249ed236fdcdd457d671e25146786dfc96835cd951aa7c1", size = 18385260 }, + { url = "https://files.pythonhosted.org/packages/09/04/f2f83279d287407cf36a7a8053a5abe7be3622a4363337338f2585e4afda/numpy-2.2.6-cp313-cp313t-win32.whl", hash = "sha256:038613e9fb8c72b0a41f025a7e4c3f0b7a1b5d768ece4796b674c8f3fe13efff", size = 6377225 }, + { url = "https://files.pythonhosted.org/packages/67/0e/35082d13c09c02c011cf21570543d202ad929d961c02a147493cb0c2bdf5/numpy-2.2.6-cp313-cp313t-win_amd64.whl", hash = "sha256:6031dd6dfecc0cf9f668681a37648373bddd6421fff6c66ec1624eed0180ee06", size = 12771374 }, + { url = "https://files.pythonhosted.org/packages/9e/3b/d94a75f4dbf1ef5d321523ecac21ef23a3cd2ac8b78ae2aac40873590229/numpy-2.2.6-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0b605b275d7bd0c640cad4e5d30fa701a8d59302e127e5f79138ad62762c3e3d", size = 21040391 }, + { url = "https://files.pythonhosted.org/packages/17/f4/09b2fa1b58f0fb4f7c7963a1649c64c4d315752240377ed74d9cd878f7b5/numpy-2.2.6-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:7befc596a7dc9da8a337f79802ee8adb30a552a94f792b9c9d18c840055907db", size = 6786754 }, + { url = "https://files.pythonhosted.org/packages/af/30/feba75f143bdc868a1cc3f44ccfa6c4b9ec522b36458e738cd00f67b573f/numpy-2.2.6-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce47521a4754c8f4593837384bd3424880629f718d87c5d44f8ed763edd63543", size = 16643476 }, + { url = "https://files.pythonhosted.org/packages/37/48/ac2a9584402fb6c0cd5b5d1a91dcf176b15760130dd386bbafdbfe3640bf/numpy-2.2.6-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d042d24c90c41b54fd506da306759e06e568864df8ec17ccc17e9e884634fd00", size = 12812666 }, +] + +[[package]] +name = "numpy" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.13'", + "python_full_version == '3.12.*'", + "python_full_version == '3.11.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/f3/db/8e12381333aea300890829a0a36bfa738cac95475d88982d538725143fd9/numpy-2.3.0.tar.gz", hash = "sha256:581f87f9e9e9db2cba2141400e160e9dd644ee248788d6f90636eeb8fd9260a6", size = 20382813 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fd/5f/df67435257d827eb3b8af66f585223dc2c3f2eb7ad0b50cb1dae2f35f494/numpy-2.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c3c9fdde0fa18afa1099d6257eb82890ea4f3102847e692193b54e00312a9ae9", size = 21199688 }, + { url = "https://files.pythonhosted.org/packages/e5/ce/aad219575055d6c9ef29c8c540c81e1c38815d3be1fe09cdbe53d48ee838/numpy-2.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:46d16f72c2192da7b83984aa5455baee640e33a9f1e61e656f29adf55e406c2b", size = 14359277 }, + { url = "https://files.pythonhosted.org/packages/29/6b/2d31da8e6d2ec99bed54c185337a87f8fbeccc1cd9804e38217e92f3f5e2/numpy-2.3.0-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:a0be278be9307c4ab06b788f2a077f05e180aea817b3e41cebbd5aaf7bd85ed3", size = 5376069 }, + { url = "https://files.pythonhosted.org/packages/7d/2a/6c59a062397553ec7045c53d5fcdad44e4536e54972faa2ba44153bca984/numpy-2.3.0-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:99224862d1412d2562248d4710126355d3a8db7672170a39d6909ac47687a8a4", size = 6913057 }, + { url = "https://files.pythonhosted.org/packages/d5/5a/8df16f258d28d033e4f359e29d3aeb54663243ac7b71504e89deeb813202/numpy-2.3.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:2393a914db64b0ead0ab80c962e42d09d5f385802006a6c87835acb1f58adb96", size = 14568083 }, + { url = "https://files.pythonhosted.org/packages/0a/92/0528a563dfc2cdccdcb208c0e241a4bb500d7cde218651ffb834e8febc50/numpy-2.3.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:7729c8008d55e80784bd113787ce876ca117185c579c0d626f59b87d433ea779", size = 16929402 }, + { url = "https://files.pythonhosted.org/packages/e4/2f/e7a8c8d4a2212c527568d84f31587012cf5497a7271ea1f23332142f634e/numpy-2.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:06d4fb37a8d383b769281714897420c5cc3545c79dc427df57fc9b852ee0bf58", size = 15879193 }, + { url = "https://files.pythonhosted.org/packages/e2/c3/dada3f005953847fe35f42ac0fe746f6e1ea90b4c6775e4be605dcd7b578/numpy-2.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c39ec392b5db5088259c68250e342612db82dc80ce044cf16496cf14cf6bc6f8", size = 18665318 }, + { url = "https://files.pythonhosted.org/packages/3b/ae/3f448517dedefc8dd64d803f9d51a8904a48df730e00a3c5fb1e75a60620/numpy-2.3.0-cp311-cp311-win32.whl", hash = "sha256:ee9d3ee70d62827bc91f3ea5eee33153212c41f639918550ac0475e3588da59f", size = 6601108 }, + { url = "https://files.pythonhosted.org/packages/8c/4a/556406d2bb2b9874c8cbc840c962683ac28f21efbc9b01177d78f0199ca1/numpy-2.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:43c55b6a860b0eb44d42341438b03513cf3879cb3617afb749ad49307e164edd", size = 13021525 }, + { url = "https://files.pythonhosted.org/packages/ed/ee/bf54278aef30335ffa9a189f869ea09e1a195b3f4b93062164a3b02678a7/numpy-2.3.0-cp311-cp311-win_arm64.whl", hash = "sha256:2e6a1409eee0cb0316cb64640a49a49ca44deb1a537e6b1121dc7c458a1299a8", size = 10170327 }, + { url = "https://files.pythonhosted.org/packages/89/59/9df493df81ac6f76e9f05cdbe013cdb0c9a37b434f6e594f5bd25e278908/numpy-2.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:389b85335838155a9076e9ad7f8fdba0827496ec2d2dc32ce69ce7898bde03ba", size = 20897025 }, + { url = "https://files.pythonhosted.org/packages/2f/86/4ff04335901d6cf3a6bb9c748b0097546ae5af35e455ae9b962ebff4ecd7/numpy-2.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9498f60cd6bb8238d8eaf468a3d5bb031d34cd12556af53510f05fcf581c1b7e", size = 14129882 }, + { url = "https://files.pythonhosted.org/packages/71/8d/a942cd4f959de7f08a79ab0c7e6cecb7431d5403dce78959a726f0f57aa1/numpy-2.3.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:622a65d40d8eb427d8e722fd410ac3ad4958002f109230bc714fa551044ebae2", size = 5110181 }, + { url = "https://files.pythonhosted.org/packages/86/5d/45850982efc7b2c839c5626fb67fbbc520d5b0d7c1ba1ae3651f2f74c296/numpy-2.3.0-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:b9446d9d8505aadadb686d51d838f2b6688c9e85636a0c3abaeb55ed54756459", size = 6647581 }, + { url = "https://files.pythonhosted.org/packages/1a/c0/c871d4a83f93b00373d3eebe4b01525eee8ef10b623a335ec262b58f4dc1/numpy-2.3.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:50080245365d75137a2bf46151e975de63146ae6d79f7e6bd5c0e85c9931d06a", size = 14262317 }, + { url = "https://files.pythonhosted.org/packages/b7/f6/bc47f5fa666d5ff4145254f9e618d56e6a4ef9b874654ca74c19113bb538/numpy-2.3.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:c24bb4113c66936eeaa0dc1e47c74770453d34f46ee07ae4efd853a2ed1ad10a", size = 16633919 }, + { url = "https://files.pythonhosted.org/packages/f5/b4/65f48009ca0c9b76df5f404fccdea5a985a1bb2e34e97f21a17d9ad1a4ba/numpy-2.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4d8d294287fdf685281e671886c6dcdf0291a7c19db3e5cb4178d07ccf6ecc67", size = 15567651 }, + { url = "https://files.pythonhosted.org/packages/f1/62/5367855a2018578e9334ed08252ef67cc302e53edc869666f71641cad40b/numpy-2.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6295f81f093b7f5769d1728a6bd8bf7466de2adfa771ede944ce6711382b89dc", size = 18361723 }, + { url = "https://files.pythonhosted.org/packages/d4/75/5baed8cd867eabee8aad1e74d7197d73971d6a3d40c821f1848b8fab8b84/numpy-2.3.0-cp312-cp312-win32.whl", hash = "sha256:e6648078bdd974ef5d15cecc31b0c410e2e24178a6e10bf511e0557eed0f2570", size = 6318285 }, + { url = "https://files.pythonhosted.org/packages/bc/49/d5781eaa1a15acb3b3a3f49dc9e2ff18d92d0ce5c2976f4ab5c0a7360250/numpy-2.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:0898c67a58cdaaf29994bc0e2c65230fd4de0ac40afaf1584ed0b02cd74c6fdd", size = 12732594 }, + { url = "https://files.pythonhosted.org/packages/c2/1c/6d343e030815c7c97a1f9fbad00211b47717c7fe446834c224bd5311e6f1/numpy-2.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:bd8df082b6c4695753ad6193018c05aac465d634834dca47a3ae06d4bb22d9ea", size = 9891498 }, + { url = "https://files.pythonhosted.org/packages/73/fc/1d67f751fd4dbafc5780244fe699bc4084268bad44b7c5deb0492473127b/numpy-2.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5754ab5595bfa2c2387d241296e0381c21f44a4b90a776c3c1d39eede13a746a", size = 20889633 }, + { url = "https://files.pythonhosted.org/packages/e8/95/73ffdb69e5c3f19ec4530f8924c4386e7ba097efc94b9c0aff607178ad94/numpy-2.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d11fa02f77752d8099573d64e5fe33de3229b6632036ec08f7080f46b6649959", size = 14151683 }, + { url = "https://files.pythonhosted.org/packages/64/d5/06d4bb31bb65a1d9c419eb5676173a2f90fd8da3c59f816cc54c640ce265/numpy-2.3.0-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:aba48d17e87688a765ab1cd557882052f238e2f36545dfa8e29e6a91aef77afe", size = 5102683 }, + { url = "https://files.pythonhosted.org/packages/12/8b/6c2cef44f8ccdc231f6b56013dff1d71138c48124334aded36b1a1b30c5a/numpy-2.3.0-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:4dc58865623023b63b10d52f18abaac3729346a7a46a778381e0e3af4b7f3beb", size = 6640253 }, + { url = "https://files.pythonhosted.org/packages/62/aa/fca4bf8de3396ddb59544df9b75ffe5b73096174de97a9492d426f5cd4aa/numpy-2.3.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:df470d376f54e052c76517393fa443758fefcdd634645bc9c1f84eafc67087f0", size = 14258658 }, + { url = "https://files.pythonhosted.org/packages/1c/12/734dce1087eed1875f2297f687e671cfe53a091b6f2f55f0c7241aad041b/numpy-2.3.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:87717eb24d4a8a64683b7a4e91ace04e2f5c7c77872f823f02a94feee186168f", size = 16628765 }, + { url = "https://files.pythonhosted.org/packages/48/03/ffa41ade0e825cbcd5606a5669962419528212a16082763fc051a7247d76/numpy-2.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d8fa264d56882b59dcb5ea4d6ab6f31d0c58a57b41aec605848b6eb2ef4a43e8", size = 15564335 }, + { url = "https://files.pythonhosted.org/packages/07/58/869398a11863310aee0ff85a3e13b4c12f20d032b90c4b3ee93c3b728393/numpy-2.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e651756066a0eaf900916497e20e02fe1ae544187cb0fe88de981671ee7f6270", size = 18360608 }, + { url = "https://files.pythonhosted.org/packages/2f/8a/5756935752ad278c17e8a061eb2127c9a3edf4ba2c31779548b336f23c8d/numpy-2.3.0-cp313-cp313-win32.whl", hash = "sha256:e43c3cce3b6ae5f94696669ff2a6eafd9a6b9332008bafa4117af70f4b88be6f", size = 6310005 }, + { url = "https://files.pythonhosted.org/packages/08/60/61d60cf0dfc0bf15381eaef46366ebc0c1a787856d1db0c80b006092af84/numpy-2.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:81ae0bf2564cf475f94be4a27ef7bcf8af0c3e28da46770fc904da9abd5279b5", size = 12729093 }, + { url = "https://files.pythonhosted.org/packages/66/31/2f2f2d2b3e3c32d5753d01437240feaa32220b73258c9eef2e42a0832866/numpy-2.3.0-cp313-cp313-win_arm64.whl", hash = "sha256:c8738baa52505fa6e82778580b23f945e3578412554d937093eac9205e845e6e", size = 9885689 }, + { url = "https://files.pythonhosted.org/packages/f1/89/c7828f23cc50f607ceb912774bb4cff225ccae7131c431398ad8400e2c98/numpy-2.3.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:39b27d8b38942a647f048b675f134dd5a567f95bfff481f9109ec308515c51d8", size = 20986612 }, + { url = "https://files.pythonhosted.org/packages/dd/46/79ecf47da34c4c50eedec7511e53d57ffdfd31c742c00be7dc1d5ffdb917/numpy-2.3.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:0eba4a1ea88f9a6f30f56fdafdeb8da3774349eacddab9581a21234b8535d3d3", size = 14298953 }, + { url = "https://files.pythonhosted.org/packages/59/44/f6caf50713d6ff4480640bccb2a534ce1d8e6e0960c8f864947439f0ee95/numpy-2.3.0-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:b0f1f11d0a1da54927436505a5a7670b154eac27f5672afc389661013dfe3d4f", size = 5225806 }, + { url = "https://files.pythonhosted.org/packages/a6/43/e1fd1aca7c97e234dd05e66de4ab7a5be54548257efcdd1bc33637e72102/numpy-2.3.0-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:690d0a5b60a47e1f9dcec7b77750a4854c0d690e9058b7bef3106e3ae9117808", size = 6735169 }, + { url = "https://files.pythonhosted.org/packages/84/89/f76f93b06a03177c0faa7ca94d0856c4e5c4bcaf3c5f77640c9ed0303e1c/numpy-2.3.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:8b51ead2b258284458e570942137155978583e407babc22e3d0ed7af33ce06f8", size = 14330701 }, + { url = "https://files.pythonhosted.org/packages/aa/f5/4858c3e9ff7a7d64561b20580cf7cc5d085794bd465a19604945d6501f6c/numpy-2.3.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:aaf81c7b82c73bd9b45e79cfb9476cb9c29e937494bfe9092c26aece812818ad", size = 16692983 }, + { url = "https://files.pythonhosted.org/packages/08/17/0e3b4182e691a10e9483bcc62b4bb8693dbf9ea5dc9ba0b77a60435074bb/numpy-2.3.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:f420033a20b4f6a2a11f585f93c843ac40686a7c3fa514060a97d9de93e5e72b", size = 15641435 }, + { url = "https://files.pythonhosted.org/packages/4e/d5/463279fda028d3c1efa74e7e8d507605ae87f33dbd0543cf4c4527c8b882/numpy-2.3.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:d344ca32ab482bcf8735d8f95091ad081f97120546f3d250240868430ce52555", size = 18433798 }, + { url = "https://files.pythonhosted.org/packages/0e/1e/7a9d98c886d4c39a2b4d3a7c026bffcf8fbcaf518782132d12a301cfc47a/numpy-2.3.0-cp313-cp313t-win32.whl", hash = "sha256:48a2e8eaf76364c32a1feaa60d6925eaf32ed7a040183b807e02674305beef61", size = 6438632 }, + { url = "https://files.pythonhosted.org/packages/fe/ab/66fc909931d5eb230107d016861824f335ae2c0533f422e654e5ff556784/numpy-2.3.0-cp313-cp313t-win_amd64.whl", hash = "sha256:ba17f93a94e503551f154de210e4d50c5e3ee20f7e7a1b5f6ce3f22d419b93bb", size = 12868491 }, + { url = "https://files.pythonhosted.org/packages/ee/e8/2c8a1c9e34d6f6d600c83d5ce5b71646c32a13f34ca5c518cc060639841c/numpy-2.3.0-cp313-cp313t-win_arm64.whl", hash = "sha256:f14e016d9409680959691c109be98c436c6249eaf7f118b424679793607b5944", size = 9935345 }, + { url = "https://files.pythonhosted.org/packages/6a/a2/f8c1133f90eaa1c11bbbec1dc28a42054d0ce74bc2c9838c5437ba5d4980/numpy-2.3.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:80b46117c7359de8167cc00a2c7d823bdd505e8c7727ae0871025a86d668283b", size = 21070759 }, + { url = "https://files.pythonhosted.org/packages/6c/e0/4c05fc44ba28463096eee5ae2a12832c8d2759cc5bcec34ae33386d3ff83/numpy-2.3.0-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:5814a0f43e70c061f47abd5857d120179609ddc32a613138cbb6c4e9e2dbdda5", size = 5301054 }, + { url = "https://files.pythonhosted.org/packages/8a/3b/6c06cdebe922bbc2a466fe2105f50f661238ea223972a69c7deb823821e7/numpy-2.3.0-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:ef6c1e88fd6b81ac6d215ed71dc8cd027e54d4bf1d2682d362449097156267a2", size = 6817520 }, + { url = "https://files.pythonhosted.org/packages/9d/a3/1e536797fd10eb3c5dbd2e376671667c9af19e241843548575267242ea02/numpy-2.3.0-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:33a5a12a45bb82d9997e2c0b12adae97507ad7c347546190a18ff14c28bbca12", size = 14398078 }, + { url = "https://files.pythonhosted.org/packages/7c/61/9d574b10d9368ecb1a0c923952aa593510a20df4940aa615b3a71337c8db/numpy-2.3.0-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:54dfc8681c1906d239e95ab1508d0a533c4a9505e52ee2d71a5472b04437ef97", size = 16751324 }, + { url = "https://files.pythonhosted.org/packages/39/de/bcad52ce972dc26232629ca3a99721fd4b22c1d2bda84d5db6541913ef9c/numpy-2.3.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:e017a8a251ff4d18d71f139e28bdc7c31edba7a507f72b1414ed902cbe48c74d", size = 12924237 }, +] + +[[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 = "25.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469 }, +] + +[[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.8" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fe/8b/3c73abc9c759ecd3f1f7ceff6685840859e8070c4d947c93fae71f6a0bf2/platformdirs-4.3.8.tar.gz", hash = "sha256:3d512d96e16bcb959a814c9f348431070822a6496326a4be0911c40b5a74c2bc", size = 21362 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fe/39/979e8e21520d4e47a0bbe349e2713c0aac6f3d853d0e5b34d76206c439aa/platformdirs-4.3.8-py3-none-any.whl", hash = "sha256:ff7059bb7eb1179e2685604f4aaf157cfd9535242bd23742eadc3c13542139b4", size = 18567 }, +] + +[[package]] +name = "prompt-toolkit" +version = "3.0.51" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "wcwidth" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/bb/6e/9d084c929dfe9e3bfe0c6a47e31f78a25c54627d64a66e884a8bf5474f1c/prompt_toolkit-3.0.51.tar.gz", hash = "sha256:931a162e3b27fc90c86f1b48bb1fb2c528c2761475e57c9c06de13311c7b54ed", size = 428940 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ce/4f/5249960887b1fbe561d9ff265496d170b55a735b76724f10ef19f9e40716/prompt_toolkit-3.0.51-py3-none-any.whl", hash = "sha256:52742911fde84e2d423e2f9a4cf1de7d7ac4e51958f648d9540e0fb8db077b07", size = 387810 }, +] + +[[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.13.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/04/6e/1f4a62078e4d95d82367f24e685aef3a672abfd27d1a868068fed4ed2254/pycodestyle-2.13.0.tar.gz", hash = "sha256:c8415bf09abe81d9c7f872502a6eee881fbe85d8763dd5b9924bb0a01d67efae", size = 39312 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/07/be/b00116df1bfb3e0bb5b45e29d604799f7b91dd861637e4d448b4e09e6a3e/pycodestyle-2.13.0-py2.py3-none-any.whl", hash = "sha256:35863c5974a271c7a726ed228a14a4f6daf49df369d8c50cd9a6f58a5e143ba9", size = 31424 }, +] + +[[package]] +name = "pyflakes" +version = "3.3.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/af/cc/1df338bd7ed1fa7c317081dcf29bf2f01266603b301e6858856d346a12b3/pyflakes-3.3.2.tar.gz", hash = "sha256:6dfd61d87b97fba5dcfaaf781171ac16be16453be6d816147989e7f6e6a9576b", size = 64175 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/15/40/b293a4fa769f3b02ab9e387c707c4cbdc34f073f945de0386107d4e669e6/pyflakes-3.3.2-py2.py3-none-any.whl", hash = "sha256:5039c8339cbb1944045f4ee5466908906180f13cc99cc9949348d10f82a5c32a", size = 63164 }, +] + +[[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.7" +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/1c/e4/83e487d3ddd64ab27749b66137b26dc0c5b5c161be680e6beffdc99070b3/pylint-3.3.7.tar.gz", hash = "sha256:2b11de8bde49f9c5059452e0c310c079c746a0a8eeaa789e5aa966ecc23e4559", size = 1520709 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e8/83/bff755d09e31b5d25cc7fdc4bf3915d1a404e181f1abf0359af376845c24/pylint-3.3.7-py3-none-any.whl", hash = "sha256:43860aafefce92fca4cf6b61fe199cdc5ae54ea28f9bf4cd49de267b5195803d", size = 522565 }, +] + +[[package]] +name = "scipy" +version = "1.15.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.3.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0f/37/6964b830433e654ec7485e45a00fc9a27cf868d622838f6b6d9c5ec0d532/scipy-1.15.3.tar.gz", hash = "sha256:eae3cf522bc7df64b42cad3925c876e1b0b6c35c1337c93e12c0f366f55b0eaf", size = 59419214 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/78/2f/4966032c5f8cc7e6a60f1b2e0ad686293b9474b65246b0c642e3ef3badd0/scipy-1.15.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:a345928c86d535060c9c2b25e71e87c39ab2f22fc96e9636bd74d1dbf9de448c", size = 38702770 }, + { url = "https://files.pythonhosted.org/packages/a0/6e/0c3bf90fae0e910c274db43304ebe25a6b391327f3f10b5dcc638c090795/scipy-1.15.3-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:ad3432cb0f9ed87477a8d97f03b763fd1d57709f1bbde3c9369b1dff5503b253", size = 30094511 }, + { url = "https://files.pythonhosted.org/packages/ea/b1/4deb37252311c1acff7f101f6453f0440794f51b6eacb1aad4459a134081/scipy-1.15.3-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:aef683a9ae6eb00728a542b796f52a5477b78252edede72b8327a886ab63293f", size = 22368151 }, + { url = "https://files.pythonhosted.org/packages/38/7d/f457626e3cd3c29b3a49ca115a304cebb8cc6f31b04678f03b216899d3c6/scipy-1.15.3-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:1c832e1bd78dea67d5c16f786681b28dd695a8cb1fb90af2e27580d3d0967e92", size = 25121732 }, + { url = "https://files.pythonhosted.org/packages/db/0a/92b1de4a7adc7a15dcf5bddc6e191f6f29ee663b30511ce20467ef9b82e4/scipy-1.15.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:263961f658ce2165bbd7b99fa5135195c3a12d9bef045345016b8b50c315cb82", size = 35547617 }, + { url = "https://files.pythonhosted.org/packages/8e/6d/41991e503e51fc1134502694c5fa7a1671501a17ffa12716a4a9151af3df/scipy-1.15.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e2abc762b0811e09a0d3258abee2d98e0c703eee49464ce0069590846f31d40", size = 37662964 }, + { url = "https://files.pythonhosted.org/packages/25/e1/3df8f83cb15f3500478c889be8fb18700813b95e9e087328230b98d547ff/scipy-1.15.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ed7284b21a7a0c8f1b6e5977ac05396c0d008b89e05498c8b7e8f4a1423bba0e", size = 37238749 }, + { url = "https://files.pythonhosted.org/packages/93/3e/b3257cf446f2a3533ed7809757039016b74cd6f38271de91682aa844cfc5/scipy-1.15.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5380741e53df2c566f4d234b100a484b420af85deb39ea35a1cc1be84ff53a5c", size = 40022383 }, + { url = "https://files.pythonhosted.org/packages/d1/84/55bc4881973d3f79b479a5a2e2df61c8c9a04fcb986a213ac9c02cfb659b/scipy-1.15.3-cp310-cp310-win_amd64.whl", hash = "sha256:9d61e97b186a57350f6d6fd72640f9e99d5a4a2b8fbf4b9ee9a841eab327dc13", size = 41259201 }, + { url = "https://files.pythonhosted.org/packages/96/ab/5cc9f80f28f6a7dff646c5756e559823614a42b1939d86dd0ed550470210/scipy-1.15.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:993439ce220d25e3696d1b23b233dd010169b62f6456488567e830654ee37a6b", size = 38714255 }, + { url = "https://files.pythonhosted.org/packages/4a/4a/66ba30abe5ad1a3ad15bfb0b59d22174012e8056ff448cb1644deccbfed2/scipy-1.15.3-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:34716e281f181a02341ddeaad584205bd2fd3c242063bd3423d61ac259ca7eba", size = 30111035 }, + { url = "https://files.pythonhosted.org/packages/4b/fa/a7e5b95afd80d24313307f03624acc65801846fa75599034f8ceb9e2cbf6/scipy-1.15.3-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:3b0334816afb8b91dab859281b1b9786934392aa3d527cd847e41bb6f45bee65", size = 22384499 }, + { url = "https://files.pythonhosted.org/packages/17/99/f3aaddccf3588bb4aea70ba35328c204cadd89517a1612ecfda5b2dd9d7a/scipy-1.15.3-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:6db907c7368e3092e24919b5e31c76998b0ce1684d51a90943cb0ed1b4ffd6c1", size = 25152602 }, + { url = "https://files.pythonhosted.org/packages/56/c5/1032cdb565f146109212153339f9cb8b993701e9fe56b1c97699eee12586/scipy-1.15.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:721d6b4ef5dc82ca8968c25b111e307083d7ca9091bc38163fb89243e85e3889", size = 35503415 }, + { url = "https://files.pythonhosted.org/packages/bd/37/89f19c8c05505d0601ed5650156e50eb881ae3918786c8fd7262b4ee66d3/scipy-1.15.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39cb9c62e471b1bb3750066ecc3a3f3052b37751c7c3dfd0fd7e48900ed52982", size = 37652622 }, + { url = "https://files.pythonhosted.org/packages/7e/31/be59513aa9695519b18e1851bb9e487de66f2d31f835201f1b42f5d4d475/scipy-1.15.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:795c46999bae845966368a3c013e0e00947932d68e235702b5c3f6ea799aa8c9", size = 37244796 }, + { url = "https://files.pythonhosted.org/packages/10/c0/4f5f3eeccc235632aab79b27a74a9130c6c35df358129f7ac8b29f562ac7/scipy-1.15.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:18aaacb735ab38b38db42cb01f6b92a2d0d4b6aabefeb07f02849e47f8fb3594", size = 40047684 }, + { url = "https://files.pythonhosted.org/packages/ab/a7/0ddaf514ce8a8714f6ed243a2b391b41dbb65251affe21ee3077ec45ea9a/scipy-1.15.3-cp311-cp311-win_amd64.whl", hash = "sha256:ae48a786a28412d744c62fd7816a4118ef97e5be0bee968ce8f0a2fba7acf3bb", size = 41246504 }, + { url = "https://files.pythonhosted.org/packages/37/4b/683aa044c4162e10ed7a7ea30527f2cbd92e6999c10a8ed8edb253836e9c/scipy-1.15.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6ac6310fdbfb7aa6612408bd2f07295bcbd3fda00d2d702178434751fe48e019", size = 38766735 }, + { url = "https://files.pythonhosted.org/packages/7b/7e/f30be3d03de07f25dc0ec926d1681fed5c732d759ac8f51079708c79e680/scipy-1.15.3-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:185cd3d6d05ca4b44a8f1595af87f9c372bb6acf9c808e99aa3e9aa03bd98cf6", size = 30173284 }, + { url = "https://files.pythonhosted.org/packages/07/9c/0ddb0d0abdabe0d181c1793db51f02cd59e4901da6f9f7848e1f96759f0d/scipy-1.15.3-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:05dc6abcd105e1a29f95eada46d4a3f251743cfd7d3ae8ddb4088047f24ea477", size = 22446958 }, + { url = "https://files.pythonhosted.org/packages/af/43/0bce905a965f36c58ff80d8bea33f1f9351b05fad4beaad4eae34699b7a1/scipy-1.15.3-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:06efcba926324df1696931a57a176c80848ccd67ce6ad020c810736bfd58eb1c", size = 25242454 }, + { url = "https://files.pythonhosted.org/packages/56/30/a6f08f84ee5b7b28b4c597aca4cbe545535c39fe911845a96414700b64ba/scipy-1.15.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c05045d8b9bfd807ee1b9f38761993297b10b245f012b11b13b91ba8945f7e45", size = 35210199 }, + { url = "https://files.pythonhosted.org/packages/0b/1f/03f52c282437a168ee2c7c14a1a0d0781a9a4a8962d84ac05c06b4c5b555/scipy-1.15.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:271e3713e645149ea5ea3e97b57fdab61ce61333f97cfae392c28ba786f9bb49", size = 37309455 }, + { url = "https://files.pythonhosted.org/packages/89/b1/fbb53137f42c4bf630b1ffdfc2151a62d1d1b903b249f030d2b1c0280af8/scipy-1.15.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6cfd56fc1a8e53f6e89ba3a7a7251f7396412d655bca2aa5611c8ec9a6784a1e", size = 36885140 }, + { url = "https://files.pythonhosted.org/packages/2e/2e/025e39e339f5090df1ff266d021892694dbb7e63568edcfe43f892fa381d/scipy-1.15.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0ff17c0bb1cb32952c09217d8d1eed9b53d1463e5f1dd6052c7857f83127d539", size = 39710549 }, + { url = "https://files.pythonhosted.org/packages/e6/eb/3bf6ea8ab7f1503dca3a10df2e4b9c3f6b3316df07f6c0ded94b281c7101/scipy-1.15.3-cp312-cp312-win_amd64.whl", hash = "sha256:52092bc0472cfd17df49ff17e70624345efece4e1a12b23783a1ac59a1b728ed", size = 40966184 }, + { url = "https://files.pythonhosted.org/packages/73/18/ec27848c9baae6e0d6573eda6e01a602e5649ee72c27c3a8aad673ebecfd/scipy-1.15.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2c620736bcc334782e24d173c0fdbb7590a0a436d2fdf39310a8902505008759", size = 38728256 }, + { url = "https://files.pythonhosted.org/packages/74/cd/1aef2184948728b4b6e21267d53b3339762c285a46a274ebb7863c9e4742/scipy-1.15.3-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:7e11270a000969409d37ed399585ee530b9ef6aa99d50c019de4cb01e8e54e62", size = 30109540 }, + { url = "https://files.pythonhosted.org/packages/5b/d8/59e452c0a255ec352bd0a833537a3bc1bfb679944c4938ab375b0a6b3a3e/scipy-1.15.3-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:8c9ed3ba2c8a2ce098163a9bdb26f891746d02136995df25227a20e71c396ebb", size = 22383115 }, + { url = "https://files.pythonhosted.org/packages/08/f5/456f56bbbfccf696263b47095291040655e3cbaf05d063bdc7c7517f32ac/scipy-1.15.3-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:0bdd905264c0c9cfa74a4772cdb2070171790381a5c4d312c973382fc6eaf730", size = 25163884 }, + { url = "https://files.pythonhosted.org/packages/a2/66/a9618b6a435a0f0c0b8a6d0a2efb32d4ec5a85f023c2b79d39512040355b/scipy-1.15.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79167bba085c31f38603e11a267d862957cbb3ce018d8b38f79ac043bc92d825", size = 35174018 }, + { url = "https://files.pythonhosted.org/packages/b5/09/c5b6734a50ad4882432b6bb7c02baf757f5b2f256041da5df242e2d7e6b6/scipy-1.15.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9deabd6d547aee2c9a81dee6cc96c6d7e9a9b1953f74850c179f91fdc729cb7", size = 37269716 }, + { url = "https://files.pythonhosted.org/packages/77/0a/eac00ff741f23bcabd352731ed9b8995a0a60ef57f5fd788d611d43d69a1/scipy-1.15.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:dde4fc32993071ac0c7dd2d82569e544f0bdaff66269cb475e0f369adad13f11", size = 36872342 }, + { url = "https://files.pythonhosted.org/packages/fe/54/4379be86dd74b6ad81551689107360d9a3e18f24d20767a2d5b9253a3f0a/scipy-1.15.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f77f853d584e72e874d87357ad70f44b437331507d1c311457bed8ed2b956126", size = 39670869 }, + { url = "https://files.pythonhosted.org/packages/87/2e/892ad2862ba54f084ffe8cc4a22667eaf9c2bcec6d2bff1d15713c6c0703/scipy-1.15.3-cp313-cp313-win_amd64.whl", hash = "sha256:b90ab29d0c37ec9bf55424c064312930ca5f4bde15ee8619ee44e69319aab163", size = 40988851 }, + { url = "https://files.pythonhosted.org/packages/1b/e9/7a879c137f7e55b30d75d90ce3eb468197646bc7b443ac036ae3fe109055/scipy-1.15.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:3ac07623267feb3ae308487c260ac684b32ea35fd81e12845039952f558047b8", size = 38863011 }, + { url = "https://files.pythonhosted.org/packages/51/d1/226a806bbd69f62ce5ef5f3ffadc35286e9fbc802f606a07eb83bf2359de/scipy-1.15.3-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:6487aa99c2a3d509a5227d9a5e889ff05830a06b2ce08ec30df6d79db5fcd5c5", size = 30266407 }, + { url = "https://files.pythonhosted.org/packages/e5/9b/f32d1d6093ab9eeabbd839b0f7619c62e46cc4b7b6dbf05b6e615bbd4400/scipy-1.15.3-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:50f9e62461c95d933d5c5ef4a1f2ebf9a2b4e83b0db374cb3f1de104d935922e", size = 22540030 }, + { url = "https://files.pythonhosted.org/packages/e7/29/c278f699b095c1a884f29fda126340fcc201461ee8bfea5c8bdb1c7c958b/scipy-1.15.3-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:14ed70039d182f411ffc74789a16df3835e05dc469b898233a245cdfd7f162cb", size = 25218709 }, + { url = "https://files.pythonhosted.org/packages/24/18/9e5374b617aba742a990581373cd6b68a2945d65cc588482749ef2e64467/scipy-1.15.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a769105537aa07a69468a0eefcd121be52006db61cdd8cac8a0e68980bbb723", size = 34809045 }, + { url = "https://files.pythonhosted.org/packages/e1/fe/9c4361e7ba2927074360856db6135ef4904d505e9b3afbbcb073c4008328/scipy-1.15.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9db984639887e3dffb3928d118145ffe40eff2fa40cb241a306ec57c219ebbbb", size = 36703062 }, + { url = "https://files.pythonhosted.org/packages/b7/8e/038ccfe29d272b30086b25a4960f757f97122cb2ec42e62b460d02fe98e9/scipy-1.15.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:40e54d5c7e7ebf1aa596c374c49fa3135f04648a0caabcb66c52884b943f02b4", size = 36393132 }, + { url = "https://files.pythonhosted.org/packages/10/7e/5c12285452970be5bdbe8352c619250b97ebf7917d7a9a9e96b8a8140f17/scipy-1.15.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:5e721fed53187e71d0ccf382b6bf977644c533e506c4d33c3fb24de89f5c3ed5", size = 38979503 }, + { url = "https://files.pythonhosted.org/packages/81/06/0a5e5349474e1cbc5757975b21bd4fad0e72ebf138c5592f191646154e06/scipy-1.15.3-cp313-cp313t-win_amd64.whl", hash = "sha256:76ad1fb5f8752eabf0fa02e4cc0336b4e8f021e2d5f061ed37d6d264db35e3ca", size = 40308097 }, +] + +[[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", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.3.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { 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.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cc/18/0bbf3884e9eaa38819ebe46a7bd25dcd56b67434402b66a58c4b8e552575/tomlkit-0.13.3.tar.gz", hash = "sha256:430cf247ee57df2b94ee3fbe588e71d362a941ebb545dec29b53961d61add2a1", size = 185207 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bd/75/8539d011f6be8e29f339c42e633aae3cb73bffa95dd0f9adec09b9c58e85/tomlkit-0.13.3-py3-none-any.whl", hash = "sha256:c89c649d79ee40629a9fda55f8ace8c6a1b42deb912b2a8fd8d942ddadb606b0", size = 38901 }, +] + +[[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.14.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d1/bc/51647cd02527e87d05cb083ccc402f93e441606ff1f01739a62c8ad09ba5/typing_extensions-4.14.0.tar.gz", hash = "sha256:8676b788e32f02ab42d9e7c61324048ae4c6d844a399eebace3d4979d75ceef4", size = 107423 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/69/e0/552843e0d356fbb5256d21449fa957fa4eff3bbc135a74a691ee70c7c5da/typing_extensions-4.14.0-py3-none-any.whl", hash = "sha256:a1514509136dd0b477638fc68d6a91497af5076466ad0fa6c338e44e359944af", size = 43839 }, +] + +[[package]] +name = "varipeps" +version = "1.0.4" +source = { editable = "." } +dependencies = [ + { name = "h5py" }, + { name = "jax" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.3.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "scipy" }, + { name = "tensornetwork" }, + { name = "tqdm", extra = ["notebook"] }, + { name = "tqdm-loggable" }, +] + +[package.dev-dependencies] +dev = [ + { name = "black" }, + { name = "flake8" }, + { name = "ipython", version = "8.37.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "ipython", version = "9.3.0", 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.14" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/41/53/2e0253c5efd69c9656b1843892052a31c36d37ad42812b5da45c62191f7e/widgetsnbextension-4.0.14.tar.gz", hash = "sha256:a3629b04e3edb893212df862038c7232f62973373869db5084aed739b437b5af", size = 1097428 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ca/51/5447876806d1088a0f8f71e16542bf350918128d0a69437df26047c8e46f/widgetsnbextension-4.0.14-py3-none-any.whl", hash = "sha256:4875a9eaf72fbf5079dc372a51a9f268fc38d46f767cbf85c43a36da5cb9b575", size = 2196503 }, +] 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/apply.py b/varipeps/contractions/apply.py index 6781351..6e422f1 100644 --- a/varipeps/contractions/apply.py +++ b/varipeps/contractions/apply.py @@ -121,7 +121,13 @@ class definition for details. if f == "tensor": tensors.append(peps_tensors[ti]) elif f == "tensor_conj": - tensors.append(peps_tensors[ti].conj()) + if ( + hasattr(peps_tensor_objs[ti], "tensor_conj") + and peps_tensor_objs[ti].tensor_conj is not None + ): + tensors.append(peps_tensor_objs[ti].tensor_conj) + else: + tensors.append(peps_tensors[ti].conj()) else: tensors.append(getattr(peps_tensor_objs[ti], f)) 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..800dd84 --- /dev/null +++ b/varipeps/corrlength/corrlength.py @@ -0,0 +1,87 @@ +import numpy as np +from scipy.sparse.linalg import LinearOperator, eigs + +import jax.numpy as jnp + +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..cd08ceb 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 @@ -197,6 +204,7 @@ def _fishman_horizontal_cut( bottom_left: jnp.ndarray, bottom_right: jnp.ndarray, truncation_eps: float, + partial_unitary_mode=None, ) -> Tuple[ jnp.ndarray, jnp.ndarray, jnp.ndarray, jnp.ndarray, jnp.ndarray, jnp.ndarray ]: @@ -210,10 +218,28 @@ def _fishman_horizontal_cut( top_matrix = jnp.dot(top_left_matrix, top_right_matrix) bottom_matrix = jnp.dot(bottom_right_matrix, bottom_left_matrix) - top_U, top_S, top_Vh = gauge_fixed_svd(top_matrix) + if partial_unitary_mode is None: + top_U, top_S, top_Vh = gauge_fixed_svd(top_matrix) + elif partial_unitary_mode == "top_U_bottom_Vh": + top_U, top_S = gauge_fixed_svd(top_matrix, only_u_or_vh="U") + top_Vh = None + elif partial_unitary_mode == "top_Vh_bottom_U": + top_S, top_Vh = gauge_fixed_svd(top_matrix, only_u_or_vh="Vh") + top_U = None + else: + raise ValueError("Illegal argument for 'partial_unitary_mode'.") + top_S = jnp.where((top_S / top_S[0]) >= truncation_eps, top_S, 0) - bottom_U, bottom_S, bottom_Vh = gauge_fixed_svd(bottom_matrix) + if partial_unitary_mode is None: + bottom_U, bottom_S, bottom_Vh = gauge_fixed_svd(bottom_matrix) + elif partial_unitary_mode == "top_U_bottom_Vh": + bottom_S, bottom_Vh = gauge_fixed_svd(bottom_matrix, only_u_or_vh="Vh") + bottom_U = None + elif partial_unitary_mode == "top_Vh_bottom_U": + bottom_U, bottom_S = gauge_fixed_svd(bottom_matrix, only_u_or_vh="U") + bottom_Vh = None + bottom_S = jnp.where((bottom_S / bottom_S[0]) >= truncation_eps, bottom_S, 0) return top_U, top_S, top_Vh, bottom_U, bottom_S, bottom_Vh @@ -225,6 +251,7 @@ def _fishman_vertical_cut( bottom_left: jnp.ndarray, bottom_right: jnp.ndarray, truncation_eps: float, + partial_unitary_mode=None, ) -> Tuple[ jnp.ndarray, jnp.ndarray, jnp.ndarray, jnp.ndarray, jnp.ndarray, jnp.ndarray ]: @@ -238,15 +265,279 @@ def _fishman_vertical_cut( left_matrix = jnp.dot(bottom_left_matrix, top_left_matrix) right_matrix = jnp.dot(top_right_matrix, bottom_right_matrix) - left_U, left_S, left_Vh = gauge_fixed_svd(left_matrix) + if partial_unitary_mode is None: + left_U, left_S, left_Vh = gauge_fixed_svd(left_matrix) + elif partial_unitary_mode == "left_U_right_Vh": + left_U, left_S = gauge_fixed_svd(left_matrix, only_u_or_vh="U") + left_Vh = None + elif partial_unitary_mode == "left_Vh_right_U": + left_S, left_Vh = gauge_fixed_svd(left_matrix, only_u_or_vh="Vh") + left_U = None + else: + raise ValueError("Illegal argument for 'partial_unitary_mode'.") + left_S = jnp.where((left_S / left_S[0]) >= truncation_eps, left_S, 0) - right_U, right_S, right_Vh = gauge_fixed_svd(right_matrix) + if partial_unitary_mode is None: + right_U, right_S, right_Vh = gauge_fixed_svd(right_matrix) + elif partial_unitary_mode == "left_U_right_Vh": + right_S, right_Vh = gauge_fixed_svd(right_matrix, only_u_or_vh="Vh") + right_U = None + elif partial_unitary_mode == "left_Vh_right_U": + right_U, right_S = gauge_fixed_svd(right_matrix, only_u_or_vh="U") + right_Vh = None + right_S = jnp.where((right_S / right_S[0]) >= truncation_eps, right_S, 0) return left_U, left_S, left_Vh, right_U, right_S, right_Vh +def _split_transfer_fishman( + first_tensor, second_tensor, truncation_eps, partial_unitary_mode=None +): + 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], + ) + + if partial_unitary_mode is None: + first_ketbra_U, first_ketbra_S, first_ketbra_Vh = gauge_fixed_svd( + first_tensor_ketbra + ) + elif partial_unitary_mode == "U_Vh": + first_ketbra_U, first_ketbra_S = gauge_fixed_svd( + first_tensor_ketbra, only_u_or_vh="U" + ) + first_ketbra_Vh = None + elif partial_unitary_mode == "Vh_U": + first_ketbra_S, first_ketbra_Vh = gauge_fixed_svd( + first_tensor_ketbra, only_u_or_vh="Vh" + ) + first_ketbra_U = None + else: + raise ValueError("Illegal argument for 'partial_unitary_mode'.") + + 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: + if first_ketbra_U is not None: + first_ketbra_U = first_ketbra_U.reshape( + first_tensor.shape[0], first_tensor.shape[1], first_ketbra_U.shape[-1] + ) + if first_ketbra_Vh is not None: + 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: + if first_ketbra_U is not None: + first_ketbra_U = first_ketbra_U.reshape( + first_tensor.shape[0], + first_tensor.shape[1], + first_tensor.shape[2], + first_ketbra_U.shape[-1], + ) + if first_ketbra_Vh is not None: + 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: + if first_ketbra_U is not None: + first_ketbra_U = first_ketbra_U.reshape( + first_tensor.shape[0], first_tensor.shape[1], first_ketbra_U.shape[-1] + ) + if first_ketbra_Vh is not None: + first_ketbra_Vh = first_ketbra_Vh.reshape( + first_ketbra_Vh.shape[0], first_tensor.shape[2], first_tensor.shape[3] + ) + + if partial_unitary_mode is None: + second_ketbra_U, second_ketbra_S, second_ketbra_Vh = gauge_fixed_svd( + second_tensor_ketbra + ) + elif partial_unitary_mode == "U_Vh": + second_ketbra_S, second_ketbra_Vh = gauge_fixed_svd( + second_tensor_ketbra, only_u_or_vh="Vh" + ) + second_ketbra_U = None + elif partial_unitary_mode == "Vh_U": + second_ketbra_U, second_ketbra_S = gauge_fixed_svd( + second_tensor_ketbra, only_u_or_vh="U" + ) + second_ketbra_Vh = None + + 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: + if second_ketbra_U is not None: + second_ketbra_U = second_ketbra_U.reshape( + second_tensor.shape[0], + second_tensor.shape[1], + second_tensor.shape[2], + second_ketbra_U.shape[-1], + ) + if second_ketbra_Vh is not None: + 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: + if second_ketbra_U is not None: + second_ketbra_U = second_ketbra_U.reshape( + second_tensor.shape[0], + second_tensor.shape[1], + second_tensor.shape[2], + second_ketbra_U.shape[-1], + ) + if second_ketbra_Vh is not None: + 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: + if second_ketbra_U is not None: + second_ketbra_U = second_ketbra_U.reshape( + second_tensor.shape[0], + second_tensor.shape[1], + second_ketbra_U.shape[-1], + ) + if second_ketbra_Vh is not None: + 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, + partial_unitary_mode=None, +): + 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, partial_unitary_mode + ) + + 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, + partial_unitary_mode=None, +): + 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, partial_unitary_mode + ) + + return ( + left_tensor, + right_tensor, + ) + + @partial(jit, static_argnums=(4, 5, 6), inline=True) def _left_projectors_workhorse( top_left: jnp.ndarray, @@ -272,7 +563,12 @@ def _left_projectors_workhorse( bottom_matrix /= jnp.linalg.norm(bottom_matrix) elif projector_method is Projector_Method.FISHMAN: top_U, top_S, _, _, bottom_S, bottom_Vh = _fishman_horizontal_cut( - top_left, top_right, bottom_left, bottom_right, truncation_eps + top_left, + top_right, + bottom_left, + bottom_right, + truncation_eps, + "top_U_bottom_Vh", ) top_matrix = top_U * jnp.sqrt(top_S)[jnp.newaxis, :] bottom_matrix = jnp.sqrt(bottom_S)[:, jnp.newaxis] * bottom_Vh @@ -390,7 +686,12 @@ def _right_projectors_workhorse( bottom_matrix /= jnp.linalg.norm(bottom_matrix) elif projector_method is Projector_Method.FISHMAN: _, top_S, top_Vh, bottom_U, bottom_S, _ = _fishman_horizontal_cut( - top_left, top_right, bottom_left, bottom_right, truncation_eps + top_left, + top_right, + bottom_left, + bottom_right, + truncation_eps, + "top_Vh_bottom_U", ) top_matrix = jnp.sqrt(top_S)[:, jnp.newaxis] * top_Vh bottom_matrix = bottom_U * jnp.sqrt(bottom_S)[jnp.newaxis, :] @@ -508,7 +809,12 @@ def _top_projectors_workhorse( right_matrix /= jnp.linalg.norm(right_matrix) elif projector_method is Projector_Method.FISHMAN: _, left_S, left_Vh, right_U, right_S, _ = _fishman_vertical_cut( - top_left, top_right, bottom_left, bottom_right, truncation_eps + top_left, + top_right, + bottom_left, + bottom_right, + truncation_eps, + "left_Vh_right_U", ) left_matrix = jnp.sqrt(left_S)[:, jnp.newaxis] * left_Vh right_matrix = right_U * jnp.sqrt(right_S)[jnp.newaxis, :] @@ -626,7 +932,12 @@ def _bottom_projectors_workhorse( right_matrix /= jnp.linalg.norm(right_matrix) elif projector_method is Projector_Method.FISHMAN: left_U, left_S, _, _, right_S, right_Vh = _fishman_vertical_cut( - top_left, top_right, bottom_left, bottom_right, truncation_eps + top_left, + top_right, + bottom_left, + bottom_right, + truncation_eps, + "left_U_right_Vh", ) left_matrix = left_U * jnp.sqrt(left_S)[jnp.newaxis, :] right_matrix = jnp.sqrt(right_S)[:, jnp.newaxis] * right_Vh @@ -717,3 +1028,1692 @@ 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, + partial_unitary_mode="U_Vh", + ) + + 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, + partial_unitary_mode="Vh_U", + ) + 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, + partial_unitary_mode="U_Vh", + ) + + 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, + partial_unitary_mode="U_Vh", + ) + + 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, + partial_unitary_mode="U_Vh", + ) + 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, + partial_unitary_mode="U_Vh", + ) + + 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, + partial_unitary_mode="U_Vh", + ) + + 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, + partial_unitary_mode="Vh_U", + ) + 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, + partial_unitary_mode="Vh_U", + ) + + 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, + partial_unitary_mode="U_Vh", + ) + + 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, + partial_unitary_mode="U_Vh", + ) + 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, + partial_unitary_mode="U_Vh", + ) + + 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, + partial_unitary_mode="Vh_U", + ) + + 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, + partial_unitary_mode="U_Vh", + ) + 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, + partial_unitary_mode="Vh_U", + ) + + 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, + partial_unitary_mode="U_Vh", + ) + + 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, + partial_unitary_mode="U_Vh", + ) + 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, + partial_unitary_mode="U_Vh", + ) + + 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, + partial_unitary_mode="Vh_U", + ) + + 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, + partial_unitary_mode="U_Vh", + ) + 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, + partial_unitary_mode="U_Vh", + ) + + 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, + partial_unitary_mode="U_Vh", + ) + + 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, + partial_unitary_mode="U_Vh", + ) + 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, + partial_unitary_mode="U_Vh", + ) + + 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..770f152 100644 --- a/varipeps/optimization/line_search.py +++ b/varipeps/optimization/line_search.py @@ -1,5 +1,8 @@ +import enum + from tqdm_loggable.auto import tqdm +import jax import jax.numpy as jnp from jax import jit from jax.flatten_util import ravel_pytree @@ -40,6 +43,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 +174,105 @@ 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 + ) + + alpha = jnp.where(alpha > 0, alpha, 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 +284,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 +338,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 +345,57 @@ 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 or last_step_size <= 0: + 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 + and last_step_size > 0 + 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 +415,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 +498,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 +594,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,24 +884,245 @@ 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 + ) + + if alpha <= 0: + tqdm.write("Found negative alpha in secant operation!") + + 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 + if new_unitcell[0, 0][0][0].chi != unitcell[0, 0][0][0].chi: + jax.clear_caches() + if count == varipeps_config.line_search_max_steps: raise NoSuitableStepSizeError(f"Count {count}, Last alpha {alpha}") diff --git a/varipeps/optimization/optimizer.py b/varipeps/optimization/optimizer.py index 7926617..2020fb2 100644 --- a/varipeps/optimization/optimizer.py +++ b/varipeps/optimization/optimizer.py @@ -2,15 +2,18 @@ from collections import deque from functools import partial from os import PathLike +import time from scipy.optimize import OptimizeResult from tqdm_loggable.auto import tqdm +import jax from jax import jit 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 +212,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 +226,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 +386,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 +404,9 @@ def random_noise(a): with tqdm(desc="Optimizing PEPS state") as pbar: while count < varipeps_config.optimizer_max_steps: + runtime_start = time.perf_counter() + + chi_before_ctmrg = working_unitcell[0, 0][0][0].chi try: if varipeps_config.ad_use_custom_vjp: ( @@ -400,15 +434,74 @@ 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 + + if working_unitcell[0, 0][0][0].chi != chi_before_ctmrg: + jax.clear_caches() working_gradient = [elem.conj() for elem in working_gradient_seq] @@ -496,6 +589,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 +602,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 +631,7 @@ def random_noise(a): step_energies, step_chi, step_conv, + step_runtime, spiral_indices, additional_input, ) @@ -567,45 +670,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 +708,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 +736,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 +760,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 +783,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 +864,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/extensions/svd_ffi.cpp b/varipeps/utils/extensions/svd_ffi.cpp new file mode 100644 index 0000000..f3377ec --- /dev/null +++ b/varipeps/utils/extensions/svd_ffi.cpp @@ -0,0 +1,453 @@ +#include "svd_ffi.h" +#include "nanobind/nanobind.h" +#include "xla/ffi/api/ffi.h" + +namespace nb = nanobind; + +using lapack_int = int; + +namespace ffi = xla::ffi; + +XLA_FFI_REGISTER_ENUM_ATTR_DECODING(UVtMode); + +template +static ffi::Error SvdOnlyUVtImpl( + ffi::Buffer x, + ffi::ResultBuffer x_out, + ffi::ResultBuffer s, + ffi::ResultBuffer u_or_vt, + ffi::ResultBuffer info, + UVtMode mode) { + + using MachineType = ffi::NativeType; + using RealType = ffi::NativeType; + using FnSig = std::conditional_t(), + void(char const* jobz, + lapack_int const* m, lapack_int const* n, + MachineType* A, lapack_int const* lda, + RealType* S, + MachineType* U, lapack_int const* ldu, + MachineType* VT, lapack_int const* ldvt, + MachineType* work, lapack_int const* lwork, + RealType* rwork, + lapack_int* iwork, + lapack_int* info + ), + void(char const* jobz, + lapack_int const* m, lapack_int const* n, + MachineType* A, lapack_int const* lda, + RealType* S, + MachineType* U, lapack_int const* ldu, + MachineType* VT, lapack_int const* ldvt, + MachineType* work, lapack_int const* lwork, + lapack_int* iwork, + lapack_int* info + )>; + + FnSig* fn = nullptr; + + try { + PyGILState_STATE state = PyGILState_Ensure(); + + nb::module_ cython_lapack = nb::module_::import_("scipy.linalg.cython_lapack"); + + nb::dict lapack_capi = cython_lapack.attr("__pyx_capi__"); + + auto get_lapack_ptr = [&](const char* name) { + return nb::cast(lapack_capi[name]).data(); + }; + + if constexpr (dtype == ffi::DataType::F32) { + fn = reinterpret_cast(get_lapack_ptr("sgesdd")); + } + if constexpr (dtype == ffi::DataType::F64) { + fn = reinterpret_cast(get_lapack_ptr("dgesdd")); + } + if constexpr (dtype == ffi::DataType::C64) { + fn = reinterpret_cast(get_lapack_ptr("cgesdd")); + } + if constexpr (dtype == ffi::DataType::C128) { + fn = reinterpret_cast(get_lapack_ptr("zgesdd")); + } + + PyGILState_Release(state); + } catch (const nb::python_error &e) { + std::cerr << e.what() << std::endl; + throw; + } + + const auto lapack_int_max = std::numeric_limits::max(); + + const ffi::Span dims = x.dimensions(); + if (dims.size() != 2) { + return ffi::Error(ffi::ErrorCode::kInvalidArgument, "Only 2d arrays supported as input."); + } + const int64_t x_rows = dims.front(); + const int64_t x_cols = dims.back(); + + if (mode == UVtMode::computeOnlyU && x_rows > x_cols) [[unlikely]] { + return ffi::Error(ffi::ErrorCode::kInvalidArgument, "Only matrices with M <= N supported."); + } else if (mode == UVtMode::computeOnlyVt && x_rows < x_cols) [[unlikely]] { + return ffi::Error(ffi::ErrorCode::kInvalidArgument, "Only matrices with M >= N supported."); + } + + if (x_rows > lapack_int_max || x_cols > lapack_int_max) [[unlikely]] { + return ffi::Error(ffi::ErrorCode::kOutOfRange, "Dimension of input out of range for lapack integer."); + } + + const lapack_int x_rows_lapack = static_cast(x_rows); + const lapack_int x_cols_lapack = static_cast(x_cols); + + auto* x_out_data = x_out->typed_data(); + auto* s_data = s->typed_data(); + auto* u_or_vt_data = u_or_vt->typed_data(); + auto* info_data = info->typed_data(); + + MachineType* u_data; + MachineType* vt_data; + if ((mode == UVtMode::computeOnlyU || mode == UVtMode::computePartialUandVt) && x_rows < x_cols) { + u_data = u_or_vt_data; + vt_data = nullptr; + } else { + u_data = nullptr; + vt_data = u_or_vt_data; + } + + if (x.typed_data() != x_out_data) { + std::copy_n(x.typed_data(), x.element_count(), x_out_data); + } + + ffi::NativeType work_size = {}; + lapack_int lwork = -1; + const char jobz = 'O'; + lapack_int ldu; + lapack_int ldvt; + if ((mode == UVtMode::computeOnlyU || mode == UVtMode::computePartialUandVt) && x_rows < x_cols) { + ldu = x_rows_lapack; + ldvt = 1; + } else { + ldu = 1; + ldvt = x_cols_lapack; + } + + if constexpr (ffi::IsComplexType()) { + fn(&jobz, &x_rows_lapack, &x_cols_lapack, nullptr, + &x_rows_lapack, nullptr, nullptr, + &ldu, nullptr, &ldvt, &work_size, + &lwork, nullptr, nullptr, info_data + ); + } else { + fn(&jobz, &x_rows_lapack, &x_cols_lapack, nullptr, + &x_rows_lapack, nullptr, nullptr, + &ldu, nullptr, &ldvt, + &work_size, &lwork, nullptr, info_data + ); + } + + if (*info_data != 0) { + return ffi::Error(ffi::ErrorCode::kInternal, "Non zero info returned by lapack."); + } + + if (std::real(work_size) > lapack_int_max) [[unlikely]] { + return ffi::Error(ffi::ErrorCode::kOutOfRange, "Workspace size out of range for lapack integer."); + } + lwork = static_cast(std::real(work_size)); + + const auto min_dim = std::min(x_rows, x_cols); + const auto max_dim = std::max(x_rows, x_cols); + + auto work = std::unique_ptr[]>(new ffi::NativeType[lwork]); + + auto iwork = std::unique_ptr(new lapack_int[8*min_dim]); + + std::unique_ptr[]> rwork; + if constexpr (ffi::IsComplexType()) { + const auto rwork_size = std::max(5 * min_dim * min_dim + 5 * min_dim, + 2 * max_dim * min_dim + 2 * min_dim * min_dim + min_dim); + rwork = std::unique_ptr[]>(new ffi::NativeType[rwork_size]); + } + + if constexpr (ffi::IsComplexType()) { + fn(&jobz, &x_rows_lapack, &x_cols_lapack, x_out_data, + &x_rows_lapack, s_data, u_data, + &ldu, vt_data, &ldvt, work.get(), + &lwork, rwork.get(), iwork.get(), info_data + ); + } else { + fn(&jobz, &x_rows_lapack, &x_cols_lapack, x_out_data, + &x_rows_lapack, s_data, u_data, + &ldu, vt_data, &ldvt, + work.get(), &lwork, iwork.get(), info_data + ); + } + + if (*info_data != 0) { + return ffi::Error(ffi::ErrorCode::kInternal, "Non zero info returned by lapack."); + } + + return ffi::Error::Success(); +} + +template +static ffi::Error SvdOnlyUVtQRImpl( + ffi::Buffer x, + ffi::ResultBuffer x_out, + ffi::ResultBuffer s, + ffi::ResultBuffer u_or_vt, + ffi::ResultBuffer info, + UVtMode mode) { + + using MachineType = ffi::NativeType; + using RealType = ffi::NativeType; + using FnSig = std::conditional_t(), + void(char const* jobu, char const* jobvt, + lapack_int const* m, lapack_int const* n, + MachineType* A, lapack_int const* lda, + RealType* S, + MachineType* U, lapack_int const* ldu, + MachineType* VT, lapack_int const* ldvt, + MachineType* work, lapack_int const* lwork, + RealType* rwork, + lapack_int* info + ), + void(char const* jobu, char const* jobvt, + lapack_int const* m, lapack_int const* n, + MachineType* A, lapack_int const* lda, + RealType* S, + MachineType* U, lapack_int const* ldu, + MachineType* VT, lapack_int const* ldvt, + MachineType* work, lapack_int const* lwork, + lapack_int* info + )>; + + FnSig* fn = nullptr; + + try { + PyGILState_STATE state = PyGILState_Ensure(); + + nb::module_ cython_lapack = nb::module_::import_("scipy.linalg.cython_lapack"); + + nb::dict lapack_capi = cython_lapack.attr("__pyx_capi__"); + + auto get_lapack_ptr = [&](const char* name) { + return nb::cast(lapack_capi[name]).data(); + }; + + if constexpr (dtype == ffi::DataType::F32) { + fn = reinterpret_cast(get_lapack_ptr("sgesvd")); + } + if constexpr (dtype == ffi::DataType::F64) { + fn = reinterpret_cast(get_lapack_ptr("dgesvd")); + } + if constexpr (dtype == ffi::DataType::C64) { + fn = reinterpret_cast(get_lapack_ptr("cgesvd")); + } + if constexpr (dtype == ffi::DataType::C128) { + fn = reinterpret_cast(get_lapack_ptr("zgesvd")); + } + + PyGILState_Release(state); + } catch (const nb::python_error &e) { + std::cerr << e.what() << std::endl; + throw; + } + + const auto lapack_int_max = std::numeric_limits::max(); + + const ffi::Span dims = x.dimensions(); + if (dims.size() != 2) { + return ffi::Error(ffi::ErrorCode::kInvalidArgument, "Only 2d arrays supported as input."); + } + const int64_t x_rows = dims.front(); + const int64_t x_cols = dims.back(); + + if (mode == UVtMode::computeOnlyU && x_rows > x_cols) [[unlikely]] { + return ffi::Error(ffi::ErrorCode::kInvalidArgument, "Only matrices with M <= N supported."); + } else if (mode == UVtMode::computeOnlyVt && x_rows < x_cols) [[unlikely]] { + return ffi::Error(ffi::ErrorCode::kInvalidArgument, "Only matrices with M >= N supported."); + } + + if (x_rows > lapack_int_max || x_cols > lapack_int_max) [[unlikely]] { + return ffi::Error(ffi::ErrorCode::kOutOfRange, "Dimension of input out of range for lapack integer."); + } + + const lapack_int x_rows_lapack = static_cast(x_rows); + const lapack_int x_cols_lapack = static_cast(x_cols); + + auto* x_out_data = x_out->typed_data(); + auto* s_data = s->typed_data(); + auto* u_or_vt_data = u_or_vt->typed_data(); + auto* info_data = info->typed_data(); + + MachineType* u_data; + MachineType* vt_data; + + if (x.typed_data() != x_out_data) { + std::copy_n(x.typed_data(), x.element_count(), x_out_data); + } + + ffi::NativeType work_size = {}; + lapack_int lwork = -1; + + char jobu; + char jobvt; + lapack_int ldu; + lapack_int ldvt; + if (mode == UVtMode::computeOnlyU) { + jobu = 'O'; + jobvt = 'N'; + ldu = 1; + ldvt = 1; + u_data = nullptr; + vt_data = nullptr; + } else if (mode == UVtMode::computeOnlyVt) { + jobu = 'N'; + jobvt = 'O'; + ldu = 1; + ldvt = 1; + u_data = nullptr; + vt_data = nullptr; + } else { + if (x_rows >= x_cols) { + jobu = 'O'; + jobvt = 'S'; + ldu = 1; + ldvt = x_cols_lapack; + u_data = nullptr; + vt_data = u_or_vt_data; + } else { + jobu = 'S'; + jobvt = 'O'; + ldu = x_rows_lapack; + ldvt = 1; + u_data = u_or_vt_data; + vt_data = nullptr; + } + } + + if constexpr (ffi::IsComplexType()) { + fn(&jobu, &jobvt, &x_rows_lapack, &x_cols_lapack, nullptr, + &x_rows_lapack, nullptr, nullptr, + &ldu, nullptr, &ldvt, &work_size, + &lwork, nullptr, info_data + ); + } else { + fn(&jobu, &jobvt, &x_rows_lapack, &x_cols_lapack, nullptr, + &x_rows_lapack, nullptr, nullptr, + &ldu, nullptr, &ldvt, + &work_size, &lwork, info_data + ); + } + + if (*info_data != 0) { + return ffi::Error(ffi::ErrorCode::kInternal, "Non zero info returned by lapack."); + } + + if (std::real(work_size) > lapack_int_max) [[unlikely]] { + return ffi::Error(ffi::ErrorCode::kOutOfRange, "Workspace size out of range for lapack integer."); + } + lwork = static_cast(std::real(work_size)); + + const auto min_dim = std::min(x_rows, x_cols); + const auto max_dim = std::max(x_rows, x_cols); + + auto work = std::unique_ptr[]>(new ffi::NativeType[lwork]); + + std::unique_ptr[]> rwork; + if constexpr (ffi::IsComplexType()) { + const auto rwork_size = 5 * min_dim; + rwork = std::unique_ptr[]>(new ffi::NativeType[rwork_size]); + } + + if constexpr (ffi::IsComplexType()) { + fn(&jobu, &jobvt, &x_rows_lapack, &x_cols_lapack, x_out_data, + &x_rows_lapack, s_data, u_data, + &ldu, vt_data, &ldvt, work.get(), + &lwork, rwork.get(), info_data + ); + } else { + fn(&jobu, &jobvt, &x_rows_lapack, &x_cols_lapack, x_out_data, + &x_rows_lapack, s_data, u_data, + &ldu, vt_data, &ldvt, + work.get(), &lwork, info_data + ); + } + + if (*info_data != 0) { + return ffi::Error(ffi::ErrorCode::kInternal, "Non zero info returned by lapack."); + } + + return ffi::Error::Success(); +} + +#define DEFINE_REAL_SVD_ONLY_VT(fname, dtype) \ + XLA_FFI_DEFINE_HANDLER_SYMBOL( \ + fname, SvdOnlyUVtImpl, \ + ffi::Ffi::Bind() \ + .Arg>(/*x*/) \ + .Ret>(/*x_out*/) \ + .Ret>(/*s*/) \ + .Ret>(/*u_or_vt*/) \ + .Ret>(/*info*/) \ + .Attr("mode")) + +#define DEFINE_COMPLEX_SVD_ONLY_VT(fname, dtype) \ + XLA_FFI_DEFINE_HANDLER_SYMBOL( \ + fname, SvdOnlyUVtImpl, \ + ffi::Ffi::Bind() \ + .Arg>(/*x*/) \ + .Ret>(/*x_out*/) \ + .Ret>(/*s*/) \ + .Ret>(/*u_or_vt*/) \ + .Ret>(/*info*/) \ + .Attr("mode")) + +DEFINE_REAL_SVD_ONLY_VT(svd_only_u_vt_f32, ffi::DataType::F32); +DEFINE_REAL_SVD_ONLY_VT(svd_only_u_vt_f64, ffi::DataType::F64); +DEFINE_COMPLEX_SVD_ONLY_VT(svd_only_u_vt_c64, ffi::DataType::C64); +DEFINE_COMPLEX_SVD_ONLY_VT(svd_only_u_vt_c128, ffi::DataType::C128); + +#define DEFINE_REAL_SVD_ONLY_VT_QR(fname, dtype) \ + XLA_FFI_DEFINE_HANDLER_SYMBOL( \ + fname, SvdOnlyUVtQRImpl, \ + ffi::Ffi::Bind() \ + .Arg>(/*x*/) \ + .Ret>(/*x_out*/) \ + .Ret>(/*s*/) \ + .Ret>(/*u_or_vt*/) \ + .Ret>(/*info*/) \ + .Attr("mode")) + +#define DEFINE_COMPLEX_SVD_ONLY_VT_QR(fname, dtype) \ + XLA_FFI_DEFINE_HANDLER_SYMBOL( \ + fname, SvdOnlyUVtQRImpl, \ + ffi::Ffi::Bind() \ + .Arg>(/*x*/) \ + .Ret>(/*x_out*/) \ + .Ret>(/*s*/) \ + .Ret>(/*u_or_vt*/) \ + .Ret>(/*info*/) \ + .Attr("mode")) + +DEFINE_REAL_SVD_ONLY_VT_QR(svd_only_u_vt_qr_f32, ffi::DataType::F32); +DEFINE_REAL_SVD_ONLY_VT_QR(svd_only_u_vt_qr_f64, ffi::DataType::F64); +DEFINE_COMPLEX_SVD_ONLY_VT_QR(svd_only_u_vt_qr_c64, ffi::DataType::C64); +DEFINE_COMPLEX_SVD_ONLY_VT_QR(svd_only_u_vt_qr_c128, ffi::DataType::C128); + +template +static nb::capsule EncapsulateFfiCall(T *fn) { + static_assert(std::is_invocable_r_v, + "Encapsulated function must be and XLA FFI handler"); + return nb::capsule(reinterpret_cast(fn)); +} + +NB_MODULE(_svd_only_u_vt, m) { + m.def("svd_only_u_vt_f32", []() { return EncapsulateFfiCall(svd_only_u_vt_f32); }); + m.def("svd_only_u_vt_f64", []() { return EncapsulateFfiCall(svd_only_u_vt_f64); }); + m.def("svd_only_u_vt_c64", []() { return EncapsulateFfiCall(svd_only_u_vt_c64); }); + m.def("svd_only_u_vt_c128", []() { return EncapsulateFfiCall(svd_only_u_vt_c128); }); + m.def("svd_only_u_vt_qr_f32", []() { return EncapsulateFfiCall(svd_only_u_vt_qr_f32); }); + m.def("svd_only_u_vt_qr_f64", []() { return EncapsulateFfiCall(svd_only_u_vt_qr_f64); }); + m.def("svd_only_u_vt_qr_c64", []() { return EncapsulateFfiCall(svd_only_u_vt_qr_c64); }); + m.def("svd_only_u_vt_qr_c128", []() { return EncapsulateFfiCall(svd_only_u_vt_qr_c128); }); +} diff --git a/varipeps/utils/extensions/svd_ffi.h b/varipeps/utils/extensions/svd_ffi.h new file mode 100644 index 0000000..7b4b0c4 --- /dev/null +++ b/varipeps/utils/extensions/svd_ffi.h @@ -0,0 +1,22 @@ +#ifndef VARIPEPS_SVD_FFI_H_ +#define VARIPEPS_SVD_FFI_H_ + +#include "xla/ffi/api/ffi.h" + +enum class UVtMode : int8_t { + computeOnlyU = 0, // Compute only U + computeOnlyVt = 1, // Compute only Vt + computePartialUandVt = 2, // Compute only Vt +}; + +XLA_FFI_DECLARE_HANDLER_SYMBOL(svd_only_u_vt_f32); +XLA_FFI_DECLARE_HANDLER_SYMBOL(svd_only_u_vt_f64); +XLA_FFI_DECLARE_HANDLER_SYMBOL(svd_only_u_vt_c64); +XLA_FFI_DECLARE_HANDLER_SYMBOL(svd_only_u_vt_c128); + +XLA_FFI_DECLARE_HANDLER_SYMBOL(svd_only_u_vt_qr_f32); +XLA_FFI_DECLARE_HANDLER_SYMBOL(svd_only_u_vt_qr_f64); +XLA_FFI_DECLARE_HANDLER_SYMBOL(svd_only_u_vt_qr_c64); +XLA_FFI_DECLARE_HANDLER_SYMBOL(svd_only_u_vt_qr_c128); + +#endif // VARIPEPS_SVD_FFI_H 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..e3ec99d 100644 --- a/varipeps/utils/svd.py +++ b/varipeps/utils/svd.py @@ -1,5 +1,7 @@ from functools import partial +import numpy as np +import jax import jax.numpy as jnp from jax.lax import scan from jax.lax.linalg import svd as lax_svd @@ -9,6 +11,8 @@ from varipeps import varipeps_config +from .extensions import _svd_only_u_vt as _svd_only_u_vt_lib + from typing import Tuple @@ -20,54 +24,296 @@ def _H(x): return jnp.conj(_T(x)) -@custom_jvp -def svd_wrapper(a): +@partial(custom_jvp, nondiff_argnums=(1,)) +def svd_wrapper(a, use_qr=False): check_arraylike("jnp.linalg.svd", a) (a,) = promote_dtypes_inexact(jnp.asarray(a)) - return lax_svd(a, full_matrices=False, compute_uv=True) + if use_qr: + result = lax_svd( + a, + full_matrices=False, + compute_uv=True, + algorithm=lax.linalg.SvdAlgorithm.QR, + ) + else: + result = lax_svd(a, full_matrices=False, compute_uv=True) -@svd_wrapper.defjvp -def _svd_jvp_rule(primals, tangents): + 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 + + +def _svd_jvp_rule_impl(primals, tangents, only_u_or_vt=None, use_qr=False): (A,) = primals (dA,) = tangents - U, s, Vt = lax_svd(A, full_matrices=False, compute_uv=True) + + if use_qr and only_u_or_vt is not None: + U, s, Vt = _svd_only_u_vt_impl(A, u_or_vt=2, use_qr=True) + else: + U, s, Vt = svd_wrapper(A, use_qr=use_qr) Ut, V = _H(U), _H(Vt) s_dim = s[..., None, :] dS = Ut @ dA @ V ds = jnp.real(jnp.diagonal(dS, 0, -2, -1)) - s_diffs = (s_dim + _T(s_dim)) * (s_dim - _T(s_dim)) + s_sums = s_dim + _T(s_dim) + s_sums = jnp.where(s_sums > 0, s_sums, 1) + s_diffs = s_dim - _T(s_dim) + s_diffs = jnp.where(jnp.abs(s_diffs / s[0]) >= 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 s_diffs_zeros = lax.expand_dims(s_diffs_zeros, range(s_diffs.ndim - 2)) F = 1 / (s_diffs + s_diffs_zeros) - s_diffs_zeros - dSS = s_dim.astype(A.dtype) * dS # dS.dot(jnp.diag(s)) - SdS = _T(s_dim.astype(A.dtype)) * dS # jnp.diag(s).dot(dS) + + if only_u_or_vt is None or only_u_or_vt == "U": + dSS = dS * (s_dim / s_sums).astype(A.dtype) # dS.dot(s_j / (s_i + s_j)) + if only_u_or_vt is None or only_u_or_vt == "Vt": + SdS = (_T(s_dim) / s_sums).astype(A.dtype) * dS # (s_i / (s_i + s_j)).dot(dS) s_zeros = (s == 0).astype(s.dtype) s_inv = 1 / (s + s_zeros) - s_zeros s_inv_mat = jnp.vectorize(jnp.diag, signature="(k)->(k,k)")(s_inv) dUdV_diag = 0.5 * (dS - _H(dS)) * s_inv_mat.astype(A.dtype) - dU = U @ (F.astype(A.dtype) * (dSS + _H(dSS)) + dUdV_diag) - dV = V @ (F.astype(A.dtype) * (SdS + _H(SdS))) + + if only_u_or_vt is None: + dU = U @ (F.astype(A.dtype) * (dSS + _H(dSS)) + 0.5 * dUdV_diag) + dV = V @ (F.astype(A.dtype) * (SdS + _H(SdS)) + 0.5 * dUdV_diag) + elif only_u_or_vt == "U": + dU = U @ (F.astype(A.dtype) * (dSS + _H(dSS)) + dUdV_diag) + elif only_u_or_vt == "Vt": + dV = V @ (F.astype(A.dtype) * (SdS + _H(SdS)) + dUdV_diag) m, n = A.shape[-2:] - if m > n: + if m > n and (only_u_or_vt is None or only_u_or_vt == "U"): dAV = dA @ V - dU = dU + (dAV - U @ (Ut @ dAV)) / s_dim.astype(A.dtype) - if n > m: + dU = dU + (dAV - U @ (Ut @ dAV)) * s_inv.astype(A.dtype) + if n > m and (only_u_or_vt is None or only_u_or_vt == "Vt"): dAHU = _H(dA) @ U - dV = dV + (dAHU - V @ (Vt @ dAHU)) / s_dim.astype(A.dtype) + dV = dV + (dAHU - V @ (Vt @ dAHU)) * s_inv.astype(A.dtype) + + if only_u_or_vt is None: + return (U, s, Vt), (dU, ds, _H(dV)) + elif only_u_or_vt == "U": + return (U, s), (dU, ds) + elif only_u_or_vt == "Vt": + return (s, Vt), (ds, _H(dV)) + + +@svd_wrapper.defjvp +def _svd_jvp_rule(use_qr, primals, tangents): + return _svd_jvp_rule_impl(primals, tangents, use_qr=use_qr) + + +jax.ffi.register_ffi_target( + "svd_only_u_vt_f32", _svd_only_u_vt_lib.svd_only_u_vt_f32(), platform="cpu" +) +jax.ffi.register_ffi_target( + "svd_only_u_vt_f64", _svd_only_u_vt_lib.svd_only_u_vt_f64(), platform="cpu" +) +jax.ffi.register_ffi_target( + "svd_only_u_vt_c64", _svd_only_u_vt_lib.svd_only_u_vt_c64(), platform="cpu" +) +jax.ffi.register_ffi_target( + "svd_only_u_vt_c128", _svd_only_u_vt_lib.svd_only_u_vt_c128(), platform="cpu" +) +jax.ffi.register_ffi_target( + "svd_only_u_vt_qr_f32", _svd_only_u_vt_lib.svd_only_u_vt_qr_f32(), platform="cpu" +) +jax.ffi.register_ffi_target( + "svd_only_u_vt_qr_f64", _svd_only_u_vt_lib.svd_only_u_vt_qr_f64(), platform="cpu" +) +jax.ffi.register_ffi_target( + "svd_only_u_vt_qr_c64", _svd_only_u_vt_lib.svd_only_u_vt_qr_c64(), platform="cpu" +) +jax.ffi.register_ffi_target( + "svd_only_u_vt_qr_c128", _svd_only_u_vt_lib.svd_only_u_vt_qr_c128(), platform="cpu" +) + + +def _svd_only_u_vt_impl(a, u_or_vt, use_qr=True): + suffix = "_qr" if use_qr else "" + + if a.dtype == jnp.float32: + fn = f"svd_only_u_vt{suffix}_f32" + real_dtype = jnp.float32 + elif a.dtype == jnp.float64: + fn = f"svd_only_u_vt{suffix}_f64" + real_dtype = jnp.float64 + elif a.dtype == jnp.complex64: + fn = f"svd_only_u_vt{suffix}_c64" + real_dtype = jnp.float32 + elif a.dtype == jnp.complex128: + fn = f"svd_only_u_vt{suffix}_c128" + real_dtype = jnp.float64 + else: + raise ValueError("Unsupported dtype") + + m, n = a.shape + + return_only = None + if m > n and u_or_vt == 0: + u_or_vt = 2 + return_only = "U" + elif m < n and u_or_vt == 1: + u_or_vt = 2 + return_only = "Vt" + + min_dim = min(m, n) + + if use_qr: + if u_or_vt == 2: + u_vt_buffer_shape = jax.ShapeDtypeStruct((min_dim, min_dim), a.dtype) + else: + u_vt_buffer_shape = jax.ShapeDtypeStruct((0, 0), a.dtype) + + call = jax.ffi.ffi_call( + fn, + ( + jax.ShapeDtypeStruct((m, n), a.dtype), + jax.ShapeDtypeStruct((min_dim,), real_dtype), + u_vt_buffer_shape, + jax.ShapeDtypeStruct((1,), jnp.int32), + ), + vmap_method="sequential", + input_layouts=((1, 0),), + output_layouts=((1, 0), None, (1, 0), None), + input_output_aliases={0: 0}, + ) + + aout, S, u_vt_buffer, info = call(a, mode=np.int8(u_or_vt)) - return (U, s, Vt), (dU, ds, _H(dV)) + if u_or_vt == 2: + if m >= n: + U = aout + Vt = u_vt_buffer + else: + U = u_vt_buffer + Vt = aout + else: + result = aout[:min_dim, :min_dim] + else: + call = jax.ffi.ffi_call( + fn, + ( + jax.ShapeDtypeStruct((m, n), a.dtype), + jax.ShapeDtypeStruct((min_dim,), real_dtype), + jax.ShapeDtypeStruct((min_dim, min_dim), a.dtype), + jax.ShapeDtypeStruct((1,), jnp.int32), + ), + vmap_method="sequential", + input_layouts=((1, 0),), + output_layouts=((1, 0), None, (1, 0), None), + input_output_aliases={0: 0}, + ) + + aout, S, u_vt_buffer, info = call(a, mode=np.int8(u_or_vt)) + + if u_or_vt == 0: + if m == n: + result = aout + else: + result = u_vt_buffer + elif u_or_vt == 1: + result = u_vt_buffer + elif u_or_vt == 2: + if m >= n: + U = aout + Vt = u_vt_buffer + else: + U = u_vt_buffer + Vt = aout + + if u_or_vt == 2: + U, S, Vt = jax.lax.cond( + info[0] != 0, + lambda u, s, r: (u * jnp.nan, s * jnp.nan, r * jnp.nan), + lambda u, s, r: (u, s, r), + U, + S, + Vt, + ) + + if return_only == "U": + return S, U + elif return_only == "Vt": + return S, Vt + + return U, S, Vt + + S, result = jax.lax.cond( + info[0] != 0, + lambda s, r: (s * jnp.nan, r * jnp.nan), + lambda s, r: (s, r), + S, + result, + ) + + return S, result + + +@partial(custom_jvp, nondiff_argnums=(1,)) +def svd_only_u(a, use_qr=True): + S, U = _svd_only_u_vt_impl(a, 0, use_qr) + + if not use_qr: + S, U = lax.cond( + jnp.isnan(jnp.sum(S)), + lambda matrix, s, u: _svd_only_u_vt_impl(matrix, 0, True), + lambda matrix, s, u: (s, u), + a, + S, + U, + ) + + return U, S + + +@svd_only_u.defjvp +def _svd_only_u_jvp_rule(use_qr, primals, tangents): + return _svd_jvp_rule_impl(primals, tangents, only_u_or_vt="U", use_qr=use_qr) -@partial(jit, inline=True) +@partial(custom_jvp, nondiff_argnums=(1,)) +def svd_only_vt(a, use_qr=True): + S, Vt = _svd_only_u_vt_impl(a, 1, use_qr) + + if not use_qr: + S, Vt = lax.cond( + jnp.isnan(jnp.sum(S)), + lambda matrix, s, v: _svd_only_u_vt_impl(matrix, 1, True), + lambda matrix, s, v: (s, v), + a, + S, + Vt, + ) + + return S, Vt + + +@svd_only_vt.defjvp +def _svd_only_vt_jvp_rule(use_qr, primals, tangents): + return _svd_jvp_rule_impl(primals, tangents, only_u_or_vt="Vt", use_qr=use_qr) + + +@partial(jit, inline=True, static_argnums=(1, 2)) def gauge_fixed_svd( matrix: jnp.ndarray, + only_u_or_vh=None, + use_qr=False, ) -> Tuple[jnp.ndarray, jnp.ndarray, jnp.ndarray]: """ Calculate the gauge-fixed (also called sign-fixed) SVD. To this end, each @@ -78,39 +324,61 @@ def gauge_fixed_svd( Args: matrix (:obj:`jnp.ndarray`): Matrix to calculate SVD for. + Keyword args: + only_u_or_vh (:obj:`str`): + Flag if only U or Uh should be calculated. If `None` (default), calculate + the full SVD, if `'U'` only calculate U, if `'Vh'` only calculate Vh. Returns: :obj:`tuple`\\ (:obj:`jnp.ndarray`, :obj:`jnp.ndarray`, :obj:`jnp.ndarray`): Tuple with sign-fixed U, S and Vh of the SVD. """ - U, S, Vh = svd_wrapper(matrix) + if only_u_or_vh is None: + U, S, Vh = svd_wrapper(matrix, use_qr=use_qr) + gauge_unitary = U + elif only_u_or_vh == "U": + U, S = svd_only_u(matrix, use_qr=use_qr) + gauge_unitary = U + elif only_u_or_vh == "Vh": + S, Vh = svd_only_vt(matrix, use_qr=use_qr) + gauge_unitary = Vh.T.conj() + else: + raise ValueError("Invalid value for parameter 'only_u_or_vh'.") # Fix the gauge of the SVD - abs_U = jnp.abs(U) - max_per_vector = jnp.max(abs_U, axis=0) - normalized_U = abs_U / max_per_vector[jnp.newaxis, :] + abs_gauge_unitary = jnp.abs(gauge_unitary) + max_per_vector = jnp.max(abs_gauge_unitary, axis=0) + normalized_gauge_unitary = abs_gauge_unitary / max_per_vector[jnp.newaxis, :] def phase_f(carry, x): - U_row, normalized_U_row = x + x_row, normalized_x_row = x already_found, last_step_result = carry - cond = normalized_U_row >= varipeps_config.svd_sign_fix_eps + cond = normalized_x_row >= varipeps_config.svd_sign_fix_eps result = jnp.where( - already_found, last_step_result, jnp.where(cond, U_row, last_step_result) + already_found, last_step_result, jnp.where(cond, x_row, last_step_result) ) return (jnp.logical_or(already_found, cond), result), None phases, _ = scan( phase_f, - (jnp.zeros(U.shape[1], dtype=bool), U[0, :]), - (U, normalized_U), + (jnp.zeros(gauge_unitary.shape[1], dtype=bool), gauge_unitary[0, :]), + (gauge_unitary, normalized_gauge_unitary), ) phases = phases[1] phases /= jnp.abs(phases) - U = U * phases.conj()[jnp.newaxis, :] - Vh = Vh * phases[:, jnp.newaxis] + if only_u_or_vh is None or only_u_or_vh == "U": + U = U * phases.conj()[jnp.newaxis, :] + if only_u_or_vh is None or only_u_or_vh == "Vh": + Vh = Vh * phases[:, jnp.newaxis] + + if only_u_or_vh == "U": + return U, S + + if only_u_or_vh == "Vh": + return S, Vh return U, S, Vh