Repository: jcmgray/cotengra Branch: main Commit: e0f164f452e6 Files: 118 Total size: 8.3 MB Directory structure: gitextract_lc2zkv6z/ ├── .codecov.yml ├── .gitattributes ├── .github/ │ ├── dependabot.yml │ └── workflows/ │ ├── pypi-release.yml │ └── test.yml ├── .gitignore ├── .readthedocs.yml ├── LICENSE.md ├── MANIFEST.in ├── README.md ├── cotengra/ │ ├── __init__.py │ ├── contract.py │ ├── core.py │ ├── core_multi.py │ ├── experimental/ │ │ ├── __init__.py │ │ ├── hyper_de.py │ │ ├── hyper_pe.py │ │ ├── hyper_pymoo.py │ │ ├── hyper_scipy.py │ │ ├── hyper_smac.py │ │ ├── multi.ipynb │ │ ├── path_compressed_branchbound.py │ │ ├── path_compressed_mcts.py │ │ └── scoring.py │ ├── hypergraph.py │ ├── hyperoptimizers/ │ │ ├── __init__.py │ │ ├── _param_mapping.py │ │ ├── hyper.py │ │ ├── hyper_cmaes.py │ │ ├── hyper_es.py │ │ ├── hyper_neldermead.py │ │ ├── hyper_nevergrad.py │ │ ├── hyper_optuna.py │ │ ├── hyper_random.py │ │ ├── hyper_sbplx.py │ │ └── hyper_skopt.py │ ├── interface.py │ ├── nodeops.py │ ├── oe.py │ ├── parallel.py │ ├── pathfinders/ │ │ ├── __init__.py │ │ ├── kahypar_profiles/ │ │ │ ├── cut_kKaHyPar_sea20.ini │ │ │ ├── cut_rKaHyPar_sea20.ini │ │ │ ├── km1_kKaHyPar_sea20.ini │ │ │ ├── km1_rKaHyPar_sea20.ini │ │ │ └── old/ │ │ │ ├── cut_kKaHyPar_sea20.ini │ │ │ ├── cut_rKaHyPar_sea20.ini │ │ │ ├── km1_kKaHyPar_sea20.ini │ │ │ └── km1_rKaHyPar_sea20.ini │ │ ├── path_basic.py │ │ ├── path_compressed.py │ │ ├── path_compressed_greedy.py │ │ ├── path_edgesort.py │ │ ├── path_flowcutter.py │ │ ├── path_greedy.py │ │ ├── path_igraph.py │ │ ├── path_kahypar.py │ │ ├── path_labels.py │ │ ├── path_quickbb.py │ │ ├── path_random.py │ │ ├── path_simulated_annealing.py │ │ └── treedecomp.py │ ├── plot.py │ ├── presets.py │ ├── reusable.py │ ├── schematic.py │ ├── scoring.py │ ├── slicer.py │ └── utils.py ├── docs/ │ ├── Makefile │ ├── _pygments/ │ │ ├── _pygments_dark.py │ │ └── _pygments_light.py │ ├── _static/ │ │ └── my-styles.css │ ├── advanced.ipynb │ ├── basics.ipynb │ ├── changelog.md │ ├── conf.py │ ├── contraction.ipynb │ ├── examples/ │ │ ├── ex_compressed_contraction.ipynb │ │ ├── ex_large_output_lazy.ipynb │ │ └── ex_trace_contraction_to_matmuls.ipynb │ ├── high-level-interface.ipynb │ ├── index.md │ ├── index_examples.md │ ├── installation.md │ ├── make.bat │ ├── trees.ipynb │ └── visualization.ipynb ├── examples/ │ ├── Example - Reproducing 2005.06787.ipynb │ ├── Example - Reproducing 2103-03074.ipynb │ ├── Quantum Circuit Example Old.ipynb │ ├── Quantum Circuit Example.ipynb │ ├── benchmarks/ │ │ ├── cubic_6x6x10.json │ │ ├── mps_mpo_L100_chi64_D5.json │ │ ├── peps_cluster_r2_D10_a.json │ │ ├── qucirc_rrzz_n56_d13.json │ │ ├── rand_50_5_a.json │ │ ├── randreg_200_3_a.json │ │ ├── rtree_100_a.json │ │ └── sycamore_n53_m20_s0_e0_pABCDCDAB.json │ ├── circuit_n53_m10_s0_e0_pABCDCDAB.qsim │ ├── circuit_n53_m12_s0_e0_pABCDCDAB.qsim │ ├── circuit_n53_m20_s0_e0_pABCDCDAB.qsim │ ├── ex_jax.py │ ├── ex_mpi_executor.py │ └── ex_mpi_spmd.py ├── pyproject.toml └── tests/ ├── __init__.py ├── test_backends.py ├── test_compressed.py ├── test_compute.py ├── test_hypergraph.py ├── test_interface.py ├── test_optimizers.py ├── test_parallel.py ├── test_paths_basic.py ├── test_slicer.py └── test_tree.py ================================================ FILE CONTENTS ================================================ ================================================ FILE: .codecov.yml ================================================ codecov: require_ci_to_pass: yes coverage: range: 50..100 status: project: default: informational: true patch: default: informational: true changes: false comment: off ================================================ FILE: .gitattributes ================================================ # Auto detect text files and perform LF normalization * text=auto # Standard to msysgit *.doc diff=astextplain *.DOC diff=astextplain *.docx diff=astextplain *.DOCX diff=astextplain *.dot diff=astextplain *.DOT diff=astextplain *.pdf diff=astextplain *.PDF diff=astextplain *.rtf diff=astextplain *.RTF diff=astextplain # include the version number in git archive cotengra/_version.py export-subst # make cotengra appear as a python project on github *.ipynb linguist-language=Python # SCM syntax highlighting & preventing 3-way merges pixi.lock merge=binary linguist-language=YAML linguist-generated=true ================================================ FILE: .github/dependabot.yml ================================================ # To get started with Dependabot version updates, you'll need to specify which # package ecosystems to update and where the package manifests are located. # Please see the documentation for all configuration options: # https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file version: 2 updates: # Enable Dependabot for GitHub Actions - package-ecosystem: "github-actions" directory: "/" # Location of your workflows, typically the root folder schedule: interval: "daily" # Frequency of update checks (daily, weekly, or monthly) ================================================ FILE: .github/workflows/pypi-release.yml ================================================ name: Build and Upload cotengra to PyPI on: release: types: - published push: tags: - 'v*' jobs: build-artifacts: runs-on: ubuntu-latest if: github.repository == 'jcmgray/cotengra' steps: - uses: actions/checkout@v6 with: fetch-depth: 0 - uses: actions/setup-python@v6 name: Install Python with: python-version: "3.12" - name: Install dependencies run: | python -m pip install --upgrade pip python -m pip install build twine - name: Build tarball and wheels run: | git clean -xdf git restore -SW . python -m build - name: Check built artifacts run: | python -m twine check --strict dist/* pwd if [ -f dist/cotengra-0.0.0.tar.gz ]; then echo "❌ INVALID VERSION NUMBER" exit 1 else echo "✅ Looks good" fi - uses: actions/upload-artifact@v7 with: name: releases path: dist test-built-dist: needs: build-artifacts runs-on: ubuntu-latest steps: - uses: actions/setup-python@v6 name: Install Python with: python-version: "3.12" - uses: actions/download-artifact@v8 with: name: releases path: dist - name: List contents of built dist run: | ls -ltrh ls -ltrh dist - name: Verify the built dist/wheel is valid if: github.event_name == 'push' run: | python -m pip install --upgrade pip python -m pip install dist/cotengra*.whl upload-to-test-pypi: needs: test-built-dist if: github.event_name == 'push' runs-on: ubuntu-latest environment: name: pypi url: https://test.pypi.org/p/cotengra permissions: id-token: write steps: - uses: actions/download-artifact@v8 with: name: releases path: dist - name: Publish package to TestPyPI if: github.event_name == 'push' uses: pypa/gh-action-pypi-publish@v1.14.0 with: repository-url: https://test.pypi.org/legacy/ verbose: true upload-to-pypi: needs: test-built-dist if: github.event_name == 'release' runs-on: ubuntu-latest environment: name: pypi url: https://pypi.org/p/cotengra permissions: id-token: write steps: - uses: actions/download-artifact@v8 with: name: releases path: dist - name: Publish package to PyPI uses: pypa/gh-action-pypi-publish@v1.14.0 with: verbose: true ================================================ FILE: .github/workflows/test.yml ================================================ name: Tests on: workflow_dispatch: push: pull_request: defaults: run: shell: bash -l {0} jobs: run-tests: runs-on: ${{ matrix.os }} strategy: matrix: include: - os: ubuntu-latest pixi_environment: testminimal pixi_task: test - os: ubuntu-latest pixi_environment: testpyold pixi_task: test - os: ubuntu-latest pixi_environment: testpynew pixi_task: test - os: macos-latest pixi_environment: testpymid pixi_task: test - os: windows-latest pixi_environment: testpymid pixi_task: test - os: ubuntu-latest pixi_environment: testtorch pixi_task: test-backends - os: ubuntu-latest pixi_environment: testjax pixi_task: test-backends - os: ubuntu-latest pixi_environment: testtensorflow pixi_task: test-backends steps: - uses: actions/checkout@v6 - uses: prefix-dev/setup-pixi@v0.9.5 with: environments: ${{ matrix.pixi_environment }} - name: Test with pytest run: pixi run -e ${{ matrix.pixi_environment }} ${{ matrix.pixi_task }} - name: Report to codecov uses: codecov/codecov-action@v6 with: token: ${{ secrets.CODECOV_TOKEN }} ================================================ FILE: .gitignore ================================================ # Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] *$py.class # C extensions *.so # Distribution / packaging .Python env/ build/ develop-eggs/ dist/ downloads/ eggs/ .eggs/ lib/ lib64/ parts/ sdist/ var/ *.egg-info/ .installed.cfg *.egg # PyInstaller # Usually these files are written by a python script from a template # before PyInstaller builds the exe, so as to inject date/other infos into it. *.manifest *.spec # Installer logs pip-log.txt pip-delete-this-directory.txt # Unit test / coverage reports htmlcov/ .tox/ .coverage .coverage.* .cache nosetests.xml coverage.xml *,cover # Translations *.mo *.pot # Django stuff: *.log # Sphinx documentation docs/_build/ # PyBuilder target/ .pytest_cache .vscode **/.ipynb_checkpoints/ # Added by cargo /target Cargo.lock cotengra/_version.py experiments # pixi environments .pixi/* !.pixi/config.toml ================================================ FILE: .readthedocs.yml ================================================ version: 2 sphinx: configuration: docs/conf.py build: os: "ubuntu-24.04" tools: python: "latest" jobs: create_environment: - asdf plugin add pixi - asdf install pixi latest - asdf global pixi latest install: - pixi install -e docs build: html: - pixi run readthedocs formats: [] ================================================ FILE: LICENSE.md ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright {yyyy} {name of copyright owner} Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: MANIFEST.in ================================================ include cotengra/kahypar_profiles/*.ini include cotengra/kahypar_profiles/old/*.ini include LICENSE.md include README.md graft tests ================================================ FILE: README.md ================================================

cotengra

[![tests](https://github.com/jcmgray/cotengra/actions/workflows/test.yml/badge.svg)](https://github.com/jcmgray/cotengra/actions/workflows/test.yml) [![codecov](https://codecov.io/gh/jcmgray/cotengra/branch/main/graph/badge.svg?token=Q5evNiuT9S)](https://codecov.io/gh/jcmgray/cotengra) [![Docs](https://readthedocs.org/projects/cotengra/badge/?version=latest)](https://cotengra.readthedocs.io) [![PyPI](https://img.shields.io/pypi/v/cotengra?color=teal)](https://pypi.org/project/cotengra/) [![Anaconda-Server Badge](https://anaconda.org/conda-forge/cotengra/badges/version.svg)](https://anaconda.org/conda-forge/cotengra) [![Pixi Badge](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/prefix-dev/pixi/main/assets/badge/v0.json)](https://pixi.sh) `cotengra` is a python library for contracting tensor networks or einsum expressions involving large numbers of tensors - the main docs can be found at [cotengra.readthedocs.io](https://cotengra.readthedocs.io/). Some of the key feautures of `cotengra` include: * drop-in ``einsum`` and ``ncon`` replacement * an explicit **contraction tree** object that can be flexibly built, modified and visualized * a **'hyper optimizer'** that samples trees while tuning the generating meta-paremeters * **dynamic slicing** for massive memory savings and parallelism * **simulated annealing** as an alternative optimizing and slicing strategy * support for **hyper** edge tensor networks and thus arbitrary einsum equations * **paths** that can be supplied to [`numpy.einsum`](https://numpy.org/doc/stable/reference/generated/numpy.einsum.html), [`opt_einsum`](https://dgasmith.github.io/opt_einsum/), [`quimb`](https://quimb.readthedocs.io/en/latest/) among others * **performing contractions** with tensors from many libraries via [`autoray`](https://github.com/jcmgray/autoray), even if they don't provide `einsum` or `tensordot` but do have (batch) matrix multiplication

cotengra

================================================ FILE: cotengra/__init__.py ================================================ """Hyper optimized contraction trees for large tensor networks and einsums.""" from importlib.metadata import PackageNotFoundError as _PackageNotFoundError from importlib.metadata import version as _version try: __version__ = _version("cotengra") except _PackageNotFoundError: try: # fallback for source trees where hatch-vcs has generated _version.py. from ._version import version as __version__ except ImportError: __version__ = "0.0.0+unknown" import functools import warnings from . import utils from .core import ( ContractionTree, ContractionTreeCompressed, ) from .core_multi import ( ContractionTreeMulti, ) from .hypergraph import ( HyperGraph, get_hypergraph, ) from .hyperoptimizers import ( hyper_cmaes, hyper_es, hyper_neldermead, hyper_nevergrad, hyper_optuna, hyper_random, hyper_sbplx, hyper_skopt, ) from .hyperoptimizers.hyper import ( HyperCompressedOptimizer, HyperMultiOptimizer, HyperOptimizer, ReusableHyperCompressedOptimizer, ReusableHyperOptimizer, get_hyper_space, list_hyper_functions, ) from .interface import ( array_contract, array_contract_expression, array_contract_path, array_contract_tree, einsum, einsum_expression, einsum_tree, ncon, register_preset, ) from .oe import PathOptimizer from .pathfinders import ( path_basic, path_compressed_greedy, path_greedy, path_igraph, path_kahypar, path_labels, ) from .pathfinders.path_basic import ( GreedyOptimizer, OptimalOptimizer, RandomGreedyOptimizer, ReusableRandomGreedyOptimizer, edge_path_to_linear, edge_path_to_ssa, linear_to_ssa, ssa_to_linear, ) from .pathfinders.path_flowcutter import ( FlowCutterOptimizer, optimize_flowcutter, ) from .pathfinders.path_quickbb import QuickBBOptimizer, optimize_quickbb from .pathfinders.path_random import RandomOptimizer from .plot import ( plot_contractions, plot_contractions_alt, plot_scatter, plot_scatter_alt, plot_slicings, plot_slicings_alt, plot_tree, plot_tree_ring, plot_tree_span, plot_tree_tent, plot_trials, plot_trials_alt, ) from .presets import ( AutoHQOptimizer, AutoOptimizer, auto_hq_optimize, auto_optimize, greedy_optimize, optimal_optimize, optimal_outer_optimize, ) from .reusable import ( hash_contraction, ) from .slicer import SliceFinder from .utils import ( get_symbol, get_symbol_map, ) UniformOptimizer = functools.partial(HyperOptimizer, optlib="random") """Does no gaussian process tuning by default, just randomly samples - requires no optimization library. """ contract_expression = einsum_expression """Alias for :func:`cotengra.einsum_expression`.""" contract = einsum """Alias for :func:`cotengra.einsum`.""" __all__ = ( "array_contract_expression", "array_contract_path", "array_contract_tree", "array_contract", "auto_hq_optimize", "auto_optimize", "AutoHQOptimizer", "AutoOptimizer", "contract_expression", "contract", "ContractionTree", "ContractionTreeCompressed", "ContractionTreeMulti", "edge_path_to_linear", "edge_path_to_ssa", "einsum_expression", "einsum_tree", "einsum", "FlowCutterOptimizer", "get_hyper_space", "get_hypergraph", "get_symbol_map", "get_symbol", "greedy_optimize", "GreedyOptimizer", "hash_contraction", "hyper_cmaes", "hyper_nevergrad", "hyper_neldermead", "hyper_optimize", "hyper_optuna", "hyper_random", "hyper_es", "hyper_skopt", "hyper_sbplx", "HyperCompressedOptimizer", "HyperGraph", "HyperMultiOptimizer", "HyperOptimizer", "linear_to_ssa", "list_hyper_functions", "ncon", "optimal_optimize", "optimal_outer_optimize", "OptimalOptimizer", "optimize_flowcutter", "optimize_quickbb", "path_basic", "path_compressed_greedy", "path_greedy", "path_igraph", "path_kahypar", "path_labels", "PathOptimizer", "plot_contractions_alt", "plot_contractions", "plot_scatter_alt", "plot_scatter", "plot_slicings_alt", "plot_slicings", "plot_tree_ring", "plot_tree_span", "plot_tree_tent", "plot_tree", "plot_trials_alt", "plot_trials", "QuasiRandOptimizer", "QuickBBOptimizer", "RandomGreedyOptimizer", "RandomOptimizer", "register_preset", "ReusableHyperCompressedOptimizer", "ReusableHyperOptimizer", "ReusableRandomGreedyOptimizer", "SliceFinder", "ssa_to_linear", "UniformOptimizer", "utils", ) # add some presets def hyper_optimize( inputs, output, size_dict, memory_limit=None, get="path", **opts, ): if memory_limit is not None: warnings.warn( "`memory_limit` is not supported in hyper_optimize, ignoring." ) optimizer = HyperOptimizer(**opts) if get == "path": return optimizer(inputs, output, size_dict) elif get == "tree": return optimizer.search(inputs, output, size_dict) else: raise ValueError(f"Unknown get option {get}") def hyper_compressed_optimize( inputs, output, size_dict, get="path", **opts, ): optimizer = HyperCompressedOptimizer(**opts) if get == "path": return optimizer(inputs, output, size_dict) elif get == "tree": return optimizer.search(inputs, output, size_dict) else: raise ValueError(f"Unknown get option {get}") def random_greedy_optimize( inputs, output, size_dict, memory_limit=None, **opts ): if memory_limit is not None: warnings.warn( "`memory_limit` is not supported in " "random_greedy_optimize, ignoring." ) optimizer = RandomGreedyOptimizer(**opts) return optimizer(inputs, output, size_dict) try: register_preset( "hyper", hyper_optimize, optimizer_tree=functools.partial(hyper_optimize, get="tree"), ) register_preset( "hyper-256", functools.partial(hyper_optimize, max_repeats=256), optimizer_tree=functools.partial( hyper_optimize, max_repeats=256, get="tree" ), ) register_preset( "hyper-greedy", functools.partial(hyper_optimize, methods=["greedy"]), optimizer_tree=functools.partial( hyper_optimize, methods=["greedy"], get="tree" ), ) register_preset( "hyper-labels", functools.partial(hyper_optimize, methods=["labels"]), optimizer_tree=functools.partial( hyper_optimize, methods=["labels"], get="tree" ), ) register_preset( "hyper-kahypar", functools.partial(hyper_optimize, methods=["kahypar"]), optimizer_tree=functools.partial( hyper_optimize, methods=["kahypar"], get="tree" ), ) register_preset( "hyper-balanced", functools.partial( hyper_optimize, methods=["kahypar-balanced"], max_repeats=16 ), optimizer_tree=functools.partial( hyper_optimize, methods=["kahypar-balanced"], max_repeats=16, get="tree", ), ) register_preset( "hyper-compressed", hyper_compressed_optimize, optimizer_tree=functools.partial( hyper_compressed_optimize, get="tree", ), compressed=True, ) register_preset( "hyper-spinglass", functools.partial(hyper_optimize, methods=["spinglass"]), ) register_preset( "hyper-betweenness", functools.partial(hyper_optimize, methods=["betweenness"]), ) register_preset( "random-greedy", random_greedy_optimize, ) register_preset( "random-greedy-128", functools.partial(random_greedy_optimize, max_repeats=128), ) register_preset( "flowcutter-2", functools.partial(optimize_flowcutter, max_time=2), ) register_preset( "flowcutter-10", functools.partial(optimize_flowcutter, max_time=10), ) register_preset( "flowcutter-60", functools.partial(optimize_flowcutter, max_time=60), ) register_preset( "quickbb-2", functools.partial(optimize_quickbb, max_time=2), ) register_preset( "quickbb-10", functools.partial(optimize_quickbb, max_time=10), ) register_preset( "quickbb-60", functools.partial(optimize_quickbb, max_time=60), ) register_preset( "greedy-compressed", path_compressed_greedy.greedy_compressed, path_compressed_greedy.trial_greedy_compressed, compressed=True, ) register_preset( "greedy-span", path_compressed_greedy.greedy_span, path_compressed_greedy.trial_greedy_span, compressed=True, ) except KeyError: # KeyError: if reloading cotengra e.g. library entries already registered pass ================================================ FILE: cotengra/contract.py ================================================ """Functionality relating to actually contracting.""" import contextlib import functools import itertools import operator from autoray import do, get_namespace, infer_backend_multi, shape DEFAULT_IMPLEMENTATION = "auto" def set_default_implementation(impl): global DEFAULT_IMPLEMENTATION DEFAULT_IMPLEMENTATION = impl def get_default_implementation(): return DEFAULT_IMPLEMENTATION @contextlib.contextmanager def default_implementation(impl): """Context manager for temporarily setting the default implementation.""" global DEFAULT_IMPLEMENTATION old_impl = DEFAULT_IMPLEMENTATION DEFAULT_IMPLEMENTATION = impl try: yield finally: DEFAULT_IMPLEMENTATION = old_impl @functools.lru_cache(2**12) def _sanitize_equation(eq): """Get the input and output indices of an equation, computing the output implicitly as the sorted sequence of every index that appears exactly once if it is not provided. """ # remove spaces eq = eq.replace(" ", "") if "..." in eq: raise NotImplementedError("Ellipsis not supported.") if "->" not in eq: lhs = eq tmp_subscripts = lhs.replace(",", "") out = "".join( # sorted sequence of indices s for s in sorted(set(tmp_subscripts)) # that appear exactly once if tmp_subscripts.count(s) == 1 ) else: lhs, out = eq.split("->") return lhs, out @functools.lru_cache(2**12) def _parse_einsum_single(eq, shape): """Cached parsing of a single term einsum equation into the necessary sequence of arguments for axes diagonals, sums, and transposes. """ lhs, out = _sanitize_equation(eq) # parse each index need_to_diag = [] need_to_sum = [] seen = set() for ix in lhs: if ix in need_to_diag: continue if ix in seen: need_to_diag.append(ix) continue seen.add(ix) if ix not in out: need_to_sum.append(ix) # first handle diagonal reductions if need_to_diag: diag_sels = [] sizes = dict(zip(lhs, shape)) while need_to_diag: ixd = need_to_diag.pop() dinds = tuple(range(sizes[ixd])) # construct advanced indexing object selector = tuple(dinds if ix == ixd else slice(None) for ix in lhs) diag_sels.append(selector) # after taking the diagonal what are new indices? ixd_contig = ixd * lhs.count(ixd) if ixd_contig in lhs: # contig axes, new axis is at same position lhs = lhs.replace(ixd_contig, ixd) else: # non-contig, new axis is at beginning lhs = ixd + lhs.replace(ixd, "") else: diag_sels = None # then sum reductions if need_to_sum: sum_axes = tuple(map(lhs.index, need_to_sum)) for ix in need_to_sum: lhs = lhs.replace(ix, "") else: sum_axes = None # then transposition if lhs == out: perm = None else: perm = tuple(lhs.index(ix) for ix in out) return diag_sels, sum_axes, perm def _parse_eq_to_pure_multiplication(a_term, shape_a, b_term, shape_b, out): """If there are no contracted indices, then we can directly transpose and insert singleton dimensions into ``a`` and ``b`` such that (broadcast) elementwise multiplication performs the einsum. No need to cache this as it is within the cached ``_parse_eq_to_batch_matmul``. """ desired_a = "" desired_b = "" new_shape_a = [] new_shape_b = [] for ix in out: if ix in a_term: desired_a += ix new_shape_a.append(shape_a[a_term.index(ix)]) else: new_shape_a.append(1) if ix in b_term: desired_b += ix new_shape_b.append(shape_b[b_term.index(ix)]) else: new_shape_b.append(1) if desired_a != a_term: eq_a = f"{a_term}->{desired_a}" else: eq_a = None if desired_b != b_term: eq_b = f"{b_term}->{desired_b}" else: eq_b = None return ( eq_a, eq_b, new_shape_a, new_shape_b, None, # new_shape_ab, not needed since not fusing None, # perm_ab, not needed as we transpose a and b first True, # pure_multiplication=True ) @functools.lru_cache(2**12) def _parse_eq_to_batch_matmul(eq, shape_a, shape_b): """Cached parsing of a two term einsum equation into the necessary sequence of arguments for contracttion via batched matrix multiplication. The steps we need to specify are: 1. Remove repeated and trivial indices from the left and right terms, and transpose them, done as a single einsum. 2. Fuse the remaining indices so we have two 3D tensors. 3. Perform the batched matrix multiplication. 4. Unfuse the output to get the desired final index order. """ lhs, out = eq.split("->") a_term, b_term = lhs.split(",") if len(a_term) != len(shape_a): raise ValueError(f"Term '{a_term}' does not match shape {shape_a}.") if len(b_term) != len(shape_b): raise ValueError(f"Term '{b_term}' does not match shape {shape_b}.") sizes = {} singletons = set() # parse left term to unique indices with size > 1 left = {} for ix, d in zip(a_term, shape_a): if d == 1: # everything (including broadcasting) works nicely if simply ignore # such dimensions, but we do need to track if they appear in output # and thus should be reintroduced later singletons.add(ix) continue if sizes.setdefault(ix, d) != d: # set and check size raise ValueError( f"Index {ix} has mismatched sizes {sizes[ix]} and {d}." ) left[ix] = True # parse right term to unique indices with size > 1 right = {} for ix, d in zip(b_term, shape_b): # broadcast indices (size 1 on one input and size != 1 # on the other) should not be treated as singletons if d == 1: if ix not in left: singletons.add(ix) continue singletons.discard(ix) if sizes.setdefault(ix, d) != d: # set and check size raise ValueError( f"Index {ix} has mismatched sizes {sizes[ix]} and {d}." ) right[ix] = True # now we classify the unique size > 1 indices only bat_inds = [] # appears on A, B, O con_inds = [] # appears on A, B, . a_keep = [] # appears on A, ., O b_keep = [] # appears on ., B, O # other indices (appearing on A or B only) will # be summed or traced out prior to the matmul for ix in left: if right.pop(ix, False): if ix in out: bat_inds.append(ix) else: con_inds.append(ix) elif ix in out: a_keep.append(ix) # now only indices unique to right remain for ix in right: if ix in out: b_keep.append(ix) if not con_inds: # contraction is pure multiplication, prepare inputs differently return _parse_eq_to_pure_multiplication( a_term, shape_a, b_term, shape_b, out ) # only need the size one indices that appear in the output singletons = [ix for ix in out if ix in singletons] # take diagonal, remove any trivial axes and transpose left desired_a = "".join((*bat_inds, *a_keep, *con_inds)) if a_term != desired_a: if set(a_term) == set(desired_a): # only need to transpose, don't invoke einsum eq_a = tuple(a_term.index(ix) for ix in desired_a) else: eq_a = f"{a_term}->{desired_a}" else: eq_a = None # take diagonal, remove any trivial axes and transpose right desired_b = "".join((*bat_inds, *con_inds, *b_keep)) if b_term != desired_b: if set(b_term) == set(desired_b): # only need to transpose, don't invoke einsum eq_b = tuple(b_term.index(ix) for ix in desired_b) else: eq_b = f"{b_term}->{desired_b}" else: eq_b = None # then we want to reshape if bat_inds: lgroups = (bat_inds, a_keep, con_inds) rgroups = (bat_inds, con_inds, b_keep) ogroups = (bat_inds, a_keep, b_keep) else: # avoid size 1 batch dimension if no batch indices lgroups = (a_keep, con_inds) rgroups = (con_inds, b_keep) ogroups = (a_keep, b_keep) if any(len(group) != 1 for group in lgroups): # need to fuse 'kept' and contracted indices # (though could allow batch indices to be broadcast) new_shape_a = tuple( functools.reduce(operator.mul, (sizes[ix] for ix in ix_group), 1) for ix_group in lgroups ) else: new_shape_a = None if any(len(group) != 1 for group in rgroups): # need to fuse 'kept' and contracted indices # (though could allow batch indices to be broadcast) new_shape_b = tuple( functools.reduce(operator.mul, (sizes[ix] for ix in ix_group), 1) for ix_group in rgroups ) else: new_shape_b = None if any(len(group) != 1 for group in ogroups) or singletons: new_shape_ab = (1,) * len(singletons) + tuple( sizes[ix] for ix_group in ogroups for ix in ix_group ) else: new_shape_ab = None # then we might need to permute the matmul produced output: out_produced = "".join((*singletons, *bat_inds, *a_keep, *b_keep)) if out_produced != out: perm_ab = tuple(out_produced.index(ix) for ix in out) else: perm_ab = None return ( eq_a, eq_b, new_shape_a, new_shape_b, new_shape_ab, perm_ab, False, # pure_multiplication=False ) def _einsum_single(eq, x, backend=None): """Einsum on a single tensor, via three steps: diagonal selection (via advanced indexing), axes summations, transposition. The logic for each is cached based on the equation and array shape, and each step is only performed if necessary. """ try: return do("einsum", eq, x, like=backend) except ImportError: pass diag_sels, sum_axes, perm = _parse_einsum_single(eq, shape(x)) if diag_sels is not None: # diagonal reduction via advanced indexing # e.g ababbac->abc for selector in diag_sels: x = x[selector] if sum_axes is not None: # trivial removal of axes via summation # e.g. abc->c x = do("sum", x, sum_axes, like=backend) if perm is not None: # transpose to desired output # e.g. abc->cba x = do("transpose", x, perm, like=backend) return x def _do_contraction_via_bmm( a, b, eq_a, eq_b, new_shape_a, new_shape_b, new_shape_ab, perm_ab, pure_multiplication, backend, ): # prepare left if eq_a is not None: if isinstance(eq_a, tuple): # only transpose a = do("transpose", a, eq_a, like=backend) else: # diagonals, sums, and tranpose a = _einsum_single(eq_a, a) if new_shape_a is not None: a = do("reshape", a, new_shape_a, like=backend) # prepare right if eq_b is not None: if isinstance(eq_b, tuple): # only transpose b = do("transpose", b, eq_b, like=backend) else: # diagonals, sums, and tranpose b = _einsum_single(eq_b, b) if new_shape_b is not None: b = do("reshape", b, new_shape_b, like=backend) if pure_multiplication: # no contracted indices return do("multiply", a, b) # do the contraction! ab = do("matmul", a, b, like=backend) # prepare the output if new_shape_ab is not None: ab = do("reshape", ab, new_shape_ab, like=backend) if perm_ab is not None: ab = do("transpose", ab, perm_ab, like=backend) return ab def einsum(eq, a, b=None, *, backend=None): """Perform arbitrary single and pairwise einsums using only `matmul`, `transpose`, `reshape` and `sum`. The logic for each is cached based on the equation and array shape, and each step is only performed if necessary. Parameters ---------- eq : str The einsum equation. a : array_like The first array to contract. b : array_like, optional The second array to contract. backend : str, optional The backend to use for array operations. If ``None``, dispatch automatically based on ``a`` and ``b``. Returns ------- array_like """ if b is None: return _einsum_single(eq, a, backend=backend) ( eq_a, eq_b, new_shape_a, new_shape_b, new_shape_ab, perm_ab, pure_multiplication, ) = _parse_eq_to_batch_matmul(eq, shape(a), shape(b)) return _do_contraction_via_bmm( a, b, eq_a, eq_b, new_shape_a, new_shape_b, new_shape_ab, perm_ab, pure_multiplication, backend, ) def gen_nice_inds(): """Generate the indices from [a-z, A-Z, reasonable unicode...].""" for i in range(26): yield chr(ord("a") + i) for i in range(26): yield chr(ord("A") + i) for i in itertools.count(192): yield chr(i) @functools.lru_cache(2**12) def _parse_tensordot_axes_to_matmul(axes, shape_a, shape_b): """Parse a tensordot specification into the necessary sequence of arguments for contracttion via matrix multiplication. This just converts ``axes`` into an ``einsum`` eq string then calls ``_parse_eq_to_batch_matmul``. """ ndim_a = len(shape_a) ndim_b = len(shape_b) if isinstance(axes, int): axes_a = tuple(range(ndim_a - axes, ndim_a)) axes_b = tuple(range(axes)) else: axes_a, axes_b = axes num_con = len(axes_a) if num_con != len(axes_b): raise ValueError( f"Axes should have the same length, got {axes_a} and {axes_b}." ) possible_inds = gen_nice_inds() inds_a = [next(possible_inds) for _ in range(ndim_a)] inds_b = [] inds_out = inds_a.copy() for axb in range(ndim_b): if axb not in axes_b: # right uncontracted index ind = next(possible_inds) inds_out.append(ind) else: # contracted index axa = axes_a[axes_b.index(axb)] # check that the shapes match if shape_a[axa] != shape_b[axb]: raise ValueError( f"Dimension mismatch between axes {axa} of {shape_a} and " f"{axb} of {shape_b}: {shape_a[axa]} != {shape_b[axb]}." ) ind = inds_a[axa] inds_out.remove(ind) inds_b.append(ind) eq = f"{''.join(inds_a)},{''.join(inds_b)}->{''.join(inds_out)}" return _parse_eq_to_batch_matmul(eq, shape_a, shape_b) def tensordot(a, b, axes=2, *, backend=None): """Perform a tensordot using only `matmul`, `transpose`, `reshape`. The logic for each is cached based on the equation and array shape, and each step is only performed if necessary. Parameters ---------- a, b : array_like The arrays to contract. axes : int or tuple of (sequence[int], sequence[int]) The number of axes to contract, or the axes to contract. If an int, the last ``axes`` axes of ``a`` and the first ``axes`` axes of ``b`` are contracted. If a tuple, the axes to contract for ``a`` and ``b`` respectively. backend : str or None, optional The backend to use for array operations. If ``None``, dispatch automatically based on ``a`` and ``b``. Returns ------- array_like """ try: # ensure hashable axes = tuple(map(int, axes[0])), tuple(map(int, axes[1])) except IndexError: axes = int(axes) ( eq_a, eq_b, new_shape_a, new_shape_b, new_shape_ab, perm_ab, pure_multiplication, ) = _parse_tensordot_axes_to_matmul(axes, shape(a), shape(b)) return _do_contraction_via_bmm( a, b, eq_a, eq_b, new_shape_a, new_shape_b, new_shape_ab, perm_ab, pure_multiplication, backend, ) def extract_contractions( tree, order=None, prefer_einsum=False, ): """Extract just the information needed to perform the contraction. Parameters ---------- order : str or callable, optional Supplied to :meth:`ContractionTree.traverse`. prefer_einsum : bool, optional Prefer to use ``einsum`` for pairwise contractions, even if ``tensordot`` can perform the contraction. Returns ------- contractions : tuple A tuple of tuples, each containing the information needed to perform a pairwise contraction. Each tuple contains: - ``p``: the parent node, - ``l``: the left child node, - ``r``: the right child node, - ``tdot``: whether to use ``tensordot`` or ``einsum``, - ``arg``: the argument to pass to ``tensordot`` or ``einsum`` i.e. ``axes`` or ``eq``, - ``perm``: the permutation required after the contraction, if any (only applies to tensordot). If both ``l`` and ``r`` are ``None``, the the operation is a single term simplification performed with ``einsum``. """ if tree.N == 1: # trivial 'contraction', single input maps directly to output # possibly with reductions/transpose, setting l but not r flags this pi = 1 li = 0 ri = None tdot = False arg = tree.get_eq_sliced() perm = None return [(pi, li, ri, tdot, arg, perm)] contractions = [] # for compactness we convert nodes to ssa indices ssas = {leaf: i for i, leaf in enumerate(tree.gen_leaves())} ssa = len(ssas) # pairwise contractions for p, l, r in tree.traverse(order=order): li = ssas.pop(l) ri = ssas.pop(r) pi = ssas[p] = ssa ssa += 1 if prefer_einsum or not tree.get_can_dot(p): tdot = False arg = tree.get_einsum_eq(p) perm = None else: tdot = True arg = tree.get_tensordot_axes(p) perm = tree.get_tensordot_perm(p) contractions.append((pi, li, ri, tdot, arg, perm)) if tree.preprocessing: # inplace single term simplifications # n.b. these are populated lazily when the other information is # computed above, so we do it after pre_contractions = ( (i, None, None, False, eq, None) for i, eq in tree.preprocessing.items() ) return (*pre_contractions, *contractions) return tuple(contractions) class Contractor: """Default cotengra network contractor. Parameters ---------- contractions : tuple[tuple] The sequence of contractions to perform. Each contraction should be a tuple containing: - ``p``: the parent node, - ``l``: the left child node, - ``r``: the right child node, - ``tdot``: whether to use ``tensordot`` or ``einsum``, - ``arg``: the argument to pass to ``tensordot`` or ``einsum`` i.e. ``axes`` or ``eq``, - ``perm``: the permutation required after the contraction, if any (only applies to tensordot). e.g. built by calling ``extract_contractions(tree)``. strip_exponent : bool, optional If ``True``, eagerly strip the exponent (in log10) from intermediate tensors to control numerical problems from leaving the range of the datatype. This method then returns the scaled 'mantissa' output array and the exponent separately. check_zero : bool, optional If ``True``, when ``strip_exponent=True``, explicitly check for zero-valued intermediates that would otherwise produce ``nan``, instead terminating early if encounteredand returning ``(0.0, 0.0)``. backend : str, optional What library to use for ``tensordot``, ``einsum`` and ``transpose``, it will be automatically inferred from the input arrays if not given. progbar : bool, optional Whether to show a progress bar. """ __slots__ = ( "contractions", "strip_exponent", "check_zero", "implementation", "backend", "progbar", "__weakref__", ) def __init__( self, contractions, strip_exponent=False, check_zero=False, implementation="auto", backend=None, progbar=False, ): self.contractions = contractions self.strip_exponent = strip_exponent self.check_zero = check_zero self.implementation = implementation self.backend = backend self.progbar = progbar def __call__(self, *arrays, **kwargs): """Contract ``arrays`` using operations listed in ``contractions``. Parameters ---------- arrays : sequence of array-like The arrays to contract. kwargs : dict Override the default settings for this contraction only. Returns ------- output : array The contracted output, it will be scaled if ``strip_exponent==True``. exponent : float The exponent of the output in base 10, returned only if ``strip_exponent==True``. """ backend = kwargs.pop("backend", self.backend) progbar = kwargs.pop("progbar", self.progbar) check_zero = kwargs.pop("check_zero", self.check_zero) strip_exponent = kwargs.pop("strip_exponent", self.strip_exponent) implementation = kwargs.pop("implementation", self.implementation) if kwargs: raise TypeError(f"Unknown keyword arguments: {kwargs}.") if backend is None: backend = infer_backend_multi(*arrays) xp = get_namespace(backend) if implementation == "auto": if backend == "numpy": # by default only replace numpy's einsum/tensordot implementation = "cotengra" else: implementation = "autoray" if implementation == "cotengra": _einsum, _tensordot = einsum, tensordot elif implementation == "pytblis": import pytblis _einsum = pytblis.einsum _tensordot = pytblis.tensordot elif implementation == "autoray": try: _einsum = xp.einsum except ImportError: # fallback to cotengra (matmul) implementation _einsum = einsum try: _tensordot = xp.tensordot except ImportError: # fallback to cotengra (matmul) implementation _tensordot = tensordot else: # manually supplied _einsum, _tensordot = implementation # temporary storage for intermediates N = len(arrays) temps = dict(enumerate(arrays)) exponent = 0.0 if (strip_exponent is not False) else None if progbar: import tqdm contractions = tqdm.tqdm(self.contractions, total=N - 1) else: contractions = self.contractions for pi, li, ri, tdot, arg, perm in contractions: if ri is None: if li is None: # single term simplification, perform inplace with einsum temps[pi] = _einsum(arg, temps[pi]) continue else: # trivial 'contraction', single input maps directly to # output, possibly with reductions/transpose via einsum p_array = _einsum(arg, temps[li]) if strip_exponent: return p_array, 0.0 return p_array # get input arrays for this contraction l_array = temps.pop(li) r_array = temps.pop(ri) if tdot: p_array = _tensordot(l_array, r_array, arg) if perm: p_array = xp.transpose(p_array, perm) else: p_array = _einsum(arg, l_array, r_array) if exponent is not None: factor = xp.max(xp.abs(p_array)) if check_zero and float(factor) == 0.0: return 0.0, float("-inf") exponent = exponent + xp.log10(factor) if backend == "tensorflow": factor = xp.astype(factor, p_array.dtype) # TODO: # currently special case tensorflow # autoray needs fix for autojit and astype to use generally p_array = p_array / factor # insert the new intermediate array temps[pi] = p_array if exponent is not None: return p_array, exponent return p_array class CuQuantumContractor: def __init__( self, tree, handle_slicing=False, autotune=False, **kwargs, ): if kwargs.pop("strip_exponent", None): raise ValueError( "strip_exponent=True not supported with cuQuantum" ) if tree.has_preprocessing(): raise ValueError("Preprocessing not supported with cuQuantum yet.") if kwargs.pop("progbar", None): import warnings warnings.warn("Progress bar not supported with cuQuantum yet.") if handle_slicing: self.eq = tree.get_eq() self.shapes = tree.get_shapes() else: self.eq = tree.get_eq_sliced() self.shapes = tree.get_shapes_sliced() if tree.is_complete(): kwargs.setdefault("optimize", {}) kwargs["optimize"].setdefault("path", tree.get_path()) if handle_slicing and tree.sliced_inds: kwargs["optimize"].setdefault( "slicing", [(ix, tree.size_dict[ix] - 1) for ix in tree.sliced_inds], ) self.kwargs = kwargs self.autotune = 3 if autotune is True else autotune self.handle = None self.network = None def setup(self, *arrays): import cuquantum if hasattr(cuquantum, "bindings"): # cuquantum-python >= 25.03 from cuquantum.tensornet import Network else: # for cuquantum < 25.03 from cuquantum import Network self.network = Network( self.eq, *arrays, ) self.network.contract_path(**self.kwargs) if self.autotune: self.network.autotune(iterations=self.autotune) def __call__( self, *arrays, check_zero=False, backend=None, progbar=False, ): # can't handle these yet assert not check_zero assert not progbar assert backend is None if self.network is None: self.setup(*arrays) else: self.network.reset_operands(*arrays) return self.network.contract() def __del__(self): if self.network is not None: self.network.free() def make_contractor( tree, order=None, prefer_einsum=False, strip_exponent=False, check_zero=False, implementation=None, autojit=False, progbar=False, ): """Get a reusable function which performs the contraction corresponding to ``tree``. The various options provide defaults that can also be overrode when calling the standard contractor. Parameters ---------- tree : ContractionTree The contraction tree. order : str or callable, optional Supplied to :meth:`ContractionTree.traverse`, the order in which to perform the pairwise contractions given by the tree. prefer_einsum : bool, optional Prefer to use ``einsum`` for pairwise contractions, even if ``tensordot`` can perform the contraction. strip_exponent : bool, optional If ``True``, the function will strip the exponent from the output array and return it separately. check_zero : bool, optional If ``True``, when ``strip_exponent=True``, explicitly check for zero-valued intermediates that would otherwise produce ``nan``, instead terminating early if encountered and returning ``(0.0, 0.0)``. implementation : str or tuple[callable, callable], optional What library to use to actually perform the contractions. Options are - "auto": let cotengra choose - "autoray": dispatch with autoray, using the ``tensordot`` and ``einsum`` implementation of the backend - "cotengra": use the ``tensordot`` and ``einsum`` implementation of cotengra, which is based on batch matrix multiplication. This is faster for some backends like numpy, and also enables libraries which don't yet provide ``tensordot`` and ``einsum`` to be used. - "cuquantum": use the cuquantum library to perform the whole contraction (not just individual contractions). - tuple[callable, callable]: manually supply the ``tensordot`` and ``einsum`` implementations to use. autojit : bool, optional If ``True``, use :func:`autoray.autojit` to compile the contraction function. progbar : bool, optional Whether to show progress through the contraction by default. Returns ------- fn : callable The contraction function, with signature ``fn(*arrays)``. """ if implementation is None: implementation = get_default_implementation() if implementation == "cuquantum": fn = CuQuantumContractor( tree, strip_exponent=strip_exponent, check_zero=check_zero, progbar=progbar, ) else: fn = Contractor( contractions=extract_contractions(tree, order, prefer_einsum), strip_exponent=strip_exponent, check_zero=check_zero, implementation=implementation, progbar=progbar, ) if autojit: from autoray import autojit as _autojit fn = _autojit(fn) return fn ================================================ FILE: cotengra/core.py ================================================ """Core contraction tree data structure and methods.""" import collections import functools import itertools import math import warnings from dataclasses import dataclass from typing import Optional from autoray import do, get_namespace, infer_backend from .contract import make_contractor from .hypergraph import get_hypergraph from .nodeops import get_nodeops from .parallel import ( can_scatter, maybe_leave_pool, maybe_rejoin_pool, parse_parallel_arg, scatter, submit, ) from .pathfinders.path_simulated_annealing import ( parallel_temper_tree, simulated_anneal_tree, ) from .plot import ( plot_contractions, plot_contractions_alt, plot_hypergraph, plot_tree_circuit, plot_tree_flat, plot_tree_ring, plot_tree_rubberband, plot_tree_span, plot_tree_tent, ) from .scoring import ( DEFAULT_COMBO_FACTOR, CompressedStatsTracker, get_score_fn, ) from .utils import ( MaxCounter, compute_size_by_dict, deprecated, get_rng, get_symbol, groupby, inputs_output_to_eq, interleave, oset, prod, unique, ) def cached_node_property(name): """Decorator for caching information about nodes.""" def wrapper(meth): @functools.wraps(meth) def getter(self, node): try: return self.info[node][name] except KeyError: self.info[node][name] = value = meth(self, node) return value return getter return wrapper def legs_union(legs_seq): """Combine a sequence of legs into a single set of legs, summing their appearances. """ new_legs, *rem_legs = legs_seq new_legs = new_legs.copy() for legs in rem_legs: for ix, ix_count in legs.items(): new_legs[ix] = new_legs.get(ix, 0) + ix_count return new_legs def legs_without(legs, ind): """Discard ``ind`` from legs to create a new set of legs.""" new_legs = legs.copy() new_legs.pop(ind, None) return new_legs def get_with_default(k, obj, default): return obj.get(k, default) @dataclass(order=True, frozen=True) class SliceInfo: inner: bool ind: str size: int project: Optional[int] @property def sliced_range(self): if self.project is None: return range(self.size) else: return [self.project] def get_slice_strides(sliced_inds): """Compute the 'strides' given the (ordered) dictionary of sliced indices.""" slice_infos = list(sliced_inds.values()) nsliced = len(slice_infos) strides = [1] * nsliced # backwards cumulative product for i in range(nsliced - 2, -1, -1): strides[i] = strides[i + 1] * slice_infos[i + 1].size return strides class AdderWithMaybeExponentStripped: """Object that ddds two arrays, or tuples of (array, exponent) together in a stable and branchless way. It also internally caches the backend on the first call. """ __slots__ = ("backend", "namespace", "need_to_cast") def __init__(self): self.backend = None self.namespace = None self.need_to_cast = False def __call__(self, x, y): xistup = isinstance(x, tuple) yistup = isinstance(y, tuple) if not (xistup or yistup): # simple sum without exponent return x + y if xistup: xm, xe = x else: xm = x xe = 0.0 if yistup: ym, ye = y else: ym = y ye = 0.0 if self.backend is None: self.backend = infer_backend(xm) self.namespace = get_namespace(self.backend) self.need_to_cast = self.backend == "tensorflow" # perform branchless for jit etc. e = max(xe, ye) if self.need_to_cast: xcoeff = self.namespace.astype(10.0 ** (xe - e), xm.dtype) ycoeff = self.namespace.astype(10.0 ** (ye - e), ym.dtype) m = xm * xcoeff + ym * ycoeff else: m = xm * 10 ** (xe - e) + ym * 10 ** (ye - e) return (m, e) class ContractionTree: """Binary tree representing a tensor network contraction. Parameters ---------- inputs : sequence of str The list of input tensor's indices. output : str The output indices. size_dict : dict[str, int] The size of each index. track_childless : bool, optional Whether to dynamically keep track of which nodes are childless. Useful if you are 'divisively' building the tree. track_flops : bool, optional Whether to dynamically keep track of the total number of flops. If ``False`` You can still compute this once the tree is complete. track_write : bool, optional Whether to dynamically keep track of the total number of elements written. If ``False`` You can still compute this once the tree is complete. track_size : bool, optional Whether to dynamically keep track of the largest tensor so far. If ``False`` You can still compute this once the tree is complete. objective : str or Objective, optional An default objective function to use for further optimization and scoring, for example reconfiguring or computing the combo cost. If not supplied the default is to create a flops objective when needed. Attributes ---------- children : dict[node, tuple[node]] Mapping of each node to two children. info : dict[node, dict] Information about the tree nodes. The key is the set of inputs (a set of inputs indices) the node contains. Or in other words, the subgraph of the node. The value is a dictionary to cache information about effective 'leg' indices, size, flops of formation etc. """ def __init__( self, inputs, output, size_dict, track_childless=False, track_flops=False, track_write=False, track_size=False, objective=None, nodeops="auto", ): self.inputs = inputs self.output = output if isinstance(self.inputs[0], set) or isinstance(self.output, set): warnings.warn( "The inputs or output of this tree are not ordered." "Costs will be accurate but actually contracting requires " "ordered indices corresponding to array axes." ) if not isinstance(next(iter(size_dict.values()), 1), int): # make sure we are working with python integers to avoid overflow # comparison errors with inf etc. self.size_dict = {k: int(v) for k, v in size_dict.items()} else: self.size_dict = size_dict self.N = len(self.inputs) # the index representation for each input is an ordered mapping of # each index to the number of times it has appeared on children. By # also tracking the total number of appearances one can efficiently # and locally compute which indices should be kept or contracted self.appearances = {} for term in self.inputs: for ix in term: self.appearances[ix] = self.appearances.get(ix, 0) + 1 # adding output appearances ensures these are never contracted away, # N.B. if after this step every appearance count is exactly 2, # then there are no 'hyper' indices in the contraction for ix in self.output: self.appearances[ix] = self.appearances.get(ix, 0) + 1 # this stores potentialy preprocessing steps that are not part of the # main contraction tree, but assumed to have been applied, for example # tracing or summing over indices that appear only once self.preprocessing = {} # mapping of parents to children - the core binary tree object self.children = {} # information about all the nodes self.nodeops = get_nodeops(nodeops, self.N) self.info = {} # add constant nodes: the leaves for leaf in self.gen_leaves(): self._add_node(leaf, extent=1) # leaf extent is always 1 # and the root or top node self.root = self.nodeops.node_supremum(self.N) self._add_node(self.root, extent=self.N) # root extent is always N if self.N == 1: # trivial 'contraction', single input maps directly to output, self.children[self.root] = (leaf,) # whether to keep track of dangling nodes/subgraphs self.track_childless = track_childless if self.track_childless: # the set of dangling nodes self.childless = oset([self.root]) # running largest_intermediate and total flops self._track_flops = track_flops if track_flops: self._flops = 0 self._track_write = track_write if track_write: self._write = 0 self._track_size = track_size if track_size: self._sizes = MaxCounter() # container for caching subtree reconfiguration condidates self.already_optimized = dict() # info relating to slicing (base constructor is always unsliced) self.multiplicity = 1 self.sliced_inds = {} self.sliced_inputs = frozenset() # cache for compiled contraction cores self.contraction_cores = {} # a default objective function useful for # further optimization and scoring self._default_objective = objective def set_state_from(self, other): """Set the internal state of this tree to that of ``other``.""" # immutable or never mutated properties for attr in ( "appearances", "inputs", "multiplicity", "N", "output", "root", "size_dict", "sliced_inputs", "_default_objective", ): setattr(self, attr, getattr(other, attr)) # mutable properties for attr in ( "children", "contraction_cores", "nodeops", "sliced_inds", "preprocessing", ): setattr(self, attr, getattr(other, attr).copy()) # dicts of mutable for attr in ("info", "already_optimized"): setattr( self, attr, {k: v.copy() for k, v in getattr(other, attr).items()}, ) self.track_childless = other.track_childless if other.track_childless: self.childless = other.childless.copy() self._track_flops = other._track_flops if other._track_flops: self._flops = other._flops self._track_write = other._track_write if other._track_write: self._write = other._write self._track_size = other._track_size if other._track_size: self._sizes = other._sizes.copy() def copy(self): """Create a copy of this ``ContractionTree``.""" tree = object.__new__(self.__class__) tree.set_state_from(self) return tree def set_default_objective(self, objective): """Set the objective function for this tree.""" self._default_objective = get_score_fn(objective) def get_default_objective(self): """Get the objective function for this tree.""" if self._default_objective is None: self._default_objective = get_score_fn("flops") return self._default_objective def get_default_combo_factor(self): """Get the default combo factor for this tree.""" objective = self.get_default_objective() try: return objective.factor except AttributeError: return DEFAULT_COMBO_FACTOR def get_score(self, objective=None): """Score this tree using the default objective function.""" from .scoring import get_score_fn if objective is None: objective = self.get_default_objective() objective = get_score_fn(objective) return objective({"tree": self}) @property def nslices(self): """Simple alias for how many independent contractions this tree represents overall. """ return self.multiplicity @property def nchunks(self): """The number of 'chunks' - determined by the number of sliced output indices. """ return prod( si.size for si in self.sliced_inds.values() if not si.inner ) def input_to_node(self, i): """Create a node from a single input index, i.e. the subgraph that only contains the input tensor ``i``. Parameters ---------- i : int The input index. Returns ------- node : node_type """ return self.nodeops.node_from_single(i) def node_to_input(self, node): """Assuming ``node`` has one element, i.e. is a leaf, return the corresponding input index. Parameters ---------- node : node_type The node to convert. Returns ------- i : int """ return self.nodeops.node_get_single_el(node) def node_to_terms(self, node): """Turn a node into the corresponding terms a sequence of leaf legs, corresponding to input indices. """ return ( self.get_legs(self.input_to_node(i)) for i in self.get_subgraph(node) ) def gen_leaves(self): """Generate the nodes representing leaves of the contraction tree, i.e. of size 1 each corresponding to a single input tensor. """ return map(self.input_to_node, range(self.N)) def get_incomplete_nodes(self): """Get the set of current nodes that have no children and the set of nodes that have no parents. These are the 'childless' and 'parentless' nodes respectively, that need to be contracted to complete the tree. The parentless nodes are grouped into the childless nodes that contain them as subgraphs. Returns ------- groups : dict[node_type, list[node_type]] A mapping of childless nodes to the list of parentless nodes are beneath them. See Also -------- autocomplete """ childless = dict.fromkeys( node for node in self.info # start wth all but leaves if not self.is_leaf(node) ) parentless = dict.fromkeys( node for node in self.info # start with all but root if not self.is_root(node) ) for p, (l, r) in self.children.items(): parentless.pop(l) parentless.pop(r) childless.pop(p) groups = {node: [] for node in childless} for node in parentless: # get the smallest node that contains this node ancestor = min( ( possible_parent for possible_parent in childless if set(self.get_subgraph(node)).issubset( self.get_subgraph(possible_parent) ) # XXX: for non-ssa node types could do: # if self.is_descendant(node, possible_parent) ), key=self.get_extent, ) groups[ancestor].append(node) return groups def autocomplete(self, **contract_opts): """Contract all remaining node groups (as computed by ``tree.get_incomplete_nodes``) in the tree to complete it. Parameters ---------- contract_opts Options to pass to ``tree.contract_nodes``. See Also -------- get_incomplete_nodes, contract_nodes """ groups = self.get_incomplete_nodes() for grandparent, parentless_subnodes in groups.items(): self.contract_nodes( parentless_subnodes, grandparent=grandparent, **contract_opts ) @classmethod def from_path( cls, inputs, output, size_dict, *, path=None, ssa_path=None, edge_path=None, optimize="auto", autocomplete="auto", check=False, **kwargs, ): """Create a (completed) ``ContractionTree`` from the usual inputs plus a standard contraction path or 'ssa_path' - you need to supply one. Parameters ---------- inputs : Sequence[Sequence[str]] The input indices of each tensor, as single unicode characters. output : Sequence[str] The output indices. size_dict : dict[str, int] The size of each index. path : Sequence[Sequence[int]], optional The contraction path, a sequence of pairs of tensor ids to contract. The ids are linear indices into the list of temporary tensors, which are recycled as each contraction pops a pair and appends the result. One of ``path``, ``ssa_path`` or ``edge_path`` must be supplied. ssa_path : Sequence[Sequence[int]], optional The contraction path, a sequence of pairs of indices to contract. The indices are single use, as if the result of each contraction is appended to the end of the list of temporary tensors without popping. One of ``path``, ``ssa_path`` or ``edge_path`` must be supplied. edge_path : Sequence[str], optional The contraction path, a sequence of indices to contract in order. One of ``path``, ``ssa_path`` or ``edge_path`` must be supplied. optimize : str, optional If a contraction within the path contains 3 or more tensors, how to optimize this subcontraction into a binary tree. autocomplete : "auto" or bool, optional Whether to automatically complete the path, i.e. contract all remaining nodes. If "auto" then a warning is issued if the path is not complete. check : bool, optional Whether to perform some basic checks while creating the contraction nodes. Returns ------- ContractionTree """ if (path is None) + (ssa_path is None) + (edge_path is None) != 2: raise ValueError( "Exactly one of ``path`` or ``ssa_path`` must be supplied." ) contract_opts = {"optimize": optimize, "check": check} if edge_path is not None: from .pathfinders.path_basic import edge_path_to_ssa ssa_path = edge_path_to_ssa(edge_path, inputs) if ssa_path is not None: path = ssa_path tree = cls(inputs, output, size_dict, **kwargs) if ssa_path is not None: # ssa path ('single static assignment' ids) nodes = dict(enumerate(tree.gen_leaves())) ssa = len(nodes) for p in path: merge = [nodes.pop(i) for i in p] nodes[ssa] = tree.contract_nodes(merge, **contract_opts) ssa += 1 nodes = nodes.values() else: # regular path ('recycled' ids) nodes = list(tree.gen_leaves()) for p in path: merge = [nodes.pop(i) for i in sorted(p, reverse=True)] nodes.append(tree.contract_nodes(merge, **contract_opts)) if len(nodes) > 1 and autocomplete: if autocomplete == "auto": # warn that we are completing warnings.warn( "Path was not complete - contracting all remaining. " "You can silence this warning with `autocomplete=True`." "Or produce an incomplete tree with `autocomplete=False`." ) tree.contract_nodes(nodes, grandparent=tree.root, **contract_opts) return tree @classmethod def from_info(cls, info, **kwargs): """Create a ``ContractionTree`` from an ``opt_einsum.PathInfo`` object.""" return cls.from_path( inputs=info.input_subscripts.split(","), output=info.output_subscript, size_dict=info.size_dict, path=info.path, **kwargs, ) @classmethod def from_eq(cls, eq, size_dict, **kwargs): """Create a empty ``ContractionTree`` directly from an equation and set of shapes. Parameters ---------- eq : str The einsum string equation. size_dict : dict[str, int] The size of each index. """ lhs, output = eq.split("->") inputs = lhs.split(",") return cls(inputs, output, size_dict, **kwargs) def get_eq(self): """Get the einsum equation corresponding to this tree. Note that this is the total (or original) equation, so includes indices which have been sliced. Returns ------- eq : str """ return inputs_output_to_eq(self.inputs, self.output) def get_shapes(self): """Get the shapes of the input tensors corresponding to this tree. Returns ------- shapes : tuple[tuple[int]] """ return tuple( tuple(self.size_dict[ix] for ix in term) for term in self.inputs ) def get_inputs_sliced(self): """Get the input indices corresponding to a single slice of this tree, i.e. with sliced indices removed. Returns ------- inputs : tuple[tuple[str]] """ return tuple( tuple(ix for ix in term if ix not in self.sliced_inds) for term in self.inputs ) def get_output_sliced(self): """Get the output indices corresponding to a single slice of this tree, i.e. with sliced indices removed. Returns ------- output : tuple[str] """ return tuple(ix for ix in self.output if ix not in self.sliced_inds) def get_eq_sliced(self): """Get the einsum equation corresponding to a single slice of this tree, i.e. with sliced indices removed. Returns ------- eq : str """ return inputs_output_to_eq( self.get_inputs_sliced(), self.get_output_sliced() ) def get_shapes_sliced(self): """Get the shapes of the input tensors corresponding to a single slice of this tree, i.e. with sliced indices removed. Returns ------- shapes : tuple[tuple[int]] """ return tuple( tuple( self.size_dict[ix] for ix in term if ix not in self.sliced_inds ) for term in self.inputs ) @classmethod def from_edge_path( cls, edge_path, inputs, output, size_dict, optimize="auto", autocomplete="auto", check=False, **kwargs, ): """Create a ``ContractionTree`` from an edge elimination ordering.""" warnings.warn( "ContractionTree.from_edge_path(edge_path, ...) is deprecated. Use" " ContractionTree.from_path(edge_path=edge_path, ...) instead." ) return cls.from_path( inputs, output, size_dict, edge_path=edge_path, optimize=optimize, autocomplete=autocomplete, check=check, **kwargs, ) def _add_node(self, node, check=False, **kwargs): """Add a node to this tree, specified either directly as a existing node type, or as a subgraph (i.e. a sequence of input positions) which is then converted to a node with the corresponding extent and subgraph information. Note if "ssa" nodes are used, then adding two equivalent subgraphs will result in *two* new nodes, since the node labels do not themselves encode the subgraph information. Parameters ---------- node : node_type or Sequence[int] The node to add, either directly as a node type, or as a subgraph specified by the sequence of input positions it contains. check : bool, optional Whether to perform some basic checks on the node and tree state before adding the node. kwargs : dict, optional Additional information to cache about this node, for example its 'extent' or 'subgraph'. If it is being specified as a sequence of input positions, these two will be injected automatically. Returns ------- node : node_type The node that was added, which may be different from the input if the input was specified as a sequence of input positions. """ # first we possibly convert from subgraph spec to node if not isinstance(node, self.nodeops.node_type): # assume node *has* been specified as sequence of input positions subgraph = tuple(node) if len(subgraph) == 1: # leaf node, for ssa we don't want to generate a new node (i,) = subgraph node = self.nodeops.node_from_single(i) elif len(subgraph) == self.N: # root node, for ssa we don't want to generate a new node node = self.root else: # intermediate, assume we can generate new node identifier node = self.nodeops.new_node_for_seq(subgraph) kwargs.setdefault("extent", len(subgraph)) kwargs.setdefault("subgraph", subgraph) if check: if len(self.info) > 2 * self.N - 1: raise ValueError("There are too many children already.") if len(self.children) > self.N - 1: raise ValueError("There are too many branches already.") if not self.nodeops.is_valid_node(node): raise ValueError("{} is not a valid node.".format(node)) try: d = self.info[node] except KeyError: d = self.info[node] = {} if kwargs: d.update(kwargs) return node def _remove_node(self, node): """Remove ``node`` from this tree and update the flops and maximum size if tracking them respectively, as well as input pre-processing. """ node_extent = self.get_extent(node) if node_extent == 1: # leaf nodes should always exist self.info[node].clear() self.info[node]["extent"] = 1 # leaf extent is always 1 # input: remove any associated preprocessing self.preprocessing.pop(self.nodeops.node_get_single_el(node), None) else: # only non-leaf nodes contribute to size, flops and write if self._track_size: self._sizes.discard(self.get_size(node)) if self._track_flops: self._flops -= self.get_flops(node) if self._track_write: self._write -= self.get_size(node) del self.children[node] if node_extent == self.N: # root node should always exist self.info[node].clear() self.info[node]["extent"] = self.N # root extent is always N else: del self.info[node] def compute_leaf_legs(self, i): """Compute the effective 'outer' indices for the ith input tensor. This is not always simply the ith input indices, due to A) potential slicing and B) potential preprocessing. """ # indices of input tensor (after slicing which is done immediately) if self.sliced_inds: term = tuple( ix for ix in self.inputs[i] if ix not in self.sliced_inds ) else: term = self.inputs[i] legs = {} for ix in term: legs[ix] = legs.get(ix, 0) + 1 # check for single term simplifications, these are treated as a simple # preprocessing step that only is taken into account during actual # contraction, and are not represented in the binary tree # N.B. need to compute simplifiability *after* slicing is_simplifiable = ( # repeated indices (diag or traces) (len(term) != len(legs)) or # reduced indices (are summed immediately) any( ix_count == self.appearances[ix] for ix, ix_count in legs.items() ) ) if is_simplifiable: # compute the simplified legs -> the new effective input legs legs = { ix: ix_count for ix, ix_count in legs.items() if ix_count != self.appearances[ix] } # add a preprocessing step to the list of contractions eq = inputs_output_to_eq((term,), legs, canonicalize=True) self.preprocessing[i] = eq return legs def has_preprocessing(self): # touch all inputs legs, since preprocessing is lazily computed for node in self.gen_leaves(): self.get_legs(node) return bool(self.preprocessing) def has_hyper_indices(self): """Check if there are any 'hyper' indices in the contraction, i.e. indices that don't appear exactly twice, when considering the inputs and output. """ return any(ix_count != 2 for ix_count in self.appearances.values()) @cached_node_property("extent") def get_extent(self, node): """Get the number of input tensors contained in the subgraph represented by ``node``. Parameters ---------- node : node_type The node to compute the extent of. Returns ------- extent : int """ if node in self.children: l, r = self.children[node] return self.get_extent(l) + self.get_extent(r) else: return self.nodeops.node_size(node) @cached_node_property("subgraph") def get_subgraph(self, node) -> tuple[int, ...]: """Get the sequence of input tensors contained in subgraph represented by ``node``. Parameters ---------- node : node_type The node to compute the subgraph of. Returns ------- subgraph : tuple[int] The input tensor indices contained in this subgraph. """ node_extent = self.get_extent(node) if node_extent == 1: return (self.nodeops.node_get_single_el(node),) elif node_extent == self.N: return tuple(range(self.N)) else: try: left, right = self.children[node] return self.get_subgraph(left) + self.get_subgraph(right) except KeyError: # this should only happen if directly creating # incomplete nodes e.g. not in a bottom up fashion # ssa nodes e.g. will not support this operation return tuple(node) @cached_node_property("legs") def get_legs(self, node): """Get the effective 'outer' indices for the collection of tensors in ``node``. """ # should this comparison be with self.N for efficiency? if node == self.root: # root legs are output, after slicing # n.b. the index counts are irrelevant for the output return {ix: 0 for ix in self.output if ix not in self.sliced_inds} node_extent = self.get_extent(node) if node_extent == 1: # leaf legs are inputs return self.compute_leaf_legs( self.nodeops.node_get_single_el(node) ) try: involved = self.get_involved(node) except KeyError: # this should only happen if directly creating # incomplete nodes e.g. not in a bottom up fashion involved = legs_union(self.node_to_terms(node)) return { ix: ix_count for ix, ix_count in involved.items() if ix_count < self.appearances[ix] } @cached_node_property("involved") def get_involved(self, node): """Get all the indices involved in the formation of subgraph ``node``.""" if self.is_leaf(node): return {} sub_legs = map(self.get_legs, self.children[node]) return legs_union(sub_legs) @cached_node_property("size") def get_size(self, node): """Get the tensor size of ``node``.""" return compute_size_by_dict(self.get_legs(node), self.size_dict) @cached_node_property("flops") def get_flops(self, node): """Get the FLOPs for the pairwise contraction that will create ``node``. """ if self.is_leaf(node): return 0 involved = self.get_involved(node) return compute_size_by_dict(involved, self.size_dict) @cached_node_property("can_dot") def get_can_dot(self, node): """Get whether this contraction can be performed as a dot product (i.e. with ``tensordot``), or else requires ``einsum``, as it has indices that don't appear exactly twice in either the inputs or the output. """ l, r = self.children[node] sp, sl, sr = map(self.get_legs, (node, l, r)) return set(sp) == set(sl).symmetric_difference(sr) @cached_node_property("inds") def get_inds(self, node): """Get the indices of this node - an ordered string version of ``get_legs`` that starts with ``tree.inputs`` and maintains the order they appear in each contraction 'ABC,abc->ABCabc', to match tensordot. """ # NB: self.inputs and self.output contain the full (unsliced) indices # thus we filter even the input legs and output legs if self.get_extent(node) in (1, self.N): return "".join(self.get_legs(node)) legs = self.get_legs(node) l_inds, r_inds = map(self.get_inds, self.children[node]) # the filter here takes care of contracted indices return "".join( unique(filter(legs.__contains__, itertools.chain(l_inds, r_inds))) ) @cached_node_property("tensordot_axes") def get_tensordot_axes(self, node): """Get the ``axes`` arg for a tensordot ocontraction that produces ``node``. The pairs are sorted in order of appearance on the left input. """ l_inds, r_inds = map(self.get_inds, self.children[node]) l_axes, r_axes = [], [] for i, ind in enumerate(l_inds): j = r_inds.find(ind) if j != -1: l_axes.append(i) r_axes.append(j) return tuple(l_axes), tuple(r_axes) @cached_node_property("tensordot_perm") def get_tensordot_perm(self, node): """Get the permutation required, if any, to bring the tensordot output of this nodes contraction into line with ``self.get_inds(node)``. """ l_inds, r_inds = map(self.get_inds, self.children[node]) # the target output inds p_inds = self.get_inds(node) # the tensordot output inds td_inds = "".join(sorted(p_inds, key=f"{l_inds}{r_inds}".find)) if td_inds == p_inds: return None return tuple(map(td_inds.find, p_inds)) @cached_node_property("einsum_eq") def get_einsum_eq(self, node): """Get the einsum string describing the contraction that produces ``node``, unlike ``get_inds`` the characters are mapped into [a-zA-Z], for compatibility with ``numpy.einsum`` for example. """ l, r = self.children[node] l_inds, r_inds, p_inds = map(self.get_inds, (l, r, node)) # we need to map any extended unicode characters into ascii char_mapping = { ord(ix): get_symbol(i) for i, ix in enumerate(unique(itertools.chain(l_inds, r_inds))) } return f"{l_inds},{r_inds}->{p_inds}".translate(char_mapping) def is_leaf(self, node): """Check if ``node`` is a leaf node in this tree. Parameters ---------- node : node_type The node to check. Returns ------- is_leaf : bool """ return self.nodeops.is_leaf(node) def is_root(self, node): """Check if ``node`` is the root node in this tree. Parameters ---------- node : node_type The node to check. Returns ------- is_root : bool """ return self.nodeops.is_supremum(node, self.N) def is_descendant(self, node, ancestor): """Check if ``node`` is a descendant of ``ancestor`` in this tree. Parameters ---------- node : node_type The node to check. ancestor : node_type The potential ancestor node. Returns ------- is_descendant : bool """ return self.nodeops.node_issubset(node, ancestor) def get_peak_size(self, node): """Get the peak size for all but only the contractions required to produce ``node``. The value for the root note will be the peak size of the entire contraction. Parameters ---------- node : node_type The node to compute the peak size of. Returns ------- peak_size : int """ if self.is_leaf(node): # leaf node is input return self.get_size(node) l, r = self.children[node] # peak either occured while: # 1. we were forming left intermediate peakleft = self.get_peak_size(l) # 2. we were forming right intermediate (whilst holding left) peakright = self.get_size(l) + self.get_peak_size(r) # 3. or we were performing this contraction, including output peakthis = self.get_size(l) + self.get_size(r) + self.get_size(node) return max(peakleft, peakright, peakthis) def reorder_for_peak_size(self): """This reorders the depth first traversal of the tree to minimize the peak size of the contraction. """ changed = False for p, l, r in self.traverse(): sl = self.get_size(l) pl = self.get_peak_size(l) sr = self.get_size(r) pr = self.get_peak_size(r) # peak if hold left while we form right plr = max(pl, sl + pr) # peak if hold right while we form left prl = max(pr, sr + pl) if prl < plr: self.children[p] = r, l changed = True return changed def get_centrality(self, node): try: return self.info[node]["centrality"] except KeyError: self.compute_centralities() return self.info[node]["centrality"] def total_flops(self, dtype=None, log=None): """Sum the flops contribution from every node in the tree. Parameters ---------- dtype : {'float', 'complex', None}, optional Scale the answer depending on the assumed data type. """ if self._track_flops: C = self.multiplicity * self._flops else: self._flops = 0 for node, _, _ in self.traverse(): self._flops += self.get_flops(node) self._track_flops = True C = self.multiplicity * self._flops if dtype is None: pass elif "float" in dtype: C *= 2 elif "complex" in dtype: C *= 4 else: raise ValueError(f"Unknown dtype {dtype}") if log is not None: C = math.log(max(C, 1), log) return C def total_write(self): """Sum the total amount of memory that will be created and operated on.""" if not self._track_write: self._write = 0 for node, _, _ in self.traverse(): self._write += self.get_size(node) self._track_write = True return self.multiplicity * self._write def combo_cost(self, factor=DEFAULT_COMBO_FACTOR, combine=sum, log=None): t = 0 for p in self.children: f = self.get_flops(p) w = self.get_size(p) t += combine((f, factor * w)) t *= self.multiplicity if log is not None: t = math.log(t, log) return t total_cost = combo_cost def max_size(self, log=None): """The size of the largest intermediate tensor.""" if self.N == 1: return self.get_size(self.root) if not self._track_size: self._sizes = MaxCounter() for node, _, _ in self.traverse(): self._sizes.add(self.get_size(node)) self._track_size = True size = self._sizes.max() if log is not None: size = math.log(size, log) return size def max_contraction_size(self, log=None): """The maximum size of a single contraction in the tree. This includes the size of the two input tensors and the output tensor, and can be a more practical measure of the peak memory required. Parameters ---------- log : float, optional If provided, return the log of the size to this base. Returns ------- size : int or float The maximum size of a single contraction in the tree, or its log. """ Y = max( self.get_size(p) + self.get_size(l) + self.get_size(r) for p, (l, r) in self.children.items() ) if log is not None: Y = math.log(Y, log) return Y def peak_size(self, order=None, log=None): """Get the peak concurrent size of tensors needed - this depends on the traversal order, i.e. the exact contraction path, not just the contraction tree. """ tot_size = sum(self.get_size(node) for node in self.gen_leaves()) peak = tot_size for p, l, r in self.traverse(order=order): tot_size += self.get_size(p) # measure peak assuming we need both inputs and output peak = max(peak, tot_size) tot_size -= self.get_size(l) tot_size -= self.get_size(r) if log is not None: peak = math.log(peak, log) return peak def contract_stats(self, force=False): """Simulteneously compute the total flops, write and size of the contraction tree. This is more efficient than calling each of the individual methods separately. Once computed, each quantity is then automatically tracked. Returns ------- stats : dict[str, int] The total flops, write and size. """ if force or not ( self._track_flops and self._track_write and self._track_size ): self._flops = self._write = 0 self._sizes = MaxCounter() for node, _, _ in self.traverse(): self._flops += self.get_flops(node) node_size = self.get_size(node) self._write += node_size self._sizes.add(node_size) self._track_flops = self._track_write = self._track_size = True return { "flops": max(self.multiplicity * self._flops, 1), "write": max(self.multiplicity * self._write, 1), "size": max(self._sizes.max(), 1), } def arithmetic_intensity(self): """The ratio of total flops to total write - the higher the better for extracting good computational performance. """ return self.total_flops(dtype=None) / self.total_write() def contraction_scaling(self): """This is computed simply as the maximum number of indices involved in any single contraction, which will match the scaling assuming that all dimensions are equal. """ return max(len(self.get_involved(node)) for node in self.info) def contraction_cost(self, log=None): """Get the total number of scalar operations ~ time complexity.""" return self.total_flops(dtype=None, log=log) def naive_cost(self, log=None): """Get the naive cost of performing this contraction as a single einsum summation, without any intermediate contractions. This is given the as product of the size of all indices. Parameters ---------- log : float, optional If provided, return log of the cost to this base. """ if log is None: return prod(self.size_dict[ix] for ix in self.appearances) else: return sum( math.log(self.size_dict[ix], log) for ix in self.appearances ) def speedup(self, log=None): """Speedup compared to naive summation. Parameters ---------- log : float, optional If provided, return log of the speedup to this base. """ if log is None: return self.naive_cost() / self.contraction_cost() else: logc = self.contraction_cost(log=log) logn = self.naive_cost(log=log) return logn - logc def contraction_width(self, log=2): """Get log2 of the size of the largest tensor.""" return self.max_size(log=log) def compressed_contract_stats( self, chi=None, order="surface_order", compress_late=None, ): if chi is None: chi = self.get_default_chi() if compress_late is None: compress_late = self.get_default_compress_late() hg = self.get_hypergraph(accel="auto") # conversion between tree nodes <-> hypergraph nodes during contraction tree_map = dict(zip(self.gen_leaves(), range(hg.get_num_nodes()))) tracker = CompressedStatsTracker(hg, chi) for p, l, r in self.traverse(order): li = tree_map[l] ri = tree_map[r] tracker.update_pre_step() if compress_late: tracker.update_pre_compress(hg, li, ri) # compress just before we contract tensors hg.compress(chi=chi, edges=hg.get_node(li)) hg.compress(chi=chi, edges=hg.get_node(ri)) tracker.update_post_compress(hg, li, ri) tracker.update_pre_contract(hg, li, ri) pi = tree_map[p] = hg.contract(li, ri) tracker.update_post_contract(hg, pi) if not compress_late: # compress as soon as we can after contracting tensors tracker.update_pre_compress(hg, pi) hg.compress(chi=chi, edges=hg.get_node(pi)) tracker.update_post_compress(hg, pi) tracker.update_post_step() return tracker def total_flops_compressed( self, chi=None, order="surface_order", compress_late=None, dtype=None, log=None, ): """Estimate the total flops for a compressed contraction of this tree with maximum bond size ``chi``. This includes basic estimates of the ops to perform contractions, QRs and SVDs. """ if dtype is not None: raise ValueError( "Can only estimate cost in terms of " "number of abstract scalar ops." ) F = self.compressed_contract_stats( chi=chi, order=order, compress_late=compress_late, ).flops if log is not None: F = math.log(F, log) return F contraction_cost_compressed = total_flops_compressed def total_write_compressed( self, chi=None, order="surface_order", compress_late=None, log=None, ): """Compute the total size of all intermediate tensors when a compressed contraction is performed with maximum bond size ``chi``, ordered by ``order``. This is relevant maybe for time complexity and e.g. autodiff space complexity (since every intermediate is kept). """ W = self.compressed_contract_stats( chi=chi, order=order, compress_late=compress_late, ).write if log is not None: W = math.log(W, log) return W def combo_cost_compressed( self, chi=None, order="surface_order", compress_late=None, factor=None, log=None, ): if factor is None: factor = self.get_default_combo_factor() C = self.total_flops_compressed( chi=chi, order=order, compress_late=compress_late ) + factor * self.total_write_compressed( chi=chi, order=order, compress_late=compress_late ) if log is not None: C = math.log(C, log) return C total_cost_compressed = combo_cost_compressed def max_size_compressed( self, chi=None, order="surface_order", compress_late=None, log=None ): """Compute the maximum sized tensor produced when a compressed contraction is performed with maximum bond size ``chi``, ordered by ``order``. This is close to the ideal space complexity if only tensors that are being directly operated on are kept in memory. """ S = self.compressed_contract_stats( chi=chi, order=order, compress_late=compress_late, ).max_size if log is not None: S = math.log(S, log) return S def peak_size_compressed( self, chi=None, order="surface_order", compress_late=None, accel="auto", log=None, ): """Compute the peak size of combined intermediate tensors when a compressed contraction is performed with maximum bond size ``chi``, ordered by ``order``. This is the practical space complexity if one is not swapping intermediates in and out of memory. """ P = self.compressed_contract_stats( chi=chi, order=order, compress_late=compress_late, ).peak_size if log is not None: P = math.log(P, log) return P def contraction_width_compressed( self, chi=None, order="surface_order", compress_late=None, log=2 ): """Compute log2 of the maximum sized tensor produced when a compressed contraction is performed with maximum bond size ``chi``, ordered by ``order``. """ return self.max_size_compressed(chi, order, compress_late, log=log) def _update_tracked(self, node): if self._track_flops: self._flops += self.get_flops(node) if self._track_write: self._write += self.get_size(node) if self._track_size: self._sizes.add(self.get_size(node)) def contract_nodes_pair( self, x, y, legs=None, cost=None, size=None, parent=None, check=False, ): """Contract node ``x`` with node ``y`` in the tree to create a new parent node, which is returned. Parameters ---------- x : node_type The first node to contract. y : node_type The second node to contract. legs : dict[str, int], optional The effective 'legs' of the new node if already known. If not given, this is computed from the inputs of ``x`` and ``y``. cost : int, optional The cost of the contraction if already known. If not given, this is computed from the inputs of ``x`` and ``y``. size : int, optional The size of the new node if already known. If not given, this is computed from the inputs of ``x`` and ``y``. check : bool, optional Whether to check the inputs are valid. Returns ------- parent : node_type The new parent node of ``x`` and ``y``. """ self._add_node(x, check=check) self._add_node(y, check=check) nx, ny = self.get_extent(x), self.get_extent(y) if parent is None: if nx + ny == self.N: parent = self.root else: parent = self.nodeops.new_node_for_union([x, y]) self._add_node(parent, check=check) # enforce left ordering of 'heaviest' subtrees if nx == ny: # deterministically break ties sortx = self.nodeops.node_tie_breaker(x) sorty = self.nodeops.node_tie_breaker(y) else: sortx = nx sorty = ny if sortx > sorty: lr = (x, y) else: lr = (y, x) self.children[parent] = lr if self.track_childless: self.childless.discard(parent) if x not in self.children and nx > 1: self.childless.add(x) if y not in self.children and ny > 1: self.childless.add(y) # pre-computed information if legs is not None: self.info[parent]["legs"] = legs if cost is not None: self.info[parent]["flops"] = cost if size is not None: self.info[parent]["size"] = size self._update_tracked(parent) return parent def contract_nodes( self, nodes, optimize="auto", grandparent=None, check=False, extra_opts=None, ): """Contract an arbitrary number of ``nodes`` in the tree to build up a subtree. The root of this subtree (a new intermediate) is returned. """ # possibly convert from subgraph spec to node types nodes = tuple(self._add_node(node, check=check) for node in nodes) if len(nodes) == 1: return nodes[0] if len(nodes) == 2: return self.contract_nodes_pair( *nodes, parent=grandparent, check=check ) from .interface import find_path # create the bottom and top nodes if grandparent is None: if sum(map(self.get_extent, nodes)) == self.N: # don't generate new node if root grandparent = self.root else: # assume we can generate new node grandparent = self.nodeops.new_node_for_union(nodes) self._add_node(grandparent, check=check) # if more than two nodes need to find the path to fill in between # \ # GN <- 'grandparent' # / \ # ????????? # ????????????? <- to be filled with 'temp nodes' # / \ / / \ # N0 N1 N2 N3 N4 <- ``nodes``, or, subgraphs # / \ / / \ legs_inputs = tuple(map(self.get_legs, nodes)) path_inputs = tuple(map(tuple, legs_inputs)) try: # output legs of the grandparent (after slicing) # we dont' use get_legs since we can do the shortcut below grand_legs = self.info[grandparent]["legs"] except KeyError: # compute legs directly from children if grandparent == self.root: # special case, need output ordering and sliced indices grand_legs = self.get_legs(grandparent) else: involved = legs_union(legs_inputs) grand_legs = { ix: ix_count for ix, ix_count in involved.items() if ix_count < self.appearances[ix] } self.info[grandparent]["legs"] = grand_legs path_output = tuple(grand_legs) path = find_path( path_inputs, path_output, self.size_dict, optimize=optimize, **(extra_opts or {}), ) # now we have path create the nodes in between temp_nodes = list(nodes) for p in path[:-1]: to_contract = [temp_nodes.pop(i) for i in sorted(p, reverse=True)] temp_nodes.append(self.contract_nodes(to_contract, check=check)) # want to explicitly specify the grandparent node: # so do the final pairwise contraction separately self.contract_nodes(temp_nodes, grandparent=grandparent, check=check) return grandparent def is_complete(self): """Check every node has two children, unless it is a leaf.""" if self.N == 1: return True too_many_nodes = len(self.info) > 2 * self.N - 1 too_many_branches = len(self.children) > self.N - 1 if too_many_nodes or too_many_branches: raise ValueError("Contraction tree seems to be over complete!") queue = [self.root] while queue: node = queue.pop() if self.is_leaf(node): continue try: queue.extend(self.children[node]) except KeyError: return False return True def get_default_order(self): return "dfs" def _traverse_dfs(self): """Traverse the tree in a depth first, non-recursive, order.""" ready = set(self.gen_leaves()) queue = [self.root] while queue: node = queue[-1] l, r = self.children[node] # both node's children are ready -> we can yield this contraction if (l in ready) and (r in ready): ready.add(queue.pop()) yield node, l, r continue if r not in ready: queue.append(r) if l not in ready: queue.append(l) def _traverse_ordered(self, order): """Traverse the tree in the order that minimizes ``order(node)``, but still constrained to produce children before parents. """ from bisect import bisect if order == "surface_order": order = self.surface_order seen = set() queue = [self.root] scores = [order(self.root)] while len(seen) != len(self.children): i = 0 while i < len(queue): node = queue[i] if node not in seen: for child in self.children[node]: if self.get_extent(child) > 1: # insert child into queue by score + before parent score = order(child) ci = bisect(scores[:i], score) scores.insert(ci, score) queue.insert(ci, child) # parent moves extra place to right i += 1 seen.add(node) i += 1 for node in queue: yield (node, *self.children[node]) def traverse(self, order=None): """Generate, in order, all the node merges in this tree. Non-recursive! This ensures children are always visited before their parent. Parameters ---------- order : None, "dfs", or callable, optional How to order the contractions within the tree. If a callable is given (which should take a node as its argument), try to contract nodes that minimize this function first. Returns ------- generator[tuple[node]] The bottom up ordered sequence of tree merges, each a tuple of ``(parent, left_child, right_child)``. See Also -------- descend """ if self.N == 1: return if order is None: order = self.get_default_order() if order == "dfs": yield from self._traverse_dfs() else: yield from self._traverse_ordered(order=order) def descend(self, mode="dfs"): """Generate, from root to leaves, all the node merges in this tree. Non-recursive! This ensures parents are visited before their children. Parameters ---------- mode : {'dfs', bfs}, optional How expand from a parent. Returns ------- generator[tuple[node] The top down ordered sequence of tree merges, each a tuple of ``(parent, left_child, right_child)``. See Also -------- traverse """ queue = [self.root] while queue: if mode == "dfs": parent = queue.pop(-1) elif mode == "bfs": parent = queue.pop(0) l, r = self.children[parent] yield parent, l, r if self.get_extent(l) > 1: queue.append(l) if self.get_extent(r) > 1: queue.append(r) def get_subtree(self, node, size, search="bfs", seed=None): """Get a subtree spanning down from ``node`` which will have ``size`` leaves (themselves not necessarily leaves of the actual tree). Parameters ---------- node : node_type The node of the tree to start with. size : int How many subtree leaves to aim for. search : {'bfs', 'dfs', 'random'}, optional How to build the tree: - 'bfs': breadth first expansion - 'dfs': depth first expansion (largest nodes first) - 'random': random expansion seed : None, int or random.Random, optional Random number generator seed, if ``search`` is 'random'. Returns ------- sub_leaves : tuple[node_type] Nodes which are subtree leaves. branches : tuple[node_type] Nodes which are between the subtree leaves and root. """ # nodes which are subtree leaves branches = [] # actual tree leaves - can't expand real_leaves = [] # nodes to expand queue = [node] if search == "random": rng = get_rng(seed) else: rng = None if search == "bfs": i = 0 elif search == "dfs": i = -1 while (len(queue) + len(real_leaves) < size) and queue: if rng is not None: i = rng.randint(0, len(queue) - 1) p = queue.pop(i) if self.is_leaf(p): real_leaves.append(p) continue # the left child is always >= in weight that right child # if we append it last then ``.pop(-1)`` above perform the # depth first search sorting by node subgraph size l, r = self.children[p] queue.append(r) queue.append(l) branches.append(p) # nodes at the bottom of the subtree sub_leaves = queue + real_leaves return tuple(sub_leaves), tuple(branches) def remove_ind(self, ind, project=None, inplace=False): """Remove (i.e. by default slice) index ``ind`` from this contraction tree, taking care to update all relevant information about each node. """ tree = self if inplace else self.copy() if ind in tree.sliced_inds: raise ValueError(f"Index {ind} already sliced.") # make sure all flops and size information has been populated tree.contract_stats() d = tree.size_dict[ind] if project is None: # we are slicing the index si = SliceInfo(ind not in tree.output, ind, d, None) tree.multiplicity = tree.multiplicity * d else: si = SliceInfo(ind not in tree.output, ind, 1, project) # update the ordered slice information dictionary, but maintain the # order such that output sliced indices always appear first -> # enforced by the dataclass SliceInfo ordering tree.sliced_inds = { si.ind: si for si in sorted((*tree.sliced_inds.values(), si)) } for node, node_info in tree.info.items(): if self.is_leaf(node): # handle leaves separately i = self.nodeops.node_get_single_el(node) term = tree.inputs[i] if ind in term: # n.b. leaves don't contribute to size, flops or write # simply recalculate all information, incl. preprocessing tree._remove_node(node) tree.sliced_inputs = tree.sliced_inputs | frozenset([i]) else: involved = tree.get_involved(node) if ind not in involved: # if ind doesn't feature in this node (contraction) # -> nothing to do continue # else update all the relevant information about this node # -> flops changes for all involved indices node_info["involved"] = legs_without(involved, ind) old_flops = tree.get_flops(node) new_flops = old_flops // d node_info["flops"] = new_flops tree._flops += new_flops - old_flops # -> size and write only changes for node legs (output) indices legs = tree.get_legs(node) if ind in legs: node_info["legs"] = legs_without(legs, ind) old_size = tree.get_size(node) tree._sizes.discard(old_size) new_size = old_size // d tree._sizes.add(new_size) node_info["size"] = new_size tree._write += new_size - old_size # delete info we can't change for k in ( "inds", "einsum_eq", "can_dot", "tensordot_axes", "tensordot_perm", ): tree.info[node].pop(k, None) tree.already_optimized.clear() tree.contraction_cores.clear() return tree remove_ind_ = functools.partialmethod(remove_ind, inplace=True) def restore_ind(self, ind, inplace=False): """Restore (unslice or un-project) index ``ind`` to this contraction tree, taking care to update all relevant information about each node. Parameters ---------- ind : str The index to restore. inplace : bool, optional Whether to perform the restoration inplace or not. Returns ------- ContractionTree """ tree = self if inplace else self.copy() # pop sliced index info si = tree.sliced_inds.pop(ind) # make sure all flops and size information has been populated tree.contract_stats() tree.multiplicity //= si.size # handle inputs for i, term in enumerate(tree.inputs): # this is the original term with all indices if ind in term: tree._remove_node(self.input_to_node(i)) if all(ix not in tree.sliced_inds for ix in term): # mark this input as not sliced tree.sliced_inputs = tree.sliced_inputs - frozenset([i]) # delete and re-add dependent intermediates for p, l, r in tree.traverse(): if ind in tree.get_legs(l) or ind in tree.get_legs(r): tree._remove_node(p) tree.contract_nodes_pair(l, r, parent=p) # reset caches tree.already_optimized.clear() tree.contraction_cores.clear() return tree restore_ind_ = functools.partialmethod(restore_ind, inplace=True) def unslice_rand(self, seed=None, inplace=False): """Unslice (restore) a random index from this contraction tree. Parameters ---------- seed : None, int or random.Random, optional Random number generator seed. inplace : bool, optional Whether to perform the unslicing inplace or not. Returns ------- ContractionTree """ rng = get_rng(seed) ix = rng.choice(tuple(self.sliced_inds)) return self.restore_ind(ix, inplace=inplace) unslice_rand_ = functools.partialmethod(unslice_rand, inplace=True) def unslice_all(self, inplace=False): """Unslice (restore) all sliced indices from this contraction tree. Parameters ---------- inplace : bool, optional Whether to perform the unslicing inplace or not. Returns ------- ContractionTree """ tree = self if inplace else self.copy() for ind in tuple(tree.sliced_inds): tree.restore_ind_(ind) return tree unslice_all_ = functools.partialmethod(unslice_all, inplace=True) def calc_subtree_candidates(self, pwr=2, what="flops"): # get all intermediate nodes candidates = list(self.children) if what == "size": weights = [self.get_size(x) for x in candidates] elif what == "flops": weights = [self.get_flops(x) for x in candidates] if pwr == "log": weights = [math.log2(max(2, w)) for w in weights] else: max_weight = max(weights) # can be bigger than numpy int/float allows weights = [float(w / max_weight) ** (1 / pwr) for w in weights] # sort by descending score candidates, weights = zip( *sorted(zip(candidates, weights), key=lambda x: -x[1]) ) return list(candidates), list(weights) def _subtree_remove_and_optimize( self, sub_root, sub_leaves, sub_branches, already_optimized, node_cost, minimize, opt, pbar, ): current_cost = node_cost(self, sub_root) for node in sub_branches: # these are the intermediates *between* leaves and sub-root if minimize == "size": current_cost = max(current_cost, node_cost(self, node)) else: current_cost += node_cost(self, node) self._remove_node(node) # make the optimizer more efficient by supplying accurate cap opt.cost_cap = max(2, current_cost) # and reoptimize the leaves self.contract_nodes(sub_leaves, optimize=opt, grandparent=sub_root) already_optimized.add(sub_leaves) if pbar is not None: pbar.update() pbar.set_description(_describe_tree(self), refresh=False) def _subtree_reconfigure_descend( self, subtree_size, subtree_search, maxiter, seed, minimize, opt, already_optimized, node_cost, pbar, ): candidates = [self.root] any_modified = False def _possibly_add_children(sub_root, any_modified): if self.get_extent(sub_root) > subtree_size: # possibly extend with node children, if not close to bottom lnode, rnode = self.children[sub_root] if self.get_extent(lnode) >= 2: candidates.append(lnode) if self.get_extent(rnode) >= 2: candidates.append(rnode) if len(candidates) == 0: # exhausted queue if any_modified: # but have made *any* changes -> go again from top candidates.append(self.root) any_modified = False return any_modified r = 0 while candidates and r < maxiter: sub_root = candidates.pop(0) # get a subtree to possibly reconfigure sub_leaves, sub_branches = self.get_subtree( sub_root, size=subtree_size, search=subtree_search, seed=seed ) # check if its already been optimized sub_leaves = frozenset(sub_leaves) if sub_leaves in already_optimized: any_modified = _possibly_add_children(sub_root, any_modified) continue # else remove the branches, keeping track of current cost self._subtree_remove_and_optimize( sub_root, sub_leaves, sub_branches, already_optimized, node_cost, minimize, opt, pbar, ) any_modified = _possibly_add_children(sub_root, True) r += 1 def _subtree_reconfigure_rand_select( self, subtree_size, subtree_search, weight_what, weight_pwr, select, maxiter, seed, minimize, opt, already_optimized, node_cost, pbar, ): if select == "random": rng = get_rng(seed) else: rng = None if select == "max": i = 0 elif select == "min": i = -1 candidates, weights = self.calc_subtree_candidates( pwr=weight_pwr, what=weight_what ) r = 0 while candidates and r < maxiter: if rng is not None: (i,) = rng.choices(range(len(candidates)), weights=weights) weights.pop(i) sub_root = candidates.pop(i) # get a subtree to possibly reconfigure sub_leaves, sub_branches = self.get_subtree( sub_root, size=subtree_size, search=subtree_search, seed=seed ) # check if its already been optimized sub_leaves = frozenset(sub_leaves) if sub_leaves in already_optimized: continue # else remove the branches, keeping track of current cost self._subtree_remove_and_optimize( sub_root, sub_leaves, sub_branches, already_optimized, node_cost, minimize, opt, pbar, ) # if we have reconfigured simply re-add all candidates candidates, weights = self.calc_subtree_candidates( pwr=weight_pwr, what=weight_what ) r += 1 def subtree_reconfigure( self, subtree_size=8, subtree_search="bfs", weight_what="flops", weight_pwr=2, select="max", maxiter=500, seed=None, minimize=None, optimize=None, inplace=False, progbar=False, ): """Reconfigure subtrees of this tree with locally optimal paths. Parameters ---------- subtree_size : int, optional The size of subtree to consider. Cost is exponential in this. subtree_search : {'bfs', 'dfs', 'random'}, optional How to build the subtrees: - 'bfs': breadth-first-search creating balanced subtrees - 'dfs': depth-first-search creating imbalanced subtrees - 'random': random subtree building weight_what : {'flops', 'size'}, optional When assessing nodes to build and optimize subtrees from whether to score them by the (local) contraction cost, or tensor size. weight_pwr : int, optional When assessing nodes to build and optimize subtrees from, how to scale their score into a probability: ``score**(1 / weight_pwr)``. The larger this is the more explorative the algorithm is when ``select='random'``. select : {'descend', 'max', 'min', 'random'}, optional What order to select node subtrees to optimize: - 'descend': start from the root and then descend into children. In this case the weights and weight_pwr are ignored since this is a deterministic order. - 'max': choose the highest score first - 'min': choose the lowest score first - 'random': choose randomly weighted on score - see ``weight_pwr``. maxiter : int, optional How many subtree optimizations to perform, the algorithm can terminate before this if all subtrees have been optimized. seed : int, optional A random seed (seeds python system random module). minimize : {'flops', 'size'}, optional Whether to minimize with respect to contraction flops or size. inplace : bool, optional Whether to perform the reconfiguration inplace or not. progbar : bool, optional Whether to show live progress of the reconfiguration. Returns ------- ContractionTree """ tree = self if inplace else self.copy() tree.reset_contraction_indices() # ensure these have been computed and thus are being tracked tree.contract_stats() if minimize is None: minimize = self.get_default_objective() scorer = get_score_fn(minimize) node_cost = getattr(scorer, "cost_local_tree_node", lambda _: 2) if optimize is None: from .pathfinders.path_basic import OptimalOptimizer minimize = scorer.get_dynamic_programming_minimize() opt = OptimalOptimizer(minimize=minimize) else: opt = optimize # different caches as we might want to reconfigure one before other tree.already_optimized.setdefault(minimize, set()) already_optimized = tree.already_optimized[minimize] if progbar: import tqdm pbar = tqdm.tqdm() pbar.set_description(_describe_tree(tree), refresh=False) else: pbar = None try: reconf_kwargs = { "subtree_size": subtree_size, "subtree_search": subtree_search, "maxiter": maxiter, "seed": seed, "minimize": minimize, "opt": opt, "already_optimized": already_optimized, "node_cost": node_cost, "pbar": pbar, } if select == "descend": tree._subtree_reconfigure_descend(**reconf_kwargs) else: reconf_kwargs["weight_what"] = weight_what reconf_kwargs["weight_pwr"] = weight_pwr reconf_kwargs["select"] = select tree._subtree_reconfigure_rand_select(**reconf_kwargs) finally: if progbar: pbar.close() return tree subtree_reconfigure_ = functools.partialmethod( subtree_reconfigure, inplace=True ) def subtree_reconfigure_forest( self, num_trees=8, num_restarts=10, restart_fraction=0.5, subtree_maxiter=100, subtree_size=10, subtree_search=("random", "bfs"), subtree_select=("random",), subtree_weight_what=("flops", "size"), subtree_weight_pwr=(2,), parallel="auto", parallel_maxiter_steps=4, minimize=None, seed=None, progbar=False, inplace=False, ): """'Forested' version of ``subtree_reconfigure`` which is more explorative and can be parallelized. It stochastically generates a 'forest' reconfigured trees, then only keeps some fraction of these to generate the next forest. Parameters ---------- num_trees : int, optional The number of trees to reconfigure at each stage. num_restarts : int, optional The number of times to halt, prune and then restart the tree reconfigurations. restart_fraction : float, optional The fraction of trees to keep at each stage and generate the next forest from. subtree_maxiter : int, optional Number of subtree reconfigurations per step. ``num_restarts * subtree_maxiter`` is the max number of total subtree reconfigurations for the final tree produced. subtree_size : int, optional The size of subtrees to search for and reconfigure. subtree_search : tuple[{'random', 'bfs', 'dfs'}], optional Tuple of options for the ``search`` kwarg of :meth:`ContractionTree.subtree_reconfigure` to randomly sample. subtree_select : tuple[{'random', 'max', 'min'}], optional Tuple of options for the ``select`` kwarg of :meth:`ContractionTree.subtree_reconfigure` to randomly sample. subtree_weight_what : tuple[{'flops', 'size'}], optional Tuple of options for the ``weight_what`` kwarg of :meth:`ContractionTree.subtree_reconfigure` to randomly sample. subtree_weight_pwr : tuple[int], optional Tuple of options for the ``weight_pwr`` kwarg of :meth:`ContractionTree.subtree_reconfigure` to randomly sample. parallel : 'auto', False, True, int, or distributed.Client Whether to parallelize the search. parallel_maxiter_steps : int, optional If parallelizing, how many steps to break each reconfiguration into in order to evenly saturate many processes. minimize : {'flops', 'size', ..., Objective}, optional Whether to minimize the total flops or maximum size of the contraction tree. seed : None, int or random.Random, optional A random seed to use. progbar : bool, optional Whether to show live progress. inplace : bool, optional Whether to perform the subtree reconfiguration inplace. Returns ------- ContractionTree """ tree = self if inplace else self.copy() tree.reset_contraction_indices() # candidate trees num_keep = max(1, int(num_trees * restart_fraction)) # how to rank the trees if minimize is None: minimize = self.get_default_objective() score = get_score_fn(minimize) rng = get_rng(seed) # set up the initial 'forest' and parallel machinery pool = parse_parallel_arg(parallel) is_scatter_pool = can_scatter(pool) if is_scatter_pool: is_worker = maybe_leave_pool(pool) # store the trees as futures for the entire process forest = [scatter(pool, tree)] maxiter = subtree_maxiter // parallel_maxiter_steps else: forest = [tree] maxiter = subtree_maxiter if progbar: import tqdm pbar = tqdm.tqdm(total=num_restarts) pbar.set_description(_describe_tree(tree), refresh=False) try: for _ in range(num_restarts): # on the next round take only the best trees forest = itertools.cycle(forest[:num_keep]) # select some random configurations saplings = [ { "tree": next(forest), "maxiter": maxiter, "minimize": minimize, "subtree_size": subtree_size, "subtree_search": rng.choice(subtree_search), "select": rng.choice(subtree_select), "weight_pwr": rng.choice(subtree_weight_pwr), "weight_what": rng.choice(subtree_weight_what), } for _ in range(num_trees) ] if pool is None: forest = [_reconfigure_tree(**s) for s in saplings] res = [{"tree": t, **_get_tree_info(t)} for t in forest] elif not is_scatter_pool: forest_futures = [ submit(pool, _reconfigure_tree, **s) for s in saplings ] forest = [f.result() for f in forest_futures] res = [{"tree": t, **_get_tree_info(t)} for t in forest] else: # submit in smaller steps to saturate processes for _ in range(parallel_maxiter_steps): for s in saplings: s["tree"] = submit(pool, _reconfigure_tree, **s) # compute scores remotely then gather forest_futures = [s["tree"] for s in saplings] res_futures = [ submit(pool, _get_tree_info, t) for t in forest_futures ] res = [ {"tree": tree_future, **res_future.result()} for tree_future, res_future in zip( forest_futures, res_futures ) ] # update the order of the new forest res.sort(key=score) forest = [r["tree"] for r in res] if progbar: pbar.update() if pool is None: d = _describe_tree(forest[0]) else: d = submit(pool, _describe_tree, forest[0]).result() pbar.set_description(d, refresh=False) finally: if progbar: pbar.close() if is_scatter_pool: tree.set_state_from(forest[0].result()) maybe_rejoin_pool(is_worker, pool) else: tree.set_state_from(forest[0]) return tree subtree_reconfigure_forest_ = functools.partialmethod( subtree_reconfigure_forest, inplace=True ) simulated_anneal = simulated_anneal_tree simulated_anneal_ = functools.partialmethod(simulated_anneal, inplace=True) parallel_temper = parallel_temper_tree parallel_temper_ = functools.partialmethod(parallel_temper, inplace=True) def slice( self, target_size=None, target_overhead=None, target_slices=None, temperature=0.01, minimize=None, allow_outer=True, max_repeats=16, reslice=False, seed=None, inplace=False, ): """Slice this tree (turn some indices into indices which are explicitly summed over rather than being part of contractions). The indices are stored in ``tree.sliced_inds``, and the contraction width updated to take account of the slicing. Calling ``tree.contract(arrays)`` moreover which automatically perform the slicing and summation. Parameters ---------- target_size : int, optional The target number of entries in the largest tensor of the sliced contraction. The search algorithm will terminate after this is reached. target_slices : int, optional The target or minimum number of 'slices' to consider - individual contractions after slicing indices. The search algorithm will terminate after this is breached. This is on top of the current number of slices. target_overhead : float, optional The target increase in total number of floating point operations. For example, a value of ``2.0`` will terminate the search just before the cost of computing all the slices individually breaches twice that of computing the original contraction all at once. temperature : float, optional How much to randomize the repeated search. minimize : {'flops', 'size', ..., Objective}, optional Which metric to score the overhead increase against. allow_outer : bool, optional Whether to allow slicing of outer indices. max_repeats : int, optional How many times to repeat the search with a slight randomization. reslice : bool, optional Whether to reslice the tree, i.e. first remove all currently sliced indices and start the search again. Generally any 'good' sliced indices will be easily found again. seed : None, int or random.Random, optional A random seed or generator to use for the search. inplace : bool, optional Whether the remove the indices from this tree inplace or not. Returns ------- ContractionTree See Also -------- SliceFinder, ContractionTree.slice_and_reconfigure """ from .slicer import SliceFinder if minimize is None: minimize = self.get_default_objective() tree = self if inplace else self.copy() if reslice: if target_slices is not None: target_slices *= tree.nslices tree.unslice_all_() sf = SliceFinder( tree, target_size=target_size, target_overhead=target_overhead, target_slices=target_slices, temperature=temperature, minimize=minimize, allow_outer=allow_outer, seed=seed, ) ix_sl, _ = sf.search(max_repeats) for ix in ix_sl: tree.remove_ind_(ix) return tree slice_ = functools.partialmethod(slice, inplace=True) def slice_and_reconfigure( self, target_size, step_size=2, temperature=0.01, minimize=None, allow_outer=True, max_repeats=16, reslice=False, reconf_opts=None, progbar=False, inplace=False, ): """Interleave slicing (removing indices into an exterior sum) with subtree reconfiguration to minimize the overhead induced by this slicing. Parameters ---------- target_size : int Slice the tree until the maximum intermediate size is this or smaller. step_size : int, optional The minimum size reduction to try and achieve before switching to a round of subtree reconfiguration. temperature : float, optional The temperature to supply to ``SliceFinder`` for searching for indices. minimize : {'flops', 'size', ..., Objective}, optional The metric to minimize when slicing and reconfiguring subtrees. max_repeats : int, optional The number of slicing attempts to perform per search. progbar : bool, optional Whether to show live progress. inplace : bool, optional Whether to perform the slicing and reconfiguration inplace. reconf_opts : None or dict, optional Supplied to :meth:`ContractionTree.subtree_reconfigure` or :meth:`ContractionTree.subtree_reconfigure_forest`, depending on `'forested'` key value. """ tree = self if inplace else self.copy() reconf_opts = {} if reconf_opts is None else dict(reconf_opts) if minimize is None: minimize = self.get_default_objective() minimize = get_score_fn(minimize) reconf_opts.setdefault("minimize", minimize) forested_reconf = reconf_opts.pop("forested", False) if progbar: import tqdm pbar = tqdm.tqdm() pbar.set_description(_describe_tree(tree), refresh=False) try: while tree.max_size() > target_size: tree.slice_( temperature=temperature, target_slices=step_size, minimize=minimize, allow_outer=allow_outer, max_repeats=max_repeats, reslice=reslice, ) if forested_reconf: tree.subtree_reconfigure_forest_(**reconf_opts) else: tree.subtree_reconfigure_(**reconf_opts) if progbar: pbar.update() pbar.set_description(_describe_tree(tree), refresh=False) finally: if progbar: pbar.close() return tree slice_and_reconfigure_ = functools.partialmethod( slice_and_reconfigure, inplace=True ) def slice_and_reconfigure_forest( self, target_size, step_size=2, num_trees=8, restart_fraction=0.5, temperature=0.02, max_repeats=32, reslice=False, minimize=None, allow_outer=True, parallel="auto", progbar=False, inplace=False, reconf_opts=None, ): """'Forested' version of :meth:`ContractionTree.slice_and_reconfigure`. This maintains a 'forest' of trees with different slicing and subtree reconfiguration attempts, pruning the worst at each step and generating a new forest from the best. Parameters ---------- target_size : int Slice the tree until the maximum intermediate size is this or smaller. step_size : int, optional The minimum size reduction to try and achieve before switching to a round of subtree reconfiguration. num_restarts : int, optional The number of times to halt, prune and then restart the tree reconfigurations. restart_fraction : float, optional The fraction of trees to keep at each stage and generate the next forest from. temperature : float, optional The temperature at which to randomize the sliced index search. max_repeats : int, optional The number of slicing attempts to perform per search. parallel : 'auto', False, True, int, or distributed.Client Whether to parallelize the search. progbar : bool, optional Whether to show live progress. inplace : bool, optional Whether to perform the slicing and reconfiguration inplace. reconf_opts : None or dict, optional Supplied to :meth:`ContractionTree.slice_and_reconfigure`. Returns ------- ContractionTree """ tree = self if inplace else self.copy() tree.reset_contraction_indices() # candidate trees num_keep = max(1, int(num_trees * restart_fraction)) # how to rank the trees if minimize is None: minimize = self.get_default_objective() score = get_score_fn(minimize) # set up the initial 'forest' and parallel machinery pool = parse_parallel_arg(parallel) is_scatter_pool = can_scatter(pool) if is_scatter_pool: is_worker = maybe_leave_pool(pool) # store the trees as futures for the entire process forest = [scatter(pool, tree)] else: forest = [tree] if progbar: import tqdm pbar = tqdm.tqdm() pbar.set_description(_describe_tree(tree), refresh=False) next_size = tree.max_size() try: while True: next_size //= step_size # on the next round take only the best trees forest = itertools.cycle(forest[:num_keep]) saplings = [ { "tree": next(forest), "target_size": next_size, "step_size": step_size, "temperature": temperature, "max_repeats": max_repeats, "reconf_opts": reconf_opts, "allow_outer": allow_outer, "reslice": reslice, } for _ in range(num_trees) ] if pool is None: forest = [ _slice_and_reconfigure_tree(**s) for s in saplings ] res = [{"tree": t, **_get_tree_info(t)} for t in forest] elif not is_scatter_pool: # simple pool with no pass by reference forest_futures = [ submit(pool, _slice_and_reconfigure_tree, **s) for s in saplings ] forest = [f.result() for f in forest_futures] res = [{"tree": t, **_get_tree_info(t)} for t in forest] else: forest_futures = [ submit(pool, _slice_and_reconfigure_tree, **s) for s in saplings ] # compute scores remotely then gather res_futures = [ submit(pool, _get_tree_info, t) for t in forest_futures ] res = [ {"tree": tree_future, **res_future.result()} for tree_future, res_future in zip( forest_futures, res_futures ) ] # we want to sort by flops, but also favour sampling as # many different sliced index combos as possible # ~ [1, 1, 1, 2, 2, 3] -> [1, 2, 3, 1, 2, 1] res.sort(key=score) res = list( interleave( groupby(lambda r: r["sliced_ind_set"], res).values() ) ) # update the order of the new forest forest = [r["tree"] for r in res] if progbar: pbar.update() if pool is None: d = _describe_tree(forest[0]) else: d = submit(pool, _describe_tree, forest[0]).result() pbar.set_description(d, refresh=False) if res[0]["size"] <= target_size: break finally: if progbar: pbar.close() if is_scatter_pool: tree.set_state_from(forest[0].result()) maybe_rejoin_pool(is_worker, pool) else: tree.set_state_from(forest[0]) return tree slice_and_reconfigure_forest_ = functools.partialmethod( slice_and_reconfigure_forest, inplace=True ) def compressed_reconfigure( self, minimize=None, order_only=False, max_nodes="auto", max_time=None, local_score=None, exploration_power=0, best_score=None, progbar=False, inplace=False, ): """Reconfigure this tree according to ``peak_size_compressed``. Parameters ---------- chi : int The maximum bond dimension to consider. order_only : bool, optional Whether to only consider the ordering of the current tree contractions, or all possible contractions, starting with the current. max_nodes : int, optional Set the maximum number of contraction steps to consider. max_time : float, optional Set the maximum time to spend on the search. local_score : callable, optional A function that assigns a score to a potential contraction, with a lower score giving more priority to explore that contraction earlier. It should have signature:: local_score(step, new_score, dsize, new_size) where ``step`` is the number of steps so far, ``new_score`` is the score of the contraction so far, ``dsize`` is the change in memory by the current step, and ``new_size`` is the new memory size after contraction. exploration_power : float, optional If not ``0.0``, the inverse power to which the step is raised in the default local score function. Higher values favor exploring more promising branches early on - at the cost of increased memory. Ignored if ``local_score`` is supplied. best_score : float, optional Manually specify an upper bound for best score found so far. progbar : bool, optional If ``True``, display a progress bar. inplace : bool, optional Whether to perform the reconfiguration inplace on this tree. Returns ------- ContractionTree """ from .experimental.path_compressed_branchbound import ( CompressedExhaustive, ) if minimize is None: minimize = self.get_default_objective() if max_nodes == "auto": if max_time is None: max_nodes = max(10_000, self.N**2) else: max_nodes = float("inf") opt = CompressedExhaustive( minimize=minimize, local_score=local_score, max_nodes=max_nodes, max_time=max_time, exploration_power=exploration_power, best_score=best_score, progbar=progbar, ) opt.setup(self.inputs, self.output, self.size_dict) opt.explore_path(self.get_path_surface(), restrict=order_only) # rtree = opt.search(self.inputs, self.output, self.size_dict) opt.run(self.inputs, self.output, self.size_dict) ssa_path = opt.ssa_path # ssa_path = opt(self.inputs, self.output, self.size_dict) rtree = self.__class__.from_path( self.inputs, self.output, self.size_dict, ssa_path=ssa_path, objective=minimize, ) if inplace: self.set_state_from(rtree) rtree = self rtree.reset_contraction_indices() return rtree compressed_reconfigure_ = functools.partialmethod( compressed_reconfigure, inplace=True ) def windowed_reconfigure( self, minimize=None, order_only=False, window_size=20, max_iterations=100, max_window_tries=1000, score_temperature=0.0, queue_temperature=1.0, scorer=None, queue_scorer=None, seed=None, inplace=False, progbar=False, **kwargs, ): from .pathfinders.path_compressed import WindowedOptimizer if minimize is None: minimize = self.get_default_objective() wo = WindowedOptimizer( self.inputs, self.output, self.size_dict, minimize=minimize, ssa_path=self.get_ssa_path(), seed=seed, ) wo.refine( window_size=window_size, max_iterations=max_iterations, order_only=order_only, max_window_tries=max_window_tries, score_temperature=score_temperature, queue_temperature=queue_temperature, scorer=scorer, queue_scorer=queue_scorer, progbar=progbar, **kwargs, ) ssa_path = wo.get_ssa_path() rtree = self.__class__.from_path( self.inputs, self.output, self.size_dict, ssa_path=ssa_path, objective=minimize, ) if inplace: self.set_state_from(rtree) rtree = self rtree.reset_contraction_indices() return rtree windowed_reconfigure_ = functools.partialmethod( windowed_reconfigure, inplace=True ) def flat_tree(self, order=None): """Create a nested tuple representation of the contraction tree like:: ((0, (1, 2)), ((3, 4), ((5, (6, 7)), (8, 9)))) Such that the contraction will progress like:: ((0, (1, 2)), ((3, 4), ((5, (6, 7)), (8, 9)))) ((0, 12), (34, ((5, 67), 89))) (012, (34, (567, 89))) (012, (34, 56789)) (012, 3456789) 0123456789 Where each integer represents a leaf (i.e. single element node). """ tups = dict(zip(self.gen_leaves(), range(self.N))) for parent, l, r in self.traverse(order=order): tups[parent] = tups[l], tups[r] return tups[self.root] def get_leaves_ordered(self): """Return the list of leaves as ordered by the contraction tree. Returns ------- tuple[node_type] """ if not self.is_complete(): raise ValueError("Can't order the leaves until tree is complete.") return tuple( node for node in itertools.chain.from_iterable(self.traverse()) if self.is_leaf(node) ) def get_path(self, order=None): """Generate a standard path (with linear recycled ids) from the contraction tree. Parameters ---------- order : None, "dfs", or callable, optional How to order the contractions within the tree. If a callable is given (which should take a node as its argument), try to contract nodes that minimize this function first. Returns ------- path: tuple[tuple[int, int]] """ from bisect import bisect_left ssa = self.N ssas = list(range(ssa)) node_to_ssa = dict(zip(self.gen_leaves(), ssas)) path = [] for parent, left, right in self.traverse(order=order): # map nodes to ssas lssa = node_to_ssa[left] rssa = node_to_ssa[right] # map ssas to linear indices, using bisection i, j = sorted((bisect_left(ssas, lssa), bisect_left(ssas, rssa))) # 'contract' nodes ssas.pop(j) ssas.pop(i) path.append((i, j)) ssas.append(ssa) # update mapping node_to_ssa[parent] = ssa ssa += 1 return tuple(path) path = deprecated(get_path, "path", "get_path") def get_numpy_path(self, order=None): """Generate a path compatible with the `optimize` kwarg of `numpy.einsum`. """ return ["einsum_path", *self.get_path(order=order)] def get_ssa_path(self, order=None): """Generate a single static assignment path from the contraction tree. Parameters ---------- order : None, "dfs", or callable, optional How to order the contractions within the tree. If a callable is given (which should take a node as its argument), try to contract nodes that minimize this function first. Returns ------- ssa_path: tuple[tuple[int, int]] """ ssa_path = [] pos = dict(zip(self.gen_leaves(), range(self.N))) for parent, l, r in self.traverse(order=order): i, j = sorted((pos[l], pos[r])) ssa_path.append((i, j)) pos[parent] = len(ssa_path) + self.N - 1 return tuple(ssa_path) ssa_path = deprecated(get_ssa_path, "ssa_path", "get_ssa_path") def surface_order(self, node): return (self.get_extent(node), self.get_centrality(node)) def set_surface_order_from_path(self, ssa_path): # first get dict from contractions to parents (don't usually store) parent_map = {} for p, l, r in self.traverse(): parent_map[frozenset([l, r])] = p # then traverse up in given ssa_path order, # assigning parent node ordering 'score' incrementally parent_scores = {} node_map = {i: n for i, n in enumerate(self.gen_leaves())} for j, p in enumerate(ssa_path): lr = frozenset(node_map[i] for i in p) p = parent_map[lr] parent_scores[p] = j node_map[self.N + j] = p self.surface_order = functools.partial( get_with_default, obj=parent_scores, default=float("inf") ) def get_path_surface(self): return self.get_path(order=self.surface_order) path_surface = deprecated( get_path_surface, "path_surface", "get_path_surface" ) def get_ssa_path_surface(self): return self.get_ssa_path(order=self.surface_order) ssa_path_surface = deprecated( get_ssa_path_surface, "ssa_path_surface", "get_ssa_path_surface" ) def get_spans(self): """Get all (which could mean none) potential embeddings of this contraction tree into a spanning tree of the original graph. Returns ------- tuple[dict[frozenset[int], frozenset[int]]] """ ind_to_term = collections.defaultdict(set) for i, term in enumerate(self.inputs): for ix in term: ind_to_term[ix].add(i) def boundary_pairs(node): """Get nodes along the boundary of the bipartition represented by ``node``. """ pairs = set() involved = self.get_involved(node) legs = self.get_legs(node) removed = [ix for ix in involved if ix not in legs] for ix in removed: # for every index across the contraction l1, l2 = ind_to_term[ix] # can either span from left to right or right to left pairs.add((l1, l2)) pairs.add((l2, l1)) return pairs # first span choice is any nodes across the top level bipart candidates = [ { # which intermedate nodes map to which leaf nodes "map": {self.root: self.input_to_node(l2)}, # the leaf nodes in the spanning tree "spine": {l1, l2}, } for l1, l2 in boundary_pairs(self.root) ] for _, l, r in self.descend(): for child in (r, l): # for each current candidate check all the possible extensions for _ in range(len(candidates)): cand = candidates.pop(0) # don't need to do anything for if self.is_leaf(child): candidates.append( { "map": {child: child, **cand["map"]}, "spine": cand["spine"].copy(), } ) for l1, l2 in boundary_pairs(child): if (l1 in cand["spine"]) or (l2 not in cand["spine"]): # pair does not merge inwards into spine continue # valid extension of spanning tree candidates.append( { "map": { child: self.input_to_node(l2), **cand["map"], }, "spine": cand["spine"] | {l1, l2}, } ) return tuple(c["map"] for c in candidates) def compute_centralities(self, combine="mean"): """Compute a centrality for every node in this contraction tree.""" hg = self.get_hypergraph(accel="auto") cents = hg.simple_centrality() for i, leaf in enumerate(self.gen_leaves()): self.info[leaf]["centrality"] = cents[i] combine = { "mean": lambda x, y: (x + y) / 2, "sum": lambda x, y: x + y, "max": max, "min": min, }.get(combine, combine) for p, l, r in self.traverse("dfs"): self.info[p]["centrality"] = combine( self.info[l]["centrality"], self.info[r]["centrality"] ) def get_hypergraph(self, accel=False): """Get a hypergraph representing the uncontracted network (i.e. the leaves). """ return get_hypergraph(self.inputs, self.output, self.size_dict, accel) def reset_contraction_indices(self): """Reset all information regarding a) the explicit contraction indices ordering and b) cached contraction expressions. This should probably be called any time structural changes are made to the tree, e.g. reconfiguration. """ # delete all derived information # (note legs, involved, etc. are order invariant so we can keep those) for node in self.children: for k in ( "inds", "einsum_eq", "can_dot", "tensordot_axes", "tensordot_perm", ): self.info[node].pop(k, None) # invalidate any compiled contractions self.contraction_cores.clear() def sort_contraction_indices( self, priority="flops", make_output_contig=True, make_contracted_contig=True, reset=True, ): """Set explicit orders for the contraction indices of this self to optimize for one of two things: contiguity in contracted ('k') indices, or contiguity of left and right output ('m' and 'n') indices. Parameters ---------- priority : {'flops', 'size', 'root', 'leaves'}, optional Which order to process the intermediate nodes in. Later nodes re-sort previous nodes so are more likely to keep their ordering. E.g. for 'flops' the mostly costly contracton will be process last and thus will be guaranteed to have its indices exactly sorted. make_output_contig : bool, optional When processing a pairwise contraction, sort the parent contraction indices so that the order of indices is the order they appear from left to right in the two child (input) tensors. make_contracted_contig : bool, optional When processing a pairwise contraction, sort the child (input) tensor indices so that all contracted indices appear contiguously. reset : bool, optional Reset all indices to the default order before sorting. """ if reset: self.reset_contraction_indices() if priority == "flops": nodes = sorted( self.children.items(), key=lambda x: self.get_flops(x[0]) ) elif priority == "size": nodes = sorted( self.children.items(), key=lambda x: self.get_size(x[0]) ) elif priority == "root": nodes = ((p, (l, r)) for p, l, r in self.traverse()) elif priority == "leaves": nodes = ((p, (l, r)) for p, l, r in self.descend()) else: raise ValueError(priority) for p, (l, r) in nodes: p_inds, l_inds, r_inds = map(self.get_inds, (p, l, r)) if make_output_contig and not self.is_root(p): # sort indices by whether they appear in the left or right # whether this happens before or after the sort below depends # on the order we are processing the nodes # (avoid root as don't want to modify output) def psort(ix): # group by whether in left or right input return (r_inds.find(ix), l_inds.find(ix)) p_inds = "".join(sorted(p_inds, key=psort)) self.info[p]["inds"] = p_inds if make_contracted_contig: # sort indices by: # 1. if they are going to be contracted # 2. what order they appear in the parent indices # (but ignore leaf indices) if not self.is_leaf(l): def lsort(ix): return (r_inds.find(ix), p_inds.find(ix)) l_inds = "".join(sorted(self.get_legs(l), key=lsort)) self.info[l]["inds"] = l_inds if not self.is_leaf(r): def rsort(ix): return (p_inds.find(ix), l_inds.find(ix)) r_inds = "".join(sorted(self.get_legs(r), key=rsort)) self.info[r]["inds"] = r_inds if not reset: # still need to invalidate any cached contraction expressions self.contraction_cores.clear() def print_contractions(self, sort=None, show_brackets=True): """Print each pairwise contraction, with colorized indices (if `colorama` is installed), and other information. The color codes are: - blue: index appears on left and is kept - green: index appears on right and is kept - red: contracted index: appears on both sides and is removed - pink: batch index: appears on both sides and is kept Any trivial indices that appear only on one term and not in the output are removed and shown by the preprocessing steps. Parameters ---------- sort : {'flops', 'size'}, optional Sort the contractions by either the number of floating point operations or the size of the intermediate tensor. By default the contraction are show in the order they are performed. show_brackets : bool, optional Whether to show the brackets around contiguous sections of the same type of indices. """ try: from colorama import Fore RESET = Fore.RESET GREY = Fore.WHITE PINK = Fore.MAGENTA RED = Fore.RED BLUE = Fore.BLUE GREEN = Fore.GREEN except ImportError: RESET = GREY = PINK = RED = BLUE = GREEN = "" entries = [] if self.has_preprocessing(): for pi, eq in self.preprocessing.items(): # eq is with canonical indices, reinsert original inputs replacer = dict(zip(eq.split("->")[0], self.inputs[pi])) eq = "".join(replacer.get(c, c) for c in eq) print(f"{GREY}preprocess input {pi}: {RESET}{eq}") print() for i, (p, l, r) in enumerate(self.traverse()): p_legs, l_legs, r_legs = map(self.get_legs, [p, l, r]) p_inds, l_inds, r_inds = map(self.get_inds, [p, l, r]) # print sizes and flops p_flops = self.get_flops(p) p_sz, l_sz, r_sz = ( math.log2(self.get_size(node)) for node in [p, l, r] ) # print whether tensordottable if self.get_can_dot(p): type_msg = "tensordot" perm = self.get_tensordot_perm(p) if perm is not None: # and whether indices match tensordot type_msg += "+perm" else: type_msg = "einsum" kpt_brck_l = "(" if show_brackets else "" kpt_brck_r = ")" if show_brackets else "" con_brck_l = "[" if show_brackets else "" con_brck_r = "]" if show_brackets else "" hyp_brck_l = "{" if show_brackets else "" hyp_brck_r = "}" if show_brackets else "" pa = ( "".join( PINK + f"{hyp_brck_l}{ix}{hyp_brck_r}" if (ix in l_legs) and (ix in r_legs) else GREEN + f"{kpt_brck_l}{ix}{kpt_brck_r}" if ix in r_legs else BLUE + ix for ix in p_inds ) .replace(f"){GREEN}(", "") .replace(f"}}{PINK}{{", "") ) la = ( "".join( PINK + f"{hyp_brck_l}{ix}{hyp_brck_r}" if (ix in p_legs) and (ix in r_legs) else RED + f"{con_brck_l}{ix}{con_brck_r}" if ix in r_legs else BLUE + ix for ix in l_inds ) .replace(f"]{RED}[", "") .replace(f"}}{PINK}{{", "") ) ra = ( "".join( PINK + f"{hyp_brck_l}{ix}{hyp_brck_r}" if (ix in p_legs) and (ix in l_legs) else RED + f"{con_brck_l}{ix}{con_brck_r}" if ix in l_legs else GREEN + ix for ix in r_inds ) .replace(f"]{RED}[", "") .replace(f"}}{PINK}{{", "") ) entries.append( ( p, f"{GREY}({i}) cost: {RESET}{p_flops:.1e} " f"{GREY}widths: {RESET}{l_sz:.1f},{r_sz:.1f}->{p_sz:.1f} " f"{GREY}type: {RESET}{type_msg}\n" f"{GREY}inputs: {la},{ra}{RESET}->\n" f"{GREY}output: {pa}\n", ) ) if sort == "flops": entries.sort(key=lambda x: self.get_flops(x[0]), reverse=True) if sort == "size": entries.sort(key=lambda x: self.get_size(x[0]), reverse=True) entries.append((None, f"{RESET}")) o = "\n".join(entry for _, entry in entries) print(o) # --------------------- Performing the Contraction ---------------------- # def get_contractor( self, order=None, prefer_einsum=False, strip_exponent=False, check_zero=False, implementation=None, autojit=False, progbar=False, ): """Get a reusable function which performs the contraction corresponding to this tree, cached. Parameters ---------- tree : ContractionTree The contraction tree. order : str or callable, optional Supplied to :meth:`ContractionTree.traverse`, the order in which to perform the pairwise contractions given by the tree. prefer_einsum : bool, optional Prefer to use ``einsum`` for pairwise contractions, even if ``tensordot`` can perform the contraction. strip_exponent : bool, optional If ``True``, the function will eagerly strip the exponent (in log10) from intermediate tensors to control numerical problems from leaving the range of the datatype. This method then returns the scaled 'mantissa' output array and the exponent separately. check_zero : bool, optional If ``True``, when ``strip_exponent=True``, explicitly check for zero-valued intermediates that would otherwise produce ``nan``, instead terminating early if encountered and returning ``(0.0, 0.0)``. implementation : str or tuple[callable, callable], optional What library to use to actually perform the contractions. Options are: - None: let cotengra choose. - "autoray": dispatch with autoray, using the ``tensordot`` and ``einsum`` implementation of the backend. - "cotengra": use the ``tensordot`` and ``einsum`` implementation of cotengra, which is based on batch matrix multiplication. This is faster for some backends like numpy, and also enables libraries which don't yet provide ``tensordot`` and ``einsum`` to be used. - "cuquantum": use the cuquantum library to perform the whole contraction (not just individual contractions). - tuple[callable, callable]: manually supply the ``tensordot`` and ``einsum`` implementations to use. autojit : bool, optional If ``True``, use :func:`autoray.autojit` to compile the contraction function. progbar : bool, optional Whether to show progress through the contraction by default. Returns ------- fn : callable The contraction function, with signature ``fn(*arrays)``. """ key = ( autojit, order, prefer_einsum, strip_exponent, check_zero, implementation, progbar, ) try: fn = self.contraction_cores[key] except KeyError: fn = self.contraction_cores[key] = make_contractor( tree=self, order=order, prefer_einsum=prefer_einsum, strip_exponent=strip_exponent, check_zero=check_zero, implementation=implementation, autojit=autojit, progbar=progbar, ) return fn def contract_core( self, arrays, order=None, prefer_einsum=False, strip_exponent=False, check_zero=False, backend=None, implementation=None, autojit="auto", progbar=False, ): """Contract ``arrays`` with this tree. The order of the axes and output is assumed to be that of ``tree.inputs`` and ``tree.output``, but with sliced indices removed. This functon contracts the core tree and thus if indices have been sliced the arrays supplied need to be sliced as well. Parameters ---------- arrays : sequence of array The arrays to contract. order : str or callable, optional Supplied to :meth:`ContractionTree.traverse`. prefer_einsum : bool, optional Prefer to use ``einsum`` for pairwise contractions, even if ``tensordot`` can perform the contraction. backend : str, optional What library to use for ``einsum`` and ``transpose``, will be automatically inferred from the arrays if not given. autojit : "auto" or bool, optional Whether to use ``autoray.autojit`` to jit compile the expression. If "auto", then let ``cotengra`` choose. progbar : bool, optional Show progress through the contraction. """ if autojit == "auto": # choose for the user autojit = backend == "jax" fn = self.get_contractor( order=order, prefer_einsum=prefer_einsum, strip_exponent=strip_exponent is not False, implementation=implementation, autojit=autojit, check_zero=check_zero, progbar=progbar, ) return fn(*arrays, backend=backend) def slice_key(self, i, strides=None): """Get the combination of sliced index values for overall slice ``i``. Parameters ---------- i : int The overall slice index. Returns ------- key : dict[str, int] The value each sliced index takes for slice ``i``. """ if strides is None: strides = get_slice_strides(self.sliced_inds) key = {} for (ind, info), stride in zip(self.sliced_inds.items(), strides): if info.project is None: key[ind] = i // stride i %= stride else: # size is 1 and i doesn't change key[ind] = info.project return key def slice_arrays(self, arrays, i): """Take ``arrays`` and slice the relevant inputs according to ``tree.sliced_inds`` and the dynary representation of ``i``. """ temp_arrays = list(arrays) # e.g. {'a': 2, 'd': 7, 'z': 0} locations = self.slice_key(i) for c in self.sliced_inputs: # the indexing object, e.g. [:, :, 7, :, 2, :, :, 0] selector = tuple( locations.get(ix, slice(None)) for ix in self.inputs[c] ) # re-insert the sliced array temp_arrays[c] = temp_arrays[c][selector] return temp_arrays def contract_slice(self, arrays, i, **kwargs): """Get slices ``i`` of ``arrays`` and then contract them.""" return self.contract_core(self.slice_arrays(arrays, i), **kwargs) def gather_slices(self, slices, backend=None, progbar=False): """Gather all the output contracted slices into a single full result. If none of the sliced indices appear in the output, then this is a simple sum - otherwise the slices need to be partially summed and partially stacked. """ if progbar: import tqdm slices = tqdm.tqdm(slices, total=self.multiplicity) output_pos = { ix: i for i, ix in enumerate(self.output) if ix in self.sliced_inds } add_maybe_exponent_stripped = AdderWithMaybeExponentStripped() if not output_pos: # we can just sum everything return functools.reduce(add_maybe_exponent_stripped, slices) # first we sum over non-output sliced indices chunks = {} for i, s in enumerate(slices): key_slice = self.slice_key(i) key = tuple(key_slice[ix] for ix in output_pos) try: chunks[key] = add_maybe_exponent_stripped(chunks[key], s) except KeyError: chunks[key] = s if isinstance(next(iter(chunks.values())), tuple): # have stripped exponents, need to scale to largest emax = max(v[1] for v in chunks.values()) chunks = { k: mi * 10 ** (ei - emax) for k, (mi, ei) in chunks.items() } else: emax = None # then we stack these summed chunks over output sliced indices def recursively_stack_chunks(loc, remaining): if not remaining: return chunks[loc] arrays = [ recursively_stack_chunks(loc + (d,), remaining[1:]) for d in self.sliced_inds[remaining[0]].sliced_range ] axes = output_pos[remaining[0]] - len(loc) return do("stack", arrays, axes, like=backend) result = recursively_stack_chunks((), tuple(output_pos)) if emax is not None: # strip_exponent was True, return the exponent separately return result, emax return result def gen_output_chunks( self, arrays, with_key=False, progbar=False, **contract_opts ): """Generate each output chunk of the contraction - i.e. take care of summing internally sliced indices only first. This assumes that the ``sliced_inds`` are sorted by whether they appear in the output or not (the default order). Useful for performing some kind of reduction over the final tensor object like ``fn(x).sum()`` without constructing the entire thing. Parameters ---------- arrays : sequence of array The arrays to contract. with_key : bool, optional Whether to yield the output index configuration key along with the chunk. progbar : bool, optional Show progress through the contraction chunks. Yields ------ chunk : array A chunk of the contracted result. key : dict[str, int] The value each sliced output index takes for this chunk. """ # consecutive slices of size ``stepsize`` all belong to the same output # block because the sliced indices are sorted output first stepsize = prod( si.size for si in self.sliced_inds.values() if si.inner ) if progbar: import tqdm it = tqdm.trange(self.nslices // stepsize) else: it = range(self.nslices // stepsize) for o in it: chunk = self.contract_slice(arrays, o * stepsize, **contract_opts) if with_key: output_key = { ix: x for ix, x in self.slice_key(o * stepsize).items() if ix in self.output } for j in range(1, stepsize): i = o * stepsize + j chunk = chunk + self.contract_slice(arrays, i, **contract_opts) if with_key: yield chunk, output_key else: yield chunk def contract( self, arrays, order=None, prefer_einsum=False, strip_exponent=False, check_zero=False, backend=None, implementation=None, autojit="auto", progbar=False, ): """Contract ``arrays`` with this tree. This function takes *unsliced* arrays and handles the slicing, contractions and gathering. The order of the axes and output is assumed to match that of ``tree.inputs`` and ``tree.output``. Parameters ---------- arrays : sequence of array The arrays to contract. order : str or callable, optional Supplied to :meth:`ContractionTree.traverse`. prefer_einsum : bool, optional Prefer to use ``einsum`` for pairwise contractions, even if ``tensordot`` can perform the contraction. strip_exponent : bool, optional If ``True``, eagerly strip the exponent (in log10) from intermediate tensors to control numerical problems from leaving the range of the datatype. This method then returns the scaled 'mantissa' output array and the exponent separately. check_zero : bool, optional If ``True``, when ``strip_exponent=True``, explicitly check for zero-valued intermediates that would otherwise produce ``nan``, instead terminating early if encountered and returning ``(0.0, 0.0)``. backend : str, optional What library to use for ``tensordot``, ``einsum`` and ``transpose``, it will be automatically inferred from the input arrays if not given. autojit : bool, optional Whether to use the 'autojit' feature of `autoray` to compile the contraction expression. progbar : bool, optional Whether to show a progress bar. Returns ------- output : array The contracted output, it will be scaled if ``strip_exponent==True``. exponent : float The exponent of the output in base 10, returned only if ``strip_exponent==True``. See Also -------- contract_core, contract_slice, slice_arrays, gather_slices """ if not self.sliced_inds: return self.contract_core( arrays, order=order, prefer_einsum=prefer_einsum, strip_exponent=strip_exponent, check_zero=check_zero, backend=backend, implementation=implementation, autojit=autojit, progbar=progbar, ) slices = ( self.contract_slice( arrays, i, order=order, prefer_einsum=prefer_einsum, strip_exponent=strip_exponent, check_zero=check_zero, backend=backend, implementation=implementation, autojit=autojit, ) for i in range(self.multiplicity) ) return self.gather_slices(slices, backend=backend, progbar=progbar) def contract_mpi(self, arrays, comm=None, root=None, **kwargs): """Contract the slices of this tree and sum them in parallel - *assuming* we are already running under MPI. Parameters ---------- arrays : sequence of array The input (unsliced arrays) comm : None or mpi4py communicator Defaults to ``mpi4py.MPI.COMM_WORLD`` if not given. root : None or int, optional If ``root=None``, an ``Allreduce`` will be performed such that every process has the resulting tensor, else if an integer e.g. ``root=0``, the result will be exclusively gathered to that process using ``Reduce``, with every other process returning ``None``. kwargs Supplied to :meth:`~cotengra.ContractionTree.contract_slice`. """ if not set(self.sliced_inds).isdisjoint(set(self.output)): raise NotImplementedError( "Sliced and output indices overlap - currently only a simple " "sum of result slices is supported currently." ) if comm is None: from mpi4py import MPI comm = MPI.COMM_WORLD if self.multiplicity < comm.size: raise ValueError( f"Need to have more slices than MPI processes, but have " f"{self.multiplicity} and {comm.size} respectively." ) # round robin compute each slice, eagerly summing result_i = None for i in range(comm.rank, self.multiplicity, comm.size): # note: fortran ordering is needed for the MPI reduce x = do("asfortranarray", self.contract_slice(arrays, i, **kwargs)) if result_i is None: result_i = x else: result_i += x if root is None: # everyone gets the summed result result = do("empty_like", result_i) comm.Allreduce(result_i, result) return result # else we only sum reduce the result to process ``root`` if comm.rank == root: result = do("empty_like", result_i) else: result = None comm.Reduce(result_i, result, root=root) return result def benchmark( self, dtype="float64", max_time=60, min_reps=3, max_reps=100, warmup=True, **contract_opts, ): """Benchmark the contraction of this tree. Parameters ---------- dtype : {"float32", "float64", "complex64", "complex128"} The datatype to use. max_time : float, optional The maximum time to spend benchmarking in seconds. min_reps : int, optional The minimum number of repetitions to perform, regardless of time. max_reps : int, optional The maximum number of repetitions to perform, regardless of time. warmup : bool or int, optional Whether to perform a warmup run before the benchmark. If an int, the number of warmup runs to perform. contract_opts Supplied to :meth:`~cotengra.ContractionTree.contract_slice`. Returns ------- dict A dictionary of benchmarking results. The keys are: - "time_per_slice" : float The average time to contract a single slice. - "est_time_total" : float The estimated total time to contract all slices. - "est_gigaflops" : float The estimated gigaflops of the contraction. See Also -------- contract_slice """ import time from .utils import make_arrays_from_inputs arrays = make_arrays_from_inputs( self.inputs, self.size_dict, dtype=dtype ) for i in range(int(warmup)): self.contract_slice(arrays, i % self.nslices, **contract_opts) t0 = time.time() ti = t0 i = 0 while (ti - t0 < max_time) or (i < min_reps): self.contract_slice(arrays, i % self.nslices, **contract_opts) ti = time.time() i += 1 if i >= max_reps: break time_per_slice = (ti - t0) / i est_time_total = time_per_slice * self.nslices est_gigaflops = self.total_flops(dtype=dtype) / (1e9 * est_time_total) return { "time_per_slice": time_per_slice, "est_time_total": est_time_total, "est_gigaflops": est_gigaflops, } plot_ring = plot_tree_ring plot_tent = plot_tree_tent plot_span = plot_tree_span plot_flat = plot_tree_flat plot_circuit = plot_tree_circuit plot_rubberband = plot_tree_rubberband plot_contractions = plot_contractions plot_contractions_alt = plot_contractions_alt @functools.wraps(plot_hypergraph) def plot_hypergraph(self, **kwargs): hg = self.get_hypergraph(accel=False) hg.plot(**kwargs) def describe(self, info="normal", join=" "): """Return a string describing the contraction tree.""" self.contract_stats() if info == "normal": return join.join( ( f"log10[FLOPs]={self.total_flops(log=10):.2f}", f"log2[SIZE]={self.max_size(log=2):.2f}", ) ) elif info == "full": s = [ f"log10[FLOPS]={self.total_flops(log=10):.2f}", f"log10[COMBO]={self.combo_cost(log=10):.2f}", f"log2[SIZE]={self.max_size(log=2):.2f}", f"log2[PEAK]={self.peak_size(log=2):.2f}", ] if self.sliced_inds: s.append(f"NSLICES={self.multiplicity:.2f}") return join.join(s) elif info == "concise": s = [ f"F={self.total_flops(log=10):.2f}", f"C={self.combo_cost(log=10):.2f}", f"S={self.max_size(log=2):.2f}", f"P={self.peak_size(log=2):.2f}", ] if self.sliced_inds: s.append(f"$={self.multiplicity:.2f}") return join.join(s) def __repr__(self): if self.is_complete(): return f"<{self.__class__.__name__}(N={self.N})>" else: s = "<{}(N={}, branches={}, complete={})>" return s.format( self.__class__.__name__, self.N, len(self.children), self.is_complete(), ) def __str__(self): if not self.is_complete(): return self.__repr__() else: d = self.describe("concise", join=", ") return f"<{self.__class__.__name__}(N={self.N}, {d})>" def _reconfigure_tree(tree, *args, **kwargs): return tree.subtree_reconfigure(*args, **kwargs) def _slice_and_reconfigure_tree(tree, *args, **kwargs): return tree.slice_and_reconfigure(*args, **kwargs) def _get_tree_info(tree): stats = tree.contract_stats() stats["sliced_ind_set"] = frozenset(tree.sliced_inds) return stats def _describe_tree(tree, info="normal"): return tree.describe(info=info) class ContractionTreeCompressed(ContractionTree): """A contraction tree for compressed contractions. Currently the only difference is that this defaults to the 'surface' traversal ordering. """ def set_state_from(self, other): super().set_state_from(other) self.set_surface_order_from_path(other.get_ssa_path()) @classmethod def from_path( cls, inputs, output, size_dict, *, path=None, ssa_path=None, autocomplete="auto", check=False, **kwargs, ): """Create a (completed) ``ContractionTreeCompressed`` from the usual inputs plus a standard contraction path or 'ssa_path' - you need to supply one. This also set the default 'surface' traversal ordering to be the initial path. """ if int(path is None) + int(ssa_path is None) != 1: raise ValueError( "Exactly one of ``path`` or ``ssa_path`` must be supplied." ) if path is not None: from .pathfinders.path_basic import linear_to_ssa ssa_path = linear_to_ssa(path) tree = super().from_path( inputs, output, size_dict, ssa_path=ssa_path, autocomplete=False, check=check, **kwargs, ) tree.set_surface_order_from_path(ssa_path) if (len(tree.children) < tree.N - 1) and autocomplete: if autocomplete == "auto": # warn that we are completing warnings.warn( "Path was not complete - contracting all remaining. " "You can silence this warning with `autocomplete=True`." "Or produce an incomplete tree with `autocomplete=False`." ) tree.autocomplete(optimize="greedy-compressed") return tree def get_default_order(self): return "surface_order" def get_default_objective(self): if self._default_objective is None: self._default_objective = get_score_fn("peak-compressed") return self._default_objective def get_default_chi(self): objective = self.get_default_objective() try: chi = objective.chi except AttributeError: chi = "auto" if chi == "auto": chi = max(self.size_dict.values()) ** 2 return chi def get_default_compress_late(self): objective = self.get_default_objective() try: return objective.compress_late except AttributeError: return False total_flops = ContractionTree.total_flops_compressed total_write = ContractionTree.total_write_compressed combo_cost = ContractionTree.combo_cost_compressed total_cost = ContractionTree.total_cost_compressed max_size = ContractionTree.max_size_compressed peak_size = ContractionTree.peak_size_compressed contraction_cost = ContractionTree.contraction_cost_compressed contraction_width = ContractionTree.contraction_width_compressed total_flops_exact = ContractionTree.total_flops total_write_exact = ContractionTree.total_write combo_cost_exact = ContractionTree.combo_cost total_cost_exact = ContractionTree.total_cost max_size_exact = ContractionTree.max_size peak_size_exact = ContractionTree.peak_size def get_contractor(self, *_, **__): raise NotImplementedError( "`cotengra` doesn't implement compressed contraction itself. " "If you want to use compressed contractions, you need to use " "`quimb` and the `TensorNetwork.contract_compressed` method, " "with e.g. `optimize=tree.get_path()`." ) def simulated_anneal( self, minimize=None, tfinal=0.0001, tstart=0.01, tsteps=50, numiter=50, seed=None, inplace=False, progbar=False, **kwargs, ): """Perform simulated annealing refinement of this *compressed* contraction tree. """ from .pathfinders.path_compressed import WindowedOptimizer if minimize is None: minimize = self.get_default_objective() wo = WindowedOptimizer( self.inputs, self.output, self.size_dict, minimize=minimize, ssa_path=self.get_ssa_path(), seed=seed, ) wo.simulated_anneal( tfinal=tfinal, tstart=tstart, tsteps=tsteps, numiter=numiter, progbar=progbar, **kwargs, ) ssa_path = wo.get_ssa_path() rtree = self.__class__.from_path( self.inputs, self.output, self.size_dict, ssa_path=ssa_path, objective=minimize, ) if inplace: self.set_state_from(rtree) rtree = self rtree.reset_contraction_indices() return rtree simulated_anneal_ = functools.partialmethod(simulated_anneal, inplace=True) class PartitionTreeBuilder: """Function wrapper that takes a function that partitions graphs and uses it to build a contraction tree. ``partition_fn`` should have signature: def partition_fn(inputs, output, size_dict, weight_nodes, weight_edges, **kwargs): ... return membership Where ``weight_nodes`` and ``weight_edges`` decsribe how to weight the nodes and edges of the graph respectively and ``membership`` should be a list of integers of length ``len(inputs)`` labelling which partition each input node should be put it. """ def __init__(self, partition_fn): self.partition_fn = partition_fn def build_divide( self, inputs, output, size_dict, random_strength=0.01, cutoff=10, parts=2, parts_decay=0.5, sub_optimize="greedy", super_optimize="random-greedy-128", check=False, seed=None, **partition_opts, ): tree = ContractionTree( inputs, output, size_dict, track_childless=True, ) rng = get_rng(seed) rand_size_dict = jitter_dict(size_dict, random_strength, rng) dynamic_imbalance = ("imbalance" in partition_opts) and ( "imbalance_decay" in partition_opts ) if dynamic_imbalance: imbalance = partition_opts.pop("imbalance") imbalance_decay = partition_opts.pop("imbalance_decay") else: imbalance = imbalance_decay = None dynamic_fix = partition_opts.get("fix_output_nodes", None) == "auto" while tree.childless: top_node = next(iter(tree.childless)) subgraph = tree.get_subgraph(top_node) subsize = len(subgraph) # skip straight to better method if subsize <= cutoff: tree.contract_nodes( [tree.input_to_node(x) for x in subgraph], grandparent=top_node, optimize=sub_optimize, check=check, ) continue # relative subgraph size s = subsize / tree.N # let the target number of communities depend on subgraph size parts_s = max(int(s**parts_decay * parts), 2) # let the imbalance either rise or fall if dynamic_imbalance: if imbalance_decay >= 0: imbalance_s = s**imbalance_decay * imbalance else: imbalance_s = 1 - s**-imbalance_decay * (1 - imbalance) partition_opts["imbalance"] = imbalance_s if dynamic_fix: # for the top level subtree (s==1.0) we partition the outputs # nodes first into their own bi-partition parts_s = 2 partition_opts["fix_output_nodes"] = s == 1.0 # partition! get community membership list e.g. # [0, 0, 1, 0, 1, 0, 0, 2, 2, ...] inputs = tuple(map(tuple, tree.node_to_terms(top_node))) output = tuple(tree.get_legs(top_node)) membership = self.partition_fn( inputs, output, rand_size_dict, parts=parts_s, seed=rng, **partition_opts, ) # divide subgraph up e.g. if we enumerate the subgraph index sets # (0, 1, 2, 3, 4, 5, 6, 7, 8, ...) -> # ({0, 1, 3, 5, 6}, {2, 4}, {7, 8}) partitions = separate(subgraph, membership) if len(partitions) == 1: # no communities found - contract all remaining leaves tree.contract_nodes( tuple(map(tree.input_to_node, subgraph)), grandparent=top_node, optimize=sub_optimize, check=check, ) continue tree.contract_nodes( partitions, grandparent=top_node, optimize=super_optimize, check=check, ) if check: assert tree.is_complete() return tree def build_agglom( self, inputs, output, size_dict, random_strength=0.01, groupsize=4, sub_optimize="greedy", check=False, seed=None, **partition_opts, ): tree = ContractionTree( inputs, output, size_dict, track_childless=True, ) rand_size_dict = jitter_dict(size_dict, random_strength, seed) leaves = tuple(tree.gen_leaves()) output = tuple(tree.output) while len(leaves) > groupsize: # choose number of partitions so that each # has approximately ``groupsize`` nodes parts = max(2, len(leaves) // groupsize) # partition! get community membership list inputs = [tuple(tree.get_legs(node)) for node in leaves] membership = self.partition_fn( inputs, output, rand_size_dict, parts=parts, **partition_opts, ) # group leaves according to partition label partitions = separate(leaves, membership) if len(partitions) == 1: # only found one group, move to final contraction break # contract each group into a new leaf leaves = [ tree.contract_nodes( partition, check=check, optimize=sub_optimize, ) for partition in partitions ] if len(leaves) > 1: # contract any remaining leaves together tree.contract_nodes( leaves, check=check, optimize=sub_optimize, grandparent=tree.root, ) if check: assert tree.is_complete() return tree def trial_fn(self, inputs, output, size_dict, **partition_opts): return self.build_divide(inputs, output, size_dict, **partition_opts) def trial_fn_agglom(self, inputs, output, size_dict, **partition_opts): return self.build_agglom(inputs, output, size_dict, **partition_opts) def jitter(x, strength, rng): return x * (1 + strength * rng.expovariate(1.0)) def jitter_dict(d, strength, seed=None): rng = get_rng(seed) return {k: jitter(v, strength, rng) for k, v in d.items()} def separate(xs, blocks): """Partition ``xs`` into ``n`` different list based on the corresponding labels in ``blocks``. """ sorter = collections.defaultdict(list) for x, b in zip(xs, blocks): sorter[b].append(x) x_b = list(sorter.items()) x_b.sort() return [x[1] for x in x_b] ================================================ FILE: cotengra/core_multi.py ================================================ import math from .core import ContractionTree, cached_node_property class ContractionTreeMulti(ContractionTree): def __init__( self, inputs, output, size_dict, sliced_inds, objective, track_cache=False, ): super().__init__(inputs, output, size_dict, objective=objective) self.sliced_inds = {ix: None for ix in sliced_inds} self._track_cache = track_cache if track_cache: self._cache_est = 0 def set_state_from(self, other): super().set_state_from(other) self._track_cache = other._track_cache if other._track_cache: self._cache_est = other._cache_est def _remove_node(self, node): if self._track_cache: self._cache_est -= self.get_cache_contrib(node) super()._remove_node(node) def _update_tracked(self, node): if self._track_cache: self._cache_est += self.get_cache_contrib(node) super()._update_tracked(node) @cached_node_property("node_var_inds") def get_node_var_inds(self, node): """Get the set of variable indices that a node depends on.""" if self.is_leaf(node): i = self.node_to_input(node) term = self.inputs[i] return {ix: None for ix in term if ix in self.sliced_inds} try: l, r = self.children[node] return self.get_node_var_inds(l) | self.get_node_var_inds(r) except KeyError: return { ix: None for term in self.node_to_terms(node) for ix in term if ix in self.sliced_inds } @cached_node_property("node_is_bright") def get_node_is_bright(self, node): """Get whether a node is 'bright', i.e. contains a different set of variable indices to either of its children, if a node is not bright then its children never have to be stored in the cache. """ if self.is_leaf(node): i = self.node_to_input(node) term = self.inputs[i] return any(ix in self.sliced_inds for ix in term) l, r = self.children[node] return (self.get_node_var_inds(node) != self.get_node_var_inds(l)) or ( self.get_node_var_inds(node) != self.get_node_var_inds(r) ) @cached_node_property("node_mult") def get_node_mult(self, node): """Get the estimated 'multiplicity' of a node, i.e. the number of times it will have to be recomputed for different index configurations. """ return self.get_default_objective().estimate_node_mult(self, node) def get_node_cache_mult(self, node, sliced_ind_ordering): """Get the estimated 'cache multiplicity' of a node, i.e. the total number of versions with different index configurations that must be stored simultaneously in the cache. """ return self.get_default_objective().estimate_node_cache_mult( self, node, sliced_ind_ordering ) # @cached_node_property("multi_flops") def get_flops(self, node): """The the estimated total cost of computing a node for all index configurations. """ return super().get_flops(node) * self.get_node_mult(node) @cached_node_property("cache_contrib") def get_cache_contrib(self, node): l, r = self.children[node] lr_peak = 0 if self.get_node_is_bright(l): lr_peak += self.get_size(l) if self.get_node_is_bright(r): lr_peak += self.get_size(r) * self.get_node_mult(r) rl_peak = 0 if self.get_node_is_bright(r): rl_peak += self.get_size(r) if self.get_node_is_bright(l): rl_peak += self.get_size(l) * self.get_node_mult(l) if lr_peak < rl_peak: return lr_peak else: self.children[node] = (r, l) return rl_peak def peak_size(self, log=None): if not self._track_cache: self._cache_est = 0 for ( node, _, _, ) in self.traverse(): self._cache_est += self.get_cache_contrib(node) self._track_cache = True peak = self._cache_est if log is not None: peak = math.log(peak, log) return peak def reorder_contractions_for_peak_est(self): """Reorder the contractions to try and reduce the peak memory usage.""" swapped = False for p, l, r in self.descend(): lr_peak = 0 if self.get_node_is_bright(l): lr_peak += self.get_size(l) if self.get_node_is_bright(r): lr_peak += self.get_size(r) * self.get_node_mult(r) rl_peak = 0 if self.get_node_is_bright(r): rl_peak += self.get_size(r) if self.get_node_is_bright(l): rl_peak += self.get_size(l) * self.get_node_mult(l) if rl_peak < lr_peak: self.children[p] = (r, l) swapped = True return swapped def reorder_sliced_inds(self): """ """ sliced_ind_ordering = dict() for node, _, _ in self.traverse(): sliced_ind_ordering.update(self.get_node_var_inds(node)) self.sliced_inds = {ix: None for ix in sliced_ind_ordering} def exact_multi_stats(self, configs): # ragged list of lists (configs and contractions) cons = [] # build this for efficiency plr = tuple(self.traverse()) def to_key(node, config): subconfig = tuple( map(config.__getitem__, self.get_node_var_inds(node)) ) return hash((node, subconfig)) # iterate forward, recording only when we first need to produce a 'parent' seen = set() for config in configs: cons_i = [] for p, l, r in plr: pkey = to_key(p, config) first = pkey not in seen if first: seen.add(pkey) cons_i.append( { "p": p, "l": l, "r": r, "pkey": pkey, "lkey": to_key(l, config), "rkey": to_key(r, config), } ) cons.append(cons_i) del seen # iterate backward, checking the last # time a 'child' is seen -> can delete deleted = set() for cons_i in reversed(cons): for con in cons_i: rkey = con["rkey"] rdel = rkey not in deleted if rdel: deleted.add(rkey) con["rdel"] = rdel lkey = con["lkey"] ldel = lkey not in deleted if ldel: deleted.add(lkey) con["ldel"] = ldel del deleted # iterate forward again if we want to compute flops and memory usage: # not needed if we already know these & just want to contract flops = 0 mems = [] mem_current = 0 mem_peak = 0 mem_write = 0 for cons_i in cons: for con in cons_i: p = con["p"] flops += super().get_flops(p) psize = self.get_size(p) mem_current += psize mem_write += psize mems.append(mem_current) mem_peak = max(mem_peak, mem_current) l, r = con["l"], con["r"] if con["ldel"] and not self.is_leaf(l): mem_current -= self.get_size(l) if con["rdel"] and not self.is_leaf(r): mem_current -= self.get_size(r) # final output of each config is always deletable mem_current -= self.get_size(p) return { "flops": flops, "write": mem_write, "size": self.max_size(), "peak": mem_peak, } ================================================ FILE: cotengra/experimental/__init__.py ================================================ """Potentially useful but experimental (untested) features,""" ================================================ FILE: cotengra/experimental/hyper_de.py ================================================ """Hyper optimization using a pure Python differential evolution strategy.""" from ..utils import get_rng from ._param_mapping import ( LCBOptimizer, build_params, convert_raw, num_params, ) from .hyper import HyperOptLib, register_hyper_optlib class HyperDESampler: """A lightweight differential evolution optimizer operating in raw ``[-1, 1]`` parameter space. Each generation maintains a population of candidate vectors. New trial vectors are created using ``DE/rand/1/bin`` mutation and binomial crossover, then kept only if they improve on their parent. Parameters ---------- space : dict[str, dict] The search space for a single contraction method. seed : None or int, optional Random seed. population_size : int or "auto", optional The population size. When ``"auto"`` it is chosen based on the mapped parameter dimension. mutation : float, optional The differential weight (F) applied to the difference vector. crossover : float, optional The crossover probability (CR) for binomial crossover. mutation_decay : float, optional Multiplicative decay applied to ``mutation`` after each completed generation. mutation_min : float, optional Lower bound for ``mutation``. mutation_max : float, optional Upper bound for ``mutation``. exponential_param_power : float, optional Passed through to the shared parameter mapping for ``FLOAT_EXP`` parameters. """ def __init__( self, space, seed=None, population_size="auto", mutation=0.8, crossover=0.7, mutation_decay=1.0, mutation_min=0.1, mutation_max=1.5, exponential_param_power=None, ): self.rng = get_rng(seed) self.params = build_params( space, exponential_param_power=exponential_param_power ) self.ndim = num_params(self.params) if population_size == "auto": population_size = max(8, 5 * self.ndim) self.population_size = population_size self.mutation = mutation self.crossover = crossover self.mutation_decay = mutation_decay self.mutation_min = mutation_min self.mutation_max = mutation_max # initialize population uniformly in [-1, 1] self._population = [ tuple(self.rng.uniform(-1.0, 1.0) for _ in range(self.ndim)) for _ in range(self.population_size) ] self._scores = [float("inf")] * self.population_size self._trial_counter = 0 self._target_index = 0 self._generation = None self._trial_map = {} def _mutate(self, target_idx): """Create a trial vector via DE/rand/1/bin.""" # pick three distinct indices, all different from target indices = list(range(self.population_size)) indices.remove(target_idx) r0, r1, r2 = self.rng.sample(indices, 3) x_r0 = self._population[r0] x_r1 = self._population[r1] x_r2 = self._population[r2] # mutation: v = x_r0 + F * (x_r1 - x_r2) v = [] for d in range(self.ndim): vi = x_r0[d] + self.mutation * (x_r1[d] - x_r2[d]) v.append(min(max(vi, -1.0), 1.0)) # binomial crossover x_target = self._population[target_idx] j_rand = self.rng.randrange(self.ndim) trial = [] for d in range(self.ndim): if self.rng.random() < self.crossover or d == j_rand: trial.append(v[d]) else: trial.append(x_target[d]) return tuple(trial) def _sample_generation(self): """Prepare trial vectors for all population members.""" self._generation = { "trials": [], "trial_numbers": [], "target_indices": [], "scores": {}, "next_index": 0, } for i in range(self.population_size): self._extend_generation(i) def _extend_generation(self, target_idx=None): """Append one more trial to the current generation.""" if target_idx is None: # wrap around if we need more trials than population target_idx = len(self._generation["trials"]) % self.population_size trial_number = self._trial_counter self._trial_counter += 1 trial_vec = self._mutate(target_idx) slot = len(self._generation["trials"]) self._generation["trials"].append(trial_vec) self._generation["trial_numbers"].append(trial_number) self._generation["target_indices"].append(target_idx) self._trial_map[trial_number] = slot def ask(self): """Return the next candidate from the current generation. If all prepared candidates have been issued, grow the generation by one more sample. """ if self._generation is None: self._sample_generation() if self._generation["next_index"] >= len(self._generation["trials"]): self._extend_generation() i = self._generation["next_index"] self._generation["next_index"] += 1 trial_number = self._generation["trial_numbers"][i] x = self._generation["trials"][i] return trial_number, convert_raw(self.params, x) def tell(self, trial_number, score): """Record a completed trial and perform selection if the generation is complete. For each trial vector, if it scores better than (or equal to) its target parent, it replaces the parent in the population. """ slot = self._trial_map.pop(trial_number) self._generation["scores"][slot] = score if len(self._generation["scores"]) != self._generation["next_index"]: return # selection: compare each trial against its target # (only iterate over issued slots, not all pre-sampled ones) for slot_i in range(self._generation["next_index"]): target_idx = self._generation["target_indices"][slot_i] trial_score = self._generation["scores"][slot_i] if trial_score <= self._scores[target_idx]: self._population[target_idx] = self._generation["trials"][ slot_i ] self._scores[target_idx] = trial_score # decay mutation factor self.mutation *= self.mutation_decay self.mutation = min( max(self.mutation, self.mutation_min), self.mutation_max ) self._generation = None class DEOptLib(HyperOptLib): """Hyper-optimization using differential evolution.""" def setup( self, methods, space, optimizer=None, population_size="auto", mutation=0.8, crossover=0.7, mutation_decay=1.0, mutation_min=0.1, mutation_max=1.5, method_exploration=1.0, method_temperature=1.0, exponential_param_power=None, seed=None, **kwargs, ): """Initialize DE optimizers for each contraction method. Parameters ---------- methods : list[str] The contraction methods to optimize over. space : dict[str, dict[str, dict]] The per-method hyperparameter search space. optimizer : HyperOptimizer, optional The parent optimizer. Used to size the initial population large enough for parallel pre-dispatch. population_size : int or "auto", optional The population size for each method-specific DE sampler. mutation : float, optional Differential weight (F). crossover : float, optional Crossover probability (CR). mutation_decay, mutation_min, mutation_max : float, optional Parameters controlling mutation scale over generations. method_exploration : float, optional Exploration strength for the LCB-based method chooser. method_temperature : float, optional Noise temperature for the LCB-based method chooser. exponential_param_power : float, optional Passed to the shared parameter mapping for ``FLOAT_EXP``. seed : None or int, optional Random seed. """ if population_size == "auto": max_ndim = max( num_params( build_params( space[m], exponential_param_power=exponential_param_power, ) ) for m in methods ) population_size = max( 8, max(1, getattr(optimizer, "pre_dispatch", 1)), 5 * max_ndim, ) self._method_chooser = LCBOptimizer( options=methods, exploration=method_exploration, temperature=method_temperature, seed=seed, ) self._optimizers = { method: HyperDESampler( space[method], seed=seed, population_size=population_size, mutation=mutation, crossover=crossover, mutation_decay=mutation_decay, mutation_min=mutation_min, mutation_max=mutation_max, exponential_param_power=exponential_param_power, ) for method in methods } def get_setting(self): """Choose a contraction method, then request its next setting.""" method = self._method_chooser.ask() params_token, params = self._optimizers[method].ask() return { "method": method, "params_token": params_token, "params": params, } def report_result(self, setting, trial, score): """Report a completed trial back to the method chooser and DE.""" self._method_chooser.tell(setting["method"], score) self._optimizers[setting["method"]].tell( setting["params_token"], score ) register_hyper_optlib("de", DEOptLib) register_hyper_optlib("diffev", DEOptLib) ================================================ FILE: cotengra/experimental/hyper_pe.py ================================================ """Hyper optimization using parallel evolution with ranked sigma assignment.""" import math from ..utils import get_rng from ._param_mapping import ( LCBOptimizer, build_params, convert_raw, num_params, ) from .hyper import HyperOptLib, register_hyper_optlib class HyperPESampler: """A parallel evolution optimizer operating in raw ``[-1, 1]`` space. Multiple workers each maintain their own solution. Perturbation scales (sigmas) are distributed across an evenly spaced range and reassigned by rank after each generation: the best-scoring worker gets the lowest sigma (exploit) and the worst gets the highest (explore). Parameters ---------- space : dict[str, dict] The search space for a single contraction method. seed : None or int, optional Random seed. population_size : int or "auto", optional The number of parallel workers. When ``"auto"`` it is chosen based on the mapped parameter dimension. sigma_min : float, optional The smallest perturbation scale (assigned to the best worker). sigma_max : float, optional The largest perturbation scale (assigned to the worst worker). elite_migrate_prob : float, optional Probability each generation of copying the best worker's solution to the worst worker's slot. differential_prob : float, optional Per-sample probability of using a differential perturbation (``x_best - x_rand``) instead of Gaussian noise. patience : int or None, optional If a worker has not improved for this many generations, re-randomize its solution. ``None`` or ``0`` disables. exponential_param_power : float, optional Passed through to the shared parameter mapping for ``FLOAT_EXP`` parameters. """ def __init__( self, space, seed=None, population_size=8, sigma_min=0.01, sigma_max=0.5, elite_migrate_prob=0.0, differential_prob=0.0, patience=None, exponential_param_power=None, ): self.rng = get_rng(seed) self.params = build_params( space, exponential_param_power=exponential_param_power ) self.ndim = num_params(self.params) if population_size == "auto": population_size = max(8, 4 * self.ndim) self.population_size = population_size self.sigma_min = sigma_min self.sigma_max = sigma_max self.elite_migrate_prob = elite_migrate_prob self.differential_prob = differential_prob self.patience = patience # initialize each worker's solution uniformly in [-1, 1] self._solutions = [ tuple(self.rng.uniform(-1.0, 1.0) for _ in range(self.ndim)) for _ in range(self.population_size) ] self._scores = [float("inf")] * self.population_size self._stagnation = [0] * self.population_size # evenly spaced sigmas, assigned by rank (best -> lowest) self._sigmas = self._make_sigmas() self._trial_counter = 0 self._generation = None self._trial_map = {} def _make_sigmas(self): """Create geometrically spaced sigmas from sigma_min to sigma_max.""" n = self.population_size if n == 1: return [math.sqrt(self.sigma_min * self.sigma_max)] log_min = math.log(self.sigma_min) log_max = math.log(self.sigma_max) return [ math.exp(log_min + i * (log_max - log_min) / (n - 1)) for i in range(n) ] def _sample_candidate(self, worker_idx, noise=None): """Perturb a worker's current solution with its assigned sigma.""" sigma = self._sigmas[worker_idx] sol = self._solutions[worker_idx] if noise is None: # possibly use differential perturbation if ( self.differential_prob > 0.0 and self.population_size >= 3 and self.rng.random() < self.differential_prob ): best_idx = min( range(self.population_size), key=lambda i: self._scores[i], ) others = [ j for j in range(self.population_size) if j != worker_idx and j != best_idx ] rand_idx = self.rng.choice(others) noise = [ self._solutions[best_idx][d] - self._solutions[rand_idx][d] for d in range(self.ndim) ] else: noise = [self.rng.gauss(0.0, 1.0) for _ in range(self.ndim)] x = [] for si, ni in zip(sol, noise): xi = si + sigma * ni x.append(min(max(xi, -1.0), 1.0)) return tuple(x) def _sample_generation(self): """Start a new generation with one trial per worker.""" self._generation = { "worker_indices": [], "xs": [], "trial_numbers": [], "scores": {}, "next_index": 0, } for i in range(self.population_size): self._extend_generation(i) def _extend_generation(self, worker_idx=None, noise=None): """Append one more trial to the current generation.""" if worker_idx is None: worker_idx = len(self._generation["xs"]) % self.population_size trial_number = self._trial_counter self._trial_counter += 1 slot = len(self._generation["xs"]) self._generation["worker_indices"].append(worker_idx) self._generation["xs"].append( self._sample_candidate(worker_idx, noise=noise) ) self._generation["trial_numbers"].append(trial_number) self._trial_map[trial_number] = slot def ask(self): """Return the next candidate from the current generation. If all prepared candidates have been issued, grow the generation by one more sample. """ if self._generation is None: self._sample_generation() if self._generation["next_index"] >= len(self._generation["xs"]): self._extend_generation() i = self._generation["next_index"] self._generation["next_index"] += 1 trial_number = self._generation["trial_numbers"][i] x = self._generation["xs"][i] return trial_number, convert_raw(self.params, x) def tell(self, trial_number, score): """Record a completed trial and update workers if the generation is complete. For each trial, if it scores better than (or equal to) its worker's current best, the worker adopts the new solution. Then sigmas are reassigned by rank: best worker gets lowest sigma, worst gets highest. """ slot = self._trial_map.pop(trial_number) self._generation["scores"][slot] = score if len(self._generation["scores"]) != self._generation["next_index"]: return # greedy update: adopt better solutions and track stagnation improved = set() for slot_i in range(self._generation["next_index"]): worker_idx = self._generation["worker_indices"][slot_i] trial_score = self._generation["scores"][slot_i] if trial_score <= self._scores[worker_idx]: self._solutions[worker_idx] = self._generation["xs"][slot_i] self._scores[worker_idx] = trial_score improved.add(worker_idx) for i in range(self.population_size): if i in improved: self._stagnation[i] = 0 else: self._stagnation[i] += 1 # stagnation restart if self.patience: for i in range(self.population_size): if self._stagnation[i] >= self.patience: self._solutions[i] = tuple( self.rng.uniform(-1.0, 1.0) for _ in range(self.ndim) ) self._scores[i] = float("inf") self._stagnation[i] = 0 # rank workers by score (best to worst) and reassign sigmas ranking = sorted( range(self.population_size), key=lambda i: self._scores[i], ) # elite migration if self.elite_migrate_prob > 0.0: if self.rng.random() < self.elite_migrate_prob: worst = ranking[-1] best = ranking[0] self._solutions[worst] = self._solutions[best] new_sigmas = [0.0] * self.population_size base_sigmas = self._make_sigmas() for rank, worker_idx in enumerate(ranking): new_sigmas[worker_idx] = base_sigmas[rank] self._sigmas = new_sigmas self._generation = None class PEOptLib(HyperOptLib): """Hyper-optimization using parallel evolution with ranked sigmas.""" def setup( self, methods, space, optimizer=None, population_size="auto", sigma_min=0.01, sigma_max=0.5, elite_migrate_prob=0.5, differential_prob=0.5, patience=8, method_exploration=1.0, method_temperature=1.0, exponential_param_power=None, seed=None, **kwargs, ): """Initialize PE optimizers for each contraction method. Parameters ---------- methods : list[str] The contraction methods to optimize over. space : dict[str, dict[str, dict]] The per-method hyperparameter search space. optimizer : HyperOptimizer, optional The parent optimizer. Used to size the initial population large enough for parallel pre-dispatch. population_size : int or "auto", optional The number of parallel workers for each method. sigma_min : float, optional Smallest perturbation scale (for the best-ranked worker). sigma_max : float, optional Largest perturbation scale (for the worst-ranked worker). elite_migrate_prob : float, optional Probability of copying best solution to worst worker. differential_prob : float, optional Per-sample probability of differential perturbation. patience : int or None, optional Generations without improvement before restart. method_exploration : float, optional Exploration strength for the LCB-based method chooser. method_temperature : float, optional Noise temperature for the LCB-based method chooser. exponential_param_power : float, optional Passed to the shared parameter mapping for ``FLOAT_EXP``. seed : None or int, optional Random seed. """ if population_size == "auto": max_ndim = max( num_params( build_params( space[m], exponential_param_power=exponential_param_power, ) ) for m in methods ) population_size = max( 8, max(1, getattr(optimizer, "pre_dispatch", 1)), 4 * max_ndim, ) self._method_chooser = LCBOptimizer( options=methods, exploration=method_exploration, temperature=method_temperature, seed=seed, ) self._optimizers = { method: HyperPESampler( space[method], seed=seed, population_size=population_size, sigma_min=sigma_min, sigma_max=sigma_max, elite_migrate_prob=elite_migrate_prob, differential_prob=differential_prob, patience=patience, exponential_param_power=exponential_param_power, ) for method in methods } def get_setting(self): """Choose a contraction method, then request its next setting.""" method = self._method_chooser.ask() params_token, params = self._optimizers[method].ask() return { "method": method, "params_token": params_token, "params": params, } def report_result(self, setting, trial, score): """Report a completed trial back to the method chooser and PE.""" self._method_chooser.tell(setting["method"], score) self._optimizers[setting["method"]].tell( setting["params_token"], score ) register_hyper_optlib("pe", PEOptLib) register_hyper_optlib("parallelev", PEOptLib) ================================================ FILE: cotengra/experimental/hyper_pymoo.py ================================================ """Hyper optimization using pymoo single-objective algorithms. This backend currently supports serial optimization only. Pymoo ask/tell algorithms operate on generations/batches rather than individual trials, so the integration buffers one full batch at a time and feeds it back when all batch members have been evaluated. """ from ._param_mapping import ( LCBOptimizer, build_params, convert_raw, num_params, ) from .hyper import HyperOptLib, register_hyper_optlib def _get_pymoo_algorithm(name): if name == "de": from pymoo.algorithms.soo.nonconvex.de import DE return DE if name == "ga": from pymoo.algorithms.soo.nonconvex.ga import GA return GA if name == "pso": from pymoo.algorithms.soo.nonconvex.pso import PSO return PSO if name == "brkga": from pymoo.algorithms.soo.nonconvex.brkga import BRKGA return BRKGA if name == "es": from pymoo.algorithms.soo.nonconvex.es import ES return ES if name == "sres": from pymoo.algorithms.soo.nonconvex.sres import SRES return SRES if name == "isres": from pymoo.algorithms.soo.nonconvex.isres import ISRES return ISRES if name == "nrbo": from pymoo.algorithms.soo.nonconvex.nrbo import NRBO return NRBO raise ValueError(f"Unknown pymoo sampler {name}.") class HyperPymooSampler: """Per-method ask/tell wrapper around a pymoo algorithm.""" def __init__( self, space, sampler="de", sampler_opts=None, exponential_param_power=None, seed=None, ): import numpy as np from pymoo.core.evaluator import Evaluator from pymoo.core.problem import Problem from pymoo.core.termination import NoTermination from pymoo.problems.static import StaticProblem self._np = np self._Evaluator = Evaluator self._StaticProblem = StaticProblem self.params = build_params( space, exponential_param_power=exponential_param_power ) self._ndim = num_params(self.params) self._problem = Problem( n_var=self._ndim, n_obj=1, n_constr=0, xl=np.full(self._ndim, -1.0), xu=np.full(self._ndim, 1.0), ) sampler_opts = {} if sampler_opts is None else dict(sampler_opts) Algorithm = _get_pymoo_algorithm(sampler) self.algorithm = Algorithm(**sampler_opts) self.algorithm.setup( self._problem, termination=NoTermination(), seed=seed, verbose=False, ) self._trial_counter = 0 self._active_batch = None def ask(self): if self._active_batch is None: pop = self.algorithm.ask() xs = pop.get("X") trial_numbers = tuple( range( self._trial_counter, self._trial_counter + len(xs), ) ) self._trial_counter += len(xs) settings = tuple(convert_raw(self.params, x.copy()) for x in xs) self._active_batch = { "pop": pop, "trial_numbers": trial_numbers, "settings": settings, "scores": {}, "next_index": 0, } i = self._active_batch["next_index"] self._active_batch["next_index"] += 1 return ( self._active_batch["trial_numbers"][i], self._active_batch["settings"][i], ) def tell(self, trial_number, score): batch = self._active_batch batch["scores"][trial_number] = score if len(batch["scores"]) != len(batch["trial_numbers"]): return f = self._np.asarray( [batch["scores"][t] for t in batch["trial_numbers"]], dtype=float, ).reshape(-1, 1) static = self._StaticProblem(self._problem, F=f) self._Evaluator().eval(static, batch["pop"]) self.algorithm.tell(infills=batch["pop"]) self._active_batch = None class PymooOptLib(HyperOptLib): """Hyper-optimization using pymoo algorithms with LCB method choice.""" def setup( self, methods, space, optimizer=None, sampler="de", sampler_opts=None, method_exploration=1.0, method_temperature=1.0, exponential_param_power=None, seed=None, **kwargs, ): if getattr(optimizer, "_pool", None) is not None: raise ValueError( "The 'pymoo' optlib currently only supports serial " "hyper-optimization (`parallel=False`)." ) self._method_chooser = LCBOptimizer( options=methods, exploration=method_exploration, temperature=method_temperature, seed=seed, ) self._optimizers = { method: HyperPymooSampler( space[method], sampler=sampler, sampler_opts=sampler_opts, exponential_param_power=exponential_param_power, seed=seed, ) for method in methods } def get_setting(self): method = self._method_chooser.ask() params_token, params = self._optimizers[method].ask() return { "method": method, "params_token": params_token, "params": params, } def report_result(self, setting, trial, score): method = setting["method"] self._method_chooser.tell(method, score) self._optimizers[method].tell(setting["params_token"], score) register_hyper_optlib("pymoo", PymooOptLib) ================================================ FILE: cotengra/experimental/hyper_scipy.py ================================================ """Hyper optimization using scipy gradient-free optimizers. Supported methods: ``differential_evolution``, ``dual_annealing``, ``direct``, ``shgo``. Since these optimizers use a callback-style objective, a background thread is used to invert the control flow into an ask/tell interface. Multiple workers are maintained per method to support parallel pre-dispatch (ask-ask-...-tell-tell-...). """ import queue import threading from ._param_mapping import ( LCBOptimizer, build_params, convert_raw, num_params, ) from .hyper import HyperOptLib, register_hyper_optlib _OPTIMIZER_NAMES = { "differential_evolution", "dual_annealing", "direct", "shgo", } class _StopOptimization(Exception): """Raised inside the objective to abort the scipy optimizer.""" class ScipyAskTell: """Ask/tell wrapper around a scipy global optimizer. The optimizer runs in a background thread. Each time it needs an objective evaluation it posts the candidate vector to ``_ask_q`` and blocks on ``_tell_q``. The caller drives progress by alternating ``ask()`` / ``tell()`` calls from the main thread. Parameters ---------- method : str One of the supported scipy optimizer names. bounds : list[tuple[float, float]] Bounds for every raw dimension. kwargs Forwarded to the underlying scipy optimizer. """ def __init__(self, method, bounds, **kwargs): self.method = method self.bounds = bounds self.kwargs = kwargs self._ask_q = queue.Queue() self._tell_q = queue.Queue() self._thread = None self._stop = threading.Event() self.done = False # ---- internal -------------------------------------------------------- def _get_optimizer_fn(self): from scipy import optimize return getattr(optimize, self.method) def _objective(self, x): if self._stop.is_set(): raise _StopOptimization self._ask_q.put(x) val = self._tell_q.get() if self._stop.is_set(): raise _StopOptimization return float(val) def _run(self): try: fn = self._get_optimizer_fn() fn(self._objective, self.bounds, **self.kwargs) except _StopOptimization: pass except Exception: pass finally: self.done = True # unblock any pending ask() self._ask_q.put(None) # ---- public ---------------------------------------------------------- def start(self): """Launch the optimizer in a background thread.""" self._thread = threading.Thread(target=self._run, daemon=True) self._thread.start() def ask(self): """Block until the optimizer requests an evaluation. Returns ------- x : ndarray or None The candidate vector, or ``None`` if the optimizer finished. """ x = self._ask_q.get() if self.done and x is None: return None return x def tell(self, score): """Provide the objective value back to the optimizer.""" self._tell_q.put(score) def stop(self): """Signal the background thread to stop and wait for it.""" self._stop.set() # unblock if the thread is waiting in _objective for a tell try: self._tell_q.put_nowait(float("inf")) except queue.Full: pass if self._thread is not None: self._thread.join(timeout=5.0) class HyperScipySampler: """Per-method optimizer that wraps a pool of ``ScipyAskTell`` workers with the ``Param``-based space mapping. Each ``ScipyAskTell`` worker is strictly serial (ask-tell-ask-tell), so to support parallel pre-dispatch (multiple ``ask`` calls before any ``tell``), we maintain a pool of workers. Each ``ask`` grabs a candidate from the next idle worker; each ``tell`` feeds the score back to the specific worker that produced that candidate. Parameters ---------- space : dict[str, dict] The search space for one method. method : str Which scipy optimizer to use. n_workers : int, optional Number of concurrent ``ScipyAskTell`` threads to run. exponential_param_power : float, optional Power for ``ParamFloatExp``. kwargs Extra keyword arguments forwarded to the scipy optimizer. """ def __init__( self, space, method="differential_evolution", n_workers=1, exponential_param_power=None, **kwargs, ): self.params = build_params( space, exponential_param_power=exponential_param_power ) self._ndim = num_params(self.params) self._method = method self._scipy_opts = kwargs self._n_workers = n_workers # trial bookkeeping self._trial_counter = 0 self._trial_to_worker = {} # worker pool: round-robin index for asks self._workers = [] self._worker_idx = 0 for _ in range(self._n_workers): self._workers.append(self._make_worker()) def _make_worker(self): """Create and start a fresh ``ScipyAskTell`` instance.""" w = ScipyAskTell( method=self._method, bounds=[(-1.0, 1.0)] * self._ndim, **self._scipy_opts, ) w.start() return w def _next_worker(self): """Pick the next worker in round-robin order, restarting any that have finished. """ for _ in range(self._n_workers): w = self._workers[self._worker_idx] self._worker_idx = (self._worker_idx + 1) % self._n_workers if w.done: # optimizer converged / exhausted – replace it w.stop() w = self._make_worker() # the index was already advanced, so store at previous prev = (self._worker_idx - 1) % self._n_workers self._workers[prev] = w return w # should never get here return self._workers[0] def ask(self): """Return ``(trial_number, params_dict)``. Picks the next idle worker (round-robin), blocking until it has a candidate ready. If a worker has converged, it is automatically restarted. """ w = self._next_worker() x = w.ask() if x is None: # worker finished between _next_worker check and ask prev = (self._worker_idx - 1) % self._n_workers w = self._make_worker() self._workers[prev] = w x = w.ask() trial_number = self._trial_counter self._trial_to_worker[trial_number] = w self._trial_counter += 1 return trial_number, convert_raw(self.params, x) def tell(self, trial_number, score): """Report a score back to the specific worker that produced this trial. """ w = self._trial_to_worker.pop(trial_number, None) if w is not None and not w.done: w.tell(score) def stop(self): """Stop all background threads.""" for w in self._workers: w.stop() class ScipyOptLib(HyperOptLib): """Hyper-optimization using scipy gradient-free optimizers with an LCB method selector. """ def setup( self, methods, space, optimizer=None, method="differential_evolution", method_exploration=1.0, method_temperature=1.0, exponential_param_power=None, **scipy_opts, ): """Initialize per-method scipy optimizers. Parameters ---------- methods : list[str] The contraction methods to optimize over. space : dict[str, dict[str, dict]] The search space. optimizer : HyperOptimizer, optional The parent optimizer instance. method : str, optional Which scipy global optimizer to use. One of ``'differential_evolution'``, ``'dual_annealing'``, ``'direct'``, ``'shgo'``. method_exploration : float, optional Exploration parameter for the LCB method selector. method_temperature : float, optional Temperature parameter for the LCB method selector. exponential_param_power : float, optional Power for ``ParamFloatExp``. scipy_opts Extra keyword arguments forwarded to the scipy optimizer. """ if method not in _OPTIMIZER_NAMES: raise ValueError( f"method must be one of {sorted(_OPTIMIZER_NAMES)}, " f"got {method!r}" ) n_workers = getattr(optimizer, "_num_workers", 1) # need at least as many workers per method as there are # parallel pre-dispatch slots, so that asks never block on a # worker waiting for its tell pre_dispatch = getattr(optimizer, "pre_dispatch", 1) n_workers = max(n_workers, pre_dispatch) self._method_chooser = LCBOptimizer( options=methods, exploration=method_exploration, temperature=method_temperature, ) self._optimizers = { m: HyperScipySampler( space[m], method=method, n_workers=n_workers, exponential_param_power=exponential_param_power, **scipy_opts, ) for m in methods } def get_setting(self): method = self._method_chooser.ask() trial_number, params = self._optimizers[method].ask() return { "method": method, "params_token": trial_number, "params": params, } def report_result(self, setting, trial, score): self._method_chooser.tell(setting["method"], score) self._optimizers[setting["method"]].tell( setting["params_token"], score ) def cleanup(self): """Stop all background optimizer threads.""" for sampler in self._optimizers.values(): sampler.stop() register_hyper_optlib("scipy", ScipyOptLib) ================================================ FILE: cotengra/experimental/hyper_smac.py ================================================ """Hyper parameter optimization using SMAC3. https://automl.github.io/SMAC3/latest/ """ from .hyper import HyperOptLib, register_hyper_optlib def build_config_space(method, space): """Build a SMAC ``ConfigurationSpace`` from a cotengra space dict. Parameters ---------- method : str The method name (used as a prefix to avoid name collisions when multiple methods share the same parameter name). space : dict[str, dict] The search space for a single method. Returns ------- cs : ConfigurationSpace """ from ConfigSpace import ( CategoricalHyperparameter, UniformFloatHyperparameter, UniformIntegerHyperparameter, ) from smac.configspace import ConfigurationSpace cs = ConfigurationSpace() for name, param in space.items(): ptype = param["type"] if ptype == "FLOAT": hp = UniformFloatHyperparameter( name, lower=param["min"], upper=param["max"] ) elif ptype == "FLOAT_EXP": hp = UniformFloatHyperparameter( name, lower=param["min"], upper=param["max"], log=True ) elif ptype == "INT": hp = UniformIntegerHyperparameter( name, lower=param["min"], upper=param["max"] ) elif ptype == "STRING": hp = CategoricalHyperparameter(name, choices=param["options"]) elif ptype == "BOOL": hp = CategoricalHyperparameter(name, choices=[False, True]) else: raise ValueError(f"Unknown parameter type: {ptype!r}") cs.add_hyperparameter(hp) return cs def config_to_params(config): """Convert a SMAC ``Configuration`` to a plain dict of parameters.""" return dict(config) class SMACOptLib(HyperOptLib): """Hyper-optimization using SMAC3 with per-method facades and a Lower Confidence Bound method selector. """ def setup( self, methods, space, optimizer=None, facade="BlackBoxFacade", n_trials=10000, seed=0, method_exploration=1.0, method_temperature=1.0, **facade_opts, ): from smac import BlackBoxFacade, HyperparameterOptimizationFacade from smac.scenario import Scenario from ._param_mapping import LCBOptimizer self._method_chooser = LCBOptimizer( options=methods, exploration=method_exploration, temperature=method_temperature, ) if isinstance(facade, str): facade_cls = { "BlackBoxFacade": BlackBoxFacade, "HyperparameterOptimizationFacade": HyperparameterOptimizationFacade, }[facade] else: facade_cls = facade self._facades = {} self._trial_infos = {} for method in methods: cs = build_config_space(method, space[method]) scenario = Scenario( cs, n_trials=n_trials, seed=seed, deterministic=True, ) self._facades[method] = facade_cls( scenario, target_function=lambda cfg, seed: 0.0, overwrite=True, logging_level=False, **facade_opts, ) def get_setting(self): method = self._method_chooser.ask() smac = self._facades[method] info = smac.ask() trial_key = (method, id(info)) self._trial_infos[trial_key] = info return { "method": method, "trial_key": trial_key, "params": config_to_params(info.config), } def report_result(self, setting, trial, score): from smac.runhistory import TrialValue method = setting["method"] trial_key = setting["trial_key"] info = self._trial_infos.pop(trial_key) self._method_chooser.tell(method, score) value = TrialValue(cost=score) self._facades[method].tell(info, value) register_hyper_optlib("smac", SMACOptLib) ================================================ FILE: cotengra/experimental/multi.ipynb ================================================ { "cells": [ { "cell_type": "code", "execution_count": 1, "id": "9576af0f-adc3-44e4-88d0-7a57dc97a1d5", "metadata": {}, "outputs": [], "source": [ "%config InlineBackend.figure_formats = ['svg']\n", "import math # noqa\n", "import random # noqa\n", "import itertools # noqa\n", "import functools # noqa\n", "import collections # noqa\n", "import tqdm # noqa\n", "import numpy as np # noqa\n", "import matplotlib as mpl # noqa\n", "import matplotlib.pyplot as plt # noqa\n", "import quimb as qu # noqa\n", "import xyzpy as xyz # noqa\n", "import autoray as ar # noqa\n", "import cotengra as ctg # noqa\n", "import quimb.tensor as qtn # noqa" ] }, { "cell_type": "code", "execution_count": 2, "id": "881a2afe-11e9-43f4-a62f-0bda257b7750", "metadata": {}, "outputs": [], "source": [ "tn = qtn.PEPS.rand(4, 5, 4)\n", "# tn = qtn.MPS_rand_state(20, 7)\n", "\n", "# tn = qtn.TN2D_rand(32, 32, D=2)\n", "\n", "\n", "inputs, output, size_dict = tn.get_inputs_output_size_dict()\n", "symbol_map = tn.get_symbol_map()\n", "\n", "rng = ctg.utils.get_rng(42)\n", "\n", "M = 200\n", "\n", "sliced_inds = output\n", "\n", "configs = [{ix: rng.choice([0, 1]) for ix in output} for _ in range(M)]\n", "\n", "tree = ctg.array_contract_tree(\n", " inputs,\n", " output,\n", " size_dict,\n", ")" ] }, { "cell_type": "code", "execution_count": 11, "id": "46dd3357-18b0-4a80-afd5-935f6a4029f9", "metadata": {}, "outputs": [], "source": [ "# inputs, output, shapes, size_dict = ctg.utils.randreg_equation(100, 4, seed=42)\n", "inputs, output, shapes, size_dict = ctg.utils.lattice_equation(\n", " [28, 28], d_max=2\n", ")\n", "\n", "opt = ctg.HyperOptimizer(\n", " simulated_annealing_opts=dict(target_size=2**24),\n", " max_repeats=8,\n", " progbar=True,\n", ")" ] }, { "cell_type": "code", "execution_count": 12, "id": "92b7e150-cffd-40d7-ab26-7cf34af79476", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "F=14.05 C=14.72 S=24 P=25.02 $=8192: 100%|██████████| 16/16 [01:56<00:00, 7.31s/it] \n" ] } ], "source": [ "tree = opt.search(inputs, output, size_dict)" ] }, { "cell_type": "code", "execution_count": 13, "id": "d47c757e-ecb8-43c8-91a7-d464cb146353", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "8192" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sliced_inds = tree.sliced_inds\n", "configs = [\n", " dict(zip(sliced_inds, x))\n", " for x in itertools.product(*[range(size_dict[i]) for i in sliced_inds])\n", "]\n", "len(configs)" ] }, { "cell_type": "code", "execution_count": 14, "id": "771de335-5945-4909-902f-0f77b13d6c7e", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1.573196922320367" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tree.contraction_cost() / tree.unslice_all().contraction_cost()" ] }, { "cell_type": "code", "execution_count": 15, "id": "b020426e-19a8-4700-ab4a-80dc8d714680", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "24.0" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tree.max_size(log=2)" ] }, { "cell_type": "code", "execution_count": 3, "id": "c3802312-f19a-481b-9b17-371c28b49d37", "metadata": {}, "outputs": [], "source": [ "from cotengra.core import (\n", " ContractionTree,\n", " get_score_fn,\n", ")\n", "from cotengra.scoring import Objective\n", "\n", "\n", "class MultiObjective(Objective):\n", " __slots__ = (\"num_configs\",)\n", "\n", " def __init__(self, num_configs):\n", " self.num_configs = num_configs\n", "\n", " def compute_mult(self, dims):\n", " raise NotImplementedError\n", "\n", " def estimate_node_mult(self, tree, node):\n", " return self.compute_mult(\n", " [tree.size_dict[ix] for ix in tree.get_node_var_inds(node)]\n", " )\n", "\n", " def estimate_node_cache_mult(self, tree, node, sliced_ind_ordering):\n", " node_var_inds = tree.get_node_var_inds(node)\n", "\n", " # indices which are the first 'k' in the sliced ordering\n", " non_heavy_inds = [\n", " ix\n", " for ix in tree.get_node_var_inds(node)\n", " if ix not in sliced_ind_ordering[: len(node_var_inds)]\n", " ]\n", "\n", " # each of these cycles 'out of sync' and thus must be kept\n", " return self.compute_mult([tree.size_dict[ix] for ix in non_heavy_inds])\n", "\n", "\n", "class MultiObjectiveDense(MultiObjective):\n", " \"\"\"Number of intermediate configurations is expected to scale as if all\n", " configurations are present.\n", " \"\"\"\n", "\n", " __slots__ = (\"num_configs\",)\n", "\n", " def compute_mult(self, dims):\n", " return math.prod(dims)\n", "\n", "\n", "def expected_coupons(num_sub, num_total):\n", " \"\"\"If we draw a random 'coupon` which can take `num_sub` different values\n", " `num_total` times, how many unique coupons will we expect?\n", " \"\"\"\n", " # return min(num_sub, num_total)\n", " return num_sub * (1 - (1 - 1 / num_sub) ** num_total)\n", "\n", "\n", "class MultiObjectiveUniform(MultiObjective):\n", " \"\"\"Number of intermediate configurations is expected to scale as if all\n", " configurations are randomly draw from a uniform distribution.\n", " \"\"\"\n", "\n", " __slots__ = (\"num_configs\",)\n", "\n", " def compute_mult(self, dims):\n", " return expected_coupons(math.prod(dims), self.num_configs)\n", "\n", "\n", "class MultiObjectiveLinear(MultiObjective):\n", " \"\"\"Number of intermediate configurations is expected to scale linearly with\n", " respect to number of variable indices (e.g. VMC like 'locally connected'\n", " configurations).\n", " \"\"\"\n", "\n", " __slots__ = (\"num_configs\", \"coeff\")\n", "\n", " def __init__(self, num_configs, coeff=1):\n", " self.coeff = coeff\n", " super().__init__(num_configs=num_configs)\n", "\n", " def compute_mult(self, dims):\n", " return min(self.coeff * len(dims), self.num_configs)" ] }, { "cell_type": "code", "execution_count": 18, "id": "2a6d0a84-e0a0-4e4a-a92b-fd70e89ab75b", "metadata": {}, "outputs": [], "source": [ "M = len(configs)\n", "# objective = MultiObjectiveUniform(num_configs=M)\n", "# objective = MultiObjectiveDense(num_configs=M)\n", "objective = MultiObjectiveLinear(num_configs=M, coeff=M / len(sliced_inds))\n", "\n", "mtree = ctg.ContractionTreeMulti.from_path(\n", " inputs,\n", " output,\n", " size_dict,\n", " sliced_inds=sliced_inds,\n", " objective=objective,\n", " path=tree.get_path(),\n", ")\n", "mtree.reorder_contractions_for_peak_est()\n", "mtree.reorder_sliced_inds()" ] }, { "cell_type": "code", "execution_count": 19, "id": "0a89762d-f34b-4c42-b187-c291be640341", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "mtree.multiplicity" ] }, { "cell_type": "code", "execution_count": 20, "id": "8482cdf3-7f5f-423d-8bff-51188fd4272e", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'flops': 5273600.0, 'write': 6913, 'size': 1024}" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "mtree.contract_stats()" ] }, { "cell_type": "code", "execution_count": 21, "id": "2b380e14-f8ab-4e18-b83e-3c6177790856", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "8.5302276561314" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "math.log10(339021824)" ] }, { "cell_type": "code", "execution_count": 22, "id": "d7d99d38-bf07-40f4-9230-9893ad0fd939", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "4.920123326290724" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "math.log10(\n", " sum(\n", " ContractionTree.get_flops(mtree, node)\n", " for node, _, _ in mtree.descend()\n", " )\n", ")" ] }, { "cell_type": "code", "execution_count": 23, "id": "f342e882-ab08-4707-86a7-ad93bfa8ab2a", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "6.722107185681003" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "math.log10(sum(mtree.get_flops(node) for node, _, _ in mtree.descend()))" ] }, { "cell_type": "code", "execution_count": 24, "id": "38609b23-ef7c-44eb-b382-977f79d98d8c", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "6.722107185681002" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "mtree.contraction_cost(log=10)" ] }, { "cell_type": "code", "execution_count": 25, "id": "bb422dce-0da9-4cc0-80c0-02657691d71c", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'flops': 6203392, 'write': 248008, 'size': 1024, 'peak': 111360}" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "stats = mtree.exact_multi_stats(configs)\n", "stats" ] }, { "cell_type": "code", "execution_count": 12, "id": "84a0c184-6e73-4a39-88c3-5b0c8c7edafa", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "6.792629225636649" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "math.log10(stats[\"flops\"])" ] }, { "cell_type": "code", "execution_count": 16, "id": "8449c4a8-4e1c-43dd-b614-7dba4b28e2af", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "16.98299357469431" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "mtree.peak_size(log=2)" ] }, { "cell_type": "code", "execution_count": 17, "id": "d32c40a1-19c3-4f62-9b38-aa3d067eb838", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "16.764871590736092" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "math.log2(stats[\"peak\"])" ] }, { "cell_type": "code", "execution_count": 19, "id": "7fd0ac7d-ad07-4654-8fbc-278e9f3d07d3", "metadata": {}, "outputs": [], "source": [ "from cotengra.pathfinders.path_simulated_annealing import (\n", " _describe_tree,\n", " _slice_tree_basic,\n", " _slice_tree_drift,\n", " _slice_tree_reslice,\n", " get_rng,\n", " linspace_generator,\n", ")\n", "\n", "\n", "def compute_contracted_info(\n", " legsa,\n", " legsb,\n", " appearances,\n", " size_dict,\n", " var_inds_a,\n", " var_inds_b,\n", "):\n", " \"\"\"Compute the contracted legs, cost and size of a pair of legs.\n", "\n", " Parameters\n", " ----------\n", " legsa : dict[str, int]\n", " The legs of the first tensor.\n", " legsb : dict[str, int]\n", " The legs of the second tensor.\n", " appearances : dict[str, int]\n", " The total number of appearances of each index in the contraction.\n", " size_dict : dict[str, int]\n", " The size of each index.\n", "\n", " Returns\n", " -------\n", " legsab : dict[str, int]\n", " The contracted legs.\n", " cost : int\n", " The cost of the contraction.\n", " size : int\n", " The size of the resulting tensor.\n", " \"\"\"\n", " legsab = {}\n", " cost = 1\n", " size = 1\n", "\n", " # handle all left indices\n", " for ix, ix_count in legsa.items():\n", " d = size_dict[ix]\n", " # all involved indices contribute to cost\n", " cost *= d\n", " if ix in legsb:\n", " ix_count += legsb[ix]\n", " if ix_count < appearances[ix]:\n", " # index appears on output\n", " legsab[ix] = ix_count\n", " # and so contributes to size\n", " size *= d\n", "\n", " # now handle right indices that we haven't seen yet\n", " for ix, ix_count in legsb.items():\n", " if ix not in legsa:\n", " d = size_dict[ix]\n", " cost *= d\n", " if ix_count < appearances[ix]:\n", " legsab[ix] = ix_count\n", " size *= d\n", "\n", " return legsab, cost, size, var_inds_a | var_inds_b\n", "\n", "\n", "def simulated_anneal_tree(\n", " tree,\n", " tfinal=0.05,\n", " tstart=2,\n", " tsteps=50,\n", " numiter=50,\n", " minimize=None,\n", " target_size=None,\n", " target_size_initial=None,\n", " slice_mode=\"basic\",\n", " seed=None,\n", " progbar=False,\n", " inplace=False,\n", "):\n", " \"\"\"Perform a simulated annealing optimization of this contraction\n", " tree, based on \"Multi-Tensor Contraction for XEB Verification of\n", " Quantum Circuits\" by Gleb Kalachev, Pavel Panteleev, Man-Hong Yung\n", " (arXiv:2108.05665), and the \"treesa\" implementation in\n", " OMEinsumContractionOrders.jl by Jin-Guo Liu and Pan Zhang.\n", "\n", " Parameters\n", " ----------\n", " tfinal : float, optional\n", " The final temperature.\n", " tstart : float, optional\n", " The starting temperature.\n", " tsteps : int, optional\n", " The number of temperature steps.\n", " numiter : int, optional\n", " The number of sweeps at each temperature step.\n", " minimize : {'flops', 'combo', 'write', 'size', ...}, optional\n", " The objective function to minimize.\n", " target_size : int, optional\n", " The target size to slice the contraction to. A schedule is used to\n", " reach this only at the final temperature step.\n", " target_size_initial : int, optional\n", " The initial target size to use in the slicing schedule. If None, then\n", " the current size is used.\n", " slice_mode : {'basic', 'reslice', 'drift'}, optional\n", " The mode for slicing the contraction tree within each annealing\n", " iteration. 'basic' always unslices a random index and then slices to\n", " the target size. 'reslice' unslices all indices and then slices to the\n", " target size. 'drift' unslices a random index with probability 1/4 and\n", " slices to the target size with probability 3/4. It is therefore not\n", " guaranteed to reach the target size, but may be more explorative for\n", " long annealing schedules.\n", " seed : int, optional\n", " A random seed.\n", " progbar : bool, optional\n", " Whether to show live progress.\n", " inplace : bool, optional\n", " Whether to perform the optimization inplace.\n", "\n", " Returns\n", " -------\n", " ContractionTree\n", " \"\"\"\n", "\n", " tree = tree if inplace else tree.copy()\n", " # ensure stats tracking is on\n", " tree.contract_stats()\n", "\n", " if minimize is None:\n", " minimize = tree.get_default_objective()\n", " scorer = get_score_fn(minimize)\n", " rng = get_rng(seed)\n", "\n", " # create a schedule for annealing temperatures\n", " temps = linspace_generator(tstart, tfinal, tsteps, log=True)\n", "\n", " if target_size is not None:\n", " # create a schedule for slicing target sizes\n", " if target_size_initial is None:\n", " # start with the current size\n", " current_size = max(tree.contraction_width(log=None), target_size)\n", " else:\n", " current_size = max(target_size_initial, target_size)\n", "\n", " target_sizes = linspace_generator(\n", " current_size,\n", " target_size,\n", " tsteps,\n", " log=True,\n", " )\n", " _slice_tree = {\n", " \"basic\": _slice_tree_basic,\n", " \"reslice\": _slice_tree_reslice,\n", " \"drift\": _slice_tree_drift,\n", " }[slice_mode]\n", " else:\n", " target_sizes = itertools.repeat(None)\n", "\n", " def _slice_tree(tree, current_target_size, rng):\n", " pass\n", "\n", " if progbar:\n", " import tqdm\n", "\n", " pbar = tqdm.tqdm(total=tsteps)\n", " pbar.set_description(_describe_tree(tree))\n", "\n", " for temp in temps:\n", " # handle slicing\n", " _slice_tree(tree, next(target_sizes), rng)\n", "\n", " for _ in range(numiter):\n", " candidates = [tree.root]\n", "\n", " while candidates:\n", " p = candidates.pop(0)\n", " l, r = tree.children[p]\n", "\n", " # check which local moves are possible\n", " if len(l) == 1:\n", " if len(r) == 1:\n", " # both are leaves\n", " continue\n", " else:\n", " # left is leaf\n", " rule = rng.randint(2, 3)\n", " elif len(r) == 1:\n", " # right is leaf\n", " rule = rng.randint(0, 1)\n", " else:\n", " # neither are leaves\n", " rule = rng.randint(0, 3)\n", "\n", " if rule < 2:\n", " # ((AB)C)\n", " x, c = l, r\n", " a, b = tree.children[x]\n", " if rule == 0:\n", " # -> ((AC)B)\n", " new_order = [a, c, b]\n", " else:\n", " # -> (A(BC))\n", " new_order = [b, c, a]\n", " else:\n", " # (A(BC))\n", " a, x = l, r\n", " b, c = tree.children[x]\n", " if rule == 2:\n", " # -> (B(AC))\n", " new_order = [a, c, b]\n", " else:\n", " # -> (C(AB))\n", " new_order = [a, b, c]\n", "\n", " current_score = math.log2(\n", " tree.get_flops(p) + tree.get_flops(x)\n", " )\n", "\n", " # current_score = scorer.score_local(\n", " # flops=[tree.get_flops(p), tree.get_flops(x)],\n", " # size=[tree.get_size(p), tree.get_size(x)],\n", " # )\n", "\n", " # legs0 = tree.get_legs(new_order[0])\n", " # legs1 = tree.get_legs(new_order[1])\n", " # if any(ix0 in legs1 for ix0 in legs0):\n", "\n", " # compute new intermediate\n", " new_legs0, new_cost0, new_size0, new_var_inds0 = (\n", " compute_contracted_info(\n", " tree.get_legs(new_order[0]),\n", " tree.get_legs(new_order[1]),\n", " tree.appearances,\n", " tree.size_dict,\n", " tree.get_node_var_inds(new_order[0]),\n", " tree.get_node_var_inds(new_order[1]),\n", " )\n", " )\n", "\n", " new_mult_cost0 = new_cost0 * scorer.estimate_mult(\n", " [tree.size_dict[ix] for ix in new_var_inds0]\n", " )\n", "\n", " # compute new parent costs\n", " new_legs1, new_cost1, new_size1, new_var_inds1 = (\n", " compute_contracted_info(\n", " new_legs0,\n", " tree.get_legs(new_order[2]),\n", " tree.appearances,\n", " tree.size_dict,\n", " new_var_inds0,\n", " tree.get_node_var_inds(new_order[2]),\n", " )\n", " )\n", "\n", " new_mult_cost1 = new_cost1 * scorer.estimate_mult(\n", " [tree.size_dict[ix] for ix in new_var_inds1]\n", " )\n", "\n", " proposed_score = math.log2(new_mult_cost0 + new_mult_cost1)\n", "\n", " # proposed_score = scorer.score_local(\n", " # flops=[new_cost0, new_cost1],\n", " # size=[new_size0, new_size1],\n", " # )\n", "\n", " dE = proposed_score - current_score\n", " accept = (dE <= 0) or (math.log(rng.random()) < -dE / temp)\n", "\n", " if accept:\n", " tree._remove_node(p)\n", " tree._remove_node(x)\n", "\n", " tree.contract_nodes_pair(\n", " tree.contract_nodes_pair(\n", " new_order[0],\n", " new_order[1],\n", " legs=new_legs0,\n", " cost=new_cost0,\n", " size=new_size0,\n", " ),\n", " new_order[2],\n", " legs=new_legs1,\n", " cost=new_cost1,\n", " size=new_size1,\n", " )\n", "\n", " if progbar:\n", " pbar.set_description(\n", " f\"T: {temp:.2e} \" + _describe_tree(tree),\n", " refresh=False,\n", " )\n", "\n", " # check which children to recurse into\n", " l, r = tree.children[p]\n", " if len(l) > 2:\n", " candidates.append(l)\n", " if len(r) > 2:\n", " candidates.append(r)\n", "\n", " if progbar:\n", " pbar.update()\n", "\n", " return tree" ] }, { "cell_type": "code", "execution_count": 32, "id": "d61c20c0-e3a4-489a-ad78-4b9e2097bc69", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "T: 5.00e-02 F=6.708 C=6.744 S=10 P=11.74 $=1: 100%|██████████| 50/50 [00:00<00:00, 55.26it/s]\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "simulated_anneal_tree(mtree, inplace=True, progbar=True)" ] }, { "cell_type": "code", "execution_count": 33, "id": "0edc1201-8e64-4023-982f-6b5df8a28a4e", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'flops': 7598080, 'write': 475336, 'size': 1024, 'peak': 61953}" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "stats = mtree.exact_multi_stats(configs)\n", "stats" ] }, { "cell_type": "code", "execution_count": 34, "id": "8b3ce36c-f79d-4304-b585-40e049ab3915", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "6.880703861918839" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "math.log10(stats[\"flops\"])" ] }, { "cell_type": "code", "execution_count": 7, "id": "dc812dca-b634-490b-9db9-9fb1e63f46b1", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "MultiObjectiveLinear(num_configs=200, coeff=2.0)" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "mtree.get_default_objective()" ] }, { "cell_type": "code", "execution_count": 10, "id": "61d8fa34-d7da-44ab-bb61-e613c4b62b98", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.3460989920591954" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "mtree.estimate_multi_total_flops() / (ContractionTree.total_flops(mtree) * M)" ] }, { "cell_type": "code", "execution_count": 12, "id": "9f2d113c-44fd-43a1-bc3c-b26739687042", "metadata": {}, "outputs": [], "source": [ "configs.sort(key=lambda c: tuple(c[ix] for ix in sliced_ind_ordering))" ] }, { "cell_type": "code", "execution_count": 126, "id": "cd241688-eda3-4d53-9b4b-cd2712ecf6e3", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "3.920360304532837e-21" ] }, "execution_count": 126, "metadata": {}, "output_type": "execute_result" } ], "source": [ "stats[\"flops\"] / tree.total_flops()" ] }, { "cell_type": "code", "execution_count": 127, "id": "56abeb3e-a518-4faa-a7f2-087e5cb111c7", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "3.920360304532837e-21" ] }, "execution_count": 127, "metadata": {}, "output_type": "execute_result" } ], "source": [ "stats[\"flops\"] / tree.unslice_all().total_flops()" ] }, { "cell_type": "code", "execution_count": 128, "id": "d5f5ce47-0408-463b-b4a6-d7980efde2d7", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "104.0" ] }, "execution_count": 128, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tree.unslice_all().peak_size(log=2)" ] }, { "cell_type": "code", "execution_count": 129, "id": "611f63a0-3f6b-448e-98ba-b0177ace9a27", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "28.0" ] }, "execution_count": 129, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ContractionTree.max_size(mtree, log=2)" ] }, { "cell_type": "code", "execution_count": 130, "id": "67ddde83-1531-4a60-af64-2ff03add40a0", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "29.067312900309663" ] }, "execution_count": 130, "metadata": {}, "output_type": "execute_result" } ], "source": [ "math.log2(stats[\"peak\"])" ] }, { "cell_type": "code", "execution_count": 120, "id": "1d32e5ae-9583-4ffe-a2ed-a9116e188920", "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "" ], "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "data": { "text/plain": [ "(
, )" ] }, "execution_count": 120, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tree.plot_circuit()" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3" } }, "nbformat": 4, "nbformat_minor": 2 } ================================================ FILE: cotengra/experimental/path_compressed_branchbound.py ================================================ """Compressed contraction path finding using branch and bound.""" import collections import heapq import itertools import math from time import sleep from ..core import ContractionTreeCompressed, get_hypergraph from ..pathfinders.path_basic import ssa_to_linear from ..scoring import get_score_fn class CompressedExhaustive: """Exhaustively search all possible contraction orders for a given compressed bond dimension, using several forms of pruning and local hueristics to accelerate the search. Parameters ---------- chi : int The max bond dimension of the compressed hypergraph. max_nodes : int, optional Set the maximum number of contraction steps to consider. max_time : float, optional Set the maximum time to spend on the search. local_score : callable, optional A function that assigns a score to a potential contraction, with a lower score giving more priority to explore that contraction earlier. It should have signature:: local_score(step : int, tracker: CompressedStatsTracker) -> float where ``step`` is the number of steps so far, ``tracker`` is a `CompressedStatsTracker` object that tracks various properties like flops and peak size. exploration_power : float, optional If not ``0.0``, the inverse power to which the step is raised in the default local score function. Higher values favor exploring more promising branches early on - at the cost of increased memory. Ignored if ``local_score`` is supplied. best_score : float, optional Manually specify an upper bound for best score found so far. progbar : bool, optional If ``True``, display a progress bar. """ def __init__( self, minimize, max_nodes=float("inf"), max_time=None, local_score=None, exploration_power=0.0, best_score=None, progbar=False, ): if isinstance(minimize, str) and "compressed" not in minimize: minimize = minimize + "-compressed" self.minimize = get_score_fn(minimize) self.chi = self.minimize.chi self.compress_late = self.minimize.compress_late if best_score is None: self.best_score = float("inf") else: self.best_score = abs(best_score) self.best_ssa_path = None self.counter = self.queue = self.cands = self.seen = None self.max_nodes = max_nodes self.max_time = max_time self.exploration_power = exploration_power self.allow = None if local_score is None: if exploration_power <= 0: def local_score(step, tracker): """Default ordering is depth first greedy search based on memory removed. """ return -step, tracker.size_change else: def local_score(step, tracker): """Use the actual score to order search, but modified by how 'complete' the contraction is to favor finishing. """ return tracker.score / (step + 1) ** ( 1 / self.exploration_power ) self.local_score = local_score self.progbar = progbar def setup(self, inputs, output, size_dict): """Set-up the optimizer with a specific contraction.""" if self.counter is None: hg = get_hypergraph( inputs, output, size_dict, accel=False, ) # maps node integer to subgraph tree_map = {i: frozenset([i]) for i in hg.nodes} # keeps track of scores on the fly tracker0 = self.minimize.get_compressed_stats_tracker(hg) ssa_path0 = () # the actual queue is a heap so need to reference candidates by int self.counter = itertools.count() c = next(self.counter) # our initial search space is the full graph self.root = (hg, tree_map, ssa_path0, tracker0) self.cands = {c: self.root} self.queue = [(self.local_score(0, tracker0), c)] self.seen = {} self.priority_queue = [] def expand_node( self, i, j, hg, tree_map, ssa_path, tracker, high_priority=False ): """Given a current contraction node, expand it by contracting nodes ``i`` and ``j``. Parameters ---------- i, j : int The nodes to contract. hg : Hypergraph The hypergraph to contract. ssa_path : list The contraction path so far. tracker : CompressedStatsTracker Scoring object that tracks costs of current compressed contraction. high_priority : bool, optional If True, the contraction will be assessed before any other normal contractions. Returns ------- int or None The contraction index, or None if the contraction is guaranteed to be worse than another contraction. """ ti = tree_map[i] tj = tree_map[j] tij = ti | tj if (self.allow is not None) and (tij not in self.allow): # search is restricted to a subset of pairs excluding tij return # fork this node hg = hg.copy() tracker = tracker.copy() # simulate a contraction step while tracking costs tracker.update_pre_step() if self.compress_late: tracker.update_pre_compress(hg, i, j) # compress late - just before contraction hg.compress(self.chi, hg.get_node(i) + hg.get_node(j)) tracker.update_post_compress(hg, i, j) tracker.update_pre_contract(hg, i, j) ij = hg.contract(i, j) tracker.update_post_contract(hg, ij) if not self.compress_late: tracker.update_pre_compress(hg, ij) # compress early - immediately after contraction hg.compress(self.chi, hg.get_node(ij)) tracker.update_post_compress(hg, ij) tracker.update_post_step() if tracker.score >= self.best_score: # already worse than best score seen -> drop return tree_map_next = tree_map.copy() del tree_map_next[i] del tree_map_next[j] tree_map_next[ij] = tij # uniquely identify partially contracted graph graph_key = hash(frozenset(tree_map_next.values())) if tracker.score >= self.seen.get(graph_key, float("inf")): # already reached this exact point with an equal or better score return # record new or better score self.seen[graph_key] = tracker.score # construct the next candidate and add to queue new_ssa_path = ssa_path + ((j, i) if j < i else (i, j),) c = next(self.counter) self.cands[c] = ( hg, tree_map_next, new_ssa_path, tracker, ) if not high_priority: # this is used to determine priority within the queue step = len(new_ssa_path) priority = self.local_score(step, tracker) heapq.heappush(self.queue, (priority, c)) else: self.priority_queue.append(c) return c def _update_progbar(self, pbar, c): if self.progbar: pbar.update() pbar.set_description( f"[{c}] cands:{len(self.cands)} best:{self.best_score:.2f}", refresh=False, ) def run(self, inputs, output, size_dict): self.setup(inputs, output, size_dict) if self.progbar: import tqdm pbar = tqdm.tqdm() else: pbar = None if self.max_time is not None: import time time0 = time.time() def should_stop(c): return (time.time() - time0 >= self.max_time) or ( self.best_ssa_path and c and (c > self.max_nodes) ) else: def should_stop(c): return self.best_ssa_path and c and (c > self.max_nodes) def edge_sort(edge_nodes): edge, _ = edge_nodes return edge # return sum(hg.node_size(n) for n in nodes), edge try: while self.cands: if self.priority_queue: c = self.priority_queue.pop() else: # get candidate with the best rank _, c = heapq.heappop(self.queue) hg, tree_map, ssa_path, tracker = self.cands.pop(c) # check if full contraction if hg.get_num_nodes() == 1: # ignore unless beats best so far if tracker.score < self.best_score: self.best_score = tracker.score self.best_ssa_path = ssa_path self._update_progbar(pbar, c) continue # check next candidate contractions for _, nodes in sorted(hg.edges.items(), key=edge_sort): if len(nodes) != 2: continue c = self.expand_node( *nodes, hg, tree_map, ssa_path, tracker ) if should_stop(c): break except KeyboardInterrupt: pass finally: if self.progbar: pbar.close() @property def ssa_path(self): return self.best_ssa_path @property def path(self): return ssa_to_linear(self.ssa_path) def explore_path(self, path, high_priority=True, restrict=False): """Explicitly supply a path to be added to the search space, by default it is added to the priority queue and will be processed first. Parameters ---------- path : sequence[tuple[int]] A contraction path to explore. high_priority : bool, optional If ``True``, the path will be assessed before anything else, regardless of cost - the default. restrict : bool, optional If ``True``, only allow contractions in this path, so only the order will be optimized. """ # convert to ssa_path hg, tree_map, ssa_path, tracker = self.root if restrict and self.allow is None: self.allow = set() ssas = list(range(hg.get_num_nodes())) ssa = ssas[-1] for pi, pj in path: i, j = map(ssas.pop, sorted((pi, pj), reverse=True)) ssa += 1 ij = ssa if restrict: self.allow.add(tree_map[i] | tree_map[j]) ssas.append(ij) c = self.expand_node( i, j, hg, tree_map, ssa_path, tracker, high_priority=high_priority, ) if c is None: return # descend to the next contraction in the path hg, tree_map, ssa_path, tracker = self.cands[c] def search(self, inputs, output, size_dict): """Run and return the best ``ContractionTreeCompressed``.""" self.run(inputs, output, size_dict) return ContractionTreeCompressed.from_path( inputs, output, size_dict, ssa_path=self.ssa_path, ) def __call__(self, inputs, output, size_dict): """Run and return the best ``path``.""" self.run(inputs, output, size_dict) return self.path def do_reconfigure(tree, time, chi): tree.compressed_reconfigure_( chi, progbar=False, max_time=time, order_only=True ) tree.compressed_reconfigure_( chi, progbar=False, max_time=time, order_only=False ) new = math.log2(tree.peak_size_compressed(chi)) return tree, new class CompressedTreeRefiner: def __init__( self, trees, copt, chi, max_refine_time=8, executor=None, pre_dispatch=8, progbar=False, plot=False, ): self.copt = copt self.chi = chi self.scores = [] self.trees = trees self.times = collections.defaultdict(lambda: 2) self.max_refine_time = max_refine_time self.finished_scores = [] self.futures = [] self.executor = executor self.pre_dispatch = pre_dispatch self.plot = plot self.progbar = progbar for key, tree in trees.items(): self._check_score(key, tree) def _check_score(self, key, tree, score=None): if self.times[key] <= self.max_refine_time: if score is None: score = math.log2(tree.peak_size_compressed(self.chi)) heapq.heappush(self.scores, (-score, key)) self.trees[key] = tree else: self.finished_scores.append(score) def _get_next_tree(self): score, key = heapq.heappop(self.scores) tree = self.trees[key] time = self.times[key] return tree, key, time, abs(score) def _get_next_result_seq(self): tree, key, time, old = self._get_next_tree() tree, new = do_reconfigure(tree, time, self.chi) return tree, key, time, old, new def _get_next_result_par(self, max_futures): while self.scores and ( len(self.futures) < min(self.pre_dispatch, max_futures) ): tree, key, time, old = self._get_next_tree() f = self.executor.submit(do_reconfigure, tree, time, self.chi) self.futures.append((f, key, time, old)) while self.futures: for i in range(len(self.futures)): f, key, time, old = self.futures[i] if f.done(): del self.futures[i] tree, new = f.result() return tree, key, time, old, new sleep(1e-3) def _process_result(self, tree, key, time, old, new): if old == new: self.times[key] *= 2 else: self.copt.update_from_tree(tree) self.times[key] = max(2, self.times[key] // 2) self._check_score(key, tree, new) def refine(self, num_its=None, bins=30): if num_its is None: num_its = len(self.trees) old_scores = [-x[0] for x in self.scores] if self.progbar: import tqdm its = tqdm.trange(num_its, desc="Refining...") else: its = range(num_its) for i in its: if not (self.scores or self.futures): # everything finished break if self.executor is None: tree, key, time, old, new = self._get_next_result_seq() else: tree, key, time, old, new = self._get_next_result_par( num_its - i ) self._process_result(tree, key, time, old, new) if self.progbar: its.set_description(f"worst: {self.scores[0]}", refresh=False) if self.plot: import matplotlib.pyplot as plt new_scores = [-x[0] for x in self.scores] _, bins, _ = plt.hist(old_scores, bins=bins, alpha=0.8) plt.hist(new_scores, bins=bins, color="orange", alpha=0.8) plt.hist(self.finished_scores, bins=bins, color="red", alpha=0.8) ================================================ FILE: cotengra/experimental/path_compressed_mcts.py ================================================ """Compressed contraction tree search using monte carlo tree search.""" import math from ..core import ContractionTreeCompressed, get_hypergraph from ..pathfinders.path_basic import ssa_to_linear from ..utils import GumbelBatchedGenerator class Node: __slots__ = ( "hg", "n", "graph_key", "nid_path", "size", "local_score", "forward_score", "mean", "count", "leaf_score", ) def __init__( self, hg, nid_path, size, local_score, forward_score, ): self.hg = hg self.n = hg.get_num_nodes() self.graph_key = hash(frozenset(hg.nodes)) self.nid_path = nid_path self.size = size self.local_score = local_score self.forward_score = forward_score self.count = 0 self.mean = float("inf") # self.mean = 0.0 self.leaf_score = None def update(self, x): """Report the score ``x``, presumably from a child node, updating this nodes score. """ self.count += 1 delta = x - self.mean self.mean += delta / self.count # self.mean = min(self.mean, x) phi = math.log2(self.mean) phi -= (phi / self.count) ** 0.5 self.leaf_score = phi def __hash__(self): return hash((self.graph_key, self.size)) def __lt__(self, other): return self.leaf_score < other.leaf_score def __repr__(self): return ( f"" ) class MCTS: def __init__( self, chi, T=0.1, prune=True, optimize=None, optimize_factory=False, seed=None, ): self.chi = chi self.T = T self.prune = prune self.optimize = optimize self.optimize_factory = optimize_factory self.best_score = float("inf") self.best_nid_path = None self.children = {} self.parents = {} self.seen = {} self.to_delete = set() self.leaves = None self.root = None self.N = None self.gmblgen = GumbelBatchedGenerator(seed) def __repr__(self): return ( "" ) def setup(self, inputs, output, size_dict): """ """ if self.leaves is None: H = get_hypergraph( {1 << i: term for i, term in enumerate(inputs)}, output, size_dict, accel=False, ) self.N = H.get_num_nodes() size0 = sum(map(H.node_size, H.nodes)) root = Node( hg=H, nid_path=(), size=size0, local_score=0, forward_score=size0, ) self.root = root self.leaves = set() self.check_node(root) def get_ssa_path(self): """Convert unique node identifiers to ssa.""" ssa_path = [] ssa = self.N ssa_lookup = {1 << i: i for i in range(ssa)} for i, j in self.best_nid_path: ij = i | j ssa_lookup[ij] = ssa ssa += 1 ssa_path.append((ssa_lookup[i], ssa_lookup[j])) return ssa_path def check_node(self, node): """ """ if node in self.children: return hg = node.hg cnodes = self.children[node] = set() # for all possible next contractions for i, j in hg.edges.values(): hg_next = hg.copy() # compress then contract hg_next.compress( self.chi, hg_next.get_node(i) + hg_next.get_node(j) ) ij = hg_next.contract(i, j, node=i | j) # measure change in total memory dsize = hg_next.neighborhood_size([ij]) - hg.neighborhood_size( [i, j] ) # score is peak total size encountered new_size = node.size + dsize new_score = max(node.forward_score, new_size) if self.prune and (new_score >= self.best_score): # all subsequent paths will be worse - skip continue new_node = Node( hg=hg_next, nid_path=node.nid_path + ((i, j),), size=new_size, local_score=dsize, forward_score=new_score, ) graph_key = new_node.graph_key if self.prune and ( new_score >= self.seen.get(graph_key, float("inf")) ): # we've reached this graph before with better score continue self.seen[graph_key] = min( new_score, self.seen.get(graph_key, float("inf")) ) # add to tree cnodes.add(new_node) self.parents[new_node] = node # hypergraph only needed to generate children # node.hg = None def delete_node(self, node): """ """ if node is self.root: raise KeyError("Cannot delete root node") dnodes = [] # get all children queue = [node] while queue: cnode = queue.pop() queue.extend(self.children.get(cnode, ())) dnodes.append(cnode) while node is not self.root: # get childless parents pnode = self.parents[node] siblings = self.children[pnode] siblings.remove(node) # NB: could also contract single children? if siblings: break dnodes.append(pnode) node = pnode # wipe nodes for dnode in dnodes: self.children.pop(dnode, None) self.parents.pop(dnode, None) self.seen.pop(dnode.graph_key, None) self.leaves.discard(dnode) return pnode def backprop(self, node): final_score = node.forward_score if final_score < self.best_score: self.best_score = final_score self.best_nid_path = node.nid_path self.pbar.update() self.pbar.set_description( f"lq:{len(self.leaves) if self.leaves is not None else None} " f"best:{math.log2(self.best_score):.2f} " f"tree:{len(self.parents)} ", refresh=False, ) # back track upwards updating backward_score while node is not self.root: pnode = self.parents[node] pnode.update(final_score) node = pnode def simulate_node(self, node): """ """ # greedily descend to bottom based on heuristic local_score while True: self.check_node(node) if node.n == 1: # we've reached a fully contracted graph break if self.prune and self.is_deadend(node): node = self.delete_node(node) continue node = min( self.children[node], key=lambda node: node.local_score - self.T * self.gmblgen(), ) self.backprop(node) def simulate_optimized(self, node): H = node.hg if self.optimize_factory: optimize = self.optimize() else: optimize = self.optimize path = optimize( inputs=tuple(H.nodes.values()), output=H.output, size_dict=H.size_dict, ) nids = list(H.nodes.keys()) for i, j in path: self.check_node(node) ni, nj = map(nids.pop, sorted((i, j), reverse=True)) nids.append(ni | nj) try: node = next( iter( ( x for x in self.children[node] if set(x.nid_path[-1]) == {ni, nj} ) ) ) except StopIteration: # next path node already pruned self.simulate_node(node) return self.backprop(node) def is_deadend(self, node): """ """ return ( not bool(self.children[node]) or node.forward_score >= self.best_score or node.forward_score > self.seen.get(node.graph_key, float("inf")) ) def descend(self): """ """ if self.optimize is not None: simulate = self.simulate_optimized else: simulate = self.simulate_node node = self.root while node in self.leaves: node = min(self.children[node]) if self.prune and self.is_deadend(node): node = self.delete_node(node) continue for cnode in tuple(self.children[node]): if cnode in self.children[node]: simulate(cnode) self.leaves.add(node) for node in tuple(self.children): try: if self.is_deadend(node): self.delete_node(node) except KeyError: pass @property def ssa_path(self): """ """ return self.get_ssa_path() @property def path(self): """ """ return ssa_to_linear(self.ssa_path) def run(self, inputs, output, size_dict): """ """ import tqdm self.pbar = tqdm.tqdm() self.setup(inputs, output, size_dict) try: while self.children: self.descend() except KeyboardInterrupt: pass finally: self.pbar.close() def search(self, inputs, output, size_dict): """ """ self.run(inputs, output, size_dict) return ContractionTreeCompressed.from_path( inputs, output, size_dict, ssa_path=self.ssa_path, ) def __call__(self, inputs, output, size_dict): """ """ self.run(inputs, output, size_dict) return self.path ================================================ FILE: cotengra/experimental/scoring.py ================================================ class CompressedTracedObjective(Objective): def __init__(self, chi, compress_late=False, r=1): self.chi = chi self.compress_late = compress_late self.r = r def trace(self, trial): import autoray as ar import quimb.tensor as qtn from autoray.experimental.complexity_tracing import compute_cost tree = trial["tree"] inputs = tree.inputs output = tree.output size_dict = tree.size_dict tn = qtn.TensorNetwork() for term in inputs: shape = [size_dict[ix] for ix in term] data = ar.lazy.Variable(shape, backend="numpy") tn |= qtn.Tensor(data=data, inds=term) Z = tn.contract_compressed( max_bond=self.chi, cutoff=0.0, optimize=tree.get_path(), canonize_distance=self.r, canonize_after_distance=0, compress_opts=dict( mode="virtual-tree", ), compress_late=self.compress_late, output_inds=output, ) size = 0 peak = Z.history_peak_size() write = 0 cost = compute_cost(Z) for node in Z: size = max(size, node.size) write += node.size trial["flops"] = cost trial["write"] = write trial["size"] = size return size, peak, write, cost class CompressedSizeTracedObjective(CompressedTracedObjective): def __init__(self, secondary_weight=1e-3, **kwargs): self.secondary_weight = secondary_weight super().__init__(**kwargs) def __call__(self, trial): size, _, write, cost = self.trace(trial) return ( math.log2(size) + self.secondary_weight * math.log2(cost) + self.secondary_weight * math.log2(write) ) class CompressedPeakTracedObjective(CompressedTracedObjective): def __init__(self, secondary_weight=1e-3, **kwargs): self.secondary_weight = secondary_weight super().__init__(**kwargs) def __call__(self, trial): _, peak, write, cost = self.trace(trial) return ( math.log2(peak) + self.secondary_weight * math.log2(cost) + self.secondary_weight * math.log2(write) ) class CompressedFlopsTracedObjective(CompressedTracedObjective): def __init__(self, secondary_weight=1e-3, **kwargs): self.secondary_weight = secondary_weight super().__init__(**kwargs) def __call__(self, trial): _, peak, write, cost = self.trace(trial) return ( math.log2(cost) + self.secondary_weight * math.log2(peak) + self.secondary_weight * math.log2(write) ) class CompressedComboTracedObjective(CompressedTracedObjective): def __init__(self, factor=DEFAULT_COMBO_FACTOR, **kwargs): self.factor = factor super().__init__(**kwargs) def __call__(self, trial): _, peak, write, cost = self.trace(trial) return math.log2(peak + self.factor * write + self.factor * cost) ================================================ FILE: cotengra/hypergraph.py ================================================ """Simple hypergraph (and also linegraph) representations for simulating contractions. """ import collections import itertools import math from .plot import ( plot_hypergraph, ) from .utils import ( compute_size_by_dict, prod, unique, ) try: from cotengra.cotengra import HyperGraph as HyperGraphRust except ImportError: HyperGraphRust = None class HyperGraph: """Simple hypergraph builder and writer. Parameters ---------- inputs : sequence of list[str] or dict[int, list[str]] The nodes. If given as a dict, the keys will be taken as the node enumeration rather than ``range(len(inputs))``. output : str, optional Output indices. size_dict : dict[str, int], optional Size of each index. Attributes ---------- nodes : dict[int, list[str]] Mapping of node to the list of edges incident to it. edges : dict[str, list[int]] Mapping of hyper edges to list of nodes it is incident to. num_nodes : int The number of nodes. num_edges : int The number of hyper-edges. """ __slots__ = ( "inputs", "output", "size_dict", "nodes", "edges", "node_counter", ) def __init__(self, inputs, output=None, size_dict=None): self.inputs = inputs self.output = [] if output is None else list(output) self.size_dict = {} if size_dict is None else dict(size_dict) if isinstance(inputs, dict): self.nodes = {int(k): tuple(v) for k, v in inputs.items()} else: self.nodes = dict(enumerate(map(tuple, inputs))) self.edges = {} for i, term in self.nodes.items(): for e in term: self.edges[e] = (*self.edges.setdefault(e, ()), i) self.node_counter = self.num_nodes - 1 def copy(self): """Copy this ``HyperGraph``.""" new = object.__new__(self.__class__) new.inputs = self.inputs new.output = self.output new.size_dict = self.size_dict.copy() new.nodes = self.nodes.copy() new.edges = self.edges.copy() new.node_counter = self.node_counter return new @classmethod def from_edges(cls, edges, output=(), size_dict=()): self = cls.__new__(cls) self.edges = {} for e, e_nodes in edges.items(): self.edges[e] = tuple(e_nodes) self.output = output self.size_dict = dict(size_dict) self.nodes = {} for e, e_nodes in self.edges.items(): for i in e_nodes: self.nodes[i] = (*self.nodes.setdefault(i, ()), e) self.node_counter = self.num_nodes - 1 return self def get_num_nodes(self): return len(self.nodes) @property def num_nodes(self): return len(self.nodes) def get_num_edges(self): return len(self.edges) @property def num_edges(self): return len(self.edges) def __len__(self): return self.num_nodes def edges_size(self, es): """Get the combined, i.e. product, size of all edges in ``es``.""" return prod(map(self.size_dict.__getitem__, es)) def bond_size(self, i, j): """Get the combined, i.e. product, size of edges shared by nodes ``i`` and ``j``. """ return self.edges_size(set(self.nodes[i]).intersection(self.nodes[j])) def node_size(self, i): """Get the size of the term represented by node ``i``.""" return self.edges_size(self.nodes[i]) def neighborhood_size(self, nodes): """Get the size of nodes in the immediate neighborhood of ``nodes``.""" neighborhood = { nn for n in nodes for e in self.get_node(n) for nn in self.get_edge(e) } return sum(map(self.node_size, neighborhood)) def contract_pair_cost(self, i, j): """Get the cost of contracting nodes ``i`` and ``j`` - the product of the dimensions of the indices involved. """ return self.edges_size(set(self.get_node(i) + self.get_node(j))) def neighborhood_compress_cost(self, chi, nodes): region_edges = {e for n in nodes for e in self.get_node(n)} # group edges that are incident to the same set of nodes incidences = {} for e in region_edges: if e not in self.output: e_nodes = frozenset(self.get_edge(e)) incidences.setdefault(e_nodes, []).append(e) # ignore intra-region bonds (assuming we are about to contract these) incidences.pop(frozenset(nodes), None) # compute the cost dominated by QR reductions onto bond C = 0 for e_nodes, edges in incidences.items(): da = self.edges_size(edges) if da > chi: # large multibond shared by e_nodes -> should compress for node in e_nodes: # get outer edges and size outer_edges = [ e for e in self.get_node(node) if e not in edges ] db = self.edges_size(outer_edges) # estimate QR cost da, db = sorted((da, db)) C += da**2 * db if C < 0: raise ValueError("Negative cost!?", C) return C def total_node_size(self): """Get the total size of all nodes.""" return sum(map(self.node_size, self.nodes)) def output_nodes(self): """Get the nodes with output indices.""" return unique(i for e in self.output for i in self.edges[e]) def neighbors(self, i): """Get the neighbors of node ``i``.""" return unique( j for e in self.nodes[i] for j in self.edges[e] if (j != i) ) def neighbor_edges(self, i): """Get the edges incident to all neighbors of node ``i``, (including its own edges). """ return unique( itertools.chain.from_iterable( map(self.get_node, self.neighbors(i)) ) ) def has_node(self, i): """Does this hypergraph have node ``i``?""" return i in self.nodes def get_node(self, i): """Get the edges node ``i`` is incident to.""" return self.nodes[i] def get_edge(self, e): """Get the nodes edge ``e`` is incident to.""" return self.edges[e] def has_edge(self, e): """Does this hypergraph have edge ``e``?""" return e in self.edges def next_node(self): """Get the next available node identifier.""" # always increment to try and generate unique ids self.node_counter += 1 # ... but also check node is valid while self.node_counter in self.nodes: self.node_counter += 1 return self.node_counter def add_node(self, inds, node=None): """Add a node with ``inds``, and optional identifier ``node``. The identifier will be generated if not given and returned. """ if node is None: node = self.next_node() inds = tuple(inds) self.nodes[node] = inds for e in inds: try: self.edges[e] += (node,) except KeyError: # if we just contracted a node with output index, can be empty self.edges[e] = (node,) return node def remove_node(self, i): """Remove node ``i`` from this hypergraph.""" inds = self.nodes.pop(i) for e in inds: e_nodes = self.edges[e] = tuple(j for j in self.edges[e] if j != i) if not e_nodes: del self.edges[e] return inds def remove_edge(self, e): """Remove edge ``e`` from this hypergraph.""" for i in self.edges[e]: self.nodes[i] = tuple(d for d in self.nodes[i] if d != e) del self.edges[e] def contract(self, i, j, node=None): """Combine node ``i`` and node ``j``.""" inds_i = self.remove_node(i) inds_j = self.remove_node(j) inds_ij = unique( ind for ind in inds_i + inds_j # index will only still be here if its not only on i and j if (ind in self.edges) or (ind in self.output) ) return self.add_node(inds_ij, node=node) def compress(self, chi, edges=None): """'Compress' multiedges, combining their size up to a maximum of ``chi``. """ if edges is None: edges = self.edges # find edges which are incident to the same set of nodes incidences = collections.defaultdict(list) for e in unique(edges): if e not in self.output: nodes = frozenset(self.edges[e]) incidences[nodes].append(e) for es in incidences.values(): if len(es) > 1: # combine edges into first, capping size at `chi` new_size = self.edges_size(es) e_keep, *es_del = es for e in es_del: self.remove_edge(e) self.size_dict[e_keep] = min(new_size, chi) def compute_contracted_inds(self, nodes): """Generate the output indices if one were to contract ``nodes``.""" snodes = set(nodes) return unique( e for i in nodes for e in self.get_node(i) # keep index if it appears on any other nodes or in output if set(self.edges[e]) - snodes or e in self.output ) def candidate_contraction_size(self, i, j, chi=None): """Get the size of the node created if ``i`` and ``j`` were contracted, optionally including the effect of first compressing bonds to size ``chi``. """ # figure out the indices of the contracted nodes new_es = tuple(self.compute_contracted_inds((i, j))) if chi is None: return self.edges_size(new_es) incidences = collections.defaultdict(list) for e in new_es: # compressable indices -> those which will not be incident to the # exact same set of nodes contracted_neighbs = frozenset( i if k == j else k for k in self.edges[e] ) incidences[contracted_neighbs].append(e) # each group of compressed inds maxes out at size `chi` return prod( min(chi, self.edges_size(es)) for es in incidences.values() ) def all_shortest_distances( self, nodes=None, ): if nodes is None: nodes = set(self.nodes) elif not isinstance(nodes, set): nodes = set(nodes) # build lazily neighbors_map = {} n = len(nodes) ncomb = n * (n - 1) // 2 distances = {} visitors = {node: {node} for node in nodes} for d in range(1, self.num_nodes): any_change = False previous_visitors = {k: v.copy() for k, v in visitors.items()} for i, ivis in previous_visitors.items(): try: ineighbs = neighbors_map[i] except KeyError: ineighbs = neighbors_map[i] = tuple(self.neighbors(i)) for j in ineighbs: try: visitors[j] |= ivis except KeyError: visitors[j] = ivis.copy() # won't get caught in the later any_change check any_change = True for i in nodes: for j in visitors[i] - previous_visitors[i]: if (i < j) and (j in nodes): distances[i, j] = d any_change = True if not any_change: # also ened to check non target nodes any_change |= any( ivis != visitors[i] for i, ivis in previous_visitors.items() ) if (len(distances) == ncomb) or (not any_change): break return distances def all_shortest_distances_condensed( self, nodes=None, ): if nodes is None: nodes = tuple(self.nodes) distances = self.all_shortest_distances(nodes=nodes) default_distance = 10 * self.num_nodes condensed = [] for i, ni in enumerate(nodes): for j in range(i + 1, len(nodes)): nj = nodes[j] key = (ni, nj) if ni < nj else (nj, ni) condensed.append(distances.get(key, default_distance)) return condensed def simple_distance(self, region, p=2): """Compute a simple distance metric from nodes in ``region`` to all others. Unlike graph distance, relative connectedness is taken into account. """ region = set(region) distances = {i: 0 for i in region} queue = list(region) surface = collections.defaultdict(lambda: 0) for d in itertools.count(1): surface.clear() while queue: i = queue.pop() for j in self.neighbors(i): if j not in region: surface[j] += 1 for j, c in surface.items(): region.add(j) queue.append(j) distances[j] = d + (1 / c) ** p if not queue: break return dict_affine_renorm(distances) def simple_closeness(self, p=0.75, mu=0.5): """Compute a rough hypergraph 'closeness'. Parameters ---------- p : float, optional Once any node has had ``H.num_nodes**p`` visitors terminate. Set greater than 1.0 for no limit (slower). mu : float, optional Let the visitor score decay with this power. The higher this is, the more local connectivity is favored. Returns ------- scores : dict[int, float] The simple hypergraph closenesses - higher being more central. """ sz_stop = self.num_nodes**p should_stop = False # which nodes have reached which other nodes (bitmap set) visitors = {i: 1 << i for i in self.nodes} # store the number of unique visitors - the change is this each step # is the number of new shortest paths of length ``d`` num_visitors = {i: 1 for i in self.nodes} # the total weighted score - combining num visitors and their distance scores = {i: 0.0 for i in self.nodes} # pre-cache the lists of neighbors neighbors = {i: list(self.neighbors(i)) for i in self.nodes} # at each iteration expand all nodes visitors to their neighbors for d in self.nodes: # do a parallel update previous_visitors = visitors.copy() for i in self.nodes: for j in neighbors[i]: visitors[i] |= previous_visitors[j] # visitors are worth less the further they've come from new_nv = popcount(visitors[i]) scores[i] += (new_nv - num_visitors[i]) / (d + 1) ** mu num_visitors[i] = new_nv # once any node has reached a certain number of visitors stop should_stop |= new_nv >= sz_stop if should_stop: break # finally rescale the values between 0.0 and 1.0 return dict_affine_renorm(scores) def simple_centrality(self, r=None, smoothness=2, **closeness_opts): """A simple algorithm for large hypergraph centrality. First we find a rough closeness centrality, then relax / smooth this by nodes iteratively radiating their centrality to their neighbors. Parameters ---------- r : None or int, optional Number of iterations. Defaults to ``max(10, int(self.num_nodes**0.5))``. smoothness : float, optional The smoothness. In conjunction with a high value of ``r`` this will create a smooth gradient from one of the hypergraph to the other. closeness_opts Supplied to ``HyperGraph.simple_closeness`` as the starting point. Returns ------- dict[int, float] """ # take a rough closeness as the starting point c = self.simple_closeness(**closeness_opts) # pre-cache the lists of neighbors neighbors = {i: list(self.neighbors(i)) for i in self.nodes} if r is None: # take the propagation time as sqrt hypergraph size r = max(10, int(self.num_nodes**0.5)) for _ in range(r): # do a parallel update previous_c = c.copy() # spread the centrality of each node into its neighbors for i in self.nodes: ci = previous_c[i] for j in neighbors[i]: c[j] += smoothness * ci / r # then rescale all the values between 0.0 and 1.0 c = dict_affine_renorm(c) return c def compute_loops(self, start=None, max_loop_length=None): """Generate all loops up to a certain length in this hypergraph. Parameters ---------- start : sequence of int, optional Only generate loops including these nodes, defaults to all. max_loop_length : None or int, optional The maximum loop length to search for. If ``None``, then this is set automatically by the length of the first loop found. Yields ------ loop : tuple[int] A set of nodes that form a loop. """ if start is None: start = self.nodes # start paths beginning at every node queue = [(i,) for i in start] # cache neighbors for speed neighbors = {} seen = set() while queue: # consider all the ways to extend each path path = queue.pop(0) jf = path[-1] try: j_neighbs = neighbors[jf] except KeyError: j_neighbs = neighbors[jf] = tuple(self.neighbors(jf)) for j in j_neighbs: i0 = path[0] # check for valid loop ... if ( # is not trivial (len(path) > 2) and # ends where it starts (j == i0) and # and is not just a cyclic permutation of existing loop (frozenset(path) not in seen) ): yield tuple(sorted(path)) seen.add(frozenset(path)) if max_loop_length is None: # automatically set the max loop length max_loop_length = len(path) + 1 # path hits itself too early elif j in path: continue # keep extending path, but only if elif ( # we haven't found any loops yet (max_loop_length is None) or # or this loops is short (len(path) < max_loop_length) ): queue.append(path + (j,)) def get_laplacian(self): """Get the graph Laplacian.""" import numpy as np lp = np.zeros((self.num_nodes, self.num_nodes)) for i, term in self.nodes.items(): lp[i, i] = len(term) for i, j in self.edges.values(): lp[i, j] = lp[j, i] = -1 return lp def get_resistance_distances(self): """Get the resistance distance between all nodes of the raw graph.""" import numpy as np lp = self.get_laplacian() lp += 1 / self.num_nodes lp = np.linalg.inv(lp) d = np.array(np.diag(lp)) # needs to be copy lp *= -2 lp += d.reshape(1, -1) lp += d.reshape(-1, 1) return lp def resistance_centrality(self, rescale=True): """Compute the centrality in terms of the total resistance distance to all other nodes. """ rd = self.get_resistance_distances() cents = dict(enumerate(-rd.sum(axis=1))) if rescale: cents = dict_affine_renorm(cents) return cents def to_networkx(H, as_tree_leaves=None): """Convert to a networkx Graph, with hyperedges represented as nodes. Parameters ---------- as_tree_leaves : callable, optional If supplied this function is used to convert the nodes to 'tree leaf' form, i.e. map node ``i`` to single element subgraphs, to match the nodes in a ``ContractionTree``. """ import networkx as nx # any_hyper is just a custom attribute G = nx.Graph(any_hyper=False) for ix, nodes in H.edges.items(): if as_tree_leaves is not None: nodes = [as_tree_leaves(node) for node in nodes] output = ix in H.output if len(nodes) == 2 and (not output): # regular edge if not G.has_edge(*nodes): G.add_edge(*nodes, ind=ix, hyperedge=False, output=False) else: multi = G.edges[nodes].setdefault("multi", {}) multi.setdefault("inds", []).append(ix) else: # hyperedge G.graph["any_hyper"] = True output = ix in H.output if output: hyperedge = len(nodes) != 1 else: hyperedge = True G.add_node(ix, ind=ix, hyperedge=hyperedge, output=output) for nd in nodes: G.add_edge( ix, nd, ind=ix, hyperedge=hyperedge, output=output ) if hyperedge and output: # attach extra dummy output node to hyperedge center G.add_node( f"__output__{ix}", ind=ix, hyperedge=False, output=output, ) G.add_edge( ix, f"__output__{ix}", ind=ix, hyperedge=hyperedge, output=output, ) for nd in G.nodes: G.nodes[nd].setdefault("hyperedge", False) return G def compute_weights( self, weight_edges="const", weight_nodes="const", ): winfo = {} winfo["node_weights"] = tuple( calc_node_weight(term, self.size_dict, weight_nodes) for term in self.nodes.values() ) winfo["edge_list"] = tuple(self.edges) winfo["edge_weight_map"] = { e: calc_edge_weight(e, self.size_dict, weight_edges) for e in winfo["edge_list"] } winfo["edge_weights"] = tuple( winfo["edge_weight_map"][e] for e in winfo["edge_list"] ) winfo["has_edge_weights"] = weight_edges in ("log", "linear") winfo["has_node_weights"] = weight_nodes in ("log", "linear") winfo["fmt"] = { (False, False): "", (False, True): "10", (True, False): "1", (True, True): "11", }[winfo["has_edge_weights"], winfo["has_node_weights"]] return winfo plot = plot_hypergraph def __repr__(self): return f"" def get_hypergraph(inputs, output=None, size_dict=None, accel=False): """Single entry-point for creating a, possibly accelerated, HyperGraph.""" if accel == "auto": accel = HyperGraphRust is not None if accel: if not isinstance(inputs, dict): inputs = {i: list(term) for i, term in enumerate(inputs)} if not isinstance(output, list): output = [] if output is None else list(output) if not isinstance(size_dict, dict): size_dict = {} if size_dict is None else dict(size_dict) return HyperGraphRust(inputs, output, size_dict) return HyperGraph(inputs, output, size_dict) def calc_edge_weight(ix, size_dict, scale="log"): if scale in ("const", None, False): return 1 w = size_dict[ix] if scale == "linear": w = 1000 * w elif scale == "log": w = int(1000 * math.log2(w)) + 1 elif scale == "exp": w = 2**w return int(w) def calc_edge_weight_float(ix, size_dict, scale="log"): if scale in ("const", None, False): return 1.0 w = size_dict[ix] if scale == "linear": w = float(w) elif scale == "log": w = math.log2(w) elif scale == "exp": w = 2**w return w def calc_node_weight(term, size_dict, scale="linear"): if scale in ("const", None, False): return 1 w = compute_size_by_dict(term, size_dict) # scale up by a thousand so we can add small integer jitter if scale == "linear": w = 1000 * w elif scale == "log": w = 1000 * math.log2(w) elif scale == "exp": w = 2**w return int(w) def calc_node_weight_float(term, size_dict, scale="linear"): if scale in ("const", None, False): return 1.0 w = compute_size_by_dict(term, size_dict) # scale up by a thousand so we can add small integer jitter if scale == "linear": w elif scale == "log": w = math.log2(w) elif scale == "exp": w = 2**w return w class LineGraph: """Very simple line-graph builder and file writer.""" def __init__(self, inputs, output): self.inputs = inputs self.nodes = tuple(set.union(*inputs)) self.nodemap = {ix: i for i, ix in enumerate(self.nodes)} # num nodes in dual = num edges in real graph self.number_of_nodes = len(self.nodemap) self.edges = [] for term in inputs: for ix1, ix2 in itertools.combinations(term, 2): self.edges.append((self.nodemap[ix1], self.nodemap[ix2])) for ix1, ix2 in itertools.combinations(output, 2): self.edges.append((self.nodemap[ix1], self.nodemap[ix2])) self.number_of_edges = len(self.edges) def to_gr_str(self): ls = [f"p tw {self.number_of_nodes} {self.number_of_edges}"] for i, j in self.edges: ls.append(f"{i + 1} {j + 1}") return "\n".join(ls) def to_gr_file(self, fname): contents = self.to_gr_str() with open(fname, "w") as f: f.write(contents) def to_cnf_str(self): ls = [f"p cnf {self.number_of_nodes} {self.number_of_edges}"] for i, j in self.edges: ls.append(f"{i + 1} {j + 1} 0") return "\n".join(ls) def to_cnf_file(self, fname): contents = self.to_cnf_str() with open(fname, "w") as f: f.write(contents) # best: use built in if hasattr(int, "bit_count"): def popcount(x): return x.bit_count() else: # second best, gmpy2 is installed try: from gmpy2 import popcount except ImportError: # finally, use string method def popcount(x): return bin(x).count("1") def dict_affine_renorm(d): dmax = max(d.values()) dmin = min(d.values()) if dmax == dmin: dmin = 0 if dmax == 0.0: dmax = 1.0 return {k: (v - dmin) / (dmax - dmin) for k, v in d.items()} ================================================ FILE: cotengra/hyperoptimizers/__init__.py ================================================ """Different hyper (or meta) optimizers for sampling paramtetrized trees.""" ================================================ FILE: cotengra/hyperoptimizers/_param_mapping.py ================================================ """Shared parameter mapping utilities for hyper-optimization backends. Provides classes for mapping heterogeneous parameter types (float, int, string, bool) to and from a uniform [-1, 1] optimization space, plus an LCB-based method selector. """ import math from ..utils import get_rng class LCBOptimizer: """Lower Confidence Bound Optimizer. This optimizer selects the option with the lowest lower confidence bound. """ def __init__(self, options, exploration=1.0, temperature=1.0, seed=None): self.options = tuple(options) self.index = {o: i for i, o in enumerate(self.options)} self.nopt = len(self.options) self.counts = [0] * self.nopt self.values = [float("inf")] * self.nopt self.total = 0 self.exploration = exploration self.temperature = temperature self.rng = get_rng(seed) def ask(self): """Suggest an option based on the lower confidence bound.""" best_option = best_lcb = None for option, ci, vi in zip(self.options, self.counts, self.values): if ci < 1: # need to gather initial samples return option # modify lcb to include exploration term lcb = ( vi # exploration term to favor less sampled options - math.sqrt(2 * self.exploration * math.log(self.total) / ci) # thermal (via gumbel trick) term to add noise - self.temperature * math.log(-math.log(self.rng.random())) ) if best_lcb is None or lcb < best_lcb: best_lcb = lcb best_option = option return best_option def tell(self, option, score): i = self.index[option] self.counts[i] += 1 self.values[i] = min(score, self.values[i]) self.total += 1 class Param: """A basic parameter class for mapping various types of parameters to and from uniform optimization space of [-1, 1]. """ def __init__(self, name): self.name = name self.size = 1 def get_raw_bounds(self): raise NotImplementedError() def convert_raw(self, vi): raise NotImplementedError() class ParamFloat(Param): def __init__(self, min, max, **kwargs): self.min = min self.max = max super().__init__(**kwargs) def convert_raw(self, x): x += 1.0 x /= 2.0 x *= self.max - self.min x += self.min return x class ParamFloatExp(ParamFloat): """An exponentially distributed (i.e. uniform in logspace) parameter.""" def __init__(self, min, max, power=0.5, **kwargs): self.power = power if self.power is None: mn = math.log(min) mx = math.log(max) else: mn = min**self.power mx = max**self.power super().__init__(min=mn, max=mx, **kwargs) def convert_raw(self, x): if self.power is None: return math.exp(super().convert_raw(x)) else: return super().convert_raw(x) ** (1 / self.power) class ParamInt(Param): def __init__(self, min, max, **kwargs): self.min = min self.max = max super().__init__(**kwargs) def convert_raw(self, x): x += 1.0 x /= 2.0 x *= self.max - self.min + 1 x += self.min return min(int(x), self.max) class ParamString(Param): def __init__(self, options, name): self.options = tuple(options) self.size = len(self.options) self.name = name def convert_raw(self, x): i = max(range(len(self.options)), key=lambda i: x[i]) return self.options[i] class ParamBool(Param): def __init__(self, name): super().__init__(name) self.size = 2 self.name = name def convert_raw(self, x): return x[0] > x[1] def build_params(space, exponential_param_power=None): """Build a list of ``Param`` objects from a search space dict. Parameters ---------- space : dict[str, dict] The search space for a single method. exponential_param_power : float, optional Power parameter for ``ParamFloatExp``. Returns ------- params : list[Param] """ params = [] for name, p in space.items(): if p["type"] == "FLOAT": params.append(ParamFloat(p["min"], p["max"], name=name)) elif p["type"] == "FLOAT_EXP": params.append( ParamFloatExp( p["min"], p["max"], power=exponential_param_power, name=name, ) ) elif p["type"] == "INT": params.append(ParamInt(p["min"], p["max"], name=name)) elif p["type"] == "STRING": params.append(ParamString(p["options"], name=name)) elif p["type"] == "BOOL": params.append(ParamBool(name=name)) else: raise ValueError(f"Unknown parameter type {p['type']}") return params def convert_raw(params, x): """Convert a raw vector from [-1, 1] space into named parameters. Parameters ---------- params : list[Param] The parameter definitions. x : array_like The raw vector. Returns ------- named_params : dict[str, any] """ result = {} i = 0 for p in params: if p.size == 1: result[p.name] = p.convert_raw(x[i]) i += 1 else: result[p.name] = p.convert_raw(x[i : i + p.size]) i += p.size return result def num_params(params): """Return the total number of raw dimensions for a list of params.""" return sum(p.size for p in params) def generate_lhs_points(ndim, n, rng): """Generate ``n`` Latin Hypercube Sampled points in ``[-1, 1]^ndim``. Each dimension is divided into ``n`` equal strata and exactly one sample is drawn uniformly within each stratum. The stratum-to-sample assignment is independently permuted per dimension, ensuring good marginal coverage with no external dependencies. Parameters ---------- ndim : int Number of raw dimensions. n : int Number of points to generate. rng : random.Random Random number generator instance. Returns ------- points : list[list[float]] ``n`` points, each a list of ``ndim`` floats in ``[-1, 1]``. """ if ndim == 0 or n <= 0: return [] # build a permutation of strata indices for each dimension perms = [] for _ in range(ndim): order = list(range(n)) rng.shuffle(order) perms.append(order) points = [] for i in range(n): point = [] for d in range(ndim): stratum = perms[d][i] lo = -1.0 + 2.0 * stratum / n hi = -1.0 + 2.0 * (stratum + 1) / n point.append(rng.uniform(lo, hi)) points.append(point) return points ================================================ FILE: cotengra/hyperoptimizers/hyper.py ================================================ """Base hyper optimization functionality.""" import functools import importlib import re import time import warnings from math import log2, log10 from ..core import ( ContractionTree, ContractionTreeCompressed, ) from ..core_multi import ContractionTreeMulti from ..oe import PathOptimizer from ..parallel import get_n_workers, parse_parallel_arg, should_nest, submit from ..plot import ( plot_parameters_parallel, plot_scatter, plot_scatter_alt, plot_trials, plot_trials_alt, ) from ..reusable import ReusableOptimizer from ..scoring import get_score_fn from ..utils import BadTrial, get_rng @functools.lru_cache(maxsize=None) def get_default_hq_methods(): methods = ["greedy"] if importlib.util.find_spec("kahypar"): methods.append("kahypar") else: methods.append("labels") warnings.warn( "Couldn't import `kahypar` - skipping from default hyper optimizer" " and using basic `labels` method instead. `kahypar` is highly " "recommended for the best quality contraction paths." ) return tuple(methods) @functools.lru_cache(maxsize=None) def get_default_optlib_eco(): """Get the default optimizer favoring speed.""" if importlib.util.find_spec("cmaes"): optlib = "cmaes" elif importlib.util.find_spec("nevergrad"): optlib = "nevergrad" else: # cotengra's dependency free steady state evolutionary strategy optlib = "sses" return optlib @functools.lru_cache(maxsize=None) def get_default_optlib(): """Get the default optimizer balancing quality and speed.""" if importlib.util.find_spec("optuna"): optlib = "optuna" elif importlib.util.find_spec("cmaes"): optlib = "cmaes" else: # cotengra's dependency free implementation of Nelder-Mead Subplex optlib = "sbplx" return optlib _PATH_FNS = {} _OPTLIB_FNS = {} _OPTLIB_DEFAULTS = {} _HYPER_SEARCH_SPACE = {} _HYPER_CONSTANTS = {} def get_hyper_space(): return _HYPER_SEARCH_SPACE def get_hyper_constants(): return _HYPER_CONSTANTS class HyperOptLib: """Base class for hyper-optimization library interfaces. Subclasses should implement ``setup``, ``get_setting``, and ``report_result``. """ def setup(self, methods, space, optimizer=None, **kwargs): """Initialize the optimizer state. Parameters ---------- methods : list[str] The list of contraction methods to optimize over. space : dict[str, dict[str, dict]] The search space for each method. optimizer : HyperOptimizer, optional The parent ``HyperOptimizer`` instance, for accessing attributes like ``max_repeats``. kwargs Extra options specific to the optimizer library. """ raise NotImplementedError def get_setting(self): """Suggest the next setting to trial. Returns ------- setting : dict Must contain at least ``{"method": str, "params": dict}``. May also include tokens for reporting. """ raise NotImplementedError def report_result(self, setting, trial, score): """Report the result of a trial. Parameters ---------- setting : dict The setting dict returned by ``get_setting``. trial : dict The trial result dict. score : float The scalar score for this trial. """ raise NotImplementedError def cleanup(self): """Clean up any resources (threads, connections, etc.). Called at the end of each ``HyperOptimizer._search()`` run. The default implementation does nothing. """ def register_hyper_optlib(name, cls, defaults=None): """Register a hyper-optimization library backend. Parameters ---------- name : str The name of the backend. cls : type A ``HyperOptLib`` subclass. """ _OPTLIB_FNS[name] = cls _OPTLIB_DEFAULTS[name] = defaults or {} def register_hyper_function(name, ssa_func, space, constants=None): """Register a contraction path finder to be used by the hyper-optimizer. Parameters ---------- name : str The name to call the method. ssa_func : callable The raw function that returns a 'ContractionTree', with signature ``(inputs, output, size_dict, **kwargs)``. space : dict[str, dict] The space of hyper-parameters to search. """ if constants is None: constants = {} _PATH_FNS[name] = ssa_func _HYPER_SEARCH_SPACE[name] = space _HYPER_CONSTANTS[name] = constants def list_hyper_functions(): """Return a list of currently registered hyper contraction finders.""" return sorted(_PATH_FNS) def base_trial_fn(inputs, output, size_dict, method, **kwargs): # NOTE: for 1 or 2 inputs there is no optimization to be done, so we # shortcut here. We might even sooner in `search`, but then we wouldn't # generate any 'trials', even if they are identical. N = len(inputs) if N == 1: tree = ContractionTree(inputs, output, size_dict) elif N == 2: tree = ContractionTree.from_path( inputs, output, size_dict, path=[(0, 1)] ) else: tree = _PATH_FNS[method](inputs, output, size_dict, **kwargs) return {"tree": tree} class TrialSetObjective: def __init__(self, trial_fn, objective): self.trial_fn = trial_fn self.objective = objective def __call__(self, *args, **kwargs): trial = self.trial_fn(*args, **kwargs) trial["tree"].set_default_objective(self.objective) return trial class TrialConvertTree: def __init__(self, trial_fn, cls): self.trial_fn = trial_fn self.cls = cls def __call__(self, *args, **kwargs): trial = self.trial_fn(*args, **kwargs) tree = trial["tree"] if not isinstance(tree, self.cls): tree.__class__ = self.cls return trial class TrialTreeMulti: def __init__(self, trial_fn, varmults, numconfigs): self.trial_fn = trial_fn self.varmults = varmults self.numconfigs = numconfigs def __call__(self, *args, **kwargs): trial = self.trial_fn(*args, **kwargs) tree = trial["tree"] if not isinstance(tree, ContractionTreeMulti): tree.__class__ = ContractionTreeMulti tree.set_varmults(self.varmults) tree.set_numconfigs(self.numconfigs) return trial class SlicedTrialFn: def __init__(self, trial_fn, **opts): self.trial_fn = trial_fn self.opts = opts def __call__(self, *args, **kwargs): trial = self.trial_fn(*args, **kwargs) tree = trial["tree"] stats = tree.contract_stats() trial.setdefault("original_flops", stats["flops"]) trial.setdefault("original_write", stats["write"]) trial.setdefault("original_size", stats["size"]) tree.slice_(**self.opts) trial.update(tree.contract_stats()) return trial class SimulatedAnnealingTrialFn: def __init__(self, trial_fn, **opts): self.trial_fn = trial_fn self.opts = opts def __call__(self, *args, **kwargs): trial = self.trial_fn(*args, **kwargs) tree = trial["tree"] stats = tree.contract_stats() trial.setdefault("original_flops", stats["flops"]) trial.setdefault("original_write", stats["write"]) trial.setdefault("original_size", stats["size"]) tree.simulated_anneal_(**self.opts) trial.update(tree.contract_stats()) return trial class ReconfTrialFn: def __init__(self, trial_fn, forested=False, parallel=False, **opts): self.trial_fn = trial_fn self.forested = forested self.parallel = parallel self.opts = opts def __call__(self, *args, **kwargs): trial = self.trial_fn(*args, **kwargs) tree = trial["tree"] stats = tree.contract_stats() trial.setdefault("original_flops", stats["flops"]) trial.setdefault("original_write", stats["write"]) trial.setdefault("original_size", stats["size"]) if self.forested: tree.subtree_reconfigure_forest_( parallel=self.parallel, **self.opts ) else: tree.subtree_reconfigure_(**self.opts) tree.already_optimized.clear() trial.update(tree.contract_stats()) return trial class SlicedReconfTrialFn: def __init__(self, trial_fn, forested=False, parallel=False, **opts): self.trial_fn = trial_fn self.forested = forested self.parallel = parallel self.opts = opts def __call__(self, *args, **kwargs): trial = self.trial_fn(*args, **kwargs) tree = trial["tree"] stats = tree.contract_stats() trial.setdefault("original_flops", stats["flops"]) trial.setdefault("original_write", stats["write"]) trial.setdefault("original_size", stats["size"]) if self.forested: tree.slice_and_reconfigure_forest_( parallel=self.parallel, **self.opts ) else: tree.slice_and_reconfigure_(**self.opts) tree.already_optimized.clear() trial.update(tree.contract_stats()) return trial class CompressedReconfTrial: def __init__(self, trial_fn, minimize=None, **opts): self.trial_fn = trial_fn self.minimize = minimize self.opts = opts def __call__(self, *args, **kwargs): trial = self.trial_fn(*args, **kwargs) tree = trial["tree"] tree.windowed_reconfigure_(minimize=self.minimize, **self.opts) return trial class ComputeScore: """The final score wrapper, that performs some simple arithmetic on the trial score to make it more suitable for hyper-optimization. """ def __init__( self, fn, score_fn, score_compression=0.75, score_smudge=1e-6, on_trial_error="warn", seed=0, ): self.fn = fn self.score_fn = score_fn self.score_compression = score_compression self.score_smudge = score_smudge self.on_trial_error = { "raise": "raise", "warn": "warn", "ignore": "ignore", }[on_trial_error] self.rng = get_rng(seed) def __call__(self, *args, **kwargs): ti = time.time() try: trial = self.fn(*args, **kwargs) score = self.score_fn(trial) trial["score"] = score # modify score to tell to the optimizer slightly: trial["score_optimize"] = ( # compression controls exploration/exploitation (score**self.score_compression) # random smudge is for scikit-learn nan/inf bug + self.rng.gauss(0.0, self.score_smudge) ) except BadTrial: trial = { "score": float("inf"), "score_optimize": float("inf"), "flops": float("inf"), "write": float("inf"), "size": float("inf"), } except Exception as e: if self.on_trial_error == "raise": raise e elif self.on_trial_error == "warn": warnings.warn( f"Trial error: {e}. Set `HyperOptimizer` kwarg " "`on_trial_error='raise'` to raise this error, or " "`on_trial_error='ignore'` to silence." ) trial = { "score": float("inf"), "score_optimize": float("inf"), "flops": float("inf"), "write": float("inf"), "size": float("inf"), } tf = time.time() trial["time"] = tf - ti return trial def progress_description(best, info="concise"): try: return best["tree"].describe(info=info) except KeyError: return ( f"log10[FLOPs]={log10(best['flops']):.2f} " f"log2[SIZE]={log2(best['size']):.2f}" ) class HyperOptimizer(PathOptimizer): """A path optimizer that samples a series of contraction trees while optimizing the hyper parameters used to generate them. Parameters ---------- methods : None or sequence[str] or str, optional Which method(s) to use from ``list_hyper_functions()``. minimize : str, Objective or callable, optional How to score each trial, used to train the optimizer and rank the results. If a custom callable, it should take a ``trial`` dict as its argument and return a single float. max_repeats : int, optional The maximum number of trial contraction trees to generate. Default: 128. max_time : None or float, optional The maximum amount of time to run for. Use ``None`` for no limit. You can also set an estimated execution 'rate' here like ``'rate:1e9'`` that will terminate the search when the estimated FLOPs of the best contraction found divided by the rate is greater than the time spent searching, allowing quick termination on easy contractions. parallel : 'auto', False, True, int, or distributed.Client Whether to parallelize the search. slicing_opts : dict, optional If supplied, once a trial contraction path is found, try slicing with the given options, and then update the flops and size of the trial with the sliced versions. slicing_reconf_opts : dict, optional If supplied, once a trial contraction path is found, try slicing interleaved with subtree reconfiguation with the given options, and then update the flops and size of the trial with the sliced and reconfigured versions. reconf_opts : dict, optional If supplied, once a trial contraction path is found, try subtree reconfiguation with the given options, and then update the flops and size of the trial with the reconfigured versions. optlib : {'optuna', 'cmaes', 'nevergrad', 'sses', 'sbplx', ...}, optional Which optimizer to sample and train with. optlib_opts Supplied to the hyper-optimizer library initialization. space : dict, optional The hyper space to search, see ``get_hyper_space`` for the default. score_compression : float, optional Raise scores to this power in order to compress or accentuate the differences. The lower this is, the more the selector will sample from various optimizers rather than quickly specializing. on_trial_error : {'warn', 'raise', 'ignore'}, optional What to do if a trial fails. If ``'warn'`` (default), a warning will be printed and the trial will be given a score of ``inf``. If ``'raise'`` the error will be raised. If ``'ignore'`` the trial will be given a score of ``inf`` silently. max_training_steps : int, optional The maximum number of trials to train the optimizer with. Setting this can be helpful when the optimizer itself becomes costly to train (e.g. for Gaussian Processes). constants : dict[dict], optional A dict mapping method name to a dict of constant parameters to pass to the trial function for that method. Any parameters specified here will override those in the search space. progbar : bool, optional Show live progress of the best contraction found so far. """ compressed = False multicontraction = False def __init__( self, methods=None, minimize="flops", max_repeats=128, max_time=None, parallel="auto", simulated_annealing_opts=None, slicing_opts=None, slicing_reconf_opts=None, reconf_opts=None, optlib=None, optlib_opts=None, space=None, score_compression=0.75, on_trial_error="warn", max_training_steps=None, constants=None, progbar=False, **kwargs, ): self.max_repeats = max_repeats self._repeats_start = 0 self.max_time = max_time self.parallel = parallel self.method_choices = [] self.param_choices = [] self.scores = [] self.times = [] self.costs_flops = [] self.costs_write = [] self.costs_size = [] if methods is None: self._methods = get_default_hq_methods() elif isinstance(methods, str): self._methods = [methods] else: self._methods = list(methods) if constants is None: self._constants = {method: {} for method in self._methods} else: self._constants = dict(constants) for method in self._methods: for k, v in _HYPER_CONSTANTS[method].items(): self._constants[method].setdefault(k, v) if optlib is None: optlib = get_default_optlib() # which score to feed to the hyper optimizer (setter below handles) self.minimize = minimize self.score_compression = score_compression self.on_trial_error = on_trial_error self.best_score = float("inf") self.max_training_steps = max_training_steps inf = float("inf") self.best = {"score": inf, "size": inf, "flops": inf} self.trials_since_best = 0 self.simulated_annealing_opts = ( None if simulated_annealing_opts is None else dict(simulated_annealing_opts) ) self.slicing_opts = ( None if slicing_opts is None else dict(slicing_opts) ) self.reconf_opts = None if reconf_opts is None else dict(reconf_opts) self.slicing_reconf_opts = ( None if slicing_reconf_opts is None else dict(slicing_reconf_opts) ) self.progbar = progbar if space is None: space = get_hyper_space() self._optimizer = _OPTLIB_FNS[optlib]() optlib_opts = _OPTLIB_DEFAULTS[optlib] | kwargs | (optlib_opts or {}) self._optimizer.setup( self._methods, space, optimizer=self, **optlib_opts, ) @property def minimize(self): return self._minimize @minimize.setter def minimize(self, minimize): self._minimize = minimize if callable(minimize): self.objective = minimize else: self.objective = get_score_fn(minimize) @property def parallel(self): return self._parallel @parallel.setter def parallel(self, parallel): self._parallel = parallel self._pool = parse_parallel_arg(parallel) if self._pool is not None: self._num_workers = get_n_workers(self._pool) self.pre_dispatch = max( self._num_workers + 4, int(1.2 * self._num_workers) ) @property def tree(self): return self.best["tree"] @property def path(self): return self.tree.get_path() def setup(self, inputs, output, size_dict): trial_fn = TrialSetObjective(base_trial_fn, self.objective) if self.compressed: assert not self.multicontraction trial_fn = TrialConvertTree(trial_fn, ContractionTreeCompressed) if self.multicontraction: assert not self.compressed trial_fn = TrialTreeMulti(trial_fn, self.varmults, self.numconfigs) nested_parallel = should_nest(self._pool) if self.simulated_annealing_opts is not None: trial_fn = SimulatedAnnealingTrialFn( trial_fn, **self.simulated_annealing_opts ) if self.slicing_opts is not None: trial_fn = SlicedTrialFn(trial_fn, **self.slicing_opts) if self.slicing_reconf_opts is not None: self.slicing_reconf_opts.setdefault("parallel", nested_parallel) trial_fn = SlicedReconfTrialFn( trial_fn, **self.slicing_reconf_opts ) if self.reconf_opts is not None: if self.compressed: trial_fn = CompressedReconfTrial(trial_fn, **self.reconf_opts) else: self.reconf_opts.setdefault("parallel", nested_parallel) trial_fn = ReconfTrialFn(trial_fn, **self.reconf_opts) # make sure score computation is performed worker side trial_fn = ComputeScore( trial_fn, score_fn=self.objective, score_compression=self.score_compression, on_trial_error=self.on_trial_error, ) return trial_fn, (inputs, output, size_dict) def _maybe_cancel_futures(self): if self._pool is not None: while self._futures: f = self._futures.pop()[-1] f.cancel() def _maybe_report_result(self, setting, trial): score = trial["score"] new_best = score < self.best_score if new_best: self.best_score = score # only fit optimizers after the training epoch if the score is best should_report = ( (self.max_training_steps is None) or (len(self.scores) < self.max_training_steps) or new_best # always report inf-scored trials so sampler internal state # (e.g. init-phase counters) stays consistent, the optlib itself # can decide to ignore these if it wants to or trial["score"] == float("inf") ) if should_report: # this has compression and smudge applied score_optimize = trial["score_optimize"] self._optimizer.report_result(setting, trial, score_optimize) self.method_choices.append(setting["method"]) self.param_choices.append(setting["params"]) # keep track of all costs and sizes self.costs_flops.append(trial["flops"]) self.costs_write.append(trial["write"]) self.costs_size.append(trial["size"]) self.scores.append(trial["score"]) self.times.append(trial["time"]) def _gen_results(self, repeats, trial_fn, trial_args): for _ in repeats: setting = self._optimizer.get_setting() method = setting["method"] trial_kwargs = { "method": method, **setting["params"], **self._constants[method], } trial = trial_fn(*trial_args, **trial_kwargs) self._maybe_report_result(setting, trial) yield trial def _get_and_report_next_future(self): # scan over the futures, yield whichever completes first while True: for i in range(len(self._futures)): setting, future = self._futures[i] if future.done(): del self._futures[i] trial = future.result() self._maybe_report_result(setting, trial) return trial time.sleep(1e-6) def _gen_results_parallel(self, repeats, trial_fn, trial_args): constants = get_hyper_constants() self._futures = [] for _ in repeats: setting = self._optimizer.get_setting() method = setting["method"] future = submit( self._pool, trial_fn, *trial_args, method=method, **setting["params"], **constants[method], ) self._futures.append((setting, future)) if len(self._futures) >= self.pre_dispatch: yield self._get_and_report_next_future() while self._futures: yield self._get_and_report_next_future() def _search(self, inputs, output, size_dict): # start a timer? if self.max_time is not None: t0 = time.time() if isinstance(self.max_time, str): which, amount = re.match( r"(rate|equil):(.+)", self.max_time ).groups() if which == "rate": rate = float(amount) def should_stop(): return (time.time() - t0) > (self.best["flops"] / rate) elif which == "equil": amount = int(amount) def should_stop(): return self.trials_since_best > amount else: def should_stop(): return (time.time() - t0) > self.max_time else: def should_stop(): return False trial_fn, trial_args = self.setup(inputs, output, size_dict) r_start = self._repeats_start + len(self.scores) r_stop = r_start + self.max_repeats repeats = range(r_start, r_stop) # create the trials lazily if self._pool is not None: trials = self._gen_results_parallel(repeats, trial_fn, trial_args) else: trials = self._gen_results(repeats, trial_fn, trial_args) if self.progbar: import tqdm pbar = tqdm.tqdm(trials, total=self.max_repeats) pbar.set_description( progress_description(self.best), refresh=False ) trials = pbar # assess the trials for trial in trials: # check if we have found a new best if trial["score"] < self.best["score"]: self.trials_since_best = 0 self.best = trial self.best["params"] = dict(self.param_choices[-1]) self.best["params"]["method"] = self.method_choices[-1] if self.progbar: pbar.set_description( progress_description(self.best), refresh=False ) else: self.trials_since_best += 1 # check if we have run out of time if should_stop(): break if self.progbar: pbar.close() self._maybe_cancel_futures() self._optimizer.cleanup() def search(self, inputs, output, size_dict): """Run this optimizer and return the ``ContractionTree`` for the best path it finds. """ self._search( inputs, output, size_dict, ) return self.tree def get_tree(self): """Return the ``ContractionTree`` for the best path found.""" return self.tree def __call__(self, inputs, output, size_dict, memory_limit=None): """``opt_einsum`` interface, returns direct ``path``.""" self._search( inputs, output, size_dict, ) return tuple(self.path) def get_trials(self, sort=None): trials = list( zip( self.method_choices, self.costs_size, self.costs_flops, self.costs_write, self.param_choices, ) ) if sort == "method": trials.sort(key=lambda t: t[0]) if sort == "combo": trials.sort( key=lambda t: log2(t[1]) / 1e3 + log2(t[2] + 256 * t[3]) ) if sort == "size": trials.sort( key=lambda t: log2(t[1]) + log2(t[2]) / 1e3 + log2(t[3]) / 1e3 ) if sort == "flops": trials.sort( key=lambda t: log2(t[1]) / 1e3 + log2(t[2]) + log2(t[3]) / 1e3 ) if sort == "write": trials.sort( key=lambda t: log2(t[1]) / 1e3 + log2(t[2]) / 1e3 + log2(t[3]) ) return trials def print_trials(self, sort=None): header = "{:>11} {:>11} {:>11} {}" print( header.format( "METHOD", "log2[SIZE]", "log10[FLOPS]", "log10[WRITE]", "PARAMS", ) ) row = "{:>11} {:>11.2f} {:>11.2f} {:>11.2f} {}" for choice, size, flops, write, params in self.get_trials(sort): print( row.format( choice, log2(size), log10(flops), log10(write), params ) ) def to_df(self): """Create a single ``pandas.DataFrame`` with all trials and scores.""" import pandas return pandas.DataFrame( data={ "run": list(range(len(self.costs_size))), "time": self.times, "method": self.method_choices, "size": list(map(log2, self.costs_size)), "flops": list(map(log10, self.costs_flops)), "write": list(map(log10, self.costs_write)), "random_strength": [ p.get("random_strength", 1e-6) for p in self.param_choices ], "score": self.scores, } ).sort_values(by="method") def to_dfs_parametrized(self): """Create a ``pandas.DataFrame`` for each method, with all parameters and scores for each trial. """ import pandas as pd rows = {} for i in range(len(self.scores)): row = { "run": i, "time": self.times[i], **self.param_choices[i], "flops": log10(self.costs_flops[i]), "write": log2(self.costs_write[i]), "size": log2(self.costs_size[i]), "score": self.scores[i], } method = self.method_choices[i] rows.setdefault(method, []).append(row) return { method: pd.DataFrame(rows[method]).sort_values(by="score") for method in rows } plot_trials = plot_trials plot_trials_alt = plot_trials_alt plot_scatter = plot_scatter plot_scatter_alt = plot_scatter_alt plot_parameters_parallel = plot_parameters_parallel class ReusableHyperOptimizer(ReusableOptimizer): """Like ``HyperOptimizer`` but it will re-instantiate the optimizer whenever a new contraction is detected, and also cache the paths (and sliced indices) found. Parameters ---------- directory : None, True, or str, optional If specified use this directory as a persistent cache. If ``True`` auto generate a directory in the current working directory based on the options which are most likely to affect the path (see `ReusableHyperOptimizer._get_path_relevant_opts`). overwrite : bool or 'improved', optional If ``True``, the optimizer will always run, overwriting old results in the cache. This can be used to update paths without deleting the whole cache. If ``'improved'`` then only overwrite if the new path is better. hash_method : {'a', 'b', ...}, optional The method used to hash the contraction tree. The default, ``'a'``, is faster hashwise but doesn't recognize when indices are permuted. cache_only : bool, optional If ``True``, the optimizer will only use the cache, and will raise ``KeyError`` if a contraction is not found. directory_split : "auto" or bool, optional If specified, the hash will be split into two parts, the first part will be used as a subdirectory, and the second part will be used as the filename. This is useful for avoiding a very large flat diretory. If "auto" it will check the current cache if any and guess from that. opt_kwargs Supplied to ``HyperOptimizer``. """ def _get_path_relevant_opts(self): """Get a frozenset of the options that are most likely to affect the path. These are the options that we use when the directory name is not manually specified. """ return [ ("methods", None), ("minimize", "flops"), ("max_repeats", 128), ("max_time", None), ("slicing_opts", None), ("slicing_reconf_opts", None), ("simulated_annealing_opts", None), ("reconf_opts", None), ("compressed", False), ("multicontraction", False), ] def _get_suboptimizer(self): return HyperOptimizer(**self._suboptimizer_kwargs) def _deconstruct_tree(self, opt, tree): return { "path": tree.get_path(), "score": tree.get_score(), # dont' need to store all slice info, just which indices "sliced_inds": tuple(tree.sliced_inds), } def _reconstruct_tree(self, inputs, output, size_dict, con): tree = ContractionTree.from_path( inputs, output, size_dict, path=con["path"], objective=self.minimize, ) for ix in con["sliced_inds"]: tree.remove_ind_(ix) return tree class HyperCompressedOptimizer(HyperOptimizer): """A compressed contraction path optimizer that samples a series of ordered contraction trees while optimizing the hyper parameters used to generate them. Parameters ---------- chi : None or int, optional The maximum bond dimension to compress to. If ``None`` then use the square of the largest existing dimension. If ``minimize`` is specified as a full scoring function, this is ignored. methods : None or sequence[str] or str, optional Which method(s) to use from ``list_hyper_functions()``. minimize : str, Objective or callable, optional How to score each trial, used to train the optimizer and rank the results. If a custom callable, it should take a ``trial`` dict as its argument and return a single float. max_repeats : int, optional The maximum number of trial contraction trees to generate. Default: 128. max_time : None or float, optional The maximum amount of time to run for. Use ``None`` for no limit. You can also set an estimated execution 'rate' here like ``'rate:1e9'`` that will terminate the search when the estimated FLOPs of the best contraction found divided by the rate is greater than the time spent searching, allowing quick termination on easy contractions. parallel : 'auto', False, True, int, or distributed.Client Whether to parallelize the search. slicing_opts : dict, optional If supplied, once a trial contraction path is found, try slicing with the given options, and then update the flops and size of the trial with the sliced versions. slicing_reconf_opts : dict, optional If supplied, once a trial contraction path is found, try slicing interleaved with subtree reconfiguation with the given options, and then update the flops and size of the trial with the sliced and reconfigured versions. reconf_opts : dict, optional If supplied, once a trial contraction path is found, try subtree reconfiguation with the given options, and then update the flops and size of the trial with the reconfigured versions. optlib : {'cmaes', 'optuna', 'nevergrad', 'skopt', ...}, optional Which optimizer to sample and train with. space : dict, optional The hyper space to search, see ``get_hyper_space`` for the default. score_compression : float, optional Raise scores to this power in order to compress or accentuate the differences. The lower this is, the more the selector will sample from various optimizers rather than quickly specializing. max_training_steps : int, optional The maximum number of trials to train the optimizer with. Setting this can be helpful when the optimizer itself becomes costly to train (e.g. for Gaussian Processes). progbar : bool, optional Show live progress of the best contraction found so far. optlib_opts Supplied to the hyper-optimizer library initialization. """ compressed = True multicontraction = False def __init__( self, chi=None, methods=("greedy-compressed", "greedy-span", "kahypar-agglom"), minimize="peak-compressed", **kwargs, ): if (chi is not None) and not callable(minimize): minimize += f"-{chi}" kwargs["methods"] = methods kwargs["minimize"] = minimize if kwargs.pop("slicing_opts", None) is not None: raise ValueError( "Cannot use slicing_opts with compressed contraction." ) if kwargs.pop("slicing_reconf_opts", None) is not None: raise ValueError( "Cannot use slicing_reconf_opts with compressed contraction." ) super().__init__(**kwargs) class ReusableHyperCompressedOptimizer(ReusableHyperOptimizer): """Like ``HyperCompressedOptimizer`` but it will re-instantiate the optimizer whenever a new contraction is detected, and also cache the paths found. Parameters ---------- chi : None or int, optional The maximum bond dimension to compress to. If ``None`` then use the square of the largest existing dimension. If ``minimize`` is specified as a full scoring function, this is ignored. directory : None, True, or str, optional If specified use this directory as a persistent cache. If ``True`` auto generate a directory in the current working directory based on the options which are most likely to affect the path (see `ReusableHyperOptimizer._get_path_relevant_opts`). overwrite : bool, optional If ``True``, the optimizer will always run, overwriting old results in the cache. This can be used to update paths without deleting the whole cache. hash_method : {'a', 'b', ...}, optional The method used to hash the contraction tree. The default, ``'a'``, is faster hashwise but doesn't recognize when indices are permuted. cache_only : bool, optional If ``True``, the optimizer will only use the cache, and will raise ``KeyError`` if a contraction is not found. opt_kwargs Supplied to ``HyperCompressedOptimizer``. """ def __init__( self, chi=None, methods=("greedy-compressed", "greedy-span", "kahypar-agglom"), minimize="peak-compressed", **kwargs, ): if (chi is not None) and not callable(minimize): minimize += f"-{chi}" kwargs["methods"] = methods kwargs["minimize"] = minimize if kwargs.pop("slicing_opts", None) is not None: raise ValueError( "Cannot use slicing_opts with compressed contraction." ) if kwargs.pop("slicing_reconf_opts", None) is not None: raise ValueError( "Cannot use slicing_reconf_opts with compressed contraction." ) if kwargs.pop("simulated_annealing_opts", None) is not None: raise ValueError( "Cannot use simulated_annealing_opts " "with compressed contraction." ) super().__init__(**kwargs) def _get_suboptimizer(self): return HyperCompressedOptimizer(**self._suboptimizer_kwargs) def _deconstruct_tree(self, opt, tree): return { "path": tree.get_path(), "score": tree.get_score(), "sliced_inds": tuple(tree.sliced_inds), } def _reconstruct_tree(self, inputs, output, size_dict, con): return ContractionTreeCompressed.from_path( inputs, output, size_dict, path=con["path"], objective=self.minimize, ) class HyperMultiOptimizer(HyperOptimizer): compressed = False multicontraction = True ================================================ FILE: cotengra/hyperoptimizers/hyper_cmaes.py ================================================ """Hyper parameter optimization using cmaes, as implemented by https://github.com/CyberAgentAILab/cmaes. """ from ._param_mapping import ( LCBOptimizer, build_params, convert_raw, num_params, ) from .hyper import HyperOptLib, register_hyper_optlib class HyperCMAESSampler: def __init__( self, space, sigma=1.0, lr_adapt=True, separable=False, exponential_param_power=None, **kwargs, ): import cmaes import numpy as np self.params = build_params( space, exponential_param_power=exponential_param_power ) ndim = num_params(self.params) if separable: CMA = cmaes.SepCMA else: CMA = cmaes.CMA kwargs["lr_adapt"] = lr_adapt self.opt = CMA( mean=np.zeros(ndim), sigma=sigma, bounds=np.array([(-1.0, 1.0)] * ndim), **kwargs, ) self._trial_counter = 0 self._trial_store = {} self._batch = [] def ask(self): # raw vector x = self.opt.ask() # need to store raw trial to report later trial_number = self._trial_counter self._trial_store[trial_number] = x self._trial_counter += 1 return trial_number, convert_raw(self.params, x) def tell(self, trial_number, value): # retrieve raw vector x = self._trial_store.pop(trial_number) # wait until batch has reached population size self._batch.append((x, value)) if len(self._batch) == self.opt.population_size: self.opt.tell(self._batch) self._batch.clear() class CMAESOptLib(HyperOptLib): """Hyper-optimization using CMA-ES with per-method optimizers and a Lower Confidence Bound method selector. """ def setup( self, methods, space, optimizer=None, sigma=1.0, lr_adapt=True, method_exploration=1.0, method_temperature=1.0, exponential_param_power=None, **cmaes_opts, ): self._method_chooser = LCBOptimizer( options=methods, exploration=method_exploration, temperature=method_temperature, ) self._optimizers = { method: HyperCMAESSampler( space[method], sigma=sigma, lr_adapt=lr_adapt, exponential_param_power=exponential_param_power, **cmaes_opts, ) for method in methods } def get_setting(self): method = self._method_chooser.ask() params_token, params = self._optimizers[method].ask() return { "method": method, "params_token": params_token, "params": params, } def report_result(self, setting, trial, score): self._method_chooser.tell(setting["method"], score) self._optimizers[setting["method"]].tell( setting["params_token"], score ) register_hyper_optlib("cmaes", CMAESOptLib) ================================================ FILE: cotengra/hyperoptimizers/hyper_es.py ================================================ """Hyper optimization using a steady-state diagonal evolutionary strategy.""" import bisect import math from ..utils import get_rng from ._param_mapping import ( LCBOptimizer, build_params, convert_raw, num_params, ) from .hyper import HyperOptLib, register_hyper_optlib # E[|N(0,1)|] = sqrt(2/pi), used for CSA path length expectation. _CHI1 = math.sqrt(2.0 / math.pi) def _reflect(x): """Reflect a scalar into [-1, 1].""" # fold back into [-1, 1] by reflecting off boundaries while x > 1.0 or x < -1.0: if x > 1.0: x = 2.0 - x if x < -1.0: x = -2.0 - x return x class SteadyStateES: """A steady-state diagonal evolutionary strategy (SSES) operating in raw ``[-1, 1]`` parameter space. Unlike a generational ES, this sampler has no synchronization barrier. Every ``ask`` draws from the current distribution immediately, and every ``tell`` updates the distribution state from a sliding window of recent results. Trials can be in-flight in any number and can complete in any order. Step sizes are adapted per dimension using a simplified cumulative step-size adaptation (CSA) rule, giving the optimizer the character of a separable (diagonal) CMA-ES without any matrix operations. Parameters ---------- space : dict[str, dict] The search space for a single contraction method. seed : None or int, optional Random seed. population_size : int or "auto", optional Size of the sliding archive window. When ``"auto"`` it is chosen as ``max(8, 4 * ndim)``. sigma : float, optional Initial per-dimension step size in raw ``[-1, 1]`` space. sigma_min : float, optional Lower bound for per-dimension step sizes. sigma_max : float, optional Upper bound for per-dimension step sizes (also the restart value). c_sigma : float or "auto", optional Learning rate for the evolution path. When ``"auto"`` it is set to ``1 / sqrt(ndim)`` (clamped to ``[0.05, 1.0]``). d_sigma : float or "auto", optional Damping factor for step-size updates. When ``"auto"`` it is set to ``1 + sqrt(ndim)``. elite_ratio : float, optional Fraction of the archive used as elites for weighted recombination. use_mirror : bool, optional If ``True``, every fresh perturbation is paired with its antipodal mirror, halving gradient variance. inject_best_every : int or "auto", optional Inject the best-so-far point every this many asks. When ``"auto"`` it equals ``population_size``. restart_patience : int or "auto", optional Number of tells without improvement before resetting step sizes and re-centering on the best-so-far point. When ``"auto"`` it equals ``5 * population_size``. explore_prob : float, optional Probability of issuing a uniform random point instead of the ES-directed point. Maintains global diversity throughout the search and helps escape local minima. Random points still feed into the archive normally. mean_lr : float, optional Learning rate for the mean update in ``(0, 1]``. Each tell blends the current mean toward the elite weighted mean by this factor: ``mean = (1 - mean_lr) * mean + mean_lr * elite_mean``. Values below ``1.0`` smooth out noise-driven mean drift. Default is ``1.0`` (full update, original behaviour). exponential_param_power : float, optional Passed through to the shared parameter mapping for ``FLOAT_EXP`` parameters. """ def __init__( self, space, seed=None, population_size="auto", sigma=0.5, sigma_min=0.01, sigma_max=1.0, c_sigma="auto", d_sigma="auto", elite_ratio=0.5, use_mirror=True, inject_best_every="auto", restart_patience="auto", explore_prob=0.05, mean_lr=0.5, exponential_param_power=None, ): self.rng = get_rng(seed) self.params = build_params( space, exponential_param_power=exponential_param_power ) self.ndim = num_params(self.params) if population_size == "auto": population_size = max(8, 4 * self.ndim) self.population_size = population_size self.sigma0 = sigma self.sigma_min = sigma_min self.sigma_max = sigma_max if c_sigma == "auto": if self.ndim > 0: c_sigma = min(1.0, max(0.05, 1.0 / math.sqrt(self.ndim))) else: c_sigma = 1.0 self.c_sigma = c_sigma if d_sigma == "auto": d_sigma = 1.0 + math.sqrt(self.ndim) self.d_sigma = d_sigma self.elite_ratio = elite_ratio self.use_mirror = use_mirror self.explore_prob = explore_prob self.mean_lr = mean_lr if inject_best_every == "auto": inject_best_every = population_size self.inject_best_every = inject_best_every if restart_patience == "auto": restart_patience = 2 * population_size self.restart_patience = restart_patience # precompute log-rank weights for the elite portion of the archive mu = max(1, int(round(self.elite_ratio * self.population_size))) raw_w = [math.log(mu + 1) - math.log(i + 1) for i in range(mu)] w_sum = sum(raw_w) self._weights = [w / w_sum for w in raw_w] self._mu = mu # effective number of elites (for CSA scaling) self._mu_eff = 1.0 / sum(w * w for w in self._weights) self._init_state() def _init_state(self): """Initialize or reset the mutable optimizer state.""" self.mean = [0.0] * self.ndim self.sigmas = [self.sigma0] * self.ndim self.p_sigma = [0.0] * self.ndim # archive: list of (score, x) sorted by score ascending (best # first). we keep at most ``population_size`` entries. self._archive = [] # in-flight trials not yet told self._pending = {} # global best self.best_x = None self.best_score = float("inf") self._ask_counter = 0 self._tell_counter = 0 self._tells_since_improvement = 0 self._restart_count = 0 # mirror queue: the eps vector waiting to be issued as -eps self._mirror_eps = None # ------------------------------------------------------------------ # # ask # ------------------------------------------------------------------ # def ask(self): """Return the next candidate point. Draws from the current distribution, optionally using mirrored sampling or best-so-far injection. No synchronization with outstanding trials is required. """ trial_number = self._ask_counter self._ask_counter += 1 if self.ndim == 0: x = () self._pending[trial_number] = x return trial_number, convert_raw(self.params, x) # --- global random exploration --- if self.explore_prob > 0 and self.rng.random() < self.explore_prob: x = tuple(self.rng.uniform(-1.0, 1.0) for _ in range(self.ndim)) self._pending[trial_number] = x return trial_number, convert_raw(self.params, x) # --- mirrored partner from previous ask --- if self._mirror_eps is not None: eps = self._mirror_eps self._mirror_eps = None x = tuple( _reflect(self.mean[d] - eps[d]) for d in range(self.ndim) ) self._pending[trial_number] = x return trial_number, convert_raw(self.params, x) # --- best-so-far injection --- if ( self.best_x is not None and self.inject_best_every > 0 and trial_number % self.inject_best_every == 0 and trial_number > 0 ): # inject with a tiny perturbation so it's not an exact # duplicate (which would be wasted on a stochastic function) x = tuple( _reflect(self.rng.gauss(self.best_x[d], 0.05 * self.sigmas[d])) for d in range(self.ndim) ) self._pending[trial_number] = x return trial_number, convert_raw(self.params, x) # --- fresh sample --- eps = tuple( self.rng.gauss(0.0, self.sigmas[d]) for d in range(self.ndim) ) x = tuple(_reflect(self.mean[d] + eps[d]) for d in range(self.ndim)) if self.use_mirror: self._mirror_eps = eps self._pending[trial_number] = x return trial_number, convert_raw(self.params, x) # ------------------------------------------------------------------ # # tell # ------------------------------------------------------------------ # def tell(self, trial_number, score): """Record a completed trial and update the distribution. Updates the sliding archive, recomputes the weighted mean from elites, adapts per-dimension step sizes via evolution paths, and checks for stalls. """ x = self._pending.pop(trial_number) self._tell_counter += 1 # update global best if score < self.best_score: self.best_score = score self.best_x = x self._tells_since_improvement = 0 else: self._tells_since_improvement += 1 if self.ndim == 0: return # --- insert into archive (sorted by score, ascending) --- pos = bisect.bisect_left(self._archive, score, key=lambda e: e[0]) self._archive.insert(pos, (score, x)) if len(self._archive) > self.population_size: self._archive.pop() # drop worst (highest score) # need at least mu results before we can update meaningfully if len(self._archive) < self._mu: return # --- weighted recombination from elites --- old_mean = self.mean elite_mean = [0.0] * self.ndim for wi, (_, xi) in zip(self._weights, self._archive): for d in range(self.ndim): elite_mean[d] += wi * xi[d] # blend toward elite mean at rate mean_lr; values < 1.0 smooth # out noise-driven drift on highly stochastic objectives lr = self.mean_lr if lr >= 1.0: new_mean = elite_mean else: new_mean = [ (1.0 - lr) * old_mean[d] + lr * elite_mean[d] for d in range(self.ndim) ] self.mean = new_mean # --- evolution path and sigma adaptation per dimension --- c = self.c_sigma complement = math.sqrt(c * (2.0 - c) * self._mu_eff) for d in range(self.ndim): sd = self.sigmas[d] if sd < 1e-30: sd = self.sigma_min delta = (new_mean[d] - old_mean[d]) / sd # update conjugate evolution path self.p_sigma[d] = (1.0 - c) * self.p_sigma[d] + ( complement * delta ) # adapt step size: increase if path is longer than expected, # decrease if shorter self.sigmas[d] = sd * math.exp( (c / self.d_sigma) * (abs(self.p_sigma[d]) / _CHI1 - 1.0) ) # clamp self.sigmas[d] = min( max(self.sigmas[d], self.sigma_min), self.sigma_max ) # --- stall-triggered restart --- if self._tells_since_improvement >= self.restart_patience: self._restart() def _restart(self): """Reset step sizes and re-center. Alternates between re-centering on the best-so-far point (exploitation restart) and a uniformly random point (exploration restart) to avoid repeated restarts converging to the same local minimum. """ self.sigmas = [self.sigma0] * self.ndim self.p_sigma = [0.0] * self.ndim if self._restart_count % 2 == 0 and self.best_x is not None: # even restarts: exploit best known point self.mean = list(self.best_x) else: # odd restarts: jump to a random point in the search space self.mean = [self.rng.uniform(-1.0, 1.0) for _ in range(self.ndim)] self._archive.clear() self._tells_since_improvement = 0 self._restart_count += 1 class ESOptLib(HyperOptLib): """Hyper-optimization using a steady-state diagonal ES.""" def setup( self, methods, space, optimizer=None, population_size="auto", sigma=0.5, sigma_min=0.01, sigma_max=1.0, c_sigma="auto", d_sigma="auto", elite_ratio=0.5, use_mirror=True, inject_best_every="auto", restart_patience="auto", explore_prob=0.05, mean_lr=1.0, method_exploration=1.0, method_temperature=1.0, exponential_param_power=None, seed=None, **kwargs, ): """Initialize ES optimizers for each contraction method. Parameters ---------- methods : list[str] The contraction methods to optimize over. space : dict[str, dict[str, dict]] The per-method hyperparameter search space. optimizer : HyperOptimizer, optional The parent optimizer. population_size : int or "auto", optional Archive window size for each method-specific ES sampler. sigma : float, optional Initial per-dimension step size. sigma_min, sigma_max : float, optional Bounds for per-dimension step sizes. c_sigma : float or "auto", optional Evolution path learning rate. d_sigma : float or "auto", optional Step-size damping factor. elite_ratio : float, optional Fraction of the archive used as elites. use_mirror : bool, optional Enable mirrored sampling. inject_best_every : int or "auto", optional Best-injection frequency. restart_patience : int or "auto", optional Tells without improvement before restart. explore_prob : float, optional Probability of issuing a uniform random point on each ask. mean_lr : float, optional Learning rate for the mean update in ``(0, 1]``. method_exploration : float, optional Exploration strength for the LCB-based method chooser. method_temperature : float, optional Noise temperature for the LCB-based method chooser. exponential_param_power : float, optional Passed to the shared parameter mapping for ``FLOAT_EXP``. seed : None or int, optional Random seed. """ if population_size == "auto": max_ndim = max( num_params( build_params( space[m], exponential_param_power=exponential_param_power, ) ) for m in methods ) population_size = max( 8, max(1, getattr(optimizer, "pre_dispatch", 1)), 4 * max_ndim, ) self._method_chooser = LCBOptimizer( options=methods, exploration=method_exploration, temperature=method_temperature, seed=seed, ) self._optimizers = {} for i, method in enumerate(methods): # diversify seeds across methods if seed is not None: method_seed = hash((seed, i, method)) % (2**31) else: method_seed = None self._optimizers[method] = SteadyStateES( space[method], seed=method_seed, population_size=population_size, sigma=sigma, sigma_min=sigma_min, sigma_max=sigma_max, c_sigma=c_sigma, d_sigma=d_sigma, elite_ratio=elite_ratio, use_mirror=use_mirror, inject_best_every=inject_best_every, restart_patience=restart_patience, explore_prob=explore_prob, mean_lr=mean_lr, exponential_param_power=exponential_param_power, ) def get_setting(self): """Choose a contraction method, then request its next setting.""" method = self._method_chooser.ask() params_token, params = self._optimizers[method].ask() return { "method": method, "params_token": params_token, "params": params, } def report_result(self, setting, trial, score): """Report a completed trial back to the method chooser and ES.""" self._method_chooser.tell(setting["method"], score) self._optimizers[setting["method"]].tell( setting["params_token"], score ) register_hyper_optlib("sses", ESOptLib) ================================================ FILE: cotengra/hyperoptimizers/hyper_neldermead.py ================================================ """Hyper optimization using the Nelder-Mead simplex method.""" import warnings from ..utils import get_rng from ._param_mapping import ( LCBOptimizer, build_params, convert_raw, generate_lhs_points, num_params, ) from .hyper import HyperOptLib, register_hyper_optlib # state constants _INIT = "init" _REFLECT = "reflect" _EXPAND = "expand" _CONTRACT = "contract" _SHRINK = "shrink" def _clip(x, lo=-1.0, hi=1.0): """Clip scalar ``x`` to the interval ``[lo, hi]``.""" return min(max(x, lo), hi) def clamp(xs, lo=-1.0, hi=1.0): """Clip each element of the list ``xs`` to the interval ``[lo, hi]``.""" return [_clip(xi, lo, hi) for xi in xs] class _NMCore: """Minimal Nelder-Mead simplex state machine on raw vectors. Manages n+1 vertices and iteratively improves via reflection, expansion, contraction, and shrink. When the simplex diameter drops below ``convergence_tol`` the ``converged`` flag is set and no further points are issued. Parameters ---------- ndim : int Number of raw dimensions. center : list[float] Center point for the initial simplex. scales : list[float] Per-dimension scale for axis-aligned perturbations used to construct the initial simplex around ``center``. adaptive : bool Whether to use the adaptive NM coefficients recommended by Gao and Han (2010), which scale with problem dimension. If `True` then `alpha`, `gamma`, `rho`, and `sigma` are ignored. alpha : float Reflection coefficient (standard NM default: 1). If ``adaptive`` is `True` then this is ignored and set to 1.0. gamma : float Expansion coefficient (standard NM default: 2). If ``adaptive`` is `True` then this is ignored and set to ``1 + 2 / ndim``. rho : float Contraction coefficient (standard NM default: 0.5). If ``adaptive`` is `True` then this is ignored and set to ``0.75 - 1 / (2 * ndim)``. sigma : float Shrink coefficient (standard NM default: 0.5). If ``adaptive`` is `True` then this is ignored and set to ``1 - 1 / ndim``. convergence_tol : float When the Chebyshev diameter of the simplex falls below this value the core signals convergence. psi : float, optional Relative simplex reduction target. When set, the core also converges once the simplex diameter has been reduced below ``psi`` times its initialized diameter. This mirrors the internal convergence mode used by Sbplx in NLopt. inject_diameter_fraction : float Maximum allowed simplex diameter inflation when injecting an external vertex. The candidate's max distance to any non-worst vertex must be at most ``inject_diameter_fraction * current_diameter``. Use ``1.0`` (default) to prevent any inflation, ``> 1.0`` to allow some growth, or ``float('inf')`` to disable the gate entirely. inject_restart_fraction : float When injecting an external vertex that is far from the current simplex (beyond the diameter-based gate above), if its score is better than this fraction of the current best score, flag convergence to trigger an early restart focused on the better region. Set to ``0.0`` to disable this behavior. """ def __init__( self, ndim, center, scales, adaptive=False, alpha=1.0, gamma=2.0, rho=0.5, sigma=0.5, convergence_tol=0.01, psi=None, inject_diameter_fraction=1.5, inject_restart_fraction=0.6, ): self.ndim = ndim if adaptive: self.alpha = 1.0 self.gamma = 1.0 + 2.0 / ndim self.rho = 0.75 - 1.0 / (2.0 * ndim) self.sigma = 1.0 - 1.0 / ndim else: self.alpha = alpha self.gamma = gamma self.rho = rho self.sigma = sigma self.convergence_tol = convergence_tol self.psi = psi self.inject_diameter_fraction = inject_diameter_fraction self.inject_restart_fraction = inject_restart_fraction self._token_counter = 0 self._tell_count = 0 self._best_vertex = None self._best_score = float("inf") self._converged = False self._initial_simplex_diameter = None self._vertices = [] self._scores = [] # pending (token, x, role) tuples waiting to be issued self._ask_queue = [] # token -> (x, role), kept until tell() consumes it self._token_map = {} # token -> (x, score, role), buffered until the state machine is ready self._results = {} self._state = _INIT self._centroid = None self._reflect_x = None self._reflect_score = None self._contract_inside = False self._pending_injection = None if self.ndim > 0: self._initialize_simplex(center, scales) @property def converged(self): """True when simplex diameter < convergence_tol.""" return self._converged @property def best_vertex(self): return self._best_vertex @property def best_score(self): return self._best_score def _centroid_of(self, vertices): n = len(vertices) return [sum(v[d] for v in vertices) / n for d in range(self.ndim)] def _reflect(self, centroid, worst): return clamp( [ centroid[d] + self.alpha * (centroid[d] - worst[d]) for d in range(self.ndim) ] ) def _expand(self, centroid, reflected): return clamp( [ centroid[d] + self.gamma * (reflected[d] - centroid[d]) for d in range(self.ndim) ] ) def _contract_outside_pt(self, centroid, reflected): return clamp( [ centroid[d] + self.rho * (reflected[d] - centroid[d]) for d in range(self.ndim) ] ) def _contract_inside_pt(self, centroid, worst): return clamp( [ centroid[d] + self.rho * (worst[d] - centroid[d]) for d in range(self.ndim) ] ) def _shrink_vertex(self, best, vertex): return clamp( [ best[d] + self.sigma * (vertex[d] - best[d]) for d in range(self.ndim) ] ) def _sort_simplex(self): paired = sorted(zip(self._scores, self._vertices), key=lambda t: t[0]) self._scores = [s for s, _ in paired] self._vertices = [list(v) for _, v in paired] def _simplex_diameter(self): """Chebyshev (L-inf) diameter of the current simplex.""" n = len(self._vertices) diam = 0.0 for i in range(n): for j in range(i + 1, n): d = max( abs(self._vertices[i][k] - self._vertices[j][k]) for k in range(self.ndim) ) if d > diam: diam = d return diam def _diameter_converged(self): diameter = self._simplex_diameter() if diameter < self.convergence_tol: # absolute diameter convergence return True if self.psi is None or self._initial_simplex_diameter is None: # relative diameter convergence not enabled or not initialized return False # relative diameter convergence converged = diameter < self.psi * self._initial_simplex_diameter return converged def _initialize_simplex(self, center, scales): self._vertices = [] self._scores = [] self._ask_queue = [] self._token_map = {} self._results = {} self._state = _INIT # n+1 vertices: center plus one axis-aligned perturbation per dimension self._enqueue(clamp(list(center)), "init") for i in range(self.ndim): v = list(center) v[i] += scales[i] self._enqueue(clamp(v), "init") def _enqueue(self, x, role): token = self._token_counter self._token_counter += 1 x = list(x) self._ask_queue.append((token, x, role)) self._token_map[token] = (x, role) def _try_advance(self): if self._state == _INIT: self._try_advance_init() elif self._state == _REFLECT: self._try_advance_reflect() elif self._state == _EXPAND: self._try_advance_expand() elif self._state == _CONTRACT: self._try_advance_contract() elif self._state == _SHRINK: self._try_advance_shrink() def _try_advance_init(self): # need all n+1 init results before proceeding init_results = { tn: r for tn, r in self._results.items() if r[2] == "init" } n_expected = self.ndim + 1 if len(init_results) < n_expected: return self._vertices = [] self._scores = [] # consume results in token order to preserve the deterministic vertex # ordering (center first, then per-dimension perturbations) for tn in sorted(init_results): x, score, _ = init_results[tn] self._vertices.append(list(x)) self._scores.append(score) del self._results[tn] self._sort_simplex() self._initial_simplex_diameter = max( self._simplex_diameter(), self.convergence_tol ) self._begin_reflect() def inject_vertex(self, x, score): """Defer replacement of the worst vertex with an external point. The replacement is applied at the next ``_begin_reflect`` call so that in-progress NM operations are not disrupted. Only accepted when the simplex is initialized and ``score`` improves on the current worst vertex. Parameters ---------- x : list[float] Raw coordinate vector (same dimensionality as the simplex). score : float Objective value at ``x``. Returns ------- accepted : bool Whether the injection was accepted (deferred). """ if self._converged: # in finished state return False if self._state == _INIT: # not ready return False if not self._scores or score >= self._scores[-1]: # not better than current worst vertex return False if self._pending_injection is not None: # not better than a previously injected vertex if score >= self._pending_injection[1]: return False # only inject if it won't inflate the simplex beyond the threshold threshold = self._simplex_diameter() * self.inject_diameter_fraction for v in self._vertices[:-1]: d = max(abs(x[k] - v[k]) for k in range(self.ndim)) if d > threshold: # vertex is too far from simplex to accept if ( self._best_score is not None and score < self.inject_restart_fraction * self._best_score and self._tell_count >= self.ndim + 1 ): # BUT, early convergence signal: if pointdramatically # better, force convergence to restart from better region self._converged = True return False self._pending_injection = (list(x), score) return True def _begin_reflect(self): # apply deferred injection if present if self._pending_injection is not None: inj_x, inj_score = self._pending_injection self._pending_injection = None self._vertices[-1] = inj_x self._scores[-1] = inj_score self._sort_simplex() if self._diameter_converged(): # convergence is checked at the start of each NM iteration - if the # simplex has collapsed, flag upstream rather than issuing self._converged = True return self._centroid = self._centroid_of(self._vertices[:-1]) self._reflect_x = self._reflect(self._centroid, self._vertices[-1]) self._state = _REFLECT self._enqueue(self._reflect_x, "reflect") def _try_advance_reflect(self): reflect_results = { tn: r for tn, r in self._results.items() if r[2] == "reflect" } if not reflect_results: return tn = next(iter(reflect_results)) x, score, _ = reflect_results[tn] del self._results[tn] self._reflect_score = score best_score = self._scores[0] second_worst_score = self._scores[-2] worst_score = self._scores[-1] if best_score <= self._reflect_score < second_worst_score: # reflection is better than 2nd-worst but not best: # accept and start a new iteration self._vertices[-1] = list(self._reflect_x) self._scores[-1] = self._reflect_score self._sort_simplex() self._begin_reflect() elif self._reflect_score < best_score: # new best: try expanding further expand_x = self._expand(self._centroid, self._reflect_x) self._state = _EXPAND self._enqueue(expand_x, "expand") elif self._reflect_score < worst_score: # worse than 2nd-worst but better than worst: # try contracting on the reflection side contract_x = self._contract_outside_pt( self._centroid, self._reflect_x ) self._contract_inside = False self._state = _CONTRACT self._enqueue(contract_x, "contract") else: # worse than or equal to worst: # contract toward the worst vertex (inside contraction) contract_x = self._contract_inside_pt( self._centroid, self._vertices[-1] ) self._contract_inside = True self._state = _CONTRACT self._enqueue(contract_x, "contract") def _try_advance_expand(self): expand_results = { tn: r for tn, r in self._results.items() if r[2] == "expand" } if not expand_results: return tn = next(iter(expand_results)) x, score, _ = expand_results[tn] del self._results[tn] if score < self._reflect_score: # expansion improved on reflection: accept it self._vertices[-1] = list(x) self._scores[-1] = score else: # expansion didn't help: keep the reflection self._vertices[-1] = list(self._reflect_x) self._scores[-1] = self._reflect_score self._sort_simplex() self._begin_reflect() def _try_advance_contract(self): contract_results = { tn: r for tn, r in self._results.items() if r[2] == "contract" } if not contract_results: return tn = next(iter(contract_results)) x, score, _ = contract_results[tn] del self._results[tn] # inside contraction must beat the worst vertex: # outside contraction must beat the reflected point if self._contract_inside: threshold = self._scores[-1] else: threshold = self._reflect_score if score < threshold: self._vertices[-1] = list(x) self._scores[-1] = score self._sort_simplex() self._begin_reflect() else: # contraction failed: # fall back to shrinking the entire simplex toward best vertex self._begin_shrink() def _begin_shrink(self): self._state = _SHRINK best = self._vertices[0] for i in range(1, len(self._vertices)): new_v = self._shrink_vertex(best, self._vertices[i]) self._enqueue(new_v, "shrink") def _try_advance_shrink(self): shrink_results = { tn: r for tn, r in self._results.items() if r[2] == "shrink" } n_expected = len(self._vertices) - 1 if len(shrink_results) < n_expected: return new_verts = [] new_scores = [] for tn in sorted(shrink_results): x, score, _ = shrink_results[tn] new_verts.append(list(x)) new_scores.append(score) del self._results[tn] self._vertices[1:] = new_verts self._scores[1:] = new_scores self._sort_simplex() self._begin_reflect() def ask(self): """Return ``(token, raw_x)`` or ``None`` if blocked.""" if self._converged: return None self._try_advance() if self._ask_queue: token, x, _ = self._ask_queue.pop(0) return token, x return None def tell(self, token, score): """Report the objective value for a previously issued token. Unknown tokens (e.g. from a replaced core) are silently ignored so that late-arriving results from a previous core instance do not cause errors. """ self._tell_count += 1 x, role = self._token_map.pop(token, (None, None)) if x is not None and score < self._best_score: self._best_score = score self._best_vertex = list(x) # unknown token - nothing to feed the state machine if role is None: return self._results[token] = (list(x), score, role) self._try_advance() class HyperNelderMeadSampler: """Nelder-Mead simplex optimizer in raw ``[-1, 1]`` space. Wraps a ``_NMCore`` state machine and adds parameter mapping, random filler point generation while the core is blocked, and automatic restarts when the simplex converges. Parameters ---------- space : dict[str, dict] The search space for a single contraction method. seed : None or int or random.Random, optional Random seed. adaptive : bool, optional Whether to use the adaptive NM coefficients recommended by Gao and Han (2010), which scale with problem dimension. If `True` then `alpha`, `gamma`, `rho`, and `sigma` are ignored. alpha : float, optional Reflection coefficient. gamma : float, optional Expansion coefficient. rho : float, optional Contraction coefficient. sigma : float, optional Shrink coefficient. initial_scale : float, optional Scale of the initial simplex around the origin. restart_tol : float, optional When the simplex diameter falls below this, restart. restart_scale : float, optional Scale of the restarted simplex around the best point. filler_scale : float, optional Standard deviation of the gaussian noise used for filler points issued while the core Nelder-Mead routine is blocked. n_initial : int or None, optional Number of Latin Hypercube Sampled (LHS) warm-up points to evaluate before starting the simplex. The best result seeds the initial simplex center. Default ``None`` means ``2 * ndim``. Set to ``0`` to disable. explore_prob : float, optional Probability of issuing a uniform random point instead of the NM-directed point during normal operation. Maintains diversity throughout the search. inject_diameter_fraction : float, optional Passed to ``_NMCore`` — controls the maximum allowed simplex diameter inflation when injecting an external vertex. exponential_param_power : float, optional Passed through to the shared parameter mapping. """ def __init__( self, space, seed=None, adaptive=False, alpha=1.0, gamma=2.0, rho=0.5, sigma=0.5, initial_scale=0.6, restart_tol=0.01, restart_scale=0.5, filler_scale=0.3, n_initial=None, explore_prob=0.05, inject_diameter_fraction=1.5, inject_restart_fraction=0.6, exponential_param_power=None, ): self.rng = get_rng(seed) self.params = build_params( space, exponential_param_power=exponential_param_power, ) self.ndim = num_params(self.params) self.adaptive = adaptive self.alpha = alpha self.gamma = gamma self.rho = rho self.sigma = sigma self.initial_scale = initial_scale self.restart_tol = restart_tol self.restart_scale = restart_scale self.filler_scale = filler_scale self.explore_prob = explore_prob self.inject_diameter_fraction = inject_diameter_fraction self.inject_restart_fraction = inject_restart_fraction if n_initial is None: n_initial = 2 * self.ndim self.n_initial = n_initial self._trial_counter = 0 self._restart_count = 0 self._best_x = None self._best_score = float("inf") # trial_number -> ("nm", core_token, raw_x) or # ("filler", None, raw_x) or # ("init", None, raw_x) self._trial_map = {} # LHS warm-up phase state if self.ndim > 0 and self.n_initial > 0: self._init_points = generate_lhs_points( self.ndim, self.n_initial, self.rng ) self._init_pending = 0 self._init_phase = True else: self._init_points = [] self._init_pending = 0 self._init_phase = False if self.ndim > 0 and not self._init_phase: center = [0.0] * self.ndim scales = [initial_scale] * self.ndim self._core = self._make_core(center, scales) else: self._core = None def _make_core(self, center, scales): return _NMCore( ndim=self.ndim, center=center, scales=scales, adaptive=self.adaptive, alpha=self.alpha, gamma=self.gamma, rho=self.rho, sigma=self.sigma, convergence_tol=self.restart_tol, inject_diameter_fraction=self.inject_diameter_fraction, inject_restart_fraction=self.inject_restart_fraction, ) def _ask_filler(self): if self._core is not None and self._core.best_vertex is not None: center = self._core.best_vertex elif self._best_x is not None: center = self._best_x else: center = [0.0] * self.ndim if self.filler_scale == "uniform": # global sampling x = [self.rng.uniform(-1.0, 1.0) for _ in center] else: # locally sample around best point scale = self.filler_scale if self._core is not None and not self._core.converged: # if the core is active, scale with the current simplex # diameter so that fillers are more likely to be accepted diameter = self._core._simplex_diameter() scale = max(diameter, self.filler_scale) x = [_clip(self.rng.gauss(ci, scale)) for ci in center] trial_number = self._trial_counter self._trial_counter += 1 self._trial_map[trial_number] = ("filler", None, x) return trial_number, x def ask(self): """Return the next candidate setting. During the LHS warm-up phase, pre-generated Latin Hypercube points are issued one at a time. Once all warm-up results have been collected, the NM simplex is initialized centered on the best warm-up point. During normal operation, with probability ``explore_prob`` a uniform random point is returned to maintain diversity. If the NM state machine is blocked waiting for results, a filler point is returned instead. """ if self.ndim == 0: trial_number = self._trial_counter self._trial_counter += 1 return trial_number, convert_raw(self.params, ()) # latin hypercube sampling (LHS) warm-up phase if self._init_phase: if self._init_points: x = self._init_points.pop() trial_number = self._trial_counter self._trial_counter += 1 self._trial_map[trial_number] = ("init", None, x) self._init_pending += 1 return trial_number, convert_raw(self.params, x) # all init points issued but some results still pending trial_number, x = self._ask_filler() return trial_number, convert_raw(self.params, x) # random exploration if self.explore_prob > 0 and self.rng.random() < self.explore_prob: x = [self.rng.uniform(-1.0, 1.0) for _ in range(self.ndim)] trial_number = self._trial_counter self._trial_counter += 1 self._trial_map[trial_number] = ("filler", None, x) return trial_number, convert_raw(self.params, x) # normal nelder mead simplex operation result = self._core.ask() if result is not None: core_token, x = result trial_number = self._trial_counter self._trial_counter += 1 self._trial_map[trial_number] = ("nm", core_token, x) return trial_number, convert_raw(self.params, x) # state machine is blocked, issue filler trial_number, x = self._ask_filler() return trial_number, convert_raw(self.params, x) def tell(self, trial_number, score): """Record a completed trial result.""" if self.ndim == 0: if score < self._best_score: self._best_score = score return role, core_token, x = self._trial_map.pop( trial_number, ("filler", None, None) ) # update global best (includes fillers and init points: # a lucky random point is still a valid best-known solution) if score < self._best_score: self._best_score = score if x is not None: self._best_x = list(x) # handle LHS warm-up phase completion if role == "init": self._init_pending -= 1 if self._init_pending <= 0 and not self._init_points: # all warm-up points evaluated — create the NM core # centered on the best warm-up result center = ( list(self._best_x) if self._best_x is not None else [0.0] * self.ndim ) scales = [self.initial_scale] * self.ndim self._core = self._make_core(center, scales) self._init_phase = False return # attempt to inject high-quality filler/exploration results into # the active NM simplex so they influence the current run if ( role != "nm" and x is not None and self._core is not None and not self._core.converged ): self._core.inject_vertex(list(x), score) if role == "nm" and core_token is not None: self._core.tell(core_token, score) # when the core converges, replace it with a fresh simplex centered on # the best-known point. Any in-flight trials from the old core will be # silently ignored by the new core's tell(). if self._core is not None and self._core.converged: self._restart_count += 1 if self._restart_count % 2 == 1: # odd restarts: local refine around best known point center = ( self._best_x if self._best_x is not None else [0.0] * self.ndim ) else: # even restarts: global random point center = [ self.rng.uniform(-1.0, 1.0) for _ in range(self.ndim) ] scales = [self.restart_scale] * self.ndim self._core = self._make_core(center, scales) class NelderMeadOptLib(HyperOptLib): """Hyper-optimization backend using the Nelder-Mead simplex method.""" def setup( self, methods, space, optimizer=None, adaptive=False, alpha=1.0, gamma=2.0, rho=0.5, sigma=0.5, initial_scale=0.6, restart_tol=0.01, restart_scale=0.5, filler_scale=0.3, n_initial=None, explore_prob=0.05, inject_diameter_fraction=1.5, inject_restart_fraction=0.6, method_exploration=1.0, method_temperature=1.0, exponential_param_power=None, seed=None, **kwargs, ): """Initialize Nelder-Mead optimizers for each method. Parameters ---------- methods : list[str] The contraction methods to optimize over. space : dict[str, dict[str, dict]] The per-method hyperparameter search space. optimizer : HyperOptimizer, optional The parent optimizer. adaptive : bool, optional Whether to use the adaptive NM coefficients recommended by Gao and Han (2010), which scale with problem dimension. If `True` then `alpha`, `gamma`, `rho`, and `sigma` are ignored. alpha : float, optional Reflection coefficient. gamma : float, optional Expansion coefficient. rho : float, optional Contraction coefficient. sigma : float, optional Shrink coefficient. initial_scale : float, optional Scale of the initial simplex. restart_tol : float, optional Simplex diameter threshold for restart. restart_scale : float, optional Scale of the restarted simplex. filler_scale : float, optional Gaussian noise scale for filler points. n_initial : int or None, optional Number of LHS warm-up points per method. Default ``None`` means ``2 * ndim``. Set to ``0`` to disable. explore_prob : float, optional Probability of issuing a uniform random exploration point during normal operation. inject_diameter_fraction : float, optional Passed to ``_NMCore`` — controls the maximum allowed simplex diameter inflation when injecting an external vertex. method_exploration : float, optional Exploration strength for the LCB method chooser. method_temperature : float, optional Noise temperature for the LCB method chooser. exponential_param_power : float, optional Passed to the shared parameter mapping. seed : None or int, optional Random seed. """ if kwargs: warnings.warn( f"NelderMeadOptLib.setup: ignoring unknown " f"keyword arguments: {sorted(kwargs)}" ) self._method_chooser = LCBOptimizer( options=methods, exploration=method_exploration, temperature=method_temperature, seed=seed, ) self._optimizers = { method: HyperNelderMeadSampler( space[method], seed=seed, adaptive=adaptive, alpha=alpha, gamma=gamma, rho=rho, sigma=sigma, initial_scale=initial_scale, restart_tol=restart_tol, restart_scale=restart_scale, filler_scale=filler_scale, n_initial=n_initial, explore_prob=explore_prob, inject_diameter_fraction=inject_diameter_fraction, inject_restart_fraction=inject_restart_fraction, exponential_param_power=exponential_param_power, ) for method in methods } def get_setting(self): """Choose a method, then request its next setting.""" method = self._method_chooser.ask() params_token, params = self._optimizers[method].ask() return { "method": method, "params_token": params_token, "params": params, } def report_result(self, setting, trial, score): """Report a completed trial back to the method chooser and the method specific Nelder-Mead sampler. """ self._method_chooser.tell(setting["method"], score) self._optimizers[setting["method"]].tell( setting["params_token"], score ) register_hyper_optlib( "neldermead", NelderMeadOptLib, defaults={"adaptive": False} ) register_hyper_optlib( "neldermead-adapt", NelderMeadOptLib, defaults={"adaptive": True} ) ================================================ FILE: cotengra/hyperoptimizers/hyper_nevergrad.py ================================================ """Hyper optimization using nevergrad.""" from .hyper import HyperOptLib, register_hyper_optlib def convert_param_to_nevergrad(param): import nevergrad as ng if param["type"] == "BOOL": return ng.p.Choice([False, True]) if param["type"] == "INT": return ng.p.TransitionChoice(range(param["min"], param["max"] + 1)) if param["type"] == "STRING": return ng.p.Choice(param["options"]) if param["type"] == "FLOAT": return ng.p.Scalar(lower=param["min"], upper=param["max"]) if param["type"] == "FLOAT_EXP": return ng.p.Log(lower=param["min"], upper=param["max"]) else: raise ValueError("Didn't understand space {}.".format(param)) def get_methods_space(methods): import nevergrad as ng return ng.p.Choice(methods) def convert_to_nevergrad_space(method, space): import nevergrad as ng return ng.p.Dict( **{o: convert_param_to_nevergrad(p) for o, p in space[method].items()} ) class NevergradOptLib(HyperOptLib): """Hyper-optimization using ``nevergrad``.""" def setup( self, methods, space, optimizer=None, sampler="NaiveTBPSA", method_sampler=None, budget="auto", num_workers=1, method_budget="auto", method_num_workers=1, sampler_opts=None, method_sampler_opts=None, ): """Initialize the ``nevergrad`` optimizer. Parameters ---------- methods : list[str] The list of contraction methods to optimize over. space : dict[str, dict[str, dict]] The search space. optimizer : HyperOptimizer, optional The parent optimizer instance, used for ``max_repeats`` and ``_num_workers`` when ``budget`` or ``num_workers`` are ``'auto'``. sampler : str, optional The optimizer to use to search each method's search space, see nevergrad docs. method_sampler : str, optional The meta-optimizer to use to select overall methods. budget : int, optional Supplied to optimizer. num_workers : int, optional Supplied to optimizer. method_budget : int, optional Supplied to meta-optimizer. method_num_workers : int, optional Supplied to meta-optimizer. """ import nevergrad as ng sampler_opts = {} if sampler_opts is None else dict(sampler_opts) method_sampler_opts = ( {} if method_sampler_opts is None else dict(method_sampler_opts) ) max_repeats = getattr(optimizer, "max_repeats", 128) _num_workers = getattr(optimizer, "_num_workers", 1) if method_sampler is None: if len(methods) == 1: # some samplers don't support '1D' search spaces method_sampler = "RandomSearch" else: method_sampler = sampler if method_budget == "auto": method_budget = max_repeats if method_num_workers == "auto": method_num_workers = _num_workers self._method_chooser = getattr(ng.optimizers, method_sampler)( parametrization=get_methods_space(methods), budget=method_budget, num_workers=method_num_workers, **method_sampler_opts, ) if budget == "auto": budget = max_repeats if num_workers == "auto": num_workers = _num_workers self._optimizers = { m: getattr(ng.optimizers, sampler)( parametrization=convert_to_nevergrad_space(m, space), budget=budget, num_workers=num_workers, **sampler_opts, ) for m in methods } def get_setting(self): """Get a setting to trial from one of the nevergrad optimizers.""" method = self._method_chooser.ask() params = self._optimizers[method.args[0]].ask() return { "method_token": method, "method": method.args[0], "params_token": params, "params": params.args[0], } def report_result(self, setting, trial, score): """Report the result of a trial to the nevergrad optimizers.""" self._method_chooser.tell(setting["method_token"], score) self._optimizers[setting["method"]].tell( setting["params_token"], score ) register_hyper_optlib("nevergrad", NevergradOptLib) ================================================ FILE: cotengra/hyperoptimizers/hyper_optuna.py ================================================ """Hyper optimization using optuna.""" import warnings from .hyper import HyperOptLib, register_hyper_optlib def make_getter(name, param): if param["type"] == "BOOL": return lambda trial: trial.suggest_categorical(name, [False, True]) if param["type"] == "INT": return lambda trial: trial.suggest_int( name, param["min"], param["max"] ) if param["type"] == "STRING": return lambda trial: trial.suggest_categorical(name, param["options"]) if param["type"] == "FLOAT": return lambda trial: trial.suggest_float( name, param["min"], param["max"] ) if param["type"] == "FLOAT_EXP": return lambda trial: trial.suggest_float( name, param["min"], param["max"], log=True ) raise ValueError("Didn't understand space {}.".format(param)) def make_retriever(methods, space): if len(methods) == 1: def meth_getter(_): return methods[0] else: def meth_getter(trial): return trial.suggest_categorical("method", methods) getters = {} for meth, meth_space in space.items(): getters[meth] = {} for name, param in meth_space.items(): getters[meth][name] = make_getter(name, param) def retriever(trial): meth = meth_getter(trial) return { "method": meth, "params": { n: getter(trial) for n, getter in getters[meth].items() }, } return retriever class OptunaOptLib(HyperOptLib): """Hyper-optimization using ``optuna``.""" def setup( self, methods, space, optimizer=None, sampler="TPESampler", sampler_opts=None, **create_study_opts, ): import optuna if isinstance(sampler, str): if sampler_opts is None: sampler_opts = {} sampler = getattr(optuna.samplers, sampler)(**sampler_opts) optuna.logging.set_verbosity(optuna.logging.WARNING) self._study = optuna.create_study(sampler=sampler, **create_study_opts) self._retrieve_params = make_retriever(methods, space) def get_setting(self): with warnings.catch_warnings(): warnings.filterwarnings( action="ignore", message=".*divide by zero.*" ) warnings.filterwarnings( action="ignore", message=".*invalid value encountered in subtract.*", ) otrial = self._study.ask() return { "trial_number": otrial.number, **self._retrieve_params(otrial), } def report_result(self, setting, trial, score): self._study.tell(setting["trial_number"], score) register_hyper_optlib("optuna", OptunaOptLib) ================================================ FILE: cotengra/hyperoptimizers/hyper_random.py ================================================ """Hyper optimization using random or Latin Hypercube sampling.""" import functools import math from ..utils import get_rng from .hyper import HyperOptLib, register_hyper_optlib def sample_bool(rng): return rng.choice([False, True]) def sample_int(rng, low, high): return rng.randint(low, high) def sample_option(rng, options): return rng.choice(options) def sample_uniform(rng, low, high): return rng.uniform(low, high) def sample_loguniform(rng, low, high): return 2 ** rng.uniform(math.log2(low), math.log2(high)) class RandomSpace: def __init__(self, space, seed=None): self.rng = get_rng(seed) self._samplers = {} for k, param in space.items(): if param["type"] == "BOOL": self._samplers[k] = sample_bool elif param["type"] == "INT": self._samplers[k] = functools.partial( sample_int, low=param["min"], high=param["max"] ) elif param["type"] == "STRING": self._samplers[k] = functools.partial( sample_option, options=param["options"] ) elif param["type"] == "FLOAT": self._samplers[k] = functools.partial( sample_uniform, low=param["min"], high=param["max"] ) elif param["type"] == "FLOAT_EXP": self._samplers[k] = functools.partial( sample_loguniform, low=param["min"], high=param["max"] ) else: raise ValueError("Didn't understand space {}.".format(param)) def sample(self): return {k: fn(self.rng) for k, fn in self._samplers.items()} class LHSRandomSpace: """Latin Hypercube Sampled random space. Pre-generates ``n`` samples with stratified coverage over each parameter's native domain. For continuous parameters (FLOAT, FLOAT_EXP, INT) the range is divided into ``n`` equal strata with one sample per stratum. For categorical parameters (STRING, BOOL) the options are cycled through in balanced fashion and randomly permuted. Once all pre-generated samples are exhausted, falls back to pure random sampling. Parameters ---------- space : dict[str, dict] The search space for a single method. n : int Number of LHS samples to pre-generate. seed : None or int or random.Random, optional Random seed. """ def __init__(self, space, n, seed=None): self.rng = get_rng(seed) self._n = n self._params = list(space.items()) self._fallback = RandomSpace(space, seed=self.rng) # pre-generate n stratified values per parameter columns = {} for k, param in self._params: ptype = param["type"] if ptype == "FLOAT": columns[k] = self._stratify_float( n, param["min"], param["max"] ) elif ptype == "FLOAT_EXP": log_lo = math.log2(param["min"]) log_hi = math.log2(param["max"]) log_vals = self._stratify_float(n, log_lo, log_hi) columns[k] = [2**v for v in log_vals] elif ptype == "INT": columns[k] = self._stratify_int(n, param["min"], param["max"]) elif ptype == "STRING": columns[k] = self._stratify_categorical(n, param["options"]) elif ptype == "BOOL": columns[k] = self._stratify_categorical(n, [False, True]) else: raise ValueError(f"Didn't understand space {param}.") # assemble into list of dicts self._samples = [] for i in range(n): self._samples.append({k: columns[k][i] for k in columns}) # shuffle so draw order is random self.rng.shuffle(self._samples) def _stratify_float(self, n, lo, hi): """Divide ``[lo, hi]`` into ``n`` equal strata, sample one uniform point per stratum, then randomly permute. """ vals = [] for i in range(n): s_lo = lo + (hi - lo) * i / n s_hi = lo + (hi - lo) * (i + 1) / n vals.append(self.rng.uniform(s_lo, s_hi)) self.rng.shuffle(vals) return vals def _stratify_int(self, n, lo, hi): """Stratify an integer range ``[lo, hi]``. The continuous interval ``[lo, hi + 1)`` is divided into ``n`` strata, a uniform float is drawn per stratum, and then floored to an integer (clamped to ``hi``). """ vals = [] flo = float(lo) fhi = float(hi + 1) for i in range(n): s_lo = flo + (fhi - flo) * i / n s_hi = flo + (fhi - flo) * (i + 1) / n v = int(self.rng.uniform(s_lo, s_hi)) vals.append(min(v, hi)) self.rng.shuffle(vals) return vals def _stratify_categorical(self, n, options): """Cycle through ``options`` in balanced fashion with random permutation. Each option appears either ``floor(n / k)`` or ``ceil(n / k)`` times, where ``k = len(options)``. """ k = len(options) # repeat enough times then trim to n full_cycles = (n // k) + 1 vals = list(options) * full_cycles vals = vals[:n] self.rng.shuffle(vals) return vals def sample(self): """Return the next sample. Uses pre-generated LHS points first, then falls back to pure random sampling. """ if self._samples: return self._samples.pop() return self._fallback.sample() class RandomSampler: """Random parameter sampler with optional LHS warm-up. Parameters ---------- methods : list[str] The contraction methods to sample from. spaces : dict[str, dict[str, dict]] The per-method search spaces. n_samples : int or None, optional If given, use Latin Hypercube Sampling for the first ``n_samples`` calls per method, then fall back to pure random. If ``None``, use pure random sampling throughout. seed : None or int or random.Random, optional Random seed. """ def __init__(self, methods, spaces, n_samples=None, seed=None): self.rng = get_rng(seed) self._rmethods = tuple(methods) if n_samples is not None and n_samples > 0: self._rspaces = { m: LHSRandomSpace(spaces[m], n_samples, self.rng) for m in methods } else: self._rspaces = { m: RandomSpace(spaces[m], self.rng) for m in methods } def ask(self): method = self.rng.choice(self._rmethods) rspace = self._rspaces[method] params = rspace.sample() return method, params class RandomOptLib(HyperOptLib): """Random sampling optimizer with optional Latin Hypercube warm-up. When ``lhs=True`` (the default), the first batch of samples per method uses Latin Hypercube Sampling for better coverage of the search space. The batch size is derived from the parent optimizer's ``max_repeats`` attribute divided by the number of methods. After the LHS batch is exhausted, sampling falls back to pure random. """ def setup( self, methods, space, optimizer=None, lhs=False, seed=None, **kwargs, ): """Initialize random sampling. Parameters ---------- methods : list[str] The list of contraction methods to sample from. space : dict[str, dict[str, dict]] The search space. optimizer : HyperOptimizer, optional The parent optimizer instance, used for ``max_repeats``. lhs : bool, optional Whether to use Latin Hypercube Sampling for the initial batch. Default ``True``. seed : None or int, optional Random seed. """ n_samples = None if lhs: max_repeats = getattr(optimizer, "max_repeats", 128) n_methods = max(len(methods), 1) n_samples = max_repeats // n_methods self.sampler = RandomSampler( methods, space, n_samples=n_samples, seed=seed ) def get_setting(self): method, params = self.sampler.ask() return {"method": method, "params": params} def report_result(self, setting, trial, score): pass register_hyper_optlib("random", RandomOptLib, defaults={"lhs": True}) register_hyper_optlib("random-uniform", RandomOptLib, defaults={"lhs": False}) ================================================ FILE: cotengra/hyperoptimizers/hyper_sbplx.py ================================================ """Hyper optimization using the Sbplx method (Rowan, 1990).""" import warnings from ..utils import get_rng from ._param_mapping import ( LCBOptimizer, build_params, convert_raw, generate_lhs_points, num_params, ) from .hyper import HyperOptLib, register_hyper_optlib from .hyper_neldermead import _clip, _NMCore _SBPLX_OMEGA = 0.1 class HyperSbplxSampler: """Sbplx optimizer in raw ``[-1, 1]`` parameter space. This is derived from Subplex (Rowan, 1990) which decomposes the full parameter space into low-dimensional subspaces (i.e. subsets of parameters) and runs Nelder-Mead (NM) on each in sequence. After all subspaces in a *cycle* are optimized, the overall convergence is checked; if the total displacement is negligible the search restarts with a jittered center. This is generally more robust that vanilla Nelder-Mead especially in higher dimensions. Parameters ---------- space : dict[str, dict] The search space for a single contraction method. seed : None or int, optional Random seed. adaptive : bool, optional Whether to use the adaptive NM coefficients recommended by Gao and Han (2010), which scale with problem dimension. If `True` then `alpha`, `gamma`, `rho`, and `sigma` are ignored. alpha : float, optional Reflection coefficient for each sub-NM. gamma : float, optional Expansion coefficient for each sub-NM. rho : float, optional Contraction coefficient for each sub-NM. sigma : float, optional Shrink coefficient for each sub-NM. initial_scale : float, optional Initial step size in each dimension. nsmin : int or None, optional Minimum subspace size. Defaults to ``min(2, ndim)``. nsmax : int or None, optional Maximum subspace size. Defaults to ``min(5, ndim)``. psi : float, optional Step reduction factor applied when a subspace shows no movement, and used to scale the jitter on restart. partition : str, optional Subspace partitioning strategy. ``"greedy"`` takes equal chunks of up to ``nsmax`` dimensions, shrinking only to avoid a remainder smaller than ``nsmin``. ``"goodness"`` uses Rowan's heuristic, favoring splits where average step magnitude drops sharply. Default ``"greedy"``. convergence_tol : float, optional Relative convergence threshold for the overall cycle check. It is also passed as the absolute simplex diameter fallback for the inner Nelder-Mead cores. filler_scale : float, optional Standard deviation of the gaussian noise used for filler points issued while the sub-NM is blocked. n_initial : int or None, optional Number of Latin Hypercube Sampled (LHS) warm-up points to evaluate before starting subplex cycling. The best result seeds the starting point. Default ``None`` means ``2 * ndim``. Set to ``0`` to disable. restart_patience : int or "auto", optional Number of completed cycles without a new best score before triggering a restart. When ``"auto"`` it is chosen from the number of expected subspaces, with a minimum of 3. explore_prob : float, optional Probability of issuing a uniform random point instead of the NM-directed point during normal cycling. Maintains diversity throughout the search. inject_diameter_fraction : float, optional Passed to each sub-``_NMCore`` — controls the maximum allowed simplex diameter inflation when injecting an external vertex. exponential_param_power : float, optional Passed through to the shared parameter mapping. """ def __init__( self, space, seed=None, adaptive=False, alpha=1.0, gamma=2.0, rho=0.5, sigma=0.5, initial_scale=0.6, nsmin=2, nsmax=5, partition="greedy", psi=0.25, convergence_tol=0.01, filler_scale=0.3, n_initial=None, restart_patience="auto", explore_prob=0.05, inject_diameter_fraction=1.5, inject_restart_fraction=0.5, exponential_param_power=None, ): self.rng = get_rng(seed) self.params = build_params( space, exponential_param_power=exponential_param_power, ) self.ndim = num_params(self.params) self.adaptive = adaptive self.alpha = alpha self.gamma = gamma self.rho = rho self.sigma = sigma self.initial_scale = initial_scale self.psi = psi self.convergence_tol = convergence_tol self.filler_scale = filler_scale self.explore_prob = explore_prob self.inject_diameter_fraction = inject_diameter_fraction self.inject_restart_fraction = inject_restart_fraction self.nsmin = min(nsmin, self.ndim) self.nsmax = min(nsmax, self.ndim) self.partition = partition if n_initial is None: n_initial = 2 * self.ndim self.n_initial = n_initial if restart_patience == "auto": if self.ndim > 0 and self.nsmax > 0: n_subspaces = (self.ndim + self.nsmax - 1) // self.nsmax else: n_subspaces = 1 restart_patience = max(3, n_subspaces) self.restart_patience = restart_patience self._trial_counter = 0 self._best_x = None self._best_score = float("inf") # keys: trial_number # values: ("nm", core_id, core_token, full_x) or # ("filler", None, None, full_x) or # ("init", None, None, full_x) self._trial_map = {} # current full point and per-dimension step vector self._x = [0.0] * self.ndim self._step = [initial_scale] * self.ndim self._cycles_since_improvement = 0 self._restart_count = 0 self._stagnant_restart_count = 0 # LHS warm-up phase state if self.ndim > 0 and self.n_initial > 0: self._init_points = generate_lhs_points( self.ndim, self.n_initial, self.rng ) self._init_pending = 0 self._init_phase = True else: self._init_points = [] self._init_pending = 0 self._init_phase = False # subspace cycle state self._subspaces = None self._sub_idx = 0 self._sub_dims = None self._sub_nm = None self._sub_nm_id = None self._next_sub_nm_id = 0 self._x_at_cycle_start = None self._step_at_cycle_start = None self._best_score_at_cycle_start = float("inf") def _partition_dims(self): """Partition dimensions into subspaces. Dimensions are first sorted by ``abs(step[d])`` descending. The partition strategy is selected by ``self.partition``: - ``"greedy"``: equal chunks of up to ``nsmax``, shrinking only to avoid a remainder smaller than ``nsmin``. - ``"goodness"``: Rowan's heuristic, favoring splits where the average step magnitude drops sharply. """ order = sorted( range(self.ndim), key=lambda d: abs(self._step[d]), reverse=True, ) if self.partition == "goodness": magnitudes = [abs(self._step[d]) for d in order] self._subspaces = self._partition_goodness(order, magnitudes) else: self._subspaces = self._partition_greedy(order) def _partition_greedy(self, order): """Equal-chunk partitioning.""" subspaces = [] i = 0 while i < len(order): remaining = len(order) - i if remaining <= self.nsmax: subspaces.append(order[i:]) break chunk_size = self.nsmax leftover = remaining - chunk_size if 0 < leftover < self.nsmin: chunk_size = remaining - self.nsmin subspaces.append(order[i : i + chunk_size]) i += chunk_size return subspaces def _partition_goodness(self, order, magnitudes): """Rowan's goodness heuristic partitioning.""" subspaces = [] start = 0 while start < len(order): remaining = len(order) - start if remaining <= self.nsmax: subspaces.append(order[start:]) break total_remaining = sum(magnitudes[start:]) prefix_total = 0.0 best_goodness = float("-inf") best_size = self.nsmin max_size = min(self.nsmax, remaining) for offset in range(max_size): prefix_total += magnitudes[start + offset] size = offset + 1 leftover = remaining - size if size < self.nsmin: continue if leftover and leftover < self.nsmin: continue if leftover: suffix_total = total_remaining - prefix_total goodness = prefix_total / size - suffix_total / leftover else: goodness = prefix_total / size if goodness > best_goodness: best_goodness = goodness best_size = size subspaces.append(order[start : start + best_size]) start += best_size return subspaces def _clamp_scale_factor(self, factor): return min(max(factor, _SBPLX_OMEGA), 1.0 / _SBPLX_OMEGA) def _start_cycle(self): """Snapshot the current point and begin a new cycle.""" self._x_at_cycle_start = list(self._x) self._step_at_cycle_start = list(self._step) self._best_score_at_cycle_start = self._best_score self._partition_dims() self._sub_idx = 0 self._start_sub_nm() def _start_sub_nm(self): """Create a ``_NMCore`` for the current subspace.""" self._sub_dims = self._subspaces[self._sub_idx] sub_ndim = len(self._sub_dims) center = [self._x[d] for d in self._sub_dims] scales = [self._step[d] for d in self._sub_dims] self._sub_nm_id = self._next_sub_nm_id self._next_sub_nm_id += 1 self._sub_nm = _NMCore( ndim=sub_ndim, center=center, scales=scales, adaptive=self.adaptive, alpha=self.alpha, gamma=self.gamma, rho=self.rho, sigma=self.sigma, convergence_tol=self.convergence_tol, psi=self.psi, inject_diameter_fraction=self.inject_diameter_fraction, inject_restart_fraction=self.inject_restart_fraction, ) def _cycle_converged(self): if self._x_at_cycle_start is None or self._step is None: return False for d in range(self.ndim): scale = max(abs(self._x[d]), 1.0) rel_change = abs(self._x[d] - self._x_at_cycle_start[d]) / scale rel_step = abs(self._step[d]) * self.psi / scale if max(rel_change, rel_step) > self.convergence_tol: return False return True def _embed_sub_vector(self, sub_x): """Embed a subspace vector into a full-dimensional point, keeping non-subspace dimensions at their current values in ``_x``. """ full_x = list(self._x) for i, d in enumerate(self._sub_dims): full_x[d] = sub_x[i] return full_x def _ask_filler(self): if self._best_x is not None: center = self._best_x else: center = self._x if self.filler_scale == "uniform": x = [self.rng.uniform(-1.0, 1.0) for _ in center] else: scale = self.filler_scale if self._sub_nm is not None and not self._sub_nm.converged: step_mag = max((abs(s) for s in self._step), default=0.0) scale = max(0.5 * step_mag, self.filler_scale) x = [_clip(self.rng.gauss(ci, scale)) for ci in center] trial_number = self._trial_counter self._trial_counter += 1 self._trial_map[trial_number] = ("filler", None, None, x) return trial_number, x def _rescale_step(self, step, factor, minimum=0.0): # shrink or expand the current step by the requested factor magnitude = abs(step) * factor # enforce a minimum usable step size if magnitude < minimum: magnitude = minimum # if the original step was zero, fall back to a scale based on initialization if magnitude == 0.0: magnitude = max(minimum, self.initial_scale * factor) # preserve the original search direction if step < 0.0: return -magnitude return magnitude def _reset_cycle_state(self): self._subspaces = None self._sub_idx = 0 self._sub_dims = None self._sub_nm = None self._sub_nm_id = None self._x_at_cycle_start = None self._step_at_cycle_start = None self._best_score_at_cycle_start = self._best_score def _restart(self, mode): """Restart the search either locally around the best point or by re-expanding globally. Parameters ---------- mode : {"local", "global"} Restart mode. Local restarts jitter near the best known point while preserving step geometry. Global restarts jump to a random point and reset step sizes to ``initial_scale``. """ if mode == "global": self._x = [self.rng.uniform(-1.0, 1.0) for _ in range(self.ndim)] self._step = [self.initial_scale] * self.ndim else: # local if self._best_x is not None: center = self._best_x else: center = self._x self._x = [ _clip( self.rng.gauss( xi, max(self.psi * abs(si), self.convergence_tol), ) ) for xi, si in zip(center, self._step) ] self._step = [ self._rescale_step(s, self.psi, self.convergence_tol) for s in self._step ] self._restart_count += 1 self._stagnant_restart_count += 1 self._reset_cycle_state() def ask(self): """Return the next candidate setting. During the LHS warm-up phase, pre-generated Latin Hypercube points are issued one at a time. Once all warm-up results have been collected, normal subplex cycling begins from the best warm-up point. During cycling, with probability ``explore_prob`` a uniform random point is returned to maintain diversity. If the active sub-NM is blocked waiting for results, a filler point is returned instead. """ if self.ndim == 0: trial_number = self._trial_counter self._trial_counter += 1 return trial_number, convert_raw(self.params, ()) # latin hypercube sampling (LHS) warm-up phase if self._init_phase: if self._init_points: x = self._init_points.pop() trial_number = self._trial_counter self._trial_counter += 1 self._trial_map[trial_number] = ("init", None, None, x) self._init_pending += 1 return trial_number, convert_raw(self.params, x) # all init points issued but some results still pending trial_number, x = self._ask_filler() return trial_number, convert_raw(self.params, x) # random exploration current_explore_prob = self.explore_prob + ( 0.05 * self._cycles_since_improvement ) if ( current_explore_prob > 0 and self.rng.random() < current_explore_prob ): x = [self.rng.uniform(-1.0, 1.0) for _ in range(self.ndim)] trial_number = self._trial_counter self._trial_counter += 1 self._trial_map[trial_number] = ("filler", None, None, x) return trial_number, convert_raw(self.params, x) # normal nelder mead subplex cycling, with lazy restarts if self._sub_nm is None: self._start_cycle() result = self._sub_nm.ask() if result is not None: core_token, sub_x = result full_x = self._embed_sub_vector(sub_x) trial_number = self._trial_counter self._trial_counter += 1 self._trial_map[trial_number] = ( "nm", self._sub_nm_id, core_token, full_x, ) return (trial_number, convert_raw(self.params, full_x)) # sub-NM is blocked, issue filler trial_number, x = self._ask_filler() return trial_number, convert_raw(self.params, x) def tell(self, trial_number, score): """Record a completed trial result.""" if self.ndim == 0: if score < self._best_score: self._best_score = score return role, core_id, core_token, full_x = self._trial_map.pop( trial_number, ("filler", None, None, None) ) # update global best (includes fillers and init points) if score < self._best_score: self._best_score = score if full_x is not None: self._best_x = list(full_x) self._cycles_since_improvement = 0 self._stagnant_restart_count = 0 # handle LHS warm-up phase completion if role == "init": self._init_pending -= 1 if self._init_pending <= 0 and not self._init_points: # all warm-up points evaluated — seed _x from best if self._best_x is not None: self._x = list(self._best_x) self._init_phase = False return # attempt to inject high-quality filler/exploration results into # the active sub-NM simplex so they influence the current cycle if ( role != "nm" and full_x is not None and self._sub_nm is not None and not self._sub_nm.converged and self._sub_dims is not None ): sub_x = [full_x[d] for d in self._sub_dims] self._sub_nm.inject_vertex(sub_x, score) if role != "nm" or core_token is None: return # guard: if the sub-NM already converged (from a previous tell) we must # not tell it again, as that would skip the _finish_subspace transition if ( self._sub_nm is not None and self._sub_nm_id == core_id and not self._sub_nm.converged ): self._sub_nm.tell(core_token, score) if self._sub_nm.converged: self._finish_subspace() def _finish_subspace(self): """Extract the sub-NM result, update the full point and step vector, then advance to the next subspace or finish the cycle. """ sub_dims = self._sub_dims best_sub = self._sub_nm.best_vertex if best_sub is not None: for i, d in enumerate(sub_dims): self._x[d] = best_sub[i] self._sub_idx += 1 if self._sub_idx < len(self._subspaces): self._start_sub_nm() else: self._finish_cycle() def _update_steps_after_cycle(self): if self._x_at_cycle_start is None or self._step_at_cycle_start is None: return deltax = [ self._x[d] - self._x_at_cycle_start[d] for d in range(self.ndim) ] if len(self._subspaces) > 1: stepnorm = sum(abs(step) for step in self._step_at_cycle_start) dxnorm = sum(abs(dx) for dx in deltax) if stepnorm > 0.0: scale = dxnorm / stepnorm else: scale = 1.0 scale = self._clamp_scale_factor(scale) else: scale = self.psi for d in range(self.ndim): base_step = self._step_at_cycle_start[d] magnitude = abs(base_step) * scale if magnitude == 0.0: magnitude = self.initial_scale * scale if magnitude < self.convergence_tol: magnitude = self.convergence_tol if deltax[d] > 0.0: self._step[d] = magnitude elif deltax[d] < 0.0: self._step[d] = -magnitude elif base_step < 0.0: self._step[d] = magnitude else: self._step[d] = -magnitude def _finish_cycle(self): """Check overall convergence across all subspaces. Following the NLopt Sbplx logic, convergence is based on a relative per-dimension test using both the cycle displacement and the current step size. Repeated non-improving cycles still trigger restarts to preserve the asynchrcoonous wrapper behavior. """ improved = self._best_score < self._best_score_at_cycle_start if improved: self._cycles_since_improvement = 0 else: self._cycles_since_improvement += 1 self._update_steps_after_cycle() converged = self._cycle_converged() patience_exhausted = ( self.restart_patience is not None and self._cycles_since_improvement >= self.restart_patience ) should_restart = converged or patience_exhausted if should_restart: if self._stagnant_restart_count % 2 == 0: restart_mode = "local" else: restart_mode = "global" self._restart(restart_mode) return self._reset_cycle_state() class SbplxOptLib(HyperOptLib): """Hyper-optimization backend using the 'Sbplx' method adapted from the Subplex method (Rowan, 1990). """ def setup( self, methods, space, optimizer=None, adaptive=False, alpha=1.0, gamma=2.0, rho=0.5, sigma=0.5, initial_scale=0.6, nsmin=2, nsmax=5, partition="greedy", psi=0.25, convergence_tol=0.01, filler_scale=0.3, n_initial=None, restart_patience="auto", explore_prob=0.05, inject_diameter_fraction=1.5, inject_restart_fraction=0.5, method_exploration=1.0, method_temperature=1.0, exponential_param_power=None, seed=None, **kwargs, ): """Initialize Sbplx optimizers for each method. Parameters ---------- methods : list[str] The contraction methods to optimize over. space : dict[str, dict[str, dict]] The per-method hyperparameter search space. optimizer : HyperOptimizer, optional The parent optimizer. adaptive : bool, optional Whether to use the adaptive NM coefficients recommended by Gao and Han (2010), which scale with problem dimension. If `True` then `alpha`, `gamma`, `rho`, and `sigma` are ignored. alpha : float, optional Reflection coefficient for each sub-NM. gamma : float, optional Expansion coefficient for each sub-NM. rho : float, optional Contraction coefficient for each sub-NM. sigma : float, optional Shrink coefficient for each sub-NM. initial_scale : float, optional Scale of the initial simplex. nsmin : int or None, optional Minimum subspace size. nsmax : int or None, optional Maximum subspace size. partition : str, optional Subspace partitioning strategy. ``"greedy"`` or ``"goodness"``. Default ``"greedy"``. psi : float, optional Step reduction factor. convergence_tol : float, optional Convergence threshold for sub-NM and cycle check. filler_scale : float, optional Gaussian noise scale for filler points. n_initial : int or None, optional Number of LHS warm-up points per method. Default ``None`` means ``2 * ndim``. Set to ``0`` to disable. restart_patience : int or "auto", optional Number of completed non-improving cycles before restarting. When ``"auto"`` it is chosen from the expected number of subspaces, with a minimum of 3. explore_prob : float, optional Probability of issuing a uniform random exploration point during normal cycling. inject_diameter_fraction : float, optional Passed to each sub-``_NMCore`` — controls the maximum allowed simplex diameter inflation when injecting an external vertex. inject_restart_fraction : float, optional Passed to each sub-``_NMCore`` — controls th XXX method_exploration : float, optional Exploration strength for the LCB method chooser. method_temperature : float, optional Noise temperature for the LCB method chooser. exponential_param_power : float, optional Passed to the shared parameter mapping. seed : None or int, optional Random seed. """ if kwargs: warnings.warn( f"Sbplx: ignoring unknown keyword arguments: {kwargs}" ) self._method_chooser = LCBOptimizer( options=methods, exploration=method_exploration, temperature=method_temperature, seed=seed, ) self._optimizers = { method: HyperSbplxSampler( space[method], seed=seed, adaptive=adaptive, alpha=alpha, gamma=gamma, rho=rho, sigma=sigma, initial_scale=initial_scale, nsmin=nsmin, nsmax=nsmax, partition=partition, psi=psi, convergence_tol=convergence_tol, filler_scale=filler_scale, n_initial=n_initial, restart_patience=restart_patience, explore_prob=explore_prob, inject_diameter_fraction=inject_diameter_fraction, inject_restart_fraction=inject_restart_fraction, exponential_param_power=exponential_param_power, ) for method in methods } def get_setting(self): """Choose a method, then request its next setting.""" method = self._method_chooser.ask() params_token, params = self._optimizers[method].ask() return { "method": method, "params_token": params_token, "params": params, } def report_result(self, setting, trial, score): """Report a completed trial back to the method chooser and the per-method Sbplx sampler. """ self._method_chooser.tell(setting["method"], score) self._optimizers[setting["method"]].tell( setting["params_token"], score ) register_hyper_optlib("sbplx", SbplxOptLib) ================================================ FILE: cotengra/hyperoptimizers/hyper_skopt.py ================================================ """Hyper optimization using scikit-optimize.""" from .hyper import HyperOptLib, register_hyper_optlib def convert_param_to_skopt(param, name): from skopt.space import Categorical, Integer, Real if param["type"] == "BOOL": return Categorical([False, True], name=name) if param["type"] == "INT": return Integer(low=param["min"], high=param["max"], name=name) if param["type"] == "STRING": return Categorical(param["options"], name=name) if param["type"] == "FLOAT": return Real(low=param["min"], high=param["max"], name=name) if param["type"] == "FLOAT_EXP": return Real( low=param["min"], high=param["max"], base=10, prior="log-uniform", name=name, ) else: raise ValueError("Didn't understand space {}.".format(param)) def get_methods_space(methods): from skopt.space import Categorical return [Categorical(methods)] def convert_to_skopt_space(method, space): return [ convert_param_to_skopt(param, name=name) for name, param in space[method].items() ] class SkoptOptLib(HyperOptLib): """Hyper-optimization using ``scikit-optimize``.""" def setup( self, methods, space, optimizer=None, sampler="et", method_sampler="et", sampler_opts=None, method_sampler_opts=None, **kwargs, ): """Initialize the ``scikit-optimize`` optimizer. Parameters ---------- methods : list[str] The list of contraction methods to optimize over. space : dict[str, dict[str, dict]] The search space. optimizer : HyperOptimizer, optional The parent optimizer instance. sampler : str, optional The regressor to use to optimize each method's search space, valid options are: - "et": Extra Trees Regressor - "rf": Random Forest Regressor - "gbrt": Gradient Boosting Regressor - "gp": Gaussian Process Regressor method_sampler : str, optional Meta-optimizer to use to select which overall method to use. sampler_opts : dict, optional Options to supply to the per-method optimizer. method_sampler_opts : dict, optional Options to supply to the method selector. """ from skopt.optimizer import Optimizer sampler_opts = {} if sampler_opts is None else dict(sampler_opts) method_sampler_opts = ( {} if method_sampler_opts is None else dict(method_sampler_opts) ) if method_sampler is None: method_sampler = sampler self._method_chooser = Optimizer( get_methods_space(methods), base_estimator=method_sampler, **method_sampler_opts, ) skopt_spaces = {m: convert_to_skopt_space(m, space) for m in methods} self._param_names = { m: [p.name for p in skopt_spaces[m]] for m in methods } self._optimizers = { m: Optimizer( skopt_spaces[m], base_estimator=sampler, **sampler_opts, ) for m in methods } def get_setting(self): """Find the next parameters to test.""" import warnings with warnings.catch_warnings(): warnings.filterwarnings("ignore", module="skopt") warnings.filterwarnings("ignore", module="sklearn") method = self._method_chooser.ask() params = self._optimizers[method[0]].ask() names = self._param_names[method[0]] return { "method_token": method, "method": method[0], "params_token": params, "params": dict(zip(names, params)), } def report_result(self, setting, trial, score): """Report the result of a trial to the skopt optimizers.""" import warnings with warnings.catch_warnings(): warnings.filterwarnings("ignore", module="skopt") warnings.filterwarnings("ignore", module="sklearn") self._method_chooser.tell(setting["method_token"], score) self._optimizers[setting["method"]].tell( setting["params_token"], score ) register_hyper_optlib("skopt", SkoptOptLib) ================================================ FILE: cotengra/interface.py ================================================ """High-level interface functions to cotengra.""" import functools import autoray as ar from .core import ContractionTree, ContractionTreeCompressed from .oe import ( get_path_fn, opt_einsum_installed, register_path_fn, ) from .utils import ( canonicalize_inputs, find_output_from_inputs, inputs_output_to_eq, parse_einsum_input, shapes_inputs_to_size_dict, ) _PRESETS_PATH = {} _PRESETS_TREE = {} _COMPRESSED_PRESETS = set() def register_preset( preset, optimizer, optimizer_tree=None, register_opt_einsum="auto", compressed=False, ): """Register a preset optimizer. Parameters ---------- preset : str or Sequence[str] The name of the preset, or a sequence of alias names. optimizer : callable The optimizer function that returns a path. optimizer_tree : callable, optional The optimizer function that returns a tree. register_opt_einsum : bool or str, optional If ``True`` or ``'auto'``, register the preset with opt_einsum. compressed : bool, optional If ``True``, the preset presents a compressed contraction optimizer. """ if isinstance(preset, (tuple, list)): presets = preset else: presets = (preset,) for preset in presets: if optimizer is not None: _PRESETS_PATH[preset] = optimizer if register_opt_einsum == "auto": register_opt_einsum = opt_einsum_installed if register_opt_einsum: try: register_path_fn(preset, optimizer) except KeyError: pass if optimizer_tree is not None: _PRESETS_TREE[preset] = optimizer_tree if compressed: _COMPRESSED_PRESETS.add(preset) @functools.lru_cache(None) def preset_to_optimizer(preset): """ """ try: return _PRESETS_PATH[preset] except KeyError: if not opt_einsum_installed: raise KeyError( f"preset {preset!r} not found and can't " "check opt_einsum presets as its not installed." ) # allow opt_einsum presets to be explicitly specified preset = preset.replace("opt_einsum:", "") return get_path_fn(preset) @functools.lru_cache(None) def can_hash_optimize(cls): """Check if the type of `optimize` supplied can be hashed.""" if issubclass(cls, (str, tuple, list)): return True return False def identity(x): return x _HASH_OPTIMIZE_PREPARERS = {} def list_hash_prepare(optimize): if isinstance(optimize[0], tuple): return tuple(optimize) else: return tuple(tuple(c) for c in optimize) def hash_prepare_optimize(optimize): """Transform an `optimize` object into a hashable form.""" cls = optimize.__class__ try: h = _HASH_OPTIMIZE_PREPARERS[cls] except KeyError: if isinstance(optimize, list): h = _HASH_OPTIMIZE_PREPARERS[cls] = list_hash_prepare else: h = _HASH_OPTIMIZE_PREPARERS[cls] = identity return h(optimize) def hash_contraction(inputs, output, size_dict, optimize, **kwargs): """Compute a hash key for the specified contraction.""" optimize = hash_prepare_optimize(optimize) kwargs = frozenset(kwargs.items()) return ( hash((inputs, output, tuple(size_dict.items()), optimize, kwargs)), # add this as a basic way to decrease collisions len(inputs), ) def normalize_input( inputs, output=None, size_dict=None, shapes=None, optimize=None, canonicalize=True, ): """Parse a contraction definition, optionally canonicalizing the indices (mapping them into symbols beginning with ``'a', 'b', 'c', ...``), computing the output if not specified, and computing the ``size_dict`` from """ if canonicalize: inputs, output, size_dict, optimize = canonicalize_inputs( inputs, output, shapes=shapes, size_dict=size_dict, optimize=optimize, ) elif output is None: # didn't canonicalize or specify output output = find_output_from_inputs(inputs) if size_dict is None: if shapes is None: raise ValueError("Either `size_dict` or `shapes` must be given.") else: # didn't canonicalize and only shapes given size_dict = shapes_inputs_to_size_dict(shapes, inputs) return inputs, output, size_dict, optimize _find_path_handlers = {} def _find_path_explicit_path(inputs, output, size_dict, optimize): if isinstance(optimize, list): optimize = tuple(optimize) if optimize and isinstance(optimize[0], (str, int)): from .pathfinders.path_basic import edge_path_to_linear optimize = edge_path_to_linear(optimize, inputs) return optimize def _find_path_optimizer(inputs, output, size_dict, optimize, **kwargs): return optimize(inputs, output, size_dict, **kwargs) def _find_path_preset(inputs, output, size_dict, optimize, **kwargs): optimize = preset_to_optimizer(optimize) return _find_path_optimizer(inputs, output, size_dict, optimize, **kwargs) def _find_path_tree(inputs, output, size_dict, optimize, **kwargs): return optimize.get_path() def find_path(inputs, output, size_dict, optimize="auto", **kwargs): """Directly find a contraction path for a given set of inputs and output. Parameters ---------- inputs : Sequence[Sequence[str]] The inputs terms. output : Sequence[str] The output term. size_dict : dict[str, int] The size of each index. optimize : str, path_like, PathOptimizer, or ContractionTree The optimization strategy to use. This can be: * A string preset, e.g. ``'auto'``, ``'greedy'``, ``'optimal'``. * A ``PathOptimizer`` instance. * An explicit path, e.g. ``[(0, 1), (2, 3), ...]``. * An explicit ``ContractionTree`` instance. Returns ------- path : tuple[tuple[int]] The contraction path. """ cls = optimize.__class__ try: fn = _find_path_handlers[cls] except KeyError: if isinstance(optimize, str): fn = _find_path_handlers[cls] = _find_path_preset elif isinstance(optimize, ContractionTree): fn = _find_path_handlers[cls] = _find_path_tree elif isinstance(optimize, (tuple, list)): fn = _find_path_handlers[cls] = _find_path_explicit_path else: fn = _find_path_handlers[cls] = _find_path_optimizer return fn(inputs, output, size_dict, optimize, **kwargs) _PATH_CACHE = {} def array_contract_path( inputs, output=None, size_dict=None, shapes=None, optimize="auto", canonicalize=True, cache=True, ): """Find only the contraction path for the specific contraction, with fast dispatch of ``optimize``, which can be a preset, path, tree, cotengra optimizer or opt_einsum optimizer. The raw path is a more compact representation of the core tree structure but contains less information on its own, for example sliced indices are not included. Parameters ---------- inputs : Sequence[Sequence[Hashable]] The inputs terms. output : Sequence[Hashable], optional The output term. size_dict : dict[Hashable, int], optional The size of each index, if given, ``shapes`` is ignored. shapes : Sequence[tuple[int]], optional The shape of each input array. Needed if ``size_dict`` not supplied. optimize : str, path_like, PathOptimizer, or ContractionTree The optimization strategy to use. This can be: - A string preset, e.g. ``'auto'``, ``'greedy'``, ``'optimal'``. - A ``PathOptimizer`` instance. - An explicit path, e.g. ``[(0, 1), (2, 3), ...]``. - An explicit ``ContractionTree`` instance. canonicalize : bool, optional If ``True``, canonicalize the inputs and output so that the indices are relabelled ``'a', 'b', 'c', ...``, etc. in the order they appear. cache : bool, optional If ``True``, cache the path for the contraction, so that if the same pathfinding is performed multiple times the overhead is negated. Only for hashable ``optimize`` objects. Returns ------- path : tuple[tuple[int]] The contraction path, whose interpretation is thus: the input tensors are assumed to be stored in a list, i.e. indexed by ``range(N)``. Each contraction in the path is a set of indices, the tensors at these locations should be *popped* from the list and then the result of the contraction *appended*. """ inputs, output, size_dict, optimize = normalize_input( inputs, output, size_dict, shapes, optimize, canonicalize ) if cache and can_hash_optimize(optimize.__class__): key = hash_contraction(inputs, output, size_dict, optimize) try: path = _PATH_CACHE[key] except KeyError: path = _PATH_CACHE[key] = find_path( inputs, output, size_dict, optimize ) else: path = find_path(inputs, output, size_dict, optimize) return path def _find_tree_explicit(inputs, output, size_dict, optimize, **kwargs): if optimize and isinstance(optimize[0], (str, int)): return ContractionTree.from_path( inputs, output, size_dict, edge_path=optimize, **kwargs ) else: return ContractionTree.from_path( inputs, output, size_dict, path=optimize, **kwargs ) def _find_tree_optimizer_search(inputs, output, size_dict, optimize, **kwargs): return optimize.search(inputs, output, size_dict, **kwargs) def _find_tree_optimizer_basic(inputs, output, size_dict, optimize, **kwargs): path = optimize(inputs, output, size_dict, **kwargs) return ContractionTree.from_path(inputs, output, size_dict, path=path) def _find_tree_preset(inputs, output, size_dict, optimize, **kwargs): try: # preset method can directly return a tree return _PRESETS_TREE[optimize](inputs, output, size_dict, **kwargs) except KeyError: # preset method returns a path, which we convert to a tree optimize = preset_to_optimizer(optimize) tree = find_tree(inputs, output, size_dict, optimize, **kwargs) if optimize in _COMPRESSED_PRESETS: tree.__class__ = ContractionTreeCompressed return tree def _find_tree_tree(inputs, output, size_dict, optimize, **kwargs): # already a tree return optimize _find_tree_handlers = {} def find_tree(inputs, output, size_dict, optimize="auto", **kwargs): """Find a contraction tree for the specific contraction, with fast dispatch of ``optimize``, which can be a preset, path, tree, cotengra optimizer or opt_einsum optimizer. Parameters ---------- inputs : Sequence[Sequence[str]] The inputs terms. output : Sequence[str] The output term. size_dict : dict[str, int] The size of each index. optimize : str, path_like, PathOptimizer, or ContractionTree The optimization strategy to use. This can be: - A string preset, e.g. ``'auto'``, ``'greedy'``, ``'optimal'``. - A ``PathOptimizer`` instance. - An explicit path, e.g. ``[(0, 1), (2, 3), ...]``. - An explicit ``ContractionTree`` instance. Returns ------- tree : ContractionTree """ cls = optimize.__class__ try: fn = _find_tree_handlers[cls] except KeyError: if isinstance(optimize, str): fn = _find_tree_handlers[cls] = _find_tree_preset elif isinstance(optimize, ContractionTree): fn = _find_tree_handlers[cls] = _find_tree_tree elif isinstance(optimize, (tuple, list)): fn = _find_tree_handlers[cls] = _find_tree_explicit elif hasattr(optimize, "search"): fn = _find_tree_handlers[cls] = _find_tree_optimizer_search else: fn = _find_tree_handlers[cls] = _find_tree_optimizer_basic return fn(inputs, output, size_dict, optimize, **kwargs) def array_contract_tree( inputs, output=None, size_dict=None, shapes=None, optimize="auto", canonicalize=True, sort_contraction_indices=False, ): """Get the ``ContractionTree`` for the tensor contraction specified by ``inputs``, ``output`` and ``size_dict``, with optimization strategy given by ``optimize``. The tree can be used to inspect and also perform the contraction. Parameters ---------- inputs : Sequence[Sequence[Hashable]] The inputs terms. output : Sequence[Hashable], optional The output term. size_dict : dict[Hashable, int], optional The size of each index, if given, ``shapes`` is ignored. shapes : Sequence[tuple[int]], optional The shape of each input array. Needed if ``size_dict`` not supplied. optimize : str, path_like, PathOptimizer, or ContractionTree The optimization strategy to use. This can be: - A string preset, e.g. ``'auto'``, ``'greedy'``, ``'optimal'``. - A ``PathOptimizer`` instance. - An explicit path, e.g. ``[(0, 1), (2, 3), ...]``. - An explicit ``ContractionTree`` instance. canonicalize : bool, optional If ``True``, canonicalize the inputs and output so that the indices are relabelled ``'a', 'b', 'c', ...``, etc. in the order they appear. sort_contraction_indices : bool, optional If ``True``, call ``tree.sort_contraction_indices()``. Returns ------- ContractionTree See Also -------- array_contract, array_contract_expression, einsum_tree """ inputs, output, size_dict, optimize = normalize_input( inputs, output, size_dict, shapes, optimize, canonicalize ) nterms = len(inputs) if nterms == 1: # there is no path optimize = () elif nterms <= 2: # TODO: maybe don't prempt here due to single term simplifications? # only a single possible path optimize = ((0, 1),) tree = find_tree(inputs, output, size_dict, optimize) if sort_contraction_indices: tree.sort_contraction_indices() return tree class Variadic: """Wrapper to make non-variadic (i.e. with signature ``f(arrays)``) function variadic (i.e. with signature ``f(*arrays)``). """ __slots__ = ("fn", "kwargs") def __init__(self, fn, **kwargs): self.fn = fn self.kwargs = kwargs def __call__(self, *arrays, **kwargs): return self.fn(arrays, **self.kwargs, **kwargs) class Via: """Wrapper that applies one function to the input arrays and another to the output array. For example, moving the tensors from CPU to GPU and back. """ __slots__ = ("fn", "convert_in", "convert_out") def __init__(self, fn, convert_in, convert_out): self.fn = fn self.convert_in = convert_in self.convert_out = convert_out def __call__(self, *arrays, **kwargs): arrays = map(self.convert_in, arrays) out = self.fn(*arrays, **kwargs) return self.convert_out(out) class WithBackend: """Wrapper to make any autoray written function take a ``backend`` kwarg, by simply using `autoray.backend_like`. """ __slots__ = ("fn",) def __init__(self, fn): self.fn = fn def __call__(self, *args, backend=None, **kwargs): if backend is None: return self.fn(*args, **kwargs) with ar.backend_like(backend): return self.fn(*args, **kwargs) def _array_contract_expression_with_constants( inputs, output, size_dict, constants, optimize="auto", implementation=None, prefer_einsum=False, autojit=False, via=None, sort_contraction_indices=False, cache=True, ): # make a lazy variable for each non-constant input lazy_variables = [] # and another list of all inputs, including constant arrays lazy_variables_and_constants = [] for i in range(len(inputs)): if i in constants: constant = constants[i] if via is not None: constant = via[0](constant) lazy_variables_and_constants.append(constant) else: term = tuple(inputs[i]) shape = tuple(size_dict[ix] for ix in term) # want to generate function as if it were written with autoray v = ar.lazy.Variable(shape, backend="autoray.numpy") lazy_variables.append(v) lazy_variables_and_constants.append(v) # get the full expression, without constants full_expr = array_contract_expression( inputs, output, size_dict, optimize=optimize, constants=None, implementation=implementation, # wait to jit until after constants are folded autojit=False, prefer_einsum=prefer_einsum, sort_contraction_indices=sort_contraction_indices, cache=cache, ) # trace through, and then get function with constants folded lz_output = full_expr(*lazy_variables_and_constants) fn = lz_output.get_function(lazy_variables, fold_constants=True) # now we can jit if autojit: from autoray import autojit as _autojit fn = _autojit(fn) else: # allow for backend kwarg (which will set what autoray.numpy uses) fn = WithBackend(fn) if via is not None: fn = Via(fn, *via) return fn def _wrap_strip_exponent_final(fn): @functools.wraps(fn) def fn_stripped(*args, **kwargs): return fn(*args, **kwargs), 0.0 return fn_stripped def _build_expression( inputs, output=None, size_dict=None, optimize="auto", strip_exponent=False, implementation=None, prefer_einsum=False, autojit=False, via=None, sort_contraction_indices=False, ): if len(inputs) == 1: # no need to construct a tree term = tuple(inputs[0]) output = tuple(output) if term == output: # 'contraction' is a no-op def fn(*arrays, backend=None): # this is surprisingly complicated 'to do nothing', since we # have to respect potential backend conversion x = arrays[0] if backend is None: # haven't requested a specific backend, just return return x elif backend == ar.infer_backend(x): # requested backend is the same as the input, just return return x else: # requested backend is different, convert return ar.do("array", arrays[0], like=backend) elif len(term) == len(output): # 'contraction' is just a transposition perm = tuple(map(term.index, output)) def fn(*arrays, backend=None): return ar.do("transpose", arrays[0], perm, like=backend) else: # contraction involves traces / reductions eq = inputs_output_to_eq(inputs, output) def fn(*arrays, backend=None): return ar.do("einsum", eq, arrays[0], like=backend) if strip_exponent: fn = _wrap_strip_exponent_final(fn) else: # get the contraction tree tree = array_contract_tree( inputs, output, size_dict, optimize=optimize, sort_contraction_indices=sort_contraction_indices, ) if not tree.sliced_inds: # can extract pure sliced contraction function, forget tree fn = tree.get_contractor( strip_exponent=strip_exponent, autojit=autojit, prefer_einsum=prefer_einsum, implementation=implementation, ) else: # can't extract pure sliced contraction function yet... fn = Variadic( tree.contract, strip_exponent=strip_exponent, autojit=autojit, prefer_einsum=prefer_einsum, implementation=implementation, ) if via is not None: fn = Via(fn, *via) return fn _CONTRACT_EXPR_CACHE = {} def array_contract_expression( inputs, output=None, size_dict=None, shapes=None, optimize="auto", constants=None, canonicalize=True, cache=True, **kwargs, ): """Get an callable 'expression' that will contract tensors with indices and shapes described by ``inputs`` and ``size_dict`` to ``output``. The ``optimize`` kwarg can be a path, optimizer or also a contraction tree. In the latter case sliced indices for example will be used if present. The same is true if ``optimize`` is an optimizer that can directly produce ``ContractionTree`` instances (i.e. has a ``.search()`` method). Parameters ---------- inputs : Sequence[Sequence[Hashable]] The inputs terms. output : Sequence[Hashable] The output term. size_dict : dict[Hashable, int] The size of each index. optimize : str, path_like, PathOptimizer, or ContractionTree The optimization strategy to use. This can be: - A string preset, e.g. ``'auto'``, ``'greedy'``, ``'optimal'``. - A ``PathOptimizer`` instance. - An explicit path, e.g. ``[(0, 1), (2, 3), ...]``. - An explicit ``ContractionTree`` instance. If the optimizer provides sliced indices they will be used. constants : dict[int, array_like], optional A mapping of constant input positions to constant arrays. If given, the final expression will take only the remaining non-constant tensors as inputs. Note this is a different format to the ``constants`` kwarg of :func:`einsum_expression` since it also provides the constant arrays. implementation : str or tuple[callable, callable], optional What library to use to actually perform the contractions. Options are: - None: let cotengra choose. - "autoray": dispatch with autoray, using the ``tensordot`` and ``einsum`` implementation of the backend. - "cotengra": use the ``tensordot`` and ``einsum`` implementation of cotengra, which is based on batch matrix multiplication. This is faster for some backends like numpy, and also enables libraries which don't yet provide ``tensordot`` and ``einsum`` to be used. - "cuquantum": use the cuquantum library to perform the whole contraction (not just individual contractions). - tuple[callable, callable]: manually supply the ``tensordot`` and ``einsum`` implementations to use. autojit : bool, optional If ``True``, use :func:`autoray.autojit` to compile the contraction function. via : tuple[callable, callable], optional If given, the first function will be applied to the input arrays and the second to the output array. For example, moving the tensors from CPU to GPU and back. sort_contraction_indices : bool, optional If ``True``, call ``tree.sort_contraction_indices()`` before constructing the contraction function. cache : bool, optional If ``True``, cache the contraction expression. This negates the overhead of pathfinding and building the expression when a contraction is performed multiple times. Only for hashable ``optimize`` objects. Returns ------- expr : callable A callable, signature ``expr(*arrays)`` that will contract ``arrays`` with shapes ``shapes``. See Also -------- einsum_expression, array_contract, array_contract_tree """ inputs, output, size_dict, optimize = normalize_input( inputs, output, size_dict, shapes, optimize, canonicalize ) if constants is not None: # handle constants specially with autoray return _array_contract_expression_with_constants( inputs, output, size_dict, constants, optimize=optimize, cache=cache, **kwargs, ) if cache and can_hash_optimize(optimize.__class__): try: key = hash_contraction( inputs, output, size_dict, optimize, **kwargs ) try: expr = _CONTRACT_EXPR_CACHE[key] except KeyError: # missing from cache expr = _CONTRACT_EXPR_CACHE[key] = _build_expression( inputs, output, size_dict, optimize=optimize, **kwargs ) except TypeError: # unhashable kwargs import warnings args = (inputs, output, size_dict, optimize, kwargs) warnings.warn( "Contraction cache disabled as one of the " f"arguments is not hashable: {args}." ) expr = _build_expression( inputs, output, size_dict, optimize=optimize, **kwargs ) else: expr = _build_expression( inputs, output, size_dict, optimize=optimize, **kwargs ) return expr def array_contract( arrays, inputs, output=None, optimize="auto", strip_exponent=False, cache_expression=True, backend=None, **kwargs, ): """Perform the tensor contraction specified by ``inputs``, ``output`` and ``size_dict``, using strategy given by ``optimize``. By default the path finding and expression building is cached, so that if the a matching contraction is performed multiple times the overhead is negated. Parameters ---------- arrays : Sequence[array_like] The arrays to contract. inputs : Sequence[Sequence[Hashable]] The inputs terms. output : Sequence[Hashable] The output term. optimize : str, path_like, PathOptimizer, or ContractionTree The optimization strategy to use. This can be: - A string preset, e.g. ``'auto'``, ``'greedy'``, ``'optimal'``. - A ``PathOptimizer`` instance. - An explicit path, e.g. ``[(0, 1), (2, 3), ...]``. - An explicit ``ContractionTree`` instance. If the optimizer provides sliced indices they will be used. strip_exponent : bool, optional If ``True``, eagerly strip the exponent (in log10) from intermediate tensors to control numerical problems from leaving the range of the datatype. This method then returns the scaled 'mantissa' output array and the exponent separately. cache_expression : bool, optional If ``True``, cache the expression used to contract the arrays. This negates the overhead of pathfinding and building the expression when a contraction is performed multiple times. Only for hashable ``optimize`` objects. backend : str, optional If given, the explicit backend to use for the contraction, by default the backend is dispatched automatically. kwargs Passed to :func:`~cotengra.interface.array_contract_expression`. array_like or (array_like, scalar) The result of the contraction. If ``strip_exponent`` is ``True``, the result is a tuple of the output array mantissae and the exponent (in log10). See Also -------- array_contract_expression, array_contract_tree, einsum """ shapes = tuple(map(ar.shape, arrays)) expr = array_contract_expression( inputs, output, shapes=shapes, optimize=optimize, strip_exponent=strip_exponent, cache=cache_expression, **kwargs, ) return expr(*arrays, backend=backend) def einsum_tree( *args, optimize="auto", canonicalize=False, sort_contraction_indices=False, ): """Get the `ContractionTree` for the einsum equation ``eq`` and optimization strategy ``optimize``. The tree can be used to inspect and also perform the contraction. Parameters ---------- eq : str The equation to use for contraction, for example ``'ab,bc->ac'``. shapes : Sequence[tuple[int]] The shape of each input array. optimize : str, path_like, PathOptimizer, or ContractionTree The optimization strategy to use. This can be: - A string preset, e.g. ``'auto'``, ``'greedy'``, ``'optimal'``. - A ``PathOptimizer`` instance. - An explicit path, e.g. ``[(0, 1), (2, 3), ...]``. - An explicit ``ContractionTree`` instance. canonicalize : bool, optional If ``True``, canonicalize the inputs and output so that the indices are relabelled ``'a', 'b', 'c', ...``, etc. in the order they appear. sort_contraction_indices : bool, optional If ``True``, call ``tree.sort_contraction_indices()``. Returns ------- ContractionTree See Also -------- einsum, einsum_expression, array_contract_tree """ # construct the individual terms and find explicit output inputs, output, shapes = parse_einsum_input(args, shapes=True, tuples=True) return array_contract_tree( inputs, output, shapes=shapes, optimize=optimize, canonicalize=canonicalize, sort_contraction_indices=sort_contraction_indices, ) def einsum_expression( *args, optimize="auto", constants=None, cache=True, **kwargs, ): """Get an callable 'expression' that will contract tensors with shapes ``shapes`` according to equation ``eq``. The ``optimize`` kwarg can be a path, optimizer or also a contraction tree. In the latter case sliced indices for example will be used if present. The same is true if ``optimize`` is an optimizer that can directly produce ``ContractionTree`` instances (i.e. has a ``.search()`` method). Parameters ---------- eq : str The equation to use for contraction, for example ``'ab,bc->ac'``. The output will be automatically computed if not supplied, but Ellipses (`'...'`) are not supported. shapes : Sequence[tuple[int]] The shapes of the tensors to contract, or the constant tensor itself if marked as constant in ``constants``. optimize : str, path_like, PathOptimizer, or ContractionTree The optimization strategy to use. This can be: - A string preset, e.g. ``'auto'``, ``'greedy'``, ``'optimal'``. - A ``PathOptimizer`` instance. - An explicit path, e.g. ``[(0, 1), (2, 3), ...]``. - An explicit ``ContractionTree`` instance. If the optimizer provides sliced indices they will be used. constants : Sequence of int, optional The indices of tensors to treat as constant, the final expression will take the remaining non-constant tensors as inputs. Note this is a different format to the ``constants`` kwarg of :func:`array_contract_expression` since the actual constant arrays are inserted into ``shapes``. implementation : str or tuple[callable, callable], optional What library to use to actually perform the contractions. Options are: - None: let cotengra choose. - "autoray": dispatch with autoray, using the ``tensordot`` and ``einsum`` implementation of the backend. - "cotengra": use the ``tensordot`` and ``einsum`` implementation of cotengra, which is based on batch matrix multiplication. This is faster for some backends like numpy, and also enables libraries which don't yet provide ``tensordot`` and ``einsum`` to be used. - "cuquantum": use the cuquantum library to perform the whole contraction (not just individual contractions). - tuple[callable, callable]: manually supply the ``tensordot`` and ``einsum`` implementations to use. autojit : bool, optional If ``True``, use :func:`autoray.autojit` to compile the contraction function. via : tuple[callable, callable], optional If given, the first function will be applied to the input arrays and the second to the output array. For example, moving the tensors from CPU to GPU and back. sort_contraction_indices : bool, optional If ``True``, call ``tree.sort_contraction_indices()`` before constructing the contraction function. cache : bool, optional If ``True``, cache the contraction expression. This negates the overhead of pathfinding and building the expression when a contraction is performed multiple times. Only for hashable ``optimize`` objects. Returns ------- expr : callable A callable, signature ``expr(*arrays)`` that will contract ``arrays`` with shapes matching ``shapes``. See Also -------- einsum, einsum_tree, array_contract_expression """ # construct the individual terms and find explicit output inputs, output, shapes = parse_einsum_input( args, shapes=True, tuples=True, constants=constants, ) if constants is not None: # shapes includes the constant arrays size_dict = {} parsed_constants = {} for i, s in enumerate(shapes): if i in constants: # extract the array and turn into a shape parsed_constants[i] = s s = ar.shape(s) size_dict.update(zip(inputs[i], s)) else: parsed_constants = None size_dict = shapes_inputs_to_size_dict(shapes, inputs) return array_contract_expression( inputs, output, size_dict, optimize=optimize, constants=parsed_constants, cache=cache, **kwargs, ) def einsum( *args, optimize="auto", strip_exponent=False, cache_expression=True, backend=None, **kwargs, ): """Perform an einsum contraction, using `cotengra`, using strategy given by ``optimize``. By default the path finding and expression building is cached, so that if a matching contraction is performed multiple times the overhead is negated. Parameters ---------- eq : str The equation to use for contraction, for example ``'ab,bc->ac'``. arrays : Sequence[array_like] The arrays to contract. optimize : str, path_like, PathOptimizer, or ContractionTree The optimization strategy to use. This can be: - A string preset, e.g. ``'auto'``, ``'greedy'``, ``'optimal'``. - A ``PathOptimizer`` instance. - An explicit path, e.g. ``[(0, 1), (2, 3), ...]``. - An explicit ``ContractionTree`` instance. If the optimizer provides sliced indices they will be used. strip_exponent : bool, optional If ``True``, eagerly strip the exponent (in log10) from intermediate tensors to control numerical problems from leaving the range of the datatype. This method then returns the scaled 'mantissa' output array and the exponent separately. cache_expression : bool, optional If ``True``, cache the expression used to contract the arrays. This negates the overhead of pathfinding and building the expression when a contraction is performed multiple times. Only for hashable ``optimize`` objects. backend : str, optional If given, the explicit backend to use for the contraction, by default the backend is dispatched automatically. kwargs Passed to :func:`~cotengra.interface.array_contract_expression`. Returns ------- array_like or (array_like, scalar) The result of the contraction. If ``strip_exponent`` is ``True``, the result is a tuple of the output array mantissae and the exponent (in log10). See Also -------- einsum_expression, einsum_tree, array_contract """ inputs, output, arrays = parse_einsum_input( args, shapes=False, tuples=True, ) return array_contract( arrays, inputs, output, optimize=optimize, strip_exponent=strip_exponent, cache_expression=cache_expression, backend=backend, **kwargs, ) def ncon(arrays, indices, **kwargs): """Perform a contraction specified by the `ncon` style indices, using `cotengra`. This is very similar to `array_contract`, but the indices should be intergers, with negative integers specifying outputs. The output order is determined by the order of the negative integers, like ``[-1, -2, -3, ...]``. See paper https://arxiv.org/abs/1402.0939 and python implementation https://github.com/mhauru/ncon. The contraction order is found as with other `cotengra` routines, and does *not* default to contracting in the order given by the indices. Parameters ---------- arrays : Sequence[array_like] The arrays to contract. indices : Sequence[Sequence[int]] The indices to contract, with negative integers specifying outputs. kwargs : dict Supplied to `array_contract`. Returns ------- array_like or (array_like, scalar) The result of the contraction. If ``strip_exponent`` is ``True``, the result is a tuple of the output array mantissae and the exponent (in log10). """ inputs = [] output = set() # we just need to put negative integers in the output for ixs in indices: for ix in ixs: if isinstance(ix, int) and ix < 0: output.add(ix) inputs.append(tuple(ixs)) # and sort them like [-1, -2, ...] output = sorted(output, reverse=True) return array_contract( arrays, inputs, output, **kwargs, ) ================================================ FILE: cotengra/nodeops.py ================================================ from functools import reduce from operator import or_ class NodeOpsFrozenset: """Namespace for interacting with frozenset[int] as contraction tree nodes.""" __slots__ = () def copy(self): return self node_type = frozenset """The type used for nodes, to check isinstance with.""" node_size = len """Function to get the size of a node.""" node_from_seq = frozenset """From a sequence of integers, construct node (``frozenset``).""" new_node_for_seq = node_from_seq @staticmethod def node_from_single(x): """From single integer ``x``, construct node (``frozenset``).""" return frozenset((x,)) @staticmethod def node_supremum(size): """Return the node containing all elements up to ``size``.""" return frozenset(range(size)) @staticmethod def node_get_single_el(node): """Assuming ``node`` has one element, return it.""" return next(iter(node)) @staticmethod def node_tie_breaker(x): """A tie breaker function for ordering nodes when they are the same size. Returns the negative of the smallest element in the node. Nodes with larger `node_tie_breaker` values get contracted first. """ return -min(x) @staticmethod def is_valid_node(node): """Check ``node`` is of type ``frozenset[int]``.""" try: if not isinstance(node, frozenset): return False el = next(iter(node)) if not isinstance(el, int): return False return True except TypeError: return False @staticmethod def node_union(x, y): """Return the node given by the union of two nodes.""" return x | y @staticmethod def node_union_it(bs): """Return the node given by the union of an iterable of nodes.""" b0, *bs = bs return b0.union(*bs) new_node_for_union = node_union_it @staticmethod def node_issubset(x, y): """Check if node ``x`` is a subset of node ``y``.""" return x.issubset(y) @staticmethod def is_leaf(node): return len(node) == 1 @staticmethod def is_supremum(node, N): return len(node) == N class BitSetInt(int): """A bitset for keeping track of dense sets of integers. Subclass of ``int`` that overrides ``-``, ``&`` and ``|`` and provides ``__len__`` and ``__iter__``. As of python 3.8 doesn't seem much better than using frozenset[int] (slower and limited memory savings). Parameters ---------- it : Iterable[int] or int If sequence of ``int``, treat these as the set members. If raw ``int`` interpret as bitset directly. """ __slots__ = () def __new__(cls, it=0): if isinstance(it, int): i = it else: i = reduce(or_, (1 << i for i in it), 0) return super(cls, cls).__new__(cls, i) def __hash__(self): return self ^ self.bit_length() @classmethod def infimum(cls): return super(cls, cls).__new__(cls, 0) @classmethod def supremum(cls, size): return super(cls, cls).__new__(cls, (1 << size) - 1) def __len__(self): return self.bit_count() def iter_sparse(self): x = self while x: i = x.bit_length() - 1 yield i x ^= 1 << i def iter_dense(self): return (x for x, b in enumerate(bin(self)[:1:-1]) if b == "1") def iter_numpy(self): import numpy as np bits = np.frombuffer( self.to_bytes((self.bit_length() + 7) // 8, "little"), dtype=np.uint8, ) bits = np.unpackbits(bits, bitorder="little") return np.flatnonzero(bits) def __iter__(self): n = self.bit_length() k = self.bit_count() if n == k: # contains all elements 0..n-1 return iter(range(n)) if k == 1: # contains single element, at location of highest bit return iter((self.bit_length() - 1,)) if k < 512: # sparse enough to be worth iterating sparsely # XXX: better fit is k ~< 18 * n**0.25 return self.iter_sparse() try: return self.iter_numpy() except ImportError: return self.iter_dense() def __contains__(self, i): return bool(self & (1 << i)) def __sub__(self, i): return BitSetInt(int.__and__(self, ~i)) def difference(self, i): return self - i def __and__(self, i): return BitSetInt(int.__and__(self, i)) def intersection(self, i): return self & i def __or__(self, i): return BitSetInt(int.__or__(self, i)) def union(*it): return BitSetInt(reduce(int.__or__, it)) def issubset(self, other): """Check if this bitset is a subset of another bitset. x.issubset(y) returns True if all bits set in x are also set in y. Equivalent to: x & y == x """ return (self & other) == self def __repr__(self): return f"BitSetInt({list(self.iter_dense())})" class NodeOpsBitSetInt: """Namespace for interacting with BitSetInt as contraction tree nodes.""" __slots__ = () def copy(self): return self node_type = BitSetInt node_size = BitSetInt.__len__ node_from_seq = BitSetInt new_node_for_seq = node_from_seq @staticmethod def node_from_single(x): return BitSetInt(1 << x) @staticmethod def node_supremum(size): return BitSetInt.supremum(size) @staticmethod def node_get_single_el(node): return node.bit_length() - 1 @staticmethod def node_tie_breaker(x): return -x @staticmethod def is_valid_node(node): try: return isinstance(node, BitSetInt) except TypeError: return False @staticmethod def node_union(x, y): return BitSetInt(int.__or__(x, y)) @staticmethod def node_union_it(bs): b0, *bs = bs return b0.union(*bs) new_node_for_union = node_union_it @staticmethod def node_issubset(x, y): return (x & y) == x @staticmethod def is_leaf(node): return node.bit_count() == 1 @staticmethod def is_supremum(node, N): return node == BitSetInt.supremum(N) class NodeOpsSSA: __slots__ = ("ssa", "N") def __init__(self, N): self.ssa = N + 1 self.N = N def copy(self): new = object.__new__(NodeOpsSSA) new.ssa = self.ssa new.N = self.N return new def get_next_ssa(self): p = self.ssa self.ssa += 1 return p node_type = int def node_size(self, node): raise NotImplementedError def node_from_single(self, x): return x def node_supremum(self, size): return size def node_get_single_el(self, node): return node def node_tie_breaker(self, x): return -x def is_valid_node(self, node): return isinstance(node, int) def node_union(self, x, y): raise NotImplementedError def node_union_it(self, bs): raise NotImplementedError def new_node_for_union(self, nodes): """Get a new node label for the union of `nodes`. We use this rather than the above methods to be explicit that we can only create new node labels, not reconstruct labels from the constituent nodes. """ # rely on tree for tracking associated subgraph / extent etc return self.get_next_ssa() def node_from_seq(self, seq): raise NotImplementedError def new_node_for_seq(self, seq): """Get a new node for a sequence of raw input positions. We use this rather than the above method to be explicit that we can only create new node labels, not reconstruct labels from the constituent raw input positions. """ # rely on tree for tracking associated subgraph / extent etc return self.get_next_ssa() def node_issubset(self, x, y): raise NotImplementedError def is_leaf(self, node): return 0 <= node < self.N def is_supremum(self, node, N): return node == N nodeops_frozenset = NodeOpsFrozenset() nodeops_bitsetint = NodeOpsBitSetInt() def get_nodeops(node_type_str: str, N=None): """Get the node operations namespace for the given node type. Parameters ---------- node_type_str : str The node type as a string. One of "frozenset[int]", "BitSetInt". Returns ------- NodeOpsFrozenset or NodeOpsBitSetInt The corresponding node operations namespace. """ if node_type_str == "auto": # node_type_str = "frozenset[int]" node_type_str = "ssa" if node_type_str == "frozenset[int]": return nodeops_frozenset elif node_type_str == "BitSetInt": return nodeops_bitsetint elif node_type_str == "ssa": return NodeOpsSSA(N) else: raise ValueError(f"Unknown node type: {node_type_str}") ================================================ FILE: cotengra/oe.py ================================================ """`opt_einsum` interface.""" try: from opt_einsum.paths import PathOptimizer, get_path_fn, register_path_fn opt_einsum_installed = True except ImportError: class PathOptimizer: pass def get_path_fn(*_, **__): raise NotImplementedError("opt_einsum not installed") def register_path_fn(*_, **__): import warnings warnings.warn("opt_einsum not installed") opt_einsum_installed = False __all__ = ( "get_path_fn", "opt_einsum_installed", "PathOptimizer", "register_path_fn", ) ================================================ FILE: cotengra/parallel.py ================================================ """Interface for parallelism. This module centralizes cotengra's lightweight parallel execution logic. The main user entry point is ``parse_parallel_arg``, which turns ``parallel`` arguments such as ``False``, ``True``, ``"auto"``, ``"threads"``, ``"loky"``, ``"concurrent.futures"``, ``"dask"``, and ``"ray"`` into a pool-like executor or ``None``. Local process pools are cached and reused in the process that created them, while distributed backends try to discover an existing scheduler or runtime before creating one explicitly. The ``"auto"`` mode remembers the last persistent non-thread backend and uses it for future automatic parallel work. To avoid recursive process pools, worker subprocesses are marked when tasks are submitted through ``submit``; inside such workers ``parallel="auto"`` resolves to serial execution. A PID guard provides the same protection for forked children that inherit module state. Threads remain explicit-only and are not remembered as the automatic backend. The helper functions ``submit``, ``scatter``, ``can_scatter``, and ``should_nest`` provide a small common interface over local, dask, and ray executors while preserving backend-specific behavior where needed. """ import atexit import collections import functools import importlib import inspect import numbers import operator import os import warnings _AUTO_BACKEND = None _AUTO_BACKEND_PID = None _IS_WORKER = False def _remember_auto_backend(backend): global _AUTO_BACKEND, _AUTO_BACKEND_PID if backend == "threads": # threads is special case that shouldn't set the default auto backend return _AUTO_BACKEND = backend _AUTO_BACKEND_PID = os.getpid() # check for loky, joblib (vendors loky), then default to concurrent.futures have_loky = importlib.util.find_spec("loky") is not None have_joblib = importlib.util.find_spec("joblib") is not None if have_loky or have_joblib: _DEFAULT_BACKEND = "loky" else: _DEFAULT_BACKEND = "concurrent.futures" @functools.lru_cache(None) def choose_default_num_workers(): if "COTENGRA_NUM_WORKERS" in os.environ: return int(os.environ["COTENGRA_NUM_WORKERS"]) if "OMP_NUM_THREADS" in os.environ: return int(os.environ["OMP_NUM_THREADS"]) return os.cpu_count() def get_pool(n_workers=None, maybe_create=False, backend=None): """Get a parallel pool.""" if backend is None: backend = _DEFAULT_BACKEND if backend == "dask": return _get_pool_dask(n_workers=n_workers, maybe_create=maybe_create) if backend == "ray": return _get_pool_ray(n_workers=n_workers, maybe_create=maybe_create) # above backends are distributed, don't specify n_workers if n_workers is None: n_workers = choose_default_num_workers() if backend == "loky": get_reusable_executor = get_loky_get_reusable_executor() return get_reusable_executor(max_workers=n_workers) if backend == "concurrent.futures": if not maybe_create and not ProcessPoolHandler.is_initialized(): return None return _get_process_pool_cf(n_workers=n_workers) if backend == "threads": if not maybe_create and not ThreadPoolHandler.is_initialized(): return None return _get_thread_pool_cf(n_workers=n_workers) @functools.lru_cache(None) def _infer_backed_cached(pool_class): if pool_class.__name__ == "RayExecutor": return "ray" path = pool_class.__module__.split(".") # `concurrent.futures` uses different submodules for thread vs process # executors, and we need to keep them distinct here so that only true # subprocess workers get the `_IS_WORKER` marker. if path[0] == "concurrent": if (len(path) > 2) and (path[2] == "thread"): return "threads" return "concurrent.futures" if path[0] == "joblib": return "loky" if path[0] == "distributed": return "dask" return path[0] def _infer_backend(pool): """Return the backend type of ``pool`` - cached for speed.""" return _infer_backed_cached(pool.__class__) def get_n_workers(pool=None): """Extract how many workers our pool has (mostly for working out how many tasks to pre-dispatch). """ if pool is None: pool = get_pool() try: return pool._max_workers except AttributeError: pass backend = _infer_backend(pool) if backend == "dask": return len(pool.scheduler_info()["workers"]) if backend == "ray": while True: try: return int(get_ray().available_resources()["CPU"]) except KeyError: import time time.sleep(1e-3) if backend == "mpi4py": from mpi4py import MPI return MPI.COMM_WORLD.size raise ValueError(f"Can't find number of workers in pool {pool}.") def parse_parallel_arg(parallel): """ """ if parallel == "auto": if _IS_WORKER: # worker subprocesses should not auto-create pools return None if _AUTO_BACKEND in (None, "threads"): _remember_auto_backend(_DEFAULT_BACKEND) # distributed backends: discover existing cluster only if _AUTO_BACKEND in ("dask", "ray"): return get_pool(maybe_create=False, backend=_AUTO_BACKEND) # local backends: only create in the originating process # (fallback guard for fork, where _IS_WORKER isn't set via submit) if _AUTO_BACKEND_PID is not None and os.getpid() != _AUTO_BACKEND_PID: return None return get_pool(maybe_create=True, backend=_AUTO_BACKEND) if parallel is False: return None if parallel is True: if _AUTO_BACKEND in (None, "threads"): _remember_auto_backend(_DEFAULT_BACKEND) parallel = _AUTO_BACKEND if isinstance(parallel, numbers.Integral): _remember_auto_backend(_DEFAULT_BACKEND) return get_pool( n_workers=parallel, maybe_create=True, backend=_DEFAULT_BACKEND ) if parallel == "loky": _remember_auto_backend("loky") return get_pool(maybe_create=True, backend="loky") if parallel == "concurrent.futures": _remember_auto_backend("concurrent.futures") return get_pool(maybe_create=True, backend="concurrent.futures") if parallel == "threads": return get_pool(maybe_create=True, backend="threads") if parallel == "dask": _remember_auto_backend("dask") return get_pool(maybe_create=True, backend="dask") if parallel == "ray": _remember_auto_backend("ray") return get_pool(maybe_create=True, backend="ray") return parallel def set_parallel_backend(backend): """Create a parallel pool of type ``backend`` and register persistent backends as the default for ``'auto'`` parallel. The ``'threads'`` backend remains explicit-only and is never remembered as the default for ``'auto'``. """ return parse_parallel_arg(backend) def maybe_leave_pool(pool): """Logic required for nested parallelism in dask.distributed.""" if _infer_backend(pool) == "dask": return _maybe_leave_pool_dask() def maybe_rejoin_pool(is_worker, pool): """Logic required for nested parallelism in dask.distributed.""" if is_worker and _infer_backend(pool) == "dask": _rejoin_pool_dask() def _worker_call(fn, args, kwargs): """Run ``fn`` inside a worker, marking the process as a worker first. The marker is intentionally sticky for the lifetime of the worker process: any later ``parallel=\"auto\"`` work in the same subprocess should remain serial rather than creating nested process pools. """ import cotengra.parallel as par par._IS_WORKER = True return fn(*args, **kwargs) def submit(pool, fn, *args, **kwargs): """Interface for submitting ``fn(*args, **kwargs)`` to ``pool``.""" backend = _infer_backend(pool) if backend == "dask": kwargs.setdefault("pure", False) return pool.submit(fn, *args, **kwargs) if backend in ("concurrent.futures", "loky"): return pool.submit(_worker_call, fn, args, kwargs) return pool.submit(fn, *args, **kwargs) def scatter(pool, data): """Interface for maybe turning ``data`` into a remote object or reference.""" if _infer_backend(pool) in ("dask", "ray"): return pool.scatter(data) return data def can_scatter(pool): """Whether ``pool`` can make objects remote.""" return _infer_backend(pool) in ("dask", "ray") def should_nest(pool): """Given argument ``pool`` should we try nested parallelism.""" if pool is None: return False backend = _infer_backend(pool) if backend in ("ray", "dask"): return backend return False # ---------------------------------- loky ----------------------------------- # @functools.lru_cache(1) def get_loky_get_reusable_executor(): try: from loky import get_reusable_executor except ImportError: from joblib.externals.loky import get_reusable_executor return get_reusable_executor # --------------------------- concurrent.futures ---------------------------- # class CachedProcessPoolExecutor: def __init__(self): self._pool = None self._n_workers = -1 self._pid = None atexit.register(self.shutdown) def __call__(self, n_workers=None): pid = os.getpid() if pid != self._pid or n_workers != self._n_workers: if pid == self._pid: self.shutdown() else: # after fork, discard stale reference without shutdown self._pool = None from concurrent.futures import ProcessPoolExecutor self._pool = ProcessPoolExecutor(n_workers) self._n_workers = n_workers self._pid = pid return self._pool def is_initialized(self): return self._pool is not None and self._pid == os.getpid() def shutdown(self): if self._pool is not None: self._pool.shutdown() self._pool = None self._n_workers = -1 self._pid = None def __del__(self): self.shutdown() ProcessPoolHandler = CachedProcessPoolExecutor() def _get_process_pool_cf(n_workers=None): return ProcessPoolHandler(n_workers) class CachedThreadPoolExecutor: def __init__(self): self._pool = None self._n_workers = -1 self._pid = None atexit.register(self.shutdown) def __call__(self, n_workers=None): pid = os.getpid() if pid != self._pid or n_workers != self._n_workers: if pid == self._pid: self.shutdown() else: self._pool = None from concurrent.futures import ThreadPoolExecutor self._pool = ThreadPoolExecutor(n_workers) self._n_workers = n_workers self._pid = pid return self._pool def is_initialized(self): return self._pool is not None and self._pid == os.getpid() def shutdown(self): if self._pool is not None: self._pool.shutdown() self._pool = None self._n_workers = -1 self._pid = None def __del__(self): self.shutdown() ThreadPoolHandler = CachedThreadPoolExecutor() def _get_thread_pool_cf(n_workers=None): return ThreadPoolHandler(n_workers) # ---------------------------------- DASK ----------------------------------- # def _get_pool_dask(n_workers=None, maybe_create=False): """Maybe get an existing or create a new dask.distrbuted client. Parameters ---------- n_workers : None or int, optional The number of workers to request if creating a new client. maybe_create : bool, optional Whether to create an new local cluster and client if no existing client is found. Returns ------- None or dask.distributed.Client """ try: from dask.distributed import get_client except ImportError: if not maybe_create: return None else: raise try: client = get_client() except ValueError: if not maybe_create: return None import shutil import tempfile from dask.distributed import Client, LocalCluster local_directory = tempfile.mkdtemp() lc = LocalCluster( n_workers=n_workers, threads_per_worker=1, local_directory=local_directory, memory_limit=0, ) client = Client(lc) warnings.warn( "Parallel specified but no existing global dask client found... " "created one (with {} workers).".format(get_n_workers(client)) ) @atexit.register def delete_local_dask_directory(): shutil.rmtree(local_directory, ignore_errors=True) if n_workers is not None: current_n_workers = get_n_workers(client) if n_workers != current_n_workers: warnings.warn( "Found existing client (with {} workers which) doesn't match " "the requested {}... using it instead.".format( current_n_workers, n_workers ) ) return client def _maybe_leave_pool_dask(): try: from dask.distributed import secede secede() # for nested parallelism is_dask_worker = True except (ImportError, ValueError): is_dask_worker = False return is_dask_worker def _rejoin_pool_dask(): from dask.distributed import rejoin rejoin() # ----------------------------------- RAY ----------------------------------- # @functools.lru_cache(None) def get_ray(): """ """ import ray return ray class RayFuture: """Basic ``concurrent.futures`` like future wrapping a ray ``ObjectRef``.""" __slots__ = ("_obj", "_cancelled") def __init__(self, obj): self._obj = obj self._cancelled = False def result(self, timeout=None): return get_ray().get(self._obj, timeout=timeout) def done(self): return self._cancelled or bool( get_ray().wait([self._obj], timeout=0)[0] ) def cancel(self): get_ray().cancel(self._obj) self._cancelled = True def _unpack_futures_tuple(x): return tuple(map(_unpack_futures, x)) def _unpack_futures_list(x): return list(map(_unpack_futures, x)) def _unpack_futures_dict(x): return {k: _unpack_futures(v) for k, v in x.items()} def _unpack_futures_identity(x): return x _unpack_dispatch = collections.defaultdict( lambda: _unpack_futures_identity, { RayFuture: operator.attrgetter("_obj"), tuple: _unpack_futures_tuple, list: _unpack_futures_list, dict: _unpack_futures_dict, }, ) def _unpack_futures(x): """Allows passing futures by reference - takes e.g. args and kwargs and replaces all ``RayFuture`` objects with their underyling ``ObjectRef`` within all nested tuples, lists and dicts. [Subclassing ``ObjectRef`` might avoid needing this.] """ return _unpack_dispatch[x.__class__](x) @functools.lru_cache(2**14) def get_remote_fn(fn, **remote_opts): """Cached retrieval of remote function.""" ray = get_ray() if remote_opts: return ray.remote(**remote_opts)(fn) return ray.remote(fn) @functools.lru_cache(2**14) def get_fn_as_remote_object(fn): ray = get_ray() return ray.put(fn) @functools.lru_cache(None) def get_deploy(**remote_opts): """Alternative for 'non-function' callables - e.g. partial functions - pass the callable object too. """ ray = get_ray() def deploy(fn, *args, **kwargs): return fn(*args, **kwargs) if remote_opts: return ray.remote(**remote_opts)(deploy) return ray.remote(deploy) class RayExecutor: """Basic ``concurrent.futures`` like interface using ``ray``.""" def __init__(self, *args, default_remote_opts=None, **kwargs): ray = get_ray() if not ray.is_initialized(): ray.init(*args, **kwargs) self.default_remote_opts = ( {} if default_remote_opts is None else dict(default_remote_opts) ) def _maybe_inject_remote_opts(self, remote_opts=None): """Return the default remote options, possibly overriding some with those supplied by a ``submit call``. """ ropts = self.default_remote_opts if remote_opts is not None: ropts = {**ropts, **remote_opts} return ropts def submit(self, fn, *args, pure=False, remote_opts=None, **kwargs): """Remotely run ``fn(*args, **kwargs)``, returning a ``RayFuture``.""" # want to pass futures by reference args = _unpack_futures_tuple(args) kwargs = _unpack_futures_dict(kwargs) ropts = self._maybe_inject_remote_opts(remote_opts) # this is the same test ray uses to accept functions if inspect.isfunction(fn): # can use the faster cached remote function obj = get_remote_fn(fn, **ropts).remote(*args, **kwargs) else: fn_obj = get_fn_as_remote_object(fn) obj = get_deploy(**ropts).remote(fn_obj, *args, **kwargs) return RayFuture(obj) def map(self, func, *iterables, remote_opts=None): """Remote map ``func`` over arguments ``iterables``.""" ropts = self._maybe_inject_remote_opts(remote_opts) remote_fn = get_remote_fn(func, **ropts) objs = tuple(map(remote_fn.remote, *iterables)) ray = get_ray() return map(ray.get, objs) def scatter(self, data): """Push ``data`` into the distributed store, returning an ``ObjectRef`` that can be supplied to ``submit`` calls for example. """ ray = get_ray() return ray.put(data) def shutdown(self): """Shutdown the parent ray cluster, this ``RayExecutor`` instance itself does not need any cleanup. """ get_ray().shutdown() _RAY_EXECUTOR = None def _get_pool_ray(n_workers=None, maybe_create=False): """Maybe get an existing or create a new RayExecutor, thus initializing, ray. Parameters ---------- n_workers : None or int, optional The number of workers to request if creating a new client. maybe_create : bool, optional Whether to create initialize ray and return a RayExecutor if not initialized already. Returns ------- None or RayExecutor """ try: import ray except ImportError: if not maybe_create: return None else: raise global _RAY_EXECUTOR if (_RAY_EXECUTOR is None) or (not ray.is_initialized()): if not maybe_create: return None _RAY_EXECUTOR = RayExecutor(num_cpus=n_workers) if n_workers is not None: current_n_workers = get_n_workers(_RAY_EXECUTOR) if n_workers != current_n_workers: warnings.warn( "Found initialized ray (with {} workers which) doesn't match " "the requested {}... sticking with old number.".format( current_n_workers, n_workers ) ) return _RAY_EXECUTOR ================================================ FILE: cotengra/pathfinders/__init__.py ================================================ """Parametrized contraction tree finders.""" ================================================ FILE: cotengra/pathfinders/kahypar_profiles/cut_kKaHyPar_sea20.ini ================================================ # general mode=direct objective=cut seed=-1 cmaxnet=1000 vcycles=0 # main -> preprocessing -> min hash sparsifier p-use-sparsifier=true p-sparsifier-min-median-he-size=28 p-sparsifier-max-hyperedge-size=1200 p-sparsifier-max-cluster-size=10 p-sparsifier-min-cluster-size=2 p-sparsifier-num-hash-func=5 p-sparsifier-combined-num-hash-func=100 # main -> preprocessing -> community detection p-detect-communities=true p-detect-communities-in-ip=true p-reuse-communities=false p-max-louvain-pass-iterations=100 p-min-eps-improvement=0.0001 p-louvain-edge-weight=hybrid # main -> coarsening c-type=ml_style c-s=1 c-t=160 # main -> coarsening -> rating c-rating-score=heavy_edge c-rating-use-communities=true c-rating-heavy_node_penalty=no_penalty c-rating-acceptance-criterion=best_prefer_unmatched c-fixed-vertex-acceptance-criterion=fixed_vertex_allowed # main -> initial partitioning i-mode=recursive i-technique=multi # initial partitioning -> coarsening i-c-type=ml_style i-c-s=1 i-c-t=150 # initial partitioning -> coarsening -> rating i-c-rating-score=heavy_edge i-c-rating-use-communities=true i-c-rating-heavy_node_penalty=no_penalty i-c-rating-acceptance-criterion=best_prefer_unmatched i-c-fixed-vertex-acceptance-criterion=fixed_vertex_allowed # initial partitioning -> initial partitioning i-algo=pool i-runs=20 # initial partitioning -> bin packing i-bp-algorithm=worst_fit i-bp-heuristic-prepacking=false i-bp-early-restart=true i-bp-late-restart=true # initial partitioning -> local search i-r-type=twoway_fm i-r-runs=-1 i-r-fm-stop=simple i-r-fm-stop-i=50 # main -> local search r-type=kway_fm_hyperflow_cutter r-runs=-1 r-fm-stop=adaptive_opt r-fm-stop-alpha=1 r-fm-stop-i=350 # local_search -> flow scheduling and heuristics r-flow-execution-policy=exponential # local_search -> hyperflowcutter configuration r-hfc-size-constraint=mf-style r-hfc-scaling=16 r-hfc-distance-based-piercing=true r-hfc-mbc=true ================================================ FILE: cotengra/pathfinders/kahypar_profiles/cut_rKaHyPar_sea20.ini ================================================ # general mode=recursive objective=cut seed=-1 cmaxnet=-1 vcycles=0 # main -> preprocessing -> min hash sparsifier p-use-sparsifier=true p-sparsifier-min-median-he-size=28 p-sparsifier-max-hyperedge-size=1200 p-sparsifier-max-cluster-size=10 p-sparsifier-min-cluster-size=2 p-sparsifier-num-hash-func=5 p-sparsifier-combined-num-hash-func=100 # main -> preprocessing -> community detection p-detect-communities=true p-detect-communities-in-ip=false p-reuse-communities=false p-max-louvain-pass-iterations=100 p-min-eps-improvement=0.0001 p-louvain-edge-weight=hybrid # main -> coarsening c-type=heavy_lazy c-s=3.25 c-t=160 # main -> coarsening -> rating c-rating-score=heavy_edge c-rating-use-communities=true c-rating-heavy_node_penalty=multiplicative c-rating-acceptance-criterion=best c-fixed-vertex-acceptance-criterion=free_vertex_only # main -> initial partitioning i-mode=direct i-technique=flat # initial partitioning -> initial partitioning i-algo=pool i-runs=20 # initial partitioning -> bin packing i-bp-algorithm=worst_fit i-bp-heuristic-prepacking=false i-bp-early-restart=true i-bp-late-restart=true # initial partitioning -> local search i-r-type=twoway_fm i-r-runs=-1 i-r-fm-stop=simple i-r-fm-stop-i=50 # main -> local search r-type=twoway_fm_hyperflow_cutter r-runs=-1 r-fm-stop=adaptive_opt r-fm-stop-alpha=1 r-fm-stop-i=350 # local_search -> flow scheduling and heuristics r-flow-execution-policy=exponential # local_search -> hyperflowcutter configuration r-hfc-size-constraint=mf-style r-hfc-scaling=16 r-hfc-distance-based-piercing=true r-hfc-mbc=true ================================================ FILE: cotengra/pathfinders/kahypar_profiles/km1_kKaHyPar_sea20.ini ================================================ # general mode=direct objective=km1 seed=-1 cmaxnet=1000 vcycles=0 # main -> preprocessing -> min hash sparsifier p-use-sparsifier=true p-sparsifier-min-median-he-size=28 p-sparsifier-max-hyperedge-size=1200 p-sparsifier-max-cluster-size=10 p-sparsifier-min-cluster-size=2 p-sparsifier-num-hash-func=5 p-sparsifier-combined-num-hash-func=100 # main -> preprocessing -> community detection p-detect-communities=true p-detect-communities-in-ip=true p-reuse-communities=false p-max-louvain-pass-iterations=100 p-min-eps-improvement=0.0001 p-louvain-edge-weight=hybrid # main -> coarsening c-type=ml_style c-s=1 c-t=160 # main -> coarsening -> rating c-rating-score=heavy_edge c-rating-use-communities=true c-rating-heavy_node_penalty=no_penalty c-rating-acceptance-criterion=best_prefer_unmatched c-fixed-vertex-acceptance-criterion=fixed_vertex_allowed # main -> initial partitioning i-mode=recursive i-technique=multi # initial partitioning -> coarsening i-c-type=ml_style i-c-s=1 i-c-t=150 # initial partitioning -> coarsening -> rating i-c-rating-score=heavy_edge i-c-rating-use-communities=true i-c-rating-heavy_node_penalty=no_penalty i-c-rating-acceptance-criterion=best_prefer_unmatched i-c-fixed-vertex-acceptance-criterion=fixed_vertex_allowed # initial partitioning -> initial partitioning i-algo=pool i-runs=20 # initial partitioning -> bin packing i-bp-algorithm=worst_fit i-bp-heuristic-prepacking=false i-bp-early-restart=true i-bp-late-restart=true # initial partitioning -> local search i-r-type=twoway_fm i-r-runs=-1 i-r-fm-stop=simple i-r-fm-stop-i=50 # main -> local search r-type=kway_fm_hyperflow_cutter_km1 r-runs=-1 r-fm-stop=adaptive_opt r-fm-stop-alpha=1 r-fm-stop-i=350 # local_search -> flow scheduling and heuristics r-flow-execution-policy=exponential # local_search -> hyperflowcutter configuration r-hfc-size-constraint=mf-style r-hfc-scaling=16 r-hfc-distance-based-piercing=true r-hfc-mbc=true ================================================ FILE: cotengra/pathfinders/kahypar_profiles/km1_rKaHyPar_sea20.ini ================================================ # general mode=recursive objective=km1 seed=-1 cmaxnet=-1 vcycles=0 # main -> preprocessing -> min hash sparsifier p-use-sparsifier=true p-sparsifier-min-median-he-size=28 p-sparsifier-max-hyperedge-size=1200 p-sparsifier-max-cluster-size=10 p-sparsifier-min-cluster-size=2 p-sparsifier-num-hash-func=5 p-sparsifier-combined-num-hash-func=100 # main -> preprocessing -> community detection p-detect-communities=true p-detect-communities-in-ip=false p-reuse-communities=false p-max-louvain-pass-iterations=100 p-min-eps-improvement=0.0001 p-louvain-edge-weight=hybrid # main -> coarsening c-type=heavy_lazy c-s=3.25 c-t=160 # main -> coarsening -> rating c-rating-score=heavy_edge c-rating-use-communities=true c-rating-heavy_node_penalty=multiplicative c-rating-acceptance-criterion=best c-fixed-vertex-acceptance-criterion=free_vertex_only # main -> initial partitioning i-mode=direct i-technique=flat # initial partitioning -> initial partitioning i-algo=pool i-runs=20 # initial partitioning -> bin packing i-bp-algorithm=worst_fit i-bp-heuristic-prepacking=false i-bp-early-restart=true i-bp-late-restart=true # initial partitioning -> local search i-r-type=twoway_fm i-r-runs=-1 i-r-fm-stop=simple i-r-fm-stop-i=50 # main -> local search r-type=twoway_fm_hyperflow_cutter r-runs=-1 r-fm-stop=adaptive_opt r-fm-stop-alpha=1 r-fm-stop-i=350 # local_search -> flow scheduling and heuristics r-flow-execution-policy=exponential # local_search -> hyperflowcutter configuration r-hfc-size-constraint=mf-style r-hfc-scaling=16 r-hfc-distance-based-piercing=true r-hfc-mbc=true ================================================ FILE: cotengra/pathfinders/kahypar_profiles/old/cut_kKaHyPar_sea20.ini ================================================ # general mode=direct objective=cut seed=-1 cmaxnet=1000 vcycles=0 # main -> preprocessing -> min hash sparsifier p-use-sparsifier=true p-sparsifier-min-median-he-size=28 p-sparsifier-max-hyperedge-size=1200 p-sparsifier-max-cluster-size=10 p-sparsifier-min-cluster-size=2 p-sparsifier-num-hash-func=5 p-sparsifier-combined-num-hash-func=100 # main -> preprocessing -> community detection p-detect-communities=true p-detect-communities-in-ip=true p-reuse-communities=false p-max-louvain-pass-iterations=100 p-min-eps-improvement=0.0001 p-louvain-edge-weight=hybrid # main -> coarsening c-type=ml_style c-s=1 c-t=160 # main -> coarsening -> rating c-rating-score=heavy_edge c-rating-use-communities=true c-rating-heavy_node_penalty=no_penalty c-rating-acceptance-criterion=best_prefer_unmatched c-fixed-vertex-acceptance-criterion=fixed_vertex_allowed # main -> initial partitioning i-mode=recursive i-technique=multi # initial partitioning -> coarsening i-c-type=ml_style i-c-s=1 i-c-t=150 # initial partitioning -> coarsening -> rating i-c-rating-score=heavy_edge i-c-rating-use-communities=true i-c-rating-heavy_node_penalty=no_penalty i-c-rating-acceptance-criterion=best_prefer_unmatched i-c-fixed-vertex-acceptance-criterion=fixed_vertex_allowed # initial partitioning -> initial partitioning i-algo=pool i-runs=20 # initial partitioning -> local search i-r-type=twoway_fm i-r-runs=-1 i-r-fm-stop=simple i-r-fm-stop-i=50 # main -> local search r-type=kway_fm_hyperflow_cutter r-runs=-1 r-fm-stop=adaptive_opt r-fm-stop-alpha=1 r-fm-stop-i=350 # local_search -> flow scheduling and heuristics r-flow-execution-policy=exponential # local_search -> hyperflowcutter configuration r-hfc-size-constraint=mf-style r-hfc-scaling=16 r-hfc-distance-based-piercing=true r-hfc-mbc=true ================================================ FILE: cotengra/pathfinders/kahypar_profiles/old/cut_rKaHyPar_sea20.ini ================================================ # general mode=recursive objective=cut seed=-1 cmaxnet=-1 vcycles=0 # main -> preprocessing -> min hash sparsifier p-use-sparsifier=true p-sparsifier-min-median-he-size=28 p-sparsifier-max-hyperedge-size=1200 p-sparsifier-max-cluster-size=10 p-sparsifier-min-cluster-size=2 p-sparsifier-num-hash-func=5 p-sparsifier-combined-num-hash-func=100 # main -> preprocessing -> community detection p-detect-communities=true p-detect-communities-in-ip=false p-reuse-communities=false p-max-louvain-pass-iterations=100 p-min-eps-improvement=0.0001 p-louvain-edge-weight=hybrid # main -> coarsening c-type=heavy_lazy c-s=3.25 c-t=160 # main -> coarsening -> rating c-rating-score=heavy_edge c-rating-use-communities=true c-rating-heavy_node_penalty=multiplicative c-rating-acceptance-criterion=best c-fixed-vertex-acceptance-criterion=free_vertex_only # main -> initial partitioning i-mode=direct i-technique=flat # initial partitioning -> initial partitioning i-algo=pool i-runs=20 # initial partitioning -> local search i-r-type=twoway_fm i-r-runs=-1 i-r-fm-stop=simple i-r-fm-stop-i=50 # main -> local search r-type=twoway_fm_hyperflow_cutter r-runs=-1 r-fm-stop=adaptive_opt r-fm-stop-alpha=1 r-fm-stop-i=350 # local_search -> flow scheduling and heuristics r-flow-execution-policy=exponential # local_search -> hyperflowcutter configuration r-hfc-size-constraint=mf-style r-hfc-scaling=16 r-hfc-distance-based-piercing=true r-hfc-mbc=true ================================================ FILE: cotengra/pathfinders/kahypar_profiles/old/km1_kKaHyPar_sea20.ini ================================================ # general mode=direct objective=km1 seed=-1 cmaxnet=1000 vcycles=0 # main -> preprocessing -> min hash sparsifier p-use-sparsifier=true p-sparsifier-min-median-he-size=28 p-sparsifier-max-hyperedge-size=1200 p-sparsifier-max-cluster-size=10 p-sparsifier-min-cluster-size=2 p-sparsifier-num-hash-func=5 p-sparsifier-combined-num-hash-func=100 # main -> preprocessing -> community detection p-detect-communities=true p-detect-communities-in-ip=true p-reuse-communities=false p-max-louvain-pass-iterations=100 p-min-eps-improvement=0.0001 p-louvain-edge-weight=hybrid # main -> coarsening c-type=ml_style c-s=1 c-t=160 # main -> coarsening -> rating c-rating-score=heavy_edge c-rating-use-communities=true c-rating-heavy_node_penalty=no_penalty c-rating-acceptance-criterion=best_prefer_unmatched c-fixed-vertex-acceptance-criterion=fixed_vertex_allowed # main -> initial partitioning i-mode=recursive i-technique=multi # initial partitioning -> coarsening i-c-type=ml_style i-c-s=1 i-c-t=150 # initial partitioning -> coarsening -> rating i-c-rating-score=heavy_edge i-c-rating-use-communities=true i-c-rating-heavy_node_penalty=no_penalty i-c-rating-acceptance-criterion=best_prefer_unmatched i-c-fixed-vertex-acceptance-criterion=fixed_vertex_allowed # initial partitioning -> initial partitioning i-algo=pool i-runs=20 # initial partitioning -> local search i-r-type=twoway_fm i-r-runs=-1 i-r-fm-stop=simple i-r-fm-stop-i=50 # main -> local search r-type=kway_fm_hyperflow_cutter_km1 r-runs=-1 r-fm-stop=adaptive_opt r-fm-stop-alpha=1 r-fm-stop-i=350 # local_search -> flow scheduling and heuristics r-flow-execution-policy=exponential # local_search -> hyperflowcutter configuration r-hfc-size-constraint=mf-style r-hfc-scaling=16 r-hfc-distance-based-piercing=true r-hfc-mbc=true ================================================ FILE: cotengra/pathfinders/kahypar_profiles/old/km1_rKaHyPar_sea20.ini ================================================ # general mode=recursive objective=km1 seed=-1 cmaxnet=-1 vcycles=0 # main -> preprocessing -> min hash sparsifier p-use-sparsifier=true p-sparsifier-min-median-he-size=28 p-sparsifier-max-hyperedge-size=1200 p-sparsifier-max-cluster-size=10 p-sparsifier-min-cluster-size=2 p-sparsifier-num-hash-func=5 p-sparsifier-combined-num-hash-func=100 # main -> preprocessing -> community detection p-detect-communities=true p-detect-communities-in-ip=false p-reuse-communities=false p-max-louvain-pass-iterations=100 p-min-eps-improvement=0.0001 p-louvain-edge-weight=hybrid # main -> coarsening c-type=heavy_lazy c-s=3.25 c-t=160 # main -> coarsening -> rating c-rating-score=heavy_edge c-rating-use-communities=true c-rating-heavy_node_penalty=multiplicative c-rating-acceptance-criterion=best c-fixed-vertex-acceptance-criterion=free_vertex_only # main -> initial partitioning i-mode=direct i-technique=flat # initial partitioning -> initial partitioning i-algo=pool i-runs=20 # initial partitioning -> local search i-r-type=twoway_fm i-r-runs=-1 i-r-fm-stop=simple i-r-fm-stop-i=50 # main -> local search r-type=twoway_fm_hyperflow_cutter r-runs=-1 r-fm-stop=adaptive_opt r-fm-stop-alpha=1 r-fm-stop-i=350 # local_search -> flow scheduling and heuristics r-flow-execution-policy=exponential # local_search -> hyperflowcutter configuration r-hfc-size-constraint=mf-style r-hfc-scaling=16 r-hfc-distance-based-piercing=true r-hfc-mbc=true ================================================ FILE: cotengra/pathfinders/path_basic.py ================================================ """Basic optimization routines.""" import bisect import functools import heapq import itertools import math from ..core import ContractionTree from ..oe import PathOptimizer from ..parallel import get_n_workers, parse_parallel_arg, submit from ..reusable import ReusableOptimizer from ..utils import GumbelBatchedGenerator, get_rng DEFAULT_MAX_NEIGHBORS = 16 def is_simplifiable(legs, appearances): """Check if ``legs`` contains any diag (repeated) or reduced (appears nowhere else) indices. """ prev_ix = None for ix, ix_cnt in legs: if (ix == prev_ix) or (ix_cnt == appearances[ix]): # found a diag or reduced index return True prev_ix = ix return False def compute_simplified(legs, appearances): """Compute the diag and reduced legs of a term. This function assumes that the legs are already sorted. It handles the case where a index is both diag and reduced (i.e. traced). """ if not legs: return [] new_legs = [] cur_ix, cur_cnt = legs[0] for ix, ix_cnt in legs[1:]: if ix == cur_ix: # diag index-> accumulate count and continue cur_cnt += ix_cnt else: # index changed, flush if cur_cnt != appearances[cur_ix]: # index is not reduced -> keep new_legs.append((cur_ix, cur_cnt)) cur_ix, cur_cnt = ix, ix_cnt if cur_cnt != appearances[cur_ix]: new_legs.append((cur_ix, cur_cnt)) return new_legs def compute_contracted(ilegs, jlegs, appearances): """Compute the contracted legs of two terms.""" # do sorted simultaneous iteration over ilegs and jlegs ip = 0 jp = 0 ni = len(ilegs) nj = len(jlegs) new_legs = [] while True: if ip == ni: # all remaining legs are from j new_legs.extend(jlegs[jp:]) break if jp == nj: # all remaining legs are from i new_legs.extend(ilegs[ip:]) break iix, ic = ilegs[ip] jix, jc = jlegs[jp] if iix < jix: # index only appears on i new_legs.append((iix, ic)) ip += 1 elif iix > jix: # index only appears on j new_legs.append((jix, jc)) jp += 1 else: # iix == jix # shared index ijc = ic + jc if ijc != appearances[iix]: new_legs.append((iix, ijc)) ip += 1 jp += 1 return new_legs def compute_size(legs, sizes): """Compute the size of a term.""" size = 1 for ix, _ in legs: size *= sizes[ix] return size def compute_flops(ilegs, jlegs, sizes): """Compute the flops cost of contracting two terms.""" seen = set() flops = 1 for ix, _ in ilegs: seen.add(ix) flops *= sizes[ix] for ix, _ in jlegs: if ix not in seen: flops *= sizes[ix] return flops def compute_con_cost_flops( temp_legs, appearances, sizes, iscore, jscore, ): """Compute the total flops cost of a contraction given by temporary legs, also removing any contracted indices from the temporary legs. """ cost = 1 for i in range(len(temp_legs) - 1, -1, -1): ix, ix_count = temp_legs[i] d = sizes[ix] cost *= d if ix_count == appearances[ix]: # contracted index, remove del temp_legs[i] return iscore + jscore + cost def compute_con_cost_max( temp_legs, appearances, sizes, iscore, jscore, ): """Compute the max flops cost of a contraction given by temporary legs, also removing any contracted indices from the temporary legs. """ cost = 1 for i in range(len(temp_legs) - 1, -1, -1): ix, ix_count = temp_legs[i] d = sizes[ix] cost *= d if ix_count == appearances[ix]: # contracted index, remove del temp_legs[i] return max((iscore, jscore, cost)) def compute_con_cost_size( temp_legs, appearances, sizes, iscore, jscore, ): """Compute the max size of a contraction given by temporary legs, also removing any contracted indices from the temporary legs. """ size = 1 for i in range(len(temp_legs) - 1, -1, -1): ix, ix_count = temp_legs[i] if ix_count == appearances[ix]: # contracted index, remove del temp_legs[i] else: size *= sizes[ix] return max((iscore, jscore, size)) def compute_con_cost_write( temp_legs, appearances, sizes, iscore, jscore, ): """Compute the total write cost of a contraction given by temporary legs, also removing any contracted indices from the temporary legs. """ size = 1 for i in range(len(temp_legs) - 1, -1, -1): ix, ix_count = temp_legs[i] if ix_count == appearances[ix]: # contracted index, remove del temp_legs[i] else: # kept index, contributes to new size size *= sizes[ix] return iscore + jscore + size def compute_con_cost_combo( temp_legs, appearances, sizes, iscore, jscore, factor, ): """Compute the combined total flops and write cost of a contraction given by temporary legs, also removing any contracted indices from the temporary legs. The combined cost is given by: cost = flops + factor * size """ cost = 1 size = 1 for i in range(len(temp_legs) - 1, -1, -1): ix, ix_count = temp_legs[i] d = sizes[ix] cost *= d if ix_count == appearances[ix]: # contracted index, remove del temp_legs[i] else: # kept index, contributes to new size size *= d return iscore + jscore + (cost + factor * size) def compute_con_cost_limit( temp_legs, appearances, sizes, iscore, jscore, factor, ): """Compute the combined total flops and write cost of a contraction given by temporary legs, also removing any contracted indices from the temporary legs. The combined cost is given by: cost = max(flops, factor * size) I.e. assuming one or another to be the limiting factor. """ cost = 1 size = 1 for i in range(len(temp_legs) - 1, -1, -1): ix, ix_count = temp_legs[i] d = sizes[ix] cost *= d if ix_count == appearances[ix]: # contracted index, remove del temp_legs[i] else: # kept index, contributes to new size size *= d new_local_score = max(cost, factor * size) return iscore + jscore + new_local_score @functools.lru_cache(128) def parse_minimize_for_optimal(minimize): """Given a string, parse it into a function that computes the cost of a contraction. The string can be one of the following: - "flops": compute_con_cost_flops - "max": compute_con_cost_max - "size": compute_con_cost_size - "write": compute_con_cost_write - "combo": compute_con_cost_combo - "combo-{factor}": compute_con_cost_combo with specified factor - "limit": compute_con_cost_limit - "limit-{factor}": compute_con_cost_limit with specified factor This function is cached for speed. """ if minimize == "flops": return compute_con_cost_flops elif minimize == "max": return compute_con_cost_max elif minimize == "size": return compute_con_cost_size elif minimize == "write": return compute_con_cost_write minimize, *maybe_factor = minimize.split("-") if not maybe_factor: # default factor factor = 64 else: (fstr,) = maybe_factor if fstr.isdigit(): # keep integer arithmetic if possible factor = int(fstr) else: factor = float(fstr) if minimize == "combo": return functools.partial(compute_con_cost_combo, factor=factor) elif minimize == "limit": return functools.partial(compute_con_cost_limit, factor=factor) else: raise ValueError(f"Couldn't parse `minimize` value: {minimize}.") class ContractionProcessor: """A helper class for combining bottom up simplifications, greedy, and optimal contraction path optimization. """ __slots__ = ( "nodes", "edges", "indmap", "appearances", "sizes", "ssa", "ssa_path", "track_flops", "flops", "flops_limit", ) def __init__( self, inputs, output, size_dict, track_flops=False, flops_limit=float("inf"), ): self.nodes = {} self.edges = {} self.indmap = {} self.appearances = [] self.sizes = [] c = 0 for i, term in enumerate(inputs): legs = [] for ind in term: ix = self.indmap.get(ind, None) if ix is None: # index not processed yet ix = self.indmap[ind] = c self.edges[ix] = {i: None} self.appearances.append(1) self.sizes.append(size_dict[ind]) c += 1 else: # seen index already self.appearances[ix] += 1 self.edges[ix][i] = None legs.append((ix, 1)) legs.sort() self.nodes[i] = tuple(legs) for ind in output: self.appearances[self.indmap[ind]] += 1 self.ssa = len(self.nodes) self.ssa_path = [] self.track_flops = track_flops self.flops = 0 self.flops_limit = flops_limit def copy(self): new = ContractionProcessor.__new__(ContractionProcessor) new.nodes = self.nodes.copy() new.edges = {k: v.copy() for k, v in self.edges.items()} new.indmap = self.indmap # never mutated new.appearances = self.appearances # never mutated new.sizes = self.sizes # never mutated new.ssa = self.ssa new.ssa_path = self.ssa_path.copy() new.track_flops = self.track_flops new.flops = self.flops new.flops_limit = self.flops_limit return new def neighbors(self, i): """Get all neighbors of node ``i``. Parameters ---------- i : int The node index to get neighbors of. Yields ------ j : int The neighboring node index. """ # only want to yield each neighbor once and not i itself for ix, _ in self.nodes[i]: for j in self.edges[ix]: if j != i: yield j def neighbors_limit(self, i, max_neighbors): """Get all neighbors of node ``i``, ignoring any index that connects to more than ``max_neighbors`` nodes. This is for greedy optimization where it is useful to avoid combinatorial explosions caused by essentially batch indices. Parameters ---------- i : int The node index to get neighbors of. max_neighbors : int If non-zero, skip any index that connects to more than this many nodes. This is useful to avoid combinatorial explosions when dealing with essentially batch indices. Yields ------ j : int The neighboring node index. """ # only want to yield each neighbor once and not i itself for ix, _ in self.nodes[i]: ix_nodes = self.edges[ix] if max_neighbors and (len(ix_nodes) > max_neighbors): # basically a batch index with too many combinations -> skip continue for j in ix_nodes: if j != i: yield j def print_current_terms(self): return ",".join( "".join(str(ix) for ix, c in term) for term in self.nodes.values() ) def remove_ix(self, ix): """Drop the index ``ix``, simply removing it from all nodes and the edgemap. """ for node in self.edges.pop(ix): self.nodes[node] = tuple( (jx, jx_count) for jx, jx_count in self.nodes[node] if jx != ix ) def pop_node(self, i): """Remove node ``i`` from the graph, updating the edgemap and returning the legs of the node. """ legs = self.nodes.pop(i) for ix, _ in legs: try: ix_nodes = self.edges[ix] ix_nodes.pop(i, None) if len(ix_nodes) == 0: del self.edges[ix] except KeyError: # repeated index already removed pass return legs def add_node(self, legs): """Add a new node to the graph, updating the edgemap and returning the node index of the new node. """ i = self.ssa self.ssa += 1 self.nodes[i] = legs for ix, _ in legs: self.edges.setdefault(ix, {})[i] = None return i def check(self): """Check that the current graph is valid, useful for debugging.""" for node, legs in self.nodes.items(): for ix, _ in legs: assert node in self.edges[ix] for ix, ix_nodes in self.edges.items(): for node in ix_nodes: assert ix in {jx for jx, _ in self.nodes[node]} def contract_nodes(self, i, j, new_legs=None): """Contract the nodes ``i`` and ``j``, adding a new node to the graph and returning its index. """ ilegs = self.pop_node(i) jlegs = self.pop_node(j) if self.track_flops: self.flops += compute_flops(ilegs, jlegs, self.sizes) if new_legs is None: new_legs = compute_contracted(ilegs, jlegs, self.appearances) k = self.add_node(new_legs) self.ssa_path.append((i, j)) return k def simplify_batch(self): """Find any indices that appear in all terms and remove them, since they simply add an constant factor to the cost of the contraction, but create a fully connected graph if left. """ ix_to_remove = [] for ix, ix_nodes in self.edges.items(): if len(ix_nodes) >= len(self.nodes): ix_to_remove.append(ix) for ix in ix_to_remove: self.remove_ix(ix) def simplify_single_terms(self): """Take any diags, reductions and traces of single terms.""" for i, legs in tuple(self.nodes.items()): if is_simplifiable(legs, self.appearances): new_legs = compute_simplified( self.pop_node(i), self.appearances ) self.add_node(new_legs) self.ssa_path.append((i,)) def simplify_scalars(self): """Remove all scalars, contracting them into the smallest remaining node, if there is one. """ scalars = [] j = None jndim = None for i, legs in self.nodes.items(): ndim = len(legs) if ndim == 0: # scalar scalars.append(i) elif (j is None) or (ndim < jndim): # also find the smallest other node, to multiply into j = i jndim = ndim if scalars: if j is not None: scalars.append(j) # binary contract from left to right ((((0, 1), 2), 3), ...) for p in range(len(scalars) - 1): k = self.contract_nodes(scalars[p], scalars[p + 1]) scalars[p + 1] = k def simplify_hadamard(self): groups = {} hadamards = set() for i, legs in self.nodes.items(): key = frozenset(ix for ix, _ in legs) if key in groups: groups[key].append(i) hadamards.add(key) else: groups[key] = [i] for key in hadamards: group = groups[key] while len(group) > 1: i = group.pop() j = group.pop() group.append(self.contract_nodes(i, j)) def simplify(self): self.simplify_batch() should_run = True while should_run: self.simplify_single_terms() self.simplify_scalars() ssa_before = self.ssa self.simplify_hadamard() # only rerun if we did hadamard deduplication should_run = ssa_before != self.ssa def subgraphs(self): remaining = set(self.nodes) groups = [] while remaining: i = remaining.pop() queue = [i] group = {i} while queue: i = queue.pop() for j in self.neighbors(i): if j not in group: group.add(j) queue.append(j) remaining -= group groups.append(sorted(group)) groups.sort() return groups def optimize_greedy( self, costmod=1.0, temperature=0.0, max_neighbors=DEFAULT_MAX_NEIGHBORS, seed=None, ): """ """ if temperature == 0.0: def local_score(sa, sb, sab): return sab / costmod - (sa + sb) * costmod else: gmblgen = GumbelBatchedGenerator(seed) def local_score(sa, sb, sab): score = sab / costmod - (sa + sb) * costmod if score > 0: return math.log(score) - temperature * gmblgen() elif score < 0: return -math.log(-score) - temperature * gmblgen() else: return -temperature * gmblgen() node_sizes = {} for i, ilegs in self.nodes.items(): node_sizes[i] = compute_size(ilegs, self.sizes) queue = [] contractions = {} c = 0 for ix_nodes in self.edges.values(): if max_neighbors and (len(ix_nodes) > max_neighbors): # basically a batch index with too many combinations -> skip continue for i, j in itertools.combinations(ix_nodes, 2): isize = node_sizes[i] jsize = node_sizes[j] klegs = compute_contracted( self.nodes[i], self.nodes[j], self.appearances ) ksize = compute_size(klegs, self.sizes) score = local_score(isize, jsize, ksize) heapq.heappush(queue, (score, c)) contractions[c] = (i, j, ksize, klegs) c += 1 while queue: _, c0 = heapq.heappop(queue) i, j, ksize, klegs = contractions.pop(c0) if (i not in self.nodes) or (j not in self.nodes): # one of nodes already contracted continue k = self.contract_nodes(i, j, new_legs=klegs) if self.track_flops and (self.flops >= self.flops_limit): # shortcut - stop early and return failed return False node_sizes[k] = ksize for l in self.neighbors_limit(k, max_neighbors): lsize = node_sizes[l] mlegs = compute_contracted( klegs, self.nodes[l], self.appearances ) msize = compute_size(mlegs, self.sizes) score = local_score(ksize, lsize, msize) heapq.heappush(queue, (score, c)) contractions[c] = (k, l, msize, mlegs) c += 1 if len(queue) >= 2**14: # eagerly prune if starting to get large new_queue = [] for score, cq in queue: i, j, _, _ = contractions[cq] if (i in self.nodes) and (j in self.nodes): # still valid option new_queue.append((score, cq)) else: # invalid -> one of nodes already contracted contractions.pop(cq, None) heapq.heapify(new_queue) queue = new_queue return True def optimize_optimal_connected( self, where, minimize="flops", cost_cap=2, search_outer=False, ): compute_con_cost = parse_minimize_for_optimal(minimize) nterms = len(where) contractions = [{} for _ in range(nterms + 1)] # we use linear index within terms given during optimization, this maps # back to the original node index termmap = {} for i, node in enumerate(where): ilegs = self.nodes[node] isubgraph = 1 << i termmap[isubgraph] = node iscore = 0 ipath = () contractions[1][isubgraph] = (ilegs, iscore, ipath) while not contractions[nterms]: for m in range(2, nterms + 1): # try and make subgraphs of size m contractions_m = contractions[m] for k in range(1, m // 2 + 1): # made up of bipartitions of size k, m - k if k != m - k: # need to check all combinations pairs = itertools.product( contractions[k].items(), contractions[m - k].items(), ) else: # only want unique combinations pairs = itertools.combinations( contractions[k].items(), 2 ) for (subgraph_i, (ilegs, iscore, ipath)), ( subgraph_j, (jlegs, jscore, jpath), ) in pairs: if subgraph_i & subgraph_j: # subgraphs overlap -> invalid continue # do sorted simultaneous iteration over ilegs and jlegs ip = 0 jp = 0 ni = len(ilegs) nj = len(jlegs) new_legs = [] # if search_outer -> we will never skip skip_because_outer = not search_outer while (ip < ni) and (jp < nj): iix, ic = ilegs[ip] jix, jc = jlegs[jp] if iix < jix: new_legs.append((iix, ic)) ip += 1 elif iix > jix: new_legs.append((jix, jc)) jp += 1 else: # iix == jix: # shared index new_legs.append((iix, ic + jc)) ip += 1 jp += 1 skip_because_outer = False if skip_because_outer: # no shared indices found continue # add any remaining non-shared indices new_legs.extend(ilegs[ip:]) new_legs.extend(jlegs[jp:]) new_score = compute_con_cost( new_legs, self.appearances, self.sizes, iscore, jscore, ) if new_score > cost_cap: # sieve contraction continue new_subgraph = subgraph_i | subgraph_j current = contractions_m.get(new_subgraph, None) if (current is None) or (new_score < current[1]): new_path = ( *ipath, *jpath, (subgraph_i, subgraph_j), ) contractions_m[new_subgraph] = ( new_legs, new_score, new_path, ) # make the holes of our 'sieve' wider cost_cap *= 2 ((_, _, bitpath),) = contractions[nterms].values() for subgraph_i, subgraph_j in bitpath: i = termmap[subgraph_i] j = termmap[subgraph_j] k = self.contract_nodes(i, j) termmap[subgraph_i | subgraph_j] = k def optimize_optimal( self, minimize="flops", cost_cap=2, search_outer=False ): # we need to optimize each disconnected subgraph separately for where in self.subgraphs(): self.optimize_optimal_connected( where, minimize=minimize, cost_cap=cost_cap, search_outer=search_outer, ) def optimize_remaining_by_size(self): """This function simply contracts remaining terms in order of size, and is meant to handle the disconnected terms left after greedy or optimal optimization. """ if len(self.nodes) == 1: # nothing to do return if len(self.nodes) == 2: self.contract_nodes(*self.nodes) return nodes_sizes = [ (compute_size(legs, self.sizes), i) for i, legs in self.nodes.items() ] heapq.heapify(nodes_sizes) while len(nodes_sizes) > 1: # contract the smallest two nodes until only one remains _, i = heapq.heappop(nodes_sizes) _, j = heapq.heappop(nodes_sizes) k = self.contract_nodes(i, j) ksize = compute_size(self.nodes[k], self.sizes) heapq.heappush(nodes_sizes, (ksize, k)) def linear_to_ssa(path, N=None): """Convert a path with recycled linear ids to a path with static single assignment ids. For example:: >>> linear_to_ssa([(0, 3), (1, 2), (0, 1)]) [(0, 3), (2, 4), (1, 5)] """ if N is None: N = sum(map(len, path)) - len(path) + 1 ids = list(range(N)) ssa = N ssa_path = [] for con in path: scon = tuple(ids.pop(c) for c in sorted(con, reverse=True)) ssa_path.append(scon) ids.append(ssa) ssa += 1 return ssa_path def ssa_to_linear(ssa_path, N=None): """Convert a path with static single assignment ids to a path with recycled linear ids. For example:: >>> ssa_to_linear([(0, 3), (2, 4), (1, 5)]) [(0, 3), (1, 2), (0, 1)] """ if N is None: N = sum(map(len, ssa_path)) - len(ssa_path) + 1 ids = list(range(N)) path = [] ssa = N for scon in ssa_path: con = [bisect.bisect_left(ids, s) for s in scon] con.sort() for j in reversed(con): ids.pop(j) ids.append(ssa) path.append(con) ssa += 1 return path def edge_path_to_ssa(edge_path, inputs): """Convert a path specified by a sequence of edge indices to a path with tuples of single static assignment (SSA) indices. Parameters ---------- edge_path : sequence[str | int] The path specified by a sequence of edge indices. inputs : tuple[tuple[str | int]] The indices of each input tensor. Returns ------- path : tuple[tuple[int]] The contraction path in static single assignment (SSA) form. """ N = len(inputs) # record which ssas each index appears on ind_to_ssas = {} # track which indices appear on which term ssa_to_inds = {} # populate maps for i, term in enumerate(inputs): for ix in term: ind_to_ssas.setdefault(ix, set()).add(i) ssa_to_inds[i] = set(term) ssa_path = [] ssa = N for ix in edge_path: # get ssas containing ix -> contract these scon = ind_to_ssas.pop(ix) if len(scon) < 2: # nothing to contract, e.g. index contracted alongside another continue # update map of where indices are new_term = set() for s in scon: for jx in ssa_to_inds.pop(s): # only need to update remaining indices jx_ssas = ind_to_ssas.get(jx, None) if jx_ssas is not None: # remove children jx_ssas.remove(s) # add new parent jx_ssas.add(ssa) # calc new term (might have extraneous indices) new_term.add(jx) ssa_to_inds[ssa] = new_term ssa_path.append(tuple(sorted(scon))) ssa += 1 return tuple(ssa_path) def edge_path_to_linear(edge_path, inputs): """Convert a path specified by a sequence of edge indices to a path with recycled linear ids. Parameters ---------- edge_path : sequence[str | int] The path specified by a sequence of edge indices. inputs : tuple[tuple[str | int]] The indices of each input tensor. Returns ------- path : tuple[tuple[int]] The contraction path in recycled linear id format. """ ssa_path = edge_path_to_ssa(edge_path, inputs) return ssa_to_linear(ssa_path, len(inputs)) def is_ssa_path(path, nterms): """Check if an explicitly given path is in 'static single assignment' form.""" seen = set() # we reverse as more likely to see high id and shortcut for con in reversed(path): for i in con: if (nterms is not None) and (i >= nterms): # indices beyond nterms -> ssa return True seen.add(i) if i in seen: # id reused -> not ssa return False def optimize_simplify(inputs, output, size_dict, use_ssa=False): """Find the (likely only partial) contraction path corresponding to simplifications only. Those simplifiactions are: - ignore any indices that appear in all terms - combine any repeated indices within a single term - reduce any non-output indices that only appear on a single term - combine any scalar terms - combine any tensors with matching indices (hadamard products) Parameters ---------- inputs : tuple[tuple[str]] The indices of each input tensor. output : tuple[str] The indices of the output tensor. size_dict : dict[str, int] A dictionary mapping indices to their dimension. use_ssa : bool, optional Whether to return the contraction path in 'SSA' format (i.e. as if each intermediate is appended to the list of inputs, without removals). Returns ------- path : list[list[int]] The contraction path, given as a sequence of pairs of node indices. """ cp = ContractionProcessor(inputs, output, size_dict) cp.simplify() if use_ssa: return cp.ssa_path return ssa_to_linear(cp.ssa_path, len(inputs)) def optimize_greedy( inputs, output, size_dict, costmod=1.0, temperature=0.0, max_neighbors=DEFAULT_MAX_NEIGHBORS, simplify=True, use_ssa=False, ): """Find a contraction path using a greedy algorithm. Parameters ---------- inputs : tuple[tuple[str]] The indices of each input tensor. output : tuple[str] The indices of the output tensor. size_dict : dict[str, int] A dictionary mapping indices to their dimension. costmod : float, optional When assessing local greedy scores how much to weight the size of the tensors removed compared to the size of the tensor added:: score = size_ab / costmod - (size_a + size_b) * costmod This can be a useful hyper-parameter to tune. temperature : float, optional When asessing local greedy scores, how much to randomly perturb the score. This is implemented as:: score -> sign(score) * log(|score|) - temperature * gumbel() which implements boltzmann sampling. max_neighbors : int, optional When looking for pairs of nodes to contract, skip any index that connects to more than this many nodes. This is useful to avoid combinatorial explosions when dealing with essentially batch indices. simplify : bool, optional Whether to perform simplifications before optimizing. These are: - ignore any indices that appear in all terms - combine any repeated indices within a single term - reduce any non-output indices that only appear on a single term - combine any scalar terms - combine any tensors with matching indices (hadamard products) Such simpifications may be required in the general case for the proper functioning of the core optimization, but may be skipped if the input indices are already in a simplified form. use_ssa : bool, optional Whether to return the contraction path in 'single static assignment' (SSA) format (i.e. as if each intermediate is appended to the list of inputs, without removals). This can be quicker and easier to work with than the 'linear recycled' format that `numpy` and `opt_einsum` use. Returns ------- path : list[list[int]] The contraction path, given as a sequence of pairs of node indices. """ cp = ContractionProcessor(inputs, output, size_dict) if simplify: cp.simplify() cp.optimize_greedy( costmod=costmod, temperature=temperature, max_neighbors=max_neighbors ) # handle disconnected subgraphs cp.optimize_remaining_by_size() if use_ssa: return cp.ssa_path return ssa_to_linear(cp.ssa_path, len(inputs)) def optimize_random_greedy_track_flops( inputs, output, size_dict, ntrials=1, costmod=(0.1, 4.0), temperature=(0.001, 1.0), seed=None, max_neighbors=DEFAULT_MAX_NEIGHBORS, simplify=True, use_ssa=False, ): """Perform a batch of random greedy optimizations, simulteneously tracking the best contraction path in terms of flops, so as to avoid constructing a separate contraction tree. Parameters ---------- inputs : tuple[tuple[str]] The indices of each input tensor. output : tuple[str] The indices of the output tensor. size_dict : dict[str, int] A dictionary mapping indices to their dimension. ntrials : int, optional The number of random greedy trials to perform. The default is 1. costmod : (float, float), optional When assessing local greedy scores how much to weight the size of the tensors removed compared to the size of the tensor added:: score = size_ab / costmod - (size_a + size_b) * costmod It is sampled uniformly from the given range. temperature : (float, float), optional When asessing local greedy scores, how much to randomly perturb the score. This is implemented as:: score -> sign(score) * log(|score|) - temperature * gumbel() which implements boltzmann sampling. It is sampled log-uniformly from the given range. seed : int, optional The seed for the random number generator. max_neighbors : int, optional When looking for pairs of nodes to contract, skip any index that connects to more than this many nodes. This is useful to avoid combinatorial explosions when dealing with essentially batch indices. simplify : bool, optional Whether to perform simplifications before optimizing. These are: - ignore any indices that appear in all terms - combine any repeated indices within a single term - reduce any non-output indices that only appear on a single term - combine any scalar terms - combine any tensors with matching indices (hadamard products) Such simpifications may be required in the general case for the proper functioning of the core optimization, but may be skipped if the input indices are already in a simplified form. use_ssa : bool, optional Whether to return the contraction path in 'single static assignment' (SSA) format (i.e. as if each intermediate is appended to the list of inputs, without removals). This can be quicker and easier to work with than the 'linear recycled' format that `numpy` and `opt_einsum` use. Returns ------- path : list[list[int]] The best contraction path, given as a sequence of pairs of node indices. flops : float The flops (/ contraction cost / number of multiplications), of the best contraction path, given log10. """ rng = get_rng(seed) best_path = None best_flops = float("inf") # create initial processor and simplify only once cp0 = ContractionProcessor(inputs, output, size_dict, track_flops=True) if simplify: cp0.simplify() if isinstance(costmod, float): # constant def _next_costmod(): return costmod else: # uniformly sample def _next_costmod(): return rng.uniform(*costmod) if isinstance(temperature, float): # constant def _next_temperature(): return temperature else: # log-uniformly sample logtempmin, logtempmax = map(math.log, temperature) def _next_temperature(): return math.exp(rng.uniform(logtempmin, logtempmax)) for _ in range(ntrials): cp = cp0.copy() success = cp.optimize_greedy( costmod=_next_costmod(), temperature=_next_temperature(), max_neighbors=max_neighbors, seed=rng, ) if not success: # optimization hit the flops limit continue # handle disconnected subgraphs cp.optimize_remaining_by_size() if cp.flops < best_flops: best_path = cp.ssa_path best_flops = cp.flops # enable even earlier stopping cp0.flops_limit = best_flops # for consistency with cotengrust / easier comparison best_flops = math.log10(best_flops) if not use_ssa: best_path = ssa_to_linear(best_path, len(inputs)) return best_path, best_flops def optimize_optimal( inputs, output, size_dict, minimize="flops", cost_cap=2, search_outer=False, simplify=True, use_ssa=False, ): """Find the optimal contraction path using a dynamic programming algorithm (by default excluding outer products). The algorithm is an optimized version of Phys. Rev. E 90, 033315 (2014) (preprint: https://arxiv.org/abs/1304.6112), adapted from the ``opt_einsum`` implementation. Parameters ---------- inputs : tuple[tuple[str]] The indices of each input tensor. output : tuple[str] The indices of the output tensor. size_dict : dict[str, int] A dictionary mapping indices to their dimension. minimize : str, optional The cost function to minimize. The options are: - "flops": minimize with respect to total operation count only (also known as contraction cost) - "size": minimize with respect to maximum intermediate size only (also known as contraction width) - 'max': minimize the single most expensive contraction, i.e. the asymptotic (in index size) scaling of the contraction - 'write' : minimize the sum of all tensor sizes, i.e. memory written - 'combo' or 'combo={factor}` : minimize the sum of FLOPS + factor * WRITE, with a default factor of 64. - 'limit' or 'limit={factor}` : minimize the sum of MAX(FLOPS, alpha * WRITE) for each individual contraction, with a default factor of 64. 'combo' is generally a good default in term of practical hardware performance, where both memory bandwidth and compute are limited. cost_cap : float, optional The maximum cost of a contraction to initially consider. This acts like a sieve and is doubled at each iteration until the optimal path can be found, but supplying an accurate guess can speed up the algorithm. search_outer : bool, optional Whether to allow outer products in the contraction path. The default is False. Especially when considering write costs, the fastest path is very unlikely to include outer products. simplify : bool, optional Whether to perform simplifications before optimizing. These are: - ignore any indices that appear in all terms - combine any repeated indices within a single term - reduce any non-output indices that only appear on a single term - combine any scalar terms - combine any tensors with matching indices (hadamard products) Such simpifications may be required in the general case for the proper functioning of the core optimization, but may be skipped if the input indices are already in a simplified form. use_ssa : bool, optional Whether to return the contraction path in 'single static assignment' (SSA) format (i.e. as if each intermediate is appended to the list of inputs, without removals). This can be quicker and easier to work with than the 'linear recycled' format that `numpy` and `opt_einsum` use. Returns ------- path : list[list[int]] The contraction path, given as a sequence of pairs of node indices. """ cp = ContractionProcessor(inputs, output, size_dict) if simplify: cp.simplify() cp.optimize_optimal( minimize=minimize, cost_cap=cost_cap, search_outer=search_outer ) # handle disconnected subgraphs cp.optimize_remaining_by_size() if use_ssa: return cp.ssa_path return ssa_to_linear(cp.ssa_path, len(inputs)) class EnsureInputsOutputAreSequence: def __init__(self, f): self.f = f def __call__(self, inputs, output, *args, **kwargs): if not isinstance(inputs[0], (tuple, list)): inputs = tuple(map(tuple, inputs)) if not isinstance(output, (tuple, list)): output = tuple(output) return self.f(inputs, output, *args, **kwargs) @functools.lru_cache() def get_optimize_greedy(accel="auto"): if accel == "auto": import importlib.util accel = importlib.util.find_spec("cotengrust") is not None if accel is True: from cotengrust import optimize_greedy as f return EnsureInputsOutputAreSequence(f) if accel is False: return optimize_greedy raise ValueError(f"Unrecognized value for `accel`: {accel}.") @functools.lru_cache() def get_optimize_random_greedy_track_flops(accel="auto"): if accel == "auto": import importlib.util accel = importlib.util.find_spec("cotengrust") is not None if accel is True: from cotengrust import optimize_random_greedy_track_flops as f return EnsureInputsOutputAreSequence(f) if accel is False: return optimize_random_greedy_track_flops raise ValueError(f"Unrecognized value for `accel`: {accel}.") class GreedyOptimizer(PathOptimizer): """Class interface to the greedy optimizer which can be instantiated with default options. """ __slots__ = ( "costmod", "temperature", "max_neighbors", "simplify", "_optimize_fn", ) def __init__( self, costmod=1.0, temperature=0.0, max_neighbors=DEFAULT_MAX_NEIGHBORS, simplify=True, accel="auto", ): self.costmod = costmod self.temperature = temperature self.max_neighbors = max_neighbors self.simplify = simplify self._optimize_fn = get_optimize_greedy(accel) def maybe_update_defaults(self, **kwargs): # allow overriding of defaults opts = { "costmod": self.costmod, "temperature": self.temperature, "simplify": self.simplify, "max_neighbors": self.max_neighbors, } opts.update(kwargs) return opts def ssa_path(self, inputs, output, size_dict, **kwargs): return self._optimize_fn( inputs, output, size_dict, use_ssa=True, **self.maybe_update_defaults(**kwargs), ) def search(self, inputs, output, size_dict, **kwargs): from ..core import ContractionTree ssa_path = self.ssa_path(inputs, output, size_dict, **kwargs) return ContractionTree.from_path( inputs, output, size_dict, ssa_path=ssa_path ) def __call__(self, inputs, output, size_dict, **kwargs): return self._optimize_fn( inputs, output, size_dict, use_ssa=False, **self.maybe_update_defaults(**kwargs), ) class RandomGreedyOptimizer(PathOptimizer): """Lightweight random greedy optimizer, that eschews hyper parameter tuning and contraction tree construction. This is a stateful optimizer that should not be re-used on different contractions. Parameters ---------- max_repeats : int, optional The number of random greedy trials to perform. costmod : (float, float), optional When assessing local greedy scores how much to weight the size of the tensors removed compared to the size of the tensor added:: score = size_ab / costmod - (size_a + size_b) * costmod It is sampled uniformly from the given range. temperature : (float, float), optional When asessing local greedy scores, how much to randomly perturb the score. This is implemented as:: score -> sign(score) * log(|score|) - temperature * gumbel() which implements boltzmann sampling. It is sampled log-uniformly from the given range. max_neighbors : int, optional When looking for pairs of nodes to contract, skip any index that connects to more than this many nodes. This is useful to avoid combinatorial explosions when dealing with essentially batch indices. seed : int, optional The seed for the random number generator. Note that deterministic behavior is only guaranteed within the python or rust backend (the `accel` parameter) and parallel settings. simplify : bool, optional Whether to perform simplifications before optimizing. These are: - ignore any indices that appear in all terms - combine any repeated indices within a single term - reduce any non-output indices that only appear on a single term - combine any scalar terms - combine any tensors with matching indices (hadamard products) Such simpifications may be required in the general case for the proper functioning of the core optimization, but may be skipped if the input indices are already in a simplified form. accel : bool or str, optional Whether to use the accelerated `cotengrust` backend. If "auto" the backend is used if available. parallel : bool or str, optional Whether to use parallel processing. If "auto" the default is to use processes unless the accelerated backend is used, in which case threads are used. Attributes ---------- best_ssa_path : list[list[int]] The best contraction path found so far. best_flops : float The flops (/ contraction cost / number of multiplications) of the best contraction path found so far. """ minimize = "flops" def __init__( self, max_repeats=32, costmod=(0.1, 4.0), temperature=(0.001, 1.0), max_neighbors=DEFAULT_MAX_NEIGHBORS, seed=None, simplify=True, accel="auto", parallel="auto", ): self.max_repeats = max_repeats # for cotengrust, ensure these are always ranges if isinstance(costmod, float): self.costmod = (costmod, costmod) else: self.costmod = tuple(costmod) if isinstance(temperature, float): self.temperature = (temperature, temperature) else: self.temperature = tuple(temperature) self.max_neighbors = max_neighbors self.simplify = simplify self.rng = get_rng(seed) self.best_ssa_path = None self.best_flops = float("inf") self.tree = None self._optimize_fn = get_optimize_random_greedy_track_flops(accel) if (parallel == "auto") and ( self._optimize_fn is not optimize_random_greedy_track_flops ): # using accelerated fn, so default to threads parallel = "threads" self._pool = parse_parallel_arg(parallel) if self._pool is not None: self._nworkers = get_n_workers(self._pool) else: self._nworkers = 1 def maybe_update_defaults(self, **kwargs): # allow overriding of defaults opts = { "costmod": self.costmod, "temperature": self.temperature, "simplify": self.simplify, "max_neighbors": self.max_neighbors, } opts.update(kwargs) return opts def ssa_path(self, inputs, output, size_dict, **kwargs): if self._pool is None: ssa_path, flops = self._optimize_fn( inputs, output, size_dict, use_ssa=True, ntrials=self.max_repeats, seed=self.rng.randint(0, 2**32 - 1), **self.maybe_update_defaults(**kwargs), ) else: # XXX: just use small batchsize if can't find num_workers? nbatches = self._nworkers batchsize = self.max_repeats // nbatches batchremainder = self.max_repeats % nbatches each_ntrials = [ batchsize + (i < batchremainder) for i in range(nbatches) ] fs = [ submit( self._pool, self._optimize_fn, inputs, output, size_dict, use_ssa=True, ntrials=ntrials, seed=self.rng.randint(0, 2**32 - 1), **self.maybe_update_defaults(**kwargs), ) for ntrials in each_ntrials if (ntrials > 0) ] ssa_path, flops = min((f.result() for f in fs), key=lambda x: x[1]) if flops < self.best_flops: self.best_ssa_path = ssa_path self.best_flops = flops return self.best_ssa_path def search(self, inputs, output, size_dict, **kwargs): from ..core import ContractionTree ssa_path = self.ssa_path( inputs, output, size_dict, **self.maybe_update_defaults(**kwargs), ) self.tree = ContractionTree.from_path( inputs, output, size_dict, ssa_path=ssa_path, ) return self.tree def __call__(self, inputs, output, size_dict, **kwargs): ssa_path = self.ssa_path( inputs, output, size_dict, **self.maybe_update_defaults(**kwargs), ) return ssa_to_linear(ssa_path) class ReusableRandomGreedyOptimizer(ReusableOptimizer): """A reusable random greedy optimizer that caches path per contraction.""" def _get_path_relevant_opts(self): """Get a frozenset of the options that are most likely to affect the path. These are the options that we use when the directory name is not manually specified. """ return [ ("max_repeats", 32), ("costmod", (0.1, 4.0)), ("temperature", (0.001, 1.0)), ("simplify", True), ("max_neighbors", DEFAULT_MAX_NEIGHBORS), ] def _get_suboptimizer(self): return RandomGreedyOptimizer(**self._suboptimizer_kwargs) def _deconstruct_tree(self, opt, tree): return { "path": tree.get_path(), "score": opt.best_flops, # store this for cache compatibility "sliced_inds": (), } def _reconstruct_tree(self, inputs, output, size_dict, con): tree = ContractionTree.from_path( inputs, output, size_dict, path=con["path"], objective=self.minimize, ) return tree @functools.lru_cache() def get_optimize_optimal(accel="auto"): if accel == "auto": import importlib.util accel = importlib.util.find_spec("cotengrust") is not None if accel is True: from cotengrust import optimize_optimal as f return EnsureInputsOutputAreSequence(f) if accel is False: return optimize_optimal raise ValueError(f"Unrecognized value for `accel`: {accel}.") class OptimalOptimizer(PathOptimizer): """Class interface to the optimal optimizer which can be instantiated with default options. """ __slots__ = ( "minimize", "cost_cap", "search_outer", "simplify", "_optimize_fn", ) def __init__( self, minimize="flops", cost_cap=2, search_outer=False, simplify=True, accel="auto", ): self.minimize = minimize self.cost_cap = cost_cap self.search_outer = search_outer self.simplify = simplify self._optimize_fn = get_optimize_optimal(accel) def maybe_update_defaults(self, **kwargs): # allow overriding of defaults opts = { "minimize": self.minimize, "cost_cap": self.cost_cap, "search_outer": self.search_outer, "simplify": self.simplify, } opts.update(kwargs) return opts def ssa_path(self, inputs, output, size_dict, **kwargs): return self._optimize_fn( inputs, output, size_dict, use_ssa=True, **self.maybe_update_defaults(**kwargs), ) def search(self, inputs, output, size_dict, **kwargs): from ..core import ContractionTree ssa_path = self.ssa_path(inputs, output, size_dict, **kwargs) return ContractionTree.from_path( inputs, output, size_dict, ssa_path=ssa_path ) def __call__(self, inputs, output, size_dict, **kwargs): return self._optimize_fn( inputs, output, size_dict, use_ssa=False, **self.maybe_update_defaults(**kwargs), ) ================================================ FILE: cotengra/pathfinders/path_compressed.py ================================================ """Compressed contraction tree finding routines.""" import heapq import itertools from ..core import get_hypergraph from ..plot import show_and_close, use_neutral_style from ..scoring import get_score_fn from ..utils import GumbelBatchedGenerator, get_rng class MiniTree: """A very minimal tree data structure for tracking possible contractions within a window only. """ __slots__ = ("children", "parents", "leaves", "candidates") def __init__(self): self.children = {} self.parents = {} # use these as ordered sets self.leaves = {} self.candidates = {} def copy(self): m = object.__new__(MiniTree) m.children = self.children.copy() m.parents = self.parents.copy() m.leaves = self.leaves.copy() m.candidates = self.candidates.copy() return m def add(self, p, l, r): self.children[p] = (l, r) self.parents[l] = p self.parents[r] = p lleaf = l not in self.children rleaf = r not in self.children if lleaf: # add to leaf set self.leaves[l] = None if rleaf: # add to leaf set self.leaves[r] = None if lleaf and rleaf: # both can be contracted self.candidates[p] = None def contract(self, p): self.candidates.pop(p) l, r = self.children.pop(p) self.parents.pop(l) self.parents.pop(r) self.leaves[p] = None try: pp = self.parents[p] except KeyError: # one of possibly many root nodes return l, r psibling = next(i for i in self.children[pp] if i != p) if psibling in self.leaves: self.candidates[pp] = None return l, r def __repr__(self): return ( f"MiniTree(" f"children={len(self.children)}, " f"parents={len(self.parents)}, " f"leaves={len(self.leaves)}, " f"candidates={len(self.candidates)}" ")" ) class EmptyMiniTree: __slots__ = ("candidates",) def __init__(self, hgi, hgf): roots = {} # find nodes in end but not start hypergraph for p in hgf.nodes: if p not in hgi.nodes: roots[p] = [] # find nodes in start but not end hypergraph # and group them according to root for l in hgi.nodes: if l not in hgf.nodes: for p in roots: # is subset of p if l & p == l: roots[p].append(l) # don't need to check other roots break # collect possible candidates self.candidates = {} # self.siblings = {} for p, sg in roots.items(): # within each subgraph add potential contractions if len(sg) == 2: # only one ordering possible l, r = sg self.candidates[p] = (l, r) else: # add all connected combinations for l, r in itertools.combinations(sg, 2): el = hgi.get_node(l) er = hgi.get_node(r) if not set(el).isdisjoint(er): # they share an edge p = l | r self.candidates[p] = (l, r) def copy(self): new = object.__new__(self.__class__) new.candidates = self.candidates.copy() return new def contract(self, p): l, r = self.candidates.pop(p) # check other contractions to see if they contained l or r for po, (lo, ro) in tuple(self.candidates.items()): if lo in (l, r): # replace the old left with p del self.candidates[po] self.candidates[po | p] = (p, ro) elif ro in (l, r): # replace the old right with p del self.candidates[po] self.candidates[po | p] = (lo, p) return l, r class Node: """A possible intermediate contraction state.""" __slots__ = ("hg", "plr", "chi", "tracker", "compress_late") def __init__(self, hg, plr, chi, tracker, compress_late=False): self.hg = hg self.plr = plr self.chi = chi self.tracker = tracker self.compress_late = compress_late @classmethod def first(cls, inputs, output, size_dict, minimize): hg = get_hypergraph( # use bit encoding inputs={1 << i: term for i, term in enumerate(inputs)}, output=output, size_dict=size_dict, # can't use bit encoding in rust accel=False, ) plr = None minimize = get_score_fn(minimize) if minimize.chi == "auto": chi = max(size_dict.values()) ** 2 else: chi = minimize.chi return cls( hg=hg, plr=plr, chi=chi, tracker=minimize.get_compressed_stats_tracker(hg), compress_late=minimize.compress_late, ) def next(self, p, l, r): hg = self.hg.copy() tracker = self.tracker.copy() # simulate a contraction step while tracking costs tracker.update_pre_step() if self.compress_late: tracker.update_pre_compress(hg, l, r) # compress late - just before contraction hg.compress(self.chi, hg.get_node(l)) hg.compress(self.chi, hg.get_node(r)) tracker.update_post_compress(hg, l, r) tracker.update_pre_contract(hg, l, r) hg.contract(l, r, node=p) tracker.update_post_contract(hg, p) if not self.compress_late: tracker.update_pre_compress(hg, p) # compress early - immediately after contraction hg.compress(self.chi, hg.get_node(p)) tracker.update_post_compress(hg, p) tracker.update_post_step() return self.__class__( hg=hg, plr=(p, l, r), chi=self.chi, tracker=tracker, compress_late=self.compress_late, ) def graph_key(self): return frozenset(self.hg.nodes) def __repr__(self): return f"Node(num_nodes={self.hg.num_nodes}, tracker={self.tracker})" def ssa_path_to_bit_path(path): N = len(path) + 1 bitpath = [] ssa_to_bit = {i: 1 << i for i in range(N)} for si, sj in path: ni = ssa_to_bit[si] nj = ssa_to_bit[sj] nij = ni | nj ssa_to_bit[len(ssa_to_bit)] = nij bitpath.append((nij, ni, nj)) return tuple(bitpath) def bit_path_to_ssa_path(bitpath): N = len(bitpath) + 1 bit_to_ssa = {1 << i: i for i in range(N)} path = [] for nij, ni, nj in bitpath: path.append((bit_to_ssa[ni], bit_to_ssa[nj])) bit_to_ssa[nij] = len(bit_to_ssa) return tuple(path) class WindowedOptimizer: """ """ def __init__( self, inputs, output, size_dict, minimize, ssa_path, seed=None, ): bitpath = ssa_path_to_bit_path(ssa_path) self.nodes = {0: Node.first(inputs, output, size_dict, minimize)} for c, (nij, ni, nj) in enumerate(bitpath): self.nodes[c + 1] = self.nodes[c].next(nij, ni, nj) self.rng = get_rng(seed) self.gumbel = GumbelBatchedGenerator(self.rng) @property def tracker(self): return self.nodes[len(self.nodes) - 1].tracker @show_and_close @use_neutral_style def plot_size_footprint(self, figsize=(8, 3)): import math import matplotlib.pyplot as plt fig, ax = plt.subplots(figsize=figsize) cs = range(len(self.nodes)) xs0 = [ math.log2(max(1, self.nodes[c].tracker.total_size_post_contract)) for c in cs ] xs1 = [math.log2(max(1, self.nodes[c].tracker.total_size)) for c in cs] xs2 = [ math.log2(max(1, self.nodes[c].tracker.contracted_size)) for c in cs ] ax.plot(cs, xs0, label="total size contracted", zorder=4) ax.plot(cs, xs1, label="total size compressed", zorder=3) ax.plot(cs, xs2, label="single size", zorder=2) ax.legend() return fig, ax def optimize_window( self, ci, cf, order_only=False, max_window_tries=1000, score_temperature=0.0, queue_temperature=1.0, scorer=None, queue_scorer=None, ): if scorer is None: def scorer(nodes, T=0.0): """This is the score we want to minimize overall for the window. """ return ( nodes[-1].tracker.score - T * self.gumbel(), # secondarily try and minimize combo cost nodes[-1].tracker.combo_score, ) if queue_scorer is None: def queue_scorer(nodes, T): """This is the score we use to control queue exploration, which is called on potentially only a partial window. """ return ( # prioritize more complete pats -len(nodes), nodes[-1].tracker.score - T * self.gumbel(), ) if order_only: subtree = MiniTree() for c in range(ci + 1, cf): node = self.nodes[c] p, l, r = node.plr subtree.add(p, l, r) else: subtree = EmptyMiniTree(self.nodes[ci].hg, self.nodes[cf - 1].hg) counter = itertools.count() best_score = scorer([self.nodes[c] for c in range(ci, cf)]) q = next(counter) queue = [(0, q)] cands = {q: (subtree, (self.nodes[ci],))} tries = 0 while queue and tries < max_window_tries: # get the next candidate contraction path _, q = heapq.heappop(queue) this_subtree, this_subnodes = cands.pop(q) # check the next possible contractions for p in this_subtree.candidates: next_subtree = this_subtree.copy() l, r = next_subtree.contract(p) next_subnodes = this_subnodes + ( this_subnodes[-1].next(p, l, r), ) score = scorer(next_subnodes, score_temperature) if score >= best_score: # know no improvement, count as try and terminate tries += 1 elif next_subtree.candidates: # still more to go -> add to queue q = next(counter) qs = queue_scorer(next_subnodes, queue_temperature) heapq.heappush(queue, (qs, q)) cands[q] = (next_subtree, next_subnodes) else: # finished the local contraction with good score, check it for c, node in enumerate(next_subnodes[1:], ci + 1): # replace the nodes in the window self.nodes[c] = node best_score = score tries += 1 # update the later trackers for global score changes for c in range(cf, len(self.nodes)): self.nodes[c].tracker.update_score(self.nodes[c - 1].tracker) def refine( self, window_size=20, max_iterations=100, order_only=False, max_window_tries=1000, score_temperature=0.01, queue_temperature=1.0, scorer=None, queue_scorer=None, progbar=False, **kwargs, ): wl = window_size // 2 wr = window_size - wl its = range(max_iterations) if progbar: import tqdm its = tqdm.tqdm(its) cs = list(self.nodes.keys()) for _ in its: p = [n.tracker.total_size for n in self.nodes.values()] wc = self.rng.choices(cs, weights=p)[0] # window can't extend beyond edges wc = min(max(wl, wc), len(self.nodes) - wr) self.optimize_window( wc - wl, wc + wr, order_only=order_only, max_window_tries=max_window_tries, score_temperature=score_temperature, queue_temperature=queue_temperature, scorer=scorer, queue_scorer=queue_scorer, **kwargs, ) if progbar: its.set_description(f"{self.tracker}", refresh=False) def simulated_anneal( self, tfinal=0.0001, tstart=0.01, tsteps=50, numiter=50, select="descend", target_size=None, slice_mode=None, progbar=False, ): import math from .path_simulated_annealing import linspace_generator if progbar: import tqdm pbar = tqdm.tqdm(total=numiter * tsteps) else: pbar = None N = len(self.nodes) if select == "descend": ns = range(N - 2, 0, -1) elif select == "ascend": ns = range(1, N - 1) elif select in ("random", "bounce"): ns = list(range(1, N - 1)) else: raise ValueError(f"Unknown select mode: {select}") try: for temp in linspace_generator(tstart, tfinal, tsteps, log=True): for _ in range(numiter): if select == "random": self.rng.shuffle(ns) elif select == "bounce": ns.reverse() for n in ns: node_0 = self.nodes[n - 1] node_1 = self.nodes[n] node_2 = self.nodes[n + 1] pa, la, ra = node_1.plr pb, lb, rb = node_2.plr if (pa == lb) or (pa == rb): # dependent contractions if pa == lb: a, b, c = la, ra, rb else: # pa == rb a, b, c = la, ra, lb if self.rng.choice([0, 1]) == 0: # propose ((AC)B) x = a | c node_p1 = node_0.next(x, a, c) node_p2 = node_p1.next(pb, x, b) else: # propose (A(BC)) x = b | c node_p1 = node_0.next(x, b, c) node_p2 = node_p1.next(pb, x, a) else: # parallel contractions (AB)(CD) node_p1 = node_0.next(pb, lb, rb) node_p2 = node_p1.next(pa, la, ra) current_score = max( node_1.tracker.score, node_2.tracker.score ) proposed_score = max( node_p1.tracker.score, node_p2.tracker.score ) dE = proposed_score - current_score accept = (dE <= 0) or ( math.log(self.rng.random()) < -dE / temp ) if accept: self.nodes[n] = node_p1 self.nodes[n + 1] = node_p2 # # need to update any global score trackers # for c in range(n + 2, len(self.nodes)): # self.nodes[c].tracker.update_score( # self.nodes[c - 1].tracker # ) for c in range(1, len(self.nodes)): self.nodes[c].tracker.update_score( self.nodes[c - 1].tracker ) if progbar: pbar.update() pbar.set_description( f"T={temp:.3g} {self.tracker.describe()}" ) except KeyboardInterrupt: pass finally: if pbar: pbar.close() def get_ssa_path(self): bitpath = [self.nodes[c].plr for c in range(1, len(self.nodes))] return bit_path_to_ssa_path(bitpath) ================================================ FILE: cotengra/pathfinders/path_compressed_greedy.py ================================================ """Greedy contraction tree finders.""" import collections import heapq import itertools import math from ..core import ( ContractionTreeCompressed, get_hypergraph, ) from ..hyperoptimizers.hyper import register_hyper_function from ..utils import BadTrial, GumbelBatchedGenerator, get_rng, oset from .path_basic import ssa_to_linear from .path_greedy import ssa_greedy_optimize # --------------------------------------------------------------------------- # def _binary_combine(func, x, y): if func == "sum": return x + y if func == "mean": return (x + y) / 2 if func == "max": return max(x, y) if func == "min": return min(x, y) if func == "diff": return abs(x - y) class GreedyCompressed: """A greedy contraction path finder that takes into account the effect of compression, and can also make use of subgraph size and centrality. Parameters ---------- chi : int The maximum bond size between nodes to compress to. coeff_size_compressed : float, optional When assessing contractions, how to weight the size of the output tensor, post compression. coeff_size : float, optional When assessing contractions, how to weight the size of the output tenor, pre compression. coeff_size_inputs : float, optional When assessing contractions, how to weight the maximum size of the inputs tensors. score_size_inputs : {'sum', 'mean', 'max', 'min', 'diff'}, optional When assessing contractions, how to score the combination of the two input tensor sizes. coeff_subgraph_size : float, optional When assessing contractions, how to weight the total subgraph size corresponding to the inputs tensors. score_subgraph_size : {'sum', 'mean', 'max', 'min', 'diff'}, optional When assessing contractions, how to score the combination of the two input subgraph sizes. coeff_centrality : float, optional When assessing contractions, how to weight the combined centrality of the inputs tensors. centrality_combine : {'sum', 'mean', 'max', 'min'}, optional When performing the contraction, how to combine the two input tensor centralities to produce a new one. score_centrality : {'sum', 'mean', 'max', 'min', 'diff'}, optional When assessing contractions, how to score the combination of the two input tensor centralities. temperature : float, optional A noise level to apply to the scores when choosing nodes to expand to. """ def __init__( self, chi, coeff_size_compressed=1.0, coeff_size=0.0, coeff_size_inputs=0.0, score_size_inputs="max", coeff_subgraph=0.0, score_subgraph="sum", coeff_centrality=0.0, centrality_combine="max", score_centrality="diff", temperature=0.0, score_perm="", early_terminate_size=None, seed=None, ): self.chi = chi self.coeff_size_compressed = coeff_size_compressed self.coeff_size = coeff_size self.coeff_size_inputs = coeff_size_inputs self.score_size_inputs = score_size_inputs self.coeff_subgraph = coeff_subgraph self.score_subgraph = score_subgraph self.coeff_centrality = coeff_centrality self.centrality_combine = centrality_combine self.score_centrality = score_centrality self.temperature = temperature self.score_perm = score_perm self.early_terminate_size = early_terminate_size self.gumbel = GumbelBatchedGenerator(seed) def _score(self, i1, i2): # the two inputs tensors (with prior compressions) size1 = self.hg.node_size(i1) size2 = self.hg.node_size(i2) # the new tensor inds, plus indices that will be available to compress old_size = self.hg.candidate_contraction_size(i1, i2) new_size = self.hg.candidate_contraction_size(i1, i2, chi=self.chi) scores = { "R": self.coeff_size_compressed * math.log2(new_size), "O": self.coeff_size * math.log2(old_size), # weight some combination of the inputs sizes "I": self.coeff_size_inputs * _binary_combine( self.score_size_inputs, math.log2(size1), math.log2(size2) ), # weight some combination of the inputs subgraph sizes "S": self.coeff_subgraph * _binary_combine( self.score_subgraph, math.log(self.sgsizes[i1]), math.log(self.sgsizes[i2]), ), # weight some combination of the inputs centralities "L": self.coeff_centrality * _binary_combine( self.score_centrality, self.sgcents[i1], self.sgcents[i2] ), # randomize using boltzmann sampling trick "T": max(0.0, self.temperature) * self.gumbel(), } if self.score_perm == "": return sum(scores.values()) return tuple(scores[p] for p in self.score_perm) def get_ssa_path(self, inputs, output, size_dict): self.candidates = [] self.ssapath = [] self.hg = get_hypergraph(inputs, output, size_dict, accel="auto") # compute hypergraph centralities to use heuristically self.sgcents = self.hg.simple_centrality() self.sgsizes = {i: 1 for i in range(len(inputs))} # populate initial scores with contractions among leaves for _, edge_nodes in self.hg.edges.items(): for nodes in itertools.combinations(edge_nodes, 2): candidate = (self._score(*nodes), *nodes) heapq.heappush(self.candidates, candidate) while self.hg.get_num_nodes() > 2: if not self.candidates: # this occurs with disconneted sub-graphs -> pick any two i1, i2, *_ = self.hg.nodes else: # get the next best score contraction _, i1, i2 = heapq.heappop(self.candidates) if not (self.hg.has_node(i1) and self.hg.has_node(i2)): # invalid - either node already contracted continue # perform contraction i12 = self.hg.contract(i1, i2) if self.early_terminate_size is not None: if self.hg.node_size(i12) > self.early_terminate_size: # super bad contractions can be very slow, so simply # terminate early and flag them raise BadTrial # do early compression self.hg.compress(chi=self.chi, edges=self.hg.get_node(i12)) # build the path self.ssapath.append((i1, i2)) # propagate some meta information up the contraction tree self.sgsizes[i12] = self.sgsizes.pop(i1) + self.sgsizes.pop(i2) self.sgcents[i12] = _binary_combine( self.centrality_combine, self.sgcents.pop(i1), self.sgcents.pop(i2), ) # assess / re-assess new and also neighboring contractions # n.b. duplicate scores should be lower and heap-popped first for e in self.hg.neighbor_edges(i12): for nodes in itertools.combinations(self.hg.get_edge(e), 2): candidate = (self._score(*nodes), *nodes) heapq.heappush(self.candidates, candidate) self.ssapath.append(tuple(self.hg.nodes)) return self.ssapath def search(self, inputs, output, size_dict): return ContractionTreeCompressed.from_path( inputs, output, size_dict, ssa_path=self.get_ssa_path(inputs, output, size_dict), ) def __call__(self, inputs, output, size_dict, memory_limit=None): return ssa_to_linear( self.get_ssa_path(inputs, output, size_dict), len(inputs) ) def greedy_compressed(inputs, output, size_dict, memory_limit=None, **kwargs): try: chi = kwargs.pop("chi") except KeyError: chi = max(size_dict.values()) ** 2 return GreedyCompressed(chi, **kwargs)(inputs, output, size_dict) def trial_greedy_compressed(inputs, output, size_dict, **kwargs): try: chi = kwargs.pop("chi") except KeyError: chi = max(size_dict.values()) ** 2 return GreedyCompressed(chi, **kwargs).search(inputs, output, size_dict) register_hyper_function( name="greedy-compressed", ssa_func=trial_greedy_compressed, space={ "coeff_size_compressed": {"type": "FLOAT", "min": 0.5, "max": 2.0}, "coeff_size": {"type": "FLOAT", "min": 0.0, "max": 1.0}, "coeff_size_inputs": {"type": "FLOAT", "min": -1.0, "max": 1.0}, "score_size_inputs": { "type": "STRING", "options": ["min", "max", "mean", "sum", "diff"], }, "coeff_subgraph": {"type": "FLOAT", "min": -1.0, "max": 1.0}, "score_subgraph": { "type": "STRING", "options": ["min", "max", "mean", "sum", "diff"], }, "coeff_centrality": {"type": "FLOAT", "min": -10.0, "max": 10.0}, "centrality_combine": { "type": "STRING", "options": ["min", "max", "mean"], }, "score_centrality": { "type": "STRING", "options": ["min", "max", "mean", "diff"], }, "temperature": {"type": "FLOAT", "min": -0.1, "max": 1.0}, "chi": {"type": "INT", "min": 2, "max": 128}, }, constants={ "early_terminate_size": 2**100, }, ) # --------------------------------------------------------------------------- # class GreedySpan: """A contraction path optimizer that greedily generates spanning trees out of particular nodes, suitable for e.g. compressed contraction paths. Parameters ---------- start : {'max', 'min'}, optional Whether to start the span from the maximum or minimum centrality point. coeff_connectivity : float, optional When considering adding nodes to the span, how to weight the nodes connectivity to the current span. coeff_ndim : float, optional When considering adding nodes to the span, how to weight the nodes total rank. coeff_distance : float, optional When considering adding nodes to the span, how to weight the nodes distance to the starting point. coeff_next_centrality : float, optional When considering adding nodes to the span, how to weight the nodes centrality. weight_bonds temperature : float, optional A noise level to apply to the scores when choosing nodes to expand to. score_perm distance_p distance_steal """ def __init__( self, start="max", coeff_connectivity=1.0, coeff_ndim=1.0, coeff_distance=-1.0, coeff_next_centrality=0.0, weight_bonds=True, temperature=0.0, score_perm="CNDLTI", distance_p=1, distance_steal="abs", seed=None, ): self.start = start self.coeff_connectivity = coeff_connectivity self.coeff_ndim = coeff_ndim self.coeff_distance = coeff_distance self.coeff_next_centrality = coeff_next_centrality self.weight_bonds = weight_bonds self.temperature = temperature self.score_perm = score_perm self.distance_p = distance_p self.distance_steal = distance_steal self.rng = get_rng(seed) self.gumbel = GumbelBatchedGenerator(self.rng) def get_ssa_path(self, inputs, output, size_dict): self.hg = get_hypergraph(inputs, output, size_dict, accel="auto") self.cents = self.hg.simple_centrality() def region_choose_sorter(node): return self.cents[node] + 1e-6 * self.rng.random() if output: region = oset(self.hg.output_nodes()) elif self.start == "max": region = oset([max(self.cents.keys(), key=region_choose_sorter)]) elif self.start == "min": region = oset([min(self.cents.keys(), key=region_choose_sorter)]) else: region = oset(self.start) candidates = [] merges = {} distances = self.hg.simple_distance(list(region), p=self.distance_p) connectivity = collections.defaultdict(lambda: 0) if len(region) == 1: seq = [] elif len(region) == 2: seq = [tuple(region)] else: # span will have multiple starting points, contract these o_nodes = list(region) o_inputs = [inputs[i] for i in o_nodes] o_ssa_path = ssa_greedy_optimize(o_inputs, output, size_dict) seq = [] for pi, pj in o_ssa_path: merges[o_nodes[pi]] = o_nodes[pj] seq.append((o_nodes[pi], o_nodes[pj])) o_nodes.append(o_nodes[pj]) seq.reverse() def _check_candidate(i_surface, i_neighbor): if i_neighbor in region: return if i_neighbor in merges: i_current = merges[i_neighbor] if self.distance_steal == "abs": if distances[i_surface] < distances[i_current]: merges[i_neighbor] = i_surface elif self.distance_steal == "rel": old_diff = abs( distances[i_current] - distances[i_neighbor] ) new_diff = abs( distances[i_surface] - distances[i_neighbor] ) if new_diff > old_diff: merges[i_neighbor] = i_surface else: merges[i_neighbor] = i_surface candidates.append(i_neighbor) if self.weight_bonds: connectivity[i_neighbor] += math.log2( self.hg.bond_size(i_surface, i_neighbor) ) else: connectivity[i_neighbor] += 1 def _sorter(i): scores = { "C": self.coeff_connectivity * connectivity[i], "N": self.coeff_ndim * len(inputs[i]), "D": self.coeff_distance * distances[i], "L": self.coeff_next_centrality * self.cents[i], "T": max(0.0, self.temperature) * self.gumbel(), "I": -i, } if self.score_perm == "": return sum(scores[o] for o in "CNDLT") c = tuple(scores[o] for o in self.score_perm) return c for i in region: for j in self.hg.neighbors(i): _check_candidate(i, j) while candidates: candidates.sort(key=_sorter) i_surface = candidates.pop() region.add(i_surface) for i_next in self.hg.neighbors(i_surface): _check_candidate(i_surface, i_next) seq.append((i_surface, merges[i_surface])) seq.reverse() ssapath = [] ssa = self.hg.get_num_nodes() node2ssa = {i: i for i in range(ssa)} for i, j in seq: ssapath.append((node2ssa[i], node2ssa[j])) node2ssa[j] = ssa ssa += 1 return ssapath def search(self, inputs, output, size_dict): return ContractionTreeCompressed.from_path( inputs, output, size_dict, ssa_path=self.get_ssa_path(inputs, output, size_dict), ) def __call__(self, inputs, output, size_dict, memory_limit=None): return ssa_to_linear( self.get_ssa_path(inputs, output, size_dict), len(inputs) ) def greedy_span(inputs, output, size_dict, memory_limit=None, **kwargs): return GreedySpan(**kwargs)(inputs, output, size_dict) def trial_greedy_span(inputs, output, size_dict, **kwargs): return GreedySpan(**kwargs).search(inputs, output, size_dict) _allowed_perms = tuple( "C" + "".join(p) + "T" for p in itertools.permutations("NDLI") ) register_hyper_function( name="greedy-span", ssa_func=trial_greedy_span, space={ "start": {"type": "STRING", "options": ["min", "max"]}, "score_perm": {"type": "STRING", "options": _allowed_perms}, "coeff_connectivity": {"type": "INT", "min": 0, "max": 1}, "coeff_ndim": {"type": "INT", "min": -1, "max": 1}, "coeff_distance": {"type": "INT", "min": -1, "max": 1}, "coeff_next_centrality": {"type": "FLOAT", "min": -1, "max": 1}, "weight_bonds": {"type": "BOOL"}, "temperature": {"type": "FLOAT", "min": -1.0, "max": 1.0}, "distance_p": {"type": "FLOAT", "min": -5.0, "max": 5.0}, "distance_steal": {"type": "STRING", "options": ["", "abs", "rel"]}, }, ) register_hyper_function( name="greedy-span-max", ssa_func=trial_greedy_span, space={ "score_perm": {"type": "STRING", "options": _allowed_perms}, "coeff_connectivity": {"type": "INT", "min": 0, "max": 1}, "coeff_ndim": {"type": "INT", "min": -1, "max": 1}, "coeff_distance": {"type": "INT", "min": -1, "max": 1}, "coeff_next_centrality": {"type": "FLOAT", "min": -1, "max": 1}, "weight_bonds": {"type": "BOOL"}, "temperature": {"type": "FLOAT", "min": -1.0, "max": 1.0}, "distance_p": {"type": "FLOAT", "min": -5.0, "max": 5.0}, "distance_steal": {"type": "STRING", "options": ["", "abs", "rel"]}, }, constants={"start": "max"}, ) ================================================ FILE: cotengra/pathfinders/path_edgesort.py ================================================ from ..core import ContractionTree from ..oe import PathOptimizer class EdgeSortOptimizer(PathOptimizer): """A path optimizer that proceeds by contacting edges in sorted order, as is the default in the original `ncon` function. The path is thus specified entirely by the naming of the edges. Parameters ---------- reverse : bool, optional If True, the edges are sorted in reverse order. The default is False. """ def __init__(self, reverse=False): self.reverse = reverse def search(self, inputs, output, size_dict, **kwargs): edge_path = sorted( (ix for ix in size_dict if ix not in output), reverse=self.reverse ) return ContractionTree.from_path( inputs, output, size_dict, edge_path=edge_path, **kwargs, ) def __call__(self, inputs, output, size_dict, **kwargs): tree = self.search( inputs, output, size_dict, **kwargs, ) return tree.get_path() ================================================ FILE: cotengra/pathfinders/path_flowcutter.py ================================================ """Flowcutter based pathfinder.""" import re import signal import subprocess import tempfile import time import warnings from ..core import ContractionTree from ..hypergraph import LineGraph from ..hyperoptimizers.hyper import register_hyper_function from ..oe import PathOptimizer from ..utils import get_rng from .treedecomp import td_str_to_tree_decomposition, td_to_eo class FlowCutterOptimizer(PathOptimizer): def __init__( self, max_time=10, seed=None, executable="flow_cutter_pace17" ): self.max_time = max_time self.rng = get_rng(seed) self.executable = executable def run_flowcutter(self, file, max_time=None): if max_time is None: max_time = self.max_time seed = self.rng.randint(0, 2**32 - 1) args = [self.executable, "-s", str(seed)] process = subprocess.Popen(args, stdout=subprocess.PIPE, stdin=file) t0 = time.time() while process.poll() is None: time.sleep(0.1) if time.time() > t0 + max_time: process.send_signal(signal.SIGTERM) break self.out = process.stdout.read().decode("utf-8") # self reported treewidth self.treewidth = int(re.findall(r"s td (\d+) (\d+)", self.out)[-1][1]) def compute_edge_path(self, lg): td = td_str_to_tree_decomposition(self.out) eo = td_to_eo(td) self.edge_path = [lg.nodes[i - 1] for i in eo.ordering] def build_tree(self, inputs, output, size_dict, memory_limit=None): self.lg = LineGraph(inputs, output) with tempfile.NamedTemporaryFile(suffix=".gr") as file: self.lg.to_gr_file(file.name) max_time = self.max_time while True: try: self.run_flowcutter(file, max_time=max_time) break except IndexError: max_time *= 1.5 warnings.warn( "FlowCutter produced no input, automatically" " repeating with max_time 1.5x increased to " f" {max_time}." ) self.compute_edge_path(self.lg) self.tree = ContractionTree.from_path( inputs, output, size_dict, edge_path=self.edge_path ) return self.tree def __call__(self, inputs, output, size_dict, memory_limit=None): return self.build_tree(inputs, output, size_dict).get_path() def optimize_flowcutter( inputs, output, size_dict, memory_limit=None, max_time=10, seed=None ): opt = FlowCutterOptimizer(max_time=max_time, seed=seed) return opt(inputs, output, size_dict) def trial_flowcutter(inputs, output, size_dict, max_time=10, seed=None): opt = FlowCutterOptimizer(max_time=max_time, seed=seed) return opt.build_tree(inputs, output, size_dict) register_hyper_function( name="flowcutter", ssa_func=trial_flowcutter, space={"max_time": {"type": "FLOAT_EXP", "min": 2.0, "max": 60.0}}, ) ================================================ FILE: cotengra/pathfinders/path_greedy.py ================================================ import functools from ..core import ContractionTree, jitter_dict from ..hyperoptimizers.hyper import register_hyper_function from .path_basic import get_optimize_greedy ssa_greedy_optimize = functools.partial(get_optimize_greedy(), use_ssa=True) # ------------------------------ GREEDY HYPER ------------------------------- # def trial_greedy( inputs, output, size_dict, random_strength=0.0, temperature=0.0, costmod=1.0, ): if random_strength != 0.0: # don't supply randomized sizes to actual contraction tree greedy_size_dict = jitter_dict(size_dict, random_strength) else: greedy_size_dict = size_dict ssa_path = ssa_greedy_optimize( inputs, output, greedy_size_dict, temperature=temperature, costmod=costmod, ) return ContractionTree.from_path( inputs, output, size_dict, ssa_path=ssa_path ) register_hyper_function( name="greedy", ssa_func=trial_greedy, space={ "random_strength": {"type": "FLOAT_EXP", "min": 0.001, "max": 1.0}, "temperature": {"type": "FLOAT_EXP", "min": 0.001, "max": 1.0}, "costmod": {"type": "FLOAT", "min": 0.1, "max": 4.0}, }, ) # greedy but less exploratative -> better for a small number of runs # note this hyper driver is slightly different from overall preset # "random-greedy" which doesn't use the hyper framework register_hyper_function( name="random-greedy", ssa_func=trial_greedy, space={ "temperature": {"type": "FLOAT_EXP", "min": 0.001, "max": 0.1}, "costmod": {"type": "FLOAT", "min": 0.5, "max": 3.0}, }, constants={ "random_strength": 0.0, }, ) ================================================ FILE: cotengra/pathfinders/path_igraph.py ================================================ """igraph based pathfinders.""" import functools from collections import defaultdict from ..core import ( ContractionTree, PartitionTreeBuilder, jitter_dict, ) from ..hypergraph import ( calc_edge_weight_float, calc_node_weight_float, ) from ..hyperoptimizers.hyper import register_hyper_function from ..utils import get_rng def oe_to_igraph( inputs, output, size_dict, weight_nodes="const", weight_edges="log" ): """Convert opt_einsum format to igraph graph incl. weights.""" import igraph as ig G = ig.Graph() # which positions each edge links ind2terms = defaultdict(list) for i, term in enumerate(inputs): nweight = calc_node_weight_float(term, size_dict, weight_nodes) G.add_vertex(str(i), weight=nweight) for ix in term: if ix not in output: ind2terms[ix].append(str(i)) for ix, enodes in ind2terms.items(): if len(enodes) != 2: continue eweight = calc_edge_weight_float(ix, size_dict, weight_edges) G.add_edge(*enodes, ind=ix, weight=eweight) return G def igraph_subgraph_find_membership( inputs, output, size_dict, weight_nodes="const", weight_edges="log", method="spinglass", parts=2, seed=None, **igraph_opts, ): G = oe_to_igraph(inputs, output, size_dict, weight_nodes, weight_edges) # first check for disconnected components components = G.components() if len(components) > 1: return components.membership weight_lbl = "weight" if weight_edges != "const" else None nd_weight_lbl = "weight" if weight_nodes != "const" else None if method == "spinglass": igraph_opts.setdefault("spins", parts) clustering = G.community_spinglass(weight_lbl, **igraph_opts) elif method == "infomap": clustering = G.community_infomap( weight_lbl, nd_weight_lbl, **igraph_opts ) elif method == "label_propagation": rng = get_rng(seed) initial = [rng.choice(range(parts)) for _ in range(len(G.vs))] clustering = G.community_label_propagation( weight_lbl, initial=initial, **igraph_opts ) elif method == "multilevel": clustering = G.community_multilevel(weight_lbl, **igraph_opts) elif method == "leading_eigenvector": igraph_opts.setdefault("clusters", parts) clustering = G.community_leading_eigenvector( weights=weight_lbl, **igraph_opts ) return clustering.membership igraph_to_tree = PartitionTreeBuilder(igraph_subgraph_find_membership) trial_igraph_partition = igraph_to_tree.trial_fn def trial_igraph_dendrogram( inputs, output, size_dict, weight_nodes="const", weight_edges="log", random_strength=0.1, method="betweenness", **kwargs, ): """A single, repeatable, igraph trial run. This is for igraph methods that naturally produce a dendrogram (== ssa_path). """ G = oe_to_igraph( inputs, output, size_dict=jitter_dict(size_dict, random_strength), weight_nodes=weight_nodes, weight_edges=weight_edges, ) if weight_edges != "const": kwargs.setdefault("weights", "weight") if method == "betweenness": kwargs.setdefault("clusters", 2) kwargs.setdefault("directed", False) dendrogram = G.community_edge_betweenness(**kwargs) elif method == "walktrap": kwargs.setdefault("steps", 100) dendrogram = G.community_walktrap(**kwargs) elif method == "fastgreedy": dendrogram = G.community_fastgreedy(**kwargs) else: raise ValueError("Invalid method: '{}'.".format(method)) ssa_path = dendrogram.merges return ContractionTree.from_path( inputs, output, size_dict, ssa_path=ssa_path, autocomplete=True ) # ----------------------------- HYPER REGISTERS ----------------------------- # register_hyper_function( name="walktrap", ssa_func=functools.partial(trial_igraph_dendrogram, method="walktrap"), space={ "random_strength": {"type": "FLOAT_EXP", "min": 0.01, "max": 10.0}, "steps": {"type": "INT", "min": 4, "max": 200}, }, ) register_hyper_function( name="betweenness", ssa_func=functools.partial(trial_igraph_dendrogram, method="betweenness"), space={ "random_strength": {"type": "FLOAT_EXP", "min": 0.01, "max": 10.0}, }, ) def trial_spinglass( inputs, output, size_dict, icool_fact=0.01, igamma=0.01, **kwargs ): return trial_igraph_partition( inputs, output, size_dict, method="spinglass", gamma=(1 - igamma), cool_fact=(1 - icool_fact), **kwargs, ) register_hyper_function( name="spinglass", ssa_func=trial_spinglass, space={ "random_strength": {"type": "FLOAT_EXP", "min": 0.001, "max": 1.0}, "weight_edges": {"type": "STRING", "options": ["const", "log"]}, "start_temp": {"type": "FLOAT_EXP", "min": 0.5, "max": 5.0}, "stop_temp": {"type": "FLOAT_EXP", "min": 0.001, "max": 0.2}, "icool_fact": {"type": "FLOAT_EXP", "min": 0.001, "max": 0.05}, "update_rule": {"type": "STRING", "options": ["config", "simple"]}, "igamma": {"type": "FLOAT_EXP", "min": 0.001, "max": 0.1}, "cutoff": {"type": "INT", "min": 10, "max": 40}, "parts": {"type": "INT", "min": 2, "max": 16}, "parts_decay": {"type": "FLOAT", "min": 0.0, "max": 1.0}, }, ) register_hyper_function( name="labelprop", ssa_func=functools.partial( trial_igraph_partition, method="label_propagation" ), space={ "random_strength": {"type": "FLOAT_EXP", "min": 0.01, "max": 10.0}, "weight_edges": {"type": "STRING", "options": ["const", "log"]}, "cutoff": {"type": "INT", "min": 10, "max": 40}, "parts": {"type": "INT", "min": 2, "max": 16}, "parts_decay": {"type": "FLOAT", "min": 0.0, "max": 1.0}, }, ) ================================================ FILE: cotengra/pathfinders/path_kahypar.py ================================================ """Contraction tree finders using kahypar hypergraph partitioning.""" import functools import itertools from os.path import abspath, dirname, join from ..core import PartitionTreeBuilder, get_hypergraph from ..hyperoptimizers.hyper import register_hyper_function from ..utils import get_rng @functools.lru_cache(1) def get_kahypar_profile_dir(): # needed to supply kahypar profile files # if kahypar is built from source, the version number may not match the # .. format; rather than assuming the format, add # a fallback option for unrecognized versions import re import kahypar m = re.compile(r"(\d+)\.(\d+)\.(\d+)").match(kahypar.__version__) path_components = [abspath(dirname(__file__)), "kahypar_profiles"] if m is not None: version = tuple(map(int, m.groups())) if version <= (1, 1, 6): path_components.append("old") return join(*path_components) def to_sparse(hg, weight_nodes="const", weight_edges="log"): winfo = hg.compute_weights( weight_nodes=weight_nodes, weight_edges=weight_edges ) hyperedge_indices = [] hyperedges = [] for e in winfo["edge_list"]: hyperedge_indices.append(len(hyperedges)) hyperedges.extend(hg.edges[e]) hyperedge_indices.append(len(hyperedges)) winfo["hyperedge_indices"] = hyperedge_indices winfo["hyperedges"] = hyperedges return winfo def kahypar_subgraph_find_membership( inputs, output, size_dict, weight_nodes="const", weight_edges="log", fix_output_nodes=False, parts=2, imbalance=0.01, compress=0, seed=None, profile=None, mode="direct", objective="cut", quiet=True, ): import kahypar as kahypar rng = get_rng(seed) seed = rng.randint(0, 2**31 - 1) nv = len(inputs) if parts >= nv: return list(range(nv)) hg = get_hypergraph(inputs, output, size_dict, accel=False) if fix_output_nodes: # make sure all the output nodes (those with output indices) are in # the same partition. Need to do this before removing danglers onodes = tuple(hg.output_nodes()) if parts >= nv - len(onodes) + 1: # too many partitions, simply group all outputs and return groups = itertools.count(1) return [0 if i in onodes else next(groups) for i in range(nv)] for e, nodes in tuple(hg.edges.items()): if len(nodes) == 1: hg.remove_edge(e) if hg.num_edges == 0: # completely disconnected graph -> kahypar will crash # round robin partition instead return [ i for k in range(parts) for i in (k,) * ((nv // parts) + (k < (nv % parts))) ] if compress: hg.compress(compress) winfo = to_sparse(hg, weight_nodes=weight_nodes, weight_edges=weight_edges) hypergraph_kwargs = { "num_nodes": hg.get_num_nodes(), "num_edges": hg.get_num_edges(), "index_vector": winfo["hyperedge_indices"], "edge_vector": winfo["hyperedges"], "k": parts, } edge_weights, node_weights = { (False, False): (None, None), (False, True): ([], winfo["node_weights"]), (True, False): (winfo["edge_weights"], []), (True, True): (winfo["edge_weights"], winfo["node_weights"]), }[winfo["has_edge_weights"], winfo["has_node_weights"]] if edge_weights or node_weights: hypergraph_kwargs["edge_weights"] = edge_weights hypergraph_kwargs["node_weights"] = node_weights hypergraph = kahypar.Hypergraph(**hypergraph_kwargs) if fix_output_nodes: for i in onodes: hypergraph.fixNodeToBlock(i, 0) # silences various warnings mode = "recursive" if profile is None: profile_mode = {"direct": "k", "recursive": "r"}[mode] profile = f"{objective}_{profile_mode}KaHyPar_sea20.ini" context = kahypar.Context() context.loadINIconfiguration(join(get_kahypar_profile_dir(), profile)) context.setK(parts) context.setSeed(seed) context.suppressOutput(quiet) context.setEpsilon(imbalance * parts) kahypar.partition(hypergraph, context) return [hypergraph.blockID(i) for i in hypergraph.nodes()] kahypar_to_tree = PartitionTreeBuilder(kahypar_subgraph_find_membership) register_hyper_function( name="kahypar", ssa_func=kahypar_to_tree.trial_fn, space={ "random_strength": {"type": "FLOAT_EXP", "min": 0.01, "max": 10.0}, "weight_edges": {"type": "STRING", "options": ["const", "log"]}, "cutoff": {"type": "INT", "min": 10, "max": 40}, "imbalance": {"type": "FLOAT", "min": 0.01, "max": 1.0}, "imbalance_decay": {"type": "FLOAT", "min": -5, "max": 5}, "parts": {"type": "INT", "min": 2, "max": 16}, "parts_decay": {"type": "FLOAT", "min": 0.0, "max": 1.0}, "mode": {"type": "STRING", "options": ["direct", "recursive"]}, "objective": {"type": "STRING", "options": ["cut", "km1"]}, "fix_output_nodes": {"type": "STRING", "options": ["auto", ""]}, }, ) register_hyper_function( name="kahypar-balanced", ssa_func=kahypar_to_tree.trial_fn, space={ "weight_edges": {"type": "STRING", "options": ["const", "log"]}, "cutoff": {"type": "INT", "min": 2, "max": 4}, "imbalance": {"type": "FLOAT", "min": 0.001, "max": 0.01}, "mode": {"type": "STRING", "options": ["direct", "recursive"]}, "objective": {"type": "STRING", "options": ["cut", "km1"]}, "fix_output_nodes": {"type": "STRING", "options": ["auto", ""]}, }, constants={ "random_strength": 0.0, "imbalance_decay": 0.0, "parts": 2, }, ) register_hyper_function( name="kahypar-agglom", ssa_func=kahypar_to_tree.trial_fn_agglom, space={ "weight_edges": {"type": "STRING", "options": ["const", "log"]}, "imbalance": {"type": "FLOAT", "min": 0.001, "max": 0.05}, "mode": {"type": "STRING", "options": ["direct", "recursive"]}, "objective": {"type": "STRING", "options": ["cut", "km1"]}, "groupsize": {"type": "INT", "min": 2, "max": 64}, "fix_output_nodes": {"type": "STRING", "options": ["auto", ""]}, "compress": {"type": "STRING", "options": [0, 3, 10, 30, 100]}, "sub_optimize": { "type": "STRING", "options": ["greedy", "greedy-compressed"], }, }, constants={ "random_strength": 0.0, }, ) ================================================ FILE: cotengra/pathfinders/path_labels.py ================================================ """Contraction tree finders using pure python 'labels' hypergraph partitioning.""" import collections import math from ..core import PartitionTreeBuilder from ..hypergraph import HyperGraph from ..hyperoptimizers.hyper import register_hyper_function from ..utils import get_rng def pop_fact(p, parts, n, pop_small_bias, pop_big_bias): m = n / parts if p <= m: return pop_small_bias * n * math.sin(math.pi * p / m) else: return -pop_big_bias * n * math.sin(math.pi / 2 * (p - m) / (n - m)) def labels_partition( inputs, output, size_dict, weight_nodes="linear", weight_edges="log", parts=2, maxiter=None, memory=0, pop_small_bias=1, pop_big_bias=1, pop_decay=1, con_pow=1, final_sweep=True, seed=None, ): """ Parameters ---------- inputs output size_dict weight_nodes weight_edges parts maxiter memory pop_small_bias pop_big_bias pop_decay con_pow final_sweep """ hg = HyperGraph(inputs, output, size_dict) n = hg.get_num_nodes() winfo = hg.compute_weights( weight_nodes=weight_nodes, weight_edges=weight_edges ) sites = list(hg.nodes) neighbs = collections.defaultdict(set) max_edge_weight = max(winfo["edge_weights"]) weights = {} # populate neighbor list and weights by edge weight for i in sites: for e in hg.get_node(i): for j in hg.get_edge(e): if j != i: neighbs[i].add(j) weights[i, j] = ( winfo["edge_weight_map"][e] / max_edge_weight ) # weight by mutual connectivity for i, j in weights: weights[i, j] *= (1 + len(neighbs[i] & neighbs[j])) ** con_pow labels = sites.copy() pops = collections.Counter(labels) rng = get_rng(seed) if maxiter is None: maxiter = n for r in range(maxiter): rng.shuffle(sites) all_static = True for i in sites: old_label = labels[i] scores = collections.Counter() # possibly bias towards or against current value scores[old_label] = memory # add the main scores based on neighboring labels for j in neighbs[i]: lbl = labels[j] scores[lbl] += weights[i, j] # augment the scores based on global label populations for lbl in scores: p = pops[lbl] scores[lbl] += ( pop_fact(p, parts, n, pop_small_bias, pop_big_bias) ) / (r + 1) ** pop_decay new_label = scores.most_common(1)[0][0] labels[i] = new_label pops[old_label] -= 1 pops[new_label] += 1 all_static &= new_label == old_label if all_static: break if final_sweep: rng.shuffle(sites) for i in sites: old_label = labels[i] scores = collections.Counter() scores[old_label] = 0 for j in neighbs[i]: lbl = labels[j] scores[lbl] += weights[i, j] new_label = scores.most_common(1)[0][0] labels[i] = new_label return labels labels_to_tree = PartitionTreeBuilder(labels_partition) register_hyper_function( name="labels", ssa_func=labels_to_tree.trial_fn, space={ "random_strength": {"type": "FLOAT_EXP", "min": 0.01, "max": 1.0}, "weight_edges": {"type": "STRING", "options": ["const", "log"]}, "cutoff": {"type": "INT", "min": 10, "max": 40}, "parts": {"type": "INT", "min": 1, "max": 16}, "memory": {"type": "INT", "min": -2, "max": 1}, "pop_small_bias": {"type": "FLOAT", "min": 0.0, "max": 2.0}, "pop_big_bias": {"type": "FLOAT", "min": 0.0, "max": 2.0}, "pop_decay": {"type": "FLOAT", "min": 0.0, "max": 10.0}, "con_pow": {"type": "FLOAT", "min": 0.0, "max": 10.0}, "final_sweep": {"type": "BOOL"}, }, ) register_hyper_function( name="labels-agglom", ssa_func=labels_to_tree.trial_fn_agglom, space={ "weight_edges": {"type": "STRING", "options": ["const", "log"]}, "memory": {"type": "INT", "min": -2, "max": 1}, "pop_small_bias": {"type": "FLOAT", "min": 0.0, "max": 2.0}, "pop_big_bias": {"type": "FLOAT", "min": 0.0, "max": 2.0}, "pop_decay": {"type": "FLOAT", "min": 0.0, "max": 10.0}, "con_pow": {"type": "FLOAT", "min": 0.0, "max": 10.0}, "final_sweep": {"type": "BOOL"}, }, constants={ "random_strength": 0.0, }, ) ================================================ FILE: cotengra/pathfinders/path_quickbb.py ================================================ """Quickbb based pathfinder.""" import re import signal import subprocess import tempfile import time import warnings from ..core import ContractionTree from ..hypergraph import LineGraph from ..hyperoptimizers.hyper import register_hyper_function from ..oe import PathOptimizer class QuickBBOptimizer(PathOptimizer): def __init__(self, max_time=10, executable="quickbb_64", seed=None): self.max_time = max_time self.executable = executable def run_quickbb(self, fname, outfile, statfile, max_time=None): if max_time is None: max_time = self.max_time args = [ self.executable, "--min-fill-ordering", "--time", str(max_time), "--outfile", outfile, "--statfile", statfile, "--cnffile", fname, ] process = subprocess.Popen( args, stdout=subprocess.PIPE, stderr=subprocess.PIPE ) t0 = time.time() while process.poll() is None: time.sleep(0.1) if time.time() > t0 + max_time + 0.1: process.send_signal(signal.SIGTERM) break self.out, self.err = (x.decode("utf-8") for x in process.communicate()) tw_search = re.search(r"Treewidth= (\d+)", self.out) if tw_search is None: self.treewidth = "n/a" else: self.treewidth = int(tw_search.group(1)) # get the last line that started with a digit (i.e. the LG edge order) self.qbb_path = next( i for i in reversed(self.out.split("\n")) if re.match(r"^\d", i) ) self.ordering = self.qbb_path.strip().split(" ") # # DEBUGGING: use consequences code to go via tree-decomposition # td_str = generate_td(self.out, fname) # td = td_str_to_tree_decomposition(td_str) # eo = td_to_eo(td) # self.ordering = eo.ordering # edges = list(self.LG.nodes) # self.edge_path = [edges[e - 1] for e in eo.ordering] # # # explicit check # # print(eo.ordering == # # list(map(int, self.qbb_path.strip().split(' ')))) self.edge_path = [self.lg.nodes[int(i) - 1] for i in self.ordering] return self.edge_path def build_tree(self, inputs, output, size_dict): self.lg = LineGraph(inputs, output) with ( tempfile.NamedTemporaryFile(suffix=".cnf") as file, tempfile.NamedTemporaryFile(suffix=".out") as sfile, tempfile.NamedTemporaryFile(suffix=".out") as ofile, ): self.lg.to_cnf_file(file.name) max_time = self.max_time while True: try: self.run_quickbb( file.name, ofile.name, sfile.name, max_time=max_time ) break except StopIteration: max_time *= 1.5 warnings.warn( "QuickBB produced no input, automatically " "repeating with max_time 1.5x increased to " f" {max_time}." ) with open(sfile.name, "r") as f: self.statfile = f.read() with open(ofile.name, "r") as f: self.outfile = f.read() self.tree = ContractionTree.from_path( inputs, output, size_dict, edge_path=self.edge_path ) return self.tree def __call__(self, inputs, output, size_dict, memory_limit=None): return self.build_tree(inputs, output, size_dict).get_path() def optimize_quickbb( inputs, output, size_dict, memory_limit=None, max_time=60, seed=None ): opt = QuickBBOptimizer(max_time=max_time, seed=seed) return opt(inputs, output, size_dict) def trial_quickbb(inputs, output, size_dict, max_time=10, seed=None): opt = QuickBBOptimizer(max_time=max_time, seed=seed) return opt.build_tree(inputs, output, size_dict) register_hyper_function( name="quickbb", ssa_func=trial_quickbb, space={"max_time": {"type": "FLOAT_EXP", "min": 2.0, "max": 60.0}}, ) ================================================ FILE: cotengra/pathfinders/path_random.py ================================================ """Purely random pathfinder, for initialization and testing purposes.""" from ..core import ContractionTree from ..hyperoptimizers.hyper import register_hyper_function from ..interface import register_preset from ..oe import PathOptimizer from ..utils import get_rng class RandomOptimizer(PathOptimizer): """A fully random pathfinder, that randomly selects pairs of tensors to contract (even if they are not connected). This is useful for testing purposes, and as a baseline for comparison with other pathfinders. Parameters ---------- seed : None, int or np.random.Generator, optional Random seed. If None, a random seed is selected. Default is None. """ def __init__(self, seed=None): self.rng = get_rng(seed) def __call__(self, inputs, outputs, size_dict): N = len(inputs) path = [] for Nrem in range(N - 1, 0, -1): i = j = self.rng.randint(0, Nrem) while j == i: j = self.rng.randint(0, Nrem) if i > i: i, j = j, i path.append((i, j)) return path def search(self, inputs, outputs, size_dict): return ContractionTree.from_path( inputs, outputs, size_dict, path=self(inputs, outputs, size_dict), ) register_preset("random", RandomOptimizer()) register_hyper_function("random", RandomOptimizer().search, {}) ================================================ FILE: cotengra/pathfinders/path_simulated_annealing.py ================================================ import collections.abc import functools import itertools import math import time from numbers import Integral from ..parallel import ( can_scatter, maybe_leave_pool, maybe_rejoin_pool, parse_parallel_arg, scatter, submit, ) from ..utils import get_rng def compute_contracted_info(legsa, legsb, appearances, size_dict): """Compute the contracted legs, cost and size of a pair of legs. Parameters ---------- legsa : dict[str, int] The legs of the first tensor. legsb : dict[str, int] The legs of the second tensor. appearances : dict[str, int] The total number of appearances of each index in the contraction. size_dict : dict[str, int] The size of each index. Returns ------- legsab : dict[str, int] The contracted legs. cost : int The cost of the contraction. size : int The size of the resulting tensor. """ legsab = {} cost = 1 size = 1 # handle all left indices for ix, ix_count in legsa.items(): d = size_dict[ix] # all involved indices contribute to cost cost *= d if ix in legsb: ix_count += legsb[ix] if ix_count < appearances[ix]: # index appears on output legsab[ix] = ix_count # and so contributes to size size *= d # now handle right indices that we haven't seen yet for ix, ix_count in legsb.items(): if ix not in legsa: d = size_dict[ix] cost *= d if ix_count < appearances[ix]: legsab[ix] = ix_count size *= d return legsab, cost, size def linspace_generator(start, stop, num, log=False): """Generate a sequence of ``num`` evenly spaced floats between ``start`` and ``stop``. Parameters ---------- start : float The starting value. stop : float The stopping value. num : int The number of values to generate. log : bool, optional Whether to generate the sequence in log space. Yields ------ float """ if not log: if num == 1: yield (start + stop) / 2 else: step = (stop - start) / (num - 1) for i in range(num): yield start + i * step else: log_start = math.log2(start) log_stop = math.log2(stop) if num == 1: yield 2 ** ((log_start + log_stop) / 2) else: step = (log_stop - log_start) / (num - 1) for i in range(num): yield 2 ** (log_start + i * step) def _describe_tree(tree, info="concise"): return tree.describe(info=info) def _score_tree(scorer, tree, target_size=None, coeff_size_penalty=1.0): trial = {"tree": tree} x = scorer(trial) if target_size is not None: # penalize oversize x += coeff_size_penalty * math.log2( max(trial["size"] / target_size, 1) ) return x def _slice_tree_basic(tree, current_target_size, rng, unslice=1): # always unslice one or more random indices for _ in range(unslice): if not tree.sliced_inds: break tree.unslice_rand_(seed=rng) tree.slice_(target_size=current_target_size, seed=rng) def _slice_tree_reslice(tree, current_target_size, rng): tree.slice_(target_size=current_target_size, reslice=True, seed=rng) def _slice_tree_drift(tree, current_target_size, rng): current_size = tree.contraction_width(log=None) if current_size > current_target_size: prob_slice = 3 / 4 else: # below or reached target - can unslice prob_slice = 0.0 if rng.random() < prob_slice: tree.slice_(target_slices=2, seed=rng) elif tree.sliced_inds: tree.unslice_rand_(seed=rng) def simulated_anneal_tree( tree, tfinal=0.05, tstart=2, tsteps=50, numiter=50, minimize=None, target_size=None, target_size_initial=None, slice_mode="basic", seed=None, progbar=False, inplace=False, ): """Perform a simulated annealing optimization of this contraction tree, based on "Multi-Tensor Contraction for XEB Verification of Quantum Circuits" by Gleb Kalachev, Pavel Panteleev, Man-Hong Yung (arXiv:2108.05665), and the "treesa" implementation in OMEinsumContractionOrders.jl by Jin-Guo Liu and Pan Zhang. Parameters ---------- tree : ContractionTree The tree to optimize. tfinal : float, optional The final temperature. tstart : float, optional The starting temperature. tsteps : int, optional The number of temperature steps. numiter : int, optional The number of sweeps at each temperature step. minimize : {'flops', 'combo', 'write', 'size', ...}, optional The objective function to minimize. target_size : int, optional The target size to slice the contraction to. A schedule is used to reach this only at the final temperature step. target_size_initial : int, optional The initial target size to use in the slicing schedule. If None, then the current size is used. slice_mode : {'basic', 'reslice', 'drift', int}, optional The mode for slicing the contraction tree within each annealing iteration. 'basic' always unslices a random index and then slices to the target size. 'reslice' unslices all indices and then slices to the target size. 'drift' unslices a random index with probability 1/4 and slices to the target size with probability 3/4. It is therefore not guaranteed to reach the target size, but may be more explorative for long annealing schedules. seed : int, optional A random seed. progbar : bool, optional Whether to show live progress. inplace : bool, optional Whether to perform the optimization inplace. Returns ------- ContractionTree """ from ..scoring import get_score_fn tree = tree if inplace else tree.copy() # ensure stats tracking is on tree.contract_stats() if minimize is None: minimize = tree.get_default_objective() scorer = get_score_fn(minimize) rng = get_rng(seed) # create a schedule for annealing temperatures temps = linspace_generator(tstart, tfinal, tsteps, log=True) if target_size is not None: # create a schedule for slicing target sizes if target_size_initial is None: # start with the current size current_size = max(tree.contraction_width(log=None), target_size) else: current_size = max(target_size_initial, target_size) target_sizes = linspace_generator( current_size, target_size, tsteps, log=True, ) if isinstance(slice_mode, Integral): # unslice this many random indices at each step _slice_tree = functools.partial( _slice_tree_basic, unslice=slice_mode ) else: _slice_tree = { "basic": _slice_tree_basic, "reslice": _slice_tree_reslice, "drift": _slice_tree_drift, }[slice_mode] else: target_sizes = itertools.repeat(None) def _slice_tree(tree, current_target_size, rng): pass if progbar: import tqdm pbar = tqdm.tqdm(total=tsteps) pbar.set_description(_describe_tree(tree)) for temp in temps: # handle slicing _slice_tree(tree, next(target_sizes), rng) for _ in range(numiter): candidates = [tree.root] while candidates: p = candidates.pop(0) l, r = tree.children[p] # check which local moves are possible if tree.is_leaf(l) == 1: if tree.is_leaf(r) == 1: # both are leaves continue else: # left is leaf rule = rng.randint(2, 3) elif tree.is_leaf(r) == 1: # right is leaf rule = rng.randint(0, 1) else: # neither are leaves rule = rng.randint(0, 3) if rule < 2: # ((AB)C) x, c = l, r a, b = tree.children[x] if rule == 0: # -> ((AC)B) new_order = [a, c, b] else: # -> (A(BC)) new_order = [b, c, a] else: # (A(BC)) a, x = l, r b, c = tree.children[x] if rule == 2: # -> (B(AC)) new_order = [a, c, b] else: # -> (C(AB)) new_order = [a, b, c] current_score = scorer.score_local( flops=[tree.get_flops(p), tree.get_flops(x)], size=[tree.get_size(p), tree.get_size(x)], ) # legs0 = tree.get_legs(new_order[0]) # legs1 = tree.get_legs(new_order[1]) # if any(ix0 in legs1 for ix0 in legs0): # compute new intermediate new_legs0, new_cost0, new_size0 = compute_contracted_info( tree.get_legs(new_order[0]), tree.get_legs(new_order[1]), tree.appearances, tree.size_dict, ) # compute new parent costs new_legs1, new_cost1, new_size1 = compute_contracted_info( new_legs0, tree.get_legs(new_order[2]), tree.appearances, tree.size_dict, ) proposed_score = scorer.score_local( flops=[new_cost0, new_cost1], size=[new_size0, new_size1], ) dE = proposed_score - current_score accept = (dE <= 0) or (math.log(rng.random()) < -dE / temp) if accept: tree._remove_node(p) tree._remove_node(x) tree.contract_nodes_pair( tree.contract_nodes_pair( new_order[0], new_order[1], legs=new_legs0, cost=new_cost0, size=new_size0, # NOTE: for ssa nodes only we could reuse `x` label ), new_order[2], legs=new_legs1, cost=new_cost1, size=new_size1, parent=p, # reuse top node label ) if progbar: pbar.set_description( f"T: {temp:.2e} " + _describe_tree(tree), refresh=False, ) # check which children to recurse into l, r = tree.children[p] if tree.get_extent(l) > 2: candidates.append(l) if tree.get_extent(r) > 2: candidates.append(r) if progbar: pbar.update() return tree def _do_anneal(tree, *args, **kwargs): return tree.simulated_anneal(*args, **kwargs) def parallel_temper_tree( tree_or_trees, tfinal=0.01, tstart=1, tsteps=50, num_trees=8, numiter=50, minimize=None, target_size=None, target_size_initial=None, slice_mode="drift", parallel_slice_mode="temperature", swappiness=1.0, coeff_size_penalty=1.0, max_time=None, seed=None, parallel="auto", info=None, progbar=False, inplace=False, ): """Perform parallel tempering optimization of a contraction tree. This anneals ``num_trees`` different trees at a range of temperatures between ``tfinal`` and ``tstart``. After each step, trees are exchanged between neighboring temperatures according to the Metropolis-Hastings criterion. Parameters ---------- tree_or_trees : ContractionTree or sequence of ContractionTree The tree or trees to optimize. If less than ``num_trees`` are given, then they will be cycled. If more than ``num_trees`` are given, then the length will override ``num_trees``. tfinal : float, optional The final temperature. tstart : float, optional The starting temperature. tsteps : int, optional The number of temperature steps, each with ``numiter`` iterations. After each step, trees are exchanged between neighboring temperatures. num_trees : int, optional The number of trees and thus temperatures to optimize in parallel. numiter : int, optional The number of iterations to perform at each step. The total number of sweeps (per parallel temperature) is ``numiter * tsteps``. minimize : {'flops', 'combo', 'write', 'size', ...}, optional The objective function to minimize. target_size : int, optional The target size of the contraction. slice_mode : {'basic', 'reslice', 'drift'}, optional The mode for slicing the contraction tree within each annealing iteration. parallel_slice_mode : {'temperature', 'time', 'constant'}, optional The parallel mode for slicing the contraction tree. If 'temperature', then the target size decreases with temperature. If 'time', then the target size decreases with time. If 'constant', then the target size is constant. seed : int, optional A random seed. parallel : 'auto', False, True, int, or distributed.Client Whether to parallelize the search. progbar : bool, optional Whether to show live progress. inplace : bool, optional Whether to perform the optimization inplace. """ from ..scoring import get_score_fn # allow a single or sequence of trees sequence_supplied = isinstance(tree_or_trees, collections.abc.Iterable) if sequence_supplied: tree_or_trees = tuple(tree_or_trees) num_trees = max(num_trees, len(tree_or_trees)) initial_trees = itertools.cycle(tree_or_trees) else: initial_trees = itertools.repeat(tree_or_trees) tree_or_trees = (tree_or_trees,) if minimize is None: scorer = tree_or_trees[0].get_default_objective() else: scorer = get_score_fn(minimize) rng = get_rng(seed) if progbar: import tqdm pbar = tqdm.tqdm(total=tsteps) pbar.set_description(_describe_tree(tree_or_trees[0])) temps = tuple(linspace_generator(tfinal, tstart, num_trees, log=True)) if target_size is None: # target_sizes = itertools.repeat(None) target_sizes = (None,) * num_trees else: if target_size_initial is None: target_size_initial = max( t.contraction_width(log=None) for t in tree_or_trees ) if parallel_slice_mode == "temperature": # target size decreases with temperature target_sizes = tuple( linspace_generator( target_size, target_size_initial, num_trees, log=True, ) ) elif parallel_slice_mode == "time": # target size decreases with time target_sizes = linspace_generator( target_size_initial, target_size, tsteps, log=True, ) elif parallel_slice_mode == "constant": target_sizes = (target_size,) * num_trees else: raise ValueError( f"Unrecognized parallel_slice_mode: {parallel_slice_mode}" ) # setup the parallel machinery pool = parse_parallel_arg(parallel) is_scatter_pool = can_scatter(pool) if is_scatter_pool: is_worker = maybe_leave_pool(pool) # store the trees as futures for the entire process trees = [scatter(pool, next(initial_trees)) for _ in range(num_trees)] else: trees = [next(initial_trees) for _ in range(num_trees)] best_score = float("inf") best_tree = None if max_time is not None: # convert to absolute time max_time = time.time() + max_time for _ in range(tsteps): # perform annealing moves if parallel_slice_mode == "time": # get the next target size and repeat for all temperatues target_sizes_t = [next(target_sizes)] * num_trees else: # constant in time target_sizes_t = target_sizes args = zip(trees, temps, target_sizes_t) sa_opts = dict( tsteps=1, numiter=numiter, minimize=minimize, slice_mode=slice_mode, seed=rng.randrange(0, 2**32), ) if pool is None: trees = [ _do_anneal( t, tfinal=temp, tstart=temp, target_size=tsz, **sa_opts ) for t, temp, tsz in args ] scores = [ _score_tree( scorer, t, target_size, coeff_size_penalty=coeff_size_penalty, ) for t in trees ] else: # submit in smaller steps for scatter pools? trees = [ submit( pool, _do_anneal, t, tfinal=temp, tstart=temp, target_size=tsz, **sa_opts, ) for t, temp, tsz in args ] if not is_scatter_pool: # gather trees and compute scores locally trees = [f.result() for f in trees] scores = [ _score_tree( scorer, t, target_size, coeff_size_penalty=coeff_size_penalty, ) for t in trees ] else: # compute scores remotely also scores = [ submit(pool, _score_tree, scorer, t, target_size) for t in trees ] scores = [f.result() for f in scores] # perform exchange moves nswap = 0 for i in range(num_trees - 1): dbeta = (1 / swappiness) * (1 / temps[i] - 1 / temps[i + 1]) dE = scores[i + 1] - scores[i] accept = (dE < 0) or (math.log(rng.random()) < -dbeta * dE) if accept: # swap trees nswap += 1 trees[i], trees[i + 1] = trees[i + 1], trees[i] scores[i], scores[i + 1] = scores[i + 1], scores[i] # record the best tree (might not be the lowest temperature) idxmin = min(range(num_trees), key=scores.__getitem__) if scores[idxmin] < best_score: # new best tree best_score = scores[idxmin] best_tree = trees[idxmin] if progbar: # update the progress bar if is_scatter_pool: desc = submit(pool, _describe_tree, best_tree).result() else: desc = _describe_tree(best_tree) pbar.set_description(f"nswap: {nswap} " + desc, refresh=False) if progbar: pbar.update() if info is not None: info.setdefault("scores", []).append(scores) if (max_time is not None) and (time.time() > max_time): break if is_scatter_pool: best_tree = best_tree.result() maybe_rejoin_pool(is_worker, pool) if not inplace: return best_tree if inplace: if sequence_supplied: for tree0, tree1 in zip(tree_or_trees, trees): if is_scatter_pool: tree1 = tree1.result() tree0.set_state_from(tree1) return best_tree else: tree_or_trees[0].set_state_from(best_tree) return tree_or_trees[0] ================================================ FILE: cotengra/pathfinders/treedecomp.py ================================================ """ The following functions are adapted from the repository: https://github.com/TheoryInPractice/ConSequences associated with the paper: https://arxiv.org/abs/1807.04599 under the following license: BSD 3-Clause License Copyright (c) 2018, Allison L. Fisher, Timothy D. Goodrich, Blair D. Sullivan, Andrew L. Wright All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. """ import copy class TreeDecomposition: """ A named struct for convenience. """ def __init__(self): """ A tree decomposition consisting of a tree of nodes and a lookup table mapping decomposition nodes to vertices in the original graph. """ import networkx as nx self.tree = nx.Graph() self.bags = {} class EliminationOrdering: """ A named struct for convenience. """ def __init__(self): """ A elimination ordering is an ordered list of vertices. """ self.ordering = [] def _increment_eo(td, eo): """ Given a TreeDecomposition and a (partial) PerfectEliminationOrdering, add one more vertex to the eo or recognize that we're already done. Input: td (TreeDecomposition): A tree decomposition. eo (PerfectEliminationOrdering): The perfect elimination ordering currently being constructed. Output: The final eo """ while True: # Base case: If one node left, add its vertices to the eo if td.tree.order() == 1: (only_vertex,) = td.tree.nodes() eo.ordering.extend(sorted(td.bags[only_vertex])) return eo # Otherwise we can identify a leaf and its parent leaf = next( node for node in td.tree.nodes() if td.tree.degree[node] == 1 ) parent = min(td.tree.neighbors(leaf)) # See if there are any vertices in leaf's bag that are not in # parent's bag vertex_diff = td.bags[leaf] - td.bags[parent] # If there's a vertex in the leaf and not in the parent, # then remove it from the graph and add it to the eo. if vertex_diff: next_vertex = min(vertex_diff) eo.ordering.append(next_vertex) for key in td.bags: td.bags[key].discard(next_vertex) # Else remove the leaf from the graph else: td.tree.remove_node(leaf) td.bags.pop(leaf) def td_to_eo(td): """ Generates a perfect elimination ordering from a tree decomposition. The algorithm is taken from Markov and Shi Proof of Prop 4.2 (https://arxiv.org/pdf/quant-ph/0511069.pdf). Input: td (TreeDecomposition): A tree decomposition for a graph. Output: eo (PerfectEliminationOrdering): A perfect elimination ordering corresponding to the tree decomposition (Note: There may be multiple valid eo for a given td). """ # Copy the tree decomposition, my_td will be modified my_td = copy.deepcopy(td) # Construct the eo eo = _increment_eo(my_td, EliminationOrdering()) return eo def td_str_to_tree_decomposition(td_str): """ Reads in a .td file contents in PACE format into a TreeDecomposition object Input: td_filename (str): .td file contents Output: td (TreeDecomposition): A populated TreeDecomposition object """ td = TreeDecomposition() lines = iter(td_str.split("\n")) # Ignore comments line = next(lines) while line[0] == "c": line = next(lines) # The next line will look like "s td 28 25 95" # Currently unused # num_nodes, max_bag, num_vertices = map(int, line.split()[2:]) line = next(lines) while line[0] == "b": # A bag line will look like: # "b 1 1 11 16 41 42 43 44 45" node = int(line.split()[1]) vertices = set(map(int, line.split()[2:])) td.bags[node] = vertices line = next(lines) # Add a node for each bag td.tree.add_nodes_from(td.bags) # Add the first edge td.tree.add_edge(*map(int, line.split())) # The remainder of the file is edges for line in lines: if line: td.tree.add_edge(*map(int, line.split())) return td ================================================ FILE: cotengra/plot.py ================================================ """Hypergraph, optimizer, and contraction tree visualization tools.""" import collections import functools import importlib import itertools import math def show_and_close(fn): @functools.wraps(fn) def wrapped(*args, show_and_close=True, **kwargs): import matplotlib.pyplot as plt fig, ax = fn(*args, **kwargs) if fig is not None: if show_and_close: plt.show() plt.close(fig) return fig, ax return wrapped NEUTRAL_STYLE = { "axes.edgecolor": (0.5, 0.5, 0.5), "axes.facecolor": (0, 0, 0, 0), "axes.grid": True, "axes.labelcolor": (0.5, 0.5, 0.5), "axes.spines.right": False, "axes.spines.top": False, "figure.facecolor": (0, 0, 0, 0), "grid.alpha": 0.1, "grid.color": (0.5, 0.5, 0.5), "legend.frameon": False, "text.color": (0.5, 0.5, 0.5), "xtick.color": (0.5, 0.5, 0.5), "xtick.minor.visible": True, "ytick.color": (0.5, 0.5, 0.5), "ytick.minor.visible": True, } def use_neutral_style(fn): @functools.wraps(fn) def new_fn(*args, use_neutral_style=True, **kwargs): import matplotlib as mpl if not use_neutral_style: return fn(*args, **kwargs) with mpl.rc_context(NEUTRAL_STYLE): return fn(*args, **kwargs) return new_fn def plot_trials_alt(self, y=None, width=800, height=300): """Plot the trials interactively using altair.""" import altair as alt import pandas as pd df = self.to_df() if y is None: y = self.minimize if y == "size": best_y = math.log2(self.best[y]) ylabel = "log2[SIZE]" if y == "flops": best_y = math.log10(self.best[y]) ylabel = "log10[FLOPS]" hline = ( alt.Chart(pd.DataFrame({"best": [best_y]})) .mark_rule(strokeDash=[2, 2], color="grey") .encode(y="best:Q") ) scatter = ( alt.Chart(df) .mark_point() .encode( x="run:Q", y=alt.Y("{}:Q".format(y), title=ylabel), size=alt.Size( "random_strength:Q", scale=alt.Scale(range=[50, 150], type="log"), legend=None, ), color="method:N", tooltip=list(df.columns), ) ) return ( (hline + scatter) .properties( width=width, height=height, ) .configure_axis(gridColor="rgb(248, 248, 248)") ).interactive() _scatter_labels = { "size": "log2[SIZE]", "flops": "log10[FLOPS]", "write": "log10[WRITE]", } @show_and_close @use_neutral_style def plot_scatter( self, x="size", y="flops", ylim=None, cumulative_time=False, plot_best=False, figsize=(5, 5), ): import matplotlib.pyplot as plt import cotengra as ctg from cotengra.schematic import hash_to_color factor = None if x not in ("trial", "score", "time"): xminimize = ctg.scoring.get_score_fn(x) x = getattr(xminimize, "name", x) factor = getattr(xminimize, "factor", 64) if y not in ("trial", "score"): yminimize = ctg.scoring.get_score_fn(y) y = getattr(yminimize, "name", y) factor = getattr(yminimize, "factor", 64) if factor is None: factor = 64 N = len(self.scores) data = collections.defaultdict(lambda: collections.defaultdict(list)) ttotal = 0 best = float("inf") bestx = [] besty = [] for i in range(N): method = self.method_choices[i] data_method = data[method] data_method["trial"].append(i) if cumulative_time: ttotal += self.times[i] data_method["time"].append(ttotal) else: data_method["time"].append(self.times[i]) scorei = self.scores[i] sizei = math.log2(self.costs_size[i]) f = self.costs_flops[i] w = self.costs_write[i] flopsi = math.log10(f) writei = math.log10(w) comboi = math.log10(f + factor * w) data_method["score"].append(scorei) data_method["size"].append(sizei) data_method["flops"].append(flopsi) data_method["write"].append(writei) data_method["combo"].append(comboi) if data_method[y][-1] < best: bestx.append(data_method[x][-1]) besty.append(best) best = data_method[y][-1] bestx.append(data_method[x][-1]) besty.append(best) bestx.append(data_method[x][-1]) besty.append(best) def parse_label(z): if z == "size": return "log2[SIZE]" if z in ("flops", "write"): return f"log10[{z.upper()}]" if z == "combo": return f"log10[FLOPS + {factor} * WRITE]" return z.upper() xlabel = parse_label(x) ylabel = parse_label(y) markers = itertools.cycle("oXsvPD^h*pH") fig, ax = plt.subplots(figsize=figsize) for method, datum in sorted(data.items()): ax.scatter( datum[x], datum[y], color=hash_to_color(method), marker=next(markers), label=method, edgecolor="white", ) if plot_best: ax.plot( bestx, besty, color=(0, 0.7, 0.3, 0.5), zorder=10, ) ax.text( bestx[-1], besty[-1], f"{besty[-1]:.2f}", ha="left", va="center", color=(0, 0.7, 0.3), fontsize=8, ) ax.grid(True, color=(0.5, 0.5, 0.5), which="major", alpha=0.1) ax.set_axisbelow(True) ax.legend( loc="lower center", bbox_to_anchor=(0.5, 1.0), ncol=(len(data) * 6) // len(data), framealpha=0, handlelength=0, ) ax.set_xlabel(xlabel) ax.set_ylabel(ylabel) if ylim is not None: ax.set_ylim(*ylim) return fig, ax def plot_trials( self, *, x="trial", y="score", figsize=(8, 3), cumulative_time=True, plot_best=True, **kwargs, ): return plot_scatter( self, x=x, y=y, figsize=figsize, cumulative_time=cumulative_time, plot_best=plot_best, **kwargs, ) def plot_scatter_alt( self, x="size", y="flops", color="run:Q", color_scheme="purplebluegreen", shape="method:N", width=400, height=400, ): """Plot the trials total flops vs max size.""" import altair as alt df = self.to_df() scatter = ( alt.Chart(df) .mark_point() .encode( x=alt.X(x, title=_scatter_labels[x], scale=alt.Scale(zero=False)), y=alt.Y(y, title=_scatter_labels[y], scale=alt.Scale(zero=False)), size=alt.Size( "random_strength:Q", scale=alt.Scale(range=[50, 150], type="log"), legend=None, ), shape=alt.Shape(shape), color=alt.Color(color, scale=alt.Scale(scheme=color_scheme)), tooltip=list(df.columns), ) ) return ( scatter.properties( width=width, height=height, ).configure_axis(gridColor="rgb(248, 248, 248)") ).interactive() def logxextrapolate(p1, p2, x): x1, y1 = p1 x2, y2 = p2 # Calculate the slope (m) and intercept (b) in log-x space m = (y2 - y1) / (math.log(x2) - math.log(x1)) b = y1 - m * math.log(x1) return m * math.log(x) + b def mapper(y, x, mn, mx): return (x, (y - mn) / (mx - mn)) def mapper_cat(c, x, lookup): return (x, lookup[c]) @show_and_close def plot_parameters_parallel( self, method, colormap="Spectral", smoothing=0.5, rasterized=None, **drawing_opts, ): """Plot the parameter choices for a given method in parallel coordinates. Parameters ---------- method : str The method to plot the parameter choices for. colormap : str, optional The colormap to use for coloring the curves. smoothing : float, optional The amount of smoothing to apply to the curves. rasterized : bool, optional Whether to rasterize the plot. drawing_opts : dict, optional Additional options to pass to the Drawing constructor. Returns ------- fig : matplotlib.figure.Figure The figure containing the plot. ax : matplotlib.axes.Axes The axes containing the plot. """ import matplotlib as mpl from cotengra.schematic import Drawing # collect only rows with the same method columns = {"score": []} for m, p, s in zip(self.method_choices, self.param_choices, self.scores): if m != method: continue if not math.isfinite(s): # ignore nan and inf continue for k, v in p.items(): try: columns[k].append(v) except KeyError: columns[k] = [v] columns["score"].append(s) ncol = len(columns) nrow = len(columns["score"]) # determine ranges for mapping parameters into [0, 1] ranges = {} mappers = {} order = sorted(columns, key=lambda k: (k == "score", k)) for x, k in enumerate(order): vs = columns[k] if isinstance(vs[0], str): # categorical values = sorted(set(vs)) ranges[k] = values lookup = { c: (0.5 if len(values) == 1 else x / (len(values) - 1)) for x, c in enumerate(values) } mappers[k] = functools.partial(mapper_cat, x=x, lookup=lookup) else: # numerical mn = min(vs) mx = max(vs) ranges[k] = (mn, mx) mappers[k] = functools.partial(mapper, x=x, mn=mn, mx=mx) drawing_opts.setdefault("figsize", (2 * ncol, 2 * ncol)) d = Drawing(**drawing_opts) # draw the curves through the mapped points # XXX: use np.nanquantile to map score colors, ignoring outliers cmap = mpl.colormaps.get_cmap(colormap) linewidth = logxextrapolate((1, 2), (1000, 0.5), nrow) alpha = logxextrapolate((1, 1.0), (1000, 0.25), nrow) if rasterized is None: rasterized = nrow > 64 for i in range(nrow): coos = [mappers[k](columns[k][i]) for k in order] # last column is the score mapped_score = coos[-1][1] c = cmap(1 - mapped_score) d.curve( coos, color=c, alpha=alpha, linewidth=linewidth, smoothing=smoothing, # make best and worst appear on top, slightly prefer best zorder=1 + abs(0.51 - mapped_score), rasterized=rasterized, ) # label the axes and data ranges for j, k in enumerate(ranges): d.line((j, 0), (j, 1), color=(0.5, 0.5, 0.5), linewidth=0.5) d.text((j, 1.2), k, color=(0.5, 0.5, 0.5)) rk = ranges[k] if isinstance(rk, list): # categorical for o in rk: d.text( mappers[k](o), o, color=(0.5, 0.5, 0.5), va="bottom", zorder=10, ) else: # numerical d.text((j, 1.1), f"{ranges[k][1]:.4g}", color=(0.5, 0.5, 0.5)) d.text((j, -0.1), f"{ranges[k][0]:.4g}", color=(0.5, 0.5, 0.5)) return d.fig, d.ax def tree_to_networkx(tree): import networkx as nx G = nx.Graph() for c, (p, l, r) in enumerate(tree.traverse()): G.add_edge( p, l, size=math.log10(tree.get_size(l) + 1) + 1, weight=tree.get_extent(l), contraction=c, ) G.add_edge( p, r, size=math.log10(tree.get_size(r) + 1) + 1, weight=tree.get_extent(r), contraction=c, ) G.nodes[p]["contraction"] = min(c, G.nodes[p].get("contraction", c)) G.nodes[l]["contraction"] = min(c, G.nodes[l].get("contraction", c)) G.nodes[r]["contraction"] = min(c, G.nodes[r].get("contraction", c)) for node in tree.info: G.nodes[node]["flops"] = math.log10(tree.get_flops(node) + 1) + 1 return G def hypergraph_compute_plot_info_G( H, G, highlight=(), node_color=(0.5, 0.5, 0.5, 1.0), edge_color=(0.0, 0.0, 0.0), edge_alpha=1 / 3, colormap="Spectral_r", centrality=False, sliced_inds=(), edge_style="-", hyperedge_style="--", sliced_style=":", ): """Imbue the networkx representation, ``G``, of hypergraph, ``H`` with relevant plot information as node and edge attributes. """ import matplotlib as mpl import matplotlib.cm if edge_color is False: edge_color = (0.5, 0.5, 0.5) if edge_color is True: from .schematic import hash_to_color def _edge_colorer(ix): if ix in highlight: return (1.0, 0.0, 1.0, edge_alpha**0.5) return hash_to_color(ix) else: rgb = (*mpl.colors.to_rgb(edge_color), edge_alpha) def _edge_colorer(ix): if ix in highlight: return (1.0, 0.0, 1.0, edge_alpha**0.5) return rgb for *_, edata in G.edges(data=True): ix = edata["ind"] width = math.log2(H.size_dict.get(ix, 2)) color = _edge_colorer(ix) if edata["hyperedge"] or edata["output"]: label = "" else: label = f"{ix}" if ix in sliced_inds: style = sliced_style elif edata["hyperedge"]: style = hyperedge_style else: style = edge_style edata["color"] = color edata["width"] = width edata["label"] = label edata["style"] = style if "multi" in edata: multidata = edata["multi"] for ix in multidata["inds"]: multidata.setdefault("widths", []).append( math.log2(H.size_dict.get(ix, 2)) ) multidata.setdefault("colors", []).append(_edge_colorer(ix)) # multiedges can only be inner non-hyper indices multidata.setdefault("labels", []).append(f"{ix}") multidata.setdefault("styles", []).append( sliced_style if ix in sliced_inds else edge_style ) if centrality: if centrality == "resistance": Cs = H.resistance_centrality() elif centrality == "simple": Cs = H.simple_centrality() else: Cs = centrality if isinstance(colormap, mpl.colors.Colormap): cmap = colormap else: cmap = getattr(matplotlib.cm, colormap) if node_color is False: node_color = (0.5, 0.5, 0.5) if node_color is True: from .schematic import auto_colors node_colors = dict( zip(sorted(H.nodes), auto_colors(H.get_num_nodes())) ) def _node_colorer(nd): return node_colors[nd] elif node_color == "centrality": def _node_colorer(nd): return cmap(Cs[nd]) else: def _node_colorer(nd): return node_color for nd, ndata in G.nodes(data=True): hyperedge = ndata["hyperedge"] output = ndata.get("output", False) if hyperedge or output: color = (0.0, 0.0, 0.0, 0.0) if hyperedge and output: label = "" else: label = f"{ndata['ind']}" else: color = _node_colorer(nd) label = f"{nd}" # H.inputs[nd] ndata["color"] = color ndata["label"] = label def rotate(xy, theta): """Return a rotated set of points.""" import numpy as np s = np.sin(theta) c = np.cos(theta) xyr = np.empty_like(xy) xyr[:, 0] = c * xy[:, 0] - s * xy[:, 1] xyr[:, 1] = s * xy[:, 0] + c * xy[:, 1] return xyr def span(xy): """Return the vertical span of the points.""" return xy[:, 1].max() - xy[:, 1].min() def massage_pos(pos, nangles=100, flatten=False): """Rotate a position dict's points to cover a small vertical span""" import numpy as np xy = np.empty((len(pos), 2)) for i, (x, y) in enumerate(pos.values()): xy[i, 0] = x xy[i, 1] = y thetas = np.linspace(0, 2 * np.pi, nangles, endpoint=False) rxys = (rotate(xy, theta) for theta in thetas) rxy0 = min(rxys, key=span) if flatten: rxy0[:, 1] /= 2 return dict(zip(pos, rxy0)) def layout_pygraphviz( G, prog="neato", dim=2, **kwargs, ): # TODO: fix nodes with pin attribute # TODO: initial positions # TODO: max iters # TODO: spring parameter import pygraphviz as pgv aG = pgv.AGraph() mapping = {} for nodea, nodeb in G.edges(): s_nodea = str(nodea) s_nodeb = str(nodeb) mapping[s_nodea] = nodea mapping[s_nodeb] = nodeb aG.add_edge(s_nodea, s_nodeb) kwargs = {} if dim == 2.5: kwargs["dim"] = 3 kwargs["dimen"] = 2 else: kwargs["dim"] = kwargs["dimen"] = dim args = " ".join(f"-G{k}={v}" for k, v in kwargs.items()) # run layout algorithm aG.layout(prog=prog, args=args) # extract layout pos = {} for snode, node in mapping.items(): spos = aG.get_node(snode).attr["pos"] pos[node] = tuple(map(float, spos.split(","))) # normalize to unit square xmin = ymin = zmin = float("inf") xmax = ymax = zmaz = float("-inf") for x, y, *maybe_z in pos.values(): xmin = min(xmin, x) xmax = max(xmax, x) ymin = min(ymin, y) ymax = max(ymax, y) for z in maybe_z: zmin = min(zmin, z) zmaz = max(zmaz, z) for node, (x, y, *maybe_z) in pos.items(): pos[node] = ( 2 * (x - xmin) / (xmax - xmin) - 1, 2 * (y - ymin) / (ymax - ymin) - 1, *(2 * (z - zmin) / (zmaz - zmin) - 1 for z in maybe_z), ) return pos HAS_FA2 = importlib.util.find_spec("fa2") is not None HAS_PYGRAPHVIZ = importlib.util.find_spec("pygraphviz") is not None def get_nice_pos( G, *, dim=2, layout="auto", initial_layout="auto", iterations="auto", k=None, use_forceatlas2=False, flatten=False, ): if (layout == "auto") and HAS_PYGRAPHVIZ: layout = "neato" if layout in ("dot", "neato", "fdp", "sfdp"): pos = layout_pygraphviz(G, prog=layout, dim=dim) if dim == 2: pos = massage_pos(pos, flatten=flatten) return pos import networkx as nx if layout != "auto": initial_layout = layout iterations = 0 if initial_layout == "auto": # automatically select if len(G) <= 100: # usually nicest initial_layout = "kamada_kawai" else: # faster, but not as nice initial_layout = "spectral" if iterations == "auto": # the smaller the graph, the more iterations we can afford iterations = max(200, 1000 - len(G)) if dim == 2.5: dim = 3 project_back_to_2d = True else: project_back_to_2d = False # use spectral or other layout as starting point ly_opts = {"dim": dim} if dim != 2 else {} pos0 = getattr(nx, initial_layout + "_layout")(G, **ly_opts) # and then relax remaining using spring layout if iterations: if use_forceatlas2 is True: # turn on for more than 1 node use_forceatlas2 = 1 elif use_forceatlas2 in (0, False): # never turn on use_forceatlas2 = float("inf") should_use_fa2 = HAS_FA2 and (len(G) > use_forceatlas2) and (dim == 2) if should_use_fa2: from fa2 import ForceAtlas2 # NB: some versions of fa2 don't support the `weight_attr` option pos = ForceAtlas2(verbose=False).forceatlas2_networkx_layout( G, pos=pos0, iterations=iterations ) else: pos = nx.spring_layout( G, pos=pos0, k=k, dim=dim, iterations=iterations, ) else: pos = pos0 if project_back_to_2d: # project back to 2d pos = {k: v[:2] for k, v in pos.items()} dim = 2 if dim == 2: # finally rotate them to cover a small vertical span pos = massage_pos(pos) return pos @show_and_close @use_neutral_style def plot_tree( tree, layout="ring", hypergraph_layout="auto", hypergraph_layout_opts=None, k=0.01, iterations=500, span=None, order=None, order_y_pow=1.0, edge_scale=1.0, node_scale=1.0, highlight=(), edge_color="size", edge_colormap="GnBu", edge_max_width=None, node_colormap="YlOrRd", node_color="flops", node_max_size=None, figsize=(5, 5), raw_edge_color=None, raw_edge_alpha=None, tree_root_height=True, tree_alpha=0.8, colorbars=True, plot_raw_graph=True, plot_leaf_labels=False, ax=None, ): """Plot a contraction tree using matplotlib.""" import matplotlib as mpl import networkx as nx from matplotlib import pyplot as plt hypergraph_layout_opts = ( {} if hypergraph_layout_opts is None else dict(hypergraph_layout_opts) ) hypergraph_layout_opts.setdefault("layout", hypergraph_layout) if raw_edge_color is None: raw_edge_color = (0.5, 0.5, 0.5) if raw_edge_alpha is None: raw_edge_alpha = 0.5 # draw the contraction tree G_tree = tree_to_networkx(tree) leaves = tree.get_leaves_ordered() # set the tree edge and node sizes edge_weights = [ edge_scale * 0.8 * G_tree.edges[e]["size"] for e in G_tree.edges ] node_weights = [ node_scale * 8.0 * G_tree.nodes[n]["flops"] for n in G_tree.nodes ] # tree edge colors if edge_color == "order": ew_range = 0, tree.N - 1 enorm = mpl.colors.Normalize(*ew_range, clip=True) if not isinstance(edge_colormap, mpl.colors.Colormap): edge_colormap = getattr(mpl.cm, edge_colormap) emapper = mpl.cm.ScalarMappable(norm=enorm, cmap=edge_colormap) edge_colors = [ emapper.to_rgba(d["contraction"]) for _, _, d in G_tree.edges(data=True) ] else: ew_range = min(edge_weights), max(edge_weights) enorm = mpl.colors.Normalize(*ew_range, clip=True) if not isinstance(edge_colormap, mpl.colors.Colormap): edge_colormap = getattr(mpl.cm, edge_colormap) emapper = mpl.cm.ScalarMappable(norm=enorm, cmap=edge_colormap) edge_colors = [emapper.to_rgba(x) for x in edge_weights] # tree node colors if node_color == "order": nw_range = 0, tree.N - 1 nnorm = mpl.colors.Normalize(*nw_range, clip=True) if not isinstance(node_colormap, mpl.colors.Colormap): node_colormap = getattr(mpl.cm, node_colormap) nmapper = mpl.cm.ScalarMappable(norm=enorm, cmap=node_colormap) node_colors = [ nmapper.to_rgba(d["contraction"]) for _, d in G_tree.nodes(data=True) ] else: nw_range = min(node_weights), max(node_weights) nnorm = mpl.colors.Normalize(*nw_range, clip=True) if not isinstance(node_colormap, mpl.colors.Colormap): node_colormap = getattr(mpl.cm, node_colormap) nmapper = mpl.cm.ScalarMappable(norm=nnorm, cmap=node_colormap) node_colors = [nmapper.to_rgba(x) for x in node_weights] # plot the raw connectivity of the underlying graph if plot_raw_graph: H_tn = tree.get_hypergraph() G_tn = H_tn.to_networkx(as_tree_leaves=tree.input_to_node) hypergraph_compute_plot_info_G( H_tn, G_tn, highlight=highlight, edge_color=raw_edge_color, edge_alpha=raw_edge_alpha, centrality=False, sliced_inds=tree.sliced_inds, ) any_hyper = G_tn.graph["any_hyper"] if layout == "tent": # place raw graph first hypergraph_layout_opts.setdefault("flatten", True) pos = get_nice_pos(G_tn, **hypergraph_layout_opts) xmin = min(v[0] for v in pos.values()) xmax = max(v[0] for v in pos.values()) if span is not None: # place the intermediates vertically above the leaf nodes that they # are mapped to in the span ymax = max(v[1] for v in pos.values()) if span is True: span = tree.get_spans()[0] for node in G_tree.nodes: if tree.is_leaf(node): continue raw_pos = pos[span[node]] pos[node] = ( raw_pos[0], ymax + tree.get_extent(node) * (xmax - xmin) / tree.N, ) elif order is not None: if order is True: order = None ymax = max(v[1] for v in pos.values()) for i, (p, _, _) in enumerate(tree.traverse(order)): x_av, y_av = 0.0, 0.0 for ti in p: coo_i = pos[tree.input_to_node(ti)] x_av += coo_i[0] / tree.get_extent(p) y_av += coo_i[1] / tree.get_extent(p) y_av = ( ymax + float(tree_root_height) * (xmax - xmin) * ((i + 1) / tree.N) ** order_y_pow ) pos[p] = (x_av, y_av) else: # place the top of the tree pos[tree.root] = (0, float(tree_root_height) * (xmax - xmin)) # layout the tree nodes between bottom and top # first need to filter out TN nodes not appearing in tree tree_pos = {k: v for k, v in pos.items() if k in G_tree.nodes} pos.update( nx.spring_layout( G_tree, fixed=tree_pos, pos=tree_pos, k=k, iterations=iterations, ) ) elif layout == "ring": # work out a layout based on leaves in circle pos = {tree.root: (0, 0)} for i, x in enumerate(leaves): pos[x] = ( math.sin(2 * math.pi * i / tree.N), math.cos(2 * math.pi * i / tree.N), ) # layout the remaining tree nodes pos = nx.spring_layout( G_tree, fixed=pos, pos=pos, k=k, iterations=iterations ) # if there are hyperedges layout the faux-nodes if plot_raw_graph and any_hyper: fixed_raw = {k: v for k, v in pos.items() if k in leaves} pos.update( nx.spring_layout( G_tn, fixed=fixed_raw, pos=fixed_raw, k=k, iterations=iterations, ) ) elif layout == "span": # place raw graph first hypergraph_layout_opts.setdefault("flatten", False) pos = get_nice_pos(G_tn, **hypergraph_layout_opts) if span is None: span = tree.get_spans()[0] pos.update({node: pos[span[node]] for node in G_tree.nodes}) created_ax = ax is None if created_ax: fig, ax = plt.subplots(1, 1, figsize=figsize) ax.set_aspect("equal") ax.axis("off") else: fig = None if plot_raw_graph: nx.draw_networkx_edges( G_tn, pos=pos, ax=ax, width=[G_tn.edges[e]["width"] for e in G_tn.edges], style=[G_tn.edges[e]["style"] for e in G_tn.edges], edge_color=[G_tn.edges[e]["color"] for e in G_tn.edges], ) if plot_leaf_labels: nx.draw_networkx_labels( G_tn, pos=pos, ax=ax, labels={k: int(next(iter(k))) for k in G_tn.nodes}, ) if edge_max_width is not None: edge_weights = [min(e, edge_max_width) for e in edge_weights] if node_max_size is not None: node_weights = [min(n, node_max_size) for n in node_weights] nx.draw_networkx_edges( G_tree, pos=pos, ax=ax, width=edge_weights, edge_color=edge_colors, alpha=tree_alpha, ) nx.draw_networkx_nodes( G_tree, pos=pos, ax=ax, node_size=node_weights, node_color=node_colors, alpha=tree_alpha, ) if colorbars and created_ax: min_size = math.log2(min(tree.get_size(x) for x in tree.info)) max_size = math.log2(max(tree.get_size(x) for x in tree.info)) edge_norm = mpl.colors.Normalize(vmin=min_size, vmax=max_size) ax_l = fig.add_axes([-0.02, 0.25, 0.02, 0.5]) cb_l = mpl.colorbar.ColorbarBase( ax_l, cmap=edge_colormap, norm=edge_norm ) cb_l.outline.set_visible(False) ax_l.yaxis.tick_left() ax_l.set(title="log2[SIZE]") min_flops = math.log10( min(max(tree.get_flops(x), 1) for x in tree.info) ) max_flops = math.log10( max(max(tree.get_flops(x), 1) for x in tree.info) ) node_norm = mpl.colors.Normalize(vmin=min_flops, vmax=max_flops) ax_r = fig.add_axes([1.0, 0.25, 0.02, 0.5]) cb_r = mpl.colorbar.ColorbarBase( ax_r, cmap=node_colormap, norm=node_norm ) cb_r.outline.set_visible(False) ax_r.yaxis.tick_right() ax_r.set(title="log10[FLOPS]") # with warnings.catch_warnings(): # warnings.simplefilter('ignore', UserWarning) # plt.tight_layout() return fig, ax @functools.wraps(plot_tree) def plot_tree_ring(tree, **kwargs): kwargs.setdefault("tree_alpha", 0.97) kwargs.setdefault("raw_edge_alpha", 1 / 10) return plot_tree(tree, "ring", **kwargs) @functools.wraps(plot_tree) def plot_tree_tent(tree, **kwargs): kwargs.setdefault("tree_alpha", 0.7) kwargs.setdefault("raw_edge_alpha", 1 / 5) kwargs.setdefault("edge_scale", 1 / 2) kwargs.setdefault("node_scale", 1 / 3) return plot_tree(tree, "tent", **kwargs) @functools.wraps(plot_tree) def plot_tree_span(tree, **kwargs): kwargs.setdefault("edge_colormap", "viridis") kwargs.setdefault("edge_scale", 2) kwargs.setdefault("edge_max_width", 3) kwargs.setdefault("node_colormap", "plasma") kwargs.setdefault("node_scale", 2) kwargs.setdefault("node_max_size", 30) return plot_tree(tree, "span", **kwargs) def tree_to_df(tree): import pandas as pd sizes = [] isizes = [] psizes = [] flops = [] stages = [] scalings = [] ranks = [] for k in tree.info: if tree.get_flops(k) == 0: continue sizes.append(max(1, tree.get_size(k))) isizes.append(sum(map(tree.get_size, tree.children[k]))) psizes.append(sizes[-1] + isizes[-1]) flops.append(max(1, tree.get_flops(k))) stages.append(len(k)) ranks.append(len(tree.get_legs(k))) scalings.append(len(tree.get_involved(k))) return pd.DataFrame( { "out-size": sizes, "input-size": isizes, "peak-size": psizes, "flops": flops, "stage": stages, "rank": ranks, "scaling": scalings, } ) @show_and_close @use_neutral_style def plot_contractions( tree, order=None, color_size=(0.6, 0.4, 0.7), color_cost=(0.3, 0.7, 0.5), figsize=(8, 3), ): import matplotlib.pyplot as plt sz = sum(tree.get_size(node) for node in tree.gen_leaves()) sizes = [] peaks = [] costs = [] for p, l, r in tree.traverse(order): sz += tree.get_size(p) peaks.append(math.log2(sz)) sz -= tree.get_size(l) sz -= tree.get_size(r) sizes.append(math.log2(tree.get_size(p))) costs.append(math.log10(tree.get_flops(p))) cons = list(range(len(peaks))) fig, ax = plt.subplots(figsize=figsize) ax.set_xlabel("contraction") ax.plot( cons, peaks, color=color_size, marker="x", markersize=3, alpha=0.5, label="peak", ) ax.plot( cons, sizes, color=color_size, marker="o", markersize=3, alpha=0.5, linestyle=(1, (1, 1)), label="write", ) M = math.log2(tree.total_write()) ax.axhline( M, color=color_size, xmax=0.04, linewidth=0.8, ) ax.text( 0, M, "total write", ha="left", va="center", color=color_size, ) ax.spines["right"].set_color(color_size) ax.tick_params(axis="y", colors=color_size) ax.set_ylim(0, 1.06 * M) ax.set_ylabel("$\\log_2[SIZE]$", color=color_size) rax = ax.twinx() rax.spines["right"].set_visible(True) rax.spines["right"].set_color(color_cost) rax.tick_params(axis="y", colors=color_cost) rax.plot( cons, costs, color=color_cost, marker="s", markersize=3, alpha=0.5, linestyle=(0, (1, 1)), label="cost", ) C = tree.contraction_cost(log=10) rax.axhline( C, color=color_cost, xmin=0.96, linewidth=0.8, ) rax.text( cons[-1], C, "total cost", ha="right", va="center", color=color_cost, ) rax.set_ylim(0, 1.03 * C) rax.set_ylabel("$\\log_{10}[COST]$", color=color_cost) ax.legend(ncol=2, bbox_to_anchor=(0.4, 1.00), loc="center") rax.legend(bbox_to_anchor=(0.7, 1.00), loc="center") return fig, ax def plot_contractions_alt( tree, x="peak-size", y="flops", color="stage", size="scaling", width=400, height=400, point_opacity=0.8, color_scheme="lightmulti", x_scale="log", y_scale="log", color_scale="log", size_scale="linear", ): import altair as alt df = tree_to_df(tree) chart = alt.Chart(df) encoding = chart.encode( x=alt.X(x, scale=alt.Scale(type=x_scale, padding=10)), y=alt.Y(y, scale=alt.Scale(type=y_scale, padding=10)), color=alt.Color( color, scale=alt.Scale(scheme=color_scheme, type=color_scale) ), size=alt.Size(size, scale=alt.Scale(type=size_scale)), tooltip=list(df.columns), ) plot = encoding.mark_point(opacity=point_opacity) return ( plot.configure_axis(gridColor="rgb(248,248,248)") .properties(width=width, height=height) .interactive() ) def slicefinder_to_df(slice_finder, relative_flops=False): import pandas as pd all_ccs = sorted(slice_finder.costs.values(), key=lambda x: -x.size) maxsizes = [math.log2(x.size) for x in all_ccs] if relative_flops: newflops = [ float(x.total_flops) / float(slice_finder.cost0.total_flops) for x in all_ccs ] else: newflops = [math.log10(x.total_flops) for x in all_ccs] numslices = [math.log2(x.nslices) for x in all_ccs] return pd.DataFrame( { "log2[SIZE]": maxsizes, "log10[FLOPS]": newflops, "log2[NSLICES]": numslices, } ) @show_and_close def plot_slicings( slice_finder, color_scheme="RdYlBu_r", relative_flops=False, figsize=(6, 3), point_opacity=0.8, ): import matplotlib as mpl import seaborn as sns from matplotlib import pyplot as plt df = slicefinder_to_df(slice_finder, relative_flops=relative_flops) fig, ax = plt.subplots(1, 1, figsize=figsize) sns.scatterplot( x="log2[SIZE]", y="log10[FLOPS]", hue="log2[NSLICES]", palette=color_scheme, data=df, alpha=point_opacity, ) ax.set(xlim=(max(df["log2[SIZE]"] + 1), min(df["log2[SIZE]"] - 1))) ax.grid(True, c=(0.98, 0.98, 0.98)) ax.set_axisbelow(True) ax.get_legend().remove() ax_cb = fig.add_axes([1.02, 0.25, 0.02, 0.55]) nm = mpl.colors.Normalize( vmin=df["log2[NSLICES]"].min(), vmax=df["log2[NSLICES]"].max() ) if not isinstance(color_scheme, mpl.colors.Colormap): color_scheme = getattr(mpl.cm, color_scheme) cb = mpl.colorbar.ColorbarBase(ax_cb, cmap=color_scheme, norm=nm) cb.outline.set_visible(False) # with warnings.catch_warnings(): # warnings.simplefilter('ignore', UserWarning) # plt.tight_layout() return fig, ax def plot_slicings_alt( slice_finder, color_scheme="redyellowblue", relative_flops=False ): import altair as alt df = slicefinder_to_df(slice_finder, relative_flops=relative_flops) df["size"] = 2 ** df["log2[SIZE]"] df["flops"] = 10 ** df["log10[FLOPS]"] df["numslices"] = 2 ** df["log2[NSLICES]"] return ( alt.Chart(df) .mark_point() .encode( x=alt.X( "size:Q", sort="descending", scale=alt.Scale(type="log", zero=False), ), y=alt.Y("flops:Q", scale=alt.Scale(type="log")), color=alt.Color( "numslices:Q", scale=alt.Scale(type="log", scheme=color_scheme), sort="descending", ), tooltip=list(df.columns), ) .configure_axis(gridColor="rgb(248,248,248)") .interactive() ) @show_and_close @use_neutral_style def plot_hypergraph( H, *, edge_color=True, node_color=True, highlight=(), centrality="simple", colormap="plasma", pos=None, dim=2, layout="auto", initial_layout="auto", iterations="auto", k=None, use_forceatlas2=False, flatten=False, node_size=None, node_scale=1.0, edge_alpha=1 / 3, edge_style="solid", hyperedge_style="dashed", draw_edge_labels=None, fontcolor=(0.5, 0.5, 0.5), edge_labels_font_size=8, edge_labels_font_family="monospace", node_labels_font_size=10, node_labels_font_family="monospace", info=None, ax=None, figsize=(5, 5), ): from .schematic import Drawing if draw_edge_labels is None: draw_edge_labels = len(H) <= 20 G = H.to_networkx() hypergraph_compute_plot_info_G( H=H, G=G, highlight=highlight, node_color=node_color, edge_color=edge_color, edge_alpha=edge_alpha, edge_style=edge_style, colormap=colormap, centrality=centrality, hyperedge_style=hyperedge_style, ) if pos is None: pos = get_nice_pos( G, dim=dim, layout=layout, initial_layout=initial_layout, iterations=iterations, k=k, use_forceatlas2=use_forceatlas2, flatten=flatten, ) if node_size is None: # compute a base size using the position and number of tensors # first get plot volume (taken from quimb.tensor.drawing.py): node_packing_factor = H.num_nodes**-0.45 xs, ys, *zs = zip(*pos.values()) xmin, xmax = min(xs), max(xs) ymin, ymax = min(ys), max(ys) # if there only a few tensors we don't want to limit the node size # because of flatness, also don't allow the plot volume to go to zero xrange = max(((xmax - xmin) / 2, node_packing_factor, 0.1)) yrange = max(((ymax - ymin) / 2, node_packing_factor, 0.1)) plot_volume = xrange * yrange if zs: zmin, zmax = min(zs[0]), max(zs[0]) zrange = max(((zmax - zmin) / 2, node_packing_factor, 0.1)) plot_volume *= zrange # in total we account for: # - user specified scaling # - number of tensors # - how flat the plot area is (flatter requires smaller nodes) node_size = 0.2 * node_scale * node_packing_factor * plot_volume**0.5 if info is not None: info["node_size"] = node_size d = Drawing(ax=ax, figsize=figsize) edge_label_opts = dict( color=fontcolor, fontsize=edge_labels_font_size, family=edge_labels_font_family, ) node_label_opts = dict( color=fontcolor, fontsize=node_labels_font_size, family=node_labels_font_family, ) for n, ndata in G.nodes(data=True): d.circle( pos[n], radius=node_size, color=ndata["color"], ) if draw_edge_labels: d.text(pos[n], text=ndata["label"], **node_label_opts) for na, nb, edata in G.edges(data=True): if "multi" not in edata: if draw_edge_labels and edata["label"]: text = dict(text=edata["label"], **edge_label_opts) else: text = None d.line( pos[na], pos[nb], color=edata["color"], linewidth=edata["width"], linestyle=edata["style"], text=text, ) else: import numpy as np multidata = edata["multi"] colors = (edata["color"], *multidata["colors"]) widths = (edata["width"], *multidata["widths"]) styles = (edata["style"], *multidata["styles"]) labels = (edata["label"], *multidata["labels"]) ne = len(colors) offsets = np.linspace(-0.05 * ne, 0.05 * ne, ne) for i in range(ne): if draw_edge_labels and labels[i]: text = dict(text=labels[i], **edge_label_opts) else: text = None d.line_offset( pos[na], pos[nb], offset=offsets[i], color=colors[i], linewidth=widths[i], linestyle=styles[i], text=text, ) if info is not None and "pos" in info: info["pos"] = pos return d.fig, d.ax @show_and_close def plot_tree_rubberband( tree, order=None, colormap="Spectral", with_edge_labels=None, with_node_labels=None, highlight=(), centrality=False, layout="auto", node_size=None, node_color=(0.5, 0.5, 0.5, 1.0), edge_color=(0.5, 0.5, 0.5), edge_alpha=1 / 3, edge_style="solid", hyperedge_style="dashed", draw_edge_labels=None, edge_labels_font_size=8, edge_labels_font_family="monospace", iterations=500, ax=None, figsize=(5, 5), ): """Plot a ``ContractionTree`` using 'rubberbands' to represent intermediate contractions / subgraphs. This can be intuitive for small and / or planar contractions. """ import matplotlib as mpl from .schematic import Drawing H = tree.get_hypergraph() info = {"pos": None} fig, ax = plot_hypergraph( H, highlight=highlight, centrality=centrality, layout=layout, node_size=node_size, node_color=node_color, edge_color=edge_color, edge_alpha=edge_alpha, edge_style=edge_style, hyperedge_style=hyperedge_style, draw_edge_labels=draw_edge_labels, edge_labels_font_size=edge_labels_font_size, edge_labels_font_family=edge_labels_font_family, iterations=iterations, figsize=figsize, info=info, show_and_close=False, ) pos = info["pos"] r0 = info["node_size"] if isinstance(colormap, str): cmap = mpl.cm.get_cmap(colormap) else: cmap = colormap d = Drawing(ax=ax) counts = collections.defaultdict(int) for i, (p, _, _) in enumerate(tree.traverse()): pts = [pos[node] for node in p] for node in p: counts[node] += 1 radius = [r0 + 0.01 * counts[node] for node in p] prog = i / (tree.N - 2) color = cmap(prog) d.patch_around( pts, resolution=20, radius=radius, edgecolor=color, facecolor="none", linestyle="-", zorder=-prog, ) return fig, ax @show_and_close def plot_tree_flat( tree, edge_color=True, leaf_color=True, node_color=(0.5, 0.5, 0.5, 0.5), hyperedge_style="dashed", multiedge_spread=0.05, multiedge_smoothing=0.5, multiedge_midlength=0.5, fontcolor=(0.5, 0.5, 0.5), edge_labels_font_size=6, edge_labels_font_family="monospace", node_labels_font_size=8, node_labels_font_family="monospace", show_sliced=True, figsize=None, ): """Plot a ``ContractionTree`` as a flat, 2D diagram, including all indices at every intermediate contraction. This can be useful for small contractions, and does not require any graph layout algorithm. Parameters ---------- tree : ContractionTree The contraction tree to plot. edge_color : bool or color, optional Whether to color the edges, or a specific color to use. If ``True`` (default), each edge will be colored according to a hash of its index. leaf_color : bool or color, optional Whether to color the input nodes, or a specific color to use. If ``True`` (default), each leaf node will be colored with an automatically generated sequence according to its linear position in the input. node_color : bool or color, optional Whether to color the intermediate nodes, or a specific color to use. If ``True`` (default), each intermediate node will be colored with the average color of its children. hyperedge_style : str, optional The linestyle to use for hyperedges, i.e. indices that don't appeary exactly twice on either inputs or the output. multiedge_spread : float, optional The spread of multi-edges between nodes. multiedge_smoothing : float, optional The smoothing of multi-edges between nodes. multiedge_midlength : float, optional The midlength of multi-edges between nodes. fontcolor : color, optional The color to use for edge and node labels. edge_labels_font_size : int, optional The font size to use for edge labels. edge_labels_font_family : str, optional The font family to use for edge labels. node_labels_font_size : int, optional The font size to use for node labels. node_labels_font_family : str, optional The font family to use for node labels. show_sliced : bool, optional Whether to list sliced indices at the top left. figsize : tuple, optional The size of the figure to create, if not specified will be based on the number of nodes in the tree. Returns ------- fig : matplotlib.figure.Figure The figure containing the plot. ax : matplotlib.axes.Axes The axes containing the plot. """ import math import numpy as np from .schematic import Drawing, auto_colors, average_color, hash_to_color if figsize is None: figsize = (2 * tree.N**0.5, 2 * tree.N**0.5) edge_label_opts = dict( color=fontcolor, fontsize=edge_labels_font_size, family=edge_labels_font_family, ) node_label_opts = dict( color=fontcolor, fontsize=node_labels_font_size, family=node_labels_font_family, ) d = Drawing(figsize=figsize) # order the leaves are contracted in leaf_order = {leaf: i for i, leaf in enumerate(tree.get_leaves_ordered())} if edge_color is True: edge_colors = {ix: hash_to_color(ix) for ix in tree.size_dict} else: edge_colors = {ix: edge_color for ix in tree.size_dict} if leaf_color is True: node_colors = { leaf: c for leaf, c in zip(tree.gen_leaves(), auto_colors(tree.N)) } else: node_colors = {leaf: leaf_color for leaf in tree.gen_leaves()} hyperedges = {ix for ix, cnt in tree.appearances.items() if cnt != 2} # position of each node pos = {} for i, (p, l, r) in enumerate(tree.traverse(), 1): if tree.is_leaf(l): # left is a leaf xyl = pos[l] = (leaf_order[l], i - 1) tid = tree.node_to_input(l) d.circle(xyl, color=node_colors[l]) d.text(xyl, str(tid), **node_label_opts) else: xyl = pos[l] if tree.is_leaf(r): # right is a leaf xyr = pos[r] = (leaf_order[r], i - 1) tid = tree.node_to_input(r) d.circle(xyr, color=node_colors[r]) d.text(xyr, str(tid), **node_label_opts) else: xyr = pos[r] # position of parent is average of children xyp = ((xyl[0] + xyr[0]) / 2, i) pos[p] = xyp if node_color is True: # average color of children node_colors[p] = average_color((node_colors[l], node_colors[r])) else: node_colors[p] = node_color for xyc, edges in [ (xyl, sorted(tree.get_legs(l), reverse=True)), (xyr, sorted(tree.get_legs(r))), ]: ne = len(edges) if ne == 1: offsets = [0.0] text_centers = [0.5] else: offsets = np.linspace( -multiedge_spread * ne, multiedge_spread * ne, ne ) text_centers = np.linspace(3 / 4, 1 / 4, ne) for ix, offset, text_center in zip(edges, offsets, text_centers): d.line_offset( xyc, xyp, offset, relative=False, color=edge_colors[ix], linewidth=math.log2(tree.size_dict.get(ix, 2)), linestyle=hyperedge_style if ix in hyperedges else "-", smoothing=multiedge_smoothing, midlength=multiedge_midlength, text=dict(text=ix, center=text_center, **edge_label_opts), ) # draw intermediate node d.circle(xyp, color=node_colors[p]) ne = len(tree.get_legs(tree.root)) if ne: xyp = pos[tree.root] offsets = np.linspace( -multiedge_spread * ne, multiedge_spread * ne, ne ) for ix, offset in zip(tree.get_legs(tree.root), offsets): xym = (xyp[0] + offset, tree.N - 0.5) xyo = (xyp[0] + offset, tree.N) d.curve( [xyp, xym, xyo], color=edge_colors[ix], zorder=0, linewidth=math.log2(tree.size_dict.get(ix, 2)), linestyle=hyperedge_style if ix in hyperedges else "-", ) d.text(xyo, f"{ix}\n", **edge_label_opts) if tree.has_preprocessing(): for i in tree.preprocessing: node = tree.input_to_node(i) x, y = pos[node] d.circle( (x, y - 1), color=node_colors[node], ) edges = [ ix for ix in tree.inputs[i][::-1] if ix not in tree.sliced_inds ] ne = len(edges) if ne == 1: offsets = [0.0] text_centers = [0.5] else: offsets = np.linspace( -multiedge_spread * ne, multiedge_spread * ne, ne ) text_centers = np.linspace(3 / 4, 1 / 4, ne) for ix, offset, text_center in zip(edges, offsets, text_centers): d.line_offset( (x, y - 1), (x, y), offset, relative=False, color=edge_colors[ix], linewidth=math.log2(tree.size_dict.get(ix, 2)), linestyle=hyperedge_style if ix in hyperedges else "-", smoothing=multiedge_smoothing, midlength=multiedge_midlength, text=dict(text=ix, center=text_center, **edge_label_opts), ) if tree.sliced_inds and show_sliced: d.label_ax( x=0.1, y=0.8, text=f"$\\sum_{{{','.join(tree.sliced_inds)}}}$", color=fontcolor, ) return d.fig, d.ax @show_and_close def plot_tree_circuit( tree, edge_colormap="GnBu", edge_max_width=None, node_colormap="YlOrRd", node_max_size=None, figsize=None, ): import matplotlib as mpl from .schematic import Drawing if figsize is None: figsize = (tree.N**0.75, tree.N**0.75) d = Drawing(figsize=figsize) # edge coloring -> node size if edge_max_width is None: edge_max_width = math.log2(tree.max_size()) ew_range = 0, edge_max_width enorm = mpl.colors.Normalize(*ew_range, clip=True) if not isinstance(edge_colormap, mpl.colors.Colormap): edge_colormap = getattr(mpl.cm, edge_colormap) emapper = mpl.cm.ScalarMappable(norm=enorm, cmap=edge_colormap) # edge coloring -> node flops if node_max_size is None: node_max_size = math.log2(max(map(tree.get_flops, tree.children))) nw_range = 0, node_max_size nnorm = mpl.colors.Normalize(*nw_range, clip=True) if not isinstance(node_colormap, mpl.colors.Colormap): node_colormap = getattr(mpl.cm, node_colormap) nmapper = mpl.cm.ScalarMappable(norm=nnorm, cmap=node_colormap) pos = {tree.root: (0, 0)} queue = [tree.root] while queue: # process tree in reverse depth first order p = queue.pop(0) px, py = pos[p] l, r = tree.children[p] # we do all of right contractions first pos[r] = (px - 1, py - 1) pos[l] = (px - tree.get_extent(r), py) if not tree.is_leaf(l): queue.append(l) else: i = tree.node_to_input(l) d.text( pos[l], f"{i}", color=(0.5, 0.5, 0.5, 0.5), fontsize=20 * tree.N**-0.25, rotation=-90, ha="right", va="center", family="monospace", ) if not tree.is_leaf(r): queue.append(r) else: i = tree.node_to_input(r) d.text( pos[r], f"{i}", color=(0.5, 0.5, 0.5, 0.5), fontsize=20 * tree.N**-0.25, rotation=-45, ha="right", va="top", family="monospace", ) lW = math.log2(tree.get_size(l)) rW = math.log2(tree.get_size(r)) pC = math.log2(tree.get_flops(p)) d.line( pos[l], pos[p], color=emapper.to_rgba(lW), linewidth=5 * lW / edge_max_width, ) d.line( pos[r], pos[p], color=emapper.to_rgba(rW), linewidth=5 * rW / edge_max_width, ) d.circle( pos[p], color=nmapper.to_rgba(pC), radius=0.3 * pC / node_max_size, linewidth=0, ) return d.fig, d.ax ================================================ FILE: cotengra/presets.py ================================================ """Preset configured optimizers.""" import functools import threading from .core import ContractionTree from .hyperoptimizers.hyper import ( HyperOptimizer, ReusableHyperOptimizer, get_default_hq_methods, get_default_optlib, get_default_optlib_eco, ) from .interface import register_preset from .oe import ( PathOptimizer, ) from .pathfinders.path_basic import ( GreedyOptimizer, OptimalOptimizer, get_optimize_optimal, ) from .pathfinders.path_edgesort import EdgeSortOptimizer def estimate_optimal_hardness(inputs): r"""Provides a very rough estimate of how long it would take to find the optimal contraction order for a given set of inputs. The runtime is *very* approximately exponential in this number: .. math:: T \propto \exp {n^2 * k^0.5} Where :math:`n` is the number of tensors and :math:`k` is the average degree of the hypergraph. """ n = len(inputs) # average degree k = sum(map(len, inputs)) / n return n**2 * k**0.5 class AutoOptimizer(PathOptimizer): """An optimizer that automatically chooses between optimal and hyper-optimization, designed for everyday use. """ def __init__( self, optimal_cutoff=250, minimize="combo", cache=True, **hyperoptimizer_kwargs, ): self.minimize = minimize self.optimal_cutoff = optimal_cutoff self._optimize_optimal_fn = get_optimize_optimal() self.kwargs = hyperoptimizer_kwargs self.kwargs.setdefault("methods", ("random-greedy",)) self.kwargs.setdefault("max_repeats", 128) self.kwargs.setdefault("max_time", "rate:1e9") self.kwargs.setdefault("optlib", get_default_optlib_eco()) self.kwargs.setdefault("parallel", False) self.kwargs.setdefault("reconf_opts", {}) self.kwargs["reconf_opts"].setdefault("subtree_size", 4) self.kwargs["reconf_opts"].setdefault("maxiter", 100) self._hyperoptimizers_by_thread = {} if cache: self._optimizer_hyper_cls = ReusableHyperOptimizer else: self._optimizer_hyper_cls = HyperOptimizer def _get_optimizer_hyper_threadsafe(self): # since the hyperoptimizer is stateful while running, # we need to instantiate a separate one for each thread tid = threading.get_ident() try: return self._hyperoptimizers_by_thread[tid] except KeyError: opt = self._optimizer_hyper_cls( minimize=self.minimize, **self.kwargs ) self._hyperoptimizers_by_thread[tid] = opt return opt def search(self, inputs, output, size_dict, **kwargs): if estimate_optimal_hardness(inputs) < self.optimal_cutoff: # easy to solve exactly ssa_path = self._optimize_optimal_fn( inputs, output, size_dict, use_ssa=True, minimize=self.minimize, **kwargs, ) return ContractionTree.from_path( inputs, output, size_dict, ssa_path=ssa_path, ) else: # use hyperoptimizer return self._get_optimizer_hyper_threadsafe().search( inputs, output, size_dict, **kwargs, ) def __call__(self, inputs, output, size_dict, **kwargs): if estimate_optimal_hardness(inputs) < self.optimal_cutoff: # easy to solve exactly return self._optimize_optimal_fn( inputs, output, size_dict, use_ssa=False, minimize=self.minimize, **kwargs, ) else: # use hyperoptimizer return self._get_optimizer_hyper_threadsafe()( inputs, output, size_dict, **kwargs ) class AutoHQOptimizer(AutoOptimizer): """An optimizer that automatically chooses between optimal and hyper-optimization, designed for everyday use on harder contractions or those that will be repeated many times, and thus warrant a more extensive search. """ def __init__(self, **kwargs): kwargs.setdefault("optimal_cutoff", 650) kwargs.setdefault("methods", get_default_hq_methods()) kwargs.setdefault("max_repeats", 128) kwargs.setdefault("max_time", "rate:1e8") kwargs.setdefault("optlib", get_default_optlib()) kwargs.setdefault("parallel", False) kwargs.setdefault("reconf_opts", {}) kwargs["reconf_opts"].setdefault("subtree_size", 8) kwargs["reconf_opts"].setdefault("maxiter", 500) super().__init__(**kwargs) @functools.lru_cache(maxsize=None) def get_auto_optimizer(): """Cache and reuse for speed. But only construct dynamically.""" return AutoOptimizer() def auto_optimize(inputs, output, size_dict, **kwargs): optimizer = get_auto_optimizer() return optimizer(inputs, output, size_dict, **kwargs) def auto_optimize_tree(inputs, output, size_dict, **kwargs): """Get a contraction tree using the auto optimizer.""" optimizer = get_auto_optimizer() return optimizer.search(inputs, output, size_dict, **kwargs) @functools.lru_cache(maxsize=None) def get_auto_hq_optimizer(): """Cache and reuse for speed. But only construct dynamically.""" return AutoHQOptimizer() def auto_hq_optimize(inputs, output, size_dict, **kwargs): optimizer = get_auto_hq_optimizer() return optimizer(inputs, output, size_dict, **kwargs) def auto_optimize_hq_tree(inputs, output, size_dict, **kwargs): """Get a contraction tree using the auto optimizer.""" optimizer = get_auto_hq_optimizer() return optimizer.search(inputs, output, size_dict, **kwargs) # these names overlap with opt_einsum, but won't override presets there register_preset( "auto", auto_optimize, auto_optimize_tree, ) register_preset( "auto-hq", auto_hq_optimize, auto_optimize_hq_tree, ) greedy_optimize = GreedyOptimizer() register_preset( ["greedy", "eager", "opportunistic"], greedy_optimize, greedy_optimize.search, ) optimal_optimize = OptimalOptimizer() register_preset( ["optimal", "dp", "dynamic-programming"], optimal_optimize, optimal_optimize.search, ) optimal_outer_optimize = OptimalOptimizer(search_outer=True) register_preset( "optimal-outer", optimal_outer_optimize, optimal_outer_optimize.search ) edgesort_optimize = EdgeSortOptimizer() register_preset( ["edgesort", "ncon"], edgesort_optimize, edgesort_optimize.search, ) ================================================ FILE: cotengra/reusable.py ================================================ import collections import hashlib import pickle import threading from .oe import PathOptimizer from .utils import DiskDict def sortedtuple(x): return tuple(sorted(x)) def make_hashable(x): """Make ``x`` hashable by recursively turning list into tuples and dicts into sorted tuples of key-value pairs. """ if isinstance(x, list): return tuple(map(make_hashable, x)) if isinstance(x, dict): return tuple(sorted((k, make_hashable(v)) for k, v in x.items())) return x def hash_contraction_a(inputs, output, size_dict): if not isinstance(next(iter(size_dict.values()), 1), int): # hashing e.g. numpy int won't match! size_dict = {k: int(v) for k, v in size_dict.items()} return hashlib.sha1( pickle.dumps( ( tuple(map(sortedtuple, inputs)), sortedtuple(output), sortedtuple(size_dict.items()), ) ) ).hexdigest() def hash_contraction_b(inputs, output, size_dict): # label each index as the sorted tuple of nodes it is incident to edges = collections.defaultdict(list) for ix in output: edges[ix].append(-1) for i, term in enumerate(inputs): for ix in term: edges[ix].append(i) # then sort edges by each's incidence nodes canonical_edges = sortedtuple(map(sortedtuple, edges.values())) return hashlib.sha1( pickle.dumps((canonical_edges, sortedtuple(size_dict.items()))) ).hexdigest() def hash_contraction(inputs, output, size_dict, method="a"): """Compute a hash for a particular contraction geometry.""" if method == "a": return hash_contraction_a(inputs, output, size_dict) elif method == "b": return hash_contraction_b(inputs, output, size_dict) else: raise ValueError("Unknown hash method: {}".format(method)) class ReusableOptimizer(PathOptimizer): """Mixin class for optimizers that can be reused, caching the paths and other relevant information for reconstructing the full tree. The following methods should be implemented in the subclass: _get_path_relevant_opts(self) _get_suboptimizer(self) _deconstruct_tree(self, opt, tree) _reconstruct_tree(self, inputs, output, size_dict, con) Parameters ---------- directory : None, True, or str, optional If specified use this directory as a persistent cache. If ``True`` auto generate a directory in the current working directory based on the options which are most likely to affect the path (see `ReusableHyperOptimizer._get_path_relevant_opts`). overwrite : bool or 'improved', optional If ``True``, the optimizer will always run, overwriting old results in the cache. This can be used to update paths without deleting the whole cache. If ``'improved'`` then only overwrite if the new path is better. hash_method : {'a', 'b', ...}, optional The method used to hash the contraction tree. The default, ``'a'``, is faster hashwise but doesn't recognize when indices are permuted. cache_only : bool, optional If ``True``, the optimizer will only use the cache, and will raise ``KeyError`` if a contraction is not found. directory_split : "auto" or bool, optional If specified, the hash will be split into two parts, the first part will be used as a subdirectory, and the second part will be used as the filename. This is useful for avoiding a very large flat diretory. If "auto" it will check the current cache if any and guess from that. opt_kwargs Supplied to ``self._get_suboptimizer(self)``. """ def __init__( self, *, directory=None, overwrite=False, hash_method="a", cache_only=False, directory_split="auto", **opt_kwargs, ): self._suboptimizers = {} self._suboptimizer_kwargs = opt_kwargs if directory is True: # automatically generate the directory directory = f"ctg_cache/opts{self.auto_hash_path_relevant_opts()}" self._cache = DiskDict(directory) self.overwrite = overwrite self._hash_method = hash_method self.cache_only = cache_only if directory_split == "auto": # peak at cache and see if it has a subdirectory structure path = self._cache._path if (path is not None) and path.exists(): anysub = next(path.glob("*"), None) if anysub is not None: directory_split = anysub.is_dir() else: # default to True directory_split = True else: # default to True directory_split = True self.directory_split = directory_split @property def last_opt(self): return self._suboptimizers.get(threading.get_ident(), None) def _get_path_relevant_opts(self): """We only want to hash on options that affect the contraction, not things like `progbar`. """ raise NotImplementedError def auto_hash_path_relevant_opts(self): """Automatically hash the path relevant options used to create the optimizer. """ key = tuple( (key, make_hashable(self._suboptimizer_kwargs.get(key, default))) for key, default in self._get_path_relevant_opts() ) return hashlib.sha1(pickle.dumps(key)).hexdigest() def hash_query(self, inputs, output, size_dict): """Hash the contraction specification, returning this and whether the contraction is already present as a tuple. """ h = hash_contraction(inputs, output, size_dict, self._hash_method) if self.directory_split: # use first part of the hash (256 options) as sub directory h = (h[:2], h[2:]) missing = h not in self._cache return h, missing @property def minimize(self): if self.last_opt is not None: return self.last_opt.minimize else: return self._suboptimizer_kwargs.get("minimize", "flops") def update_from_tree(self, tree, overwrite="improved"): """Explicitly add the contraction that ``tree`` represents into the cache. For example, if you have manually improved it via reconfing. If ``overwrite=False`` and the contracton is present already then do nothing. If ``overwrite='improved'`` then only overwrite if the new path is better. If ``overwrite=True`` then always overwrite. Parameters ---------- tree : ContractionTree The tree to add to the cache. overwrite : bool or "improved", optional If ``True`` always overwrite, if ``False`` only overwrite if the contraction is missing, if ``'improved'`` only overwrite if the new path is better (the default). Note that the comparison of scores is based on default objective of the tree. """ h, missing = self.hash_query(tree.inputs, tree.output, tree.size_dict) new_con = { "path": tree.get_path(), "score": tree.get_score(), "sliced_inds": tuple(tree.sliced_inds), } if missing: # write to the cache self._cache[h] = new_con elif overwrite: if overwrite == "improved": old_con = self._cache[h] if new_con["score"] < old_con["score"]: # overwrite only if we have a better score self._cache[h] = new_con else: # overwrite regardless of score self._cache[h] = new_con def _run_optimizer(self, inputs, output, size_dict): opt = self.suboptimizer(**self._suboptimizer_kwargs) tree = opt.search(inputs, output, size_dict) thrid = threading.get_ident() self._suboptimizers[thrid] = opt return { "path": tree.get_path(), "score": tree.get_score(), # dont' need to store all slice info, just which indices "sliced_inds": tuple(tree.sliced_inds), } def _maybe_run_optimizer(self, inputs, output, size_dict): h, missing = self.hash_query(inputs, output, size_dict) should_run = missing or self.overwrite if should_run: if self.cache_only: raise KeyError("Contraction missing from cache.") con = self._run_optimizer(inputs, output, size_dict) if (self.overwrite == "improved") and (not missing): # only overwrite if the new path is better old_con = self._cache[h] if con["score"] < old_con["score"]: # replace the old path self._cache[h] = con else: # use the old path con = old_con # need flag that we can't use the last run should_run = False else: # write to the cache self._cache[h] = con else: # just retrieve from the cache con = self._cache[h] return should_run, con def __call__(self, inputs, output, size_dict, memory_limit=None): _, con = self._maybe_run_optimizer(inputs, output, size_dict) return con["path"] def _get_suboptimizer(self): raise NotImplementedError def _deconstruct_tree(self, opt, tree): raise NotImplementedError def _run_optimizer(self, inputs, output, size_dict): opt = self._get_suboptimizer() tree = opt.search(inputs, output, size_dict) thrid = threading.get_ident() self._suboptimizers[thrid] = opt return self._deconstruct_tree(opt, tree) def _reconstruct_tree(self, inputs, output, size_dict, con): raise NotImplementedError def search(self, inputs, output, size_dict): searched, con = self._maybe_run_optimizer(inputs, output, size_dict) if searched: # already have the tree to return return self.last_opt.tree # else need to *reconstruct* the tree from the more compact path return self._reconstruct_tree(inputs, output, size_dict, con) def cleanup(self): self._cache.cleanup() ================================================ FILE: cotengra/schematic.py ================================================ """Draw 2D and pseudo-3D diagrams programmatically using matplotlib.""" import functools import warnings from math import atan2, cos, pi, sin import matplotlib as mpl import matplotlib.pyplot as plt class Drawing: """Draw 2D or pseudo-3D diagrams using matplotlib. This handles the axonometric projection and the z-ordering of the elements, as well as named preset styles for repeated elements, and the automatic adjustment of the figure limits. It also has basic support for drawing smooth curves and shaded areas around certain elements automatically. Parameters ---------- background : color, optional The background color of the figure, defaults to transparent. drawcolor : color, optional The default color to draw lines and text in. shapecolor : color, optional The default color to fill shapes with. a : float The axonometric angle of the x-axis in degrees. b : float The axonometric angle of the y-axis in degrees. xscale : float A factor to scale the x-axis by. yscale : float A factor to scale the y-axis by. zscale : float A factor to scale the z-axis by. presets : dict A dictionary of named style presets. When you add an element to the drawing, you can specify a preset name to use as default styling. ax : matplotlib.axes.Axes The axes to draw on. If None, a new figure is created. If an external `ax` is supplied, then note that this `Drawing` instance will not automatically adjust the limits of the axes as elements are added. kwargs Passed to ``plt.figure`` if ``ax`` is None. """ def __init__( self, background=(0, 0, 0, 0), drawcolor=(0.14, 0.15, 0.16, 1.0), shapecolor=(0.45, 0.50, 0.55, 1.0), a=50, b=12, xscale=1, yscale=1, zscale=1, presets=None, ax=None, **kwargs, ): if ax is None: self.fig = plt.figure(**kwargs) self.fig.set_facecolor(background) self.ax = self.fig.add_subplot(111) self.fig_owner = True else: self.ax = ax self.fig = self.ax.figure self.fig_owner = False self.ax.set_axis_off() self.ax.set_aspect("equal") self.ax.set_clip_on(False) self.drawcolor = drawcolor self.shapecolor = shapecolor self._xmin = None self._xmax = None self._ymin = None self._ymax = None self.presets = {} if presets is None else dict(presets) self.presets.setdefault(None, {}) self._2d_project = functools.partial( simple_scale, xscale=xscale, yscale=yscale, ) self._3d_project = functools.partial( axonometric_project, a=a, b=b, xscale=xscale, yscale=yscale, zscale=zscale, ) self._coo_to_zorder = functools.partial( coo_to_zorder, xscale=xscale, yscale=yscale, zscale=zscale, ) def _adjust_lims(self, x, y): if not self.fig_owner: # if we don't own the figure, we shouldn't adjust the limits return xchange = ychange = False if self._xmin is None or x < self._xmin: xchange = True self._xmin = x if self._xmax is None or x > self._xmax: xchange = True self._xmax = x if self._ymin is None or y < self._ymin: ychange = True self._ymin = y if self._ymax is None or y > self._ymax: ychange = True self._ymax = y if xchange and self._xmin != self._xmax: dx = self._xmax - self._xmin plot_xmin = self._xmin - dx * 0.01 plot_xmax = self._xmax + dx * 0.01 self.ax.set_xlim(plot_xmin, plot_xmax) if ychange and self._ymin != self._ymax: dy = self._ymax - self._ymin plot_ymin = self._ymin - dy * 0.01 plot_ymax = self._ymax + dy * 0.01 self.ax.set_ylim(plot_ymin, plot_ymax) def text(self, coo, text, preset=None, **kwargs): """Place text at the specified coordinate. Parameters ---------- coo : tuple[int, int] or tuple[int, int, int] The 2D or 3D coordinate of the text. If 3D, the coordinate will be projected onto the 2D plane, and a z-order will be assigned. text : str The text to place. preset : str, optional A preset style to use for the text. kwargs Specific style options passed to ``matplotlib.axes.Axes.text``. """ style = parse_style_preset(self.presets, preset, **kwargs) style.setdefault("color", self.drawcolor) style.setdefault("horizontalalignment", "center") style.setdefault("verticalalignment", "center") style.setdefault("clip_on", False) zorder_delta = style.pop("zorder_delta", 0.02) if len(coo) == 2: x, y = self._2d_project(*coo) style.setdefault("zorder", zorder_delta) else: x, y = self._3d_project(*coo) style.setdefault( "zorder", self._coo_to_zorder(*coo) + zorder_delta ) self.ax.text(x, y, text, **style) self._adjust_lims(x, y) def text_between(self, cooa, coob, text, preset=None, **kwargs): """Place text between two coordinates. Parameters ---------- cooa, coob : tuple[int, int] or tuple[int, int, int] The 2D or 3D coordinates of the text endpoints. If 3D, the coordinates will be projected onto the 2D plane, and a z-order will be assigned based on average z-order of the endpoints. text : str The text to place. center : float, optional The position of the text along the line, where 0.0 is the start and 1.0 is the end. Default is 0.5. preset : str, optional A preset style to use for the text. kwargs Specific style options passed to ``matplotlib.axes.Axes.text``. """ style = parse_style_preset(self.presets, preset, **kwargs) style.setdefault("color", self.drawcolor) style.setdefault("horizontalalignment", "center") style.setdefault("verticalalignment", "center") style.setdefault("clip_on", False) center = style.pop("center", 0.5) zorder_delta = style.pop("zorder_delta", 0.02) if len(cooa) == 2: xa, ya = self._2d_project(*cooa) xb, yb = self._2d_project(*coob) style.setdefault("zorder", zorder_delta) else: style.setdefault( "zorder", mean(self._coo_to_zorder(*coo) for coo in [cooa, coob]) + zorder_delta, ) xa, ya = self._3d_project(*cooa) xb, yb = self._3d_project(*coob) # compute midpoint x = xa * (1 - center) + xb * center y = ya * (1 - center) + yb * center # compute angle if xa <= xb: angle = atan2(yb - ya, xb - xa) * 180 / pi else: angle = atan2(ya - yb, xa - xb) * 180 / pi style.setdefault("rotation", angle) self.ax.text(x, y, text, **style) self._adjust_lims(x, y) def label_ax(self, x, y, text, preset=None, **kwargs): """Place text at the specified location, using the axis coordinates rather than 2D or 3D data coordinates. Parameters ---------- x, y : float The x and y positions of the text, relative to the axis. text : str The text to place. preset : str, optional A preset style to use for the text. kwargs Specific style options passed to ``matplotlib.axes.Axes.text``. """ style = parse_style_preset(self.presets, preset, **kwargs) style.setdefault("color", self.drawcolor) style.setdefault("horizontalalignment", "center") style.setdefault("verticalalignment", "center") style.setdefault("transform", self.ax.transAxes) self.ax.text(x, y, text, **style) self._adjust_lims(x, y) def label_fig(self, x, y, text, preset=None, **kwargs): """Place text at the specified location, using the figure coordinates rather than 2D or 3D data coordinates. Parameters ---------- x, y : float The x and y positions of the text, relative to the figure. text : str The text to place. preset : str, optional A preset style to use for the text. kwargs Specific style options passed to ``matplotlib.axes.Axes.text``. """ style = parse_style_preset(self.presets, preset, **kwargs) style.setdefault("color", self.drawcolor) style.setdefault("horizontalalignment", "center") style.setdefault("verticalalignment", "center") style.setdefault("transform", self.fig.transFigure) self.ax.text(x, y, text, **style) self._adjust_lims(x, y) def _parse_style_for_marker(self, coo, preset=None, **kwargs): style = parse_style_preset(self.presets, preset, **kwargs) if "color" in style: # assume coloring whole shape style.setdefault("facecolor", style.pop("color")) style.setdefault("facecolor", self.shapecolor) style.setdefault("edgecolor", darken_color(style["facecolor"])) style.setdefault("linewidth", 1) style.setdefault("radius", 0.25) zorder_delta = style.pop("zorder_delta", 0.01) if len(coo) == 2: x, y = self._2d_project(*coo) style.setdefault("zorder", zorder_delta) else: x, y = self._3d_project(*coo) style.setdefault( "zorder", self._coo_to_zorder(*coo) + zorder_delta ) return x, y, style def _adjust_lims_for_marker(self, x, y, r): for x, y in [ (x - 1.1 * r, y), (x + 1.1 * r, y), (x, y - 1.1 * r), (x, y + 1.1 * r), ]: self._adjust_lims(x, y) def circle(self, coo, preset=None, **kwargs): """Draw a circle at the specified coordinate. Parameters ---------- coo : tuple[int, int] or tuple[int, int, int] The 2D or 3D coordinate of the circle. If 3D, the coordinate will be projected onto the 2D plane, and a z-order will be assigned. preset : str, optional A preset style to use for the circle. kwargs Specific style options passed to ``matplotlib.patches.Circle``. """ x, y, style = self._parse_style_for_marker( coo, preset=preset, **kwargs ) circle = mpl.patches.Circle((x, y), **style) self.ax.add_artist(circle) self._adjust_lims_for_marker(x, y, style["radius"]) def wedge(self, coo, theta1, theta2, preset=None, **kwargs): """Draw a wedge at the specified coordinate. Parameters ---------- coo : tuple[int, int] or tuple[int, int, int] The 2D or 3D coordinate of the wedge. If 3D, the coordinate will be projected onto the 2D plane, and a z-order will be assigned. theta1 : float The angle in degrees of the first edge of the wedge. theta2 : float The angle in degrees of the second edge of the wedge. preset : str, optional A preset style to use for the wedge. kwargs Specific style options passed to ``matplotlib.patches.Wedge``. """ x, y, style = self._parse_style_for_marker( coo, preset=preset, **kwargs ) # wedge uses r, not radius style["r"] = style.pop("radius") # and is not filled by default style.setdefault("fill", True) wedge = mpl.patches.Wedge( (x, y), theta1=theta1, theta2=theta2, **style ) self.ax.add_artist(wedge) self._adjust_lims_for_marker(x, y, style["r"]) def dot(self, coo, preset=None, **kwargs): """Draw a small circle with no border. Alias for circle with defaults `radius=0.1` and `linewidth=0.0`. Parameters ---------- coo : tuple[int, int] or tuple[int, int, int] The 2D or 3D coordinate of the dot. If 3D, the coordinate will be projected onto the 2D plane, and a z-order will be assigned. preset : str, optional A preset style to use for the dot. kwargs Specific style options passed to ``matplotlib.patches.Circle``. """ style = parse_style_preset(self.presets, preset, **kwargs) style.setdefault("radius", 0.1) style.setdefault("linewidth", 0.0) self.circle(coo, **style) def regular_polygon(self, coo, preset=None, **kwargs): """Draw a regular polygon at the specified coordinate. Parameters ---------- coo : tuple[int, int] or tuple[int, int, int] The 2D or 3D coordinate of the polygon. If 3D, the coordinate will be projected onto the 2D plane, and a z-order will be assigned. n : int The number of sides of the polygon. orientation : float, optional The orientation of the polygon in radians. Default is 0.0. preset : str, optional A preset style to use for the polygon. kwargs Specific style options passed to ``matplotlib.patches.Polygon``. """ x, y, style = self._parse_style_for_marker( coo, preset=preset, **kwargs ) n = style.pop("n", 3) orientation = style.pop("orientation", 0.0) rpoly = mpl.patches.RegularPolygon( (x, y), numVertices=n, orientation=orientation, **style ) self.ax.add_artist(rpoly) self._adjust_lims_for_marker(x, y, style["radius"]) def marker(self, coo, preset=None, **kwargs): """Draw a 'marker' at the specified coordinate. This is a shorthand for creating polygons with shape specified by a single character. Parameters ---------- coo : tuple[int, int] or tuple[int, int, int] The 2D or 3D coordinate of the marker. If 3D, the coordinate will be projected onto the 2D plane, and a z-order will be assigned. marker : str, optional The marker shape to draw. One of ``"o.v^<>sDphH8"``. preset : str, optional A preset style to use for the marker. kwargs Specific style options. """ style = parse_style_preset(self.presets, preset, **kwargs) marker = style.pop("marker", "s") if marker in ("o", "."): return self.circle(coo, preset=preset, **style) if isinstance(marker, int): n = marker orientation = 0.0 else: n, orientation = { "v": (3, pi / 3), "^": (3, 0), "<": (3, pi / 2), ">": (3, -pi / 2), "s": (4, pi / 4), "D": (4, 0), "p": (5, 0), "h": (6, 0), "H": (6, pi / 2), "8": (8, 0), }[marker] self.regular_polygon( coo, preset=preset, n=n, orientation=orientation, **style ) def square(self, coo, preset=None, **kwargs): return self.marker(coo, preset=preset, marker="s", **kwargs) def cube(self, coo, preset=None, **kwargs): """Draw a cube at the specified coordinate, which must be 3D. Parameters ---------- coo : tuple[int, int, int] The 3D coordinate of the cube. The coordinate will be projected onto the 2D plane, and a z-order will be assigned. preset : str, optional A preset style to use for the cube. kwargs Specific style options passed to ``matplotlib.patches.Polygon``. """ style = parse_style_preset(self.presets, preset, **kwargs) r = style.pop("radius", 0.25) x, y, z = coo xm, xp = x - r, x + r ym, yp = y - r, y + r zm, zp = z - r, z + r faces = [ ((xm, ym, zm), (xm, ym, zp), (xm, yp, zp), (xm, yp, zm)), ((xp, ym, zm), (xp, ym, zp), (xp, yp, zp), (xp, yp, zm)), ((xp, ym, zm), (xp, ym, zp), (xm, ym, zp), (xm, ym, zm)), ((xp, yp, zm), (xp, yp, zp), (xm, yp, zp), (xm, yp, zm)), ((xp, ym, zm), (xp, yp, zm), (xm, yp, zm), (xm, ym, zm)), ((xp, ym, zp), (xp, yp, zp), (xm, yp, zp), (xm, ym, zp)), ] for face in faces: self.shape(face, preset=preset, **style) def line(self, cooa, coob, preset=None, **kwargs): """Draw a line between two coordinates. Parameters ---------- cooa, coob : tuple[int, int] or tuple[int, int, int] The 2D or 3D coordinates of the line endpoints. If 3D, the coordinates will be projected onto the 2D plane, and a z-order will be assigned based on average z-order of the endpoints. shorten : float or tuple[float, float], optional Shorten the line by this *absolute* amount at each end. If a tuple, the first value is the start shortening, the second the end shortening. stretch : float Stretch the line by this *relative* factor. 1.0 is no stretch, 0.5 is half length, 2.0 is double length. Default is 1.0. arrowhead : bool or dict, optional Draw an arrowhead at the end of the line. Default is False. If a dict, it is passed as keyword arguments to the arrowhead method. text_between : str, optional Add text along the line. preset : str, optional A preset style to use for the line. kwargs Specific style options passed to ``matplotlib.lines.Line2D``. See Also -------- Drawing.arrowhead, Drawing.curve """ style = parse_style_preset(self.presets, preset, **kwargs) style.setdefault("color", self.drawcolor) style.setdefault("solid_capstyle", "round") style.setdefault("text", None) stretch = style.pop("stretch", None) shorten = style.pop("shorten", None) arrowhead = style.pop("arrowhead", None) text = style.pop("text") zorder_delta = style.pop("zorder_delta", 0.0) if len(cooa) == 2: xa, ya = self._2d_project(*cooa) xb, yb = self._2d_project(*coob) style.setdefault("zorder", zorder_delta) else: style.setdefault( "zorder", mean(self._coo_to_zorder(*coo) for coo in [cooa, coob]) + zorder_delta, ) xa, ya = self._3d_project(*cooa) xb, yb = self._3d_project(*coob) if stretch is not None: # shorten around center center = (xa + xb) / 2, (ya + yb) / 2 xa, xb = [center[0] + stretch * (x - center[0]) for x in (xa, xb)] ya, yb = [center[1] + stretch * (y - center[1]) for y in (ya, yb)] if shorten is not None: forward, inverse = get_rotator_and_inverse((xa, ya), (xb, yb)) R = forward(xb, yb)[0] try: start, end = shorten except TypeError: start = end = shorten ra = (start, 0.0) rb = (R - end, 0.0) xa, ya = inverse(*ra) xb, yb = inverse(*rb) if arrowhead is not None: if arrowhead is True: arrowhead = {} else: arrowhead = dict(arrowhead) self.arrowhead(cooa, coob, preset=preset, **(style | arrowhead)) line = mpl.lines.Line2D([xa, xb], [ya, yb], **style) self.ax.add_artist(line) if text: if isinstance(text, str): text = {"text": text} else: text = dict(text) # don't want to pass full style dict to text_between text.setdefault("zorder", style["zorder"]) self.text_between(cooa, coob, **text) self._adjust_lims(xa, ya) self._adjust_lims(xb, yb) def line_offset( self, cooa, coob, offset, midlength=0.5, relative=True, preset=None, **kwargs, ): """Draw a line between two coordinates, but curving out by a given offset perpendicular to the line. Parameters ---------- cooa, coob : tuple[int, int] or tuple[int, int, int] The 2D or 3D coordinates of the line endpoints. If 3D, the coordinates will be projected onto the 2D plane, and a z-order will be assigned based on average z-order of the endpoints. offset : float The offset of the curve from the line, as a fraction of the total line length. This is always processed in the 2D projected plane. midlength : float The length of the middle straight section, as a fraction of the total line length. Default is 0.5. arrowhead : bool or dict, optional Draw an arrowhead at the end of the line. Default is False. If a dict, it is passed as keyword arguments to the arrowhead method. text_between : str, optional Add text along the line. relative : bool, optional If ``True`` (the default), then ``offset`` is taken as a fraction of the line length, else in absolute units. preset : str, optional A preset style to use for the line. kwargs Specific style options passed to ``curve``. """ style = parse_style_preset(self.presets, preset, **kwargs) style.setdefault("arrowhead", None) style.setdefault("text", None) arrowhead = style.pop("arrowhead") text = style.pop("text") zorder_delta = style.pop("zorder_delta", 0.0) if len(cooa) == 2: xs, ys = zip(*[self._2d_project(*coo) for coo in [cooa, coob]]) style.setdefault("zorder", zorder_delta) else: style.setdefault( "zorder", mean(self._coo_to_zorder(*coo) for coo in [cooa, coob]) + zorder_delta, ) xs, ys = zip(*[self._3d_project(*coo) for coo in [cooa, coob]]) cooa = xs[0], ys[0] coob = xs[1], ys[1] forward, inverse = get_rotator_and_inverse(cooa, coob) R = forward(*coob)[0] if relative: offset *= R endlength = (1 - midlength) / 2 cooml = inverse(endlength * R, offset) coomm = inverse(R / 2, offset) coomr = inverse((1 - endlength) * R, offset) curve_pts = [cooa, cooml, coomm, coomr, coob] if arrowhead is not None: if arrowhead is True: arrowhead = {} else: arrowhead = dict(arrowhead) # want to correct center for midlength center = arrowhead.pop("center", 0.5) arrowhead["center"] = min( max(0.0, 0.5 + (center - 0.5) / midlength), 1.0 ) self.arrowhead(cooml, coomr, preset=preset, **(style | arrowhead)) self.curve(curve_pts, preset=preset, **style) if text: if isinstance(text, str): text = {"text": text} else: text = dict(text) # don't want to pass full style dict to text_between text.setdefault("zorder", style["zorder"]) self.text_between(cooml, coomr, **text) for coo in curve_pts: self._adjust_lims(*coo) def arrowhead(self, cooa, coob, preset=None, **kwargs): """Draw just a arrowhead on the line between ``cooa`` and ``coob``. Parameters ---------- cooa, coob : tuple[int, int] or tuple[int, int, int] The coordinates of the start and end of the line. If 3D, the coordinates will be projected onto the 2D plane, and a z-order will be assigned based on average z-order of the endpoints. reverse : bool or "both", optional Reverse the direction by switching ``cooa`` and ``coob``. If ``"both"``, draw an arrowhead in both directions. Default is False. center : float, optional The position of the arrowhead along the line, where 0 is the start and 1 is the end. Default is 0.5. width : float, optional The width of the arrowhead. Default is 0.05. length : float, optional The length of the arrowhead. Default is 0.1. preset : str, optional A preset style to use for the arrowhead, including the above options. kwargs Specific style options passed to ``matplotlib.lines.Line2D``. """ style = parse_style_preset(self.presets, preset, **kwargs) style.setdefault("color", self.drawcolor) style.setdefault("center", 0.5) style.setdefault("width", 0.05) style.setdefault("length", 0.1) style.setdefault("reverse", False) reverse = style.pop("reverse") if reverse == "both": self.arrowhead(cooa, coob, preset=preset, **style) if reverse: cooa, coob = coob, cooa zorder_delta = style.pop("zorder_delta", 0.0) if len(cooa) != 2: style.setdefault( "zorder", mean(self._coo_to_zorder(*coo) for coo in [cooa, coob]) + zorder_delta, ) cooa = self._3d_project(*cooa) coob = self._3d_project(*coob) else: style.setdefault("zorder", zorder_delta) cooa = self._2d_project(*cooa) coob = self._2d_project(*coob) forward, inverse = get_rotator_and_inverse(cooa, coob) rb = forward(*coob) center = style.pop("center") width = style.pop("width") length = style.pop("length") lab = rb[0] xc = center * lab arrow_x = xc - length * lab arrow_y = width * lab aa, ab, ac = [ inverse(arrow_x, arrow_y), inverse(xc, 0), inverse(arrow_x, -arrow_y), ] line = mpl.lines.Line2D(*zip(*(aa, ab, ac)), **style) self.ax.add_artist(line) for x, y in [aa, ab, ac]: self._adjust_lims(x, y) def curve(self, coos, preset=None, **kwargs): """Draw a smooth line through the given coordinates. Parameters ---------- coos : Sequence[tuple[int, int]] or Sequence[tuple[int, int, int]] The 2D or 3D coordinates of the line. If 3D, the coordinates will be projected onto the 2D plane, and a z-order will be assigned based on average z-order of the endpoints. smoothing : float, optional The amount of smoothing to apply to the curve. 0.0 is no smoothing, 1.0 is maximum smoothing. Default is 0.5. shorten : float or tuple[float, float], optional Shorten the line by this *absolute* amount at each end. If a tuple, the first value is the start shortening, the second the end shortening. The shortening is calculated with respect to the first and last segments of the curve. preset : str, optional A preset style to use for the curve. kwargs Specific style options passed to ``matplotlib.lines.Line2D``. """ from matplotlib.path import Path style = parse_style_preset(self.presets, preset, **kwargs) if "color" in style: # presume that edge color is being specified style.setdefault("edgecolor", style.pop("color")) style.setdefault("edgecolor", self.drawcolor) style.setdefault("fill", False) style.setdefault("capstyle", "round") style.setdefault("smoothing", 1 / 2) smoothing = style.pop("smoothing") shorten = style.pop("shorten", None) zorder_delta = style.pop("zorder_delta", 0.0) if len(coos[0]) != 2: style.setdefault( "zorder", mean(self._coo_to_zorder(*coo) for coo in coos) + zorder_delta, ) coos = [self._3d_project(*coo) for coo in coos] else: style.setdefault("zorder", zorder_delta) coos = [self._2d_project(*coo) for coo in coos] N = len(coos) if shorten is not None: try: start, end = shorten except TypeError: start = end = shorten # shorten first segment _, inverse = get_rotator_and_inverse(coos[0], coos[1]) ra = (start, 0.0) coos[0] = inverse(*ra) # shorten last segment forward, inverse = get_rotator_and_inverse(coos[-2], coos[-1]) R = forward(*coos[-1])[0] rb = (R - end, 0.0) coos[-1] = inverse(*rb) if N <= 2 or smoothing == 0.0: path = coos moves = [Path.MOVETO] + [Path.LINETO] * (N - 1) control_pts = {} else: control_pts = {} for i in range(1, N - 1): control_pts[i, "l"], control_pts[i, "r"] = get_control_points( coos[i - 1], coos[i], coos[i + 1], spacing=smoothing / 2, ) path = [coos[0], control_pts[1, "l"], coos[1]] moves = [Path.MOVETO, Path.CURVE3, Path.CURVE3] for i in range(1, N - 2): path.extend( (control_pts[i, "r"], control_pts[i + 1, "l"], coos[i + 1]) ) moves.extend((Path.CURVE4, Path.CURVE4, Path.CURVE4)) path.extend((control_pts[N - 2, "r"], coos[N - 1])) moves.extend((Path.CURVE3, Path.CURVE3)) curve = mpl.patches.PathPatch(Path(path, moves), **style) self.ax.add_patch(curve) for coo in coos: self._adjust_lims(*coo) for coo in control_pts.values(): self._adjust_lims(*coo) def shape(self, coos, preset=None, **kwargs): """Draw a closed shape with (sharp) corners at the given coordinates. Parameters ---------- coos : sequence of coordinates The coordinates of the corners' of the shape. preset : str, optional A preset style to use for the shape. kwargs Specific style options passed to ``matplotlib.patches.PathPatch``. See Also -------- Drawing.patch """ from matplotlib.path import Path style = parse_style_preset(self.presets, preset, **kwargs) if "color" in style: style.setdefault("facecolor", style.pop("color")) style.setdefault("facecolor", self.shapecolor) style.setdefault("edgecolor", darken_color(style["facecolor"])) style.setdefault("linewidth", 1) style.setdefault("joinstyle", "round") zorder_delta = style.pop("zorder_delta", 0.0) if len(coos[0]) != 2: style.setdefault( "zorder", mean(self._coo_to_zorder(*coo) for coo in coos) + zorder_delta, ) coos = [self._3d_project(*coo) for coo in coos] else: style.setdefault("zorder", zorder_delta) coos = [self._2d_project(*coo) for coo in coos] path = [coos[0]] moves = [Path.MOVETO] for coo in coos[1:]: path.append(coo) moves.append(Path.LINETO) path.append(coos[0]) moves.append(Path.CLOSEPOLY) curve = mpl.patches.PathPatch(Path(path, moves), **style) self.ax.add_patch(curve) for coo in coos: self._adjust_lims(*coo) def rectangle(self, cooa, coob, preset=None, **kwargs): style = parse_style_preset(self.presets, preset, **kwargs) radius = style.pop("radius", 0.25) forward, inverse = get_rotator_and_inverse(cooa, coob) # rotate both onto y=0 xa, _ = forward(*cooa) xb, _ = forward(*coob) points = [ (xa - radius, -radius), (xa - radius, +radius), (xb + radius, +radius), (xb + radius, -radius), ] points = [inverse(*coo) for coo in points] self.shape(points, **style) def patch(self, coos, preset=None, **kwargs): """Draw a closed smooth patch through given coordinates. Parameters ---------- coos : sequence of coordinates The coordinates of the 'corners' of the patch, the outline is guaranteed to pass through these points. smoothing : float The smoothing factor, the higher the smoother. The default is 0.5. preset : str, optional A preset style to use for the patch. kwargs Specific style options passed to ``matplotlib.patches.PathPatch``. See Also -------- Drawing.shape, Drawing.curve """ from matplotlib.path import Path style = parse_style_preset(self.presets, preset, **kwargs) style.setdefault("linestyle", ":") style.setdefault("edgecolor", (0.5, 0.5, 0.5, 0.75)) style.setdefault("facecolor", (0.5, 0.5, 0.5, 0.25)) style.setdefault("smoothing", 1 / 2) smoothing = style.pop("smoothing") zorder_delta = style.pop("zorder_delta", -0.01) if len(coos[0]) != 2: # use min so the patch appears *just* behind the elements # its meant to highlight style.setdefault( "zorder", min(self._coo_to_zorder(*coo) for coo in coos) + zorder_delta, ) coos = [self._3d_project(*coo) for coo in coos] else: style.setdefault("zorder", -0.01) coos = [self._2d_project(*coo) for coo in coos] N = len(coos) control_pts = {} for i in range(N): control_pts[i, "l"], control_pts[i, "r"] = get_control_points( coos[(i - 1) % N], coos[i], coos[(i + 1) % N], spacing=smoothing / 2, ) path = [coos[0]] moves = [Path.MOVETO] for ia in range(N): ib = (ia + 1) % N path.append(control_pts[ia, "r"]) path.append(control_pts[ib, "l"]) path.append(coos[ib]) moves.append(Path.CURVE4) moves.append(Path.CURVE4) moves.append(Path.CURVE4) curve = mpl.patches.PathPatch(Path(path, moves), **style) self.ax.add_patch(curve) for coo in coos: self._adjust_lims(*coo) for coo in control_pts.values(): self._adjust_lims(*coo) def patch_around(self, coos, *, preset=None, **kwargs): """Draw a patch around the given coordinates, by contructing a convex hull around the points, optionally including an extra uniform or per coordinate radius. Parameters ---------- coos : sequence[tuple[int, int]] or sequence[tuple[int, int, int]] The coordinates of the points to draw the patch around. If 3D, the coordinates will be projected onto the 2D plane, and a z-order will be assigned based on *min* z-order of the endpoints. radius : float or sequence[float], optional The radius of the patch around each point. If a sequence, must be the same length as ``coos``. Default is 0.0. resolution : int, optional The number of points to use pad around each point. Default is 12. preset : str, optional A preset style to use for the patch. kwargs Specific style options passed to ``matplotlib.patches.PathPatch``. """ import numpy as np from scipy.spatial import ConvexHull style = parse_style_preset(self.presets, preset, **kwargs) radius = style.pop("radius", 0.0) resolution = style.pop("resolution", 12) zorder_delta = style.pop("zorder_delta", -0.01) if isinstance(radius, (int, float)): radius = [radius] * len(coos) if len(coos[0]) != 2: # use min so the patch appears *just* behind the elements # its meant to highlight style.setdefault( "zorder", min(self._coo_to_zorder(*coo) for coo in coos) + zorder_delta, ) coos = [self._3d_project(*coo) for coo in coos] else: style.setdefault("zorder", zorder_delta) expanded_pts = [] for coo, r in zip(coos, radius): if r == 0: expanded_pts.append(coo) else: expanded_pts.extend(gen_points_around(coo, r, resolution)) if len(expanded_pts) <= 3: # need at least 3 points to make convex hull boundary_pts = expanded_pts else: expanded_pts = np.array(expanded_pts) hull = ConvexHull(expanded_pts) boundary_pts = expanded_pts[hull.vertices] self.patch(boundary_pts, **style) def patch_around_circles( self, cooa, ra, coob, rb, padding=0.2, pinch=True, preset=None, **kwargs, ): """Draw a smooth patch around two circles. Parameters ---------- cooa : tuple[int, int] or tuple[int, int, int] The coordinates of the center of the first circle. If 3D, the coordinates will be projected onto the 2D plane, and a z-order will be assigned based on average z-order of the endpoints. ra : int The radius of the first circle. coob : tuple[int, int] or tuple[int, int, int] The coordinates of the center of the second circle. If 3D, the coordinates will be projected onto the 2D plane, and a z-order will be assigned based on average z-order of the endpoints. rb : int The radius of the second circle. padding : float, optional The amount of padding to add around the circles. Default is 0.2. pinch : bool or float, optional If or how much to pinch the patch in between the circles. Default is to match the padding. preset : str, optional A preset style to use for the patch. kwargs Specific style options passed to ``matplotlib.patches.PathPatch``. See Also -------- Drawing.patch """ style = parse_style_preset(self.presets, preset, **kwargs) style.setdefault("smoothing", 1.0) zorder_delta = style.pop("zorder_delta", -0.01) if pinch is True: pinch = 1 - padding if len(cooa) != 2: style.setdefault( "zorder", min(self._coo_to_zorder(*coo) for coo in [cooa, coob]) + zorder_delta, ) cooa = self._3d_project(*cooa) coob = self._3d_project(*coob) else: style.setdefault("zorder", zorder_delta) cooa = self._2d_project(*cooa) coob = self._2d_project(*coob) forward, inverse = get_rotator_and_inverse(cooa, coob) xb = forward(*coob)[0] rl = (1 + padding) * ra rr = (1 + padding) * rb rcoos = [ # left loop (0, -rl), (-rl * 2**-0.5, -rl * 2**-0.5), (-rl, 0), (-rl * 2**-0.5, +rl * 2**-0.5), (0, +rl), # above pinch point (xb / 2, (1 - float(pinch)) * (ra + rb)), # right loop (xb, +rr), (xb + rr * 2**-0.5, +rr * 2**-0.5), (xb + rr, 0), (xb + rr * 2**-0.5, -rr * 2**-0.5), (xb, -rr), # below pinch point (xb / 2, (float(pinch) - 1) * (ra + rb)), ] pcoos = [inverse(*rcoo) for rcoo in rcoos] self.patch(pcoos, preset=preset, **style) def savefig(self, fname, dpi=300, bbox_inches="tight"): self.fig.savefig(fname, dpi=dpi, bbox_inches=bbox_inches) def parse_style_preset(presets, preset, **kwargs): """Parse a one or more style presets plus manual kwargs. Parameters ---------- presets : dict The dictionary of presets. preset : str or sequence of str The name of the preset(s) to use. If multiple, later presets take precedence. kwargs Any additional manual keyword arguments are added to the style and override the presets. Returns ------- style : dict """ if (preset is None) or isinstance(preset, str): preset = (preset,) style = {} for p in preset: if p not in presets: warnings.warn(f"Drawing has no preset '{p}' yet.") else: style.update(presets[p]) style.update(kwargs) return style def simple_scale(i, j, xscale=1, yscale=1): return i * xscale, j * yscale def axonometric_project( i, j, k, a=50, b=12, xscale=1, yscale=1, zscale=1, ): """Project the 3D location ``(i, j, k)`` onto the 2D plane, using the axonometric projection with the given angles ``a`` and ``b``. The ``xscale``, ``yscale`` and ``zscale`` parameters can be used to scale the axes, including flipping them. Parameters ---------- i, j, k : float The 3D coordinates of the point to project. a, b : float The left and right angles to displace x and y axes, from horizontal, in degrees. xscale, yscale, zscale : float The scaling factor for the x, y and z axes. If negative, the axis is flipped. Returns ------- x, y : float The 2D coordinates of the projected point. """ i *= xscale * 0.8 j *= yscale k *= zscale return ( +i * cos(pi * a / 180) + j * cos(pi * b / 180), -i * sin(pi * a / 180) + j * sin(pi * b / 180) + k, ) def coo_to_zorder(i, j, k, xscale=1, yscale=1, zscale=1): """Given the coordinates of a point in 3D space, return a z-order value that can be used to draw it on top of other elements in the diagram. Take into account the scaling of the axes, so that the z-ordering is correct even if the axes flipped. """ return ( +i * xscale / abs(xscale) - j * yscale / abs(yscale) + k * zscale / abs(zscale) ) # colorblind palettes by Okabe & Ito (https://jfly.uni-koeln.de/color/) _COLORS_DEFAULT = { "blue": "#56B4E9", # light blue "orange": "#E69F00", # orange "green": "#009E73", # green "red": "#D55E00", # red "yellow": "#F0E442", # yellow "pink": "#CC79A7", # pink "bluedark": "#0072B2", # dark blue } def get_color( which, alpha=None, hue_factor=0.0, sat_factor=1.0, val_factor=1.0, ): """Get a color by name, optionally modifying its alpha, hue, saturation or value. These colorblind friendly colors were ppularized in an article by Wong (https://www.nature.com/articles/nmeth.1618) but originally come from Okabe & Ito (https://jfly.uni-koeln.de/color/). Parameters ---------- which : {'blue', 'orange', 'green', 'red', 'yellow', 'pink', 'bluedark'} The name of the color to get. alpha : float, optional The alpha channel value to set for the color. Default is 1.0. hue_factor : float, optional The amount to shift the hue of the color. Default is 0.0. sat_factor : float, optional The amount to scale the saturation of the color. Default is 1.0. val_factor : float, optional The amount to scale the value of the color. Default is 1.0. Returns ------- color : tuple[float, float, float, float] The RGBA color as a tuple of floats. """ import matplotlib as mpl h = _COLORS_DEFAULT[which] rgb = mpl.colors.to_rgb(h) h, s, v = mpl.colors.rgb_to_hsv(rgb) h = (h + hue_factor) % 1.0 s = min(max(0.0, s * sat_factor), 1.0) v = min(max(0.0, v * val_factor), 1.0) r, g, b = mpl.colors.hsv_to_rgb((h, s, v)) if alpha is not None: return (r, g, b, alpha) return r, g, b get_wong_color = get_color _COLORS_SORTED = [ _COLORS_DEFAULT["bluedark"], _COLORS_DEFAULT["blue"], _COLORS_DEFAULT["green"], _COLORS_DEFAULT["yellow"], _COLORS_DEFAULT["orange"], _COLORS_DEFAULT["red"], _COLORS_DEFAULT["pink"], ] def mod_sat(c, mod=None, alpha=None): """Modify the luminosity of color ``c``, optionally set the ``alpha`` channel, and return the final color as a RGBA tuple.""" import matplotlib as mpl r, g, b, a = mpl.colors.to_rgba(c) if alpha is None: alpha = a if mod is None: return r, g, b, alpha h, s, v = mpl.colors.rgb_to_hsv((r, g, b)) return (*mpl.colors.hsv_to_rgb((h, mod * s, v)), alpha) def auto_colors(nc, alpha=None, default_sequence=False): """Generate a nice sequence of ``nc`` colors. By default this uses an interpolation between the colorblind friendly colors of Okabe & Ito in hue sorted order, with luminosity moderated by a sine function to increase local distinguishability. Parameters ---------- nc : int The number of colors to generate. alpha : float, optional The alpha channel value to set for all colors. Default is 1.0. default_sequence : bool, optional If ``True``, take from the default sequence of 7 colors, un-sorted and un-modulated. Returns ------- colors : list[tuple[float, float, float, float]] """ import math import numpy as np from matplotlib.colors import LinearSegmentedColormap if default_sequence: if nc > 7: raise ValueError( "Can only generate 7 colors with default sequence" ) return [ mod_sat(c, alpha=alpha) for c in tuple(_COLORS_DEFAULT.values())[:nc] ] cmap = LinearSegmentedColormap.from_list("colorblind", _COLORS_SORTED) xs = list(map(cmap, np.linspace(0, 1.0, nc))) # modulate color saturation with sine to generate local distinguishability # ... but only turn on gradually for increasing number of nodes sat_mod_period = min(4, nc / 7) sat_mod_factor = max(0.0, 2 / 3 * math.tanh((nc - 7) / 4)) if alpha is None: alpha = 1.0 return [ mod_sat( c, 1 - sat_mod_factor * math.sin(math.pi * i / sat_mod_period) ** 2, alpha, ) for i, c in enumerate(xs) ] def darken_color(color, factor=2 / 3): """Take ``color`` and darken it by ``factor``.""" rgba = mpl.colors.to_rgba(color) return tuple(factor * c for c in rgba[:3]) + rgba[3:] def average_color(colors): """Take a sequence of colors and return the RMS average in RGB space.""" from matplotlib.colors import to_rgba # first map to rgba colors = [to_rgba(c) for c in colors] r, g, b, a = zip(*colors) # then RMS average each channel rm = (sum(ri**2 for ri in r) / len(r)) ** 0.5 gm = (sum(gi**2 for gi in g) / len(g)) ** 0.5 bm = (sum(bi**2 for bi in b) / len(b)) ** 0.5 am = sum(a) / len(a) return (rm, gm, bm, am) def jitter_color(color, factor=0.05): """Take ``color`` and add a random offset to each of its components.""" import random rgba = mpl.colors.to_rgba(color) hsv = mpl.colors.rgb_to_hsv(rgba[:3]) hsv = ( hsv[0], min(max(0, hsv[1] + random.uniform(-factor / 2, factor / 2)), 1), min(max(0, hsv[2] + random.uniform(-factor / 2, factor / 2)), 1), ) rgb = mpl.colors.hsv_to_rgb(hsv) return tuple(rgb) + rgba[3:] COLORING_SEED = 8 # 8, 10 def set_coloring_seed(seed): """Set the seed for the random color generator. Parameters ---------- seed : int The seed to use. """ global COLORING_SEED COLORING_SEED = seed def hash_to_nvalues(s, nval, seed=None): """Hash the string ``s`` to ``nval`` different floats in the range [0, 1].""" import hashlib if seed is None: seed = COLORING_SEED m = hashlib.sha256() m.update(f"{seed}".encode()) m.update(s.encode()) hsh = m.hexdigest() b = len(hsh) // nval if b == 0: raise ValueError( f"Can't extract {nval} values from hash of length {len(hsh)}" ) return tuple( int(hsh[i * b : (i + 1) * b], 16) / 16**b for i in range(nval) ) def hash_to_color( s, hmin=0.0, hmax=1.0, smin=0.3, smax=0.8, vmin=0.8, vmax=0.9, ): """Generate a random color for a string ``s``. Parameters ---------- s : str The string to generate a color for. hmin : float, optional The minimum hue value. hmax : float, optional The maximum hue value. smin : float, optional The minimum saturation value. smax : float, optional The maximum saturation value. vmin : float, optional The minimum value value. vmax : float, optional The maximum value value. Returns ------- color : tuple A tuple of floats in the range [0, 1] representing the RGB color. """ from matplotlib.colors import hsv_to_rgb, to_hex h, s, v = hash_to_nvalues(s, 3) h = hmin + h * (hmax - hmin) s = smin + s * (smax - smin) v = vmin + v * (vmax - vmin) rgb = hsv_to_rgb((h, s, v)) return to_hex(rgb) def mean(xs): """Get the mean of a list of numbers.""" s = 0 i = 0 for x in xs: s += x i += 1 return s / i def distance(pa, pb): """Get the distance between two points, in arbtirary dimensions.""" d = 0.0 for a, b in zip(pa, pb): d += (a - b) ** 2 return d**0.5 def get_angle(pa, pb): """Get the angle between the line from p1 to p2 and the x-axis.""" (xa, ya), (xb, yb) = pa, pb return atan2(yb - ya, xb - xa) def get_rotator_and_inverse(pa, pb): """Get a rotation matrix that rotates points by theta radians about the origin and then translates them by offset. """ theta = get_angle(pa, pb) ct = cos(theta) st = sin(theta) cmt = ct smt = -st dx, dy = pa def forward(x, y): """Rotate and translate a point.""" x, y = x - dx, y - dy x, y = (x * cmt - y * smt, x * smt + y * cmt) return x, y def inverse(x, y): """Rotate and translate a point.""" x, y = x * ct - y * st, x * st + y * ct return x + dx, y + dy return forward, inverse def get_control_points(pa, pb, pc, spacing=1 / 3): """Get two points that can be used to construct a bezier curve that passes smoothly through the angle `pa`, `pb`, `pc`. """ # rotate onto x-axis (ra always (0, 0)) forward, inverse = get_rotator_and_inverse(pa, pb) _, rb, rc = [forward(*p) for p in [pa, pb, pc]] # flip so third point is always above axis flip_y = rc[1] < 0 if flip_y: rc = rc[0], -rc[1] phi = get_angle(rb, rc) / 2 # lengths of the two lines lab = rb[0] lbc = distance(rb, rc) # lengths of perpendicular offsets oab = lab * cos(phi) obc = lbc * cos(phi) dx_ab = spacing * oab * cos(phi) dy_ab = spacing * oab * sin(phi) dx_bc = spacing * obc * cos(phi) dy_bc = spacing * obc * sin(phi) # get control points in this reference frame rc_ab = rb[0] - dx_ab, rb[1] - dy_ab rc_bc = rb[0] + dx_bc, rb[1] + dy_bc # unflip and un rotate if flip_y: rc_ab = rc_ab[0], -rc_ab[1] rc_bc = rc_bc[0], -rc_bc[1] c_ab, c_bc = inverse(*rc_ab), inverse(*rc_bc) return c_ab, c_bc def gen_points_around(coo, radius=1, resolution=12): """Generate points around a circle.""" x, y = coo dphi = 2 * pi / resolution phis = (i * dphi for i in range(resolution)) for phi in phis: xa = x + radius * cos(phi) ya = y + radius * sin(phi) yield xa, ya ================================================ FILE: cotengra/scoring.py ================================================ """Objects for defining and customizing the target cost of a contraction.""" import functools import math import re # the default weighting for comparing flops vs mops DEFAULT_COMBO_FACTOR = 64 class Objective: """Base mixin class for all objectives.""" __slots__ = () def __call__(self, trial): """The core method that takes a ``trial`` generated by a contraction path driver and scores it to report to a hyper-optimizer. It might also update the parameters in the trial to reflect the desired cost. """ raise NotImplementedError def __repr__(self): params = {k: getattr(self, k) for k in getattr(self, "__slots__", ())} return ( f"{self.__class__.__name__}(" + ", ".join(f"{k}={v}" for k, v in params.items()) + ")" ) def __hash__(self): return hash(repr(self)) # ------------------------ exact contraction scoring ------------------------ # def ensure_basic_quantities_are_computed(trial): if not all(q in trial for q in ("flops", "write", "size")): stats = trial["tree"].contract_stats() if "flops" not in trial: trial["flops"] = stats["flops"] if "write" not in trial: trial["write"] = stats["write"] if "size" not in trial: trial["size"] = stats["size"] class ExactObjective(Objective): """Mixin class for all exact objectives.""" def cost_local_tree_node(self, tree, node): """The cost of a single ``node`` in ``tree``, according to this objective. Used for subtree reconfiguration. """ raise NotImplementedError def score_local(self, **kwargs): """The score to give a single contraction, according to the given ``kwargs``. Used in ``simulated_anneal``. """ raise NotImplementedError def score_slice_index(self, costs, ix): """The score to give possibly slicing ``ix``, according to the given ``costs``. Used in the ``SliceFinder`` optimization. """ raise NotImplementedError def get_dynamic_programming_minimize(self): """Get the argument for optimal optimization, used in subtree reconfiguration. """ raise NotImplementedError class FlopsObjective(ExactObjective): """Objective that scores based on estimated floating point operations. Parameters ---------- secondary_weight : float, optional Weighting factor for secondary objectives (max size and total write). Default is 1e-3. """ __slots__ = ("secondary_weight",) def __init__(self, secondary_weight=1e-3): self.secondary_weight = secondary_weight super().__init__() def cost_local_tree_node(self, tree, node): return tree.get_flops(node) def score_local(self, **kwargs): f = kwargs["flops"] try: # accept iterables f = sum(f) except TypeError: pass return math.log2(f) def score_slice_index(self, costs, ix): return math.log( costs._flop_reductions[ix] + costs._write_reductions[ix] * self.secondary_weight + 1 ) def get_dynamic_programming_minimize(self): return "flops" def __call__(self, trial): ensure_basic_quantities_are_computed(trial) return ( math.log2(trial["flops"]) + self.secondary_weight * math.log2(trial["write"]) + self.secondary_weight * math.log2(trial["size"]) ) class WriteObjective(ExactObjective): """Objective that scores based on estimated total write, i.e. the sum of sizes of all intermediates. This is relevant for completely memory-bound contractions, and also for back-propagation. Parameters ---------- secondary_weight : float, optional Weighting factor for secondary objectives (max size and total flops). Default is 1e-3. """ __slots__ = ("secondary_weight",) def __init__(self, secondary_weight=1e-3): self.secondary_weight = secondary_weight super().__init__() def cost_local_tree_node(self, tree, node): return tree.get_size(node) def score_local(self, **kwargs): s = kwargs["size"] try: # accept iterables s = sum(s) except TypeError: pass return math.log2(s) def score_slice_index(self, costs, ix): return math.log( costs._flop_reductions[ix] * self.secondary_weight + costs._write_reductions[ix] + 1 ) def get_dynamic_programming_minimize(self): return "write" def __call__(self, trial): ensure_basic_quantities_are_computed(trial) return ( +self.secondary_weight * math.log2(trial["flops"]) + math.log2(trial["write"]) + self.secondary_weight * math.log2(trial["size"]) ) class SizeObjective(ExactObjective): """Objective that scores based on maximum intermediate size. Parameters ---------- secondary_weight : float, optional Weighting factor for secondary objectives (total flops and total write). Default is 1e-3. """ __slots__ = ("secondary_weight",) def __init__(self, secondary_weight=1e-3): self.secondary_weight = secondary_weight super().__init__() def cost_local_tree_node(self, tree, node): return tree.get_size(node) def score_local(self, **kwargs): s = kwargs["size"] try: # accept iterables s = max(s) except TypeError: pass return math.log2(s) def score_slice_index(self, costs, ix): return math.log( costs._flop_reductions[ix] * self.secondary_weight + costs._write_reductions[ix] + 1 ) def get_dynamic_programming_minimize(self): return "size" def __call__(self, trial): ensure_basic_quantities_are_computed(trial) return ( +self.secondary_weight * math.log2(trial["flops"]) + self.secondary_weight * math.log2(trial["write"]) + math.log2(trial["size"]) ) class ComboObjective(ExactObjective): """Objective that scores based on a combination of estimated floating point operations and total write, according to: .. math:: \\log_2(\\text{flops} + \\alpha \\times \\text{write}) Where alpha is the ``factor`` parameter of this objective, that describes approximately how much slower write speeds are. Parameters ---------- factor : float, optional Weighting factor for total write. Default is 64. """ __slots__ = ("factor",) def __init__( self, factor=DEFAULT_COMBO_FACTOR, ): self.factor = factor super().__init__() def cost_local_tree_node(self, tree, node): return tree.get_flops(node) + self.factor * tree.get_size(node) def score_local(self, **kwargs): f = kwargs["flops"] try: f = sum(f) except TypeError: f = () try: # accept iterables f = sum(f) except TypeError: pass w = kwargs["size"] try: # accept iterables w = sum(w) except TypeError: pass return math.log2(f + self.factor * w) def score_slice_index(self, costs, ix): return math.log( costs._flop_reductions[ix] + costs._write_reductions[ix] * self.factor + 1 ) def get_dynamic_programming_minimize(self): return f"combo-{self.factor}" def __call__(self, trial): ensure_basic_quantities_are_computed(trial) return math.log2(trial["flops"] + self.factor * trial["write"]) class LimitObjective(ExactObjective): """Objective that scores based on a maximum of either estimated floating point operations or the total write, weighted by some factor: .. math:: \\sum_{c} max(\\text{flops}_i, \\alpha \\times \\text{write}_i) For each contraction $i$. Where alpha is the ``factor`` parameter of this objective, that describes approximately how much slower write speeds are. This assumes that one or the other is the limiting factor. Parameters ---------- factor : float, optional Weighting factor for total write. Default is 64. """ def __init__(self, factor=DEFAULT_COMBO_FACTOR): self.factor = factor super().__init__() def cost_local_tree_node(self, tree, node): return max(tree.get_flops(node), self.factor * tree.get_size(node)) def score_local(self, **kwargs): f = kwargs["flops"] w = kwargs["size"] try: return math.log2( sum(max(fi, self.factor * wi) for fi, wi in zip(f, w)) ) except TypeError: return math.log2(max(f, self.factor * w)) def score_slice_index(self, costs, ix): return math.log( costs._flop_reductions[ix] + costs._write_reductions[ix] * self.factor + 1 ) def get_dynamic_programming_minimize(self): return f"limit-{self.factor}" def __call__(self, trial): tree = trial["tree"] return math.log2(tree.combo_cost(factor=self.factor, combine=max)) # --------------------- compressed contraction scoring ---------------------- # class CompressedStatsTracker: __slots__ = ( "chi", "flops", "max_size", "peak_size", "write", "total_size", "total_size_post_contract", "contracted_size", "size_change", "flops_change", ) def __init__(self, hg, chi): if chi == "auto": self.chi = max(hg.size_dict.values()) ** 2 else: self.chi = chi # local params -> don't depend on history self.total_size = 0 self.total_size_post_contract = 0 self.contracted_size = 0 self.size_change = 0 self.flops_change = 0 # global params -> depend on history self.flops = 0 self.max_size = 0 # initial tensors contribute to size for i in hg.nodes: sz_i = hg.node_size(i) self.max_size = max(self.max_size, sz_i) self.total_size += sz_i self.write = self.peak_size = self.total_size def copy(self): new = object.__new__(self.__class__) for attr in self.__slots__: setattr(new, attr, getattr(self, attr)) return new def update_pre_step(self): self.size_change = 0 self.flops_change = 0 def update_pre_compress(self, hg, *nodes): # subtract tensors size and also their neighbors size (since both will # change with compression) self.size_change -= hg.neighborhood_size(nodes) self.flops_change += hg.neighborhood_compress_cost(self.chi, nodes) def update_post_compress(self, hg, *nodes): # add new tensors size and also its neighbors (since these will have # changed with compression) self.size_change += hg.neighborhood_size(nodes) def update_pre_contract(self, hg, i, j): # remove pair of tensors from size self.size_change -= hg.node_size(i) + hg.node_size(j) # add flops of just the contraction self.flops_change += hg.contract_pair_cost(i, j) def update_post_contract(self, hg, ij): self.contracted_size = hg.node_size(ij) self.size_change += self.contracted_size # compute here before potential compressions: # the peak total size of concurrent intermediates self.total_size_post_contract = self.total_size + self.size_change def update_post_step(self): self.max_size = max(self.max_size, self.contracted_size) self.peak_size = max(self.peak_size, self.total_size_post_contract) self.total_size += self.size_change self.flops += self.flops_change self.write += self.contracted_size def update_score(self, other): self.flops = other.flops + self.flops_change self.write = other.write + self.contracted_size self.max_size = max(other.max_size, self.contracted_size) self.peak_size = max(other.peak_size, self.total_size_post_contract) if self.max_size > self.peak_size: raise RuntimeError( f"max_size={self.max_size} > peak_size={self.peak_size}" ) @property def combo_score(self): return math.log2(self.flops + DEFAULT_COMBO_FACTOR * self.write + 1) @property def score(self): raise NotImplementedError def describe(self, join=" "): F = math.log10(max(1, self.flops)) C = math.log10( max( 1, self.flops + getattr(self, "factor", DEFAULT_COMBO_FACTOR) * self.write, ) ) S = math.log2(max(1, self.max_size)) P = math.log2(max(1, self.peak_size)) return join.join( (f"F={F:.2f}", f"C={C:.2f}", f"S={S:.2f}", f"P={P:.2f}") ) def __repr__(self): return f"<{self.__class__.__name__}({self.describe(join=', ')})>" class CompressedStatsTrackerSize(CompressedStatsTracker): __slots__ = CompressedStatsTracker.__slots__ + ("secondary_weight",) def __init__(self, hg, chi, secondary_weight=1e-3): self.secondary_weight = secondary_weight super().__init__(hg, chi) @property def score(self): return ( math.log2(self.max_size) + math.log2(self.flops + 1) * self.secondary_weight ) class CompressedStatsTrackerPeak(CompressedStatsTracker): __slots__ = CompressedStatsTracker.__slots__ + ("secondary_weight",) def __init__(self, hg, chi, secondary_weight=1e-3): self.secondary_weight = secondary_weight super().__init__(hg, chi) @property def score(self): return ( math.log2(self.peak_size) + math.log2(self.flops + 1) * self.secondary_weight ) class CompressedStatsTrackerWrite(CompressedStatsTracker): __slots__ = CompressedStatsTracker.__slots__ + ("secondary_weight",) def __init__(self, hg, chi, secondary_weight=1e-3): self.secondary_weight = secondary_weight super().__init__(hg, chi) @property def score(self): return ( math.log2(self.write) + math.log2(self.flops + 1) * self.secondary_weight ) class CompressedStatsTrackerFlops(CompressedStatsTracker): __slots__ = CompressedStatsTracker.__slots__ + ("secondary_weight",) def __init__(self, hg, chi, secondary_weight=1e-3): self.secondary_weight = secondary_weight super().__init__(hg, chi) @property def score(self): return ( math.log10(self.flops + 1) + math.log10(self.peak_size) * self.secondary_weight ) class CompressedStatsTrackerCombo(CompressedStatsTracker): __slots__ = CompressedStatsTracker.__slots__ + ("factor",) def __init__(self, hg, chi, factor=DEFAULT_COMBO_FACTOR): self.factor = factor super().__init__(hg, chi) @property def score(self): return math.log2(self.flops + self.factor * self.write + 1) class CompressedObjective(Objective): """Mixin for objectives that score based on a compressed contraction.""" def __init__(self, chi="auto", compress_late=False): self.chi = chi self.compress_late = compress_late super().__init__() def get_compressed_stats_tracker(self, hg): """Return a tracker for compressed contraction stats. Parameters ---------- hg : Hypergraph The hypergraph to track stats for. Returns ------- CompressedStatsTracker The tracker. """ raise NotImplementedError def compute_compressed_stats(self, trial): tree = trial["tree"] if self.chi == "auto": chi = max(tree.size_dict.values()) ** 2 else: chi = self.chi return tree.compressed_contract_stats( chi, compress_late=self.compress_late, ) class CompressedSizeObjective(CompressedObjective): """Objective that scores based on the maximum size intermediate tensor during a compressed contraction with maximum bond dimension ``chi``. Parameters ---------- chi : int, optional Maximum bond dimension to use for the compressed contraction. Default is ``"auto"``, which will use the square of the maximum size of any input tensor dimension. compress_late : bool, optional Whether to compress the neighboring tensors just after (early) or just before (late) contracting tensors. Default is False, i.e. early. secondary_weight : float, optional Weighting factor for secondary objectives (flops and write). Default is 1e-3. """ __slots__ = ("chi", "compress_late", "secondary_weight") def __init__( self, chi="auto", compress_late=False, secondary_weight=1e-3, ): self.secondary_weight = secondary_weight super().__init__(chi=chi, compress_late=compress_late) def get_compressed_stats_tracker(self, hg): return CompressedStatsTrackerSize( hg, self.chi, secondary_weight=self.secondary_weight ) def __call__(self, trial): stats = self.compute_compressed_stats(trial) cr = ( math.log2(stats.max_size) + self.secondary_weight * math.log2(stats.flops) + self.secondary_weight * math.log2(stats.write) ) # overwrite stats with compressed versions trial["size"] = stats.max_size trial["flops"] = stats.flops trial["write"] = stats.write return cr class CompressedPeakObjective(CompressedObjective): """Objective that scores based on the peak total concurrent size of intermediate tensors during a compressed contraction with maximum bond dimension ``chi``. Parameters ---------- chi : int, optional Maximum bond dimension to use for the compressed contraction. Default is ``"auto"``, which will use the square of the maximum size of any input tensor dimension. compress_late : bool, optional Whether to compress the neighboring tensors just after (early) or just before (late) contracting tensors. Default is False, i.e. early. secondary_weight : float, optional Weighting factor for secondary objectives (flops and write). Default is 1e-3. """ __slots__ = ("chi", "compress_late", "secondary_weight") def __init__( self, chi="auto", compress_late=False, secondary_weight=1e-3, ): self.secondary_weight = secondary_weight super().__init__(chi=chi, compress_late=compress_late) def get_compressed_stats_tracker(self, hg): return CompressedStatsTrackerPeak( hg, chi=self.chi, secondary_weight=self.secondary_weight ) def __call__(self, trial): stats = self.compute_compressed_stats(trial) cr = ( math.log2(stats.peak_size) + self.secondary_weight * math.log2(stats.flops) + self.secondary_weight * math.log2(stats.write) ) # overwrite stats with compressed versions trial["size"] = stats.peak_size trial["flops"] = stats.flops trial["write"] = stats.write return cr class CompressedWriteObjective(CompressedObjective): """Objective that scores based on the total cumulative size of intermediate tensors during a compressed contraction with maximum bond dimension ``chi``. Parameters ---------- chi : int, optional Maximum bond dimension to use for the compressed contraction. Default is ``"auto"``, which will use the square of the maximum size of any input tensor dimension. compress_late : bool, optional Whether to compress the neighboring tensors just after (early) or just before (late) contracting tensors. Default is False, i.e. early. secondary_weight : float, optional Weighting factor for secondary objectives (flops and peak size). Default is 1e-3. """ __slots__ = ("chi", "compress_late", "secondary_weight") def __init__( self, chi="auto", compress_late=False, secondary_weight=1e-3, ): self.secondary_weight = secondary_weight super().__init__(chi=chi, compress_late=compress_late) def get_compressed_stats_tracker(self, hg): return CompressedStatsTrackerWrite( hg, chi=self.chi, secondary_weight=self.secondary_weight ) def __call__(self, trial): stats = self.compute_compressed_stats(trial) cr = ( math.log2(stats.write) + self.secondary_weight * math.log2(stats.flops) + self.secondary_weight * math.log2(stats.peak_size) ) # overwrite stats with compressed versions trial["size"] = stats.write trial["flops"] = stats.flops trial["write"] = stats.write return cr class CompressedFlopsObjective(CompressedObjective): """Objective that scores based on the total contraction flops intermediate tensors during a compressed contraction with maximum bond dimension ``chi``. Parameters ---------- chi : int, optional Maximum bond dimension to use for the compressed contraction. Default is ``"auto"``, which will use the square of the maximum size of any input tensor dimension. compress_late : bool, optional Whether to compress the neighboring tensors just after (early) or just before (late) contracting tensors. Default is False, i.e. early. secondary_weight : float, optional Weighting factor for secondary objectives (write and peak size). Default is 1e-3. """ __slots__ = ("chi", "compress_late", "secondary_weight") def __init__( self, chi="auto", compress_late=False, secondary_weight=1e-3, ): self.secondary_weight = secondary_weight super().__init__(chi=chi, compress_late=compress_late) def get_compressed_stats_tracker(self, hg): return CompressedStatsTrackerFlops( hg, chi=self.chi, secondary_weight=self.secondary_weight ) def __call__(self, trial): stats = self.compute_compressed_stats(trial) cr = ( math.log2(stats.flops) + self.secondary_weight * math.log2(stats.write) + self.secondary_weight * math.log2(stats.peak_size) ) # overwrite stats with compressed versions trial["size"] = stats.max_size trial["flops"] = stats.flops trial["write"] = stats.write return cr class CompressedComboObjective(CompressedObjective): __slots__ = ("chi", "compress_late", "factor") def __init__( self, chi="auto", compress_late=False, factor=DEFAULT_COMBO_FACTOR, ): self.factor = factor super().__init__(chi=chi, compress_late=compress_late) def get_compressed_stats_tracker(self, hg): return CompressedStatsTrackerCombo( hg, chi=self.chi, factor=self.factor ) def __call__(self, trial): stats = self.compute_compressed_stats(trial) flops = stats.flops write = stats.write cr = math.log2(flops + self.factor * write) # overwrite stats with compressed versions trial["size"] = stats.max_size trial["flops"] = flops trial["write"] = write return cr score_matcher = re.compile( # exact scoring functions r"(" r"flops|" r"size|" r"write|" r"combo|" r"limit|" # compressed scoring functions r"flops-compressed|" r"size-compressed|" r"max-compressed|" r"peak-compressed|" r"write-compressed|" r"combo-compressed" # optional factor r")([-:](\d*\.?\d*))?" ) def parse_minimize(minimize): match = score_matcher.fullmatch(minimize) if not match: raise ValueError(f"No score function '{minimize}' found.") which, _, param = match.groups() return which, param @functools.lru_cache(maxsize=128) def _get_score_fn_str_cached(minimize): which, param = parse_minimize(minimize) if which == "flops": return FlopsObjective() if which == "write": return WriteObjective() if which == "size": return SizeObjective() if which == "combo": if not param: factor = DEFAULT_COMBO_FACTOR elif param.isdigit(): factor = int(param) else: factor = float(param) return ComboObjective(factor=factor) if which == "limit": if not param: factor = DEFAULT_COMBO_FACTOR elif param.isdigit(): factor = int(param) else: factor = float(param) return LimitObjective(factor=factor) if which in ("max-compressed", "size-compressed"): chi = int(param) if param else "auto" return CompressedSizeObjective(chi=chi) if which == "peak-compressed": chi = int(param) if param else "auto" return CompressedPeakObjective(chi=chi) if which == "write-compressed": chi = int(param) if param else "auto" return CompressedWriteObjective(chi=chi) if which == "flops-compressed": chi = int(param) if param else "auto" return CompressedFlopsObjective(chi=chi) if which == "combo-compressed": chi = int(param) if param else "auto" return CompressedComboObjective(chi=chi) raise ValueError(f"No objective function named '{minimize}' found.") def get_score_fn(minimize): if isinstance(minimize, str): return _get_score_fn_str_cached(minimize) if callable(minimize): # custom objective function return minimize raise TypeError("minimize must be a valid string or callable.") # ----------------------- multi-contraction scoring ------------------------- # class MultiObjective(Objective): __slots__ = ("num_configs",) def __init__(self, num_configs): self.num_configs = num_configs def compute_mult(self, dims): raise NotImplementedError def estimate_node_mult(self, tree, node): return self.compute_mult( [tree.size_dict[ix] for ix in tree.get_node_var_inds(node)] ) def estimate_node_cache_mult(self, tree, node, sliced_ind_ordering): node_var_inds = tree.get_node_var_inds(node) # indices which are the first 'k' in the sliced ordering non_heavy_inds = [ ix for ix in tree.get_node_var_inds(node) if ix not in sliced_ind_ordering[: len(node_var_inds)] ] # each of these cycles 'out of sync' and thus must be kept return self.compute_mult([tree.size_dict[ix] for ix in non_heavy_inds]) class MultiObjectiveDense(MultiObjective): """Number of intermediate configurations is expected to scale as if all configurations are present. """ __slots__ = ("num_configs",) def compute_mult(self, dims): return math.prod(dims) def expected_coupons(num_sub, num_total): """If we draw a random 'coupon` which can take `num_sub` different values `num_total` times, how many unique coupons will we expect? """ return num_sub * (1 - (1 - 1 / num_sub) ** num_total) class MultiObjectiveUniform(MultiObjective): """Number of intermediate configurations is expected to scale as if all configurations are randomly draw from a uniform distribution. """ __slots__ = ("num_configs",) def compute_mult(self, dims): return expected_coupons(math.prod(dims), self.num_configs) class MultiObjectiveLinear(MultiObjective): """Number of intermediate configurations is expected to scale linearly with respect to number of variable indices (e.g. VMC like 'locally connected' configurations). """ __slots__ = ("num_configs", "coeff") def __init__(self, num_configs, coeff=1): self.coeff = coeff super().__init__(num_configs=num_configs) def compute_mult(self, dims): return min(self.coeff * len(dims), self.num_configs) ================================================ FILE: cotengra/slicer.py ================================================ """Functionality for identifying indices to sliced.""" import collections from math import log from .core import ContractionTree from .plot import plot_slicings, plot_slicings_alt from .scoring import get_score_fn from .utils import MaxCounter, get_rng IDX_INVOLVED = 0 IDX_LEGS = 1 IDX_SIZE = 2 IDX_FLOPS = 3 class ContractionCosts: """A simplified struct for tracking the contraction costs of a path only. Parameters ---------- contractions : sequence of Contraction The set of individual operations that make up a full contraction path. size_dict : dict[str, int] The sizes of the indices involved. nslices : int, optional For keeping track of the 'multiplicity' of this set of contractions if part of a sliced contration where indices have been removed. """ __slots__ = ( "size_dict", "contractions", "nslices", "original_flops", "_flops", "_sizes", "_flop_reductions", "_write_reductions", "_where", ) def __init__( self, contractions, size_dict, nslices=1, original_flops=None, ): self.size_dict = dict(size_dict) self.contractions = list(contractions) self._flops = 0 self._sizes = MaxCounter() self._flop_reductions = collections.defaultdict(lambda: 0) self._write_reductions = collections.defaultdict(lambda: 0) self._where = collections.defaultdict(set) for i, c in enumerate(self.contractions): self._flops += c[IDX_FLOPS] self._sizes.add(c[IDX_SIZE]) for ix in c[IDX_INVOLVED]: d = self.size_dict[ix] self._flop_reductions[ix] += c[IDX_FLOPS] - c[IDX_FLOPS] // d self._where[ix].add(i) if ix in c[IDX_LEGS]: self._write_reductions[ix] += ( c[IDX_SIZE] - c[IDX_SIZE] // d ) self.nslices = nslices if original_flops is None: original_flops = self._flops self.original_flops = original_flops def _set_state_from(self, other): """Copy all internal structure from another ``ContractionCosts``.""" self.size_dict = other.size_dict.copy() self.contractions = other.contractions.copy() self.nslices = other.nslices self.original_flops = other.original_flops self._flops = other._flops self._sizes = other._sizes.copy() self._flop_reductions = other._flop_reductions.copy() self._write_reductions = other._write_reductions.copy() self._where = other._where.copy() def copy(self): """Get a copy of this ``ContractionCosts``.""" new = object.__new__(ContractionCosts) new._set_state_from(self) return new @classmethod def from_contraction_tree(cls, contraction_tree, **kwargs): """Generate a set of contraction costs from a ``ContractionTree`` object. """ size_dict = contraction_tree.size_dict contractions = ( ( set(contraction_tree.get_involved(node)), set(contraction_tree.get_legs(node)), contraction_tree.get_size(node), contraction_tree.get_flops(node), ) for node in contraction_tree.info # ignore leaf nodes if not contraction_tree.is_leaf(node) ) return cls(contractions, size_dict, **kwargs) @classmethod def from_info(cls, info, **kwargs): """Generate a set of contraction costs from a ``PathInfo`` object.""" tree = ContractionTree.from_info(info) return cls.from_contraction_tree(tree, **kwargs) @property def size(self): return self._sizes.max() @property def flops(self): return self._flops @property def total_flops(self): return self.nslices * self.flops @property def overhead(self): return self.total_flops / self.original_flops def remove(self, ix, inplace=False): """ """ cost = self if inplace else self.copy() d = cost.size_dict[ix] cost.nslices *= d for i in cost._where.pop(ix): old_involved, old_legs, old_size, old_flops = cost.contractions[i] # update the actual flops reduction new_flops = old_flops // d cost._flops += new_flops - old_flops new_involved = old_involved.copy() new_involved.discard(ix) # update the potential flops reductions of other inds for oix in new_involved: di = cost.size_dict[oix] old_flops_reduction = old_flops - old_flops // di new_flops_reduction = old_flops_reduction // d cost._flop_reductions[oix] += ( new_flops_reduction - old_flops_reduction ) # update the tensor sizes if ix in old_legs: new_size = old_size // d cost._sizes.discard(old_size) cost._sizes.add(new_size) new_legs = old_legs.copy() new_legs.discard(ix) # update the potential size reductions of other inds for oix in new_legs: di = cost.size_dict[oix] old_size_reduction = old_size - old_size // di new_size_reduction = old_size_reduction // d cost._write_reductions[oix] -= ( old_size_reduction - new_size_reduction ) else: new_size = old_size new_legs = old_legs cost.contractions[i] = ( new_involved, new_legs, new_size, new_flops, ) del cost.size_dict[ix] del cost._flop_reductions[ix] del cost._write_reductions[ix] return cost def __repr__(self): s = ( "" ) return s.format( self.total_flops, self.size, self.nslices, self.overhead ) class SliceFinder: """An object to help find the best indices to slice over in order to reduce the memory footprint of a contraction as much as possible whilst introducing as little extra overhead. It searches for and stores ``ContractionCosts``. Parameters ---------- tree_or_info : ContractionTree or opt_einsum.PathInfo Object describing the target full contraction to slice. target_size : int, optional The target number of entries in the largest tensor of the sliced contraction. The search algorithm will terminate after this is reached. target_slices : int, optional The target or minimum number of 'slices' to consider - individual contractions after slicing indices. The search algorithm will terminate after this is breached. This is on top of the current number of slices. target_overhead : float, optional The target increase in total number of floating point operations. For example, a value of ``2.0`` will terminate the search just before the cost of computing all the slices individually breaches twice that of computing the original contraction all at once. temperature : float, optional When sampling combinations of indices, how far to randomly stray from what looks like the best (local) choice. """ def __init__( self, tree_or_info, target_size=None, target_overhead=None, target_slices=None, temperature=0.01, minimize="flops", allow_outer=True, seed=None, ): if all( t is None for t in (target_size, target_overhead, target_slices) ): raise ValueError( "You need to specify at least one of `target_size`, " "`target_overhead` or `target_slices`." ) self.info = tree_or_info # the unsliced cost if isinstance(tree_or_info, ContractionTree): self.cost0 = ContractionCosts.from_contraction_tree(tree_or_info) self.forbidden = set(tree_or_info.output) else: # assume ``opt_einsum.PathInfo`` self.cost0 = ContractionCosts.from_info(tree_or_info) self.forbidden = set(tree_or_info.output_subscript) if allow_outer == "only": # invert so only outer indices are allowed self.forbidden = set(self.cost0.size_dict) - self.forbidden elif allow_outer: # is True # no restrictions self.forbidden = () # the cache of possible slicings self.costs = {frozenset(): self.cost0} # algorithmic parameters self.temperature = temperature self.rng = get_rng(seed) # search criteria self.target_size = target_size self.target_overhead = target_overhead self.target_slices = target_slices self.minimize = get_score_fn(minimize) def _maybe_default(self, attr, value): if value is None: return getattr(self, attr) return value def best( self, k=None, target_size=None, target_overhead=None, target_slices=None, ): """Return the best contraction slicing, subject to target filters.""" target_size = self._maybe_default("target_size", target_size) target_overhead = self._maybe_default( "target_overhead", target_overhead ) target_slices = self._maybe_default("target_slices", target_slices) size_specified = target_size is not None overhead_specified = target_overhead is not None slices_specified = target_slices is not None valid = filter( lambda x: ( (not size_specified or (x[1].size <= target_size)) and ( not overhead_specified or (x[1].overhead <= target_overhead) ) and (not slices_specified or (x[1].nslices >= target_slices)) ), self.costs.items(), ) if size_specified or slices_specified: # sort primarily by overall flops def best_scorer(x): return (x[1].total_flops, x[1].nslices, x[1].size) else: # only overhead_specified # sort by size of contractions achieved def best_scorer(x): return (x[1].size, x[1].total_flops, x[1].nslices) if k is None: return min(valid, key=best_scorer) return sorted(valid, key=best_scorer)[:k] def trial( self, target_size=None, target_overhead=None, target_slices=None, temperature=None, ): """A single slicing attempt, greedily select indices from the popular pool, subject to the score function, terminating when any of the target criteria are met. """ # optionally override some defaults temperature = self._maybe_default("temperature", temperature) target_size = self._maybe_default("target_size", target_size) target_overhead = self._maybe_default( "target_overhead", target_overhead ) target_slices = self._maybe_default("target_slices", target_slices) size_specified = target_size is not None overhead_specified = target_overhead is not None slices_specified = target_slices is not None # hashable set of indices we are slicing ix_sl = frozenset() cost = self.costs[ix_sl] already_satisfied = ( (size_specified and (cost.size <= target_size)) or (overhead_specified and (cost.overhead > target_overhead)) or (slices_specified and (cost.nslices >= target_slices)) ) while not already_satisfied: ix = max( cost.size_dict, key=lambda ix: ( # the base score self.minimize.score_slice_index(cost, ix) - # a smudge that replicates boltzmann sampling temperature * log(-log(self.rng.random())) - # penalize forbidden (outer) indices (0 if ix not in self.forbidden else float("inf")) ), ) if ix in self.forbidden: raise RuntimeError("Ran out of valid indices to slice.") next_ix_sl = ix_sl | frozenset([ix]) # cache sliced contraction costs try: next_cost = self.costs[next_ix_sl] except KeyError: next_cost = self.costs[next_ix_sl] = cost.remove(ix) # check if we are about to break the flops limit if overhead_specified and (next_cost.overhead > target_overhead): break # accept the index ix_sl = next_ix_sl cost = next_cost # check if we are about to generate too many slices if slices_specified and (cost.nslices >= target_slices): break # check if we have reached the desired memory target if size_specified and (cost.size <= target_size): break return cost def search( self, max_repeats=16, temperature=None, target_size=None, target_overhead=None, target_slices=None, ): """Repeat trial several times and return the best found so far.""" for _ in range(max_repeats): self.trial( target_overhead=target_overhead, target_slices=target_slices, target_size=target_size, temperature=temperature, ) return self.best( target_overhead=target_overhead, target_slices=target_slices, target_size=target_size, ) plot_slicings = plot_slicings plot_slicings_alt = plot_slicings_alt ================================================ FILE: cotengra/utils.py ================================================ """Various utilities for cotengra.""" import collections import functools import itertools import math import operator import pathlib import pickle import random from functools import lru_cache, partial, reduce from operator import or_ import autoray as ar try: from cytoolz import groupby, interleave, unique except ImportError: def getter(index): """Adapted from `toolz`.""" if isinstance(index, list): if len(index) == 1: index = index[0] return lambda x: (x[index],) elif index: return operator.itemgetter(*index) else: return lambda x: () else: return operator.itemgetter(index) def groupby(key, seq): """Adapted from `toolz`.""" if not callable(key): key = getter(key) d = collections.defaultdict(lambda: [].append) for item in seq: d[key(item)](item) rv = {} for k, v in d.items(): rv[k] = v.__self__ return rv def interleave(seqs): """Adapted from `toolz`.""" iters = itertools.cycle(map(iter, seqs)) while True: try: for itr in iters: yield next(itr) return except StopIteration: predicate = partial(operator.is_not, itr) iters = itertools.cycle(itertools.takewhile(predicate, iters)) def unique(it): yield from dict.fromkeys(it) def deprecated(fn, old_name, new_name): def new_fn(*args, **kwargs): import warnings warnings.warn( f"The {old_name} function is deprecated in favor of {new_name}", Warning, ) return fn(*args, **kwargs) return new_fn def prod(it): """Compute the product of sequence of numbers ``it``.""" x = 1 for i in it: x *= i return x class oset: """An ordered set which stores elements as the keys of dict (ordered as of python 3.6). 'A few times' slower than using a set directly for small sizes, but makes everything deterministic. """ __slots__ = ("_d",) def __init__(self, it=()): self._d = dict.fromkeys(it) @classmethod def _from_dict(cls, d): obj = object.__new__(oset) obj._d = d return obj @classmethod def from_dict(cls, d): """Public method makes sure to copy incoming dictionary.""" return oset._from_dict(d.copy()) def copy(self): return oset.from_dict(self._d) def add(self, k): self._d[k] = None def discard(self, k): self._d.pop(k, None) def remove(self, k): self._d.pop(k) def clear(self): self._d.clear() def update(self, *others): for o in others: self._d.update(o._d) def union(self, *others): u = self.copy() u.update(*others) return u def intersection_update(self, *others): if len(others) > 1: si = set.intersection(*(set(o._d) for o in others)) else: si = others[0]._d self._d = {k: None for k in self._d if k in si} def intersection(self, *others): n_others = len(others) if n_others == 0: return self.copy() elif n_others == 1: si = others[0]._d else: si = set.intersection(*(set(o._d) for o in others)) return oset._from_dict({k: None for k in self._d if k in si}) def difference_update(self, *others): if len(others) > 1: su = set.union(*(set(o._d) for o in others)) else: su = others[0]._d self._d = {k: None for k in self._d if k not in su} def difference(self, *others): if len(others) > 1: su = set.union(*(set(o._d) for o in others)) else: su = others[0]._d return oset._from_dict({k: None for k in self._d if k not in su}) def symmetric_difference(self, other): return oset._from_dict( { k: None for k in itertools.chain(self._d, other._d) if (k not in self._d) or (k not in other) } ) def __eq__(self, other): if isinstance(other, oset): return self._d == other._d return False def __or__(self, other): return self.union(other) def __ior__(self, other): self.update(other) return self def __and__(self, other): return self.intersection(other) def __iand__(self, other): self.intersection_update(other) return self def __sub__(self, other): return self.difference(other) def __isub__(self, other): self.difference_update(other) return self def __len__(self): return self._d.__len__() def __iter__(self): return self._d.__iter__() def __contains__(self, x): return self._d.__contains__(x) def __repr__(self): return f"oset({list(self._d)})" class MaxCounter: """Simple class to keep track of the maximum in a likely changing sequence of elements. Parameters ---------- it : None or sequence of hashable, optional The initial items to add. Examples -------- >>> mc = MaxCounter([1, 2, 3, 3]) >>> mc.max() 3 >>> mc.discard(3) >>> mc.max() 3 >>> mc.discard(3) >>> mc.max() 2 >>> mc.add(10) >>> mc.max() 10 """ __slots__ = ("_c", "_max_element") def __init__(self, it=None): self._c = collections.Counter(it) if it is None: self._max_element = -float("inf") else: self._max_element = max(self._c) def copy(self): new = object.__new__(MaxCounter) new._max_element = self._max_element new._c = self._c.copy() return new def discard(self, x): """Discard element ``x`` and possibly update the maximum.""" cnt = self._c[x] if cnt <= 1: del self._c[x] if x == self._max_element: # only need to update the max if ``x`` # was the last maximum sized element try: self._max_element = max(self._c) except ValueError: self._max_element = -float("inf") else: self._c[x] = cnt - 1 def add(self, x): """Add element ``x`` and possibly update the maximum.""" self._c[x] += 1 self._max_element = max(self._max_element, x) def max(self): """The maximum element in this list.""" return self._max_element class BitSet: __slots__ = ("members", "map", "size", "infimum", "supremum", "hashkey") def __init__(self, it): self.members = tuple(unique(it)) self.map = {m: i for i, m in enumerate(self.members)} self.size = len(self.members) self.supremum = self.fromint(2**self.size - 1) self.infimum = self.fromint(0) self.hashkey = hash(self.members) def asint(self, elem): return 1 << self.map[elem] def fromint(self, n): return BitMembers.fromint(self, n) def frommembers(self, it=()): return BitMembers.frommembers(self, it) __call__ = frommembers class BitMembers: __slots__ = ("i", "bitset") @classmethod def fromint(cls, bitset, n): self = object.__new__(cls) self.bitset = bitset self.i = n return self @classmethod def frommembers(cls, bitset, it=()): self = object.__new__(cls) self.bitset = bitset self.i = reduce(or_, map(self.bitset.asint, it), 0) return self def __int__(self): return self.i __hash__ = __int__ def __eq__(self, other): return (self.i == other.i) and ( self.bitset.hashkey == other.bitset.hashkey ) def __len__(self): return f"{self.i:b}".count("1") def __iter__(self): return ( x for b, x in zip(bin(self.i)[:1:-1], self.bitset.members) if b == "1" ) def add(self, elem): self.i |= self.bitset.asint(elem) def clear(self): self.i = 0 def copy(self): return self.bitset.fromint(self.i) def __bool__(self): return self.i != 0 def __contains__(self, elem): return self.i & self.bitset.asint(elem) def discard(self, elem): self.i &= self.bitset.supremum.i - self.bitset.asint(elem) def remove(self, elem): if elem not in self: raise KeyError self.discard(elem) def difference_update(self, *others): for other in others: self.i &= ~other.i __isub__ = difference_update def difference(self, *others): bm = self.copy() bm.difference_update(*others) return bm __sub__ = difference def intersection_update(self, *others): for other in others: self.i &= other.i __iand__ = intersection_update def intersection(self, *others): bm = self.copy() bm.intersection_update(*others) return bm __and__ = intersection def isdisjoint(self, other): return not self.i & other.i def issubset(self, other): return self.i & other.i == self.i def issuperset(self, other): return self.i | other.i == self.i def symmetric_difference_update(self, other): self.i ^= other.i __ixor__ = symmetric_difference_update def symmetric_difference(self, other): return self.bitset.fromint(self.i ^ other.i) __xor__ = symmetric_difference def update(self, *others): self.i = reduce(or_, (o.i for o in others), self.i) __ior__ = update def union(self, *others): return self.bitset.fromint(reduce(or_, (o.i for o in others), self.i)) __or__ = union def __repr__(self): return f"" class DiskDict: """A simple persistent dict. The keys should be filesystem compatible strings, or tuples of strings, in which case it will be used as a sub-directory structure. The values should be picklable. The directory will be created if it does not exist. Values are loaded into memory once they are accessed. Parameters ---------- directory : str or pathlib.Path, optional The directory to store the files in. If None, the files will not be stored on disk and only kept in memory. max_retries : int, optional The maximum number of retries to read a file if it is not completely written yet. Default is 3. retry_delay : float, optional The delay between retries in seconds. Default is 0.01. """ __slots__ = ( "_directory", "_mem_cache", "_path", "max_retries", "retry_delay", ) def __init__(self, directory=None, max_retries=3, retry_delay=0.01): self._mem_cache = {} self._directory = directory if directory is not None: self._path = pathlib.Path(directory) self._path.mkdir(parents=True, exist_ok=True) else: self._path = None self.max_retries = int(max_retries) self.retry_delay = float(retry_delay) def clear(self): """Clear the memory cache and delete all value files, but leave directory structure.""" self._mem_cache.clear() if self._directory is not None: for p in self._path.glob("**/*"): if p.is_file(): p.unlink() def cleanup(self, delete_dir=False): """Delete all files and subdirectories and optionally delete the root directory.""" self.clear() if delete_dir and (self._directory is not None): for p in self._path.glob("**/*"): if p.is_dir(): p.rmdir() self._path.rmdir() def __contains__(self, k): if k in self._mem_cache: return True if self._directory is None: return False if not isinstance(k, tuple): k = (k,) return self._path.joinpath(*k).exists() def __setitem__(self, k, v): self._mem_cache[k] = v if self._directory is not None: if not isinstance(k, tuple): # treat all as nested key k = (k,) fname = self._path.joinpath(*k) if len(k) > 1: # ensure subparent directories exist fname.parent.mkdir(parents=True, exist_ok=True) # write file! with open(fname, "wb+") as f: pickle.dump(v, f) def __delitem__(self, k): found = False # delete from memory cache if k in self._mem_cache: del self._mem_cache[k] found = True # possibly delete from disk if self._directory is not None: if not isinstance(k, tuple): k = (k,) if self._path.joinpath(*k).exists(): self._path.joinpath(*k).unlink() found = True if not found: raise KeyError(k) def __getitem__(self, k): try: return self._mem_cache[k] except KeyError as e: if self._directory is None: # cache is in-memory only raise e if not isinstance(k, tuple): # treat all as nested key k = (k,) fname = self._path.joinpath(*k) if not fname.exists(): # file does not exist on disk raise e for _ in range(self.max_retries): try: with open(fname, "rb") as f: self._mem_cache[k] = v = pickle.load(f) return v except (EOFError, pickle.UnpicklingError) as e: # file was not written completely yet # e.g. by another process import time time.sleep(self.retry_delay) # file exists but there is some other error after retrying raise e def get(self, k, default=None): try: return self[k] except KeyError: return default def keys(self): if self._directory is None: return self._mem_cache.keys() else: disk_keys = [] for p in self._path.rglob("*"): if p.is_file(): rel = p.relative_to(self._path) if len(rel.parents) == 1: # direct child of root path disk_keys.append(rel.name) else: disk_keys.append(tuple(rel.parts)) return disk_keys def values(self): for k in self.keys(): yield self[k] def items(self): for k in self.keys(): yield (k, self[k]) def get_rng(seed=None): """Get a source of random numbers. Parameters ---------- seed : None or int or random.Random, optional The seed for the random number generator. If None, use the default random number generator. If an integer, use a new random number generator with the given seed. If a random.Random instance, use that instance. """ if seed is None: # use the default random number generator return random elif isinstance(seed, random.Random) or (seed is random): # use the given random number generator return seed else: # use a new random number generator with the given seed return random.Random(seed) class GumbelBatchedGenerator: """Non numpy version of gumbel number generator.""" def __init__(self, seed=None): self.rng = get_rng(seed) def __call__(self): return -math.log(-math.log(self.rng.random())) class BadTrial(Exception): """Use this to indicate that a trial contraction tree was bad.""" pass # ---------------------- test equations and utilities ----------------------- # def compute_size_by_dict(indices, size_dict): """Computes the product of sizes of ``indices`` based on ``size_dict``. Parameters ---------- indices : iterable[str] or iterable[int] The indices of the term. size_dict : dict or list Mapping (or list/tuple if the indices are indexing integers, which can be slightly faster) of indices to sizes. Returns ------- d : int The resulting product. Examples -------- >>> compute_size_by_dict('abbc', {'a': 2, 'b':3, 'c':5}) 90 """ d = 1 for i in indices: d *= size_dict[i] return d _einsum_symbols_base = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" @lru_cache(2**14) def get_symbol(i): """Get the symbol corresponding to int ``i`` - runs through the usual 52 letters before resorting to unicode characters, starting at ``chr(192)`` and skipping surrogates. Examples -------- get_symbol(2) #> 'c' get_symbol(200) #> 'Ŕ' get_symbol(20000) #> '京' """ if i < 52: # use a-z, A-Z first return _einsum_symbols_base[i] # then proceed from 'À' i += 140 if i >= 55296: # Skip chr(57343) - chr(55296) as surrogates i += 2048 return chr(i) def get_symbol_map(inputs): """Get a mapping of arbitrary hashable 'indices' to single unicode symbols, matching the canonicalization of the expression. """ symbol_map = {} c = 0 for term in inputs: for ind in term: if ind not in symbol_map: if ind is ...: symbol_map[ind] = "..." else: symbol_map[ind] = get_symbol(c) c += 1 return symbol_map Contraction = collections.namedtuple( "Contraction", ("inputs", "output", "shapes", "size_dict") ) def rand_equation( n, reg, n_out=0, n_hyper_in=0, n_hyper_out=0, d_min=2, d_max=3, seed=None ): """A more advanced version of ``opt_einsum.testing.rand_equation`` that can also generate both inner and outer hyper-edges. Mostly useful for generating test instances covering all edge cases. Parameters ---------- n : int The number of tensors. reg : int The average number of indices per tensor if no hyper-edges, i.e. total number of inds ``= n * reg // 2``. n_out : int, optional The number of output indices. n_hyper_in : int, optional The number of inner hyper-indices. n_hyper_out : int, optional The number of outer hyper-indices. d_min : int, optional The minimum dimension size. d_max : int, optional The maximum dimension size. seed : None or int, optional Seed for ``np.random`` for repeatibility. Returns ------- inputs : list[list[str]] output : list[str] shapes : list[tuple[int]] size_dict : dict[str, int] """ rng = get_rng(seed) num_inds = max((n * reg) // 2, n_hyper_out + n_hyper_in + n_out) size_dict = { get_symbol(i): rng.randint(d_min, d_max) for i in range(num_inds) } inds = iter(size_dict) positions = list(range(n)) inputs = [[] for _ in range(n)] output = [] for _ in range(n_hyper_out): ind = next(inds) output.append(ind) s = rng.randint(3, n) where = rng.sample(positions, s) for i in where: inputs[i].append(ind) for _ in range(n_hyper_in): ind = next(inds) s = rng.randint(3, n) where = rng.sample(positions, s) for i in where: inputs[i].append(ind) for _ in range(n_out): ind = next(inds) output.append(ind) where = rng.sample(positions, 1) for i in where: inputs[i].append(ind) for ind in inds: where = rng.sample(positions, 2) for i in where: inputs[i].append(ind) shapes = [tuple(size_dict[ix] for ix in term) for term in inputs] rng.shuffle(output) return Contraction(inputs, output, shapes, size_dict) def tree_equation( n, d_min=2, d_max=3, n_outer=0, seed=None, ): """Create a random contraction equation that corresponds to a tree. Parameters ---------- n : int The number of tensors. d_min : int, optional The minimum size of an index. d_max : int, optional The maximum size of an index. n_outer : int, optional The number of outer indices. """ rng = get_rng(seed) inputs = [[]] size_dict = {} for i in range(1, n): ix = get_symbol(i - 1) size_dict[ix] = rng.randint(d_min, d_max) ci = rng.randint(0, len(inputs) - 1) inputs[ci].append(ix) inputs.append([ix]) output = rng.sample(list(size_dict), n_outer) shapes = [tuple(size_dict[ix] for ix in term) for term in inputs] return Contraction(inputs, output, shapes, size_dict) def networkx_graph_to_equation( G, d_min=2, d_max=3, seed=None, ): """Turn a networkx graph into a `cotengra` style contraction, randomly sampling index sizes for each edge. Parameters ---------- G : nx.Graph The graph to convert. d_min : int, optional The minimum size of an index. d_max : int, optional The maximum size of an index. seed : None, int or np.random.Generator, optional Seed for repeatibility. Returns ------- inputs : list[list[str]] output : list[str] shapes : list[tuple[int]] size_dict : dict[str, int] """ inputs = [[] for _ in range(len(G.nodes))] for i, (na, nb) in enumerate(G.edges): ix = get_symbol(i) inputs[na].append(ix) inputs[nb].append(ix) rng = get_rng(seed) size_dict = { get_symbol(i): rng.randint(d_min, d_max) for i in range(len(G.edges)) } output = [] shapes = [tuple(size_dict[ix] for ix in term) for term in inputs] return Contraction(inputs, output, shapes, size_dict) def randreg_equation( n, reg, d_min=2, d_max=3, seed=None, ): """Create a random contraction equation that corresponds to a random regular graph. Parameters ---------- n : int The number of terms. reg : int The degree of the graph. d_min : int, optional The minimum size of an index. d_max : int, optional The maximum size of an index. seed : None or int, optional Seed for ``networkx`` and ``np.random.default_rng`` for repeatibility. Returns ------- inputs : list[list[str]] output : list[str] shapes : list[tuple[int]] size_dict : dict[str, int] """ import networkx as nx G = nx.random_regular_graph(reg, n, seed=seed) return networkx_graph_to_equation(G, d_min=d_min, d_max=d_max, seed=seed) def perverse_equation( n, num_indices=3, min_rank=0, max_rank=6, d_min=2, d_max=3, n_outer=2, seed=None, ): """Create a weird but valid einsum equation with lots of hyper-edges, repeated indices, scalars and repeated terms. Parameters ---------- n : int The number of tensors. num_indices : int, optional The number of indices to use. min_rank : int, optional The minimum rank of a tensor. max_rank : int, optional The maximum rank of a tensor. d_min : int, optional The minimum size of an index. d_max : int, optional The maximum size of an index. n_outer : int, optional The number of outer indices. seed : None or int, optional Seed for ``random.Random`` for repeatibility. """ rng = get_rng(seed) indices = [get_symbol(i) for i in range(num_indices)] size_dict = {ix: rng.randint(d_min, d_max) for ix in indices} inputs = [] shapes = [] for _ in range(n): K = rng.randint(min_rank, max_rank) term = [rng.choice(indices) for _ in range(K)] inputs.append(term) shapes.append(tuple(size_dict[ix] for ix in term)) # can't have more outputs than indices n_outer = min(n_outer, num_indices) output = rng.sample(indices, n_outer) return Contraction(inputs, output, shapes, size_dict) def rand_tree( n, reg, n_out=0, n_hyper_in=0, n_hyper_out=0, d_min=2, d_max=3, seed=None, optimize="greedy", ): """Get a random contraction tree (note, not a tree like equation).""" from .interface import array_contract_tree con = rand_equation( n, reg, n_out=n_out, n_hyper_in=n_hyper_in, n_hyper_out=n_hyper_out, d_min=d_min, d_max=d_max, seed=seed, ) tree = array_contract_tree( con.inputs, con.output, con.size_dict, optimize=optimize ) return tree def lattice_equation(dims, cyclic=False, d_min=2, d_max=None, seed=None): """Create a random contraction equation that corresponds to a lattice. Parameters ---------- dims : sequence of int The size of each dimension, with the dimensionality being the length of the sequence. cyclic : bool or sequence of bool, optional Whether each dimension is cyclic or not. If a sequence, must be the same length as ``dims``. d_min : int, optional The minimum size of an index. d_max : int, optional The maximum size of an index. If ``None``, defaults to ``d_min``, i.e. all indices are the same size. seed : None or int, optional Seed for ``random.Random`` for repeatibility. """ if d_max is None: d_max = d_min ndim = len(dims) try: cyclics = tuple(cyclic) except TypeError: cyclics = (cyclic,) * ndim symbol_map = collections.defaultdict( map(get_symbol, itertools.count()).__next__ ) inputs = [] for coo_a in itertools.product(*(range(n) for n in dims)): term = [] for s in range(ndim): for step in (-1, +1): coo_b = list(coo_a) coo_b[s] += step if cyclics[s]: # wrap-around coo_b[s] %= dims[s] elif coo_b[s] < 0 or coo_b[s] >= dims[s]: continue coo_b = tuple(coo_b) edge = (coo_a, coo_b) if (coo_a < coo_b) else (coo_b, coo_a) ix = symbol_map[edge] term.append(ix) inputs.append(term) output = [] rng = get_rng(seed) size_dict = { # avoid overflow issues by converting back to python int ix: int(rng.randint(d_min, d_max)) for ix in symbol_map.values() } shapes = tuple(tuple(size_dict[ix] for ix in term) for term in inputs) return Contraction(inputs, output, shapes, size_dict) def find_output_str(lhs): """Compute the output string from the left-hand side only of an equation. This is any indices that appear only once in the left-hand side, in sorted order. Parameters ---------- lhs : str The comma separated list of indices on the left-hand side of an einsum equation. Returns ------- rhs : str The output string of the einsum equation. Examples -------- >>> find_output_str('cb,ba') 'ac' """ tmp_lhs = lhs.replace(",", "") return "".join(s for s in sorted(set(tmp_lhs)) if tmp_lhs.count(s) == 1) def eq_to_inputs_output(eq): """Convert a einsum equation into an explicit list of list of characters and an output list of characters. Parameters ---------- eq : str The einsum equation, with or without output. Returns ------- inputs : list[list[str]] The input terms. output : list[str] The output term. """ lhs, *rhs = eq.split("->") inputs = tuple(map(tuple, lhs.split(","))) if rhs: output = tuple(rhs[0]) else: output = tuple(find_output_str(lhs)) return inputs, output def inputs_output_to_eq(inputs, output, canonicalize=False): """Convert an explicit list of inputs and output to a str einsum equation. Parameters ---------- inputs : list[list[str]] The input terms. output : list[str] The output term. canonicalize : bool, optional Whether to canonicalize (map into [a-zA-Z]) equation, by default False. Returns ------- eq : str The einsum equation. """ if canonicalize: ind_map = collections.defaultdict( map(get_symbol, itertools.count()).__next__ ) inputs = (map(ind_map.__getitem__, term) for term in inputs) output = tuple(map(ind_map.__getitem__, output)) return f"{','.join(map(''.join, inputs))}->{''.join(output)}" def shapes_inputs_to_size_dict(shapes, inputs): """Convert a list of shapes and inputs to a size dictionary. Parameters ---------- shapes : list[tuple[int]] The shapes of each input. inputs : list[list[str]] The input terms. Returns ------- size_dict : dict[str, int] The index size dictionary. """ return { ix: d for ix, d in zip( itertools.chain.from_iterable(inputs), itertools.chain.from_iterable(shapes), ) } def make_rand_size_dict_from_inputs(inputs, d_min=2, d_max=3, seed=None): """Get a random size dictionary for a given set of inputs. Parameters ---------- inputs : list[list[str]] The input terms. d_min : int, optional The minimum dimension, by default 2. d_max : int, optional The maximum dimension, by default 3. seed : int, optional The random seed, by default None. Returns ------- size_dict : dict[str, int] The index size dictionary. """ rng = get_rng(seed) size_dict = {} for term in inputs: for ix in term: if ix not in size_dict: size_dict[ix] = rng.randint(d_min, d_max) return size_dict def make_shapes_from_inputs(inputs, size_dict): """Make example shapes to match inputs and index sizes. Parameters ---------- inputs : list[list[str]] The input terms. size_dict : dict[str, int] The index size dictionary. Returns ------- shapes : list[tuple[int]] The example shapes. """ return [tuple(size_dict[ix] for ix in term) for term in inputs] def make_arrays_from_inputs(inputs, size_dict, seed=None, dtype="float64"): """Make example arrays to match inputs and index sizes. Parameters ---------- inputs : list[list[str]] The input terms. size_dict : dict[str, int] The index size dictionary. seed : int, optional The random seed, by default None. dtype : {'float32', 'float64', 'complex64', 'complex128'}, optional The dtype of the arrays, by default 'float64'. Returns ------- arrays : list[numpy.ndarray] The example arrays. """ import numpy as np shapes = make_shapes_from_inputs(inputs, size_dict) rng = np.random.default_rng(seed) arrays = [] for shape in shapes: array = rng.normal(size=shape) if dtype == "float32": array = array.astype(np.float32) elif dtype == "complex64": array = (array + 1j * rng.normal(size=shape)).astype(np.complex64) elif dtype == "complex128": array = array + 1j * rng.normal(size=shape) elif dtype != "float64": raise ValueError(f"unsupported dtype {dtype}") array /= np.linalg.norm(array) arrays.append(array) return arrays def make_arrays_from_eq( eq, d_min=2, d_max=3, seed=None, size_dict=None, dtype="float64", ): """Create a set of example arrays to match an einsum equation directly. Parameters ---------- eq : str The einsum equation. d_min : int, optional The minimum dimension, by default 2. d_max : int, optional The maximum dimension, by default 3. seed : int, optional The random seed, by default None. size_dict : dict[str, int], optional The index size dictionary. If supplied this is used instead of generating a random one. dtype : {'float32', 'float64', 'complex64', 'complex128'}, optional The dtype of the arrays, by default 'float64'. Returns ------- arrays : list[numpy.ndarray] The example arrays. """ inputs, _ = eq_to_inputs_output(eq) if size_dict is None: size_dict = make_rand_size_dict_from_inputs( inputs, d_min=d_min, d_max=d_max, seed=seed ) return make_arrays_from_inputs(inputs, size_dict, seed=seed, dtype=dtype) def find_output_from_inputs(inputs): """Find the output indices for a given set of inputs. The outputs are calculated as the set of indices that appear only once, in the order they appear in the inputs. This is different to `einsum` where they in sorted order since we only require the indices to be hashable. Parameters ---------- inputs : Sequence[Sequence[Hashable]] The input terms. Returns ------- output : tuple[Hashable] """ # need to compute output appeared = set() once = {} for term in inputs: for ind in term: if ind in appeared: # appeared more than once once.pop(ind, None) else: # first appearance once[ind] = None appeared.add(ind) # dict insertion order is same as appearance order return tuple(once) def is_edge_path(optimize): """Check if the optimize path is a list of indices or a single string.""" return ( isinstance(optimize, (list, tuple)) and optimize and isinstance(optimize[0], (int, str)) ) def canonicalize_inputs( inputs, output=None, shapes=None, size_dict=None, optimize=None, ): """Return a canonicalized version of the inputs and output, with the indices labelled from 'a', 'b', 'c', ... according to the order they appear in the equation. If ``output`` is not provided, it will be computed as the set of indices that appear once, in the order they appear on the inputs (note that this is different to `einsum` where they in sorted order since we only require the indices to be hashable and not comparable). If either ``shapes`` or ``size_dict`` is provided, then also compute the corresponding canonicalized ``size_dict`` for new index labels. Parameters ---------- inputs : Sequence[Sequence[Hashable]] The input terms. output : Sequence[Hashable], optional The output term. If not supplied it will be computed. shapes : None or Sequence[tuple[int]], optional The shapes of each input. size_dict : None or dict[Hashable, int], optional The index size dictionary. Returns ------- new_inputs : tuple[tuple[str]] The canonicalized input terms. new_output : tuple[str] The canonicalized output term. new_size_dict : dict[str, int] or None The canonicalized index size dictionary, ``None`` if ``size_dict`` or ``shapes`` was not provided. new_optimize : None or str or Sequence[str] or Sequence[int], optional The canonicalized optimize path, ``None`` if ``optimize`` was not provided. """ if isinstance(optimize, str) and optimize in ("edgesort", "ncon"): # we'll need the new indices to have the same sorted order as # the supplied indices, not sorted by first appearance sorted_inds = sorted({ix for term in inputs for ix in term}) ind_map = {ix: get_symbol(i) for i, ix in enumerate(sorted_inds)} else: # we can just populate as the indices appear ind_map = collections.defaultdict( map(get_symbol, itertools.count()).__next__ ) new_inputs = tuple(tuple(ind_map[ind] for ind in term) for term in inputs) if output is not None: new_output = tuple(ind_map[ind] for ind in output) else: new_output = find_output_from_inputs(new_inputs) if size_dict is not None: new_size_dict = {ind_map[ind]: d for ind, d in size_dict.items()} elif shapes is not None: new_size_dict = { ix: d for term, shape in zip(new_inputs, shapes) for ix, d in zip(term, shape) } else: new_size_dict = None if optimize is not None: if is_edge_path(optimize): # edge path, need to update index names new_optimize = tuple(ind_map[ind] for ind in optimize) else: new_optimize = optimize else: new_optimize = None return new_inputs, new_output, new_size_dict, new_optimize def convert_from_interleaved(args): """Convert from interleaved format ``array0, input0, array1, input1, ...`` to a single equation and list of arrays. The arrays can just be shapes. """ nargs = len(args) arrays = [] inputs = [] for i in range(0, nargs // 2): arrays.append(args[2 * i]) inputs.append(args[2 * i + 1]) symbol_map = get_symbol_map(inputs) eq = ",".join("".join(symbol_map[ix] for ix in term) for term in inputs) if nargs % 2 == 1: # has output specified eq += f"->{''.join(symbol_map[ix] for ix in args[-1])}" return eq, arrays def check_ellipsis(term): """Check if a einsum term has exactly one ellipsis ('...') or else no dots at all. """ num_dots = term.count(".") if num_dots == 0: # no dots, no ellipsis return False elif num_dots == 3: has_ellipsis = "..." in term if has_ellipsis: # has 1 full ellipsis return True else: # has 3 dots but not consecutive raise ValueError(f"Term is invalid: {term!r}") else: # not 0 or 3 dots raise ValueError(f"Term is invalid: {term!r}") @functools.lru_cache(2**14) def parse_equation_ellipses(eq, shapes, tuples=False): """ """ lhs, *rhs = eq.split("->") inputs = lhs.split(",") if len(inputs) != len(shapes): raise ValueError( f"Number of inputs ({len(inputs)}) does not " f"match number of shapes ({len(shapes)})." ) if "." in lhs: # need to handle ellipsis expansions replacements = {} used = set() for i, term in enumerate(inputs): used.update(term) if check_ellipsis(term): # how many indices needed to be expanded on this term replacements[i] = len(shapes[i]) - (len(term) - 3) # how many indices we need to expand all the ellipses req_ellipsis_inds = max(replacements.values()) # get symbols for ellipses c = 0 ellipses_inds = [] while len(ellipses_inds) < req_ellipsis_inds: ix = get_symbol(c) if ix not in used: ellipses_inds.append(ix) c += 1 # make replacements for i, ne in replacements.items(): inputs[i] = inputs[i].replace( "...", "".join(ellipses_inds[req_ellipsis_inds - ne :]) ) # check for output out_ellipses_indices = "".join(ellipses_inds) if rhs: output = rhs[0] if check_ellipsis(output): output = output.replace("...", out_ellipses_indices) else: # ellipsis dimension have to be leftmost in output # so we cannot leave to the default sort order output = out_ellipses_indices + find_output_str(lhs) else: # no ellipsis, just check for output if rhs: output = rhs[0] else: output = find_output_str(lhs) if tuples: return tuple(map(tuple, inputs)), tuple(output) return ",".join(inputs), output def parse_einsum_input(args, shapes=False, tuples=False, constants=None): """Reproduce einsum input parsing, which handles both interleaved input, ellipsis expansions, and output calculation. The main processing is cached. Parameters ---------- args : tuple The arguments to ``einsum``. shapes : bool, optional Whether arrays are being supplied (``False``) or shapes (``True``). tuples : bool, optional Whether to return parsed indices as strings or tuples. """ if not isinstance(args[0], str): # convert from interleaved eq, arrays = convert_from_interleaved(args) else: eq, *arrays = args # prepare shapes for caching if shapes: if constants is not None: # need to resolve constants arrays to their shape _shapes = tuple( ar.shape(s) if i in constants else s for i, s in enumerate(arrays) ) else: _shapes = arrays if not isinstance(next((d for s in _shapes for d in s), 1), int): # first check any dimension to see if python int _shapes = tuple(tuple(int(d) for d in s) for s in _shapes) elif not isinstance(_shapes[0], tuple): # then check if individual shapes not supplied as tuples _shapes = tuple(tuple(s) for s in _shapes) else: # otherwise just need to convert list to tuple _shapes = tuple(_shapes) else: _shapes = tuple(map(ar.shape, arrays)) # handle ellipsis expansions and compute output inputs, output = parse_equation_ellipses(eq, _shapes, tuples=tuples) return (inputs, output, arrays) def save_to_json(inputs, output, size_dict, filename): """Save a contraction to a json file. Parameters ---------- inputs : list[list[str]] The input terms. output : list[str] The output term. size_dict : dict[str, int] The index size dictionary. filename : str The filename to save to. """ import json data = { "inputs": tuple(map(tuple, inputs)), "output": tuple(output), "size_dict": size_dict, } with open(filename, "w", encoding="utf-8") as f: json.dump(data, f, ensure_ascii=False, indent=2) def load_from_json(filename): """Load a contraction from a json file. Parameters ---------- filename : str The filename to load from. Returns ------- inputs : list[list[str]] The input terms. output : list[str] The output term. size_dict : dict[str, int] The index size dictionary. """ import json with open(filename, "r", encoding="utf-8") as f: data = json.load(f) return (data["inputs"], data["output"], data["size_dict"]) ================================================ FILE: docs/Makefile ================================================ # Minimal makefile for Sphinx documentation # # You can set these variables from the command line, and also # from the environment for the first two. SPHINXOPTS ?= SPHINXBUILD ?= sphinx-build SOURCEDIR = . BUILDDIR = _build # Put it first so that "make" without argument is like "make help". help: @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) .PHONY: help Makefile # Catch-all target: route all unknown targets to Sphinx using the new # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). %: Makefile @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) ================================================ FILE: docs/_pygments/_pygments_dark.py ================================================ # -*- coding: utf-8 -*- """ Pygments version of the sublime Mariana theme. Pygments template by Jan T. Sott (https://github.com/idleberg) """ from pygments.style import Style from pygments.token import ( Comment, Error, Generic, Keyword, Literal, Name, Number, Operator, Other, Punctuation, String, Text, Whitespace, ) BACKGROUND = "#1a1c1e" CURRENT_LINE = "#4e5a65" SELECTION = "#343d46" FOREGROUND = "#d8dee9" COMMENT = "#5a6272" RED = "#ec5f66" ORANGE = "#f9ae58" YELLOW = "#fac761" GREEN = "#99c794" AQUA = "#70c2bb" BLUE = "#6699cc" PURPLE = "#c695c6" class MarianaDark(Style): default_style = "" background_color = BACKGROUND highlight_color = SELECTION background_color = BACKGROUND highlight_color = SELECTION styles = { # No corresponding class for the following: Text: FOREGROUND, # class: '' Whitespace: "", # class: 'w' Error: RED, # class: 'err' Other: "", # class 'x' Comment: COMMENT, # class: 'c' Comment.Multiline: "", # class: 'cm' Comment.Preproc: "", # class: 'cp' Comment.Single: "", # class: 'c1' Comment.Special: "", # class: 'cs' Keyword: PURPLE, # class: 'k' Keyword.Constant: RED, # class: 'kc' Keyword.Declaration: "", # class: 'kd' Keyword.Namespace: PURPLE, # class: 'kn' Keyword.Pseudo: RED, # class: 'kp' Keyword.Reserved: "", # class: 'kr' Keyword.Type: YELLOW, # class: 'kt' Operator: RED, # class: 'o' Operator.Word: "", # class: 'ow' - like keywords Punctuation: AQUA, # class: 'p' Name: FOREGROUND, # class: 'n' Name.Attribute: BLUE, # class: 'na' - to be revised Name.Builtin: BLUE, # class: 'nb' Name.Builtin.Pseudo: RED, # class: 'bp' Name.Class: ORANGE, # class: 'nc' - to be revised Name.Constant: RED, # class: 'no' - to be revised Name.Decorator: AQUA, # class: 'nd' - to be revised Name.Entity: BLUE, # class: 'ni' Name.Exception: RED, # class: 'ne' Name.Function: AQUA, # class: 'nf' Name.Function.Magic: BLUE, # class: 'nf' Name.Property: BLUE, # class: 'py' Name.Label: BLUE, # class: 'nl' Name.Namespace: BLUE, # class: 'nn' - to be revised Name.Other: BLUE, # class: 'nx' Name.Tag: AQUA, # class: 'nt' - like a keyword Name.Variable: RED, # class: 'nv' - to be revised Name.Variable.Class: "", # class: 'vc' - to be revised Name.Variable.Global: "", # class: 'vg' - to be revised Name.Variable.Instance: "", # class: 'vi' - to be revised Number: ORANGE, # class: 'm' Number.Float: "", # class: 'mf' Number.Hex: "", # class: 'mh' Number.Integer: "", # class: 'mi' Number.Integer.Long: "", # class: 'il' Number.Oct: "", # class: 'mo' Literal: ORANGE, # class: 'l' Literal.Date: GREEN, # class: 'ld' String: GREEN, # class: 's' String.Backtick: "", # class: 'sb' String.Char: FOREGROUND, # class: 'sc' String.Doc: COMMENT, # class: 'sd' - like a comment String.Double: "", # class: 's2' String.Escape: ORANGE, # class: 'se' String.Heredoc: "", # class: 'sh' String.Interpol: ORANGE, # class: 'si' String.Other: "", # class: 'sx' String.Regex: "", # class: 'sr' String.Single: "", # class: 's1' String.Symbol: "", # class: 'ss' Generic: "", # class: 'g' Generic.Deleted: RED, # class: 'gd', Generic.Emph: "italic", # class: 'ge' Generic.Error: "", # class: 'gr' Generic.Heading: "bold " + FOREGROUND, # class: 'gh' Generic.Inserted: GREEN, # class: 'gi' Generic.Output: "", # class: 'go' Generic.Prompt: "bold " + COMMENT, # class: 'gp' Generic.Strong: "bold", # class: 'gs' Generic.Subheading: "bold " + AQUA, # class: 'gu' Generic.Traceback: "", # class: 'gt' } ================================================ FILE: docs/_pygments/_pygments_light.py ================================================ # -*- coding: utf-8 -*- """ Pygments (light) version of the sublime Mariana theme. Pygments template by Jan T. Sott (https://github.com/idleberg) """ from pygments.style import Style from pygments.token import ( Comment, Error, Generic, Keyword, Literal, Name, Number, Operator, Other, Punctuation, String, Text, Whitespace, ) BACKGROUND = "#f8f9fb" CURRENT_LINE = "#b7c0c8" SELECTION = "#d0d6dc" FOREGROUND = "#161c27" COMMENT = "#8d95a5" RED = "#e7323b" ORANGE = "#f79626" YELLOW = "#f9b52f" GREEN = "#70b069" AQUA = "#3d8f88" BLUE = "#407fbf" PURPLE = "#b474b4" class MarianaLight(Style): default_style = "" background_color = BACKGROUND highlight_color = SELECTION background_color = BACKGROUND highlight_color = SELECTION styles = { # No corresponding class for the following: Text: FOREGROUND, # class: '' Whitespace: "", # class: 'w' Error: RED, # class: 'err' Other: "", # class 'x' Comment: COMMENT, # class: 'c' Comment.Multiline: "", # class: 'cm' Comment.Preproc: "", # class: 'cp' Comment.Single: "", # class: 'c1' Comment.Special: "", # class: 'cs' Keyword: PURPLE, # class: 'k' Keyword.Constant: RED, # class: 'kc' Keyword.Declaration: "", # class: 'kd' Keyword.Namespace: PURPLE, # class: 'kn' Keyword.Pseudo: RED, # class: 'kp' Keyword.Reserved: "", # class: 'kr' Keyword.Type: YELLOW, # class: 'kt' Operator: RED, # class: 'o' Operator.Word: "", # class: 'ow' - like keywords Punctuation: AQUA, # class: 'p' Name: FOREGROUND, # class: 'n' Name.Attribute: BLUE, # class: 'na' - to be revised Name.Builtin: BLUE, # class: 'nb' Name.Builtin.Pseudo: RED, # class: 'bp' Name.Class: ORANGE, # class: 'nc' - to be revised Name.Constant: RED, # class: 'no' - to be revised Name.Decorator: AQUA, # class: 'nd' - to be revised Name.Entity: BLUE, # class: 'ni' Name.Exception: RED, # class: 'ne' Name.Function: AQUA, # class: 'nf' Name.Function.Magic: BLUE, # class: 'nf' Name.Property: BLUE, # class: 'py' Name.Label: BLUE, # class: 'nl' Name.Namespace: BLUE, # class: 'nn' - to be revised Name.Other: BLUE, # class: 'nx' Name.Tag: AQUA, # class: 'nt' - like a keyword Name.Variable: RED, # class: 'nv' - to be revised Name.Variable.Class: "", # class: 'vc' - to be revised Name.Variable.Global: "", # class: 'vg' - to be revised Name.Variable.Instance: "", # class: 'vi' - to be revised Number: ORANGE, # class: 'm' Number.Float: "", # class: 'mf' Number.Hex: "", # class: 'mh' Number.Integer: "", # class: 'mi' Number.Integer.Long: "", # class: 'il' Number.Oct: "", # class: 'mo' Literal: ORANGE, # class: 'l' Literal.Date: GREEN, # class: 'ld' String: GREEN, # class: 's' String.Backtick: "", # class: 'sb' String.Char: FOREGROUND, # class: 'sc' String.Doc: COMMENT, # class: 'sd' - like a comment String.Double: "", # class: 's2' String.Escape: ORANGE, # class: 'se' String.Heredoc: "", # class: 'sh' String.Interpol: ORANGE, # class: 'si' String.Other: "", # class: 'sx' String.Regex: "", # class: 'sr' String.Single: "", # class: 's1' String.Symbol: "", # class: 'ss' Generic: "", # class: 'g' Generic.Deleted: RED, # class: 'gd', Generic.Emph: "italic", # class: 'ge' Generic.Error: "", # class: 'gr' Generic.Heading: "bold " + FOREGROUND, # class: 'gh' Generic.Inserted: GREEN, # class: 'gi' Generic.Output: "", # class: 'go' Generic.Prompt: "bold " + COMMENT, # class: 'gp' Generic.Strong: "bold", # class: 'gs' Generic.Subheading: "bold " + AQUA, # class: 'gu' Generic.Traceback: "", # class: 'gt' } ================================================ FILE: docs/_static/my-styles.css ================================================ @import url('https://fonts.googleapis.com/css2?family=Atkinson+Hyperlegible:ital,wght@0,400;0,700;1,400;1,700&family=Spline+Sans+Mono:ital,wght@0,300..700;1,300..700&display=swap'); h1 { font-size: 2.0rem; } h2 { font-size: 1.75rem; } h3 { font-size: 1.5rem; } .toctree-l2 { font-size: 0.85rem; } article { font-size: 0.9rem; } div.cell div.cell_input { padding-left: 0em; padding-right: 0em; border: 1px rgba(127, 127, 127, 0.1) solid; background-color: rgba(127, 127, 127, 0.1); border-left-color: hsl(126, 25%, 45%); border-left-width: medium; } .cell_output .output.text_plain, .cell_output .output.traceback, .cell_output .output.stream { border: 1px solid rgba(127, 127, 127, 0.0); background: rgba(127, 127, 127, 0.0); margin-top: 0em; margin-bottom: 0em; margin-left: 0.5em; box-shadow: none; } .cell_output .output.stderr { border: 1px solid rgba(127, 127, 127, 0.0); background: rgba(127, 127, 127, 0.0); margin-top: 0em; margin-bottom: 0em; margin-left: 0.25em; box-shadow: none; border-left-color: #cc7766; border-left-width: medium; } .cell_output { padding-left: 1em; padding-right: 0em; margin-top: 0em; } code.literal { color: #8db000; font-weight: 450; } ================================================ FILE: docs/advanced.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "id": "5642ace5-fcab-4ca8-a96c-dcd7b3d51eb2", "metadata": {}, "source": [ "# Advanced Config\n", "\n", "This page details the more advanced `HyperOptimizer` options.\n", "\n", "First it might be useful to sketch the underlying process for performing a\n", "contraction path search:\n", "\n", "1. A driver (such as `'greedy'` or `'kahypar'` ) along with a set of heuristic\n", "parameters (the 'hyper-parameters') are sampled from an 'optimizer'.\n", "2. These are used to build a single\n", "[`ContractionTree`](cotengra.core.ContractionTree)\n", "3. Optionally, some modification of this tree is then performed - either\n", "slicing, subtree reconfiguration, or some combination such as dynamic slicing\n", "4. A score is then generated for the tree, for example the contraction cost\n", "5. This score, the driver and hyper-parameters are fed back to the optimizer to\n", "update its search space\n", "6. The process is repeated, optionally in parallel, for a set number of repeats\n", "or time, with the best scoring tree being returned finally." ] }, { "cell_type": "code", "execution_count": 1, "id": "62de9546", "metadata": {}, "outputs": [], "source": [ "import cotengra as ctg" ] }, { "cell_type": "markdown", "id": "db15e9b3", "metadata": {}, "source": [ "## Drivers\n", "\n", "The following are valid initial methods to `HyperOptimizer`(`methods=[...])`,\n", "which will tune each one and ultimately select the best performer:\n", "\n", "* `'kahypar'` *(default)*\n", "* `'greedy'` *(default)*\n", "* `'labels'` (*default if `kahypar` not installed* ) - a pure python implementation of hypergraph community detection\n", "* [igraph](https://igraph.org/python/) **partition** based\n", " * `'spinglass'`\n", " * `'labelprop'`\n", "* [igraph](https://igraph.org/python/) **dendrogram** based (yield entire community structure tree at once)\n", " * `'betweenness'`\n", " * `'walktrap'`\n", "* **linegraph tree decomposition** based:\n", " * `'quickbb'`\n", " * `'flowcutter'`\n", "\n", "You can also register your own methods to add to the mix with\n", "[`register_hyper_function`](cotengra.hyper.register_hyper_function)." ] }, { "cell_type": "markdown", "id": "2e249b17", "metadata": {}, "source": [ "## Slicing and Subtree Reconfiguration\n", "\n", "There are three types of 'post-processing' of trees that the hyper optimizer\n", "can perform. For details of what each of these does, or how to perform them\n", "outside of the hyper optimization loop, see the 'Tree Surgery' sections:\n", "\n", "- [Index Slicing](trees.ipynb#index-slicing)\n", "- [Subtree Reconfiguration](trees.ipynb#subtree-reconfiguration)\n", "- [Dynamic Slicing](trees.ipynb#dynamic-slicing)\n", "\n", "\n", "### **Basic slicing** - ``slicing_opts``\n", "\n", "This removes indices from the contraction greedily one by one until the\n", "specified options are met, without changing the tree structure at all. This is cheap\n", "to perform but can incur significant 'slicing overhead' for complicated\n", "contractions. To turn it on supply a `dict` to `slicing_opts`, which will be\n", "supplied as kwargs to\n", "[`ContractionTree.slice`](cotengra.core.ContractionTree.slice)" ] }, { "cell_type": "code", "execution_count": 2, "id": "c01e30da", "metadata": {}, "outputs": [], "source": [ "opt = ctg.HyperOptimizer(slicing_opts={\"target_size\": 2**28})" ] }, { "cell_type": "markdown", "id": "f0d0418d", "metadata": {}, "source": [ "Or if we want paths with at least 1024 independent contractions we could use:" ] }, { "cell_type": "code", "execution_count": 3, "id": "4169e2b9", "metadata": {}, "outputs": [], "source": [ "opt = ctg.HyperOptimizer(slicing_opts={\"target_slices\": 2**10})" ] }, { "cell_type": "markdown", "id": "5554e226", "metadata": {}, "source": [ "Note that you need to work with the `ContractionTree` object rather than a raw\n", "path (i.e. call `opt.search` or `quimb.tensor.TensorNetwork.contraction_tree`)\n", "if you want to access the sliced indices or perform the sliced contraction\n", "(although a tree reconstructed from the raw path will be 'sliceable' in the\n", "sense that the indices will be easily refound)." ] }, { "cell_type": "markdown", "id": "43fb72ac", "metadata": {}, "source": [ "### **Dynamic slicing** - ``slicing_reconf_opts``\n", "\n", "This removes indices one by one, but also performs subtree reconfiguration\n", "between removals in order to modify the tree to take account of the slicing.\n", "Slower than basic slicing but can be much higher quality, especially when\n", "slicing many indices of a complicated contraction. This is turned on by\n", "supplying a `dict` to `slicing_reconf_opts`, which will be supplied as kwargs to\n", "[`ContractionTree.slice_and_reconfigure`](cotengra.core.ContractionTree.slice_and_reconfigure).\n", "If both basic and dynamic slicing are specified then the basic slicing is\n", "performed first." ] }, { "cell_type": "code", "execution_count": 4, "id": "b8c530c0", "metadata": {}, "outputs": [], "source": [ "opt = ctg.HyperOptimizer(slicing_reconf_opts={\"target_size\": 2**28})" ] }, { "cell_type": "markdown", "id": "ad800f22", "metadata": {}, "source": [ "### **Subtree reconfiguration** - ``reconf_opts``\n", "\n", "Finally, one can perform subtree reconfiguration alone - ranging over subtrees\n", "of the main tree optimally reconfiguring them locally to lower the target\n", "score globally. This is turned on by supplying a `dict` to `reconf_opts`, which\n", "will be supplied as kwargs to\n", "[`ContractionTree.subtree_reconfigure`](cotengra.core.ContractionTree.subtree_reconfigure).\n", "The 'reconfing' will be performed after any slicing." ] }, { "cell_type": "code", "execution_count": 5, "id": "16aac7e7", "metadata": {}, "outputs": [], "source": [ "opt = ctg.HyperOptimizer(reconf_opts={})" ] }, { "cell_type": "markdown", "id": "53358f24", "metadata": {}, "source": [ "Note you just supply an empty dict if you want to use the default options. Some\n", "parameters, such as the score function to minimize (see next section), will be\n", "set for you to match the global objective if not specified. You can supply\n", "`reconf_opts={'forested' :True, ...}` to use forested subtree reconfiguration.\n", "\n", "\n", "````{note}\n", "Note all three of these can be applied successively:\n", "\n", "```python\n", "opt = ctg.HyperOptimizer(\n", " slicing_opts={'target_size': 2**40}, # first do basic slicing\n", " slicing_reconf_opts={'target_size': 2**28}, # then advanced slicing with reconfiguring\n", " reconf_opts={'subtree_size': 14}, # then finally just higher quality reconfiguring\n", ")\n", "```\n", "\n", "````" ] }, { "cell_type": "markdown", "id": "9d18ad3e", "metadata": {}, "source": [ "## **Simulated Annealing** - ``simulated_annealing_opts``\n", "\n", "`cotengra` has an implementation of simulated annealing along the lines of\n", "[arXiv:2108.05665](https://arxiv.org/abs/2108.05665), the core function of which is\n", "[`simulated_anneal_tree`](cotengra.pathfinders.path_simulated_annealing.simulated_anneal_tree).\n", "\n", "You can turn this on by supplying a `dict` to `simulated_annealing_opts`, which\n", "will be supplied as kwargs to the above function:" ] }, { "cell_type": "code", "execution_count": 6, "id": "a01a27bd", "metadata": {}, "outputs": [], "source": [ "opt = ctg.HyperOptimizer(simulated_annealing_opts={})" ] }, { "cell_type": "markdown", "id": "7d88ed1d", "metadata": {}, "source": [ "There is support for slicing by supplying the `target_size` in this dict.\n", "The simulated anneal is performed *first-thing* after generating the initial\n", "tree, and can still be combined with any of the other processing steps above." ] }, { "cell_type": "markdown", "id": "26715165", "metadata": {}, "source": [ "## Objective\n", "\n", "What the optimizer (and subtree reconfiguration) considers the 'best' tree or\n", "objective function is set with the `minimize` kwarg.\n", "\n", "* `minimize='flops'` - minimize the total number of scalar operations,\n", "* `minimize='size'` - minimize the size of the largest intermediate tensor,\n", "\n", "```{hint}\n", "Generally to control the memory usage of a contraction it is better to use\n", "slicing rather than targetting the size directly.\n", "```\n", "\n", "* `minimize='write'` - minimize the total amount of 'memory written', i.e. the sum of sizes of all intermediate tensors. This targets memory speed, but is best weighted with the flops cost as well - see below. However this score is also relevant for automatic differentiating a contraction, where naively all intermediates must be kept.\n", "* `minimize='combo'` - minimize the sum of $FLOPS + \\alpha \\times WRITE$ using the default $\\alpha=64$\n", "* `minimize=f'combo-{alpha}'` - use a custom $\\alpha$ for the combo cost\n", "\n", "For real world contractions, where both clock speed\n", "and memory speed are important, using:" ] }, { "cell_type": "code", "execution_count": 7, "id": "f2e2b87d", "metadata": {}, "outputs": [], "source": [ "opt = ctg.HyperOptimizer(minimize=\"combo\")" ] }, { "cell_type": "markdown", "id": "7eae003a", "metadata": {}, "source": [ "should provide decent baseline performance for typical CPUs and GPUs." ] }, { "cell_type": "markdown", "id": "87cada32", "metadata": {}, "source": [ "## Optimization Library\n", "\n", "Optimizing the hyper parameters of the drivers which generate trees is done by\n", "one of many backend 'ask-and-tell' optimization libraries. The cost of asking\n", "for a new sample point and telling the resulting score should be much smaller\n", "than actually generating the trees themselves. However, for Gaussian process\n", "bayesian optimization, for example, the cost can become considerable once a few\n", "hundred trials have been fitted. As such, you may want to use a different\n", "library or algorithm. The main options are:\n", "\n", "* [optuna](https://github.com/optuna/optuna) - **Tree of Parzen Estimators** used by default, (high quality but only medium fast)\n", "* [cmaes](https://github.com/CyberAgentAILab/cmaes) - **CMAES** optimization algorithm, (v fast & suitable for highly parallel path findings)\n", "* [nevergrad](https://facebookresearch.github.io/nevergrad/) - various population and evolutionary algorithms (v fast & suitable for highly parallel path findings)\n", "* [skopt](https://scikit-optimize.github.io/stable/) - random forest as well as Gaussian process regressors (very high quality reference but very slow)" ] }, { "cell_type": "markdown", "id": "c245c67b", "metadata": {}, "source": [ "These are specified like:" ] }, { "cell_type": "code", "execution_count": 8, "id": "d0cbf52c", "metadata": {}, "outputs": [], "source": [ "opt = ctg.HyperOptimizer(optlib=\"cmaes\")" ] }, { "cell_type": "markdown", "id": "4694e2ad", "metadata": {}, "source": [ "To select which algorithm the optimizer uses supply the `sampler=` kwarg, other\n", "options to instantiate the optimizer are also passed in as kwargs.\n", "\n", "If you don't want to use optimization (either because no library is installed\n", "or for the least overhead), you can supply:" ] }, { "cell_type": "code", "execution_count": 9, "id": "f46ea569", "metadata": {}, "outputs": [], "source": [ "opt = ctg.HyperOptimizer(optlib=\"random\")" ] }, { "cell_type": "markdown", "id": "415ebc27", "metadata": {}, "source": [ "which will just randomly sample the space of hyper parameters." ] }, { "cell_type": "markdown", "id": "1e275f56", "metadata": {}, "source": [ "### Optimization Space" ] }, { "cell_type": "markdown", "id": "9fad99d2", "metadata": {}, "source": [ "You can view (and modify) the actual hyper parameter space of each driver with\n", "the following call:" ] }, { "cell_type": "code", "execution_count": 10, "id": "4783dffd", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'random_strength': {'type': 'FLOAT_EXP', 'min': 0.001, 'max': 1.0},\n", " 'temperature': {'type': 'FLOAT_EXP', 'min': 0.001, 'max': 1.0},\n", " 'costmod': {'type': 'FLOAT', 'min': 0.0, 'max': 50.0}}" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ctg.get_hyper_space()[\"greedy\"]" ] }, { "cell_type": "markdown", "id": "ed4f7864", "metadata": {}, "source": [ "## Parallelization\n", "\n", "`cotengra` can fairly naturally parallelize over the trials of the hyper\n", "optimization, and does so by default `HyperOptimizer(parallel='auto')`.\n", "The basic `parallel` options are:\n", "\n", "- `parallel=False` - no parallelization\n", "- `parallel=True` - alias for using default parallelization and number of workers\n", "- `parallel=X:int` - alias for using default parallelization but specify number of workers\n", "- `parallel=pool` - supply your own `concurrent.futures.ProcessPoolExecutor` compatible pool\n", "\n", "For non-distributed pools the default number of workers is computed, in order of preference, as:\n", "\n", "1. `COTENGRA_NUM_WORKERS` environment variable\n", "2. `OMP_NUM_THREADS` environment variable\n", "3. `os.cpu_count()`\n", "\n", "### `parallel='concurrent.futures'`\n", "\n", "The default parallelization is the python [standard library](https://docs.python.org/3/library/concurrent.futures.html).\n", "A cached `ProcessPoolExecutor` is used.\n", "\n", "### `parallel='loky'`\n", "\n", "Use the [`loky`](https://loky.readthedocs.io/) (also fallback to\n", "`joblib.externals.loky`) reusable pool.\n", "\n", "### `parallel='dask'`\n", "\n", "Use the [`dask`](https://dask.org/) distributed scheduler. If a `dask.distributed.Client`\n", "already exists then it will be used, otherwise a new one will be created. You can\n", "also supply a `dask.distributed.Client` object directly.\n", "\n", "### `parallel='ray'`\n", "\n", "Use the [`ray`](https://ray.readthedocs.io/) distributed scheduler, with\n", "potentially better performance than `dask`. A `ray` runtime will be created if\n", "not already running.\n", "\n", "\n", "### Others such as `mpi4py`\n", "\n", "Other libraries that conform to the `concurrent.futures` interface can be used,\n", "for example the [`mpi4py`](https://mpi4py.readthedocs.io/en/stable/) library.\n", "\n", "```{warning}\n", "There are two caveats to parallelization to consider:\n", "\n", "1. Since trials have to be pre dispatched, a delay is introduced between\n", " sampling and reporting trials to the underlying optimizer\n", "2. If the underlying optimizer cannot suggest trials quickly enough, or the pre\n", " dispatch is not large enough, workers can become idle.\n", "\n", "Consider using `optlib='cmaes'` or `optlib='random'` if you are optimizing\n", "with many tens or more workers to avoid being bottlenecked by the default Bayesian\n", "optimization for example.\n", "```\n", "\n", "### `parallel='threads'`\n", "\n", "You can specify a `ThreadPoolExecutor` for parallelization, but this is only\n", "useful tasks where the underlying driver releases the GIL, e.g.\n", "[`RandomGreedyOptimizer`](cotengra.pathfinders.path_basic.RandomGreedyOptimizer),\n", "with `accel=True`, where threads are used by default." ] }, { "cell_type": "markdown", "id": "78ac17b8", "metadata": {}, "source": [ "## Termination\n", "\n", "The [`HyperOptimizer`](cotengra.core.HyperOptimizer) can be terminated in\n", "several ways.\n", "\n", "- `max_repeats=X:int` - terminate after this many trees have been generated.\n", " The default of 128 is reasonable for simple to moderatetely complex\n", " contractions using a Bayesian optimizer.\n", "- `max_time=T` - terminate after `T` seconds have elapsed\n", "- `max_time=f'rate:{ops_per_second}'` - terminate once the time taken searching\n", " is greater than if the best contraction found so far was performed at the\n", " rate `ops_per_second`. This can be used to avoid spending a long time on\n", " cheap contractions. If the contraction will be performed many times, divide\n", " the rate by the commensurate factor. For example, if we have a CPU with very\n", " approximately a billion OPS/s but we expect to perform the contraction a\n", " hundred times we could use `max_time='rate:1e7'`.\n", "- `max_time='equil:{X:int}'` - terminate if no better contraction has been\n", " found in the last `X` trials. This can be used to avoid spending a long time\n", " on a contraction that is already converged.\n", "\n", "\n", "Note that the [`HyperOptimizer`](cotengra.core.HyperOptimizer) is stateful;\n", "each time it is supplied to the same contraction it will reset the above\n", "conditions and continue.\n", "\n", "```{hint}\n", "The [`ReusableHyperOptimizer`](cotengra.core.ReusableHyperOptimizer) on the\n", "other hand only runs once.\n", "```" ] }, { "cell_type": "markdown", "id": "e47a6e6f", "metadata": {}, "source": [ "## Large graphs - `RandomGreedyOptimizer`\n", "\n", "The `HyperOptimizer` can handle medium sizes of graph (up to 1000s of tensors), but the hyper-optimization and explicit `ContractionTree` construction of every trial can become slow for very large contractions. An alternative more suited to very lightweight path finding that can handle 10,000s of tensors is the [`RandomGreedyOptimizer`](cotengra.pathfinders.path_basic.RandomGreedyOptimizer). This only samples random greedy paths whilst simultaneously calculating each flops score, thus avoiding the heavier machinery of the hyper optimizer. Moreover, the core function [`optimize_random_greedy_track_flops`](cotengra.pathfinders.path_basic.optimize_random_greedy_track_flops) has an accelerated rust counterpart in [cotengrust](https://github.com/jcmgray/cotengrust), that is both faster and allows threaded parallelization." ] }, { "cell_type": "code", "execution_count": 11, "id": "7d2fe2ce", "metadata": {}, "outputs": [], "source": [ "inputs, output, _, size_dict = ctg.utils.lattice_equation([100, 100])\n", "\n", "opt = ctg.RandomGreedyOptimizer(\n", " max_repeats=32,\n", " temperature=(0.01, 0.1), # sample a range\n", " seed=42,\n", ")" ] }, { "cell_type": "markdown", "id": "39ecfb61", "metadata": {}, "source": [ "It has the same call methods as all `cotengra` optimizers:\n", "\n", "- `path = opt(inputs, output, size_dict)`: return the best contraction path\n", "- `ssa_path = opt.ssa_path(inputs, output, size_dict)`: return the best contraction path in SSA format\n", "- `tree = opt.search(inputs, output, size_dict)`: return the best `ContractionTree`\n", "\n", "The marginally cheapest of these is the SSA format:" ] }, { "cell_type": "code", "execution_count": 12, "id": "06d097cd", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPU times: user 3.21 s, sys: 58 ms, total: 3.26 s\n", "Wall time: 613 ms\n" ] } ], "source": [ "%%time\n", "ssa_path = opt.ssa_path(inputs, output, size_dict)" ] }, { "cell_type": "markdown", "id": "f0040ef5", "metadata": {}, "source": [ "Once the optimizer has been run, the corresponding flops (log10) can be retrieved with:" ] }, { "cell_type": "code", "execution_count": 13, "id": "395c2b80", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "65.02261352539062" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "opt.best_flops" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3" } }, "nbformat": 4, "nbformat_minor": 5 } ================================================ FILE: docs/basics.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "id": "9c8e1ba6-6b35-4dec-830e-686299698e2b", "metadata": {}, "source": [ "# Optimizer Basics" ] }, { "cell_type": "markdown", "id": "ebe10c20-484e-4299-bd2d-255724be621b", "metadata": {}, "source": [ "This page describes the basic ways to set up a contraction and an explicit optimizer and defines some common terms.\n", "The focus of `cotengra` is *exact contraction*. That is, taking a collection of tensors with indices described by a tensor network or einsum equation and then:\n", "\n", "1. finding the best sequence of pairwise contractions that reduces them to a single output tensor\n", "2. performing this contraction using a mix of `tensordot` and potentially `einsum` calls\n", "\n", "```{note}\n", "`cotengra` doesn't involve itself with building, modifying, simplifying or decomposing tensors and tensor networks etc.\n", "```\n", "\n", "The minimal information you need to describe such a contraction is:\n", "\n", "* the index labels for each tensor\n", "* the output index labels\n", "* the size of each index\n", "\n", "Here's a very small example of such information involving 4 tensors:" ] }, { "cell_type": "code", "execution_count": 1, "id": "bafad29a-5ba0-471a-a3e9-5e91847fe02c", "metadata": {}, "outputs": [], "source": [ "%config InlineBackend.figure_formats = ['svg']\n", "import cotengra as ctg\n", "\n", "inputs = [\n", " (\"a\", \"b\", \"x\"),\n", " (\"b\", \"c\", \"d\"),\n", " (\"c\", \"e\", \"y\"),\n", " (\"e\", \"a\", \"d\"),\n", "]\n", "\n", "output = (\"x\", \"y\")\n", "\n", "size_dict = {\"x\": 2, \"y\": 3, \"a\": 4, \"b\": 5, \"c\": 6, \"d\": 7, \"e\": 8}" ] }, { "cell_type": "markdown", "id": "878b0d5b-1daa-4644-add0-e38bc2a8873f", "metadata": {}, "source": [ "This is equivalent to describing an einsum equation and array shapes (such as for `numpy.einsum` or `opt_einsum.contract`):" ] }, { "cell_type": "code", "execution_count": 2, "id": "e0b47b06-0a19-494c-b639-6104daf8d309", "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "\n", "eq = \"abx,bcd,cey,ead->xy\"\n", "shapes = [(4, 5, 2), (5, 6, 7), (6, 8, 3), (8, 4, 7)]\n", "arrays = [np.ones(s) for s in shapes]" ] }, { "cell_type": "markdown", "id": "904673db-bf08-4abc-ae47-84776ea8565e", "metadata": {}, "source": [ "The actual names of indices here are only relevant for defining the *geometry*\n", "within this contraction.\n", "\n", "```{note}\n", "For readability, generally a single unicode character is used per index.\n", "See `ctg.get_symbol(i)` if you need to generate a usable set of these.\n", "```\n", "\n", "Each index can be thought of as an ***edge*** in a tensor network,\n", "with each tensor being a ***node***. If every index appears exactly twice in either\n", "the inputs or output, then the underlying geometry is described as a\n", "[***graph***](https://en.wikipedia.org/wiki/Graph_(discrete_mathematics)),\n", "otherwise it is a [***hypergraph***](https://en.wikipedia.org/wiki/Hypergraph).\n", "You can visualize an input contraction with:" ] }, { "cell_type": "code", "execution_count": 3, "id": "1bb0f0ef-00ba-46dd-b845-1166f45caa31", "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "" ], "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "data": { "text/plain": [ "(
, )" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ctg.HyperGraph(inputs, output, size_dict).plot()" ] }, { "cell_type": "markdown", "id": "748b5ef2-02a0-4397-94be-80d0359b7b56", "metadata": {}, "source": [ "Usually one of these representations is very easy to produce, or a library like `quimb` will do it for you. In any case, the next step is to create an *optimizer*." ] }, { "cell_type": "markdown", "id": "d5ec1d35-8e66-4444-8adc-abec97400b61", "metadata": {}, "source": [ "## `HyperOptimizer`\n", "\n", "The main driver is the [`HyperOptimizer`](cotengra.hyper.HyperOptimizer) class, which optimizes a single contraction:" ] }, { "cell_type": "code", "execution_count": 4, "id": "0fcf5b6b-fe3a-44ac-ab41-9efb6dd9e02a", "metadata": {}, "outputs": [], "source": [ "opt = ctg.HyperOptimizer()" ] }, { "cell_type": "markdown", "id": "4c45918f-b2ae-4285-a69d-7f2ce1137845", "metadata": {}, "source": [ "The most flexible way to use this is to call the [`search`](cotengra.hyper.HyperOptimizer.search) method which directly returns a\n", "[`ContractionTree`](cotengra.core.ContractionTree). This is a ***rooted\n", "binary tree***:" ] }, { "cell_type": "code", "execution_count": 5, "id": "e586ea8d-5da3-43d6-9685-8a2f08b6a1a3", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# direct use\n", "tree = opt.search(inputs, output, size_dict)\n", "tree" ] }, { "cell_type": "code", "execution_count": 6, "id": "947587ee", "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "" ], "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "tree.plot_flat();" ] }, { "cell_type": "markdown", "id": "f2ec336e-1db6-434e-be91-d116c1f784d2", "metadata": {}, "source": [ "The tree (which also has the mathematical name,\n", "['carving decomposition'](https://en.wikipedia.org/wiki/Branch-decomposition#Carving_width)) contains all the crucial information about costs and sizes of\n", "intermediate tensors:" ] }, { "cell_type": "code", "execution_count": 7, "id": "9c06c75f-464e-492b-a1d2-20c8c3b63aab", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(8.39231742277876, 4656)" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tree.contraction_width(), tree.contraction_cost()" ] }, { "cell_type": "markdown", "id": "dbeb57ba-a73b-4d8e-b7e8-6b69b6fdcf6d", "metadata": {}, "source": [ "* the ***contraction width***, $W$, is $log_2$ the size of the largest intermediate tensor\n", "* the ***contraction cost***, $C$, is the total number of scalar multiplications\n", "\n", "The tree can be used to perform the actual contraction too:" ] }, { "cell_type": "code", "execution_count": 8, "id": "cbf3ec5a-d204-4ff4-843a-c17f6c7879ec", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[6720., 6720., 6720.],\n", " [6720., 6720., 6720.]])" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tree.contract(arrays)" ] }, { "cell_type": "markdown", "id": "98e7a525-f979-4433-aa5f-12b90264f9f6", "metadata": {}, "source": [ "A tree combined with a specific traversal ordering is known as a ***path***:" ] }, { "cell_type": "code", "execution_count": 9, "id": "d0aa12c6-b61d-427b-87b6-ebd81cf4803d", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "((0, 1), (1, 2), (0, 1))" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "path = tree.get_path()\n", "path" ] }, { "cell_type": "markdown", "id": "074140f1-f095-4671-b227-adba4dcba382", "metadata": {}, "source": [ "Such paths can be supplied to `opt_einsum` and `quimb` functions, *or*\n", "you can supply the [`HyperOptimizer`](cotengra.hyper.HyperOptimizer)\n", "itself, in which case it will first run a search and then pass on a path." ] }, { "cell_type": "markdown", "id": "7a784d01-fc8b-44e3-8204-ee11db4f924f", "metadata": { "tags": [] }, "source": [ "#### With ``quimb``" ] }, { "cell_type": "code", "execution_count": 10, "id": "42aa390b-65c5-4779-bb0f-df1f2c592e05", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
Tensor(shape=(2, 3), inds=[x, y], tags={}),backend=numpy, dtype=float64, data=array([[6720., 6720., 6720.],\n", " [6720., 6720., 6720.]])
" ], "text/plain": [ "Tensor(shape=(2, 3), inds=('x', 'y'), tags=oset([]))" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import quimb.tensor as qtn\n", "\n", "tn = qtn.TensorNetwork(\n", " [qtn.Tensor(array, inds) for array, inds in zip(arrays, inputs)]\n", ")\n", "\n", "tn.contract(..., optimize=ctg.HyperOptimizer())" ] }, { "cell_type": "markdown", "id": "839765b6-8451-499b-85cd-f753f556ea64", "metadata": {}, "source": [ "Note for non-hyper graphs `quimb` will figure out the output indices for you,\n", "else you will need to supply `output_inds`. `quimb` also knows how to return\n", "the [`ContractionTree`](cotengra.core.ContractionTree) directly with:" ] }, { "cell_type": "code", "execution_count": 11, "id": "31bfd2a9-9128-4c74-98a2-064179e13d37", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tn.contraction_tree(path)" ] }, { "cell_type": "markdown", "id": "b858c274-1dc7-428a-95f5-bbd741bdb023", "metadata": {}, "source": [ "And many other methods and algorithms take a `optimize=path_or_optimizer` option." ] }, { "cell_type": "markdown", "id": "cf9fec71-71f8-4394-87c7-a3336c91af41", "metadata": {}, "source": [ "#### With `opt_einsum`" ] }, { "cell_type": "markdown", "id": "28c7ea55-c4d2-4d2d-a65c-db982b766bc5", "metadata": {}, "source": [ "You can supply a `path` or `HyperOptimizer` to all the functions of `opt_einsum`\n", "which take an `optimize` kwarg:" ] }, { "cell_type": "code", "execution_count": 12, "id": "c4235c8d-47c5-4a15-ab25-e58ab98ac559", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[6720., 6720., 6720.],\n", " [6720., 6720., 6720.]])" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import opt_einsum as oe\n", "\n", "oe.contract(eq, *arrays, optimize=path)" ] }, { "cell_type": "markdown", "id": "476158f6-4dfb-488e-9df9-e9e0be1c10a0", "metadata": {}, "source": [ "```{hint}\n", "For convenience `cotengra` also registers a few presets which can be used like `optimize='hyper'`, these can also be created.\n", "```" ] }, { "cell_type": "markdown", "id": "9cded446-465a-4ced-a133-6dc55d1eebf7", "metadata": {}, "source": [ "A single [`HyperOptimizer`](cotengra.hyper.HyperOptimizer) instance can only be used for a single contraction - everytime you supply it, as long as the contraction matches, it will simply continue it's search." ] }, { "cell_type": "markdown", "id": "d77aee38-47b8-4197-93f1-8b4ba41e5869", "metadata": {}, "source": [ "## `ReusableHyperOptimizer`\n", "\n", "Often, instead you want a single optimizer with maybe customized settings to use for many different contractions - the answer is to use a [`ReusableHyperOptimizer`](cotengra.hyper.ReusableHyperOptimizer).\n", "Everytime this is supplied to a *new* contraction it runs a search and stores the resulting path. The next time it sees this contraction it simply returns this cached path." ] }, { "cell_type": "code", "execution_count": 13, "id": "74a31688-7048-44f2-8c2c-e860689ef295", "metadata": {}, "outputs": [], "source": [ "opt = ctg.ReusableHyperOptimizer(progbar=True)" ] }, { "cell_type": "code", "execution_count": 14, "id": "029f66c6-76e4-490c-8db1-27f737fd6308", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "F=3.67 C=4.51 S=8.39 P=9.90: 100%|██████████| 128/128 [00:01<00:00, 74.86it/s]\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "opt.search(inputs, output, size_dict)" ] }, { "cell_type": "code", "execution_count": 15, "id": "cfb5758d-dccd-41bb-842a-ce69274815a4", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "opt.search(inputs, output, size_dict)" ] }, { "cell_type": "markdown", "id": "44b3e161-f06e-47ed-a7b4-ef10a2dabc6f", "metadata": {}, "source": [ "Note how the second call didn't display a progress bar as it used the cached result.\n", "\n", "```{hint}\n", "The contractions are not cached using full (hyper) graph isomoprhism, which would not be scalable. Instead, the inputs have to be in the same order to produce the same hash key.\n", "```" ] }, { "cell_type": "markdown", "id": "2274aa4f-69db-4f90-b22a-61071872aa95", "metadata": {}, "source": [ "### Disk persistence\n", "\n", "If you want to persist contraction paths across python sessions (i.e. don't want to explicitly save the `tree` or `path` objects yourself), then you can supply the `directory` kwarg:" ] }, { "cell_type": "code", "execution_count": 16, "id": "cfb5c741-176a-4fe2-bc57-fe80ac6eb112", "metadata": {}, "outputs": [], "source": [ "opt = ctg.ReusableHyperOptimizer(directory=\"cotengra_cache\")" ] }, { "cell_type": "code", "execution_count": 17, "id": "74328ba8-826b-44d1-9cd9-d16809b88ab8", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "opt.search(inputs, output, size_dict)" ] }, { "cell_type": "markdown", "id": "74b06b17-a7af-4464-8409-729f983d0de5", "metadata": {}, "source": [ "The directory contains sharded structure with single pickled file per contraction it has seen:" ] }, { "cell_type": "code", "execution_count": 18, "id": "4c7e466e-c7bf-43dd-a198-888fdc7334a0", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "04\n" ] } ], "source": [ "!ls cotengra_cache/" ] }, { "cell_type": "code", "execution_count": 19, "id": "0db8e920-1d77-4e15-b729-e1e1d4204584", "metadata": {}, "outputs": [], "source": [ "# clean it up for now\n", "!rm -rf cotengra_cache/" ] }, { "cell_type": "markdown", "id": "45f14770", "metadata": {}, "source": [ "If you supply `directory=True` then the cache name will be generated from a\n", "hash of the relevant path finding options supplied to the optimizer, meaning\n", "you don't need to manually change the name in order to use different caches\n", "for different settings." ] }, { "cell_type": "markdown", "id": "d9c6309b", "metadata": {}, "source": [ "## What next?\n", "\n", "* The ['Advanced'](advanced) page, describes how to customize a [`HyperOptimizer`](cotengra.hyper.HyperOptimizer) in detail, for example to include subtree reconfiguration and dynamic slicing\n", "* The ['Visualization'](visualization) page details many functions for plotting the contraction, tree and optimizer trials\n", "* The ['Contraction'](contraction) page contains more information about actually performing the contraction, for example using a GPU\n", "* The ['Tree Surgery'](trees) page describes the design of the central [`ContractionTree`](cotengra.core.ContractionTree) object and ways to manipulate it\n", "\n", "## Quick-start\n", "\n", "If you just want to get going, the following presets are recommended:\n", "\n", "- `optimize='auto'`, as a decent all rounder.\n", "- `optimize='auto-hq'`, for contractions which you think might be hard, or will be repeated many times.\n", "- `optimize='random-greedy-128'`, for very large networks (many thousands of tensors), or very large numbers of different networks. Heavily accelerated by `cotengrust`.\n", "\n", "\n", "Beyond those, the following illustrate some common customizations of the full optimizer interface:\n", "\n", "\n", "### High quality reusable optimizer\n", "\n", "The following is like a configured preset (you can supply it to many contractions, it will only run for each once), and a good starting point for high quality contractions:" ] }, { "cell_type": "code", "execution_count": null, "id": "aefc22a2", "metadata": {}, "outputs": [], "source": [ "opt = ctg.ReusableHyperOptimizer(\n", " # turn on subtree reconfiguration\n", " reconf_opts={},\n", " # account for both flops and write - usually wise for practical performance\n", " minimize=\"combo\",\n", " # only spend time on hard contractions\n", " max_time=\"rate:1e9\",\n", " # hash contraction up to index permutation, for maximum reuse\n", " hash_method=\"b\",\n", " # cmaes is a good balance between speed and quality\n", " optlib=\"cmaes\",\n", " # store contractions on disk\n", " directory=True,\n", " # turn this on to see live progress each contraction\n", " progbar=False,\n", ")" ] }, { "cell_type": "markdown", "id": "4dfeec6c", "metadata": {}, "source": [ "### Very high quality sliced single optimizer\n", "\n", "The following is an example of a high quality optimizer you might use to search\n", "for a single contraction, where you are memory bound to width $W=30$ and thus\n", "need to use slicing:" ] }, { "cell_type": "code", "execution_count": null, "id": "e9a47175", "metadata": {}, "outputs": [], "source": [ "opt_hq_W30 = ctg.HyperOptimizer(\n", " # do extra runs\n", " max_repeats=1024,\n", " # use dynamic slicing to target a width of 30\n", " slicing_reconf_opts={\"target_size\": 2**30},\n", " # use the cmaes space searcher - good with large trial budget\n", " optlib=\"cmaes\",\n", " # terminate search if no change for 128 trials\n", " max_time=\"equil:128\",\n", " # show live progress\n", " progbar=True,\n", ")" ] }, { "cell_type": "markdown", "id": "2d98d65b", "metadata": {}, "source": [ "* Everytime you supply this optimizer instance it will *continue* its search, so you can interactively run it until you are happy or it seems to have converged. See the visualization page for various ways to inpsect progress.\n", "\n", "* While a few hundred runs is usually sufficient when no slicing is needed, very large contractions requiring heavy slicing might benefit from a few thousand runs.\n", "\n", "* For some contractions, swapping `slicing_reconf_opts` ('dynamic slicing') to `simulated_annealing_opts` can provide better paths - see the advaced configuration page." ] }, { "cell_type": "markdown", "id": "d4207442", "metadata": {}, "source": [ "### Economical optimizer\n", "\n", "The following is an example of a reusable optimizer that is cheap to run and\n", "requires no extra depedencies (i.e. `kahypar` or a Bayesian optimizer),\n", "but will still yield much better results than simple algorithms.\n", "Useful if you have many smallish contractions:" ] }, { "cell_type": "code", "execution_count": null, "id": "1a9b54ea", "metadata": {}, "outputs": [], "source": [ "opt_eco = ctg.ReusableHyperOptimizer(\n", " # just do a few runs\n", " max_repeats=32,\n", " # only use the basic greedy optimizer ...\n", " methods=[\"greedy\"],\n", " # ... but pair it with reconfiguration\n", " reconf_opts={},\n", " # just uniformly sample the space\n", " optlib=\"random\",\n", " # terminate search if contraction is cheap\n", " max_time=\"rate:1e9\",\n", " # account for both flops and write - usually wise for practical performance\n", " minimize=\"combo\",\n", " # persist paths found in a specific directory\n", " directory=\"cotengra_cache_eco\",\n", ")" ] }, { "cell_type": "markdown", "id": "d6d3e4be", "metadata": {}, "source": [ "An even faster option if one doesn't need slicing or to specific the `minimize` objective function is the [`ReusableRandomGreedyOptimizer`](cotengra.ReusableRandomGreedyOptimizer) which still provides good results but can run extremely quickly (especially if `cotengrust` is installed):" ] }, { "cell_type": "code", "execution_count": 23, "id": "c51ead4e", "metadata": {}, "outputs": [], "source": [ "opt_rg = ctg.ReusableRandomGreedyOptimizer()" ] }, { "cell_type": "code", "execution_count": 24, "id": "70a1551d-7a15-4f68-b250-79f789a0a095", "metadata": {}, "outputs": [], "source": [ "# clean up the cache for now\n", "!rm -rf cotengra_cache_eco" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3" } }, "nbformat": 4, "nbformat_minor": 5 } ================================================ FILE: docs/changelog.md ================================================ # Changelog ## v0.7.5 (2025-06-12) **Enhancements** - [`ContractionTree.print_contractions`](cotengra.ContractionTree.print_contractions): fix `show_brackets` option, show preprocessing steps with original inputs indices. - Only warn about missing recommended dependencies when they otherwise would be used, i.e. for hyper optimization only. ## v0.7.4 (2025-05-13) **Bug fixes** - Fix and add egde case test for `optimize=()` - {issue}`55` ## v0.7.3 (2025-05-12) **Enhancements** - Allow manual path specification as edge path, e.g. `optimize=['b', 'c', 'a']` - Add `optimize="edgesort"` (aliased to `optimize="ncon"` too), which performs a contraction by contracting edges in *sorted* order, thus can be entirely specified by the graph labelling. - Add [`edge_path_to_ssa`](cotengra.pathfinders.path_basic.edge_path_to_ssa) and [`edge_path_to_linear`](cotengra.pathfinders.path_basic.edge_path_to_linear) for converting edge paths to SSA and linear paths respectively. - [`ContractionTree.from_path`](cotengra.ContractionTree.from_path): allow an `edge_path` argument. Deprecate `ContractionTree.from_edge_path` method in favor of this. - Speed up [`ContractionTree.get_path`](cotengra.ContractionTree.get_path) to ~ n log(n). ## v0.7.2 (2025-04-01) **Breaking Changes** - When contracting with slices and `strip_exponent` enabled, each slice result is returned with the exponent separately, rather than matching the first, these are are now combined in [`gather_slices`](cotengra.ContractionTree.gather_slices). - If `check_zero=True`, `strip_exponent=True`, and a zero slice is encountered, the returned exponent will now be `float('-inf')` rather than `0.0` for compatbility with the above. ## v0.7.1 (2025-02-24) - [`ReusableHyperOptimizer`](cotengra.ReusableHyperOptimizer) and [`DiskDict`](cotengra.utils.DiskDict), allow splitting key into subdirectory structure (sharding) for better performance. Enabled for new caches by default. - High level interface functions accept the `strip_exponent` kwarg, which eagerly strips a scaling exponent (log10) as the contraction proceeds, avoiding issues to do with very large or very small numeric values. - add [`ReusableRandomGreedyOptimizer`](cotengra.ReusableRandomGreedyOptimizer) for reusing the same random greedy optimizer across multiple contractions, which is faster than creating a new one each time. ## v0.7.0 (2025-01-07) **Enhancements** - Add [`cmaes`](https://github.com/CyberAgentAILab/cmaes) as an `optlib` method, use it by default for `'auto'` preset if available since ih has less overhead than `optuna`. - Add [`HyperOptimizer.plot_parameters_parallel`](cotengra.plot.plot_parameters_parallel) for plotting the sampled parameter space of a hyper optimizer method in parallel coordinates. - Add [`ncon`](cotengra.ncon) interface. - Add [`utils.save_to_json`](cotengra.utils.save_to_json) and [`utils.load_from_json`](cotengra.utils.load_from_json) for saving and loading contractions to/from json. - Add `examples/benchmarks` with various json benchmark contractions - Add [`utils.networkx_graph_to_equation`](cotengra.utils.networkx_graph_to_equation) for converting a networkx graph to cotengra style `inputs`, `output` and `size_dict`. - Add `"max"` as a valid `minimize` option for `optimize_optimal` (also added to `cotengrust`), which minimizes the single most expensive contraction (i.e. the cost *scaling*) - Add [`RandomOptimizer`](cotengra.RandomOptimizer), a fully random optimizer for testing and initialization purposes. It can be used with `optimize="random"` but is not recommended for actual optimization. - Add [`PathOptimizer`](cotengra.PathOptimizer) to top-level namespace. - [`ContractTreeCompressed.from_path`](cotengra.ContractionTreeCompressed.from_path): add the `autocomplete` option - Add option `overwrite="improved"` to reusable hyper optimizers, which always searches but only overwrites if the new tree is better, allowing easy incremental refining of a collection of trees. - einsum via bmm (`implementation="cotengra"`) avoids using einsum for transposing inputs. - add example {ref}`ex_extract_contraction` doc **Bug fixes** - Fix [`HyperGraph.plot`](cotengra.plot.plot_hypergraph) when nodes are not labelled as consecutive integers ({issue}`36`) - Fix [`ContractionTreeCompressed.windowed_reconfigure`](ContractionTreeCompressed.windowed_reconfigure) not propagating the default objective - Fix `kahypar` path optimization when no edges are present ({issue}`48`) ## v0.6.2 (2024-05-21) **Bug fixes** - Fix final, output contractions being mistakenly marked as not tensordot-able. - When `implementation="autoray"` don't require a backend to have both `einsum` and `tensordot`, instead fallback to `cotengra`'s own. ## v0.6.1 (2024-05-15) **Breaking changes** - The number of workers initialized (for non-distributed pools) is now set to, in order of preference, 1. the environment variable `COTENGRA_NUM_WORKERS`, 2. the environment variable `OMP_NUM_THREADS`, or 3. `os.cpu_count()`. **Enhancements** - add [RandomGreedyOptimizer](cotengra.pathfinders.path_basic.RandomGreedyOptimizer) which is a lightweight and performant randomized greedy optimizer, eschewing both hyper parameter tuning and full contraction tree construction, making it suitable for very large contractions (10,000s of tensors+). - add [optimize_random_greedy_track_flops](cotengra.pathfinders.path_basic.optimize_random_greedy_track_flops) which runs N trials of (random) greedy path optimization, whilst computing the FLOP count simultaneously. This or its accelerated rust counterpart in `cotengrust` is the driver for the above optimizer. - add `parallel="threads"` backend, and make it the default for `RandomGreedyOptimizer` when `cotengrust` is present, since its version of `optimize_random_greedy_track_flops` releases the GIL. - significantly improve both the speed and memory usage of [`SliceFinder`](cotengra.slicer.SliceFinder) - alias `tree.total_cost()` to `tree.combo_cost()` ## v0.6.0 (2024-04-10) **Bug fixes** - all input node legs and pre-processing steps are now calculated lazily, allowing slicing of indices including those 'simplified' away {issue}`31`. - make [`tree.peak_size`](cotengra.ContractionTree.peak_size) more accurate, by taking max assuming left, right and parent intermediate tensors are all present at the same time. **Enhancements** - add simulated annealing tree refinement (in `path_simulated_annealing.py`), based on "Multi-Tensor Contraction for XEB Verification of Quantum Circuits" by Gleb Kalachev, Pavel Panteleev, Man-Hong Yung (arXiv:2108.05665), and the "treesa" implementation in OMEinsumContractionOrders.jl by Jin-Guo Liu and Pan Zhang. This can be accessed most easily by supplying `opt = HyperOptimizer(simulated_annealing_opts={})`. - add [`ContractionTree.plot_flat`](cotengra.plot.plot_tree_flat): a new method for plotting the contraction tree as a flat diagram showing all indices on every intermediate (without requiring any graph layouts), which is useful for visualizing and understanding small contractions. - [`HyperGraph.plot`](cotengra.plot.plot_hypergraph): support showing hyper outer indices, multi-edges, and automatic unique coloring of nodes and indices (to match `plot_flat`). - add [`ContractionTree.plot_circuit](cotengra.plot.plot_tree_circuit) for plotting the contraction tree as a circuit diagram, which is fast and useful for visualizing the traversal ordering for larger trees. - add [`ContractionTree.restore_ind`](cotengra.ContractionTree.restore_ind) for 'unslicing' or 'unprojecting' previously removed indices. - [`ContractionTree.from_path`](cotengra.ContractionTree.from_path): add option `complete` to automatically complete the tree given an incomplete path (usually disconnected subgraphs - {issue}`29`). - add [`ContractionTree.get_incomplete_nodes`](cotengra.ContractionTree.get_incomplete_nodes) for finding all uncontracted childless-parentless node groups. - add [`ContractionTree.autocomplete`](cotengra.ContractionTree.autocomplete) for automatically completing a contraction tree, using above method. - [`tree.plot_flat`](cotengra.plot.plot_tree_flat): show any preprocessing steps and optionally list sliced indices - add [get_rng](cotengra.utils.get_rng) as a single entry point for getting or propagating a random number generator, to help determinism. - set ``autojit="auto"`` for contractions, which by default turns on jit for `backend="jax"` only. - add [`tree.describe`](cotengra.ContractionTree.describe) for a various levels of information about a tree, e.g. `tree.describe("full")` and `tree.describe("concise")`. - add [ctg.GreedyOptimizer](cotengra.pathfinders.path_basic.GreedyOptimizer) and [ctg.OptimalOptimizer](cotengra.pathfinders.path_basic.OptimalOptimizer) to the top namespace. - add [ContractionTree.benchmark](cotengra.ContractionTree.benchmark) for for automatically assessing hardware performance vs theoretical cost. - contraction trees now have a `get_default_objective` method to return the objective function they were optimized with, for simpler further refinement or scoring, where it is now picked up automatically. - change the default 'sub' optimizer on divisive partition building algorithms to be `'greedy'` rather than `'auto'`. This might make individual trials slightly worse but makes each cheaper, see discussion: ({issue}`27`). ## v0.5.6 (2023-12-07) **Bug fixes** - fix a very rare but very infuriating bug related somehow to [ReusableHyperOptimizer](cotengra.ReusableHyperOptimizer) not being thread-safe and returning the wrong tree on github actions ## v0.5.5 (2023-11-15) **Enhancements** - [`HyperOptimizer`](cotengra.HyperOptimizer): by default simply warn if an individual trial fails, rather than raising an exception. This is to ensure rare failures do not spoil an entire optimization run. The behavior can be controlled with the `on_trial_error` argument. **Bug fixes** - fixed bug in greedy optimizer that produced negative scores and otherwise inaccurate scores. - fixed bug for contraction with many inputs and also preprocessing steps ## v0.5.4 (2023-10-17) **Bug fixes** - the `auto` and `auto-hq` optimizers are now safe to run under multi-threading. ## v0.5.3 (2023-10-16) - [``einsum``](cotengra.einsum), [`einsum_tree`](cotengra.einsum_tree) and [`einsum_expression`](cotengra.einsum_expression): add support for all numpy input formats, including interleaved indices and ellipses. - remove some hidden `opt_einsum` dependence (via a `PathOptimizer` method) ## v0.5.2 (2023-10-13) - add [``ctg.array_contract_path``](cotengra.array_contract_path) for returning the raw contraction path only, with caching. Add caching to [``array_contract_expression``](cotengra.array_contract_expression) and related functions too. - fix [`tree.get_eq()`](cotengra.ContractionTree.get_eq) when the ``inputs`` are a tuple of `Sequence[str]` rather than a `str`. ## v0.5.1 (2023-10-3) - add [tree.contraction_scaling](cotengra.ContractionTree.contraction_scaling) - add [get_symbol_map](cotengra.get_symbol_map) ## v0.5.0 (2023-09-26) - add [`einsum`](cotengra.einsum) - add [`einsum_tree`](cotengra.einsum_tree) - add [`einsum_expression`](cotengra.einsum_expression) - add [`array_contract`](cotengra.array_contract) - add [`array_contract_tree`](cotengra.array_contract_tree) - add [`array_contract_expression`](cotengra.array_contract_expression) - add [`AutoOptimizer`](cotengra.AutoOptimizer) - add [`AutoHQOptimizer`](cotengra.AutoHQOptimizer) - remove most hard dependencies (`numpy`, `opt_einsum`) - update [`tree.plot_contractions`](cotengra.plot.plot_contractions) ================================================ FILE: docs/conf.py ================================================ # Configuration file for the Sphinx documentation builder. # # For the full list of built-in configuration values, see the documentation: # https://www.sphinx-doc.org/en/master/usage/configuration.html import datetime import os import sys sys.path.append(os.path.abspath("./_pygments")) # -- Project information ----------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information project = "cotengra" copyright = f"2020-{datetime.date.today().year}, Johnnie Gray" author = "Johnnie Gray" try: from cotengra import __version__ release = __version__ except ImportError: try: from importlib.metadata import version release = version("cotengra") except ImportError: release = "0.0.0+unknown" # -- General configuration --------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration extensions = [ "autoapi.extension", "myst_nb", "sphinx_copybutton", "sphinx_design", "sphinx.ext.autosectionlabel", "sphinx.ext.extlinks", "sphinx.ext.intersphinx", "sphinx.ext.linkcode", "sphinx.ext.napoleon", ] nb_execution_mode = "off" myst_heading_anchors = 4 myst_enable_extensions = [ "amsmath", "colon_fence", "deflist", "dollarmath", "html_image", ] autosectionlabel_prefix_document = True # sphinx-autoapi autoapi_dirs = ["../cotengra"] templates_path = ["_templates"] exclude_patterns = ["_build", "Thumbs.db", ".DS_Store", "**.ipynb_checkpoints"] # -- Options for HTML output ------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output html_theme = "furo" html_theme_options = { "sidebar_hide_name": True, "light_css_variables": { "color-brand-primary": "hsl(72, 75%, 40%)", "color-brand-content": "hsl(238, 50%, 60%)", "font-stack": "Atkinson Hyperlegible, sans-serif", "font-stack--monospace": "Spline Sans Mono, monospace", "font-stack--headings": "Spline Sans Mono, monospace", }, "dark_css_variables": { "color-brand-primary": "hsl(72, 75%, 60%)", "color-brand-content": "hsl(238, 75%, 70%)", }, "light_logo": "logo-full.png", "dark_logo": "logo-full.png", } pygments_style = "_pygments_light.MarianaLight" pygments_dark_style = "_pygments_dark.MarianaDark" html_static_path = ["_static"] html_css_files = ["my-styles.css"] html_favicon = "_static/logo-favicon.ico" def linkcode_resolve(domain, info): """ Determine the URL corresponding to Python object """ import inspect import cotengra if domain != "py": return None modname = info["module"] fullname = info["fullname"] submod = sys.modules.get(modname) if submod is None: return None obj = submod for part in fullname.split("."): try: obj = getattr(obj, part) except AttributeError: return None try: fn = inspect.getsourcefile(inspect.unwrap(obj)) except TypeError: fn = None if not fn: return None try: source, lineno = inspect.getsourcelines(obj) except OSError: lineno = None if lineno: linespec = f"#L{lineno}-L{lineno + len(source) - 1}" else: linespec = "" fn = os.path.relpath(fn, start=os.path.dirname(cotengra.__file__)) if "+" in cotengra.__version__: return ( f"https://github.com/jcmgray/cotengra/blob/" f"HEAD/cotengra/{fn}{linespec}" ) else: return ( f"https://github.com/jcmgray/cotengra/blob/" f"v{cotengra.__version__}/cotengra/{fn}{linespec}" ) extlinks = { "issue": ("https://github.com/jcmgray/cotengra/issues/%s", "GH %s"), "pull": ("https://github.com/jcmgray/cotengra/pull/%s", "PR %s"), } intersphinx_mapping = { "python": ("https://docs.python.org/3/", None), "numpy": ("https://numpy.org/doc/stable/", None), "autoray": ("https://autoray.readthedocs.io/en/latest/", None), "opt_einsum": ("https://dgasmith.github.io/opt_einsum/", None), "networkx": ("https://networkx.org/documentation/stable/", None), } ================================================ FILE: docs/contraction.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "id": "69e58b47-c160-40c4-a12e-e1299918b5af", "metadata": {}, "source": [ "# Contraction\n", "\n", "```{hint}\n", "This page describes the low level contraction functionality of `cotengra`, see\n", "the [high level interface functions](high-level-interface) for standard use.\n", "```\n", "\n", "You can pass the `cotengra` optimizers, or\n", "[paths](cotengra.ContractionTree.get_path)\n", "generated with them, to\n", "[`quimb`](https://quimb.readthedocs.io/en/latest/),\n", "[`opt_einsum`](https://dgasmith.github.io/opt_einsum/),\n", "and other libraries (generally via the `optimize=` kwarg), but `cotengra` also\n", "provides its own contraction functionality encapsulated in the\n", "[`ContractionTree.contract`](cotengra.ContractionTree.contract) method.\n", "\n", "For an example let's generate a square lattice contraction:" ] }, { "cell_type": "code", "execution_count": 1, "id": "a079cf1f", "metadata": {}, "outputs": [], "source": [ "%config InlineBackend.figure_formats = ['svg']\n", "import numpy as np\n", "\n", "import cotengra as ctg\n", "\n", "inputs, output, shapes, size_dict = ctg.utils.lattice_equation([10, 10])\n", "arrays = [np.random.uniform(size=shape) for shape in shapes]" ] }, { "cell_type": "markdown", "id": "ffc62ec9", "metadata": {}, "source": [ "Then find a high quality tree for it (using `minimize='combo'` is generally\n", "good for real world contraction performance):" ] }, { "cell_type": "code", "execution_count": 2, "id": "02cf1f61", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "log2[SIZE]: 10.00 log10[FLOPs]: 5.28: 100%|██████████| 128/128 [00:04<00:00, 28.46it/s]\n" ] } ], "source": [ "opt = ctg.HyperOptimizer(\n", " minimize=\"combo\",\n", " reconf_opts={},\n", " progbar=True,\n", ")\n", "tree = opt.search(inputs, output, size_dict)" ] }, { "cell_type": "markdown", "id": "b509f66e", "metadata": {}, "source": [ "We can have a quick look at the tree:" ] }, { "cell_type": "code", "execution_count": 3, "id": "7427229f", "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "" ], "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "data": { "text/plain": [ "(
, )" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tree.plot_tent(order=True)" ] }, { "cell_type": "markdown", "id": "fd488036", "metadata": {}, "source": [ "## Basic contraction\n", "\n", "Contracting is then as simple as:" ] }, { "cell_type": "code", "execution_count": 4, "id": "20ec1c0b", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array(8.02217303e+22)" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tree.contract(arrays)" ] }, { "cell_type": "markdown", "id": "4630a4eb", "metadata": {}, "source": [ "We can also show live progress for feedback with `progbar=True`.\n", "And if the value of contraction is going to be very large or small (e.g. some\n", "weighted counting problems), then setting `strip_exponents=True` will actively\n", "rescale intermediate tensors and return the result as a scaled output array\n", "(the 'mantissa') and the exponent separately:" ] }, { "cell_type": "code", "execution_count": 5, "id": "d7842ae3", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 99/99 [00:00<00:00, 16029.81it/s]\n" ] }, { "data": { "text/plain": [ "(1.0, 22.904292025082466)" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tree.contract(arrays, progbar=True, strip_exponent=True)" ] }, { "cell_type": "markdown", "id": "aedd0ed4", "metadata": {}, "source": [ "such that the full output would be `mantissa * 10**exponent`." ] }, { "cell_type": "markdown", "id": "743835eb", "metadata": {}, "source": [ "## Sliced contraction\n", "\n", "One of the main reasons to use the contraction abilities of `cotengra` is that\n", "it handles sliced contractions. Let's generate a sliced tree with a minimum\n", "of 32 slices:" ] }, { "cell_type": "code", "execution_count": 6, "id": "47d99a5c", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "log2[SIZE]: 8.00 log10[FLOPs]: 5.91: 100%|██████████| 128/128 [00:04<00:00, 25.76it/s]\n" ] } ], "source": [ "opt = ctg.HyperOptimizer(\n", " minimize=\"combo\",\n", " slicing_opts={\"target_slices\": 32},\n", " reconf_opts={},\n", " progbar=True,\n", ")\n", "tree = opt.search(inputs, output, size_dict)" ] }, { "cell_type": "markdown", "id": "3a072b2c", "metadata": {}, "source": [ "The sliced indices appear as dashed lines if we plot the tree:" ] }, { "cell_type": "code", "execution_count": 7, "id": "97920dbd", "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "" ], "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "data": { "text/plain": [ "(
, )" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tree.plot_tent(order=True)" ] }, { "cell_type": "code", "execution_count": 8, "id": "4820e980", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "({'ä': SliceInfo(inner=True, ind='ä', size=2, project=None),\n", " 'æ': SliceInfo(inner=True, ind='æ', size=2, project=None),\n", " 'è': SliceInfo(inner=True, ind='è', size=2, project=None),\n", " 'ê': SliceInfo(inner=True, ind='ê', size=2, project=None),\n", " 'þ': SliceInfo(inner=True, ind='þ', size=2, project=None)},\n", " 32)" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tree.sliced_inds, tree.nslices" ] }, { "cell_type": "markdown", "id": "4edd971a", "metadata": {}, "source": [ "### Automated\n", "\n", "`cotengra` can perform all of the necessary slicing and summing in the\n", "background for you just by calling the `ContractionTree.contract` method as\n", "usual:" ] }, { "cell_type": "code", "execution_count": 9, "id": "0c1e9c66", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 32/32 [00:00<00:00, 489.62it/s]\n" ] }, { "data": { "text/plain": [ "8.022173030954557e+22" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tree.contract(arrays, progbar=True)" ] }, { "cell_type": "markdown", "id": "3fc2609b", "metadata": {}, "source": [ "If you are just interested in the memory savings of slicing then this is\n", "usually sufficient.\n", "\n", "```{note}\n", "* For sliced trees progress is shown across slices, not individual contractions.\n", "* You can still set `strip_exponents=True` - but be aware the\n", "overall exponent is fixed by the first slice contracted.\n", "```" ] }, { "cell_type": "markdown", "id": "660240c4", "metadata": {}, "source": [ "### Manual\n", "\n", "To control for example parallelization you have to take a slightly more\n", "hands-on approach using the some combination of the following methods:\n", "\n", "* [`ContractionTree.slice_arrays`](cotengra.ContractionTree.slice_arrays) -\n", " slice the arrays for slice number `i`\n", "* [`ContractionTree.contract_core`](cotengra.ContractionTree.contract_core) -\n", " contract a single set of already sliced arrays, e.g. from above function\n", "* [`ContractionTree.contract_slice`](cotengra.ContractionTree.contract_slice) -\n", " contract slice `i`, this simply combines the above two functions\n", "* [`ContractionTree.gather_slices`](cotengra.ContractionTree.gather_slices) -\n", " gather all the separate sliced outputs and combine into the full output\n", "\n", "The slices are enumerated by `range(tree.nslices)`. The following demonstrates\n", "an explicit loop that you could distribute:" ] }, { "cell_type": "code", "execution_count": 10, "id": "2c99204b", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "8.022173030954557e+22" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# note this can be a lazy generator\n", "output_slices = (tree.contract_slice(arrays, i) for i in range(tree.nslices))\n", "\n", "tree.gather_slices(output_slices)" ] }, { "cell_type": "markdown", "id": "00ae063b", "metadata": {}, "source": [ "There are more examples in the `examples` folder, demonstrating using:\n", "\n", "* an executor pool\n", "* GPU\n", "* MPI\n", "\n", "If no sliced indices are in the output then the final gather is just a sum,\n", "however if this isn't the case then the final gather also involves calls to\n", "`stack`. If you are just interested in iterating over the output slices (for\n", "example performing a map-reduce like $\\sum f(T)$) then you can do so lazily with\n", "[ContractionTree.gen_output_chunks](cotengra.ContractionTree.gen_output_chunks)\n", "which avoids constructing the full output tensor." ] }, { "cell_type": "markdown", "id": "88776e18", "metadata": {}, "source": [ "## Backends and `autoray`\n", "\n", "`cotengra` dispatches the functions\n", "[`tensordot`](https://numpy.org/doc/stable/reference/generated/numpy.tensordot.html),\n", "[`einsum`](https://numpy.org/doc/stable/reference/generated/numpy.einsum.html),\n", "[`transpose`](https://numpy.org/doc/stable/reference/generated/numpy.transpose.html)\n", "and\n", "[`stack`](https://numpy.org/doc/stable/reference/generated/numpy.stack.html)\n", "using [`autoray`](https://github.com/jcmgray/autoray) thereby\n", "supporting a wide range of backend tensor libraries, as well as functionality\n", "like **intermediate reuse**, **lazy tracing**, and **compilation**. This\n", "usually requires no extra input:" ] }, { "cell_type": "code", "execution_count": 11, "id": "ec41916e", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array(8.0221730e+22)" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import cupy as cp\n", "\n", "gpu_arrays = [cp.asarray(array) for array in arrays]\n", "tree.contract(gpu_arrays)" ] }, { "cell_type": "markdown", "id": "d18c9959", "metadata": {}, "source": [ "but you can specify the `backend` kwarg to explicitly control which module to\n", "lookup the functions from, or directly register your own implementations with\n", "`autoray`." ] }, { "cell_type": "markdown", "id": "9c446c52", "metadata": {}, "source": [ "### `prefer_einsum`\n", "\n", "If you would like to use `einsum` for every contraction, not just those that\n", "`tensordot` doesn't support, then set `prefer_einsum=True`.\n", "\n", "\n", "### `autojit`\n", "\n", "This is an experimental feature of `autoray` that tries to just in time compile\n", "and then cache the contraction expression based on the backend. For `numpy` and\n", "`cupy` for example, this just strips away some python scaffold and offers a\n", "small speedup if a contraction will be called many times. For `jax` and others\n", "it makes use of their full compilation abilities." ] }, { "cell_type": "markdown", "id": "273bc654", "metadata": {}, "source": [ "## Differences with opt_einsum\n", "\n", "The major difference between contraction in `cotengra` and `opt_einsum` is just\n", "that `cotengra` handles slicing. There are also a few other minor differences\n", "between the two:\n", "\n", "* `opt_einsum` prefers to use `einsum` (if available) for *some* operations that\n", " `tensordot` could be used for (e.g. outer products), `cotengra` prefers\n", " `tensordot` for all operations that are possible with it\n", "* cotengra uses [`autoray`](https://github.com/jcmgray/autoray) to dispatch\n", " pairwise `tensordot`, `transpose` and `einsum` operations\n", "* the costs `opt_einsum` reports assumes a real datatype for the tensors, which\n", " is generally twice as high compared to generic 'ops' (i.e.\n", " [`tree.contraction_cost()`](cotengra.ContractionTree.contraction_cost))\n", " and four times lower than assuming a complex datatype (i.e.\n", " [`tree.total_flops('complex')`](cotengra.ContractionTree.total_flops))." ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3" } }, "nbformat": 4, "nbformat_minor": 5 } ================================================ FILE: docs/examples/ex_compressed_contraction.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "id": "b4ea66a9-262e-4909-bfd6-8025935ec0b8", "metadata": {}, "source": [ "# Approximate/compressed contraction\n", "\n", "In this example we use `cotengra` to find a 'compressed' contraction tree\n", "(as detailed in [2206.07044](https://arxiv.org/abs/2206.07044)) for a $10\\times10\\times10$\n", "tensor network representation of the partition function of the 3D classical\n", "ising model. We then use `quimb` to actually perform the compressed\n", "contraction." ] }, { "cell_type": "code", "execution_count": 1, "id": "2100490c-2f63-4eaa-b63a-2c02c8e7550d", "metadata": {}, "outputs": [], "source": [ "%config InlineBackend.figure_formats = ['svg']\n", "import quimb.tensor as qtn\n", "\n", "import cotengra as ctg" ] }, { "cell_type": "markdown", "id": "e971cc09-ffc9-45e4-a350-dab40aa3bf02", "metadata": {}, "source": [ "First we get the tensor network from `quimb`, though note we could also specify it as usual via\n", "`inputs`, `output` and `size_dict`." ] }, { "cell_type": "code", "execution_count": 2, "id": "ac8d2ffd-84de-4e3b-80e0-e2e0405607a8", "metadata": {}, "outputs": [], "source": [ "tn = qtn.TN3D_classical_ising_partition_function(10, 10, 10, beta=0.3)" ] }, { "cell_type": "markdown", "id": "7fccd6bc-5b44-4f3a-ad3e-f3a8939e5c92", "metadata": {}, "source": [ "Then we set-up our *compressed* contraction tree finder:" ] }, { "cell_type": "code", "execution_count": 3, "id": "82b8e3e8-7296-4510-a25b-05335aa5abda", "metadata": {}, "outputs": [], "source": [ "chi = 16\n", "copt = ctg.ReusableHyperCompressedOptimizer(\n", " chi,\n", " max_repeats=256,\n", " minimize=\"combo-compressed\",\n", " progbar=True,\n", " # # save paths to disk:\n", " # directory=True\n", ")" ] }, { "cell_type": "markdown", "id": "89aa8156-c988-4f05-874f-3636d84ad616", "metadata": {}, "source": [ "`quimb` knows about `cotengra` and will directly return the\n", "`ContractionTreeCompressed` generated during the search:" ] }, { "cell_type": "code", "execution_count": 4, "id": "0f604391-7678-4a3d-b12b-2b33cc6e52ca", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "log2[SIZE]: 21.00 log10[FLOPs]: 10.89: 100%|████████████████████████| 256/256 [00:15<00:00, 16.02it/s]\n" ] } ], "source": [ "tree = tn.contraction_tree(copt)" ] }, { "cell_type": "markdown", "id": "8229a18e-a5e1-4705-bfef-2116c662017e", "metadata": {}, "source": [ "We can perform various bits of introspection on both the compressed contraction tree and optimizer now\n", "before we actually perform the contraction." ] }, { "cell_type": "code", "execution_count": 5, "id": "ebccaf7f-a3fa-4bc4-90df-a9227d3cf99b", "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "" ], "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "data": { "text/plain": [ "(
, )" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "copt.last_opt.plot_trials()" ] }, { "cell_type": "markdown", "id": "8339fee6-0c5a-4f6b-a1d1-437a8085d930", "metadata": {}, "source": [ "We can see that the best tree was generated with the Span algorithm, so we can visualize the actual spanning tree like so:" ] }, { "cell_type": "code", "execution_count": 6, "id": "6811dceb-1d67-406f-8675-34927b03120b", "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "" ], "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "(
, )" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tree.plot_span(\n", " node_max_size=1,\n", " edge_max_width=1,\n", " edge_color=\"order\",\n", " node_color=\"order\",\n", " edge_colormap=\"Spectral_r\",\n", " node_colormap=\"Spectral_r\",\n", " colorbars=False,\n", ")" ] }, { "cell_type": "markdown", "id": "66e26d27-7643-4745-a667-7ca1205b8468", "metadata": {}, "source": [ "Here we optionally convert to GPU arrays to make the contraction (much) quicker:" ] }, { "cell_type": "code", "execution_count": 7, "id": "dd0138a3-dce5-4f0b-b049-d80a711a22fb", "metadata": {}, "outputs": [], "source": [ "def to_backend(x):\n", " import torch\n", "\n", " return torch.tensor(x, dtype=torch.float32, device=\"cuda\")\n", "\n", "\n", "tn.apply_to_arrays(to_backend)" ] }, { "cell_type": "markdown", "id": "c24e4d3e-d9d5-442d-87a6-f751ed2040a3", "metadata": {}, "source": [ "Now we actually perform the contraction, this requires a lot of machinery\n", "that only `quimb` can provide currently, so we just need to supply either\n", "the raw path or optimizer to the following method:" ] }, { "cell_type": "code", "execution_count": 8, "id": "a30eaf76-1e11-42e5-bbbf-95197ced77e0", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "log2[SIZE]: 0.00/21.00: 100%|███████████████████████████████████████| 999/999 [00:11<00:00, 90.42it/s]\n" ] }, { "data": { "text/html": [ "
TensorNetwork3D(tensors=1, indices=0, Lx=10, Ly=10, Lz=10, max_bond=1)
Tensor(shape=(), inds=[], tags={I9,0,9, X9, Y0, Z9, I9,1,9, Y1, I9,2,9, Y2, I9,3,9, Y3, I9,4,9, Y4, I9,5,9, Y5, I9,6,9, Y6, I9,7,9, Y7, I9,8,9, Y8, I9,9,9, Y9, I9,0,8, Z8, I9,1,8, I9,2,8, I9,3,8, I9,4,8, I9,5,8, I9,6,8, I9,7,8, I9,8,8, I9,9,8, I9,0,7, Z7, I9,1,7, I9,2,7, I9,3,7, I9,4,7, I9,5,7, I9,6,7, I9,7,7, I9,8,7, I9,9,7, I9,0,6, Z6, I9,1,6, I9,2,6, I9,3,6, I9,4,6, I9,5,6, I9,6,6, I9,7,6, I9,8,6, I9,9,6, I9,0,5, Z5, I9,1,5, I9,2,5, I9,3,5, I9,4,5, I9,5,5, I9,6,5, I9,7,5, I9,8,5, I9,9,5, I9,0,4, Z4, I9,1,4, I9,2,4, I9,3,4, I9,4,4, I9,5,4, I9,6,4, I9,7,4, I9,8,4, I9,9,4, I9,0,3, Z3, I9,1,3, I9,2,3, I9,3,3, I9,4,3, I9,5,3, I9,6,3, I9,7,3, I9,8,3, I9,9,3, I9,0,2, Z2, I9,1,2, I9,2,2, I9,3,2, I9,4,2, I9,5,2, I9,6,2, I9,7,2, I9,8,2, I9,9,2, I9,0,1, Z1, I9,1,1, I9,2,1, I9,3,1, I9,4,1, I9,5,1, I9,6,1, I9,7,1, I9,8,1, I9,9,1, I9,0,0, Z0, I9,1,0, I9,2,0, I9,3,0, I9,4,0, I9,5,0, I9,6,0, I9,7,0, I9,8,0, I9,9,0, I8,0,9, X8, I8,1,9, I8,2,9, I8,3,9, I8,4,9, I8,5,9, I8,6,9, I8,7,9, I8,8,9, I8,9,9, I8,0,8, I8,1,8, I8,2,8, I8,3,8, I8,4,8, I8,5,8, I8,6,8, I8,7,8, I8,8,8, I8,9,8, I8,0,7, I8,1,7, I8,2,7, I8,3,7, I8,4,7, I8,5,7, I8,6,7, I8,7,7, I8,8,7, I8,9,7, I8,0,6, I8,1,6, I8,2,6, I8,3,6, I8,4,6, I8,5,6, I8,6,6, I8,7,6, I8,8,6, I8,9,6, I8,0,5, I8,1,5, I8,2,5, I8,3,5, I8,4,5, I8,5,5, I8,6,5, I8,7,5, I8,8,5, I8,9,5, I8,0,4, I8,1,4, I8,2,4, I8,3,4, I8,4,4, I8,5,4, I8,6,4, I8,7,4, I8,8,4, I8,9,4, I8,0,3, I8,1,3, I8,2,3, I8,3,3, I8,4,3, I8,5,3, I8,6,3, I8,7,3, I8,8,3, I8,9,3, I8,0,2, I8,1,2, I8,2,2, I8,3,2, I8,4,2, I8,5,2, I8,6,2, I8,7,2, I8,8,2, I8,9,2, I8,0,1, I8,1,1, I8,2,1, I8,3,1, I8,4,1, I8,5,1, I8,6,1, I8,7,1, I8,8,1, I8,9,1, I8,0,0, I8,1,0, I8,2,0, I8,3,0, I8,4,0, I8,5,0, I8,6,0, I8,7,0, I8,8,0, I8,9,0, I7,0,9, X7, I7,1,9, I7,2,9, I7,3,9, I7,4,9, I7,5,9, I7,6,9, I7,7,9, I7,8,9, I7,9,9, I7,0,8, I7,1,8, I7,2,8, I7,3,8, I7,4,8, I7,5,8, I7,6,8, I7,7,8, I7,8,8, I7,9,8, I7,0,7, I7,1,7, I7,2,7, I7,3,7, I7,4,7, I7,5,7, I7,6,7, I7,7,7, I7,8,7, I7,9,7, I7,0,6, I7,1,6, I7,2,6, I7,3,6, I7,4,6, I7,5,6, I7,6,6, I7,7,6, I7,8,6, I7,9,6, I7,0,5, I7,1,5, I7,2,5, I7,3,5, I7,4,5, I7,5,5, I7,6,5, I7,7,5, I7,8,5, I7,9,5, I7,0,4, I7,1,4, I7,2,4, I7,3,4, I7,4,4, I7,5,4, I7,6,4, I7,7,4, I7,8,4, I7,9,4, I7,0,3, I7,1,3, I7,2,3, I7,3,3, I7,4,3, I7,5,3, I7,6,3, I7,7,3, I7,8,3, I7,9,3, I7,0,2, I7,1,2, I7,2,2, I7,3,2, I7,4,2, I7,5,2, I7,6,2, I7,7,2, I7,8,2, I7,9,2, I7,0,1, I7,1,1, I7,2,1, I7,3,1, I7,4,1, I7,5,1, I7,6,1, I7,7,1, I7,8,1, I7,9,1, I7,0,0, I7,1,0, I7,2,0, I7,3,0, I7,4,0, I7,5,0, I7,6,0, I7,7,0, I7,8,0, I7,9,0, I6,0,9, X6, I6,1,9, I6,2,9, I6,3,9, I6,4,9, I6,5,9, I6,6,9, I6,7,9, I6,8,9, I6,9,9, I6,0,8, I6,1,8, I6,2,8, I6,3,8, I6,4,8, I6,5,8, I6,6,8, I6,7,8, I6,8,8, I6,9,8, I6,0,7, I6,1,7, I6,2,7, I6,3,7, I6,4,7, I6,5,7, I6,6,7, I6,7,7, I6,8,7, I6,9,7, I6,0,6, I6,1,6, I6,2,6, I6,3,6, I6,4,6, I6,5,6, I6,6,6, I6,7,6, I6,8,6, I6,9,6, I6,0,5, I6,1,5, I6,2,5, I6,3,5, I6,4,5, I6,5,5, I6,6,5, I6,7,5, I6,8,5, I6,9,5, I6,0,4, I6,1,4, I6,2,4, I6,3,4, I6,4,4, I6,5,4, I6,6,4, I6,7,4, I6,8,4, I6,9,4, I6,0,3, I6,1,3, I6,2,3, I6,3,3, I6,4,3, I6,5,3, I6,6,3, I6,7,3, I6,8,3, I6,9,3, I6,0,2, I6,1,2, I6,2,2, I6,3,2, I6,4,2, I6,5,2, I6,6,2, I6,7,2, I6,8,2, I6,9,2, I6,0,1, I6,1,1, I6,2,1, I6,3,1, I6,4,1, I6,5,1, I6,6,1, I6,7,1, I6,8,1, I6,9,1, I6,0,0, I6,1,0, I6,2,0, I6,3,0, I6,4,0, I6,5,0, I6,6,0, I6,7,0, I6,8,0, I6,9,0, I5,0,9, X5, I5,1,9, I5,2,9, I5,3,9, I5,4,9, I5,5,9, I5,6,9, I5,7,9, I5,8,9, I5,9,9, I5,0,8, I5,1,8, I5,2,8, I5,3,8, I5,4,8, I5,5,8, I5,6,8, I5,7,8, I5,8,8, I5,9,8, I5,0,7, I5,1,7, I5,2,7, I5,3,7, I5,4,7, I5,5,7, I5,6,7, I5,7,7, I5,8,7, I5,9,7, I5,0,6, I5,1,6, I5,2,6, I5,3,6, I5,4,6, I5,5,6, I5,6,6, I5,7,6, I5,8,6, I5,9,6, I5,0,5, I5,1,5, I5,2,5, I5,3,5, I5,4,5, I5,5,5, I5,6,5, I5,7,5, I5,8,5, I5,9,5, I5,0,4, I5,1,4, I5,2,4, I5,3,4, I5,4,4, I5,5,4, I5,6,4, I5,7,4, I5,8,4, I5,9,4, I5,0,3, I5,1,3, I5,2,3, I5,3,3, I5,4,3, I5,5,3, I5,6,3, I5,7,3, I5,8,3, I5,9,3, I5,0,2, I5,1,2, I5,2,2, I5,3,2, I5,4,2, I5,5,2, I5,6,2, I5,7,2, I5,8,2, I5,9,2, I5,0,1, I5,1,1, I5,2,1, I5,3,1, I5,4,1, I5,5,1, I5,6,1, I5,7,1, I5,8,1, I5,9,1, I5,0,0, I5,1,0, I5,2,0, I5,3,0, I5,4,0, I5,5,0, I5,6,0, I5,7,0, I5,8,0, I5,9,0, I4,0,9, X4, I4,1,9, I4,2,9, I4,3,9, I4,4,9, I4,5,9, I4,6,9, I4,7,9, I4,8,9, I4,9,9, I4,0,8, I4,1,8, I4,2,8, I4,3,8, I4,4,8, I4,5,8, I4,6,8, I4,7,8, I4,8,8, I4,9,8, I4,0,7, I4,1,7, I4,2,7, I4,3,7, I4,4,7, I4,5,7, I4,6,7, I4,7,7, I4,8,7, I4,9,7, I4,0,6, I4,1,6, I4,2,6, I4,3,6, I4,4,6, I4,5,6, I4,6,6, I4,7,6, I4,8,6, I4,9,6, I4,0,5, I4,1,5, I4,2,5, I4,3,5, I4,4,5, I4,5,5, I4,6,5, I4,7,5, I4,8,5, I4,9,5, I4,0,4, I4,1,4, I4,2,4, I4,3,4, I4,4,4, I4,5,4, I4,6,4, I4,7,4, I4,8,4, I4,9,4, I4,0,3, I4,1,3, I4,2,3, I4,3,3, I4,4,3, I4,5,3, I4,6,3, I4,7,3, I4,8,3, I4,9,3, I4,0,2, I4,1,2, I4,2,2, I4,3,2, I4,4,2, I4,5,2, I4,6,2, I4,7,2, I4,8,2, I4,9,2, I4,0,1, I4,1,1, I4,2,1, I4,3,1, I4,4,1, I4,5,1, I4,6,1, I4,7,1, I4,8,1, I4,9,1, I4,0,0, I4,1,0, I4,2,0, I4,3,0, I4,4,0, I4,5,0, I4,6,0, I4,7,0, I4,8,0, I4,9,0, I3,0,9, X3, I3,1,9, I3,2,9, I3,3,9, I3,4,9, I3,5,9, I3,6,9, I3,7,9, I3,8,9, I3,9,9, I3,0,8, I3,1,8, I3,2,8, I3,3,8, I3,4,8, I3,5,8, I3,6,8, I3,7,8, I3,8,8, I3,9,8, I3,0,7, I3,1,7, I3,2,7, I3,3,7, I3,4,7, I3,5,7, I3,6,7, I3,7,7, I3,8,7, I3,9,7, I3,0,6, I3,1,6, I3,2,6, I3,3,6, I3,4,6, I3,5,6, I3,6,6, I3,7,6, I3,8,6, I3,9,6, I3,0,5, I3,1,5, I3,2,5, I3,3,5, I3,4,5, I3,5,5, I3,6,5, I3,7,5, I3,8,5, I3,9,5, I3,0,4, I3,1,4, I3,2,4, I3,3,4, I3,4,4, I3,5,4, I3,6,4, I3,7,4, I3,8,4, I3,9,4, I3,0,3, I3,1,3, I3,2,3, I3,3,3, I3,4,3, I3,5,3, I3,6,3, I3,7,3, I3,8,3, I3,9,3, I3,0,2, I3,1,2, I3,2,2, I3,3,2, I3,4,2, I3,5,2, I3,6,2, I3,7,2, I3,8,2, I3,9,2, I3,0,1, I3,1,1, I3,2,1, I3,3,1, I3,4,1, I3,5,1, I3,6,1, I3,7,1, I3,8,1, I3,9,1, I3,0,0, I3,1,0, I3,2,0, I3,3,0, I3,4,0, I3,5,0, I3,6,0, I3,7,0, I3,8,0, I3,9,0, I2,0,9, X2, I2,1,9, I2,2,9, I2,3,9, I2,4,9, I2,5,9, I2,6,9, I2,7,9, I2,8,9, I2,9,9, I2,0,8, I2,1,8, I2,2,8, I2,3,8, I2,4,8, I2,5,8, I2,6,8, I2,7,8, I2,8,8, I2,9,8, I2,0,7, I2,1,7, I2,2,7, I2,3,7, I2,4,7, I2,5,7, I2,6,7, I2,7,7, I2,8,7, I2,9,7, I2,0,6, I2,1,6, I2,2,6, I2,3,6, I2,4,6, I2,5,6, I2,6,6, I2,7,6, I2,8,6, I2,9,6, I2,0,5, I2,1,5, I2,2,5, I2,3,5, I2,4,5, I2,5,5, I2,6,5, I2,7,5, I2,8,5, I2,9,5, I2,0,4, I2,1,4, I2,2,4, I2,3,4, I2,4,4, I2,5,4, I2,6,4, I2,7,4, I2,8,4, I2,9,4, I2,0,3, I2,1,3, I2,2,3, I2,3,3, I2,4,3, I2,5,3, I2,6,3, I2,7,3, I2,8,3, I2,9,3, I2,0,2, I2,1,2, I2,2,2, I2,3,2, I2,4,2, I2,5,2, I2,6,2, I2,7,2, I2,8,2, I2,9,2, I2,0,1, I2,1,1, I2,2,1, I2,3,1, I2,4,1, I2,5,1, I2,6,1, I2,7,1, I2,8,1, I2,9,1, I2,0,0, I2,1,0, I2,2,0, I2,3,0, I2,4,0, I2,5,0, I2,6,0, I2,7,0, I2,8,0, I2,9,0, I1,0,9, X1, I1,1,9, I1,2,9, I1,3,9, I1,4,9, I1,5,9, I1,6,9, I1,7,9, I1,8,9, I1,9,9, I1,0,8, I1,1,8, I1,2,8, I1,3,8, I1,4,8, I1,5,8, I1,6,8, I1,7,8, I1,8,8, I1,9,8, I1,0,7, I1,1,7, I1,2,7, I1,3,7, I1,4,7, I1,5,7, I1,6,7, I1,7,7, I1,8,7, I1,9,7, I1,0,6, I1,1,6, I1,2,6, I1,3,6, I1,4,6, I1,5,6, I1,6,6, I1,7,6, I1,8,6, I1,9,6, I1,0,5, I1,1,5, I1,2,5, I1,3,5, I1,4,5, I1,5,5, I1,6,5, I1,7,5, I1,8,5, I1,9,5, I1,0,4, I1,1,4, I1,2,4, I1,3,4, I1,4,4, I1,5,4, I1,6,4, I1,7,4, I1,8,4, I1,9,4, I1,0,3, I1,1,3, I1,2,3, I1,3,3, I1,4,3, I1,5,3, I1,6,3, I1,7,3, I1,8,3, I1,9,3, I1,0,2, I1,1,2, I1,2,2, I1,3,2, I1,4,2, I1,5,2, I1,6,2, I1,7,2, I1,8,2, I1,9,2, I1,0,1, I1,1,1, I1,2,1, I1,3,1, I1,4,1, I1,5,1, I1,6,1, I1,7,1, I1,8,1, I1,9,1, I1,0,0, I1,1,0, I1,2,0, I1,3,0, I1,4,0, I1,5,0, I1,6,0, I1,7,0, I1,8,0, I1,9,0, I0,0,9, X0, I0,1,9, I0,2,9, I0,3,9, I0,4,9, I0,5,9, I0,6,9, I0,7,9, I0,8,9, I0,9,9, I0,0,8, I0,1,8, I0,2,8, I0,3,8, I0,4,8, I0,5,8, I0,6,8, I0,7,8, I0,8,8, I0,9,8, I0,0,7, I0,1,7, I0,2,7, I0,3,7, I0,4,7, I0,5,7, I0,6,7, I0,7,7, I0,8,7, I0,9,7, I0,0,6, I0,1,6, I0,2,6, I0,3,6, I0,4,6, I0,5,6, I0,6,6, I0,7,6, I0,8,6, I0,9,6, I0,0,5, I0,1,5, I0,2,5, I0,3,5, I0,4,5, I0,5,5, I0,6,5, I0,7,5, I0,8,5, I0,9,5, I0,0,4, I0,1,4, I0,2,4, I0,3,4, I0,4,4, I0,5,4, I0,6,4, I0,7,4, I0,8,4, I0,9,4, I0,0,3, I0,1,3, I0,2,3, I0,3,3, I0,4,3, I0,5,3, I0,6,3, I0,7,3, I0,8,3, I0,9,3, I0,0,2, I0,1,2, I0,2,2, I0,3,2, I0,4,2, I0,5,2, I0,6,2, I0,7,2, I0,8,2, I0,9,2, I0,0,1, I0,1,1, I0,2,1, I0,3,1, I0,4,1, I0,5,1, I0,6,1, I0,7,1, I0,8,1, I0,9,1, I0,0,0, I0,1,0, I0,2,0, I0,3,0, I0,4,0, I0,5,0, I0,6,0, I0,7,0, I0,8,0, I0,9,0}),backend=torch, dtype=torch.float32, data=tensor(1., device='cuda:0')
" ], "text/plain": [ "TensorNetwork3D(tensors=1, indices=0, Lx=10, Ly=10, Lz=10, max_bond=1)" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tn.contract_compressed_(\n", " optimize=tree.get_path(), # or optimize=copt\n", " max_bond=chi,\n", " equalize_norms=1.0,\n", " progbar=True,\n", ")" ] }, { "cell_type": "markdown", "id": "42e99f20-0666-48c1-bbad-84875f056ba6", "metadata": {}, "source": [ "Note becuase its a large contraction, we perform in inplace and accumulate the norms of all intermediate tensors into `tn.exponent`." ] }, { "cell_type": "code", "execution_count": 9, "id": "92952bd7-2f0a-41d4-bca6-fedeb495e37e", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(tensor(1., device='cuda:0'), tensor(379.5602, device='cuda:0'))" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "mantissa, exponent = (tn.contract(), tn.exponent)\n", "mantissa, exponent" ] }, { "cell_type": "markdown", "id": "be2e7bcb-ca5b-4e5f-b041-ac3b222e04e1", "metadata": {}, "source": [ "So our final partition function is $Z=1\\times10^{379.5602}$.\n", "\n", "If we just change the entries of the tensor network (and not the actual geometry) then we can reuse the same path or optimizer.\n", "For example here we just change the inverse temperature of the model, $\\beta$:" ] }, { "cell_type": "code", "execution_count": 10, "id": "3c48d2a8-6b93-49f5-8e89-e2e29ebe6020", "metadata": {}, "outputs": [], "source": [ "tn = qtn.TN3D_classical_ising_partition_function(10, 10, 10, beta=0.25)\n", "tn.apply_to_arrays(to_backend)" ] }, { "cell_type": "code", "execution_count": 11, "id": "ba28dc45-8c82-4281-81d7-606145e04e54", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "log2[SIZE]: 0.00/21.00: 100%|███████████████████████████████████████| 999/999 [00:10<00:00, 91.62it/s]\n" ] }, { "data": { "text/html": [ "
TensorNetwork3D(tensors=1, indices=0, Lx=10, Ly=10, Lz=10, max_bond=1)
Tensor(shape=(), inds=[], tags={I9,0,9, X9, Y0, Z9, I9,1,9, Y1, I9,2,9, Y2, I9,3,9, Y3, I9,4,9, Y4, I9,5,9, Y5, I9,6,9, Y6, I9,7,9, Y7, I9,8,9, Y8, I9,9,9, Y9, I9,0,8, Z8, I9,1,8, I9,2,8, I9,3,8, I9,4,8, I9,5,8, I9,6,8, I9,7,8, I9,8,8, I9,9,8, I9,0,7, Z7, I9,1,7, I9,2,7, I9,3,7, I9,4,7, I9,5,7, I9,6,7, I9,7,7, I9,8,7, I9,9,7, I9,0,6, Z6, I9,1,6, I9,2,6, I9,3,6, I9,4,6, I9,5,6, I9,6,6, I9,7,6, I9,8,6, I9,9,6, I9,0,5, Z5, I9,1,5, I9,2,5, I9,3,5, I9,4,5, I9,5,5, I9,6,5, I9,7,5, I9,8,5, I9,9,5, I9,0,4, Z4, I9,1,4, I9,2,4, I9,3,4, I9,4,4, I9,5,4, I9,6,4, I9,7,4, I9,8,4, I9,9,4, I9,0,3, Z3, I9,1,3, I9,2,3, I9,3,3, I9,4,3, I9,5,3, I9,6,3, I9,7,3, I9,8,3, I9,9,3, I9,0,2, Z2, I9,1,2, I9,2,2, I9,3,2, I9,4,2, I9,5,2, I9,6,2, I9,7,2, I9,8,2, I9,9,2, I9,0,1, Z1, I9,1,1, I9,2,1, I9,3,1, I9,4,1, I9,5,1, I9,6,1, I9,7,1, I9,8,1, I9,9,1, I9,0,0, Z0, I9,1,0, I9,2,0, I9,3,0, I9,4,0, I9,5,0, I9,6,0, I9,7,0, I9,8,0, I9,9,0, I8,0,9, X8, I8,1,9, I8,2,9, I8,3,9, I8,4,9, I8,5,9, I8,6,9, I8,7,9, I8,8,9, I8,9,9, I8,0,8, I8,1,8, I8,2,8, I8,3,8, I8,4,8, I8,5,8, I8,6,8, I8,7,8, I8,8,8, I8,9,8, I8,0,7, I8,1,7, I8,2,7, I8,3,7, I8,4,7, I8,5,7, I8,6,7, I8,7,7, I8,8,7, I8,9,7, I8,0,6, I8,1,6, I8,2,6, I8,3,6, I8,4,6, I8,5,6, I8,6,6, I8,7,6, I8,8,6, I8,9,6, I8,0,5, I8,1,5, I8,2,5, I8,3,5, I8,4,5, I8,5,5, I8,6,5, I8,7,5, I8,8,5, I8,9,5, I8,0,4, I8,1,4, I8,2,4, I8,3,4, I8,4,4, I8,5,4, I8,6,4, I8,7,4, I8,8,4, I8,9,4, I8,0,3, I8,1,3, I8,2,3, I8,3,3, I8,4,3, I8,5,3, I8,6,3, I8,7,3, I8,8,3, I8,9,3, I8,0,2, I8,1,2, I8,2,2, I8,3,2, I8,4,2, I8,5,2, I8,6,2, I8,7,2, I8,8,2, I8,9,2, I8,0,1, I8,1,1, I8,2,1, I8,3,1, I8,4,1, I8,5,1, I8,6,1, I8,7,1, I8,8,1, I8,9,1, I8,0,0, I8,1,0, I8,2,0, I8,3,0, I8,4,0, I8,5,0, I8,6,0, I8,7,0, I8,8,0, I8,9,0, I7,0,9, X7, I7,1,9, I7,2,9, I7,3,9, I7,4,9, I7,5,9, I7,6,9, I7,7,9, I7,8,9, I7,9,9, I7,0,8, I7,1,8, I7,2,8, I7,3,8, I7,4,8, I7,5,8, I7,6,8, I7,7,8, I7,8,8, I7,9,8, I7,0,7, I7,1,7, I7,2,7, I7,3,7, I7,4,7, I7,5,7, I7,6,7, I7,7,7, I7,8,7, I7,9,7, I7,0,6, I7,1,6, I7,2,6, I7,3,6, I7,4,6, I7,5,6, I7,6,6, I7,7,6, I7,8,6, I7,9,6, I7,0,5, I7,1,5, I7,2,5, I7,3,5, I7,4,5, I7,5,5, I7,6,5, I7,7,5, I7,8,5, I7,9,5, I7,0,4, I7,1,4, I7,2,4, I7,3,4, I7,4,4, I7,5,4, I7,6,4, I7,7,4, I7,8,4, I7,9,4, I7,0,3, I7,1,3, I7,2,3, I7,3,3, I7,4,3, I7,5,3, I7,6,3, I7,7,3, I7,8,3, I7,9,3, I7,0,2, I7,1,2, I7,2,2, I7,3,2, I7,4,2, I7,5,2, I7,6,2, I7,7,2, I7,8,2, I7,9,2, I7,0,1, I7,1,1, I7,2,1, I7,3,1, I7,4,1, I7,5,1, I7,6,1, I7,7,1, I7,8,1, I7,9,1, I7,0,0, I7,1,0, I7,2,0, I7,3,0, I7,4,0, I7,5,0, I7,6,0, I7,7,0, I7,8,0, I7,9,0, I6,0,9, X6, I6,1,9, I6,2,9, I6,3,9, I6,4,9, I6,5,9, I6,6,9, I6,7,9, I6,8,9, I6,9,9, I6,0,8, I6,1,8, I6,2,8, I6,3,8, I6,4,8, I6,5,8, I6,6,8, I6,7,8, I6,8,8, I6,9,8, I6,0,7, I6,1,7, I6,2,7, I6,3,7, I6,4,7, I6,5,7, I6,6,7, I6,7,7, I6,8,7, I6,9,7, I6,0,6, I6,1,6, I6,2,6, I6,3,6, I6,4,6, I6,5,6, I6,6,6, I6,7,6, I6,8,6, I6,9,6, I6,0,5, I6,1,5, I6,2,5, I6,3,5, I6,4,5, I6,5,5, I6,6,5, I6,7,5, I6,8,5, I6,9,5, I6,0,4, I6,1,4, I6,2,4, I6,3,4, I6,4,4, I6,5,4, I6,6,4, I6,7,4, I6,8,4, I6,9,4, I6,0,3, I6,1,3, I6,2,3, I6,3,3, I6,4,3, I6,5,3, I6,6,3, I6,7,3, I6,8,3, I6,9,3, I6,0,2, I6,1,2, I6,2,2, I6,3,2, I6,4,2, I6,5,2, I6,6,2, I6,7,2, I6,8,2, I6,9,2, I6,0,1, I6,1,1, I6,2,1, I6,3,1, I6,4,1, I6,5,1, I6,6,1, I6,7,1, I6,8,1, I6,9,1, I6,0,0, I6,1,0, I6,2,0, I6,3,0, I6,4,0, I6,5,0, I6,6,0, I6,7,0, I6,8,0, I6,9,0, I5,0,9, X5, I5,1,9, I5,2,9, I5,3,9, I5,4,9, I5,5,9, I5,6,9, I5,7,9, I5,8,9, I5,9,9, I5,0,8, I5,1,8, I5,2,8, I5,3,8, I5,4,8, I5,5,8, I5,6,8, I5,7,8, I5,8,8, I5,9,8, I5,0,7, I5,1,7, I5,2,7, I5,3,7, I5,4,7, I5,5,7, I5,6,7, I5,7,7, I5,8,7, I5,9,7, I5,0,6, I5,1,6, I5,2,6, I5,3,6, I5,4,6, I5,5,6, I5,6,6, I5,7,6, I5,8,6, I5,9,6, I5,0,5, I5,1,5, I5,2,5, I5,3,5, I5,4,5, I5,5,5, I5,6,5, I5,7,5, I5,8,5, I5,9,5, I5,0,4, I5,1,4, I5,2,4, I5,3,4, I5,4,4, I5,5,4, I5,6,4, I5,7,4, I5,8,4, I5,9,4, I5,0,3, I5,1,3, I5,2,3, I5,3,3, I5,4,3, I5,5,3, I5,6,3, I5,7,3, I5,8,3, I5,9,3, I5,0,2, I5,1,2, I5,2,2, I5,3,2, I5,4,2, I5,5,2, I5,6,2, I5,7,2, I5,8,2, I5,9,2, I5,0,1, I5,1,1, I5,2,1, I5,3,1, I5,4,1, I5,5,1, I5,6,1, I5,7,1, I5,8,1, I5,9,1, I5,0,0, I5,1,0, I5,2,0, I5,3,0, I5,4,0, I5,5,0, I5,6,0, I5,7,0, I5,8,0, I5,9,0, I4,0,9, X4, I4,1,9, I4,2,9, I4,3,9, I4,4,9, I4,5,9, I4,6,9, I4,7,9, I4,8,9, I4,9,9, I4,0,8, I4,1,8, I4,2,8, I4,3,8, I4,4,8, I4,5,8, I4,6,8, I4,7,8, I4,8,8, I4,9,8, I4,0,7, I4,1,7, I4,2,7, I4,3,7, I4,4,7, I4,5,7, I4,6,7, I4,7,7, I4,8,7, I4,9,7, I4,0,6, I4,1,6, I4,2,6, I4,3,6, I4,4,6, I4,5,6, I4,6,6, I4,7,6, I4,8,6, I4,9,6, I4,0,5, I4,1,5, I4,2,5, I4,3,5, I4,4,5, I4,5,5, I4,6,5, I4,7,5, I4,8,5, I4,9,5, I4,0,4, I4,1,4, I4,2,4, I4,3,4, I4,4,4, I4,5,4, I4,6,4, I4,7,4, I4,8,4, I4,9,4, I4,0,3, I4,1,3, I4,2,3, I4,3,3, I4,4,3, I4,5,3, I4,6,3, I4,7,3, I4,8,3, I4,9,3, I4,0,2, I4,1,2, I4,2,2, I4,3,2, I4,4,2, I4,5,2, I4,6,2, I4,7,2, I4,8,2, I4,9,2, I4,0,1, I4,1,1, I4,2,1, I4,3,1, I4,4,1, I4,5,1, I4,6,1, I4,7,1, I4,8,1, I4,9,1, I4,0,0, I4,1,0, I4,2,0, I4,3,0, I4,4,0, I4,5,0, I4,6,0, I4,7,0, I4,8,0, I4,9,0, I3,0,9, X3, I3,1,9, I3,2,9, I3,3,9, I3,4,9, I3,5,9, I3,6,9, I3,7,9, I3,8,9, I3,9,9, I3,0,8, I3,1,8, I3,2,8, I3,3,8, I3,4,8, I3,5,8, I3,6,8, I3,7,8, I3,8,8, I3,9,8, I3,0,7, I3,1,7, I3,2,7, I3,3,7, I3,4,7, I3,5,7, I3,6,7, I3,7,7, I3,8,7, I3,9,7, I3,0,6, I3,1,6, I3,2,6, I3,3,6, I3,4,6, I3,5,6, I3,6,6, I3,7,6, I3,8,6, I3,9,6, I3,0,5, I3,1,5, I3,2,5, I3,3,5, I3,4,5, I3,5,5, I3,6,5, I3,7,5, I3,8,5, I3,9,5, I3,0,4, I3,1,4, I3,2,4, I3,3,4, I3,4,4, I3,5,4, I3,6,4, I3,7,4, I3,8,4, I3,9,4, I3,0,3, I3,1,3, I3,2,3, I3,3,3, I3,4,3, I3,5,3, I3,6,3, I3,7,3, I3,8,3, I3,9,3, I3,0,2, I3,1,2, I3,2,2, I3,3,2, I3,4,2, I3,5,2, I3,6,2, I3,7,2, I3,8,2, I3,9,2, I3,0,1, I3,1,1, I3,2,1, I3,3,1, I3,4,1, I3,5,1, I3,6,1, I3,7,1, I3,8,1, I3,9,1, I3,0,0, I3,1,0, I3,2,0, I3,3,0, I3,4,0, I3,5,0, I3,6,0, I3,7,0, I3,8,0, I3,9,0, I2,0,9, X2, I2,1,9, I2,2,9, I2,3,9, I2,4,9, I2,5,9, I2,6,9, I2,7,9, I2,8,9, I2,9,9, I2,0,8, I2,1,8, I2,2,8, I2,3,8, I2,4,8, I2,5,8, I2,6,8, I2,7,8, I2,8,8, I2,9,8, I2,0,7, I2,1,7, I2,2,7, I2,3,7, I2,4,7, I2,5,7, I2,6,7, I2,7,7, I2,8,7, I2,9,7, I2,0,6, I2,1,6, I2,2,6, I2,3,6, I2,4,6, I2,5,6, I2,6,6, I2,7,6, I2,8,6, I2,9,6, I2,0,5, I2,1,5, I2,2,5, I2,3,5, I2,4,5, I2,5,5, I2,6,5, I2,7,5, I2,8,5, I2,9,5, I2,0,4, I2,1,4, I2,2,4, I2,3,4, I2,4,4, I2,5,4, I2,6,4, I2,7,4, I2,8,4, I2,9,4, I2,0,3, I2,1,3, I2,2,3, I2,3,3, I2,4,3, I2,5,3, I2,6,3, I2,7,3, I2,8,3, I2,9,3, I2,0,2, I2,1,2, I2,2,2, I2,3,2, I2,4,2, I2,5,2, I2,6,2, I2,7,2, I2,8,2, I2,9,2, I2,0,1, I2,1,1, I2,2,1, I2,3,1, I2,4,1, I2,5,1, I2,6,1, I2,7,1, I2,8,1, I2,9,1, I2,0,0, I2,1,0, I2,2,0, I2,3,0, I2,4,0, I2,5,0, I2,6,0, I2,7,0, I2,8,0, I2,9,0, I1,0,9, X1, I1,1,9, I1,2,9, I1,3,9, I1,4,9, I1,5,9, I1,6,9, I1,7,9, I1,8,9, I1,9,9, I1,0,8, I1,1,8, I1,2,8, I1,3,8, I1,4,8, I1,5,8, I1,6,8, I1,7,8, I1,8,8, I1,9,8, I1,0,7, I1,1,7, I1,2,7, I1,3,7, I1,4,7, I1,5,7, I1,6,7, I1,7,7, I1,8,7, I1,9,7, I1,0,6, I1,1,6, I1,2,6, I1,3,6, I1,4,6, I1,5,6, I1,6,6, I1,7,6, I1,8,6, I1,9,6, I1,0,5, I1,1,5, I1,2,5, I1,3,5, I1,4,5, I1,5,5, I1,6,5, I1,7,5, I1,8,5, I1,9,5, I1,0,4, I1,1,4, I1,2,4, I1,3,4, I1,4,4, I1,5,4, I1,6,4, I1,7,4, I1,8,4, I1,9,4, I1,0,3, I1,1,3, I1,2,3, I1,3,3, I1,4,3, I1,5,3, I1,6,3, I1,7,3, I1,8,3, I1,9,3, I1,0,2, I1,1,2, I1,2,2, I1,3,2, I1,4,2, I1,5,2, I1,6,2, I1,7,2, I1,8,2, I1,9,2, I1,0,1, I1,1,1, I1,2,1, I1,3,1, I1,4,1, I1,5,1, I1,6,1, I1,7,1, I1,8,1, I1,9,1, I1,0,0, I1,1,0, I1,2,0, I1,3,0, I1,4,0, I1,5,0, I1,6,0, I1,7,0, I1,8,0, I1,9,0, I0,0,9, X0, I0,1,9, I0,2,9, I0,3,9, I0,4,9, I0,5,9, I0,6,9, I0,7,9, I0,8,9, I0,9,9, I0,0,8, I0,1,8, I0,2,8, I0,3,8, I0,4,8, I0,5,8, I0,6,8, I0,7,8, I0,8,8, I0,9,8, I0,0,7, I0,1,7, I0,2,7, I0,3,7, I0,4,7, I0,5,7, I0,6,7, I0,7,7, I0,8,7, I0,9,7, I0,0,6, I0,1,6, I0,2,6, I0,3,6, I0,4,6, I0,5,6, I0,6,6, I0,7,6, I0,8,6, I0,9,6, I0,0,5, I0,1,5, I0,2,5, I0,3,5, I0,4,5, I0,5,5, I0,6,5, I0,7,5, I0,8,5, I0,9,5, I0,0,4, I0,1,4, I0,2,4, I0,3,4, I0,4,4, I0,5,4, I0,6,4, I0,7,4, I0,8,4, I0,9,4, I0,0,3, I0,1,3, I0,2,3, I0,3,3, I0,4,3, I0,5,3, I0,6,3, I0,7,3, I0,8,3, I0,9,3, I0,0,2, I0,1,2, I0,2,2, I0,3,2, I0,4,2, I0,5,2, I0,6,2, I0,7,2, I0,8,2, I0,9,2, I0,0,1, I0,1,1, I0,2,1, I0,3,1, I0,4,1, I0,5,1, I0,6,1, I0,7,1, I0,8,1, I0,9,1, I0,0,0, I0,1,0, I0,2,0, I0,3,0, I0,4,0, I0,5,0, I0,6,0, I0,7,0, I0,8,0, I0,9,0}),backend=torch, dtype=torch.float32, data=tensor(1., device='cuda:0')
" ], "text/plain": [ "TensorNetwork3D(tensors=1, indices=0, Lx=10, Ly=10, Lz=10, max_bond=1)" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tn.contract_compressed_(\n", " optimize=copt, # here we demonstrate the cache of the optimizer\n", " max_bond=chi,\n", " equalize_norms=1.0,\n", " progbar=True,\n", ")" ] }, { "cell_type": "code", "execution_count": 12, "id": "acc3feaa-d36c-4c2d-a3dd-3299fe693c2e", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(tensor(1., device='cuda:0'), tensor(344.7334, device='cuda:0'))" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "mantissa, exponent = (tn.contract(), tn.exponent)\n", "mantissa, exponent" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3" } }, "nbformat": 4, "nbformat_minor": 5 } ================================================ FILE: docs/examples/ex_large_output_lazy.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "id": "48db7bce", "metadata": {}, "source": [ "# Contracting a large output lazily\n", "\n", "In this example we generate perform a contraction with an\n", "output that would be larger than can fit in memory.\n", "However we can still generate it in chunks which is\n", "sufficient to compute for example:\n", "\n", "$$\n", "S = - \\sum_{\\{a, b, c, \\ldots\\}} p_{a, b, c, \\ldots} \\log p_{a, b, c, \\ldots}\n", "$$" ] }, { "cell_type": "code", "execution_count": 1, "id": "9724fa7d-a982-477d-b96b-0170d64fa6a4", "metadata": {}, "outputs": [], "source": [ "%config InlineBackend.figure_formats = ['svg']\n", "import quimb.tensor as qtn\n", "from autoray import do\n", "\n", "import cotengra as ctg" ] }, { "cell_type": "markdown", "id": "8a706dc0-3bff-4585-a6c1-b4efb889d96f", "metadata": {}, "source": [ "Use quimb to make an example factor graph / probability distribution:" ] }, { "cell_type": "code", "execution_count": 2, "id": "7a84d1c9-a922-42ea-b507-a3f46b88ee2b", "metadata": {}, "outputs": [], "source": [ "htn = qtn.HTN3D_classical_ising_partition_function(\n", " 6,\n", " 6,\n", " 6,\n", " beta=0.3,\n", ")" ] }, { "cell_type": "markdown", "id": "8e3c972a", "metadata": {}, "source": [ "Here we optionally first convert the tensor network's data to cupy GPU arrays:" ] }, { "cell_type": "code", "execution_count": 3, "id": "7ac01629", "metadata": {}, "outputs": [], "source": [ "def to_backend(x):\n", " import cupy\n", "\n", " return cupy.asarray(x, dtype=\"float32\")\n", "\n", "\n", "htn.apply_to_arrays(to_backend)" ] }, { "cell_type": "markdown", "id": "110d1659-4e86-408c-98be-a32c4bd7e5a6", "metadata": {}, "source": [ "Select a subset of output variables (more than we can store the full tensor for!):" ] }, { "cell_type": "code", "execution_count": 4, "id": "80b1d3f3-2d21-4594-885c-b08088d26e03", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "36" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "output_inds = tuple(\n", " f\"s{i},{j},{k}\" for i in range(4) for j in range(3) for k in range(3)\n", ")\n", "len(output_inds)" ] }, { "cell_type": "code", "execution_count": 5, "id": "0de83219-7eea-4366-a2e0-ab1367970380", "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "" ], "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "htn.draw(highlight_inds=output_inds)" ] }, { "cell_type": "code", "execution_count": 6, "id": "4400dfe4-115f-4d58-9b1d-c12213396f91", "metadata": {}, "outputs": [], "source": [ "opt = ctg.ReusableHyperOptimizer(\n", " minimize=\"combo\",\n", " # here we put the actual amount of storage we are limited to\n", " slicing_reconf_opts={\"target_size\": 2**28},\n", " # the amount of time we want to spend searching\n", " # given we can compute at approximately 1e10 ops / sec\n", " max_time=\"rate:1e11\",\n", " progbar=True,\n", ")" ] }, { "cell_type": "markdown", "id": "dd3daa4d-de8a-4963-bde8-a4760279199c", "metadata": {}, "source": [ "First if we need to normalize we compute the full partition function:" ] }, { "cell_type": "code", "execution_count": 7, "id": "9463072f-4d1e-404f-9be5-334f717bf86a", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "log2[SIZE]: 28.00 log10[FLOPs]: 12.80: 24%|█████████▉ | 31/128 [01:04<03:22, 2.09s/it]\n" ] } ], "source": [ "tree_Z = htn.contraction_tree(output_inds=(), optimize=opt)" ] }, { "cell_type": "markdown", "id": "6c0bd2b3", "metadata": {}, "source": [ "Since it could be a very large or small number we actively renormalize the\n", "tensors while contracting into a separate mantissa and exponent:" ] }, { "cell_type": "code", "execution_count": 8, "id": "953e8dd4-25e0-4f36-a39c-cbf87f0e3236", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "100%|█████████████████████████████████████████████████████████████████████████████████| 32/32 [00:07<00:00, 4.56it/s]\n" ] }, { "data": { "text/plain": [ "(array(4.2891397, dtype=float32), array(78.32228, dtype=float32))" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Z_mantissa, Z_exponent = tree_Z.contract(\n", " htn.arrays, strip_exponent=True, progbar=True\n", ")\n", "Z_mantissa, Z_exponent" ] }, { "cell_type": "code", "execution_count": 9, "id": "896187e0-98de-4479-bd1f-77bb5c2d1d03", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
TensorNetwork(tensors=540, indices=216)
Tensor(shape=(2, 2), inds=[s0,0,0, s1,0,0], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,0,0, s0,1,0], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,0,0, s0,0,1], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,0,1, s1,0,1], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,0,1, s0,1,1], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,0,1, s0,0,2], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,0,2, s1,0,2], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,0,2, s0,1,2], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,0,2, s0,0,3], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,0,3, s1,0,3], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,0,3, s0,1,3], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,0,3, s0,0,4], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,0,4, s1,0,4], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,0,4, s0,1,4], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,0,4, s0,0,5], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,0,5, s1,0,5], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,0,5, s0,1,5], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,1,0, s1,1,0], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,1,0, s0,2,0], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,1,0, s0,1,1], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,1,1, s1,1,1], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,1,1, s0,2,1], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,1,1, s0,1,2], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,1,2, s1,1,2], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,1,2, s0,2,2], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,1,2, s0,1,3], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,1,3, s1,1,3], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,1,3, s0,2,3], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,1,3, s0,1,4], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,1,4, s1,1,4], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,1,4, s0,2,4], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,1,4, s0,1,5], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,1,5, s1,1,5], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,1,5, s0,2,5], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,2,0, s1,2,0], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,2,0, s0,3,0], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,2,0, s0,2,1], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,2,1, s1,2,1], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,2,1, s0,3,1], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,2,1, s0,2,2], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,2,2, s1,2,2], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,2,2, s0,3,2], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,2,2, s0,2,3], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,2,3, s1,2,3], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,2,3, s0,3,3], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,2,3, s0,2,4], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,2,4, s1,2,4], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,2,4, s0,3,4], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,2,4, s0,2,5], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,2,5, s1,2,5], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,2,5, s0,3,5], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,3,0, s1,3,0], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,3,0, s0,4,0], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,3,0, s0,3,1], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,3,1, s1,3,1], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,3,1, s0,4,1], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,3,1, s0,3,2], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,3,2, s1,3,2], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,3,2, s0,4,2], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,3,2, s0,3,3], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,3,3, s1,3,3], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,3,3, s0,4,3], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,3,3, s0,3,4], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,3,4, s1,3,4], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,3,4, s0,4,4], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,3,4, s0,3,5], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,3,5, s1,3,5], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,3,5, s0,4,5], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,4,0, s1,4,0], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,4,0, s0,5,0], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,4,0, s0,4,1], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,4,1, s1,4,1], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,4,1, s0,5,1], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,4,1, s0,4,2], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,4,2, s1,4,2], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,4,2, s0,5,2], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,4,2, s0,4,3], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,4,3, s1,4,3], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,4,3, s0,5,3], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,4,3, s0,4,4], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,4,4, s1,4,4], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,4,4, s0,5,4], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,4,4, s0,4,5], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,4,5, s1,4,5], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,4,5, s0,5,5], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,5,0, s1,5,0], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,5,0, s0,5,1], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,5,1, s1,5,1], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,5,1, s0,5,2], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,5,2, s1,5,2], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,5,2, s0,5,3], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,5,3, s1,5,3], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,5,3, s0,5,4], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,5,4, s1,5,4], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,5,4, s0,5,5], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s0,5,5, s1,5,5], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s1,0,0, s2,0,0], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s1,0,0, s1,1,0], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s1,0,0, s1,0,1], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)
Tensor(shape=(2, 2), inds=[s1,0,1, s2,0,1], tags={}),backend=cupy, dtype=float32, data=array([[0.9666009, 0.5304818],\n", " [0.5304818, 0.9666009]], dtype=float32)

...

" ], "text/plain": [ "TensorNetwork(tensors=540, indices=216)" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# we can perform a normalization by setting the negative exponent\n", "htn.exponent = -Z_exponent\n", "# this then spreads the exponent among all the actual tensors\n", "htn.equalize_norms_()" ] }, { "cell_type": "markdown", "id": "d12c5834-7010-4799-b839-803913618c3f", "metadata": {}, "source": [ "Then we can compute the output marginal contraction tree, which for factor\n", "graphs is just of matter of re-interprating certain indices as 'outputs':" ] }, { "cell_type": "code", "execution_count": 10, "id": "16db36bb-189b-4088-acf6-e70d85bff8cf", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "log2[SIZE]: 28.00 log10[FLOPs]: 13.46: 100%|████████████████████████████████████████| 128/128 [01:39<00:00, 1.29it/s]\n" ] } ], "source": [ "tree_sub = htn.contraction_tree(output_inds=output_inds, optimize=opt)" ] }, { "cell_type": "markdown", "id": "122e1cf7-9977-460a-96ca-df0c2ce6b489", "metadata": {}, "source": [ "the output tensor is larger than our sliced size so we generate the output\n", "chunks lazily, which we can process one by one:" ] }, { "cell_type": "code", "execution_count": 11, "id": "d899a845", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "100%|███████████████████████████████████████████████████████████████████████████████| 256/256 [02:15<00:00, 1.89it/s]\n" ] } ], "source": [ "S = sum(\n", " # using autoray handles numpy/cupy/torch/jax etc.\n", " -do(\"sum\", p_chunk * do(\"log\", p_chunk))\n", " for p_chunk in tree_sub.gen_output_chunks(\n", " htn.arrays,\n", " progbar=True,\n", " )\n", ")" ] }, { "cell_type": "code", "execution_count": 12, "id": "cfc90d5a-93ed-4816-8400-cb92190e29b6", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array(56.018044, dtype=float32)" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "S" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3" } }, "nbformat": 4, "nbformat_minor": 5 } ================================================ FILE: docs/examples/ex_trace_contraction_to_matmuls.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "id": "551a15b6", "metadata": {}, "source": [ "(ex_extract_contraction)=\n", "\n", "# Extract contraction to matmuls only" ] }, { "cell_type": "code", "execution_count": 6, "id": "7261d7a0-bd84-4357-aeed-c72f0fb5774a", "metadata": {}, "outputs": [], "source": [ "%config InlineBackend.figure_formats = ['svg']\n", "\n", "import autoray as ar\n", "\n", "import cotengra as ctg" ] }, { "cell_type": "markdown", "id": "aecf93ca", "metadata": {}, "source": [ "Create a random contraction and contraction tree:" ] }, { "cell_type": "code", "execution_count": 22, "id": "e1f4edfc-b4f9-4760-87d0-45c335d71175", "metadata": {}, "outputs": [], "source": [ "inputs, output, shapes, size_dict = ctg.utils.rand_equation(\n", " n=6,\n", " reg=5,\n", " n_out=1,\n", " n_hyper_in=1,\n", " n_hyper_out=1,\n", " seed=42,\n", ")\n", "\n", "# square grid contraction:\n", "# inputs, output, shapes, size_dict = ctg.utils.lattice_equation([3, 4])" ] }, { "cell_type": "code", "execution_count": 12, "id": "36c7a326-261f-4e8b-a834-7218824ffda0", "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "" ], "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "data": { "text/plain": [ "(
, )" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tree = ctg.array_contract_tree(\n", " inputs, output, shapes=shapes, optimize=\"optimal\"\n", ")\n", "tree.get_hypergraph().plot()" ] }, { "cell_type": "markdown", "id": "d8e888d4", "metadata": {}, "source": [ "The high level pairwise contractions can be shown as so:" ] }, { "cell_type": "code", "execution_count": 23, "id": "7f654565-45e6-44fe-8f27-394a45035b98", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[37m(0) cost: \u001b[39m3.2e+01 \u001b[37mwidths: \u001b[39m2.0,5.0->4.0 \u001b[37mtype: \u001b[39meinsum\n", "\u001b[37minputs: \u001b[35m{b}\u001b[31m[i],\u001b[32ma\u001b[35m{b}\u001b[31m[i]\u001b[32mn\u001b[32mo\u001b[39m->\n", "\u001b[37moutput: \u001b[35m{b}\u001b[32m(ano)\n", "\n", "\u001b[37m(1) cost: \u001b[39m6.4e+01 \u001b[37mwidths: \u001b[39m4.0,5.0->5.0 \u001b[37mtype: \u001b[39meinsum\n", "\u001b[37minputs: \u001b[35m{ba}\u001b[31m[n]\u001b[34mo,\u001b[35m{ab}\u001b[32md\u001b[31m[n]\u001b[32mh\u001b[39m->\n", "\u001b[37moutput: \u001b[35m{ba}\u001b[34mo\u001b[32m(dh)\n", "\n", "\u001b[37m(2) cost: \u001b[39m7.7e+02 \u001b[37mwidths: \u001b[39m5.0,8.6->7.6 \u001b[37mtype: \u001b[39meinsum\n", "\u001b[37minputs: \u001b[35m{ba}\u001b[34mo\u001b[31m[dh],\u001b[35m{ab}\u001b[32mc\u001b[31m[d]\u001b[32me\u001b[32mf\u001b[32mg\u001b[31m[h]\u001b[39m->\n", "\u001b[37moutput: \u001b[35m{ba}\u001b[34mo\u001b[32m(cefg)\n", "\n", "\u001b[37m(3) cost: \u001b[39m1.5e+03 \u001b[37mwidths: \u001b[39m7.6,7.0->8.6 \u001b[37mtype: \u001b[39meinsum\n", "\u001b[37minputs: \u001b[35m{ba}\u001b[31m[o]\u001b[34mc\u001b[34me\u001b[34mf\u001b[31m[g],\u001b[35m{ab}\u001b[32mk\u001b[31m[g]\u001b[32ml\u001b[31m[o]\u001b[32mm\u001b[39m->\n", "\u001b[37moutput: \u001b[35m{ba}\u001b[34mc\u001b[34me\u001b[34mf\u001b[32m(klm)\n", "\n", "\u001b[37m(4) cost: \u001b[39m1.2e+03 \u001b[37mwidths: \u001b[39m8.6,9.2->2.6 \u001b[37mtype: \u001b[39mtensordot+perm\n", "\u001b[37minputs: \u001b[31m[b]\u001b[34ma\u001b[31m[cefklm],\u001b[31m[b]\u001b[32mj\u001b[31m[cekflm]\u001b[39m->\n", "\u001b[37moutput: \u001b[32m(j)\u001b[34ma\n", "\n", "\u001b[39m\n" ] } ], "source": [ "tree.print_contractions()" ] }, { "cell_type": "markdown", "id": "aa3d8b14", "metadata": {}, "source": [ "## Tracing the computational graph\n", "\n", "`cotengra` can also further break each `einsum` call down into *only* (batch) matrix multiplies, reshapes and transposes. To extract these we need two things:\n", "\n", "1. to trace the contraction with `autoray` lazy arrays.\n", "2. to use `implementation=\"cotengra\"` to avoid using a backends `einsum` impl directly." ] }, { "cell_type": "code", "execution_count": 14, "id": "4ae680f6-1a8f-4a48-b36d-8f9a465c5ec7", "metadata": {}, "outputs": [], "source": [ "variables = [ar.lazy.Variable(shape, backend=\"numpy\") for shape in shapes]" ] }, { "cell_type": "code", "execution_count": 15, "id": "df4fea46-854f-4a14-9357-6c352228760b", "metadata": {}, "outputs": [], "source": [ "lz = tree.contract(\n", " variables,\n", " # make cotengra use its own implementation of einsum/tensordot\n", " # which breaks things down to bmm / reshape / transpose\n", " implementation=\"cotengra\",\n", ")" ] }, { "cell_type": "markdown", "id": "660ac484", "metadata": {}, "source": [ "The remaining things are simply autoray related functionality. Visualize the operataions:" ] }, { "cell_type": "code", "execution_count": 16, "id": "bd7c9e22", "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "" ], "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "data": { "text/plain": [ "(
, )" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "lz.plot_circuit()" ] }, { "cell_type": "markdown", "id": "ad415c45", "metadata": {}, "source": [ "Visualize as text / terminal:" ] }, { "cell_type": "code", "execution_count": 17, "id": "79283c35", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " 0 transpose[3, 2]\n", " 1 ╰─matmul[2, 3]\n", " 2 ├─reshape[192, 3]\n", " 3 │ ╰─transpose[2, 2, 2, 3, 2, 2, 2, 3]\n", " 4 │ ╰─←[2, 3, 2, 2, 2, 3, 2, 2]\n", " 5 ╰─reshape[2, 192]\n", " 6 ╰─transpose[2, 2, 2, 2, 3, 2, 2, 2]\n", " 7 ╰─reshape[2, 2, 2, 2, 3, 2, 2, 2]\n", " 8 ╰─matmul[4, 12, 8]\n", " 9 ├─reshape[4, 4, 8]\n", " 10 │ ╰─transpose[2, 2, 2, 2, 2, 2, 2]\n", " 11 │ ╰─←[2, 2, 2, 2, 2, 2, 2]\n", " 12 ╰─reshape[4, 12, 4]\n", " 13 ╰─transpose[2, 2, 2, 2, 3, 2, 2]\n", " 14 ╰─reshape[2, 2, 2, 2, 2, 3, 2]\n", " 15 ╰─matmul[4, 2, 24]\n", " 16 ├─reshape[4, 4, 24]\n", " 17 │ ╰─transpose[2, 2, 2, 2, 2, 2, 3, 2]\n", " 18 │ ╰─←[2, 2, 2, 2, 2, 3, 2, 2]\n", " 19 ╰─reshape[4, 2, 4]\n", " 20 ╰─matmul[4, 2, 4]\n", " 21 ├─reshape[4, 2, 4]\n", " 22 │ ╰─transpose[2, 2, 2, 2, 2]\n", " 23 │ ╰─←[2, 2, 2, 2, 2]\n", " 24 ╰─reshape[4, 2, 2]\n", " 25 ╰─transpose[2, 2, 2, 2]\n", " 26 ╰─reshape[2, 2, 2, 2]\n", " 27 ╰─matmul[2, 1, 8]\n", " 28 ├─reshape[2, 1, 2]\n", " 29 │ ╰─←[2, 2]\n", " 30 ╰─reshape[2, 2, 8]\n", " 31 ╰─transpose[2, 2, 2, 2, 2]\n", " 32 ╰─←[2, 2, 2, 2, 2]\n" ] } ], "source": [ "lz.show()" ] }, { "cell_type": "markdown", "id": "ad23df09", "metadata": {}, "source": [ "Some preparatory einsums might appear, only for removing initial diagonal indices and trivial indices etc." ] }, { "cell_type": "markdown", "id": "b75c2f92", "metadata": {}, "source": [ "## getting the linear form of the contraction" ] }, { "cell_type": "code", "execution_count": 18, "id": "ee3860d8", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['x139996605978592',\n", " 'x139996605418560',\n", " 'x139996605418080',\n", " 'x139996605426720',\n", " 'x139996605418752',\n", " 'x139996605418272']" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# names of the inputs variables in the contraction\n", "[f\"x{id(v)}\" for v in variables]" ] }, { "cell_type": "code", "execution_count": 19, "id": "035b84ec-ffec-45a6-badb-a6a069d7a7b1", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "x139996605419040 = transpose139997039584176(x139996605418272, (1, 2, 0, 3, 4,))\n", "x139996603351968 = reshape139997039578096(x139996605419040, (2, 2, 8,))\n", "del x139996605419040\n", "x139996605426048 = reshape139997039578096(x139996605418560, (2, 1, 2,))\n", "x139996603351488 = matmul139997611038160(x139996605426048, x139996603351968)\n", "del x139996603351968\n", "del x139996605426048\n", "x139996603351872 = reshape139997039578096(x139996603351488, (2, 2, 2, 2,))\n", "del x139996603351488\n", "x139996603351776 = transpose139997039584176(x139996603351872, (0, 1, 3, 2,))\n", "del x139996603351872\n", "x139996603351680 = reshape139997039578096(x139996603351776, (4, 2, 2,))\n", "del x139996603351776\n", "x139996603351584 = transpose139997039584176(x139996605426720, (1, 0, 3, 2, 4,))\n", "x139996603352160 = reshape139997039578096(x139996603351584, (4, 2, 4,))\n", "del x139996603351584\n", "x139996603352256 = matmul139997611038160(x139996603351680, x139996603352160)\n", "del x139996603352160\n", "del x139996603351680\n", "x139996603352544 = reshape139997039578096(x139996603352256, (4, 2, 4,))\n", "del x139996603352256\n", "x139996603352640 = transpose139997039584176(x139996605978592, (1, 0, 3, 7, 2, 4, 5, 6,))\n", "x139996603352736 = reshape139997039578096(x139996603352640, (4, 4, 24,))\n", "del x139996603352640\n", "x139996603352832 = matmul139997611038160(x139996603352544, x139996603352736)\n", "del x139996603352736\n", "del x139996603352544\n", "x139996603352928 = reshape139997039578096(x139996603352832, (2, 2, 2, 2, 2, 3, 2,))\n", "del x139996603352832\n", "x139996603353216 = transpose139997039584176(x139996603352928, (0, 1, 3, 4, 5, 2, 6,))\n", "del x139996603352928\n", "x139996603353312 = reshape139997039578096(x139996603353216, (4, 12, 4,))\n", "del x139996603353216\n", "x139996603353504 = transpose139997039584176(x139996605418752, (1, 0, 5, 3, 2, 4, 6,))\n", "x139996603353600 = reshape139997039578096(x139996603353504, (4, 4, 8,))\n", "del x139996603353504\n", "x139996603353696 = matmul139997611038160(x139996603353312, x139996603353600)\n", "del x139996603353600\n", "del x139996603353312\n", "x139996603353792 = reshape139997039578096(x139996603353696, (2, 2, 2, 2, 3, 2, 2, 2,))\n", "del x139996603353696\n", "x139996603354176 = transpose139997039584176(x139996603353792, (1, 0, 2, 3, 4, 5, 6, 7,))\n", "del x139996603353792\n", "x139996603354272 = reshape139997039578096(x139996603354176, (2, 192,))\n", "del x139996603354176\n", "x139996603354368 = transpose139997039584176(x139996605418080, (0, 2, 3, 5, 4, 6, 7, 1,))\n", "x139996603354464 = reshape139997039578096(x139996603354368, (192, 3,))\n", "del x139996603354368\n", "x139996603354560 = matmul139997611038160(x139996603354272, x139996603354464)\n", "del x139996603354464\n", "del x139996603354272\n", "x139996603354656 = transpose139997039584176(x139996603354560, (1, 0,))\n", "del x139996603354560\n" ] } ], "source": [ "# a python source code of the whole contraction\n", "print(lz.get_source())" ] }, { "cell_type": "markdown", "id": "574e460b", "metadata": {}, "source": [ "Or access the nodes programmatically:" ] }, { "cell_type": "code", "execution_count": 20, "id": "192feabf", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "fn: None\n", "args: None\n", "kwargs: None\n", "\n", "fn: \n", "args: (, (1, 2, 0, 3, 4))\n", "kwargs: {}\n", "\n", "fn: \n", "args: (, (2, 2, 8))\n", "kwargs: {}\n", "\n", "fn: None\n", "args: None\n", "kwargs: None\n", "\n", "fn: \n", "args: (, (2, 1, 2))\n", "kwargs: {}\n", "\n", "fn: \n", "args: (, )\n", "kwargs: {}\n", "\n", "fn: \n", "args: (, (2, 2, 2, 2))\n", "kwargs: {}\n", "\n", "fn: \n", "args: (, (0, 1, 3, 2))\n", "kwargs: {}\n", "\n", "fn: \n", "args: (, (4, 2, 2))\n", "kwargs: {}\n", "\n", "fn: None\n", "args: None\n", "kwargs: None\n", "\n", "fn: \n", "args: (, (1, 0, 3, 2, 4))\n", "kwargs: {}\n", "\n", "fn: \n", "args: (, (4, 2, 4))\n", "kwargs: {}\n", "\n", "fn: \n", "args: (, )\n", "kwargs: {}\n", "\n", "fn: \n", "args: (, (4, 2, 4))\n", "kwargs: {}\n", "\n", "fn: None\n", "args: None\n", "kwargs: None\n", "\n", "fn: \n", "args: (, (1, 0, 3, 7, 2, 4, 5, 6))\n", "kwargs: {}\n", "\n", "fn: \n", "args: (, (4, 4, 24))\n", "kwargs: {}\n", "\n", "fn: \n", "args: (, )\n", "kwargs: {}\n", "\n", "fn: \n", "args: (, (2, 2, 2, 2, 2, 3, 2))\n", "kwargs: {}\n", "\n", "fn: \n", "args: (, (0, 1, 3, 4, 5, 2, 6))\n", "kwargs: {}\n", "\n", "fn: \n", "args: (, (4, 12, 4))\n", "kwargs: {}\n", "\n", "fn: None\n", "args: None\n", "kwargs: None\n", "\n", "fn: \n", "args: (, (1, 0, 5, 3, 2, 4, 6))\n", "kwargs: {}\n", "\n", "fn: \n", "args: (, (4, 4, 8))\n", "kwargs: {}\n", "\n", "fn: \n", "args: (, )\n", "kwargs: {}\n", "\n", "fn: \n", "args: (, (2, 2, 2, 2, 3, 2, 2, 2))\n", "kwargs: {}\n", "\n", "fn: \n", "args: (, (1, 0, 2, 3, 4, 5, 6, 7))\n", "kwargs: {}\n", "\n", "fn: \n", "args: (, (2, 192))\n", "kwargs: {}\n", "\n", "fn: None\n", "args: None\n", "kwargs: None\n", "\n", "fn: \n", "args: (, (0, 2, 3, 5, 4, 6, 7, 1))\n", "kwargs: {}\n", "\n", "fn: \n", "args: (, (192, 3))\n", "kwargs: {}\n", "\n", "fn: \n", "args: (, )\n", "kwargs: {}\n", "\n", "fn: \n", "args: (, (1, 0))\n", "kwargs: {}\n", "\n" ] } ], "source": [ "for node in ar.lazy.ascend(lz):\n", " print(f\"fn: {node.fn}\")\n", " print(f\"args: {node.args}\")\n", " print(f\"kwargs: {node.kwargs}\")\n", " print()" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3" } }, "nbformat": 4, "nbformat_minor": 5 } ================================================ FILE: docs/high-level-interface.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "id": "bb4240d5-bb9d-429c-b506-ccad03801ad0", "metadata": {}, "source": [ "(high-level-interface)=\n", "# High Level\n", "\n", "You can use `cotengra` as a drop-in replacement for [`numpy.einsum`](numpy.einsum)\n", "or [`opt_einsum.contract`](opt_einsum.contract.contract), and benefit from the\n", "improved optimization, contraction routines and features such as slicing, with\n", "the following high level interface functions.\n", "\n", "::::{grid} 2\n", ":::{grid-item-card}\n", "Traditional einsum style where the contraction is specified as a compact and\n", "more human-readable ``equation`` string:\n", " - [`cotengra.einsum`](cotengra.einsum)\n", " - [`cotengra.einsum_tree`](cotengra.einsum_tree)\n", " - [`cotengra.einsum_expression`](cotengra.einsum_expression)\n", ":::\n", ":::{grid-item-card}\n", "Programmatic style, where the indices can be specified as sequences of\n", "arbitrary hashable objects:\n", " - [`cotengra.array_contract`](cotengra.array_contract)\n", " - [`cotengra.array_contract_tree`](cotengra.array_contract_tree)\n", " - [`cotengra.array_contract_expression`](cotengra.array_contract_expression)\n", ":::\n", "::::\n", "\n", "The following are equivalent ways to perform a matrix multiplication and\n", "transpose of ``x`` and ``y``:\n", "\n", "```python\n", "import cotengra as ctg\n", "\n", "# einsum style\n", "z = ctg.einsum(\"ab,bc->ca\", x, y)\n", "\n", "# programmatic style\n", "z = ctg.array_contract(\n", " arrays=(x, y),\n", " inputs=[(0, 1), (1, 2)],\n", " output=(2, 0),\n", ")\n", "```\n", "\n", "\n", "The `{_tree}` functions return a [`ContractionTree`](cotengra.ContractionTree)\n", "object which can be used to inspect the order and various properties such as\n", "contraction cost and width. The `{_expression}` functions return a function\n", "that performs the contraction, which can be called with any matching input\n", "arrays. All of these functions take an ``optimize`` kwarg which specifies the\n", "contraction strategy. It can be one of the following:\n", "\n", "- ``str`` : a preset such as ``'auto'``, ``'auto-hq'``, ``'greedy'`` or ``'optimal'``\n", "- ``PathOptimizer`` : a custom optimizer from ``cotengra`` or ``opt_einsum``\n", "- ``ContractionTree`` : a contraction tree generated previously\n", "- ``Sequence[tuple[int]]`` : an explicit path of *'linear recycled ids'*,\n", " specified manually or generated previously\n", "- ``Sequence[str]`` : an explicit path supplied as an *edge ordering*\n", "\n", "If the method provides sliced indices then the contraction will utilize these\n", "to reduce the memory. The default is the `cotengra` preset ``'auto'``. If you\n", "explicitly want to use an `opt_einsum` preset then you can supply\n", "``optimize='opt_einsum:auto'`` for example.\n", "\n", "See the docstring of [`array_contract_expression`](cotengra.array_contract_expression)\n", "for other options." ] }, { "cell_type": "markdown", "id": "fbe963ca-8a7f-494d-b361-46b6bbb1b9a9", "metadata": {}, "source": [ "## `einsum` interfaces:\n", "\n", "\n", "Here the contraction is specified using the string equation form of\n", "[`numpy.einsum`](https://numpy.org/doc/stable/reference/generated/numpy.einsum.html)\n", "and other `einsum` implementations. For example:\n", "\n", "- ``\"ab,bc->ac\"`` matrix multiplication\n", "- ``\"Xab,Xbc->Xac\"`` batch matrix multiplication\n", "- ``\"ab,ab->ab\"`` hadamard (elementwise) product\n", "\n", "```{hint}\n", "`cotengra` supports all types of explicit equation (such as repeated and hyper/batch indices appearing any number of times).\n", "The `einsum` versions also support automatically expanded dimensions using ellipsis ``...``.\n", "```\n", "\n", "If the right hand side is not specified then the output indices are computed as every index that appears *once* on the left hand side inputs, in sorted order. For example ``'ba'`` is completed as a transposition: ``'ba->ab'``.\n", "\n", "Lets generate a more non-trivial example:" ] }, { "cell_type": "code", "execution_count": 1, "id": "16080383-ffdb-45f3-ae29-98cdebf25845", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "ab,cbd,edf,gfh,ih,ajk,clkm,enmo,gpoq,irq,jst,lutv,nwvx,pyxz,rAz,sB,uBC,wCD,yDE,AE->\n" ] } ], "source": [ "%config InlineBackend.figure_formats = ['svg']\n", "import cotengra as ctg\n", "\n", "# generate the 'inputs and output' format contraction\n", "inputs, output, shapes, size_dict = ctg.utils.lattice_equation([4, 5])\n", "\n", "# generate the 'eq' format\n", "eq = ctg.utils.inputs_output_to_eq(inputs, output)\n", "print(eq)\n", "\n", "# make example arrays\n", "arrays = ctg.utils.make_arrays_from_inputs(inputs, size_dict, seed=42)" ] }, { "cell_type": "markdown", "id": "09737c1e-8eab-4c65-bccc-61e1b8c1e280", "metadata": {}, "source": [ "And perform the contraction:" ] }, { "cell_type": "code", "execution_count": 2, "id": "58ccba90-2c5a-41ce-9b54-e0d546d12073", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array(776.48544934)" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ctg.einsum(eq, *arrays)" ] }, { "cell_type": "markdown", "id": "fcc8a9df-7345-4470-be0d-0712d72b37ec", "metadata": {}, "source": [ "If we wanted to inspect the contraction before we perform it we could build the contraction tree first. Here we supply just the shapes of the arrays:" ] }, { "cell_type": "code", "execution_count": 3, "id": "a6840c2b-fc6e-4b75-bbc9-abc5ae500d93", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'flops': 964, 'write': 293, 'size': 32}" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tree = ctg.einsum_tree(eq, *shapes)\n", "\n", "# some typical quantities of interest:\n", "tree.contract_stats()" ] }, { "cell_type": "markdown", "id": "d814d8df-b7cc-4cc7-a0b5-922c73944f1b", "metadata": {}, "source": [ "The contraction tree has many methods to inspect and manipulate the contraction." ] }, { "cell_type": "code", "execution_count": 4, "id": "90003918-6b84-4c06-82e5-05e1b8ff430e", "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "" ], "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "(
, )" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tree.plot_rubberband()" ] }, { "cell_type": "markdown", "id": "7077b5c9-2ac5-4e8f-a63a-9fe8706c2875", "metadata": {}, "source": [ "Sometimes it is useful to generate the function that will perform the contraction for any given inputs. This can be done with the [`einsum_expression`](cotengra.einsum_expression) function:" ] }, { "cell_type": "code", "execution_count": 5, "id": "3c1935c7-7f05-4390-8fdd-8b2f4685ffe1", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array(776.48544934)" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "expr = ctg.einsum_expression(eq, *shapes)\n", "expr(*arrays)" ] }, { "cell_type": "code", "execution_count": 6, "id": "1cb59fcc-c993-436c-8e4a-84575a303c5f", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array(2252.66569969)" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arrays = ctg.utils.make_arrays_from_inputs(inputs, size_dict, seed=43)\n", "expr(*arrays)" ] }, { "cell_type": "markdown", "id": "a27d7d90-103b-453c-a093-dd8e589ca327", "metadata": {}, "source": [ "```{note}\n", "[`einsum`](cotengra.einsum) itself caches the expressions it uses by default for presets, so at least in terms of performance savings this is often not necessary.\n", "```" ] }, { "cell_type": "markdown", "id": "50b264db-8e5f-4acf-b322-977b0bdc0e59", "metadata": {}, "source": [ "## `array_contract` interfaces\n", "\n", "The einsum format is less convenient for dynamically generated contractions.\n", "The alternate interface `cotengra` provides are the [`array_contract`](cotengra.array_contract) functions. These specify a contraction with the following three arguments:\n", "\n", " - `inputs : Sequence[Sequence[Hashable]]`, the indices of each input\n", " - `output : Sequence[Hashable]`, the output indices\n", " - `size_dict : Mapping[Hashable, int]`, the size of each index\n", "\n", "The indices are mapped ('canonicalized') into single letters in the order they appear on the `inputs`, allowing matching geometries to be cached.\n", "\n", "If `output` is not specified it is calculated as the indices that appear *once* in `inputs`, in the order they appear in `inputs`. Note this is slightly different to `einsum` which sorts the output indices, since we can only require the indices to be hashable.\n", "\n", "```{note}\n", "You can also supply `shapes` to [`array_contract_tree`](cotengra.array_contract_tree) and [`array_contract_expression`](cotengra.array_contract_expression) rather than build ``size_dict`` manually.\n", "```\n", "\n", "As an example, we'll directly contract the arrays from a tensor network generated with [`quimb`](https://quimb.readthedocs.io):" ] }, { "cell_type": "code", "execution_count": 7, "id": "93216218-a9db-415c-a7ca-3a5ffa2ed66d", "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "" ], "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
TensorNetworkGen(tensors=100, indices=150)
Tensor(shape=(2, 2, 2), inds=[_67af2fAAAAC, _67af2fAAAAB, _67af2fAAAAA], tags={I0}),backend=numpy, dtype=float64, data=array([[[ 0.41832997, 0.60557617],\n", " [ 0.02878786, -1.084246 ]],\n", "\n", " [[ 1.46422098, 0.29072736],\n", " [-1.33075642, -0.03472346]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAAAF, _67af2fAAAAE, _67af2fAAAAD], tags={I1}),backend=numpy, dtype=float64, data=array([[[ 0.28041847, 0.10749307],\n", " [-1.92080086, 1.57864499]],\n", "\n", " [[ 1.00595719, 0.45121505],\n", " [-0.59343367, 0.09382112]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAAAI, _67af2fAAAAH, _67af2fAAAAG], tags={I2}),backend=numpy, dtype=float64, data=array([[[ 1.85195867, -0.25590475],\n", " [-0.28298637, 0.415816 ]],\n", "\n", " [[-1.08877401, -1.96729165],\n", " [ 0.88737846, -1.32823784]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAAAL, _67af2fAAAAK, _67af2fAAAAJ], tags={I3}),backend=numpy, dtype=float64, data=array([[[-0.13157981, -0.36196929],\n", " [ 0.7820311 , 0.28266399]],\n", "\n", " [[-1.00595013, 0.01851214],\n", " [-1.24315953, 2.60337585]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAAAN, _67af2fAAAAM, _67af2fAAAAB], tags={I4}),backend=numpy, dtype=float64, data=array([[[ 0.15139223, -0.51553062],\n", " [-0.2196374 , 0.40234591]],\n", "\n", " [[ 1.36128828, 0.74287737],\n", " [ 0.93685218, 0.17547031]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAAAQ, _67af2fAAAAP, _67af2fAAAAO], tags={I5}),backend=numpy, dtype=float64, data=array([[[ 1.52520418, 0.09821447],\n", " [-1.16490357, 0.52358791]],\n", "\n", " [[-1.06559789, -0.31079113],\n", " [ 0.5559524 , -0.09963476]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAAAT, _67af2fAAAAS, _67af2fAAAAR], tags={I6}),backend=numpy, dtype=float64, data=array([[[-0.25769078, -1.58951869],\n", " [-1.81491229, 0.53617305]],\n", "\n", " [[ 1.27138979, -0.55403891],\n", " [ 1.72433064, -0.31178569]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAAAW, _67af2fAAAAV, _67af2fAAAAU], tags={I7}),backend=numpy, dtype=float64, data=array([[[ 0.06331837, 1.38212765],\n", " [ 0.58472813, -0.50975014]],\n", "\n", " [[ 0.2513335 , 0.40621724],\n", " [ 0.8656376 , -0.53392518]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAAAZ, _67af2fAAAAY, _67af2fAAAAX], tags={I8}),backend=numpy, dtype=float64, data=array([[[-0.03877829, 1.14263416],\n", " [-0.46350628, 2.26692259]],\n", "\n", " [[-0.5287392 , 0.32461586],\n", " [-0.1544165 , -0.81960771]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAAAc, _67af2fAAAAb, _67af2fAAAAa], tags={I9}),backend=numpy, dtype=float64, data=array([[[-1.20293573, 0.09544837],\n", " [-1.3617434 , 0.27737016]],\n", "\n", " [[ 0.30665917, -1.40419209],\n", " [-1.53897176, 1.59692719]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAAAf, _67af2fAAAAe, _67af2fAAAAd], tags={I10}),backend=numpy, dtype=float64, data=array([[[ 1.26835706, -0.74444453],\n", " [-1.37903328, -0.37289418]],\n", "\n", " [[ 0.22521904, -0.7968999 ],\n", " [-0.19003288, 0.40520818]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAAAh, _67af2fAAAAg, _67af2fAAAAO], tags={I11}),backend=numpy, dtype=float64, data=array([[[-1.56670601, 1.62226236],\n", " [-0.55864531, 1.285027 ]],\n", "\n", " [[-0.64887992, 0.64242269],\n", " [ 2.17043334, -0.54919245]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAAAk, _67af2fAAAAj, _67af2fAAAAi], tags={I12}),backend=numpy, dtype=float64, data=array([[[ 0.03192423, -0.74439149],\n", " [ 1.30574661, 0.87000251]],\n", "\n", " [[ 0.79849565, 0.83417813],\n", " [-0.37099355, -0.67691076]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAAAn, _67af2fAAAAm, _67af2fAAAAl], tags={I13}),backend=numpy, dtype=float64, data=array([[[-0.51472382, -1.67062395],\n", " [ 1.15948922, 0.57182887]],\n", "\n", " [[-0.74479429, -0.29743726],\n", " [-1.31841887, -0.25337446]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAAAq, _67af2fAAAAp, _67af2fAAAAo], tags={I14}),backend=numpy, dtype=float64, data=array([[[-1.33318094, 1.5421289 ],\n", " [-0.30571997, -1.00505008]],\n", "\n", " [[ 1.12605809, -0.13951594],\n", " [ 0.20790904, -0.52911824]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAAAs, _67af2fAAAAr, _67af2fAAAAk], tags={I15}),backend=numpy, dtype=float64, data=array([[[ 0.3674769 , 1.55241718],\n", " [ 0.82071427, 0.14560001]],\n", "\n", " [[ 0.19105139, 1.47534647],\n", " [ 0.11034297, -1.12803854]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAAAv, _67af2fAAAAu, _67af2fAAAAt], tags={I16}),backend=numpy, dtype=float64, data=array([[[ 0.55952408, 0.64356438],\n", " [-0.95897595, 0.25066991]],\n", "\n", " [[-0.01199984, 0.40876493],\n", " [-0.28508488, -0.42547401]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAAAx, _67af2fAAAAw, _67af2fAAAAF], tags={I17}),backend=numpy, dtype=float64, data=array([[[ 0.64288936, 0.15768144],\n", " [-1.26677523, 0.25459598]],\n", "\n", " [[ 0.74840043, 0.82142352],\n", " [-0.27199821, 0.87673783]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAABA, _67af2fAAAAz, _67af2fAAAAy], tags={I18}),backend=numpy, dtype=float64, data=array([[[-0.96158539, -1.96465654],\n", " [ 0.3811346 , -0.52300382]],\n", "\n", " [[ 1.83535089, -1.43337649],\n", " [-0.59776266, -0.40870927]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAABD, _67af2fAAABC, _67af2fAAABB], tags={I19}),backend=numpy, dtype=float64, data=array([[[ 0.68397816, -0.42211949],\n", " [-0.1650454 , 0.50112425]],\n", "\n", " [[-0.84532849, 0.5558993 ],\n", " [ 2.06932322, 0.1431952 ]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAABE, _67af2fAAAAx, _67af2fAAAAH], tags={I20}),backend=numpy, dtype=float64, data=array([[[ 0.66338863, 1.06152374],\n", " [ 0.20970869, -0.1046703 ]],\n", "\n", " [[-0.11430137, 0.31375736],\n", " [-1.29794829, 0.71623433]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAABF, _67af2fAAAAp, _67af2fAAAAU], tags={I21}),backend=numpy, dtype=float64, data=array([[[ 0.45682495, -0.06321074],\n", " [ 0.05871331, -0.21005493]],\n", "\n", " [[-0.48018253, -1.02270796],\n", " [-4.09288747, -1.06758198]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAABH, _67af2fAAABG, _67af2fAAAAJ], tags={I22}),backend=numpy, dtype=float64, data=array([[[ 1.3837506 , 0.54885024],\n", " [-0.44582365, 0.27466897]],\n", "\n", " [[ 0.33042849, 0.20524129],\n", " [ 1.16451197, -0.47649984]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAABJ, _67af2fAAABI, _67af2fAAAAe], tags={I23}),backend=numpy, dtype=float64, data=array([[[-1.2017799 , 0.05584251],\n", " [-0.98095115, -0.20473152]],\n", "\n", " [[ 0.2602656 , 0.05370239],\n", " [-1.63822223, 0.02741674]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAABK, _67af2fAAAAg, _67af2fAAAAM], tags={I24}),backend=numpy, dtype=float64, data=array([[[ 1.77715336, -0.28063285],\n", " [ 0.8070599 , 0.04899588]],\n", "\n", " [[ 0.71085377, 1.32883486],\n", " [ 0.27595826, 2.20806878]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAABM, _67af2fAAABL, _67af2fAAAAV], tags={I25}),backend=numpy, dtype=float64, data=array([[[-0.51588489, 0.81952451],\n", " [-0.83499587, -0.04589686]],\n", "\n", " [[-0.56797951, -0.62835871],\n", " [ 0.07071926, -0.88126988]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAABP, _67af2fAAABO, _67af2fAAABN], tags={I26}),backend=numpy, dtype=float64, data=array([[[ 2.52843728, 0.42337001],\n", " [-0.84121891, -0.68472719]],\n", "\n", " [[ 1.20186868, -0.71322565],\n", " [-0.94592688, 0.34291128]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAABS, _67af2fAAABR, _67af2fAAABQ], tags={I27}),backend=numpy, dtype=float64, data=array([[[-0.2171143 , 0.6168768 ],\n", " [-1.33975764, -0.11793883]],\n", "\n", " [[-0.01325147, -1.58992986],\n", " [ 1.97251808, 1.97324821]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAABU, _67af2fAAABT, _67af2fAAABF], tags={I28}),backend=numpy, dtype=float64, data=array([[[ 0.79460659, -0.95131942],\n", " [-0.62124143, -0.4642856 ]],\n", "\n", " [[ 0.15497854, -1.07938866],\n", " [ 0.33352787, 1.24106592]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAABW, _67af2fAAABV, _67af2fAAABJ], tags={I29}),backend=numpy, dtype=float64, data=array([[[ 0.74599076, -0.26003485],\n", " [ 2.1604772 , -0.49252775]],\n", "\n", " [[ 0.13855393, 0.04263864],\n", " [-0.38309191, 1.79375069]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAABZ, _67af2fAAABY, _67af2fAAABX], tags={I30}),backend=numpy, dtype=float64, data=array([[[ 1.88481868, -0.0695583 ],\n", " [-0.60641381, 0.90302332]],\n", "\n", " [[ 0.41724814, 0.66447103],\n", " [-0.16009207, -1.67700053]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAABc, _67af2fAAABb, _67af2fAAABa], tags={I31}),backend=numpy, dtype=float64, data=array([[[ 0.38689291, -1.0936539 ],\n", " [-0.13263404, 1.46114905]],\n", "\n", " [[ 0.12281697, 1.31833095],\n", " [ 1.83668743, -0.14130299]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAABe, _67af2fAAABd, _67af2fAAAAD], tags={I32}),backend=numpy, dtype=float64, data=array([[[-0.31227164, 0.77419936],\n", " [ 0.13490232, 0.3719042 ]],\n", "\n", " [[-0.77619116, 1.05731633],\n", " [ 0.14662734, 0.88291095]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAABh, _67af2fAAABg, _67af2fAAABf], tags={I33}),backend=numpy, dtype=float64, data=array([[[-0.67215056, 0.05571073],\n", " [-1.03576912, -1.28441133]],\n", "\n", " [[-1.33272379, 0.74270892],\n", " [-0.81299007, -0.27344781]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAABj, _67af2fAAABi, _67af2fAAABf], tags={I34}),backend=numpy, dtype=float64, data=array([[[-0.8951296 , 1.26369747],\n", " [ 2.24931229, -0.82915018]],\n", "\n", " [[ 1.78783198, 0.02225253],\n", " [ 1.71827061, -0.72247824]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAABm, _67af2fAAABl, _67af2fAAABk], tags={I35}),backend=numpy, dtype=float64, data=array([[[-1.41833885, -0.17283426],\n", " [ 0.23216175, 0.63922096]],\n", "\n", " [[-0.53334221, 0.56416889],\n", " [ 0.64977318, -0.69770602]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAABo, _67af2fAAABn, _67af2fAAABl], tags={I36}),backend=numpy, dtype=float64, data=array([[[ 1.34170008, -0.02143791],\n", " [ 1.16329068, -1.45774186]],\n", "\n", " [[ 0.77342921, 0.45629851],\n", " [-0.57959124, 1.35134186]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAABp, _67af2fAAAAQ, _67af2fAAAAL], tags={I37}),backend=numpy, dtype=float64, data=array([[[-0.33926804, -0.29612723],\n", " [-0.03585335, -1.89036142]],\n", "\n", " [[-1.18933749, 0.21242447],\n", " [ 0.02652267, -0.27630153]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAABs, _67af2fAAABr, _67af2fAAABq], tags={I38}),backend=numpy, dtype=float64, data=array([[[ 1.54389242, -0.46439793],\n", " [-0.03863546, -2.16611661]],\n", "\n", " [[-1.64557186, -1.37941789],\n", " [-0.02262371, 1.24117565]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAABu, _67af2fAAABt, _67af2fAAABL], tags={I39}),backend=numpy, dtype=float64, data=array([[[-0.38368313, 0.62433256],\n", " [ 0.69722479, 1.0513984 ]],\n", "\n", " [[-0.73418882, -0.23299285],\n", " [-0.75439293, 0.17953454]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAABw, _67af2fAAABv, _67af2fAAAAK], tags={I40}),backend=numpy, dtype=float64, data=array([[[ 0.05877584, -1.41417106],\n", " [-0.11633639, -0.26464487]],\n", "\n", " [[-2.84431328, 1.90038606],\n", " [ 0.25512732, -1.40045801]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAABx, _67af2fAAABw, _67af2fAAAAb], tags={I41}),backend=numpy, dtype=float64, data=array([[[ 1.64707772, -0.81599775],\n", " [ 1.3777959 , 0.84016492]],\n", "\n", " [[-0.53326295, 0.37130353],\n", " [ 0.71351521, -0.18891297]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAABy, _67af2fAAABZ, _67af2fAAABE], tags={I42}),backend=numpy, dtype=float64, data=array([[[-1.52825934, -0.48924217],\n", " [-1.53611577, -0.95677416]],\n", "\n", " [[-1.21581794, -0.40168864],\n", " [-0.03305816, -0.04687855]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAACB, _67af2fAAACA, _67af2fAAABz], tags={I43}),backend=numpy, dtype=float64, data=array([[[ 0.78738459, -0.58063465],\n", " [-0.02645525, -0.76479373]],\n", "\n", " [[-0.71402249, 0.33955049],\n", " [-1.33190651, 0.044711 ]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAACD, _67af2fAAACC, _67af2fAAABh], tags={I44}),backend=numpy, dtype=float64, data=array([[[-0.02008487, 0.98077792],\n", " [ 1.8685142 , 0.14106384]],\n", "\n", " [[-0.54273423, 1.75408101],\n", " [ 2.09132258, -0.01678777]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAACC, _67af2fAAACA, _67af2fAAAAc], tags={I45}),backend=numpy, dtype=float64, data=array([[[ 0.03333921, 1.61852048],\n", " [-0.4632809 , 0.25798995]],\n", "\n", " [[ 0.82237162, 0.31547219],\n", " [-1.56309635, -0.71530198]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAABu, _67af2fAAABQ, _67af2fAAABH], tags={I46}),backend=numpy, dtype=float64, data=array([[[ 0.12616229, 0.24306265],\n", " [-1.21393031, -0.03326173]],\n", "\n", " [[-1.56211681, 0.61171481],\n", " [-0.10485063, 1.25027403]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAACE, _67af2fAAACD, _67af2fAAAAn], tags={I47}),backend=numpy, dtype=float64, data=array([[[ 0.82565929, 0.03612089],\n", " [-0.3786331 , -2.45768323]],\n", "\n", " [[ 0.5555774 , 0.05666101],\n", " [-0.96264526, -1.49662903]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAACG, _67af2fAAACF, _67af2fAAAAa], tags={I48}),backend=numpy, dtype=float64, data=array([[[ 0.86181319, -0.39336792],\n", " [-0.21088054, -1.52093029]],\n", "\n", " [[-0.68659009, -0.04785194],\n", " [-0.04965364, -0.08275545]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAACH, _67af2fAAABC, _67af2fAAAAr], tags={I49}),backend=numpy, dtype=float64, data=array([[[-1.11921376, 1.35283861],\n", " [ 1.16737392, -0.1649528 ]],\n", "\n", " [[ 0.41631827, -0.47844357],\n", " [ 0.25467172, -0.20455254]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAACJ, _67af2fAAACI, _67af2fAAAAI], tags={I50}),backend=numpy, dtype=float64, data=array([[[ 0.57486997, 1.05275919],\n", " [ 0.97019501, 0.1345963 ]],\n", "\n", " [[-0.99522698, 0.37310525],\n", " [-0.15596329, 0.92255026]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAACK, _67af2fAAABM, _67af2fAAAAi], tags={I51}),backend=numpy, dtype=float64, data=array([[[0.39814605, 1.30281331],\n", " [1.41125229, 0.76097404]],\n", "\n", " [[0.51736235, 0.34134732],\n", " [1.68736855, 0.07948978]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAACM, _67af2fAAACL, _67af2fAAABD], tags={I52}),backend=numpy, dtype=float64, data=array([[[ 1.48196655, 0.41736173],\n", " [-2.08082564, -0.99010177]],\n", "\n", " [[ 0.49097649, 1.19824281],\n", " [-0.83588013, -0.111188 ]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAACO, _67af2fAAACN, _67af2fAAABT], tags={I53}),backend=numpy, dtype=float64, data=array([[[ 0.93669257, 1.00292715],\n", " [-1.1592509 , 0.17165121]],\n", "\n", " [[-0.95672409, 0.44413637],\n", " [-0.24374346, 1.45953642]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAACE, _67af2fAAAAj, _67af2fAAAAY], tags={I54}),backend=numpy, dtype=float64, data=array([[[ 0.62266766, 0.34755705],\n", " [-0.48303148, -1.09935182]],\n", "\n", " [[ 0.41925794, 1.06491403],\n", " [-0.41431341, -1.57496432]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAACP, _67af2fAAABR, _67af2fAAABI], tags={I55}),backend=numpy, dtype=float64, data=array([[[-1.51382364, 0.36708892],\n", " [-1.62472029, 1.67648859]],\n", "\n", " [[ 0.98760363, -0.78162987],\n", " [-0.63497334, -0.62930064]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAACR, _67af2fAAACQ, _67af2fAAAAv], tags={I56}),backend=numpy, dtype=float64, data=array([[[-0.42659068, 1.32173848],\n", " [-0.03978853, -0.10435659]],\n", "\n", " [[ 0.03709526, -0.6325428 ],\n", " [-1.27154466, 0.32421925]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAACS, _67af2fAAACF, _67af2fAAABj], tags={I57}),backend=numpy, dtype=float64, data=array([[[ 0.27335833, 1.19676365],\n", " [ 0.6535591 , 0.08589129]],\n", "\n", " [[ 0.47844404, 0.221359 ],\n", " [-0.19211651, -0.23340824]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAACT, _67af2fAAACJ, _67af2fAAABy], tags={I58}),backend=numpy, dtype=float64, data=array([[[-0.4957821 , 0.64799884],\n", " [ 0.34294736, -0.46004224]],\n", "\n", " [[-0.09062532, -0.26219847],\n", " [-1.07842502, -1.74451027]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAABP, _67af2fAAAAu, _67af2fAAAAm], tags={I59}),backend=numpy, dtype=float64, data=array([[[-0.77202293, -1.27249467],\n", " [ 0.84691268, -1.72488911]],\n", "\n", " [[ 0.99898935, 0.17427921],\n", " [-0.71807075, 0.22366337]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAACV, _67af2fAAACU, _67af2fAAABb], tags={I60}),backend=numpy, dtype=float64, data=array([[[-0.00701465, -1.35254573],\n", " [ 0.55302397, -1.00111538]],\n", "\n", " [[ 0.4508672 , -0.6071619 ],\n", " [-1.72811239, 0.38531025]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAACX, _67af2fAAACW, _67af2fAAAAT], tags={I61}),backend=numpy, dtype=float64, data=array([[[-1.0977206 , -1.21844911],\n", " [-1.0680861 , -0.81158037]],\n", "\n", " [[ 0.88338946, -0.61570669],\n", " [-0.07811817, 0.42106163]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAABX, _67af2fAAABS, _67af2fAAABN], tags={I62}),backend=numpy, dtype=float64, data=array([[[-1.15124221, -0.64150838],\n", " [ 0.95555201, 0.99141828]],\n", "\n", " [[-1.18426722, 0.78212112],\n", " [ 1.3265312 , -0.02626513]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAACG, _67af2fAAABp, _67af2fAAAAG], tags={I63}),backend=numpy, dtype=float64, data=array([[[-1.54744898, 0.25224055],\n", " [-1.62104324, -0.13977993]],\n", "\n", " [[-0.03909069, 1.58248776],\n", " [ 0.55074243, 0.60963354]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAACa, _67af2fAAACZ, _67af2fAAACY], tags={I64}),backend=numpy, dtype=float64, data=array([[[-0.49185897, 0.16316046],\n", " [ 0.05892211, -0.63315672]],\n", "\n", " [[ 1.30455739, 0.02073824],\n", " [ 0.32342008, -0.77156756]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAACU, _67af2fAAACO, _67af2fAAABv], tags={I65}),backend=numpy, dtype=float64, data=array([[[-0.29301534, -0.16665405],\n", " [ 0.05232625, 0.78690332]],\n", "\n", " [[ 0.7520511 , -0.29549456],\n", " [ 1.38767439, 0.17473486]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAACc, _67af2fAAACb, _67af2fAAACB], tags={I66}),backend=numpy, dtype=float64, data=array([[[ 0.79521858, -0.26720061],\n", " [-0.10519735, -0.56633547]],\n", "\n", " [[-0.09871576, -1.46478992],\n", " [ 0.4915131 , 0.50935446]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAACd, _67af2fAAACc, _67af2fAAABc], tags={I67}),backend=numpy, dtype=float64, data=array([[[ 0.75544235, 1.77164135],\n", " [-1.22289025, 1.49047828]],\n", "\n", " [[ 0.12158551, -2.31867424],\n", " [ 0.01848823, 0.85483554]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAACg, _67af2fAAACf, _67af2fAAACe], tags={I68}),backend=numpy, dtype=float64, data=array([[[ 0.7227368 , -0.22551489],\n", " [-0.4888639 , 0.70066707]],\n", "\n", " [[-1.08746465, -0.97158584],\n", " [ 0.85236144, 0.96269801]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAACh, _67af2fAAACS, _67af2fAAABm], tags={I69}),backend=numpy, dtype=float64, data=array([[[ 0.3296755 , -0.91499217],\n", " [ 0.92829453, 1.42199598]],\n", "\n", " [[-1.99166231, 0.0074796 ],\n", " [-0.94931243, -1.12781258]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAACV, _67af2fAAACP, _67af2fAAABk], tags={I70}),backend=numpy, dtype=float64, data=array([[[-0.28388004, 2.44399239],\n", " [-0.23098441, -1.59771318]],\n", "\n", " [[-2.56786834, 1.1907446 ],\n", " [ 1.49135773, 0.5853944 ]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAACd, _67af2fAAAAs, _67af2fAAAAW], tags={I71}),backend=numpy, dtype=float64, data=array([[[ 0.83576201, 2.15339076],\n", " [-0.80696793, 0.24723496]],\n", "\n", " [[ 0.48071583, 0.22638018],\n", " [ 0.99993802, -0.17183673]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAACi, _67af2fAAACM, _67af2fAAABB], tags={I72}),backend=numpy, dtype=float64, data=array([[[-1.72953586, 0.8824201 ],\n", " [ 0.94282464, -1.49052868]],\n", "\n", " [[ 0.49363039, 1.02366011],\n", " [ 1.3219318 , 0.13656684]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAACj, _67af2fAAACf, _67af2fAAABG], tags={I73}),backend=numpy, dtype=float64, data=array([[[ 0.65258668, 0.22272843],\n", " [-0.37710862, -1.4005133 ]],\n", "\n", " [[-0.87819954, 1.06389014],\n", " [-2.67796998, 1.16469057]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAACk, _67af2fAAACN, _67af2fAAAAt], tags={I74}),backend=numpy, dtype=float64, data=array([[[ 1.10930311, 0.96710875],\n", " [-0.18449632, -2.19632474]],\n", "\n", " [[ 2.32847207, -0.19463999],\n", " [ 0.94570235, 0.43298386]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAACl, _67af2fAAACX, _67af2fAAAAl], tags={I75}),backend=numpy, dtype=float64, data=array([[[-0.1160343 , 1.01658209],\n", " [-1.79924617, 0.6967389 ]],\n", "\n", " [[ 1.53000807, -0.91475514],\n", " [ 1.22643248, 1.18258538]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAACm, _67af2fAAAAo, _67af2fAAAAh], tags={I76}),backend=numpy, dtype=float64, data=array([[[ 0.6211931 , -1.46372333],\n", " [-0.67258141, 0.69158572]],\n", "\n", " [[-0.25236025, 1.14300204],\n", " [-0.41196788, -0.4113092 ]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAACg, _67af2fAAACL, _67af2fAAABY], tags={I77}),backend=numpy, dtype=float64, data=array([[[-0.27685081, 0.45897355],\n", " [-0.10725809, -0.17560083]],\n", "\n", " [[-0.75294937, -1.1838208 ],\n", " [ 0.68087654, -1.09662417]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAACk, _67af2fAAABe, _67af2fAAABA], tags={I78}),backend=numpy, dtype=float64, data=array([[[-0.92110031, 2.04748767],\n", " [-0.20930679, 0.09577991]],\n", "\n", " [[-0.40793428, 0.34942966],\n", " [-1.05992335, -0.70095478]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAACl, _67af2fAAABz, _67af2fAAAAN], tags={I79}),backend=numpy, dtype=float64, data=array([[[-0.42925512, 0.1648491 ],\n", " [-0.06745807, -0.49105142]],\n", "\n", " [[-0.66084483, -0.71542717],\n", " [-1.39008283, 1.19607223]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAACj, _67af2fAAABo, _67af2fAAAAy], tags={I80}),backend=numpy, dtype=float64, data=array([[[ 2.02950952, -1.22765565],\n", " [ 1.24918745, -0.59412117]],\n", "\n", " [[-1.15263769, -0.8188466 ],\n", " [-1.23054708, 1.60579691]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAACn, _67af2fAAACh, _67af2fAAAAA], tags={I81}),backend=numpy, dtype=float64, data=array([[[ 1.06905335, 0.45742907],\n", " [ 0.93140848, -0.28482561]],\n", "\n", " [[-1.26345935, -1.16125411],\n", " [-1.58408487, -0.8977538 ]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAACo, _67af2fAAACW, _67af2fAAAAE], tags={I82}),backend=numpy, dtype=float64, data=array([[[-0.31384969, -1.14049149],\n", " [-1.19614084, 1.25242178]],\n", "\n", " [[ 0.24187925, 0.02246282],\n", " [-0.48479543, 0.01896328]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAACr, _67af2fAAACq, _67af2fAAACp], tags={I83}),backend=numpy, dtype=float64, data=array([[[-0.8081965 , -1.6399214 ],\n", " [ 0.15667124, -0.26231046]],\n", "\n", " [[-0.98283266, 1.06778207],\n", " [-0.64056352, -1.38303642]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAACm, _67af2fAAACR, _67af2fAAAAd], tags={I84}),backend=numpy, dtype=float64, data=array([[[-0.14068929, 0.41546312],\n", " [-0.93706581, 0.65419382]],\n", "\n", " [[-0.80648235, -0.74373297],\n", " [ 1.33716318, -1.61944607]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAACe, _67af2fAAACQ, _67af2fAAABr], tags={I85}),backend=numpy, dtype=float64, data=array([[[-1.61184631, 1.62894392],\n", " [ 0.40530824, 0.71803393]],\n", "\n", " [[-1.07766989, -0.75596443],\n", " [ 0.02612967, 0.8684165 ]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAACs, _67af2fAAABV, _67af2fAAAAR], tags={I86}),backend=numpy, dtype=float64, data=array([[[-1.00723475, -1.04873348],\n", " [ 0.84360271, 2.15955728]],\n", "\n", " [[ 0.49557051, 0.64082816],\n", " [-0.88432175, 0.49417542]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAACo, _67af2fAAACa, _67af2fAAABO], tags={I87}),backend=numpy, dtype=float64, data=array([[[ 0.17196303, 2.17154549],\n", " [-0.95691292, -1.77934294]],\n", "\n", " [[ 0.1758767 , 0.27865058],\n", " [-0.97245654, -0.32586481]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAACt, _67af2fAAACn, _67af2fAAABg], tags={I88}),backend=numpy, dtype=float64, data=array([[[ 0.16454028, 1.0543336 ],\n", " [-0.14183872, -0.06806919]],\n", "\n", " [[-1.25950768, -0.66979446],\n", " [-0.61563759, 0.32709842]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAACK, _67af2fAAAAX, _67af2fAAAAC], tags={I89}),backend=numpy, dtype=float64, data=array([[[ 0.05836501, -0.14479672],\n", " [ 0.24275703, -0.66770472]],\n", "\n", " [[-0.9993962 , 1.10414673],\n", " [-2.17430902, -1.47743442]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAACT, _67af2fAAABx, _67af2fAAABK], tags={I90}),backend=numpy, dtype=float64, data=array([[[-0.49148804, -0.50568072],\n", " [-0.38951434, -0.23834332]],\n", "\n", " [[-0.83087066, -0.07078329],\n", " [-0.66152192, -0.29215283]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAABn, _67af2fAAABa, _67af2fAAAAw], tags={I91}),backend=numpy, dtype=float64, data=array([[[-0.14846772, 1.19470227],\n", " [-0.44202288, 0.23673868]],\n", "\n", " [[-0.03347083, -0.32092881],\n", " [ 0.42150777, 0.5883475 ]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAACq, _67af2fAAABU, _67af2fAAAAf], tags={I92}),backend=numpy, dtype=float64, data=array([[[-0.86598189, -0.49039864],\n", " [ 1.51802956, -0.59100812]],\n", "\n", " [[ 1.37447989, 0.35109993],\n", " [ 0.35337737, 0.96290664]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAABs, _67af2fAAABW, _67af2fAAAAz], tags={I93}),backend=numpy, dtype=float64, data=array([[[-0.42153279, -0.06794624],\n", " [ 0.13617862, 1.19429339]],\n", "\n", " [[-0.67560454, 0.87065649],\n", " [-0.39001935, 0.63779384]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAACt, _67af2fAAAAq, _67af2fAAAAZ], tags={I94}),backend=numpy, dtype=float64, data=array([[[ 1.20231593, -0.26320706],\n", " [-1.38778291, -0.22438736]],\n", "\n", " [[-0.27412015, -0.0637929 ],\n", " [ 0.92141209, 0.76731005]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAACi, _67af2fAAABi, _67af2fAAABd], tags={I95}),backend=numpy, dtype=float64, data=array([[[ 0.88076909, -0.1284671 ],\n", " [-0.9217294 , 0.99217325]],\n", "\n", " [[-1.02812186, -0.47629981],\n", " [ 1.76037976, 0.42173594]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAACs, _67af2fAAACr, _67af2fAAACH], tags={I96}),backend=numpy, dtype=float64, data=array([[[-0.8272083 , -0.77226563],\n", " [ 1.40038892, -0.45392213]],\n", "\n", " [[ 0.99849229, -0.15310644],\n", " [-1.83419131, -0.15131365]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAACb, _67af2fAAABt, _67af2fAAAAS], tags={I97}),backend=numpy, dtype=float64, data=array([[[ 0.67219424, -0.67334425],\n", " [ 1.0021386 , -0.55126219]],\n", "\n", " [[ 0.59799654, 0.36190119],\n", " [-1.33290845, -2.0234266 ]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAACp, _67af2fAAACZ, _67af2fAAAAP], tags={I98}),backend=numpy, dtype=float64, data=array([[[-0.96087989, 0.66463361],\n", " [-0.29470099, 0.47419775]],\n", "\n", " [[ 0.28326056, 0.42166369],\n", " [-0.45476309, -2.62552245]]])
Tensor(shape=(2, 2, 2), inds=[_67af2fAAACY, _67af2fAAACI, _67af2fAAABq], tags={I99}),backend=numpy, dtype=float64, data=array([[[ 0.53322615, 0.07497022],\n", " [-0.12286424, -0.00459035]],\n", "\n", " [[ 0.74915553, -0.93343275],\n", " [-0.5978229 , 0.35686287]]])

...

" ], "text/plain": [ "TensorNetworkGen(tensors=100, indices=150)" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import quimb.tensor as qtn\n", "\n", "tn = qtn.TN_rand_reg(100, 3, D=2, seed=42)\n", "tn.draw(edge_color=True)\n", "tn" ] }, { "cell_type": "markdown", "id": "44dd40d4-f46c-408b-99b8-c186e398afaa", "metadata": {}, "source": [ "Although `quimb` can automatically generate the einsum equation in this case,\n", "it might be generally annoying to construct the string. Instead we can directly\n", "use the tensor networks index names:" ] }, { "cell_type": "code", "execution_count": 8, "id": "b69964b1-4fb5-4f3a-a77c-309b8a865019", "metadata": {}, "outputs": [], "source": [ "arrays = []\n", "inputs = []\n", "for t in tn:\n", " arrays.append(t.data)\n", " inputs.append(t.inds)" ] }, { "cell_type": "markdown", "id": "307407f9-bf6e-4eb0-8f69-ed76b1c19018", "metadata": {}, "source": [ "In this case they are randomly generated unique indentifiers, but they could\n", "be anything hashable, as long as they match the shapes of the arrays and encode the geometry of the contraction." ] }, { "cell_type": "code", "execution_count": 9, "id": "8f05f5a0-b8c4-424a-8c42-dbe9e6afc915", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[('_67af2fAAAAC', '_67af2fAAAAB', '_67af2fAAAAA'),\n", " ('_67af2fAAAAF', '_67af2fAAAAE', '_67af2fAAAAD'),\n", " ('_67af2fAAAAI', '_67af2fAAAAH', '_67af2fAAAAG'),\n", " ('_67af2fAAAAL', '_67af2fAAAAK', '_67af2fAAAAJ'),\n", " ('_67af2fAAAAN', '_67af2fAAAAM', '_67af2fAAAAB')]" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "inputs[:5]" ] }, { "cell_type": "markdown", "id": "f23eafcf-b119-4791-b4ea-3792aea47948", "metadata": {}, "source": [ "Perform the contraction, using the higher quality auto preset:" ] }, { "cell_type": "code", "execution_count": 10, "id": "84f35b17-0c16-4cc1-94ae-87678126a30d", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPU times: user 356 ms, sys: 585 µs, total: 356 ms\n", "Wall time: 322 ms\n" ] }, { "data": { "text/plain": [ "array(-1.78478002e+15)" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%%time\n", "ctg.array_contract(arrays, inputs, optimize=\"auto-hq\")" ] }, { "cell_type": "markdown", "id": "c0df5b12-992c-46f8-bbd9-6458c14a7e15", "metadata": {}, "source": [ "Because the contraction expression is cached if we perform the contraction\n", "again with the same preset it will be faster:" ] }, { "cell_type": "code", "execution_count": 11, "id": "2539f2fe-e000-48bd-86cf-9e51cdd66e04", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPU times: user 157 ms, sys: 4.63 ms, total: 162 ms\n", "Wall time: 33.1 ms\n" ] }, { "data": { "text/plain": [ "array(-1.78478002e+15)" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%%time\n", "ctg.array_contract(arrays, inputs, optimize=\"auto-hq\")" ] }, { "cell_type": "markdown", "id": "1f83a00e-ab47-4a4a-be4d-d50a962ed60e", "metadata": {}, "source": [ "If you want to relate the internal contraction 'symbols' (single unicode\n", "letters) that appear on the contraction tree to the supplied 'indices'\n", "(arbitrary hashable objects) then you can call the\n", "[`get_symbol_map`](cotengra.get_symbol_map) function:" ] }, { "cell_type": "code", "execution_count": 13, "id": "d31088ee-1d65-41e8-a5e9-131299a248f5", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['Ď', 'ý', 'ì']" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "symbol_map = ctg.get_symbol_map(inputs)\n", "[symbol_map[ind] for ind in t.inds]" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3" } }, "nbformat": 4, "nbformat_minor": 2 } ================================================ FILE: docs/index.md ================================================

cotengra

[![tests](https://github.com/jcmgray/cotengra/actions/workflows/test.yml/badge.svg)](https://github.com/jcmgray/cotengra/actions/workflows/test.yml) [![codecov](https://codecov.io/gh/jcmgray/cotengra/branch/main/graph/badge.svg?token=Q5evNiuT9S)](https://codecov.io/gh/jcmgray/cotengra) [![Docs](https://readthedocs.org/projects/cotengra/badge/?version=latest)](https://cotengra.readthedocs.io) [![PyPI](https://img.shields.io/pypi/v/cotengra?color=teal)](https://pypi.org/project/cotengra/) [![Anaconda-Server Badge](https://anaconda.org/conda-forge/cotengra/badges/version.svg)](https://anaconda.org/conda-forge/cotengra) [![Pixi Badge](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/prefix-dev/pixi/main/assets/badge/v0.json)](https://pixi.sh) `cotengra` is a python library for contracting tensor networks or einsum expressions involving large numbers of tensors. The original accompanying paper is [***'Hyper-optimized tensor network contraction'***](https://quantum-journal.org/papers/q-2021-03-15-410/) - if this project is useful please consider citing this to encourage further development! Some of the key feautures of `cotengra` include: * drop-in ``einsum`` and ``ncon`` replacement * an explicit **contraction tree** object that can be flexibly built, modified and visualized * a **'hyper optimizer'** that samples trees while tuning the generating meta-paremeters * **dynamic slicing** for massive memory savings and parallelism * **simulated annealing** as an alternative optimizing and slicing strategy * support for **hyper** edge tensor networks and thus arbitrary einsum equations * **paths** that can be supplied to [`numpy.einsum`](https://numpy.org/doc/stable/reference/generated/numpy.einsum.html), [`opt_einsum`](https://dgasmith.github.io/opt_einsum/), [`quimb`](https://quimb.readthedocs.io/en/latest/) among others * **performing contractions** with tensors from many libraries via [`autoray`](https://github.com/jcmgray/autoray), even if they don't provide einsum or tensordot but do have (batch) matrix multiplication --- Commits since [906f838](https://github.com/jcmgray/cotengra/commit/906f838d21840dc41c652efb63faf1f88c6113ee) added functionality first demonstrated in ['Classical Simulation of Quantum Supremacy Circuits'](https://arxiv.org/abs/2005.06787) - namely, contraction subtree reconfiguration and the interleaving of this with slicing - *dynamic slicing*. In the ``examples`` folder you can find notebooks reproducing (in terms of sliced contraction complexity) the results of that paper as well as ['Simulating the Sycamore quantum supremacy circuits'](https://arxiv.org/abs/2103.03074). Indeed, in collaboration with NVidia, ``cotengra`` & ``quimb`` have now been used for a state-of-the-art simulation of the Sycamore chip with ``cutensor`` on the Selene supercomputer, [producing a sample from a circuit of depth 20 in less than 10 minutes](https://blogs.nvidia.com/blog/2021/04/12/what-is-quantum-computing/). --- ```{toctree} :caption: Guides :maxdepth: 2 installation.md high-level-interface.ipynb basics.ipynb advanced.ipynb visualization.ipynb contraction.ipynb trees.ipynb index_examples.md ``` ```{toctree} :caption: Development :hidden: changelog.md GitHub Repository ``` ================================================ FILE: docs/index_examples.md ================================================ # Examples ```{toctree} :caption: Examples :maxdepth: 2 examples/ex_large_output_lazy.ipynb examples/ex_compressed_contraction.ipynb examples/ex_trace_contraction_to_matmuls.ipynb ``` ================================================ FILE: docs/installation.md ================================================ # Installation `cotengra` is available on both [pypi](https://pypi.org/project/cotengra/) and [conda-forge](https://anaconda.org/conda-forge/cotengra). While `cotengra` is pure python itself, the preferred way to install it is with [pixi](https://pixi.sh), which creates isolated and reproducible environments that can mix packages from [`conda-forge`](https://conda-forge.org/) (the default) and also [`pypi`](https://pypi.org/). **Installing with `pixi` (preferred):** ```bash pixi init cotengra-project cd cotengra-project pixi add cotengra ``` **Installing with `pip`:** ```bash pip install cotengra # or uv pip install cotengra ``` It is recommended to use [`uv`](https://docs.astral.sh/uv/) to install and manage purely pypi based environments. **Installing with `conda` / `mamba`:** ```bash conda install -c conda-forge cotengra ``` [`miniforge`](https://github.com/conda-forge/miniforge) is the recommended way to manage and install a conda-based environment. **Installing the latest version directly from github:** If you want to checkout the latest version of features and fixes, you can install directly from the github repository: ```bash pip install -U git+https://github.com/jcmgray/cotengra.git ``` **Installing a local, editable development version:** If you want to make changes to the source code and test them out, you can install a local editable version of the package: ```bash git clone https://github.com/jcmgray/cotengra.git pip install --no-deps -U -e cotengra/ ``` Other than that, the optional dependencies are detailed below. ````{hint} The recommended selection of optional dependencies from below covering most use-cases is: ``` autoray cmaes cotengrust cytoolz kahypar loky networkx opt_einsum optuna tqdm ``` ```` ## Contraction If you want to perform the contractions using ``cotengra`` itself you'll need: * [`autoray`](https://github.com/jcmgray/autoray) which supports at least `numpy`, `cupy`, `torch`, `tensorflow`, `jax`, and `autograd` among others. ## Optimization * [`kahypar`](https://github.com/SebastianSchlag/kahypar) - **Karlsruhe Hypergraph Partitioning** for high quality divisive tree building ([available via pip](https://pypi.org/project/kahypar/), unfortunately not yet via `conda` or for windows) * [`cotengrust`](https://github.com/jcmgray/cotengrust/tree/main) - rust accelerated pathfinding primitives * [`tqdm`](https://github.com/tqdm/tqdm) - for showing live progress (available via [pip](https://pypi.org/project/tqdm/) or `conda`) * [`cytoolz`](https://github.com/pytoolz/cytoolz/) - a couple of slightly faster utility functions To perform the hyper-optimization (and not just randomly sample) one of the following libraries is needed: * [`optuna`](https://github.com/optuna/optuna) - **Tree of Parzen Estimators** used by default, high quality but only medium fast * [`cmaes`](https://github.com/CyberAgentAILab/cmaes) - **Covariance Matrix Adaptation Evolution Strategy**, medium quality but very fast * [`nevergrad`](https://facebookresearch.github.io/nevergrad/) - various population and evolutionary algorithms (also fast & suitable for highly parallel path findings) * [`skopt`](https://scikit-optimize.github.io/stable/) - random forest as well as Gaussian process regressors (very high quality but very slow) If you want to experiment with other algorithms then the following can be used: * [`python-igraph`](https://igraph.org/python/) - various other community detection algorithms (though no hyperedge support and usually worse performance than `kahypar`). * [`QuickBB`](https://www.hlt.utdallas.edu/~vgogate/quickbb.html) * [`FlowCutter`](https://github.com/kit-algo/flow-cutter-pace17) The latter two are both accessed simply using their command line interface and so the following executables should be placed on the path somewhere: [`quickbb_64`, `flow_cutter_pace17`]. ## Parallelization The parallel functionality can requires any of the following: * [`concurrent.futures`](https://docs.python.org/3/library/concurrent.futures.html) - python standard library * [`loky`](https://github.com/joblib/loky) either directly or via [`joblib`](https://joblib.readthedocs.io/) * [`ray`](https://www.ray.io/) - distributed computing * [`dask distributed`](http://distributed.dask.org) - distributed computing ## Visualization The following packages enable visualization: * [`networkx`](https://networkx.org/) for most visualizations * [`pygraphviz`](https://pygraphviz.github.io/) for fast and nice graph layouts ================================================ FILE: docs/make.bat ================================================ @ECHO OFF pushd %~dp0 REM Command file for Sphinx documentation if "%SPHINXBUILD%" == "" ( set SPHINXBUILD=sphinx-build ) set SOURCEDIR=. set BUILDDIR=_build if "%1" == "" goto help %SPHINXBUILD% >NUL 2>NUL if errorlevel 9009 ( echo. echo.The 'sphinx-build' command was not found. Make sure you have Sphinx echo.installed, then set the SPHINXBUILD environment variable to point echo.to the full path of the 'sphinx-build' executable. Alternatively you echo.may add the Sphinx directory to PATH. echo. echo.If you don't have Sphinx installed, grab it from echo.https://www.sphinx-doc.org/ exit /b 1 ) %SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% goto end :help %SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% :end popd ================================================ FILE: docs/trees.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "id": "43a0bfd5-762c-42c4-bf40-7c7cba1c33f4", "metadata": {}, "source": [ "# Tree Surgery\n", "\n", "The core data structure in [`cotengra`](cotengra) is the\n", "[`ContractionTree`](cotengra.core.ContractionTree), which as well as describing\n", "the tree generates all the required intermediate indices and equations etc.\n", "This page describes some aspects of the design and ways you can modify or\n", "construct trees yourself.\n", "\n", "First we just generate a small random contraction:" ] }, { "cell_type": "code", "execution_count": 1, "id": "a4b0dd86-073a-499e-8a20-2c2eb9833b71", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "dn,bhl,afj,cejk,cdefglmno,gh,i,k,im,o->ba\n" ] }, { "data": { "image/svg+xml": [ "" ], "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "data": { "text/plain": [ "(
, )" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%config InlineBackend.figure_formats = ['svg']\n", "import cotengra as ctg # noqa\n", "\n", "# generate a random contraction\n", "inputs, output, shapes, size_dict = ctg.utils.rand_equation(\n", " 10, 3, n_out=2, seed=4\n", ")\n", "print(ctg.utils.inputs_output_to_eq(inputs, output))\n", "\n", "# turn into a hypergraph in order to visualize\n", "hg = ctg.get_hypergraph(inputs, output, size_dict)\n", "hg.plot()" ] }, { "cell_type": "markdown", "id": "cffdc1f6-cbbb-4c81-b04f-8bc14698a2b5", "metadata": {}, "source": [ "## Design" ] }, { "cell_type": "markdown", "id": "e96566e9-3cd7-4a5b-81ab-df876ff62e3a", "metadata": {}, "source": [ "We can create an empty tree with the following (we use `nodeops=\"frozenset[int]\"`\n", "so that the node labels directly show the inputs they contain, but the default\n", "node type is `int` for performance):" ] }, { "cell_type": "code", "execution_count": 2, "id": "b7680a24-d233-4f53-a404-f9627fd99ba3", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tree = ctg.ContractionTree(inputs, output, size_dict, nodeops=\"frozenset[int]\")\n", "tree" ] }, { "cell_type": "markdown", "id": "3efc6c42-057f-4220-bbb1-8496b395438d", "metadata": {}, "source": [ "```{note}\n", "You can also initialize an empty tree with [`ContractionTree.from_eq`](cotengra.core.ContractionTree.from_eq) or construct a completed tree with [`ContractionTree.from_path`](cotengra.core.ContractionTree.from_path) and [`ContractionTree.from_info`](cotengra.core.ContractionTree.from_info). The [`search`](cotengra.HyperOptimizer.search) method of optimizers also directly returns a tree.\n", "```" ] }, { "cell_type": "markdown", "id": "f9986d72-400b-455c-b922-ef0bba49f1b5", "metadata": {}, "source": [ "The nodes of the tree are now frozen sets of integers, describing groups of inputs which form intermediate tensors. Initially only the final output tensor (tree root node), and input tensors (tree leaf nodes) are known:" ] }, { "cell_type": "code", "execution_count": 3, "id": "33072c14-7eba-46d7-a95f-537b05b78270", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "frozenset({0, 1, 2, 3, 4, 5, 6, 7, 8, 9})\n" ] } ], "source": [ "print(tree.root)" ] }, { "cell_type": "code", "execution_count": 4, "id": "0da716e0-a7b9-4a14-a3ad-dc012c5e5de7", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "frozenset({0})\n", "frozenset({1})\n", "frozenset({2})\n", "frozenset({3})\n", "frozenset({4})\n", "frozenset({5})\n", "frozenset({6})\n", "frozenset({7})\n", "frozenset({8})\n", "frozenset({9})\n" ] } ], "source": [ "for node in tree.gen_leaves():\n", " print(node)" ] }, { "cell_type": "markdown", "id": "9ccb6fe0-76bd-4980-b7df-56f9b4ae2088", "metadata": {}, "source": [ "In order to complete the tree we need to find $N - 1$ contractions (branches) via either merges of parentless nodes (like the leaves above) or partitions of childless nodes (like the root above). [`contract_nodes`](cotengra.core.ContractionTree.contract_nodes) is the method used to form these merges for an arbitrary set of nodes." ] }, { "cell_type": "markdown", "id": "6b4cbf1a-7f5e-479a-baef-c3b22be1281d", "metadata": {}, "source": [ "Here we merge two leaves to form a new intermediate (agglomeratively building the tree from the bottom):" ] }, { "cell_type": "code", "execution_count": 5, "id": "9323f9d6-efd9-46f3-98a9-125a4ef74a12", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "frozenset({0, 1})" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "parent = tree.contract_nodes([frozenset([0]), frozenset([1])])\n", "parent" ] }, { "cell_type": "markdown", "id": "ad34b81a-5de3-4ae4-9a7c-ff7620fd9d00", "metadata": {}, "source": [ "Here we split the root (divisively building the tree from the top):" ] }, { "cell_type": "code", "execution_count": 6, "id": "4c8cb1b5-228a-4d53-aee4-7a2cd7eee96b", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "frozenset({0, 1, 2, 3, 4, 5, 6, 7, 8, 9})" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# first we parse the subgraphs to proper node types\n", "left = tree._add_node(range(0, 5))\n", "right = tree._add_node(range(5, 10))\n", "\n", "# then this should output the root\n", "tree.contract_nodes([left, right])" ] }, { "cell_type": "markdown", "id": "1eac789d-c003-4490-a485-013374670410", "metadata": {}, "source": [ "Note how we can declare `left` and `right` here as intermediates even though we don't know exactly how they will be formed yet. We can already work out certain properties of such nodes for example their indices ('legs') and their size:" ] }, { "cell_type": "code", "execution_count": 9, "id": "96586214-c7c8-4fc2-bdb7-f8f011a9f6b3", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "({'b': 1, 'h': 1, 'a': 1, 'k': 1, 'g': 1, 'm': 1, 'o': 1}, 432)" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tree.get_legs(left), tree.get_size(left)" ] }, { "cell_type": "markdown", "id": "b1e19a0f-f762-48c5-b4ed-83798f480b7f", "metadata": {}, "source": [ "But other information such as the flops required to form them need their children specified first." ] }, { "cell_type": "code", "execution_count": 10, "id": "34474da1-e7c1-4eb0-bd6c-c4d98e068084", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "432" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tree.get_flops(tree.root)" ] }, { "cell_type": "code", "execution_count": 11, "id": "43382b1f-c428-40df-acb5-5c2bd6e9e69d", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'abc,de->abcde'" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tree.get_einsum_eq(parent)" ] }, { "cell_type": "markdown", "id": "9a77d4b9-b650-45eb-93d7-4204a091dbc3", "metadata": {}, "source": [ "The core tree information is stored as a mapping of children like so:" ] }, { "cell_type": "code", "execution_count": 12, "id": "fbb6a4a0-01eb-4d6b-a3de-b0ff434a12c0", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{frozenset({0, 1}): (frozenset({1}), frozenset({0})),\n", " frozenset({0, 1, 2, 3, 4, 5, 6, 7, 8, 9}): (frozenset({5, 6, 7, 8, 9}),\n", " frozenset({0, 1, 2, 3, 4}))}" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tree.children" ] }, { "cell_type": "markdown", "id": "a950263b-d13e-430e-91d1-3a40767be94b", "metadata": {}, "source": [ "We can compute the flops and any other local information for any nodes that are keys of this. This information is cached in `tree.info`.\n", "\n", "You can get all remaining 'incomplete' nodes by calling [`tree.get_incomplete_nodes`](cotengra.core.ContractionTree.get_incomplete_nodes). This returns a dictionary, where each key is a 'childless' node, and each value is the list of 'parentless' nodes that are within its subgraph:" ] }, { "cell_type": "code", "execution_count": 14, "id": "e804ed26", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{frozenset({0, 1, 2, 3, 4}): [frozenset({2}),\n", " frozenset({3}),\n", " frozenset({4}),\n", " frozenset({0, 1})],\n", " frozenset({5, 6, 7, 8, 9}): [frozenset({5}),\n", " frozenset({6}),\n", " frozenset({7}),\n", " frozenset({8}),\n", " frozenset({9})]}" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tree.get_incomplete_nodes()" ] }, { "cell_type": "markdown", "id": "93bcc9e2-44bb-4917-b6bf-fcebab029f4a", "metadata": {}, "source": [ "Each of these 'empty subtrees' needs to be filled in in order to complete the tree.\n", "\n", "When calling `contract_nodes` we can actually specify an arbitrary collection of (uncontracted) nodes, these can be seen as the leaves of a subtree which is a mini contraction problem in its own right. Hence the function itself takes the `optimize` kwarg used to specify how to optimize this sub contraction. Here we'll make use of this to complete our tree." ] }, { "cell_type": "code", "execution_count": 11, "id": "d908d0ca-5c76-47fa-9a56-f8592e298add", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# fill in the subtree with `left` as root\n", "tree.contract_nodes([parent] + [frozenset([i]) for i in range(2, 5)])\n", "\n", "# fill in the subtree with `right` as root\n", "tree.contract_nodes([frozenset([i]) for i in range(5, 10)])\n", "\n", "# our tree should now be complete\n", "tree.is_complete()" ] }, { "cell_type": "markdown", "id": "c1e286bd-a5c6-4806-9c9d-870e7434b255", "metadata": {}, "source": [ "We can now plot our tree, check full costs, and use it perform contractions etc:" ] }, { "cell_type": "code", "execution_count": 12, "id": "401afda9-0f61-44d5-a260-d5a15fbdb801", "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "" ], "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "data": { "text/plain": [ "(
, )" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tree.plot_flat()" ] }, { "cell_type": "code", "execution_count": 17, "id": "a5b9546b-f73b-4e4d-aac4-9e8fac5ea803", "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "" ], "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "data": { "text/plain": [ "(
, )" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tree.plot_tent(order=True)" ] }, { "cell_type": "code", "execution_count": 18, "id": "992d941d-31f0-4e3d-afd6-6cc2d7a3d50d", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(9.754887502163468, 21586.0)" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tree.contraction_width(), tree.contraction_cost()" ] }, { "cell_type": "code", "execution_count": 19, "id": "15c000dd-b2a9-4159-b76c-8633f4130bae", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 104.78668702, 164.19133867],\n", " [ 161.34287932, 69.65644265],\n", " [-116.42788952, -46.96147145]])" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import numpy as np\n", "\n", "arrays = [np.random.randn(*s) for s in shapes]\n", "tree.contract(arrays)" ] }, { "cell_type": "markdown", "id": "a4c0e8b7-f6a3-474b-8dfb-9f2d9c6bd792", "metadata": {}, "source": [ "We can also generate an explicit **contraction path**, which is a specific ordering of the tree (the default for exact contractions being depth first) and the format used by `opt_einsum` and accepted by `quimb` too:" ] }, { "cell_type": "code", "execution_count": 20, "id": "2ca5c822-0987-4b44-bdd2-42d11c5c48cf", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "((6, 8), (7, 8), (5, 6), (5, 6), (0, 1), (2, 4), (0, 1), (1, 2), (0, 1))" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "path = tree.get_path()\n", "path" ] }, { "cell_type": "markdown", "id": "40de3597-6770-4187-8c57-b5757986e805", "metadata": {}, "source": [ "Once we have a complete tree, either by explicitly building it or more likely as returned by an optimizer, we can also *modify* in various ways as detailed below." ] }, { "cell_type": "markdown", "id": "b0d63433-101d-474d-a13b-e29f77ffe163", "metadata": {}, "source": [ "## Index Slicing\n", "\n", "Slicing is the technique of choosing some indices to explicitly sum over rather than include as tensor dimensions - thereby takng indexed slices of those tensors. It is also known as **variable projection** and **bond cutting**. The overall effect is to turn a single contraction into many independent, easier contractions as depicted below:\n", "\n", "

\"cotengra\"

\n", "\n", "While slicing *every* index would be equivalent to performing the naive einsum and thus exponentially slower, carefully choosing just a few *can* result in little to no overhead. What you gain is:\n", "\n", "1. **Each contraction can require drastically less memory**\n", "2. **Each contraction can be performed in parallel**\n", "\n", "In general, one specifies slicing in the `HyperOptimizer` loop - see [Slicing and Subtree Reconfiguration](advanced.ipynb#slicing-and-subtree-reconfiguration) - this section covers manually slicing a tree and the details." ] }, { "cell_type": "code", "execution_count": 21, "id": "c50f5fff", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "sAOÆÍÐÑÒð,Üâ,eDWÀÇãçõöĈ,dmÉý,aÁĀ,BOÌÛó,fÔÙă,qÕÝáûąĆ,EKÍÞðú,yáñ÷,knoRÀÃ÷,csÙíþ,hPÊÕ×,lÐãî,S,FRý,hpyÂÞä,EØÜâñö,Hïøû,bvLÈ×þĀĂ,ÈÏå,oCQòôāĄą,biwGIà,æìòù,xMTî,gWÎÚùā,uNVYÊÏĂ,cìĈ,rTÁÃÝ,eAÉë,jtGÚüĄĆ,ÄÇéć,dv,pÄÓßÿ,Dí,zÅËåúă,juVXæ,Jïø,fqPÅÖè,HKÔõ,JSËÛë,awNÖßàéê,rxZ,lntIUÎÓä,gkzQXÂØèć,LUZÑêó,iÌüÿ,BCMç,FÆÒ,mYô->\n" ] }, { "data": { "image/svg+xml": [ "" ], "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "data": { "text/plain": [ "(
, )" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# create a reasonable large random contraction:\n", "inputs, output, shapes, size_dict = ctg.utils.rand_equation(\n", " n=50, reg=5, seed=0, d_max=2\n", ")\n", "arrays = [np.random.uniform(size=s) for s in shapes]\n", "\n", "# visualize it:\n", "print(ctg.utils.inputs_output_to_eq(inputs, output))\n", "ctg.HyperGraph(inputs, output, size_dict).plot()" ] }, { "cell_type": "code", "execution_count": 22, "id": "afbd6414", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(572054568704.0, 27.0)" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# start with a simple greedy contraction path / tree\n", "tree = ctg.array_contract_tree(inputs, output, size_dict, optimize=\"greedy\")\n", "\n", "# check the time and space requirements\n", "tree.contraction_cost(), tree.contraction_width()" ] }, { "cell_type": "markdown", "id": "e1d007b4", "metadata": {}, "source": [ "We can call the [`slice`](cotengra.core.ContractionTree.slice) method of a tree\n", "to slice it." ] }, { "cell_type": "code", "execution_count": 23, "id": "32431e39", "metadata": {}, "outputs": [], "source": [ "tree_s = tree.slice(target_size=2**20)" ] }, { "cell_type": "markdown", "id": "41b915d8", "metadata": {}, "source": [ "```{hint}\n", "This method and various others can also be called inplace with a trailing underscore.\n", "```" ] }, { "cell_type": "code", "execution_count": 24, "id": "b183dbd6", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "({'M': SliceInfo(inner=True, ind='M', size=2, project=None),\n", " 'Q': SliceInfo(inner=True, ind='Q', size=2, project=None),\n", " 'Á': SliceInfo(inner=True, ind='Á', size=2, project=None),\n", " 'Ã': SliceInfo(inner=True, ind='Ã', size=2, project=None),\n", " 'Æ': SliceInfo(inner=True, ind='Æ', size=2, project=None),\n", " 'á': SliceInfo(inner=True, ind='á', size=2, project=None),\n", " 'ç': SliceInfo(inner=True, ind='ç', size=2, project=None),\n", " 'ñ': SliceInfo(inner=True, ind='ñ', size=2, project=None),\n", " 'ÿ': SliceInfo(inner=True, ind='ÿ', size=2, project=None),\n", " 'ą': SliceInfo(inner=True, ind='ą', size=2, project=None)},\n", " 1024)" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tree_s.sliced_inds, tree_s.nslices" ] }, { "cell_type": "code", "execution_count": 25, "id": "3d1ada9d", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(656181444608.0, 20.0)" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# check the new time and space requirements\n", "tree_s.contraction_cost(), tree_s.contraction_width()" ] }, { "cell_type": "markdown", "id": "94d68c60", "metadata": {}, "source": [ "The tree now has 6 indices sliced out, and represents 64 individual\n", "contractions each requiring 32x less memory. The total cost has increased\n", "slightly, this ***'slicing overhead'*** we can check:" ] }, { "cell_type": "code", "execution_count": 26, "id": "fc709fd0", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1.147060928286249" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tree_s.contraction_cost() / tree.contraction_cost()" ] }, { "cell_type": "markdown", "id": "43b95971-2d94-438f-93ac-00e3d513441a", "metadata": {}, "source": [ "So less than 15% more floating point operations overall, (arising from\n", "redundantly repeated contractions).\n", "\n", "```{note}\n", "Internally, the tree constructs a [`SliceFinder`](cotengra.slicer.SliceFinder)\n", "object and uses it to search for good indices to slice. For full control, you\n", "could do this yourself and then call manually call\n", "[`remove_ind`](cotengra.core.ContractionTree.remove_ind) on the tree.\n", "```\n", "\n", "Once a [ContractionTree](cotengra.core.ContractionTree) has been sliced, the\n", "[contract](cotengra.core.ContractionTree.contract) method can be used to\n", "automatically perform the sliced contraction:" ] }, { "cell_type": "code", "execution_count": 27, "id": "3e874658-6956-4fe2-8e3c-1dee6d02a02f", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 1024/1024 [00:25<00:00, 40.04it/s]\n" ] }, { "data": { "text/plain": [ "5.725156944176958e+22" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tree_s.contract(arrays, progbar=True)" ] }, { "cell_type": "markdown", "id": "b542a047-96e7-4e2a-873b-e69f1fc14cad", "metadata": {}, "source": [ "See the [main contraction page](contraction.ipynb) for more details on\n", "performing the actual sliced contraction once the indices have been found." ] }, { "cell_type": "markdown", "id": "3eff51f2-dbde-4341-866b-a224e9d03f08", "metadata": {}, "source": [ "## Subtree Reconfiguration\n", "\n", "Any subtree of a contraction tree itself describes a smaller contraction, with\n", "the subtree leaves being the effective inputs (generally intermediate tensors)\n", "and the subtree root being the effective output (also generally an\n", "intermediate). One advantage of cotengra keeping an explicit representation of\n", "the contraction tree is that such subtrees can be easily selected and\n", "re-optimized as illustrated in the following schematic:\n", "\n", "

\"cotengra\"

\n", "\n", "(Note in general the subtree being optimized will be closer in size to 10\n", "intermediates or so.)\n", "\n", "If we do this and improve the contraction cost of a **subtree** (e.g. by using an optimal contraction path), then the contraction cost of the **whole tree** is improved. Moreover we can iterate across many or all subtrees in a `ContractionTree`, reconfiguring them and thus potentially updating the entire tree in incremental 'local' steps.\n", "\n", "The method to call for this is\n", "[`subtree_reconfigure`](cotengra.core.ContractionTree.subtree_reconfigure)." ] }, { "cell_type": "code", "execution_count": 25, "id": "89b9db97", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "0it [00:00, ?it/s]" ] }, { "name": "stderr", "output_type": "stream", "text": [ "log2[SIZE]: 32.00 log10[FLOPs]: 12.98: : 500it [00:00, 660.40it/s]\n" ] } ], "source": [ "# generate a tree\n", "inputs, output, shapes, size_dict = ctg.utils.lattice_equation(\n", " [24, 30], d_max=2\n", ")\n", "tree = ctg.array_contract_tree(inputs, output, size_dict, optimize=\"greedy\")\n", "\n", "# reconfigure it (call tree.subtree_reconfigure? to see many options)\n", "tree_r = tree.subtree_reconfigure(progbar=True)" ] }, { "cell_type": "code", "execution_count": 26, "id": "86400cbe", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1253.3836847767188" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# check the speedup\n", "tree.total_flops() / tree_r.total_flops()" ] }, { "cell_type": "markdown", "id": "abb701ea", "metadata": {}, "source": [ "Since it is a local optimization it is possible to get stuck.\n", "[`subtree_reconfigure_forest`](cotengra.core.ContractionTree.subtree_reconfigure_forest)\n", "offers a basic stochastic search of multiple reconfigurations that can avoid this and also be easily parallelized:" ] }, { "cell_type": "code", "execution_count": 27, "id": "1decea62", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "log2[SIZE]: 32.00 log10[FLOPs]: 12.44: 100%|██████████| 10/10 [00:05<00:00, 1.80it/s]\n" ] } ], "source": [ "tree_f = tree.subtree_reconfigure_forest(progbar=True, num_trees=4)" ] }, { "cell_type": "code", "execution_count": 28, "id": "96c20678", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "4312.69228449926" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# check the speedup\n", "tree.total_flops() / tree_f.total_flops()" ] }, { "cell_type": "markdown", "id": "238ef29f", "metadata": {}, "source": [ "So indeed a little better.\n", "\n", "Subtree reconfiguration is often powerful enough to allow even 'bad' initial paths (like those generated by `'greedy'` ) to become very high quality." ] }, { "cell_type": "markdown", "id": "4385f8e0-b233-43cb-a2c1-09316889d5c7", "metadata": {}, "source": [ "## Dynamic Slicing\n", "\n", "A powerful application for reconfiguration (first implemented in ['Classical Simulation of Quantum Supremacy Circuits'](https://arxiv.org/abs/2005.06787)) is to interleave it with *slicing*. Namely:\n", "\n", "1. Choose an index to slice\n", "2. Reconfigure subtrees to account for the slightly different TN structure without this index\n", "3. Check if the tree has reached a certain size, if not return to 1.\n", "\n", "In this way, the contraction tree is slowly updated to account for potentially many indices being sliced.\n", "\n", "For example imagine we wanted to slice the ``tree_f`` from above to achieve a maximum size of `2**28` (approx suitable for 8GB of memory). We could directly slice it without changing the tree structure at all:" ] }, { "cell_type": "code", "execution_count": 29, "id": "a02e567e", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'Τ': SliceInfo(inner=True, ind='Τ', size=2, project=None),\n", " 'ϟ': SliceInfo(inner=True, ind='ϟ', size=2, project=None),\n", " 'К': SliceInfo(inner=True, ind='К', size=2, project=None),\n", " 'ѕ': SliceInfo(inner=True, ind='ѕ', size=2, project=None)}" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tree_s = tree_f.slice(target_size=2**28)\n", "tree_s.sliced_inds" ] }, { "cell_type": "markdown", "id": "51e9b3f6", "metadata": {}, "source": [ "Or we could simultaneously interleave subtree reconfiguration:" ] }, { "cell_type": "code", "execution_count": 30, "id": "0b70016e", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "log2[SIZE]: 28.00 log10[FLOPs]: 12.36: : 4it [00:04, 1.21s/it]\n" ] }, { "data": { "text/plain": [ "{'ì': SliceInfo(inner=True, ind='ì', size=2, project=None),\n", " 'ϟ': SliceInfo(inner=True, ind='ϟ', size=2, project=None),\n", " 'К': SliceInfo(inner=True, ind='К', size=2, project=None),\n", " 'ѕ': SliceInfo(inner=True, ind='ѕ', size=2, project=None)}" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tree_sr = tree_f.slice_and_reconfigure(target_size=2**28, progbar=True)\n", "tree_sr.sliced_inds" ] }, { "cell_type": "code", "execution_count": 31, "id": "f1580e24", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1.6619162859973315" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tree_s.total_flops() / tree_sr.total_flops()" ] }, { "cell_type": "markdown", "id": "bef503d1", "metadata": {}, "source": [ "We can see it has achieved the target size with 1.5x better cost. There is also a 'forested' version of this algorithm which again performs a stochastic search of multiple possible slicing+reconfiguring options:" ] }, { "cell_type": "code", "execution_count": 32, "id": "89ef4271", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "log2[SIZE]: 28.00 log10[FLOPs]: 12.36: : 4it [00:08, 2.25s/it]\n" ] }, { "data": { "text/plain": [ "1.6619162861844943" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tree_fsr = tree_f.slice_and_reconfigure_forest(target_size=2**28, progbar=True)\n", "tree_s.total_flops() / tree_fsr.total_flops()" ] }, { "cell_type": "markdown", "id": "898c19e6", "metadata": {}, "source": [ "We can see here it has done a little better. The foresting looks roughly like the following:\n", "\n", "

\"cotengra\"

\n", "\n", "The subtree reconfiguration within the slicing can *itself be forested* for a doubly forested algorithm. This will give the highest quality (but also slowest) search." ] }, { "cell_type": "code", "execution_count": 33, "id": "f941d6df", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/media/johnnie/Storage2TB/Sync/dev/python/cotengra/cotengra/parallel.py:276: UserWarning: Parallel specified but no existing global dask client found... created one (with 8 workers).\n", " warnings.warn(\n", "log2[SIZE]: 27.00 log10[FLOPs]: 11.55: : 4it [01:39, 24.76s/it]\n" ] } ], "source": [ "tree_fsfr = tree_f.slice_and_reconfigure_forest(\n", " target_size=2**28,\n", " num_trees=4,\n", " parallel=\"dask\",\n", " reconf_opts=dict(\n", " subtree_size=12,\n", " forested=True,\n", " parallel=\"dask\",\n", " num_trees=4,\n", " ),\n", " progbar=True,\n", ")" ] }, { "cell_type": "code", "execution_count": 34, "id": "aa9d385f", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "10.674935697795002" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tree_s.total_flops() / tree_fsfr.total_flops()" ] }, { "cell_type": "markdown", "id": "f0aea9b4", "metadata": {}, "source": [ "We've set the `subtree_size` here to `12` for higher quality reconfiguration, but reduced the `num_trees` in the forests (from default `8`) to `4` which will still lead to 4 x 4 = 16 trees being generated at each step. Again we see a slight improvement. This level of effort might only be required for very heavily slicing contraction trees, and in this case it might be best simply to trial many initial paths with a basic `slice_and_reconfigure`." ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3" } }, "nbformat": 4, "nbformat_minor": 5 } ================================================ FILE: docs/visualization.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "id": "e07b8472-d0ed-4d9f-b35d-9d3d515e9823", "metadata": {}, "source": [ "# Visualization\n", "\n", "Various aspects of the contraction process can be visualized using the following functions." ] }, { "cell_type": "code", "execution_count": 1, "id": "11a44ba1-85c4-4194-a6e7-287393f7f4c3", "metadata": {}, "outputs": [], "source": [ "%config InlineBackend.figure_formats = ['svg']\n", "import cotengra as ctg" ] }, { "cell_type": "markdown", "id": "630b9be5", "metadata": {}, "source": [ "## Hypergraph visualization\n", "\n", "The first visualization we can do is to visualize the hypergraph corresponding to the geometry of the tensor network or equation with [`HyperGraph.plot`](cotengra.plot.plot_hypergraph). Hyper edges are shown as a zero size vertex connecting the tensors they appear on, like a COPY-tensor:" ] }, { "cell_type": "code", "execution_count": 2, "id": "af822cae", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "abce,bdf,bdef,a,b,ab->ca\n" ] }, { "data": { "image/svg+xml": [ "" ], "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "inputs, output, shapes, size_dict = ctg.utils.rand_equation(\n", " 6,\n", " 2,\n", " n_out=1,\n", " n_hyper_in=1,\n", " n_hyper_out=1,\n", " seed=4,\n", ")\n", "print(ctg.utils.inputs_output_to_eq(inputs, output))\n", "ctg.get_hypergraph(inputs, output, size_dict).plot();" ] }, { "cell_type": "markdown", "id": "510c3048", "metadata": {}, "source": [ "This simple contraction has five types of index:\n", "\n", "1. standard inner index - 'e' - which appear on exactly two tensors\n", "2. standard inner multi-indices - 'd', 'f' - which both appear on the same two tensors\n", "3. standard outer index - 'c' - which appears on exactly one tensor and the output\n", "4. hyper inner index - 'b' - which appears on more than two tensors\n", "5. hyper outer index - 'a' - which appears on multiple tensors and the output\n", "\n", "The nodes and indices are assigned unique colors by default, with hyper indices\n", "shown as dashed lines." ] }, { "cell_type": "markdown", "id": "2f49334a", "metadata": {}, "source": [ "### Small tree visualization" ] }, { "cell_type": "markdown", "id": "634f6ed1", "metadata": {}, "source": [ "If the network is small enough and we have a [`ContractionTree`](cotengra.core.ContractionTree) for it, we can also visualize its entirety including all indices involved at each intermediate contraction using the [`ContractionTree.plot_flat`](cotengra.plot.plot_tree_flat) method:" ] }, { "cell_type": "code", "execution_count": 3, "id": "43957aeb", "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "" ], "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "tree = ctg.array_contract_tree(inputs, output, size_dict)\n", "tree.plot_flat();" ] }, { "cell_type": "markdown", "id": "c9056c49", "metadata": {}, "source": [ "Here the unique node and index coloring by default matches that of the default hypergraph visualization.\n", "The contraction flows from bottom to top." ] }, { "cell_type": "markdown", "id": "4745beb1", "metadata": {}, "source": [ "For the remaining examples, we'll generate a larger 2D lattice contraction, with no outputs or hyper indices:" ] }, { "cell_type": "code", "execution_count": 4, "id": "18580c42", "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "" ], "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# generate an equation representing a 2D lattice\n", "inputs, output, shapes, size_dict = ctg.utils.lattice_equation([5, 6])\n", "hg = ctg.get_hypergraph(inputs, output, size_dict)\n", "hg.plot(draw_edge_labels=True);" ] }, { "cell_type": "markdown", "id": "1c92b55c", "metadata": {}, "source": [ "You can turn off the node/edge coloring or set the node coloring to a simple centrality measure like so:" ] }, { "cell_type": "code", "execution_count": 5, "id": "05b28e38", "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "" ], "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "hg.plot(node_color=\"centrality\", edge_color=False);" ] }, { "cell_type": "markdown", "id": "7daa6358", "metadata": {}, "source": [ "## Optimizer trials visualization\n", "\n", "If we run an hyper optimizer, we can visualize how the scores progress with trials using the\n", "[`HyperOptimizer.plot_trials`](cotengra.plot.plot_trials) method:" ] }, { "cell_type": "code", "execution_count": 6, "id": "7b44f879", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ " 0%| | 0/128 [00:00" ], "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "opt.plot_trials(y=\"flops\");" ] }, { "cell_type": "markdown", "id": "ab124c34", "metadata": {}, "source": [ "Similarly, you can supply `x=\"time\"` to plot the scores as a function of cumulative CPU time.\n", "\n", "We can also plot the distribution of contraction costs against contraction widths using\n", "the [`HyperOptimizer.plot_scatter`](cotengra.plot.plot_scatter) method:" ] }, { "cell_type": "code", "execution_count": 8, "id": "28974b9a", "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "" ], "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "opt.plot_scatter(x=\"size\", y=\"flops\");" ] }, { "cell_type": "markdown", "id": "9f453a6c", "metadata": {}, "source": [ "You can examine the actual distribution of parameters chosen for each method with `HyperOptimizer.plot_parameters_parallel`:" ] }, { "cell_type": "code", "execution_count": 11, "id": "8e3fab65", "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "" ], "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "opt.plot_parameters_parallel(\"greedy\");" ] }, { "cell_type": "markdown", "id": "c3f270e2", "metadata": {}, "source": [ "## Large Tree visualizations\n", "\n", "The following visualization functions are available for inspecting a single,\n", "complete [`ContractionTree`](cotengra.core.ContractionTree) once generated.\n", "They mostly wrap [`plot_tree`](cotengra.plot.plot_tree), where you can see\n", "most of the extra options." ] }, { "cell_type": "markdown", "id": "ddfe5672", "metadata": {}, "source": [ "### Contractions\n", "\n", "[`tree.plot_contractions`](cotengra.plot.plot_contractions)\n", "gives you an overview of the memory and costs throughout the contraction:" ] }, { "cell_type": "code", "execution_count": 9, "id": "27532d10", "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "" ], "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "tree.plot_contractions();" ] }, { "cell_type": "markdown", "id": "8179598e", "metadata": {}, "source": [ "Here, `peak` is the memory required for all intermediates to be stored at once,\n", "`write` is the size of the new intermedite tensor, the max of which is the\n", "*contraction width*. `cost` is the scalar operations of each contraction.\n", "\n", "The list of corresponding pairwise contractions can be explicitly shown with the [`print_contractions`](cotengra.core.ContractionTree.print_contractions) method:" ] }, { "cell_type": "code", "execution_count": 10, "id": "1297354c", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[37m(0) cost: \u001b[39m1.6e+01 \u001b[37mwidths: \u001b[39m3.0,2.0->3.0 \u001b[37mtype: \u001b[39mtensordot\n", "\u001b[37minputs: \u001b[34mi\u001b[34mh\u001b[31m[j],\u001b[32mk\u001b[31m[j]\u001b[39m->\n", "\u001b[37moutput: \u001b[34mi\u001b[34mh\u001b[32m(k)\n", "\n", "\u001b[37m(1) cost: \u001b[39m3.2e+01 \u001b[37mwidths: \u001b[39m3.0,3.0->4.0 \u001b[37mtype: \u001b[39mtensordot\n", "\u001b[37minputs: \u001b[34mi\u001b[34mh\u001b[31m[k],\u001b[31m[k]\u001b[32mv\u001b[32mu\u001b[39m->\n", "\u001b[37moutput: \u001b[34mi\u001b[34mh\u001b[32m(vu)\n", "\n", "\u001b[37m(2) cost: \u001b[39m6.4e+01 \u001b[37mwidths: \u001b[39m4.0,4.0->4.0 \u001b[37mtype: \u001b[39mtensordot\n", "\u001b[37minputs: \u001b[31m[i]\u001b[34mh\u001b[34mv\u001b[31m[u],\u001b[31m[i]\u001b[32mt\u001b[32ms\u001b[31m[u]\u001b[39m->\n", "\u001b[37moutput: \u001b[34mh\u001b[34mv\u001b[32m(ts)\n", "\n", "\u001b[37m(3) cost: \u001b[39m6.4e+01 \u001b[37mwidths: \u001b[39m4.0,3.0->5.0 \u001b[37mtype: \u001b[39mtensordot\n", "\u001b[37minputs: \u001b[34mh\u001b[31m[v]\u001b[34mt\u001b[34ms,\u001b[31m[v]\u001b[32mG\u001b[32mF\u001b[39m->\n", "\u001b[37moutput: \u001b[34mh\u001b[34mt\u001b[34ms\u001b[32m(GF)\n", "\n", "\u001b[37m(4) cost: \u001b[39m1.3e+02 \u001b[37mwidths: \u001b[39m5.0,4.0->5.0 \u001b[37mtype: \u001b[39mtensordot\n", "\u001b[37minputs: \u001b[34mh\u001b[31m[t]\u001b[34ms\u001b[34mG\u001b[31m[F],\u001b[31m[t]\u001b[32mE\u001b[32mD\u001b[31m[F]\u001b[39m->\n", "\u001b[37moutput: \u001b[34mh\u001b[34ms\u001b[34mG\u001b[32m(ED)\n", "\n", "\u001b[37m(5) cost: \u001b[39m1.6e+01 \u001b[37mwidths: \u001b[39m3.0,2.0->3.0 \u001b[37mtype: \u001b[39mtensordot\n", "\u001b[37minputs: \u001b[34mP\u001b[34mV\u001b[31m[W],\u001b[32mR\u001b[31m[W]\u001b[39m->\n", "\u001b[37moutput: \u001b[34mP\u001b[34mV\u001b[32m(R)\n", "\n", "\u001b[37m(6) cost: \u001b[39m3.2e+01 \u001b[37mwidths: \u001b[39m3.0,3.0->4.0 \u001b[37mtype: \u001b[39mtensordot\n", "\u001b[37minputs: \u001b[34mP\u001b[34mV\u001b[31m[R],\u001b[32mG\u001b[31m[R]\u001b[32mQ\u001b[39m->\n", "\u001b[37moutput: \u001b[34mP\u001b[34mV\u001b[32m(GQ)\n", "\n", "\u001b[37m(7) cost: \u001b[39m6.4e+01 \u001b[37mwidths: \u001b[39m4.0,4.0->4.0 \u001b[37mtype: \u001b[39mtensordot\n", "\u001b[37minputs: \u001b[31m[P]\u001b[34mV\u001b[34mG\u001b[31m[Q],\u001b[32mE\u001b[31m[P]\u001b[32mO\u001b[31m[Q]\u001b[39m->\n", "\u001b[37moutput: \u001b[34mV\u001b[34mG\u001b[32m(EO)\n", "\n", "\u001b[37m(8) cost: \u001b[39m1.3e+02 \u001b[37mwidths: \u001b[39m5.0,4.0->5.0 \u001b[37mtype: \u001b[39mtensordot\n", "\u001b[37minputs: \u001b[34mh\u001b[34ms\u001b[31m[GE]\u001b[34mD,\u001b[32mV\u001b[31m[GE]\u001b[32mO\u001b[39m->\n", "\u001b[37moutput: \u001b[34mh\u001b[34ms\u001b[34mD\u001b[32m(VO)\n", "\n", "\u001b[37m(9) cost: \u001b[39m6.4e+01 \u001b[37mwidths: \u001b[39m4.0,3.0->5.0 \u001b[37mtype: \u001b[39mtensordot\n", "\u001b[37minputs: \u001b[34mC\u001b[31m[N]\u001b[34mM\u001b[34mO,\u001b[31m[N]\u001b[32mU\u001b[32mV\u001b[39m->\n", "\u001b[37moutput: \u001b[34mC\u001b[34mM\u001b[34mO\u001b[32m(UV)\n", "\n", "\u001b[37m(10) cost: \u001b[39m2.6e+02 \u001b[37mwidths: \u001b[39m5.0,5.0->6.0 \u001b[37mtype: \u001b[39mtensordot\n", "\u001b[37minputs: \u001b[34mh\u001b[34ms\u001b[34mD\u001b[31m[VO],\u001b[32mC\u001b[32mM\u001b[31m[O]\u001b[32mU\u001b[31m[V]\u001b[39m->\n", "\u001b[37moutput: \u001b[34mh\u001b[34ms\u001b[34mD\u001b[32m(CMU)\n", "\n", "\u001b[37m(11) cost: \u001b[39m2.6e+02 \u001b[37mwidths: \u001b[39m6.0,4.0->6.0 \u001b[37mtype: \u001b[39mtensordot\n", "\u001b[37minputs: \u001b[34mh\u001b[34ms\u001b[31m[DC]\u001b[34mM\u001b[34mU,\u001b[32mr\u001b[31m[C]\u001b[32mB\u001b[31m[D]\u001b[39m->\n", "\u001b[37moutput: \u001b[34mh\u001b[34ms\u001b[34mM\u001b[34mU\u001b[32m(rB)\n", "\n", "\u001b[37m(12) cost: \u001b[39m6.4e+01 \u001b[37mwidths: \u001b[39m3.0,4.0->5.0 \u001b[37mtype: \u001b[39mtensordot\n", "\u001b[37minputs: \u001b[31m[g]\u001b[34mf\u001b[34mh,\u001b[31m[g]\u001b[32mr\u001b[32mq\u001b[32ms\u001b[39m->\n", "\u001b[37moutput: \u001b[34mf\u001b[34mh\u001b[32m(rqs)\n", "\n", "\u001b[37m(13) cost: \u001b[39m2.6e+02 \u001b[37mwidths: \u001b[39m6.0,5.0->5.0 \u001b[37mtype: \u001b[39mtensordot\n", "\u001b[37minputs: \u001b[31m[hs]\u001b[34mM\u001b[34mU\u001b[31m[r]\u001b[34mB,\u001b[32mf\u001b[31m[hr]\u001b[32mq\u001b[31m[s]\u001b[39m->\n", "\u001b[37moutput: \u001b[34mM\u001b[34mU\u001b[34mB\u001b[32m(fq)\n", "\n", "\u001b[37m(14) cost: \u001b[39m1.6e+01 \u001b[37mwidths: \u001b[39m3.0,2.0->3.0 \u001b[37mtype: \u001b[39mtensordot\n", "\u001b[37minputs: \u001b[34mw\u001b[31m[H]\u001b[34mI,\u001b[31m[H]\u001b[32mS\u001b[39m->\n", "\u001b[37moutput: \u001b[34mw\u001b[34mI\u001b[32m(S)\n", "\n", "\u001b[37m(15) cost: \u001b[39m3.2e+01 \u001b[37mwidths: \u001b[39m3.0,3.0->4.0 \u001b[37mtype: \u001b[39mtensordot\n", "\u001b[37minputs: \u001b[34mw\u001b[34mI\u001b[31m[S],\u001b[32mJ\u001b[31m[S]\u001b[32mT\u001b[39m->\n", "\u001b[37moutput: \u001b[34mw\u001b[34mI\u001b[32m(JT)\n", "\n", "\u001b[37m(16) cost: \u001b[39m6.4e+01 \u001b[37mwidths: \u001b[39m4.0,4.0->4.0 \u001b[37mtype: \u001b[39mtensordot\n", "\u001b[37minputs: \u001b[34mw\u001b[31m[IJ]\u001b[34mT,\u001b[32my\u001b[31m[JI]\u001b[32mK\u001b[39m->\n", "\u001b[37moutput: \u001b[34mw\u001b[34mT\u001b[32m(yK)\n", "\n", "\u001b[37m(17) cost: \u001b[39m6.4e+01 \u001b[37mwidths: \u001b[39m4.0,3.0->5.0 \u001b[37mtype: \u001b[39mtensordot\n", "\u001b[37minputs: \u001b[31m[w]\u001b[34mT\u001b[34my\u001b[34mK,\u001b[32ml\u001b[31m[w]\u001b[32mx\u001b[39m->\n", "\u001b[37moutput: \u001b[34mT\u001b[34my\u001b[34mK\u001b[32m(lx)\n", "\n", "\u001b[37m(18) cost: \u001b[39m1.3e+02 \u001b[37mwidths: \u001b[39m5.0,4.0->5.0 \u001b[37mtype: \u001b[39mtensordot\n", "\u001b[37minputs: \u001b[34mT\u001b[31m[y]\u001b[34mK\u001b[34ml\u001b[31m[x],\u001b[32mn\u001b[31m[yx]\u001b[32mz\u001b[39m->\n", "\u001b[37moutput: \u001b[34mT\u001b[34mK\u001b[34ml\u001b[32m(nz)\n", "\n", "\u001b[37m(19) cost: \u001b[39m6.4e+01 \u001b[37mwidths: \u001b[39m4.0,3.0->5.0 \u001b[37mtype: \u001b[39mtensordot\n", "\u001b[37minputs: \u001b[34mA\u001b[31m[L]\u001b[34mK\u001b[34mM,\u001b[31m[L]\u001b[32mT\u001b[32mU\u001b[39m->\n", "\u001b[37moutput: \u001b[34mA\u001b[34mK\u001b[34mM\u001b[32m(TU)\n", "\n", "\u001b[37m(20) cost: \u001b[39m2.6e+02 \u001b[37mwidths: \u001b[39m5.0,5.0->6.0 \u001b[37mtype: \u001b[39mtensordot\n", "\u001b[37minputs: \u001b[31m[TK]\u001b[34ml\u001b[34mn\u001b[34mz,\u001b[32mA\u001b[31m[K]\u001b[32mM\u001b[31m[T]\u001b[32mU\u001b[39m->\n", "\u001b[37moutput: \u001b[34ml\u001b[34mn\u001b[34mz\u001b[32m(AMU)\n", "\n", "\u001b[37m(21) cost: \u001b[39m2.6e+02 \u001b[37mwidths: \u001b[39m6.0,4.0->6.0 \u001b[37mtype: \u001b[39mtensordot\n", "\u001b[37minputs: \u001b[34ml\u001b[34mn\u001b[31m[zA]\u001b[34mM\u001b[34mU,\u001b[32mp\u001b[31m[Az]\u001b[32mB\u001b[39m->\n", "\u001b[37moutput: \u001b[34ml\u001b[34mn\u001b[34mM\u001b[34mU\u001b[32m(pB)\n", "\n", "\u001b[37m(22) cost: \u001b[39m2.6e+02 \u001b[37mwidths: \u001b[39m5.0,6.0->5.0 \u001b[37mtype: \u001b[39mtensordot\n", "\u001b[37minputs: \u001b[31m[MUB]\u001b[34mf\u001b[34mq,\u001b[32ml\u001b[32mn\u001b[31m[MU]\u001b[32mp\u001b[31m[B]\u001b[39m->\n", "\u001b[37moutput: \u001b[34mf\u001b[34mq\u001b[32m(lnp)\n", "\n", "\u001b[37m(23) cost: \u001b[39m1.3e+02 \u001b[37mwidths: \u001b[39m5.0,4.0->5.0 \u001b[37mtype: \u001b[39mtensordot\n", "\u001b[37minputs: \u001b[34mf\u001b[31m[q]\u001b[34ml\u001b[34mn\u001b[31m[p],\u001b[32me\u001b[31m[p]\u001b[32mo\u001b[31m[q]\u001b[39m->\n", "\u001b[37moutput: \u001b[34mf\u001b[34ml\u001b[34mn\u001b[32m(eo)\n", "\n", "\u001b[37m(24) cost: \u001b[39m6.4e+01 \u001b[37mwidths: \u001b[39m5.0,3.0->4.0 \u001b[37mtype: \u001b[39mtensordot\n", "\u001b[37minputs: \u001b[31m[f]\u001b[34ml\u001b[34mn\u001b[31m[e]\u001b[34mo,\u001b[31m[e]\u001b[32md\u001b[31m[f]\u001b[39m->\n", "\u001b[37moutput: \u001b[34ml\u001b[34mn\u001b[34mo\u001b[32m(d)\n", "\n", "\u001b[37m(25) cost: \u001b[39m6.4e+01 \u001b[37mwidths: \u001b[39m4.0,4.0->4.0 \u001b[37mtype: \u001b[39mtensordot\n", "\u001b[37minputs: \u001b[34ml\u001b[31m[no]\u001b[34md,\u001b[32mc\u001b[31m[n]\u001b[32mm\u001b[31m[o]\u001b[39m->\n", "\u001b[37moutput: \u001b[34ml\u001b[34md\u001b[32m(cm)\n", "\n", "\u001b[37m(26) cost: \u001b[39m3.2e+01 \u001b[37mwidths: \u001b[39m4.0,3.0->3.0 \u001b[37mtype: \u001b[39mtensordot\n", "\u001b[37minputs: \u001b[31m[l]\u001b[34md\u001b[34mc\u001b[31m[m],\u001b[32ma\u001b[31m[lm]\u001b[39m->\n", "\u001b[37moutput: \u001b[34md\u001b[34mc\u001b[32m(a)\n", "\n", "\u001b[37m(27) cost: \u001b[39m1.6e+01 \u001b[37mwidths: \u001b[39m3.0,3.0->2.0 \u001b[37mtype: \u001b[39mtensordot\n", "\u001b[37minputs: \u001b[31m[dc]\u001b[34ma,\u001b[31m[c]\u001b[32mb\u001b[31m[d]\u001b[39m->\n", "\u001b[37moutput: \u001b[34ma\u001b[32m(b)\n", "\n", "\u001b[37m(28) cost: \u001b[39m4.0e+00 \u001b[37mwidths: \u001b[39m2.0,2.0->0.0 \u001b[37mtype: \u001b[39mtensordot\n", "\u001b[37minputs: \u001b[31m[ab],\u001b[31m[ab]\u001b[39m->\n", "\u001b[37moutput: \n", "\n", "\u001b[39m\n" ] } ], "source": [ "tree.print_contractions()" ] }, { "cell_type": "markdown", "id": "f2726b0d", "metadata": {}, "source": [ "The indices are colored according to:\n", "\n", "1. blue - appears on left input and is kept\n", "2. green - appears on right input and is kept\n", "3. red - appears on both inputs and is contracted away\n", "4. purple - appears on both inputs and is kept (a 'batch' or hyper index)" ] }, { "cell_type": "markdown", "id": "a600a924", "metadata": {}, "source": [ "### Tent\n", "\n", "The most general purpose visualization for the structure of a\n", "[`ContractionTree`](cotengra.core.ContractionTree) is\n", "the [`ContractionTree.plot_tent`](cotengra.plot.plot_tent) method.\n", "This plots the input network (in grey) at the bottom, and the contraction tree\n", "intermediates laid out above. The width and color of the tree edges denote the\n", "intermediate tensor widths, and the size and color of the tree nodes denote the\n", "FLOPs required to contract each intermediate tensor:" ] }, { "cell_type": "code", "execution_count": 11, "id": "cf698cfd", "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "" ], "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "tree.plot_tent();" ] }, { "cell_type": "markdown", "id": "171ab2f0", "metadata": {}, "source": [ "If you supply `order=True` then the intermediate nodes will be in the exact vertical order than they would be performed:" ] }, { "cell_type": "code", "execution_count": 12, "id": "c957d6bb", "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "" ], "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "tree.plot_tent(order=True);" ] }, { "cell_type": "markdown", "id": "1421bc44", "metadata": {}, "source": [ "```{note}\n", "If you have sliced indices, these will appear as dashed lines in the input graph.\n", "```" ] }, { "cell_type": "markdown", "id": "ccbc977d", "metadata": {}, "source": [ "### Circuit\n", "\n", "If you want to plot only the tree with an emphasis on the order of operations\n", "then you can use the [`ContractionTree.plot_circuit`](cotengra.plot.plot_tree_circuit)\n", "method:" ] }, { "cell_type": "code", "execution_count": 13, "id": "363fd734", "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "" ], "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "tree.plot_circuit();" ] }, { "cell_type": "markdown", "id": "0e457bf8", "metadata": {}, "source": [ "### Ring\n", "\n", "Another option is the [`ContractionTree.plot_ring`](cotengra.plot.plot_ring)\n", "method which lays out the input network on a ring, with the contraction\n", "tree intermediates laid out towards the center. The more arcs cross between\n", "branches the more expensive that contraction. This can be useful for\n", "inspecting how many 'spines' a contraction has or how *balanced* it is:" ] }, { "cell_type": "code", "execution_count": 14, "id": "b62d5f20", "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "" ], "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "tree.plot_ring();" ] }, { "cell_type": "markdown", "id": "753f1a4d", "metadata": {}, "source": [ "### Rubberband\n", "\n", "For small and close to planar graphs, an alternative visualization is the\n", "[`ContractionTree.plot_rubberband`](cotengra.plot.plot_rubberband) method.\n", "method using [`quimb`](https://github.com/jcmgray/quimb). Here, nodes of the input graph are hierarchically grouped into bands\n", "according to the contraction tree. The order of contraction is represented by\n", "the colors:" ] }, { "cell_type": "code", "execution_count": 15, "id": "352a5af3", "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "" ], "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "tree.plot_rubberband();" ] }, { "cell_type": "markdown", "id": "ed653251", "metadata": {}, "source": [ "All of the above methods can be pretty extensively customized, including by\n", "supplying custom colormaps. They also return `(fig, ax)` for further\n", "customization or embedding in other plots." ] }, { "cell_type": "code", "execution_count": 16, "id": "a8610954", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "log10[FLOPS]=11.54 log10[COMBO]=11.99 log2[SIZE]=31 log2[PEAK]=32: 100%|█| 128/128 [00:\n" ] } ], "source": [ "inputs, output, shapes, size_dict = ctg.utils.lattice_equation([5, 5, 5])\n", "opt = ctg.HyperOptimizer(progbar=True, reconf_opts={}, minimize=\"combo-256\")\n", "tree = opt.search(inputs, output, size_dict)" ] }, { "cell_type": "code", "execution_count": 17, "id": "0632ef70", "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "" ], "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig, ax = tree.plot_tent(\n", " raw_edge_alpha=0.0,\n", " edge_colormap=\"Greens\",\n", " node_colormap=\"Greens\",\n", " edge_scale=2,\n", " node_scale=0.5,\n", " colorbars=False,\n", " tree_root_height=-1.0,\n", " figsize=(10, 10),\n", ")" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3" } }, "nbformat": 4, "nbformat_minor": 5 } ================================================ FILE: examples/Example - Reproducing 2005.06787.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "id": "nervous-romance", "metadata": {}, "source": [ "Here we roughly reproduce the results of the paper\n", "[Classical Simulation of Quantum Supremacy Circuits - Huang et al.](https://scirate.com/arxiv/2005.06787).\n", "There are of course many practical aspects of actually performing the contraction that we ignore here,\n", "instead just investigating the contraction complexity of the core task of computing a single marginal\n", "probability distribution of 6 qubits (which is sufficient, due to the circuit's chaotic nature,\n", "to sample a single bitstring in a pretty much unbiased manner)." ] }, { "cell_type": "code", "execution_count": 1, "id": "vertical-enemy", "metadata": {}, "outputs": [], "source": [ "%config InlineBackend.figure_formats = ['svg']\n", "import quimb.tensor as qtn\n", "\n", "import cotengra as ctg" ] }, { "cell_type": "markdown", "id": "egyptian-conditions", "metadata": {}, "source": [ "Load the circuit:" ] }, { "cell_type": "code", "execution_count": 2, "id": "official-catholic", "metadata": {}, "outputs": [], "source": [ "circ = qtn.Circuit.from_qasm_file(\"circuit_n53_m20_s0_e0_pABCDCDAB.qsim\")" ] }, { "cell_type": "markdown", "id": "declared-composition", "metadata": {}, "source": [ "Instantiate a path optimizer:" ] }, { "cell_type": "code", "execution_count": 3, "id": "greenhouse-louisiana", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "2021-03-08 18:41:44,562\tINFO services.py:1090 -- View the Ray dashboard at \u001b[1m\u001b[32mhttp://127.0.0.1:8266\u001b[39m\u001b[22m\n" ] } ], "source": [ "opt = ctg.HyperOptimizer(\n", " slicing_reconf_opts={\"target_size\": 2**29}, # dynamically slice to W=29\n", " max_repeats=1000, # sample 1000 contraction trees\n", " parallel=\"ray\",\n", " progbar=True,\n", ")" ] }, { "cell_type": "markdown", "id": "tired-delaware", "metadata": {}, "source": [ "Rehearse contracting a 6 qubit marginal ([see quimb](https://quimb.readthedocs.io/en/latest/tensor-circuit.html#Generate-samples-from-a-chaotic-circuit)):" ] }, { "cell_type": "code", "execution_count": 4, "id": "expensive-canyon", "metadata": {}, "outputs": [], "source": [ "marginal_qubits = circ.calc_qubit_ordering()[-6:]\n", "\n", "# choice of marginal qubits from the paper\n", "# marginal_qubits = (10, 17, 26, 36, 27, 18)\n", "\n", "# other potential choices:\n", "# marginal_qubits = circ.calc_qubit_ordering()[:6]" ] }, { "cell_type": "code", "execution_count": 5, "id": "existing-texas", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "log2[SIZE]: 29.00 log10[FLOPs]: 19.03: 100%|██████████| 1000/1000 [3:15:19<00:00, 11.72s/it] \n" ] } ], "source": [ "rehs = circ.sample_chaotic_rehearse(marginal_qubits, optimize=opt)" ] }, { "cell_type": "markdown", "id": "alike-acoustic", "metadata": {}, "source": [ "Retrieve the (dynamically sliced) contraction tree:" ] }, { "cell_type": "code", "execution_count": 6, "id": "bored-wagner", "metadata": {}, "outputs": [], "source": [ "tree = opt.get_tree()" ] }, { "cell_type": "markdown", "id": "flexible-fleet", "metadata": {}, "source": [ "Check the contraction cost / time complexity (n.b. this is half what's displayed\n", "above as in units not specific to real dtypes):" ] }, { "cell_type": "code", "execution_count": 7, "id": "medium-algebra", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'5.330128e+18'" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "f\"{tree.contraction_cost():e}\"" ] }, { "cell_type": "markdown", "id": "useful-leeds", "metadata": {}, "source": [ "In the paper the total time complexity is reported as $6.66 \\times 10^{18}$, so,\n", "practical efficiency considerations aside (which are not trivial!) this is\n", "very similar." ] }, { "cell_type": "code", "execution_count": 8, "id": "turkish-anniversary", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "24" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(tree.sliced_inds)" ] }, { "cell_type": "markdown", "id": "surprising-mustang", "metadata": {}, "source": [ "We can also look at the optimizer progression:" ] }, { "cell_type": "code", "execution_count": 9, "id": "neutral-peripheral", "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "" ], "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "opt.plot_trials(\"flops\")" ] }, { "cell_type": "markdown", "id": "celtic-vocabulary", "metadata": {}, "source": [ "And visualize the actual contraction tree:" ] }, { "cell_type": "code", "execution_count": 10, "id": "severe-marshall", "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "" ], "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "tree.plot_tent(order=True, figsize=(8, 8))" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3" } }, "nbformat": 4, "nbformat_minor": 5 } ================================================ FILE: examples/Example - Reproducing 2103-03074.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "id": "acquired-yukon", "metadata": {}, "source": [ "Here we roughly reproduce the results of the paper\n", "[Simulating the Sycamore quantum supremacy circuits - Pan & Zhang](https://scirate.com/arxiv/2103.03074).\n", "There are of course many practical aspects of actually performing the contraction that we ignore here,\n", "instead just investigating the contraction complexity of the core task of computing a single marginal\n", "probability distribution of 21 qubits (enough to generate a slice of >2 million correlated amplitudes)." ] }, { "cell_type": "code", "execution_count": 1, "id": "faced-casino", "metadata": {}, "outputs": [], "source": [ "%config InlineBackend.figure_formats = ['svg']\n", "import quimb.tensor as qtn\n", "\n", "import cotengra as ctg" ] }, { "cell_type": "markdown", "id": "mobile-remainder", "metadata": {}, "source": [ "Load the circuit:" ] }, { "cell_type": "code", "execution_count": 2, "id": "hundred-windsor", "metadata": {}, "outputs": [], "source": [ "circ = qtn.Circuit.from_qasm_file(\"circuit_n53_m20_s0_e0_pABCDCDAB.qsim\")" ] }, { "cell_type": "markdown", "id": "renewable-uzbekistan", "metadata": {}, "source": [ "Instantiate a path optimizer:" ] }, { "cell_type": "code", "execution_count": 3, "id": "subsequent-karaoke", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "2021-03-07 20:32:52,265\tINFO services.py:1090 -- View the Ray dashboard at \u001b[1m\u001b[32mhttp://127.0.0.1:8268\u001b[39m\u001b[22m\n" ] } ], "source": [ "opt = ctg.HyperOptimizer(\n", " slicing_reconf_opts={\"target_size\": 2**30}, # dynamically slice to W=30\n", " max_repeats=1000, # sample 1000 contraction trees\n", " parallel=\"ray\",\n", " progbar=True,\n", ")" ] }, { "cell_type": "markdown", "id": "cultural-transformation", "metadata": {}, "source": [ "Rehearse contracting a 21 qubit marginal ([see quimb](https://quimb.readthedocs.io/en/latest/tensor-circuit.html#Generate-samples-from-a-chaotic-circuit)\n", "for what this is doing, the functional difference is we would take *all* the high probability\n", "strings from this marginal rather than a single one):" ] }, { "cell_type": "code", "execution_count": 4, "id": "cardiac-novelty", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "log2[SIZE]: 30.00 log10[FLOPs]: 18.96: 100%|██████████| 1000/1000 [3:21:14<00:00, 12.07s/it]\n" ] } ], "source": [ "rehs = circ.sample_chaotic_rehearse(\n", " circ.calc_qubit_ordering()[-21:], optimize=opt\n", ")" ] }, { "cell_type": "markdown", "id": "lyric-modification", "metadata": {}, "source": [ "Retrieve the (dynamically sliced) contraction tree:" ] }, { "cell_type": "code", "execution_count": 5, "id": "unlikely-arrival", "metadata": {}, "outputs": [], "source": [ "tree = opt.get_tree()" ] }, { "cell_type": "markdown", "id": "exclusive-title", "metadata": {}, "source": [ "Check the contraction cost / time complexity (n.b. this is half what's displayed\n", "above as in units not specific to real dtypes):" ] }, { "cell_type": "code", "execution_count": 6, "id": "operational-margin", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'4.595391e+18'" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "f\"{tree.contraction_cost():e}\"" ] }, { "cell_type": "markdown", "id": "satisfied-brass", "metadata": {}, "source": [ "In the paper the total time complexity is reported as $4.51 \\times 10^{18}$, so,\n", "practical efficiency considerations aside (which are not trivial!) this is\n", "very similar." ] }, { "cell_type": "code", "execution_count": 7, "id": "clinical-phone", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "23" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(tree.sliced_inds)" ] }, { "cell_type": "markdown", "id": "animal-level", "metadata": {}, "source": [ "We can also look at the optimizer progression:" ] }, { "cell_type": "code", "execution_count": 8, "id": "utility-material", "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "" ], "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "opt.plot_trials(\"flops\")" ] }, { "cell_type": "markdown", "id": "demographic-space", "metadata": {}, "source": [ "And visualize the actual contraction tree:" ] }, { "cell_type": "code", "execution_count": 9, "id": "becoming-tackle", "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "" ], "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "tree.plot_tent(order=True, figsize=(8, 8))" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3" } }, "nbformat": 4, "nbformat_minor": 5 } ================================================ FILE: examples/Quantum Circuit Example Old.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "id": "88a252c0-f749-48dd-a738-c0066c8b0551", "metadata": {}, "source": [ "# Example Using Sycamore Quantum Circuit\n", "\n", "Here we'll run through a more in-depth tensor contraction path finding, including all the different visualization options, by computing some amplitudes for random circuits on Google's Sycamore chip ." ] }, { "cell_type": "code", "execution_count": 2, "id": "d37a9dae-50ab-40f3-8c1a-d43cfb052865", "metadata": { "tags": [] }, "outputs": [], "source": [ "import quimb.tensor as qtn\n", "\n", "import cotengra as ctg" ] }, { "cell_type": "code", "execution_count": 3, "id": "2bd59ff7-c21a-484b-8edd-61b12eea95c8", "metadata": { "tags": [] }, "outputs": [], "source": [ "# just set up some misc notebook plotting stuff\n", "\n", "%matplotlib inline\n", "import matplotlib as mpl\n", "\n", "mpl.rcParams[\"figure.dpi\"] = 200" ] }, { "cell_type": "markdown", "id": "7367699a-8433-422b-ba9f-3ebfc7db5329", "metadata": {}, "source": [ "Two Sycamore circuit definitions are included in this repository, the first of which ($m=10$) should fit into memory, and the second of which ($m=12$) will require *slicing*." ] }, { "cell_type": "code", "execution_count": 4, "id": "0c356526-48dd-441a-a56a-fa6892ecd98a", "metadata": { "tags": [] }, "outputs": [], "source": [ "def load_circuit(\n", " n=53, depth=10, seed=0, elided=0, sequence=\"ABCDCDAB\", swap_trick=False\n", "):\n", " file = f\"circuit_n{n}_m{depth}_s{seed}_e{elided}_p{sequence}.qsim\"\n", "\n", " if swap_trick:\n", " gate_opts = {\"contract\": \"swap-split-gate\", \"max_bond\": 2}\n", " else:\n", " gate_opts = {}\n", "\n", " # instantiate the `Circuit` object that\n", " # constructs the initial tensor network:\n", " return qtn.Circuit.from_qasm_file(file, gate_opts=gate_opts)" ] }, { "cell_type": "markdown", "id": "a2ee0921-ceb0-40b1-ab69-cb55aa3c520e", "metadata": {}, "source": [ "Make our target tensor network the overlap of the wavefunction with a bitstring:" ] }, { "cell_type": "code", "execution_count": null, "id": "527fba34-d800-4541-9ae7-513d119f56c0", "metadata": {}, "outputs": [], "source": [ "circ = load_circuit(depth=10)\n", "psi_f = qtn.MPS_computational_state(\"0\" * (circ.N))\n", "tn = circ.psi & psi_f\n", "output_inds = []" ] }, { "cell_type": "markdown", "id": "9ca04bab-caa1-4809-86c2-2d19ce452c80", "metadata": {}, "source": [ "We can check out what the raw TN looks like:" ] }, { "cell_type": "code", "execution_count": null, "id": "984f99a3-fec8-40ba-b3f5-27462b9ec977", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "tn.graph(iterations=20, color=circ.psi.site_tags, legend=False, figsize=(3, 3))" ] }, { "cell_type": "markdown", "id": "1f16d828-0aa2-425c-8921-7184d4b4fb62", "metadata": {}, "source": [ "As well as what it looks like after standard pre-processing:" ] }, { "cell_type": "code", "execution_count": 6, "id": "88fbf5fa-bfb8-451d-b091-b3559fffac16", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# inplace full simplify and cast to single precision\n", "tn.full_simplify_(output_inds=output_inds)\n", "tn.astype_(\"complex64\")" ] }, { "cell_type": "markdown", "id": "253596c5-0bc8-4869-a549-4874867adc62", "metadata": {}, "source": [ "The simplification uses some `numba` compiled functions which might slow things done first run." ] }, { "cell_type": "code", "execution_count": 7, "id": "e413001e-9626-4ecd-94b7-cc01b7bdf104", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "tn.graph(\n", " initial_layout=\"kamada_kawai\",\n", " iterations=10,\n", " color=circ.psi.site_tags,\n", " legend=False,\n", " figsize=(3, 3),\n", ")" ] }, { "cell_type": "markdown", "id": "92ca9cc8-a608-4233-97c0-8442c17b20ff", "metadata": {}, "source": [ "Now we're ready to try and find a contraction path (various initializiation options are illustrated - not necessarily the best):" ] }, { "cell_type": "code", "execution_count": 8, "id": "1dfa13ed-7ce9-4bb0-875e-43dd48cdb8dc", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/home/johnnie/conda/lib/python3.7/site-packages/btb/session.py:10: TqdmExperimentalWarning: Using `tqdm.autonotebook.tqdm` in notebook mode. Use `tqdm.tqdm` instead to force console mode (e.g. in jupyter console)\n", " from tqdm.autonotebook import trange\n" ] } ], "source": [ "opt = ctg.HyperOptimizer(\n", " methods=[\"kahypar\", \"greedy\", \"walktrap\"],\n", " max_repeats=128,\n", " progbar=True,\n", " minimize=\"flops\",\n", " score_compression=0.5, # deliberately make the optimizer try many methods\n", ")" ] }, { "cell_type": "markdown", "id": "edb14457-0707-4832-8ba0-f2619f56b2ee", "metadata": {}, "source": [ "The optimizer is stateful, so this following actual search call can be run repeatedly:" ] }, { "cell_type": "code", "execution_count": 9, "id": "a72bf748-6bb5-4dd8-b7ff-3248976df874", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "log2[SIZE]: 28.00 log10[FLOPs]: 11.12: 100%|██████████| 128/128 [00:36<00:00, 3.48it/s]\n" ] } ], "source": [ "info = tn.contract(all, optimize=opt, get=\"path-info\")" ] }, { "cell_type": "markdown", "id": "380bd749-14f6-494f-988d-d39cbb632dcb", "metadata": {}, "source": [ "We can visualize the progress of the Bayesian optimizer like so:" ] }, { "cell_type": "code", "execution_count": 10, "id": "8620236d-1f1b-4b58-a2fa-db1375c4ee50", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "opt.plot_trials()" ] }, { "cell_type": "markdown", "id": "e2526212-dd3f-48e7-bc51-8fae6fbb4152", "metadata": {}, "source": [ "Clearly the `kahypar` optimizer seems to be able to find the lowest cost contractions.\n", "\n", "We can also plot the relationship between contraction flops and size (the `minimize='combo'` score (log2[SIZE] + log2[FLOPS]) effectively ranks how close they are to the origin and can be useful to balance the two aims):" ] }, { "cell_type": "code", "execution_count": 11, "id": "ad955a0e-5367-41be-9c42-f134edc30fde", "metadata": {}, "outputs": [ { "data": { "image/png": "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9EpZsYoqglO/hT92C3bQiXHYB2mVgcdMIDSgoopg5OEK+0RERERERESkVVHgJ2XHKqqwSf+S97i7E4yeEN8WEREREREREWlNtKVXyorX1qSuybduFb52VepYYiWfL52He4iHtfhH79erAq+IiIiIiIiISLnTCj8pK+H9f4QP34I9R8Cy+VDVhmDKFVjX3aMqvm8/gz96M95zANTWwqqP8JMuwoaP09ZeEREREREREWkVFPhJWUiGdTZkDL7gjSj0A9iykXDalQQTz8eXL8ZnTgccli+KjnfuDj0HAk1fcEREREREREREpDEo8JOyEBfkGHk4IeCP3gjJbbrrVxPe9eu6T+rcPVr916VHYw5VRERERERERKRJ6Rp+UjbSQz+bOBUKrdhT2CciIiIiIiIirZQCPykrGaHfuOPztSI4/bsK+0RERERERESkVVLgJ+XLwx07JiIiIiIiIiLSginwk7KSLN4Rvv0M/uqMfK0Ip/8GX/Npo45NRERERERERKQ5UOAnZSMj7Hv0ZsDzN16/mnDalQr9RERERERERKTVUeAnZaFg2Ne5O8FZl2FHTsks5KHQT0RERERERERaocqmHoBIKSwR5PnC2dQJ+xLVeG3APoRtO+KP3gieaLNhDXy6GLruHoeGIiIiIiIiIiItmVb4SVkJTrwQhh4Q3UkL+4BU9d6JU6OVfhZgJ3wNGzZWYZ+IiIiIiIiItBpa4SdlxSoqCE66CH/6n9jYSXHYB9EqwGToFwJUVhPsfZDCPhERERERERFpVRT4Sdmxigrs6C/mPpYW+gEK+0RERERERESk1VHgJy1OMvRL3hYRERERERERaU0U+EmLpKBPRERERERERForFe0QERERERERERFpQRT4iYiIiIiIiIiItCAK/ERERERERERERFoQBX4iIiIiIiIiIiItiAI/ERERERERERGRFkSBn4iIiIiIiIiISAuiwE9ERERERERERKQFUeAnIiIiIiIiIiLSgijwExERERERERERaUEU+ImIiIiIiIiIiLQgCvxERERERERERERaEAV+IiIiIiIiIiIiLYgCPxERERERERERkRZEgZ+IiIiIiIiIiEgLosBPRERERERERESkBals6gHITqtI3li2bBlm1pRjkSLcnZqaGgAqKys1X82c5qu8aL7Ki+ar/GjOyovmq7xovsqL5iv6b880Ffna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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "opt.plot_scatter()" ] }, { "cell_type": "markdown", "id": "75911137-ea3b-4e3c-beda-cf238e16823a", "metadata": {}, "source": [ "Where it becomes apparent, that while correlated, the minimum size contraction found is not necessarily the same as the minimum cost contraction found.\n", "\n", "If we want to visualize what the actual best contraction tree looks like we need to extract the `ContractionTree` object from the optimizer:" ] }, { "cell_type": "code", "execution_count": 12, "id": "02846932-aad6-4fbe-bf68-f5ac5be5ce14", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAABOoAAAPUCAYAAAAT1daMAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAewgAAHsIBbtB1PgAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+j8jraAAAgAElEQVR4nOzdaXhkVbn28f/aNaSSTld6Sk80yCiDikDDQUQPo4IMMh3EEQcUhwNHBERARAYVaFBROeKLoOIRVHAGBBFBUBDQApllHrqBpgPdnaST1LT3ej/stapWFUk6DaixvX/XVRepXXuqXZV01c2z1mOstYiIiIiIiIiIiMg/V/TPPgERERERERERERFRUCciIiIiIiIiIjIpKKgTERERERERERGZBBTUiYiIiIiIiIiITAIK6kRERERERERERCYBBXUiIiIiIiIiIiKTgII6ERERERERERGRSUBBnYiIiIiIiIiIyCSgoE5ERERERERERGQSUFAnIiIiIiIiIiIyCSioExERERERERERmQQU1ImIiIiIiIiIiEwCCupEREREREREREQmAQV1IiIiIiIiIiIik4CCOhERERERERERkUlAQZ2IiIiIiIiIiMgkoKBORERERERERERkElBQJyIiIiIiIiIiMgkoqBMREREREREREZkEFNSJiIiIiIiIiIhMAgrqREREREREREREJgEFdSIiIiIiIiIiIpOAgjoREREREREREZFJQEGdiIiIiIiIiIjIJKCgTkREREREREREZBJQUCciIiIiIiIiIjIJKKgTERERERERERGZBBTUiYiIiIiIiIiITAIK6kRERERERERERCYBBXUiIiIiIiIiIiKTgII6ERERERERERGRSUBBnYiIiIiIiIiIyCSgoE5ERERERERERGQSUFAnIiIiIiIiIiIyCSioExERERERERERmQQU1ImIiIiIiIiIiEwCCupEREREREREREQmAQV1IiIiIiIiIiIik4CCOhERERERERERkUlAQZ2IiIiIiIiIiMgkoKBORERERERERERkElBQJyIiIiIiIiIiMgkoqBMREREREREREZkEFNSJiIiIiIiIiIhMAgrqREREREREREREJgEFdSIiIiIiIiIiIpOAgjoREREREREREZFJQEGdiIiIiIiIiIjIJKCgTkRERERERERE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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "tree = opt.get_tree()\n", "tree.plot_ring(node_scale=1 / 3, edge_scale=2 / 3)" ] }, { "cell_type": "markdown", "id": "e492f9d2-d2f4-4589-99ba-a4e0ceea5170", "metadata": {}, "source": [ "We can try and plot what this might look like on top of the TN graph arranged properly, though its likely messy..." ] }, { "cell_type": "code", "execution_count": 13, "id": "778ef6d8-c857-4460-b0a3-094b56ad1298", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "tree.plot_tent()" ] }, { "cell_type": "markdown", "id": "f9c45e91-9b4c-4233-b652-ac710983edd1", "metadata": {}, "source": [ "We can see that the contraction found is imbalanced, with small tensors being steadily absorbed into one big tensor.\n", "\n", "One more plot function allows one to investigate the actual numbers involved:" ] }, { "cell_type": "code", "execution_count": 14, "id": "c2e523d1-9931-4f52-8444-d447c6d9f64d", "metadata": {}, "outputs": [ { "data": { "image/png": "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kPWna0FA14Ecp2tB5uhakDm6FraHrf4zDpolNzC21lChTczd68BDnZfLJqoxsx0cD1J2vV6kyCCyMEFWvpCs9opTlq2M/DyhdDZmY901Hsax8jMIXbQdRn4ayx7fmSIuIiIiIiIiIutJIynX19eAS4CzzSzzdgrhxZy7oI7IlmWWEeIBqiM/SyueTnPmPXh68MQy4UwqI68mq76AEM/o+k6fWcTDfsLI6yCeRpp5Lyxom7ifMPQqQvUFEA9gpns3IiIiIiIiW4US5wwOBSnX1/W0g5TDwDOAzy1R7vnznt+w1p0S2WgWqgQ7k9LQKynVXkrevJmU3wEEYulsYulpWBjBwh7Mevu1ZaGK20FC7YcI1RfjzZvx4i4ww+JjsdJTIIzACtoWERERERERkf7QN/L19QHg1zrPX8MiQUprD+N6VeflYeCa9emayMYyKxOzA7jnlMIeYG6gcRkLY5jFVbVNth/3HAu7sWNtl2CVbYuIiIiIiMjmpcQ5g0NBynXk7jeZ2XW0R1O+zsze5e43Lij2JuC8zvO3uXtrXTspssHMMizuWrO2iTvXpG0RERERERHZfIIpSDkoFKTsgZldDJw9763d856fbWavnl/e3d+5SDO/SHsKdw242syupD1asgb8CPBTnXK3AW/tS8dFREREREREREQ2MQUpe/N64CeW2PfczjbfOxcWcvcvmtkPA+8GxoArF2nrNuAKd59ceVdFRERERERERLa3iBLnDAqlsd0A7v5h4CnAH9IOSM7QXn/yZuBXgPPd/faN66GIiIiIiIiIiMj60UjKHrj7q4FX96mtO4A3djaRTcXTDO4NwMEyzEYwC7gn8CnwHDCwChaGNrq7IiIiIiIiIotS4pzBoSCliByTisO4HyYV91O0vg4UlGo/ilnCi4fAJ/H8dijuBSJk50DcBzaOxR0b3X0RERERERERGVAKUooI7o4X91PkX6cx827yxg1AYnTPpwghQnE33vgMxcy7obiN9o0oByJWuYQw9OPAORBOw8w29FxERERERERE5ii79+BQkFJE8PQQResrTB/51fZ0boDyCwlxHxR3kWY/SJr67zAXgDQ6gcoCb1xL0bqFOP57WClC3LtBZyEiIiIiIiJyIk33HhxKnCOyzbkXeDrEzNErjwcogbEd7dee306aevtc4eMV54+YTJMUR38X0mHc83XquYiI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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "tree.plot_contractions()" ] }, { "cell_type": "markdown", "id": "602f27c5-bd17-47db-8b1b-b438f34bc8a0", "metadata": {}, "source": [ "Here, 'peak-size' is the memory required for both inputs and the output of each contraction.\n", "\n", "Note again that 'flops' defined here assumes real data (as per `opt_einsum` convention), the 'cost' or number of scalar operations, $C$, is generally half this, whereas for quantum circuits with complex tensors, the real FLOPs will be 4x.\n", "\n", "We can also actually perform the contraction (this is using a GTX 2070):" ] }, { "cell_type": "code", "execution_count": 15, "id": "71143de1-c45d-4623-b9f6-66a620cbff0a", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "160 ms ± 7.6 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n" ] } ], "source": [ "%%timeit\n", "tn.contract(all, optimize=opt.path, backend=\"jax\")" ] }, { "cell_type": "markdown", "id": "9ae73fe3-356f-4a42-96e4-2cc636503c84", "metadata": {}, "source": [ "TN construction and simplification is determinstic in `quimb` so at least in this case we can easily evaluate another amplitude with the same contraction tree:" ] }, { "cell_type": "code", "execution_count": 16, "id": "19ba62e6-3796-4cc4-83ee-cb21a0d4e7bf", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tn = circ.psi & qtn.MPS_rand_computational_state(circ.N, seed=42)\n", "tn.full_simplify_().astype_(\"complex64\")" ] }, { "cell_type": "code", "execution_count": 17, "id": "116262d7-bdd4-4c02-ba25-09717cae55a8", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPU times: user 155 ms, sys: 4.54 ms, total: 159 ms\n", "Wall time: 188 ms\n" ] }, { "data": { "text/plain": [ "DeviceArray(6.524713e-09+2.4893043e-09j, dtype=complex64)" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%%time\n", "tn.contract(all, optimize=opt.path, backend=\"jax\")" ] }, { "cell_type": "code", "execution_count": 17, "id": "0bed26c1-f767-4d5e-9785-1cc98f716f4e", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPU times: user 75.5 ms, sys: 116 ms, total: 192 ms\n", "Wall time: 227 ms\n" ] }, { "data": { "text/plain": [ "DeviceArray(6.5247168e-09+2.4892932e-09j, dtype=complex64)" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%%time\n", "tn.contract(all, optimize=opt.path, backend=\"jax\")" ] }, { "cell_type": "markdown", "id": "bcbb6097-6131-4da1-b9d1-04b445b54014", "metadata": {}, "source": [ "# Searching for sliced contractions (Sycamore $m=12$)" ] }, { "cell_type": "markdown", "id": "8ad662f3-dfe0-44ea-b8c3-a9399cf5fdbb", "metadata": {}, "source": [ "To illustrate slicing we'll setup a (much harder!) depth 12 circuit. We'll perform a swapped rank-2 decomposition on the gates (for a not insignificant drop in total fidelity):" ] }, { "cell_type": "code", "execution_count": 18, "id": "15c01d10-de82-44ae-ba25-8ce71a045be3", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "circ = load_circuit(depth=12, swap_trick=True)\n", "sampler = qtn.MPS_computational_state(\"0\" * (circ.N))\n", "tn = circ.psi & sampler\n", "tn.full_simplify_(output_inds=[])\n", "tn.astype_(\"complex64\")" ] }, { "cell_type": "markdown", "id": "673c3151-651b-4e96-9ef9-de61969525e1", "metadata": {}, "source": [ "Because of the rank-2 swapped gate decomposition the full simplify function has now found hyperedge introducing diagonal reductions (which is why there are more tensors than indices).\n", "\n", "Now when we intialize the hyper optimizer we'll tell it slice each contraction before reporting the cost and size." ] }, { "cell_type": "code", "execution_count": 19, "id": "4dfe83ad-1537-46c1-97dc-44da03395e2f", "metadata": {}, "outputs": [], "source": [ "# we're going to help accelerate the optimizer search by restricting its search space,\n", "# since highly balanced contraction trees generally slice best:\n", "ctg.hyper._HYPER_SEARCH_SPACE[\"kahypar\"][\"imbalance\"][\"max\"] = 0.1\n", "\n", "opt = ctg.HyperOptimizer(\n", " methods=[\"kahypar\"],\n", " max_time=120, # just search for 2 minutes\n", " max_repeats=1000,\n", " progbar=True,\n", " minimize=\"flops\",\n", " slicing_opts={\"target_size\": 2**28},\n", ")" ] }, { "cell_type": "code", "execution_count": null, "id": "cdcd61b8-05a3-4348-a09f-d68ece76e531", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "log2[SIZE]: 28.00 log10[FLOPs]: 13.88: 15%|█▍ | 148/1000 [01:43<16:16, 1.15s/it]" ] } ], "source": [ "# because of the hyperedges we need to specify no output indices\n", "info = tn.contract(all, optimize=opt, get=\"path-info\", output_inds=[])" ] }, { "cell_type": "markdown", "id": "e21d52ee-8eae-48fe-a4b2-d92c7c7078df", "metadata": {}, "source": [ "Sliced contractions can be more difficult to find, if performance is critical its worth running this for longer, maybe with a large parallel pool supplied to the `parallel=` kwarg.\n", "\n", "We can see that all the contractions are now 'size 28' however:" ] }, { "cell_type": "code", "execution_count": null, "id": "b1d04c20-d4c9-4402-89a1-79ca59595ba5", "metadata": {}, "outputs": [], "source": [ "opt.plot_scatter()" ] }, { "cell_type": "markdown", "id": "1684a1f4-ebee-4897-a33c-aced123b6f98", "metadata": {}, "source": [ "We can check what this new contraction tree looks like:" ] }, { "cell_type": "code", "execution_count": null, "id": "73920b43-af31-4b94-b9ab-035de9eeef0c", "metadata": {}, "outputs": [], "source": [ "tree = opt.get_tree()\n", "tree.plot_ring(node_scale=1 / 3, edge_scale=2 / 3)" ] }, { "cell_type": "markdown", "id": "32101f83-9c2f-4198-a6f2-ab1236ff15d7", "metadata": {}, "source": [ "As enforced, its now somewhat more balanced than the $m=10$ tree.\n", "\n", "Now we are ready to search properly for the slicing indices, $2^{28}$ should be small enough to fit into no more than 8GB of memory." ] }, { "cell_type": "code", "execution_count": null, "id": "8aac170a-b094-417d-ad2f-33866910bc82", "metadata": {}, "outputs": [], "source": [ "sf = ctg.SliceFinder(info, target_size=2**28)" ] }, { "cell_type": "markdown", "id": "23e4eb75-bdcc-472c-b3d5-053201dea12f", "metadata": {}, "source": [ "We can do quite thorough search with different levels of exploration:" ] }, { "cell_type": "code", "execution_count": null, "id": "254e6d62-cc59-4566-999b-394e23eae623", "metadata": {}, "outputs": [], "source": [ "ix_sl, cost_sl = sf.search(temperature=1.0)\n", "ix_sl, cost_sl = sf.search(temperature=0.1)\n", "ix_sl, cost_sl = sf.search(temperature=0.01)" ] }, { "cell_type": "markdown", "id": "87171e7d-2acd-410a-820e-e849bc50c2f7", "metadata": {}, "source": [ "We can also visualise what effect the slicing has had on the total cost (left - starting point, further to the right equals more sliced):" ] }, { "cell_type": "code", "execution_count": null, "id": "ad693ecd-0e31-44ae-811a-c44f97837d00", "metadata": {}, "outputs": [], "source": [ "sf.plot_slicings(color_scheme=\"plasma\")" ] }, { "cell_type": "markdown", "id": "e593e4a8-3996-4bdb-a2e6-422279a31d1e", "metadata": {}, "source": [ "Here there seems to have been very little theoretical overhead introduced by the slicing, *for this path*. The real slicing overhead is the increase in FLOPs in comparison to best unsliced path (likely v different).\n", "\n", "\n", "## Performing the sliced contraction\n", "\n", "The order of `quimb` tensors and their data is guaranteed to match that used by the `opt_einsum` syntax:" ] }, { "cell_type": "code", "execution_count": null, "id": "de8fa298-1959-4fa6-95ac-9c7008f5319c", "metadata": {}, "outputs": [], "source": [ "arrays = [t.data for t in tn]\n", "sc = sf.SlicedContractor(arrays)" ] }, { "cell_type": "markdown", "id": "23be13a1-ac58-4943-a200-915b3dd7e9b7", "metadata": {}, "source": [ "Or we could translate the opt_einsum symbols back into `quimb` indices to handle the contractions in tensor network form (and use ``.cut_iter``)." ] }, { "cell_type": "code", "execution_count": null, "id": "837c1f37-87e9-4ff4-aae2-2d748e5a5148", "metadata": {}, "outputs": [], "source": [ "[info.quimb_symbol_map[ix] for ix in ix_sl]" ] }, { "cell_type": "markdown", "id": "8e39b604-f589-47cb-a162-e43a5bddd600", "metadata": {}, "source": [ "The first time a contraction is run by `jax` with a particular shape its compiled, which can take a few seconds:" ] }, { "cell_type": "code", "execution_count": null, "id": "77455eca-37f0-4bdf-9ec1-d74ff98f0468", "metadata": {}, "outputs": [], "source": [ "backend = \"jax\"" ] }, { "cell_type": "code", "execution_count": null, "id": "492ef8f3-c323-41bd-b615-dab9a1245211", "metadata": {}, "outputs": [], "source": [ "%%time\n", "c = sc.contract_slice(0, backend=backend)" ] }, { "cell_type": "markdown", "id": "0995cb9e-223d-4929-8d26-ac173221e174", "metadata": {}, "source": [ "However, the sliced contraction stores the compiled expression and reuses it for each slice:" ] }, { "cell_type": "code", "execution_count": null, "id": "2c940ffa-bad5-4d7f-8bf1-fec8d7d4b0e8", "metadata": {}, "outputs": [], "source": [ "import tqdm" ] }, { "cell_type": "code", "execution_count": null, "id": "756acd2f-b272-49dd-8650-3d425ed23204", "metadata": {}, "outputs": [], "source": [ "for i in tqdm.tqdm(range(1, sc.nslices)):\n", " c = c + sc.contract_slice(i, backend=backend)" ] }, { "cell_type": "code", "execution_count": null, "id": "85f71dc4-376a-4a6c-90a8-7fa64444de76", "metadata": {}, "outputs": [], "source": [ "c" ] }, { "cell_type": "markdown", "id": "2cd93e70-6415-4871-88bd-35ee5a2dd910", "metadata": {}, "source": [ "Again, the TN manipulations are deterministic so we can re-use everything:" ] }, { "cell_type": "code", "execution_count": null, "id": "97d99d73-0e2a-427d-bad9-a242740874f9", "metadata": {}, "outputs": [], "source": [ "tn = circ.psi & qtn.MPS_rand_computational_state(circ.N, seed=42)\n", "tn.full_simplify_(output_inds=[]).astype_(\"complex64\")" ] }, { "cell_type": "code", "execution_count": null, "id": "3394b451-468b-47a4-b894-750814585810", "metadata": {}, "outputs": [], "source": [ "# update the SlicedContractor's arrays\n", "sc.arrays = tuple(t.data for t in tn)\n", "\n", "# perform the contraction\n", "sum(\n", " sc.contract_slice(i, backend=backend) for i in tqdm.tqdm(range(sc.nslices))\n", ")" ] }, { "cell_type": "code", "execution_count": 50, "id": "7a583589-712f-48c7-8bad-c3dae42ecc3b", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 512/512 [02:58<00:00, 2.86it/s]\n" ] }, { "data": { "text/plain": [ "(3.03793169093014e-09+8.405632354220594e-09j)" ] }, "execution_count": 50, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# update the SlicedContractor's arrays\n", "sc.arrays = tuple(t.data for t in tn)\n", "\n", "# perform the contraction\n", "sum(\n", " sc.contract_slice(i, backend=backend) for i in tqdm.tqdm(range(sc.nslices))\n", ")" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3" } }, "nbformat": 4, "nbformat_minor": 4 } ================================================ FILE: examples/Quantum Circuit Example.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "id": "f635c2e7-0471-4964-a374-1ab537ae6762", "metadata": {}, "source": [ "This example shows using a simple cotengra optimizer to find a contraction\n", "tree for a quantum circuit amplitude, using the high level interface of `quimb`." ] }, { "cell_type": "code", "execution_count": 1, "id": "f25844c4-198f-49ab-9545-014b94b8193f", "metadata": { "tags": [] }, "outputs": [], "source": [ "%config InlineBackend.figure_formats = ['svg']\n", "import quimb.tensor as qtn\n", "\n", "import cotengra as ctg" ] }, { "cell_type": "code", "execution_count": 2, "id": "3d9d3d9d-cf43-4cdf-8f8a-324436c4d601", "metadata": { "tags": [] }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# get the circuit\n", "circ = qtn.Circuit.from_qasm_file(\"circuit_n53_m20_s0_e0_pABCDCDAB.qsim\")\n", "circ" ] }, { "cell_type": "code", "execution_count": 3, "id": "bb44f5fb-f3d9-48de-b90d-688302f32355", "metadata": { "tags": [] }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/media/johnnie/Storage2TB/Sync/dev/python/cotengra/cotengra/parallel.py:278: UserWarning: Parallel specified but no existing global dask client found... created one (with 8 workers).\n", " warnings.warn(\n" ] } ], "source": [ "# the contraction optimizer\n", "opt = ctg.HyperOptimizer(\n", " reconf_opts={},\n", " parallel=\"dask\",\n", " progbar=True,\n", ")" ] }, { "cell_type": "code", "execution_count": 4, "id": "c4c77851-a60e-4e08-a2a5-a83f58165f47", "metadata": { "tags": [] }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "log2[SIZE]: 54.00 log10[FLOPs]: 18.30: 100%|██████████| 128/128 [02:18<00:00, 1.08s/it]\n" ] } ], "source": [ "# we can supply it anywhere that takes an `optimize` kwarg:\n", "rehs = circ.amplitude_rehearse(optimize=opt)" ] }, { "cell_type": "code", "execution_count": 5, "id": "14e21449-b51c-45d8-9aeb-2feff8369a7e", "metadata": { "tags": [] }, "outputs": [ { "data": { "text/plain": [ "(54.0, 18.30316844521022)" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# get the core information\n", "width = rehs[\"W\"]\n", "cost = rehs[\"C\"]\n", "\n", "# n.b. discrepency with flops above is that `opt_einsum` reports\n", "# flops assuming real dtype (2 * cost), complex would be (8 * cost)\n", "width, cost" ] }, { "cell_type": "markdown", "id": "60b9f610-3097-4f30-8dcd-44608d6f7fa5", "metadata": {}, "source": [ "# inspecting:" ] }, { "cell_type": "code", "execution_count": 6, "id": "95d75a44-680a-49d3-a2c7-12fdbdb092c3", "metadata": { "tags": [] }, "outputs": [ { "data": { "image/svg+xml": [ "" ], "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "data": { "text/plain": [ "(
, )" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "opt.plot_trials()" ] }, { "cell_type": "code", "execution_count": 7, "id": "d318020d-72be-484e-84da-1a15c6efeaf4", "metadata": { "tags": [] }, "outputs": [ { "data": { "image/svg+xml": [ "" ], "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "data": { "text/plain": [ "(
,\n", " )" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "opt.plot_scatter()" ] }, { "cell_type": "code", "execution_count": 8, "id": "6238ee3f-2920-4b86-a021-b2705e778aef", "metadata": { "tags": [] }, "outputs": [ { "data": { "image/svg+xml": [ "" ], "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "data": { "text/plain": [ "(
, )" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "opt.tree.plot_tent(order=True)" ] }, { "cell_type": "code", "execution_count": 9, "id": "294d8162-67bf-49c5-a7fd-97b1f6372dc2", "metadata": { "tags": [] }, "outputs": [ { "data": { "image/svg+xml": [ "" ], "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "tn = rehs[\"tn\"]\n", "tn.draw(tn.tags, legend=False)" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3" } }, "nbformat": 4, "nbformat_minor": 5 } ================================================ FILE: examples/benchmarks/cubic_6x6x10.json ================================================ { "inputs": [ [ "a", "b", "c" ], [ "d", "e", "c", "f" ], [ "g", "h", "f", "i" ], [ "j", "k", "i", "l" ], [ "m", "n", "l", "o" ], [ "p", "q", "o", "r" ], [ "s", "t", "r", "u" ], [ "v", "w", "u", "x" ], [ "y", "z", "x", "A" ], [ "B", "C", "A" ], [ "D", "b", "E", "F" ], [ "G", "e", "H", "F", "I" ], [ "J", "h", "K", "I", "L" ], [ "M", "k", "N", "L", "O" ], [ "P", "n", "Q", "O", "R" ], [ "S", "q", "T", "R", "U" ], [ "V", "t", "W", "U", "X" ], [ "Y", "w", "Z", "X", "À" ], [ "Á", "z", "Â", "À", "Ã" ], [ "Ä", "C", "Å", "Ã" ], [ "Æ", "E", "Ç", "È" ], [ "É", "H", "Ê", "È", "Ë" ], [ "Ì", "K", "Í", "Ë", "Î" ], [ "Ï", "N", "Ð", "Î", "Ñ" ], [ "Ò", "Q", "Ó", "Ñ", "Ô" ], [ "Õ", "T", "Ö", "Ô", "×" ], [ "Ø", "W", "Ù", "×", "Ú" ], [ "Û", "Z", "Ü", "Ú", "Ý" ], [ "Þ", "Â", "ß", "Ý", "à" ], [ "á", "Å", "â", "à" ], [ "ã", "Ç", "ä", "å" ], [ "æ", "Ê", "ç", "å", "è" ], [ "é", "Í", "ê", "è", "ë" ], [ "ì", "Ð", "í", "ë", "î" ], [ "ï", "Ó", "ð", "î", "ñ" ], [ "ò", "Ö", "ó", "ñ", "ô" ], [ "õ", "Ù", "ö", "ô", "÷" ], [ "ø", "Ü", "ù", "÷", "ú" ], [ "û", "ß", "ü", "ú", "ý" ], [ "þ", "â", "ÿ", "ý" ], [ "Ā", "ä", "ā", "Ă" ], [ "ă", "ç", "Ą", "Ă", "ą" ], [ "Ć", "ê", "ć", "ą", "Ĉ" ], [ "ĉ", "í", "Ċ", "Ĉ", "ċ" ], [ "Č", "ð", "č", "ċ", "Ď" ], [ "ď", "ó", "Đ", "Ď", "đ" ], [ "Ē", "ö", "ē", "đ", "Ĕ" ], [ "ĕ", "ù", "Ė", "Ĕ", "ė" ], [ "Ę", "ü", "ę", "ė", "Ě" ], [ "ě", "ÿ", "Ĝ", "Ě" ], [ "ĝ", "ā", "Ğ" ], [ "ğ", "Ą", "Ğ", "Ġ" ], [ "ġ", "ć", "Ġ", "Ģ" ], [ "ģ", "Ċ", "Ģ", "Ĥ" ], [ "ĥ", "č", "Ĥ", "Ħ" ], [ "ħ", "Đ", "Ħ", "Ĩ" ], [ "ĩ", "ē", "Ĩ", "Ī" ], [ "ī", "Ė", "Ī", "Ĭ" ], [ "ĭ", "ę", "Ĭ", "Į" ], [ "į", "Ĝ", "Į" ], [ "a", "İ", "ı", "IJ" ], [ "d", "ij", "Ĵ", "IJ", "ĵ" ], [ "g", "Ķ", "ķ", "ĵ", "ĸ" ], [ "j", "Ĺ", "ĺ", "ĸ", "Ļ" ], [ "m", "ļ", "Ľ", "Ļ", "ľ" ], [ "p", "Ŀ", "ŀ", "ľ", "Ł" ], [ "s", "ł", "Ń", "Ł", "ń" ], [ "v", "Ņ", "ņ", "ń", "Ň" ], [ "y", "ň", "ʼn", "Ň", "Ŋ" ], [ "B", "ŋ", "Ō", "Ŋ" ], [ "D", "ō", "ı", "Ŏ", "ŏ" ], [ "G", "Ő", "Ĵ", "ő", "ŏ", "Œ" ], [ "J", "œ", "ķ", "Ŕ", "Œ", "ŕ" ], [ "M", "Ŗ", "ĺ", "ŗ", "ŕ", "Ř" ], [ "P", "ř", "Ľ", "Ś", "Ř", "ś" ], [ "S", "Ŝ", "ŀ", "ŝ", "ś", "Ş" ], [ "V", "ş", "Ń", "Š", "Ş", "š" ], [ "Y", "Ţ", "ņ", "ţ", "š", "Ť" ], [ "Á", "ť", "ʼn", "Ŧ", "Ť", "ŧ" ], [ "Ä", "Ũ", "Ō", "ũ", "ŧ" ], [ "Æ", "Ū", "Ŏ", "ū", "Ŭ" ], [ "É", "ŭ", "ő", "Ů", "Ŭ", "ů" ], [ "Ì", "Ű", "Ŕ", "ű", "ů", "Ų" ], [ "Ï", "ų", "ŗ", "Ŵ", "Ų", "ŵ" ], [ "Ò", "Ŷ", "Ś", "ŷ", "ŵ", "Ÿ" ], [ "Õ", "Ź", "ŝ", "ź", "Ÿ", "Ż" ], [ "Ø", "ż", "Š", "Ž", "Ż", "ž" ], [ "Û", "ſ", "ţ", "ƀ", "ž", "Ɓ" ], [ "Þ", "Ƃ", "Ŧ", "ƃ", "Ɓ", "Ƅ" ], [ "á", "ƅ", "ũ", "Ɔ", "Ƅ" ], [ "ã", "Ƈ", "ū", "ƈ", "Ɖ" ], [ "æ", "Ɗ", "Ů", "Ƌ", "Ɖ", "ƌ" ], [ "é", "ƍ", "ű", "Ǝ", "ƌ", "Ə" ], [ "ì", "Ɛ", "Ŵ", "Ƒ", "Ə", "ƒ" ], [ "ï", "Ɠ", "ŷ", "Ɣ", "ƒ", "ƕ" ], [ "ò", "Ɩ", "ź", "Ɨ", "ƕ", "Ƙ" ], [ "õ", "ƙ", "Ž", "ƚ", "Ƙ", "ƛ" ], [ "ø", "Ɯ", "ƀ", "Ɲ", "ƛ", "ƞ" ], [ "û", "Ɵ", "ƃ", "Ơ", "ƞ", "ơ" ], [ "þ", "Ƣ", "Ɔ", "ƣ", "ơ" ], [ "Ā", "Ƥ", "ƈ", "ƥ", "Ʀ" ], [ "ă", "Ƨ", "Ƌ", "ƨ", "Ʀ", "Ʃ" ], [ "Ć", "ƪ", "Ǝ", "ƫ", "Ʃ", "Ƭ" ], [ "ĉ", "ƭ", "Ƒ", "Ʈ", "Ƭ", "Ư" ], [ "Č", "ư", "Ɣ", "Ʊ", "Ư", "Ʋ" ], [ "ď", "Ƴ", "Ɨ", "ƴ", "Ʋ", "Ƶ" ], [ "Ē", "ƶ", "ƚ", "Ʒ", "Ƶ", "Ƹ" ], [ "ĕ", "ƹ", "Ɲ", "ƺ", "Ƹ", "ƻ" ], [ "Ę", "Ƽ", "Ơ", "ƽ", "ƻ", "ƾ" ], [ "ě", "ƿ", "ƣ", "ǀ", "ƾ" ], [ "ĝ", "ǁ", "ƥ", "ǂ" ], [ "ğ", "ǃ", "ƨ", "ǂ", "DŽ" ], [ "ġ", "Dž", "ƫ", "DŽ", "dž" ], [ "ģ", "LJ", "Ʈ", "dž", "Lj" ], [ "ĥ", "lj", "Ʊ", "Lj", "NJ" ], [ "ħ", "Nj", "ƴ", "NJ", "nj" ], [ "ĩ", "Ǎ", "Ʒ", "nj", "ǎ" ], [ "ī", "Ǐ", "ƺ", "ǎ", "ǐ" ], [ "ĭ", "Ǒ", "ƽ", "ǐ", "ǒ" ], [ "į", "Ǔ", "ǀ", "ǒ" ], [ "İ", "ǔ", "Ǖ", "ǖ" ], [ "ij", "Ǘ", "ǘ", "ǖ", "Ǚ" ], [ "Ķ", "ǚ", "Ǜ", "Ǚ", "ǜ" ], [ "Ĺ", "ǝ", "Ǟ", "ǜ", "ǟ" ], [ "ļ", "Ǡ", "ǡ", "ǟ", "Ǣ" ], [ "Ŀ", "ǣ", "Ǥ", "Ǣ", "ǥ" ], [ "ł", "Ǧ", "ǧ", "ǥ", "Ǩ" ], [ "Ņ", "ǩ", "Ǫ", "Ǩ", "ǫ" ], [ "ň", "Ǭ", "ǭ", "ǫ", "Ǯ" ], [ "ŋ", "ǯ", "ǰ", "Ǯ" ], [ "ō", "DZ", "Ǖ", "Dz", "dz" ], [ "Ő", "Ǵ", "ǘ", "ǵ", "dz", "Ƕ" ], [ "œ", "Ƿ", "Ǜ", "Ǹ", "Ƕ", "ǹ" ], [ "Ŗ", "Ǻ", "Ǟ", "ǻ", "ǹ", "Ǽ" ], [ "ř", "ǽ", "ǡ", "Ǿ", "Ǽ", "ǿ" ], [ "Ŝ", "Ȁ", "Ǥ", "ȁ", "ǿ", "Ȃ" ], [ "ş", "ȃ", "ǧ", "Ȅ", "Ȃ", "ȅ" ], [ "Ţ", "Ȇ", "Ǫ", "ȇ", "ȅ", "Ȉ" ], [ "ť", "ȉ", "ǭ", "Ȋ", "Ȉ", "ȋ" ], [ "Ũ", "Ȍ", "ǰ", "ȍ", "ȋ" ], [ "Ū", "Ȏ", "Dz", "ȏ", "Ȑ" ], [ "ŭ", "ȑ", "ǵ", "Ȓ", "Ȑ", "ȓ" ], [ "Ű", "Ȕ", "Ǹ", "ȕ", "ȓ", "Ȗ" ], [ "ų", "ȗ", "ǻ", "Ș", "Ȗ", "ș" ], [ "Ŷ", "Ț", "Ǿ", "ț", "ș", "Ȝ" ], [ "Ź", "ȝ", "ȁ", "Ȟ", "Ȝ", "ȟ" ], [ "ż", "Ƞ", "Ȅ", "ȡ", "ȟ", "Ȣ" ], [ "ſ", "ȣ", "ȇ", "Ȥ", "Ȣ", "ȥ" ], [ "Ƃ", "Ȧ", "Ȋ", "ȧ", "ȥ", "Ȩ" ], [ "ƅ", "ȩ", "ȍ", "Ȫ", "Ȩ" ], [ "Ƈ", "ȫ", "ȏ", "Ȭ", "ȭ" ], [ "Ɗ", "Ȯ", "Ȓ", "ȯ", "ȭ", "Ȱ" ], [ "ƍ", "ȱ", "ȕ", "Ȳ", "Ȱ", "ȳ" ], [ "Ɛ", "ȴ", "Ș", "ȵ", "ȳ", "ȶ" ], [ "Ɠ", "ȷ", "ț", "ȸ", "ȶ", "ȹ" ], [ "Ɩ", "Ⱥ", "Ȟ", "Ȼ", "ȹ", "ȼ" ], [ "ƙ", "Ƚ", "ȡ", "Ⱦ", "ȼ", "ȿ" ], [ "Ɯ", "ɀ", "Ȥ", "Ɂ", "ȿ", "ɂ" ], [ "Ɵ", "Ƀ", "ȧ", "Ʉ", "ɂ", "Ʌ" ], [ "Ƣ", "Ɇ", "Ȫ", "ɇ", "Ʌ" ], [ "Ƥ", "Ɉ", "Ȭ", "ɉ", "Ɋ" ], [ "Ƨ", "ɋ", "ȯ", "Ɍ", "Ɋ", "ɍ" ], [ "ƪ", "Ɏ", "Ȳ", "ɏ", "ɍ", "ɐ" ], [ "ƭ", "ɑ", "ȵ", "ɒ", "ɐ", "ɓ" ], [ "ư", "ɔ", "ȸ", "ɕ", "ɓ", "ɖ" ], [ "Ƴ", "ɗ", "Ȼ", "ɘ", "ɖ", "ə" ], [ "ƶ", "ɚ", "Ⱦ", "ɛ", "ə", "ɜ" ], [ "ƹ", "ɝ", "Ɂ", "ɞ", "ɜ", "ɟ" ], [ "Ƽ", "ɠ", "Ʉ", "ɡ", "ɟ", "ɢ" ], [ "ƿ", "ɣ", "ɇ", "ɤ", "ɢ" ], [ "ǁ", "ɥ", "ɉ", "ɦ" ], [ "ǃ", "ɧ", "Ɍ", "ɦ", "ɨ" ], [ "Dž", "ɩ", "ɏ", "ɨ", "ɪ" ], [ "LJ", "ɫ", "ɒ", "ɪ", "ɬ" ], [ "lj", "ɭ", "ɕ", "ɬ", "ɮ" ], [ "Nj", "ɯ", "ɘ", "ɮ", "ɰ" ], [ "Ǎ", "ɱ", "ɛ", "ɰ", "ɲ" ], [ "Ǐ", "ɳ", "ɞ", "ɲ", "ɴ" ], [ "Ǒ", "ɵ", "ɡ", "ɴ", "ɶ" ], [ "Ǔ", "ɷ", "ɤ", "ɶ" ], [ "ǔ", "ɸ", "ɹ", "ɺ" ], [ "Ǘ", "ɻ", "ɼ", "ɺ", "ɽ" ], [ "ǚ", "ɾ", "ɿ", "ɽ", "ʀ" ], [ "ǝ", "ʁ", "ʂ", "ʀ", "ʃ" ], [ "Ǡ", "ʄ", "ʅ", "ʃ", "ʆ" ], [ "ǣ", "ʇ", "ʈ", "ʆ", "ʉ" ], [ "Ǧ", "ʊ", "ʋ", "ʉ", "ʌ" ], [ "ǩ", "ʍ", "ʎ", "ʌ", "ʏ" ], [ "Ǭ", "ʐ", "ʑ", "ʏ", "ʒ" ], [ "ǯ", "ʓ", "ʔ", "ʒ" ], [ "DZ", "ʕ", "ɹ", "ʖ", "ʗ" ], [ "Ǵ", "ʘ", "ɼ", "ʙ", "ʗ", "ʚ" ], [ "Ƿ", "ʛ", "ɿ", "ʜ", "ʚ", "ʝ" ], [ "Ǻ", "ʞ", "ʂ", "ʟ", "ʝ", "ʠ" ], [ "ǽ", "ʡ", "ʅ", "ʢ", "ʠ", "ʣ" ], [ "Ȁ", "ʤ", "ʈ", "ʥ", "ʣ", "ʦ" ], [ "ȃ", "ʧ", "ʋ", "ʨ", "ʦ", "ʩ" ], [ "Ȇ", "ʪ", "ʎ", "ʫ", "ʩ", "ʬ" ], [ "ȉ", "ʭ", "ʑ", "ʮ", "ʬ", "ʯ" ], [ "Ȍ", "ʰ", "ʔ", "ʱ", "ʯ" ], [ "Ȏ", "ʲ", "ʖ", "ʳ", "ʴ" ], [ "ȑ", "ʵ", "ʙ", "ʶ", "ʴ", "ʷ" ], [ "Ȕ", "ʸ", "ʜ", "ʹ", "ʷ", "ʺ" ], [ "ȗ", "ʻ", "ʟ", "ʼ", "ʺ", "ʽ" ], [ "Ț", "ʾ", "ʢ", "ʿ", "ʽ", "ˀ" ], [ "ȝ", "ˁ", "ʥ", "˂", "ˀ", "˃" ], [ "Ƞ", "˄", "ʨ", "˅", "˃", "ˆ" ], [ "ȣ", "ˇ", "ʫ", "ˈ", "ˆ", "ˉ" ], [ "Ȧ", "ˊ", "ʮ", "ˋ", "ˉ", "ˌ" ], [ "ȩ", "ˍ", "ʱ", "ˎ", "ˌ" ], [ "ȫ", "ˏ", "ʳ", "ː", "ˑ" ], [ "Ȯ", "˒", "ʶ", "˓", "ˑ", "˔" ], [ "ȱ", "˕", "ʹ", "˖", "˔", "˗" ], [ "ȴ", "˘", "ʼ", "˙", "˗", "˚" ], [ "ȷ", "˛", "ʿ", "˜", "˚", "˝" ], [ "Ⱥ", "˞", "˂", "˟", "˝", "ˠ" ], [ "Ƚ", "ˡ", "˅", "ˢ", "ˠ", "ˣ" ], [ "ɀ", "ˤ", "ˈ", "˥", "ˣ", "˦" ], [ "Ƀ", "˧", "ˋ", "˨", "˦", "˩" ], [ "Ɇ", "˪", "ˎ", "˫", "˩" ], [ "Ɉ", "ˬ", "ː", "˭", "ˮ" ], [ "ɋ", "˯", "˓", "˰", "ˮ", "˱" ], [ "Ɏ", "˲", "˖", "˳", "˱", "˴" ], [ "ɑ", "˵", "˙", "˶", "˴", "˷" ], [ "ɔ", "˸", "˜", "˹", "˷", "˺" ], [ "ɗ", "˻", "˟", "˼", "˺", "˽" ], [ "ɚ", "˾", "ˢ", "˿", "˽", "̀" ], [ "ɝ", "́", "˥", "̂", "̀", "̃" ], [ "ɠ", "̄", "˨", "̅", "̃", "̆" ], [ "ɣ", "̇", "˫", "̈", "̆" ], [ "ɥ", "̉", "˭", "̊" ], [ "ɧ", "̋", "˰", "̊", "̌" ], [ "ɩ", "̍", "˳", "̌", "̎" ], [ "ɫ", "̏", "˶", "̎", "̐" ], [ "ɭ", "̑", "˹", "̐", "̒" ], [ "ɯ", "̓", "˼", "̒", "̔" ], [ "ɱ", "̕", "˿", "̔", "̖" ], [ "ɳ", "̗", "̂", "̖", "̘" ], [ "ɵ", "̙", "̅", "̘", "̚" ], [ "ɷ", "̛", "̈", "̚" ], [ "ɸ", "̜", "̝", "̞" ], [ "ɻ", "̟", "̠", "̞", "̡" ], [ "ɾ", "̢", "̣", "̡", "̤" ], [ "ʁ", "̥", "̦", "̤", "̧" ], [ "ʄ", "̨", "̩", "̧", "̪" ], [ "ʇ", "̫", "̬", "̪", "̭" ], [ "ʊ", "̮", "̯", "̭", "̰" ], [ "ʍ", "̱", "̲", "̰", "̳" ], [ "ʐ", "̴", "̵", "̳", "̶" ], [ "ʓ", "̷", "̸", "̶" ], [ "ʕ", "̹", "̝", "̺", "̻" ], [ "ʘ", "̼", "̠", "̽", "̻", "̾" ], [ "ʛ", "̿", "̣", "̀", "̾", "́" ], [ "ʞ", "͂", "̦", "̓", "́", "̈́" ], [ "ʡ", "ͅ", "̩", "͆", "̈́", "͇" ], [ "ʤ", "͈", "̬", "͉", "͇", "͊" ], [ "ʧ", "͋", "̯", "͌", "͊", "͍" ], [ "ʪ", "͎", "̲", "͏", "͍", "͐" ], [ "ʭ", "͑", "̵", "͒", "͐", "͓" ], [ "ʰ", "͔", "̸", "͕", "͓" ], [ "ʲ", "͖", "̺", "͗", "͘" ], [ "ʵ", "͙", "̽", "͚", "͘", "͛" ], [ "ʸ", "͜", "̀", "͝", "͛", "͞" ], [ "ʻ", "͟", "̓", "͠", "͞", "͡" ], [ "ʾ", "͢", "͆", "ͣ", "͡", "ͤ" ], [ "ˁ", "ͥ", "͉", "ͦ", "ͤ", "ͧ" ], [ "˄", "ͨ", "͌", "ͩ", "ͧ", "ͪ" ], [ "ˇ", "ͫ", "͏", "ͬ", "ͪ", "ͭ" ], [ "ˊ", "ͮ", "͒", "ͯ", "ͭ", "Ͱ" ], [ "ˍ", "ͱ", "͕", "Ͳ", "Ͱ" ], [ "ˏ", "ͳ", "͗", "ʹ", "͵" ], [ "˒", "Ͷ", "͚", "ͷ", "͵", "͸" ], [ "˕", "͹", "͝", "ͺ", "͸", "ͻ" ], [ "˘", "ͼ", "͠", "ͽ", "ͻ", ";" ], [ "˛", "Ϳ", "ͣ", "΀", ";", "΁" ], [ "˞", "΂", "ͦ", "΃", "΁", "΄" ], [ "ˡ", "΅", "ͩ", "Ά", "΄", "·" ], [ "ˤ", "Έ", "ͬ", "Ή", "·", "Ί" ], [ "˧", "΋", "ͯ", "Ό", "Ί", "΍" ], [ "˪", "Ύ", "Ͳ", "Ώ", "΍" ], [ "ˬ", "ΐ", "ʹ", "Α", "Β" ], [ "˯", "Γ", "ͷ", "Δ", "Β", "Ε" ], [ "˲", "Ζ", "ͺ", "Η", "Ε", "Θ" ], [ "˵", "Ι", "ͽ", "Κ", "Θ", "Λ" ], [ "˸", "Μ", "΀", "Ν", "Λ", "Ξ" ], [ "˻", "Ο", "΃", "Π", "Ξ", "Ρ" ], [ "˾", "΢", "Ά", "Σ", "Ρ", "Τ" ], [ "́", "Υ", "Ή", "Φ", "Τ", "Χ" ], [ "̄", "Ψ", "Ό", "Ω", "Χ", "Ϊ" ], [ "̇", "Ϋ", "Ώ", "ά", "Ϊ" ], [ "̉", "έ", "Α", "ή" ], [ "̋", "ί", "Δ", "ή", "ΰ" ], [ "̍", "α", "Η", "ΰ", "β" ], [ "̏", "γ", "Κ", "β", "δ" ], [ "̑", "ε", "Ν", "δ", "ζ" ], [ "̓", "η", "Π", "ζ", "θ" ], [ "̕", "ι", "Σ", "θ", "κ" ], [ "̗", "λ", "Φ", "κ", "μ" ], [ "̙", "ν", "Ω", "μ", "ξ" ], [ "̛", "ο", "ά", "ξ" ], [ "̜", "π", "ρ" ], [ "̟", "ς", "ρ", "σ" ], [ "̢", "τ", "σ", "υ" ], [ "̥", "φ", "υ", "χ" ], [ "̨", "ψ", "χ", "ω" ], [ "̫", "ϊ", "ω", "ϋ" ], [ "̮", "ό", "ϋ", "ύ" ], [ "̱", "ώ", "ύ", "Ϗ" ], [ "̴", "ϐ", "Ϗ", "ϑ" ], [ "̷", "ϒ", "ϑ" ], [ "̹", "π", "ϓ", "ϔ" ], [ "̼", "ς", "ϕ", "ϔ", "ϖ" ], [ "̿", "τ", "ϗ", "ϖ", "Ϙ" ], [ "͂", "φ", "ϙ", "Ϙ", "Ϛ" ], [ "ͅ", "ψ", "ϛ", "Ϛ", "Ϝ" ], [ "͈", "ϊ", "ϝ", "Ϝ", "Ϟ" ], [ "͋", "ό", "ϟ", "Ϟ", "Ϡ" ], [ "͎", "ώ", "ϡ", "Ϡ", "Ϣ" ], [ "͑", "ϐ", "ϣ", "Ϣ", "Ϥ" ], [ "͔", "ϒ", "ϥ", "Ϥ" ], [ "͖", "ϓ", "Ϧ", "ϧ" ], [ "͙", "ϕ", "Ϩ", "ϧ", "ϩ" ], [ "͜", "ϗ", "Ϫ", "ϩ", "ϫ" ], [ "͟", "ϙ", "Ϭ", "ϫ", "ϭ" ], [ "͢", "ϛ", "Ϯ", "ϭ", "ϯ" ], [ "ͥ", "ϝ", "ϰ", "ϯ", "ϱ" ], [ "ͨ", "ϟ", "ϲ", "ϱ", "ϳ" ], [ "ͫ", "ϡ", "ϴ", "ϳ", "ϵ" ], [ "ͮ", "ϣ", "϶", "ϵ", "Ϸ" ], [ "ͱ", "ϥ", "ϸ", "Ϸ" ], [ "ͳ", "Ϧ", "Ϲ", "Ϻ" ], [ "Ͷ", "Ϩ", "ϻ", "Ϻ", "ϼ" ], [ "͹", "Ϫ", "Ͻ", "ϼ", "Ͼ" ], [ "ͼ", "Ϭ", "Ͽ", "Ͼ", "Ѐ" ], [ "Ϳ", "Ϯ", "Ё", "Ѐ", "Ђ" ], [ "΂", "ϰ", "Ѓ", "Ђ", "Є" ], [ "΅", "ϲ", "Ѕ", "Є", "І" ], [ "Έ", "ϴ", "Ї", "І", "Ј" ], [ "΋", "϶", "Љ", "Ј", "Њ" ], [ "Ύ", "ϸ", "Ћ", "Њ" ], [ "ΐ", "Ϲ", "Ќ", "Ѝ" ], [ "Γ", "ϻ", "Ў", "Ѝ", "Џ" ], [ "Ζ", "Ͻ", "А", "Џ", "Б" ], [ "Ι", "Ͽ", "В", "Б", "Г" ], [ "Μ", "Ё", "Д", "Г", "Е" ], [ "Ο", "Ѓ", "Ж", "Е", "З" ], [ "΢", "Ѕ", "И", "З", "Й" ], [ "Υ", "Ї", "К", "Й", "Л" ], [ "Ψ", "Љ", "М", "Л", "Н" ], [ "Ϋ", "Ћ", "О", "Н" ], [ "έ", "Ќ", "П" ], [ "ί", "Ў", "П", "Р" ], [ "α", "А", "Р", "С" ], [ "γ", "В", "С", "Т" ], [ "ε", "Д", "Т", "У" ], [ "η", "Ж", "У", "Ф" ], [ "ι", "И", "Ф", "Х" ], [ "λ", "К", "Х", "Ц" ], [ "ν", "М", "Ц", "Ч" ], [ "ο", "О", "Ч" ] ], "output": [], "size_dict": { "a": 2, "b": 2, "c": 2, "d": 2, "e": 2, "f": 2, "g": 2, "h": 2, "i": 2, "j": 2, "k": 2, "l": 2, "m": 2, "n": 2, "o": 2, "p": 2, "q": 2, "r": 2, "s": 2, "t": 2, "u": 2, "v": 2, "w": 2, "x": 2, "y": 2, "z": 2, "A": 2, "B": 2, "C": 2, "D": 2, "E": 2, "F": 2, "G": 2, "H": 2, "I": 2, "J": 2, "K": 2, "L": 2, "M": 2, "N": 2, "O": 2, "P": 2, "Q": 2, "R": 2, "S": 2, "T": 2, "U": 2, "V": 2, "W": 2, "X": 2, "Y": 2, "Z": 2, "À": 2, "Á": 2, "Â": 2, "Ã": 2, "Ä": 2, "Å": 2, "Æ": 2, "Ç": 2, "È": 2, "É": 2, "Ê": 2, "Ë": 2, "Ì": 2, "Í": 2, "Î": 2, "Ï": 2, "Ð": 2, "Ñ": 2, "Ò": 2, "Ó": 2, "Ô": 2, "Õ": 2, "Ö": 2, "×": 2, "Ø": 2, "Ù": 2, "Ú": 2, "Û": 2, "Ü": 2, "Ý": 2, "Þ": 2, "ß": 2, "à": 2, "á": 2, "â": 2, "ã": 2, "ä": 2, "å": 2, "æ": 2, "ç": 2, "è": 2, "é": 2, "ê": 2, "ë": 2, "ì": 2, "í": 2, "î": 2, "ï": 2, "ð": 2, "ñ": 2, "ò": 2, "ó": 2, "ô": 2, "õ": 2, "ö": 2, "÷": 2, "ø": 2, "ù": 2, "ú": 2, "û": 2, "ü": 2, "ý": 2, "þ": 2, "ÿ": 2, "Ā": 2, "ā": 2, "Ă": 2, "ă": 2, "Ą": 2, "ą": 2, "Ć": 2, "ć": 2, "Ĉ": 2, "ĉ": 2, "Ċ": 2, "ċ": 2, "Č": 2, "č": 2, "Ď": 2, "ď": 2, "Đ": 2, "đ": 2, "Ē": 2, "ē": 2, "Ĕ": 2, "ĕ": 2, "Ė": 2, "ė": 2, "Ę": 2, "ę": 2, "Ě": 2, "ě": 2, "Ĝ": 2, "ĝ": 2, "Ğ": 2, "ğ": 2, "Ġ": 2, "ġ": 2, "Ģ": 2, "ģ": 2, "Ĥ": 2, "ĥ": 2, "Ħ": 2, "ħ": 2, "Ĩ": 2, "ĩ": 2, "Ī": 2, "ī": 2, "Ĭ": 2, "ĭ": 2, "Į": 2, "į": 2, "İ": 2, "ı": 2, "IJ": 2, "ij": 2, "Ĵ": 2, "ĵ": 2, "Ķ": 2, "ķ": 2, "ĸ": 2, "Ĺ": 2, "ĺ": 2, "Ļ": 2, "ļ": 2, "Ľ": 2, "ľ": 2, "Ŀ": 2, "ŀ": 2, "Ł": 2, "ł": 2, "Ń": 2, "ń": 2, "Ņ": 2, "ņ": 2, "Ň": 2, "ň": 2, "ʼn": 2, "Ŋ": 2, "ŋ": 2, "Ō": 2, "ō": 2, "Ŏ": 2, "ŏ": 2, "Ő": 2, "ő": 2, "Œ": 2, "œ": 2, "Ŕ": 2, "ŕ": 2, "Ŗ": 2, "ŗ": 2, "Ř": 2, "ř": 2, "Ś": 2, "ś": 2, "Ŝ": 2, "ŝ": 2, "Ş": 2, "ş": 2, "Š": 2, "š": 2, "Ţ": 2, "ţ": 2, "Ť": 2, "ť": 2, "Ŧ": 2, "ŧ": 2, "Ũ": 2, "ũ": 2, "Ū": 2, "ū": 2, "Ŭ": 2, "ŭ": 2, "Ů": 2, "ů": 2, "Ű": 2, "ű": 2, "Ų": 2, "ų": 2, "Ŵ": 2, "ŵ": 2, "Ŷ": 2, "ŷ": 2, "Ÿ": 2, "Ź": 2, "ź": 2, "Ż": 2, "ż": 2, "Ž": 2, "ž": 2, "ſ": 2, "ƀ": 2, "Ɓ": 2, "Ƃ": 2, "ƃ": 2, "Ƅ": 2, "ƅ": 2, "Ɔ": 2, "Ƈ": 2, "ƈ": 2, "Ɖ": 2, "Ɗ": 2, "Ƌ": 2, "ƌ": 2, "ƍ": 2, "Ǝ": 2, "Ə": 2, "Ɛ": 2, "Ƒ": 2, "ƒ": 2, "Ɠ": 2, "Ɣ": 2, "ƕ": 2, "Ɩ": 2, "Ɨ": 2, "Ƙ": 2, "ƙ": 2, "ƚ": 2, "ƛ": 2, "Ɯ": 2, "Ɲ": 2, "ƞ": 2, "Ɵ": 2, "Ơ": 2, "ơ": 2, "Ƣ": 2, "ƣ": 2, "Ƥ": 2, "ƥ": 2, "Ʀ": 2, "Ƨ": 2, "ƨ": 2, "Ʃ": 2, "ƪ": 2, "ƫ": 2, "Ƭ": 2, "ƭ": 2, "Ʈ": 2, "Ư": 2, "ư": 2, "Ʊ": 2, "Ʋ": 2, "Ƴ": 2, "ƴ": 2, "Ƶ": 2, "ƶ": 2, "Ʒ": 2, "Ƹ": 2, "ƹ": 2, "ƺ": 2, "ƻ": 2, "Ƽ": 2, "ƽ": 2, "ƾ": 2, "ƿ": 2, "ǀ": 2, "ǁ": 2, "ǂ": 2, "ǃ": 2, "DŽ": 2, "Dž": 2, "dž": 2, "LJ": 2, "Lj": 2, "lj": 2, "NJ": 2, "Nj": 2, "nj": 2, "Ǎ": 2, "ǎ": 2, "Ǐ": 2, "ǐ": 2, "Ǒ": 2, "ǒ": 2, "Ǔ": 2, "ǔ": 2, "Ǖ": 2, "ǖ": 2, "Ǘ": 2, "ǘ": 2, "Ǚ": 2, "ǚ": 2, "Ǜ": 2, "ǜ": 2, "ǝ": 2, "Ǟ": 2, "ǟ": 2, "Ǡ": 2, "ǡ": 2, "Ǣ": 2, "ǣ": 2, "Ǥ": 2, "ǥ": 2, "Ǧ": 2, "ǧ": 2, "Ǩ": 2, "ǩ": 2, "Ǫ": 2, "ǫ": 2, "Ǭ": 2, "ǭ": 2, "Ǯ": 2, "ǯ": 2, "ǰ": 2, "DZ": 2, "Dz": 2, "dz": 2, "Ǵ": 2, "ǵ": 2, "Ƕ": 2, "Ƿ": 2, "Ǹ": 2, "ǹ": 2, "Ǻ": 2, "ǻ": 2, "Ǽ": 2, "ǽ": 2, "Ǿ": 2, "ǿ": 2, "Ȁ": 2, "ȁ": 2, "Ȃ": 2, "ȃ": 2, "Ȅ": 2, "ȅ": 2, "Ȇ": 2, "ȇ": 2, "Ȉ": 2, "ȉ": 2, "Ȋ": 2, "ȋ": 2, "Ȍ": 2, "ȍ": 2, "Ȏ": 2, "ȏ": 2, "Ȑ": 2, "ȑ": 2, "Ȓ": 2, "ȓ": 2, "Ȕ": 2, "ȕ": 2, "Ȗ": 2, "ȗ": 2, "Ș": 2, "ș": 2, "Ț": 2, "ț": 2, "Ȝ": 2, "ȝ": 2, "Ȟ": 2, "ȟ": 2, "Ƞ": 2, "ȡ": 2, "Ȣ": 2, "ȣ": 2, "Ȥ": 2, "ȥ": 2, "Ȧ": 2, "ȧ": 2, "Ȩ": 2, "ȩ": 2, "Ȫ": 2, "ȫ": 2, "Ȭ": 2, "ȭ": 2, "Ȯ": 2, "ȯ": 2, "Ȱ": 2, "ȱ": 2, "Ȳ": 2, "ȳ": 2, "ȴ": 2, "ȵ": 2, "ȶ": 2, "ȷ": 2, "ȸ": 2, "ȹ": 2, "Ⱥ": 2, "Ȼ": 2, "ȼ": 2, "Ƚ": 2, "Ⱦ": 2, "ȿ": 2, "ɀ": 2, "Ɂ": 2, "ɂ": 2, "Ƀ": 2, "Ʉ": 2, "Ʌ": 2, "Ɇ": 2, "ɇ": 2, "Ɉ": 2, "ɉ": 2, "Ɋ": 2, "ɋ": 2, "Ɍ": 2, "ɍ": 2, "Ɏ": 2, "ɏ": 2, "ɐ": 2, "ɑ": 2, "ɒ": 2, "ɓ": 2, "ɔ": 2, "ɕ": 2, "ɖ": 2, "ɗ": 2, "ɘ": 2, "ə": 2, "ɚ": 2, "ɛ": 2, "ɜ": 2, "ɝ": 2, "ɞ": 2, "ɟ": 2, "ɠ": 2, "ɡ": 2, "ɢ": 2, "ɣ": 2, "ɤ": 2, "ɥ": 2, "ɦ": 2, "ɧ": 2, "ɨ": 2, "ɩ": 2, "ɪ": 2, "ɫ": 2, "ɬ": 2, "ɭ": 2, "ɮ": 2, "ɯ": 2, "ɰ": 2, "ɱ": 2, "ɲ": 2, "ɳ": 2, "ɴ": 2, "ɵ": 2, "ɶ": 2, "ɷ": 2, "ɸ": 2, "ɹ": 2, "ɺ": 2, "ɻ": 2, "ɼ": 2, "ɽ": 2, "ɾ": 2, "ɿ": 2, "ʀ": 2, "ʁ": 2, "ʂ": 2, "ʃ": 2, "ʄ": 2, "ʅ": 2, "ʆ": 2, "ʇ": 2, "ʈ": 2, "ʉ": 2, "ʊ": 2, "ʋ": 2, "ʌ": 2, "ʍ": 2, "ʎ": 2, "ʏ": 2, "ʐ": 2, "ʑ": 2, "ʒ": 2, "ʓ": 2, "ʔ": 2, "ʕ": 2, "ʖ": 2, "ʗ": 2, "ʘ": 2, "ʙ": 2, "ʚ": 2, "ʛ": 2, "ʜ": 2, "ʝ": 2, "ʞ": 2, "ʟ": 2, "ʠ": 2, "ʡ": 2, "ʢ": 2, "ʣ": 2, "ʤ": 2, "ʥ": 2, "ʦ": 2, "ʧ": 2, "ʨ": 2, "ʩ": 2, "ʪ": 2, "ʫ": 2, "ʬ": 2, "ʭ": 2, "ʮ": 2, "ʯ": 2, "ʰ": 2, "ʱ": 2, "ʲ": 2, "ʳ": 2, "ʴ": 2, "ʵ": 2, "ʶ": 2, "ʷ": 2, "ʸ": 2, "ʹ": 2, "ʺ": 2, "ʻ": 2, "ʼ": 2, "ʽ": 2, "ʾ": 2, "ʿ": 2, "ˀ": 2, "ˁ": 2, "˂": 2, "˃": 2, "˄": 2, "˅": 2, "ˆ": 2, "ˇ": 2, "ˈ": 2, "ˉ": 2, "ˊ": 2, "ˋ": 2, "ˌ": 2, "ˍ": 2, "ˎ": 2, "ˏ": 2, "ː": 2, "ˑ": 2, "˒": 2, "˓": 2, "˔": 2, "˕": 2, "˖": 2, "˗": 2, "˘": 2, "˙": 2, "˚": 2, "˛": 2, "˜": 2, "˝": 2, "˞": 2, "˟": 2, "ˠ": 2, "ˡ": 2, "ˢ": 2, "ˣ": 2, "ˤ": 2, "˥": 2, "˦": 2, "˧": 2, "˨": 2, "˩": 2, "˪": 2, "˫": 2, "ˬ": 2, "˭": 2, "ˮ": 2, "˯": 2, "˰": 2, "˱": 2, "˲": 2, "˳": 2, "˴": 2, "˵": 2, "˶": 2, "˷": 2, "˸": 2, "˹": 2, "˺": 2, "˻": 2, "˼": 2, "˽": 2, "˾": 2, "˿": 2, "̀": 2, "́": 2, "̂": 2, "̃": 2, "̄": 2, "̅": 2, "̆": 2, "̇": 2, "̈": 2, "̉": 2, "̊": 2, "̋": 2, "̌": 2, "̍": 2, "̎": 2, "̏": 2, "̐": 2, "̑": 2, "̒": 2, "̓": 2, "̔": 2, "̕": 2, "̖": 2, "̗": 2, "̘": 2, "̙": 2, "̚": 2, "̛": 2, "̜": 2, "̝": 2, "̞": 2, "̟": 2, "̠": 2, "̡": 2, "̢": 2, "̣": 2, "̤": 2, "̥": 2, "̦": 2, "̧": 2, "̨": 2, "̩": 2, "̪": 2, "̫": 2, "̬": 2, "̭": 2, "̮": 2, "̯": 2, "̰": 2, "̱": 2, "̲": 2, "̳": 2, "̴": 2, "̵": 2, "̶": 2, "̷": 2, "̸": 2, "̹": 2, "̺": 2, "̻": 2, "̼": 2, "̽": 2, "̾": 2, "̿": 2, "̀": 2, "́": 2, "͂": 2, "̓": 2, "̈́": 2, "ͅ": 2, "͆": 2, "͇": 2, "͈": 2, "͉": 2, "͊": 2, "͋": 2, "͌": 2, "͍": 2, "͎": 2, "͏": 2, "͐": 2, "͑": 2, "͒": 2, "͓": 2, "͔": 2, "͕": 2, "͖": 2, "͗": 2, "͘": 2, "͙": 2, "͚": 2, "͛": 2, "͜": 2, "͝": 2, "͞": 2, "͟": 2, "͠": 2, "͡": 2, "͢": 2, "ͣ": 2, "ͤ": 2, "ͥ": 2, "ͦ": 2, "ͧ": 2, "ͨ": 2, "ͩ": 2, "ͪ": 2, "ͫ": 2, "ͬ": 2, "ͭ": 2, "ͮ": 2, "ͯ": 2, "Ͱ": 2, "ͱ": 2, "Ͳ": 2, "ͳ": 2, "ʹ": 2, "͵": 2, "Ͷ": 2, "ͷ": 2, "͸": 2, "͹": 2, "ͺ": 2, "ͻ": 2, "ͼ": 2, "ͽ": 2, ";": 2, "Ϳ": 2, "΀": 2, "΁": 2, "΂": 2, "΃": 2, "΄": 2, "΅": 2, "Ά": 2, "·": 2, "Έ": 2, "Ή": 2, "Ί": 2, "΋": 2, "Ό": 2, "΍": 2, "Ύ": 2, "Ώ": 2, "ΐ": 2, "Α": 2, "Β": 2, "Γ": 2, "Δ": 2, "Ε": 2, "Ζ": 2, "Η": 2, "Θ": 2, "Ι": 2, "Κ": 2, "Λ": 2, "Μ": 2, "Ν": 2, "Ξ": 2, "Ο": 2, "Π": 2, "Ρ": 2, "΢": 2, "Σ": 2, "Τ": 2, "Υ": 2, "Φ": 2, "Χ": 2, "Ψ": 2, "Ω": 2, "Ϊ": 2, "Ϋ": 2, "ά": 2, "έ": 2, "ή": 2, "ί": 2, "ΰ": 2, "α": 2, "β": 2, "γ": 2, "δ": 2, "ε": 2, "ζ": 2, "η": 2, "θ": 2, "ι": 2, "κ": 2, "λ": 2, "μ": 2, "ν": 2, "ξ": 2, "ο": 2, "π": 2, "ρ": 2, "ς": 2, "σ": 2, "τ": 2, "υ": 2, "φ": 2, "χ": 2, "ψ": 2, "ω": 2, "ϊ": 2, "ϋ": 2, "ό": 2, "ύ": 2, "ώ": 2, "Ϗ": 2, "ϐ": 2, "ϑ": 2, "ϒ": 2, "ϓ": 2, "ϔ": 2, "ϕ": 2, "ϖ": 2, "ϗ": 2, "Ϙ": 2, "ϙ": 2, "Ϛ": 2, "ϛ": 2, "Ϝ": 2, "ϝ": 2, "Ϟ": 2, "ϟ": 2, "Ϡ": 2, "ϡ": 2, "Ϣ": 2, "ϣ": 2, "Ϥ": 2, "ϥ": 2, "Ϧ": 2, "ϧ": 2, "Ϩ": 2, "ϩ": 2, "Ϫ": 2, "ϫ": 2, "Ϭ": 2, "ϭ": 2, "Ϯ": 2, "ϯ": 2, "ϰ": 2, "ϱ": 2, "ϲ": 2, "ϳ": 2, "ϴ": 2, "ϵ": 2, "϶": 2, "Ϸ": 2, "ϸ": 2, "Ϲ": 2, "Ϻ": 2, "ϻ": 2, "ϼ": 2, "Ͻ": 2, "Ͼ": 2, "Ͽ": 2, "Ѐ": 2, "Ё": 2, "Ђ": 2, "Ѓ": 2, "Є": 2, "Ѕ": 2, "І": 2, "Ї": 2, "Ј": 2, "Љ": 2, "Њ": 2, "Ћ": 2, "Ќ": 2, "Ѝ": 2, "Ў": 2, "Џ": 2, "А": 2, "Б": 2, "В": 2, "Г": 2, "Д": 2, "Е": 2, "Ж": 2, "З": 2, "И": 2, "Й": 2, "К": 2, "Л": 2, "М": 2, "Н": 2, "О": 2, "П": 2, "Р": 2, "С": 2, "Т": 2, "У": 2, "Ф": 2, "Х": 2, "Ц": 2, "Ч": 2 } } ================================================ FILE: examples/benchmarks/mps_mpo_L100_chi64_D5.json ================================================ { "inputs": [ [ "a", "b" ], [ "a", "c", "d" ], [ "c", "e", "f" ], [ "e", "g", "h" ], [ "g", "i", "j" ], [ "i", "k", "l" ], [ "k", "m", "n" ], [ "m", "o", "p" ], [ "o", "q", "r" ], [ "q", "s", "t" ], [ "s", "u", "v" ], [ "u", "w", "x" ], [ "w", "y", "z" ], [ "y", "A", "B" ], [ "A", "C", "D" ], [ "C", "E", "F" ], [ "E", "G", "H" ], [ "G", "I", "J" ], [ "I", "K", "L" ], [ "K", "M", "N" ], [ "M", "O", "P" ], [ "O", "Q", "R" ], [ "Q", "S", "T" ], [ "S", "U", "V" ], [ "U", "W", "X" ], [ "W", "Y", "Z" ], [ "Y", "À", "Á" ], [ "À", "Â", "Ã" ], [ "Â", "Ä", "Å" ], [ "Ä", "Æ", "Ç" ], [ "Æ", "È", "É" ], [ "È", "Ê", "Ë" ], [ "Ê", "Ì", "Í" ], [ "Ì", "Î", "Ï" ], [ "Î", "Ð", "Ñ" ], [ "Ð", "Ò", "Ó" ], [ "Ò", "Ô", "Õ" ], [ "Ô", "Ö", "×" ], [ "Ö", "Ø", "Ù" ], [ "Ø", "Ú", "Û" ], [ "Ú", "Ü", "Ý" ], [ "Ü", "Þ", "ß" ], [ "Þ", "à", "á" ], [ "à", "â", "ã" ], [ "â", "ä", "å" ], [ "ä", "æ", "ç" ], [ "æ", "è", "é" ], [ "è", "ê", "ë" ], [ "ê", "ì", "í" ], [ "ì", "î", "ï" ], [ "î", "ð", "ñ" ], [ "ð", "ò", "ó" ], [ "ò", "ô", "õ" ], [ "ô", "ö", "÷" ], [ "ö", "ø", "ù" ], [ "ø", "ú", "û" ], [ "ú", "ü", "ý" ], [ "ü", "þ", "ÿ" ], [ "þ", "Ā", "ā" ], [ "Ā", "Ă", "ă" ], [ "Ă", "Ą", "ą" ], [ "Ą", "Ć", "ć" ], [ "Ć", "Ĉ", "ĉ" ], [ "Ĉ", "Ċ", "ċ" ], [ "Ċ", "Č", "č" ], [ "Č", "Ď", "ď" ], [ "Ď", "Đ", "đ" ], [ "Đ", "Ē", "ē" ], [ "Ē", "Ĕ", "ĕ" ], [ "Ĕ", "Ė", "ė" ], [ "Ė", "Ę", "ę" ], [ "Ę", "Ě", "ě" ], [ "Ě", "Ĝ", "ĝ" ], [ "Ĝ", "Ğ", "ğ" ], [ "Ğ", "Ġ", "ġ" ], [ "Ġ", "Ģ", "ģ" ], [ "Ģ", "Ĥ", "ĥ" ], [ "Ĥ", "Ħ", "ħ" ], [ "Ħ", "Ĩ", "ĩ" ], [ "Ĩ", "Ī", "ī" ], [ "Ī", "Ĭ", "ĭ" ], [ "Ĭ", "Į", "į" ], [ "Į", "İ", "ı" ], [ "İ", "IJ", "ij" ], [ "IJ", "Ĵ", "ĵ" ], [ "Ĵ", "Ķ", "ķ" ], [ "Ķ", "ĸ", "Ĺ" ], [ "ĸ", "ĺ", "Ļ" ], [ "ĺ", "ļ", "Ľ" ], [ "ļ", "ľ", "Ŀ" ], [ "ľ", "ŀ", "Ł" ], [ "ŀ", "ł", "Ń" ], [ "ł", "ń", "Ņ" ], [ "ń", "ņ", "Ň" ], [ "ņ", "ň", "ʼn" ], [ "ň", "Ŋ", "ŋ" ], [ "Ŋ", "Ō", "ō" ], [ "Ō", "Ŏ", "ŏ" ], [ "Ŏ", "Ő", "ő" ], [ "Ő", "Œ" ], [ "œ", "b" ], [ "œ", "Ŕ", "d" ], [ "Ŕ", "ŕ", "f" ], [ "ŕ", "Ŗ", "h" ], [ "Ŗ", "ŗ", "j" ], [ "ŗ", "Ř", "l" ], [ "Ř", "ř", "n" ], [ "ř", "Ś", "p" ], [ "Ś", "ś", "r" ], [ "ś", "Ŝ", "t" ], [ "Ŝ", "ŝ", "v" ], [ "ŝ", "Ş", "x" ], [ "Ş", "ş", "z" ], [ "ş", "Š", "B" ], [ "Š", "š", "D" ], [ "š", "Ţ", "F" ], [ "Ţ", "ţ", "H" ], [ "ţ", "Ť", "J" ], [ "Ť", "ť", "L" ], [ "ť", "Ŧ", "N" ], [ "Ŧ", "ŧ", "P" ], [ "ŧ", "Ũ", "R" ], [ "Ũ", "ũ", "T" ], [ "ũ", "Ū", "V" ], [ "Ū", "ū", "X" ], [ "ū", "Ŭ", "Z" ], [ "Ŭ", "ŭ", "Á" ], [ "ŭ", "Ů", "Ã" ], [ "Ů", "ů", "Å" ], [ "ů", "Ű", "Ç" ], [ "Ű", "ű", "É" ], [ "ű", "Ų", "Ë" ], [ "Ų", "ų", "Í" ], [ "ų", "Ŵ", "Ï" ], [ "Ŵ", "ŵ", "Ñ" ], [ "ŵ", "Ŷ", "Ó" ], [ "Ŷ", "ŷ", "Õ" ], [ "ŷ", "Ÿ", "×" ], [ "Ÿ", "Ź", "Ù" ], [ "Ź", "ź", "Û" ], [ "ź", "Ż", "Ý" ], [ "Ż", "ż", "ß" ], [ "ż", "Ž", "á" ], [ "Ž", "ž", "ã" ], [ "ž", "ſ", "å" ], [ "ſ", "ƀ", "ç" ], [ "ƀ", "Ɓ", "é" ], [ "Ɓ", "Ƃ", "ë" ], [ "Ƃ", "ƃ", "í" ], [ "ƃ", "Ƅ", "ï" ], [ "Ƅ", "ƅ", "ñ" ], [ "ƅ", "Ɔ", "ó" ], [ "Ɔ", "Ƈ", "õ" ], [ "Ƈ", "ƈ", "÷" ], [ "ƈ", "Ɖ", "ù" ], [ "Ɖ", "Ɗ", "û" ], [ "Ɗ", "Ƌ", "ý" ], [ "Ƌ", "ƌ", "ÿ" ], [ "ƌ", "ƍ", "ā" ], [ "ƍ", "Ǝ", "ă" ], [ "Ǝ", "Ə", "ą" ], [ "Ə", "Ɛ", "ć" ], [ "Ɛ", "Ƒ", "ĉ" ], [ "Ƒ", "ƒ", "ċ" ], [ "ƒ", "Ɠ", "č" ], [ "Ɠ", "Ɣ", "ď" ], [ "Ɣ", "ƕ", "đ" ], [ "ƕ", "Ɩ", "ē" ], [ "Ɩ", "Ɨ", "ĕ" ], [ "Ɨ", "Ƙ", "ė" ], [ "Ƙ", "ƙ", "ę" ], [ "ƙ", "ƚ", "ě" ], [ "ƚ", "ƛ", "ĝ" ], [ "ƛ", "Ɯ", "ğ" ], [ "Ɯ", "Ɲ", "ġ" ], [ "Ɲ", "ƞ", "ģ" ], [ "ƞ", "Ɵ", "ĥ" ], [ "Ɵ", "Ơ", "ħ" ], [ "Ơ", "ơ", "ĩ" ], [ "ơ", "Ƣ", "ī" ], [ "Ƣ", "ƣ", "ĭ" ], [ "ƣ", "Ƥ", "į" ], [ "Ƥ", "ƥ", "ı" ], [ "ƥ", "Ʀ", "ij" ], [ "Ʀ", "Ƨ", "ĵ" ], [ "Ƨ", "ƨ", "ķ" ], [ "ƨ", "Ʃ", "Ĺ" ], [ "Ʃ", "ƪ", "Ļ" ], [ "ƪ", "ƫ", "Ľ" ], [ "ƫ", "Ƭ", "Ŀ" ], [ "Ƭ", "ƭ", "Ł" ], [ "ƭ", "Ʈ", "Ń" ], [ "Ʈ", "Ư", "Ņ" ], [ "Ư", "ư", "Ň" ], [ "ư", "Ʊ", "ʼn" ], [ "Ʊ", "Ʋ", "ŋ" ], [ "Ʋ", "Ƴ", "ō" ], [ "Ƴ", "ƴ", "ŏ" ], [ "ƴ", "Ƶ", "ő" ], [ "Ƶ", "Œ" ] ], "output": [], "size_dict": { "a": 64, "b": 2, "c": 64, "d": 2, "e": 64, "f": 2, "g": 64, "h": 2, "i": 64, "j": 2, "k": 64, "l": 2, "m": 64, "n": 2, "o": 64, "p": 2, "q": 64, "r": 2, "s": 64, "t": 2, "u": 64, "v": 2, "w": 64, "x": 2, "y": 64, "z": 2, "A": 64, "B": 2, "C": 64, "D": 2, "E": 64, "F": 2, "G": 64, "H": 2, "I": 64, "J": 2, "K": 64, "L": 2, "M": 64, "N": 2, "O": 64, "P": 2, "Q": 64, "R": 2, "S": 64, "T": 2, "U": 64, "V": 2, "W": 64, "X": 2, "Y": 64, "Z": 2, "À": 64, "Á": 2, "Â": 64, "Ã": 2, "Ä": 64, "Å": 2, "Æ": 64, "Ç": 2, "È": 64, "É": 2, "Ê": 64, "Ë": 2, "Ì": 64, "Í": 2, "Î": 64, "Ï": 2, "Ð": 64, "Ñ": 2, "Ò": 64, "Ó": 2, "Ô": 64, "Õ": 2, "Ö": 64, "×": 2, "Ø": 64, "Ù": 2, "Ú": 64, "Û": 2, "Ü": 64, "Ý": 2, "Þ": 64, "ß": 2, "à": 64, "á": 2, "â": 64, "ã": 2, "ä": 64, "å": 2, "æ": 64, "ç": 2, "è": 64, "é": 2, "ê": 64, "ë": 2, "ì": 64, "í": 2, "î": 64, "ï": 2, "ð": 64, "ñ": 2, "ò": 64, "ó": 2, "ô": 64, "õ": 2, "ö": 64, "÷": 2, "ø": 64, "ù": 2, "ú": 64, "û": 2, "ü": 64, "ý": 2, "þ": 64, "ÿ": 2, "Ā": 64, "ā": 2, "Ă": 64, "ă": 2, "Ą": 64, "ą": 2, "Ć": 64, "ć": 2, "Ĉ": 64, "ĉ": 2, "Ċ": 64, "ċ": 2, "Č": 64, "č": 2, "Ď": 64, "ď": 2, "Đ": 64, "đ": 2, "Ē": 64, "ē": 2, "Ĕ": 64, "ĕ": 2, "Ė": 64, "ė": 2, "Ę": 64, "ę": 2, "Ě": 64, "ě": 2, "Ĝ": 64, "ĝ": 2, "Ğ": 64, "ğ": 2, "Ġ": 64, "ġ": 2, "Ģ": 64, "ģ": 2, "Ĥ": 64, "ĥ": 2, "Ħ": 64, "ħ": 2, "Ĩ": 64, "ĩ": 2, "Ī": 64, "ī": 2, "Ĭ": 64, "ĭ": 2, "Į": 64, "į": 2, "İ": 64, "ı": 2, "IJ": 64, "ij": 2, "Ĵ": 64, "ĵ": 2, "Ķ": 64, "ķ": 2, "ĸ": 64, "Ĺ": 2, "ĺ": 64, "Ļ": 2, "ļ": 64, "Ľ": 2, "ľ": 64, "Ŀ": 2, "ŀ": 64, "Ł": 2, "ł": 64, "Ń": 2, "ń": 64, "Ņ": 2, "ņ": 64, "Ň": 2, "ň": 64, "ʼn": 2, "Ŋ": 64, "ŋ": 2, "Ō": 64, "ō": 2, "Ŏ": 64, "ŏ": 2, "Ő": 64, "ő": 2, "Œ": 2, "œ": 2, "Ŕ": 4, "ŕ": 8, "Ŗ": 16, "ŗ": 32, "Ř": 64, "ř": 64, "Ś": 64, "ś": 64, "Ŝ": 64, "ŝ": 64, "Ş": 64, "ş": 64, "Š": 64, "š": 64, "Ţ": 64, "ţ": 64, "Ť": 64, "ť": 64, "Ŧ": 64, "ŧ": 64, "Ũ": 64, "ũ": 64, "Ū": 64, "ū": 64, "Ŭ": 64, "ŭ": 64, "Ů": 64, "ů": 64, "Ű": 64, "ű": 64, "Ų": 64, "ų": 64, "Ŵ": 64, "ŵ": 64, "Ŷ": 64, "ŷ": 64, "Ÿ": 64, "Ź": 64, "ź": 64, "Ż": 64, "ż": 64, "Ž": 64, "ž": 64, "ſ": 64, "ƀ": 64, "Ɓ": 64, "Ƃ": 64, "ƃ": 64, "Ƅ": 64, "ƅ": 64, "Ɔ": 64, "Ƈ": 64, "ƈ": 64, "Ɖ": 64, "Ɗ": 64, "Ƌ": 64, "ƌ": 64, "ƍ": 64, "Ǝ": 64, "Ə": 64, "Ɛ": 64, "Ƒ": 64, "ƒ": 64, "Ɠ": 64, "Ɣ": 64, "ƕ": 64, "Ɩ": 64, "Ɨ": 64, "Ƙ": 64, "ƙ": 64, "ƚ": 64, "ƛ": 64, "Ɯ": 64, "Ɲ": 64, "ƞ": 64, "Ɵ": 64, "Ơ": 64, "ơ": 64, "Ƣ": 64, "ƣ": 64, "Ƥ": 64, "ƥ": 64, "Ʀ": 64, "Ƨ": 64, "ƨ": 64, "Ʃ": 64, "ƪ": 64, "ƫ": 64, "Ƭ": 64, "ƭ": 64, "Ʈ": 64, "Ư": 64, "ư": 64, "Ʊ": 32, "Ʋ": 16, "Ƴ": 8, "ƴ": 4, "Ƶ": 2 } } ================================================ FILE: examples/benchmarks/peps_cluster_r2_D10_a.json ================================================ { "inputs": [ [ "a", "b", "c", "d", "e" ], [ "f", "g", "h", "b", "i" ], [ "j", "k", "l", "g", "m" ], [ "n", "o", "f", "p", "q" ], [ "r", "p", "a", "s", "t" ], [ "u", "v", "j", "o", "w" ], [ "x", "d", "y", "z", "A" ], [ "B", "s", "x", "C", "D" ], [ "E", "F", "r", "G", "H" ], [ "I", "J", "n", "F", "K" ], [ "h", "L", "M", "N" ], [ "c", "M", "O", "P" ], [ "l", "Q", "L", "R" ], [ "y", "O", "S", "T" ], [ "U", "z", "V", "W" ], [ "X", "Y", "k", "Z" ], [ "À", "Á", "Â", "Ã", "e" ], [ "Ä", "Å", "Æ", "Á", "i" ], [ "Ç", "È", "É", "Å", "m" ], [ "Ê", "Ë", "Ä", "Ì", "q" ], [ "Í", "Ì", "À", "Î", "t" ], [ "u", "v", "Ç", "Ë", "w" ], [ "Ï", "Ã", "Ð", "Ñ", "A" ], [ "B", "Î", "Ï", "C", "D" ], [ "E", "Ò", "Í", "G", "H" ], [ "I", "J", "Ê", "Ò", "K" ], [ "Æ", "Ó", "Ô", "N" ], [ "Â", "Ô", "Õ", "P" ], [ "É", "Q", "Ó", "R" ], [ "Ð", "Õ", "S", "T" ], [ "U", "Ñ", "V", "W" ], [ "X", "Y", "È", "Z" ] ], "output": [], "size_dict": { "a": 10, "b": 10, "c": 10, "d": 10, "e": 2, "f": 10, "g": 10, "h": 10, "i": 2, "j": 10, "k": 10, "l": 10, "m": 2, "n": 10, "o": 10, "p": 10, "q": 2, "r": 10, "s": 10, "t": 2, "u": 10, "v": 10, "w": 2, "x": 10, "y": 10, "z": 10, "A": 2, "B": 10, "C": 10, "D": 2, "E": 10, "F": 10, "G": 10, "H": 2, "I": 10, "J": 10, "K": 2, "L": 10, "M": 10, "N": 2, "O": 10, "P": 2, "Q": 10, "R": 2, "S": 10, "T": 2, "U": 10, "V": 10, "W": 2, "X": 10, "Y": 10, "Z": 2, "À": 10, "Á": 10, "Â": 10, "Ã": 10, "Ä": 10, "Å": 10, "Æ": 10, "Ç": 10, "È": 10, "É": 10, "Ê": 10, "Ë": 10, "Ì": 10, "Í": 10, "Î": 10, "Ï": 10, "Ð": 10, "Ñ": 10, "Ò": 10, "Ó": 10, "Ô": 10, "Õ": 10 } } ================================================ FILE: examples/benchmarks/qucirc_rrzz_n56_d13.json ================================================ { "inputs": [ [ "a", "b" ], [ "c", "d" ], [ "e", "f" ], [ "g", "h" ], [ "i", "j" ], [ "i", "k" ], [ "l", "m" ], [ "n", "o" ], [ "p", "q" ], [ "r", "s" ], [ "t", "u" ], [ "v", "w" ], [ "v", "x" ], [ "y", "z" ], [ "A", "B" ], [ "f", "C" ], [ "D", "E" ], [ "F", "G" ], [ "E", "H" ], [ "I", "J" ], [ "I", "K" ], [ "L", "M" ], [ "N", "O" ], [ "P", "Q" ], [ "R", "S" ], [ "T", "U" ], [ "T", "V" ], [ "W", "X" ], [ "W", "Y" ], [ "d", "Z" ], [ "À", "Á" ], [ "Â", "Ã" ], [ "Â", "Ä" ], [ "b", "Å" ], [ "S", "Æ" ], [ "Ç", "È" ], [ "Ç", "É" ], [ "h", "Ê" ], [ "Ë", "Ì" ], [ "w", "Í" ], [ "Î", "Ï" ], [ "Ð", "Ñ" ], [ "Ð", "Ò" ], [ "s", "Ó" ], [ "Ô", "Õ" ], [ "Ô", "a" ], [ "Ö", "×" ], [ "Ö", "c" ], [ "Ø", "Ù" ], [ "Ø", "e" ], [ "Ú", "Û" ], [ "Ú", "g" ], [ "k", "Ü" ], [ "k", "Ý" ], [ "Þ", "ß" ], [ "Þ", "l" ], [ "à", "á" ], [ "à", "n" ], [ "â", "ã" ], [ "â", "p" ], [ "ä", "å" ], [ "ä", "r" ], [ "æ", "ç" ], [ "æ", "t" ], [ "x", "è" ], [ "x", "é" ], [ "ß", "y" ], [ "ß", "ê" ], [ "ë", "ì" ], [ "ë", "A" ], [ "C", "í" ], [ "C", "î" ], [ "ï", "ð" ], [ "ï", "D" ], [ "ç", "ñ" ], [ "ç", "F" ], [ "H", "ò" ], [ "H", "ó" ], [ "K", "ô" ], [ "ò", "L" ], [ "ð", "N" ], [ "õ", "ö" ], [ "õ", "P" ], [ "å", "R" ], [ "å", "÷" ], [ "Õ", "ø" ], [ "Õ", "q" ], [ "V", "ù" ], [ "V", "ú" ], [ "Y", "û" ], [ "Y", "ü" ], [ "Z", "ý" ], [ "Z", "þ" ], [ "ì", "À" ], [ "Ä", "ÿ" ], [ "Ä", "Ā" ], [ "Å", "ā" ], [ "Æ", "Ă" ], [ "Æ", "ă" ], [ "É", "Ą" ], [ "É", "ą" ], [ "Ą", "Ć" ], [ "Ą", "o" ], [ "Ê", "ć" ], [ "í", "B" ], [ "ÿ", "u" ], [ "è", "Ë" ], [ "è", "Ĉ" ], [ "ö", "ĉ" ], [ "ö", "Ì" ], [ "Í", "Ċ" ], [ "Ü", "X" ], [ "Ù", "ċ" ], [ "Ù", "Î" ], [ "Û", "z" ], [ "Ă", "O" ], [ "×", "Ï" ], [ "ć", "J" ], [ "ã", "Ã" ], [ "Ċ", "Á" ], [ "ù", "Č" ], [ "ù", "È" ], [ "Ò", "č" ], [ "ā", "Q" ], [ "ý", "U" ], [ "Ó", "Ď" ], [ "Ď", "M" ], [ "č", "G" ], [ "û", "m" ], [ "ô", "j" ], [ "á", "Ñ" ], [ "ď", "Đ" ], [ "ď", "Ô" ], [ "đ", "Ē" ], [ "đ", "Ö" ], [ "ē", "Ĕ" ], [ "ē", "Ø" ], [ "ĕ", "Ė" ], [ "ĕ", "Ú" ], [ "Ý", "ė" ], [ "Ý", "Ę" ], [ "ę", "Ě" ], [ "ę", "Þ" ], [ "ě", "Ĝ" ], [ "ě", "à" ], [ "Ĕ", "â" ], [ "Ĕ", "ĝ" ], [ "Đ", "ä" ], [ "Đ", "Ğ" ], [ "ğ", "Ġ" ], [ "ğ", "æ" ], [ "é", "ġ" ], [ "é", "Ģ" ], [ "ê", "ģ" ], [ "ê", "Ĥ" ], [ "ĥ", "Ħ" ], [ "ĥ", "ë" ], [ "î", "ħ" ], [ "î", "Ĩ" ], [ "ħ", "ï" ], [ "ñ", "ĩ" ], [ "ñ", "Ī" ], [ "ó", "ī" ], [ "Ĝ", "Ĭ" ], [ "Ĝ", "K" ], [ "Ē", "ĭ" ], [ "Ē", "ò" ], [ "ė", "ð" ], [ "Į", "į" ], [ "Į", "õ" ], [ "÷", "İ" ], [ "ø", "ı" ], [ "ú", "IJ" ], [ "ú", "ij" ], [ "ü", "Ĵ" ], [ "ü", "ĵ" ], [ "þ", "Ķ" ], [ "Ġ", "ì" ], [ "Ā", "ķ" ], [ "ģ", "ĸ" ], [ "ģ", "Å" ], [ "ă", "Ĺ" ], [ "ă", "ĺ" ], [ "ą", "Ļ" ], [ "Ć", "ļ" ], [ "ı", "Ê" ], [ "ī", "Ľ" ], [ "ī", "í" ], [ "ġ", "ÿ" ], [ "Ĉ", "ľ" ], [ "ĉ", "Ŀ" ], [ "ĉ", "ŀ" ], [ "Ħ", "Ł" ], [ "Ħ", "Í" ], [ "ķ", "Ü" ], [ "ċ", "ł" ], [ "ĩ", "Ń" ], [ "ĩ", "Û" ], [ "Ĵ", "ń" ], [ "Ĵ", "Ă" ], [ "į", "Ņ" ], [ "į", "×" ], [ "Ŀ", "ņ" ], [ "Ŀ", "ć" ], [ "Ļ", "ã" ], [ "ļ", "Ċ" ], [ "Č", "Ň" ], [ "Ķ", "Ò" ], [ "Ė", "ā" ], [ "ľ", "ý" ], [ "Ě", "ň" ], [ "Ě", "Ó" ], [ "Ň", "Ď" ], [ "IJ", "č" ], [ "İ", "û" ], [ "Ĺ", "ô" ], [ "ł", "á" ], [ "ʼn", "Ŋ" ], [ "ʼn", "ď" ], [ "ŋ", "Ō" ], [ "ŋ", "đ" ], [ "ō", "Ŏ" ], [ "ō", "ē" ], [ "ŏ", "Ő" ], [ "ŏ", "ĕ" ], [ "Ę", "ő" ], [ "Ę", "Œ" ], [ "œ", "Ŕ" ], [ "œ", "ę" ], [ "ŕ", "Ŗ" ], [ "ŕ", "ě" ], [ "ĝ", "ŗ" ], [ "ĝ", "Ř" ], [ "Ğ", "ř" ], [ "Ś", "ś" ], [ "Ś", "ğ" ], [ "Ģ", "Ŝ" ], [ "Ģ", "ŝ" ], [ "Ĥ", "Ş" ], [ "Ĥ", "ş" ], [ "Ŋ", "ĥ" ], [ "Ŋ", "Š" ], [ "Ĩ", "š" ], [ "Ŕ", "Ţ" ], [ "Ŕ", "ħ" ], [ "Ī", "ţ" ], [ "Ő", "Ť" ], [ "Ő", "ó" ], [ "Ĭ", "ť" ], [ "Ĭ", "Ŧ" ], [ "ĭ", "ŧ" ], [ "ĭ", "Ũ" ], [ "š", "ũ" ], [ "š", "ė" ], [ "ś", "Į" ], [ "ś", "Ū" ], [ "ţ", "÷" ], [ "Ŝ", "ø" ], [ "ij", "ū" ], [ "ĵ", "Ŭ" ], [ "ĵ", "ŭ" ], [ "ŧ", "Ů" ], [ "ŧ", "þ" ], [ "ť", "Ġ" ], [ "Ŭ", "ů" ], [ "Ŭ", "Ā" ], [ "ĸ", "Ű" ], [ "ĺ", "ű" ], [ "ĺ", "Ų" ], [ "Ş", "ą" ], [ "ő", "Ć" ], [ "ř", "ų" ], [ "ř", "ı" ], [ "Ľ", "Ŵ" ], [ "ű", "ŵ" ], [ "ű", "ġ" ], [ "Ō", "Ĉ" ], [ "ŀ", "Ŷ" ], [ "Ł", "ŷ" ], [ "ŗ", "Ÿ" ], [ "ŗ", "ķ" ], [ "Ŷ", "ċ" ], [ "Ń", "Ź" ], [ "ń", "ź" ], [ "Ņ", "Ż" ], [ "Ņ", "ż" ], [ "ņ", "Ž" ], [ "ņ", "ž" ], [ "Ž", "Ļ" ], [ "Ż", "ļ" ], [ "ź", "Č" ], [ "ū", "ſ" ], [ "ū", "Ķ" ], [ "Ŏ", "Ė" ], [ "Ŵ", "ľ" ], [ "ň", "ƀ" ], [ "Ŗ", "Ň" ], [ "ŷ", "IJ" ], [ "Ű", "İ" ], [ "Ź", "Ĺ" ], [ "ƀ", "ł" ], [ "Ɓ", "Ƃ" ], [ "Ɓ", "ʼn" ], [ "ƃ", "Ƅ" ], [ "ƃ", "ŋ" ], [ "ƅ", "Ɔ" ], [ "ƅ", "ō" ], [ "Ƈ", "ƈ" ], [ "Ƈ", "ŏ" ], [ "Œ", "Ɖ" ], [ "Œ", "Ɗ" ], [ "Ƌ", "ƌ" ], [ "Ƌ", "œ" ], [ "ƍ", "Ǝ" ], [ "ƍ", "ŕ" ], [ "Ř", "Ə" ], [ "Ř", "Ɛ" ], [ "Ə", "Ƒ" ], [ "Ə", "Ğ" ], [ "ƒ", "Ɠ" ], [ "ƒ", "Ś" ], [ "ŝ", "Ɣ" ], [ "ŝ", "ƕ" ], [ "ş", "Ɩ" ], [ "ş", "Ɨ" ], [ "Š", "Ƙ" ], [ "Š", "ƙ" ], [ "Ƃ", "Ĩ" ], [ "Ţ", "ƚ" ], [ "ƚ", "ƛ" ], [ "ƚ", "Ī" ], [ "Ť", "Ɯ" ], [ "Ť", "Ɲ" ], [ "Ŧ", "ƞ" ], [ "Ŧ", "Ɵ" ], [ "Ũ", "Ơ" ], [ "Ũ", "ơ" ], [ "ũ", "Ƣ" ], [ "ũ", "ƣ" ], [ "Ū", "Ƥ" ], [ "Ɠ", "ƥ" ], [ "Ɠ", "ţ" ], [ "Ơ", "Ʀ" ], [ "Ơ", "Ŝ" ], [ "Ɩ", "ij" ], [ "ŭ", "Ƨ" ], [ "Ů", "ƨ" ], [ "Ů", "Ʃ" ], [ "Ɔ", "ť" ], [ "ů", "ƪ" ], [ "Ǝ", "ĸ" ], [ "Ų", "ƫ" ], [ "ƈ", "Ƭ" ], [ "ƈ", "Ş" ], [ "ƨ", "ƭ" ], [ "ƨ", "ő" ], [ "ų", "Ʈ" ], [ "ƪ", "Ľ" ], [ "ŵ", "Ư" ], [ "Ƥ", "Ō" ], [ "Ɖ", "ư" ], [ "Ɖ", "ŀ" ], [ "Ʈ", "Ʊ" ], [ "Ʈ", "Ł" ], [ "Ÿ", "Ʋ" ], [ "Ÿ", "Ƴ" ], [ "Ɯ", "Ŷ" ], [ "Ʋ", "ƴ" ], [ "Ʋ", "Ń" ], [ "ƌ", "Ƶ" ], [ "ƌ", "ń" ], [ "ż", "ƶ" ], [ "ž", "Ʒ" ], [ "Ƅ", "Ž" ], [ "Ƨ", "Ż" ], [ "ƫ", "ź" ], [ "ſ", "Ƹ" ], [ "ſ", "ƹ" ], [ "Ƙ", "Ŏ" ], [ "Ʒ", "Ŵ" ], [ "Ƣ", "ň" ], [ "Ƹ", "Ŗ" ], [ "ƶ", "ŷ" ], [ "Ư", "Ű" ], [ "Ɣ", "Ź" ], [ "ƞ", "ƀ" ], [ "ƺ", "ƻ" ], [ "ƺ", "Ɓ" ], [ "Ƽ", "ƽ" ], [ "Ƽ", "ƃ" ], [ "ƾ", "ƿ" ], [ "ƾ", "ƅ" ], [ "ǀ", "ǁ" ], [ "ǀ", "Ƈ" ], [ "Ɗ", "ǂ" ], [ "Ɗ", "ǃ" ], [ "DŽ", "Dž" ], [ "DŽ", "Ƌ" ], [ "ǁ", "ƍ" ], [ "ǁ", "dž" ], [ "Ɛ", "LJ" ], [ "Ɛ", "Lj" ], [ "Ƒ", "lj" ], [ "Ƒ", "NJ" ], [ "Nj", "nj" ], [ "Nj", "ƒ" ], [ "ƕ", "Ǎ" ], [ "Ɨ", "ǎ" ], [ "ƙ", "Ǐ" ], [ "ǎ", "ǐ" ], [ "ǎ", "Ƃ" ], [ "LJ", "Ǒ" ], [ "LJ", "Ţ" ], [ "ƛ", "ǒ" ], [ "ƛ", "Ǔ" ], [ "Ɲ", "ǔ" ], [ "Ɵ", "Ǖ" ], [ "Ɵ", "ǖ" ], [ "ơ", "Ǘ" ], [ "ơ", "ǘ" ], [ "ƣ", "Ǚ" ], [ "ƣ", "ǚ" ], [ "ƻ", "Ǜ" ], [ "ƻ", "Ū" ], [ "ƥ", "ǜ" ], [ "Ʀ", "ǝ" ], [ "ƽ", "Ǟ" ], [ "ƽ", "Ɩ" ], [ "nj", "ŭ" ], [ "Ʃ", "ǟ" ], [ "Ʃ", "Ǡ" ], [ "Dž", "Ɔ" ], [ "ƿ", "ǡ" ], [ "ƿ", "ů" ], [ "Ǐ", "Ǝ" ], [ "ǂ", "Ǣ" ], [ "ǂ", "Ų" ], [ "Ƭ", "ǣ" ], [ "Ƭ", "Ǥ" ], [ "ƭ", "ǥ" ], [ "ƭ", "Ǧ" ], [ "Ǎ", "ǧ" ], [ "Ǎ", "ų" ], [ "Ǚ", "Ǩ" ], [ "Ǚ", "ƪ" ], [ "ǣ", "ŵ" ], [ "ǒ", "Ƥ" ], [ "ư", "ǩ" ], [ "Ʊ", "Ǫ" ], [ "Ƴ", "ǫ" ], [ "ǟ", "Ǭ" ], [ "ǟ", "Ɯ" ], [ "ƴ", "ǭ" ], [ "ƴ", "Ǯ" ], [ "Ƶ", "ǯ" ], [ "Ƶ", "ǰ" ], [ "ǩ", "ż" ], [ "Ǫ", "ž" ], [ "Ǖ", "Ƅ" ], [ "ǔ", "Ƨ" ], [ "lj", "ƫ" ], [ "ƹ", "DZ" ], [ "Ǘ", "Ƙ" ], [ "DZ", "Ʒ" ], [ "ǭ", "Ƣ" ], [ "ǜ", "Ƹ" ], [ "ǥ", "ƶ" ], [ "ǝ", "Ư" ], [ "ǫ", "Ɣ" ], [ "ǯ", "ƞ" ], [ "Dz", "dz" ], [ "Dz", "ƺ" ], [ "Ǵ", "ǵ" ], [ "Ǵ", "Ƽ" ], [ "Ƕ", "Ƿ" ], [ "Ƕ", "ƾ" ], [ "Ǹ", "ǹ" ], [ "Ǹ", "ǀ" ], [ "ǃ", "Ǻ" ], [ "ǃ", "ǻ" ], [ "Ǽ", "ǽ" ], [ "Ǽ", "DŽ" ], [ "dž", "Ǿ" ], [ "dž", "ǿ" ], [ "Lj", "Ȁ" ], [ "Lj", "ȁ" ], [ "NJ", "Ȃ" ], [ "ȃ", "Ȅ" ], [ "ȃ", "Nj" ], [ "ǽ", "ȅ" ], [ "ǽ", "ƕ" ], [ "ǵ", "Ȇ" ], [ "ǵ", "Ɨ" ], [ "Ǿ", "ȇ" ], [ "Ǿ", "ƙ" ], [ "ǐ", "Ȉ" ], [ "Ǒ", "ȉ" ], [ "Ǒ", "Ȋ" ], [ "Ǔ", "ȋ" ], [ "Ǔ", "Ȍ" ], [ "Ȁ", "ȍ" ], [ "Ȁ", "Ɲ" ], [ "ǖ", "Ȏ" ], [ "ǖ", "ȏ" ], [ "ǘ", "Ȑ" ], [ "ǘ", "ȑ" ], [ "ǚ", "Ȓ" ], [ "ǚ", "ȓ" ], [ "Ǜ", "Ȕ" ], [ "ǹ", "ȕ" ], [ "ǹ", "ƥ" ], [ "ȉ", "Ʀ" ], [ "Ǟ", "Ȗ" ], [ "Ǟ", "ȗ" ], [ "Ȏ", "Ș" ], [ "Ȏ", "nj" ], [ "Ǡ", "ș" ], [ "Ȗ", "Dž" ], [ "ǡ", "Ț" ], [ "ǡ", "ț" ], [ "Ǻ", "Ǐ" ], [ "Ǣ", "Ȝ" ], [ "Ǣ", "ȝ" ], [ "Ǥ", "Ȟ" ], [ "Ǧ", "ȟ" ], [ "Ǧ", "Ƞ" ], [ "ǧ", "ȡ" ], [ "Ǩ", "Ȣ" ], [ "ș", "ǣ" ], [ "dz", "ǒ" ], [ "Ȉ", "ȣ" ], [ "Ȉ", "ư" ], [ "ȋ", "Ȥ" ], [ "ȋ", "Ʊ" ], [ "Ȃ", "Ƴ" ], [ "Ǭ", "ȥ" ], [ "Ǭ", "Ȧ" ], [ "Ǯ", "ȧ" ], [ "ǰ", "Ȩ" ], [ "ǰ", "ȩ" ], [ "ȡ", "ǩ" ], [ "Ȅ", "Ǫ" ], [ "Ȓ", "Ǖ" ], [ "Ȑ", "ǔ" ], [ "Ƿ", "Ȫ" ], [ "Ƿ", "lj" ], [ "Ȝ", "ƹ" ], [ "Ȩ", "Ǘ" ], [ "Ȕ", "DZ" ], [ "ȥ", "ǭ" ], [ "Ȟ", "ǜ" ], [ "Ț", "ǥ" ], [ "ȟ", "ǝ" ], [ "Ȣ", "ǫ" ], [ "ȧ", "ǯ" ], [ "ȫ", "Ȭ" ], [ "ȫ", "Dz" ], [ "ȭ", "Ȯ" ], [ "ȭ", "Ǵ" ], [ "ȯ", "Ȱ" ], [ "ȯ", "Ƕ" ], [ "Ȭ", "Ǹ" ], [ "Ȭ", "ȱ" ], [ "ǻ", "Ȳ" ], [ "ǻ", "ȳ" ], [ "ȴ", "ȵ" ], [ "ȴ", "Ǽ" ], [ "ǿ", "ȶ" ], [ "ǿ", "ȷ" ], [ "ȁ", "ȸ" ], [ "ȁ", "ȹ" ], [ "ȶ", "Ⱥ" ], [ "ȶ", "NJ" ], [ "Ȼ", "ȼ" ], [ "Ȼ", "ȃ" ], [ "ȅ", "Ƚ" ], [ "Ȇ", "Ⱦ" ], [ "Ȇ", "ȿ" ], [ "ȇ", "ɀ" ], [ "ȇ", "Ɂ" ], [ "Ȯ", "ɂ" ], [ "Ȯ", "ǐ" ], [ "Ȋ", "Ƀ" ], [ "Ȍ", "Ʉ" ], [ "Ȍ", "Ʌ" ], [ "ȍ", "Ɇ" ], [ "ȏ", "ɇ" ], [ "ȏ", "Ɉ" ], [ "ȑ", "ɉ" ], [ "ȓ", "Ɋ" ], [ "ȓ", "ɋ" ], [ "ɉ", "Ǜ" ], [ "ȕ", "Ɍ" ], [ "ȕ", "ɍ" ], [ "Ʉ", "Ɏ" ], [ "Ʉ", "ȉ" ], [ "ȗ", "ɏ" ], [ "ȗ", "ɐ" ], [ "Ș", "ɑ" ], [ "ɀ", "ɒ" ], [ "ɀ", "Ǡ" ], [ "Ɋ", "Ȗ" ], [ "ț", "ɓ" ], [ "ț", "ɔ" ], [ "ɓ", "ɕ" ], [ "ɓ", "Ǻ" ], [ "ȝ", "ɖ" ], [ "ȝ", "ɗ" ], [ "ɇ", "Ǥ" ], [ "Ƞ", "ɘ" ], [ "Ɍ", "ǧ" ], [ "ɑ", "Ǩ" ], [ "ȸ", "ə" ], [ "ȸ", "ș" ], [ "ȵ", "dz" ], [ "ȣ", "ɚ" ], [ "ȣ", "ɛ" ], [ "Ȥ", "ɜ" ], [ "ɚ", "Ȃ" ], [ "Ȧ", "ɝ" ], [ "Ƚ", "ɞ" ], [ "Ƚ", "Ǯ" ], [ "ȩ", "ɟ" ], [ "ȩ", "ɠ" ], [ "Ɇ", "ɡ" ], [ "Ɇ", "ȡ" ], [ "Ⱦ", "Ȅ" ], [ "ɖ", "Ȓ" ], [ "Ȳ", "Ȑ" ], [ "Ȫ", "ɢ" ], [ "Ȱ", "Ȝ" ], [ "ɘ", "Ȩ" ], [ "ȼ", "Ȕ" ], [ "ɟ", "ȥ" ], [ "ɜ", "Ȟ" ], [ "ɝ", "Ț" ], [ "ɏ", "ȟ" ], [ "Ƀ", "Ȣ" ], [ "ɢ", "ȧ" ], [ "ɣ", "ɤ" ], [ "ɣ", "ȫ" ], [ "ɥ", "ɦ" ], [ "ɥ", "ȭ" ], [ "ɧ", "ɨ" ], [ "ɧ", "ȯ" ], [ "ȱ", "ɩ" ], [ "ȱ", "ɪ" ], [ "ȳ", "ɫ" ], [ "ȳ", "ɬ" ], [ "ɭ", "ɮ" ], [ "ɭ", "ȴ" ], [ "ȷ", "ɯ" ], [ "ȷ", "ɰ" ], [ "ȹ", "ɱ" ], [ "ȹ", "ɲ" ], [ "Ⱥ", "ɳ" ], [ "Ⱥ", "ɴ" ], [ "ɵ", "ɶ" ], [ "ɵ", "Ȼ" ], [ "ɯ", "ɷ" ], [ "ɯ", "ȅ" ], [ "ȿ", "ɸ" ], [ "Ɂ", "ɹ" ], [ "Ɂ", "ɺ" ], [ "ɂ", "ɻ" ], [ "ɂ", "ɼ" ], [ "ɤ", "ɽ" ], [ "ɤ", "Ȋ" ], [ "Ʌ", "ɾ" ], [ "Ʌ", "ɿ" ], [ "ɮ", "ʀ" ], [ "ɮ", "ȍ" ], [ "Ɉ", "ʁ" ], [ "Ɉ", "ʂ" ], [ "ɳ", "ʃ" ], [ "ɳ", "ȑ" ], [ "ɋ", "ʄ" ], [ "ɋ", "ʅ" ], [ "ɹ", "ɉ" ], [ "ɍ", "ʆ" ], [ "ɍ", "ʇ" ], [ "Ɏ", "ʈ" ], [ "Ɏ", "ʉ" ], [ "ɐ", "ʊ" ], [ "ɫ", "ʋ" ], [ "ɫ", "Ș" ], [ "ɒ", "ʌ" ], [ "ʆ", "Ɋ" ], [ "ɔ", "ʍ" ], [ "ɔ", "ʎ" ], [ "ɕ", "ʏ" ], [ "ɗ", "ʐ" ], [ "ʊ", "ʑ" ], [ "ʊ", "ɇ" ], [ "ɶ", "Ƞ" ], [ "ɦ", "ʒ" ], [ "ɦ", "Ɍ" ], [ "ɱ", "ʓ" ], [ "ɱ", "ɑ" ], [ "ə", "ʔ" ], [ "ʁ", "ȵ" ], [ "ɛ", "ʕ" ], [ "ɨ", "Ȥ" ], [ "ɻ", "ʖ" ], [ "ɻ", "ɚ" ], [ "ʔ", "Ȧ" ], [ "ɞ", "ʗ" ], [ "ɞ", "ʘ" ], [ "ɠ", "ʙ" ], [ "ɡ", "ʚ" ], [ "ɩ", "Ⱦ" ], [ "ʙ", "ɖ" ], [ "ʌ", "ʛ" ], [ "ʌ", "Ȳ" ], [ "ʗ", "Ȫ" ], [ "ʄ", "Ȱ" ], [ "ɾ", "ɘ" ], [ "ʐ", "ȼ" ], [ "ʏ", "ʜ" ], [ "ʏ", "ɟ" ], [ "ʍ", "ɜ" ], [ "ʈ", "ɝ" ], [ "ʚ", "ɏ" ], [ "ɸ", "Ƀ" ], [ "ʕ", "ɢ" ], [ "ʝ", "ʞ" ], [ "ʝ", "ɣ" ], [ "ʞ", "ɥ" ], [ "ʞ", "ʟ" ], [ "ʠ", "ʡ" ], [ "ʠ", "ɧ" ], [ "ɪ", "ʢ" ], [ "ɪ", "ʣ" ], [ "ɬ", "ʤ" ], [ "ɬ", "ʥ" ], [ "ʢ", "ɭ" ], [ "ʢ", "ʦ" ], [ "ɰ", "ʧ" ], [ "ɰ", "ʨ" ], [ "ɲ", "ʩ" ], [ "ɲ", "ʪ" ], [ "ɴ", "ʫ" ], [ "ʬ", "ʭ" ], [ "ʬ", "ɵ" ], [ "ɷ", "ʮ" ], [ "ɷ", "ʯ" ], [ "ʩ", "ʰ" ], [ "ʩ", "ȿ" ], [ "ɺ", "ʱ" ], [ "ɼ", "ʲ" ], [ "ɽ", "ʳ" ], [ "ɿ", "ʴ" ], [ "ɿ", "ʵ" ], [ "ʀ", "ʶ" ], [ "ʂ", "ʷ" ], [ "ʃ", "ʸ" ], [ "ʅ", "ʹ" ], [ "ʅ", "ʺ" ], [ "ʲ", "ɹ" ], [ "ʇ", "ʻ" ], [ "ʇ", "ʼ" ], [ "ʉ", "ʽ" ], [ "ʻ", "ɐ" ], [ "ʋ", "ʾ" ], [ "ʹ", "ʿ" ], [ "ʹ", "ɒ" ], [ "ʫ", "ˀ" ], [ "ʫ", "ʆ" ], [ "ʎ", "ˁ" ], [ "ʎ", "˂" ], [ "ʶ", "ɕ" ], [ "ʮ", "ɗ" ], [ "ʑ", "˃" ], [ "ʑ", "˄" ], [ "ʷ", "ɶ" ], [ "ʒ", "˅" ], [ "ʓ", "ˆ" ], [ "ʓ", "ˇ" ], [ "ʸ", "ə" ], [ "ʧ", "ʁ" ], [ "˃", "ɛ" ], [ "ʾ", "ɨ" ], [ "ʖ", "ˈ" ], [ "ʤ", "ʔ" ], [ "ʘ", "ˉ" ], [ "ʭ", "ɠ" ], [ "ʳ", "ɡ" ], [ "ˁ", "ɩ" ], [ "ˉ", "ʙ" ], [ "ʛ", "ˊ" ], [ "ʛ", "ˋ" ], [ "ˈ", "ʗ" ], [ "˅", "ʄ" ], [ "ˆ", "ɾ" ], [ "ʴ", "ʐ" ], [ "ʜ", "ˌ" ], [ "ˊ", "ʍ" ], [ "ʱ", "ʈ" ], [ "ˌ", "ʚ" ], [ "ʽ", "ɸ" ], [ "ʡ", "ʕ" ], [ "ˍ", "ˎ" ], [ "ˍ", "ʝ" ], [ "ʟ", "ˏ" ], [ "ː", "ˑ" ], [ "ː", "ʠ" ], [ "ʣ", "˒" ], [ "ʣ", "˓" ], [ "ʥ", "˔" ], [ "ʦ", "˕" ], [ "ʦ", "ˍ" ], [ "ʪ", "˖" ], [ "˔", "˗" ], [ "˔", "ɴ" ], [ "˗", "ʬ" ], [ "ʯ", "˘" ], [ "ʰ", "ː" ], [ "˕", "˙" ], [ "˕", "ɺ" ], [ "˖", "ɼ" ], [ "˓", "ɽ" ], [ "ʵ", "˚" ], [ "ʵ", "˛" ], [ "ˎ", "ʀ" ], [ "˙", "˜" ], [ "˙", "ʂ" ], [ "˘", "ʃ" ], [ "˘", "ʪ" ], [ "ʺ", "˝" ], [ "˜", "ʲ" ], [ "ʼ", "˞" ], [ "˒", "˟" ], [ "˒", "ʉ" ], [ "ˑ", "ˠ" ], [ "ˑ", "ʻ" ], [ "˛", "ˡ" ], [ "˛", "ʋ" ], [ "ʿ", "ˢ" ], [ "ʿ", "ˣ" ], [ "ˀ", "ˤ" ], [ "˂", "˥" ], [ "˂", "˦" ], [ "˟", "˧" ], [ "˟", "ʶ" ], [ "˝", "ʮ" ], [ "˝", "˗" ], [ "˄", "˨" ], [ "˚", "ʷ" ], [ "ˣ", "˩" ], [ "ˣ", "ʒ" ], [ "ˇ", "˪" ], [ "ˇ", "˫" ], [ "˧", "ˬ" ], [ "˧", "ʸ" ], [ "˦", "˭" ], [ "˦", "ʧ" ], [ "ˤ", "˃" ], [ "ˤ", "ʟ" ], [ "ˠ", "ʾ" ], [ "ˠ", "ʺ" ], [ "ˏ", "ˮ" ], [ "ˏ", "ʖ" ], [ "˫", "˯" ], [ "˫", "ʤ" ], [ "˯", "˰" ], [ "˯", "ʘ" ], [ "˩", "ʭ" ], [ "˩", "˚" ], [ "˰", "ʳ" ], [ "˰", "ˀ" ], [ "˞", "ˁ" ], [ "˞", "˖" ], [ "ˮ", "ˉ" ], [ "ˮ", "ʼ" ], [ "ˋ", "˱" ], [ "ˋ", "˲" ], [ "˱", "ˈ" ], [ "˱", "ʯ" ], [ "˲", "˅" ], [ "˲", "˓" ], [ "˨", "ˆ" ], [ "˨", "ʨ" ], [ "ˡ", "˳" ], [ "ˡ", "ʴ" ], [ "ˢ", "ʜ" ], [ "ˢ", "ʥ" ], [ "˳", "ˊ" ], [ "˳", "ʰ" ], [ "ˬ", "ʱ" ], [ "ˬ", "˄" ], [ "˪", "ˌ" ], [ "˪", "ʨ" ], [ "˭", "ʽ" ], [ "˭", "˜" ], [ "˥", "ʡ" ], [ "˥", "ˎ" ], [ "j", "Q" ], [ "M", "J" ], [ "Á", "O" ], [ "X", "w" ], [ "Ã", "Ë" ], [ "s", "u" ], [ "Ð", "B" ], [ "Ï", "S" ], [ "o", "b" ], [ "È", "À" ], [ "Â", "q" ], [ "z", "R" ], [ "m", "P" ], [ "T", "L" ], [ "G", "E" ], [ "Ñ", "D" ], [ "U", "f" ], [ "Ì", "A" ], [ "h", "y" ], [ "N", "t" ], [ "F", "r" ], [ "d", "p" ], [ "W", "n" ], [ "Î", "l" ], [ "v", "g" ], [ "Ç", "e" ], [ "I", "c" ], [ "i", "a" ] ], "output": [], "size_dict": { "a": 2, "b": 2, "c": 2, "d": 2, "e": 2, "f": 2, "g": 2, "h": 2, "i": 2, "j": 2, "k": 2, "l": 2, "m": 2, "n": 2, "o": 2, "p": 2, "q": 2, "r": 2, "s": 2, "t": 2, "u": 2, "v": 2, "w": 2, "x": 2, "y": 2, "z": 2, "A": 2, "B": 2, "C": 2, "D": 2, "E": 2, "F": 2, "G": 2, "H": 2, "I": 2, "J": 2, "K": 2, "L": 2, "M": 2, "N": 2, "O": 2, "P": 2, "Q": 2, "R": 2, "S": 2, "T": 2, "U": 2, "V": 2, "W": 2, "X": 2, "Y": 2, "Z": 2, "À": 2, "Á": 2, "Â": 2, "Ã": 2, "Ä": 2, "Å": 2, "Æ": 2, "Ç": 2, "È": 2, "É": 2, "Ê": 2, "Ë": 2, "Ì": 2, "Í": 2, "Î": 2, "Ï": 2, "Ð": 2, "Ñ": 2, "Ò": 2, "Ó": 2, "Ô": 2, "Õ": 2, "Ö": 2, "×": 2, "Ø": 2, "Ù": 2, "Ú": 2, "Û": 2, "Ü": 2, "Ý": 2, "Þ": 2, "ß": 2, "à": 2, "á": 2, "â": 2, "ã": 2, "ä": 2, "å": 2, "æ": 2, "ç": 2, "è": 2, "é": 2, "ê": 2, "ë": 2, "ì": 2, "í": 2, "î": 2, "ï": 2, "ð": 2, "ñ": 2, "ò": 2, "ó": 2, "ô": 2, "õ": 2, "ö": 2, "÷": 2, "ø": 2, "ù": 2, "ú": 2, "û": 2, "ü": 2, "ý": 2, "þ": 2, "ÿ": 2, "Ā": 2, "ā": 2, "Ă": 2, "ă": 2, "Ą": 2, "ą": 2, "Ć": 2, "ć": 2, "Ĉ": 2, "ĉ": 2, "Ċ": 2, "ċ": 2, "Č": 2, "č": 2, "Ď": 2, "ď": 2, "Đ": 2, "đ": 2, "Ē": 2, "ē": 2, "Ĕ": 2, "ĕ": 2, "Ė": 2, "ė": 2, "Ę": 2, "ę": 2, "Ě": 2, "ě": 2, "Ĝ": 2, "ĝ": 2, "Ğ": 2, "ğ": 2, "Ġ": 2, "ġ": 2, "Ģ": 2, "ģ": 2, "Ĥ": 2, "ĥ": 2, "Ħ": 2, "ħ": 2, "Ĩ": 2, "ĩ": 2, "Ī": 2, "ī": 2, "Ĭ": 2, "ĭ": 2, "Į": 2, "į": 2, "İ": 2, "ı": 2, "IJ": 2, "ij": 2, "Ĵ": 2, "ĵ": 2, "Ķ": 2, "ķ": 2, "ĸ": 2, "Ĺ": 2, "ĺ": 2, "Ļ": 2, "ļ": 2, "Ľ": 2, "ľ": 2, "Ŀ": 2, "ŀ": 2, "Ł": 2, "ł": 2, "Ń": 2, "ń": 2, "Ņ": 2, "ņ": 2, "Ň": 2, "ň": 2, "ʼn": 2, "Ŋ": 2, "ŋ": 2, "Ō": 2, "ō": 2, "Ŏ": 2, "ŏ": 2, "Ő": 2, "ő": 2, "Œ": 2, "œ": 2, "Ŕ": 2, "ŕ": 2, "Ŗ": 2, "ŗ": 2, "Ř": 2, "ř": 2, "Ś": 2, "ś": 2, "Ŝ": 2, "ŝ": 2, "Ş": 2, "ş": 2, "Š": 2, "š": 2, "Ţ": 2, "ţ": 2, "Ť": 2, "ť": 2, "Ŧ": 2, "ŧ": 2, "Ũ": 2, "ũ": 2, "Ū": 2, "ū": 2, "Ŭ": 2, "ŭ": 2, "Ů": 2, "ů": 2, "Ű": 2, "ű": 2, "Ų": 2, "ų": 2, "Ŵ": 2, "ŵ": 2, "Ŷ": 2, "ŷ": 2, "Ÿ": 2, "Ź": 2, "ź": 2, "Ż": 2, "ż": 2, "Ž": 2, "ž": 2, "ſ": 2, "ƀ": 2, "Ɓ": 2, "Ƃ": 2, "ƃ": 2, "Ƅ": 2, "ƅ": 2, "Ɔ": 2, "Ƈ": 2, "ƈ": 2, "Ɖ": 2, "Ɗ": 2, "Ƌ": 2, "ƌ": 2, "ƍ": 2, "Ǝ": 2, "Ə": 2, "Ɛ": 2, "Ƒ": 2, "ƒ": 2, "Ɠ": 2, "Ɣ": 2, "ƕ": 2, "Ɩ": 2, "Ɨ": 2, "Ƙ": 2, "ƙ": 2, "ƚ": 2, "ƛ": 2, "Ɯ": 2, "Ɲ": 2, "ƞ": 2, "Ɵ": 2, "Ơ": 2, "ơ": 2, "Ƣ": 2, "ƣ": 2, "Ƥ": 2, "ƥ": 2, "Ʀ": 2, "Ƨ": 2, "ƨ": 2, "Ʃ": 2, "ƪ": 2, "ƫ": 2, "Ƭ": 2, "ƭ": 2, "Ʈ": 2, "Ư": 2, "ư": 2, "Ʊ": 2, "Ʋ": 2, "Ƴ": 2, "ƴ": 2, "Ƶ": 2, "ƶ": 2, "Ʒ": 2, "Ƹ": 2, "ƹ": 2, "ƺ": 2, "ƻ": 2, "Ƽ": 2, "ƽ": 2, "ƾ": 2, "ƿ": 2, "ǀ": 2, "ǁ": 2, "ǂ": 2, "ǃ": 2, "DŽ": 2, "Dž": 2, "dž": 2, "LJ": 2, "Lj": 2, "lj": 2, "NJ": 2, "Nj": 2, "nj": 2, "Ǎ": 2, "ǎ": 2, "Ǐ": 2, "ǐ": 2, "Ǒ": 2, "ǒ": 2, "Ǔ": 2, "ǔ": 2, "Ǖ": 2, "ǖ": 2, "Ǘ": 2, "ǘ": 2, "Ǚ": 2, "ǚ": 2, "Ǜ": 2, "ǜ": 2, "ǝ": 2, "Ǟ": 2, "ǟ": 2, "Ǡ": 2, "ǡ": 2, "Ǣ": 2, "ǣ": 2, "Ǥ": 2, "ǥ": 2, "Ǧ": 2, "ǧ": 2, "Ǩ": 2, "ǩ": 2, "Ǫ": 2, "ǫ": 2, "Ǭ": 2, "ǭ": 2, "Ǯ": 2, "ǯ": 2, "ǰ": 2, "DZ": 2, "Dz": 2, "dz": 2, "Ǵ": 2, "ǵ": 2, "Ƕ": 2, "Ƿ": 2, "Ǹ": 2, "ǹ": 2, "Ǻ": 2, "ǻ": 2, "Ǽ": 2, "ǽ": 2, "Ǿ": 2, "ǿ": 2, "Ȁ": 2, "ȁ": 2, "Ȃ": 2, "ȃ": 2, "Ȅ": 2, "ȅ": 2, "Ȇ": 2, "ȇ": 2, "Ȉ": 2, "ȉ": 2, "Ȋ": 2, "ȋ": 2, "Ȍ": 2, "ȍ": 2, "Ȏ": 2, "ȏ": 2, "Ȑ": 2, "ȑ": 2, "Ȓ": 2, "ȓ": 2, "Ȕ": 2, "ȕ": 2, "Ȗ": 2, "ȗ": 2, "Ș": 2, "ș": 2, "Ț": 2, "ț": 2, "Ȝ": 2, "ȝ": 2, "Ȟ": 2, "ȟ": 2, "Ƞ": 2, "ȡ": 2, "Ȣ": 2, "ȣ": 2, "Ȥ": 2, "ȥ": 2, "Ȧ": 2, "ȧ": 2, "Ȩ": 2, "ȩ": 2, "Ȫ": 2, "ȫ": 2, "Ȭ": 2, "ȭ": 2, "Ȯ": 2, "ȯ": 2, "Ȱ": 2, "ȱ": 2, "Ȳ": 2, "ȳ": 2, "ȴ": 2, "ȵ": 2, "ȶ": 2, "ȷ": 2, "ȸ": 2, "ȹ": 2, "Ⱥ": 2, "Ȼ": 2, "ȼ": 2, "Ƚ": 2, "Ⱦ": 2, "ȿ": 2, "ɀ": 2, "Ɂ": 2, "ɂ": 2, "Ƀ": 2, "Ʉ": 2, "Ʌ": 2, "Ɇ": 2, "ɇ": 2, "Ɉ": 2, "ɉ": 2, "Ɋ": 2, "ɋ": 2, "Ɍ": 2, "ɍ": 2, "Ɏ": 2, "ɏ": 2, "ɐ": 2, "ɑ": 2, "ɒ": 2, "ɓ": 2, "ɔ": 2, "ɕ": 2, "ɖ": 2, "ɗ": 2, "ɘ": 2, "ə": 2, "ɚ": 2, "ɛ": 2, "ɜ": 2, "ɝ": 2, "ɞ": 2, "ɟ": 2, "ɠ": 2, "ɡ": 2, "ɢ": 2, "ɣ": 2, "ɤ": 2, "ɥ": 2, "ɦ": 2, "ɧ": 2, "ɨ": 2, "ɩ": 2, "ɪ": 2, "ɫ": 2, "ɬ": 2, "ɭ": 2, "ɮ": 2, "ɯ": 2, "ɰ": 2, "ɱ": 2, "ɲ": 2, "ɳ": 2, "ɴ": 2, "ɵ": 2, "ɶ": 2, "ɷ": 2, "ɸ": 2, "ɹ": 2, "ɺ": 2, "ɻ": 2, "ɼ": 2, "ɽ": 2, "ɾ": 2, "ɿ": 2, "ʀ": 2, "ʁ": 2, "ʂ": 2, "ʃ": 2, "ʄ": 2, "ʅ": 2, "ʆ": 2, "ʇ": 2, "ʈ": 2, "ʉ": 2, "ʊ": 2, "ʋ": 2, "ʌ": 2, "ʍ": 2, "ʎ": 2, "ʏ": 2, "ʐ": 2, "ʑ": 2, "ʒ": 2, "ʓ": 2, "ʔ": 2, "ʕ": 2, "ʖ": 2, "ʗ": 2, "ʘ": 2, "ʙ": 2, "ʚ": 2, "ʛ": 2, "ʜ": 2, "ʝ": 2, "ʞ": 2, "ʟ": 2, "ʠ": 2, "ʡ": 2, "ʢ": 2, "ʣ": 2, "ʤ": 2, "ʥ": 2, "ʦ": 2, "ʧ": 2, "ʨ": 2, "ʩ": 2, "ʪ": 2, "ʫ": 2, "ʬ": 2, "ʭ": 2, "ʮ": 2, "ʯ": 2, "ʰ": 2, "ʱ": 2, "ʲ": 2, "ʳ": 2, "ʴ": 2, "ʵ": 2, "ʶ": 2, "ʷ": 2, "ʸ": 2, "ʹ": 2, "ʺ": 2, "ʻ": 2, "ʼ": 2, "ʽ": 2, "ʾ": 2, "ʿ": 2, "ˀ": 2, "ˁ": 2, "˂": 2, "˃": 2, "˄": 2, "˅": 2, "ˆ": 2, "ˇ": 2, "ˈ": 2, "ˉ": 2, "ˊ": 2, "ˋ": 2, "ˌ": 2, "ˍ": 2, "ˎ": 2, "ˏ": 2, "ː": 2, "ˑ": 2, "˒": 2, "˓": 2, "˔": 2, "˕": 2, "˖": 2, "˗": 2, "˘": 2, "˙": 2, "˚": 2, "˛": 2, "˜": 2, "˝": 2, "˞": 2, "˟": 2, "ˠ": 2, "ˡ": 2, "ˢ": 2, "ˣ": 2, "ˤ": 2, "˥": 2, "˦": 2, "˧": 2, "˨": 2, "˩": 2, "˪": 2, "˫": 2, "ˬ": 2, "˭": 2, "ˮ": 2, "˯": 2, "˰": 2, "˱": 2, "˲": 2, "˳": 2 } } ================================================ FILE: examples/benchmarks/rand_50_5_a.json ================================================ { "inputs": [ [ "b", "p", "v", "Ä", "Ð", "à", "æ" ], [ "b", "÷", "Ă" ], [ "b", "R", "ß", "é", "í", "î", "þ" ], [ "a", "b", "d", "n", "u", "D", "F", "H", "K", "Ý" ], [ "a", "c", "l", "M", "N", "Ã", "Æ", "Ê", "ç", "ą" ], [ "a", "p", "L", "S", "Ý" ], [ "c", "d", "g", "n", "Æ", "Ò", "Ô", "ñ", "ý" ], [ "b", "P", "Ô", "ç" ], [ "b", "c", "i", "À", "É", "Ó", "á", "ì" ], [ "B", "Ö", "è", "ë", "õ" ], [ "b", "r", "u", "J", "Ì", "ã", "ö", "ü" ], [ "c", "j", "L", "ö", "ø" ], [ "b", "c", "h", "C", "ÿ", "ă" ], [ "b", "c", "t", "D", "W", "Ç", "Ø", "Ù", "ï" ], [ "b", "c", "ÿ", "ā", "Ă" ], [ "a", "c", "g", "l", "q", "O", "Q", "Y", "Ê", "ð", "õ", "û" ], [ "b", "w", "W", "Z", "È", "Ó", "Û", "Ü", "â" ], [ "b", "c", "k", "Ö", "ß", "û", "ą", "Ć" ], [ "b", "x", "C", "Ë", "×" ], [ "a", "b", "Á", "Î", "Ñ", "í", "ā" ], [ "b", "G", "V", "Y", "Â" ], [ "b", "f", "Ù", "à", "ù", "Ą" ], [ "b", "É", "ï", "ò", "Ā", "ć" ], [ "a", "b", "c", "Ë", "ê", "î" ], [ "b", "v", "w", "ý" ], [ "b", "d", "t", "O", "Z", "Ą", "Ĉ" ], [ "c", "r", "T", "ó", "÷", "ù" ], [ "b", "c", "j", "y", "Þ", "å", "ì" ], [ "b", "i", "m", "Ì", "ä" ], [ "b", "c", "k", "x", "Â", "Ä", "Ā" ], [ "b", "c", "s", "I", "þ" ], [ "a", "b", "c", "s", "B", "Ü" ], [ "b", "c", "I", "K", "È", "Û", "Ĉ" ], [ "b", "c", "J", "V", "Ï" ], [ "b", "c", "h", "o", "F", "Ç", "Í", "é" ], [ "b", "m", "z", "Ñ", "Õ", "ä", "æ", "ë", "ó" ], [ "a", "c", "P", "U", "Å" ], [ "b", "E", "H", "Q", "U", "ê" ], [ "b", "c", "M", "R", "×" ], [ "b", "S", "Å", "Î", "ô" ], [ "c", "Ú", "Þ", "â" ], [ "d", "o", "Á", "Ï", "ć" ], [ "b", "c", "A", "T", "X", "À", "Ð", "Ò", "ñ", "ú", "ă" ], [ "a", "b", "c", "d", "N", "Ú", "ð" ], [ "b", "y", "è", "ü" ], [ "A", "X", "Í", "Ø", "å" ], [ "e", "z" ], [ "a", "c", "E", "G", "Õ", "ã", "ô", "ø", "ú" ], [ "b", "d", "q", "Ã" ], [ "b", "á", "ò", "Ć" ] ], "output": [ "b", "f", "a", "e" ], "size_dict": { "a": 2, "b": 2, "c": 4, "d": 3, "e": 3, "f": 3, "g": 2, "h": 2, "i": 5, "j": 2, "k": 2, "l": 2, "m": 3, "n": 3, "o": 2, "p": 3, "q": 5, "r": 3, "s": 5, "t": 4, "u": 2, "v": 3, "w": 5, "x": 4, "y": 4, "z": 3, "A": 3, "B": 4, "C": 2, "D": 2, "E": 5, "F": 2, "G": 4, "H": 4, "I": 4, "J": 2, "K": 5, "L": 2, "M": 5, "N": 2, "O": 4, "P": 4, "Q": 3, "R": 2, "S": 2, "T": 3, "U": 4, "V": 2, "W": 3, "X": 2, "Y": 5, "Z": 4, "À": 5, "Á": 4, "Â": 3, "Ã": 4, "Ä": 4, "Å": 3, "Æ": 4, "Ç": 2, "È": 3, "É": 3, "Ê": 3, "Ë": 5, "Ì": 5, "Í": 4, "Î": 3, "Ï": 4, "Ð": 2, "Ñ": 3, "Ò": 2, "Ó": 4, "Ô": 5, "Õ": 4, "Ö": 2, "×": 3, "Ø": 4, "Ù": 3, "Ú": 5, "Û": 5, "Ü": 5, "Ý": 3, "Þ": 4, "ß": 3, "à": 3, "á": 4, "â": 5, "ã": 5, "ä": 4, "å": 3, "æ": 3, "ç": 5, "è": 2, "é": 2, "ê": 2, "ë": 3, "ì": 3, "í": 5, "î": 2, "ï": 5, "ð": 5, "ñ": 5, "ò": 4, "ó": 2, "ô": 2, "õ": 4, "ö": 4, "÷": 2, "ø": 4, "ù": 5, "ú": 3, "û": 5, "ü": 2, "ý": 4, "þ": 3, "ÿ": 2, "Ā": 4, "ā": 3, "Ă": 3, "ă": 4, "Ą": 3, "ą": 2, "Ć": 4, "ć": 5, "Ĉ": 2 } } ================================================ FILE: examples/benchmarks/randreg_200_3_a.json ================================================ { "inputs": [ [ "É", "Ê", "Ë" ], [ "Þ", "þ", "Ɛ" ], [ "E", "ÿ", "Ā" ], [ "Ċ", "ň", "ʼn" ], [ "Ñ", "Ò", "Ó" ], [ "Ŕ", "ŗ", "Ř" ], [ "a", "b", "c" ], [ "F", "G", "H" ], [ "h", "O", "Ɵ" ], [ "Â", "Ş", "ş" ], [ "f", "g", "h" ], [ "ě", "Ĝ", "ĝ" ], [ "Í", "Î", "Ï" ], [ "ï", "ř", "Ƌ" ], [ "Ň", "ō", "Ÿ" ], [ "é", "ô", "õ" ], [ "K", "L", "M" ], [ "ò", "Ɣ", "ƕ" ], [ "a", "d", "e" ], [ "P", "Q", "R" ], [ "Ú", "Û", "Ü" ], [ "ġ", "ŕ", "Ŵ" ], [ "Ä", "Å", "Æ" ], [ "Œ", "Ʃ", "ƪ" ], [ "÷", "ø", "ù" ], [ "ƃ", "Ƅ", "ƅ" ], [ "Ě", "Ƣ", "Ƶ" ], [ "ì", "ʼn", "ŵ" ], [ "ö", "Ģ", "Ʒ" ], [ "Ũ", "ƃ", "Ɔ" ], [ "ě", "Ğ", "ğ" ], [ "ŀ", "Ł", "ł" ], [ "b", "î", "ĩ" ], [ "C", "œ", "Ŕ" ], [ "f", "i", "j" ], [ "ƥ", "Ƴ", "ƶ" ], [ "ć", "Ĉ", "ĉ" ], [ "Ã", "Ɠ", "Ɨ" ], [ "ç", "Ŧ", "ŧ" ], [ "Û", "ņ", "ƅ" ], [ "Ĵ", "ĵ", "Ķ" ], [ "Ĭ", "ĭ", "Į" ], [ "Ì", "ó", "Ə" ], [ "z", "ã", "Ɓ" ], [ "p", "q", "r" ], [ "ķ", "Ǝ", "Ɨ" ], [ "đ", "Ē", "ē" ], [ "K", "N", "O" ], [ "G", "Ý", "Ĥ" ], [ "ù", "Ĺ", "ĺ" ], [ "Ğ", "ŕ", "Ŗ" ], [ "Ď", "Ũ", "ũ" ], [ "è", "ğ", "ſ" ], [ "ń", "Ż", "ż" ], [ "Ġ", "ġ", "Ģ" ], [ "ź", "Ƈ", "ƈ" ], [ "×", "İ", "ı" ], [ "Ö", "×", "Ø" ], [ "Ă", "ŀ", "Ń" ], [ "ä", "å", "æ" ], [ "ŗ", "ř", "Ś" ], [ "H", "Ë", "Ĵ" ], [ "Ō", "ō", "Ŏ" ], [ "Ƅ", "Ƨ", "Ʈ" ], [ "Ű", "Ɩ", "ƴ" ], [ "L", "ø", "ń" ], [ "č", "Ď", "ď" ], [ "ü", "ý", "þ" ], [ "Ľ", "Ŷ", "Ƌ" ], [ "æ", "ú", "Ŀ" ], [ "ŝ", "ƫ", "Ʒ" ], [ "Ć", "IJ", "Ʀ" ], [ "ģ", "Ū", "Ƙ" ], [ "Ĝ", "ŭ", "Ů" ], [ "D", "ƍ", "Ʋ" ], [ "Y", "ĥ", "Ħ" ], [ "ā", "ę", "Ě" ], [ "Ĩ", "Ƥ", "Ƭ" ], [ "A", "ĵ", "Ņ" ], [ "ē", "ŏ", "Ő" ], [ "Ï", "Ɛ", "Ɲ" ], [ "m", "ÿ", "Ŗ" ], [ "N", "ċ", "Č" ], [ "k", "l", "m" ], [ "ß", "à", "á" ], [ "ċ", "ij", "Ƒ" ], [ "Ś", "Ţ", "ƙ" ], [ "Ŋ", "ű", "Ų" ], [ "Ø", "Ń", "ư" ], [ "Ê", "Ɲ", "ƞ" ], [ "n", "ś", "Ŝ" ], [ "Õ", "ƒ", "ƭ" ], [ "ŏ", "ő", "Œ" ], [ "ĺ", "ů", "Ɩ" ], [ "ĝ", "ƌ", "ƍ" ], [ "ð", "ñ", "ò" ], [ "r", "ĸ", "ƈ" ], [ "Ù", "Ɔ", "ƴ" ], [ "Ĉ", "ď", "Ɓ" ], [ "÷", "ú", "û" ], [ "ý", "ķ", "ĸ" ], [ "Å", "Ľ", "ľ" ], [ "Ő", "ƚ", "ƛ" ], [ "ä", "ç", "è" ], [ "B", "C", "D" ], [ "À", "ű", "ų" ], [ "ą", "Ġ", "ģ" ], [ "i", "Í", "Ð" ], [ "Ä", "Ç", "È" ], [ "Ɖ", "ƚ", "Ɯ" ], [ "w", "x", "y" ], [ "Ŧ", "ƣ", "Ƥ" ], [ "ŭ", "Ʀ", "ƭ" ], [ "Ę", "Ş", "Š" ], [ "đ", "Ĕ", "ĕ" ], [ "Î", "õ", "Ļ" ], [ "ê", "Ŏ", "ż" ], [ "y", "č", "Đ" ], [ "ļ", "Ņ", "ņ" ], [ "Ķ", "ł", "ƙ" ], [ "Ú", "Ý", "Þ" ], [ "Ż", "Ž", "ž" ], [ "Ť", "ů", "Ű" ], [ "ß", "â", "ã" ], [ "Ź", "ž", "Ƃ" ], [ "û", "ă", "Ą" ], [ "á", "ƛ", "ƞ" ], [ "U", "V", "W" ], [ "Ĺ", "Ļ", "ļ" ], [ "Ç", "Ž", "Ɗ" ], [ "w", "z", "A" ], [ "Ô", "Ŭ", "ƨ" ], [ "M", "ĕ", "ƀ" ], [ "k", "n", "o" ], [ "u", "Ơ", "ơ" ], [ "Ð", "Ī", "ĭ" ], [ "x", "Ĭ", "į" ], [ "š", "Ţ", "ţ" ], [ "ŋ", "ŧ", "ƕ" ], [ "Q", "Ö", "Ù" ], [ "ħ", "ƪ", "ƫ" ], [ "J", "ð", "ó" ], [ "q", "É", "Ì" ], [ "U", "X", "Y" ], [ "ë", "ì", "í" ], [ "d", "u", "v" ], [ "ƌ", "Ǝ", "Ə" ], [ "g", "à", "Ʊ" ], [ "t", "ƣ", "ƥ" ], [ "X", "Ĕ", "Ŭ" ], [ "Š", "Ų", "Ƴ" ], [ "s", "é", "ê" ], [ "ñ", "Ů", "Ƣ" ], [ "Č", "ė", "ő" ], [ "F", "I", "J" ], [ "ę", "ŷ", "Ƭ" ], [ "R", "ſ", "ƀ" ], [ "ŵ", "Ŷ", "ŷ" ], [ "Ñ", "Ô", "Õ" ], [ "Ė", "ė", "Ę" ], [ "c", "B", "E" ], [ "ĉ", "œ", "š" ], [ "ı", "Ư", "ƶ" ], [ "j", "ť", "ũ" ], [ "p", "s", "t" ], [ "Ą", "ś", "ŝ" ], [ "ľ", "ū", "Ƙ" ], [ "İ", "IJ", "ij" ], [ "ī", "Ɵ", "Ʋ" ], [ "Æ", "å", "Ň" ], [ "Z", "À", "Á" ], [ "T", "Ē", "Ė" ], [ "Ÿ", "Ź", "ź" ], [ "V", "Ò", "ö" ], [ "Ĥ", "ƨ", "Ʃ" ], [ "e", "Ŝ", "Ʊ" ], [ "Į", "ş", "Ɣ" ], [ "v", "Ŵ", "Ƶ" ], [ "Z", "Â", "Ã" ], [ "ň", "Ŋ", "ŋ" ], [ "ë", "î", "ï" ], [ "È", "į", "ơ" ], [ "W", "ā", "Ă" ], [ "P", "S", "T" ], [ "Ƒ", "ƒ", "Ɠ" ], [ "ă", "ą", "Ć" ], [ "I", "Ū", "ū" ], [ "Ƃ", "Ɯ", "Ơ" ], [ "ĩ", "Ī", "ī" ], [ "ô", "Ư", "ư" ], [ "l", "Ť", "ť" ], [ "ţ", "Ƈ", "Ɖ" ], [ "í", "ć", "Ċ" ], [ "ĥ", "ħ", "Ĩ" ], [ "S", "Ř", "Ƨ" ], [ "Á", "Ł", "Ō" ], [ "â", "Ħ", "Ŀ" ], [ "Ā", "Đ", "Ɗ" ], [ "Ó", "Ü", "ü" ], [ "o", "ų", "Ʈ" ] ], "output": [], "size_dict": { "a": 2, "b": 2, "c": 3, "d": 2, "e": 2, "f": 2, "g": 2, "h": 2, "i": 3, "j": 2, "k": 2, "l": 2, "m": 2, "n": 2, "o": 2, "p": 2, "q": 3, "r": 2, "s": 3, "t": 3, "u": 2, "v": 2, "w": 3, "x": 3, "y": 3, "z": 2, "A": 2, "B": 3, "C": 2, "D": 2, "E": 3, "F": 2, "G": 3, "H": 3, "I": 3, "J": 2, "K": 3, "L": 2, "M": 3, "N": 2, "O": 3, "P": 3, "Q": 2, "R": 2, "S": 2, "T": 2, "U": 3, "V": 2, "W": 2, "X": 2, "Y": 3, "Z": 3, "À": 3, "Á": 3, "Â": 2, "Ã": 3, "Ä": 3, "Å": 2, "Æ": 3, "Ç": 2, "È": 2, "É": 2, "Ê": 2, "Ë": 3, "Ì": 3, "Í": 3, "Î": 2, "Ï": 3, "Ð": 2, "Ñ": 2, "Ò": 2, "Ó": 3, "Ô": 3, "Õ": 3, "Ö": 2, "×": 2, "Ø": 3, "Ù": 2, "Ú": 3, "Û": 3, "Ü": 3, "Ý": 2, "Þ": 3, "ß": 2, "à": 2, "á": 3, "â": 3, "ã": 3, "ä": 3, "å": 2, "æ": 2, "ç": 3, "è": 2, "é": 2, "ê": 2, "ë": 2, "ì": 2, "í": 3, "î": 2, "ï": 3, "ð": 3, "ñ": 3, "ò": 3, "ó": 2, "ô": 2, "õ": 3, "ö": 3, "÷": 2, "ø": 3, "ù": 3, "ú": 2, "û": 3, "ü": 2, "ý": 3, "þ": 2, "ÿ": 2, "Ā": 3, "ā": 2, "Ă": 2, "ă": 3, "Ą": 2, "ą": 2, "Ć": 3, "ć": 3, "Ĉ": 2, "ĉ": 2, "Ċ": 3, "ċ": 3, "Č": 2, "č": 2, "Ď": 2, "ď": 2, "Đ": 2, "đ": 3, "Ē": 2, "ē": 2, "Ĕ": 2, "ĕ": 3, "Ė": 2, "ė": 3, "Ę": 3, "ę": 2, "Ě": 2, "ě": 3, "Ĝ": 3, "ĝ": 3, "Ğ": 3, "ğ": 3, "Ġ": 2, "ġ": 2, "Ģ": 2, "ģ": 2, "Ĥ": 3, "ĥ": 2, "Ħ": 2, "ħ": 2, "Ĩ": 2, "ĩ": 2, "Ī": 2, "ī": 2, "Ĭ": 2, "ĭ": 2, "Į": 3, "į": 2, "İ": 2, "ı": 3, "IJ": 3, "ij": 2, "Ĵ": 2, "ĵ": 3, "Ķ": 2, "ķ": 3, "ĸ": 3, "Ĺ": 2, "ĺ": 2, "Ļ": 2, "ļ": 3, "Ľ": 3, "ľ": 3, "Ŀ": 3, "ŀ": 3, "Ł": 2, "ł": 2, "Ń": 2, "ń": 3, "Ņ": 3, "ņ": 2, "Ň": 2, "ň": 2, "ʼn": 2, "Ŋ": 3, "ŋ": 2, "Ō": 3, "ō": 2, "Ŏ": 3, "ŏ": 3, "Ő": 2, "ő": 2, "Œ": 3, "œ": 2, "Ŕ": 2, "ŕ": 2, "Ŗ": 2, "ŗ": 2, "Ř": 2, "ř": 3, "Ś": 3, "ś": 3, "Ŝ": 2, "ŝ": 3, "Ş": 2, "ş": 2, "Š": 3, "š": 2, "Ţ": 3, "ţ": 3, "Ť": 3, "ť": 3, "Ŧ": 3, "ŧ": 3, "Ũ": 2, "ũ": 2, "Ū": 3, "ū": 2, "Ŭ": 2, "ŭ": 2, "Ů": 3, "ů": 2, "Ű": 2, "ű": 3, "Ų": 2, "ų": 2, "Ŵ": 2, "ŵ": 2, "Ŷ": 2, "ŷ": 2, "Ÿ": 2, "Ź": 3, "ź": 2, "Ż": 2, "ż": 2, "Ž": 2, "ž": 3, "ſ": 3, "ƀ": 3, "Ɓ": 2, "Ƃ": 3, "ƃ": 2, "Ƅ": 3, "ƅ": 3, "Ɔ": 2, "Ƈ": 3, "ƈ": 3, "Ɖ": 3, "Ɗ": 2, "Ƌ": 2, "ƌ": 3, "ƍ": 2, "Ǝ": 2, "Ə": 2, "Ɛ": 3, "Ƒ": 2, "ƒ": 3, "Ɠ": 2, "Ɣ": 2, "ƕ": 3, "Ɩ": 3, "Ɨ": 2, "Ƙ": 3, "ƙ": 3, "ƚ": 2, "ƛ": 3, "Ɯ": 2, "Ɲ": 2, "ƞ": 3, "Ɵ": 2, "Ơ": 2, "ơ": 2, "Ƣ": 3, "ƣ": 3, "Ƥ": 2, "ƥ": 3, "Ʀ": 2, "Ƨ": 3, "ƨ": 3, "Ʃ": 3, "ƪ": 2, "ƫ": 2, "Ƭ": 3, "ƭ": 3, "Ʈ": 2, "Ư": 2, "ư": 3, "Ʊ": 2, "Ʋ": 3, "Ƴ": 2, "ƴ": 3, "Ƶ": 3, "ƶ": 2, "Ʒ": 2 } } ================================================ FILE: examples/benchmarks/rtree_100_a.json ================================================ { "inputs": [ [ "a", "b" ], [ "c" ], [ "d" ], [ "e", "f", "g", "h" ], [ "i", "g" ], [ "j", "k", "l" ], [ "h" ], [ "m" ], [ "n", "k" ], [ "o", "p" ], [ "q", "r", "s" ], [ "t", "u", "v", "w" ], [ "x", "y", "z" ], [ "A", "B", "u" ], [ "C", "d" ], [ "D", "E" ], [ "F" ], [ "G", "H" ], [ "I" ], [ "J", "K" ], [ "L", "M", "N" ], [ "O", "P" ], [ "H" ], [ "B" ], [ "Q", "R" ], [ "S", "T" ], [ "U", "V" ], [ "W", "X", "J" ], [ "Y", "Z", "I" ], [ "À", "Á", "y", "q" ], [ "Â" ], [ "Ã", "F" ], [ "Ä" ], [ "Å", "l" ], [ "Æ", "Ç" ], [ "È", "É", "Ê", "Ë", "C" ], [ "w" ], [ "Ì", "Í", "r" ], [ "Î" ], [ "Ï" ], [ "i" ], [ "v" ], [ "X" ], [ "Ð", "Ñ", "A" ], [ "Ò", "Ó" ], [ "Ô", "Õ", "V" ], [ "Ö", "×", "M" ], [ "Ô", "L" ], [ "É", "D", "x", "t" ], [ "Á" ], [ "Ø" ], [ "Ù" ], [ "f" ], [ "Ú", "Z" ], [ "Û", "Ñ", "Ï" ], [ "T" ], [ "Ü" ], [ "Ý", "Y" ], [ "Þ", "ß", "È" ], [ "à" ], [ "á" ], [ "Ú" ], [ "Ë" ], [ "b" ], [ "Ø", "N" ], [ "â" ], [ "Û" ], [ "Ê" ], [ "ã", "ä", "O" ], [ "á", "Ä", "K" ], [ "å", "Í" ], [ "Ð", "e" ], [ "z" ], [ "æ", "R" ], [ "Õ" ], [ "Ý", "Ó", "Î" ], [ "Å" ], [ "ç", "Ù", "Ò", "o" ], [ "è" ], [ "é", "×" ], [ "ê", "é" ], [ "ç", "Þ", "P", "c" ], [ "ë", "p" ], [ "ß", "Ü" ], [ "À", "j" ], [ "Ç", "U" ], [ "ä", "Â" ], [ "ì", "ë" ], [ "E" ], [ "ì", "â", "à", "Æ" ], [ "Q", "n" ], [ "S", "s" ], [ "å" ], [ "í", "è", "ã" ], [ "ê", "Ã", "G", "m" ], [ "æ" ], [ "î" ], [ "Ì", "W", "a" ], [ "î", "Ö" ], [ "í" ] ], "output": [], "size_dict": { "a": 10, "b": 10, "c": 10, "d": 10, "e": 10, "f": 10, "g": 10, "h": 10, "i": 10, "j": 10, "k": 10, "l": 10, "m": 10, "n": 10, "o": 10, "p": 10, "q": 10, "r": 10, "s": 10, "t": 10, "u": 10, "v": 10, "w": 10, "x": 10, "y": 10, "z": 10, "A": 10, "B": 10, "C": 10, "D": 10, "E": 10, "F": 10, "G": 10, "H": 10, "I": 10, "J": 10, "K": 10, "L": 10, "M": 10, "N": 10, "O": 10, "P": 10, "Q": 10, "R": 10, "S": 10, "T": 10, "U": 10, "V": 10, "W": 10, "X": 10, "Y": 10, "Z": 10, "À": 10, "Á": 10, "Â": 10, "Ã": 10, "Ä": 10, "Å": 10, "Æ": 10, "Ç": 10, "È": 10, "É": 10, "Ê": 10, "Ë": 10, "Ì": 10, "Í": 10, "Î": 10, "Ï": 10, "Ð": 10, "Ñ": 10, "Ò": 10, "Ó": 10, "Ô": 10, "Õ": 10, "Ö": 10, "×": 10, "Ø": 10, "Ù": 10, "Ú": 10, "Û": 10, "Ü": 10, "Ý": 10, "Þ": 10, "ß": 10, "à": 10, "á": 10, "â": 10, "ã": 10, "ä": 10, "å": 10, "æ": 10, "ç": 10, "è": 10, "é": 10, "ê": 10, "ë": 10, "ì": 10, "í": 10, "î": 10 } } ================================================ FILE: examples/benchmarks/sycamore_n53_m20_s0_e0_pABCDCDAB.json ================================================ { "inputs": [ [ "a", "b", "c", "d" ], [ "e", "f", "g", "h" ], [ "i", "j", "k", "l" ], [ "m", "n", "o", "p" ], [ "q", "r", "s", "t" ], [ "u", "v", "w", "x" ], [ "y", "z", "A", "B" ], [ "C", "D", "E", "F" ], [ "G", "H", "I", "J" ], [ "K", "L", "M", "N" ], [ "O", "P", "Q", "R" ], [ "S", "T", "U", "V" ], [ "W", "X", "a", "Y" ], [ "Z", "À", "Á", "Â" ], [ "Ã", "d", "Ä", "Å" ], [ "Æ", "Ç", "e", "È" ], [ "É", "h", "Ê", "Ë" ], [ "Ì", "Ê", "Í" ], [ "i", "Î", "Ï" ], [ "Ð", "m", "Ñ", "Ò" ], [ "Ó", "q", "Ô", "Õ" ], [ "Ö", "u", "×", "Ø" ], [ "Ù", "C", "Ú", "Û" ], [ "Ü", "G", "Ý", "Þ" ], [ "ß", "à", "á", "â" ], [ "ã", "S", "ä", "å" ], [ "æ", "l", "y", "ç" ], [ "è", "p", "K", "é" ], [ "ê", "t", "O", "ë" ], [ "ì", "x", "W", "í" ], [ "î", "B", "Z", "ï" ], [ "ð", "F", "ñ", "ò" ], [ "ó", "J", "Ã", "ô" ], [ "õ", "N", "Æ", "ö" ], [ "÷", "à", "ø", "ù" ], [ "ú", "Y", "É", "û" ], [ "ü", "Â", "ý", "þ" ], [ "ÿ", "ñ", "Ā", "ā" ], [ "Ă", "È", "ă", "Ą" ], [ "ą", "Ï", "æ", "Ć" ], [ "ć", "Ò", "è", "Ĉ" ], [ "ĉ", "Õ", "ê", "Ċ" ], [ "ċ", "Ø", "ì", "Č" ], [ "č", "ç", "î", "Ď" ], [ "ď", "Û", "ð", "Đ" ], [ "đ", "Þ", "ó", "Ē" ], [ "ē", "é", "õ", "Ĕ" ], [ "ĕ", "ë", "Ė", "ė" ], [ "Ę", "å", "ę", "Ě" ], [ "ě", "í", "ú", "Ĝ" ], [ "ĝ", "ï", "ü", "Ğ" ], [ "ğ", "ô", "Ġ", "ġ" ], [ "Ģ", "ö", "Ă", "ģ" ], [ "Ĥ", "Ė", "R", "ĥ" ], [ "Ħ", "ę", "V", "ħ" ], [ "Ĩ", "û", "ĩ", "Ī" ], [ "ī", "Ġ", "Å", "Ì" ], [ "Ĭ", "ĩ", "Ë", "ĭ" ], [ "Į", "į", "İ", "ı" ], [ "Ě", "Ħ", "IJ", "ij" ], [ "ġ", "ī", "Ĵ", "ĵ" ], [ "Ī", "Ĭ", "Ķ", "ķ" ], [ "ĸ", "Î", "ą", "Ĺ" ], [ "ĺ", "Ñ", "ć", "Ļ" ], [ "ļ", "×", "ċ", "Ľ" ], [ "ľ", "Ć", "č", "Ŀ" ], [ "ŀ", "Ý", "đ", "Ł" ], [ "ł", "Ĉ", "ē", "Ń" ], [ "ń", "Ċ", "ĕ", "Ņ" ], [ "ņ", "ä", "Ę", "Ň" ], [ "ň", "Č", "ě", "ʼn" ], [ "Ŋ", "Ď", "ĝ", "ŋ" ], [ "Ō", "Đ", "ō", "Ŏ" ], [ "ŏ", "Ē", "ğ", "Ő" ], [ "ő", "Ĕ", "Ģ", "Œ" ], [ "œ", "ė", "Ĥ", "Ŕ" ], [ "ŕ", "Ĝ", "Ĩ", "Ŗ" ], [ "ŗ", "Ğ", "Ř", "ř" ], [ "Ś", "ģ", "ś", "Ŝ" ], [ "Ļ", "ĸ", "ŝ", "Ş" ], [ "Ľ", "ĺ", "ş", "Š" ], [ "Ł", "ļ", "š", "Ţ" ], [ "Ň", "ŀ", "ţ", "Ť" ], [ "İ", "ņ", "ť", "Ŧ" ], [ "ŧ", "Ũ", "Ô", "ĉ" ], [ "ũ", "Ŀ", "Ũ", "Ū" ], [ "ū", "Ŭ", "Ú", "ď" ], [ "ŭ", "Ń", "ľ", "Ů" ], [ "ů", "Ņ", "Ŭ", "Ű" ], [ "ű", "Ų", "á", "ų" ], [ "Ŵ", "ʼn", "ł", "ŵ" ], [ "Ŷ", "ŋ", "ń", "ŷ" ], [ "Ÿ", "Ŏ", "Ų", "Ź" ], [ "ź", "Ő", "ň", "Ż" ], [ "ż", "Œ", "Ŋ", "Ž" ], [ "ž", "Ŕ", "Ō", "ſ" ], [ "ƀ", "ų", "â", "÷" ], [ "Ɓ", "IJ", "ŏ", "Ƃ" ], [ "ƃ", "Ŗ", "ő", "Ƅ" ], [ "ƅ", "ř", "œ", "Ɔ" ], [ "Ƈ", "ō", "ò", "ÿ" ], [ "ƈ", "Ĵ", "ŕ", "Ɖ" ], [ "Ɗ", "Ķ", "Ś", "Ƌ" ], [ "ƌ", "Ř", "þ", "ƍ" ], [ "Ǝ", "ś", "Ą", "Ə" ], [ "ı", "Ɓ", "Ɛ", "Ƒ" ], [ "ij", "ƈ", "ƒ", "Ɠ" ], [ "ĵ", "Ɗ", "Ɣ", "ƕ" ], [ "Ɩ", "Š", "ũ", "Ɨ" ], [ "Ƙ", "Ţ", "ŭ", "ƙ" ], [ "ƚ", "Ů", "ů", "ƛ" ], [ "Ɯ", "Ť", "Ŵ", "Ɲ" ], [ "ƞ", "ŵ", "Ŷ", "Ɵ" ], [ "Ơ", "ŷ", "Ÿ", "ơ" ], [ "Ƣ", "Ŧ", "ź", "ƣ" ], [ "Ƥ", "Ż", "ż", "ƥ" ], [ "Ʀ", "Ž", "ž", "Ƨ" ], [ "ƨ", "Ƃ", "ƃ", "Ʃ" ], [ "ƪ", "Ƅ", "ƅ", "ƫ" ], [ "Ƭ", "Ɖ", "ƭ", "Ʈ" ], [ "Ư", "ƭ", "Ŝ", "ŗ" ], [ "ŝ", "ư", "Ʊ", "Ʋ" ], [ "ş", "Ɩ", "Ƴ", "ƴ" ], [ "š", "Ƙ", "Ƶ", "ƶ" ], [ "ţ", "Ɯ", "Ʒ", "Ƹ" ], [ "ť", "Ƣ", "ƹ", "ƺ" ], [ "ƻ", "ư", "Ş", "ŧ" ], [ "Ƽ", "Ɨ", "ƽ", "ƾ" ], [ "ƿ", "ƽ", "Ū", "ū" ], [ "ǀ", "ƙ", "ƚ", "ǁ" ], [ "ǂ", "ƛ", "ǃ", "DŽ" ], [ "Dž", "ǃ", "Ű", "ű" ], [ "dž", "Ɲ", "ƞ", "LJ" ], [ "Lj", "Ɵ", "Ơ", "lj" ], [ "NJ", "ơ", "Nj", "nj" ], [ "Ǎ", "Nj", "Ź", "ǎ" ], [ "Ǐ", "ƣ", "Ƥ", "ǐ" ], [ "Ǒ", "ƥ", "Ʀ", "ǒ" ], [ "Ǔ", "Ƨ", "ǔ", "Ǖ" ], [ "ǖ", "ǔ", "ſ", "ƀ" ], [ "Ǘ", "Ƒ", "ƨ", "ǘ" ], [ "Ǚ", "Ʃ", "ƪ", "ǚ" ], [ "Ǜ", "ƫ", "ǜ", "ǝ" ], [ "Ǟ", "ǜ", "Ɔ", "Ƈ" ], [ "ǟ", "Ɠ", "Ƭ", "Ǡ" ], [ "ǡ", "Ʈ", "Ư", "Ǣ" ], [ "ǣ", "ƕ", "Ǥ", "ǥ" ], [ "Ǧ", "Ǥ", "Ƌ", "ƌ" ], [ "Ʋ", "ƻ", "ǧ", "Ǩ" ], [ "ƾ", "ƿ", "ǩ", "Ǫ" ], [ "DŽ", "Dž", "ǫ", "Ǭ" ], [ "ǭ", "ƴ", "Ƽ", "Ǯ" ], [ "ǯ", "ƶ", "ǀ", "ǰ" ], [ "DZ", "ǁ", "ǂ", "Dz" ], [ "dz", "Ƹ", "dž", "Ǵ" ], [ "ǵ", "LJ", "Lj", "Ƕ" ], [ "Ƿ", "lj", "NJ", "Ǹ" ], [ "ǹ", "ƺ", "Ǐ", "Ǻ" ], [ "ǻ", "ǐ", "Ǒ", "Ǽ" ], [ "ǽ", "ǒ", "Ǔ", "Ǿ" ], [ "ǿ", "Ǖ", "ǖ", "Ȁ" ], [ "ȁ", "ǘ", "Ǚ", "Ȃ" ], [ "ȃ", "ǚ", "Ǜ", "Ȅ" ], [ "ȅ", "Ǡ", "ǡ", "Ȇ" ], [ "ȇ", "ǥ", "Ǧ", "Ȉ" ], [ "ȉ", "ǧ", "ǭ", "Ȋ" ], [ "ȋ", "Ǯ", "ǯ", "Ȍ" ], [ "ȍ", "ǩ", "DZ", "Ȏ" ], [ "ȏ", "ǰ", "dz", "Ȑ" ], [ "ȑ", "Dz", "ǵ", "Ȓ" ], [ "ȓ", "ǫ", "Ƿ", "Ȕ" ], [ "ȕ", "Ǵ", "ǹ", "Ȗ" ], [ "ȗ", "Ƕ", "ǻ", "Ș" ], [ "ș", "Ǹ", "ǽ", "Ț" ], [ "ț", "Ǻ", "Ȝ", "ȝ" ], [ "Ȟ", "Ǽ", "ȁ", "ȟ" ], [ "Ƞ", "Ǿ", "ȃ", "ȡ" ], [ "Ȣ", "Ȝ", "Ɛ", "Ǘ" ], [ "ȣ", "Ȃ", "Ȥ", "ȥ" ], [ "Ȧ", "Ȅ", "ȅ", "ȧ" ], [ "Ȩ", "ȩ", "ǝ", "Ǟ" ], [ "Ȫ", "Ȥ", "ƒ", "ǟ" ], [ "ȫ", "Ȇ", "Ȭ", "ȭ" ], [ "Ȯ", "Ȭ", "Ɣ", "ǣ" ], [ "ȯ", "Ȱ", "ķ", "Ǝ" ], [ "Ĺ", "ȉ", "ȱ", "Ȳ" ], [ "Ʊ", "ȋ", "ȳ", "ȴ" ], [ "Ǩ", "ȍ", "ȵ", "ȶ" ], [ "Ƴ", "ȏ", "ȷ", "ȸ" ], [ "Ǫ", "ȓ", "ȹ", "Ⱥ" ], [ "Ƶ", "ȕ", "Ȼ", "ȼ" ], [ "Ǭ", "Ƚ", "Ⱦ", "ȿ" ], [ "Ʒ", "ț", "ɀ", "Ɂ" ], [ "ɂ", "Ȋ", "ȑ", "Ƀ" ], [ "Ʉ", "Ȍ", "ȗ", "Ʌ" ], [ "Ɇ", "Ȏ", "ș", "ɇ" ], [ "Ɉ", "Ȑ", "Ȟ", "ɉ" ], [ "Ɋ", "Ȓ", "Ƞ", "ɋ" ], [ "Ɍ", "Ȕ", "ɍ", "Ɏ" ], [ "ɏ", "Ȗ", "ȣ", "ɐ" ], [ "ɑ", "Ș", "Ȧ", "ɒ" ], [ "ɓ", "Ƚ", "ɔ", "ǿ" ], [ "ɕ", "ȟ", "ȫ", "ɖ" ], [ "ɗ", "ȡ", "ɘ", "ə" ], [ "ɚ", "ɍ", "Ȁ", "ȩ" ], [ "ɛ", "ȧ", "ɜ", "ɝ" ], [ "ɞ", "ɘ", "Ǣ", "ȇ" ], [ "ɟ", "ɜ", "Ȉ", "Ȱ" ], [ "ɠ", "Ȳ", "ɂ", "ɡ" ], [ "ɢ", "ȴ", "Ʉ", "ɣ" ], [ "ɤ", "ȶ", "Ɇ", "ɥ" ], [ "ɦ", "ȸ", "Ɉ", "ɧ" ], [ "ɨ", "Ƀ", "Ɋ", "ɩ" ], [ "ɪ", "Ⱥ", "Ɍ", "ɫ" ], [ "ɬ", "ȼ", "ɏ", "ɭ" ], [ "ɮ", "Ʌ", "ɑ", "ɯ" ], [ "ɰ", "ɇ", "ɱ", "ɲ" ], [ "ɳ", "Ɂ", "ɴ", "ɵ" ], [ "ɶ", "ɉ", "ɕ", "ɷ" ], [ "ɸ", "ɋ", "ɗ", "ɹ" ], [ "ɺ", "ɐ", "ɻ", "ɼ" ], [ "ɽ", "ɒ", "ɛ", "ɾ" ], [ "ɿ", "ɱ", "Ț", "Ȩ" ], [ "ʀ", "ɴ", "ȝ", "Ȫ" ], [ "ʁ", "ɖ", "ʂ", "ʃ" ], [ "ʄ", "ɻ", "ȥ", "Ȯ" ], [ "ʅ", "ʂ", "ȭ", "ȯ" ], [ "ƹ", "Ȣ", "ʆ", "ʇ" ], [ "ɵ", "ʀ", "ʈ", "ʉ" ], [ "ɼ", "ʄ", "ʊ", "ʋ" ], [ "ʃ", "ʅ", "ʌ", "ʍ" ], [ "ʎ", "ȳ", "ɢ", "ʏ" ], [ "ʐ", "ȷ", "ɦ", "ʑ" ], [ "ʒ", "ɡ", "ɨ", "ʓ" ], [ "ʔ", "Ȼ", "ɬ", "ʕ" ], [ "ʖ", "ɣ", "ɮ", "ʗ" ], [ "ʘ", "ɥ", "ɰ", "ʙ" ], [ "ʚ", "ɀ", "ɳ", "ʛ" ], [ "ʜ", "ɧ", "ɶ", "ʝ" ], [ "ʞ", "ɩ", "ɸ", "ʟ" ], [ "ʠ", "ɫ", "ʡ", "ʢ" ], [ "ʣ", "ɭ", "ɺ", "ʤ" ], [ "ʥ", "ɯ", "ɽ", "ʦ" ], [ "ʧ", "ɲ", "ɿ", "ʨ" ], [ "ʩ", "ɷ", "ʁ", "ʪ" ], [ "ʫ", "ɹ", "ʬ", "ʭ" ], [ "ʮ", "ɾ", "ʯ", "ʰ" ], [ "ʏ", "ʱ", "ʲ", "ʳ" ], [ "ʑ", "ʎ", "ʴ", "ʵ" ], [ "ʕ", "ʐ", "ʶ", "ʷ" ], [ "ʛ", "ʔ", "ʸ", "ʹ" ], [ "ʆ", "ʚ", "ʺ", "ʻ" ], [ "ʼ", "ʽ", "ȵ", "ɤ" ], [ "ʾ", "ʓ", "ʽ", "ʿ" ], [ "ˀ", "ˁ", "ȹ", "ɪ" ], [ "˂", "ʗ", "ʒ", "˃" ], [ "˄", "ʙ", "ˁ", "˅" ], [ "ˆ", "ˇ", "Ⱦ", "ˈ" ], [ "ˉ", "ʝ", "ʖ", "ˊ" ], [ "ˋ", "ʟ", "ʘ", "ˌ" ], [ "ˍ", "ʢ", "ˇ", "ˎ" ], [ "ˏ", "nj", "Ǎ", "ɔ" ], [ "ː", "ʤ", "ʜ", "ˑ" ], [ "˒", "ʦ", "ʞ", "˓" ], [ "˔", "ʨ", "ʠ", "˕" ], [ "˖", "ˈ", "ȿ", "ɓ" ], [ "˗", "ʈ", "ʣ", "˘" ], [ "˙", "ʪ", "ʥ", "˚" ], [ "˛", "ʭ", "ʧ", "˜" ], [ "˝", "ʡ", "Ɏ", "ɚ" ], [ "˞", "ʊ", "ʩ", "˟" ], [ "ˠ", "ʌ", "ʮ", "ˡ" ], [ "ˢ", "ʬ", "ə", "ɞ" ], [ "ˣ", "ʯ", "ɝ", "ɟ" ], [ "ʇ", "˗", "ˤ", "˥" ], [ "ʉ", "˞", "˦", "˧" ], [ "ʋ", "ˠ", "˨", "˩" ], [ "˪", "ʵ", "ʾ", "˫" ], [ "ˬ", "ʷ", "˂", "˭" ], [ "ˮ", "˃", "˄", "˯" ], [ "˰", "ʹ", "ˉ", "˱" ], [ "˲", "ˊ", "ˋ", "˳" ], [ "˴", "ˌ", "ˍ", "˵" ], [ "˶", "ʻ", "ː", "˷" ], [ "˸", "ˑ", "˒", "˹" ], [ "˺", "˓", "˔", "˻" ], [ "˼", "˘", "˙", "˽" ], [ "˾", "˚", "˛", "˿" ], [ "̀", "˟", "́", "̂" ], [ "̃", "́", "ʰ", "ʫ" ], [ "̄", "̅", "ʳ", "ʼ" ], [ "̆", "˫", "̇", "̈" ], [ "̉", "̇", "ʿ", "ˀ" ], [ "̊", "˭", "ˮ", "̋" ], [ "̌", "˯", "̍", "̎" ], [ "̏", "̍", "˅", "ˆ" ], [ "̐", "˱", "˲", "̑" ], [ "̒", "˳", "˴", "̓" ], [ "̔", "˵", "̕", "̖" ], [ "̗", "̕", "ˎ", "ˏ" ], [ "̘", "˷", "˸", "̙" ], [ "̚", "˹", "˺", "̛" ], [ "̜", "˻", "̝", "̞" ], [ "̟", "̝", "˕", "˖" ], [ "̠", "˥", "˼", "̡" ], [ "̢", "˽", "˾", "̣" ], [ "̤", "˿", "̥", "̦" ], [ "̧", "̥", "˜", "˝" ], [ "̨", "˧", "̀", "̩" ], [ "̪", "̂", "̃", "̫" ], [ "̬", "˩", "̭", "̮" ], [ "̯", "̭", "ˡ", "ˢ" ], [ "̖", "̗", "̰" ], [ "̱", "̲", "̆", "̳" ], [ "̴", "̵", "̊", "̶" ], [ "̷", "̋", "̌", "̸" ], [ "̹", "̺", "̐", "̻" ], [ "̼", "̑", "̒", "̽" ], [ "̾", "̓", "̔", "̿" ], [ "̀", "́", "̘", "͂" ], [ "̓", "̙", "̚", "̈́" ], [ "ͅ", "̛", "̜", "͆" ], [ "͇", "̞", "̟", "͈" ], [ "͉", "̡", "̢", "͊" ], [ "͋", "̣", "̤", "͌" ], [ "͍", "̩", "̪", "͎" ], [ "͏", "̮", "̯", "͐" ], [ "ʱ", "ȱ", "ɠ", "͑" ], [ "ʲ", "̅", "͒", "͓" ], [ "͒", "̄", "͔", "͕" ], [ "ʴ", "˪", "̲", "͖" ], [ "͑", "͔", "̱", "͗" ], [ "̈", "̉", "͘", "͙" ], [ "ʶ", "ˬ", "̵", "͚" ], [ "͓", "̳", "̴", "͛" ], [ "͕", "͘", "̷", "͜" ], [ "̎", "̏", "͝", "͞" ], [ "͞", "̰", "͇" ], [ "ʸ", "˰", "̺", "͟" ], [ "͖", "̶", "̹", "͠" ], [ "͗", "̸", "̼", "͡" ], [ "͙", "͝", "̾", "͢" ], [ "͢", "͈", "ͣ" ], [ "ʺ", "˶", "́", "ͤ" ], [ "ͤ", "ͥ", "ˤ", "̠" ], [ "͚", "̻", "̀", "ͦ" ], [ "͛", "̽", "̓", "ͧ" ], [ "͜", "̿", "ͅ", "ͨ" ], [ "ͨ", "ͣ", "̦", "̧" ], [ "͟", "͂", "ͥ", "ͩ" ], [ "ͩ", "ͪ", "˦", "̨" ], [ "͠", "̈́", "͉", "ͫ" ], [ "͡", "͆", "͋", "ͬ" ], [ "ͬ", "̫", "͏" ], [ "ͦ", "͊", "ͪ", "ͭ" ], [ "ͭ", "ͮ", "˨", "̬" ], [ "ͧ", "͌", "͍", "ͯ" ], [ "ͯ", "͐", "Ͱ" ], [ "ͫ", "͎", "ͮ", "ͱ" ], [ "ͱ", "Ͱ", "ʍ", "ˣ" ], [ "Í", "Ͳ", "ͳ" ], [ "f", "ħ", "Ä" ], [ "ʹ", "ĥ", "ā" ], [ "b", "į", "U" ], [ "͵", "ù", "Ā" ], [ "Ͷ", "ǎ", "ø" ], [ "ͷ", "D", "ß" ], [ "͸", "r", "Ù" ], [ "Ð", "j", "Ó" ], [ "ĭ", "Ə", "ă", "ͳ" ], [ "g", "ƍ", "ý", "Ͳ" ], [ "c", "Á", "ʹ", "Ç" ], [ "͹", "Q", "͵", "À" ], [ "ͺ", "M", "͹", "X" ], [ "ͻ", "E", "Ͷ", "P" ], [ "ͼ", "A", "ͻ", "L" ], [ "ͽ", "s", "ͷ", "z" ], [ "Į", "I", "ͺ", "T" ], [ "ã", "w", "ͼ", "H" ], [ "Ü", "o", "ͽ", "v" ], [ "Ö", "k", "͸", "n" ] ], "output": [], "size_dict": { "a": 2, "b": 2, "c": 2, "d": 2, "e": 2, "f": 2, "g": 2, "h": 2, "i": 2, "j": 2, "k": 2, "l": 2, "m": 2, "n": 2, "o": 2, "p": 2, "q": 2, "r": 2, "s": 2, "t": 2, "u": 2, "v": 2, "w": 2, "x": 2, "y": 2, "z": 2, "A": 2, "B": 2, "C": 2, "D": 2, "E": 2, "F": 2, "G": 2, "H": 2, "I": 2, "J": 2, "K": 2, "L": 2, "M": 2, "N": 2, "O": 2, "P": 2, "Q": 2, "R": 2, "S": 2, "T": 2, "U": 2, "V": 2, "W": 2, "X": 2, "Y": 2, "Z": 2, "À": 2, "Á": 2, "Â": 2, "Ã": 2, "Ä": 2, "Å": 2, "Æ": 2, "Ç": 2, "È": 2, "É": 2, "Ê": 2, "Ë": 2, "Ì": 2, "Í": 2, "Î": 2, "Ï": 2, "Ð": 2, "Ñ": 2, "Ò": 2, "Ó": 2, "Ô": 2, "Õ": 2, "Ö": 2, "×": 2, "Ø": 2, "Ù": 2, "Ú": 2, "Û": 2, "Ü": 2, "Ý": 2, "Þ": 2, "ß": 2, "à": 2, "á": 2, "â": 2, "ã": 2, "ä": 2, "å": 2, "æ": 2, "ç": 2, "è": 2, "é": 2, "ê": 2, "ë": 2, "ì": 2, "í": 2, "î": 2, "ï": 2, "ð": 2, "ñ": 2, "ò": 2, "ó": 2, "ô": 2, "õ": 2, "ö": 2, "÷": 2, "ø": 2, "ù": 2, "ú": 2, "û": 2, "ü": 2, "ý": 2, "þ": 2, "ÿ": 2, "Ā": 2, "ā": 2, "Ă": 2, "ă": 2, "Ą": 2, "ą": 2, "Ć": 2, "ć": 2, "Ĉ": 2, "ĉ": 2, "Ċ": 2, "ċ": 2, "Č": 2, "č": 2, "Ď": 2, "ď": 2, "Đ": 2, "đ": 2, "Ē": 2, "ē": 2, "Ĕ": 2, "ĕ": 2, "Ė": 2, "ė": 2, "Ę": 2, "ę": 2, "Ě": 2, "ě": 2, "Ĝ": 2, "ĝ": 2, "Ğ": 2, "ğ": 2, "Ġ": 2, "ġ": 2, "Ģ": 2, "ģ": 2, "Ĥ": 2, "ĥ": 2, "Ħ": 2, "ħ": 2, "Ĩ": 2, "ĩ": 2, "Ī": 2, "ī": 2, "Ĭ": 2, "ĭ": 2, "Į": 2, "į": 2, "İ": 2, "ı": 2, "IJ": 2, "ij": 2, "Ĵ": 2, "ĵ": 2, "Ķ": 2, "ķ": 2, "ĸ": 2, "Ĺ": 2, "ĺ": 2, "Ļ": 2, "ļ": 2, "Ľ": 2, "ľ": 2, "Ŀ": 2, "ŀ": 2, "Ł": 2, "ł": 2, "Ń": 2, "ń": 2, "Ņ": 2, "ņ": 2, "Ň": 2, "ň": 2, "ʼn": 2, "Ŋ": 2, "ŋ": 2, "Ō": 2, "ō": 2, "Ŏ": 2, "ŏ": 2, "Ő": 2, "ő": 2, "Œ": 2, "œ": 2, "Ŕ": 2, "ŕ": 2, "Ŗ": 2, "ŗ": 2, "Ř": 2, "ř": 2, "Ś": 2, "ś": 2, "Ŝ": 2, "ŝ": 2, "Ş": 2, "ş": 2, "Š": 2, "š": 2, "Ţ": 2, "ţ": 2, "Ť": 2, "ť": 2, "Ŧ": 2, "ŧ": 2, "Ũ": 2, "ũ": 2, "Ū": 2, "ū": 2, "Ŭ": 2, "ŭ": 2, "Ů": 2, "ů": 2, "Ű": 2, "ű": 2, "Ų": 2, "ų": 2, "Ŵ": 2, "ŵ": 2, "Ŷ": 2, "ŷ": 2, "Ÿ": 2, "Ź": 2, "ź": 2, "Ż": 2, "ż": 2, "Ž": 2, "ž": 2, "ſ": 2, "ƀ": 2, "Ɓ": 2, "Ƃ": 2, "ƃ": 2, "Ƅ": 2, "ƅ": 2, "Ɔ": 2, "Ƈ": 2, "ƈ": 2, "Ɖ": 2, "Ɗ": 2, "Ƌ": 2, "ƌ": 2, "ƍ": 2, "Ǝ": 2, "Ə": 2, "Ɛ": 2, "Ƒ": 2, "ƒ": 2, "Ɠ": 2, "Ɣ": 2, "ƕ": 2, "Ɩ": 2, "Ɨ": 2, "Ƙ": 2, "ƙ": 2, "ƚ": 2, "ƛ": 2, "Ɯ": 2, "Ɲ": 2, "ƞ": 2, "Ɵ": 2, "Ơ": 2, "ơ": 2, "Ƣ": 2, "ƣ": 2, "Ƥ": 2, "ƥ": 2, "Ʀ": 2, "Ƨ": 2, "ƨ": 2, "Ʃ": 2, "ƪ": 2, "ƫ": 2, "Ƭ": 2, "ƭ": 2, "Ʈ": 2, "Ư": 2, "ư": 2, "Ʊ": 2, "Ʋ": 2, "Ƴ": 2, "ƴ": 2, "Ƶ": 2, "ƶ": 2, "Ʒ": 2, "Ƹ": 2, "ƹ": 2, "ƺ": 2, "ƻ": 2, "Ƽ": 2, "ƽ": 2, "ƾ": 2, "ƿ": 2, "ǀ": 2, "ǁ": 2, "ǂ": 2, "ǃ": 2, "DŽ": 2, "Dž": 2, "dž": 2, "LJ": 2, "Lj": 2, "lj": 2, "NJ": 2, "Nj": 2, "nj": 2, "Ǎ": 2, "ǎ": 2, "Ǐ": 2, "ǐ": 2, "Ǒ": 2, "ǒ": 2, "Ǔ": 2, "ǔ": 2, "Ǖ": 2, "ǖ": 2, "Ǘ": 2, "ǘ": 2, "Ǚ": 2, "ǚ": 2, "Ǜ": 2, "ǜ": 2, "ǝ": 2, "Ǟ": 2, "ǟ": 2, "Ǡ": 2, "ǡ": 2, "Ǣ": 2, "ǣ": 2, "Ǥ": 2, "ǥ": 2, "Ǧ": 2, "ǧ": 2, "Ǩ": 2, "ǩ": 2, "Ǫ": 2, "ǫ": 2, "Ǭ": 2, "ǭ": 2, "Ǯ": 2, "ǯ": 2, "ǰ": 2, "DZ": 2, "Dz": 2, "dz": 2, "Ǵ": 2, "ǵ": 2, "Ƕ": 2, "Ƿ": 2, "Ǹ": 2, "ǹ": 2, "Ǻ": 2, "ǻ": 2, "Ǽ": 2, "ǽ": 2, "Ǿ": 2, "ǿ": 2, "Ȁ": 2, "ȁ": 2, "Ȃ": 2, "ȃ": 2, "Ȅ": 2, "ȅ": 2, "Ȇ": 2, "ȇ": 2, "Ȉ": 2, "ȉ": 2, "Ȋ": 2, "ȋ": 2, "Ȍ": 2, "ȍ": 2, "Ȏ": 2, "ȏ": 2, "Ȑ": 2, "ȑ": 2, "Ȓ": 2, "ȓ": 2, "Ȕ": 2, "ȕ": 2, "Ȗ": 2, "ȗ": 2, "Ș": 2, "ș": 2, "Ț": 2, "ț": 2, "Ȝ": 2, "ȝ": 2, "Ȟ": 2, "ȟ": 2, "Ƞ": 2, "ȡ": 2, "Ȣ": 2, "ȣ": 2, "Ȥ": 2, "ȥ": 2, "Ȧ": 2, "ȧ": 2, "Ȩ": 2, "ȩ": 2, "Ȫ": 2, "ȫ": 2, "Ȭ": 2, "ȭ": 2, "Ȯ": 2, "ȯ": 2, "Ȱ": 2, "ȱ": 2, "Ȳ": 2, "ȳ": 2, "ȴ": 2, "ȵ": 2, "ȶ": 2, "ȷ": 2, "ȸ": 2, "ȹ": 2, "Ⱥ": 2, "Ȼ": 2, "ȼ": 2, "Ƚ": 2, "Ⱦ": 2, "ȿ": 2, "ɀ": 2, "Ɂ": 2, "ɂ": 2, "Ƀ": 2, "Ʉ": 2, "Ʌ": 2, "Ɇ": 2, "ɇ": 2, "Ɉ": 2, "ɉ": 2, "Ɋ": 2, "ɋ": 2, "Ɍ": 2, "ɍ": 2, "Ɏ": 2, "ɏ": 2, "ɐ": 2, "ɑ": 2, "ɒ": 2, "ɓ": 2, "ɔ": 2, "ɕ": 2, "ɖ": 2, "ɗ": 2, "ɘ": 2, "ə": 2, "ɚ": 2, "ɛ": 2, "ɜ": 2, "ɝ": 2, "ɞ": 2, "ɟ": 2, "ɠ": 2, "ɡ": 2, "ɢ": 2, "ɣ": 2, "ɤ": 2, "ɥ": 2, "ɦ": 2, "ɧ": 2, "ɨ": 2, "ɩ": 2, "ɪ": 2, "ɫ": 2, "ɬ": 2, "ɭ": 2, "ɮ": 2, "ɯ": 2, "ɰ": 2, "ɱ": 2, "ɲ": 2, "ɳ": 2, "ɴ": 2, "ɵ": 2, "ɶ": 2, "ɷ": 2, "ɸ": 2, "ɹ": 2, "ɺ": 2, "ɻ": 2, "ɼ": 2, "ɽ": 2, "ɾ": 2, "ɿ": 2, "ʀ": 2, "ʁ": 2, "ʂ": 2, "ʃ": 2, "ʄ": 2, "ʅ": 2, "ʆ": 2, "ʇ": 2, "ʈ": 2, "ʉ": 2, "ʊ": 2, "ʋ": 2, "ʌ": 2, "ʍ": 2, "ʎ": 2, "ʏ": 2, "ʐ": 2, "ʑ": 2, "ʒ": 2, "ʓ": 2, "ʔ": 2, "ʕ": 2, "ʖ": 2, "ʗ": 2, "ʘ": 2, "ʙ": 2, "ʚ": 2, "ʛ": 2, "ʜ": 2, "ʝ": 2, "ʞ": 2, "ʟ": 2, "ʠ": 2, "ʡ": 2, "ʢ": 2, "ʣ": 2, "ʤ": 2, "ʥ": 2, "ʦ": 2, "ʧ": 2, "ʨ": 2, "ʩ": 2, "ʪ": 2, "ʫ": 2, "ʬ": 2, "ʭ": 2, "ʮ": 2, "ʯ": 2, "ʰ": 2, "ʱ": 2, "ʲ": 2, "ʳ": 2, "ʴ": 2, "ʵ": 2, "ʶ": 2, "ʷ": 2, "ʸ": 2, "ʹ": 2, "ʺ": 2, "ʻ": 2, "ʼ": 2, "ʽ": 2, "ʾ": 2, "ʿ": 2, "ˀ": 2, "ˁ": 2, "˂": 2, "˃": 2, "˄": 2, "˅": 2, "ˆ": 2, "ˇ": 2, "ˈ": 2, "ˉ": 2, "ˊ": 2, "ˋ": 2, "ˌ": 2, "ˍ": 2, "ˎ": 2, "ˏ": 2, "ː": 2, "ˑ": 2, "˒": 2, "˓": 2, "˔": 2, "˕": 2, "˖": 2, "˗": 2, "˘": 2, "˙": 2, "˚": 2, "˛": 2, "˜": 2, "˝": 2, "˞": 2, "˟": 2, "ˠ": 2, "ˡ": 2, "ˢ": 2, "ˣ": 2, "ˤ": 2, "˥": 2, "˦": 2, "˧": 2, "˨": 2, "˩": 2, "˪": 2, "˫": 2, "ˬ": 2, "˭": 2, "ˮ": 2, "˯": 2, "˰": 2, "˱": 2, "˲": 2, "˳": 2, "˴": 2, "˵": 2, "˶": 2, "˷": 2, "˸": 2, "˹": 2, "˺": 2, "˻": 2, "˼": 2, "˽": 2, "˾": 2, "˿": 2, "̀": 2, "́": 2, "̂": 2, "̃": 2, "̄": 2, "̅": 2, "̆": 2, "̇": 2, "̈": 2, "̉": 2, "̊": 2, "̋": 2, "̌": 2, "̍": 2, "̎": 2, "̏": 2, "̐": 2, "̑": 2, "̒": 2, "̓": 2, "̔": 2, "̕": 2, "̖": 2, "̗": 2, "̘": 2, "̙": 2, "̚": 2, "̛": 2, "̜": 2, "̝": 2, "̞": 2, "̟": 2, "̠": 2, "̡": 2, "̢": 2, "̣": 2, "̤": 2, "̥": 2, "̦": 2, "̧": 2, "̨": 2, "̩": 2, "̪": 2, "̫": 2, "̬": 2, "̭": 2, "̮": 2, "̯": 2, "̰": 2, "̱": 2, "̲": 2, "̳": 2, "̴": 2, "̵": 2, "̶": 2, "̷": 2, "̸": 2, "̹": 2, "̺": 2, "̻": 2, "̼": 2, "̽": 2, "̾": 2, "̿": 2, "̀": 2, "́": 2, "͂": 2, "̓": 2, "̈́": 2, "ͅ": 2, "͆": 2, "͇": 2, "͈": 2, "͉": 2, "͊": 2, "͋": 2, "͌": 2, "͍": 2, "͎": 2, "͏": 2, "͐": 2, "͑": 2, "͒": 2, "͓": 2, "͔": 2, "͕": 2, "͖": 2, "͗": 2, "͘": 2, "͙": 2, "͚": 2, "͛": 2, "͜": 2, "͝": 2, "͞": 2, "͟": 2, "͠": 2, "͡": 2, "͢": 2, "ͣ": 2, "ͤ": 2, "ͥ": 2, "ͦ": 2, "ͧ": 2, "ͨ": 2, "ͩ": 2, "ͪ": 2, "ͫ": 2, "ͬ": 2, "ͭ": 2, "ͮ": 2, "ͯ": 2, "Ͱ": 2, "ͱ": 2, "Ͳ": 2, "ͳ": 2, "ʹ": 2, "͵": 2, "Ͷ": 2, "ͷ": 2, "͸": 2, "͹": 2, "ͺ": 2, "ͻ": 2, "ͼ": 2, "ͽ": 2 } } ================================================ FILE: examples/circuit_n53_m10_s0_e0_pABCDCDAB.qsim ================================================ 53 0 hz_1_2 0 0 x_1_2 1 0 x_1_2 2 0 hz_1_2 3 0 y_1_2 4 0 hz_1_2 5 0 hz_1_2 6 0 hz_1_2 7 0 hz_1_2 8 0 x_1_2 9 0 y_1_2 10 0 hz_1_2 11 0 hz_1_2 12 0 hz_1_2 13 0 hz_1_2 14 0 y_1_2 15 0 x_1_2 16 0 x_1_2 17 0 hz_1_2 18 0 x_1_2 19 0 x_1_2 20 0 hz_1_2 21 0 y_1_2 22 0 x_1_2 23 0 x_1_2 24 0 y_1_2 25 0 hz_1_2 26 0 x_1_2 27 0 hz_1_2 28 0 hz_1_2 29 0 x_1_2 30 0 x_1_2 31 0 x_1_2 32 0 y_1_2 33 0 hz_1_2 34 0 y_1_2 35 0 hz_1_2 36 0 hz_1_2 37 0 hz_1_2 38 0 y_1_2 39 0 hz_1_2 40 0 x_1_2 41 0 x_1_2 42 0 x_1_2 43 0 hz_1_2 44 0 y_1_2 45 0 x_1_2 46 0 hz_1_2 47 0 y_1_2 48 0 y_1_2 49 0 y_1_2 50 0 hz_1_2 51 0 x_1_2 52 1 rz 1 2.4326562950300605 1 rz 4 -2.225882728378087 1 rz 3 -2.7293249642087485 1 rz 7 1.210696502097985 1 rz 5 -1.106519059371497 1 rz 9 1.7892230375389613 1 rz 6 0.2119958279956058 1 rz 13 -0.11128338095950507 1 rz 8 2.8937947545666063 1 rz 15 -2.9549982284793814 1 rz 10 1.2842227411644753 1 rz 17 -1.1227354153032945 1 rz 12 1.3465899378642412 1 rz 21 -1.781829442911482 1 rz 14 2.1872907310716982 1 rz 23 -1.9614019632142368 1 rz 16 1.5928715721087023 1 rz 25 -1.5401880072083034 1 rz 18 -2.5911695330397535 1 rz 27 2.612251899130335 1 rz 20 2.404798154102042 1 rz 30 -2.3947316562728576 1 rz 22 -2.365932000948667 1 rz 32 2.2191901639168874 1 rz 24 -2.4350373161309906 1 rz 34 3.0221985839799075 1 rz 26 -2.610806420739799 1 rz 36 2.560219630921752 1 rz 29 1.785834483295006 1 rz 37 -1.7147844803365624 1 rz 31 1.4590820918158975 1 rz 39 -2.7148644518625993 1 rz 33 1.0568019349008715 1 rz 41 -1.294748318842905 1 rz 35 2.7682990982443236 1 rz 43 -2.576048471247548 1 rz 38 -1.6256583901850972 1 rz 44 1.6003028045331185 1 rz 40 -0.8433460214812949 1 rz 46 0.8404319695057677 1 rz 42 2.4767110913272044 1 rz 48 2.92322176167281 1 rz 45 1.718893981077632 1 rz 49 -1.8507490475426254 1 rz 47 2.3200371653684186 1 rz 51 -2.340928713256203 1 rz 50 -0.5750038022730992 1 rz 52 -0.5519833389561652 2 fs 1 4 1.5157741664069029 0.5567125777723744 2 fs 3 7 1.5177580142209797 0.4948108578225166 2 fs 5 9 1.6036738621219824 0.47689957001758815 2 fs 6 13 1.5177327089642791 0.5058312223892585 2 fs 8 15 1.5253184444076096 0.46557175536519374 2 fs 10 17 1.6141004604574274 0.494343440675308 2 fs 12 21 1.5476810407275208 0.44290174465702487 2 fs 14 23 1.5237261387830179 0.4696616122846161 2 fs 16 25 1.5285844942020295 0.5736654641906893 2 fs 18 27 1.5483159975149505 0.4961408893973623 2 fs 20 30 1.6377079485605028 0.6888985951517526 2 fs 22 32 1.529949914236052 0.48258847574702635 2 fs 24 34 1.5280421758407217 0.5109767145462891 2 fs 26 36 1.5120782868771674 0.4815152809861558 2 fs 29 37 1.5071938854285831 0.5089276063739265 2 fs 31 39 1.5460100224551203 0.5302403303961576 2 fs 33 41 1.5166625940397171 0.4517159790427676 2 fs 35 43 1.4597689731864314 0.4214985958536156 2 fs 38 44 1.535649445690472 0.47076284376181704 2 fs 40 46 1.5179778495708582 0.5221350266177334 2 fs 42 48 1.4969321270213238 0.4326117171327162 2 fs 45 49 1.5114987201637704 0.4914319343687703 2 fs 47 51 1.4908807480930255 0.4886243720131578 2 fs 50 52 1.616256999726831 0.501428936283957 3 rz 1 -2.3932854391951004 3 rz 4 2.600059005847074 3 rz 3 2.1293419565556686 3 rz 7 2.635214888513154 3 rz 5 1.0969000068096602 3 rz 9 -0.4141960286421961 3 rz 6 1.448470803234792 3 rz 13 -1.3477583561986914 3 rz 8 2.08664533842437 3 rz 15 -2.147848812337145 3 rz 10 0.08243681179982776 3 rz 17 0.07905051406135266 3 rz 12 2.8499779533489917 3 rz 21 2.997967848783354 3 rz 14 -1.4497132543865328 3 rz 23 1.6756020222439947 3 rz 16 1.6110403638230537 3 rz 25 -1.5583567989226532 3 rz 18 1.831437049428291 3 rz 27 -1.8103546833377073 3 rz 20 0.0716641316809925 3 rz 30 -0.06159763385180828 3 rz 22 2.6775858065265927 3 rz 32 -2.824327643558372 3 rz 24 2.9382895697303493 3 rz 34 -2.3511283018814324 3 rz 26 -2.896580447572063 3 rz 36 2.8459936577540166 3 rz 29 2.2114367148817493 3 rz 37 -2.1403867119233055 3 rz 31 2.1881424887585386 3 rz 39 2.839260458374346 3 rz 33 -1.4234721207147139 3 rz 41 1.1855257367726804 3 rz 35 1.320013738944822 3 rz 43 -1.1277631119480453 3 rz 38 2.995416784026747 3 rz 44 -3.020772369678725 3 rz 40 1.686606820477035 3 rz 46 -1.6895208724525625 3 rz 42 1.609733929520253 3 rz 48 -2.492986383699826 3 rz 45 -2.481445005407897 3 rz 49 2.349589938942904 3 rz 47 -2.6928020513607422 3 rz 51 2.671910503472958 3 rz 50 2.857168426223337 3 rz 52 2.2990297397269845 4 y_1_2 0 4 y_1_2 1 4 y_1_2 2 4 x_1_2 3 4 x_1_2 4 4 x_1_2 5 4 x_1_2 6 4 x_1_2 7 4 y_1_2 8 4 hz_1_2 9 4 x_1_2 10 4 x_1_2 11 4 y_1_2 12 4 x_1_2 13 4 y_1_2 14 4 hz_1_2 15 4 hz_1_2 16 4 y_1_2 17 4 y_1_2 18 4 hz_1_2 19 4 y_1_2 20 4 y_1_2 21 4 hz_1_2 22 4 y_1_2 23 4 y_1_2 24 4 hz_1_2 25 4 x_1_2 26 4 hz_1_2 27 4 y_1_2 28 4 y_1_2 29 4 y_1_2 30 4 y_1_2 31 4 hz_1_2 32 4 hz_1_2 33 4 y_1_2 34 4 x_1_2 35 4 x_1_2 36 4 x_1_2 37 4 y_1_2 38 4 x_1_2 39 4 y_1_2 40 4 hz_1_2 41 4 hz_1_2 42 4 y_1_2 43 4 y_1_2 44 4 x_1_2 45 4 hz_1_2 46 4 y_1_2 47 4 x_1_2 48 4 x_1_2 49 4 x_1_2 50 4 y_1_2 51 4 hz_1_2 52 5 rz 0 0.2268745424925527 5 rz 3 0.5571415271071771 5 rz 2 -2.2513994678708658 5 rz 6 2.2546380725286257 5 rz 4 -0.41246800066795863 5 rz 8 0.4133873827301695 5 rz 7 2.3563099677710264 5 rz 14 -0.9989369553991843 5 rz 9 -2.7510095309577114 5 rz 16 -2.930393474388311 5 rz 11 2.2215976945329947 5 rz 20 -1.9682073694249083 5 rz 13 2.6009354607665633 5 rz 22 -2.7001293760780083 5 rz 15 2.5335560654853895 5 rz 24 -2.39691027011676 5 rz 17 -0.7423813429186499 5 rz 26 0.7991639946126413 5 rz 19 2.0345218643948497 5 rz 29 -2.050938322737726 5 rz 21 -0.6559509011901303 5 rz 31 -0.8184806876376881 5 rz 23 -2.4433245645000508 5 rz 33 2.7662935758886693 5 rz 25 -1.6140341496881252 5 rz 35 1.5135909743353206 5 rz 30 2.4170911887166646 5 rz 38 -2.412768992191676 5 rz 32 0.44574337984494505 5 rz 40 -0.42078376332380696 5 rz 34 -3.0038933332707183 5 rz 42 -2.8323993477171854 5 rz 39 -0.9953713874379053 5 rz 45 0.910504771397445 5 rz 41 -1.0166585860487407 5 rz 47 0.8774840291195077 5 rz 46 2.7788749929698184 5 rz 50 -2.683035523976411 6 fs 0 3 1.5192859850645715 0.49387245572956845 6 fs 2 6 1.5120572609259932 0.5211713721957417 6 fs 4 8 1.615096254724942 0.7269644142795206 6 fs 7 14 1.5269188098932545 0.5036266469194081 6 fs 9 16 1.5179602369002039 0.4914328237769214 6 fs 11 20 1.537427483096926 0.45115204759967975 6 fs 13 22 1.53486366638317 0.46559889697604934 6 fs 15 24 1.5194586006330344 0.5068560732280918 6 fs 17 26 1.5819908111894527 0.5595875596558442 6 fs 19 29 1.5070579127771144 0.4520319437379419 6 fs 21 31 1.527311970249325 0.4920204543143157 6 fs 23 33 1.5139592614725292 0.45916943035876673 6 fs 25 35 1.5425204049671604 0.5057437054391503 6 fs 30 38 1.5432564804093452 0.5658780292653538 6 fs 32 40 1.4611081680611278 0.5435451345370095 6 fs 34 42 1.4529959991143482 0.43830813863531964 6 fs 39 45 1.6239619425876082 0.4985036227887135 6 fs 41 47 1.4884560669186362 0.4964777432807688 6 fs 46 50 1.5034760541420213 0.5004774067921798 7 rz 0 0.32256664544673086 7 rz 3 0.461449424152999 7 rz 2 1.6662845869106162 7 rz 6 -1.6630459822528558 7 rz 4 -2.0807726116383005 7 rz 8 2.0816919937005114 7 rz 7 0.21310624160012637 7 rz 14 1.1442667707717158 7 rz 9 -3.057055440423247 7 rz 16 -2.6243475649227754 7 rz 11 -1.6842610823270208 7 rz 20 1.9376514074351068 7 rz 13 -1.9233198015746487 7 rz 22 1.8241258862632037 7 rz 15 3.0412260649904477 7 rz 24 -2.9045802696218184 7 rz 17 -2.053004862643731 7 rz 26 2.1097875143377225 7 rz 19 -2.3270525120981063 7 rz 29 2.31063605375523 7 rz 21 -0.19919797967155972 7 rz 31 -1.2752336091562588 7 rz 23 -1.43179848523061 7 rz 33 1.7547674966192288 7 rz 25 2.902192486573229 7 rz 35 -3.0026356619260337 7 rz 30 1.9833150852685666 7 rz 38 -1.9789928887435797 7 rz 32 -0.6369338680732861 7 rz 40 0.661893484594426 7 rz 34 1.6098110903736034 7 rz 42 -1.1629184641819208 7 rz 39 -0.9546461682460753 7 rz 45 0.869779552205615 7 rz 41 0.825744282325278 7 rz 47 -0.9649188392545094 7 rz 46 2.356987377884714 7 rz 50 -2.2611479088913065 8 x_1_2 0 8 x_1_2 1 8 x_1_2 2 8 hz_1_2 3 8 hz_1_2 4 8 y_1_2 5 8 hz_1_2 6 8 hz_1_2 7 8 x_1_2 8 8 y_1_2 9 8 y_1_2 10 8 y_1_2 11 8 x_1_2 12 8 y_1_2 13 8 x_1_2 14 8 y_1_2 15 8 y_1_2 16 8 x_1_2 17 8 x_1_2 18 8 y_1_2 19 8 hz_1_2 20 8 x_1_2 21 8 x_1_2 22 8 x_1_2 23 8 hz_1_2 24 8 y_1_2 25 8 y_1_2 26 8 y_1_2 27 8 hz_1_2 28 8 hz_1_2 29 8 x_1_2 30 8 x_1_2 31 8 x_1_2 32 8 x_1_2 33 8 x_1_2 34 8 hz_1_2 35 8 hz_1_2 36 8 y_1_2 37 8 hz_1_2 38 8 y_1_2 39 8 hz_1_2 40 8 x_1_2 41 8 x_1_2 42 8 hz_1_2 43 8 x_1_2 44 8 hz_1_2 45 8 y_1_2 46 8 x_1_2 47 8 hz_1_2 48 8 hz_1_2 49 8 hz_1_2 50 8 x_1_2 51 8 y_1_2 52 9 rz 0 2.7296498014579313 9 rz 1 -1.590368513185332 9 rz 2 2.159690705273027 9 rz 3 -2.144666104810616 9 rz 4 1.1806041264524705 9 rz 5 -1.058402647956994 9 rz 7 1.622814550818351 9 rz 8 -3.090826498553735 9 rz 9 2.0475467080709855 9 rz 10 -2.808240772656996 9 rz 11 0.0363681235151887 9 rz 12 0.6267368345703623 9 rz 13 -1.683077723731188 9 rz 14 1.821251782956388 9 rz 15 1.889905607894633 9 rz 16 -1.8011305030821063 9 rz 17 1.191224713999632 9 rz 18 -2.126642695386768 9 rz 19 1.9658871892348433 9 rz 20 -1.9511085272322664 9 rz 21 -1.4198006347182375 9 rz 22 0.5225414603032448 9 rz 23 -2.7119350351230427 9 rz 24 1.7532928428796295 9 rz 25 2.270174449602111 9 rz 26 -2.421631498515731 9 rz 28 -1.9757472607933801 9 rz 29 2.690718125624965 9 rz 30 -1.5268156554449863 9 rz 31 1.2787749581888708 9 rz 32 2.3593119641929743 9 rz 33 -2.420796885290144 9 rz 34 1.6485284700460934 9 rz 35 -0.9914944601366429 9 rz 37 1.3965268522136594 9 rz 38 -1.3773869100671003 9 rz 39 0.7250694837307181 9 rz 40 -0.7633051520811271 9 rz 41 -2.1782266577776674 9 rz 42 2.43381058936766 9 rz 44 1.9783871934256716 9 rz 45 -2.0428219001414405 9 rz 46 2.616236186508104 9 rz 47 -2.816811184588105 9 rz 49 0.3777875775333017 9 rz 50 -0.09226863764678939 10 fs 0 1 1.5508555127616375 0.48773645023966805 10 fs 2 3 1.4860895179182787 0.49800223593597315 10 fs 4 5 1.5268891182960795 0.5146971591948788 10 fs 7 8 1.5004518396933153 0.541239891546859 10 fs 9 10 1.5996085979256793 0.5279139399675195 10 fs 11 12 1.5354845176224254 0.41898979144044296 10 fs 13 14 1.545842827888829 0.533679342490625 10 fs 15 16 1.5651524165810975 0.5296573901163858 10 fs 17 18 1.6240366191418867 0.48516108212176406 10 fs 19 20 1.6022614099028112 0.5001380228896306 10 fs 21 22 1.574931196238987 0.5236666378689078 10 fs 23 24 1.5238301684218176 0.47521120348925566 10 fs 25 26 1.5426970250652188 0.5200449092580564 10 fs 28 29 1.4235475054732074 0.5253841271266504 10 fs 30 31 1.511471063363894 0.4578807555552488 10 fs 32 33 1.5371762819242982 0.5674318212304278 10 fs 34 35 1.510414477168897 0.44988262527024675 10 fs 37 38 1.498535212903308 0.637164678333888 10 fs 39 40 1.507377591132129 0.47869828403704195 10 fs 41 42 1.48836082148729 0.46458301209227065 10 fs 44 45 1.5400981673597602 0.5128416009465753 10 fs 46 47 1.5860873970424136 0.4790438939428006 10 fs 49 50 1.5630547528566316 0.48589356877723594 11 rz 0 -2.055478127333757 11 rz 1 -3.088425891573232 11 rz 2 -2.224048533450526 11 rz 3 2.239073133912937 11 rz 4 -1.5717956753246403 11 rz 5 1.693997153820117 11 rz 7 -1.5534983747823254 11 rz 8 0.08548642704694132 11 rz 9 1.851590500689747 11 rz 10 -2.612284565275756 11 rz 11 -0.6707597723908929 11 rz 12 1.333864730476444 11 rz 13 -0.4627326605980393 11 rz 14 0.6009067198232394 11 rz 15 0.030858809637424045 11 rz 16 0.05791629517510266 11 rz 17 -0.6573659838051862 11 rz 18 -0.27805199758195087 11 rz 19 -0.15131986471501513 11 rz 20 0.16609852671759207 11 rz 21 -1.616287932958402 11 rz 22 0.7190287585434092 11 rz 23 2.0543843880082964 11 rz 24 -3.0130265802517098 11 rz 25 -1.918109093883396 11 rz 26 1.7666520449697758 11 rz 28 1.4266082874857098 11 rz 29 -0.7116374226541247 11 rz 30 -0.31165755635697856 11 rz 31 0.06361685910086301 11 rz 32 -2.420231334847587 11 rz 33 2.358746413750417 11 rz 34 -2.9214866744162733 11 rz 35 -2.7046646228538638 11 rz 37 -2.074440199810285 11 rz 38 2.093580141956844 11 rz 39 0.03769063813623674 11 rz 40 -0.075926306486644 11 rz 41 2.3692232378041176 11 rz 42 -2.113639306214125 11 rz 44 0.6857578577092225 11 rz 45 -0.7501925644249887 11 rz 46 2.7570195705710665 11 rz 47 -2.957594568651068 11 rz 49 1.5950409783058557 11 rz 50 -1.309522038419343 12 hz_1_2 0 12 hz_1_2 1 12 y_1_2 2 12 x_1_2 3 12 x_1_2 4 12 x_1_2 5 12 y_1_2 6 12 x_1_2 7 12 y_1_2 8 12 x_1_2 9 12 hz_1_2 10 12 hz_1_2 11 12 hz_1_2 12 12 hz_1_2 13 12 hz_1_2 14 12 hz_1_2 15 12 hz_1_2 16 12 y_1_2 17 12 y_1_2 18 12 hz_1_2 19 12 y_1_2 20 12 hz_1_2 21 12 hz_1_2 22 12 y_1_2 23 12 y_1_2 24 12 x_1_2 25 12 x_1_2 26 12 x_1_2 27 12 y_1_2 28 12 x_1_2 29 12 hz_1_2 30 12 hz_1_2 31 12 hz_1_2 32 12 y_1_2 33 12 hz_1_2 34 12 x_1_2 35 12 x_1_2 36 12 x_1_2 37 12 x_1_2 38 12 hz_1_2 39 12 x_1_2 40 12 hz_1_2 41 12 hz_1_2 42 12 y_1_2 43 12 hz_1_2 44 12 y_1_2 45 12 x_1_2 46 12 hz_1_2 47 12 y_1_2 48 12 x_1_2 49 12 y_1_2 50 12 hz_1_2 51 12 x_1_2 52 13 rz 3 1.5514777117377587 13 rz 4 -1.471042458257246 13 rz 6 0.9376872138295304 13 rz 7 -2.505708502040484 13 rz 8 -0.8138828334823582 13 rz 9 1.4625269352538472 13 rz 12 1.5465631243549467 13 rz 13 -1.3779143806237855 13 rz 14 -3.056522836696912 13 rz 15 3.0197041955368213 13 rz 16 1.4313150179323237 13 rz 17 -1.4458071174911336 13 rz 20 -0.5377106953899506 13 rz 21 -0.2326881725325665 13 rz 22 -0.14916236480551603 13 rz 23 -0.0049063314348209985 13 rz 24 0.7506379057684889 13 rz 25 -0.9003639271372892 13 rz 26 -1.8474993478983084 13 rz 27 1.9987708035250034 13 rz 29 1.245482758924572 13 rz 30 -1.2148704795940066 13 rz 31 0.03686637959834638 13 rz 32 0.0035863783361342882 13 rz 33 -1.8613845453503193 13 rz 34 2.1274320925128025 13 rz 35 -1.3490677361559822 13 rz 36 1.6785360491008614 13 rz 38 -2.5257109756448184 13 rz 39 2.10867489793368 13 rz 40 -2.759920821735129 13 rz 41 2.7202395614573565 13 rz 42 -0.4183020554137258 13 rz 43 0.9848848466497087 13 rz 45 -0.42166402519488333 13 rz 46 0.44428590744672997 13 rz 47 -0.77688951203044 13 rz 48 -0.5622182800396907 13 rz 50 2.348540240114408 13 rz 51 -2.7786467500008385 14 fs 3 4 1.483304234663135 0.4930986258758784 14 fs 6 7 1.5160176987076064 0.49850252902921577 14 fs 8 9 1.5338611249160479 0.5011308712767845 14 fs 12 13 1.480179689158691 0.4772322221553844 14 fs 14 15 1.5152260103068818 0.49796235787029736 14 fs 16 17 1.5284924549164072 0.5160847019657471 14 fs 20 21 1.58661284381037 0.475779832809368 14 fs 22 23 1.5333295850816209 0.44983388105304506 14 fs 24 25 1.5158107733607835 0.4663776718737318 14 fs 26 27 1.5645151084457722 0.47497942677256283 14 fs 29 30 1.5659881784786247 0.5656290235103623 14 fs 31 32 1.5211879663086973 0.5056110683638391 14 fs 33 34 1.5083349422212171 0.49641600818144604 14 fs 35 36 1.5087002777200382 0.44025777694304247 14 fs 38 39 1.5658333118222365 0.47264531483343447 14 fs 40 41 1.5219378850865568 0.5335829954491795 14 fs 42 43 1.5501487671051402 0.4404117539373896 14 fs 45 46 1.4825325148661492 0.6857341218223484 14 fs 47 48 1.4941963673904604 0.45895108234543025 14 fs 50 51 1.5487430259667763 0.4467898473637848 15 rz 3 -1.8841634261494544 15 rz 4 1.9645986796299673 15 rz 6 2.885627836077404 15 rz 7 1.8295361828912287 15 rz 8 0.05530092720528268 15 rz 9 0.5933431745662068 15 rz 12 -1.2922413166611904 15 rz 13 1.4608900603923516 15 rz 14 -2.3332667091615846 15 rz 15 2.296448068001496 15 rz 16 -1.436526112189684 15 rz 17 1.4220340126308777 15 rz 20 2.6035758286461963 15 rz 21 2.90921061061087 15 rz 22 -1.7401438372662703 15 rz 23 1.586075141025933 15 rz 24 0.5464640634289042 15 rz 25 -0.6961900847977063 15 rz 26 0.7545429458085255 15 rz 27 -0.6032714901818306 15 rz 29 -1.1636385149103123 15 rz 30 1.1942507942408778 15 rz 31 -1.071330330465674 15 rz 32 1.1117830884001547 15 rz 33 2.06057801616892 15 rz 34 -1.7945304690064374 15 rz 35 1.413295584834648 15 rz 36 -1.0838272718897688 15 rz 38 1.3041394540259699 15 rz 39 -1.7211755317371082 15 rz 40 -1.8989017400046564 15 rz 41 1.8592204797268828 15 rz 42 -1.0625073171877455 15 rz 43 1.6290901084237286 15 rz 45 1.2492236358488604 15 rz 46 -1.2266017535970137 15 rz 47 1.4019785896279764 15 rz 48 -2.741086381698107 15 rz 50 -2.3814810782487683 15 rz 51 1.951374568362338 16 y_1_2 0 16 x_1_2 1 16 x_1_2 2 16 y_1_2 3 16 hz_1_2 4 16 y_1_2 5 16 x_1_2 6 16 hz_1_2 7 16 x_1_2 8 16 hz_1_2 9 16 y_1_2 10 16 y_1_2 11 16 x_1_2 12 16 x_1_2 13 16 y_1_2 14 16 x_1_2 15 16 x_1_2 16 16 x_1_2 17 16 x_1_2 18 16 x_1_2 19 16 hz_1_2 20 16 x_1_2 21 16 x_1_2 22 16 hz_1_2 23 16 hz_1_2 24 16 y_1_2 25 16 hz_1_2 26 16 y_1_2 27 16 hz_1_2 28 16 y_1_2 29 16 y_1_2 30 16 y_1_2 31 16 x_1_2 32 16 x_1_2 33 16 y_1_2 34 16 hz_1_2 35 16 hz_1_2 36 16 y_1_2 37 16 y_1_2 38 16 x_1_2 39 16 hz_1_2 40 16 y_1_2 41 16 x_1_2 42 16 hz_1_2 43 16 y_1_2 44 16 hz_1_2 45 16 y_1_2 46 16 y_1_2 47 16 hz_1_2 48 16 hz_1_2 49 16 x_1_2 50 16 x_1_2 51 16 hz_1_2 52 17 rz 0 2.509738315706713 17 rz 1 -1.3704570274341172 17 rz 2 2.153407519965878 17 rz 3 -2.138382919503467 17 rz 4 2.814232306319262 17 rz 5 -2.6920308278237854 17 rz 7 -1.8455037387446078 17 rz 8 0.37749179100920927 17 rz 9 -0.5222760825654262 17 rz 10 -0.23841798202058587 17 rz 11 -2.294693625448355 17 rz 12 2.957798583533906 17 rz 13 0.6354176546180561 17 rz 14 -0.497243595392856 17 rz 15 -1.364784381224447 17 rz 16 1.4535594860369727 17 rz 17 -2.5347041731578344 17 rz 18 1.5992861917706982 17 rz 19 -1.5212806562497523 17 rz 20 1.5360593182523292 17 rz 21 -0.4836060239484059 17 rz 22 -0.413653150466585 17 rz 23 2.880099888266729 17 rz 24 2.4444432266694456 17 rz 25 2.967608018699071 17 rz 26 -3.119065067612691 17 rz 28 1.7627479969783801 17 rz 29 -1.047777132146802 17 rz 30 -2.9279659789460553 17 rz 31 2.6799252816899397 17 rz 32 -1.3666169229644929 17 rz 33 1.3051320018673227 17 rz 34 2.3459620391428473 17 rz 35 -1.688928029233397 17 rz 37 0.7053764684240491 17 rz 38 -0.6862365262774901 17 rz 39 1.6612640945005488 17 rz 40 -1.6994997628509552 17 rz 41 2.012657942111037 17 rz 42 -1.7570740105210447 17 rz 44 0.809714726290327 17 rz 45 -0.8741494330060942 17 rz 46 2.8487140428736204 17 rz 47 -3.049289040953621 17 rz 49 -1.9469909861230956 17 rz 50 2.232509926009607 18 fs 0 1 1.5508555127616375 0.48773645023966805 18 fs 2 3 1.4860895179182787 0.49800223593597315 18 fs 4 5 1.5268891182960795 0.5146971591948788 18 fs 7 8 1.5004518396933153 0.541239891546859 18 fs 9 10 1.5996085979256793 0.5279139399675195 18 fs 11 12 1.5354845176224254 0.41898979144044296 18 fs 13 14 1.545842827888829 0.533679342490625 18 fs 15 16 1.5651524165810975 0.5296573901163858 18 fs 17 18 1.6240366191418867 0.48516108212176406 18 fs 19 20 1.6022614099028112 0.5001380228896306 18 fs 21 22 1.574931196238987 0.5236666378689078 18 fs 23 24 1.5238301684218176 0.47521120348925566 18 fs 25 26 1.5426970250652188 0.5200449092580564 18 fs 28 29 1.4235475054732074 0.5253841271266504 18 fs 30 31 1.511471063363894 0.4578807555552488 18 fs 32 33 1.5371762819242982 0.5674318212304278 18 fs 34 35 1.510414477168897 0.44988262527024675 18 fs 37 38 1.498535212903308 0.637164678333888 18 fs 39 40 1.507377591132129 0.47869828403704195 18 fs 41 42 1.48836082148729 0.46458301209227065 18 fs 44 45 1.5400981673597602 0.5128416009465753 18 fs 46 47 1.5860873970424136 0.4790438939428006 18 fs 49 50 1.5630547528566316 0.48589356877723594 19 rz 0 -1.835566641582535 19 rz 1 2.9748479298551374 19 rz 2 -2.2177653481433772 19 rz 3 2.232789948605788 19 rz 4 3.0777614519881524 19 rz 5 -2.955559973492676 19 rz 7 1.914819914780612 19 rz 8 2.900353444663576 19 rz 9 -1.8617720158534254 19 rz 10 1.1010779512674134 19 rz 11 1.6603019765726525 19 rz 12 -0.9971970184871015 19 rz 13 -2.7812280389472868 19 rz 14 2.919402098172487 19 rz 15 -2.9976365084230814 19 rz 16 3.086411613235608 19 rz 17 3.06856290335228 19 rz 18 2.27920442244017 19 rz 19 -2.947337326410006 19 rz 20 2.9621159884125827 19 rz 21 -2.5524825437282335 19 rz 22 1.6552233693132423 19 rz 23 2.745534771798109 19 rz 24 2.5790083431380637 19 rz 25 -2.615542662980356 19 rz 26 2.464085614066736 19 rz 28 -2.31188697028605 19 rz 29 3.0268578351176316 19 rz 30 1.0894927671440904 19 rz 31 -1.337533464400206 19 rz 32 1.30569755230988 19 rz 33 -1.3671824734070501 19 rz 34 2.6642650636665586 19 rz 35 -2.007231053757109 19 rz 37 -1.3832898160206781 19 rz 38 1.4024297581672371 19 rz 39 -0.8985039726335948 19 rz 40 0.8602683042831885 19 rz 41 -1.821661362084587 19 rz 42 2.0772452936745793 19 rz 44 1.85443032484457 19 rz 45 -1.9188650315603386 19 rz 46 2.524541714205551 19 rz 47 -2.7251167122855513 19 rz 49 -2.363365765217333 19 rz 50 2.648884705103846 20 x_1_2 0 20 y_1_2 1 20 hz_1_2 2 20 hz_1_2 3 20 y_1_2 4 20 x_1_2 5 20 y_1_2 6 20 x_1_2 7 20 y_1_2 8 20 y_1_2 9 20 hz_1_2 10 20 hz_1_2 11 20 hz_1_2 12 20 hz_1_2 13 20 x_1_2 14 20 y_1_2 15 20 y_1_2 16 20 hz_1_2 17 20 y_1_2 18 20 y_1_2 19 20 y_1_2 20 20 y_1_2 21 20 y_1_2 22 20 y_1_2 23 20 x_1_2 24 20 hz_1_2 25 20 y_1_2 26 20 x_1_2 27 20 y_1_2 28 20 hz_1_2 29 20 x_1_2 30 20 hz_1_2 31 20 y_1_2 32 20 y_1_2 33 20 hz_1_2 34 20 x_1_2 35 20 y_1_2 36 20 hz_1_2 37 20 hz_1_2 38 20 hz_1_2 39 20 x_1_2 40 20 hz_1_2 41 20 hz_1_2 42 20 x_1_2 43 20 hz_1_2 44 20 x_1_2 45 20 x_1_2 46 20 x_1_2 47 20 x_1_2 48 20 x_1_2 49 20 y_1_2 50 20 y_1_2 51 20 y_1_2 52 21 rz 3 2.0227166097761504 21 rz 4 -1.9422813562956345 21 rz 6 0.22140408881091742 21 rz 7 -1.7894253770218675 21 rz 8 -1.2788385462138028 21 rz 9 1.9274826479852925 21 rz 12 1.7853241660278165 21 rz 13 -1.6166754222966553 21 rz 14 0.9081670921334216 21 rz 15 -0.9449857332935103 21 rz 16 2.1224654017221383 21 rz 17 -2.1369575012809463 21 rz 20 -2.1713388752567457 21 rz 21 1.400940007334226 21 rz 22 1.2394215880812602 21 rz 23 -1.3934902843215973 21 rz 24 -1.34794598682954 21 rz 25 1.1982199654607406 21 rz 26 -1.6213046768399444 21 rz 27 1.772576132466643 21 rz 29 1.9491995133286792 21 rz 30 -1.9185872339981103 21 rz 31 -2.985345753155011 21 rz 32 3.0257985110894925 21 rz 33 2.79445576726983 21 rz 34 -2.5284082201073472 21 rz 35 2.138100109328821 21 rz 36 -1.8086317963839418 21 rz 38 -2.76447201731769 21 rz 39 2.3474359396065516 21 rz 40 -1.8300093962726527 21 rz 41 1.79032813599488 21 rz 42 2.8363879337053515 21 rz 43 -2.2698051424693713 21 rz 45 1.2119641546719073 21 rz 46 -1.1893422724200597 21 rz 47 -0.3245001699135024 21 rz 48 -1.0146076221566283 21 rz 50 0.9536731019204866 21 rz 51 -1.3837796118069186 22 fs 3 4 1.483304234663135 0.4930986258758784 22 fs 6 7 1.5160176987076064 0.49850252902921577 22 fs 8 9 1.5338611249160479 0.5011308712767845 22 fs 12 13 1.480179689158691 0.4772322221553844 22 fs 14 15 1.5152260103068818 0.49796235787029736 22 fs 16 17 1.5284924549164072 0.5160847019657471 22 fs 20 21 1.58661284381037 0.475779832809368 22 fs 22 23 1.5333295850816209 0.44983388105304506 22 fs 24 25 1.5158107733607835 0.4663776718737318 22 fs 26 27 1.5645151084457722 0.47497942677256283 22 fs 29 30 1.5659881784786247 0.5656290235103623 22 fs 31 32 1.5211879663086973 0.5056110683638391 22 fs 33 34 1.5083349422212171 0.49641600818144604 22 fs 35 36 1.5087002777200382 0.44025777694304247 22 fs 38 39 1.5658333118222365 0.47264531483343447 22 fs 40 41 1.5219378850865568 0.5335829954491795 22 fs 42 43 1.5501487671051402 0.4404117539373896 22 fs 45 46 1.4825325148661492 0.6857341218223484 22 fs 47 48 1.4941963673904604 0.45895108234543025 22 fs 50 51 1.5487430259667763 0.4467898473637848 23 rz 3 -2.355402324187839 23 rz 4 2.435837577668355 23 rz 6 -2.6812743460835655 23 rz 7 1.1132530578726154 23 rz 8 0.5202566399367274 23 rz 9 0.12838746183476202 23 rz 12 -1.5310023583340602 23 rz 13 1.6996511020652214 23 rz 14 -0.014771330812333616 23 rz 15 -0.0220473103477552 23 rz 16 -2.127676495979493 23 rz 17 2.113184396420685 23 rz 20 -2.0459812986665984 23 rz 21 1.2755824307440768 23 rz 22 -3.1287277901530466 23 rz 23 2.9746590939127096 23 rz 24 2.645047956026932 23 rz 25 -2.7947739773957316 23 rz 26 0.5283482747501616 23 rz 27 -0.377076819123463 23 rz 29 -1.867355269314416 23 rz 30 1.897967548644985 23 rz 31 1.950881802287684 23 rz 32 -1.9104290443532026 23 rz 33 -2.5952622964512297 23 rz 34 2.8613098436137125 23 rz 35 -2.0738722606501554 23 rz 36 2.4033405735950346 23 rz 38 1.5429004956988415 23 rz 39 -1.9599365734099798 23 rz 40 -2.8288131654671322 23 rz 41 2.7891319051893593 23 rz 42 1.9659880008727608 23 rz 43 -1.3994052096367806 23 rz 45 -0.38440454401792934 23 rz 46 0.4070264262697769 23 rz 47 0.9495892475110317 23 rz 48 -2.2886970395811623 23 rz 50 -0.9866139400548483 23 rz 51 0.5565074301684163 24 hz_1_2 0 24 x_1_2 1 24 y_1_2 2 24 y_1_2 3 24 x_1_2 4 24 hz_1_2 5 24 x_1_2 6 24 hz_1_2 7 24 x_1_2 8 24 hz_1_2 9 24 y_1_2 10 24 y_1_2 11 24 x_1_2 12 24 x_1_2 13 24 hz_1_2 14 24 x_1_2 15 24 hz_1_2 16 24 x_1_2 17 24 hz_1_2 18 24 x_1_2 19 24 x_1_2 20 24 x_1_2 21 24 hz_1_2 22 24 x_1_2 23 24 y_1_2 24 24 x_1_2 25 24 hz_1_2 26 24 hz_1_2 27 24 x_1_2 28 24 x_1_2 29 24 hz_1_2 30 24 x_1_2 31 24 x_1_2 32 24 hz_1_2 33 24 x_1_2 34 24 y_1_2 35 24 x_1_2 36 24 x_1_2 37 24 y_1_2 38 24 y_1_2 39 24 y_1_2 40 24 x_1_2 41 24 x_1_2 42 24 y_1_2 43 24 x_1_2 44 24 hz_1_2 45 24 hz_1_2 46 24 hz_1_2 47 24 y_1_2 48 24 hz_1_2 49 24 hz_1_2 50 24 hz_1_2 51 24 x_1_2 52 25 rz 1 -1.7330955636302576 25 rz 4 1.9398691302822326 25 rz 3 -1.3595905672440445 25 rz 7 -0.15903789486672082 25 rz 5 0.9983480185332675 25 rz 9 -0.31564404036580385 25 rz 6 1.6005797808823772 25 rz 13 -1.499867333846277 25 rz 8 -2.0133729703407113 25 rz 15 1.9521694964279346 25 rz 10 -2.2092282896270623 25 rz 17 2.370715615488243 25 rz 12 -2.8505778473320245 25 rz 21 2.415338342284782 25 rz 14 -2.7073106232211153 25 rz 23 2.9331993910785776 25 rz 16 -1.234561816122234 25 rz 25 1.2872453810226325 25 rz 18 0.17343200211866971 25 rz 27 -0.15234963602808804 25 rz 20 3.127364464427597 25 rz 30 -3.117297966598411 25 rz 22 -0.25478173773634083 25 rz 32 0.10803990070456493 25 rz 24 0.37354651617850365 25 rz 34 0.2136147516704163 25 rz 26 -1.894523295721189 25 rz 36 1.843936505903141 25 rz 29 -3.1338996122268092 25 rz 37 -3.0782356919943297 25 rz 31 2.1250997343771267 25 rz 39 2.9023032127557684 25 rz 33 2.4328195171731437 25 rz 41 -2.6707659011151748 25 rz 35 -2.145151811969935 25 rz 43 2.337402438966709 25 rz 38 -0.20565851076299776 25 rz 44 0.1803029251110182 25 rz 40 -0.1207797111557447 25 rz 46 0.11786565918021451 25 rz 42 2.457861535405762 25 rz 48 2.942071317594255 25 rz 45 2.3911948089457944 25 rz 49 -2.5230498754107877 25 rz 47 -1.198546606652119 25 rz 51 1.177655058764337 25 rz 50 0.10358021090199898 25 rz 52 -1.2305673521312634 26 fs 1 4 1.5157741664069029 0.5567125777723744 26 fs 3 7 1.5177580142209797 0.4948108578225166 26 fs 5 9 1.6036738621219824 0.47689957001758815 26 fs 6 13 1.5177327089642791 0.5058312223892585 26 fs 8 15 1.5253184444076096 0.46557175536519374 26 fs 10 17 1.6141004604574274 0.494343440675308 26 fs 12 21 1.5476810407275208 0.44290174465702487 26 fs 14 23 1.5237261387830179 0.4696616122846161 26 fs 16 25 1.5285844942020295 0.5736654641906893 26 fs 18 27 1.5483159975149505 0.4961408893973623 26 fs 20 30 1.6377079485605028 0.6888985951517526 26 fs 22 32 1.529949914236052 0.48258847574702635 26 fs 24 34 1.5280421758407217 0.5109767145462891 26 fs 26 36 1.5120782868771674 0.4815152809861558 26 fs 29 37 1.5071938854285831 0.5089276063739265 26 fs 31 39 1.5460100224551203 0.5302403303961576 26 fs 33 41 1.5166625940397171 0.4517159790427676 26 fs 35 43 1.4597689731864314 0.4214985958536156 26 fs 38 44 1.535649445690472 0.47076284376181704 26 fs 40 46 1.5179778495708582 0.5221350266177334 26 fs 42 48 1.4969321270213238 0.4326117171327162 26 fs 45 49 1.5114987201637704 0.4914319343687703 26 fs 47 51 1.4908807480930255 0.4886243720131578 26 fs 50 52 1.616256999726831 0.501428936283957 27 rz 1 1.7724664194652178 27 rz 4 -1.5656928528132426 27 rz 3 0.759607559590961 27 rz 7 -2.2782360217017192 27 rz 5 -1.0079670710951056 27 rz 9 1.6906710492625692 27 rz 6 0.05988685034802011 27 rz 13 0.04082559668808017 27 rz 8 0.7106277561520997 27 rz 15 -0.7718312300648762 27 rz 10 -2.707297464588221 27 rz 17 2.8687847904494017 27 rz 12 0.7639604313656694 27 rz 21 -1.1991999364129118 27 rz 14 -2.8382972072733033 27 rz 23 3.0641859751307656 27 rz 16 -1.8447115551255957 27 rz 25 1.8973951200259942 27 rz 18 -0.9331644857301312 27 rz 27 0.9542468518207095 27 rz 20 -0.6509021786445608 27 rz 30 0.6609686764737468 27 rz 22 0.5664355433142667 27 rz 32 -0.7131773803460426 27 rz 24 0.1297057374208599 27 rz 34 0.45745553042806003 27 rz 26 2.6703217345889136 27 rz 36 -2.720908524406962 27 rz 29 0.8479855032239847 27 rz 37 -0.7769355002655338 27 rz 31 1.5221248461973182 27 rz 39 -2.7779072062440058 27 rz 33 -2.799489702986982 27 rz 41 2.561543319044951 27 rz 35 -0.04972065802050806 27 rz 43 0.24197128501728213 27 rz 38 1.5754169046046478 27 rz 44 -1.6007724902566276 27 rz 40 0.964040510151481 27 rz 46 -0.966954562127011 27 rz 42 1.6285834854416945 27 rz 48 -2.511835939621264 27 rz 45 3.1294394739035276 27 rz 49 3.0218907668110653 27 rz 47 0.8257817206597977 27 rz 51 -0.8466732685475797 27 rz 50 2.178584413048238 27 rz 52 2.9776137529020836 28 x_1_2 0 28 hz_1_2 1 28 x_1_2 2 28 hz_1_2 3 28 y_1_2 4 28 x_1_2 5 28 y_1_2 6 28 y_1_2 7 28 hz_1_2 8 28 y_1_2 9 28 hz_1_2 10 28 hz_1_2 11 28 hz_1_2 12 28 hz_1_2 13 28 y_1_2 14 28 hz_1_2 15 28 y_1_2 16 28 y_1_2 17 28 x_1_2 18 28 y_1_2 19 28 y_1_2 20 28 hz_1_2 21 28 x_1_2 22 28 y_1_2 23 28 x_1_2 24 28 y_1_2 25 28 y_1_2 26 28 x_1_2 27 28 hz_1_2 28 28 y_1_2 29 28 y_1_2 30 28 y_1_2 31 28 hz_1_2 32 28 x_1_2 33 28 hz_1_2 34 28 x_1_2 35 28 hz_1_2 36 28 hz_1_2 37 28 hz_1_2 38 28 x_1_2 39 28 x_1_2 40 28 hz_1_2 41 28 y_1_2 42 28 x_1_2 43 28 y_1_2 44 28 y_1_2 45 28 y_1_2 46 28 y_1_2 47 28 x_1_2 48 28 x_1_2 49 28 x_1_2 50 28 x_1_2 51 28 y_1_2 52 29 rz 0 0.2708568396429989 29 rz 3 0.5131592299567238 29 rz 2 1.248334748228233 29 rz 6 -1.245096143570473 29 rz 4 1.7049654478519258 29 rz 8 -1.704046065789715 29 rz 7 0.2828588164022108 29 rz 14 1.074514195969634 29 rz 9 2.8221758365108265 29 rz 16 -2.2203935346772603 29 rz 11 2.2153145092260527 29 rz 20 -1.9619241841179669 29 rz 13 0.4960683828611785 29 rz 22 -0.5952622981726243 29 rz 15 2.520989694870888 29 rz 24 -2.3843438995022606 29 rz 17 2.7322201319514434 29 rz 26 -2.6754374802574503 29 rz 19 2.7508049894134636 29 rz 29 -2.767221447756338 29 rz 21 0.7640489782325908 29 rz 31 -2.23848056706041 29 rz 23 -3.109342207061271 29 rz 33 -2.8508740887297 29 rz 25 -2.983768546653451 29 rz 35 2.8833253713006393 29 rz 30 -0.4040590142067196 29 rz 38 0.4083812107316938 29 rz 32 0.4206106386165622 29 rz 40 -0.3956510220954215 29 rz 34 -3.022742889192781 29 rz 42 -2.813549791795122 29 rz 39 -2.3651057844032337 29 rz 45 2.2802391683627796 29 rz 41 -2.386392983014069 29 rz 47 2.2472184260848387 29 rz 46 -2.140859102552003 29 rz 50 2.2366985715454 30 fs 0 3 1.5192859850645715 0.49387245572956845 30 fs 2 6 1.5120572609259932 0.5211713721957417 30 fs 4 8 1.615096254724942 0.7269644142795206 30 fs 7 14 1.5269188098932545 0.5036266469194081 30 fs 9 16 1.5179602369002039 0.4914328237769214 30 fs 11 20 1.537427483096926 0.45115204759967975 30 fs 13 22 1.53486366638317 0.46559889697604934 30 fs 15 24 1.5194586006330344 0.5068560732280918 30 fs 17 26 1.5819908111894527 0.5595875596558442 30 fs 19 29 1.5070579127771144 0.4520319437379419 30 fs 21 31 1.527311970249325 0.4920204543143157 30 fs 23 33 1.5139592614725292 0.45916943035876673 30 fs 25 35 1.5425204049671604 0.5057437054391503 30 fs 30 38 1.5432564804093452 0.5658780292653538 30 fs 32 40 1.4611081680611278 0.5435451345370095 30 fs 34 42 1.4529959991143482 0.43830813863531964 30 fs 39 45 1.6239619425876082 0.4985036227887135 30 fs 41 47 1.4884560669186362 0.4964777432807688 30 fs 46 50 1.5034760541420213 0.5004774067921798 31 rz 0 0.278584348296274 31 rz 3 0.5054317213034487 31 rz 2 -1.833449629188484 31 rz 6 1.8366882338462445 31 rz 4 2.0849792470214012 31 rz 8 -2.084059864959194 31 rz 7 2.2865573929689447 31 rz 14 -0.9291843805970998 31 rz 9 -2.3470555007121945 31 rz 16 2.9488378025457607 31 rz 11 -1.6779778970200798 31 rz 20 1.9313682221281656 31 rz 13 0.1815472763307362 31 rz 22 -0.28074119164218203 31 rz 15 3.053792435604949 31 rz 24 -2.9171466402363215 31 rz 17 0.7555789696657627 31 rz 26 -0.6987963179717696 31 rz 19 -3.0433356371167157 31 rz 29 3.0269191787738414 31 rz 21 -1.6191978590942815 31 rz 31 0.14476627026646227 31 rz 23 -0.7657808426693897 31 rz 33 1.0887498540580047 31 rz 25 -2.011258423641035 31 rz 35 1.9108152482882197 31 rz 30 -1.4787200189876444 31 rz 38 1.4830422155126222 31 rz 32 -0.6118011268448953 31 rz 40 0.636760743366036 31 rz 34 1.6286606462956676 31 rz 42 -1.1817680201039842 31 rz 39 0.41508822871925233 31 rz 45 -0.49995484475970997 31 rz 41 2.1954786792906127 31 rz 47 -2.334653236219843 31 rz 46 0.9935361662269422 31 rz 50 -0.8976966972335454 32 hz_1_2 0 32 x_1_2 1 32 hz_1_2 2 32 y_1_2 3 32 x_1_2 4 32 hz_1_2 5 32 hz_1_2 6 32 hz_1_2 7 32 x_1_2 8 32 x_1_2 9 32 x_1_2 10 32 y_1_2 11 32 x_1_2 12 32 x_1_2 13 32 x_1_2 14 32 y_1_2 15 32 x_1_2 16 32 hz_1_2 17 32 y_1_2 18 32 x_1_2 19 32 x_1_2 20 32 y_1_2 21 32 hz_1_2 22 32 hz_1_2 23 32 hz_1_2 24 32 x_1_2 25 32 x_1_2 26 32 hz_1_2 27 32 x_1_2 28 32 hz_1_2 29 32 x_1_2 30 32 hz_1_2 31 32 x_1_2 32 32 hz_1_2 33 32 y_1_2 34 32 y_1_2 35 32 x_1_2 36 32 x_1_2 37 32 y_1_2 38 32 hz_1_2 39 32 y_1_2 40 32 y_1_2 41 32 x_1_2 42 32 y_1_2 43 32 hz_1_2 44 32 x_1_2 45 32 hz_1_2 46 32 x_1_2 47 32 hz_1_2 48 32 hz_1_2 49 32 y_1_2 50 32 hz_1_2 51 32 hz_1_2 52 33 rz 1 -3.121679516517034 33 rz 4 -2.9547322240105807 33 rz 3 1.191382667470723 33 rz 7 -2.710011129581499 33 rz 5 -2.488819826951536 33 rz 9 -3.1116615020605884 33 rz 6 -2.125349106275088 33 rz 13 2.2260615533111903 33 rz 8 -1.554700442916623 33 rz 15 1.4934969690038464 33 rz 10 -1.2793168641643788 33 rz 17 1.4408041900255597 33 rz 12 -0.06084357094438886 33 rz 21 -0.37439593410285354 33 rz 14 -0.1500542031989962 33 rz 23 0.3759429710564586 33 rz 16 -2.1770396121992057 33 rz 25 2.2297231770996184 33 rz 18 -3.09382435761491 33 rz 27 3.1149067237054986 33 rz 20 1.2738247988095885 33 rz 30 -1.2637583009803954 33 rz 22 0.4489350166677681 33 rz 32 -0.595676853699544 33 rz 24 1.3097411269483352 33 rz 34 -0.7225798590994152 33 rz 26 -1.6557622540483192 33 rz 36 1.6051754642302711 33 rz 29 1.509374329778833 33 rz 37 -1.4383243268203962 33 rz 31 0.25271051283766255 33 rz 39 -1.5084928728843643 33 rz 33 2.891492044597232 33 rz 41 -3.129438428539263 33 rz 35 0.4058214227450386 33 rz 43 -0.21357079574826443 33 rz 38 -1.8267203200154896 33 rz 44 1.8013647343635133 33 rz 40 -1.9743193767737497 33 rz 46 1.971405324798223 33 rz 42 2.4515783500986146 33 rz 48 2.9483545029014024 33 rz 45 -1.5734951198845515 33 rz 49 1.441640053419551 33 rz 47 1.8173823407940866 33 rz 51 -1.8382738886818792 33 rz 50 0.3297748819603683 33 rz 52 -1.4567620231896328 34 fs 1 4 1.5157741664069029 0.5567125777723744 34 fs 3 7 1.5177580142209797 0.4948108578225166 34 fs 5 9 1.6036738621219824 0.47689957001758815 34 fs 6 13 1.5177327089642791 0.5058312223892585 34 fs 8 15 1.5253184444076096 0.46557175536519374 34 fs 10 17 1.6141004604574274 0.494343440675308 34 fs 12 21 1.5476810407275208 0.44290174465702487 34 fs 14 23 1.5237261387830179 0.4696616122846161 34 fs 16 25 1.5285844942020295 0.5736654641906893 34 fs 18 27 1.5483159975149505 0.4961408893973623 34 fs 20 30 1.6377079485605028 0.6888985951517526 34 fs 22 32 1.529949914236052 0.48258847574702635 34 fs 24 34 1.5280421758407217 0.5109767145462891 34 fs 26 36 1.5120782868771674 0.4815152809861558 34 fs 29 37 1.5071938854285831 0.5089276063739265 34 fs 31 39 1.5460100224551203 0.5302403303961576 34 fs 33 41 1.5166625940397171 0.4517159790427676 34 fs 35 43 1.4597689731864314 0.4214985958536156 34 fs 38 44 1.535649445690472 0.47076284376181704 34 fs 40 46 1.5179778495708582 0.5221350266177334 34 fs 42 48 1.4969321270213238 0.4326117171327162 34 fs 45 49 1.5114987201637704 0.4914319343687703 34 fs 47 51 1.4908807480930255 0.4886243720131578 34 fs 50 52 1.616256999726831 0.501428936283957 35 rz 1 -3.1221349348275957 35 rz 4 -2.954276805700019 35 rz 3 -1.79136567512381 35 rz 7 0.2727372130130341 35 rz 5 2.4792007743896995 35 rz 9 -1.7964967962222342 35 rz 6 -2.497369569674099 35 rz 13 2.598082016710201 35 rz 8 0.25195522872801135 35 rz 15 -0.3131587026407878 35 rz 10 2.645976417128683 35 rz 17 -2.484489091267502 35 rz 12 -2.0257738450219662 35 rz 21 1.5905343399747238 35 rz 14 0.8876316798841639 35 rz 23 -0.6617429120267015 35 rz 16 -0.9022337590486096 35 rz 25 0.9549173239490222 35 rz 18 2.334091874003459 35 rz 27 -2.31300950791287 35 rz 20 1.2026374869734546 35 rz 30 -1.192570989144265 35 rz 22 -0.13728121108984226 35 rz 32 -0.009460625941933642 35 rz 24 -0.8064888733489717 35 rz 34 1.3936501411978917 35 rz 26 2.431560692916044 35 rz 36 -2.482147482734092 35 rz 29 2.4878968683979146 35 rz 37 -2.416846865439478 35 rz 31 -2.888671239442818 35 rz 39 1.632888879396116 35 rz 33 3.025023076768516 35 rz 41 3.020215846469039 35 rz 35 -2.6006938927354746 35 rz 43 2.7929445197322487 35 rz 38 -3.086706593322443 35 rz 44 3.061351007670467 35 rz 40 2.817580175769489 35 rz 46 -2.820494227745016 35 rz 42 1.6348666707488422 35 rz 48 -2.5181191249284076 35 rz 45 0.8109440955542802 35 rz 49 -0.9427991620192806 35 rz 47 -2.1901472267864186 35 rz 51 2.169255678898626 35 rz 50 1.952389741989869 35 rz 52 -3.0793768832191333 36 x_1_2 0 36 y_1_2 1 36 x_1_2 2 36 x_1_2 3 36 y_1_2 4 36 y_1_2 5 36 x_1_2 6 36 x_1_2 7 36 y_1_2 8 36 hz_1_2 9 36 y_1_2 10 36 hz_1_2 11 36 y_1_2 12 36 y_1_2 13 36 y_1_2 14 36 x_1_2 15 36 hz_1_2 16 36 x_1_2 17 36 hz_1_2 18 36 hz_1_2 19 36 hz_1_2 20 36 x_1_2 21 36 y_1_2 22 36 y_1_2 23 36 x_1_2 24 36 y_1_2 25 36 y_1_2 26 36 x_1_2 27 36 y_1_2 28 36 y_1_2 29 36 hz_1_2 30 36 x_1_2 31 36 hz_1_2 32 36 y_1_2 33 36 hz_1_2 34 36 x_1_2 35 36 y_1_2 36 36 hz_1_2 37 36 hz_1_2 38 36 x_1_2 39 36 hz_1_2 40 36 x_1_2 41 36 hz_1_2 42 36 hz_1_2 43 36 x_1_2 44 36 hz_1_2 45 36 x_1_2 46 36 y_1_2 47 36 y_1_2 48 36 y_1_2 49 36 hz_1_2 50 36 y_1_2 51 36 y_1_2 52 37 rz 0 -1.8088774970333825 37 rz 3 2.592893566633105 37 rz 2 -1.7738773845251252 37 rz 6 1.7771159891828854 37 rz 4 0.31638149496535917 37 rz 8 -0.31546211290315895 37 rz 7 -0.4082915673873906 37 rz 14 1.7656645797592283 37 rz 9 0.49111408754728103 37 rz 16 0.11066821428628514 37 rz 11 -1.9755700906626519 37 rz 20 2.2289604157707377 37 rz 13 -2.299949078833812 37 rz 22 2.2007551635223663 37 rz 15 0.4224058022728556 37 rz 24 -0.2857600069042263 37 rz 17 1.796025521181612 37 rz 26 -1.7392428694876187 37 rz 19 2.9895660310863335 37 rz 29 -3.0059824894292078 37 rz 21 -0.8570128310196984 37 rz 31 -0.6174187578081209 37 rz 23 -1.2369529855218069 37 rz 33 1.559921996910436 37 rz 25 0.748443525811151 37 rz 35 -0.8488867011639661 37 rz 30 2.8443477896052194 37 rz 38 -2.840025593080231 37 rz 32 2.506628160600304 37 rz 40 -2.4816685440791524 37 rz 34 -3.029026074500134 37 rz 42 -2.8072666064877687 37 rz 39 1.3671062880613754 37 rz 45 -1.45197290410184 37 rz 41 1.34581908945054 37 rz 47 -1.484993646379781 37 rz 46 2.502414839453639 37 rz 50 -2.406575370460242 38 fs 0 3 1.5192859850645715 0.49387245572956845 38 fs 2 6 1.5120572609259932 0.5211713721957417 38 fs 4 8 1.615096254724942 0.7269644142795206 38 fs 7 14 1.5269188098932545 0.5036266469194081 38 fs 9 16 1.5179602369002039 0.4914328237769214 38 fs 11 20 1.537427483096926 0.45115204759967975 38 fs 13 22 1.53486366638317 0.46559889697604934 38 fs 15 24 1.5194586006330344 0.5068560732280918 38 fs 17 26 1.5819908111894527 0.5595875596558442 38 fs 19 29 1.5070579127771144 0.4520319437379419 38 fs 21 31 1.527311970249325 0.4920204543143157 38 fs 23 33 1.5139592614725292 0.45916943035876673 38 fs 25 35 1.5425204049671604 0.5057437054391503 38 fs 30 38 1.5432564804093452 0.5658780292653538 38 fs 32 40 1.4611081680611278 0.5435451345370095 38 fs 34 42 1.4529959991143482 0.43830813863531964 38 fs 39 45 1.6239619425876082 0.4985036227887135 38 fs 41 47 1.4884560669186362 0.4964777432807688 38 fs 46 50 1.5034760541420213 0.5004774067921798 39 rz 0 2.358318684972655 39 rz 3 -1.5743026153729325 39 rz 2 1.188762503564874 39 rz 6 -1.185523898907114 39 rz 4 -2.8096221072716325 39 rz 8 2.8105414893338363 39 rz 7 2.977707776758546 39 rz 14 -1.6203347643867119 39 rz 9 -0.015993751748652585 39 rz 16 0.6177760535822188 39 rz 11 2.5129067028686247 39 rz 20 -2.259516377760539 39 rz 13 2.977564738025727 39 rz 22 -3.0767586533371727 39 rz 15 -1.130808978976603 39 rz 24 1.2674547743452322 39 rz 17 1.6917735804355942 39 rz 26 -1.6349909287416011 39 rz 19 3.0010886283900007 39 rz 29 -3.017505086732875 39 rz 21 0.0018639501580004494 39 rz 31 -1.4762955389858199 39 rz 23 -2.6381700642088397 39 rz 33 2.961139075597469 39 rz 25 0.5397148110739458 39 rz 35 -0.640157986426761 39 rz 30 1.5560584843800136 39 rz 38 -1.5517362878550252 39 rz 32 -2.697818648828626 39 rz 40 2.7227782653497776 39 rz 34 1.634943831603021 39 rz 42 -1.1880512054113375 39 rz 39 2.966061463434219 39 rz 45 -3.0509280794746836 39 rz 41 -1.536733393174007 39 rz 47 1.397558836244766 39 rz 46 2.6334475314008863 39 rz 50 -2.5376080624074895 40 hz_1_2 0 40 x_1_2 1 40 hz_1_2 2 40 hz_1_2 3 40 x_1_2 4 40 x_1_2 5 40 hz_1_2 6 40 hz_1_2 7 40 x_1_2 8 40 y_1_2 9 40 x_1_2 10 40 x_1_2 11 40 hz_1_2 12 40 x_1_2 13 40 x_1_2 14 40 hz_1_2 15 40 x_1_2 16 40 hz_1_2 17 40 x_1_2 18 40 x_1_2 19 40 x_1_2 20 40 hz_1_2 21 40 x_1_2 22 40 x_1_2 23 40 hz_1_2 24 40 hz_1_2 25 40 x_1_2 26 40 hz_1_2 27 40 x_1_2 28 40 x_1_2 29 40 y_1_2 30 40 y_1_2 31 40 y_1_2 32 40 x_1_2 33 40 x_1_2 34 40 y_1_2 35 40 x_1_2 36 40 y_1_2 37 40 y_1_2 38 40 hz_1_2 39 40 y_1_2 40 40 y_1_2 41 40 x_1_2 42 40 y_1_2 43 40 hz_1_2 44 40 y_1_2 45 40 hz_1_2 46 40 x_1_2 47 40 hz_1_2 48 40 x_1_2 49 40 x_1_2 50 40 hz_1_2 51 40 x_1_2 52 ================================================ FILE: examples/circuit_n53_m12_s0_e0_pABCDCDAB.qsim ================================================ 53 0 hz_1_2 0 0 x_1_2 1 0 x_1_2 2 0 hz_1_2 3 0 y_1_2 4 0 hz_1_2 5 0 hz_1_2 6 0 hz_1_2 7 0 hz_1_2 8 0 x_1_2 9 0 y_1_2 10 0 hz_1_2 11 0 hz_1_2 12 0 hz_1_2 13 0 hz_1_2 14 0 y_1_2 15 0 x_1_2 16 0 x_1_2 17 0 hz_1_2 18 0 x_1_2 19 0 x_1_2 20 0 hz_1_2 21 0 y_1_2 22 0 x_1_2 23 0 x_1_2 24 0 y_1_2 25 0 hz_1_2 26 0 x_1_2 27 0 hz_1_2 28 0 hz_1_2 29 0 x_1_2 30 0 x_1_2 31 0 x_1_2 32 0 y_1_2 33 0 hz_1_2 34 0 y_1_2 35 0 hz_1_2 36 0 hz_1_2 37 0 hz_1_2 38 0 y_1_2 39 0 hz_1_2 40 0 x_1_2 41 0 x_1_2 42 0 x_1_2 43 0 hz_1_2 44 0 y_1_2 45 0 x_1_2 46 0 hz_1_2 47 0 y_1_2 48 0 y_1_2 49 0 y_1_2 50 0 hz_1_2 51 0 x_1_2 52 1 rz 1 2.4326562950300605 1 rz 4 -2.225882728378087 1 rz 3 -2.7293249642087485 1 rz 7 1.210696502097985 1 rz 5 -1.106519059371497 1 rz 9 1.7892230375389613 1 rz 6 0.2119958279956058 1 rz 13 -0.11128338095950507 1 rz 8 2.8937947545666063 1 rz 15 -2.9549982284793814 1 rz 10 1.2842227411644753 1 rz 17 -1.1227354153032945 1 rz 12 1.3465899378642412 1 rz 21 -1.781829442911482 1 rz 14 2.1872907310716982 1 rz 23 -1.9614019632142368 1 rz 16 1.5928715721087023 1 rz 25 -1.5401880072083034 1 rz 18 -2.5911695330397535 1 rz 27 2.612251899130335 1 rz 20 2.404798154102042 1 rz 30 -2.3947316562728576 1 rz 22 -2.365932000948667 1 rz 32 2.2191901639168874 1 rz 24 -2.4350373161309906 1 rz 34 3.0221985839799075 1 rz 26 -2.610806420739799 1 rz 36 2.560219630921752 1 rz 29 1.785834483295006 1 rz 37 -1.7147844803365624 1 rz 31 1.4590820918158975 1 rz 39 -2.7148644518625993 1 rz 33 1.0568019349008715 1 rz 41 -1.294748318842905 1 rz 35 2.7682990982443236 1 rz 43 -2.576048471247548 1 rz 38 -1.6256583901850972 1 rz 44 1.6003028045331185 1 rz 40 -0.8433460214812949 1 rz 46 0.8404319695057677 1 rz 42 2.4767110913272044 1 rz 48 2.92322176167281 1 rz 45 1.718893981077632 1 rz 49 -1.8507490475426254 1 rz 47 2.3200371653684186 1 rz 51 -2.340928713256203 1 rz 50 -0.5750038022730992 1 rz 52 -0.5519833389561652 2 fs 1 4 1.5157741664069029 0.5567125777723744 2 fs 3 7 1.5177580142209797 0.4948108578225166 2 fs 5 9 1.6036738621219824 0.47689957001758815 2 fs 6 13 1.5177327089642791 0.5058312223892585 2 fs 8 15 1.5253184444076096 0.46557175536519374 2 fs 10 17 1.6141004604574274 0.494343440675308 2 fs 12 21 1.5476810407275208 0.44290174465702487 2 fs 14 23 1.5237261387830179 0.4696616122846161 2 fs 16 25 1.5285844942020295 0.5736654641906893 2 fs 18 27 1.5483159975149505 0.4961408893973623 2 fs 20 30 1.6377079485605028 0.6888985951517526 2 fs 22 32 1.529949914236052 0.48258847574702635 2 fs 24 34 1.5280421758407217 0.5109767145462891 2 fs 26 36 1.5120782868771674 0.4815152809861558 2 fs 29 37 1.5071938854285831 0.5089276063739265 2 fs 31 39 1.5460100224551203 0.5302403303961576 2 fs 33 41 1.5166625940397171 0.4517159790427676 2 fs 35 43 1.4597689731864314 0.4214985958536156 2 fs 38 44 1.535649445690472 0.47076284376181704 2 fs 40 46 1.5179778495708582 0.5221350266177334 2 fs 42 48 1.4969321270213238 0.4326117171327162 2 fs 45 49 1.5114987201637704 0.4914319343687703 2 fs 47 51 1.4908807480930255 0.4886243720131578 2 fs 50 52 1.616256999726831 0.501428936283957 3 rz 1 -2.3932854391951004 3 rz 4 2.600059005847074 3 rz 3 2.1293419565556686 3 rz 7 2.635214888513154 3 rz 5 1.0969000068096602 3 rz 9 -0.4141960286421961 3 rz 6 1.448470803234792 3 rz 13 -1.3477583561986914 3 rz 8 2.08664533842437 3 rz 15 -2.147848812337145 3 rz 10 0.08243681179982776 3 rz 17 0.07905051406135266 3 rz 12 2.8499779533489917 3 rz 21 2.997967848783354 3 rz 14 -1.4497132543865328 3 rz 23 1.6756020222439947 3 rz 16 1.6110403638230537 3 rz 25 -1.5583567989226532 3 rz 18 1.831437049428291 3 rz 27 -1.8103546833377073 3 rz 20 0.0716641316809925 3 rz 30 -0.06159763385180828 3 rz 22 2.6775858065265927 3 rz 32 -2.824327643558372 3 rz 24 2.9382895697303493 3 rz 34 -2.3511283018814324 3 rz 26 -2.896580447572063 3 rz 36 2.8459936577540166 3 rz 29 2.2114367148817493 3 rz 37 -2.1403867119233055 3 rz 31 2.1881424887585386 3 rz 39 2.839260458374346 3 rz 33 -1.4234721207147139 3 rz 41 1.1855257367726804 3 rz 35 1.320013738944822 3 rz 43 -1.1277631119480453 3 rz 38 2.995416784026747 3 rz 44 -3.020772369678725 3 rz 40 1.686606820477035 3 rz 46 -1.6895208724525625 3 rz 42 1.609733929520253 3 rz 48 -2.492986383699826 3 rz 45 -2.481445005407897 3 rz 49 2.349589938942904 3 rz 47 -2.6928020513607422 3 rz 51 2.671910503472958 3 rz 50 2.857168426223337 3 rz 52 2.2990297397269845 4 y_1_2 0 4 y_1_2 1 4 y_1_2 2 4 x_1_2 3 4 x_1_2 4 4 x_1_2 5 4 x_1_2 6 4 x_1_2 7 4 y_1_2 8 4 hz_1_2 9 4 x_1_2 10 4 x_1_2 11 4 y_1_2 12 4 x_1_2 13 4 y_1_2 14 4 hz_1_2 15 4 hz_1_2 16 4 y_1_2 17 4 y_1_2 18 4 hz_1_2 19 4 y_1_2 20 4 y_1_2 21 4 hz_1_2 22 4 y_1_2 23 4 y_1_2 24 4 hz_1_2 25 4 x_1_2 26 4 hz_1_2 27 4 y_1_2 28 4 y_1_2 29 4 y_1_2 30 4 y_1_2 31 4 hz_1_2 32 4 hz_1_2 33 4 y_1_2 34 4 x_1_2 35 4 x_1_2 36 4 x_1_2 37 4 y_1_2 38 4 x_1_2 39 4 y_1_2 40 4 hz_1_2 41 4 hz_1_2 42 4 y_1_2 43 4 y_1_2 44 4 x_1_2 45 4 hz_1_2 46 4 y_1_2 47 4 x_1_2 48 4 x_1_2 49 4 x_1_2 50 4 y_1_2 51 4 hz_1_2 52 5 rz 0 0.2268745424925527 5 rz 3 0.5571415271071771 5 rz 2 -2.2513994678708658 5 rz 6 2.2546380725286257 5 rz 4 -0.41246800066795863 5 rz 8 0.4133873827301695 5 rz 7 2.3563099677710264 5 rz 14 -0.9989369553991843 5 rz 9 -2.7510095309577114 5 rz 16 -2.930393474388311 5 rz 11 2.2215976945329947 5 rz 20 -1.9682073694249083 5 rz 13 2.6009354607665633 5 rz 22 -2.7001293760780083 5 rz 15 2.5335560654853895 5 rz 24 -2.39691027011676 5 rz 17 -0.7423813429186499 5 rz 26 0.7991639946126413 5 rz 19 2.0345218643948497 5 rz 29 -2.050938322737726 5 rz 21 -0.6559509011901303 5 rz 31 -0.8184806876376881 5 rz 23 -2.4433245645000508 5 rz 33 2.7662935758886693 5 rz 25 -1.6140341496881252 5 rz 35 1.5135909743353206 5 rz 30 2.4170911887166646 5 rz 38 -2.412768992191676 5 rz 32 0.44574337984494505 5 rz 40 -0.42078376332380696 5 rz 34 -3.0038933332707183 5 rz 42 -2.8323993477171854 5 rz 39 -0.9953713874379053 5 rz 45 0.910504771397445 5 rz 41 -1.0166585860487407 5 rz 47 0.8774840291195077 5 rz 46 2.7788749929698184 5 rz 50 -2.683035523976411 6 fs 0 3 1.5192859850645715 0.49387245572956845 6 fs 2 6 1.5120572609259932 0.5211713721957417 6 fs 4 8 1.615096254724942 0.7269644142795206 6 fs 7 14 1.5269188098932545 0.5036266469194081 6 fs 9 16 1.5179602369002039 0.4914328237769214 6 fs 11 20 1.537427483096926 0.45115204759967975 6 fs 13 22 1.53486366638317 0.46559889697604934 6 fs 15 24 1.5194586006330344 0.5068560732280918 6 fs 17 26 1.5819908111894527 0.5595875596558442 6 fs 19 29 1.5070579127771144 0.4520319437379419 6 fs 21 31 1.527311970249325 0.4920204543143157 6 fs 23 33 1.5139592614725292 0.45916943035876673 6 fs 25 35 1.5425204049671604 0.5057437054391503 6 fs 30 38 1.5432564804093452 0.5658780292653538 6 fs 32 40 1.4611081680611278 0.5435451345370095 6 fs 34 42 1.4529959991143482 0.43830813863531964 6 fs 39 45 1.6239619425876082 0.4985036227887135 6 fs 41 47 1.4884560669186362 0.4964777432807688 6 fs 46 50 1.5034760541420213 0.5004774067921798 7 rz 0 0.32256664544673086 7 rz 3 0.461449424152999 7 rz 2 1.6662845869106162 7 rz 6 -1.6630459822528558 7 rz 4 -2.0807726116383005 7 rz 8 2.0816919937005114 7 rz 7 0.21310624160012637 7 rz 14 1.1442667707717158 7 rz 9 -3.057055440423247 7 rz 16 -2.6243475649227754 7 rz 11 -1.6842610823270208 7 rz 20 1.9376514074351068 7 rz 13 -1.9233198015746487 7 rz 22 1.8241258862632037 7 rz 15 3.0412260649904477 7 rz 24 -2.9045802696218184 7 rz 17 -2.053004862643731 7 rz 26 2.1097875143377225 7 rz 19 -2.3270525120981063 7 rz 29 2.31063605375523 7 rz 21 -0.19919797967155972 7 rz 31 -1.2752336091562588 7 rz 23 -1.43179848523061 7 rz 33 1.7547674966192288 7 rz 25 2.902192486573229 7 rz 35 -3.0026356619260337 7 rz 30 1.9833150852685666 7 rz 38 -1.9789928887435797 7 rz 32 -0.6369338680732861 7 rz 40 0.661893484594426 7 rz 34 1.6098110903736034 7 rz 42 -1.1629184641819208 7 rz 39 -0.9546461682460753 7 rz 45 0.869779552205615 7 rz 41 0.825744282325278 7 rz 47 -0.9649188392545094 7 rz 46 2.356987377884714 7 rz 50 -2.2611479088913065 8 x_1_2 0 8 x_1_2 1 8 x_1_2 2 8 hz_1_2 3 8 hz_1_2 4 8 y_1_2 5 8 hz_1_2 6 8 hz_1_2 7 8 x_1_2 8 8 y_1_2 9 8 y_1_2 10 8 y_1_2 11 8 x_1_2 12 8 y_1_2 13 8 x_1_2 14 8 y_1_2 15 8 y_1_2 16 8 x_1_2 17 8 x_1_2 18 8 y_1_2 19 8 hz_1_2 20 8 x_1_2 21 8 x_1_2 22 8 x_1_2 23 8 hz_1_2 24 8 y_1_2 25 8 y_1_2 26 8 y_1_2 27 8 hz_1_2 28 8 hz_1_2 29 8 x_1_2 30 8 x_1_2 31 8 x_1_2 32 8 x_1_2 33 8 x_1_2 34 8 hz_1_2 35 8 hz_1_2 36 8 y_1_2 37 8 hz_1_2 38 8 y_1_2 39 8 hz_1_2 40 8 x_1_2 41 8 x_1_2 42 8 hz_1_2 43 8 x_1_2 44 8 hz_1_2 45 8 y_1_2 46 8 x_1_2 47 8 hz_1_2 48 8 hz_1_2 49 8 hz_1_2 50 8 x_1_2 51 8 y_1_2 52 9 rz 0 2.7296498014579313 9 rz 1 -1.590368513185332 9 rz 2 2.159690705273027 9 rz 3 -2.144666104810616 9 rz 4 1.1806041264524705 9 rz 5 -1.058402647956994 9 rz 7 1.622814550818351 9 rz 8 -3.090826498553735 9 rz 9 2.0475467080709855 9 rz 10 -2.808240772656996 9 rz 11 0.0363681235151887 9 rz 12 0.6267368345703623 9 rz 13 -1.683077723731188 9 rz 14 1.821251782956388 9 rz 15 1.889905607894633 9 rz 16 -1.8011305030821063 9 rz 17 1.191224713999632 9 rz 18 -2.126642695386768 9 rz 19 1.9658871892348433 9 rz 20 -1.9511085272322664 9 rz 21 -1.4198006347182375 9 rz 22 0.5225414603032448 9 rz 23 -2.7119350351230427 9 rz 24 1.7532928428796295 9 rz 25 2.270174449602111 9 rz 26 -2.421631498515731 9 rz 28 -1.9757472607933801 9 rz 29 2.690718125624965 9 rz 30 -1.5268156554449863 9 rz 31 1.2787749581888708 9 rz 32 2.3593119641929743 9 rz 33 -2.420796885290144 9 rz 34 1.6485284700460934 9 rz 35 -0.9914944601366429 9 rz 37 1.3965268522136594 9 rz 38 -1.3773869100671003 9 rz 39 0.7250694837307181 9 rz 40 -0.7633051520811271 9 rz 41 -2.1782266577776674 9 rz 42 2.43381058936766 9 rz 44 1.9783871934256716 9 rz 45 -2.0428219001414405 9 rz 46 2.616236186508104 9 rz 47 -2.816811184588105 9 rz 49 0.3777875775333017 9 rz 50 -0.09226863764678939 10 fs 0 1 1.5508555127616375 0.48773645023966805 10 fs 2 3 1.4860895179182787 0.49800223593597315 10 fs 4 5 1.5268891182960795 0.5146971591948788 10 fs 7 8 1.5004518396933153 0.541239891546859 10 fs 9 10 1.5996085979256793 0.5279139399675195 10 fs 11 12 1.5354845176224254 0.41898979144044296 10 fs 13 14 1.545842827888829 0.533679342490625 10 fs 15 16 1.5651524165810975 0.5296573901163858 10 fs 17 18 1.6240366191418867 0.48516108212176406 10 fs 19 20 1.6022614099028112 0.5001380228896306 10 fs 21 22 1.574931196238987 0.5236666378689078 10 fs 23 24 1.5238301684218176 0.47521120348925566 10 fs 25 26 1.5426970250652188 0.5200449092580564 10 fs 28 29 1.4235475054732074 0.5253841271266504 10 fs 30 31 1.511471063363894 0.4578807555552488 10 fs 32 33 1.5371762819242982 0.5674318212304278 10 fs 34 35 1.510414477168897 0.44988262527024675 10 fs 37 38 1.498535212903308 0.637164678333888 10 fs 39 40 1.507377591132129 0.47869828403704195 10 fs 41 42 1.48836082148729 0.46458301209227065 10 fs 44 45 1.5400981673597602 0.5128416009465753 10 fs 46 47 1.5860873970424136 0.4790438939428006 10 fs 49 50 1.5630547528566316 0.48589356877723594 11 rz 0 -2.055478127333757 11 rz 1 -3.088425891573232 11 rz 2 -2.224048533450526 11 rz 3 2.239073133912937 11 rz 4 -1.5717956753246403 11 rz 5 1.693997153820117 11 rz 7 -1.5534983747823254 11 rz 8 0.08548642704694132 11 rz 9 1.851590500689747 11 rz 10 -2.612284565275756 11 rz 11 -0.6707597723908929 11 rz 12 1.333864730476444 11 rz 13 -0.4627326605980393 11 rz 14 0.6009067198232394 11 rz 15 0.030858809637424045 11 rz 16 0.05791629517510266 11 rz 17 -0.6573659838051862 11 rz 18 -0.27805199758195087 11 rz 19 -0.15131986471501513 11 rz 20 0.16609852671759207 11 rz 21 -1.616287932958402 11 rz 22 0.7190287585434092 11 rz 23 2.0543843880082964 11 rz 24 -3.0130265802517098 11 rz 25 -1.918109093883396 11 rz 26 1.7666520449697758 11 rz 28 1.4266082874857098 11 rz 29 -0.7116374226541247 11 rz 30 -0.31165755635697856 11 rz 31 0.06361685910086301 11 rz 32 -2.420231334847587 11 rz 33 2.358746413750417 11 rz 34 -2.9214866744162733 11 rz 35 -2.7046646228538638 11 rz 37 -2.074440199810285 11 rz 38 2.093580141956844 11 rz 39 0.03769063813623674 11 rz 40 -0.075926306486644 11 rz 41 2.3692232378041176 11 rz 42 -2.113639306214125 11 rz 44 0.6857578577092225 11 rz 45 -0.7501925644249887 11 rz 46 2.7570195705710665 11 rz 47 -2.957594568651068 11 rz 49 1.5950409783058557 11 rz 50 -1.309522038419343 12 hz_1_2 0 12 hz_1_2 1 12 y_1_2 2 12 x_1_2 3 12 x_1_2 4 12 x_1_2 5 12 y_1_2 6 12 x_1_2 7 12 y_1_2 8 12 x_1_2 9 12 hz_1_2 10 12 hz_1_2 11 12 hz_1_2 12 12 hz_1_2 13 12 hz_1_2 14 12 hz_1_2 15 12 hz_1_2 16 12 y_1_2 17 12 y_1_2 18 12 hz_1_2 19 12 y_1_2 20 12 hz_1_2 21 12 hz_1_2 22 12 y_1_2 23 12 y_1_2 24 12 x_1_2 25 12 x_1_2 26 12 x_1_2 27 12 y_1_2 28 12 x_1_2 29 12 hz_1_2 30 12 hz_1_2 31 12 hz_1_2 32 12 y_1_2 33 12 hz_1_2 34 12 x_1_2 35 12 x_1_2 36 12 x_1_2 37 12 x_1_2 38 12 hz_1_2 39 12 x_1_2 40 12 hz_1_2 41 12 hz_1_2 42 12 y_1_2 43 12 hz_1_2 44 12 y_1_2 45 12 x_1_2 46 12 hz_1_2 47 12 y_1_2 48 12 x_1_2 49 12 y_1_2 50 12 hz_1_2 51 12 x_1_2 52 13 rz 3 1.5514777117377587 13 rz 4 -1.471042458257246 13 rz 6 0.9376872138295304 13 rz 7 -2.505708502040484 13 rz 8 -0.8138828334823582 13 rz 9 1.4625269352538472 13 rz 12 1.5465631243549467 13 rz 13 -1.3779143806237855 13 rz 14 -3.056522836696912 13 rz 15 3.0197041955368213 13 rz 16 1.4313150179323237 13 rz 17 -1.4458071174911336 13 rz 20 -0.5377106953899506 13 rz 21 -0.2326881725325665 13 rz 22 -0.14916236480551603 13 rz 23 -0.0049063314348209985 13 rz 24 0.7506379057684889 13 rz 25 -0.9003639271372892 13 rz 26 -1.8474993478983084 13 rz 27 1.9987708035250034 13 rz 29 1.245482758924572 13 rz 30 -1.2148704795940066 13 rz 31 0.03686637959834638 13 rz 32 0.0035863783361342882 13 rz 33 -1.8613845453503193 13 rz 34 2.1274320925128025 13 rz 35 -1.3490677361559822 13 rz 36 1.6785360491008614 13 rz 38 -2.5257109756448184 13 rz 39 2.10867489793368 13 rz 40 -2.759920821735129 13 rz 41 2.7202395614573565 13 rz 42 -0.4183020554137258 13 rz 43 0.9848848466497087 13 rz 45 -0.42166402519488333 13 rz 46 0.44428590744672997 13 rz 47 -0.77688951203044 13 rz 48 -0.5622182800396907 13 rz 50 2.348540240114408 13 rz 51 -2.7786467500008385 14 fs 3 4 1.483304234663135 0.4930986258758784 14 fs 6 7 1.5160176987076064 0.49850252902921577 14 fs 8 9 1.5338611249160479 0.5011308712767845 14 fs 12 13 1.480179689158691 0.4772322221553844 14 fs 14 15 1.5152260103068818 0.49796235787029736 14 fs 16 17 1.5284924549164072 0.5160847019657471 14 fs 20 21 1.58661284381037 0.475779832809368 14 fs 22 23 1.5333295850816209 0.44983388105304506 14 fs 24 25 1.5158107733607835 0.4663776718737318 14 fs 26 27 1.5645151084457722 0.47497942677256283 14 fs 29 30 1.5659881784786247 0.5656290235103623 14 fs 31 32 1.5211879663086973 0.5056110683638391 14 fs 33 34 1.5083349422212171 0.49641600818144604 14 fs 35 36 1.5087002777200382 0.44025777694304247 14 fs 38 39 1.5658333118222365 0.47264531483343447 14 fs 40 41 1.5219378850865568 0.5335829954491795 14 fs 42 43 1.5501487671051402 0.4404117539373896 14 fs 45 46 1.4825325148661492 0.6857341218223484 14 fs 47 48 1.4941963673904604 0.45895108234543025 14 fs 50 51 1.5487430259667763 0.4467898473637848 15 rz 3 -1.8841634261494544 15 rz 4 1.9645986796299673 15 rz 6 2.885627836077404 15 rz 7 1.8295361828912287 15 rz 8 0.05530092720528268 15 rz 9 0.5933431745662068 15 rz 12 -1.2922413166611904 15 rz 13 1.4608900603923516 15 rz 14 -2.3332667091615846 15 rz 15 2.296448068001496 15 rz 16 -1.436526112189684 15 rz 17 1.4220340126308777 15 rz 20 2.6035758286461963 15 rz 21 2.90921061061087 15 rz 22 -1.7401438372662703 15 rz 23 1.586075141025933 15 rz 24 0.5464640634289042 15 rz 25 -0.6961900847977063 15 rz 26 0.7545429458085255 15 rz 27 -0.6032714901818306 15 rz 29 -1.1636385149103123 15 rz 30 1.1942507942408778 15 rz 31 -1.071330330465674 15 rz 32 1.1117830884001547 15 rz 33 2.06057801616892 15 rz 34 -1.7945304690064374 15 rz 35 1.413295584834648 15 rz 36 -1.0838272718897688 15 rz 38 1.3041394540259699 15 rz 39 -1.7211755317371082 15 rz 40 -1.8989017400046564 15 rz 41 1.8592204797268828 15 rz 42 -1.0625073171877455 15 rz 43 1.6290901084237286 15 rz 45 1.2492236358488604 15 rz 46 -1.2266017535970137 15 rz 47 1.4019785896279764 15 rz 48 -2.741086381698107 15 rz 50 -2.3814810782487683 15 rz 51 1.951374568362338 16 y_1_2 0 16 x_1_2 1 16 x_1_2 2 16 y_1_2 3 16 hz_1_2 4 16 y_1_2 5 16 x_1_2 6 16 hz_1_2 7 16 x_1_2 8 16 hz_1_2 9 16 y_1_2 10 16 y_1_2 11 16 x_1_2 12 16 x_1_2 13 16 y_1_2 14 16 x_1_2 15 16 x_1_2 16 16 x_1_2 17 16 x_1_2 18 16 x_1_2 19 16 hz_1_2 20 16 x_1_2 21 16 x_1_2 22 16 hz_1_2 23 16 hz_1_2 24 16 y_1_2 25 16 hz_1_2 26 16 y_1_2 27 16 hz_1_2 28 16 y_1_2 29 16 y_1_2 30 16 y_1_2 31 16 x_1_2 32 16 x_1_2 33 16 y_1_2 34 16 hz_1_2 35 16 hz_1_2 36 16 y_1_2 37 16 y_1_2 38 16 x_1_2 39 16 hz_1_2 40 16 y_1_2 41 16 x_1_2 42 16 hz_1_2 43 16 y_1_2 44 16 hz_1_2 45 16 y_1_2 46 16 y_1_2 47 16 hz_1_2 48 16 hz_1_2 49 16 x_1_2 50 16 x_1_2 51 16 hz_1_2 52 17 rz 0 2.509738315706713 17 rz 1 -1.3704570274341172 17 rz 2 2.153407519965878 17 rz 3 -2.138382919503467 17 rz 4 2.814232306319262 17 rz 5 -2.6920308278237854 17 rz 7 -1.8455037387446078 17 rz 8 0.37749179100920927 17 rz 9 -0.5222760825654262 17 rz 10 -0.23841798202058587 17 rz 11 -2.294693625448355 17 rz 12 2.957798583533906 17 rz 13 0.6354176546180561 17 rz 14 -0.497243595392856 17 rz 15 -1.364784381224447 17 rz 16 1.4535594860369727 17 rz 17 -2.5347041731578344 17 rz 18 1.5992861917706982 17 rz 19 -1.5212806562497523 17 rz 20 1.5360593182523292 17 rz 21 -0.4836060239484059 17 rz 22 -0.413653150466585 17 rz 23 2.880099888266729 17 rz 24 2.4444432266694456 17 rz 25 2.967608018699071 17 rz 26 -3.119065067612691 17 rz 28 1.7627479969783801 17 rz 29 -1.047777132146802 17 rz 30 -2.9279659789460553 17 rz 31 2.6799252816899397 17 rz 32 -1.3666169229644929 17 rz 33 1.3051320018673227 17 rz 34 2.3459620391428473 17 rz 35 -1.688928029233397 17 rz 37 0.7053764684240491 17 rz 38 -0.6862365262774901 17 rz 39 1.6612640945005488 17 rz 40 -1.6994997628509552 17 rz 41 2.012657942111037 17 rz 42 -1.7570740105210447 17 rz 44 0.809714726290327 17 rz 45 -0.8741494330060942 17 rz 46 2.8487140428736204 17 rz 47 -3.049289040953621 17 rz 49 -1.9469909861230956 17 rz 50 2.232509926009607 18 fs 0 1 1.5508555127616375 0.48773645023966805 18 fs 2 3 1.4860895179182787 0.49800223593597315 18 fs 4 5 1.5268891182960795 0.5146971591948788 18 fs 7 8 1.5004518396933153 0.541239891546859 18 fs 9 10 1.5996085979256793 0.5279139399675195 18 fs 11 12 1.5354845176224254 0.41898979144044296 18 fs 13 14 1.545842827888829 0.533679342490625 18 fs 15 16 1.5651524165810975 0.5296573901163858 18 fs 17 18 1.6240366191418867 0.48516108212176406 18 fs 19 20 1.6022614099028112 0.5001380228896306 18 fs 21 22 1.574931196238987 0.5236666378689078 18 fs 23 24 1.5238301684218176 0.47521120348925566 18 fs 25 26 1.5426970250652188 0.5200449092580564 18 fs 28 29 1.4235475054732074 0.5253841271266504 18 fs 30 31 1.511471063363894 0.4578807555552488 18 fs 32 33 1.5371762819242982 0.5674318212304278 18 fs 34 35 1.510414477168897 0.44988262527024675 18 fs 37 38 1.498535212903308 0.637164678333888 18 fs 39 40 1.507377591132129 0.47869828403704195 18 fs 41 42 1.48836082148729 0.46458301209227065 18 fs 44 45 1.5400981673597602 0.5128416009465753 18 fs 46 47 1.5860873970424136 0.4790438939428006 18 fs 49 50 1.5630547528566316 0.48589356877723594 19 rz 0 -1.835566641582535 19 rz 1 2.9748479298551374 19 rz 2 -2.2177653481433772 19 rz 3 2.232789948605788 19 rz 4 3.0777614519881524 19 rz 5 -2.955559973492676 19 rz 7 1.914819914780612 19 rz 8 2.900353444663576 19 rz 9 -1.8617720158534254 19 rz 10 1.1010779512674134 19 rz 11 1.6603019765726525 19 rz 12 -0.9971970184871015 19 rz 13 -2.7812280389472868 19 rz 14 2.919402098172487 19 rz 15 -2.9976365084230814 19 rz 16 3.086411613235608 19 rz 17 3.06856290335228 19 rz 18 2.27920442244017 19 rz 19 -2.947337326410006 19 rz 20 2.9621159884125827 19 rz 21 -2.5524825437282335 19 rz 22 1.6552233693132423 19 rz 23 2.745534771798109 19 rz 24 2.5790083431380637 19 rz 25 -2.615542662980356 19 rz 26 2.464085614066736 19 rz 28 -2.31188697028605 19 rz 29 3.0268578351176316 19 rz 30 1.0894927671440904 19 rz 31 -1.337533464400206 19 rz 32 1.30569755230988 19 rz 33 -1.3671824734070501 19 rz 34 2.6642650636665586 19 rz 35 -2.007231053757109 19 rz 37 -1.3832898160206781 19 rz 38 1.4024297581672371 19 rz 39 -0.8985039726335948 19 rz 40 0.8602683042831885 19 rz 41 -1.821661362084587 19 rz 42 2.0772452936745793 19 rz 44 1.85443032484457 19 rz 45 -1.9188650315603386 19 rz 46 2.524541714205551 19 rz 47 -2.7251167122855513 19 rz 49 -2.363365765217333 19 rz 50 2.648884705103846 20 x_1_2 0 20 y_1_2 1 20 hz_1_2 2 20 hz_1_2 3 20 y_1_2 4 20 x_1_2 5 20 y_1_2 6 20 x_1_2 7 20 y_1_2 8 20 y_1_2 9 20 hz_1_2 10 20 hz_1_2 11 20 hz_1_2 12 20 hz_1_2 13 20 x_1_2 14 20 y_1_2 15 20 y_1_2 16 20 hz_1_2 17 20 y_1_2 18 20 y_1_2 19 20 y_1_2 20 20 y_1_2 21 20 y_1_2 22 20 y_1_2 23 20 x_1_2 24 20 hz_1_2 25 20 y_1_2 26 20 x_1_2 27 20 y_1_2 28 20 hz_1_2 29 20 x_1_2 30 20 hz_1_2 31 20 y_1_2 32 20 y_1_2 33 20 hz_1_2 34 20 x_1_2 35 20 y_1_2 36 20 hz_1_2 37 20 hz_1_2 38 20 hz_1_2 39 20 x_1_2 40 20 hz_1_2 41 20 hz_1_2 42 20 x_1_2 43 20 hz_1_2 44 20 x_1_2 45 20 x_1_2 46 20 x_1_2 47 20 x_1_2 48 20 x_1_2 49 20 y_1_2 50 20 y_1_2 51 20 y_1_2 52 21 rz 3 2.0227166097761504 21 rz 4 -1.9422813562956345 21 rz 6 0.22140408881091742 21 rz 7 -1.7894253770218675 21 rz 8 -1.2788385462138028 21 rz 9 1.9274826479852925 21 rz 12 1.7853241660278165 21 rz 13 -1.6166754222966553 21 rz 14 0.9081670921334216 21 rz 15 -0.9449857332935103 21 rz 16 2.1224654017221383 21 rz 17 -2.1369575012809463 21 rz 20 -2.1713388752567457 21 rz 21 1.400940007334226 21 rz 22 1.2394215880812602 21 rz 23 -1.3934902843215973 21 rz 24 -1.34794598682954 21 rz 25 1.1982199654607406 21 rz 26 -1.6213046768399444 21 rz 27 1.772576132466643 21 rz 29 1.9491995133286792 21 rz 30 -1.9185872339981103 21 rz 31 -2.985345753155011 21 rz 32 3.0257985110894925 21 rz 33 2.79445576726983 21 rz 34 -2.5284082201073472 21 rz 35 2.138100109328821 21 rz 36 -1.8086317963839418 21 rz 38 -2.76447201731769 21 rz 39 2.3474359396065516 21 rz 40 -1.8300093962726527 21 rz 41 1.79032813599488 21 rz 42 2.8363879337053515 21 rz 43 -2.2698051424693713 21 rz 45 1.2119641546719073 21 rz 46 -1.1893422724200597 21 rz 47 -0.3245001699135024 21 rz 48 -1.0146076221566283 21 rz 50 0.9536731019204866 21 rz 51 -1.3837796118069186 22 fs 3 4 1.483304234663135 0.4930986258758784 22 fs 6 7 1.5160176987076064 0.49850252902921577 22 fs 8 9 1.5338611249160479 0.5011308712767845 22 fs 12 13 1.480179689158691 0.4772322221553844 22 fs 14 15 1.5152260103068818 0.49796235787029736 22 fs 16 17 1.5284924549164072 0.5160847019657471 22 fs 20 21 1.58661284381037 0.475779832809368 22 fs 22 23 1.5333295850816209 0.44983388105304506 22 fs 24 25 1.5158107733607835 0.4663776718737318 22 fs 26 27 1.5645151084457722 0.47497942677256283 22 fs 29 30 1.5659881784786247 0.5656290235103623 22 fs 31 32 1.5211879663086973 0.5056110683638391 22 fs 33 34 1.5083349422212171 0.49641600818144604 22 fs 35 36 1.5087002777200382 0.44025777694304247 22 fs 38 39 1.5658333118222365 0.47264531483343447 22 fs 40 41 1.5219378850865568 0.5335829954491795 22 fs 42 43 1.5501487671051402 0.4404117539373896 22 fs 45 46 1.4825325148661492 0.6857341218223484 22 fs 47 48 1.4941963673904604 0.45895108234543025 22 fs 50 51 1.5487430259667763 0.4467898473637848 23 rz 3 -2.355402324187839 23 rz 4 2.435837577668355 23 rz 6 -2.6812743460835655 23 rz 7 1.1132530578726154 23 rz 8 0.5202566399367274 23 rz 9 0.12838746183476202 23 rz 12 -1.5310023583340602 23 rz 13 1.6996511020652214 23 rz 14 -0.014771330812333616 23 rz 15 -0.0220473103477552 23 rz 16 -2.127676495979493 23 rz 17 2.113184396420685 23 rz 20 -2.0459812986665984 23 rz 21 1.2755824307440768 23 rz 22 -3.1287277901530466 23 rz 23 2.9746590939127096 23 rz 24 2.645047956026932 23 rz 25 -2.7947739773957316 23 rz 26 0.5283482747501616 23 rz 27 -0.377076819123463 23 rz 29 -1.867355269314416 23 rz 30 1.897967548644985 23 rz 31 1.950881802287684 23 rz 32 -1.9104290443532026 23 rz 33 -2.5952622964512297 23 rz 34 2.8613098436137125 23 rz 35 -2.0738722606501554 23 rz 36 2.4033405735950346 23 rz 38 1.5429004956988415 23 rz 39 -1.9599365734099798 23 rz 40 -2.8288131654671322 23 rz 41 2.7891319051893593 23 rz 42 1.9659880008727608 23 rz 43 -1.3994052096367806 23 rz 45 -0.38440454401792934 23 rz 46 0.4070264262697769 23 rz 47 0.9495892475110317 23 rz 48 -2.2886970395811623 23 rz 50 -0.9866139400548483 23 rz 51 0.5565074301684163 24 hz_1_2 0 24 x_1_2 1 24 y_1_2 2 24 y_1_2 3 24 x_1_2 4 24 hz_1_2 5 24 x_1_2 6 24 hz_1_2 7 24 x_1_2 8 24 hz_1_2 9 24 y_1_2 10 24 y_1_2 11 24 x_1_2 12 24 x_1_2 13 24 hz_1_2 14 24 x_1_2 15 24 hz_1_2 16 24 x_1_2 17 24 hz_1_2 18 24 x_1_2 19 24 x_1_2 20 24 x_1_2 21 24 hz_1_2 22 24 x_1_2 23 24 y_1_2 24 24 x_1_2 25 24 hz_1_2 26 24 hz_1_2 27 24 x_1_2 28 24 x_1_2 29 24 hz_1_2 30 24 x_1_2 31 24 x_1_2 32 24 hz_1_2 33 24 x_1_2 34 24 y_1_2 35 24 x_1_2 36 24 x_1_2 37 24 y_1_2 38 24 y_1_2 39 24 y_1_2 40 24 x_1_2 41 24 x_1_2 42 24 y_1_2 43 24 x_1_2 44 24 hz_1_2 45 24 hz_1_2 46 24 hz_1_2 47 24 y_1_2 48 24 hz_1_2 49 24 hz_1_2 50 24 hz_1_2 51 24 x_1_2 52 25 rz 1 -1.7330955636302576 25 rz 4 1.9398691302822326 25 rz 3 -1.3595905672440445 25 rz 7 -0.15903789486672082 25 rz 5 0.9983480185332675 25 rz 9 -0.31564404036580385 25 rz 6 1.6005797808823772 25 rz 13 -1.499867333846277 25 rz 8 -2.0133729703407113 25 rz 15 1.9521694964279346 25 rz 10 -2.2092282896270623 25 rz 17 2.370715615488243 25 rz 12 -2.8505778473320245 25 rz 21 2.415338342284782 25 rz 14 -2.7073106232211153 25 rz 23 2.9331993910785776 25 rz 16 -1.234561816122234 25 rz 25 1.2872453810226325 25 rz 18 0.17343200211866971 25 rz 27 -0.15234963602808804 25 rz 20 3.127364464427597 25 rz 30 -3.117297966598411 25 rz 22 -0.25478173773634083 25 rz 32 0.10803990070456493 25 rz 24 0.37354651617850365 25 rz 34 0.2136147516704163 25 rz 26 -1.894523295721189 25 rz 36 1.843936505903141 25 rz 29 -3.1338996122268092 25 rz 37 -3.0782356919943297 25 rz 31 2.1250997343771267 25 rz 39 2.9023032127557684 25 rz 33 2.4328195171731437 25 rz 41 -2.6707659011151748 25 rz 35 -2.145151811969935 25 rz 43 2.337402438966709 25 rz 38 -0.20565851076299776 25 rz 44 0.1803029251110182 25 rz 40 -0.1207797111557447 25 rz 46 0.11786565918021451 25 rz 42 2.457861535405762 25 rz 48 2.942071317594255 25 rz 45 2.3911948089457944 25 rz 49 -2.5230498754107877 25 rz 47 -1.198546606652119 25 rz 51 1.177655058764337 25 rz 50 0.10358021090199898 25 rz 52 -1.2305673521312634 26 fs 1 4 1.5157741664069029 0.5567125777723744 26 fs 3 7 1.5177580142209797 0.4948108578225166 26 fs 5 9 1.6036738621219824 0.47689957001758815 26 fs 6 13 1.5177327089642791 0.5058312223892585 26 fs 8 15 1.5253184444076096 0.46557175536519374 26 fs 10 17 1.6141004604574274 0.494343440675308 26 fs 12 21 1.5476810407275208 0.44290174465702487 26 fs 14 23 1.5237261387830179 0.4696616122846161 26 fs 16 25 1.5285844942020295 0.5736654641906893 26 fs 18 27 1.5483159975149505 0.4961408893973623 26 fs 20 30 1.6377079485605028 0.6888985951517526 26 fs 22 32 1.529949914236052 0.48258847574702635 26 fs 24 34 1.5280421758407217 0.5109767145462891 26 fs 26 36 1.5120782868771674 0.4815152809861558 26 fs 29 37 1.5071938854285831 0.5089276063739265 26 fs 31 39 1.5460100224551203 0.5302403303961576 26 fs 33 41 1.5166625940397171 0.4517159790427676 26 fs 35 43 1.4597689731864314 0.4214985958536156 26 fs 38 44 1.535649445690472 0.47076284376181704 26 fs 40 46 1.5179778495708582 0.5221350266177334 26 fs 42 48 1.4969321270213238 0.4326117171327162 26 fs 45 49 1.5114987201637704 0.4914319343687703 26 fs 47 51 1.4908807480930255 0.4886243720131578 26 fs 50 52 1.616256999726831 0.501428936283957 27 rz 1 1.7724664194652178 27 rz 4 -1.5656928528132426 27 rz 3 0.759607559590961 27 rz 7 -2.2782360217017192 27 rz 5 -1.0079670710951056 27 rz 9 1.6906710492625692 27 rz 6 0.05988685034802011 27 rz 13 0.04082559668808017 27 rz 8 0.7106277561520997 27 rz 15 -0.7718312300648762 27 rz 10 -2.707297464588221 27 rz 17 2.8687847904494017 27 rz 12 0.7639604313656694 27 rz 21 -1.1991999364129118 27 rz 14 -2.8382972072733033 27 rz 23 3.0641859751307656 27 rz 16 -1.8447115551255957 27 rz 25 1.8973951200259942 27 rz 18 -0.9331644857301312 27 rz 27 0.9542468518207095 27 rz 20 -0.6509021786445608 27 rz 30 0.6609686764737468 27 rz 22 0.5664355433142667 27 rz 32 -0.7131773803460426 27 rz 24 0.1297057374208599 27 rz 34 0.45745553042806003 27 rz 26 2.6703217345889136 27 rz 36 -2.720908524406962 27 rz 29 0.8479855032239847 27 rz 37 -0.7769355002655338 27 rz 31 1.5221248461973182 27 rz 39 -2.7779072062440058 27 rz 33 -2.799489702986982 27 rz 41 2.561543319044951 27 rz 35 -0.04972065802050806 27 rz 43 0.24197128501728213 27 rz 38 1.5754169046046478 27 rz 44 -1.6007724902566276 27 rz 40 0.964040510151481 27 rz 46 -0.966954562127011 27 rz 42 1.6285834854416945 27 rz 48 -2.511835939621264 27 rz 45 3.1294394739035276 27 rz 49 3.0218907668110653 27 rz 47 0.8257817206597977 27 rz 51 -0.8466732685475797 27 rz 50 2.178584413048238 27 rz 52 2.9776137529020836 28 x_1_2 0 28 hz_1_2 1 28 x_1_2 2 28 hz_1_2 3 28 y_1_2 4 28 x_1_2 5 28 y_1_2 6 28 y_1_2 7 28 hz_1_2 8 28 y_1_2 9 28 hz_1_2 10 28 hz_1_2 11 28 hz_1_2 12 28 hz_1_2 13 28 y_1_2 14 28 hz_1_2 15 28 y_1_2 16 28 y_1_2 17 28 x_1_2 18 28 y_1_2 19 28 y_1_2 20 28 hz_1_2 21 28 x_1_2 22 28 y_1_2 23 28 x_1_2 24 28 y_1_2 25 28 y_1_2 26 28 x_1_2 27 28 hz_1_2 28 28 y_1_2 29 28 y_1_2 30 28 y_1_2 31 28 hz_1_2 32 28 x_1_2 33 28 hz_1_2 34 28 x_1_2 35 28 hz_1_2 36 28 hz_1_2 37 28 hz_1_2 38 28 x_1_2 39 28 x_1_2 40 28 hz_1_2 41 28 y_1_2 42 28 x_1_2 43 28 y_1_2 44 28 y_1_2 45 28 y_1_2 46 28 y_1_2 47 28 x_1_2 48 28 x_1_2 49 28 x_1_2 50 28 x_1_2 51 28 y_1_2 52 29 rz 0 0.2708568396429989 29 rz 3 0.5131592299567238 29 rz 2 1.248334748228233 29 rz 6 -1.245096143570473 29 rz 4 1.7049654478519258 29 rz 8 -1.704046065789715 29 rz 7 0.2828588164022108 29 rz 14 1.074514195969634 29 rz 9 2.8221758365108265 29 rz 16 -2.2203935346772603 29 rz 11 2.2153145092260527 29 rz 20 -1.9619241841179669 29 rz 13 0.4960683828611785 29 rz 22 -0.5952622981726243 29 rz 15 2.520989694870888 29 rz 24 -2.3843438995022606 29 rz 17 2.7322201319514434 29 rz 26 -2.6754374802574503 29 rz 19 2.7508049894134636 29 rz 29 -2.767221447756338 29 rz 21 0.7640489782325908 29 rz 31 -2.23848056706041 29 rz 23 -3.109342207061271 29 rz 33 -2.8508740887297 29 rz 25 -2.983768546653451 29 rz 35 2.8833253713006393 29 rz 30 -0.4040590142067196 29 rz 38 0.4083812107316938 29 rz 32 0.4206106386165622 29 rz 40 -0.3956510220954215 29 rz 34 -3.022742889192781 29 rz 42 -2.813549791795122 29 rz 39 -2.3651057844032337 29 rz 45 2.2802391683627796 29 rz 41 -2.386392983014069 29 rz 47 2.2472184260848387 29 rz 46 -2.140859102552003 29 rz 50 2.2366985715454 30 fs 0 3 1.5192859850645715 0.49387245572956845 30 fs 2 6 1.5120572609259932 0.5211713721957417 30 fs 4 8 1.615096254724942 0.7269644142795206 30 fs 7 14 1.5269188098932545 0.5036266469194081 30 fs 9 16 1.5179602369002039 0.4914328237769214 30 fs 11 20 1.537427483096926 0.45115204759967975 30 fs 13 22 1.53486366638317 0.46559889697604934 30 fs 15 24 1.5194586006330344 0.5068560732280918 30 fs 17 26 1.5819908111894527 0.5595875596558442 30 fs 19 29 1.5070579127771144 0.4520319437379419 30 fs 21 31 1.527311970249325 0.4920204543143157 30 fs 23 33 1.5139592614725292 0.45916943035876673 30 fs 25 35 1.5425204049671604 0.5057437054391503 30 fs 30 38 1.5432564804093452 0.5658780292653538 30 fs 32 40 1.4611081680611278 0.5435451345370095 30 fs 34 42 1.4529959991143482 0.43830813863531964 30 fs 39 45 1.6239619425876082 0.4985036227887135 30 fs 41 47 1.4884560669186362 0.4964777432807688 30 fs 46 50 1.5034760541420213 0.5004774067921798 31 rz 0 0.278584348296274 31 rz 3 0.5054317213034487 31 rz 2 -1.833449629188484 31 rz 6 1.8366882338462445 31 rz 4 2.0849792470214012 31 rz 8 -2.084059864959194 31 rz 7 2.2865573929689447 31 rz 14 -0.9291843805970998 31 rz 9 -2.3470555007121945 31 rz 16 2.9488378025457607 31 rz 11 -1.6779778970200798 31 rz 20 1.9313682221281656 31 rz 13 0.1815472763307362 31 rz 22 -0.28074119164218203 31 rz 15 3.053792435604949 31 rz 24 -2.9171466402363215 31 rz 17 0.7555789696657627 31 rz 26 -0.6987963179717696 31 rz 19 -3.0433356371167157 31 rz 29 3.0269191787738414 31 rz 21 -1.6191978590942815 31 rz 31 0.14476627026646227 31 rz 23 -0.7657808426693897 31 rz 33 1.0887498540580047 31 rz 25 -2.011258423641035 31 rz 35 1.9108152482882197 31 rz 30 -1.4787200189876444 31 rz 38 1.4830422155126222 31 rz 32 -0.6118011268448953 31 rz 40 0.636760743366036 31 rz 34 1.6286606462956676 31 rz 42 -1.1817680201039842 31 rz 39 0.41508822871925233 31 rz 45 -0.49995484475970997 31 rz 41 2.1954786792906127 31 rz 47 -2.334653236219843 31 rz 46 0.9935361662269422 31 rz 50 -0.8976966972335454 32 hz_1_2 0 32 x_1_2 1 32 hz_1_2 2 32 y_1_2 3 32 x_1_2 4 32 hz_1_2 5 32 hz_1_2 6 32 hz_1_2 7 32 x_1_2 8 32 x_1_2 9 32 x_1_2 10 32 y_1_2 11 32 x_1_2 12 32 x_1_2 13 32 x_1_2 14 32 y_1_2 15 32 x_1_2 16 32 hz_1_2 17 32 y_1_2 18 32 x_1_2 19 32 x_1_2 20 32 y_1_2 21 32 hz_1_2 22 32 hz_1_2 23 32 hz_1_2 24 32 x_1_2 25 32 x_1_2 26 32 hz_1_2 27 32 x_1_2 28 32 hz_1_2 29 32 x_1_2 30 32 hz_1_2 31 32 x_1_2 32 32 hz_1_2 33 32 y_1_2 34 32 y_1_2 35 32 x_1_2 36 32 x_1_2 37 32 y_1_2 38 32 hz_1_2 39 32 y_1_2 40 32 y_1_2 41 32 x_1_2 42 32 y_1_2 43 32 hz_1_2 44 32 x_1_2 45 32 hz_1_2 46 32 x_1_2 47 32 hz_1_2 48 32 hz_1_2 49 32 y_1_2 50 32 hz_1_2 51 32 hz_1_2 52 33 rz 1 -3.121679516517034 33 rz 4 -2.9547322240105807 33 rz 3 1.191382667470723 33 rz 7 -2.710011129581499 33 rz 5 -2.488819826951536 33 rz 9 -3.1116615020605884 33 rz 6 -2.125349106275088 33 rz 13 2.2260615533111903 33 rz 8 -1.554700442916623 33 rz 15 1.4934969690038464 33 rz 10 -1.2793168641643788 33 rz 17 1.4408041900255597 33 rz 12 -0.06084357094438886 33 rz 21 -0.37439593410285354 33 rz 14 -0.1500542031989962 33 rz 23 0.3759429710564586 33 rz 16 -2.1770396121992057 33 rz 25 2.2297231770996184 33 rz 18 -3.09382435761491 33 rz 27 3.1149067237054986 33 rz 20 1.2738247988095885 33 rz 30 -1.2637583009803954 33 rz 22 0.4489350166677681 33 rz 32 -0.595676853699544 33 rz 24 1.3097411269483352 33 rz 34 -0.7225798590994152 33 rz 26 -1.6557622540483192 33 rz 36 1.6051754642302711 33 rz 29 1.509374329778833 33 rz 37 -1.4383243268203962 33 rz 31 0.25271051283766255 33 rz 39 -1.5084928728843643 33 rz 33 2.891492044597232 33 rz 41 -3.129438428539263 33 rz 35 0.4058214227450386 33 rz 43 -0.21357079574826443 33 rz 38 -1.8267203200154896 33 rz 44 1.8013647343635133 33 rz 40 -1.9743193767737497 33 rz 46 1.971405324798223 33 rz 42 2.4515783500986146 33 rz 48 2.9483545029014024 33 rz 45 -1.5734951198845515 33 rz 49 1.441640053419551 33 rz 47 1.8173823407940866 33 rz 51 -1.8382738886818792 33 rz 50 0.3297748819603683 33 rz 52 -1.4567620231896328 34 fs 1 4 1.5157741664069029 0.5567125777723744 34 fs 3 7 1.5177580142209797 0.4948108578225166 34 fs 5 9 1.6036738621219824 0.47689957001758815 34 fs 6 13 1.5177327089642791 0.5058312223892585 34 fs 8 15 1.5253184444076096 0.46557175536519374 34 fs 10 17 1.6141004604574274 0.494343440675308 34 fs 12 21 1.5476810407275208 0.44290174465702487 34 fs 14 23 1.5237261387830179 0.4696616122846161 34 fs 16 25 1.5285844942020295 0.5736654641906893 34 fs 18 27 1.5483159975149505 0.4961408893973623 34 fs 20 30 1.6377079485605028 0.6888985951517526 34 fs 22 32 1.529949914236052 0.48258847574702635 34 fs 24 34 1.5280421758407217 0.5109767145462891 34 fs 26 36 1.5120782868771674 0.4815152809861558 34 fs 29 37 1.5071938854285831 0.5089276063739265 34 fs 31 39 1.5460100224551203 0.5302403303961576 34 fs 33 41 1.5166625940397171 0.4517159790427676 34 fs 35 43 1.4597689731864314 0.4214985958536156 34 fs 38 44 1.535649445690472 0.47076284376181704 34 fs 40 46 1.5179778495708582 0.5221350266177334 34 fs 42 48 1.4969321270213238 0.4326117171327162 34 fs 45 49 1.5114987201637704 0.4914319343687703 34 fs 47 51 1.4908807480930255 0.4886243720131578 34 fs 50 52 1.616256999726831 0.501428936283957 35 rz 1 -3.1221349348275957 35 rz 4 -2.954276805700019 35 rz 3 -1.79136567512381 35 rz 7 0.2727372130130341 35 rz 5 2.4792007743896995 35 rz 9 -1.7964967962222342 35 rz 6 -2.497369569674099 35 rz 13 2.598082016710201 35 rz 8 0.25195522872801135 35 rz 15 -0.3131587026407878 35 rz 10 2.645976417128683 35 rz 17 -2.484489091267502 35 rz 12 -2.0257738450219662 35 rz 21 1.5905343399747238 35 rz 14 0.8876316798841639 35 rz 23 -0.6617429120267015 35 rz 16 -0.9022337590486096 35 rz 25 0.9549173239490222 35 rz 18 2.334091874003459 35 rz 27 -2.31300950791287 35 rz 20 1.2026374869734546 35 rz 30 -1.192570989144265 35 rz 22 -0.13728121108984226 35 rz 32 -0.009460625941933642 35 rz 24 -0.8064888733489717 35 rz 34 1.3936501411978917 35 rz 26 2.431560692916044 35 rz 36 -2.482147482734092 35 rz 29 2.4878968683979146 35 rz 37 -2.416846865439478 35 rz 31 -2.888671239442818 35 rz 39 1.632888879396116 35 rz 33 3.025023076768516 35 rz 41 3.020215846469039 35 rz 35 -2.6006938927354746 35 rz 43 2.7929445197322487 35 rz 38 -3.086706593322443 35 rz 44 3.061351007670467 35 rz 40 2.817580175769489 35 rz 46 -2.820494227745016 35 rz 42 1.6348666707488422 35 rz 48 -2.5181191249284076 35 rz 45 0.8109440955542802 35 rz 49 -0.9427991620192806 35 rz 47 -2.1901472267864186 35 rz 51 2.169255678898626 35 rz 50 1.952389741989869 35 rz 52 -3.0793768832191333 36 x_1_2 0 36 y_1_2 1 36 x_1_2 2 36 x_1_2 3 36 y_1_2 4 36 y_1_2 5 36 x_1_2 6 36 x_1_2 7 36 y_1_2 8 36 hz_1_2 9 36 y_1_2 10 36 hz_1_2 11 36 y_1_2 12 36 y_1_2 13 36 y_1_2 14 36 x_1_2 15 36 hz_1_2 16 36 x_1_2 17 36 hz_1_2 18 36 hz_1_2 19 36 hz_1_2 20 36 x_1_2 21 36 y_1_2 22 36 y_1_2 23 36 x_1_2 24 36 y_1_2 25 36 y_1_2 26 36 x_1_2 27 36 y_1_2 28 36 y_1_2 29 36 hz_1_2 30 36 x_1_2 31 36 hz_1_2 32 36 y_1_2 33 36 hz_1_2 34 36 x_1_2 35 36 y_1_2 36 36 hz_1_2 37 36 hz_1_2 38 36 x_1_2 39 36 hz_1_2 40 36 x_1_2 41 36 hz_1_2 42 36 hz_1_2 43 36 x_1_2 44 36 hz_1_2 45 36 x_1_2 46 36 y_1_2 47 36 y_1_2 48 36 y_1_2 49 36 hz_1_2 50 36 y_1_2 51 36 y_1_2 52 37 rz 0 -1.8088774970333825 37 rz 3 2.592893566633105 37 rz 2 -1.7738773845251252 37 rz 6 1.7771159891828854 37 rz 4 0.31638149496535917 37 rz 8 -0.31546211290315895 37 rz 7 -0.4082915673873906 37 rz 14 1.7656645797592283 37 rz 9 0.49111408754728103 37 rz 16 0.11066821428628514 37 rz 11 -1.9755700906626519 37 rz 20 2.2289604157707377 37 rz 13 -2.299949078833812 37 rz 22 2.2007551635223663 37 rz 15 0.4224058022728556 37 rz 24 -0.2857600069042263 37 rz 17 1.796025521181612 37 rz 26 -1.7392428694876187 37 rz 19 2.9895660310863335 37 rz 29 -3.0059824894292078 37 rz 21 -0.8570128310196984 37 rz 31 -0.6174187578081209 37 rz 23 -1.2369529855218069 37 rz 33 1.559921996910436 37 rz 25 0.748443525811151 37 rz 35 -0.8488867011639661 37 rz 30 2.8443477896052194 37 rz 38 -2.840025593080231 37 rz 32 2.506628160600304 37 rz 40 -2.4816685440791524 37 rz 34 -3.029026074500134 37 rz 42 -2.8072666064877687 37 rz 39 1.3671062880613754 37 rz 45 -1.45197290410184 37 rz 41 1.34581908945054 37 rz 47 -1.484993646379781 37 rz 46 2.502414839453639 37 rz 50 -2.406575370460242 38 fs 0 3 1.5192859850645715 0.49387245572956845 38 fs 2 6 1.5120572609259932 0.5211713721957417 38 fs 4 8 1.615096254724942 0.7269644142795206 38 fs 7 14 1.5269188098932545 0.5036266469194081 38 fs 9 16 1.5179602369002039 0.4914328237769214 38 fs 11 20 1.537427483096926 0.45115204759967975 38 fs 13 22 1.53486366638317 0.46559889697604934 38 fs 15 24 1.5194586006330344 0.5068560732280918 38 fs 17 26 1.5819908111894527 0.5595875596558442 38 fs 19 29 1.5070579127771144 0.4520319437379419 38 fs 21 31 1.527311970249325 0.4920204543143157 38 fs 23 33 1.5139592614725292 0.45916943035876673 38 fs 25 35 1.5425204049671604 0.5057437054391503 38 fs 30 38 1.5432564804093452 0.5658780292653538 38 fs 32 40 1.4611081680611278 0.5435451345370095 38 fs 34 42 1.4529959991143482 0.43830813863531964 38 fs 39 45 1.6239619425876082 0.4985036227887135 38 fs 41 47 1.4884560669186362 0.4964777432807688 38 fs 46 50 1.5034760541420213 0.5004774067921798 39 rz 0 2.358318684972655 39 rz 3 -1.5743026153729325 39 rz 2 1.188762503564874 39 rz 6 -1.185523898907114 39 rz 4 -2.8096221072716325 39 rz 8 2.8105414893338363 39 rz 7 2.977707776758546 39 rz 14 -1.6203347643867119 39 rz 9 -0.015993751748652585 39 rz 16 0.6177760535822188 39 rz 11 2.5129067028686247 39 rz 20 -2.259516377760539 39 rz 13 2.977564738025727 39 rz 22 -3.0767586533371727 39 rz 15 -1.130808978976603 39 rz 24 1.2674547743452322 39 rz 17 1.6917735804355942 39 rz 26 -1.6349909287416011 39 rz 19 3.0010886283900007 39 rz 29 -3.017505086732875 39 rz 21 0.0018639501580004494 39 rz 31 -1.4762955389858199 39 rz 23 -2.6381700642088397 39 rz 33 2.961139075597469 39 rz 25 0.5397148110739458 39 rz 35 -0.640157986426761 39 rz 30 1.5560584843800136 39 rz 38 -1.5517362878550252 39 rz 32 -2.697818648828626 39 rz 40 2.7227782653497776 39 rz 34 1.634943831603021 39 rz 42 -1.1880512054113375 39 rz 39 2.966061463434219 39 rz 45 -3.0509280794746836 39 rz 41 -1.536733393174007 39 rz 47 1.397558836244766 39 rz 46 2.6334475314008863 39 rz 50 -2.5376080624074895 40 hz_1_2 0 40 x_1_2 1 40 hz_1_2 2 40 hz_1_2 3 40 x_1_2 4 40 x_1_2 5 40 hz_1_2 6 40 hz_1_2 7 40 x_1_2 8 40 y_1_2 9 40 x_1_2 10 40 x_1_2 11 40 hz_1_2 12 40 x_1_2 13 40 x_1_2 14 40 hz_1_2 15 40 x_1_2 16 40 hz_1_2 17 40 x_1_2 18 40 x_1_2 19 40 x_1_2 20 40 hz_1_2 21 40 x_1_2 22 40 x_1_2 23 40 hz_1_2 24 40 hz_1_2 25 40 x_1_2 26 40 hz_1_2 27 40 x_1_2 28 40 x_1_2 29 40 y_1_2 30 40 y_1_2 31 40 y_1_2 32 40 x_1_2 33 40 x_1_2 34 40 y_1_2 35 40 x_1_2 36 40 y_1_2 37 40 y_1_2 38 40 hz_1_2 39 40 y_1_2 40 40 y_1_2 41 40 x_1_2 42 40 y_1_2 43 40 hz_1_2 44 40 y_1_2 45 40 hz_1_2 46 40 x_1_2 47 40 hz_1_2 48 40 x_1_2 49 40 x_1_2 50 40 hz_1_2 51 40 x_1_2 52 41 rz 0 1.850003858453061 41 rz 1 -0.7107225701804545 41 rz 2 2.134557964044429 41 rz 3 -2.119533363582022 41 rz 4 1.4319315387400522 41 rz 5 -1.3097300602445756 41 rz 7 0.31591200692573906 41 rz 8 -1.7839239546611234 41 rz 9 -1.9485591472950894 41 rz 10 1.1878650827090773 41 rz 11 -3.004693565159407 41 rz 12 -2.6153867839346248 41 rz 13 1.3077184824862194 41 rz 14 -1.1695444232610193 41 rz 15 1.4375162657774823 41 rz 16 -1.3487411609649556 41 rz 17 -1.1461202202710616 41 rz 18 0.2107022388839255 41 rz 19 0.5835864216556317 41 rz 20 -0.5688077596530547 41 rz 21 2.324977808361087 41 rz 22 3.0609483244035083 41 rz 23 0.8066487368972908 41 rz 24 -1.7652909291407148 41 rz 25 -1.2232765811896336 41 rz 26 1.071819532276014 41 rz 28 0.4118631559345083 41 rz 29 0.30310770889709815 41 rz 30 -0.8482316422696741 41 rz 31 0.6001909450135585 41 rz 32 0.021967029922279835 41 rz 33 -0.08345195101944825 41 rz 34 -1.844922560746477 41 rz 35 2.5019565706559277 41 rz 37 -1.368074682944762 41 rz 38 1.387214625091321 41 rz 39 -1.8133373803695463 41 rz 40 1.7751017120191366 41 rz 41 2.0189411274179783 41 rz 42 -1.7633571958279857 41 rz 44 -2.6963026751157138 41 rz 45 2.6318679683999484 41 rz 46 -2.737037695209419 41 rz 47 2.5364626971294175 41 rz 49 -2.6381413699127005 41 rz 50 2.9236603097992138 42 fs 0 1 1.5508555127616375 0.48773645023966805 42 fs 2 3 1.4860895179182787 0.49800223593597315 42 fs 4 5 1.5268891182960795 0.5146971591948788 42 fs 7 8 1.5004518396933153 0.541239891546859 42 fs 9 10 1.5996085979256793 0.5279139399675195 42 fs 11 12 1.5354845176224254 0.41898979144044296 42 fs 13 14 1.545842827888829 0.533679342490625 42 fs 15 16 1.5651524165810975 0.5296573901163858 42 fs 17 18 1.6240366191418867 0.48516108212176406 42 fs 19 20 1.6022614099028112 0.5001380228896306 42 fs 21 22 1.574931196238987 0.5236666378689078 42 fs 23 24 1.5238301684218176 0.47521120348925566 42 fs 25 26 1.5426970250652188 0.5200449092580564 42 fs 28 29 1.4235475054732074 0.5253841271266504 42 fs 30 31 1.511471063363894 0.4578807555552488 42 fs 32 33 1.5371762819242982 0.5674318212304278 42 fs 34 35 1.510414477168897 0.44988262527024675 42 fs 37 38 1.498535212903308 0.637164678333888 42 fs 39 40 1.507377591132129 0.47869828403704195 42 fs 41 42 1.48836082148729 0.46458301209227065 42 fs 44 45 1.5400981673597602 0.5128416009465753 42 fs 46 47 1.5860873970424136 0.4790438939428006 42 fs 49 50 1.5630547528566316 0.48589356877723594 43 rz 0 -1.175832184328872 43 rz 1 2.315113472601478 43 rz 2 -2.198915792221939 43 rz 3 2.2139403926843464 43 rz 4 -1.823123087612224 43 rz 5 1.9453245661077003 43 rz 7 -0.2465958308897207 43 rz 8 -1.2214161168456634 43 rz 9 -0.43548895112376945 43 rz 10 -0.3252051134622427 43 rz 11 2.370301916283708 43 rz 12 -1.7071969581981534 43 rz 13 2.829656440364136 43 rz 14 -2.691482381138936 43 rz 15 0.4832481517545731 43 rz 16 -0.39447304694204627 43 rz 17 1.6799789504655074 43 rz 18 -2.615396931852647 43 rz 19 1.2309809028641965 43 rz 20 -1.2162022408616195 43 rz 21 0.9221189311418634 43 rz 22 -1.8193781055568543 43 rz 23 -1.4641993840120442 43 rz 24 0.5055571917686201 43 rz 25 1.575341936908349 43 rz 26 -1.7267989858219677 43 rz 28 -0.9610021292421642 43 rz 29 1.6759729940737709 43 rz 30 -0.9902415695322873 43 rz 31 0.7422008722761717 43 rz 32 -0.08288640057689278 43 rz 33 0.021401479479724372 43 rz 34 0.5719643563762968 43 rz 35 0.08506965353315366 43 rz 37 0.6901613353481402 43 rz 38 -0.6710213932015812 43 rz 39 2.5760975022365002 43 rz 40 -2.61433317058691 43 rz 41 -1.8279445473915281 43 rz 42 2.0835284789815205 43 rz 44 -0.9227375809289775 43 rz 45 0.8583028742132122 43 rz 46 1.827108145109003 43 rz 47 -2.027683143189005 43 rz 49 -1.672215381427728 43 rz 50 1.9577343213142395 44 x_1_2 0 44 y_1_2 1 44 y_1_2 2 44 x_1_2 3 44 y_1_2 4 44 y_1_2 5 44 y_1_2 6 44 x_1_2 7 44 hz_1_2 8 44 hz_1_2 9 44 hz_1_2 10 44 hz_1_2 11 44 y_1_2 12 44 y_1_2 13 44 y_1_2 14 44 y_1_2 15 44 y_1_2 16 44 x_1_2 17 44 y_1_2 18 44 hz_1_2 19 44 hz_1_2 20 44 x_1_2 21 44 y_1_2 22 44 hz_1_2 23 44 y_1_2 24 44 x_1_2 25 44 y_1_2 26 44 x_1_2 27 44 hz_1_2 28 44 hz_1_2 29 44 x_1_2 30 44 x_1_2 31 44 hz_1_2 32 44 y_1_2 33 44 y_1_2 34 44 hz_1_2 35 44 y_1_2 36 44 x_1_2 37 44 x_1_2 38 44 x_1_2 39 44 hz_1_2 40 44 hz_1_2 41 44 hz_1_2 42 44 x_1_2 43 44 x_1_2 44 44 x_1_2 45 44 y_1_2 46 44 hz_1_2 47 44 x_1_2 48 44 hz_1_2 49 44 y_1_2 50 44 y_1_2 51 44 y_1_2 52 45 rz 3 -2.846752003288273 45 rz 4 2.9271872567687858 45 rz 6 -1.9274452862449074 45 rz 7 0.3594239980339573 45 rz 8 -2.6737056844081373 45 rz 9 -2.96083552099996 45 rz 12 2.5016072910464295 45 rz 13 -2.3329585473152683 45 rz 14 0.23586626426525825 45 rz 15 -0.2726849054253613 45 rz 16 -2.0872687540880186 45 rz 17 2.0727766545292035 45 rz 20 -0.7890381076775341 45 rz 21 0.01863923975501791 45 rz 22 -0.8780118604379972 45 rz 23 0.7239431641976743 45 rz 24 -1.360512357444044 45 rz 25 1.2107863360752447 45 rz 26 -0.94272066366484 45 rz 27 1.0939921192915456 45 rz 29 -2.2228355306385765 45 rz 30 2.253447809969142 45 rz 31 0.5143884629440869 45 rz 32 -0.47393570500960536 45 rz 33 -2.087579216408482 45 rz 34 2.353626763570965 45 rz 35 0.033233031424060755 45 rz 36 0.296235281520822 45 rz 38 2.8024301648432832 45 rz 39 3.063719064625161 45 rz 40 0.9597248801147771 45 rz 41 -0.9994061403925496 45 rz 42 0.03408728670342143 45 rz 43 0.5324955045325588 45 rz 45 -0.1703366129073025 45 rz 46 0.1929584951591501 45 rz 47 1.0326678564373317 45 rz 48 -2.3717756485074624 45 rz 50 3.0522569945183093 45 rz 51 2.800821802774845 46 fs 3 4 1.483304234663135 0.4930986258758784 46 fs 6 7 1.5160176987076064 0.49850252902921577 46 fs 8 9 1.5338611249160479 0.5011308712767845 46 fs 12 13 1.480179689158691 0.4772322221553844 46 fs 14 15 1.5152260103068818 0.49796235787029736 46 fs 16 17 1.5284924549164072 0.5160847019657471 46 fs 20 21 1.58661284381037 0.475779832809368 46 fs 22 23 1.5333295850816209 0.44983388105304506 46 fs 24 25 1.5158107733607835 0.4663776718737318 46 fs 26 27 1.5645151084457722 0.47497942677256283 46 fs 29 30 1.5659881784786247 0.5656290235103623 46 fs 31 32 1.5211879663086973 0.5056110683638391 46 fs 33 34 1.5083349422212171 0.49641600818144604 46 fs 35 36 1.5087002777200382 0.44025777694304247 46 fs 38 39 1.5658333118222365 0.47264531483343447 46 fs 40 41 1.5219378850865568 0.5335829954491795 46 fs 42 43 1.5501487671051402 0.4404117539373896 46 fs 45 46 1.4825325148661492 0.6857341218223484 46 fs 47 48 1.4941963673904604 0.45895108234543025 46 fs 50 51 1.5487430259667763 0.4467898473637848 47 rz 3 2.514066288876574 47 rz 4 -2.4336310353960613 47 rz 6 -0.5324249710277407 47 rz 7 -1.0355963171832094 47 rz 8 1.915123778131061 47 rz 9 -1.266479676359572 47 rz 12 -2.247285483352666 47 rz 13 2.4159342270838273 47 rz 14 0.6575294970558225 47 rz 15 -0.6943481382159256 47 rz 16 2.0820576598306495 47 rz 17 -2.0965497593894646 47 rz 20 2.85490324093378 47 rz 21 2.6578831983232902 47 rz 22 -1.011294341633775 47 rz 23 0.8572256453934523 47 rz 24 2.6576143266414363 47 rz 25 -2.8073403480102357 47 rz 26 -0.15023573842493576 47 rz 27 0.3015071940516414 47 rz 29 2.3046797746528362 47 rz 30 -2.274067495322271 47 rz 31 -1.5488524138114137 47 rz 32 1.5893051717458953 47 rz 33 2.2867726872270815 47 rz 34 -2.0207251400645987 47 rz 35 0.03099481725460862 47 rz 36 0.29847349569027415 47 rz 38 2.2591836207174545 47 rz 39 -2.676219698428593 47 rz 40 0.6646378653250249 47 rz 41 -0.7043191256027974 47 rz 42 -1.5148966593048918 47 rz 43 2.081479450540872 47 rz 45 0.9978962235612805 47 rz 46 -0.9752743413094329 47 rz 47 -0.4075787788398024 47 rz 48 -0.9315290132303282 47 rz 50 -3.0851978326526712 47 rz 51 2.655091322766239 48 hz_1_2 0 48 x_1_2 1 48 hz_1_2 2 48 hz_1_2 3 48 hz_1_2 4 48 hz_1_2 5 48 hz_1_2 6 48 y_1_2 7 48 x_1_2 8 48 y_1_2 9 48 x_1_2 10 48 x_1_2 11 48 x_1_2 12 48 x_1_2 13 48 hz_1_2 14 48 x_1_2 15 48 x_1_2 16 48 y_1_2 17 48 hz_1_2 18 48 y_1_2 19 48 y_1_2 20 48 hz_1_2 21 48 x_1_2 22 48 x_1_2 23 48 x_1_2 24 48 hz_1_2 25 48 x_1_2 26 48 y_1_2 27 48 y_1_2 28 48 x_1_2 29 48 y_1_2 30 48 y_1_2 31 48 y_1_2 32 48 hz_1_2 33 48 x_1_2 34 48 y_1_2 35 48 hz_1_2 36 48 hz_1_2 37 48 y_1_2 38 48 y_1_2 39 48 y_1_2 40 48 x_1_2 41 48 x_1_2 42 48 y_1_2 43 48 y_1_2 44 48 y_1_2 45 48 hz_1_2 46 48 x_1_2 47 48 y_1_2 48 48 y_1_2 49 48 hz_1_2 50 48 x_1_2 51 48 x_1_2 52 ================================================ FILE: examples/circuit_n53_m20_s0_e0_pABCDCDAB.qsim ================================================ 53 0 hz_1_2 0 0 x_1_2 1 0 x_1_2 2 0 hz_1_2 3 0 y_1_2 4 0 hz_1_2 5 0 hz_1_2 6 0 hz_1_2 7 0 hz_1_2 8 0 x_1_2 9 0 y_1_2 10 0 hz_1_2 11 0 hz_1_2 12 0 hz_1_2 13 0 hz_1_2 14 0 y_1_2 15 0 x_1_2 16 0 x_1_2 17 0 hz_1_2 18 0 x_1_2 19 0 x_1_2 20 0 hz_1_2 21 0 y_1_2 22 0 x_1_2 23 0 x_1_2 24 0 y_1_2 25 0 hz_1_2 26 0 x_1_2 27 0 hz_1_2 28 0 hz_1_2 29 0 x_1_2 30 0 x_1_2 31 0 x_1_2 32 0 y_1_2 33 0 hz_1_2 34 0 y_1_2 35 0 hz_1_2 36 0 hz_1_2 37 0 hz_1_2 38 0 y_1_2 39 0 hz_1_2 40 0 x_1_2 41 0 x_1_2 42 0 x_1_2 43 0 hz_1_2 44 0 y_1_2 45 0 x_1_2 46 0 hz_1_2 47 0 y_1_2 48 0 y_1_2 49 0 y_1_2 50 0 hz_1_2 51 0 x_1_2 52 1 rz 1 2.4326562950300605 1 rz 4 -2.225882728378087 1 rz 3 -2.7293249642087485 1 rz 7 1.210696502097985 1 rz 5 -1.106519059371497 1 rz 9 1.7892230375389613 1 rz 6 0.2119958279956058 1 rz 13 -0.11128338095950507 1 rz 8 2.8937947545666063 1 rz 15 -2.9549982284793814 1 rz 10 1.2842227411644753 1 rz 17 -1.1227354153032945 1 rz 12 1.3465899378642412 1 rz 21 -1.781829442911482 1 rz 14 2.1872907310716982 1 rz 23 -1.9614019632142368 1 rz 16 1.5928715721087023 1 rz 25 -1.5401880072083034 1 rz 18 -2.5911695330397535 1 rz 27 2.612251899130335 1 rz 20 2.404798154102042 1 rz 30 -2.3947316562728576 1 rz 22 -2.365932000948667 1 rz 32 2.2191901639168874 1 rz 24 -2.4350373161309906 1 rz 34 3.0221985839799075 1 rz 26 -2.610806420739799 1 rz 36 2.560219630921752 1 rz 29 1.785834483295006 1 rz 37 -1.7147844803365624 1 rz 31 1.4590820918158975 1 rz 39 -2.7148644518625993 1 rz 33 1.0568019349008715 1 rz 41 -1.294748318842905 1 rz 35 2.7682990982443236 1 rz 43 -2.576048471247548 1 rz 38 -1.6256583901850972 1 rz 44 1.6003028045331185 1 rz 40 -0.8433460214812949 1 rz 46 0.8404319695057677 1 rz 42 2.4767110913272044 1 rz 48 2.92322176167281 1 rz 45 1.718893981077632 1 rz 49 -1.8507490475426254 1 rz 47 2.3200371653684186 1 rz 51 -2.340928713256203 1 rz 50 -0.5750038022730992 1 rz 52 -0.5519833389561652 2 fs 1 4 1.5157741664069029 0.5567125777723744 2 fs 3 7 1.5177580142209797 0.4948108578225166 2 fs 5 9 1.6036738621219824 0.47689957001758815 2 fs 6 13 1.5177327089642791 0.5058312223892585 2 fs 8 15 1.5253184444076096 0.46557175536519374 2 fs 10 17 1.6141004604574274 0.494343440675308 2 fs 12 21 1.5476810407275208 0.44290174465702487 2 fs 14 23 1.5237261387830179 0.4696616122846161 2 fs 16 25 1.5285844942020295 0.5736654641906893 2 fs 18 27 1.5483159975149505 0.4961408893973623 2 fs 20 30 1.6377079485605028 0.6888985951517526 2 fs 22 32 1.529949914236052 0.48258847574702635 2 fs 24 34 1.5280421758407217 0.5109767145462891 2 fs 26 36 1.5120782868771674 0.4815152809861558 2 fs 29 37 1.5071938854285831 0.5089276063739265 2 fs 31 39 1.5460100224551203 0.5302403303961576 2 fs 33 41 1.5166625940397171 0.4517159790427676 2 fs 35 43 1.4597689731864314 0.4214985958536156 2 fs 38 44 1.535649445690472 0.47076284376181704 2 fs 40 46 1.5179778495708582 0.5221350266177334 2 fs 42 48 1.4969321270213238 0.4326117171327162 2 fs 45 49 1.5114987201637704 0.4914319343687703 2 fs 47 51 1.4908807480930255 0.4886243720131578 2 fs 50 52 1.616256999726831 0.501428936283957 3 rz 1 -2.3932854391951004 3 rz 4 2.600059005847074 3 rz 3 2.1293419565556686 3 rz 7 2.635214888513154 3 rz 5 1.0969000068096602 3 rz 9 -0.4141960286421961 3 rz 6 1.448470803234792 3 rz 13 -1.3477583561986914 3 rz 8 2.08664533842437 3 rz 15 -2.147848812337145 3 rz 10 0.08243681179982776 3 rz 17 0.07905051406135266 3 rz 12 2.8499779533489917 3 rz 21 2.997967848783354 3 rz 14 -1.4497132543865328 3 rz 23 1.6756020222439947 3 rz 16 1.6110403638230537 3 rz 25 -1.5583567989226532 3 rz 18 1.831437049428291 3 rz 27 -1.8103546833377073 3 rz 20 0.0716641316809925 3 rz 30 -0.06159763385180828 3 rz 22 2.6775858065265927 3 rz 32 -2.824327643558372 3 rz 24 2.9382895697303493 3 rz 34 -2.3511283018814324 3 rz 26 -2.896580447572063 3 rz 36 2.8459936577540166 3 rz 29 2.2114367148817493 3 rz 37 -2.1403867119233055 3 rz 31 2.1881424887585386 3 rz 39 2.839260458374346 3 rz 33 -1.4234721207147139 3 rz 41 1.1855257367726804 3 rz 35 1.320013738944822 3 rz 43 -1.1277631119480453 3 rz 38 2.995416784026747 3 rz 44 -3.020772369678725 3 rz 40 1.686606820477035 3 rz 46 -1.6895208724525625 3 rz 42 1.609733929520253 3 rz 48 -2.492986383699826 3 rz 45 -2.481445005407897 3 rz 49 2.349589938942904 3 rz 47 -2.6928020513607422 3 rz 51 2.671910503472958 3 rz 50 2.857168426223337 3 rz 52 2.2990297397269845 4 y_1_2 0 4 y_1_2 1 4 y_1_2 2 4 x_1_2 3 4 x_1_2 4 4 x_1_2 5 4 x_1_2 6 4 x_1_2 7 4 y_1_2 8 4 hz_1_2 9 4 x_1_2 10 4 x_1_2 11 4 y_1_2 12 4 x_1_2 13 4 y_1_2 14 4 hz_1_2 15 4 hz_1_2 16 4 y_1_2 17 4 y_1_2 18 4 hz_1_2 19 4 y_1_2 20 4 y_1_2 21 4 hz_1_2 22 4 y_1_2 23 4 y_1_2 24 4 hz_1_2 25 4 x_1_2 26 4 hz_1_2 27 4 y_1_2 28 4 y_1_2 29 4 y_1_2 30 4 y_1_2 31 4 hz_1_2 32 4 hz_1_2 33 4 y_1_2 34 4 x_1_2 35 4 x_1_2 36 4 x_1_2 37 4 y_1_2 38 4 x_1_2 39 4 y_1_2 40 4 hz_1_2 41 4 hz_1_2 42 4 y_1_2 43 4 y_1_2 44 4 x_1_2 45 4 hz_1_2 46 4 y_1_2 47 4 x_1_2 48 4 x_1_2 49 4 x_1_2 50 4 y_1_2 51 4 hz_1_2 52 5 rz 0 0.2268745424925527 5 rz 3 0.5571415271071771 5 rz 2 -2.2513994678708658 5 rz 6 2.2546380725286257 5 rz 4 -0.41246800066795863 5 rz 8 0.4133873827301695 5 rz 7 2.3563099677710264 5 rz 14 -0.9989369553991843 5 rz 9 -2.7510095309577114 5 rz 16 -2.930393474388311 5 rz 11 2.2215976945329947 5 rz 20 -1.9682073694249083 5 rz 13 2.6009354607665633 5 rz 22 -2.7001293760780083 5 rz 15 2.5335560654853895 5 rz 24 -2.39691027011676 5 rz 17 -0.7423813429186499 5 rz 26 0.7991639946126413 5 rz 19 2.0345218643948497 5 rz 29 -2.050938322737726 5 rz 21 -0.6559509011901303 5 rz 31 -0.8184806876376881 5 rz 23 -2.4433245645000508 5 rz 33 2.7662935758886693 5 rz 25 -1.6140341496881252 5 rz 35 1.5135909743353206 5 rz 30 2.4170911887166646 5 rz 38 -2.412768992191676 5 rz 32 0.44574337984494505 5 rz 40 -0.42078376332380696 5 rz 34 -3.0038933332707183 5 rz 42 -2.8323993477171854 5 rz 39 -0.9953713874379053 5 rz 45 0.910504771397445 5 rz 41 -1.0166585860487407 5 rz 47 0.8774840291195077 5 rz 46 2.7788749929698184 5 rz 50 -2.683035523976411 6 fs 0 3 1.5192859850645715 0.49387245572956845 6 fs 2 6 1.5120572609259932 0.5211713721957417 6 fs 4 8 1.615096254724942 0.7269644142795206 6 fs 7 14 1.5269188098932545 0.5036266469194081 6 fs 9 16 1.5179602369002039 0.4914328237769214 6 fs 11 20 1.537427483096926 0.45115204759967975 6 fs 13 22 1.53486366638317 0.46559889697604934 6 fs 15 24 1.5194586006330344 0.5068560732280918 6 fs 17 26 1.5819908111894527 0.5595875596558442 6 fs 19 29 1.5070579127771144 0.4520319437379419 6 fs 21 31 1.527311970249325 0.4920204543143157 6 fs 23 33 1.5139592614725292 0.45916943035876673 6 fs 25 35 1.5425204049671604 0.5057437054391503 6 fs 30 38 1.5432564804093452 0.5658780292653538 6 fs 32 40 1.4611081680611278 0.5435451345370095 6 fs 34 42 1.4529959991143482 0.43830813863531964 6 fs 39 45 1.6239619425876082 0.4985036227887135 6 fs 41 47 1.4884560669186362 0.4964777432807688 6 fs 46 50 1.5034760541420213 0.5004774067921798 7 rz 0 0.32256664544673086 7 rz 3 0.461449424152999 7 rz 2 1.6662845869106162 7 rz 6 -1.6630459822528558 7 rz 4 -2.0807726116383005 7 rz 8 2.0816919937005114 7 rz 7 0.21310624160012637 7 rz 14 1.1442667707717158 7 rz 9 -3.057055440423247 7 rz 16 -2.6243475649227754 7 rz 11 -1.6842610823270208 7 rz 20 1.9376514074351068 7 rz 13 -1.9233198015746487 7 rz 22 1.8241258862632037 7 rz 15 3.0412260649904477 7 rz 24 -2.9045802696218184 7 rz 17 -2.053004862643731 7 rz 26 2.1097875143377225 7 rz 19 -2.3270525120981063 7 rz 29 2.31063605375523 7 rz 21 -0.19919797967155972 7 rz 31 -1.2752336091562588 7 rz 23 -1.43179848523061 7 rz 33 1.7547674966192288 7 rz 25 2.902192486573229 7 rz 35 -3.0026356619260337 7 rz 30 1.9833150852685666 7 rz 38 -1.9789928887435797 7 rz 32 -0.6369338680732861 7 rz 40 0.661893484594426 7 rz 34 1.6098110903736034 7 rz 42 -1.1629184641819208 7 rz 39 -0.9546461682460753 7 rz 45 0.869779552205615 7 rz 41 0.825744282325278 7 rz 47 -0.9649188392545094 7 rz 46 2.356987377884714 7 rz 50 -2.2611479088913065 8 x_1_2 0 8 x_1_2 1 8 x_1_2 2 8 hz_1_2 3 8 hz_1_2 4 8 y_1_2 5 8 hz_1_2 6 8 hz_1_2 7 8 x_1_2 8 8 y_1_2 9 8 y_1_2 10 8 y_1_2 11 8 x_1_2 12 8 y_1_2 13 8 x_1_2 14 8 y_1_2 15 8 y_1_2 16 8 x_1_2 17 8 x_1_2 18 8 y_1_2 19 8 hz_1_2 20 8 x_1_2 21 8 x_1_2 22 8 x_1_2 23 8 hz_1_2 24 8 y_1_2 25 8 y_1_2 26 8 y_1_2 27 8 hz_1_2 28 8 hz_1_2 29 8 x_1_2 30 8 x_1_2 31 8 x_1_2 32 8 x_1_2 33 8 x_1_2 34 8 hz_1_2 35 8 hz_1_2 36 8 y_1_2 37 8 hz_1_2 38 8 y_1_2 39 8 hz_1_2 40 8 x_1_2 41 8 x_1_2 42 8 hz_1_2 43 8 x_1_2 44 8 hz_1_2 45 8 y_1_2 46 8 x_1_2 47 8 hz_1_2 48 8 hz_1_2 49 8 hz_1_2 50 8 x_1_2 51 8 y_1_2 52 9 rz 0 2.7296498014579313 9 rz 1 -1.590368513185332 9 rz 2 2.159690705273027 9 rz 3 -2.144666104810616 9 rz 4 1.1806041264524705 9 rz 5 -1.058402647956994 9 rz 7 1.622814550818351 9 rz 8 -3.090826498553735 9 rz 9 2.0475467080709855 9 rz 10 -2.808240772656996 9 rz 11 0.0363681235151887 9 rz 12 0.6267368345703623 9 rz 13 -1.683077723731188 9 rz 14 1.821251782956388 9 rz 15 1.889905607894633 9 rz 16 -1.8011305030821063 9 rz 17 1.191224713999632 9 rz 18 -2.126642695386768 9 rz 19 1.9658871892348433 9 rz 20 -1.9511085272322664 9 rz 21 -1.4198006347182375 9 rz 22 0.5225414603032448 9 rz 23 -2.7119350351230427 9 rz 24 1.7532928428796295 9 rz 25 2.270174449602111 9 rz 26 -2.421631498515731 9 rz 28 -1.9757472607933801 9 rz 29 2.690718125624965 9 rz 30 -1.5268156554449863 9 rz 31 1.2787749581888708 9 rz 32 2.3593119641929743 9 rz 33 -2.420796885290144 9 rz 34 1.6485284700460934 9 rz 35 -0.9914944601366429 9 rz 37 1.3965268522136594 9 rz 38 -1.3773869100671003 9 rz 39 0.7250694837307181 9 rz 40 -0.7633051520811271 9 rz 41 -2.1782266577776674 9 rz 42 2.43381058936766 9 rz 44 1.9783871934256716 9 rz 45 -2.0428219001414405 9 rz 46 2.616236186508104 9 rz 47 -2.816811184588105 9 rz 49 0.3777875775333017 9 rz 50 -0.09226863764678939 10 fs 0 1 1.5508555127616375 0.48773645023966805 10 fs 2 3 1.4860895179182787 0.49800223593597315 10 fs 4 5 1.5268891182960795 0.5146971591948788 10 fs 7 8 1.5004518396933153 0.541239891546859 10 fs 9 10 1.5996085979256793 0.5279139399675195 10 fs 11 12 1.5354845176224254 0.41898979144044296 10 fs 13 14 1.545842827888829 0.533679342490625 10 fs 15 16 1.5651524165810975 0.5296573901163858 10 fs 17 18 1.6240366191418867 0.48516108212176406 10 fs 19 20 1.6022614099028112 0.5001380228896306 10 fs 21 22 1.574931196238987 0.5236666378689078 10 fs 23 24 1.5238301684218176 0.47521120348925566 10 fs 25 26 1.5426970250652188 0.5200449092580564 10 fs 28 29 1.4235475054732074 0.5253841271266504 10 fs 30 31 1.511471063363894 0.4578807555552488 10 fs 32 33 1.5371762819242982 0.5674318212304278 10 fs 34 35 1.510414477168897 0.44988262527024675 10 fs 37 38 1.498535212903308 0.637164678333888 10 fs 39 40 1.507377591132129 0.47869828403704195 10 fs 41 42 1.48836082148729 0.46458301209227065 10 fs 44 45 1.5400981673597602 0.5128416009465753 10 fs 46 47 1.5860873970424136 0.4790438939428006 10 fs 49 50 1.5630547528566316 0.48589356877723594 11 rz 0 -2.055478127333757 11 rz 1 -3.088425891573232 11 rz 2 -2.224048533450526 11 rz 3 2.239073133912937 11 rz 4 -1.5717956753246403 11 rz 5 1.693997153820117 11 rz 7 -1.5534983747823254 11 rz 8 0.08548642704694132 11 rz 9 1.851590500689747 11 rz 10 -2.612284565275756 11 rz 11 -0.6707597723908929 11 rz 12 1.333864730476444 11 rz 13 -0.4627326605980393 11 rz 14 0.6009067198232394 11 rz 15 0.030858809637424045 11 rz 16 0.05791629517510266 11 rz 17 -0.6573659838051862 11 rz 18 -0.27805199758195087 11 rz 19 -0.15131986471501513 11 rz 20 0.16609852671759207 11 rz 21 -1.616287932958402 11 rz 22 0.7190287585434092 11 rz 23 2.0543843880082964 11 rz 24 -3.0130265802517098 11 rz 25 -1.918109093883396 11 rz 26 1.7666520449697758 11 rz 28 1.4266082874857098 11 rz 29 -0.7116374226541247 11 rz 30 -0.31165755635697856 11 rz 31 0.06361685910086301 11 rz 32 -2.420231334847587 11 rz 33 2.358746413750417 11 rz 34 -2.9214866744162733 11 rz 35 -2.7046646228538638 11 rz 37 -2.074440199810285 11 rz 38 2.093580141956844 11 rz 39 0.03769063813623674 11 rz 40 -0.075926306486644 11 rz 41 2.3692232378041176 11 rz 42 -2.113639306214125 11 rz 44 0.6857578577092225 11 rz 45 -0.7501925644249887 11 rz 46 2.7570195705710665 11 rz 47 -2.957594568651068 11 rz 49 1.5950409783058557 11 rz 50 -1.309522038419343 12 hz_1_2 0 12 hz_1_2 1 12 y_1_2 2 12 x_1_2 3 12 x_1_2 4 12 x_1_2 5 12 y_1_2 6 12 x_1_2 7 12 y_1_2 8 12 x_1_2 9 12 hz_1_2 10 12 hz_1_2 11 12 hz_1_2 12 12 hz_1_2 13 12 hz_1_2 14 12 hz_1_2 15 12 hz_1_2 16 12 y_1_2 17 12 y_1_2 18 12 hz_1_2 19 12 y_1_2 20 12 hz_1_2 21 12 hz_1_2 22 12 y_1_2 23 12 y_1_2 24 12 x_1_2 25 12 x_1_2 26 12 x_1_2 27 12 y_1_2 28 12 x_1_2 29 12 hz_1_2 30 12 hz_1_2 31 12 hz_1_2 32 12 y_1_2 33 12 hz_1_2 34 12 x_1_2 35 12 x_1_2 36 12 x_1_2 37 12 x_1_2 38 12 hz_1_2 39 12 x_1_2 40 12 hz_1_2 41 12 hz_1_2 42 12 y_1_2 43 12 hz_1_2 44 12 y_1_2 45 12 x_1_2 46 12 hz_1_2 47 12 y_1_2 48 12 x_1_2 49 12 y_1_2 50 12 hz_1_2 51 12 x_1_2 52 13 rz 3 1.5514777117377587 13 rz 4 -1.471042458257246 13 rz 6 0.9376872138295304 13 rz 7 -2.505708502040484 13 rz 8 -0.8138828334823582 13 rz 9 1.4625269352538472 13 rz 12 1.5465631243549467 13 rz 13 -1.3779143806237855 13 rz 14 -3.056522836696912 13 rz 15 3.0197041955368213 13 rz 16 1.4313150179323237 13 rz 17 -1.4458071174911336 13 rz 20 -0.5377106953899506 13 rz 21 -0.2326881725325665 13 rz 22 -0.14916236480551603 13 rz 23 -0.0049063314348209985 13 rz 24 0.7506379057684889 13 rz 25 -0.9003639271372892 13 rz 26 -1.8474993478983084 13 rz 27 1.9987708035250034 13 rz 29 1.245482758924572 13 rz 30 -1.2148704795940066 13 rz 31 0.03686637959834638 13 rz 32 0.0035863783361342882 13 rz 33 -1.8613845453503193 13 rz 34 2.1274320925128025 13 rz 35 -1.3490677361559822 13 rz 36 1.6785360491008614 13 rz 38 -2.5257109756448184 13 rz 39 2.10867489793368 13 rz 40 -2.759920821735129 13 rz 41 2.7202395614573565 13 rz 42 -0.4183020554137258 13 rz 43 0.9848848466497087 13 rz 45 -0.42166402519488333 13 rz 46 0.44428590744672997 13 rz 47 -0.77688951203044 13 rz 48 -0.5622182800396907 13 rz 50 2.348540240114408 13 rz 51 -2.7786467500008385 14 fs 3 4 1.483304234663135 0.4930986258758784 14 fs 6 7 1.5160176987076064 0.49850252902921577 14 fs 8 9 1.5338611249160479 0.5011308712767845 14 fs 12 13 1.480179689158691 0.4772322221553844 14 fs 14 15 1.5152260103068818 0.49796235787029736 14 fs 16 17 1.5284924549164072 0.5160847019657471 14 fs 20 21 1.58661284381037 0.475779832809368 14 fs 22 23 1.5333295850816209 0.44983388105304506 14 fs 24 25 1.5158107733607835 0.4663776718737318 14 fs 26 27 1.5645151084457722 0.47497942677256283 14 fs 29 30 1.5659881784786247 0.5656290235103623 14 fs 31 32 1.5211879663086973 0.5056110683638391 14 fs 33 34 1.5083349422212171 0.49641600818144604 14 fs 35 36 1.5087002777200382 0.44025777694304247 14 fs 38 39 1.5658333118222365 0.47264531483343447 14 fs 40 41 1.5219378850865568 0.5335829954491795 14 fs 42 43 1.5501487671051402 0.4404117539373896 14 fs 45 46 1.4825325148661492 0.6857341218223484 14 fs 47 48 1.4941963673904604 0.45895108234543025 14 fs 50 51 1.5487430259667763 0.4467898473637848 15 rz 3 -1.8841634261494544 15 rz 4 1.9645986796299673 15 rz 6 2.885627836077404 15 rz 7 1.8295361828912287 15 rz 8 0.05530092720528268 15 rz 9 0.5933431745662068 15 rz 12 -1.2922413166611904 15 rz 13 1.4608900603923516 15 rz 14 -2.3332667091615846 15 rz 15 2.296448068001496 15 rz 16 -1.436526112189684 15 rz 17 1.4220340126308777 15 rz 20 2.6035758286461963 15 rz 21 2.90921061061087 15 rz 22 -1.7401438372662703 15 rz 23 1.586075141025933 15 rz 24 0.5464640634289042 15 rz 25 -0.6961900847977063 15 rz 26 0.7545429458085255 15 rz 27 -0.6032714901818306 15 rz 29 -1.1636385149103123 15 rz 30 1.1942507942408778 15 rz 31 -1.071330330465674 15 rz 32 1.1117830884001547 15 rz 33 2.06057801616892 15 rz 34 -1.7945304690064374 15 rz 35 1.413295584834648 15 rz 36 -1.0838272718897688 15 rz 38 1.3041394540259699 15 rz 39 -1.7211755317371082 15 rz 40 -1.8989017400046564 15 rz 41 1.8592204797268828 15 rz 42 -1.0625073171877455 15 rz 43 1.6290901084237286 15 rz 45 1.2492236358488604 15 rz 46 -1.2266017535970137 15 rz 47 1.4019785896279764 15 rz 48 -2.741086381698107 15 rz 50 -2.3814810782487683 15 rz 51 1.951374568362338 16 y_1_2 0 16 x_1_2 1 16 x_1_2 2 16 y_1_2 3 16 hz_1_2 4 16 y_1_2 5 16 x_1_2 6 16 hz_1_2 7 16 x_1_2 8 16 hz_1_2 9 16 y_1_2 10 16 y_1_2 11 16 x_1_2 12 16 x_1_2 13 16 y_1_2 14 16 x_1_2 15 16 x_1_2 16 16 x_1_2 17 16 x_1_2 18 16 x_1_2 19 16 hz_1_2 20 16 x_1_2 21 16 x_1_2 22 16 hz_1_2 23 16 hz_1_2 24 16 y_1_2 25 16 hz_1_2 26 16 y_1_2 27 16 hz_1_2 28 16 y_1_2 29 16 y_1_2 30 16 y_1_2 31 16 x_1_2 32 16 x_1_2 33 16 y_1_2 34 16 hz_1_2 35 16 hz_1_2 36 16 y_1_2 37 16 y_1_2 38 16 x_1_2 39 16 hz_1_2 40 16 y_1_2 41 16 x_1_2 42 16 hz_1_2 43 16 y_1_2 44 16 hz_1_2 45 16 y_1_2 46 16 y_1_2 47 16 hz_1_2 48 16 hz_1_2 49 16 x_1_2 50 16 x_1_2 51 16 hz_1_2 52 17 rz 0 2.509738315706713 17 rz 1 -1.3704570274341172 17 rz 2 2.153407519965878 17 rz 3 -2.138382919503467 17 rz 4 2.814232306319262 17 rz 5 -2.6920308278237854 17 rz 7 -1.8455037387446078 17 rz 8 0.37749179100920927 17 rz 9 -0.5222760825654262 17 rz 10 -0.23841798202058587 17 rz 11 -2.294693625448355 17 rz 12 2.957798583533906 17 rz 13 0.6354176546180561 17 rz 14 -0.497243595392856 17 rz 15 -1.364784381224447 17 rz 16 1.4535594860369727 17 rz 17 -2.5347041731578344 17 rz 18 1.5992861917706982 17 rz 19 -1.5212806562497523 17 rz 20 1.5360593182523292 17 rz 21 -0.4836060239484059 17 rz 22 -0.413653150466585 17 rz 23 2.880099888266729 17 rz 24 2.4444432266694456 17 rz 25 2.967608018699071 17 rz 26 -3.119065067612691 17 rz 28 1.7627479969783801 17 rz 29 -1.047777132146802 17 rz 30 -2.9279659789460553 17 rz 31 2.6799252816899397 17 rz 32 -1.3666169229644929 17 rz 33 1.3051320018673227 17 rz 34 2.3459620391428473 17 rz 35 -1.688928029233397 17 rz 37 0.7053764684240491 17 rz 38 -0.6862365262774901 17 rz 39 1.6612640945005488 17 rz 40 -1.6994997628509552 17 rz 41 2.012657942111037 17 rz 42 -1.7570740105210447 17 rz 44 0.809714726290327 17 rz 45 -0.8741494330060942 17 rz 46 2.8487140428736204 17 rz 47 -3.049289040953621 17 rz 49 -1.9469909861230956 17 rz 50 2.232509926009607 18 fs 0 1 1.5508555127616375 0.48773645023966805 18 fs 2 3 1.4860895179182787 0.49800223593597315 18 fs 4 5 1.5268891182960795 0.5146971591948788 18 fs 7 8 1.5004518396933153 0.541239891546859 18 fs 9 10 1.5996085979256793 0.5279139399675195 18 fs 11 12 1.5354845176224254 0.41898979144044296 18 fs 13 14 1.545842827888829 0.533679342490625 18 fs 15 16 1.5651524165810975 0.5296573901163858 18 fs 17 18 1.6240366191418867 0.48516108212176406 18 fs 19 20 1.6022614099028112 0.5001380228896306 18 fs 21 22 1.574931196238987 0.5236666378689078 18 fs 23 24 1.5238301684218176 0.47521120348925566 18 fs 25 26 1.5426970250652188 0.5200449092580564 18 fs 28 29 1.4235475054732074 0.5253841271266504 18 fs 30 31 1.511471063363894 0.4578807555552488 18 fs 32 33 1.5371762819242982 0.5674318212304278 18 fs 34 35 1.510414477168897 0.44988262527024675 18 fs 37 38 1.498535212903308 0.637164678333888 18 fs 39 40 1.507377591132129 0.47869828403704195 18 fs 41 42 1.48836082148729 0.46458301209227065 18 fs 44 45 1.5400981673597602 0.5128416009465753 18 fs 46 47 1.5860873970424136 0.4790438939428006 18 fs 49 50 1.5630547528566316 0.48589356877723594 19 rz 0 -1.835566641582535 19 rz 1 2.9748479298551374 19 rz 2 -2.2177653481433772 19 rz 3 2.232789948605788 19 rz 4 3.0777614519881524 19 rz 5 -2.955559973492676 19 rz 7 1.914819914780612 19 rz 8 2.900353444663576 19 rz 9 -1.8617720158534254 19 rz 10 1.1010779512674134 19 rz 11 1.6603019765726525 19 rz 12 -0.9971970184871015 19 rz 13 -2.7812280389472868 19 rz 14 2.919402098172487 19 rz 15 -2.9976365084230814 19 rz 16 3.086411613235608 19 rz 17 3.06856290335228 19 rz 18 2.27920442244017 19 rz 19 -2.947337326410006 19 rz 20 2.9621159884125827 19 rz 21 -2.5524825437282335 19 rz 22 1.6552233693132423 19 rz 23 2.745534771798109 19 rz 24 2.5790083431380637 19 rz 25 -2.615542662980356 19 rz 26 2.464085614066736 19 rz 28 -2.31188697028605 19 rz 29 3.0268578351176316 19 rz 30 1.0894927671440904 19 rz 31 -1.337533464400206 19 rz 32 1.30569755230988 19 rz 33 -1.3671824734070501 19 rz 34 2.6642650636665586 19 rz 35 -2.007231053757109 19 rz 37 -1.3832898160206781 19 rz 38 1.4024297581672371 19 rz 39 -0.8985039726335948 19 rz 40 0.8602683042831885 19 rz 41 -1.821661362084587 19 rz 42 2.0772452936745793 19 rz 44 1.85443032484457 19 rz 45 -1.9188650315603386 19 rz 46 2.524541714205551 19 rz 47 -2.7251167122855513 19 rz 49 -2.363365765217333 19 rz 50 2.648884705103846 20 x_1_2 0 20 y_1_2 1 20 hz_1_2 2 20 hz_1_2 3 20 y_1_2 4 20 x_1_2 5 20 y_1_2 6 20 x_1_2 7 20 y_1_2 8 20 y_1_2 9 20 hz_1_2 10 20 hz_1_2 11 20 hz_1_2 12 20 hz_1_2 13 20 x_1_2 14 20 y_1_2 15 20 y_1_2 16 20 hz_1_2 17 20 y_1_2 18 20 y_1_2 19 20 y_1_2 20 20 y_1_2 21 20 y_1_2 22 20 y_1_2 23 20 x_1_2 24 20 hz_1_2 25 20 y_1_2 26 20 x_1_2 27 20 y_1_2 28 20 hz_1_2 29 20 x_1_2 30 20 hz_1_2 31 20 y_1_2 32 20 y_1_2 33 20 hz_1_2 34 20 x_1_2 35 20 y_1_2 36 20 hz_1_2 37 20 hz_1_2 38 20 hz_1_2 39 20 x_1_2 40 20 hz_1_2 41 20 hz_1_2 42 20 x_1_2 43 20 hz_1_2 44 20 x_1_2 45 20 x_1_2 46 20 x_1_2 47 20 x_1_2 48 20 x_1_2 49 20 y_1_2 50 20 y_1_2 51 20 y_1_2 52 21 rz 3 2.0227166097761504 21 rz 4 -1.9422813562956345 21 rz 6 0.22140408881091742 21 rz 7 -1.7894253770218675 21 rz 8 -1.2788385462138028 21 rz 9 1.9274826479852925 21 rz 12 1.7853241660278165 21 rz 13 -1.6166754222966553 21 rz 14 0.9081670921334216 21 rz 15 -0.9449857332935103 21 rz 16 2.1224654017221383 21 rz 17 -2.1369575012809463 21 rz 20 -2.1713388752567457 21 rz 21 1.400940007334226 21 rz 22 1.2394215880812602 21 rz 23 -1.3934902843215973 21 rz 24 -1.34794598682954 21 rz 25 1.1982199654607406 21 rz 26 -1.6213046768399444 21 rz 27 1.772576132466643 21 rz 29 1.9491995133286792 21 rz 30 -1.9185872339981103 21 rz 31 -2.985345753155011 21 rz 32 3.0257985110894925 21 rz 33 2.79445576726983 21 rz 34 -2.5284082201073472 21 rz 35 2.138100109328821 21 rz 36 -1.8086317963839418 21 rz 38 -2.76447201731769 21 rz 39 2.3474359396065516 21 rz 40 -1.8300093962726527 21 rz 41 1.79032813599488 21 rz 42 2.8363879337053515 21 rz 43 -2.2698051424693713 21 rz 45 1.2119641546719073 21 rz 46 -1.1893422724200597 21 rz 47 -0.3245001699135024 21 rz 48 -1.0146076221566283 21 rz 50 0.9536731019204866 21 rz 51 -1.3837796118069186 22 fs 3 4 1.483304234663135 0.4930986258758784 22 fs 6 7 1.5160176987076064 0.49850252902921577 22 fs 8 9 1.5338611249160479 0.5011308712767845 22 fs 12 13 1.480179689158691 0.4772322221553844 22 fs 14 15 1.5152260103068818 0.49796235787029736 22 fs 16 17 1.5284924549164072 0.5160847019657471 22 fs 20 21 1.58661284381037 0.475779832809368 22 fs 22 23 1.5333295850816209 0.44983388105304506 22 fs 24 25 1.5158107733607835 0.4663776718737318 22 fs 26 27 1.5645151084457722 0.47497942677256283 22 fs 29 30 1.5659881784786247 0.5656290235103623 22 fs 31 32 1.5211879663086973 0.5056110683638391 22 fs 33 34 1.5083349422212171 0.49641600818144604 22 fs 35 36 1.5087002777200382 0.44025777694304247 22 fs 38 39 1.5658333118222365 0.47264531483343447 22 fs 40 41 1.5219378850865568 0.5335829954491795 22 fs 42 43 1.5501487671051402 0.4404117539373896 22 fs 45 46 1.4825325148661492 0.6857341218223484 22 fs 47 48 1.4941963673904604 0.45895108234543025 22 fs 50 51 1.5487430259667763 0.4467898473637848 23 rz 3 -2.355402324187839 23 rz 4 2.435837577668355 23 rz 6 -2.6812743460835655 23 rz 7 1.1132530578726154 23 rz 8 0.5202566399367274 23 rz 9 0.12838746183476202 23 rz 12 -1.5310023583340602 23 rz 13 1.6996511020652214 23 rz 14 -0.014771330812333616 23 rz 15 -0.0220473103477552 23 rz 16 -2.127676495979493 23 rz 17 2.113184396420685 23 rz 20 -2.0459812986665984 23 rz 21 1.2755824307440768 23 rz 22 -3.1287277901530466 23 rz 23 2.9746590939127096 23 rz 24 2.645047956026932 23 rz 25 -2.7947739773957316 23 rz 26 0.5283482747501616 23 rz 27 -0.377076819123463 23 rz 29 -1.867355269314416 23 rz 30 1.897967548644985 23 rz 31 1.950881802287684 23 rz 32 -1.9104290443532026 23 rz 33 -2.5952622964512297 23 rz 34 2.8613098436137125 23 rz 35 -2.0738722606501554 23 rz 36 2.4033405735950346 23 rz 38 1.5429004956988415 23 rz 39 -1.9599365734099798 23 rz 40 -2.8288131654671322 23 rz 41 2.7891319051893593 23 rz 42 1.9659880008727608 23 rz 43 -1.3994052096367806 23 rz 45 -0.38440454401792934 23 rz 46 0.4070264262697769 23 rz 47 0.9495892475110317 23 rz 48 -2.2886970395811623 23 rz 50 -0.9866139400548483 23 rz 51 0.5565074301684163 24 hz_1_2 0 24 x_1_2 1 24 y_1_2 2 24 y_1_2 3 24 x_1_2 4 24 hz_1_2 5 24 x_1_2 6 24 hz_1_2 7 24 x_1_2 8 24 hz_1_2 9 24 y_1_2 10 24 y_1_2 11 24 x_1_2 12 24 x_1_2 13 24 hz_1_2 14 24 x_1_2 15 24 hz_1_2 16 24 x_1_2 17 24 hz_1_2 18 24 x_1_2 19 24 x_1_2 20 24 x_1_2 21 24 hz_1_2 22 24 x_1_2 23 24 y_1_2 24 24 x_1_2 25 24 hz_1_2 26 24 hz_1_2 27 24 x_1_2 28 24 x_1_2 29 24 hz_1_2 30 24 x_1_2 31 24 x_1_2 32 24 hz_1_2 33 24 x_1_2 34 24 y_1_2 35 24 x_1_2 36 24 x_1_2 37 24 y_1_2 38 24 y_1_2 39 24 y_1_2 40 24 x_1_2 41 24 x_1_2 42 24 y_1_2 43 24 x_1_2 44 24 hz_1_2 45 24 hz_1_2 46 24 hz_1_2 47 24 y_1_2 48 24 hz_1_2 49 24 hz_1_2 50 24 hz_1_2 51 24 x_1_2 52 25 rz 1 -1.7330955636302576 25 rz 4 1.9398691302822326 25 rz 3 -1.3595905672440445 25 rz 7 -0.15903789486672082 25 rz 5 0.9983480185332675 25 rz 9 -0.31564404036580385 25 rz 6 1.6005797808823772 25 rz 13 -1.499867333846277 25 rz 8 -2.0133729703407113 25 rz 15 1.9521694964279346 25 rz 10 -2.2092282896270623 25 rz 17 2.370715615488243 25 rz 12 -2.8505778473320245 25 rz 21 2.415338342284782 25 rz 14 -2.7073106232211153 25 rz 23 2.9331993910785776 25 rz 16 -1.234561816122234 25 rz 25 1.2872453810226325 25 rz 18 0.17343200211866971 25 rz 27 -0.15234963602808804 25 rz 20 3.127364464427597 25 rz 30 -3.117297966598411 25 rz 22 -0.25478173773634083 25 rz 32 0.10803990070456493 25 rz 24 0.37354651617850365 25 rz 34 0.2136147516704163 25 rz 26 -1.894523295721189 25 rz 36 1.843936505903141 25 rz 29 -3.1338996122268092 25 rz 37 -3.0782356919943297 25 rz 31 2.1250997343771267 25 rz 39 2.9023032127557684 25 rz 33 2.4328195171731437 25 rz 41 -2.6707659011151748 25 rz 35 -2.145151811969935 25 rz 43 2.337402438966709 25 rz 38 -0.20565851076299776 25 rz 44 0.1803029251110182 25 rz 40 -0.1207797111557447 25 rz 46 0.11786565918021451 25 rz 42 2.457861535405762 25 rz 48 2.942071317594255 25 rz 45 2.3911948089457944 25 rz 49 -2.5230498754107877 25 rz 47 -1.198546606652119 25 rz 51 1.177655058764337 25 rz 50 0.10358021090199898 25 rz 52 -1.2305673521312634 26 fs 1 4 1.5157741664069029 0.5567125777723744 26 fs 3 7 1.5177580142209797 0.4948108578225166 26 fs 5 9 1.6036738621219824 0.47689957001758815 26 fs 6 13 1.5177327089642791 0.5058312223892585 26 fs 8 15 1.5253184444076096 0.46557175536519374 26 fs 10 17 1.6141004604574274 0.494343440675308 26 fs 12 21 1.5476810407275208 0.44290174465702487 26 fs 14 23 1.5237261387830179 0.4696616122846161 26 fs 16 25 1.5285844942020295 0.5736654641906893 26 fs 18 27 1.5483159975149505 0.4961408893973623 26 fs 20 30 1.6377079485605028 0.6888985951517526 26 fs 22 32 1.529949914236052 0.48258847574702635 26 fs 24 34 1.5280421758407217 0.5109767145462891 26 fs 26 36 1.5120782868771674 0.4815152809861558 26 fs 29 37 1.5071938854285831 0.5089276063739265 26 fs 31 39 1.5460100224551203 0.5302403303961576 26 fs 33 41 1.5166625940397171 0.4517159790427676 26 fs 35 43 1.4597689731864314 0.4214985958536156 26 fs 38 44 1.535649445690472 0.47076284376181704 26 fs 40 46 1.5179778495708582 0.5221350266177334 26 fs 42 48 1.4969321270213238 0.4326117171327162 26 fs 45 49 1.5114987201637704 0.4914319343687703 26 fs 47 51 1.4908807480930255 0.4886243720131578 26 fs 50 52 1.616256999726831 0.501428936283957 27 rz 1 1.7724664194652178 27 rz 4 -1.5656928528132426 27 rz 3 0.759607559590961 27 rz 7 -2.2782360217017192 27 rz 5 -1.0079670710951056 27 rz 9 1.6906710492625692 27 rz 6 0.05988685034802011 27 rz 13 0.04082559668808017 27 rz 8 0.7106277561520997 27 rz 15 -0.7718312300648762 27 rz 10 -2.707297464588221 27 rz 17 2.8687847904494017 27 rz 12 0.7639604313656694 27 rz 21 -1.1991999364129118 27 rz 14 -2.8382972072733033 27 rz 23 3.0641859751307656 27 rz 16 -1.8447115551255957 27 rz 25 1.8973951200259942 27 rz 18 -0.9331644857301312 27 rz 27 0.9542468518207095 27 rz 20 -0.6509021786445608 27 rz 30 0.6609686764737468 27 rz 22 0.5664355433142667 27 rz 32 -0.7131773803460426 27 rz 24 0.1297057374208599 27 rz 34 0.45745553042806003 27 rz 26 2.6703217345889136 27 rz 36 -2.720908524406962 27 rz 29 0.8479855032239847 27 rz 37 -0.7769355002655338 27 rz 31 1.5221248461973182 27 rz 39 -2.7779072062440058 27 rz 33 -2.799489702986982 27 rz 41 2.561543319044951 27 rz 35 -0.04972065802050806 27 rz 43 0.24197128501728213 27 rz 38 1.5754169046046478 27 rz 44 -1.6007724902566276 27 rz 40 0.964040510151481 27 rz 46 -0.966954562127011 27 rz 42 1.6285834854416945 27 rz 48 -2.511835939621264 27 rz 45 3.1294394739035276 27 rz 49 3.0218907668110653 27 rz 47 0.8257817206597977 27 rz 51 -0.8466732685475797 27 rz 50 2.178584413048238 27 rz 52 2.9776137529020836 28 x_1_2 0 28 hz_1_2 1 28 x_1_2 2 28 hz_1_2 3 28 y_1_2 4 28 x_1_2 5 28 y_1_2 6 28 y_1_2 7 28 hz_1_2 8 28 y_1_2 9 28 hz_1_2 10 28 hz_1_2 11 28 hz_1_2 12 28 hz_1_2 13 28 y_1_2 14 28 hz_1_2 15 28 y_1_2 16 28 y_1_2 17 28 x_1_2 18 28 y_1_2 19 28 y_1_2 20 28 hz_1_2 21 28 x_1_2 22 28 y_1_2 23 28 x_1_2 24 28 y_1_2 25 28 y_1_2 26 28 x_1_2 27 28 hz_1_2 28 28 y_1_2 29 28 y_1_2 30 28 y_1_2 31 28 hz_1_2 32 28 x_1_2 33 28 hz_1_2 34 28 x_1_2 35 28 hz_1_2 36 28 hz_1_2 37 28 hz_1_2 38 28 x_1_2 39 28 x_1_2 40 28 hz_1_2 41 28 y_1_2 42 28 x_1_2 43 28 y_1_2 44 28 y_1_2 45 28 y_1_2 46 28 y_1_2 47 28 x_1_2 48 28 x_1_2 49 28 x_1_2 50 28 x_1_2 51 28 y_1_2 52 29 rz 0 0.2708568396429989 29 rz 3 0.5131592299567238 29 rz 2 1.248334748228233 29 rz 6 -1.245096143570473 29 rz 4 1.7049654478519258 29 rz 8 -1.704046065789715 29 rz 7 0.2828588164022108 29 rz 14 1.074514195969634 29 rz 9 2.8221758365108265 29 rz 16 -2.2203935346772603 29 rz 11 2.2153145092260527 29 rz 20 -1.9619241841179669 29 rz 13 0.4960683828611785 29 rz 22 -0.5952622981726243 29 rz 15 2.520989694870888 29 rz 24 -2.3843438995022606 29 rz 17 2.7322201319514434 29 rz 26 -2.6754374802574503 29 rz 19 2.7508049894134636 29 rz 29 -2.767221447756338 29 rz 21 0.7640489782325908 29 rz 31 -2.23848056706041 29 rz 23 -3.109342207061271 29 rz 33 -2.8508740887297 29 rz 25 -2.983768546653451 29 rz 35 2.8833253713006393 29 rz 30 -0.4040590142067196 29 rz 38 0.4083812107316938 29 rz 32 0.4206106386165622 29 rz 40 -0.3956510220954215 29 rz 34 -3.022742889192781 29 rz 42 -2.813549791795122 29 rz 39 -2.3651057844032337 29 rz 45 2.2802391683627796 29 rz 41 -2.386392983014069 29 rz 47 2.2472184260848387 29 rz 46 -2.140859102552003 29 rz 50 2.2366985715454 30 fs 0 3 1.5192859850645715 0.49387245572956845 30 fs 2 6 1.5120572609259932 0.5211713721957417 30 fs 4 8 1.615096254724942 0.7269644142795206 30 fs 7 14 1.5269188098932545 0.5036266469194081 30 fs 9 16 1.5179602369002039 0.4914328237769214 30 fs 11 20 1.537427483096926 0.45115204759967975 30 fs 13 22 1.53486366638317 0.46559889697604934 30 fs 15 24 1.5194586006330344 0.5068560732280918 30 fs 17 26 1.5819908111894527 0.5595875596558442 30 fs 19 29 1.5070579127771144 0.4520319437379419 30 fs 21 31 1.527311970249325 0.4920204543143157 30 fs 23 33 1.5139592614725292 0.45916943035876673 30 fs 25 35 1.5425204049671604 0.5057437054391503 30 fs 30 38 1.5432564804093452 0.5658780292653538 30 fs 32 40 1.4611081680611278 0.5435451345370095 30 fs 34 42 1.4529959991143482 0.43830813863531964 30 fs 39 45 1.6239619425876082 0.4985036227887135 30 fs 41 47 1.4884560669186362 0.4964777432807688 30 fs 46 50 1.5034760541420213 0.5004774067921798 31 rz 0 0.278584348296274 31 rz 3 0.5054317213034487 31 rz 2 -1.833449629188484 31 rz 6 1.8366882338462445 31 rz 4 2.0849792470214012 31 rz 8 -2.084059864959194 31 rz 7 2.2865573929689447 31 rz 14 -0.9291843805970998 31 rz 9 -2.3470555007121945 31 rz 16 2.9488378025457607 31 rz 11 -1.6779778970200798 31 rz 20 1.9313682221281656 31 rz 13 0.1815472763307362 31 rz 22 -0.28074119164218203 31 rz 15 3.053792435604949 31 rz 24 -2.9171466402363215 31 rz 17 0.7555789696657627 31 rz 26 -0.6987963179717696 31 rz 19 -3.0433356371167157 31 rz 29 3.0269191787738414 31 rz 21 -1.6191978590942815 31 rz 31 0.14476627026646227 31 rz 23 -0.7657808426693897 31 rz 33 1.0887498540580047 31 rz 25 -2.011258423641035 31 rz 35 1.9108152482882197 31 rz 30 -1.4787200189876444 31 rz 38 1.4830422155126222 31 rz 32 -0.6118011268448953 31 rz 40 0.636760743366036 31 rz 34 1.6286606462956676 31 rz 42 -1.1817680201039842 31 rz 39 0.41508822871925233 31 rz 45 -0.49995484475970997 31 rz 41 2.1954786792906127 31 rz 47 -2.334653236219843 31 rz 46 0.9935361662269422 31 rz 50 -0.8976966972335454 32 hz_1_2 0 32 x_1_2 1 32 hz_1_2 2 32 y_1_2 3 32 x_1_2 4 32 hz_1_2 5 32 hz_1_2 6 32 hz_1_2 7 32 x_1_2 8 32 x_1_2 9 32 x_1_2 10 32 y_1_2 11 32 x_1_2 12 32 x_1_2 13 32 x_1_2 14 32 y_1_2 15 32 x_1_2 16 32 hz_1_2 17 32 y_1_2 18 32 x_1_2 19 32 x_1_2 20 32 y_1_2 21 32 hz_1_2 22 32 hz_1_2 23 32 hz_1_2 24 32 x_1_2 25 32 x_1_2 26 32 hz_1_2 27 32 x_1_2 28 32 hz_1_2 29 32 x_1_2 30 32 hz_1_2 31 32 x_1_2 32 32 hz_1_2 33 32 y_1_2 34 32 y_1_2 35 32 x_1_2 36 32 x_1_2 37 32 y_1_2 38 32 hz_1_2 39 32 y_1_2 40 32 y_1_2 41 32 x_1_2 42 32 y_1_2 43 32 hz_1_2 44 32 x_1_2 45 32 hz_1_2 46 32 x_1_2 47 32 hz_1_2 48 32 hz_1_2 49 32 y_1_2 50 32 hz_1_2 51 32 hz_1_2 52 33 rz 1 -3.121679516517034 33 rz 4 -2.9547322240105807 33 rz 3 1.191382667470723 33 rz 7 -2.710011129581499 33 rz 5 -2.488819826951536 33 rz 9 -3.1116615020605884 33 rz 6 -2.125349106275088 33 rz 13 2.2260615533111903 33 rz 8 -1.554700442916623 33 rz 15 1.4934969690038464 33 rz 10 -1.2793168641643788 33 rz 17 1.4408041900255597 33 rz 12 -0.06084357094438886 33 rz 21 -0.37439593410285354 33 rz 14 -0.1500542031989962 33 rz 23 0.3759429710564586 33 rz 16 -2.1770396121992057 33 rz 25 2.2297231770996184 33 rz 18 -3.09382435761491 33 rz 27 3.1149067237054986 33 rz 20 1.2738247988095885 33 rz 30 -1.2637583009803954 33 rz 22 0.4489350166677681 33 rz 32 -0.595676853699544 33 rz 24 1.3097411269483352 33 rz 34 -0.7225798590994152 33 rz 26 -1.6557622540483192 33 rz 36 1.6051754642302711 33 rz 29 1.509374329778833 33 rz 37 -1.4383243268203962 33 rz 31 0.25271051283766255 33 rz 39 -1.5084928728843643 33 rz 33 2.891492044597232 33 rz 41 -3.129438428539263 33 rz 35 0.4058214227450386 33 rz 43 -0.21357079574826443 33 rz 38 -1.8267203200154896 33 rz 44 1.8013647343635133 33 rz 40 -1.9743193767737497 33 rz 46 1.971405324798223 33 rz 42 2.4515783500986146 33 rz 48 2.9483545029014024 33 rz 45 -1.5734951198845515 33 rz 49 1.441640053419551 33 rz 47 1.8173823407940866 33 rz 51 -1.8382738886818792 33 rz 50 0.3297748819603683 33 rz 52 -1.4567620231896328 34 fs 1 4 1.5157741664069029 0.5567125777723744 34 fs 3 7 1.5177580142209797 0.4948108578225166 34 fs 5 9 1.6036738621219824 0.47689957001758815 34 fs 6 13 1.5177327089642791 0.5058312223892585 34 fs 8 15 1.5253184444076096 0.46557175536519374 34 fs 10 17 1.6141004604574274 0.494343440675308 34 fs 12 21 1.5476810407275208 0.44290174465702487 34 fs 14 23 1.5237261387830179 0.4696616122846161 34 fs 16 25 1.5285844942020295 0.5736654641906893 34 fs 18 27 1.5483159975149505 0.4961408893973623 34 fs 20 30 1.6377079485605028 0.6888985951517526 34 fs 22 32 1.529949914236052 0.48258847574702635 34 fs 24 34 1.5280421758407217 0.5109767145462891 34 fs 26 36 1.5120782868771674 0.4815152809861558 34 fs 29 37 1.5071938854285831 0.5089276063739265 34 fs 31 39 1.5460100224551203 0.5302403303961576 34 fs 33 41 1.5166625940397171 0.4517159790427676 34 fs 35 43 1.4597689731864314 0.4214985958536156 34 fs 38 44 1.535649445690472 0.47076284376181704 34 fs 40 46 1.5179778495708582 0.5221350266177334 34 fs 42 48 1.4969321270213238 0.4326117171327162 34 fs 45 49 1.5114987201637704 0.4914319343687703 34 fs 47 51 1.4908807480930255 0.4886243720131578 34 fs 50 52 1.616256999726831 0.501428936283957 35 rz 1 -3.1221349348275957 35 rz 4 -2.954276805700019 35 rz 3 -1.79136567512381 35 rz 7 0.2727372130130341 35 rz 5 2.4792007743896995 35 rz 9 -1.7964967962222342 35 rz 6 -2.497369569674099 35 rz 13 2.598082016710201 35 rz 8 0.25195522872801135 35 rz 15 -0.3131587026407878 35 rz 10 2.645976417128683 35 rz 17 -2.484489091267502 35 rz 12 -2.0257738450219662 35 rz 21 1.5905343399747238 35 rz 14 0.8876316798841639 35 rz 23 -0.6617429120267015 35 rz 16 -0.9022337590486096 35 rz 25 0.9549173239490222 35 rz 18 2.334091874003459 35 rz 27 -2.31300950791287 35 rz 20 1.2026374869734546 35 rz 30 -1.192570989144265 35 rz 22 -0.13728121108984226 35 rz 32 -0.009460625941933642 35 rz 24 -0.8064888733489717 35 rz 34 1.3936501411978917 35 rz 26 2.431560692916044 35 rz 36 -2.482147482734092 35 rz 29 2.4878968683979146 35 rz 37 -2.416846865439478 35 rz 31 -2.888671239442818 35 rz 39 1.632888879396116 35 rz 33 3.025023076768516 35 rz 41 3.020215846469039 35 rz 35 -2.6006938927354746 35 rz 43 2.7929445197322487 35 rz 38 -3.086706593322443 35 rz 44 3.061351007670467 35 rz 40 2.817580175769489 35 rz 46 -2.820494227745016 35 rz 42 1.6348666707488422 35 rz 48 -2.5181191249284076 35 rz 45 0.8109440955542802 35 rz 49 -0.9427991620192806 35 rz 47 -2.1901472267864186 35 rz 51 2.169255678898626 35 rz 50 1.952389741989869 35 rz 52 -3.0793768832191333 36 x_1_2 0 36 y_1_2 1 36 x_1_2 2 36 x_1_2 3 36 y_1_2 4 36 y_1_2 5 36 x_1_2 6 36 x_1_2 7 36 y_1_2 8 36 hz_1_2 9 36 y_1_2 10 36 hz_1_2 11 36 y_1_2 12 36 y_1_2 13 36 y_1_2 14 36 x_1_2 15 36 hz_1_2 16 36 x_1_2 17 36 hz_1_2 18 36 hz_1_2 19 36 hz_1_2 20 36 x_1_2 21 36 y_1_2 22 36 y_1_2 23 36 x_1_2 24 36 y_1_2 25 36 y_1_2 26 36 x_1_2 27 36 y_1_2 28 36 y_1_2 29 36 hz_1_2 30 36 x_1_2 31 36 hz_1_2 32 36 y_1_2 33 36 hz_1_2 34 36 x_1_2 35 36 y_1_2 36 36 hz_1_2 37 36 hz_1_2 38 36 x_1_2 39 36 hz_1_2 40 36 x_1_2 41 36 hz_1_2 42 36 hz_1_2 43 36 x_1_2 44 36 hz_1_2 45 36 x_1_2 46 36 y_1_2 47 36 y_1_2 48 36 y_1_2 49 36 hz_1_2 50 36 y_1_2 51 36 y_1_2 52 37 rz 0 -1.8088774970333825 37 rz 3 2.592893566633105 37 rz 2 -1.7738773845251252 37 rz 6 1.7771159891828854 37 rz 4 0.31638149496535917 37 rz 8 -0.31546211290315895 37 rz 7 -0.4082915673873906 37 rz 14 1.7656645797592283 37 rz 9 0.49111408754728103 37 rz 16 0.11066821428628514 37 rz 11 -1.9755700906626519 37 rz 20 2.2289604157707377 37 rz 13 -2.299949078833812 37 rz 22 2.2007551635223663 37 rz 15 0.4224058022728556 37 rz 24 -0.2857600069042263 37 rz 17 1.796025521181612 37 rz 26 -1.7392428694876187 37 rz 19 2.9895660310863335 37 rz 29 -3.0059824894292078 37 rz 21 -0.8570128310196984 37 rz 31 -0.6174187578081209 37 rz 23 -1.2369529855218069 37 rz 33 1.559921996910436 37 rz 25 0.748443525811151 37 rz 35 -0.8488867011639661 37 rz 30 2.8443477896052194 37 rz 38 -2.840025593080231 37 rz 32 2.506628160600304 37 rz 40 -2.4816685440791524 37 rz 34 -3.029026074500134 37 rz 42 -2.8072666064877687 37 rz 39 1.3671062880613754 37 rz 45 -1.45197290410184 37 rz 41 1.34581908945054 37 rz 47 -1.484993646379781 37 rz 46 2.502414839453639 37 rz 50 -2.406575370460242 38 fs 0 3 1.5192859850645715 0.49387245572956845 38 fs 2 6 1.5120572609259932 0.5211713721957417 38 fs 4 8 1.615096254724942 0.7269644142795206 38 fs 7 14 1.5269188098932545 0.5036266469194081 38 fs 9 16 1.5179602369002039 0.4914328237769214 38 fs 11 20 1.537427483096926 0.45115204759967975 38 fs 13 22 1.53486366638317 0.46559889697604934 38 fs 15 24 1.5194586006330344 0.5068560732280918 38 fs 17 26 1.5819908111894527 0.5595875596558442 38 fs 19 29 1.5070579127771144 0.4520319437379419 38 fs 21 31 1.527311970249325 0.4920204543143157 38 fs 23 33 1.5139592614725292 0.45916943035876673 38 fs 25 35 1.5425204049671604 0.5057437054391503 38 fs 30 38 1.5432564804093452 0.5658780292653538 38 fs 32 40 1.4611081680611278 0.5435451345370095 38 fs 34 42 1.4529959991143482 0.43830813863531964 38 fs 39 45 1.6239619425876082 0.4985036227887135 38 fs 41 47 1.4884560669186362 0.4964777432807688 38 fs 46 50 1.5034760541420213 0.5004774067921798 39 rz 0 2.358318684972655 39 rz 3 -1.5743026153729325 39 rz 2 1.188762503564874 39 rz 6 -1.185523898907114 39 rz 4 -2.8096221072716325 39 rz 8 2.8105414893338363 39 rz 7 2.977707776758546 39 rz 14 -1.6203347643867119 39 rz 9 -0.015993751748652585 39 rz 16 0.6177760535822188 39 rz 11 2.5129067028686247 39 rz 20 -2.259516377760539 39 rz 13 2.977564738025727 39 rz 22 -3.0767586533371727 39 rz 15 -1.130808978976603 39 rz 24 1.2674547743452322 39 rz 17 1.6917735804355942 39 rz 26 -1.6349909287416011 39 rz 19 3.0010886283900007 39 rz 29 -3.017505086732875 39 rz 21 0.0018639501580004494 39 rz 31 -1.4762955389858199 39 rz 23 -2.6381700642088397 39 rz 33 2.961139075597469 39 rz 25 0.5397148110739458 39 rz 35 -0.640157986426761 39 rz 30 1.5560584843800136 39 rz 38 -1.5517362878550252 39 rz 32 -2.697818648828626 39 rz 40 2.7227782653497776 39 rz 34 1.634943831603021 39 rz 42 -1.1880512054113375 39 rz 39 2.966061463434219 39 rz 45 -3.0509280794746836 39 rz 41 -1.536733393174007 39 rz 47 1.397558836244766 39 rz 46 2.6334475314008863 39 rz 50 -2.5376080624074895 40 hz_1_2 0 40 x_1_2 1 40 hz_1_2 2 40 hz_1_2 3 40 x_1_2 4 40 x_1_2 5 40 hz_1_2 6 40 hz_1_2 7 40 x_1_2 8 40 y_1_2 9 40 x_1_2 10 40 x_1_2 11 40 hz_1_2 12 40 x_1_2 13 40 x_1_2 14 40 hz_1_2 15 40 x_1_2 16 40 hz_1_2 17 40 x_1_2 18 40 x_1_2 19 40 x_1_2 20 40 hz_1_2 21 40 x_1_2 22 40 x_1_2 23 40 hz_1_2 24 40 hz_1_2 25 40 x_1_2 26 40 hz_1_2 27 40 x_1_2 28 40 x_1_2 29 40 y_1_2 30 40 y_1_2 31 40 y_1_2 32 40 x_1_2 33 40 x_1_2 34 40 y_1_2 35 40 x_1_2 36 40 y_1_2 37 40 y_1_2 38 40 hz_1_2 39 40 y_1_2 40 40 y_1_2 41 40 x_1_2 42 40 y_1_2 43 40 hz_1_2 44 40 y_1_2 45 40 hz_1_2 46 40 x_1_2 47 40 hz_1_2 48 40 x_1_2 49 40 x_1_2 50 40 hz_1_2 51 40 x_1_2 52 41 rz 0 1.850003858453061 41 rz 1 -0.7107225701804545 41 rz 2 2.134557964044429 41 rz 3 -2.119533363582022 41 rz 4 1.4319315387400522 41 rz 5 -1.3097300602445756 41 rz 7 0.31591200692573906 41 rz 8 -1.7839239546611234 41 rz 9 -1.9485591472950894 41 rz 10 1.1878650827090773 41 rz 11 -3.004693565159407 41 rz 12 -2.6153867839346248 41 rz 13 1.3077184824862194 41 rz 14 -1.1695444232610193 41 rz 15 1.4375162657774823 41 rz 16 -1.3487411609649556 41 rz 17 -1.1461202202710616 41 rz 18 0.2107022388839255 41 rz 19 0.5835864216556317 41 rz 20 -0.5688077596530547 41 rz 21 2.324977808361087 41 rz 22 3.0609483244035083 41 rz 23 0.8066487368972908 41 rz 24 -1.7652909291407148 41 rz 25 -1.2232765811896336 41 rz 26 1.071819532276014 41 rz 28 0.4118631559345083 41 rz 29 0.30310770889709815 41 rz 30 -0.8482316422696741 41 rz 31 0.6001909450135585 41 rz 32 0.021967029922279835 41 rz 33 -0.08345195101944825 41 rz 34 -1.844922560746477 41 rz 35 2.5019565706559277 41 rz 37 -1.368074682944762 41 rz 38 1.387214625091321 41 rz 39 -1.8133373803695463 41 rz 40 1.7751017120191366 41 rz 41 2.0189411274179783 41 rz 42 -1.7633571958279857 41 rz 44 -2.6963026751157138 41 rz 45 2.6318679683999484 41 rz 46 -2.737037695209419 41 rz 47 2.5364626971294175 41 rz 49 -2.6381413699127005 41 rz 50 2.9236603097992138 42 fs 0 1 1.5508555127616375 0.48773645023966805 42 fs 2 3 1.4860895179182787 0.49800223593597315 42 fs 4 5 1.5268891182960795 0.5146971591948788 42 fs 7 8 1.5004518396933153 0.541239891546859 42 fs 9 10 1.5996085979256793 0.5279139399675195 42 fs 11 12 1.5354845176224254 0.41898979144044296 42 fs 13 14 1.545842827888829 0.533679342490625 42 fs 15 16 1.5651524165810975 0.5296573901163858 42 fs 17 18 1.6240366191418867 0.48516108212176406 42 fs 19 20 1.6022614099028112 0.5001380228896306 42 fs 21 22 1.574931196238987 0.5236666378689078 42 fs 23 24 1.5238301684218176 0.47521120348925566 42 fs 25 26 1.5426970250652188 0.5200449092580564 42 fs 28 29 1.4235475054732074 0.5253841271266504 42 fs 30 31 1.511471063363894 0.4578807555552488 42 fs 32 33 1.5371762819242982 0.5674318212304278 42 fs 34 35 1.510414477168897 0.44988262527024675 42 fs 37 38 1.498535212903308 0.637164678333888 42 fs 39 40 1.507377591132129 0.47869828403704195 42 fs 41 42 1.48836082148729 0.46458301209227065 42 fs 44 45 1.5400981673597602 0.5128416009465753 42 fs 46 47 1.5860873970424136 0.4790438939428006 42 fs 49 50 1.5630547528566316 0.48589356877723594 43 rz 0 -1.175832184328872 43 rz 1 2.315113472601478 43 rz 2 -2.198915792221939 43 rz 3 2.2139403926843464 43 rz 4 -1.823123087612224 43 rz 5 1.9453245661077003 43 rz 7 -0.2465958308897207 43 rz 8 -1.2214161168456634 43 rz 9 -0.43548895112376945 43 rz 10 -0.3252051134622427 43 rz 11 2.370301916283708 43 rz 12 -1.7071969581981534 43 rz 13 2.829656440364136 43 rz 14 -2.691482381138936 43 rz 15 0.4832481517545731 43 rz 16 -0.39447304694204627 43 rz 17 1.6799789504655074 43 rz 18 -2.615396931852647 43 rz 19 1.2309809028641965 43 rz 20 -1.2162022408616195 43 rz 21 0.9221189311418634 43 rz 22 -1.8193781055568543 43 rz 23 -1.4641993840120442 43 rz 24 0.5055571917686201 43 rz 25 1.575341936908349 43 rz 26 -1.7267989858219677 43 rz 28 -0.9610021292421642 43 rz 29 1.6759729940737709 43 rz 30 -0.9902415695322873 43 rz 31 0.7422008722761717 43 rz 32 -0.08288640057689278 43 rz 33 0.021401479479724372 43 rz 34 0.5719643563762968 43 rz 35 0.08506965353315366 43 rz 37 0.6901613353481402 43 rz 38 -0.6710213932015812 43 rz 39 2.5760975022365002 43 rz 40 -2.61433317058691 43 rz 41 -1.8279445473915281 43 rz 42 2.0835284789815205 43 rz 44 -0.9227375809289775 43 rz 45 0.8583028742132122 43 rz 46 1.827108145109003 43 rz 47 -2.027683143189005 43 rz 49 -1.672215381427728 43 rz 50 1.9577343213142395 44 x_1_2 0 44 y_1_2 1 44 y_1_2 2 44 x_1_2 3 44 y_1_2 4 44 y_1_2 5 44 y_1_2 6 44 x_1_2 7 44 hz_1_2 8 44 hz_1_2 9 44 hz_1_2 10 44 hz_1_2 11 44 y_1_2 12 44 y_1_2 13 44 y_1_2 14 44 y_1_2 15 44 y_1_2 16 44 x_1_2 17 44 y_1_2 18 44 hz_1_2 19 44 hz_1_2 20 44 x_1_2 21 44 y_1_2 22 44 hz_1_2 23 44 y_1_2 24 44 x_1_2 25 44 y_1_2 26 44 x_1_2 27 44 hz_1_2 28 44 hz_1_2 29 44 x_1_2 30 44 x_1_2 31 44 hz_1_2 32 44 y_1_2 33 44 y_1_2 34 44 hz_1_2 35 44 y_1_2 36 44 x_1_2 37 44 x_1_2 38 44 x_1_2 39 44 hz_1_2 40 44 hz_1_2 41 44 hz_1_2 42 44 x_1_2 43 44 x_1_2 44 44 x_1_2 45 44 y_1_2 46 44 hz_1_2 47 44 x_1_2 48 44 hz_1_2 49 44 y_1_2 50 44 y_1_2 51 44 y_1_2 52 45 rz 3 -2.846752003288273 45 rz 4 2.9271872567687858 45 rz 6 -1.9274452862449074 45 rz 7 0.3594239980339573 45 rz 8 -2.6737056844081373 45 rz 9 -2.96083552099996 45 rz 12 2.5016072910464295 45 rz 13 -2.3329585473152683 45 rz 14 0.23586626426525825 45 rz 15 -0.2726849054253613 45 rz 16 -2.0872687540880186 45 rz 17 2.0727766545292035 45 rz 20 -0.7890381076775341 45 rz 21 0.01863923975501791 45 rz 22 -0.8780118604379972 45 rz 23 0.7239431641976743 45 rz 24 -1.360512357444044 45 rz 25 1.2107863360752447 45 rz 26 -0.94272066366484 45 rz 27 1.0939921192915456 45 rz 29 -2.2228355306385765 45 rz 30 2.253447809969142 45 rz 31 0.5143884629440869 45 rz 32 -0.47393570500960536 45 rz 33 -2.087579216408482 45 rz 34 2.353626763570965 45 rz 35 0.033233031424060755 45 rz 36 0.296235281520822 45 rz 38 2.8024301648432832 45 rz 39 3.063719064625161 45 rz 40 0.9597248801147771 45 rz 41 -0.9994061403925496 45 rz 42 0.03408728670342143 45 rz 43 0.5324955045325588 45 rz 45 -0.1703366129073025 45 rz 46 0.1929584951591501 45 rz 47 1.0326678564373317 45 rz 48 -2.3717756485074624 45 rz 50 3.0522569945183093 45 rz 51 2.800821802774845 46 fs 3 4 1.483304234663135 0.4930986258758784 46 fs 6 7 1.5160176987076064 0.49850252902921577 46 fs 8 9 1.5338611249160479 0.5011308712767845 46 fs 12 13 1.480179689158691 0.4772322221553844 46 fs 14 15 1.5152260103068818 0.49796235787029736 46 fs 16 17 1.5284924549164072 0.5160847019657471 46 fs 20 21 1.58661284381037 0.475779832809368 46 fs 22 23 1.5333295850816209 0.44983388105304506 46 fs 24 25 1.5158107733607835 0.4663776718737318 46 fs 26 27 1.5645151084457722 0.47497942677256283 46 fs 29 30 1.5659881784786247 0.5656290235103623 46 fs 31 32 1.5211879663086973 0.5056110683638391 46 fs 33 34 1.5083349422212171 0.49641600818144604 46 fs 35 36 1.5087002777200382 0.44025777694304247 46 fs 38 39 1.5658333118222365 0.47264531483343447 46 fs 40 41 1.5219378850865568 0.5335829954491795 46 fs 42 43 1.5501487671051402 0.4404117539373896 46 fs 45 46 1.4825325148661492 0.6857341218223484 46 fs 47 48 1.4941963673904604 0.45895108234543025 46 fs 50 51 1.5487430259667763 0.4467898473637848 47 rz 3 2.514066288876574 47 rz 4 -2.4336310353960613 47 rz 6 -0.5324249710277407 47 rz 7 -1.0355963171832094 47 rz 8 1.915123778131061 47 rz 9 -1.266479676359572 47 rz 12 -2.247285483352666 47 rz 13 2.4159342270838273 47 rz 14 0.6575294970558225 47 rz 15 -0.6943481382159256 47 rz 16 2.0820576598306495 47 rz 17 -2.0965497593894646 47 rz 20 2.85490324093378 47 rz 21 2.6578831983232902 47 rz 22 -1.011294341633775 47 rz 23 0.8572256453934523 47 rz 24 2.6576143266414363 47 rz 25 -2.8073403480102357 47 rz 26 -0.15023573842493576 47 rz 27 0.3015071940516414 47 rz 29 2.3046797746528362 47 rz 30 -2.274067495322271 47 rz 31 -1.5488524138114137 47 rz 32 1.5893051717458953 47 rz 33 2.2867726872270815 47 rz 34 -2.0207251400645987 47 rz 35 0.03099481725460862 47 rz 36 0.29847349569027415 47 rz 38 2.2591836207174545 47 rz 39 -2.676219698428593 47 rz 40 0.6646378653250249 47 rz 41 -0.7043191256027974 47 rz 42 -1.5148966593048918 47 rz 43 2.081479450540872 47 rz 45 0.9978962235612805 47 rz 46 -0.9752743413094329 47 rz 47 -0.4075787788398024 47 rz 48 -0.9315290132303282 47 rz 50 -3.0851978326526712 47 rz 51 2.655091322766239 48 hz_1_2 0 48 x_1_2 1 48 hz_1_2 2 48 hz_1_2 3 48 hz_1_2 4 48 hz_1_2 5 48 hz_1_2 6 48 y_1_2 7 48 x_1_2 8 48 y_1_2 9 48 x_1_2 10 48 x_1_2 11 48 x_1_2 12 48 x_1_2 13 48 hz_1_2 14 48 x_1_2 15 48 x_1_2 16 48 y_1_2 17 48 hz_1_2 18 48 y_1_2 19 48 y_1_2 20 48 hz_1_2 21 48 x_1_2 22 48 x_1_2 23 48 x_1_2 24 48 hz_1_2 25 48 x_1_2 26 48 y_1_2 27 48 y_1_2 28 48 x_1_2 29 48 y_1_2 30 48 y_1_2 31 48 y_1_2 32 48 hz_1_2 33 48 x_1_2 34 48 y_1_2 35 48 hz_1_2 36 48 hz_1_2 37 48 y_1_2 38 48 y_1_2 39 48 y_1_2 40 48 x_1_2 41 48 x_1_2 42 48 y_1_2 43 48 y_1_2 44 48 y_1_2 45 48 hz_1_2 46 48 x_1_2 47 48 y_1_2 48 48 y_1_2 49 48 hz_1_2 50 48 x_1_2 51 48 x_1_2 52 49 rz 0 1.630092372701835 49 rz 1 -0.4908110844292288 49 rz 2 2.128274778737282 49 rz 3 -2.1132501782748783 49 rz 4 3.065559718606842 49 rz 5 -2.9433582401113654 49 rz 7 3.1307790245424165 49 rz 8 1.6843943349017856 49 rz 9 1.7648033692480884 49 rz 10 -2.5254974338340865 49 rz 11 0.947429993056634 49 rz 12 -0.2843250349710793 49 rz 13 -2.6569714463441194 49 rz 14 2.7951455055693053 49 rz 15 -1.817173723341597 49 rz 16 1.9059488281541235 49 rz 17 1.4111361997510556 49 rz 18 -2.346554181138192 49 rz 19 -2.903581423828964 49 rz 20 2.918360085831541 49 rz 21 -3.022012888048671 49 rz 22 2.1247537136336767 49 rz 23 0.11549835310747979 49 rz 24 -1.0741405453509039 49 rz 25 -0.5258430120926718 49 rz 26 0.37438596317905404 49 rz 28 -2.132826893473311 49 rz 29 2.8477977583049174 49 rz 30 -2.2493819657707412 49 rz 31 2.0013412685146292 49 rz 32 2.579223449944397 49 rz 33 -2.6407083710415673 49 rz 34 -1.1474889916497233 49 rz 35 1.8045230015591744 49 rz 37 -2.059225066734374 49 rz 38 2.078365008880919 49 rz 39 -0.8771427695997147 49 rz 40 0.8389071012493013 49 rz 41 -0.07335957987290165 49 rz 42 0.32894351146289225 49 rz 44 2.418210164928521 49 rz 45 -2.482644871644297 49 rz 46 -2.504559838843903 49 rz 47 2.303984840763902 49 rz 49 1.3202653736104892 49 rz 50 -1.0347464337239742 50 fs 0 1 1.5508555127616375 0.48773645023966805 50 fs 2 3 1.4860895179182787 0.49800223593597315 50 fs 4 5 1.5268891182960795 0.5146971591948788 50 fs 7 8 1.5004518396933153 0.541239891546859 50 fs 9 10 1.5996085979256793 0.5279139399675195 50 fs 11 12 1.5354845176224254 0.41898979144044296 50 fs 13 14 1.545842827888829 0.533679342490625 50 fs 15 16 1.5651524165810975 0.5296573901163858 50 fs 17 18 1.6240366191418867 0.48516108212176406 50 fs 19 20 1.6022614099028112 0.5001380228896306 50 fs 21 22 1.574931196238987 0.5236666378689078 50 fs 23 24 1.5238301684218176 0.47521120348925566 50 fs 25 26 1.5426970250652188 0.5200449092580564 50 fs 28 29 1.4235475054732074 0.5253841271266504 50 fs 30 31 1.511471063363894 0.4578807555552488 50 fs 32 33 1.5371762819242982 0.5674318212304278 50 fs 34 35 1.510414477168897 0.44988262527024675 50 fs 37 38 1.498535212903308 0.637164678333888 50 fs 39 40 1.507377591132129 0.47869828403704195 50 fs 41 42 1.48836082148729 0.46458301209227065 50 fs 44 45 1.5400981673597602 0.5128416009465753 50 fs 46 47 1.5860873970424136 0.4790438939428006 50 fs 49 50 1.5630547528566316 0.48589356877723594 51 rz 0 -0.9559206985776463 51 rz 1 2.0952019868502525 51 rz 2 -2.1926326069147954 51 rz 3 2.207657207377199 51 rz 4 2.8264340397005725 51 rz 5 -2.704232561205096 51 rz 7 -3.0614628485063697 51 rz 8 1.5934509007709854 51 rz 9 2.134333839512653 51 rz 10 -2.895027904098665 51 rz 11 -1.5818216419323328 51 rz 12 2.2449266000178874 51 rz 13 0.5111610620148745 51 rz 14 -0.37298700278968866 51 rz 15 -2.545247166305934 51 rz 16 2.634022271118461 51 rz 17 -0.8772774695566135 51 rz 18 -0.05814051183052626 51 rz 19 -1.5650365588307942 51 rz 20 1.5798152208333711 51 rz 21 -0.014075679627968185 51 rz 22 -0.8831834947870263 51 rz 23 -0.7730490002222332 51 rz 24 -0.18559319202119084 51 rz 25 0.8779083678113891 51 rz 26 -1.0293654167250068 51 rz 28 1.583687920165655 51 rz 29 -0.8687170553340486 51 rz 30 0.41090875396878346 51 rz 31 -0.6589494512249026 51 rz 32 -2.640142820599012 51 rz 33 2.578657899501845 51 rz 34 -0.1254692127204562 51 rz 35 0.7825032226299058 51 rz 37 1.381311719137738 51 rz 38 -1.3621717769911932 51 rz 39 1.639902891466658 51 rz 40 -1.6781385598170713 51 rz 41 0.2643561598993518 51 rz 42 -0.00877222830935942 51 rz 44 0.2459348862063706 51 rz 45 -0.3103695929221324 51 rz 46 1.5946302887434871 51 rz 47 -1.7952052868234893 51 rz 49 0.6525631822286719 51 rz 50 -0.3670442423421587 52 y_1_2 0 52 y_1_2 1 52 x_1_2 2 52 y_1_2 3 52 x_1_2 4 52 x_1_2 5 52 y_1_2 6 52 hz_1_2 7 52 y_1_2 8 52 hz_1_2 9 52 y_1_2 10 52 y_1_2 11 52 y_1_2 12 52 y_1_2 13 52 y_1_2 14 52 hz_1_2 15 52 hz_1_2 16 52 hz_1_2 17 52 x_1_2 18 52 x_1_2 19 52 x_1_2 20 52 y_1_2 21 52 y_1_2 22 52 hz_1_2 23 52 hz_1_2 24 52 x_1_2 25 52 hz_1_2 26 52 hz_1_2 27 52 hz_1_2 28 52 y_1_2 29 52 x_1_2 30 52 x_1_2 31 52 hz_1_2 32 52 y_1_2 33 52 y_1_2 34 52 hz_1_2 35 52 x_1_2 36 52 x_1_2 37 52 hz_1_2 38 52 x_1_2 39 52 x_1_2 40 52 hz_1_2 41 52 y_1_2 42 52 x_1_2 43 52 x_1_2 44 52 hz_1_2 45 52 x_1_2 46 52 hz_1_2 47 52 x_1_2 48 52 hz_1_2 49 52 y_1_2 50 52 hz_1_2 51 52 y_1_2 52 53 rz 3 -2.3755131052498903 53 rz 4 2.4559483587303994 53 rz 6 -2.6437284112635204 53 rz 7 1.0757071230525703 53 rz 8 -3.1386613971395816 53 rz 9 -2.4958798082685156 53 rz 12 2.740368332719296 53 rz 13 -2.571719588988149 53 rz 14 -2.082629114083989 53 rz 15 2.0458104729239004 53 rz 16 -1.3961183702982076 53 rz 17 1.3816262707393925 53 rz 20 -2.4226662875443203 53 rz 21 1.6522674196218077 53 rz 22 0.510572092448772 53 rz 23 -0.6646407886890948 53 rz 24 2.8240890571375132 53 rz 25 -2.9738150785063127 53 rz 26 -0.7165259926064813 53 rz 27 0.8677974482331727 53 rz 29 -1.5191187762344747 53 rz 30 1.5497310555650365 53 rz 31 -2.5078236698092695 53 rz 32 2.548276427743751 53 rz 33 2.5682610962116676 53 rz 34 -2.302213549049185 53 rz 35 -2.762784430270724 53 rz 36 3.0922527432156066 53 rz 38 2.5636691231704027 53 rz 39 -2.9807052008815553 53 rz 40 1.8896363055772518 53 rz 41 -1.9293175658550261 53 rz 42 -2.9944080313570858 53 rz 43 -2.7221944845865202 53 rz 45 1.4632915669594873 53 rz 46 -1.4406696847076397 53 rz 47 1.4850571985542622 53 rz 48 -2.824164990624393 53 rz 50 1.6573898563243876 53 rz 51 -2.0874963662108197 54 fs 3 4 1.483304234663135 0.4930986258758784 54 fs 6 7 1.5160176987076064 0.49850252902921577 54 fs 8 9 1.5338611249160479 0.5011308712767845 54 fs 12 13 1.480179689158691 0.4772322221553844 54 fs 14 15 1.5152260103068818 0.49796235787029736 54 fs 16 17 1.5284924549164072 0.5160847019657471 54 fs 20 21 1.58661284381037 0.475779832809368 54 fs 22 23 1.5333295850816209 0.44983388105304506 54 fs 24 25 1.5158107733607835 0.4663776718737318 54 fs 26 27 1.5645151084457722 0.47497942677256283 54 fs 29 30 1.5659881784786247 0.5656290235103623 54 fs 31 32 1.5211879663086973 0.5056110683638391 54 fs 33 34 1.5083349422212171 0.49641600818144604 54 fs 35 36 1.5087002777200382 0.44025777694304247 54 fs 38 39 1.5658333118222365 0.47264531483343447 54 fs 40 41 1.5219378850865568 0.5335829954491795 54 fs 42 43 1.5501487671051402 0.4404117539373896 54 fs 45 46 1.4825325148661492 0.6857341218223484 54 fs 47 48 1.4941963673904604 0.45895108234543025 54 fs 50 51 1.5487430259667763 0.4467898473637848 55 rz 3 2.0428273908381875 55 rz 4 -1.9623921373576785 55 rz 6 0.18385815399087235 55 rz 7 -1.7518794422018225 55 rz 8 2.3800794908625056 55 rz 9 -1.7314353890910164 55 rz 12 -2.4860465250255466 55 rz 13 2.6546952687566936 55 rz 14 2.976024875405084 55 rz 15 -3.012843516565173 55 rz 16 1.3909072760408385 55 rz 17 -1.4053993755996537 55 rz 20 -1.7946538863790167 55 rz 21 1.024255018456497 55 rz 22 -2.399878294520544 55 rz 23 2.2458095982802213 55 rz 24 -1.526987087940121 55 rz 25 1.3772610665713216 55 rz 26 -0.37643040948330864 55 rz 27 0.5277018651100001 55 rz 29 1.600963020248731 55 rz 30 -1.570350740918169 55 rz 31 1.4733597189419427 55 rz 32 -1.4329069610074612 55 rz 33 -2.3690676253930683 55 rz 34 2.635115172555551 55 rz 35 2.827012278949393 55 rz 36 -2.4975439660045105 55 rz 38 2.4979446623903208 55 rz 39 -2.9149807401014733 55 rz 40 -0.2652735601374516 55 rz 41 0.2255922998596791 55 rz 42 1.5135986587556154 55 rz 43 -0.9470158675196352 55 rz 45 -0.6357319563055093 55 rz 46 0.6583538385573569 55 rz 47 -0.8599681209567329 55 rz 48 -0.4791396711133978 55 rz 50 -1.6903306944587497 55 rz 51 1.2602241845723174 56 x_1_2 0 56 hz_1_2 1 56 y_1_2 2 56 hz_1_2 3 56 y_1_2 4 56 hz_1_2 5 56 hz_1_2 6 56 x_1_2 7 56 hz_1_2 8 56 x_1_2 9 56 x_1_2 10 56 x_1_2 11 56 hz_1_2 12 56 x_1_2 13 56 x_1_2 14 56 x_1_2 15 56 y_1_2 16 56 y_1_2 17 56 hz_1_2 18 56 hz_1_2 19 56 hz_1_2 20 56 x_1_2 21 56 hz_1_2 22 56 x_1_2 23 56 y_1_2 24 56 hz_1_2 25 56 y_1_2 26 56 x_1_2 27 56 y_1_2 28 56 hz_1_2 29 56 y_1_2 30 56 y_1_2 31 56 y_1_2 32 56 hz_1_2 33 56 x_1_2 34 56 x_1_2 35 56 hz_1_2 36 56 hz_1_2 37 56 y_1_2 38 56 hz_1_2 39 56 hz_1_2 40 56 y_1_2 41 56 hz_1_2 42 56 y_1_2 43 56 y_1_2 44 56 x_1_2 45 56 hz_1_2 46 56 y_1_2 47 56 hz_1_2 48 56 y_1_2 49 56 x_1_2 50 56 y_1_2 51 56 x_1_2 52 57 rz 1 -1.0042460679977587 57 rz 4 1.211019634649741 57 rz 3 2.5611170644354395 57 rz 7 2.203439780633385 57 rz 5 -0.38395274904677024 57 rz 9 1.0666567272142373 57 rz 6 -0.7367651533883155 57 rz 13 0.8374776004244175 57 rz 8 -0.17868286064434002 57 rz 15 0.11747938673157776 57 rz 10 1.5104174122236689 57 rz 17 -1.348930086362488 57 rz 12 2.02517395103893 57 rz 21 -2.4604134560861723 57 rz 14 1.2385297496877783 57 rz 23 -1.012640981830316 57 rz 16 1.278712306749437 57 rz 25 -1.2260287418490243 57 rz 18 -0.32922282245649015 57 rz 27 0.3503051885470789 57 rz 20 1.9963911091351354 57 rz 30 -1.9863246113059425 57 rz 22 2.560085279880081 57 rz 32 -2.706827116911871 57 rz 24 -2.1648603479217563 57 rz 34 2.7520216157706763 57 rz 26 -0.93947912902971 57 rz 36 0.8888923392116617 57 rz 29 2.872825541436601 57 rz 37 -2.8017755384781644 57 rz 31 0.9187281553988846 57 rz 39 -2.1745105154455864 57 rz 33 -2.0156756803100784 57 rz 41 1.7777292963680542 57 rz 35 1.775555819710366 57 rz 43 -1.5833051927135777 57 rz 38 -0.4067204405933929 57 rz 44 0.38136485494140615 57 rz 40 -1.251753066448206 57 rz 46 1.2488390144726758 57 rz 42 2.4327287941771765 57 rz 48 2.9672040588228477 57 rz 45 -0.9011942920163812 57 rz 49 0.7693392255513949 57 rz 47 -1.7012014312264405 57 rz 51 1.680309883338676 57 rz 50 1.0083588951354692 57 rz 52 -2.1353460363647407 58 fs 1 4 1.5157741664069029 0.5567125777723744 58 fs 3 7 1.5177580142209797 0.4948108578225166 58 fs 5 9 1.6036738621219824 0.47689957001758815 58 fs 6 13 1.5177327089642791 0.5058312223892585 58 fs 8 15 1.5253184444076096 0.46557175536519374 58 fs 10 17 1.6141004604574274 0.494343440675308 58 fs 12 21 1.5476810407275208 0.44290174465702487 58 fs 14 23 1.5237261387830179 0.4696616122846161 58 fs 16 25 1.5285844942020295 0.5736654641906893 58 fs 18 27 1.5483159975149505 0.4961408893973623 58 fs 20 30 1.6377079485605028 0.6888985951517526 58 fs 22 32 1.529949914236052 0.48258847574702635 58 fs 24 34 1.5280421758407217 0.5109767145462891 58 fs 26 36 1.5120782868771674 0.4815152809861558 58 fs 29 37 1.5071938854285831 0.5089276063739265 58 fs 31 39 1.5460100224551203 0.5302403303961576 58 fs 33 41 1.5166625940397171 0.4517159790427676 58 fs 35 43 1.4597689731864314 0.4214985958536156 58 fs 38 44 1.535649445690472 0.47076284376181704 58 fs 40 46 1.5179778495708582 0.5221350266177334 58 fs 42 48 1.4969321270213238 0.4326117171327162 58 fs 45 49 1.5114987201637704 0.4914319343687703 58 fs 47 51 1.4908807480930255 0.4886243720131578 58 fs 50 52 1.616256999726831 0.501428936283957 59 rz 1 1.043616923832726 59 rz 4 -0.8368433571807435 59 rz 3 3.1220852350910597 59 rz 7 1.6424716099777648 59 rz 5 0.3743336964849391 59 rz 9 0.308370281682528 59 rz 6 2.3972317846187146 59 rz 13 -2.2965193375826125 59 rz 8 -1.1240623535442573 59 rz 15 1.062858879631495 59 rz 10 -0.1437578592593649 59 rz 17 0.30524518512054577 59 rz 12 2.1713939401742977 59 rz 21 -2.60663344522154 59 rz 14 -0.5009522730026106 59 rz 23 0.726841040860073 59 rz 16 1.9251996291823195 59 rz 25 -1.8725160642819072 59 rz 18 -0.4305096611549608 59 rz 27 0.4515920272455496 59 rz 20 0.48007117664790755 59 rz 30 -0.47000467881871444 59 rz 22 -2.248431474302169 59 rz 32 2.101689637270379 59 rz 24 2.66811260152112 59 rz 34 -2.0809513336722 59 rz 26 1.7152775678974275 59 rz 36 -1.7658643577154756 59 rz 29 1.1244456567401464 59 rz 37 -1.0533956537817097 59 rz 31 2.728496425175546 59 rz 39 2.2989065219573384 59 rz 33 1.64900549449624 59 rz 41 -1.8869518784382644 59 rz 35 2.3127570174787984 59 rz 43 -2.12050639048201 59 rz 38 1.7764788344350357 59 rz 44 -1.8018344200870224 59 rz 40 2.095013865443942 59 rz 46 -2.0979279174194723 59 rz 42 1.653716226670287 59 rz 48 -2.5369686808498493 59 rz 45 0.138643267686124 59 rz 49 -0.27049833415111024 59 rz 47 1.3284365452341511 59 rz 51 -1.3493280931219154 59 rz 50 1.273805728814768 59 rz 52 -2.4007928700440395 60 y_1_2 0 60 x_1_2 1 60 x_1_2 2 60 x_1_2 3 60 hz_1_2 4 60 y_1_2 5 60 x_1_2 6 60 hz_1_2 7 60 x_1_2 8 60 hz_1_2 9 60 hz_1_2 10 60 y_1_2 11 60 x_1_2 12 60 hz_1_2 13 60 y_1_2 14 60 hz_1_2 15 60 hz_1_2 16 60 x_1_2 17 60 x_1_2 18 60 x_1_2 19 60 y_1_2 20 60 y_1_2 21 60 y_1_2 22 60 hz_1_2 23 60 x_1_2 24 60 x_1_2 25 60 x_1_2 26 60 y_1_2 27 60 x_1_2 28 60 x_1_2 29 60 x_1_2 30 60 x_1_2 31 60 hz_1_2 32 60 y_1_2 33 60 hz_1_2 34 60 hz_1_2 35 60 y_1_2 36 60 x_1_2 37 60 x_1_2 38 60 y_1_2 39 60 y_1_2 40 60 hz_1_2 41 60 y_1_2 42 60 x_1_2 43 60 x_1_2 44 60 y_1_2 45 60 x_1_2 46 60 hz_1_2 47 60 y_1_2 48 60 hz_1_2 49 60 hz_1_2 50 60 x_1_2 51 60 hz_1_2 52 61 rz 0 -1.7648951998829254 61 rz 3 2.548911269482648 61 rz 2 1.7258568315739744 61 rz 6 -1.7226182269162147 61 rz 4 2.433814943485249 61 rz 8 -2.4328955614230345 61 rz 7 -2.4817427187562195 61 rz 14 -2.444069576051536 61 rz 9 -0.2188858521637691 61 rz 16 0.8206681539973388 61 rz 11 -1.9818532759695913 61 rz 20 2.235243601077677 61 rz 13 1.8783691504403919 61 rz 22 -1.9775630657518377 61 rz 15 0.4098394316583516 61 rz 24 -0.27319363628972226 61 rz 17 -1.0125583111278793 61 rz 26 1.0693409628218653 61 rz 19 -2.5773361510746504 61 rz 29 2.560919692731769 61 rz 21 0.5629870484030199 61 rz 31 -2.0374186372308394 61 rz 23 -1.9029706280830432 61 rz 33 2.225939639471658 61 rz 25 -0.6212908711541765 61 rz 35 0.5208476958013755 61 rz 30 0.023197586681835247 61 rz 38 -0.018875390156846805 61 rz 32 2.4814954193718997 61 rz 40 -2.4565358028507625 61 rz 34 -3.047875630422194 61 rz 42 -2.7884170505657018 61 rz 39 -0.0026281089039521532 61 rz 45 -0.0822385071365126 61 rz 41 -0.023915307514773332 61 rz 47 -0.11525924941443932 61 rz 46 -2.417319256068165 61 rz 50 2.513158725061576 62 fs 0 3 1.5192859850645715 0.49387245572956845 62 fs 2 6 1.5120572609259932 0.5211713721957417 62 fs 4 8 1.615096254724942 0.7269644142795206 62 fs 7 14 1.5269188098932545 0.5036266469194081 62 fs 9 16 1.5179602369002039 0.4914328237769214 62 fs 11 20 1.537427483096926 0.45115204759967975 62 fs 13 22 1.53486366638317 0.46559889697604934 62 fs 15 24 1.5194586006330344 0.5068560732280918 62 fs 17 26 1.5819908111894527 0.5595875596558442 62 fs 19 29 1.5070579127771144 0.4520319437379419 62 fs 21 31 1.527311970249325 0.4920204543143157 62 fs 23 33 1.5139592614725292 0.45916943035876673 62 fs 25 35 1.5425204049671604 0.5057437054391503 62 fs 30 38 1.5432564804093452 0.5658780292653538 62 fs 32 40 1.4611081680611278 0.5435451345370095 62 fs 34 42 1.4529959991143482 0.43830813863531964 62 fs 39 45 1.6239619425876082 0.4985036227887135 62 fs 41 47 1.4884560669186362 0.4964777432807688 62 fs 46 50 1.5034760541420213 0.5004774067921798 63 rz 0 2.3143363878221983 63 rz 3 -1.5303203182224756 63 rz 2 -2.310971712534222 63 rz 6 2.314210317191982 63 rz 4 1.3561297513880781 63 rz 8 -1.3552103693258637 63 rz 7 -1.2320263790522183 63 rz 14 2.589399391424049 63 rz 9 0.6940061879624011 63 rz 16 -0.09222388612883847 63 rz 11 2.5191898881755677 63 rz 20 -2.265799563067482 63 rz 13 -1.2007534912484772 63 rz 22 1.1015595759370314 63 rz 15 -1.1182426083620953 63 rz 24 1.2548884037307282 63 rz 17 -1.7828278944345008 63 rz 26 1.8396105461284868 63 rz 19 2.284805503371384 63 rz 29 -2.3012219617142655 63 rz 21 -1.418135929264718 63 rz 31 -0.05629565956310145 63 rz 23 -1.9721524216476318 63 rz 33 2.295121433036247 63 rz 25 1.9094492080392735 63 rz 35 -2.0098923833920743 63 rz 30 -1.9059766198761885 63 rz 38 1.910298816401177 63 rz 32 -2.6726859076002505 63 rz 40 2.6976455241213877 63 rz 34 1.6537933875250879 63 rz 42 -1.2069007613333973 63 rz 39 -1.9473894467800257 63 rz 45 1.862522830739561 63 rz 41 -0.16699899620866532 63 rz 47 0.027824439279452662 63 rz 46 1.269996319743118 63 rz 50 -1.174156850749707 64 x_1_2 0 64 hz_1_2 1 64 y_1_2 2 64 y_1_2 3 64 x_1_2 4 64 x_1_2 5 64 y_1_2 6 64 y_1_2 7 64 y_1_2 8 64 x_1_2 9 64 x_1_2 10 64 hz_1_2 11 64 hz_1_2 12 64 x_1_2 13 64 hz_1_2 14 64 x_1_2 15 64 y_1_2 16 64 y_1_2 17 64 y_1_2 18 64 y_1_2 19 64 x_1_2 20 64 hz_1_2 21 64 hz_1_2 22 64 x_1_2 23 64 y_1_2 24 64 y_1_2 25 64 hz_1_2 26 64 hz_1_2 27 64 hz_1_2 28 64 hz_1_2 29 64 y_1_2 30 64 hz_1_2 31 64 x_1_2 32 64 x_1_2 33 64 x_1_2 34 64 x_1_2 35 64 hz_1_2 36 64 hz_1_2 37 64 y_1_2 38 64 hz_1_2 39 64 x_1_2 40 64 x_1_2 41 64 hz_1_2 42 64 y_1_2 43 64 hz_1_2 44 64 hz_1_2 45 64 hz_1_2 46 64 y_1_2 47 64 x_1_2 48 64 x_1_2 49 64 y_1_2 50 64 hz_1_2 51 64 x_1_2 52 65 rz 1 -2.392830020884542 65 rz 4 2.5996035875365244 65 rz 3 -1.1710950080293934 65 rz 7 -0.3475334540813684 65 rz 5 2.4120647126480144 65 rz 9 -1.7293607344805475 65 rz 6 1.8204912666338018 65 rz 13 -1.7197788195976997 65 rz 8 0.2799896667797519 65 rz 15 -0.34119314069251416 65 rz 10 2.4403288376863532 65 rz 17 -2.2788415118251724 65 rz 12 -1.4682770797530225 65 rz 21 1.03303757470578 65 rz 14 -2.4873991374696907 65 rz 23 2.713287905327153 65 rz 16 0.33623451067246535 65 rz 25 -0.28355094577205264 65 rz 18 2.6867061249895166 65 rz 27 -2.6656237588989278 65 rz 20 0.1428514435171131 65 rz 30 -0.1327849456879342 65 rz 22 -3.0193832728953858 65 rz 32 2.87264143586361 65 rz 24 -1.2286657371519318 65 rz 34 1.8158270050008376 65 rz 26 -0.7007180873568295 65 rz 36 0.6501312975387954 65 rz 29 1.232914176262657 65 rz 37 -1.1618641733042203 65 rz 31 -0.9536610661405654 65 rz 39 -0.3021212939061364 65 rz 33 -1.5570031528859865 65 rz 41 1.3190567689439625 65 rz 35 -1.9566562527542393 65 rz 43 2.148906879751028 65 rz 38 -2.027782249845867 65 rz 44 2.0024266641939086 65 rz 40 -3.1052927320662 65 rz 46 3.102378680090684 65 rz 42 2.4264456088700292 65 rz 48 2.973487244129995 65 rz 45 1.4173010863328663 65 rz 49 -1.5491561527978526 65 rz 47 1.3147275162197793 65 rz 51 -1.3356190641075436 65 rz 50 1.234553566193842 65 rz 52 -2.3615407074230994 66 fs 1 4 1.5157741664069029 0.5567125777723744 66 fs 3 7 1.5177580142209797 0.4948108578225166 66 fs 5 9 1.6036738621219824 0.47689957001758815 66 fs 6 13 1.5177327089642791 0.5058312223892585 66 fs 8 15 1.5253184444076096 0.46557175536519374 66 fs 10 17 1.6141004604574274 0.494343440675308 66 fs 12 21 1.5476810407275208 0.44290174465702487 66 fs 14 23 1.5237261387830179 0.4696616122846161 66 fs 16 25 1.5285844942020295 0.5736654641906893 66 fs 18 27 1.5483159975149505 0.4961408893973623 66 fs 20 30 1.6377079485605028 0.6888985951517526 66 fs 22 32 1.529949914236052 0.48258847574702635 66 fs 24 34 1.5280421758407217 0.5109767145462891 66 fs 26 36 1.5120782868771674 0.4815152809861558 66 fs 29 37 1.5071938854285831 0.5089276063739265 66 fs 31 39 1.5460100224551203 0.5302403303961576 66 fs 33 41 1.5166625940397171 0.4517159790427676 66 fs 35 43 1.4597689731864314 0.4214985958536156 66 fs 38 44 1.535649445690472 0.47076284376181704 66 fs 40 46 1.5179778495708582 0.5221350266177334 66 fs 42 48 1.4969321270213238 0.4326117171327162 66 fs 45 49 1.5114987201637704 0.4914319343687703 66 fs 47 51 1.4908807480930255 0.4886243720131578 66 fs 50 52 1.616256999726831 0.501428936283957 67 rz 1 2.4322008767195094 67 rz 4 -2.225427310067527 67 rz 3 0.5711120003763064 67 rz 7 -2.089740462487068 67 rz 5 -2.4216837652098455 67 rz 9 3.1043877433773126 67 rz 6 -0.16002463540340273 67 rz 13 0.2607370824395048 67 rz 8 -1.582734880968349 67 rz 15 1.521531407055587 67 rz 10 -1.0736692847220493 67 rz 17 1.2351566105832301 67 rz 12 -0.6183403362133362 67 rz 21 0.18310083116609377 67 rz 14 -3.058208693024728 67 rz 23 -2.999087846297396 67 rz 16 2.8676774252592914 67 rz 25 -2.8149938603588787 67 rz 18 2.8367466985786187 67 rz 27 -2.81566433248803 67 rz 20 2.3336108422659017 67 rz 30 -2.3235443444367228 67 rz 22 -2.9521482287062746 67 rz 32 2.8054063916744987 67 rz 24 1.731917990751281 67 rz 34 -1.1447567229023754 67 rz 26 1.476516526224561 67 rz 36 -1.527103316042595 67 rz 29 2.7643570219140905 67 rz 37 -2.693307018955654 67 rz 31 -1.6822996604645901 67 rz 39 0.4265173004178884 67 rz 33 1.1903329670721483 67 rz 41 -1.4282793510141722 67 rz 35 -0.23821621723618236 67 rz 43 0.43046684423297066 67 rz 38 -2.885644663492048 67 rz 44 2.86028907784009 67 rz 40 -2.334631776117636 67 rz 46 2.33171772414212 67 rz 42 1.6599994119774346 67 rz 48 -2.5432518661569965 67 rz 45 -2.1798521106631235 67 rz 49 2.047997044198137 67 rz 47 -1.6874924022120688 67 rz 51 1.6666008543243045 67 rz 50 1.0476110577564093 67 rz 52 -2.1745981989856666 68 y_1_2 0 68 y_1_2 1 68 x_1_2 2 68 hz_1_2 3 68 y_1_2 4 68 hz_1_2 5 68 hz_1_2 6 68 hz_1_2 7 68 x_1_2 8 68 hz_1_2 9 68 hz_1_2 10 68 x_1_2 11 68 x_1_2 12 68 hz_1_2 13 68 x_1_2 14 68 hz_1_2 15 68 x_1_2 16 68 hz_1_2 17 68 x_1_2 18 68 x_1_2 19 68 hz_1_2 20 68 x_1_2 21 68 y_1_2 22 68 y_1_2 23 68 hz_1_2 24 68 hz_1_2 25 68 y_1_2 26 68 x_1_2 27 68 x_1_2 28 68 x_1_2 29 68 hz_1_2 30 68 y_1_2 31 68 hz_1_2 32 68 y_1_2 33 68 y_1_2 34 68 y_1_2 35 68 x_1_2 36 68 x_1_2 37 68 x_1_2 38 68 y_1_2 39 68 hz_1_2 40 68 hz_1_2 41 68 x_1_2 42 68 x_1_2 43 68 y_1_2 44 68 y_1_2 45 68 x_1_2 46 68 hz_1_2 47 68 hz_1_2 48 68 hz_1_2 49 68 x_1_2 50 68 y_1_2 51 68 hz_1_2 52 69 rz 0 2.438555770620294 69 rz 3 -1.6545397010205856 69 rz 2 -1.296355301179382 69 rz 6 1.299593905837142 69 rz 4 1.045230990598693 69 rz 8 -1.0443116085364643 69 rz 7 3.110292204633769 69 rz 14 -1.752919192261924 69 rz 9 -2.549947601127311 69 rz 16 -3.1314554042187055 69 rz 11 0.11044743132129044 69 rz 20 0.14294289378679537 69 rz 13 -0.9176483112545988 69 rz 22 0.818454395943153 69 rz 15 -1.6887444609396702 69 rz 24 1.8253902563083138 69 rz 17 -1.9487529218977038 69 rz 26 2.005535573591704 69 rz 19 -2.33857510940177 69 rz 29 2.3221586510589027 69 rz 21 -1.0580747608492551 69 rz 31 -0.4163568279785643 69 rz 23 -0.030581406543593204 69 rz 33 0.3535504179322082 69 rz 25 3.1109212013104433 69 rz 35 3.071820930516342 69 rz 30 -3.011580916685812 69 rz 38 3.0159031132108005 69 rz 32 -1.7156723658239448 69 rz 40 1.7406319823450822 69 rz 34 -3.0541588157295543 69 rz 42 -2.7821338652583556 69 rz 39 -2.5536013436189187 69 rz 45 2.468734727578454 69 rz 41 -2.57488854222974 69 rz 47 2.435713985300527 69 rz 46 2.2259546859374773 69 rz 50 -2.1301152169440662 70 fs 0 3 1.5192859850645715 0.49387245572956845 70 fs 2 6 1.5120572609259932 0.5211713721957417 70 fs 4 8 1.615096254724942 0.7269644142795206 70 fs 7 14 1.5269188098932545 0.5036266469194081 70 fs 9 16 1.5179602369002039 0.4914328237769214 70 fs 11 20 1.537427483096926 0.45115204759967975 70 fs 13 22 1.53486366638317 0.46559889697604934 70 fs 15 24 1.5194586006330344 0.5068560732280918 70 fs 17 26 1.5819908111894527 0.5595875596558442 70 fs 19 29 1.5070579127771144 0.4520319437379419 70 fs 21 31 1.527311970249325 0.4920204543143157 70 fs 23 33 1.5139592614725292 0.45916943035876673 70 fs 25 35 1.5425204049671604 0.5057437054391503 70 fs 30 38 1.5432564804093452 0.5658780292653538 70 fs 32 40 1.4611081680611278 0.5435451345370095 70 fs 34 42 1.4529959991143482 0.43830813863531964 70 fs 39 45 1.6239619425876082 0.4985036227887135 70 fs 41 47 1.4884560669186362 0.4964777432807688 70 fs 46 50 1.5034760541420213 0.5004774067921798 71 rz 0 -1.8891145826810067 71 rz 3 2.6731306522807152 71 rz 2 0.7112404202191343 71 rz 6 -0.7080018155613743 71 rz 4 2.7447137042746625 71 rz 8 -2.743794322212434 71 rz 7 -0.5408759952626063 71 rz 14 1.8982490076344511 71 rz 9 3.02506793692595 71 rz 16 -2.4232856350923804 71 rz 11 0.42688918088468597 71 rz 20 -0.17349885577660018 71 rz 13 1.5952639704465135 71 rz 22 -1.6944578857579593 71 rz 15 0.9803412842359371 71 rz 24 -0.8436954888672935 71 rz 17 -0.8466332836646622 71 rz 26 0.9034159353586623 71 rz 19 2.046044461698518 71 rz 29 -2.062460920041385 71 rz 21 0.20292587998757128 71 rz 31 -1.6773574688153907 71 rz 23 2.4386436639925044 71 rz 33 -2.1156746526038894 71 rz 25 -1.8227628644253466 71 rz 35 1.7223196890725454 71 rz 30 1.1288018834914588 71 rz 38 -1.1244796869664704 71 rz 32 1.5244818775955942 71 rz 40 -1.499522261074457 71 rz 34 1.6600765728324343 71 rz 42 -1.2131839466407577 71 rz 39 0.6035837879349408 71 rz 45 -0.6884504039754056 71 rz 41 2.383974238506301 71 rz 47 -2.523148795435514 71 rz 46 2.909907684917062 71 rz 50 -2.814068215923651 72 hz_1_2 0 72 x_1_2 1 72 hz_1_2 2 72 y_1_2 3 72 x_1_2 4 72 x_1_2 5 72 x_1_2 6 72 x_1_2 7 72 y_1_2 8 72 x_1_2 9 72 x_1_2 10 72 hz_1_2 11 72 y_1_2 12 72 y_1_2 13 72 hz_1_2 14 72 y_1_2 15 72 y_1_2 16 72 y_1_2 17 72 y_1_2 18 72 hz_1_2 19 72 y_1_2 20 72 hz_1_2 21 72 x_1_2 22 72 x_1_2 23 72 y_1_2 24 72 y_1_2 25 72 hz_1_2 26 72 y_1_2 27 72 hz_1_2 28 72 y_1_2 29 72 y_1_2 30 72 hz_1_2 31 72 y_1_2 32 72 x_1_2 33 72 hz_1_2 34 72 x_1_2 35 72 hz_1_2 36 72 y_1_2 37 72 y_1_2 38 72 x_1_2 39 72 x_1_2 40 72 x_1_2 41 72 y_1_2 42 72 y_1_2 43 72 x_1_2 44 72 hz_1_2 45 72 hz_1_2 46 72 x_1_2 47 72 x_1_2 48 72 y_1_2 49 72 hz_1_2 50 72 x_1_2 51 72 y_1_2 52 73 rz 0 0.9703579154481866 73 rz 1 0.16892337282441972 73 rz 2 2.1094252228158403 73 rz 3 -2.0944006223534224 73 rz 4 1.6832589510276215 73 rz 5 -1.561057472532159 73 rz 7 -0.9909905369668373 73 rz 8 -0.47702141076854687 73 rz 9 0.3385203045184362 73 rz 10 -1.099214369104434 73 rz 11 0.23743005334558018 73 rz 12 0.4256749047399815 73 rz 13 -1.9846706184759488 73 rz 14 2.1228446777011634 73 rz 15 0.9851269236603387 73 rz 16 -0.8963518188478083 73 rz 17 2.7997201526378284 73 rz 18 2.548047173154618 73 rz 19 -0.7987143459235782 73 rz 20 0.8134930079261657 73 rz 21 -0.21342905573918006 73 rz 22 -0.6838301186758251 73 rz 23 -1.9579527982619673 73 rz 24 0.9993106060185575 73 rz 25 1.5664576951982099 73 rz 26 -1.7179147441118288 73 rz 28 2.799473572662375 73 rz 29 -2.0845027078308256 73 rz 30 -0.16964762909437425 73 rz 31 -0.0783930681617484 73 rz 32 -2.315377904348413 73 rz 33 2.2538929832512444 73 rz 34 0.9448117156405385 73 rz 35 -0.28777770573108796 73 rz 37 2.1505090890763903 73 rz 38 -2.1313691469298313 73 rz 39 1.9314410627097838 73 rz 40 -1.9696767310601861 73 rz 41 -0.06707639456596226 73 rz 42 0.3226603261559582 73 rz 44 -1.0878072364775129 73 rz 45 1.0233725297617475 73 rz 46 -1.8071262697473556 73 rz 47 1.606551271667354 73 rz 49 0.6291149898208808 73 rz 50 -0.34359604993436577 74 fs 0 1 1.5508555127616375 0.48773645023966805 74 fs 2 3 1.4860895179182787 0.49800223593597315 74 fs 4 5 1.5268891182960795 0.5146971591948788 74 fs 7 8 1.5004518396933153 0.541239891546859 74 fs 9 10 1.5996085979256793 0.5279139399675195 74 fs 11 12 1.5354845176224254 0.41898979144044296 74 fs 13 14 1.545842827888829 0.533679342490625 74 fs 15 16 1.5651524165810975 0.5296573901163858 74 fs 17 18 1.6240366191418867 0.48516108212176406 74 fs 19 20 1.6022614099028112 0.5001380228896306 74 fs 21 22 1.574931196238987 0.5236666378689078 74 fs 23 24 1.5238301684218176 0.47521120348925566 74 fs 25 26 1.5426970250652188 0.5200449092580564 74 fs 28 29 1.4235475054732074 0.5253841271266504 74 fs 30 31 1.511471063363894 0.4578807555552488 74 fs 32 33 1.5371762819242982 0.5674318212304278 74 fs 34 35 1.510414477168897 0.44988262527024675 74 fs 37 38 1.498535212903308 0.637164678333888 74 fs 39 40 1.507377591132129 0.47869828403704195 74 fs 41 42 1.48836082148729 0.46458301209227065 74 fs 44 45 1.5400981673597602 0.5128416009465753 74 fs 46 47 1.5860873970424136 0.4790438939428006 74 fs 49 50 1.5630547528566316 0.48589356877723594 75 rz 0 -0.29618624132399773 75 rz 1 1.435467529596604 75 rz 2 -2.1737830509933396 75 rz 3 2.1888076514557575 75 rz 4 -2.0744504998998003 75 rz 5 2.1966519783952627 75 rz 7 1.060306713002884 75 rz 8 -2.528318660738268 75 rz 9 -2.7225684029372665 75 rz 10 1.9618743383512685 75 rz 11 -0.871821702221279 75 rz 12 1.5349266603068408 75 rz 13 -0.1611397658532674 75 rz 14 0.2993138250784817 75 rz 15 0.9356374938717202 75 rz 16 -0.8468623890591899 75 rz 17 -2.2658614224433826 75 rz 18 1.330443441056243 75 rz 19 2.61328167044341 75 rz 20 -2.5985030084408223 75 rz 21 -2.82265951193747 75 rz 22 1.925400337522465 75 rz 23 1.300402151147214 75 rz 24 -2.2590443433906238 75 rz 25 -1.2143923394794927 75 rz 26 1.0629352905658749 75 rz 28 2.9345727612095267 75 rz 29 -2.219601896377977 75 rz 30 -1.6688255827076013 75 rz 31 1.4207848854514786 75 rz 32 2.2544585336938034 75 rz 33 -2.315943454790972 75 rz 34 -2.217769920010719 75 rz 35 2.8748039299201675 75 rz 37 -2.8284224366730264 75 rz 38 2.8475623788195854 75 rz 39 -1.1686809408428296 75 rz 40 1.1304452724924268 75 rz 41 0.2580729745924124 75 rz 42 -0.00248904300241648 75 rz 44 -2.5312330195671713 75 rz 45 2.466798312851406 75 rz 46 0.8971967196469395 75 rz 47 -1.0977717177269426 75 rz 49 1.3437135660182769 75 rz 50 -1.0581946261317619 76 y_1_2 0 76 y_1_2 1 76 x_1_2 2 76 x_1_2 3 76 hz_1_2 4 76 hz_1_2 5 76 y_1_2 6 76 hz_1_2 7 76 x_1_2 8 76 hz_1_2 9 76 y_1_2 10 76 y_1_2 11 76 hz_1_2 12 76 hz_1_2 13 76 y_1_2 14 76 hz_1_2 15 76 x_1_2 16 76 x_1_2 17 76 hz_1_2 18 76 x_1_2 19 76 x_1_2 20 76 y_1_2 21 76 y_1_2 22 76 y_1_2 23 76 x_1_2 24 76 hz_1_2 25 76 y_1_2 26 76 hz_1_2 27 76 y_1_2 28 76 hz_1_2 29 76 hz_1_2 30 76 x_1_2 31 76 x_1_2 32 76 hz_1_2 33 76 y_1_2 34 76 hz_1_2 35 76 y_1_2 36 76 hz_1_2 37 76 hz_1_2 38 76 hz_1_2 39 76 y_1_2 40 76 hz_1_2 41 76 x_1_2 42 76 x_1_2 43 76 y_1_2 44 76 x_1_2 45 76 y_1_2 46 76 hz_1_2 47 76 hz_1_2 48 76 hz_1_2 49 76 x_1_2 50 76 hz_1_2 51 76 x_1_2 52 77 rz 3 -0.9617964111347312 77 rz 4 1.0422316646152403 77 rz 6 1.4906075208602267 77 rz 7 -3.0586288090712053 77 rz 8 1.7496567718456717 77 rz 9 -1.1010126700741818 77 rz 12 -2.8265338494416774 77 rz 13 2.9951825931728244 77 rz 14 -2.7549299419521596 77 rz 15 2.7181113007920708 77 rz 16 0.6773327810712537 77 rz 17 -0.6918248806300689 77 rz 20 -1.0403655199651105 77 rz 21 0.2699666520425943 77 rz 22 -1.6068613560705067 77 rz 23 1.452792659830184 77 rz 24 2.811522686523009 77 rz 25 -2.9612487078918086 77 rz 26 -0.03794197943136268 77 rz 27 0.1892134350580683 77 rz 29 0.5920314869778558 77 rz 30 -0.5614192076472797 77 rz 31 0.9919105462898301 77 rz 32 -0.9514577883553451 77 rz 33 -2.3137738874666436 77 rz 34 2.579821434629128 77 rz 35 1.4155337990040913 77 rz 36 -1.086065486059212 77 rz 38 1.84738599815179 77 rz 39 -2.2644220758629423 77 rz 40 -1.6038147252149049 77 rz 41 1.5641334649371306 77 rz 42 0.4864766288205651 77 rz 43 0.08010616241541513 77 rz 45 0.08099079938028453 77 rz 46 -0.058368917128436955 77 rz 47 2.8422252249050537 77 rz 48 2.1018522902043877 77 rz 50 -2.5272115582573758 77 rz 51 2.0971050483709455 78 fs 3 4 1.483304234663135 0.4930986258758784 78 fs 6 7 1.5160176987076064 0.49850252902921577 78 fs 8 9 1.5338611249160479 0.5011308712767845 78 fs 12 13 1.480179689158691 0.4772322221553844 78 fs 14 15 1.5152260103068818 0.49796235787029736 78 fs 16 17 1.5284924549164072 0.5160847019657471 78 fs 20 21 1.58661284381037 0.475779832809368 78 fs 22 23 1.5333295850816209 0.44983388105304506 78 fs 24 25 1.5158107733607835 0.4663776718737318 78 fs 26 27 1.5645151084457722 0.47497942677256283 78 fs 29 30 1.5659881784786247 0.5656290235103623 78 fs 31 32 1.5211879663086973 0.5056110683638391 78 fs 33 34 1.5083349422212171 0.49641600818144604 78 fs 35 36 1.5087002777200382 0.44025777694304247 78 fs 38 39 1.5658333118222365 0.47264531483343447 78 fs 40 41 1.5219378850865568 0.5335829954491795 78 fs 42 43 1.5501487671051402 0.4404117539373896 78 fs 45 46 1.4825325148661492 0.6857341218223484 78 fs 47 48 1.4941963673904604 0.45895108234543025 78 fs 50 51 1.5487430259667763 0.4467898473637848 79 rz 3 0.6291106967230284 79 rz 4 -0.5486754432425194 79 rz 6 2.332707529046683 79 rz 7 2.3824564899219247 79 rz 8 -2.508238678122747 79 rz 9 -3.1263025272853504 79 rz 12 3.0808556571354266 79 rz 13 -2.9122069134042796 79 rz 14 -2.634859603906346 79 rz 15 2.598040962746257 79 rz 16 -0.6825438753286086 79 rz 17 0.6680517757697935 79 rz 20 3.1062306532213633 79 rz 21 2.4065557860357067 79 rz 22 -0.2824448460012796 79 rz 23 0.1283761497609568 79 rz 24 -1.514420717325617 79 rz 25 1.3646946959568176 79 rz 26 -1.055014422658413 79 rz 27 1.2062858782851187 79 rz 29 -0.5101872429635854 79 rz 30 0.5407995222941615 79 rz 31 -2.0263744971571533 79 rz 32 2.0668272550916384 79 rz 33 2.512967358285241 79 rz 34 -2.24691981112276 79 rz 35 -1.3513059503254254 79 rz 36 1.6807742632703049 79 rz 38 -3.0689575197706525 79 rz 39 2.6519214420595 79 rz 40 -3.055007836524881 79 rz 41 3.015326576247107 79 rz 42 -1.967286001422039 79 rz 43 2.533868792658023 79 rz 45 0.7465688112737006 79 rz 46 -0.723946929021853 79 rz 47 -2.2171361473075386 79 rz 48 0.8780283552373938 79 rz 50 2.4942707201230156 79 rz 51 -2.924377230009446 80 x_1_2 0 80 hz_1_2 1 80 hz_1_2 2 80 hz_1_2 3 80 y_1_2 4 80 y_1_2 5 80 x_1_2 6 80 x_1_2 7 80 y_1_2 8 80 y_1_2 9 80 x_1_2 10 80 x_1_2 11 80 x_1_2 12 80 y_1_2 13 80 hz_1_2 14 80 x_1_2 15 80 hz_1_2 16 80 y_1_2 17 80 y_1_2 18 80 hz_1_2 19 80 hz_1_2 20 80 hz_1_2 21 80 hz_1_2 22 80 hz_1_2 23 80 y_1_2 24 80 y_1_2 25 80 hz_1_2 26 80 y_1_2 27 80 x_1_2 28 80 y_1_2 29 80 x_1_2 30 80 hz_1_2 31 80 y_1_2 32 80 y_1_2 33 80 x_1_2 34 80 x_1_2 35 80 hz_1_2 36 80 x_1_2 37 80 y_1_2 38 80 y_1_2 39 80 x_1_2 40 80 y_1_2 41 80 y_1_2 42 80 y_1_2 43 80 hz_1_2 44 80 y_1_2 45 80 x_1_2 46 80 x_1_2 47 80 x_1_2 48 80 y_1_2 49 80 y_1_2 50 80 x_1_2 51 80 y_1_2 52 ================================================ FILE: examples/ex_jax.py ================================================ """This script shows how to manually use jax to jit-compile the core contraction. """ from concurrent.futures import ThreadPoolExecutor import jax import numpy as np import cotengra as ctg # generate a random contraction inputs, output, shapes, size_dict = ctg.utils.rand_equation( 140, 3, n_out=2, seed=666, ) arrays = [np.random.randn(*s) for s in shapes] # ------------------------ Find the contraction tree ------------------------ # print("Finding tree...") # find a contraction tree opt = ctg.HyperOptimizer( parallel=True, # make sure contractions fit onto GPU slicing_reconf_opts={"target_size": 2**28}, max_repeats=32, progbar=True, ) # run the optimizer and extract the contraction tree tree = opt.search(inputs, output, size_dict) # ------------------------- Perform the contraction ------------------------- # print("1: Contracting slices with jax...") # we'll run the GPU contraction on a separate single thread, which mostly # serves as an example of how one might distribute contractions to multi-GPUs pool = ThreadPoolExecutor(1) # we'll compile the core contraction algorithm (other options here are # tensorflow and torch) since we call it possibly many times contract_core_jit = jax.jit(tree.contract_core) # eagerly submit all the contractions to the thread pool fs = [ pool.submit(contract_core_jit, tree.slice_arrays(arrays, i)) for i in range(tree.nslices) ] # lazily gather all the slices in the main process with progress bar slices = (np.array(f.result()) for f in fs) x = tree.gather_slices(slices, progbar=True) print(x) # ------------------------ Perform the contraction 2 ------------------------ # print("2: Contracting slices with jax and constants...") # this time we'll treat the input arrays as constant, so they ideally be # folded in, possibly with some extra memory overhead jax_arrays = [jax.numpy.asarray(x) for x in arrays] contract_core_jit = jax.jit(lambda i: tree.contract_slice(jax_arrays, i)) # eagerly submit all the contractions to the thread pool fs = [pool.submit(contract_core_jit, np.array(i)) for i in range(tree.nslices)] # lazily gather all the slices in the main process with progress bar slices = (np.array(f.result()) for f in fs) x = tree.gather_slices(slices, progbar=True) print(x) # ------------------------ Perform the contraction 3 ------------------------ # print("3: Contracting slices with jax but no jit...") # we can also contract the raw jax arrays with no jit - though jax is # significantly slower in this mode x = tree.contract(jax_arrays, progbar=True) print(x) ================================================ FILE: examples/ex_mpi_executor.py ================================================ """This script illustrates how to parallelize both the contraction path finding and sliced contraction computation using 'executor' style MPI. """ import numpy as np from mpi4py import MPI from mpi4py.futures import MPICommExecutor import cotengra as ctg comm = MPI.COMM_WORLD with MPICommExecutor() as pool: # only need to make calls from the root process if pool is not None: # generate a random contraction inputs, output, shapes, size_dict = ctg.utils.rand_equation( 100, 3, n_out=2, seed=666, ) arrays = [np.random.randn(*s) for s in shapes] # -- STAGE 1: find the contraction tree with a single optimization -- # print(f"{comm.rank}:: Finding tree executor style ...") # find a contraction tree opt = ctg.HyperOptimizer( parallel=pool, # make sure we generate at least 1 slice per process slicing_opts={"target_slices": comm.size}, # cmaes is suited to generating many trials quickly optlib="cmaes", max_repeats=512, progbar=True, ) # run the optimizer and extract the contraction tree tree = opt.search(inputs, output, size_dict) # ------------- STAGE 2: perform contraction on workers ------------- # # root process just submits and gather results - workers contract print(f"{comm.rank}:: Contracting tree executor style ...") # submit contractions eagerly fs = [ pool.submit(tree.contract_slice, arrays, i) for i in range(tree.nslices) ] # gather results lazily (i.e. using generator) x = tree.gather_slices((f.result() for f in fs)) print(x) ================================================ FILE: examples/ex_mpi_spmd.py ================================================ """This script illustrates how to parallelize both the contraction path finding and sliced contraction computation using SPMD style MPI. """ import numpy as np from mpi4py import MPI import cotengra as ctg comm = MPI.COMM_WORLD # generate a random contraction inputs, output, shapes, size_dict = ctg.utils.rand_equation( 100, 3, n_out=2, seed=666, ) # numpy seeded by ^^^^ so these are synced arrays = [np.random.randn(*s) for s in shapes] # ------- STAGE 1: find contract tree with many independant searches -------- # print(f"{comm.rank}:: Finding tree SPMD style ...") # each worker will be running a *separate* contraction optimizer opt = ctg.HyperOptimizer( # make sure we generate at least 1 slice per process slicing_opts={"target_slices": comm.size}, # each worker optimizes its own trials so we don't need a fast sampler optlib="optuna", # since the load is not balanced, makes more sense to limit by time max_repeats=1_000_000, max_time=5, ) # perform the search tree = opt.search(inputs, output, size_dict) score = opt.best["score"] # need to get the best tree from across all processes print(f"{comm.rank}:: Sharing best tree ...") _, tree = comm.allreduce((score, tree), op=MPI.MIN) # -------------- STAGE 2: use SPMD mode to perform contraction -------------- # print(f"{comm.rank}:: Contracting tree SPMD style ...") # perform the contraction distributed over mpi # (set root=i to reduce output tensor to a specific worker only) x = tree.contract_mpi(arrays, comm=comm) if comm.rank == 0: print(x) ================================================ FILE: pyproject.toml ================================================ [project] name = "cotengra" description = "Hyper optimized contraction trees for large tensor networks and einsums." readme = { file = "README.md", content-type = "text/markdown" } dynamic = ["version"] authors = [{ name = "Johnnie Gray", email = "johnniemcgray@gmail.com" }] license = { file = "LICENSE.md" } requires-python = ">=3.10" classifiers = [ "Development Status :: 3 - Alpha", "License :: OSI Approved :: Apache Software License", "Operating System :: OS Independent", "Intended Audience :: Science/Research", "Programming Language :: Python", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Topic :: Scientific/Engineering", ] keywords = [ "contraction", "einsum", "graph", "hypergraph", "network", "partition", "tensor", ] dependencies = ["autoray"] [project.urls] "Documentation" = "https://cotengra.readthedocs.io/" "Repository" = "https://github.com/jcmgray/cotengra/" "Issues" = "https://github.com/jcmgray/cotengra/issues" "Changelog" = "https://cotengra.readthedocs.io/en/latest/changelog.html" [project.optional-dependencies] recommended = [ "cmaes", "cotengrust", "cytoolz", "kahypar", "matplotlib", "networkx", "numpy", "opt_einsum", "optuna", "ray", "tqdm", ] docs = [ "astroid", "furo", "ipython", "myst-nb", "setuptools_scm", "sphinx", "sphinx-autoapi", "sphinx-copybutton", "sphinx-design", ] [build-system] requires = ["hatchling", "hatch-vcs"] build-backend = "hatchling.build" [tool.hatch.version] source = "vcs" [tool.hatch.build.hooks.vcs] version-file = "cotengra/_version.py" [tool.pytest.ini_options] testpaths = "tests" markers = [ "localonly: marks test to be skipped on CI", ] [tool.coverage.run] omit = ["*/cotengra/experimental/*"] source = ["cotengra"] [tool.ruff] line-length = 79 target-version = "py310" lint.ignore = ["E741"] # ---------------------------------- pixi ----------------------------------- # [tool.pixi.workspace] channels = ["conda-forge"] platforms = ["linux-64", "osx-64", "osx-arm64", "win-64"] [tool.pixi.dependencies] autoray = ">=0.8.0,<0.9" [tool.pixi.pypi-dependencies] cotengra = { path = ".", editable = true } [tool.pixi.feature.basic.dependencies] cmaes = "*" matplotlib = "*" networkx = "*" optuna = "*" seaborn = "*" tqdm = "*" [tool.pixi.feature.full.dependencies] opt_einsum = "*" distributed = "*" [tool.pixi.feature.full.pypi-dependencies] cotengrust = ">=0.2.0" [tool.pixi.feature.full.target.linux-64.pypi-dependencies] kahypar = "*" [tool.pixi.feature.full.target.osx-arm64.pypi-dependencies] kahypar = "*" [tool.pixi.feature.tests.dependencies] coverage = "*" pytest = "*" pytest-cov = "*" [tool.pixi.feature.pyold.dependencies] python = "3.10.*" [tool.pixi.feature.pymid.dependencies] python = "3.12.*" [tool.pixi.feature.pynew.dependencies] python = "3.14.*" [tool.pixi.feature.torch] platforms = ["linux-64", "osx-arm64"] [tool.pixi.feature.torch.pypi-dependencies] torch = "*" [tool.pixi.feature.jax] platforms = ["linux-64", "osx-arm64"] [tool.pixi.feature.jax.pypi-dependencies] jax = "*" [tool.pixi.feature.tensorflow] platforms = ["linux-64", "osx-arm64"] [tool.pixi.feature.tensorflow.pypi-dependencies] tensorflow = "*" [tool.pixi.feature.docs.dependencies] astroid = "*" furo = "*" ipython = "*" myst-nb = "*" ruff = "*" setuptools_scm = "*" sphinx = "*" sphinx-autoapi = "*" sphinx-copybutton = "*" sphinx-design = "*" [tool.pixi.feature.docs.pypi-dependencies] squeaky = "*" [tool.pixi.environments] testminimal = { features = ["pymid", "basic", "tests"] } testpynew = { features = ["pynew", "basic", "full", "tests"] } testpymid = { features = ["pymid", "basic", "full", "tests"] } testpyold = { features = ["pyold", "basic", "full", "tests"] } testtorch = { features = ["pymid", "basic", "tests", "torch"] } testjax = { features = ["pymid", "basic", "tests", "jax"] } testtensorflow = { features = ["pymid", "basic", "tests", "tensorflow"] } docs = { features = ["pynew", "docs"] } # ---------------------------------- tasks ---------------------------------- # [tool.pixi.tasks.pytest] default-environment = "testpymid" cmd = "pytest" cwd = "." description = "Run pytest." [tool.pixi.tasks.test] cmd = """ pytest \ tests/ \ --cov=cotengra \ --cov-report=xml \ --verbose \ --durations=10 \ -m "not localonly" """ cwd = "." default-environment = "testpymid" description = "Run the test suite." [tool.pixi.tasks.test-backends] cmd = """ pytest \ tests/test_backends.py \ --cov=cotengra \ --cov-report=xml \ --verbose \ --durations=10 """ cwd = "." default-environment = "testpymid" description = "Run cross-backend contraction tests (test_backends.py)." [tool.pixi.feature.docs.tasks.docs] cmd = "sphinx-build -b html docs docs/_build/html" cwd = "." description = "Build the HTML documentation." [tool.pixi.feature.docs.tasks.readthedocs] cmd = "sphinx-build -T -b html docs $READTHEDOCS_OUTPUT/html" cwd = "." description = "Specific task for building docs on ReadTheDocs." [tool.pixi.feature.docs.tasks.docs-clean] cmd = "rm -rf docs/_build" cwd = "." description = "Remove documentation build artifacts." [tool.pixi.feature.docs.tasks.docs-serve] cmd = "python -m http.server -d docs/_build/html 8000" cwd = "." description = "Serve the documentation locally." [tool.pixi.feature.docs.tasks.lint] cmd = """ ruff check --select I && ruff format --check """ cwd = "." description = "Check code formatting and imports with ruff." [tool.pixi.feature.docs.tasks.format] cmd = """ ruff check --select I --fix && ruff format """ cwd = "." description = "Apply code formatting and fix imports with ruff." [tool.pixi.feature.docs.tasks.format-all] cmd = """ ruff check --select I --fix && ruff format && find . -name "*.ipynb" -print0 | xargs -0 squeaky """ cwd = "." description = "Format all files including notebooks with squeaky." ================================================ FILE: tests/__init__.py ================================================ ================================================ FILE: tests/test_backends.py ================================================ """Cross-backend correctness tests for ``ContractionTree.contract``. Each backend is exercised across the cartesian product of: - real / complex dtype, - ``strip_exponent`` on / off, - sliced / unsliced contraction. Backends that are not installed are skipped, so this file is intended to be the single place that exercises non-numpy backends — CI would then provision a per-backend pixi environment and run only this file. """ import importlib import pytest from autoray import to_numpy from numpy.testing import assert_allclose import cotengra as ctg def _has(name): return importlib.util.find_spec(name) is not None BACKENDS = [ pytest.param("numpy", id="numpy"), pytest.param( "torch", marks=pytest.mark.skipif( not _has("torch"), reason="torch not installed" ), id="torch", ), pytest.param( "jax", marks=pytest.mark.skipif(not _has("jax"), reason="jax not installed"), id="jax", ), pytest.param( "tensorflow", marks=pytest.mark.skipif( not _has("tensorflow"), reason="tensorflow not installed" ), id="tensorflow", ), pytest.param( "cupy", marks=pytest.mark.skipif( not _has("cupy"), reason="cupy not installed" ), id="cupy", ), pytest.param( "autograd", marks=pytest.mark.skipif( not _has("autograd"), reason="autograd not installed" ), id="autograd", ), ] def _setup_backend(backend): if backend == "jax": # jax defaults to float32; opt-in to x64 for float64 / complex128. from jax import config config.update("jax_enable_x64", True) def _to_backend(x, backend): if backend == "numpy": return x if backend == "torch": import torch return torch.from_numpy(x) if backend == "jax": import jax.numpy as jnp return jnp.asarray(x) if backend == "tensorflow": import tensorflow as tf return tf.convert_to_tensor(x) if backend == "cupy": import cupy return cupy.asarray(x) if backend == "autograd": import autograd.numpy as anp return anp.asarray(x) raise ValueError(f"unknown backend {backend}") @pytest.mark.parametrize("backend", BACKENDS) @pytest.mark.parametrize("dtype", ["float64", "complex128"]) @pytest.mark.parametrize("strip_exponent", [False, True]) @pytest.mark.parametrize("slicing", [False, True]) def test_contract_backend(backend, dtype, strip_exponent, slicing): _setup_backend(backend) c = ctg.utils.lattice_equation([4, 4]) arrays_np = ctg.utils.make_arrays_from_inputs( c.inputs, c.size_dict, seed=42, dtype=dtype ) eq = ctg.utils.inputs_output_to_eq(c.inputs, c.output) expected = ctg.einsum(eq, *arrays_np) arrays = [_to_backend(a, backend) for a in arrays_np] tree = ctg.array_contract_tree( c.inputs, c.output, c.size_dict, optimize="greedy" ) if slicing: tree.slice_(target_slices=4) assert tree.nslices >= 4 result = tree.contract(arrays, strip_exponent=strip_exponent) if strip_exponent: m, p = result result = to_numpy(m) * 10.0 ** float(to_numpy(p)) else: result = to_numpy(result) assert_allclose(result, expected, rtol=5e-6, atol=1e-8) ================================================ FILE: tests/test_compressed.py ================================================ import pytest import cotengra as ctg def test_compressed_greedy(): chi = 4 inputs, output, _, size_dict = ctg.utils.lattice_equation([10, 10]) opt = ctg.HyperCompressedOptimizer( chi=chi, methods=[ "greedy-compressed", ], ) tree = opt.search(inputs, output, size_dict) assert isinstance(tree, ctg.ContractionTreeCompressed) assert tree.total_flops(chi) < tree.total_flops_exact() assert tree.total_write(chi) < tree.total_write_exact() assert tree.max_size(chi) < tree.max_size_exact() assert tree.peak_size(chi) < tree.peak_size_exact() assert tree.contraction_width(chi) < 20 def test_compressed_span(): chi = 4 inputs, output, _, size_dict = ctg.utils.lattice_equation([10, 10]) opt = ctg.HyperCompressedOptimizer( chi=chi, methods=[ "greedy-span", ], ) tree = opt.search(inputs, output, size_dict) assert isinstance(tree, ctg.ContractionTreeCompressed) assert tree.total_flops(chi) < tree.total_flops_exact() assert tree.total_write(chi) < tree.total_write_exact() assert tree.max_size(chi) < tree.max_size_exact() assert tree.peak_size(chi) < tree.peak_size_exact() assert tree.contraction_width(chi) < 20 def test_compressed_agglom(): pytest.importorskip("kahypar") chi = 4 inputs, output, _, size_dict = ctg.utils.lattice_equation([16, 16]) opt = ctg.HyperCompressedOptimizer( chi=chi, methods=[ "kahypar-agglom", ], on_trial_error="raise", parallel=False, ) tree = opt.search(inputs, output, size_dict) assert isinstance(tree, ctg.ContractionTreeCompressed) assert tree.total_flops(chi) < tree.total_flops_exact() assert tree.total_write(chi) < tree.total_write_exact() assert tree.max_size(chi) < tree.max_size_exact() assert tree.peak_size(chi) < tree.peak_size_exact() assert tree.contraction_width(chi) < 20 @pytest.mark.parametrize("order_only", (False, True)) def test_compressed_reconfigure(order_only): chi = 16 minimize = ctg.scoring.CompressedPeakObjective(chi) inputs, output, _, size_dict = ctg.utils.lattice_equation([16, 16]) tree = ctg.array_contract_tree( inputs, output, size_dict, optimize=ctg.path_compressed_greedy.GreedyCompressed(chi), ) tree_wr = tree.windowed_reconfigure(minimize, order_only=order_only) assert tree_wr.peak_size(chi) < tree.peak_size(chi) def test_compressed_windowed_reconfigure(): chi = 4 minimize = ctg.scoring.CompressedPeakObjective(chi) inputs, output, _, size_dict = ctg.utils.lattice_equation([8, 8]) tree = ctg.array_contract_tree( inputs, output, size_dict, optimize=ctg.path_compressed_greedy.GreedyCompressed(chi), ) tree_wr = tree.windowed_reconfigure(minimize) assert tree_wr.get_default_objective().chi == chi assert tree_wr.peak_size(chi) < tree.peak_size(chi) ================================================ FILE: tests/test_compute.py ================================================ import numpy as np import pytest from numpy.testing import assert_allclose import cotengra as ctg # these are taken from opt_einsum test_case_eqs = [ # Test single-term equations "->", "a->a", "ab->ab", "ab->ba", "abc->bca", "abc->b", "baa->ba", "aba->b", # Test scalar-like operations "a,->a", "ab,->ab", ",ab,->ab", ",,->", # Test hadamard-like products "a,ab,abc->abc", "a,b,ab->ab", # Test index-transformations "ea,fb,gc,hd,abcd->efgh", "ea,fb,abcd,gc,hd->efgh", "abcd,ea,fb,gc,hd->efgh", # Test complex contractions "acdf,jbje,gihb,hfac,gfac,gifabc,hfac", "acdf,jbje,gihb,hfac,gfac,gifabc,hfac", "cd,bdhe,aidb,hgca,gc,hgibcd,hgac", "abhe,hidj,jgba,hiab,gab", "bde,cdh,agdb,hica,ibd,hgicd,hiac", "chd,bde,agbc,hiad,hgc,hgi,hiad", "chd,bde,agbc,hiad,bdi,cgh,agdb", "bdhe,acad,hiab,agac,hibd", # Test collapse "ab,ab,c->", "ab,ab,c->c", "ab,ab,cd,cd->", "ab,ab,cd,cd->ac", "ab,ab,cd,cd->cd", "ab,ab,cd,cd,ef,ef->", # Test outer prodcuts "ab,cd,ef->abcdef", "ab,cd,ef->acdf", "ab,cd,de->abcde", "ab,cd,de->be", "ab,bcd,cd->abcd", "ab,bcd,cd->abd", # Random test cases that have previously failed "eb,cb,fb->cef", "dd,fb,be,cdb->cef", "bca,cdb,dbf,afc->", "dcc,fce,ea,dbf->ab", "fdf,cdd,ccd,afe->ae", "abcd,ad", "ed,fcd,ff,bcf->be", "baa,dcf,af,cde->be", "bd,db,eac->ace", "fff,fae,bef,def->abd", "efc,dbc,acf,fd->abe", # Inner products "ab,ab", "ab,ba", "abc,abc", "abc,bac", "abc,cba", # GEMM test cases "ab,bc", "ab,cb", "ba,bc", "ba,cb", "abcd,cd", "abcd,ab", "abcd,cdef", "abcd,cdef->feba", "abcd,efdc", # Inner than dot "aab,bc->ac", "ab,bcc->ac", "aab,bcc->ac", "baa,bcc->ac", "aab,ccb->ac", # Randomly built test caes "aab,fa,df,ecc->bde", "ecb,fef,bad,ed->ac", "bcf,bbb,fbf,fc->", "bb,ff,be->e", "bcb,bb,fc,fff->", "fbb,dfd,fc,fc->", "afd,ba,cc,dc->bf", "adb,bc,fa,cfc->d", "bbd,bda,fc,db->acf", "dba,ead,cad->bce", "aef,fbc,dca->bde", ] @pytest.mark.parametrize("eq", test_case_eqs) @pytest.mark.parametrize( "dtype", ("float32", "float64", "complex64", "complex128") ) @pytest.mark.parametrize("strip_exponent", [False, True]) def test_basic_equations(eq, dtype, strip_exponent): arrays = ctg.utils.make_arrays_from_eq(eq, dtype=dtype) x = np.einsum(eq, *arrays) y = ctg.einsum(eq, *arrays, strip_exponent=strip_exponent) if strip_exponent: y = y[0] * 10 ** y[1] rtol = 5e-3 if dtype in ("float32", "complex64") else 5e-6 atol = 1e-5 if dtype in ("float32", "complex64") else 1e-8 assert_allclose(x, y, rtol=rtol, atol=atol) @pytest.mark.parametrize("n", [10]) @pytest.mark.parametrize("d_min", [2]) @pytest.mark.parametrize("d_max", [4]) @pytest.mark.parametrize("reg", [2, 3]) @pytest.mark.parametrize("n_out", [0, 1, 2]) @pytest.mark.parametrize("n_hyper_in", [0, 1, 2]) @pytest.mark.parametrize("n_hyper_out", [0, 1, 2]) @pytest.mark.parametrize("seed", [42, 666]) @pytest.mark.parametrize("indices_sort", [None, "root", "flops"]) def test_contraction_tree_rand_equation( n, reg, n_out, n_hyper_in, n_hyper_out, d_min, d_max, seed, indices_sort, ): c = ctg.utils.rand_equation( n=n, reg=reg, n_out=n_out, n_hyper_in=n_hyper_in, n_hyper_out=n_hyper_out, d_min=d_min, d_max=d_max, seed=seed, ) arrays = [np.random.normal(size=s) for s in c.shapes] eq = ctg.utils.inputs_output_to_eq(c.inputs, c.output) x = np.einsum(eq, *arrays, optimize="greedy") tree = ctg.einsum_tree( eq, *c.shapes, optimize="greedy", sort_contraction_indices=indices_sort ) # base contract y1 = tree.contract(arrays) assert_allclose(x, y1) # contract after modifying tree tree.subtree_reconfigure_() y2 = tree.contract(arrays) assert_allclose(x, y2) size = tree.max_size() if size < 600: return # contract after slicing and modifying tree.slice_and_reconfigure_(target_size=size // 6) y3 = tree.contract(arrays) assert_allclose(x, y3) # contract after slicing some output indices remaining_out = list(tree.get_legs(tree.root)) nsout = np.random.randint(low=0, high=len(remaining_out) + 1) so_ix = np.random.choice(remaining_out, replace=False, size=nsout) for ind in so_ix: tree.remove_ind_(ind) if indices_sort: tree.sort_contraction_indices(indices_sort) y4 = tree.contract(arrays) assert_allclose(x, y4) def test_lazy_sliced_output_reduce(): c = ctg.utils.rand_equation( n=10, reg=5, n_out=3, d_max=2, seed=666, ) arrays = [np.random.rand(*s) for s in c.shapes] opt = ctg.HyperOptimizer(max_repeats=32, methods=["greedy"]) tree = opt.search(c.inputs, c.output, c.size_dict) # slice both inner and outer indices tree.remove_ind_("a") tree.remove_ind_("x") tree.remove_ind_("b") tree.remove_ind_("y") # for such a quantity, sum(f(x)), the inner slice sum must be performed 1st x = (tree.contract(arrays) ** 2).sum() # ... so that the outer sum can be lazily generated correctly y = 0.0 for chunk in tree.gen_output_chunks(arrays): y += (chunk**2).sum() assert y == pytest.approx(x) @pytest.mark.parametrize("autojit", [False, True]) @pytest.mark.parametrize( "dtype", ["float32", "float64", "complex64", "complex128"] ) def test_exponent_stripping(autojit, dtype): c = ctg.utils.lattice_equation([8, 8]) arrays = ctg.utils.make_arrays_from_inputs( c.inputs, c.size_dict, seed=42, dtype=dtype ) eq = ctg.utils.inputs_output_to_eq(c.inputs, c.output) ex = ctg.einsum(eq, *arrays) tree = ctg.array_contract_tree(c.inputs, c.output, c.size_dict) x1 = tree.contract(arrays, autojit=autojit) assert x1 == pytest.approx(ex) m, p = tree.contract(arrays, autojit=autojit, strip_exponent=True) x2 = m * 10**p assert x2 == pytest.approx(ex) tree.slice_(target_slices=4) assert tree.nslices >= 4 x3 = tree.contract(arrays, autojit=autojit) assert x3 == pytest.approx(ex) m, p = tree.contract(arrays, autojit=autojit, strip_exponent=True) x4 = m * 10**p assert x4 == pytest.approx(ex) @pytest.mark.parametrize("autojit", [False, True]) @pytest.mark.parametrize("constants", [None, True]) @pytest.mark.parametrize("optimize_type", ["path", "tree", "optimizer", "str"]) @pytest.mark.parametrize("sort_contraction_indices", [False, True]) def test_einsum_expression( autojit, constants, optimize_type, sort_contraction_indices, ): c = ctg.utils.lattice_equation([4, 8]) eq = ctg.utils.inputs_output_to_eq(c.inputs, c.output) arrays = [np.random.rand(*s) for s in c.shapes] x0 = ctg.einsum(eq, *arrays) if optimize_type == "str": optimize = "greedy" elif optimize_type == "path": tree = ctg.einsum_tree(eq, *c.shapes, optimize="greedy") optimize = tree.get_path() elif optimize_type == "tree": tree = ctg.ContractionTree(c.inputs, c.output, c.size_dict) tree.contract_nodes(tuple(tree.gen_leaves()), optimize="greedy") optimize = tree elif optimize_type == "optimizer": optimize = ctg.HyperOptimizer(max_repeats=32, methods=["greedy"]) shapes = list(c.shapes) if constants: constants = range(0, len(c.inputs), 2) for i in sorted(constants, reverse=True): shapes[i] = arrays.pop(i) expr = ctg.einsum_expression( eq, *shapes, optimize=optimize, constants=constants, autojit=autojit, sort_contraction_indices=sort_contraction_indices, ) x1 = expr(*arrays) assert_allclose(x0, x1) ================================================ FILE: tests/test_hypergraph.py ================================================ import pytest import cotengra as ctg def test_shortest_distances(): inputs, output, _, size_dict = ctg.utils.lattice_equation([3, 3]) hg = ctg.HyperGraph(inputs, output, size_dict) ds = hg.all_shortest_distances() assert ds[1, 4] == 1 assert ds[1, 3] == 2 assert ds[5, 6] == 3 assert ds[0, 8] == 4 def test_resistance_centrality(): inputs, output, _, size_dict = ctg.utils.lattice_equation([3, 3]) hg = ctg.HyperGraph(inputs, output, size_dict) cents = hg.resistance_centrality() assert cents[0] == pytest.approx(0.0) assert 0.0 < cents[3] < 1.0 assert cents[4] == 1.0 def test_simple_centrality(): inputs, output, _, size_dict = ctg.utils.lattice_equation([3, 3]) hg = ctg.HyperGraph(inputs, output, size_dict) cents = hg.simple_centrality() assert cents[0] == pytest.approx(0.0) assert 0.0 < cents[3] < 1.0 assert cents[4] == 1.0 def test_compute_loops(): inputs, output, _, size_dict = ctg.utils.lattice_equation([3, 3]) hg = ctg.HyperGraph(inputs, output, size_dict) loops = list(hg.compute_loops()) assert set(loops) == { (0, 1, 3, 4), (1, 2, 4, 5), (3, 4, 6, 7), (4, 5, 7, 8), } assert len(list(hg.compute_loops(max_loop_length=6))) == 8 def test_plot_nonconsec(): import matplotlib as mpl mpl.use("Template") inputs = [ ("a", "b", "x"), ("b", "c", "d"), ("c", "e", "y"), ("e", "a", "d"), ] output = ("x", "y") size_dict = {"x": 2, "y": 3, "a": 4, "b": 5, "c": 6, "d": 7, "e": 8} hg = ctg.HyperGraph(inputs, output, size_dict) hg.contract(0, 1) hg.plot() ================================================ FILE: tests/test_interface.py ================================================ import numpy as np import pytest import cotengra as ctg @pytest.mark.parametrize("optimize_type", ["preset", "list", "tuple"]) def test_array_contract_path_cache(optimize_type): if optimize_type == "preset": optimize = "auto" elif optimize_type == "list": optimize = [(0, 1)] * 9 elif optimize_type == "tuple": optimize = tuple([(0, 1)] * 9) c = ctg.utils.rand_equation(10, 3) arrays = ctg.utils.make_arrays_from_inputs(c.inputs, c.size_dict) pa = ctg.array_contract_path( c.inputs, c.output, shapes=c.shapes, cache=True, optimize=optimize ) pb = ctg.array_contract_path( c.inputs, c.output, shapes=c.shapes, cache=True, optimize=optimize ) pc = ctg.array_contract_path( c.inputs, c.output, shapes=c.shapes, cache=False, optimize=optimize ) assert pa is pb assert (pb is not pc) or (optimize_type == "tuple") eq = ctg.utils.inputs_output_to_eq(c.inputs, c.output) xa = np.einsum(eq, *arrays) xb = ctg.einsum(eq, *arrays, optimize=pa) assert np.allclose(xa, xb) @pytest.mark.parametrize("optimize_type", ["preset", "list", "tuple"]) @pytest.mark.parametrize("strip_exponent", [False, True]) def test_array_contract_expression_cache(optimize_type, strip_exponent): if optimize_type == "preset": optimize = "auto" elif optimize_type == "list": optimize = [(0, 1)] * 9 elif optimize_type == "tuple": optimize = tuple([(0, 1)] * 9) c = ctg.utils.rand_equation(10, 3) arrays = ctg.utils.make_arrays_from_inputs(c.inputs, c.size_dict) expra = ctg.array_contract_expression( c.inputs, c.output, shapes=c.shapes, cache=True, optimize=optimize, strip_exponent=strip_exponent, ) exprb = ctg.array_contract_expression( c.inputs, c.output, shapes=c.shapes, cache=True, optimize=optimize, strip_exponent=strip_exponent, ) exprc = ctg.array_contract_expression( c.inputs, c.output, shapes=c.shapes, cache=False, optimize=optimize, strip_exponent=strip_exponent, ) assert expra is exprb assert exprb is not exprc eq = ctg.utils.inputs_output_to_eq(c.inputs, c.output) xa = np.einsum(eq, *arrays) xb = expra(*arrays) if strip_exponent: xb = xb[0] * 10 ** xb[1] assert np.allclose(xa, xb) xc = expra(*arrays) if strip_exponent: xc = xc[0] * 10 ** xc[1] assert np.allclose(xa, xc) def test_einsum_formats_interleaved(): args = ( np.random.rand(2, 3, 4), [2, 3, 4], np.random.rand(4, 5, 6), [4, 5, 6], np.random.rand(2, 7), [2, 7], [7, 3], ) x = np.einsum(*args) y = ctg.einsum(*args) assert np.allclose(x, y) @pytest.mark.parametrize( "eq,shapes", [ ("c...a,b...c->b...a", [(2, 5, 6, 3), (4, 6, 2)]), ("a...a->...", [(3, 3)]), ("a...a->...a", [(3, 4, 5, 3)]), ("...,...ab->ba...", [(), (2, 3, 4, 5)]), ("a,b,ab...c->b...a", [(2,), (3,), (2, 3, 4, 5, 6)]), ], ) def test_einsum_ellipses(eq, shapes): arrays = [np.random.rand(*shape) for shape in shapes] x = np.einsum(eq, *arrays) y = ctg.einsum(eq, *arrays) assert np.allclose(x, y) def test_slice_and_strip_exponent(): inputs, output, _, size_dict = ctg.utils.rand_equation( n=10, reg=3, n_out=2, n_hyper_in=2, n_hyper_out=2, seed=42, ) arrays = ctg.utils.make_arrays_from_inputs(inputs, size_dict, seed=42) x0 = ctg.array_contract(arrays, inputs, output, size_dict=size_dict) x1 = ctg.array_contract( arrays, inputs, output, size_dict=size_dict, optimize=ctg.HyperOptimizer( methods=["greedy"], slicing_opts=dict(target_slices=2), max_repeats=4, ), ) np.testing.assert_allclose(x0, x1) x2 = ctg.array_contract( arrays, inputs, output, size_dict=size_dict, strip_exponent=True, ) x2 = x2[0] * 10 ** x2[1] np.testing.assert_allclose(x0, x2) x3 = ctg.array_contract( arrays, inputs, output, size_dict=size_dict, optimize=ctg.HyperOptimizer( methods=["greedy"], slicing_opts=dict(target_slices=2), max_repeats=4, ), strip_exponent=True, ) x3 = x3[0] * 10 ** x3[1] np.testing.assert_allclose(x0, x3) def test_null_tree(): inputs = ((),) output = () size_dict = {} optimize = () tree = ctg.array_contract_tree( inputs, output, size_dict=size_dict, optimize=optimize, ) assert tree.N == 1 ================================================ FILE: tests/test_optimizers.py ================================================ import subprocess from collections import defaultdict import autoray as ar import numpy as np import pytest import cotengra as ctg from cotengra.hyperoptimizers.hyper import _OPTLIB_DEFAULTS from cotengra.hyperoptimizers.hyper_neldermead import _NMCore from cotengra.hyperoptimizers.hyper_sbplx import HyperSbplxSampler try: subprocess.run(["quickbb_64"]) FOUND_QUICKBB = True except FileNotFoundError: FOUND_QUICKBB = False try: subprocess.run(["flow_cutter_pace17", "--help"]) FOUND_FLOWCUTTER = True except FileNotFoundError: FOUND_FLOWCUTTER = False def rand_reg_contract(n, deg, seed=None): import networkx as nx rG = nx.random_regular_graph(deg, n, seed=seed) edge2ind = { tuple(sorted(e)): ctg.utils.get_symbol(i) for i, e in enumerate(rG.edges) } inputs = [ {edge2ind[tuple(sorted(e))] for e in rG.edges(nd)} for nd in rG.nodes ] output = {} eq = ",".join(["".join(i) for i in inputs]) + "->{}".format( "".join(output) ) shapes = [(2,) * deg] * n views = list(map(ar.lazy.Variable, shapes)) return eq, shapes, views, inputs, output @pytest.fixture def contraction_20_5(): eq, shapes, views, _, _ = rand_reg_contract(20, 5, seed=42) size_dict = defaultdict(lambda: np.random.randint(2, 9)) return eq, shapes, size_dict, views methods_requires = [ ("greedy", ""), ("greedy-compressed", ""), ("greedy-span", ""), ("labels", ""), ("kahypar", "kahypar"), ("kahypar-agglom", "kahypar"), ("betweenness", "igraph"), ("labelprop", "igraph"), ("spinglass", "igraph"), ("walktrap", "igraph"), ] single_term_cases = [ ([("a",)], ("a",), {"a": 2}), ([("a",)], (), {"a": 2}), ([("a", "b")], ("a",), {"a": 2, "b": 3}), ([("a", "b")], ("a", "b"), {"a": 2, "b": 3}), ([("a", "b")], ("b", "a"), {"a": 2, "b": 3}), ] SBPLX_TEST_SPACE = { "x": {"type": "FLOAT", "min": -1.0, "max": 1.0}, } SBPLX_TEST_SPACE_6D = { name: {"type": "FLOAT", "min": -1.0, "max": 1.0} for name in "abcdef" } @pytest.mark.parametrize(("method", "requires"), methods_requires) def test_basic(contraction_20_5, method, requires): if requires: pytest.importorskip(requires) opt = ctg.UniformOptimizer( methods=method, max_repeats=16, on_trial_error="raise" ) eq, _, _, arrays = contraction_20_5 shapes = [a.shape for a in arrays] tree = ctg.einsum_tree(eq, *shapes, optimize=opt) assert tree.speedup() > 1 @pytest.mark.parametrize( ("inputs", "output", "size_dict"), single_term_cases, ) @pytest.mark.parametrize(("method", "requires"), methods_requires) def test_single_term_uniform(inputs, output, size_dict, method, requires): if requires: pytest.importorskip(requires) opt = ctg.UniformOptimizer( methods=method, max_repeats=16, on_trial_error="raise", parallel=False, ) tree = ctg.array_contract_tree(inputs, output, size_dict, optimize=opt) tree.describe() @pytest.mark.parametrize( ("inputs", "output", "size_dict"), single_term_cases, ) @pytest.mark.parametrize(("method", "requires"), methods_requires) def test_single_term_direct(inputs, output, size_dict, method, requires): if requires: pytest.importorskip(requires) opt = ctg.UniformOptimizer( methods=method, max_repeats=16, on_trial_error="raise", parallel=False, ) tree = opt.search(inputs, output, size_dict) tree.describe() @pytest.mark.parametrize( ("optlib", "requires"), [ ("nevergrad", "nevergrad"), ("skopt", "skopt"), ("cmaes", "cmaes"), ("optuna", "optuna"), ("sses", ""), ("neldermead", ""), ("sbplx", ""), ], ) @pytest.mark.parametrize("parallel", [False, True]) def test_hyper(contraction_20_5, optlib, requires, parallel): pytest.importorskip("kahypar") if requires: pytest.importorskip(requires) eq, _, _, arrays = contraction_20_5 shapes = [a.shape for a in arrays] optimizer = ctg.HyperOptimizer( max_repeats=32, parallel=parallel, optlib=optlib, ) tree = ctg.einsum_tree(eq, *shapes, optimize=optimizer) assert tree.speedup() > 1 assert {x[0] for x in optimizer.get_trials()} == {"greedy", "kahypar"} optimizer.print_trials() def test_hyper_sbplx_restart_patience_triggers_local_restart(): sampler = HyperSbplxSampler( SBPLX_TEST_SPACE, seed=1, n_initial=0, restart_patience=2, explore_prob=0.0, convergence_tol=1e-3, ) sampler._best_x = [0.25] sampler._best_score = 1.0 sampler._step = [0.4] sampler._x = [0.1] sampler._x_at_cycle_start = [0.0] sampler._best_score_at_cycle_start = sampler._best_score sampler._finish_cycle() assert sampler._restart_count == 0 assert sampler._cycles_since_improvement == 1 sampler._x = [0.2] sampler._x_at_cycle_start = [0.0] sampler._best_score_at_cycle_start = sampler._best_score sampler._finish_cycle() assert sampler._restart_count == 1 assert sampler._stagnant_restart_count == 1 assert 0.0 < abs(sampler._step[0]) < 0.4 def test_hyper_sbplx_partition_uses_goodness_heuristic(): sampler = HyperSbplxSampler( SBPLX_TEST_SPACE_6D, seed=1, n_initial=0, nsmin=2, nsmax=5, partition="goodness", explore_prob=0.0, ) sampler._step = [5.0, 4.0, 3.0, 1.0, 1.0, 1.0] sampler._partition_dims() assert sampler._subspaces == [[0, 1], [2, 3, 4, 5]] def test_hyper_sbplx_partition_greedy_equal_chunks(): sampler = HyperSbplxSampler( SBPLX_TEST_SPACE_6D, seed=1, n_initial=0, nsmin=2, nsmax=3, partition="greedy", explore_prob=0.0, ) sampler._step = [5.0, 4.0, 3.0, 1.0, 1.0, 1.0] sampler._partition_dims() # greedy: two equal chunks of 3 (sorted by magnitude) assert len(sampler._subspaces) == 2 assert len(sampler._subspaces[0]) == 3 assert len(sampler._subspaces[1]) == 3 def test_hyper_sbplx_cycle_step_scaling_clamped_by_omega(): sampler = HyperSbplxSampler( SBPLX_TEST_SPACE_6D, seed=1, n_initial=0, explore_prob=0.0, convergence_tol=1e-3, ) sampler._subspaces = [[0, 1, 2], [3, 4, 5]] sampler._x_at_cycle_start = [0.0] * 6 sampler._step_at_cycle_start = [1.0] * 6 sampler._x = [100.0, 0.0, 0.0, 0.0, 0.0, 0.0] sampler._update_steps_after_cycle() assert sampler._step[0] == 10.0 assert sampler._step[1:] == [-10.0] * 5 def test_hyper_sbplx_cycle_convergence_is_relative_to_scale(): sampler = HyperSbplxSampler( SBPLX_TEST_SPACE, seed=1, n_initial=0, explore_prob=0.0, convergence_tol=1e-4, ) sampler._x_at_cycle_start = [1000.0] sampler._x = [1000.05] sampler._step = [0.1] assert sampler._cycle_converged() def test_hyper_sbplx_repeated_restarts_escalate_to_global_restart(): sampler = HyperSbplxSampler( SBPLX_TEST_SPACE, seed=2, n_initial=0, restart_patience=1, explore_prob=0.0, convergence_tol=1e-3, initial_scale=0.5, ) sampler._best_x = [0.0] sampler._best_score = 1.0 sampler._step = [0.4] sampler._x = [0.1] sampler._x_at_cycle_start = [0.0] sampler._best_score_at_cycle_start = sampler._best_score sampler._finish_cycle() assert sampler._restart_count == 1 assert abs(sampler._step[0]) < 0.4 sampler._x_at_cycle_start = [sampler._x[0] - 0.1] sampler._best_score_at_cycle_start = sampler._best_score sampler._finish_cycle() assert sampler._restart_count == 2 assert sampler._stagnant_restart_count == 2 assert sampler._step == [sampler.initial_scale] def test_hyper_sbplx_improvement_resets_restart_counters(): sampler = HyperSbplxSampler( SBPLX_TEST_SPACE, seed=3, n_initial=0, restart_patience=2, explore_prob=0.0, ) sampler._best_score = 10.0 sampler._cycles_since_improvement = 4 sampler._stagnant_restart_count = 3 sampler._trial_map[0] = ("filler", None, None, [0.5]) sampler.tell(0, 1.0) assert sampler._best_score == 1.0 assert sampler._best_x == [0.5] assert sampler._cycles_since_improvement == 0 assert sampler._stagnant_restart_count == 0 def test_hyper_sbplx_stale_nm_results_ignored_after_restart(): sampler = HyperSbplxSampler( SBPLX_TEST_SPACE, seed=4, n_initial=0, restart_patience=1, explore_prob=0.0, ) stale_trial, _ = sampler.ask() sampler._restart("global") current_trial, _ = sampler.ask() assert stale_trial != current_trial assert sampler._sub_nm_id is not None assert 0 in sampler._sub_nm._token_map sampler.tell(stale_trial, 123.0) assert 0 in sampler._sub_nm._token_map def test_nmcore_inject_vertex_diameter_gate_accepts_nearby(): core = _NMCore( ndim=2, center=[0.0, 0.0], scales=[0.5, 0.5], convergence_tol=1e-6, inject_diameter_fraction=1.0, ) # manually set up a sorted simplex core._vertices = [[0.0, 0.0], [0.1, 0.0], [0.0, 0.1]] core._scores = [1.0, 2.0, 3.0] core._state = "reflect" # point close to the simplex — should be accepted accepted = core.inject_vertex([0.05, 0.05], 2.5) assert accepted assert core._pending_injection is not None def test_nmcore_inject_vertex_diameter_gate_rejects_far(): core = _NMCore( ndim=2, center=[0.0, 0.0], scales=[0.5, 0.5], convergence_tol=1e-6, inject_diameter_fraction=1.0, ) core._vertices = [[0.0, 0.0], [0.1, 0.0], [0.0, 0.1]] core._scores = [1.0, 2.0, 3.0] core._state = "reflect" # point far from the simplex — should be rejected accepted = core.inject_vertex([0.9, 0.9], 2.5) assert not accepted assert core._pending_injection is None def test_nmcore_inject_vertex_early_convergence_signal(): core = _NMCore( ndim=2, center=[0.0, 0.0], scales=[0.5, 0.5], convergence_tol=1e-6, inject_diameter_fraction=1.0, ) core._vertices = [[0.0, 0.0], [0.1, 0.0], [0.0, 0.1]] core._scores = [1.0, 2.0, 3.0] core._best_score = 1.0 core._state = "reflect" core._tell_count = 10 # point far away but dramatically better (< 0.5 * best_score) accepted = core.inject_vertex([0.9, 0.9], 0.3) assert not accepted assert core._converged def test_nmcore_inject_vertex_inf_diameter_fraction(): core = _NMCore( ndim=2, center=[0.0, 0.0], scales=[0.5, 0.5], convergence_tol=1e-6, inject_diameter_fraction=float("inf"), ) core._vertices = [[0.0, 0.0], [0.1, 0.0], [0.0, 0.1]] core._scores = [1.0, 2.0, 3.0] core._state = "reflect" # even a far point should be accepted with inf fraction accepted = core.inject_vertex([0.9, 0.9], 2.5) assert accepted def test_nm_sampler_adaptive_filler_scale(): from cotengra.hyperoptimizers.hyper_neldermead import ( HyperNelderMeadSampler, ) sampler = HyperNelderMeadSampler( SBPLX_TEST_SPACE, seed=42, n_initial=0, filler_scale=0.01, explore_prob=0.0, ) assert sampler._core is not None # manually populate the core so it has a real diameter sampler._core._vertices = [[0.0], [0.5]] sampler._core._scores = [1.0, 2.0] sampler._core._state = "reflect" sampler._core._initial_simplex_diameter = 0.5 diameter = sampler._core._simplex_diameter() assert diameter > 0.01 # bigger than filler_scale floor # ask a filler — effective scale should be max(0.5*0.5, 0.01) = 0.25 trial_number, params = sampler._ask_filler() assert trial_number >= 0 # filler should center on core's best vertex, not global best sampler._core._best_vertex = [0.8] sampler._best_x = [-0.9] rng = sampler.rng samples = [sampler._ask_filler()[1][0] for _ in range(200)] mean_sample = sum(samples) / len(samples) # centered on 0.8, not -0.9 — mean should be close to 0.8 assert abs(mean_sample - 0.8) < 0.15 def test_sbplx_sampler_adaptive_filler_scale(): sampler = HyperSbplxSampler( SBPLX_TEST_SPACE, seed=42, n_initial=0, filler_scale=0.01, explore_prob=0.0, ) # set up cycling state with a step vector sampler._step = [0.4] sampler._sub_nm = _NMCore( ndim=1, center=[0.0], scales=[0.4], convergence_tol=1e-4, ) # ask a filler — effective scale should be max(0.5*0.4, 0.01) = 0.2 trial_number, x = sampler._ask_filler() assert trial_number >= 0 def test_nmcore_psi_convergence_uses_relative_diameter(): core = _NMCore( ndim=1, center=[0.0], scales=[1.0], convergence_tol=1e-6, psi=0.5, ) core._vertices = [[0.0], [0.4]] core._scores = [0.0, 1.0] core._initial_simplex_diameter = 1.0 core._begin_reflect() assert core.converged def test_nm_sampler_exits_init_phase_with_inf_scores(): from cotengra.hyperoptimizers.hyper_neldermead import ( HyperNelderMeadSampler, ) sampler = HyperNelderMeadSampler( SBPLX_TEST_SPACE, seed=42, n_initial=3, explore_prob=0.0, ) assert sampler._init_phase # simulate all init trials scoring inf (e.g. BadTrial / timeout) tokens = [] for _ in range(3): token, _ = sampler.ask() tokens.append(token) for token in tokens: sampler.tell(token, float("inf")) # init phase must have ended despite all-inf scores assert not sampler._init_phase def test_cmaes_report_result_handles_inf(): cmaes = pytest.importorskip("cmaes") # noqa: F841 from cotengra.hyperoptimizers.hyper_cmaes import CMAESOptLib space = {"greedy": SBPLX_TEST_SPACE} optlib = CMAESOptLib() optlib.setup(methods=["greedy"], space=space) # ask enough trials to fill one population, report all as inf pop_size = optlib._optimizers["greedy"].opt.population_size settings = [optlib.get_setting() for _ in range(pop_size)] for s in settings: optlib.report_result(s, {}, float("inf")) # should still be able to ask for more trials afterwards s = optlib.get_setting() assert s["method"] == "greedy" def test_optuna_report_result_handles_inf(): pytest.importorskip("optuna") from cotengra.hyperoptimizers.hyper_optuna import OptunaOptLib space = {"greedy": SBPLX_TEST_SPACE} optlib = OptunaOptLib() optlib.setup(methods=["greedy"], space=space) # ask a trial and report inf s = optlib.get_setting() optlib.report_result(s, {}, float("inf")) # ask another trial and report a normal score s2 = optlib.get_setting() optlib.report_result(s2, {}, 1.0) # should still be functional s3 = optlib.get_setting() assert s3["method"] == "greedy" @pytest.mark.parametrize( "optimize", [ pytest.param( ctg.QuickBBOptimizer, marks=pytest.mark.skipif( not FOUND_QUICKBB, reason="quickbb_64 not found on path" ), ), pytest.param( ctg.FlowCutterOptimizer, marks=pytest.mark.skipif( not FOUND_FLOWCUTTER, reason="flow_cutter_pace17 not found on path", ), ), ], ) def test_binaries(contraction_20_5, optimize): eq, _, _, arrays = contraction_20_5 shapes = [a.shape for a in arrays] optimizer = optimize(max_time=1) tree = ctg.einsum_tree(eq, *shapes, optimize=optimizer) assert tree.speedup() > 1 @pytest.mark.parametrize("parallel", [False, True]) def test_hyper_slicer(parallel): if parallel: pytest.importorskip("distributed") inputs, output, _, size_dict = ctg.utils.rand_equation( 30, reg=5, seed=42, d_max=3 ) optimizer = ctg.HyperOptimizer( max_repeats=16, parallel=parallel, optlib="random", slicing_opts={"target_slices": 1000}, progbar=True, ) tree = ctg.array_contract_tree( inputs, output, size_dict, optimize=optimizer ) assert tree.multiplicity >= 1000 assert optimizer.best["flops"] > optimizer.best["original_flops"] @pytest.mark.parametrize("parallel", [False, True]) def test_hyper_reconf(parallel): if parallel: pytest.importorskip("distributed") inputs, output, _, size_dict = ctg.utils.rand_equation( 30, reg=5, seed=42, d_max=3 ) optimizer = ctg.HyperOptimizer( max_repeats=16, parallel=parallel, optlib="random", reconf_opts={"subtree_size": 6}, progbar=True, ) ctg.array_contract_tree(inputs, output, size_dict, optimize=optimizer) assert optimizer.best["flops"] < optimizer.best["original_flops"] @pytest.mark.parametrize("parallel", [False, True]) def test_hyper_slicer_reconf(parallel): if parallel: pytest.importorskip("distributed") inputs, output, _, size_dict = ctg.utils.rand_equation( 30, reg=5, seed=42, d_max=3 ) optimizer = ctg.HyperOptimizer( max_repeats=16, parallel=parallel, optlib="random", slicing_reconf_opts={ "target_size": 2**19, "reconf_opts": { "subtree_size": 6, }, }, progbar=True, ) tree = ctg.array_contract_tree( inputs, output, size_dict, optimize=optimizer ) assert tree.max_size() <= 2**19 @pytest.mark.localonly @pytest.mark.parametrize("parallel_backend", ("dask", "ray")) def test_insane_nested(parallel_backend): if parallel_backend == "dask": pytest.importorskip("distributed") else: pytest.importorskip(parallel_backend) inputs, output, _, size_dict = ctg.utils.rand_equation( 30, reg=5, seed=42, d_max=3 ) optimizer = ctg.HyperOptimizer( max_repeats=4, parallel=parallel_backend, optlib="random", progbar=True, slicing_reconf_opts={ "target_size": 2**20, "forested": True, "max_repeats": 2, "num_trees": 2, "reconf_opts": { "forested": True, "num_trees": 2, "subtree_size": 4, }, }, ) tree = ctg.array_contract_tree( inputs, output, size_dict, optimize=optimizer ) assert tree.max_size() <= 2**20 def test_plotting(): pytest.importorskip("matplotlib") import matplotlib matplotlib.use("Template") inputs, output, _, size_dict = ctg.utils.rand_equation( 30, reg=5, seed=42, d_max=3 ) hg = ctg.HyperGraph(inputs, output, size_dict) hg.plot() opt = ctg.HyperOptimizer(max_repeats=16) opt.search(inputs, output, size_dict) opt.plot_trials() opt.plot_scatter() def test_auto_optimizers_threadsafe(): from concurrent.futures import ThreadPoolExecutor pool = ThreadPoolExecutor(2) contractions = [ctg.utils.tree_equation(100, seed=i) for i in range(10)] fs = [ pool.submit( ctg.array_contract_tree, inputs, output, size_dict, optimize="auto-hq", ) for inputs, output, _, size_dict in contractions ] [f.result() for f in fs] def test_reusable_optimizes_overwrite_improved(): contractions = [] for seed in range(10): con = ctg.utils.rand_equation(20, 3, 2, 2, 2, seed=seed) contractions.append(con) opt = ctg.ReusableHyperOptimizer( methods="greedy", overwrite="improved", max_repeats=2, ) scores_a = [ opt.search(inputs, output, size_dict).get_score() for inputs, output, _, size_dict in contractions ] # second time the optimize runs for every contraction, but if an old tree # is better than the new one, it will be used instead scores_b = [ opt.search(inputs, output, size_dict).get_score() for inputs, output, _, size_dict in contractions ] for s1, s2 in zip(scores_b, scores_a): assert s1 <= s2 ================================================ FILE: tests/test_parallel.py ================================================ """Tests for parallel pool management behavior.""" import concurrent.futures import multiprocessing import os import pytest import cotengra.parallel as par FRESH_START_METHODS = tuple( method for method in multiprocessing.get_all_start_methods() if method != "fork" ) def _reset_parallel_state(): """Reset module-level parallel state for test isolation.""" par.ProcessPoolHandler.shutdown() par.ThreadPoolHandler.shutdown() par._AUTO_BACKEND = None par._AUTO_BACKEND_PID = None par._IS_WORKER = False def _check_worker_flag(): """Helper that checks _IS_WORKER inside a worker process.""" return par._IS_WORKER def _worker_auto_returns_none(): """Helper that checks nested parallel='auto' in a worker.""" return par.parse_parallel_arg("auto") is None def _subprocess_auto_returns_none(q): """Helper that runs in a child process.""" q.put(par.parse_parallel_arg("auto") is None) def test_auto_creates_pool(): """parallel='auto' should create a pool by default.""" _reset_parallel_state() try: pool = par.parse_parallel_arg("auto") assert pool is not None finally: _reset_parallel_state() def test_default_backend_preference(): """Default backend should be loky (if available) else concurrent.futures.""" if par.have_loky or par.have_joblib: assert par._DEFAULT_BACKEND == "loky" else: assert par._DEFAULT_BACKEND == "concurrent.futures" def test_explicit_process_backend_reuses_auto(): """Explicit process backends should become the remembered auto backend.""" _reset_parallel_state() try: pool1 = par.parse_parallel_arg("concurrent.futures") pool2 = par.parse_parallel_arg("auto") assert par._AUTO_BACKEND == "concurrent.futures" assert par._AUTO_BACKEND_PID == os.getpid() assert pool1 is pool2 finally: _reset_parallel_state() def test_explicit_loky_reuses_auto(): """Explicit loky should become the remembered auto backend.""" if not (par.have_loky or par.have_joblib): pytest.skip("loky not available") _reset_parallel_state() try: par.parse_parallel_arg("loky") pool = par.parse_parallel_arg("auto") assert par._AUTO_BACKEND == "loky" assert par._AUTO_BACKEND_PID == os.getpid() assert par._infer_backend(pool) == "loky" finally: _reset_parallel_state() def test_threads_remain_explicit_only_for_auto(): """Explicit threads should not become the remembered auto backend.""" _reset_parallel_state() try: thread_pool = par.parse_parallel_arg("threads") auto_pool = par.parse_parallel_arg("auto") assert thread_pool is not None assert par._AUTO_BACKEND == par._DEFAULT_BACKEND assert par._AUTO_BACKEND != "threads" assert auto_pool is not None finally: _reset_parallel_state() def test_threads_do_not_clobber_remembered_auto_backend(): """Explicit threads should not change any remembered process backend.""" _reset_parallel_state() try: process_pool = par.parse_parallel_arg("concurrent.futures") par.parse_parallel_arg("threads") auto_pool = par.parse_parallel_arg("auto") assert par._AUTO_BACKEND == "concurrent.futures" assert auto_pool is process_pool finally: _reset_parallel_state() def test_worker_flag_prevents_auto_pool(): """parallel='auto' returns None when _IS_WORKER is set.""" _reset_parallel_state() try: par._IS_WORKER = True pool = par.parse_parallel_arg("auto") assert pool is None finally: _reset_parallel_state() def test_submit_sets_worker_flag_for_process_pools(): """Process-backed submit() calls should mark workers as workers.""" _reset_parallel_state() try: pool = par.parse_parallel_arg("concurrent.futures") future = par.submit(pool, _check_worker_flag) assert future.result(timeout=10) is True finally: _reset_parallel_state() def test_submit_does_not_mark_thread_workers(): """Thread-backed submit() calls should not poison top-level auto state.""" _reset_parallel_state() try: with concurrent.futures.ThreadPoolExecutor(max_workers=1) as pool: future = par.submit(pool, _check_worker_flag) assert future.result(timeout=10) is False assert par._IS_WORKER is False assert par.parse_parallel_arg("auto") is not None finally: _reset_parallel_state() @pytest.mark.parametrize("start_method", FRESH_START_METHODS) def test_spawn_like_workers_disable_auto(start_method): """Fresh worker processes should disable nested parallel='auto'.""" _reset_parallel_state() try: ctx = multiprocessing.get_context(start_method) with concurrent.futures.ProcessPoolExecutor( max_workers=1, mp_context=ctx ) as pool: future = par.submit(pool, _worker_auto_returns_none) assert future.result(timeout=20) is True finally: _reset_parallel_state() def test_subprocess_no_auto_pool_fork(): """parallel='auto' returns None in a forked subprocess (PID guard).""" if "fork" not in multiprocessing.get_all_start_methods(): pytest.skip("fork not available") ctx = multiprocessing.get_context("fork") _reset_parallel_state() try: par.parse_parallel_arg(True) q = ctx.Queue() p = ctx.Process(target=_subprocess_auto_returns_none, args=(q,)) p.start() result = q.get(timeout=10) p.join() assert result is True finally: _reset_parallel_state() def test_random_greedy_parallel_process_backend(monkeypatch): """RandomGreedyOptimizer should use the shared process submit path.""" import cotengra as ctg monkeypatch.setenv("COTENGRA_NUM_WORKERS", "1") par.choose_default_num_workers.cache_clear() _reset_parallel_state() try: c = ctg.utils.lattice_equation([2, 2], d_min=2, d_max=2, seed=1) opt = ctg.RandomGreedyOptimizer( max_repeats=2, temperature=0.1, seed=1, accel=False, parallel="concurrent.futures", ) assert opt(c.inputs, c.output, c.size_dict) finally: _reset_parallel_state() par.choose_default_num_workers.cache_clear() def test_pool_persists_across_calls(): """A created pool should be reused, not recreated each call.""" _reset_parallel_state() try: pool1 = par.parse_parallel_arg("auto") pool2 = par.parse_parallel_arg("auto") assert pool1 is pool2 finally: _reset_parallel_state() def test_explicit_parallel_true_sets_pid(): """parallel=True should record the PID for subprocess detection.""" _reset_parallel_state() try: par.parse_parallel_arg(True) assert par._AUTO_BACKEND_PID == os.getpid() assert par._AUTO_BACKEND is not None finally: _reset_parallel_state() def test_pid_mismatch_returns_none(): """Simulated PID mismatch (as after fork) should return None.""" _reset_parallel_state() try: par._AUTO_BACKEND = par._DEFAULT_BACKEND par._AUTO_BACKEND_PID = -1 # impossible PID pool = par.parse_parallel_arg("auto") assert pool is None finally: _reset_parallel_state() ================================================ FILE: tests/test_paths_basic.py ================================================ import numpy as np import pytest from numpy.testing import assert_allclose import cotengra as ctg import cotengra.pathfinders.path_basic as pb test_case_eqs = [ "a->a", "ab->ab", "ab->a", "ab->ba", # these are taken from opt_einsum # Test scalar-like operations "a,->a", "ab,->ab", ",ab,->ab", ",,->", # Test hadamard-like products "a,ab,abc->abc", "a,b,ab->ab", # Test index-transformations "ea,fb,gc,hd,abcd->efgh", "ea,fb,abcd,gc,hd->efgh", "abcd,ea,fb,gc,hd->efgh", # Test complex contractions "acdf,jbje,gihb,hfac,gfac,gifabc,hfac", "cd,bdhe,aidb,hgca,gc,hgibcd,hgac", "abhe,hidj,jgba,hiab,gab", "bde,cdh,agdb,hica,ibd,hgicd,hiac", "chd,bde,agbc,hiad,hgc,hgi,hiad", "chd,bde,agbc,hiad,bdi,cgh,agdb", "bdhe,acad,hiab,agac,hibd", # Test collapse "ab,ab,c->", "ab,ab,c->c", "ab,ab,cd,cd->", "ab,ab,cd,cd->ac", "ab,ab,cd,cd->cd", "ab,ab,cd,cd,ef,ef->", # Test outer prodcuts "ab,cd,ef->abcdef", "ab,cd,ef->acdf", "ab,cd,de->abcde", "ab,cd,de->be", "ab,bcd,cd->abcd", "ab,bcd,cd->abd", # Random test cases that have previously failed "eb,cb,fb->cef", "dd,fb,be,cdb->cef", "bca,cdb,dbf,afc->", "dcc,fce,ea,dbf->ab", "fdf,cdd,ccd,afe->ae", "abcd,ad", "ed,fcd,ff,bcf->be", "baa,dcf,af,cde->be", "bd,db,eac->ace", "fff,fae,bef,def->abd", "efc,dbc,acf,fd->abe", # Inner products "ab,ab", "ab,ba", "abc,abc", "abc,bac", "abc,cba", # GEMM test cases "ab,bc", "ab,cb", "ba,bc", "ba,cb", "abcd,cd", "abcd,ab", "abcd,cdef", "abcd,cdef->feba", "abcd,efdc", # Inner than dot "aab,bc->ac", "ab,bcc->ac", "aab,bcc->ac", "baa,bcc->ac", "aab,ccb->ac", # Randomly built test caes "aab,fa,df,ecc->bde", "ecb,fef,bad,ed->ac", "bcf,bbb,fbf,fc->", "bb,ff,be->e", "bcb,bb,fc,fff->", "fbb,dfd,fc,fc->", "afd,ba,cc,dc->bf", "adb,bc,fa,cfc->d", "bbd,bda,fc,db->acf", "dba,ead,cad->bce", "aef,fbc,dca->bde", ] @pytest.mark.parametrize("eq", test_case_eqs) @pytest.mark.parametrize("which", ["greedy", "optimal"]) def test_manual_cases(eq, which): inputs, output = ctg.utils.eq_to_inputs_output(eq) size_dict = ctg.utils.make_rand_size_dict_from_inputs(inputs) arrays = ctg.utils.make_arrays_from_inputs(inputs, size_dict) expected = np.einsum(eq, *arrays, optimize=True) path = { "greedy": pb.optimize_greedy, "optimal": pb.optimize_optimal, }[which](inputs, output, size_dict) tree = ctg.ContractionTree.from_path(inputs, output, size_dict, path=path) assert_allclose(tree.contract(arrays), expected) @pytest.mark.parametrize("seed", range(10)) @pytest.mark.parametrize("which", ["greedy", "optimal"]) def test_basic_rand(seed, which): c = ctg.utils.rand_equation( n=10, reg=4, n_out=2, n_hyper_in=1, n_hyper_out=1, d_min=2, d_max=3, seed=seed, ) eq = ctg.utils.inputs_output_to_eq(c.inputs, c.output) path = { "greedy": pb.optimize_greedy, "optimal": pb.optimize_optimal, }[which](c.inputs, c.output, c.size_dict) tree = ctg.ContractionTree.from_path( c.inputs, c.output, c.size_dict, path=path ) arrays = [np.random.randn(*s) for s in c.shapes] assert_allclose( tree.contract(arrays), np.einsum(eq, *arrays, optimize=True) ) @pytest.mark.parametrize("seed", range(3)) def test_random_greedy_track_flops(seed): c = ctg.utils.lattice_equation( [4, 5], d_min=2, d_max=3, seed=seed, ) opt = ctg.RandomGreedyOptimizer( max_repeats=2, temperature=0.1, seed=seed, accel=False, parallel=False, ) path = opt(c.inputs, c.output, c.size_dict) tree = ctg.ContractionTree.from_path( c.inputs, c.output, c.size_dict, path=path ) assert tree.contraction_cost(log=10) == pytest.approx(opt.best_flops) # check deterministic opt2 = ctg.RandomGreedyOptimizer( max_repeats=2, temperature=0.1, seed=seed, accel=False, parallel=False, ) opt2(c.inputs, c.output, c.size_dict) assert opt.best_ssa_path == opt2.best_ssa_path assert opt.best_flops == opt2.best_flops @pytest.mark.parametrize("seed", range(10)) @pytest.mark.parametrize("which", ["greedy", "optimal"]) def test_basic_perverse(seed, which): c = ctg.utils.perverse_equation(10, seed=seed) eq = ctg.utils.inputs_output_to_eq(c.inputs, c.output) print(eq) path = { "greedy": pb.optimize_greedy, "optimal": pb.optimize_optimal, }[which](c.inputs, c.output, c.size_dict) tree = ctg.ContractionTree.from_path( c.inputs, c.output, c.size_dict, path=path ) arrays = [np.random.randn(*s) for s in c.shapes] assert_allclose( tree.contract(arrays), np.einsum(eq, *arrays, optimize=True) ) def test_optimal_lattice_eq(): inputs, output, _, size_dict = ctg.utils.lattice_equation( [4, 5], d_max=3, seed=42 ) path = pb.optimize_optimal(inputs, output, size_dict, minimize="flops") tree = ctg.ContractionTree.from_path(inputs, output, size_dict, path=path) assert tree.contraction_cost() == 1464 path = pb.optimize_optimal(inputs, output, size_dict, minimize="size") tree = ctg.ContractionTree.from_path(inputs, output, size_dict, path=path) assert tree.contraction_width() == pytest.approx(5.584962500721156) def test_random_optimize(): inputs, output, _, size_dict = ctg.utils.lattice_equation( [4, 5], d_max=3, seed=42 ) tree = ctg.array_contract_tree( inputs, output, size_dict, optimize="random", ) assert tree.is_complete() def test_edgesort_optimize(): inputs, output, _, size_dict = ctg.utils.lattice_equation( [4, 5], d_max=3, seed=42 ) tree = ctg.array_contract_tree( inputs, output, size_dict, optimize="edgesort", ) assert tree.is_complete() def test_edgesort_optimize_manual_labelled_reverse(): # array_contract and friends canonicalize the equation letters by # appearance by default, check the manual override to obey the supplied # ordering works here: tree = ctg.array_contract_tree( inputs=[(3, 2), (2, 1), (1, 0)], size_dict={0: 2, 1: 2, 2: 2, 3: 2}, optimize="edgesort", ) assert tree.get_path() == ((1, 2), (0, 1)) ================================================ FILE: tests/test_slicer.py ================================================ import pytest import cotengra as ctg def test_slicer(): tree = ctg.utils.rand_tree(30, 5, seed=42, d_max=3) sf = ctg.SliceFinder(tree, target_size=100_000, target_overhead=None) inds, ccost = sf.search() assert tree.max_size() > 500_000 assert ccost.size <= 100_000 assert ccost.total_flops > tree.contraction_cost() assert len(inds) > 1 def test_plot(): pytest.importorskip("matplotlib") import matplotlib matplotlib.use("Template") tree = ctg.utils.rand_tree(30, 5, seed=42, d_max=3) sf = ctg.SliceFinder(tree, target_size=100_000, target_overhead=None) sf.search() sf.plot_slicings() def test_plot_alt(): pytest.importorskip("altair") tree = ctg.utils.rand_tree(30, 5, seed=42, d_max=3) sf = ctg.SliceFinder(tree, target_size=100_000, target_overhead=None) sf.search() sf.plot_slicings_alt() ================================================ FILE: tests/test_tree.py ================================================ import pytest import cotengra as ctg @pytest.mark.parametrize("nodeops", ["frozenset[int]", "BitSetInt", "ssa"]) def test_contraction_tree_equivalency(nodeops): eq = "a,ab,bc,c->" shapes = [(4,), (4, 2), (2, 5), (5,)] inputs, output = ctg.utils.eq_to_inputs_output(eq) size_dict = ctg.utils.shapes_inputs_to_size_dict(shapes, inputs) # optimal contraction is like: # o # / \ # o o # / \ / \ path1 = [(0, 1), (0, 1), (0, 1)] path2 = [(2, 3), (0, 1), (0, 1)] ct1 = ctg.ContractionTree.from_path( inputs, output, size_dict, path=path1, nodeops=nodeops, ) ct2 = ctg.ContractionTree.from_path( inputs, output, size_dict, path=path2, nodeops=nodeops, ) assert ct1.total_flops() == ct2.total_flops() == 20 assert ct1.is_complete() assert ct2.is_complete() # for SSA nodes, children dicts have different opaque labels, # but the tree structure (path) should be equivalent if nodeops != "ssa": assert ct1.children == ct2.children else: assert len(ct1.children) == len(ct2.children) @pytest.mark.parametrize("ssa", [False, True]) @pytest.mark.parametrize("autocomplete", [False, True, "auto"]) @pytest.mark.parametrize("nodeops", ["frozenset[int]", "BitSetInt", "ssa"]) def test_contraction_tree_from_path_incomplete(ssa, autocomplete, nodeops): inputs = ["a", "ab", "bc", "c"] output = "" size_dict = {"a": 4, "b": 2, "c": 5} if ssa: ssa_path = [ (0, 1), (2, 3), ] tree = ctg.ContractionTree.from_path( inputs, output, size_dict, ssa_path=ssa_path, autocomplete=autocomplete, nodeops=nodeops, ) else: path = [(0, 1), (0, 1)] tree = ctg.ContractionTree.from_path( inputs, output, size_dict, path=path, autocomplete=autocomplete, nodeops=nodeops, ) if not autocomplete: if nodeops != "ssa": assert not tree.is_complete() assert tree.get_incomplete_nodes() == { tree.nodeops.node_from_seq([0, 1, 2, 3]): [ tree.nodeops.node_from_seq([0, 1]), tree.nodeops.node_from_seq([2, 3]), ], } else: assert tree.is_complete() assert tree.get_incomplete_nodes() == {} @pytest.mark.parametrize("nodeops", ["frozenset[int]", "BitSetInt", "ssa"]) def test_tree_incomplete(nodeops): c = ctg.utils.rand_equation( n=10, reg=3, n_out=1, n_hyper_in=1, n_hyper_out=1, seed=42, ) tree = ctg.ContractionTree( c.inputs, c.output, c.size_dict, nodeops=nodeops ) assert len(tree.info) == 11 tree.contract_nodes([[3, 6, 8], [4, 7]]) assert len(tree.info) == 14 assert not tree.is_complete() groups = tree.get_incomplete_nodes() assert len(groups) == 3 tree.autocomplete() assert tree.is_complete() assert tree.get_incomplete_nodes() == {} assert len(tree.info) == 19 @pytest.mark.parametrize("select", ["descend", "random", "max", "min"]) @pytest.mark.parametrize("minimize", ["flops", "combo", "size"]) def test_reconfigure(select, minimize): inputs, output, _, size_dict = ctg.utils.rand_equation( 30, reg=5, seed=42, d_max=3 ) path_gr = ctg.array_contract_path( inputs, output, size_dict, optimize="random" ) tree_gr = ctg.array_contract_tree( inputs, output, size_dict, optimize=path_gr, ) if minimize == "flops": initial_score = tree_gr.total_flops() elif minimize == "combo": initial_score = tree_gr.combo_cost() elif minimize == "size": initial_score = tree_gr.max_size() tree_gr.subtree_reconfigure_( subtree_size=6, maxiter=100, select=select, minimize=minimize, progbar=True, ) if minimize == "flops": final_score = tree_gr.total_flops() elif minimize == "combo": final_score = tree_gr.combo_cost() elif minimize == "size": final_score = tree_gr.max_size() if select == "min" and minimize == "size": # just check hasn't made worse assert final_score <= initial_score else: assert final_score < initial_score @pytest.mark.parametrize( ("parallel", "requires"), [ (False, ""), (True, ""), ("dask", "distributed"), ("ray", "ray"), ], ) def test_reconfigure_forested(parallel, requires): if requires: pytest.importorskip(requires) inputs, output, _, size_dict = ctg.utils.rand_equation( 30, reg=5, seed=42, d_max=3 ) path_gr = ctg.array_contract_path( inputs, output, size_dict, optimize="greedy" ) tree_gr = ctg.array_contract_tree( inputs, output, size_dict, optimize=path_gr, ) initial_cost = tree_gr.total_flops() tree_gr.subtree_reconfigure_forest_( num_trees=2, subtree_size=6, progbar=True, parallel=parallel ) assert tree_gr.total_flops() < initial_cost def test_reconfigure_with_n_smaller_than_subtree_size(): inputs, output, _, size_dict = ctg.utils.rand_equation(10, 3) tree = ctg.array_contract_tree( inputs, output, size_dict, optimize="greedy" ) tree.subtree_reconfigure(12) @pytest.mark.parametrize( ("forested", "parallel", "requires"), [ (False, False, ""), (True, False, ""), (True, True, "distributed"), ], ) def test_slice_and_reconfigure(forested, parallel, requires): if requires: pytest.importorskip(requires) tree_gr = ctg.utils.rand_tree( 30, reg=5, seed=42, d_max=2, optimize="greedy", ) target_size = tree_gr.max_size() // 32 if forested: tree_gr.slice_and_reconfigure_forest_( target_size, num_trees=2, progbar=True, parallel=parallel ) else: tree_gr.slice_and_reconfigure_(target_size, progbar=True) assert tree_gr.max_size() <= target_size def test_plot(): pytest.importorskip("matplotlib") import matplotlib matplotlib.use("Template") tree = ctg.utils.rand_tree( 30, reg=5, seed=42, d_max=2, optimize="greedy", ) tree.plot_flat() tree.plot_ring() tree.plot_tent() tree.plot_circuit() tree.plot_contractions() def test_plot_alt(): pytest.importorskip("altair") tree = ctg.utils.rand_tree( 30, reg=5, seed=42, d_max=2, optimize="greedy", ) tree.plot_contractions_alt() @pytest.mark.parametrize("optimize", ["greedy-compressed", "greedy-span"]) def test_compressed_rank(optimize): tree = ctg.utils.rand_tree( 30, reg=5, seed=42, d_max=2, optimize=optimize, ) assert tree.max_size_compressed(1) < tree.max_size() @pytest.mark.parametrize("seed", range(10)) def test_print_contractions(seed): ctg.utils.rand_tree(10, 3, 2, 2, 2).print_contractions() def test_remove_ind(): import copy inputs, output, _, size_dict = ctg.utils.rand_equation( 10, 3, n_out=0, n_hyper_in=4, n_hyper_out=1, seed=42 ) tree = ctg.array_contract_tree( inputs, output, size_dict, optimize="greedy" ) arrays = ctg.utils.make_arrays_from_inputs(inputs, size_dict) x = tree.contract(arrays) sf = ctg.SliceFinder(tree, target_slices=2) ix_sl, _ = sf.search() (ix,) = ix_sl orig_stats = tree.contract_stats() orig_info = copy.deepcopy(tree.info) tree_sliced = tree.remove_ind(ix, project=None) sliced_stats = tree_sliced.contract_stats() assert sliced_stats["flops"] > orig_stats["flops"] # make sure we haven't mutated original tree assert tree.info == orig_info assert tree_sliced.info != orig_info assert tree_sliced.contract(arrays) == pytest.approx(x) tree_rem0 = tree.remove_ind(ix, project=0) rem_stats = tree_rem0.contract_stats() assert rem_stats["flops"] < orig_stats["flops"] # make sure we haven't mutated original tree assert tree.info == orig_info assert tree_rem0.info != orig_info y0 = tree_rem0.contract(arrays) assert y0 != pytest.approx(x) for j in range(1, tree.size_dict[ix]): tree_remj = tree.remove_ind(ix, project=j) rem_stats = tree_remj.contract_stats() assert rem_stats["flops"] < orig_stats["flops"] # make sure we haven't mutated original tree assert tree.info == orig_info assert tree_remj.info != orig_info yj = tree_remj.contract(arrays) assert yj != pytest.approx(x) y0 += yj assert y0 == pytest.approx(x) @pytest.mark.parametrize("ind", ["a", "b", "d", "g"]) def test_restore_ind(ind): from numpy.testing import assert_allclose tree = ctg.utils.rand_tree(10, 3, 2, 1, 1, seed=42) arrays = ctg.utils.make_arrays_from_inputs(tree.inputs, tree.size_dict) stree = tree.remove_ind(ind) assert stree.contract_stats() != tree.contract_stats() utree = stree.restore_ind(ind) assert not utree.sliced_inds assert utree.multiplicity == 1 assert_allclose(tree.contract(arrays), utree.contract(arrays)) assert utree.contract_stats() == tree.contract_stats() def test_unslice_rand(): tree = ctg.utils.rand_tree(10, 3, 2, 1, 1, seed=42) arrays = ctg.utils.make_arrays_from_inputs(tree.inputs, tree.size_dict) x = tree.contract(arrays) tree.remove_ind_("a") tree.remove_ind_("b") tree.unslice_rand_() assert len(tree.sliced_inds) == 1 assert tree.contract(arrays) == pytest.approx(x) tree.unslice_rand_() assert len(tree.sliced_inds) == 0 assert tree.contract(arrays) == pytest.approx(x) def test_unslice_all(): tree = ctg.utils.rand_tree(10, 3, 2, 1, 1, seed=42) arrays = ctg.utils.make_arrays_from_inputs(tree.inputs, tree.size_dict) x = tree.contract(arrays) tree.remove_ind_("a") tree.remove_ind_("b") tree.unslice_all_() assert len(tree.sliced_inds) == 0 assert tree.contract(arrays) == pytest.approx(x) def test_reslice_and_reconfigure(): tree = ctg.utils.rand_tree(10, 3, 2, 1, 1, seed=42) arrays = ctg.utils.make_arrays_from_inputs(tree.inputs, tree.size_dict) x = tree.contract(arrays) W = tree.max_size() target_size = W // 10 tree.slice_and_reconfigure_(target_size, reslice=True) assert tree.max_size() <= target_size assert tree.contract(arrays) == pytest.approx(x) def test_tree_with_one_node(): eq = "abc->abc" size_dict = {"a": 2, "b": 3, "c": 4} tree = ctg.ContractionTree.from_eq(eq, size_dict) assert tree.get_path() == () assert tree.contraction_cost() == 0 assert tree.contraction_width(None) == 2 * 3 * 4 @pytest.mark.parametrize("nodeops", ["BitSetInt", "ssa"]) @pytest.mark.parametrize("seed", range(4)) def test_slice_and_restore_preprocessed_inds(seed, nodeops): import numpy as np eq = "abc,bde,dfg,fah->" inputs, output = ctg.utils.eq_to_inputs_output(eq) size_dict = ctg.utils.make_rand_size_dict_from_inputs(inputs, seed=seed) arrays = ctg.utils.make_arrays_from_inputs(inputs, size_dict) tree = ctg.ContractionTree(inputs, output, size_dict, nodeops=nodeops) tree.autocomplete() stats0 = tree.contract_stats() xe = np.einsum(eq, *arrays) assert tree.contract(arrays) == pytest.approx(xe) assert len(tree.preprocessing) == 4 tree.remove_ind_("a") assert tree.has_preprocessing() assert len(tree.preprocessing) == 4 assert tree.contract(arrays) == pytest.approx(xe) # preprocessed ind, slicing it prevents the preprocessing tree.remove_ind_("c") assert tree.has_preprocessing() assert len(tree.preprocessing) == 3 assert tree.contract(arrays) == pytest.approx(xe) tree.restore_ind_("a") assert tree.has_preprocessing() assert len(tree.preprocessing) == 3 assert tree.contract(arrays) == pytest.approx(xe) tree.restore_ind_("c") assert tree.has_preprocessing() assert len(tree.preprocessing) == 4 assert tree.contract(arrays) == pytest.approx(xe) assert tree.contract_stats() == stats0 @pytest.mark.parametrize("nodeops", ["frozenset[int]", "ssa"]) @pytest.mark.parametrize("n", [3, 10, 30]) @pytest.mark.parametrize("seed", range(4)) def test_tree_from_edge_path(n, seed, nodeops): import random con = ctg.utils.rand_equation(n, 3, 2, 2, 2, seed=seed) indices = list(con.size_dict) rng = random.Random(seed) rng.shuffle(indices) tree = ctg.ContractionTree.from_path( con.inputs, con.output, con.size_dict, edge_path=indices, check=True, nodeops=nodeops, ) assert tree.is_complete() def test_tree_build_divide_labels(): con = ctg.utils.lattice_equation([4, 4]) tree = ctg.path_labels.labels_to_tree.trial_fn( con.inputs, con.output, con.size_dict, ) assert tree.is_complete() def test_tree_build_agglom_labels(): con = ctg.utils.lattice_equation([4, 4]) tree = ctg.path_labels.labels_to_tree.trial_fn_agglom( con.inputs, con.output, con.size_dict, ) assert tree.is_complete() @pytest.mark.parametrize("seed", range(10)) def test_tree_peak_size_reorder(seed): tree = ctg.utils.rand_tree(30, 3, seed=seed) pa = tree.peak_size() pb = tree.get_peak_size(tree.root) # local peak size doesn't include inputs assert pb <= pa tree.reorder_for_peak_size() pc = tree.peak_size() pd = tree.get_peak_size(tree.root) assert pd <= pc assert pd <= pb @pytest.mark.parametrize("nodeops", ["frozenset[int]", "BitSetInt", "ssa"]) def test_contraction_tree_from_ssa_path_complete(nodeops): import numpy as np eq = "ab,bc,cd,da->" inputs, output = ctg.utils.eq_to_inputs_output(eq) size_dict = {"a": 2, "b": 3, "c": 4, "d": 5} arrays = ctg.utils.make_arrays_from_inputs(inputs, size_dict) ssa_path = [(0, 1), (2, 3), (4, 5)] tree = ctg.ContractionTree.from_path( inputs, output, size_dict, ssa_path=ssa_path, nodeops=nodeops, ) assert tree.is_complete() assert tree.total_flops() > 0 expected = np.einsum(eq, *arrays) assert tree.contract(arrays) == pytest.approx(expected) def test_ssa_subgraph_tracking(): eq = "ab,bc,cd,da->" inputs, output = ctg.utils.eq_to_inputs_output(eq) size_dict = {"a": 2, "b": 3, "c": 4, "d": 5} ssa_path = [(0, 1), (2, 3), (4, 5)] tree = ctg.ContractionTree.from_path( inputs, output, size_dict, ssa_path=ssa_path, nodeops="ssa", ) # check subgraphs of intermediate nodes for node, (left, right) in tree.children.items(): sg = set(tree.get_subgraph(node)) sg_l = set(tree.get_subgraph(left)) sg_r = set(tree.get_subgraph(right)) # parent subgraph should be union of children assert sg == sg_l | sg_r # root should contain all inputs assert set(tree.get_subgraph(tree.root)) == set(range(tree.N)) def test_ssa_surface_order(): inputs, output, _, size_dict = ctg.utils.lattice_equation([6, 6]) tree = ctg.array_contract_tree( inputs, output, size_dict, optimize="greedy-compressed", ) assert isinstance(tree, ctg.ContractionTreeCompressed) path_surface = tree.get_path_surface() # should be a valid path assert len(path_surface) == tree.N - 1 # each entry should be a pair of ints for pair in path_surface: assert len(pair) == 2 def test_simulated_anneal_tree(): tree = ctg.utils.rand_tree(10, 3, seed=42) arrays = ctg.utils.make_arrays_from_inputs(tree.inputs, tree.size_dict) expected = tree.contract(arrays) initial_flops = tree.total_flops() # low temperature -> only accept improvements tree_sa = tree.simulated_anneal( tstart=0.001, tfinal=0.001, tsteps=3, numiter=5, seed=42 ) assert tree_sa.is_complete() assert tree_sa.total_flops() <= initial_flops assert tree_sa.contract(arrays) == pytest.approx(expected) def test_simulated_anneal_tree_with_slicing(): tree = ctg.utils.rand_tree(10, 3, seed=42) arrays = ctg.utils.make_arrays_from_inputs(tree.inputs, tree.size_dict) expected = tree.contract(arrays) target_size = tree.max_size() // 4 tree_sa = tree.simulated_anneal( tsteps=3, numiter=5, target_size=target_size, seed=42, ) assert tree_sa.is_complete() assert tree_sa.max_size() <= target_size assert tree_sa.contract(arrays) == pytest.approx(expected) @pytest.mark.parametrize("path", [None, [], [(0,)]]) @pytest.mark.parametrize("slice", [False, "a"]) def test_tree_single_input_nosimp(path, slice): inputs = [("a",)] output = ("a",) size_dict = {"a": 4, "b": 2} if path is None: tree = ctg.ContractionTree(inputs, output, size_dict) else: tree = ctg.ContractionTree.from_path( inputs, output, size_dict, path=path ) if slice: tree.remove_ind_(slice) assert not tree.has_preprocessing() assert tree.is_complete() assert tree.get_path() == () arrays = ctg.utils.make_arrays_from_inputs(tree.inputs, tree.size_dict) assert tree.contract(arrays) == pytest.approx(arrays[0]) @pytest.mark.parametrize("path", [None, [], [(0,)]]) @pytest.mark.parametrize("slice", [False, "a", "b"]) def test_tree_single_input_simp(path, slice): import numpy as np inputs = [("a", "b")] output = ("a",) size_dict = {"a": 4, "b": 2} if path is None: tree = ctg.ContractionTree(inputs, output, size_dict) else: tree = ctg.ContractionTree.from_path( inputs, output, size_dict, path=path ) if slice: tree.remove_ind_(slice) assert tree.is_complete() assert tree.get_path() == () arrays = ctg.utils.make_arrays_from_inputs(tree.inputs, tree.size_dict) assert tree.contract(arrays) == pytest.approx(np.sum(arrays[0], axis=1)) @pytest.mark.parametrize("path", [None, [], [(0,)]]) @pytest.mark.parametrize("slice", [False, "a", "b"]) def test_tree_single_input_transpose(path, slice): import numpy as np inputs = [("a", "b")] output = ( "b", "a", ) size_dict = {"a": 4, "b": 2} if path is None: tree = ctg.ContractionTree(inputs, output, size_dict) else: tree = ctg.ContractionTree.from_path( inputs, output, size_dict, path=path ) if slice: tree.remove_ind_(slice) assert not tree.has_preprocessing() assert tree.is_complete() assert tree.get_path() == () arrays = ctg.utils.make_arrays_from_inputs(tree.inputs, tree.size_dict) assert tree.contract(arrays) == pytest.approx(np.transpose(arrays[0]))