diff --git a/.clang-tidy b/.clang-tidy index 9b982c71..0599a288 100644 --- a/.clang-tidy +++ b/.clang-tidy @@ -1,7 +1,6 @@ FormatStyle: file Checks: | - boost-*, bugprone-*, -bugprone-easily-swappable-parameters, -bugprone-unchecked-optional-access, @@ -13,6 +12,8 @@ Checks: | -cppcoreguidelines-special-member-functions, -cppcoreguidelines-avoid-magic-numbers, -cppcoreguidelines-macro-usage, + -cppcoreguidelines-pro-type-reinterpret-cast, + -cppcoreguidelines-pro-bounds-constant-array-index, -cppcoreguidelines-avoid-do-while, google-*, -google-readability-todo, @@ -23,6 +24,7 @@ Checks: | modernize-*, -modernize-use-trailing-return-type, performance-*, + -performance-no-int-to-ptr, portability-*, readability-*, -readability-identifier-length, @@ -72,3 +74,5 @@ CheckOptions: value: CamelCase - key: readability-identifier-naming.VariableCase value: camelBack + - key: misc-include-cleaner.IgnoreHeaders + value: pybind11/detail/.* diff --git a/.github/renovate.json5 b/.github/renovate.json5 index b8df4270..a94eab6a 100644 --- a/.github/renovate.json5 +++ b/.github/renovate.json5 @@ -8,7 +8,7 @@ }, lockFileMaintenance: { "enabled": true, - // "automerge": true, disabled due to endless update loops caused by setuptools_scm + "automerge": true, }, configMigration: true, labels: ["dependencies"], @@ -30,9 +30,16 @@ commitMessagePrefix: "⬆\uFE0F\uD83E\uDE9D", }, { - "description": "Automerge patch updates", - "matchUpdateTypes": ["patch"], - "automerge": true + description: "Automerge patch updates", + matchUpdateTypes: ["patch"], + automerge: true + }, + { + description: "Automerge minor updates for stable dependencies", + matchManagers: ["pep621", "pre-commit"], + matchUpdateTypes: ["minor", "patch"], + matchCurrentVersion: "!/^0/", + automerge: true } ] } diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index 75c66a65..25406e4d 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -1,7 +1,5 @@ -name: CD +name: CD 🚀 on: - push: - branches: [main] release: types: [published] workflow_dispatch: @@ -13,36 +11,11 @@ permissions: jobs: # Builds the sdist and wheels on all supported platforms and uploads the resulting - # wheels as GitHub artifacts `dev-cibw-*`, `test-cibw-*`, or `cibw-*`, depending on - # whether the workflow is triggered from a PR, a push to main, or a release, respectively. + # wheels as GitHub artifacts `dev-cibw-*` or `cibw-*`, depending on whether the + # workflow is triggered from a PR or a release, respectively. python-packaging: name: 🐍 Packaging - uses: cda-tum/mqt-workflows/.github/workflows/reusable-python-packaging.yml@v1.5 - with: - # Do not include local version information on pushes to main to facilitate TestPyPI uploads. - no-local-version: ${{ github.ref == 'refs/heads/main' && github.event_name == 'push' }} - # Do not build emulated wheels on pushes to main to reduce runner load for CD. - build-emulated-wheels: ${{ github.ref != 'refs/heads/main' || github.event_name != 'push' }} - - # Downloads the previously generated artifacts and deploys to TestPyPI on pushes to main - deploy-test-pypi: - name: 🚀 Deploy to Test PyPI - runs-on: ubuntu-latest - environment: - name: test-pypi - url: https://test.pypi.org/p/mqt.ddsim - needs: [python-packaging] - if: github.ref == 'refs/heads/main' && github.event_name == 'push' - steps: - - uses: actions/download-artifact@v4 - with: - pattern: test-cibw-* - path: dist - merge-multiple: true - - uses: pypa/gh-action-pypi-publish@release/v1 - with: - repository-url: https://test.pypi.org/legacy/ - attestations: true + uses: cda-tum/mqt-workflows/.github/workflows/reusable-python-packaging.yml@v1.7 # Downloads the previously generated artifacts and deploys to PyPI on published releases. deploy: @@ -64,5 +37,3 @@ jobs: with: subject-path: "dist/*" - uses: pypa/gh-action-pypi-publish@release/v1 - with: - attestations: true diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 91cac792..544b40c6 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -14,50 +14,177 @@ concurrency: jobs: change-detection: name: 🔍 Change - uses: cda-tum/mqt-workflows/.github/workflows/reusable-change-detection.yml@v1.5 + uses: cda-tum/mqt-workflows/.github/workflows/reusable-change-detection.yml@v1.7 cpp-tests: name: 🇨‌ Test needs: change-detection if: fromJSON(needs.change-detection.outputs.run-cpp-tests) - uses: cda-tum/mqt-workflows/.github/workflows/reusable-cpp-ci.yml@v1.5 + uses: cda-tum/mqt-workflows/.github/workflows/reusable-cpp-ci.yml@v1.7 + with: + # Runs to enable + enable-ubuntu2404-gcc-release: true + enable-ubuntu2404-arm-gcc-release: true + enable-macos13-clang-release: true + enable-macos14-clang-release: true + enable-windows2022-msvc-release: true + # Runs to disable + enable-ubuntu2404-gcc-debug: false + enable-ubuntu2404-clang-release: false + enable-ubuntu2404-clang-debug: false + enable-ubuntu2204-gcc-release: false + enable-ubuntu2204-gcc-debug: false + enable-ubuntu2204-clang-release: false + enable-ubuntu2204-clang-debug: false + enable-ubuntu2404-arm-gcc-debug: false + enable-ubuntu2404-arm-clang-release: false + enable-ubuntu2404-arm-clang-debug: false + enable-ubuntu2204-arm-gcc-release: false + enable-ubuntu2204-arm-gcc-debug: false + enable-ubuntu2204-arm-clang-release: false + enable-ubuntu2204-arm-clang-debug: false + enable-macos13-clang-debug: false + enable-macos13-gcc-release: false + enable-macos13-gcc-debug: false + enable-macos14-clang-debug: false + enable-macos14-gcc-release: false + enable-macos14-gcc-debug: false + enable-macos15-clang-release: false + enable-macos15-clang-debug: false + enable-macos15-gcc-release: false + enable-macos15-gcc-debug: false + enable-windows2022-msvc-debug: false + enable-windows2022-clang-release: false + enable-windows2022-clang-debug: false + enable-windows2025-msvc-release: false + enable-windows2025-msvc-debug: false + enable-windows2025-clang-release: false + enable-windows2025-clang-debug: false + + # run extensive C++ tests whenever this is on a PR and the PR has the `extensive-cpp-ci` label + cpp-tests-extensive: + name: 🇨‌ Test (Extensive) + needs: change-detection + if: fromJSON(needs.change-detection.outputs.run-cpp-tests) && github.event_name == 'pull_request' && contains(github.event.pull_request.labels.*.name, 'extensive-cpp-ci') + uses: cda-tum/mqt-workflows/.github/workflows/reusable-cpp-ci.yml@v1.7 + with: + # Runs to enable + enable-ubuntu2404-gcc-debug: true + enable-ubuntu2404-clang-release: true + enable-ubuntu2404-clang-debug: true + enable-ubuntu2204-gcc-release: true + enable-ubuntu2204-gcc-debug: true + enable-ubuntu2204-clang-release: true + enable-ubuntu2204-clang-debug: true + enable-ubuntu2404-arm-gcc-debug: true + enable-ubuntu2404-arm-clang-release: true + enable-ubuntu2404-arm-clang-debug: true + enable-ubuntu2204-arm-gcc-release: true + enable-ubuntu2204-arm-gcc-debug: true + enable-ubuntu2204-arm-clang-release: true + enable-ubuntu2204-arm-clang-debug: true + enable-macos13-clang-debug: true + enable-macos13-gcc-release: true + enable-macos13-gcc-debug: true + enable-macos14-clang-debug: true + enable-macos14-gcc-release: true + enable-macos14-gcc-debug: true + enable-macos15-clang-release: true + enable-macos15-clang-debug: true + enable-macos15-gcc-release: true + enable-macos15-gcc-debug: true + enable-windows2022-msvc-debug: true + enable-windows2022-clang-release: true + enable-windows2022-clang-debug: true + enable-windows2025-msvc-release: true + enable-windows2025-msvc-debug: true + enable-windows2025-clang-release: true + enable-windows2025-clang-debug: true + # Runs to disable (these are already enabled in the non-extensive run) + enable-ubuntu2404-gcc-release: false + enable-ubuntu2404-arm-gcc-release: false + enable-macos13-clang-release: false + enable-macos14-clang-release: false + enable-windows2022-msvc-release: false + + cpp-coverage: + name: 🇨‌ Coverage + needs: change-detection + if: fromJSON(needs.change-detection.outputs.run-cpp-tests) + uses: cda-tum/mqt-workflows/.github/workflows/reusable-cpp-coverage.yml@v1.7 # Explicitly set permissions so that the workflows also work from forks. permissions: contents: read # Required for the `actions/checkout` action id-token: write # Required for the `codecov/codecov-action` action - with: - cmake-args: "" - cmake-args-ubuntu: -G Ninja - cmake-args-macos: -G Ninja - cmake-args-windows: -T ClangCL cpp-linter: name: 🇨‌ Lint needs: change-detection if: fromJSON(needs.change-detection.outputs.run-cpp-linter) - uses: cda-tum/mqt-workflows/.github/workflows/reusable-cpp-linter.yml@v1.5 + uses: cda-tum/mqt-workflows/.github/workflows/reusable-cpp-linter.yml@v1.7 + # run extensive Python tests whenever this is on a PR and the PR has the `extensive-python-ci` label python-tests: name: 🐍 Test needs: change-detection if: fromJSON(needs.change-detection.outputs.run-python-tests) - uses: cda-tum/mqt-workflows/.github/workflows/reusable-python-ci.yml@v1.5 + uses: cda-tum/mqt-workflows/.github/workflows/reusable-python-ci.yml@v1.7 # Explicitly set permissions so that the workflows also work from forks. permissions: contents: read # Required for the `actions/checkout` action id-token: write # Required for the `codecov/codecov-action` action + with: + # Runs to enable + enable-ubuntu2404: true + enable-ubuntu2404-arm: true + enable-macos13: true + enable-macos14: true + enable-windows2022: true + # Runs to disable + enable-ubuntu2204: false + enable-ubuntu2204-arm: false + enable-macos15: false + enable-windows2025: false + + python-tests-extensive: + name: 🐍 Test (Extensive) + needs: change-detection + if: fromJSON(needs.change-detection.outputs.run-python-tests) && github.event_name == 'pull_request' && contains(github.event.pull_request.labels.*.name, 'extensive-python-ci') + uses: cda-tum/mqt-workflows/.github/workflows/reusable-python-ci.yml@v1.7 + # Explicitly set permissions so that the workflows also work from forks. + permissions: + contents: read # Required for the `actions/checkout` action + id-token: write # Required for the `codecov/codecov-action` action + with: + # Runs to enable + enable-ubuntu2204: true + enable-ubuntu2204-arm: true + enable-macos15: true + enable-windows2025: true + # Runs to disable (these are already enabled in the non-extensive run) + enable-ubuntu2404: false + enable-ubuntu2404-arm: false + enable-macos13: false + enable-macos14: false + enable-windows2022: false + + python-linter: + name: 🐍 Lint + needs: change-detection + if: fromJSON(needs.change-detection.outputs.run-python-tests) + uses: cda-tum/mqt-workflows/.github/workflows/reusable-python-linter.yml@v1.7 code-ql: name: 📝 CodeQL needs: change-detection if: fromJSON(needs.change-detection.outputs.run-code-ql) - uses: cda-tum/mqt-workflows/.github/workflows/reusable-code-ql.yml@v1.5 + uses: cda-tum/mqt-workflows/.github/workflows/reusable-code-ql.yml@v1.7 cd: name: 🚀 CD needs: change-detection if: fromJSON(needs.change-detection.outputs.run-cd) - uses: cda-tum/mqt-workflows/.github/workflows/reusable-python-packaging.yml@v1.5 + uses: cda-tum/mqt-workflows/.github/workflows/reusable-python-packaging.yml@v1.7 required-checks-pass: # This job does nothing and is only used for branch protection name: 🚦 Check @@ -65,8 +192,12 @@ jobs: needs: - change-detection - cpp-tests + - cpp-tests-extensive + - cpp-coverage - cpp-linter - python-tests + - python-tests-extensive + - python-linter - code-ql - cd runs-on: ubuntu-latest @@ -79,6 +210,14 @@ jobs: fromJSON(needs.change-detection.outputs.run-cpp-tests) && '' || 'cpp-tests,' }} + ${{ + fromJSON(needs.change-detection.outputs.run-cpp-tests) && github.event_name == 'pull_request' && contains(github.event.pull_request.labels.*.name, 'extensive-cpp-ci') + && '' || 'cpp-tests-extensive,' + }} + ${{ + fromJSON(needs.change-detection.outputs.run-cpp-tests) + && '' || 'cpp-coverage,' + }} ${{ fromJSON(needs.change-detection.outputs.run-cpp-linter) && '' || 'cpp-linter,' @@ -87,6 +226,14 @@ jobs: fromJSON(needs.change-detection.outputs.run-python-tests) && '' || 'python-tests,' }} + ${{ + fromJSON(needs.change-detection.outputs.run-python-tests) && github.event_name == 'pull_request' && contains(github.event.pull_request.labels.*.name, 'extensive-python-ci') + && '' || 'python-tests-extensive,' + }} + ${{ + fromJSON(needs.change-detection.outputs.run-python-tests) + && '' || 'python-linter,' + }} ${{ fromJSON(needs.change-detection.outputs.run-code-ql) && '' || 'code-ql,' diff --git a/.github/workflows/update-mqt-core.yml b/.github/workflows/update-mqt-core.yml index 2ca8dbec..dcb7e55a 100644 --- a/.github/workflows/update-mqt-core.yml +++ b/.github/workflows/update-mqt-core.yml @@ -21,6 +21,6 @@ concurrency: jobs: update-mqt-core: name: ⬆️ Update MQT Core - uses: cda-tum/mqt-workflows/.github/workflows/reusable-mqt-core-update.yml@v1.5 + uses: cda-tum/mqt-workflows/.github/workflows/reusable-mqt-core-update.yml@v1.7 with: update-to-head: ${{ github.event.inputs.update-to-head == 'true' }} diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 5c695bae..e3d2a2ff 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -88,7 +88,7 @@ repos: # Format configuration files with prettier - repo: https://github.com/rbubley/mirrors-prettier - rev: v3.5.2 + rev: v3.5.3 hooks: - id: prettier types_or: [yaml, markdown, html, css, scss, javascript, json] @@ -103,10 +103,11 @@ repos: - nox - numpy - pytest + - mqt.core>=3.0.0b5 # Check for spelling - repo: https://github.com/crate-ci/typos - rev: v1.30.0 + rev: v1.30.1 hooks: - id: typos @@ -121,7 +122,7 @@ repos: # Check best practices for scientific Python code - repo: https://github.com/scientific-python/cookie - rev: 2024.08.19 + rev: 2025.01.22 hooks: - id: sp-repo-review additional_dependencies: ["repo-review[cli]"] @@ -136,6 +137,6 @@ repos: # Check the pyproject.toml file - repo: https://github.com/henryiii/validate-pyproject-schema-store - rev: 2024.11.25 + rev: 2025.02.24 hooks: - id: validate-pyproject diff --git a/.readthedocs.yaml b/.readthedocs.yaml index f943940b..bafbf3ca 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -1,34 +1,42 @@ version: 2 -submodules: - include: all - recursive: true +formats: + - pdf + - htmlzip build: - os: ubuntu-22.04 + os: ubuntu-24.04 tools: - python: "3.11" + python: "3.12" apt_packages: - graphviz + - inkscape jobs: post_checkout: # Skip docs build if the commit message contains "skip ci" - (git --no-pager log --pretty="tformat:%s -- %b" -1 | grep -viq "skip ci") || exit 183 # Skip docs build if there are no changes related to docs - | - if [ "$READTHEDOCS_VERSION_TYPE" = "external" ] && git diff --quiet origin/main -- docs/ .readthedocs.yaml src/mqt/ src/python include/python .github/contributing* .github/workflows/support*; + if [ "$READTHEDOCS_VERSION_TYPE" = "external" ] && git diff --quiet origin/main -- docs/ .readthedocs.yaml src/mqt/ src/python include/*/python .github/contributing* .github/support*; then exit 183; fi # Unshallow the git clone and fetch tags to get proper version information - git fetch --unshallow --tags - -sphinx: - configuration: docs/conf.py - -python: - install: - - method: pip - path: . - extra_requirements: - - docs + pre_build: + # Set up uv + - asdf plugin add uv + - asdf install uv latest + - asdf global uv latest + build: + html: + - uv run --frozen --no-dev --group docs -m sphinx -T -b html -d docs/_build/doctrees -D language=en docs $READTHEDOCS_OUTPUT/html + htmlzip: + - uv run --frozen --no-dev --group docs -m sphinx -T -b dirhtml -d docs/_build/doctrees -D language=en docs docs/_build/dirhtml + - mkdir -p $READTHEDOCS_OUTPUT/htmlzip + - zip -r $READTHEDOCS_OUTPUT/htmlzip/html.zip docs/_build/dirhtml/* + pdf: + - uv run --frozen --no-dev --group docs -m sphinx -T -b latex -d docs/_build/doctrees -D language=en docs docs/_build/latex + - cd docs/_build/latex && latexmk -pdf -f -dvi- -ps- -interaction=nonstopmode -jobname=$READTHEDOCS_PROJECT + - mkdir -p $READTHEDOCS_OUTPUT/pdf + - cp docs/_build/latex/$READTHEDOCS_PROJECT.pdf $READTHEDOCS_OUTPUT/pdf/$READTHEDOCS_PROJECT.pdf diff --git a/LICENSE.md b/LICENSE.md index 8df41d62..2714522d 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2024 Chair for Design Automation, Technical University of Munich +Copyright (c) 2025 Chair for Design Automation, Technical University of Munich Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/apps/CMakeLists.txt b/apps/CMakeLists.txt index d4dd59f7..0c392923 100644 --- a/apps/CMakeLists.txt +++ b/apps/CMakeLists.txt @@ -1,13 +1,12 @@ # macro to add a executable with the given libraries macro(ADD_SIM_EXECUTABLE appname) add_executable(mqt-ddsim-${appname} ${appname}.cpp) - target_link_libraries(mqt-ddsim-${appname} PRIVATE MQT::DDSim ${ARGN}) + target_link_libraries(mqt-ddsim-${appname} PRIVATE MQT::DDSim MQT::CoreQASM ${ARGN}) endmacro() add_sim_executable(simple cxxopts::cxxopts) target_link_libraries(mqt-ddsim-simple PRIVATE MQT::CoreAlgorithms) -add_sim_executable(primebases cxxopts::cxxopts) if(Threads_FOUND) add_sim_executable(noise_aware cxxopts::cxxopts) target_link_libraries(mqt-ddsim-noise_aware PRIVATE Threads::Threads) diff --git a/apps/noise_aware.cpp b/apps/noise_aware.cpp index 4ac6bd01..317e3037 100644 --- a/apps/noise_aware.cpp +++ b/apps/noise_aware.cpp @@ -2,6 +2,7 @@ #include "DeterministicNoiseSimulator.hpp" #include "StochasticNoiseSimulator.hpp" #include "ir/QuantumComputation.hpp" +#include "qasm3/Importer.hpp" #include #include @@ -27,8 +28,7 @@ int main(int argc, char** argv) { // NOLINT(bugprone-exception-escape) ("pm", "print measurements") ("ps", "print simulation stats (applied gates, sim. time, and maximal size of the DD)") ("verbose", "Causes some simulators to print additional information to STDERR") - - ("simulate_file", "simulate a quantum circuit given by file (detection by the file extension)", cxxopts::value()) + ("simulate_file", "simulate a quantum circuit given by an OpenQASM file", cxxopts::value()) ("step_fidelity", "target fidelity for each approximation run (>=1 = disable approximation)", cxxopts::value()->default_value("1.0")) ("steps", "number of approximation steps", cxxopts::value()->default_value("1")) // Parameters for noise aware simulation @@ -45,18 +45,19 @@ int main(int argc, char** argv) { // NOLINT(bugprone-exception-escape) if (vm.count("help") > 0) { std::cout << options.help(); - std::exit(0); + return 0; } std::unique_ptr quantumComputation; if (vm.count("simulate_file") > 0) { const std::string fname = vm["simulate_file"].as(); - quantumComputation = std::make_unique(fname); + quantumComputation = std::make_unique( + qasm3::Importer::importf(fname)); } else { std::cerr << "Did not find anything to simulate. See help below.\n" << options.help() << "\n"; - std::exit(1); + return 1; } if (quantumComputation && quantumComputation->getNqubits() > 100) { diff --git a/apps/primebases.cpp b/apps/primebases.cpp deleted file mode 100644 index 03f91cff..00000000 --- a/apps/primebases.cpp +++ /dev/null @@ -1,86 +0,0 @@ -#include "cxxopts.hpp" - -#include -#include -#include -#include -#include - -namespace { -std::uint64_t gcd(std::uint64_t a, std::uint64_t b) { - while (a != 0) { - const std::uint64_t c = a; - a = b % a; - b = c; - } - return b; -} - -bool isPrime(std::uint64_t number) { - const auto upperLimit = - static_cast(std::floor(std::sqrt(number))); - - for (std::uint64_t a = 2; a <= upperLimit; a++) { - if (number % a == 0) { - return false; - } - } - return true; -} - -void outputCoprimes(const std::uint64_t compositeNumber, - const std::uint64_t length) { - std::uint64_t outputLength = 0; - std::uint64_t currentNumber = 2; - - while (outputLength < length) { - if (gcd(currentNumber, compositeNumber) == 1) { - std::cout << currentNumber << "\n"; - outputLength++; - } - currentNumber++; - } -} - -void outputPrimes(const std::uint64_t compositeNumber, - const std::uint64_t length) { - std::uint64_t outputLength = 0; - std::uint64_t currentNumber = 2; - - while (outputLength < length) { - if (isPrime(currentNumber) && gcd(currentNumber, compositeNumber) == 1) { - std::cout << currentNumber << "\n"; - outputLength++; - } - currentNumber++; - } -} -} // namespace - -int main(int argc, char** argv) { // NOLINT(bugprone-exception-escape) - cxxopts::Options options( - "MQT DDSIM", "see for more information https://www.cda.cit.tum.de/"); - // clang-format off - options.add_options() - ("h,help", "produce help message") - ("N,composite_number", "number of measurements on the final quantum state", cxxopts::value()) - ("S,strategy", "strategy for prime base generation (primes, coprimes)", cxxopts::value()) - ("L,length", "how many bases to generate", cxxopts::value()); - // clang-format on - - auto vm = options.parse(argc, argv); - if (vm.count("help") > 0) { - std::cout << options.help(); - std::exit(0); - } - - if (vm["strategy"].as() == "coprimes") { - outputCoprimes(vm["composite_number"].as(), - vm["length"].as()); - } else if (vm["strategy"].as() == "primes") { - outputPrimes(vm["composite_number"].as(), - vm["length"].as()); - } else { - std::cerr << "Invalid strategy.\n"; - } -} diff --git a/apps/simple.cpp b/apps/simple.cpp index a53224cc..44010bad 100644 --- a/apps/simple.cpp +++ b/apps/simple.cpp @@ -4,12 +4,13 @@ #include "ShorFastSimulator.hpp" #include "ShorSimulator.hpp" #include "Simulator.hpp" -#include "algorithms/Entanglement.hpp" +#include "algorithms/GHZState.hpp" #include "algorithms/Grover.hpp" #include "algorithms/QFT.hpp" #include "dd/DDpackageConfig.hpp" #include "dd/Export.hpp" #include "ir/QuantumComputation.hpp" +#include "qasm3/Importer.hpp" #include #include @@ -55,8 +56,8 @@ int main(int argc, char** argv) { // NOLINT(bugprone-exception-escape) ("pcomplex", "print additional statistics on complex numbers") ("dump_complex", "dump edge weights in final state DD to file", cxxopts::value()) ("verbose", "Causes some simulators to print additional information to STDERR") - ("simulate_file", "simulate a quantum circuit given by file (detection by the file extension)", cxxopts::value()) - ("simulate_file_hybrid", "simulate a quantum circuit given by file (detection by the file extension) using the hybrid Schrodinger-Feynman simulator", cxxopts::value()) + ("simulate_file", "simulate a quantum circuit given by an OpenQASM file", cxxopts::value()) + ("simulate_file_hybrid", "simulate a quantum circuit given by an OpenQASM file using the hybrid Schrodinger-Feynman simulator", cxxopts::value()) ("hybrid_mode", "mode used for hybrid Schrodinger-Feynman simulation (*amplitude*, dd)", cxxopts::value()) ("nthreads", "#threads used for hybrid simulation", cxxopts::value()->default_value("2")) ("simulate_qft", "simulate Quantum Fourier Transform for given number of qubits", cxxopts::value()) @@ -77,7 +78,7 @@ int main(int argc, char** argv) { // NOLINT(bugprone-exception-escape) auto vm = options.parse(argc, argv); if (vm.count("help") > 0) { std::cout << options.help(); - std::exit(0); + return 0; } const auto seed = vm["seed"].as(); @@ -99,12 +100,14 @@ int main(int argc, char** argv) { // NOLINT(bugprone-exception-escape) if (vm.count("simulate_file") > 0) { const std::string fname = vm["simulate_file"].as(); - quantumComputation = std::make_unique(fname); + quantumComputation = std::make_unique( + qasm3::Importer::importf(fname)); ddsim = std::make_unique>( std::move(quantumComputation), approximationInfo, seed); } else if (vm.count("simulate_file_hybrid") > 0) { const std::string fname = vm["simulate_file_hybrid"].as(); - quantumComputation = std::make_unique(fname); + quantumComputation = std::make_unique( + qasm3::Importer::importf(fname)); if (vm.count("hybrid_mode") > 0) { const std::string mname = vm["hybrid_mode"].as(); if (mname == "amplitude") { @@ -126,7 +129,8 @@ int main(int argc, char** argv) { // NOLINT(bugprone-exception-escape) } } else if (vm.count("simulate_qft") > 0) { const unsigned int nQubits = vm["simulate_qft"].as(); - quantumComputation = std::make_unique(nQubits); + quantumComputation = + std::make_unique(qc::createQFT(nQubits)); ddsim = std::make_unique>(std::move(quantumComputation), approximationInfo, seed); } else if (vm.count("simulate_fast_shor") > 0) { @@ -153,7 +157,8 @@ int main(int argc, char** argv) { // NOLINT(bugprone-exception-escape) } } else if (vm.count("simulate_grover") > 0) { const unsigned int nQubits = vm["simulate_grover"].as(); - quantumComputation = std::make_unique(nQubits, seed); + quantumComputation = std::make_unique( + qc::createGrover(nQubits, seed)); ddsim = std::make_unique>(std::move(quantumComputation), approximationInfo, seed); } else if (vm.count("simulate_grover_emulated") > 0) { @@ -164,13 +169,14 @@ int main(int argc, char** argv) { // NOLINT(bugprone-exception-escape) vm["simulate_grover_oracle_emulated"].as(), seed); } else if (vm.count("simulate_ghz") > 0) { const unsigned int nQubits = vm["simulate_ghz"].as(); - quantumComputation = std::make_unique(nQubits); + quantumComputation = + std::make_unique(qc::createGHZState(nQubits)); ddsim = std::make_unique>(std::move(quantumComputation), approximationInfo, seed); } else { std::cerr << "Did not find anything to simulate. See help below.\n" << options.help() << "\n"; - std::exit(1); + return 1; } if (ddsim->getNumberOfQubits() > 100) { @@ -258,7 +264,7 @@ int main(int argc, char** argv) { // NOLINT(bugprone-exception-escape) dynamic_cast*>(ddsim.get())) { outputObj["state_vector"] = hsfSim->getVectorFromHybridSimulation(); } else { - outputObj["state_vector"] = ddsim->getVector(); + outputObj["state_vector"] = ddsim->getCurrentDD().getVector(); } } diff --git a/apps/vectors.cpp b/apps/vectors.cpp deleted file mode 100644 index 434bed28..00000000 --- a/apps/vectors.cpp +++ /dev/null @@ -1,66 +0,0 @@ -#include -#include -#include -#include -#include - -int main(int argc, char** argv) { - // NOLINTBEGIN(cppcoreguidelines-pro-bounds-pointer-arithmetic) - if (argc != 3) { - std::cout << "Usage: " << argv[0] << " file1 file2\n" - << "Calculates the fidelity between two vectors given as file " - "(one complex number per line).\n" - << "Return code is 0 if fidelity is greater than 0.999 and 1 " - "otherwise. 2 for errors.\n"; - return 2; - } - const std::string vector1{argv[1]}; - const std::string vector2{argv[2]}; - - std::cout << "Vector 1 read from '" << argv[1] << "'\n"; - std::cout << "Vector 2 read from '" << argv[2] << "'\n"; - // NOLINTEND(cppcoreguidelines-pro-bounds-pointer-arithmetic) - - std::ifstream v1Stream(vector1); - std::ifstream v2Stream(vector2); - - if (!v1Stream || !v2Stream) { - std::cerr << "Failed to open either or both files."; - return 2; - } - - unsigned lines = 0; - std::complex sum{}; - while (!v1Stream.eof() && !v2Stream.eof()) { - std::string ars; - std::string ais; - std::string brs; - std::string bis; - v1Stream >> ars >> ais; - v2Stream >> brs >> bis; - - if (!v1Stream || !v2Stream) { - break; - } - // istreams cannot read doubles in hexfloat format, so we have to use - // strtold - const long double ar = std::strtold(ars.c_str(), nullptr); - const long double ai = std::strtold(ais.c_str(), nullptr); - const long double br = std::strtold(brs.c_str(), nullptr); - const long double bi = std::strtold(bis.c_str(), nullptr); - - const std::complex a(ar, ai); - const std::complex b(br, bi); - sum += a * std::conj(b); - - lines++; - } - const long double fidelity = std::norm(sum); - - std::cout << "Lines: " << lines << " (Should be a power of two)\n"; - std::cout << "Fidelity: " << fidelity << "\n"; - if (std::abs(1.0L - fidelity) < 0.001L) { - return 0; - } - return 1; -} diff --git a/cmake/ExternalDependencies.cmake b/cmake/ExternalDependencies.cmake index 070ff7b1..73721cbd 100644 --- a/cmake/ExternalDependencies.cmake +++ b/cmake/ExternalDependencies.cmake @@ -4,6 +4,19 @@ include(FetchContent) set(FETCH_PACKAGES "") if(BUILD_MQT_DDSIM_BINDINGS) + # Manually detect the installed mqt-core package. + execute_process( + COMMAND "${Python_EXECUTABLE}" -m mqt.core --cmake_dir + OUTPUT_STRIP_TRAILING_WHITESPACE + OUTPUT_VARIABLE mqt-core_DIR + ERROR_QUIET) + + # Add the detected directory to the CMake prefix path. + if(mqt-core_DIR) + list(APPEND CMAKE_PREFIX_PATH "${mqt-core_DIR}") + message(STATUS "Found mqt-core package: ${mqt-core_DIR}") + endif() + if(NOT SKBUILD) # Manually detect the installed pybind11 package. execute_process( @@ -20,9 +33,9 @@ if(BUILD_MQT_DDSIM_BINDINGS) endif() # cmake-format: off -set(MQT_CORE_VERSION 2.7.0 +set(MQT_CORE_VERSION 3.0.0 CACHE STRING "MQT Core version") -set(MQT_CORE_REV "2ccf532b66998af376c256ae94a39eed802b990c" +set(MQT_CORE_REV "02783e63e81f9cf953e1bafdc536815e968f6c70" CACHE STRING "MQT Core identifier (tag, branch or commit hash)") set(MQT_CORE_REPO_OWNER "cda-tum" CACHE STRING "MQT Core repository owner (change when using a fork)") diff --git a/docs/index.rst b/docs/index.rst index 646f2546..5b58b804 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -24,7 +24,6 @@ We appreciate any feedback and contributions to the project. If you want to cont Installation Quickstart Simulators - Usage Primitives FAQ Publications diff --git a/docs/simulators/CircuitSimulator.ipynb b/docs/simulators/CircuitSimulator.ipynb index 2c11f064..95457ee2 100644 --- a/docs/simulators/CircuitSimulator.ipynb +++ b/docs/simulators/CircuitSimulator.ipynb @@ -79,10 +79,12 @@ "metadata": {}, "outputs": [], "source": [ + "from mqt.core import load\n", "from mqt.ddsim import CircuitSimulator\n", "\n", "# create a CircuitSimulator object\n", - "sim = CircuitSimulator(filename)\n", + "qc = load(filename)\n", + "sim = CircuitSimulator(qc)\n", "\n", "# run the simulation\n", "result = sim.simulate(shots=1024)\n", @@ -108,7 +110,14 @@ "metadata": {}, "outputs": [], "source": [ - "sv = sim.get_vector()\n", + "import numpy as np\n", + "\n", + "# get the final DD\n", + "dd = sim.get_constructed_dd()\n", + "# transform the DD to a vector\n", + "vec = dd.get_vector()\n", + "# transform to a numpy array (without copying)\n", + "sv = np.array(vec, copy=False)\n", "print(sv)" ] }, @@ -122,7 +131,6 @@ "\n", "If you want to inspect the final decision diagram, you can get a Graphviz representation of it.\n", "For that, make sure that you have Graphviz installed and that the `graphviz` Python package is available.\n", - "A simple `pip install graphviz` should do the trick.\n", "Then, you can call the `export_dd_to_graphviz_str` method on the simulator to obtain a Graphviz representation of the decision diagram. The following shows the default configuration options for the export." ] }, @@ -135,7 +143,7 @@ "source": [ "import graphviz\n", "\n", - "dot = sim.export_dd_to_graphviz_str(colored=True, edge_labels=False, classic=False, memory=False, format_as_polar=True)\n", + "dot = dd.to_dot(colored=True, edge_labels=False, classic=False, memory=False, format_as_polar=True)\n", "\n", "graphviz.Source(source=dot)" ] @@ -178,7 +186,8 @@ "qc.measure([0, 1], [0, 1])\n", "\n", "# create a CircuitSimulator object\n", - "sim = CircuitSimulator(qc)\n", + "circ = load(qc)\n", + "sim = CircuitSimulator(circ)\n", "\n", "# run the simulation\n", "result = sim.simulate(shots=1024)\n", @@ -274,10 +283,12 @@ "metadata": {}, "outputs": [], "source": [ + "from mqt.core import load\n", "from mqt.ddsim import CircuitSimulator\n", "\n", "# create a CircuitSimulator object\n", - "sim = CircuitSimulator(filename)\n", + "circ = load(filename)\n", + "sim = CircuitSimulator(circ)\n", "\n", "# run the simulation\n", "result = sim.simulate(shots=1024)\n", diff --git a/docs/simulators/SimulationPathFramework.ipynb b/docs/simulators/SimulationPathFramework.ipynb index 0538c144..136e58d9 100644 --- a/docs/simulators/SimulationPathFramework.ipynb +++ b/docs/simulators/SimulationPathFramework.ipynb @@ -15,7 +15,9 @@ "raw_mimetype": "text/restructuredtext" }, "source": [ - "DDSIM also provides a framework for exploiting arbitrary simulation paths (using the `taskflow `_ library) based on the methods proposed in :cite:p:`burgholzer2022simulation`." + "DDSIM also provides a framework for exploiting arbitrary simulation paths (using the `taskflow `_ library) based on the methods proposed in :cite:p:`burgholzer2022simulation`.\n", + "\n", + ".. note:: As of mqt-ddsim v2.0.0, the Cotengra-based workflow for translating circuits to tensor networks and deriving contraction strategies has been removed. If you want to check out the respective code, please checkout prior versions of mqt-ddsim." ] }, { @@ -34,9 +36,7 @@ "- `sequential` (*default*): simulate the circuit sequentially from left to right using only MxV multiplications\n", "- `pairwise_recursive`: recursively group pairs of states and operations to form a binary tree of MxV/MxM multiplications\n", "- `bracket`: group certain number of operations according to a given `bracket_size`\n", - "- `alternating`: start the simulation in the middle of the circuit and alternate between applications of gates \"from the left\" and \"from the right\" (useful for equivalence checking)\n", - "\n", - "as well as the option to translate strategies from the domain of tensor networks to decision diagrams (using the [CoTenGra](https://github.com/jcmgray/cotengra) library), see [here](#Using-CoTenGra-to-translate-tensor-network-strategies).\n", + "- `alternating`: start the simulation in the middle of the circuit and alternate between applications of gates \"from the left\" and \"from the right\" (useful for equivalence checking).\n", "\n", "## Simulating a simple circuit\n", "\n", @@ -112,51 +112,19 @@ "print(result.get_counts())" ] }, - { - "cell_type": "markdown", - "id": "1530ec1a2553a1f5", - "metadata": {}, - "source": [ - "## Using CoTenGra to translate tensor network strategies\n", - "\n", - "Instead of re-inventing the wheel, the framework allows to translate strategies from the domain of tensor networks to decision diagrams.\n", - "To this end, the tensor network contraction library [CoTenGra](https://github.com/jcmgray/cotengra) is used.\n", - "In order to use this part of the framework, `mqt.ddsim` needs to be installed with the `tnflow` extra, i.e., `pip install \"mqt.ddsim[tnflow]\"`.\n", - "\n", - "Then, in order to let CoTenGra determine a simulation path for a given circuit the `mode=\"cotengra\"` option has to be used when calling `backend.run`." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "7fb635a177c23d0b", - "metadata": {}, - "outputs": [], - "source": [ - "job = backend.run(circ, mode=\"cotengra\", cotengra_plot_ring=True)\n", - "\n", - "result = job.result()\n", - "print(result.get_counts())" - ] - }, { "cell_type": "markdown", "id": "47e2f5c383980291", "metadata": {}, "source": [ - "Per default this uses a maximum of `60s` (option `cotengra_max_time`) and `1024` trials (option `cotengra_max_repeats`) for CoTenGra and dumps a representation of the determined simulation path to a file in the current working directory (option `cotengra_dump_path`).\n", - "Optionally, a visualization of the simulation path can be generated by specifying `cotengra_plot_ring=True`.\n", - "\n", "## Configuration\n", "\n", "The framework can be configured using multiple options (which can be passed to the `backend.run()` method):\n", "\n", - "- `mode`: the simulation path mode to use (`sequential`, `pairwise_recursive`, `bracket`, `alternating`, `cotengra`))\n", + "- `mode`: the simulation path mode to use (`sequential`, `pairwise_recursive`, `bracket`, `alternating`))\n", "- `bracket_size`: the bracket size used for the `bracket` mode (default: `2`)\n", "- `alternating_start`: the id of the operation to start with in the `alternating` mode (default: `0`)\n", - "- `seed`: the random seed used for the simulator (default `0`, i.e., no particular seed)\n", - "\n", - "In addition to the above, CoTenGra can be configured using the options described [above](#Using-CoTenGra-to-translate-tensor-network-strategies)." + "- `seed`: the random seed used for the simulator (default `0`, i.e., no particular seed)." ] } ], diff --git a/docs/simulators/UnitarySimulator.ipynb b/docs/simulators/UnitarySimulator.ipynb index ac9f9e0b..e6f8a17e 100644 --- a/docs/simulators/UnitarySimulator.ipynb +++ b/docs/simulators/UnitarySimulator.ipynb @@ -49,16 +49,19 @@ "source": [ "import graphviz\n", "\n", + "from mqt.core import load\n", "from mqt.ddsim import UnitarySimulator\n", "\n", "# Create the simulator\n", - "sim = UnitarySimulator(qc)\n", + "circ = load(qc)\n", + "sim = UnitarySimulator(circ)\n", "\n", "# Construct the decision diagram representation of the unitary\n", "sim.construct()\n", "\n", "# Get the decision diagram representation of the unitary\n", - "dot = sim.export_dd_to_graphviz_str(colored=True, edge_labels=True, classic=False)\n", + "dd = sim.get_constructed_dd()\n", + "dot = dd.to_dot(colored=True, edge_labels=True, classic=False)\n", "\n", "graphviz.Source(source=dot)" ] @@ -72,11 +75,9 @@ "source": [ "import numpy as np\n", "\n", - "from mqt.ddsim import get_matrix\n", - "\n", "# Get the matrix representation of the unitary\n", - "unitary = np.zeros((2**qc.num_qubits, 2**qc.num_qubits), dtype=np.complex128)\n", - "get_matrix(sim, unitary)\n", + "mat = dd.get_matrix(qc.num_qubits)\n", + "unitary = np.array(mat, copy=False)\n", "\n", "print(unitary)" ] @@ -117,16 +118,19 @@ "source": [ "import graphviz\n", "\n", + "from mqt.core import load\n", "from mqt.ddsim import UnitarySimulator\n", "\n", "# Create the simulator\n", - "sim = UnitarySimulator(qc)\n", + "circ = load(qc)\n", + "sim = UnitarySimulator(circ)\n", "\n", "# Construct the decision diagram representation of the unitary\n", "sim.construct()\n", "\n", "# Get the decision diagram representation of the unitary\n", - "dot = sim.export_dd_to_graphviz_str(colored=True, edge_labels=True, classic=False)\n", + "dd = sim.get_constructed_dd()\n", + "dot = dd.to_dot(colored=True, edge_labels=True, classic=False)\n", "\n", "graphviz.Source(source=dot)" ] @@ -140,11 +144,8 @@ "source": [ "import numpy as np\n", "\n", - "from mqt.ddsim import get_matrix\n", - "\n", - "unitary = np.zeros((2**qc.num_qubits, 2**qc.num_qubits), dtype=np.complex128)\n", - "\n", - "get_matrix(sim, unitary)\n", + "mat = dd.get_matrix(qc.num_qubits)\n", + "unitary = np.array(mat, copy=False)\n", "\n", "unitary" ] @@ -181,16 +182,19 @@ "source": [ "import graphviz\n", "\n", + "from mqt.core import load\n", "from mqt.ddsim import UnitarySimulator\n", "\n", "# Create the simulator\n", - "sim = UnitarySimulator(qc)\n", + "circ = load(qc)\n", + "sim = UnitarySimulator(circ)\n", "\n", "# Construct the decision diagram representation of the unitary\n", "sim.construct()\n", "\n", "# Get the decision diagram representation of the unitary\n", - "dot = sim.export_dd_to_graphviz_str(colored=True, edge_labels=True, classic=False)\n", + "dd = sim.get_constructed_dd()\n", + "dot = dd.to_dot(colored=True, edge_labels=True, classic=False)\n", "\n", "graphviz.Source(source=dot)" ] @@ -204,11 +208,8 @@ "source": [ "import numpy as np\n", "\n", - "from mqt.ddsim import get_matrix\n", - "\n", - "unitary = np.zeros((2**qc.num_qubits, 2**qc.num_qubits), dtype=np.complex128)\n", - "\n", - "get_matrix(sim, unitary)\n", + "mat = dd.get_matrix(qc.num_qubits)\n", + "unitary = np.array(mat, copy=False)\n", "\n", "unitary" ] @@ -248,16 +249,19 @@ "source": [ "import graphviz\n", "\n", + "from mqt.core import load\n", "from mqt.ddsim import UnitarySimulator\n", "\n", "# Create the simulator\n", - "sim = UnitarySimulator(qc)\n", + "circ = load(qc)\n", + "sim = UnitarySimulator(circ)\n", "\n", "# Construct the decision diagram representation of the unitary\n", "sim.construct()\n", "\n", "# Get the decision diagram representation of the unitary\n", - "dot = sim.export_dd_to_graphviz_str(colored=True, edge_labels=True, classic=False)\n", + "dd = sim.get_constructed_dd()\n", + "dot = dd.to_dot(colored=True, edge_labels=True, classic=False)\n", "\n", "graphviz.Source(source=dot)" ] @@ -271,13 +275,10 @@ "source": [ "import numpy as np\n", "\n", - "from mqt.ddsim import get_matrix\n", - "\n", - "unitary = np.zeros((2**qc.num_qubits, 2**qc.num_qubits), dtype=np.complex128)\n", - "\n", - "get_matrix(sim, unitary)\n", + "mat = dd.get_matrix(qc.num_qubits)\n", + "unitary = np.array(mat, copy=False)\n", "\n", - "print(unitary)" + "unitary" ] }, { @@ -317,16 +318,19 @@ "source": [ "import graphviz\n", "\n", + "from mqt.core import load\n", "from mqt.ddsim import UnitarySimulator\n", "\n", "# Create the simulator\n", - "sim = UnitarySimulator(qc)\n", + "circ = load(qc)\n", + "sim = UnitarySimulator(circ)\n", "\n", "# Construct the decision diagram representation of the unitary\n", "sim.construct()\n", "\n", "# Get the decision diagram representation of the unitary\n", - "dot = sim.export_dd_to_graphviz_str(colored=True, edge_labels=True, classic=False)\n", + "dd = sim.get_constructed_dd()\n", + "dot = dd.to_dot(colored=True, edge_labels=True, classic=False)\n", "\n", "graphviz.Source(source=dot)" ] @@ -340,11 +344,8 @@ "source": [ "import numpy as np\n", "\n", - "from mqt.ddsim import get_matrix\n", - "\n", - "unitary = np.zeros((2**qc.num_qubits, 2**qc.num_qubits), dtype=np.complex128)\n", - "\n", - "get_matrix(sim, unitary)\n", + "mat = dd.get_matrix(qc.num_qubits)\n", + "unitary = np.array(mat, copy=False)\n", "\n", "unitary" ] @@ -390,16 +391,19 @@ "source": [ "import graphviz\n", "\n", + "from mqt.core import load\n", "from mqt.ddsim import UnitarySimulator\n", "\n", "# Create the simulator\n", - "sim = UnitarySimulator(qc)\n", + "circ = load(qc)\n", + "sim = UnitarySimulator(circ)\n", "\n", "# Construct the decision diagram representation of the unitary\n", "sim.construct()\n", "\n", "# Get the decision diagram representation of the unitary\n", - "dot = sim.export_dd_to_graphviz_str(colored=True, edge_labels=False, classic=False)\n", + "dd = sim.get_constructed_dd()\n", + "dot = dd.to_dot(colored=True, edge_labels=True, classic=False)\n", "\n", "graphviz.Source(source=dot)" ] @@ -413,11 +417,8 @@ "source": [ "import numpy as np\n", "\n", - "from mqt.ddsim import get_matrix\n", - "\n", - "unitary = np.zeros((2**qc.num_qubits, 2**qc.num_qubits), dtype=np.complex128)\n", - "\n", - "get_matrix(sim, unitary)\n", + "mat = dd.get_matrix(qc.num_qubits)\n", + "unitary = np.array(mat, copy=False)\n", "\n", "unitary" ] @@ -502,6 +503,7 @@ "import graphviz\n", "from qiskit import QuantumCircuit\n", "\n", + "from mqt.core import load\n", "from mqt.ddsim import ConstructionMode, UnitarySimulator\n", "\n", "qc = QuantumCircuit(3)\n", @@ -511,13 +513,15 @@ "qc.cx(2, 1)\n", "\n", "# Create the simulator\n", - "sim = UnitarySimulator(qc, mode=ConstructionMode.recursive)\n", + "circ = load(qc)\n", + "sim = UnitarySimulator(circ, mode=ConstructionMode.recursive)\n", "\n", "# Construct the decision diagram representation of the unitary\n", "sim.construct()\n", "\n", "# Get the decision diagram representation of the unitary\n", - "dot = sim.export_dd_to_graphviz_str(colored=True, edge_labels=True, classic=False)\n", + "dd = sim.get_constructed_dd()\n", + "dot = dd.to_dot(colored=True, edge_labels=True, classic=False)\n", "\n", "graphviz.Source(source=dot)" ] diff --git a/include/HybridSchrodingerFeynmanSimulator.hpp b/include/HybridSchrodingerFeynmanSimulator.hpp index 07d9bf36..923c25da 100644 --- a/include/HybridSchrodingerFeynmanSimulator.hpp +++ b/include/HybridSchrodingerFeynmanSimulator.hpp @@ -14,7 +14,6 @@ #include #include #include -#include #include #include #include @@ -67,7 +66,7 @@ class HybridSchrodingerFeynmanSimulator : public CircuitSimulator { if (getMode() == Mode::Amplitude) { return finalAmplitudes; } - return CircuitSimulator::getVector(); + return CircuitSimulator::rootEdge.getVector(); } // Get # of decisions for given split_qubit, so that lower slice: q0 < i < @@ -76,12 +75,6 @@ class HybridSchrodingerFeynmanSimulator : public CircuitSimulator { [[nodiscard]] Mode getMode() const { return mode; } -protected: - /// See Simulator::exportDDtoGraphviz - void exportDDtoGraphviz(std::ostream& os, bool colored, bool edgeLabels, - bool classic, bool memory, - bool formatAsPolar) override; - private: std::size_t nthreads = 2; dd::CVec finalAmplitudes; diff --git a/include/PathSimulator.hpp b/include/PathSimulator.hpp index 841d0e5b..81ced45c 100644 --- a/include/PathSimulator.hpp +++ b/include/PathSimulator.hpp @@ -67,7 +67,6 @@ class PathSimulator : public CircuitSimulator { PairwiseRecursiveGrouping, BracketGrouping, Alternating, - Cotengra, GateCost }; @@ -106,10 +105,7 @@ class PathSimulator : public CircuitSimulator { if (mode == "alternating" || mode == "3") { return Mode::Alternating; } - if (mode == "cotengra" || mode == "4") { - return Mode::Cotengra; - } - if (mode == "gate_cost" || mode == "5") { + if (mode == "gate_cost" || mode == "4") { return Mode::GateCost; } @@ -126,8 +122,6 @@ class PathSimulator : public CircuitSimulator { return "bracket"; case Mode::Alternating: return "alternating"; - case Mode::Cotengra: - return "cotengra"; case Mode::GateCost: return "gate_cost"; default: @@ -182,8 +176,6 @@ class PathSimulator : public CircuitSimulator { case Configuration::Mode::PairwiseRecursiveGrouping: generatePairwiseRecursiveGroupingSimulationPath(); break; - case Configuration::Mode::Cotengra: - break; case Configuration::Mode::Alternating: generateAlternatingSimulationPath(configuration.startingPoint); break; diff --git a/include/ShorSimulator.hpp b/include/ShorSimulator.hpp index 3dca7b11..64d5e2ea 100644 --- a/include/ShorSimulator.hpp +++ b/include/ShorSimulator.hpp @@ -4,7 +4,6 @@ #include "dd/DDDefinitions.hpp" #include "dd/DDpackageConfig.hpp" #include "dd/Node.hpp" -#include "ir/operations/Control.hpp" #include #include @@ -49,13 +48,6 @@ class ShorSimulator : public Simulator { void uAEmulate(std::uint64_t a, std::int32_t q); - void applyGate(dd::GateMatrix matrix, dd::Qubit target, - const qc::Controls& controls); - - void applyGate(dd::GateMatrix matrix, dd::Qubit target, qc::Control control); - - void applyGate(dd::GateMatrix matrix, dd::Qubit target); - std::vector ts; dd::mEdge addConst(std::uint64_t a); diff --git a/include/Simulator.hpp b/include/Simulator.hpp index afc5d570..1309d8ea 100644 --- a/include/Simulator.hpp +++ b/include/Simulator.hpp @@ -15,10 +15,8 @@ #include #include #include -#include #include #include -#include #include #include #include @@ -70,25 +68,9 @@ template class Simulator { return results; } - char measureOneCollapsing(const dd::Qubit index, - const bool assumeProbabilityNormalization = true) { - assert(index < getNumberOfQubits()); - return dd->measureOneCollapsing( - rootEdge, index, assumeProbabilityNormalization, mt, epsilon); - } - std::map sampleFromAmplitudeVectorInPlace( std::vector>& amplitudes, std::size_t shots); - [[nodiscard]] dd::CVec getVector() const { - if (getNumberOfQubits() >= 60) { - // On 64bit system the vector can hold up to (2^60)-1 elements, if memory - // permits - throw std::range_error("getVector only supports less than 60 qubits."); - } - return rootEdge.getVector(); - } - [[nodiscard]] virtual std::size_t getActiveNodeCount() const { return dd->template getUniqueTable().getNumActiveEntries(); } @@ -109,6 +91,10 @@ template class Simulator { return rootEdge.size(); } + [[nodiscard]] auto getCurrentDD() const -> const dd::vEdge& { + return rootEdge; + } + [[nodiscard]] std::pair getPathOfLeastResistance() const; @@ -154,43 +140,6 @@ template class Simulator { dd::vEdge edge, std::map& dagEdges); - /** - * @brief Get a GraphViz representation of the currently stored DD. - * @param colored Whether to output color-coded edge weights or black and - * white. - * @param edgeLabels Whether to output edge labels. - * @param classic Whether to use the classic visualization or a more modern - * representation. - * @param memory An alternative representation for nodes that includes - * detailed memory information. - * @param formatAsPolar Whether to format the complex numbers as polar or - * cartesian coordinates. - * @returns A Graphviz program representing the current DD - */ - std::string exportDDtoGraphvizString(bool colored = true, - bool edgeLabels = false, - bool classic = false, - bool memory = false, - bool formatAsPolar = true); - - /** - * @brief Write a GraphViz representation of the currently stored DD to a - * file. - * @param filename The name of the file to write to. - * @param colored Whether to output color-coded edge weights or black and - * white. - * @param edgeLabels Whether to output edge labels. - * @param classic Whether to use the classic visualization or a more modern - * representation. - * @param memory An alternative representation for nodes that includes - * detailed memory information. - * @param formatAsPolar Whether to format the complex numbers as polar or - * cartesian coordinates. - */ - void exportDDtoGraphvizFile(const std::string& filename, bool colored = true, - bool edgeLabels = false, bool classic = false, - bool memory = false, bool formatAsPolar = true); - std::unique_ptr> dd = std::make_unique>(); dd::vEdge rootEdge = dd::vEdge::one(); @@ -201,8 +150,4 @@ template class Simulator { std::uint64_t seed = 0; bool hasFixedSeed; dd::fp epsilon = 0.001; - - virtual void exportDDtoGraphviz(std::ostream& os, bool colored, - bool edgeLabels, bool classic, bool memory, - bool formatAsPolar); }; diff --git a/include/UnitarySimulator.hpp b/include/UnitarySimulator.hpp index 55d7ee81..c3a181b5 100644 --- a/include/UnitarySimulator.hpp +++ b/include/UnitarySimulator.hpp @@ -8,7 +8,6 @@ #include #include #include -#include class UnitarySimulator : public CircuitSimulator { @@ -34,12 +33,6 @@ class UnitarySimulator [[nodiscard]] std::size_t getFinalNodeCount() const { return e.size(); } [[nodiscard]] std::size_t getMaxNodeCount() const override; -protected: - /// See Simulator::exportDDtoGraphviz - void exportDDtoGraphviz(std::ostream& os, bool colored, bool edgeLabels, - bool classic, bool memory, - bool formatAsPolar) override; - private: qc::MatrixDD e{}; diff --git a/noxfile.py b/noxfile.py index f9738692..85c8e1db 100644 --- a/noxfile.py +++ b/noxfile.py @@ -14,22 +14,11 @@ from collections.abc import Sequence nox.needs_version = ">=2024.3.2" -nox.options.default_venv_backend = "uv|virtualenv" +nox.options.default_venv_backend = "uv" nox.options.sessions = ["lint", "tests", "minimums"] -PYTHON_ALL_VERSIONS = ["3.9", "3.10", "3.11", "3.12"] - -# The following lists all the build requirements for building the package. -# Note that this includes transitive build dependencies of package dependencies, -# since we use `--no-build-isolation` to install the package in editable mode -# and get better caching performance. This only concerns dependencies that are -# not available via wheels on PyPI (i.e., only as source distributions). -BUILD_REQUIREMENTS = [ - "scikit-build-core>=0.10.1", - "setuptools_scm>=8.1", - "pybind11>=2.13.5", -] +PYTHON_ALL_VERSIONS = ["3.9", "3.10", "3.11", "3.12", "3.13"] if os.environ.get("CI", None): nox.options.error_on_missing_interpreters = True @@ -49,10 +38,8 @@ def _run_tests( *, install_args: Sequence[str] = (), run_args: Sequence[str] = (), - extras: Sequence[str] = (), ) -> None: - posargs = list(session.posargs) - env = {} + env = {"UV_PROJECT_ENVIRONMENT": session.virtualenv.location} if os.environ.get("CI", None) and sys.platform == "win32": env["SKBUILD_CMAKE_ARGS"] = "-T ClangCL" @@ -61,15 +48,38 @@ def _run_tests( if shutil.which("ninja") is None: session.install("ninja") - extras_ = ["test", *extras] - if "--cov" in posargs: - extras_.append("coverage") - posargs.append("--cov-config=pyproject.toml") - - session.install(*BUILD_REQUIREMENTS, *install_args, env=env) - install_arg = f"-ve.[{','.join(extras_)}]" - session.install("--no-build-isolation", install_arg, *install_args, env=env) - session.run("pytest", *run_args, *posargs, env=env) + # install build and test dependencies on top of the existing environment + session.run( + "uv", + "sync", + "--inexact", + "--only-group", + "build", + "--only-group", + "test", + "--verbose", + # Build mqt-core from source to work around pybind believing that two + # compiled extensions might not be binary compatible. + # This will be fixed in a new pybind11 release that includes https://github.com/pybind/pybind11/pull/5439. + "--no-binary-package", + "mqt-core", + *install_args, + env=env, + ) + session.run( + "uv", + "run", + "--no-dev", # do not auto-install dev dependencies + "--no-build-isolation-package", + "mqt-ddsim", # build the project without isolation + "--verbose", + *install_args, + "pytest", + *run_args, + *session.posargs, + "--cov-config=pyproject.toml", + env=env, + ) @nox.session(reuse_venv=True, python=PYTHON_ALL_VERSIONS) @@ -86,7 +96,9 @@ def minimums(session: nox.Session) -> None: install_args=["--resolution=lowest-direct"], run_args=["-Wdefault"], ) - session.run("uv", "pip", "list") + env = {"UV_PROJECT_ENVIRONMENT": session.virtualenv.location} + session.run("uv", "tree", "--frozen", env=env) + session.run("uv", "lock", "--refresh", env=env) @nox.session(reuse_venv=True) @@ -97,13 +109,26 @@ def docs(session: nox.Session) -> None: args, posargs = parser.parse_known_args(session.posargs) serve = args.builder == "html" and session.interactive - extra_installs = ["sphinx-autobuild"] if serve else [] - session.install(*BUILD_REQUIREMENTS, *extra_installs) - session.install("--no-build-isolation", "-ve.[docs]") - - if args.builder == "linkcheck": - session.run("sphinx-build", "-b", "linkcheck", "docs", "docs/_build/linkcheck", *posargs) - return + if serve: + session.install("sphinx-autobuild") + + env = {"UV_PROJECT_ENVIRONMENT": session.virtualenv.location} + # install build and docs dependencies on top of the existing environment + session.run( + "uv", + "sync", + "--inexact", + "--only-group", + "build", + "--only-group", + "docs", + # Build mqt-core from source to work around pybind believing that two + # compiled extensions might not be binary compatible. + # This will be fixed in a new pybind11 release that includes https://github.com/pybind/pybind11/pull/5439. + "--no-binary-package", + "mqt-core", + env=env, + ) shared_args = ( "-n", # nitpicky mode @@ -114,7 +139,13 @@ def docs(session: nox.Session) -> None: *posargs, ) - if serve: - session.run("sphinx-autobuild", *shared_args) - else: - session.run("sphinx-build", "--keep-going", *shared_args) + session.run( + "uv", + "run", + "--no-dev", # do not auto-install dev dependencies + "--no-build-isolation-package", + "mqt-ddsim", # build the project without isolation + "sphinx-autobuild" if serve else "sphinx-build", + *shared_args, + env=env, + ) diff --git a/pyproject.toml b/pyproject.toml index 53d941f1..70637831 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,8 +1,9 @@ [build-system] requires = [ - "scikit-build-core>=0.10.1", - "setuptools-scm>=8.1", - "pybind11>=2.13.5", + "scikit-build-core>=0.11.0", + "setuptools-scm>=8.1", + "pybind11>=2.13.5", + "mqt.core>=3.0.0b5", ] build-backend = "scikit_build_core.build" @@ -15,7 +16,8 @@ authors = [ { name = "Stefan Hillmich", email = "stefan.hillmich@scch.at" }, ] keywords = ["MQT", "quantum-computing", "design-automation", "quantum-circuit-sim", "simulation"] -license = { file = "LICENSE.md" } +license = "MIT" +license-files = ["LICENSE.md"] classifiers = [ "Topic :: Scientific/Engineering :: Electronic Design Automation (EDA)", @@ -24,7 +26,6 @@ classifiers = [ "Operating System :: POSIX :: Linux", "Operating System :: MacOS", "Operating System :: Microsoft :: Windows", - "License :: OSI Approved :: MIT License", "Programming Language :: C++", "Programming Language :: Python", "Programming Language :: Python :: 3", @@ -38,39 +39,10 @@ classifiers = [ ] requires-python = ">=3.9" dependencies = [ - "qiskit[qasm3-import]>=1.0.0" + "mqt.core[qiskit]>=3.0.0b5", ] dynamic = ["version"] -[project.optional-dependencies] -tnflow = [ - "cotengra", - "sparse", - "opt-einsum", - "quimb", - "pandas", - "numpy", - "kahypar", - "networkx", -] -test = ["pytest>=7.2"] -coverage = ["mqt.ddsim[test]", "pytest-cov>=4"] -docs = [ - "mqt.ddsim[tnflow]", - "furo>=2023.9.10", - "setuptools-scm>=8.1", - "sphinxcontrib-bibtex>=2.4.2", - "sphinx-copybutton>=0.5", - "ipykernel", - "nbsphinx", - "breathe", - "sphinxext-opengraph>=0.9", - "sphinx-autodoc-typehints", - "qiskit[visualization]", - "graphviz", -] -dev = ["mqt.ddsim[tnflow, coverage, docs]"] - [project.urls] Homepage = "https://github.com/cda-tum/mqt-ddsim" Documentation = "https://mqt.readthedocs.io/projects/ddsim" @@ -116,6 +88,7 @@ sdist.exclude = [ BUILD_MQT_DDSIM_TESTS = "OFF" BUILD_MQT_DDSIM_BINDINGS = "ON" BUILD_MQT_DDSIM_CLI = "OFF" +ENABLE_IPO = "ON" [[tool.scikit-build.overrides]] if.python-version = ">=3.13" @@ -179,6 +152,7 @@ warn_unreachable = true [tool.ruff] line-length = 120 +namespace-packages = ["mqt"] preview = true unsafe-fixes = true @@ -294,15 +268,30 @@ manylinux-aarch64-image = "manylinux_2_28" manylinux-ppc64le-image = "manylinux_2_28" manylinux-s390x-image = "manylinux_2_28" +# The mqt-core shared libraries are provided by the mqt-core Python package. +# They should not be vendorized into the mqt-qcec wheel. This requires +# excluding the shared libraries from the repair process. + [tool.cibuildwheel.linux] environment = { DEPLOY = "ON" } +# The SOVERSION needs to be updated when the shared libraries are updated. +repair-wheel-command = """auditwheel repair -w {dest_dir} {wheel} \ +--exclude libmqt-core-ir.so.3.0 \ +--exclude libmqt-core-qasm.so.3.0 \ +--exclude libmqt-core-circuit-optimizer.so.3.0 \ +--exclude libmqt-core-dd.so.3.0""" [tool.cibuildwheel.macos] environment = { MACOSX_DEPLOYMENT_TARGET = "10.15" } +repair-wheel-command = "delocate-wheel --require-archs {delocate_archs} -w {dest_dir} -v {wheel} --ignore-missing-dependencies" [tool.cibuildwheel.windows] -before-build = "pip install delvewheel>=1.7.3" -repair-wheel-command = "delvewheel repair -v -w {dest_dir} {wheel} --namespace-pkg mqt" +before-build = "uv pip install delvewheel>=1.9.0" +repair-wheel-command = """delvewheel repair -w {dest_dir} {wheel} --namespace-pkg mqt \ +--exclude mqt-core-ir.dll \ +--exclude mqt-core-qasm.dll \ +--exclude mqt-core-circuit-optimizer.dll \ +--exclude mqt-core-dd.dll""" environment = { CMAKE_ARGS = "-T ClangCL" } [[tool.cibuildwheel.overrides]] @@ -311,4 +300,45 @@ environment = { MACOSX_DEPLOYMENT_TARGET = "11.0" } [tool.uv] +required-version = ">=0.5.20" reinstall-package = ["mqt.ddsim"] + + +[tool.uv.sources] +mqt-ddsim = { workspace = true } + +[dependency-groups] +build = [ + "pybind11>=2.13.6", + "scikit-build-core>=0.11.0", + "setuptools-scm>=8.1", + "mqt.core>=3.0.0b5", +] +docs = [ + "furo>=2024.8.6", + "qiskit[visualization]>=1.0.0", + "setuptools-scm>=8.1", + "sphinx-autoapi>=3.6.0", + "sphinx-copybutton>=0.5.2", + "sphinx-design>=0.6.1", + "sphinxcontrib-bibtex>=2.6.3", + "sphinxcontrib-svg2pdfconverter>=1.2.3", + "sphinxext-opengraph>=0.9.1", + "ipykernel>=6.29.5", + "nbsphinx>=0.9.6", + "sphinx-autodoc-typehints>=2.3.0", + "sphinx>=7.4.7", + "sphinx>=8.1.3; python_version >= '3.10'", + "sphinx>=8.2.3; python_version >= '3.11'", + "breathe>=4.36.0", + "graphviz>=0.20.3", +] +test = [ + "pytest>=8.3.4", + "pytest-cov>=6", +] +dev = [ + {include-group = "build"}, + {include-group = "docs"}, + {include-group = "test"}, +] diff --git a/src/CircuitSimulator.cpp b/src/CircuitSimulator.cpp index d08379aa..f8d0bfb1 100644 --- a/src/CircuitSimulator.cpp +++ b/src/CircuitSimulator.cpp @@ -113,7 +113,7 @@ dd::fp CircuitSimulator::expectationValue( // construct the DD for the observable const auto observableDD = - dd::buildFunctionality(&observable, *Simulator::dd); + dd::buildFunctionality(observable, *Simulator::dd); // calculate the expectation value return Simulator::dd->expectationValue(observableDD, @@ -124,42 +124,27 @@ template void CircuitSimulator::initializeSimulation(const std::size_t nQubits) { Simulator::rootEdge = Simulator::dd->makeZeroState(static_cast(nQubits)); - Simulator::dd->incRef(Simulator::rootEdge); } template char CircuitSimulator::measure(const dd::Qubit i) { - return Simulator::measureOneCollapsing(i); + return Simulator::dd->measureOneCollapsing( + Simulator::rootEdge, static_cast(i), + Simulator::mt); } template void CircuitSimulator::reset(qc::NonUnitaryOperation* nonUnitaryOp) { - const auto& qubits = nonUnitaryOp->getTargets(); - for (const auto& qubit : qubits) { - auto bit = Simulator::dd->measureOneCollapsing( - Simulator::rootEdge, static_cast(qubit), true, - Simulator::mt); - // apply an X operation whenever the measured result is one - if (bit == '1') { - const auto x = qc::StandardOperation(qubit, qc::X); - auto tmp = Simulator::dd->multiply( - dd::getDD(&x, *Simulator::dd), Simulator::rootEdge); - Simulator::dd->incRef(tmp); - Simulator::dd->decRef(Simulator::rootEdge); - Simulator::rootEdge = tmp; - Simulator::dd->garbageCollect(); - } - } + Simulator::rootEdge = + dd::applyReset(*nonUnitaryOp, Simulator::rootEdge, + *Simulator::dd, Simulator::mt); } template void CircuitSimulator::applyOperationToState( std::unique_ptr& op) { - auto ddOp = dd::getDD(op.get(), *Simulator::dd); - auto tmp = Simulator::dd->multiply(ddOp, Simulator::rootEdge); - Simulator::dd->incRef(tmp); - Simulator::dd->decRef(Simulator::rootEdge); - Simulator::rootEdge = tmp; + Simulator::rootEdge = dd::applyUnitaryOperation( + *op, Simulator::rootEdge, *Simulator::dd); } template diff --git a/src/DeterministicNoiseSimulator.cpp b/src/DeterministicNoiseSimulator.cpp index a75d1d4b..ed62e479 100644 --- a/src/DeterministicNoiseSimulator.cpp +++ b/src/DeterministicNoiseSimulator.cpp @@ -22,12 +22,11 @@ using CN = dd::ComplexNumbers; void DeterministicNoiseSimulator::initializeSimulation( const std::size_t nQubits) { rootEdge = dd->makeZeroDensityOperator(static_cast(nQubits)); - dd->incRef(DeterministicNoiseSimulator::rootEdge); } void DeterministicNoiseSimulator::applyOperationToState( std::unique_ptr& op) { - auto operation = dd::getDD(op.get(), *Simulator::dd); + auto operation = dd::getDD(*op, *Simulator::dd); dd->applyOperationToDensity(DeterministicNoiseSimulator::rootEdge, operation); deterministicNoiseFunctionality.applyNoiseEffects( DeterministicNoiseSimulator::rootEdge, op); @@ -44,7 +43,7 @@ void DeterministicNoiseSimulator::reset(qc::NonUnitaryOperation* nonUnitaryOp) { dd->measureOneCollapsing(rootEdge, static_cast(qubit), mt); if (result == '1') { const auto x = qc::StandardOperation(qubit, qc::X); - const auto operation = dd::getDD(&x, *dd); + const auto operation = dd::getDD(x, *dd); rootEdge = dd->applyOperationToDensity(rootEdge, operation); } } diff --git a/src/GroverSimulator.cpp b/src/GroverSimulator.cpp index 4ef50480..9fb75701 100644 --- a/src/GroverSimulator.cpp +++ b/src/GroverSimulator.cpp @@ -26,7 +26,7 @@ GroverSimulator::simulate(std::size_t shots) { } const dd::Edge setupOp{ - dd::buildFunctionality(&qcSetup, *Simulator::dd)}; + dd::buildFunctionality(qcSetup, *Simulator::dd)}; // Build the oracle qc::QuantumComputation qcOracle(nQubits + nAnciallae); @@ -38,7 +38,7 @@ GroverSimulator::simulate(std::size_t shots) { qcOracle.mcz(controls, nQubits); const dd::Edge oracleOp{ - dd::buildFunctionality(&qcOracle, *Simulator::dd)}; + dd::buildFunctionality(qcOracle, *Simulator::dd)}; // Build the diffusion stage. qc::QuantumComputation qcDiffusion(nQubits + nAnciallae); @@ -68,7 +68,7 @@ GroverSimulator::simulate(std::size_t shots) { } const dd::Edge diffusionOp{ - dd::buildFunctionality(&qcDiffusion, *Simulator::dd)}; + dd::buildFunctionality(qcDiffusion, *Simulator::dd)}; const dd::Edge fullIteration{ Simulator::dd->multiply(oracleOp, diffusionOp)}; diff --git a/src/HybridSchrodingerFeynmanSimulator.cpp b/src/HybridSchrodingerFeynmanSimulator.cpp index be050af9..f88ee647 100644 --- a/src/HybridSchrodingerFeynmanSimulator.cpp +++ b/src/HybridSchrodingerFeynmanSimulator.cpp @@ -11,6 +11,7 @@ #include "dd/Package.hpp" #include "ir/operations/Control.hpp" #include "ir/operations/OpType.hpp" +#include "ir/operations/Operation.hpp" #include "ir/operations/StandardOperation.hpp" #include @@ -23,7 +24,6 @@ #include #include #include -#include #include #include #include @@ -144,7 +144,8 @@ bool HybridSchrodingerFeynmanSimulator::Slice::apply( for (const auto& control : op->getControls()) { if (start <= control.qubit && control.qubit <= end) { opControls.emplace(control); - } else { // other controls are set to the corresponding value + } else { + // other controls are set to the corresponding value if (targetInSplit) { isSplitOp = true; const bool nextControl = getNextControl(); @@ -158,7 +159,8 @@ bool HybridSchrodingerFeynmanSimulator::Slice::apply( } } - if (targetInOtherSplit && !opControls.empty()) { // control slice for split + if (targetInOtherSplit && !opControls.empty()) { + // control slice for split // Ensured in the getNDecisions function assert(opControls.size() == 1); @@ -173,11 +175,13 @@ bool HybridSchrodingerFeynmanSimulator::Slice::apply( sliceDD->incRef(edge); sliceDD->decRef(tmp); } - } else if (targetInSplit) { // target slice for split or operation in split + } else if (targetInSplit) { + // target slice for split or operation in split const auto& param = op->getParameter(); - qc::StandardOperation newOp(opControls, opTargets, op->getType(), param); + const qc::StandardOperation newOp(opControls, opTargets, op->getType(), + param); auto tmp = edge; - edge = sliceDD->multiply(dd::getDD(&newOp, *sliceDD), edge); + edge = sliceDD->multiply(dd::getDD(newOp, *sliceDD), edge); sliceDD->incRef(edge); sliceDD->decRef(tmp); } @@ -247,7 +251,8 @@ void HybridSchrodingerFeynmanSimulator::simulateHybridTaskflow( [this, &computePair, &computed, &executor, nslicesOnOneCpu, splitQubit, maxControl, nqubits, lastLevel](std::pair current) { - if (current.first == 0) { // slice + if (current.first == 0) { + // slice std::unique_ptr> oldDD; qc::VectorDD edge{}; for (std::size_t i = 0; i < nslicesOnOneCpu; ++i) { @@ -264,13 +269,14 @@ void HybridSchrodingerFeynmanSimulator::simulateHybridTaskflow( } oldDD = std::move( sliceDD); // this might seem unused, but it keeps the DD package - // alive for the serialization below + // alive for the serialization below } dd::serialize(edge, "slice_" + std::to_string(current.first) + "_" + std::to_string(current.second) + ".dd", true); - } else { // adding + } else { + // adding const std::string filename = "slice_" + std::to_string(current.first - 1) + "_"; const std::string filenameLeft = @@ -404,16 +410,4 @@ void HybridSchrodingerFeynmanSimulator::simulateHybridAmplitudes( finalAmplitudes = std::move(amplitudes[0]); } -template -void HybridSchrodingerFeynmanSimulator::exportDDtoGraphviz( - std::ostream& os, const bool colored, const bool edgeLabels, - const bool classic, const bool memory, const bool formatAsPolar) { - if (mode == Mode::Amplitude) { - Simulator::rootEdge = - Simulator::dd->makeStateFromVector(finalAmplitudes); - } - return Simulator::exportDDtoGraphviz(os, colored, edgeLabels, classic, - memory, formatAsPolar); -} - template class HybridSchrodingerFeynmanSimulator; diff --git a/src/PathSimulator.cpp b/src/PathSimulator.cpp index 20647f2d..0ebedc77 100644 --- a/src/PathSimulator.cpp +++ b/src/PathSimulator.cpp @@ -437,7 +437,7 @@ template void PathSimulator::constructTaskGraph() { results.emplace(leftID, zeroState); } else { const auto& op = CircuitSimulator::qc->at(leftID - 1); - qc::MatrixDD opDD = dd::getDD(op.get(), *Simulator::dd); + qc::MatrixDD opDD = dd::getDD(*op, *Simulator::dd); Simulator::dd->incRef(opDD); results.emplace(leftID, opDD); } @@ -449,7 +449,7 @@ template void PathSimulator::constructTaskGraph() { "of the simulation path member."); } const auto& op = CircuitSimulator::qc->at(rightID - 1); - qc::MatrixDD opDD = dd::getDD(op.get(), *Simulator::dd); + qc::MatrixDD opDD = dd::getDD(*op, *Simulator::dd); Simulator::dd->incRef(opDD); results.emplace(rightID, opDD); } diff --git a/src/ShorFastSimulator.cpp b/src/ShorFastSimulator.cpp index 5230fff9..14623c3b 100644 --- a/src/ShorFastSimulator.cpp +++ b/src/ShorFastSimulator.cpp @@ -6,8 +6,9 @@ #include "dd/DDDefinitions.hpp" #include "dd/DDpackageConfig.hpp" #include "dd/Edge.hpp" -#include "dd/GateMatrixDefinitions.hpp" #include "dd/Node.hpp" +#include "dd/Operations.hpp" +#include "ir/operations/OpType.hpp" #include #include @@ -34,7 +35,9 @@ ShorFastSimulator::simulate([[maybe_unused]] std::size_t shots) { Simulator::dd->incRef(Simulator::rootEdge); // Initialize qubits // TODO: other init method where the initial value can be chosen - applyGate(dd::X_MAT, 0); + Simulator::rootEdge = dd::applyUnitaryOperation( + qc::StandardOperation(0, qc::X), Simulator::rootEdge, + *Simulator::dd); if (verbose) { std::clog << " (requires " << +nQubits << " qubits):\n"; @@ -75,7 +78,10 @@ ShorFastSimulator::simulate([[maybe_unused]] std::size_t shots) { std::string measurements(2 * requiredBits, '0'); for (std::size_t i = 0; i < 2 * requiredBits; i++) { - applyGate(dd::H_MAT, static_cast(nQubits - 1)); + const auto target = static_cast(nQubits - 1); + Simulator::rootEdge = dd::applyUnitaryOperation( + qc::StandardOperation(target, qc::H), Simulator::rootEdge, + *Simulator::dd); if (verbose) { std::clog << "[ " << (i + 1) << "/" << 2 * requiredBits @@ -100,19 +106,26 @@ ShorFastSimulator::simulate([[maybe_unused]] std::size_t shots) { double qR = cosine(1, -q); double qI = sine(1, -q); const dd::GateMatrix qm{1, 0, 0, {qR, qI}}; - applyGate(qm, static_cast(nQubits - 1)); + auto gate = Simulator::dd->makeGateDD(qm, target); + Simulator::rootEdge = Simulator::dd->applyOperation( + gate, Simulator::rootEdge); } q *= 2; } - applyGate(dd::H_MAT, static_cast(nQubits - 1)); + Simulator::rootEdge = dd::applyUnitaryOperation( + qc::StandardOperation(target, qc::H), Simulator::rootEdge, + *Simulator::dd); - measurements[i] = Simulator::measureOneCollapsing( - static_cast(nQubits - 1), false); + measurements[i] = Simulator::dd->measureOneCollapsing( + Simulator::rootEdge, static_cast(nQubits - 1), + Simulator::mt); Simulator::dd->garbageCollect(); if (measurements[i] == '1') { - applyGate(dd::X_MAT, static_cast(nQubits - 1)); + Simulator::rootEdge = dd::applyUnitaryOperation( + qc::StandardOperation(target, qc::X), Simulator::rootEdge, + *Simulator::dd); } } diff --git a/src/ShorSimulator.cpp b/src/ShorSimulator.cpp index 395080ff..2b14dbfa 100644 --- a/src/ShorSimulator.cpp +++ b/src/ShorSimulator.cpp @@ -6,8 +6,9 @@ #include "dd/DDDefinitions.hpp" #include "dd/DDpackageConfig.hpp" #include "dd/Edge.hpp" -#include "dd/GateMatrixDefinitions.hpp" #include "dd/Node.hpp" +#include "dd/Operations.hpp" +#include "ir/operations/OpType.hpp" #include #include @@ -35,7 +36,9 @@ ShorSimulator::simulate([[maybe_unused]] std::size_t shots) { Simulator::dd->incRef(Simulator::rootEdge); // Initialize qubits // TODO: other init method where the initial value can be chosen - applyGate(dd::X_MAT, 0); + Simulator::rootEdge = dd::applyUnitaryOperation( + qc::StandardOperation(0, qc::X), Simulator::rootEdge, + *Simulator::dd); if (verbose) { std::clog << " (requires " << nQubits << " qubits):\n"; @@ -73,7 +76,10 @@ ShorSimulator::simulate([[maybe_unused]] std::size_t shots) { } for (std::uint32_t i = 0; i < 2 * requiredBits; i++) { - applyGate(dd::H_MAT, static_cast((nQubits - 1) - i)); + const auto target = static_cast(nQubits - 1 - i); + Simulator::rootEdge = dd::applyUnitaryOperation( + qc::StandardOperation(target, qc::H), Simulator::rootEdge, + *Simulator::dd); } const auto mod = static_cast( std::ceil(2.0 * static_cast(requiredBits) / @@ -112,10 +118,13 @@ ShorSimulator::simulate([[maybe_unused]] std::size_t shots) { double qR = cosine(1, -q); double qI = sine(1, -q); const dd::GateMatrix qm{1, 0, 0, {qR, qI}}; - applyGate( - qm, static_cast(nQubits - 1 - static_cast(i)), - qc::Control{static_cast(nQubits - 1 - - static_cast(j))}); + auto gate = Simulator::dd->makeGateDD( + qm, + qc::Control{static_cast(nQubits - 1 - + static_cast(j))}, + static_cast(nQubits - 1 - static_cast(i))); + Simulator::rootEdge = Simulator::dd->applyOperation( + gate, Simulator::rootEdge); q *= 2; } @@ -124,9 +133,11 @@ ShorSimulator::simulate([[maybe_unused]] std::size_t shots) { Simulator::approximateByFidelity(stepFidelity, false, true)); approximationRuns++; } - - applyGate(dd::H_MAT, static_cast(nQubits - 1 - - static_cast(i))); + const auto target = + static_cast(nQubits - 1 - static_cast(i)); + Simulator::rootEdge = dd::applyUnitaryOperation( + qc::StandardOperation(target, qc::H), Simulator::rootEdge, + *Simulator::dd); } // Non-Quantum Post Processing @@ -479,29 +490,4 @@ void ShorSimulator::uAEmulate(std::uint64_t a, std::int32_t q) { Simulator::dd->garbageCollect(); } -template -void ShorSimulator::applyGate(dd::GateMatrix matrix, dd::Qubit target) { - applyGate(matrix, target, qc::Controls{}); -} - -template -void ShorSimulator::applyGate(dd::GateMatrix matrix, dd::Qubit target, - qc::Control control) { - applyGate(matrix, target, qc::Controls{control}); -} - -template -void ShorSimulator::applyGate(dd::GateMatrix matrix, dd::Qubit target, - const qc::Controls& controls) { - const dd::Edge gate = - Simulator::dd->makeGateDD(matrix, controls, target); - const dd::Edge tmp = - Simulator::dd->multiply(gate, Simulator::rootEdge); - Simulator::dd->incRef(tmp); - Simulator::dd->decRef(Simulator::rootEdge); - Simulator::rootEdge = tmp; - - Simulator::dd->garbageCollect(); -} - template class ShorSimulator; diff --git a/src/Simulator.cpp b/src/Simulator.cpp index 31322eb5..b2a81b5e 100644 --- a/src/Simulator.cpp +++ b/src/Simulator.cpp @@ -5,7 +5,6 @@ #include "dd/DDDefinitions.hpp" #include "dd/DDpackageConfig.hpp" #include "dd/Edge.hpp" -#include "dd/Export.hpp" #include "dd/Node.hpp" #include "dd/Package.hpp" #include "dd/RealNumber.hpp" @@ -15,14 +14,12 @@ #include #include #include -#include #include #include #include #include #include #include -#include #include #include #include @@ -373,33 +370,6 @@ Simulator::getPathOfLeastResistance() const { return {pathValue, std::string{result.rbegin(), result.rend()}}; } -template -void Simulator::exportDDtoGraphviz(std::ostream& os, const bool colored, - const bool edgeLabels, - const bool classic, - const bool memory, - const bool formatAsPolar) { - assert(os.good()); - dd::toDot(rootEdge, os, colored, edgeLabels, classic, memory, formatAsPolar); -} - -template -std::string Simulator::exportDDtoGraphvizString( - const bool colored, const bool edgeLabels, const bool classic, - const bool memory, const bool formatAsPolar) { - std::ostringstream oss{}; - exportDDtoGraphviz(oss, colored, edgeLabels, classic, memory, formatAsPolar); - return oss.str(); -} - -template -void Simulator::exportDDtoGraphvizFile( - const std::string& filename, const bool colored, const bool edgeLabels, - const bool classic, const bool memory, const bool formatAsPolar) { - std::ofstream ofs(filename); - exportDDtoGraphviz(ofs, colored, edgeLabels, classic, memory, formatAsPolar); -} - template class Simulator; template class Simulator; template class Simulator; diff --git a/src/StochasticNoiseSimulator.cpp b/src/StochasticNoiseSimulator.cpp index a535a358..8918244b 100644 --- a/src/StochasticNoiseSimulator.cpp +++ b/src/StochasticNoiseSimulator.cpp @@ -72,53 +72,24 @@ void StochasticNoiseSimulator::runStochSimulationForId( localDD, static_cast(nQubits), noiseProbability, amplitudeDampingProb, multiQubitGateFactor, noiseEffects); - std::map classicValues; + std::vector classicValues(qc->getNcbits(), false); std::size_t opCount = 0U; - dd::vEdge localRootEdge = + auto localRootEdge = localDD->makeZeroState(static_cast(nQubits)); - localDD->incRef(localRootEdge); - for (auto& op : *qc) { if (op->getType() == qc::Barrier) { continue; } ++opCount; - if (auto* nuOp = dynamic_cast(op.get()); + if (const auto* nuOp = dynamic_cast(op.get()); nuOp != nullptr) { if (nuOp->getType() == qc::Measure) { - const auto& quantum = nuOp->getTargets(); - const auto& classic = nuOp->getClassics(); - - assert( - quantum.size() == - classic.size()); // this should not happen do to check in Simulate - - for (std::size_t i = 0U; i < quantum.size(); ++i) { - const auto result = localDD->measureOneCollapsing( - localRootEdge, static_cast(quantum.at(i)), true, - generator); - assert(result == '0' || result == '1'); - classicValues[classic.at(i)] = (result == '1'); - } + localRootEdge = applyMeasurement(*nuOp, localRootEdge, *localDD, + generator, classicValues); } else if (nuOp->getType() == qc::Reset) { - // Reset qubit - const auto& qubits = nuOp->getTargets(); - for (const auto& qubit : qubits) { - const auto result = localDD->measureOneCollapsing( - localRootEdge, static_cast(qubits.at(qubit)), true, - generator); - if (result == '1') { - const auto x = qc::StandardOperation(qubit, qc::X); - auto tmp = - localDD->multiply(dd::getDD(&x, *localDD), localRootEdge); - localDD->incRef(tmp); - localDD->decRef(localRootEdge); - localRootEdge = tmp; - localDD->garbageCollect(); - } - } + localRootEdge = applyReset(*nuOp, localRootEdge, *localDD, generator); } else { throw std::runtime_error("Unsupported non-unitary functionality."); } @@ -127,45 +98,28 @@ void StochasticNoiseSimulator::runStochSimulationForId( dd::mEdge operation; if (op->isClassicControlledOperation()) { // Check if the operation is controlled by a classical register - auto* classicOp = - dynamic_cast(op.get()); - if (classicOp == nullptr) { - throw std::runtime_error( - "Dynamic cast to ClassicControlledOperation* failed."); - } - bool executeOp = true; - auto expValue = classicOp->getExpectedValue(); - - for (auto i = classicOp->getControlRegister().first; - i < classicOp->getControlRegister().second; i++) { - if (static_cast(classicValues[i]) != (expValue % 2U)) { - executeOp = false; - break; - } - expValue = expValue >> 1U; - } - operation = dd::getDD(classicOp->getOperation(), *localDD); - if (!executeOp) { - continue; - } - } else { - const auto& targets = op->getTargets(); - const auto& controls = op->getControls(); - - if (targets.size() == 1 && controls.empty()) { - auto* oper = localDD->stochasticNoiseOperationCache.lookup( - op->getType(), static_cast(targets.front())); - if (oper == nullptr) { - operation = dd::getDD(op.get(), *localDD); - localDD->stochasticNoiseOperationCache.insert( - op->getType(), static_cast(targets.front()), - operation); - } else { - operation = *oper; - } + const auto& classicOp = + dynamic_cast(*op); + localRootEdge = applyClassicControlledOperation( + classicOp, localRootEdge, *localDD, classicValues); + continue; + } + const auto& targets = op->getTargets(); + const auto& controls = op->getControls(); + + if (targets.size() == 1 && controls.empty()) { + const auto* oper = localDD->stochasticNoiseOperationCache.lookup( + op->getType(), static_cast(targets.front())); + if (oper == nullptr) { + operation = getDD(*op, *localDD); + localDD->stochasticNoiseOperationCache.insert( + op->getType(), static_cast(targets.front()), + operation); } else { - operation = dd::getDD(op.get(), *localDD); + operation = *oper; } + } else { + operation = getDD(*op, *localDD); } stochasticNoiseFunctionality.applyNoiseOperation( @@ -183,8 +137,8 @@ void StochasticNoiseSimulator::runStochSimulationForId( const auto cbits = qc->getNcbits(); std::string classicRegisterString(cbits, '0'); - for (const auto& [bitIndex, value] : classicValues) { - classicRegisterString[cbits - bitIndex - 1] = value ? '1' : '0'; + for (std::size_t i = 0; i < cbits; ++i) { + classicRegisterString[cbits - i - 1] = classicValues[i] ? '1' : '0'; } classicalMeasurementsMap[classicRegisterString] += 1U; } diff --git a/src/UnitarySimulator.cpp b/src/UnitarySimulator.cpp index cb98e16c..2228bfa6 100644 --- a/src/UnitarySimulator.cpp +++ b/src/UnitarySimulator.cpp @@ -2,7 +2,6 @@ #include "CircuitSimulator.hpp" #include "circuit_optimizer/CircuitOptimizer.hpp" -#include "dd/Export.hpp" #include "dd/FunctionalityConstruction.hpp" #include "dd/Node.hpp" #include "ir/QuantumComputation.hpp" @@ -11,28 +10,20 @@ #include #include #include -#include #include void UnitarySimulator::construct() { // carry out actual computation auto start = std::chrono::steady_clock::now(); if (mode == Mode::Sequential) { - e = dd::buildFunctionality(qc.get(), *dd); + e = dd::buildFunctionality(*qc, *dd); } else if (mode == Mode::Recursive) { - e = dd::buildFunctionalityRecursive(qc.get(), *dd); + e = dd::buildFunctionalityRecursive(*qc, *dd); } auto end = std::chrono::steady_clock::now(); constructionTime = std::chrono::duration(end - start).count(); } -void UnitarySimulator::exportDDtoGraphviz(std::ostream& os, const bool colored, - const bool edgeLabels, - const bool classic, const bool memory, - const bool formatAsPolar) { - dd::toDot(e, os, colored, edgeLabels, classic, memory, formatAsPolar); -} - UnitarySimulator::UnitarySimulator( std::unique_ptr&& qc_, const ApproximationInfo& approximationInfo_, UnitarySimulator::Mode simMode) diff --git a/src/mqt/ddsim/__init__.py b/src/mqt/ddsim/__init__.py index cb31ddc8..d93fc7e1 100644 --- a/src/mqt/ddsim/__init__.py +++ b/src/mqt/ddsim/__init__.py @@ -2,6 +2,24 @@ from __future__ import annotations +import sys + +# under Windows, make sure to add the appropriate DLL directory to the PATH +if sys.platform == "win32": + + def _dll_patch() -> None: + """Add the DLL directory to the PATH.""" + import os + import sysconfig + from pathlib import Path + + site_packages = Path(sysconfig.get_paths()["purelib"]) + bin_dir = site_packages / "mqt" / "core" / "bin" + os.add_dll_directory(str(bin_dir)) + + _dll_patch() + del _dll_patch + from ._version import version as __version__ from .provider import DDSIMProvider from .pyddsim import ( @@ -15,8 +33,6 @@ PathSimulatorMode, StochasticNoiseSimulator, UnitarySimulator, - dump_tensor_network, - get_matrix, ) __all__ = [ @@ -32,6 +48,4 @@ "StochasticNoiseSimulator", "UnitarySimulator", "__version__", - "dump_tensor_network", - "get_matrix", ] diff --git a/src/mqt/ddsim/deterministicnoisesimulator.py b/src/mqt/ddsim/deterministicnoisesimulator.py index ccf34c58..f21bebcf 100644 --- a/src/mqt/ddsim/deterministicnoisesimulator.py +++ b/src/mqt/ddsim/deterministicnoisesimulator.py @@ -9,6 +9,7 @@ from qiskit.result.models import ExperimentResult, ExperimentResultData from mqt import ddsim +from mqt.core import load from .header import DDSIMHeader from .qasmsimulator import QasmSimulatorBackend @@ -55,8 +56,9 @@ def _run_experiment(qc: QuantumCircuit, **options: dict[str, Any]) -> Experiment seed = cast("int", options.get("simulator_seed", -1)) shots = cast("int", options.get("shots", 1024)) + circ = load(qc) sim = ddsim.DeterministicNoiseSimulator( - circ=qc, + circ=circ, seed=seed, noise_effects=noise_effects, noise_probability=noise_probability, diff --git a/src/mqt/ddsim/hybridqasmsimulator.py b/src/mqt/ddsim/hybridqasmsimulator.py index feb60644..8236386b 100644 --- a/src/mqt/ddsim/hybridqasmsimulator.py +++ b/src/mqt/ddsim/hybridqasmsimulator.py @@ -8,12 +8,15 @@ if TYPE_CHECKING: from qiskit import QuantumCircuit +import numpy as np from qiskit import QiskitError from qiskit.providers import Options from qiskit.result.models import ExperimentResult, ExperimentResultData from qiskit.transpiler import Target from qiskit.utils.multiprocessing import local_hardware_info +from mqt.core import load + from .header import DDSIMHeader from .pyddsim import HybridCircuitSimulator, HybridMode from .qasmsimulator import QasmSimulatorBackend @@ -81,7 +84,8 @@ def _run_experiment(self, qc: QuantumCircuit, **options: Any) -> ExperimentResul msg = f"Simulation mode{mode} not supported by hybrid simulator. Available modes are 'amplitude' and 'dd'." raise QiskitError(msg) - sim = HybridCircuitSimulator(qc, seed=seed, mode=hybrid_mode, nthreads=nthreads) + circuit = load(qc) + sim = HybridCircuitSimulator(circuit, seed=seed, mode=hybrid_mode, nthreads=nthreads) shots = options.get("shots", 1024) if self._SHOW_STATE_VECTOR and shots > 0: @@ -94,7 +98,7 @@ def _run_experiment(self, qc: QuantumCircuit, **options: Any) -> ExperimentResul counts={hex(int(result, 2)): count for result, count in counts.items()}, statevector=None if not self._SHOW_STATE_VECTOR - else sim.get_vector() + else np.array(sim.get_constructed_dd().get_vector(), copy=False) if sim.get_mode() == HybridMode.DD else sim.get_final_amplitudes(), time_taken=end_time - start_time, diff --git a/src/mqt/ddsim/pathqasmsimulator.py b/src/mqt/ddsim/pathqasmsimulator.py index 2041f346..a4eee0bb 100644 --- a/src/mqt/ddsim/pathqasmsimulator.py +++ b/src/mqt/ddsim/pathqasmsimulator.py @@ -2,147 +2,26 @@ from __future__ import annotations -import pathlib import time -from typing import TYPE_CHECKING, Any, cast +from typing import TYPE_CHECKING, Any if TYPE_CHECKING: - from quimb.tensor import Tensor, TensorNetwork + from qiskit import QuantumCircuit -import locale -from qiskit import QuantumCircuit +import numpy as np from qiskit.providers import Options from qiskit.result.models import ExperimentResult, ExperimentResultData from qiskit.transpiler import Target +from mqt.core import load + from .header import DDSIMHeader from .pyddsim import PathCircuitSimulator, PathSimulatorConfiguration, PathSimulatorMode from .qasmsimulator import QasmSimulatorBackend from .target import DDSIMTargetBuilder -def read_tensor_network_file(filename: str) -> list[Tensor]: - """Read a tensor network from a file. - - Args: - filename: The name of the file to read the tensor network from. - - Returns: - The tensor network read from the file. - """ - import numpy as np - import pandas as pd - import quimb.tensor as qtn - - df = pd.read_json(filename) - tensors = [] - - for i in range(len(df["tensors"])): - tens_data = [complex(real, imag) for [real, imag] in df["tensors"][i][3]] - tens_shape = df["tensors"][i][2] - data = np.array(tens_data).reshape(tens_shape) - inds = df["tensors"][i][1] - tags = df["tensors"][i][0] - tensors.append(qtn.Tensor(data, inds, tags, left_inds=inds[: len(inds) // 2])) - return tensors - - -def create_tensor_network(qc: QuantumCircuit) -> TensorNetwork: - """Create a tensor network from a quantum circuit. - - Args: - qc: The quantum circuit to be simulated. - - Returns: - The tensor network representing the quantum circuit. - """ - import quimb.tensor as qtn - import sparse - - from mqt.ddsim import dump_tensor_network - - if isinstance(qc, QuantumCircuit): - filename = qc.name + "_" + str(qc.num_qubits) + ".tensor" - nqubits = qc.num_qubits - else: - filename = "tensor.tensor" - nqubits = qc.header.n_qubits - - dump_tensor_network(qc, filename) - tensors = read_tensor_network_file(filename) - pathlib.Path(filename).unlink() - - # add the zero state tensor |0...0> at the beginning - shape = [2] * nqubits - data = sparse.COO(coords=[[0]] * nqubits, data=1, shape=shape, sorted=True, has_duplicates=False) - inds = ["q" + str(i) + "_0" for i in range(nqubits)] - tags = ["Q" + str(i) for i in range(nqubits)] - tensors.insert(0, qtn.Tensor(data=data, inds=inds, tags=tags)) - - # using the following lines instead would allow much greater flexibility, - # but is not supported for DD-based simulation at the moment - - # add the zero state tensor |0>...|0> at the beginning - # shape = [2] - # data = np.zeros(2) - # data[0] = 1.0 - # for i in range(qc.num_qubits): - # inds = ['q'+str(i)+'_0'] - # tags = ['Q'+str(i)] - # tensors.insert(0, qtn.Tensor(data=data.reshape(shape), inds=inds, tags=tags)) - - return qtn.TensorNetwork(tensors) - - -def get_simulation_path( - qc: QuantumCircuit, - max_time: int = 60, - max_repeats: int = 1024, - parallel_runs: int = 1, - dump_path: bool = True, - plot_ring: bool = False, -) -> list[tuple[int, int]]: - """Determine a simulation path via computing a contraction path using cotengra. - - Args: - qc: The quantum circuit to be simulated. - max_time: The maximum time in seconds to spend on optimization. - max_repeats: The maximum number of repetitions for optimization. - parallel_runs: The number of parallel runs for optimization. - dump_path: Whether to dump the path to a file. - plot_ring: Whether to plot the contraction tree as a ring. - - Returns: - The simulation path as a list of tuples. - """ - import cotengra as ctg - from opt_einsum.paths import linear_to_ssa - - tn = create_tensor_network(qc) - - opt = ctg.HyperOptimizer( - max_time=max_time, - max_repeats=max_repeats, - progbar=True, - parallel=parallel_runs, - minimize="flops", - ) - info = tn.contract(all, get="path-info", optimize=opt) - path = cast("list[tuple[int, int]]", linear_to_ssa(info.path)) - - if dump_path: - filename = qc.name + "_" + str(qc.num_qubits) + ".path" if isinstance(qc, QuantumCircuit) else "simulation.path" - with pathlib.Path(filename).open("w", encoding=locale.getpreferredencoding(False)) as file: - file.write(str(path)) - - if plot_ring: - fig, _ = opt.get_tree().plot_ring() - fig.savefig("simulation_ring.svg", bbox_inches="tight") - - return path - - class PathQasmSimulatorBackend(QasmSimulatorBackend): """Python interface to MQT DDSIM Simulation Path Framework.""" @@ -183,10 +62,6 @@ def _default_options(cls) -> Options: alternating_start=None, gate_cost=None, seed=None, - cotengra_max_time=60, - cotengra_max_repeats=1024, - cotengra_plot_ring=False, - cotengra_dump_path=True, ) @property @@ -219,22 +94,8 @@ def _run_experiment(self, qc: QuantumCircuit, **options: Any) -> ExperimentResul if seed is not None: pathsim_configuration.seed = seed - sim = PathCircuitSimulator(qc, config=pathsim_configuration) - - # determine the contraction path using cotengra in case this is requested - if pathsim_configuration.mode == PathSimulatorMode.cotengra: - max_time = options.get("cotengra_max_time", 60) - max_repeats = options.get("cotengra_max_repeats", 1024) - dump_path = options.get("cotengra_dump_path", False) - plot_ring = options.get("cotengra_plot_ring", False) - path = get_simulation_path( - qc, - max_time=max_time, - max_repeats=max_repeats, - dump_path=dump_path, - plot_ring=plot_ring, - ) - sim.set_simulation_path(path, False) + circuit = load(qc) + sim = PathCircuitSimulator(circuit, config=pathsim_configuration) shots = options.get("shots", 1024) setup_time = time.time() @@ -243,7 +104,7 @@ def _run_experiment(self, qc: QuantumCircuit, **options: Any) -> ExperimentResul data = ExperimentResultData( counts={hex(int(result, 2)): count for result, count in counts.items()}, - statevector=None if not self._SHOW_STATE_VECTOR else sim.get_vector(), + statevector=None if not self._SHOW_STATE_VECTOR else np.array(sim.get_constructed_dd().get_vector()), time_taken=end_time - start_time, time_setup=setup_time - start_time, time_sim=end_time - setup_time, diff --git a/src/mqt/ddsim/primitives/estimator.py b/src/mqt/ddsim/primitives/estimator.py index b54c118f..f653f475 100644 --- a/src/mqt/ddsim/primitives/estimator.py +++ b/src/mqt/ddsim/primitives/estimator.py @@ -11,6 +11,7 @@ from qiskit.primitives import EstimatorResult from qiskit.quantum_info import Pauli, PauliList +from mqt.core import load from mqt.ddsim.pyddsim import CircuitSimulator from mqt.ddsim.qasmsimulator import QasmSimulatorBackend @@ -55,10 +56,7 @@ def preprocessed_circuits( ) -> tuple[list[QuantumCircuit], list[list[QuantumCircuit]]]: """Generate quantum circuits for states and observables produced by preprocessing. - Returns: - Tuple: A tuple containing two entries: - - List: Quantum circuits list entered in run() method. - - List: Quantum circuit representations of the observables. + Returns: A tuple containing two entries: the quantum circuits for the states and observables. """ self._preprocessed_circuits = self._preprocessing() return self._preprocessed_circuits @@ -185,15 +183,16 @@ def _run_experiment( approximation_strategy = str(options.get("approximation_strategy", "fidelity")) seed = cast("int", options.get("seed_simulator", -1)) + qc = load(circ) sim = CircuitSimulator( - circ, + qc, approximation_step_fidelity=approximation_step_fidelity, approximation_steps=approximation_steps, approximation_strategy=approximation_strategy, seed=seed, ) - return [sim.expectation_value(observable=obs) for obs in obs_circ_list] + return [sim.expectation_value(observable=load(obs)) for obs in obs_circ_list] @staticmethod def _postprocessing(result_list: list[float], accum: list[int], metadata: list[dict[str, Any]]) -> EstimatorResult: diff --git a/src/mqt/ddsim/pyddsim.pyi b/src/mqt/ddsim/pyddsim.pyi index 9b6f6eec..99d8a02f 100644 --- a/src/mqt/ddsim/pyddsim.pyi +++ b/src/mqt/ddsim/pyddsim.pyi @@ -1,8 +1,7 @@ from typing import Any, ClassVar, overload -import numpy as np -from numpy.typing import NDArray -from qiskit import QuantumCircuit +from mqt.core.dd import MatrixDD, VectorDD +from mqt.core.ir import QuantumComputation __all__ = [ "CircuitSimulator", @@ -15,37 +14,18 @@ __all__ = [ "PathSimulatorMode", "StochasticNoiseSimulator", "UnitarySimulator", - "dump_tensor_network", - "get_matrix", ] class CircuitSimulator: def __init__( self, - circ: QuantumCircuit | str, + circ: QuantumComputation, approximation_step_fidelity: float = 1.0, approximation_steps: int = 1, approximation_strategy: str = "fidelity", seed: int = -1, ) -> None: ... - def expectation_value(self, observable: QuantumCircuit | str) -> float: ... - def export_dd_to_graphviz_file( - self, - filename: str, - colored: bool = True, - edge_labels: bool = False, - classic: bool = False, - memory: bool = False, - format_as_polar: bool = True, - ) -> None: ... - def export_dd_to_graphviz_str( - self, - colored: bool = True, - edge_labels: bool = False, - classic: bool = False, - memory: bool = False, - format_as_polar: bool = True, - ) -> str: ... + def expectation_value(self, observable: QuantumComputation) -> float: ... def get_active_matrix_node_count(self) -> int: ... def get_active_vector_node_count(self) -> int: ... def get_max_matrix_node_count(self) -> int: ... @@ -53,7 +33,7 @@ class CircuitSimulator: def get_name(self) -> str: ... def get_number_of_qubits(self) -> int: ... def get_tolerance(self) -> float: ... - def get_vector(self) -> list[complex]: ... + def get_constructed_dd(self) -> VectorDD: ... def set_tolerance(self, tol: float) -> None: ... def simulate(self, shots: int) -> dict[str, int]: ... def statistics(self) -> dict[str, str]: ... @@ -61,7 +41,7 @@ class CircuitSimulator: class DeterministicNoiseSimulator: def __init__( self, - circ: QuantumCircuit | str, + circ: QuantumComputation, approximation_step_fidelity: float = 1.0, approximation_steps: int = 1, approximation_strategy: str = "fidelity", @@ -71,23 +51,6 @@ class DeterministicNoiseSimulator: amp_damping_probability: float | None = 0.02, multi_qubit_gate_factor: float = 2, ) -> None: ... - def export_dd_to_graphviz_file( - self, - filename: str, - colored: bool = True, - edge_labels: bool = False, - classic: bool = False, - memory: bool = False, - format_as_polar: bool = True, - ) -> None: ... - def export_dd_to_graphviz_str( - self, - colored: bool = True, - edge_labels: bool = False, - classic: bool = False, - memory: bool = False, - format_as_polar: bool = True, - ) -> str: ... def get_active_matrix_node_count(self) -> int: ... def get_active_vector_node_count(self) -> int: ... def get_max_matrix_node_count(self) -> int: ... @@ -95,7 +58,7 @@ class DeterministicNoiseSimulator: def get_name(self) -> str: ... def get_number_of_qubits(self) -> int: ... def get_tolerance(self) -> float: ... - def get_vector(self) -> list[complex]: ... + def get_constructed_dd(self) -> VectorDD: ... def set_tolerance(self, tol: float) -> None: ... def simulate(self, shots: int) -> dict[str, int]: ... def statistics(self) -> dict[str, str]: ... @@ -123,7 +86,7 @@ class HybridMode: class HybridCircuitSimulator: def __init__( self, - circ: QuantumCircuit | str, + circ: QuantumComputation, approximation_step_fidelity: float = 1.0, approximation_steps: int = 1, approximation_strategy: str = "fidelity", @@ -131,23 +94,6 @@ class HybridCircuitSimulator: mode: HybridMode = ..., nthreads: int = 2, ) -> None: ... - def export_dd_to_graphviz_file( - self, - filename: str, - colored: bool = True, - edge_labels: bool = False, - classic: bool = False, - memory: bool = False, - format_as_polar: bool = True, - ) -> None: ... - def export_dd_to_graphviz_str( - self, - colored: bool = True, - edge_labels: bool = False, - classic: bool = False, - memory: bool = False, - format_as_polar: bool = True, - ) -> str: ... def get_active_matrix_node_count(self) -> int: ... def get_active_vector_node_count(self) -> int: ... def get_final_amplitudes(self) -> list[complex]: ... @@ -157,7 +103,7 @@ class HybridCircuitSimulator: def get_name(self) -> str: ... def get_number_of_qubits(self) -> int: ... def get_tolerance(self) -> float: ... - def get_vector(self) -> list[complex]: ... + def get_constructed_dd(self) -> VectorDD: ... def set_tolerance(self, tol: float) -> None: ... def simulate(self, shots: int) -> dict[str, int]: ... def statistics(self) -> dict[str, str]: ... @@ -165,11 +111,10 @@ class HybridCircuitSimulator: class PathSimulatorMode: __members__: ClassVar[ dict[str, PathSimulatorMode] - ] # value = {'sequential': , 'pairwise_recursive': , 'cotengra': , 'bracket': , 'alternating': , 'gate_cost': } + ] # value = {'sequential': , 'pairwise_recursive': , 'bracket': , 'alternating': , 'gate_cost': } alternating: ClassVar[PathSimulatorMode] # value = bracket: ClassVar[PathSimulatorMode] # value = - cotengra: ClassVar[PathSimulatorMode] # value = - gate_cost: ClassVar[PathSimulatorMode] # value = + gate_cost: ClassVar[PathSimulatorMode] # value = pairwise_recursive: ClassVar[PathSimulatorMode] # value = sequential: ClassVar[PathSimulatorMode] # value = @@ -215,34 +160,17 @@ class PathSimulatorConfiguration: class PathCircuitSimulator: @overload - def __init__(self, circ: QuantumCircuit | str, config: PathSimulatorConfiguration = ...) -> None: ... + def __init__(self, circ: QuantumComputation, config: PathSimulatorConfiguration = ...) -> None: ... @overload def __init__( self, - circ: QuantumCircuit | str, + circ: QuantumComputation, mode: PathSimulatorMode = ..., bracket_size: int = 2, starting_point: int = 0, gate_cost: list[int] = ..., seed: int = ..., ) -> None: ... - def export_dd_to_graphviz_file( - self, - filename: str, - colored: bool = True, - edge_labels: bool = False, - classic: bool = False, - memory: bool = False, - format_as_polar: bool = True, - ) -> None: ... - def export_dd_to_graphviz_str( - self, - colored: bool = True, - edge_labels: bool = False, - classic: bool = False, - memory: bool = False, - format_as_polar: bool = True, - ) -> str: ... def get_active_matrix_node_count(self) -> int: ... def get_active_vector_node_count(self) -> int: ... def get_max_matrix_node_count(self) -> int: ... @@ -250,7 +178,7 @@ class PathCircuitSimulator: def get_name(self) -> str: ... def get_number_of_qubits(self) -> int: ... def get_tolerance(self) -> float: ... - def get_vector(self) -> list[complex]: ... + def get_constructed_dd(self) -> VectorDD: ... def set_simulation_path(self, path: list[tuple[int, int]], assume_correct_order: bool = False) -> None: ... def set_tolerance(self, tol: float) -> None: ... def simulate(self, shots: int) -> dict[str, int]: ... @@ -259,7 +187,7 @@ class PathCircuitSimulator: class StochasticNoiseSimulator: def __init__( self, - circ: QuantumCircuit | str, + circ: QuantumComputation, approximation_step_fidelity: float = 1.0, approximation_steps: int = 1, approximation_strategy: str = "fidelity", @@ -269,23 +197,6 @@ class StochasticNoiseSimulator: amp_damping_probability: float | None = 0.02, multi_qubit_gate_factor: float = 2, ) -> None: ... - def export_dd_to_graphviz_file( - self, - filename: str, - colored: bool = True, - edge_labels: bool = False, - classic: bool = False, - memory: bool = False, - format_as_polar: bool = True, - ) -> None: ... - def export_dd_to_graphviz_str( - self, - colored: bool = True, - edge_labels: bool = False, - classic: bool = False, - memory: bool = False, - format_as_polar: bool = True, - ) -> str: ... def get_active_matrix_node_count(self) -> int: ... def get_active_vector_node_count(self) -> int: ... def get_max_matrix_node_count(self) -> int: ... @@ -293,7 +204,7 @@ class StochasticNoiseSimulator: def get_name(self) -> str: ... def get_number_of_qubits(self) -> int: ... def get_tolerance(self) -> float: ... - def get_vector(self) -> list[complex]: ... + def get_constructed_dd(self) -> VectorDD: ... def set_tolerance(self, tol: float) -> None: ... def simulate(self, shots: int) -> dict[str, int]: ... def statistics(self) -> dict[str, str]: ... @@ -321,7 +232,7 @@ class ConstructionMode: class UnitarySimulator: def __init__( self, - circ: QuantumCircuit | str, + circ: QuantumComputation, approximation_step_fidelity: float = 1.0, approximation_steps: int = 1, approximation_strategy: str = "fidelity", @@ -329,23 +240,6 @@ class UnitarySimulator: mode: ConstructionMode = ..., ) -> None: ... def construct(self) -> None: ... - def export_dd_to_graphviz_file( - self, - filename: str, - colored: bool = True, - edge_labels: bool = False, - classic: bool = False, - memory: bool = False, - format_as_polar: bool = True, - ) -> None: ... - def export_dd_to_graphviz_str( - self, - colored: bool = True, - edge_labels: bool = False, - classic: bool = False, - memory: bool = False, - format_as_polar: bool = True, - ) -> str: ... def get_active_matrix_node_count(self) -> int: ... def get_active_vector_node_count(self) -> int: ... def get_construction_time(self) -> float: ... @@ -359,6 +253,4 @@ class UnitarySimulator: def get_tolerance(self) -> float: ... def set_tolerance(self, tol: float) -> None: ... def statistics(self) -> dict[str, str]: ... - -def dump_tensor_network(circ: QuantumCircuit | str, filename: str) -> None: ... -def get_matrix(sim: UnitarySimulator, mat: NDArray[np.complex128]) -> None: ... + def get_constructed_dd(self) -> MatrixDD: ... diff --git a/src/mqt/ddsim/qasmsimulator.py b/src/mqt/ddsim/qasmsimulator.py index cf2be0e7..354f68dd 100644 --- a/src/mqt/ddsim/qasmsimulator.py +++ b/src/mqt/ddsim/qasmsimulator.py @@ -6,12 +6,15 @@ import uuid from typing import TYPE_CHECKING, Any, Union, cast +import numpy as np from qiskit import QuantumCircuit from qiskit.providers import BackendV2, Options from qiskit.result import Result from qiskit.result.models import ExperimentResult, ExperimentResultData from qiskit.transpiler import Target +from mqt.core import load + from . import __version__ from .header import DDSIMHeader from .job import DDSIMJob @@ -178,8 +181,9 @@ def _run_experiment(self, qc: QuantumCircuit, **options: dict[str, Any]) -> Expe seed = cast("int", options.get("seed_simulator", -1)) shots = cast("int", options.get("shots", 1024)) + circuit = load(qc) sim = CircuitSimulator( - qc, + circuit, approximation_step_fidelity=approximation_step_fidelity, approximation_steps=approximation_steps, approximation_strategy=approximation_strategy, @@ -190,7 +194,7 @@ def _run_experiment(self, qc: QuantumCircuit, **options: dict[str, Any]) -> Expe data = ExperimentResultData( counts={hex(int(result, 2)): count for result, count in counts.items()}, - statevector=None if not self._SHOW_STATE_VECTOR else sim.get_vector(), + statevector=None if not self._SHOW_STATE_VECTOR else np.array(sim.get_constructed_dd().get_vector()), time_taken=end_time - start_time, ) diff --git a/src/mqt/ddsim/stochasticnoisesimulator.py b/src/mqt/ddsim/stochasticnoisesimulator.py index 13bedb2f..6cff0bec 100644 --- a/src/mqt/ddsim/stochasticnoisesimulator.py +++ b/src/mqt/ddsim/stochasticnoisesimulator.py @@ -9,6 +9,7 @@ from qiskit.result.models import ExperimentResult, ExperimentResultData from mqt import ddsim +from mqt.core import load from .header import DDSIMHeader from .qasmsimulator import QasmSimulatorBackend @@ -56,8 +57,9 @@ def _run_experiment(qc: QuantumCircuit, **options: dict[str, Any]) -> Experiment seed = cast("int", options.get("seed_simulator", -1)) shots = cast("int", options.get("shots", 1024)) + circ = load(qc) sim = ddsim.StochasticNoiseSimulator( - circ=qc, + circ=circ, approximation_step_fidelity=approximation_step_fidelity, approximation_steps=approximation_steps, approximation_strategy=approximation_strategy, diff --git a/src/mqt/ddsim/unitarysimulator.py b/src/mqt/ddsim/unitarysimulator.py index 93c7d63d..466af212 100644 --- a/src/mqt/ddsim/unitarysimulator.py +++ b/src/mqt/ddsim/unitarysimulator.py @@ -6,14 +6,15 @@ from typing import TYPE_CHECKING, Any import numpy as np -import numpy.typing as npt from qiskit import QiskitError from qiskit.providers import Options from qiskit.result.models import ExperimentResult, ExperimentResultData from qiskit.transpiler import Target +from mqt.core import load + from .header import DDSIMHeader -from .pyddsim import ConstructionMode, UnitarySimulator, get_matrix +from .pyddsim import ConstructionMode, UnitarySimulator from .qasmsimulator import QasmSimulatorBackend from .target import DDSIMTargetBuilder @@ -70,11 +71,13 @@ def _run_experiment(cls, qc: QuantumCircuit, **options: Any) -> ExperimentResult ) raise QiskitError(msg) - sim = UnitarySimulator(qc, seed=seed, mode=construction_mode) + circuit = load(qc) + sim = UnitarySimulator(circuit, seed=seed, mode=construction_mode) sim.construct() # Extract resulting matrix from final DD and write data - unitary: npt.NDArray[np.complex128] = np.zeros((2**qc.num_qubits, 2**qc.num_qubits), dtype=np.complex128) - get_matrix(sim, unitary) + dd = sim.get_constructed_dd() + mat = dd.get_matrix(sim.get_number_of_qubits()) + unitary = np.array(mat, copy=False) end_time = time.time() data = ExperimentResultData( diff --git a/src/python/CMakeLists.txt b/src/python/CMakeLists.txt index 0e7cea7d..790e3ba5 100644 --- a/src/python/CMakeLists.txt +++ b/src/python/CMakeLists.txt @@ -1,3 +1,22 @@ +if(APPLE) + set(BASEPOINT @loader_path) +else() + set(BASEPOINT $ORIGIN) +endif() +set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) +set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE) +list( + APPEND + CMAKE_INSTALL_RPATH + ${BASEPOINT} + ${BASEPOINT}/${CMAKE_INSTALL_LIBDIR} + ${BASEPOINT}/../core/${CMAKE_INSTALL_LIBDIR} + ${BASEPOINT}/../core/lib + ${BASEPOINT}/../core/lib64 + ${BASEPOINT}/../../core/${CMAKE_INSTALL_LIBDIR} + ${BASEPOINT}/../../core/lib + ${BASEPOINT}/../../core/lib64) + pybind11_add_module( pyddsim # Prefer thin LTO if available @@ -7,7 +26,7 @@ pybind11_add_module( # Source code goes here bindings.cpp) target_link_libraries(pyddsim PRIVATE MQT::DDSim MQT::ProjectOptions MQT::ProjectWarnings - MQT::CorePython pybind11_json) + pybind11_json) # Install directive for scikit-build-core install( diff --git a/src/python/bindings.cpp b/src/python/bindings.cpp index d053c746..fe492e03 100644 --- a/src/python/bindings.cpp +++ b/src/python/bindings.cpp @@ -10,10 +10,11 @@ #include "PathSimulator.hpp" #include "StochasticNoiseSimulator.hpp" #include "UnitarySimulator.hpp" -#include "dd/FunctionalityConstruction.hpp" -#include "python/qiskit/QuantumCircuit.hpp" +#include +#include #include +#include #include #include #include @@ -21,31 +22,13 @@ namespace py = pybind11; using namespace pybind11::literals; -static qc::QuantumComputation importCircuit(const py::object& circ) { - const py::object quantumCircuit = - py::module::import("qiskit").attr("QuantumCircuit"); - - auto qc = qc::QuantumComputation(); - - if (py::isinstance(circ)) { - const auto file = circ.cast(); - qc.import(file); - } else if (py::isinstance(circ, quantumCircuit)) { - qc::qiskit::QuantumCircuit::import(qc, circ); - } else { - throw std::runtime_error("PyObject is neither py::str nor QuantumCircuit"); - } - - return qc; -} - template std::unique_ptr -constructSimulator(const py::object& circ, const double stepFidelity, - const unsigned int stepNumber, +constructSimulator(const qc::QuantumComputation& circ, + const double stepFidelity, const unsigned int stepNumber, const std::string& approximationStrategy, const std::int64_t seed, Args&&... args) { - auto qc = std::make_unique(importCircuit(circ)); + auto qc = std::make_unique(circ); const auto approx = ApproximationInfo{stepFidelity, stepNumber, ApproximationInfo::fromString(approximationStrategy)}; @@ -63,87 +46,13 @@ constructSimulator(const py::object& circ, const double stepFidelity, } template -std::unique_ptr constructSimulatorWithoutSeed(const py::object& circ, - Args&&... args) { +std::unique_ptr +constructSimulatorWithoutSeed(const qc::QuantumComputation& circ, + Args&&... args) { return constructSimulator(circ, 1., 1, "fidelity", -1, std::forward(args)...); } -void getNumPyMatrixRec(const qc::MatrixDD& e, const std::complex& amp, - std::size_t i, std::size_t j, std::size_t dim, - std::complex* mat, std::size_t level) { - // calculate new accumulated amplitude - const auto c = amp * static_cast>(e.w); - - // base case - if (level == 0U) { - mat[i * dim + j] = - c; // NOLINT(cppcoreguidelines-pro-bounds-pointer-arithmetic) - return; - } - - const auto nextLevel = static_cast(level - 1U); - const std::size_t x = i | (1 << nextLevel); - const std::size_t y = j | (1 << nextLevel); - if (e.isTerminal() || e.p->v < nextLevel) { - getNumPyMatrixRec(e, c, i, j, dim, mat, nextLevel); - getNumPyMatrixRec(e, c, x, y, dim, mat, nextLevel); - return; - } - - const auto coords = {std::pair{i, j}, {i, y}, {x, j}, {x, y}}; - std::size_t k = 0U; - for (const auto& [a, b] : coords) { - if (auto& f = e.p->e[k++]; !f.w.exactlyZero()) { - getNumPyMatrixRec(f, c, a, b, dim, mat, nextLevel); - } - } -} - -void getNumPyMatrix(UnitarySimulator& sim, - py::array_t>& matrix) { - const auto& e = sim.getConstructedDD(); - py::buffer_info matrixBuffer = matrix.request(); - auto* dataPtr = static_cast*>(matrixBuffer.ptr); - const auto rows = matrixBuffer.shape[0]; - const auto cols = matrixBuffer.shape[1]; - if (rows != cols) { - throw std::runtime_error("Provided matrix is not a square matrix."); - } - - const std::size_t dim = 1ULL << sim.getNumberOfQubits(); - if (static_cast(rows) != dim) { - throw std::runtime_error("Provided matrix does not have the right size."); - } - - getNumPyMatrixRec(e, std::complex{1.0, 0.0}, 0, 0, dim, dataPtr, - sim.getNumberOfQubits()); -} - -void dumpTensorNetwork(const py::object& circ, const std::string& filename) { - const py::object quantumCircuit = - py::module::import("qiskit").attr("QuantumCircuit"); - - std::unique_ptr qc = - std::make_unique(); - - if (py::isinstance(circ)) { - auto&& file1 = circ.cast(); - qc->import(file1); - } else if (py::isinstance(circ, quantumCircuit)) { - qc::qiskit::QuantumCircuit::import(*qc, circ); - } else { - throw std::runtime_error("PyObject is neither py::str nor QuantumCircuit"); - } - std::ofstream ofs(filename); - dd::dumpTensorNetwork(ofs, *qc); -} - -dd::fp expectationValue(CircuitSimulator<>& sim, const py::object& observable) { - const auto observableCircuit = importCircuit(observable); - return sim.expectationValue(observableCircuit); -} - template py::class_ createSimulator(py::module_ m, const std::string& name) { auto sim = py::class_(m, name.c_str()); @@ -169,16 +78,7 @@ py::class_ createSimulator(py::module_ m, const std::string& name) { .def("get_tolerance", &Sim::getTolerance, "Get the tolerance for the DD package.") .def("set_tolerance", &Sim::setTolerance, "tol"_a, - "Set the tolerance for the DD package.") - .def("export_dd_to_graphviz_str", &Sim::exportDDtoGraphvizString, - "colored"_a = true, "edge_labels"_a = false, "classic"_a = false, - "memory"_a = false, "format_as_polar"_a = true, - "Get a Graphviz representation of the currently stored DD.") - .def("export_dd_to_graphviz_file", &Sim::exportDDtoGraphvizFile, - "filename"_a, "colored"_a = true, "edge_labels"_a = false, - "classic"_a = false, "memory"_a = false, "format_as_polar"_a = true, - "Write a Graphviz representation of the currently stored DD to a " - "file."); + "Set the tolerance for the DD package."); if constexpr (std::is_same_v) { sim.def("construct", &Sim::construct, @@ -187,13 +87,14 @@ py::class_ createSimulator(py::module_ m, const std::string& name) { sim.def("simulate", &Sim::simulate, "shots"_a, "Simulate the circuit and return the result as a dictionary of " "counts."); - sim.def("get_vector", &Sim::getVector, - "Get the state vector resulting from the simulation."); + sim.def("get_constructed_dd", &Sim::getCurrentDD, + "Get the vector DD resulting from the simulation."); } return sim; } PYBIND11_MODULE(pyddsim, m, py::mod_gil_not_used()) { + py::module::import("mqt.core.dd"); m.doc() = "Python interface for the MQT DDSIM quantum circuit simulator"; // Circuit Simulator @@ -203,7 +104,8 @@ PYBIND11_MODULE(pyddsim, m, py::mod_gil_not_used()) { .def(py::init<>(&constructSimulator>), "circ"_a, "approximation_step_fidelity"_a = 1., "approximation_steps"_a = 1, "approximation_strategy"_a = "fidelity", "seed"_a = -1) - .def("expectation_value", &expectationValue, "observable"_a); + .def("expectation_value", &CircuitSimulator<>::expectationValue, + "observable"_a); // Stoch simulator auto stochasticNoiseSimulator = @@ -255,7 +157,6 @@ PYBIND11_MODULE(pyddsim, m, py::mod_gil_not_used()) { .value("sequential", PathSimulator<>::Configuration::Mode::Sequential) .value("pairwise_recursive", PathSimulator<>::Configuration::Mode::PairwiseRecursiveGrouping) - .value("cotengra", PathSimulator<>::Configuration::Mode::Cotengra) .value("bracket", PathSimulator<>::Configuration::Mode::BracketGrouping) .value("alternating", PathSimulator<>::Configuration::Mode::Alternating) .value("gate_cost", PathSimulator<>::Configuration::Mode::GateCost) @@ -323,12 +224,6 @@ PYBIND11_MODULE(pyddsim, m, py::mod_gil_not_used()) { .def("get_mode", &UnitarySimulator::getMode) .def("get_construction_time", &UnitarySimulator::getConstructionTime) .def("get_final_node_count", &UnitarySimulator::getFinalNodeCount) - .def("get_max_node_count", &UnitarySimulator::getMaxNodeCount); - - // Miscellaneous functions - m.def("get_matrix", &getNumPyMatrix, "sim"_a, "mat"_a); - - m.def("dump_tensor_network", &dumpTensorNetwork, - "dump a tensor network representation of the given circuit", "circ"_a, - "filename"_a); + .def("get_max_node_count", &UnitarySimulator::getMaxNodeCount) + .def("get_constructed_dd", &UnitarySimulator::getConstructedDD); } diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 09b67d57..aad03786 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -9,7 +9,6 @@ package_add_test( test_stoch_noise_sim.cpp test_det_noise_sim.cpp test_unitary_sim.cpp - test_path_sim.cpp - test_output_ddvis.cpp) + test_path_sim.cpp) target_link_libraries(mqt-ddsim-test PRIVATE MQT::CoreAlgorithms) diff --git a/test/python/hybridsimulator/test_hybrid_standalone_simulator.py b/test/python/hybridsimulator/test_hybrid_standalone_simulator.py index 224cef9b..3b55ad84 100644 --- a/test/python/hybridsimulator/test_hybrid_standalone_simulator.py +++ b/test/python/hybridsimulator/test_hybrid_standalone_simulator.py @@ -2,19 +2,18 @@ import unittest -from qiskit import QuantumCircuit, QuantumRegister - +from mqt.core.ir import QuantumComputation from mqt.ddsim import HybridCircuitSimulator, HybridMode class MQTStandaloneHybridSimulatorTest(unittest.TestCase): def setUp(self) -> None: - q = QuantumRegister(4) - circ = QuantumCircuit(q) - circ.h(q) + circ = QuantumComputation(4) + for i in range(4): + circ.h(i) circ.cz(3, 1) circ.cz(2, 0) - circ.measure_all(inplace=True) + circ.measure_all() self.circuit = circ self.non_zeros_in_matrix = 16 diff --git a/test/python/simulator/test_qasm_simulator.py b/test/python/simulator/test_qasm_simulator.py index 9c813390..2218a93a 100644 --- a/test/python/simulator/test_qasm_simulator.py +++ b/test/python/simulator/test_qasm_simulator.py @@ -234,8 +234,13 @@ def test_qasm_simulator_mcx_vchain(backend: QasmSimulatorBackend, num_controls: nqubits = num_controls + 1 q = QuantumRegister(nqubits) c = ClassicalRegister(nqubits) - anc = AncillaRegister(max(0, num_controls - 2)) - circuit = QuantumCircuit(q, c, anc) + num_ancilla = max(0, num_controls - 2) + circuit = QuantumCircuit(q, c) + if num_ancilla > 0: + anc = AncillaRegister(num_ancilla) + circuit.add_register(anc) + else: + anc = None controls = q[1:nqubits] circuit.x(controls) circuit.mcx(controls, q[0], ancilla_qubits=anc, mode="v-chain") diff --git a/test/python/simulator/test_standalone_simulator.py b/test/python/simulator/test_standalone_simulator.py index 45009d43..14a31508 100644 --- a/test/python/simulator/test_standalone_simulator.py +++ b/test/python/simulator/test_standalone_simulator.py @@ -3,8 +3,8 @@ import pathlib import unittest -from qiskit import QuantumCircuit - +from mqt.core import load +from mqt.core.ir import QuantumComputation from mqt.ddsim import CircuitSimulator @@ -14,7 +14,8 @@ def setUp(self) -> None: def test_truly_standalone(self) -> None: filename = str(pathlib.Path(__file__).with_name("ghz_03.qasm").absolute()) - sim = CircuitSimulator(filename) + circ = load(filename) + sim = CircuitSimulator(circ) result = sim.simulate(1000) print(result) assert len(result.keys()) == self.nonzero_states_ghz @@ -22,7 +23,7 @@ def test_truly_standalone(self) -> None: assert "111" in result def test_standalone(self) -> None: - circ = QuantumCircuit(3) + circ = QuantumComputation(3) circ.h(0) circ.cx(0, 1) circ.cx(0, 2) @@ -34,7 +35,7 @@ def test_standalone(self) -> None: assert "111" in result def test_standalone_with_seed(self) -> None: - circ = QuantumCircuit(3) + circ = QuantumComputation(3) circ.h(0) circ.cx(0, 1) circ.cx(0, 2) @@ -49,11 +50,11 @@ def test_standalone_simple_approximation(self) -> None: import numpy as np # creates a state with <2% probability of measuring |1x> - circ = QuantumCircuit(2) + circ = QuantumComputation(2) circ.h(0) circ.cry(np.pi / 8, 0, 1) - circ.id(0) - circ.id(0) + circ.i(0) + circ.i(0) # create a simulator that approximates once and by at most 2% sim = CircuitSimulator(circ, approximation_step_fidelity=0.98, approximation_steps=1) @@ -66,17 +67,15 @@ def test_standalone_simple_approximation(self) -> None: @staticmethod def test_native_two_qubit_gates() -> None: - from qiskit.circuit.library import XXMinusYYGate, XXPlusYYGate - - qc = QuantumCircuit(2) + qc = QuantumComputation(2) qc.dcx(0, 1) qc.ecr(0, 1) qc.rxx(0.5, 0, 1) qc.rzz(0.5, 0, 1) qc.ryy(0.5, 0, 1) qc.rzx(0.5, 0, 1) - qc.append(XXMinusYYGate(0.5, 0.25), [0, 1]) - qc.append(XXPlusYYGate(0.5, 0.25), [0, 1]) + qc.xx_minus_yy(0.5, 0.25, 0, 1) + qc.xx_plus_yy(0.5, 0.25, 0, 1) print(qc) print(qc.global_phase) sim = CircuitSimulator(qc) @@ -89,16 +88,16 @@ def test_expectation_value_local_operators() -> None: max_qubits = 3 for qubits in range(1, max_qubits + 1): - qc = QuantumCircuit(qubits) + qc = QuantumComputation(qubits) sim = CircuitSimulator(qc) for i in range(qubits): - x_observable = QuantumCircuit(qubits) + x_observable = QuantumComputation(qubits) x_observable.x(i) assert sim.expectation_value(x_observable) == 0 - z_observable = QuantumCircuit(qubits) + z_observable = QuantumComputation(qubits) z_observable.z(i) assert sim.expectation_value(z_observable) == 1 - h_observable = QuantumCircuit(qubits) + h_observable = QuantumComputation(qubits) h_observable.h(i) assert np.allclose(sim.expectation_value(h_observable), 1 / np.sqrt(2)) @@ -108,11 +107,11 @@ def test_expectation_value_global_operators() -> None: max_qubits = 3 for qubits in range(1, max_qubits + 1): - qc = QuantumCircuit(qubits) + qc = QuantumComputation(qubits) sim = CircuitSimulator(qc) - x_observable = QuantumCircuit(qubits) - z_observable = QuantumCircuit(qubits) - h_observable = QuantumCircuit(qubits) + x_observable = QuantumComputation(qubits) + z_observable = QuantumComputation(qubits) + h_observable = QuantumComputation(qubits) for i in range(qubits): x_observable.x(i) z_observable.z(i) diff --git a/test/python/taskbasedsimulator/test_path_sim_standalone_simulator.py b/test/python/taskbasedsimulator/test_path_sim_standalone_simulator.py index 9603963d..c498a527 100644 --- a/test/python/taskbasedsimulator/test_path_sim_standalone_simulator.py +++ b/test/python/taskbasedsimulator/test_path_sim_standalone_simulator.py @@ -2,13 +2,8 @@ import unittest -from qiskit import QuantumCircuit - -from mqt.ddsim import ( - PathCircuitSimulator, - PathSimulatorConfiguration, - PathSimulatorMode, -) +from mqt.core.ir import QuantumComputation +from mqt.ddsim import PathCircuitSimulator, PathSimulatorConfiguration, PathSimulatorMode class MQTStandaloneSimulatorTests(unittest.TestCase): @@ -16,7 +11,7 @@ def setUp(self) -> None: self.nonzero_states_ghz = 2 def test_standalone(self) -> None: - circ = QuantumCircuit(3) + circ = QuantumComputation(3) circ.h(0) circ.cx(0, 1) circ.cx(0, 2) @@ -28,7 +23,7 @@ def test_standalone(self) -> None: assert "111" in result def test_standalone_with_config(self) -> None: - circ = QuantumCircuit(3) + circ = QuantumComputation(3) circ.h(0) circ.cx(0, 1) circ.cx(0, 2) @@ -40,7 +35,7 @@ def test_standalone_with_config(self) -> None: assert "111" in result def test_standalone_with_seed(self) -> None: - circ = QuantumCircuit(3) + circ = QuantumComputation(3) circ.h(0) circ.cx(0, 1) circ.cx(0, 2) @@ -52,7 +47,7 @@ def test_standalone_with_seed(self) -> None: assert "111" in result def test_standalone_individual_objects(self) -> None: - circ = QuantumCircuit(3) + circ = QuantumComputation(3) circ.h(0) circ.cx(0, 1) circ.cx(0, 2) @@ -64,7 +59,7 @@ def test_standalone_individual_objects(self) -> None: assert "111" in result def test_standalone_pairwise_only(self) -> None: - circ = QuantumCircuit(3) + circ = QuantumComputation(3) circ.h(0) circ.cx(0, 1) circ.cx(0, 2) @@ -81,7 +76,7 @@ def test_standalone_pairwise_only(self) -> None: assert "111" in result def test_standalone_gatecost_only(self) -> None: - circ = QuantumCircuit(3) + circ = QuantumComputation(3) circ.h(0) circ.cx(0, 1) circ.cx(0, 2) diff --git a/test/python/unitarysimulator/test_standalone_unitary_simulator.py b/test/python/unitarysimulator/test_standalone_unitary_simulator.py index 4cb8f21e..b1003eac 100644 --- a/test/python/unitarysimulator/test_standalone_unitary_simulator.py +++ b/test/python/unitarysimulator/test_standalone_unitary_simulator.py @@ -3,52 +3,48 @@ import unittest import numpy as np -import numpy.typing as npt -from qiskit import QuantumCircuit -from mqt.ddsim import ConstructionMode, UnitarySimulator, get_matrix +from mqt.core.ir import QuantumComputation +from mqt.ddsim import ConstructionMode, UnitarySimulator class MQTStandaloneUnitarySimulatorTests(unittest.TestCase): def setUp(self) -> None: - circ = QuantumCircuit(3) + circ = QuantumComputation(3) circ.h(0) circ.cx(0, 1) circ.cx(0, 2) self.circuit = circ - self.unitary: npt.NDArray[np.complex128] = np.zeros( - (2**circ.num_qubits, 2**circ.num_qubits), dtype=np.complex128 - ) self.non_zeros_in_bell_circuit = 16 def test_standalone_sequential_mode(self) -> None: sim = UnitarySimulator(self.circuit, mode=ConstructionMode.sequential) sim.construct() - get_matrix(sim, self.unitary) - print(self.unitary) - assert np.count_nonzero(self.unitary) == self.non_zeros_in_bell_circuit + unitary = np.array(sim.get_constructed_dd().get_matrix(sim.get_number_of_qubits()), copy=False) + print(unitary) + assert np.count_nonzero(unitary) == self.non_zeros_in_bell_circuit def test_standalone_sequential_mode_with_seed(self) -> None: sim = UnitarySimulator(self.circuit, seed=1337, mode=ConstructionMode.sequential) sim.construct() - get_matrix(sim, self.unitary) - print(self.unitary) - assert np.count_nonzero(self.unitary) == self.non_zeros_in_bell_circuit + unitary = np.array(sim.get_constructed_dd().get_matrix(sim.get_number_of_qubits()), copy=False) + print(unitary) + assert np.count_nonzero(unitary) == self.non_zeros_in_bell_circuit def test_standalone_recursive_mode(self) -> None: sim = UnitarySimulator(self.circuit, mode=ConstructionMode.recursive) sim.construct() - get_matrix(sim, self.unitary) - print(self.unitary) - assert np.count_nonzero(self.unitary) == self.non_zeros_in_bell_circuit + unitary = np.array(sim.get_constructed_dd().get_matrix(sim.get_number_of_qubits()), copy=False) + print(unitary) + assert np.count_nonzero(unitary) == self.non_zeros_in_bell_circuit def test_standalone_recursive_mode_with_seed(self) -> None: sim = UnitarySimulator(self.circuit, seed=1337, mode=ConstructionMode.recursive) sim.construct() - get_matrix(sim, self.unitary) - print(self.unitary) - assert np.count_nonzero(self.unitary) == self.non_zeros_in_bell_circuit + unitary = np.array(sim.get_constructed_dd().get_matrix(sim.get_number_of_qubits()), copy=False) + print(unitary) + assert np.count_nonzero(unitary) == self.non_zeros_in_bell_circuit diff --git a/test/test_circuit_sim.cpp b/test/test_circuit_sim.cpp index 568631bc..edfa6b85 100644 --- a/test/test_circuit_sim.cpp +++ b/test/test_circuit_sim.cpp @@ -1,7 +1,6 @@ #include "CircuitSimulator.hpp" #include "Definitions.hpp" #include "algorithms/BernsteinVazirani.hpp" -#include "algorithms/Grover.hpp" #include "algorithms/QFT.hpp" #include "algorithms/QPE.hpp" #include "dd/DDDefinitions.hpp" @@ -14,7 +13,6 @@ #include #include #include -#include #include #include @@ -31,7 +29,7 @@ TEST(CircuitSimTest, SingleOneQubitGateOnTwoQubitCircuit) { EXPECT_EQ(ddsim.getMaxNodeCount(), 4); - auto m = ddsim.measureAll(false); + const auto m = ddsim.measureAll(false); ASSERT_EQ("01", m); } @@ -95,8 +93,8 @@ TEST(CircuitSimTest, ClassicControlledOp) { auto quantumComputation = std::make_unique(2, 2); quantumComputation->x(0); quantumComputation->measure(0, 0); - quantumComputation->classicControlled(qc::X, 1U, - quantumComputation->getCregs().at("c")); + quantumComputation->classicControlled( + qc::X, 1U, quantumComputation->getClassicalRegisters().at("c")); CircuitSimulator ddsim( std::move(quantumComputation), @@ -113,7 +111,7 @@ TEST(CircuitSimTest, ClassicControlledOpAsNop) { quantumComputation->x(0); quantumComputation->measure(0, 0); quantumComputation->classicControlled( - qc::X, 1U, quantumComputation->getCregs().at("c"), 0); + qc::X, 1U, quantumComputation->getClassicalRegisters().at("c"), 0); CircuitSimulator ddsim( std::move(quantumComputation), @@ -132,46 +130,19 @@ TEST(CircuitSimTest, DestructiveMeasurementAll) { CircuitSimulator ddsim(std::move(quantumComputation), 42); ddsim.simulate(1); - const auto vBefore = ddsim.getVector(); + const auto vBefore = ddsim.getCurrentDD().getVector(); ASSERT_EQ(vBefore[0], vBefore[1]); ASSERT_EQ(vBefore[0], vBefore[2]); ASSERT_EQ(vBefore[0], vBefore[3]); const std::string m = ddsim.measureAll(true); - const auto vAfter = ddsim.getVector(); + const auto vAfter = ddsim.getCurrentDD().getVector(); const std::size_t i = std::stoul(m, nullptr, 2); ASSERT_EQ(vAfter[i].real(), 1.0); ASSERT_EQ(vAfter[i].imag(), 0.0); } -TEST(CircuitSimTest, DestructiveMeasurementOne) { - auto quantumComputation = std::make_unique(2); - quantumComputation->h(0); - quantumComputation->h(1); - CircuitSimulator ddsim( - std::move(quantumComputation), - ApproximationInfo(1, 1, ApproximationInfo::FidelityDriven)); - ddsim.simulate(1); - - const char m = ddsim.measureOneCollapsing(0); - const auto vAfter = ddsim.getVector(); - - if (m == '0') { - ASSERT_EQ(vAfter[0], dd::SQRT2_2); - ASSERT_EQ(vAfter[2], dd::SQRT2_2); - ASSERT_EQ(vAfter[1], 0.); - ASSERT_EQ(vAfter[3], 0.); - } else if (m == '1') { - ASSERT_EQ(vAfter[0], 0.); - ASSERT_EQ(vAfter[2], 0.); - ASSERT_EQ(vAfter[1], dd::SQRT2_2); - ASSERT_EQ(vAfter[3], dd::SQRT2_2); - } else { - FAIL() << "Measurement result not in {0,1}!"; - } -} - TEST(CircuitSimTest, ApproximateByFidelity) { auto quantumComputation = std::make_unique(3); quantumComputation->h(0); @@ -210,19 +181,6 @@ TEST(CircuitSimTest, ApproximateBySampling) { ASSERT_LE(resultingFidelity, 0.75); // the least contributing path has .25 } -TEST(CircuitSimTest, ApproximationByMemoryInSimulator) { - std::unique_ptr quantumComputation = - std::make_unique(17, 0); - CircuitSimulator ddsim( - std::move(quantumComputation), - ApproximationInfo(0.3, 1, ApproximationInfo::MemoryDriven)); - ddsim.simulate(1); - - // Memory driven approximation is triggered only on quite large DDs, - // unsuitable for testing - // TODO Allow adjusting the limits at runtime? -} - TEST(CircuitSimTest, ApproximationByFidelityInSimulator) { auto quantumComputation = std::make_unique(3); quantumComputation->h(0); @@ -273,7 +231,7 @@ TEST(CircuitSimTest, ApproximationTest) { std::move(qc), ApproximationInfo(0.98, 2, ApproximationInfo::FidelityDriven)); ddsim.simulate(4096); - const auto vec = ddsim.getVector(); + const auto vec = ddsim.getCurrentDD().getVector(); EXPECT_EQ(abs(vec[2]), 0); EXPECT_EQ(abs(vec[3]), 0); } @@ -322,43 +280,37 @@ TEST(CircuitSimTest, ToleranceTest) { auto qc = std::make_unique(2); CircuitSimulator ddsim(std::move(qc)); const auto tolerance = ddsim.getTolerance(); - const auto newTolerance = 0.1; + constexpr auto newTolerance = 0.1; ddsim.setTolerance(newTolerance); EXPECT_EQ(ddsim.getTolerance(), newTolerance); ddsim.setTolerance(tolerance); EXPECT_EQ(ddsim.getTolerance(), tolerance); } -TEST(CircuitSimTest, TooManyQubitsForVectorTest) { - auto qc = std::make_unique(61); - CircuitSimulator ddsim(std::move(qc)); - ddsim.simulate(0); - EXPECT_THROW( - { [[maybe_unused]] auto _ = ddsim.getVector(); }, std::range_error); -} - TEST(CircuitSimTest, BernsteinVaziraniDynamicTest) { - std::size_t const n = 3; - auto qc = std::make_unique(n, true); - const auto expected = qc->expected; // qc will be undefined after move - auto circSim = std::make_unique>(std::move(qc), 23); + constexpr std::size_t n = 3; + const auto* const expectedString = "101"; + const qc::BVBitString expected{expectedString}; + auto qc = std::make_unique( + qc::createIterativeBernsteinVazirani(expected, n)); + const auto circSim = std::make_unique>(std::move(qc), 23); const auto result = circSim->simulate(1024U); EXPECT_EQ(result.size(), 1); - EXPECT_EQ(result.at(expected), 1024); + EXPECT_EQ(result.at(expectedString), 1024); } TEST(CircuitSimTest, QPEDynamicTest) { - std::size_t const n = 3; - auto qc = std::make_unique(n, true, true); - auto circSim = std::make_unique>(std::move(qc), 23); + constexpr std::size_t n = 3; + auto qc = std::make_unique(qc::createIterativeQPE(n)); + const auto circSim = std::make_unique>(std::move(qc), 23); const auto result = circSim->simulate(1024U); EXPECT_GE(result.size(), 1); } TEST(CircuitSimTest, QFTDynamicTest) { - std::size_t const n = 3; - auto qc = std::make_unique(n, true, true); - auto circSim = std::make_unique>(std::move(qc), 23); + constexpr std::size_t n = 3; + auto qc = std::make_unique(qc::createIterativeQFT(n)); + const auto circSim = std::make_unique>(std::move(qc), 23); const auto result = circSim->simulate(1024U); EXPECT_GE(result.size(), 1); } @@ -366,6 +318,6 @@ TEST(CircuitSimTest, QFTDynamicTest) { TEST(CircuitSimTest, GetVectorBeforeSimulate) { auto qc = std::make_unique(1); const CircuitSimulator ddsim(std::move(qc)); - const auto vec = ddsim.getVector(); + const auto vec = ddsim.getCurrentDD().getVector(); EXPECT_EQ(vec[0], 1.); } diff --git a/test/test_hybridsim.cpp b/test/test_hybridsim.cpp index 3fac25a2..e512f4cf 100644 --- a/test/test_hybridsim.cpp +++ b/test/test_hybridsim.cpp @@ -198,7 +198,7 @@ TEST(HybridSimTest, DynamicCircuitSupport) { auto qc = std::make_unique(1, 1); qc->h(0); qc->measure(0, 0); - qc->classicControlled(qc::X, 0, {0, 1}, 1); + qc->classicControlled(qc::X, 0, 0, 1); std::cout << *qc << "\n"; HybridSchrodingerFeynmanSimulator sim(std::move(qc)); diff --git a/test/test_output_ddvis.cpp b/test/test_output_ddvis.cpp deleted file mode 100644 index 774a26bb..00000000 --- a/test/test_output_ddvis.cpp +++ /dev/null @@ -1,98 +0,0 @@ -#include "CircuitSimulator.hpp" -#include "HybridSchrodingerFeynmanSimulator.hpp" -#include "UnitarySimulator.hpp" -#include "ir/QuantumComputation.hpp" - -#include -#include -#include -#include -#include -#include -#include -#include - -using namespace qc::literals; - -class DDVis : public testing::Test { -protected: - void SetUp() override { - qc = std::make_unique(2U); - qc->h(0U); - qc->cx(0U, 1U); - } - - std::unique_ptr qc; - std::size_t numShots = 1024U; - - static void fileExistsAndIsNonEmpty(const std::string& filename) { - std::ifstream file(filename); - ASSERT_TRUE(file.good()); - ASSERT_NE(file.peek(), std::ifstream::traits_type::eof()); - file.close(); - } -}; - -TEST_F(DDVis, CircuitSimulator) { - CircuitSimulator sim(std::move(qc)); - sim.simulate(numShots); - const auto dot = sim.exportDDtoGraphvizString(); - EXPECT_FALSE(dot.empty()); - std::cout << dot << "\n"; - - const std::string filename = "test_circuit_simulator.gv"; - sim.exportDDtoGraphvizFile(filename); - - fileExistsAndIsNonEmpty(filename); - std::filesystem::remove(filename); -} - -TEST_F(DDVis, UnitarySimulator) { - UnitarySimulator sim(std::move(qc)); - sim.construct(); - - const auto dot = - sim.exportDDtoGraphvizString(true, false, false, false, true); - EXPECT_FALSE(dot.empty()); - std::cout << dot << "\n"; - - const std::string filename = "test_unitary_simulator.gv"; - sim.exportDDtoGraphvizFile(filename); - - fileExistsAndIsNonEmpty(filename); - std::filesystem::remove(filename); -} - -TEST_F(DDVis, HSFSimulatorDD) { - HybridSchrodingerFeynmanSimulator sim( - std::move(qc), HybridSchrodingerFeynmanSimulator<>::Mode::DD); - sim.simulate(numShots); - - const auto dot = - sim.exportDDtoGraphvizString(true, false, false, false, true); - EXPECT_FALSE(dot.empty()); - std::cout << dot << "\n"; - - const std::string filename = "test_hsf_simulator_dd.gv"; - sim.exportDDtoGraphvizFile(filename); - - fileExistsAndIsNonEmpty(filename); - std::filesystem::remove(filename); -} - -TEST_F(DDVis, HSFSimulatorAmplitude) { - HybridSchrodingerFeynmanSimulator sim( - std::move(qc), HybridSchrodingerFeynmanSimulator<>::Mode::Amplitude); - sim.simulate(numShots); - - const auto dot = - sim.exportDDtoGraphvizString(true, false, false, false, true); - EXPECT_FALSE(dot.empty()); - std::cout << dot << "\n"; - - const std::string filename = "test_hsf_simulator_amplitude.gv"; - sim.exportDDtoGraphvizFile(filename); - - fileExistsAndIsNonEmpty(filename); - std::filesystem::remove(filename); -} diff --git a/test/test_path_sim.cpp b/test/test_path_sim.cpp index a4526e75..321d092a 100644 --- a/test/test_path_sim.cpp +++ b/test/test_path_sim.cpp @@ -28,9 +28,6 @@ TEST(TaskBasedSimTest, Configuration) { EXPECT_EQ(PathSimulator<>::Configuration::modeToString( PathSimulator<>::Configuration::Mode::Alternating), "alternating"); - EXPECT_EQ(PathSimulator<>::Configuration::modeToString( - PathSimulator<>::Configuration::Mode::Cotengra), - "cotengra"); EXPECT_EQ(PathSimulator<>::Configuration::modeToString( PathSimulator<>::Configuration::Mode::GateCost), "gate_cost"); @@ -49,8 +46,6 @@ TEST(TaskBasedSimTest, Configuration) { PathSimulator<>::Configuration::Mode::BracketGrouping); EXPECT_EQ(PathSimulator<>::Configuration::modeFromString("alternating"), PathSimulator<>::Configuration::Mode::Alternating); - EXPECT_EQ(PathSimulator<>::Configuration::modeFromString("cotengra"), - PathSimulator<>::Configuration::Mode::Cotengra); EXPECT_EQ(PathSimulator<>::Configuration::modeFromString("gate_cost"), PathSimulator<>::Configuration::Mode::GateCost); EXPECT_THROW( @@ -157,10 +152,10 @@ TEST(TaskBasedSimTest, SimpleCircuitBracket) { } TEST(TaskBasedSimTest, GroverCircuitBracket) { - std::unique_ptr qc = - std::make_unique(4, 12345); - auto* grover = dynamic_cast(qc.get()); - auto targetValue = grover->targetValue; + const auto* const expected = "1111"; + const auto targetValue = qc::GroverBitString{expected}; + auto qc = std::make_unique( + qc::createGrover(4, targetValue)); // construct simulator and generate bracketing contraction plan auto config = PathSimulator<>::Configuration{}; @@ -183,10 +178,10 @@ TEST(TaskBasedSimTest, GroverCircuitBracket) { } TEST(TaskBasedSimTest, GroverCircuitAlternatingMiddle) { - std::unique_ptr qc = - std::make_unique(4, 12345); - auto* grover = dynamic_cast(qc.get()); - auto targetValue = grover->targetValue; + const auto* const expected = "1111"; + const auto targetValue = qc::GroverBitString{expected}; + auto qc = std::make_unique( + qc::createGrover(4, targetValue)); // construct simulator and generate alternating contraction plan auto config = PathSimulator<>::Configuration{}; @@ -208,10 +203,10 @@ TEST(TaskBasedSimTest, GroverCircuitAlternatingMiddle) { } TEST(TaskBasedSimTest, GroverCircuitPairwiseGrouping) { - std::unique_ptr qc = - std::make_unique(4, 12345); - auto* grover = dynamic_cast(qc.get()); - auto targetValue = grover->targetValue; + const auto* const expected = "1111"; + const auto targetValue = qc::GroverBitString{expected}; + auto qc = std::make_unique( + qc::createGrover(4, targetValue)); // construct simulator and generate pairwise recursive contraction plan auto config = PathSimulator<>::Configuration{}; @@ -301,7 +296,7 @@ TEST(TaskBasedSimTest, DynamicCircuitSupport) { auto qc = std::make_unique(1, 1); qc->h(0); qc->measure(0, 0); - qc->classicControlled(qc::X, 0, {0, 1}, 1); + qc->classicControlled(qc::X, 0, 0, 1); std::cout << *qc << "\n"; PathSimulator sim(std::move(qc)); diff --git a/uv.lock b/uv.lock index 5710dc81..00ed1bb1 100644 --- a/uv.lock +++ b/uv.lock @@ -52,6 +52,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/81/29/5ecc3a15d5a33e31b26c11426c45c501e439cb865d0bff96315d86443b78/appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c", size = 4321 }, ] +[[package]] +name = "astroid" +version = "3.3.8" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/80/c5/5c83c48bbf547f3dd8b587529db7cf5a265a3368b33e85e76af8ff6061d3/astroid-3.3.8.tar.gz", hash = "sha256:a88c7994f914a4ea8572fac479459f4955eeccc877be3f2d959a33273b0cf40b", size = 398196 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/07/28/0bc8a17d6cd4cc3c79ae41b7105a2b9a327c110e5ddd37a8a27b29a5c8a2/astroid-3.3.8-py3-none-any.whl", hash = "sha256:187ccc0c248bfbba564826c26f070494f7bc964fd286b6d9fff4420e55de828c", size = 275153 }, +] + [[package]] name = "asttokens" version = "3.0.0" @@ -70,15 +82,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/fc/30/d4986a882011f9df997a55e6becd864812ccfcd821d64aac8570ee39f719/attrs-25.1.0-py3-none-any.whl", hash = "sha256:c75a69e28a550a7e93789579c22aa26b0f5b83b75dc4e08fe092980051e1090a", size = 63152 }, ] -[[package]] -name = "autoray" -version = "0.7.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/8e/b7/8ec4ffeca00c9360adb94be177313f711071628b21ea912abe6e246051e1/autoray-0.7.0.tar.gz", hash = "sha256:7829d21258512f87e02f23ce74ae5759af4ce8998069d2cce53468f1d701a219", size = 1214555 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e5/ac/d8fb343def8bc5b7f82f5dcf0892e9020a446f21107a2d7de1537ff2fdf3/autoray-0.7.0-py3-none-any.whl", hash = "sha256:03103957df3d1b66b8068158056c2909a72095b19d1b24262261276a714a5d07", size = 930011 }, -] - [[package]] name = "babel" version = "2.17.0" @@ -125,7 +128,7 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "7.4.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, - { name = "sphinx", version = "8.2.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/01/56/99bf7d0799d95ad485d95596dc01c2a5b3dda58ebf50a94f6f73b33bacdf/breathe-4.36.0.tar.gz", hash = "sha256:14860b73118ac140b7a3f55446890c777d1b67149cb024279fe3710dad7f535c", size = 154842 } wheels = [ @@ -452,18 +455,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/52/94/86bfae441707205634d80392e873295652fc313dfd93c233c52c4dc07874/contourpy-1.3.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:44a29502ca9c7b5ba389e620d44f2fbe792b1fb5734e8b931ad307071ec58c53", size = 218221 }, ] -[[package]] -name = "cotengra" -version = "0.7.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "autoray" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/c9/a6/c8af5aae49b37d2468ae0069a2b7c94e6a9836448fec94385accc1963264/cotengra-0.7.0.tar.gz", hash = "sha256:8ad9fabee899ac2f7b72359ace79a5496f15fd89b19049656082ef7773ca2b69", size = 2822779 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/10/fb/cfdd2fd83b3ed1d3dd9682e2c561c7ce9f4f625d03fe7ec5062077264882/cotengra-0.7.0-py3-none-any.whl", hash = "sha256:ca1c75fec462fb75130a3a826db2d4565bbbf0641d5ce0a617e643211cd98307", size = 189801 }, -] - [[package]] name = "coverage" version = "7.6.12" @@ -548,97 +539,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30", size = 8321 }, ] -[[package]] -name = "cytoolz" -version = "1.0.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "toolz" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/a7/f9/3243eed3a6545c2a33a21f74f655e3fcb5d2192613cd3db81a93369eb339/cytoolz-1.0.1.tar.gz", hash = "sha256:89cc3161b89e1bb3ed7636f74ed2e55984fd35516904fc878cae216e42b2c7d6", size = 626652 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/1e/d9/f13d66c16cff1fa1cb6c234698029877c456f35f577ef274aba3b86e7c51/cytoolz-1.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:cec9af61f71fc3853eb5dca3d42eb07d1f48a4599fa502cbe92adde85f74b042", size = 403515 }, - { url = "https://files.pythonhosted.org/packages/4b/2d/4cdf848a69300c7d44984f2ebbebb3b8576e5449c8dea157298f3bdc4da3/cytoolz-1.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:140bbd649dbda01e91add7642149a5987a7c3ccc251f2263de894b89f50b6608", size = 383936 }, - { url = "https://files.pythonhosted.org/packages/72/a4/ccfdd3f0ed9cc818f734b424261f6018fc61e3ec833bf85225a9aca0d994/cytoolz-1.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e90124bdc42ff58b88cdea1d24a6bc5f776414a314cc4d94f25c88badb3a16d1", size = 1934569 }, - { url = "https://files.pythonhosted.org/packages/50/fc/38d5344fa595683ad10dc819cfc1d8b9d2b3391ccf3e8cb7bab4899a01f5/cytoolz-1.0.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e74801b751e28f7c5cc3ad264c123954a051f546f2fdfe089f5aa7a12ccfa6da", size = 2015129 }, - { url = "https://files.pythonhosted.org/packages/28/29/75261748dc54a20a927f33641f4e9aac674cfc6d3fbd4f332e10d0b37639/cytoolz-1.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:582dad4545ddfb5127494ef23f3fa4855f1673a35d50c66f7638e9fb49805089", size = 2000506 }, - { url = "https://files.pythonhosted.org/packages/00/ae/e4ead004cc2698281d153c4a5388638d67cdb5544d6d6cc1e5b3db2bd2a3/cytoolz-1.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd7bd0618e16efe03bd12f19c2a26a27e6e6b75d7105adb7be1cd2a53fa755d8", size = 1957537 }, - { url = "https://files.pythonhosted.org/packages/4a/ff/4f3aa07f4f47701f7f63df60ce0a5669fa09c256c3d4a33503a9414ea5cc/cytoolz-1.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d74cca6acf1c4af58b2e4a89cc565ed61c5e201de2e434748c93e5a0f5c541a5", size = 1863331 }, - { url = "https://files.pythonhosted.org/packages/a2/29/654f57f2a9b8e9765a4ab876765f64f94530b61fc6471a07feea42ece6d4/cytoolz-1.0.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:823a3763828d8d457f542b2a45d75d6b4ced5e470b5c7cf2ed66a02f508ed442", size = 1849938 }, - { url = "https://files.pythonhosted.org/packages/bc/7b/11f457db6b291060a98315ab2c7198077d8bddeeebe5f7126d9dad98cc54/cytoolz-1.0.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:51633a14e6844c61db1d68c1ffd077cf949f5c99c60ed5f1e265b9e2966f1b52", size = 1852345 }, - { url = "https://files.pythonhosted.org/packages/6b/92/0dccc96ce0323be236d404f5084479b79b747fa0e74e43a270e95868b5f9/cytoolz-1.0.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:f3ec9b01c45348f1d0d712507d54c2bfd69c62fbd7c9ef555c9d8298693c2432", size = 1989877 }, - { url = "https://files.pythonhosted.org/packages/a3/c8/1c5203a81200bae51aa8f7b5fad613f695bf1afa03f16251ca23ecb2ef9f/cytoolz-1.0.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:1855022b712a9c7a5bce354517ab4727a38095f81e2d23d3eabaf1daeb6a3b3c", size = 1994492 }, - { url = "https://files.pythonhosted.org/packages/e2/8a/04bc193c4d7ced8ef6bb62cdcd0bf40b5e5eb26586ed2cfb4433ec7dfd0a/cytoolz-1.0.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9930f7288c4866a1dc1cc87174f0c6ff4cad1671eb1f6306808aa6c445857d78", size = 1896077 }, - { url = "https://files.pythonhosted.org/packages/21/a5/bee63a58f51d2c74856db66e6119a014464ff8cb1c9387fa4bd2d94e49b0/cytoolz-1.0.1-cp310-cp310-win32.whl", hash = "sha256:a9baad795d72fadc3445ccd0f122abfdbdf94269157e6d6d4835636dad318804", size = 322135 }, - { url = "https://files.pythonhosted.org/packages/e8/16/7abfb1685e8b7f2838264551ee33651748994813f566ac4c3d737dfe90e5/cytoolz-1.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:ad95b386a84e18e1f6136f6d343d2509d4c3aae9f5a536f3dc96808fcc56a8cf", size = 363599 }, - { url = "https://files.pythonhosted.org/packages/dc/ea/8131ae39119820b8867cddc23716fa9f681f2b3bbce6f693e68dfb36b55b/cytoolz-1.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2d958d4f04d9d7018e5c1850790d9d8e68b31c9a2deebca74b903706fdddd2b6", size = 406162 }, - { url = "https://files.pythonhosted.org/packages/26/18/3d9bd4c146f6ea6e51300c242b20cb416966b21d481dac230e1304f1e54b/cytoolz-1.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0f445b8b731fc0ecb1865b8e68a070084eb95d735d04f5b6c851db2daf3048ab", size = 384961 }, - { url = "https://files.pythonhosted.org/packages/e4/73/9034827907c7f85c7c484c9494e905d022fb8174526004e9ef332570349e/cytoolz-1.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f546a96460a7e28eb2ec439f4664fa646c9b3e51c6ebad9a59d3922bbe65e30", size = 2091698 }, - { url = "https://files.pythonhosted.org/packages/74/af/d5c2733b0fde1a08254ff1a8a8d567874040c9eb1606363cfebc0713c73f/cytoolz-1.0.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0317681dd065532d21836f860b0563b199ee716f55d0c1f10de3ce7100c78a3b", size = 2188452 }, - { url = "https://files.pythonhosted.org/packages/6a/bb/77c71fa9c217260b4056a732d754748903423c2cdd82a673d6064741e375/cytoolz-1.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0c0ef52febd5a7821a3fd8d10f21d460d1a3d2992f724ba9c91fbd7a96745d41", size = 2174203 }, - { url = "https://files.pythonhosted.org/packages/fc/a9/a5b4a3ff5d22faa1b60293bfe97362e2caf4a830c26d37ab5557f60d04b2/cytoolz-1.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5ebaf419acf2de73b643cf96108702b8aef8e825cf4f63209ceb078d5fbbbfd", size = 2099831 }, - { url = "https://files.pythonhosted.org/packages/35/08/7f6869ea1ff31ce5289a7d58d0e7090acfe7058baa2764473048ff61ea3c/cytoolz-1.0.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5f7f04eeb4088947585c92d6185a618b25ad4a0f8f66ea30c8db83cf94a425e3", size = 1996744 }, - { url = "https://files.pythonhosted.org/packages/46/b4/9ac424c994b51763fd1bbed62d95f8fba8fa0e45c8c3c583904fdaf8f51d/cytoolz-1.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:f61928803bb501c17914b82d457c6f50fe838b173fb40d39c38d5961185bd6c7", size = 2013733 }, - { url = "https://files.pythonhosted.org/packages/3e/99/03009765c4b87d742d5b5a8670abb56a8c7ede033c2cdaa4be8662d3b001/cytoolz-1.0.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:d2960cb4fa01ccb985ad1280db41f90dc97a80b397af970a15d5a5de403c8c61", size = 1994850 }, - { url = "https://files.pythonhosted.org/packages/40/9a/8458af9a5557e177ea42f8cf7e477bede518b0bbef564e28c4151feaa52c/cytoolz-1.0.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:b2b407cc3e9defa8df5eb46644f6f136586f70ba49eba96f43de67b9a0984fd3", size = 2155352 }, - { url = "https://files.pythonhosted.org/packages/5e/5c/2a701423e001fcbec288b4f3fc2bf67557d114c2388237fc1ae67e1e2686/cytoolz-1.0.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:8245f929144d4d3bd7b972c9593300195c6cea246b81b4c46053c48b3f044580", size = 2163515 }, - { url = "https://files.pythonhosted.org/packages/36/16/ee2e06e65d9d533bc05cd52a0b355ba9072fc8f60d77289e529c6d2e3750/cytoolz-1.0.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e37385db03af65763933befe89fa70faf25301effc3b0485fec1c15d4ce4f052", size = 2054431 }, - { url = "https://files.pythonhosted.org/packages/d8/d5/2fac8315f210fa1bc7106e27c19e1211580aa25bb7fa17dfd79505e5baf2/cytoolz-1.0.1-cp311-cp311-win32.whl", hash = "sha256:50f9c530f83e3e574fc95c264c3350adde8145f4f8fc8099f65f00cc595e5ead", size = 322004 }, - { url = "https://files.pythonhosted.org/packages/a9/9e/0b70b641850a95f9ff90adde9d094a4b1d81ec54dadfd97fec0a2aaf440e/cytoolz-1.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:b7f6b617454b4326af7bd3c7c49b0fc80767f134eb9fd6449917a058d17a0e3c", size = 365358 }, - { url = "https://files.pythonhosted.org/packages/d8/e8/218098344ed2cb5f8441fade9b2428e435e7073962374a9c71e59ac141a7/cytoolz-1.0.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fcb8f7d0d65db1269022e7e0428471edee8c937bc288ebdcb72f13eaa67c2fe4", size = 414121 }, - { url = "https://files.pythonhosted.org/packages/de/27/4d729a5653718109262b758fec1a959aa9facb74c15460d9074dc76d6635/cytoolz-1.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:207d4e4b445e087e65556196ff472ff134370d9a275d591724142e255f384662", size = 390904 }, - { url = "https://files.pythonhosted.org/packages/72/c0/cbabfa788bab9c6038953bf9478adaec06e88903a726946ea7c88092f5c4/cytoolz-1.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21cdf6bac6fd843f3b20280a66fd8df20dea4c58eb7214a2cd8957ec176f0bb3", size = 2090734 }, - { url = "https://files.pythonhosted.org/packages/c3/66/369262c60f9423c2da82a60864a259c852f1aa122aced4acd2c679af58c0/cytoolz-1.0.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4a55ec098036c0dea9f3bdc021f8acd9d105a945227d0811589f0573f21c9ce1", size = 2155933 }, - { url = "https://files.pythonhosted.org/packages/aa/4e/ee55186802f8d24b5fbf9a11405ccd1203b30eded07cc17750618219b94e/cytoolz-1.0.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a13ab79ff4ce202e03ab646a2134696988b554b6dc4b71451e948403db1331d8", size = 2171903 }, - { url = "https://files.pythonhosted.org/packages/a1/96/bd1a9f3396e9b7f618db8cd08d15630769ce3c8b7d0534f92cd639c977ae/cytoolz-1.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e2d944799026e1ff08a83241f1027a2d9276c41f7a74224cd98b7df6e03957d", size = 2125270 }, - { url = "https://files.pythonhosted.org/packages/28/48/2a3762873091c88a69e161111cfbc6c222ff145d57ff011a642b169f04f1/cytoolz-1.0.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88ba85834cd523b91fdf10325e1e6d71c798de36ea9bdc187ca7bd146420de6f", size = 1973967 }, - { url = "https://files.pythonhosted.org/packages/e4/50/500bd69774bdc49a4d78ec8779eb6ac7c1a9d706bfd91cf2a1dba604373a/cytoolz-1.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5a750b1af7e8bf6727f588940b690d69e25dc47cce5ce467925a76561317eaf7", size = 2021695 }, - { url = "https://files.pythonhosted.org/packages/e4/4e/ba5a0ce34869495eb50653de8d676847490cf13a2cac1760fc4d313e78de/cytoolz-1.0.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:44a71870f7eae31d263d08b87da7c2bf1176f78892ed8bdade2c2850478cb126", size = 2010177 }, - { url = "https://files.pythonhosted.org/packages/87/57/615c630b3089a13adb15351d958d227430cf624f03b1dd39eb52c34c1f59/cytoolz-1.0.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c8231b9abbd8e368e036f4cc2e16902c9482d4cf9e02a6147ed0e9a3cd4a9ab0", size = 2154321 }, - { url = "https://files.pythonhosted.org/packages/7f/0f/fe1aa2d931e3b35ecc05215bd75da945ea7346095b3b6f6027164e602d5a/cytoolz-1.0.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:aa87599ccc755de5a096a4d6c34984de6cd9dc928a0c5eaa7607457317aeaf9b", size = 2188374 }, - { url = "https://files.pythonhosted.org/packages/de/fa/fd363d97a641b6d0e2fd1d5c35b8fd41d9ccaeb4df56302f53bf23a58e3a/cytoolz-1.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:67cd16537df51baabde3baa770ab7b8d16839c4d21219d5b96ac59fb012ebd2d", size = 2077911 }, - { url = "https://files.pythonhosted.org/packages/d9/68/0a22946b98ae5201b54ccb4e651295285c0fb79406022b6ee8b2f791940c/cytoolz-1.0.1-cp312-cp312-win32.whl", hash = "sha256:fb988c333f05ee30ad4693fe4da55d95ec0bb05775d2b60191236493ea2e01f9", size = 321903 }, - { url = "https://files.pythonhosted.org/packages/62/1a/f3903197956055032f8cb297342e2dff07e50f83991aebfe5b4c4fcb55e4/cytoolz-1.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:8f89c48d8e5aec55ffd566a8ec858706d70ed0c6a50228eca30986bfa5b4da8b", size = 364490 }, - { url = "https://files.pythonhosted.org/packages/aa/2e/a9f069db0107749e9e72baf6c21abe3f006841a3bcfdc9b8420e22ef31eb/cytoolz-1.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6944bb93b287032a4c5ca6879b69bcd07df46f3079cf8393958cf0b0454f50c0", size = 407365 }, - { url = "https://files.pythonhosted.org/packages/a9/9b/5e87dd0e31f54c778b4f9f34cc14c1162d3096c8d746b0f8be97d70dd73c/cytoolz-1.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e027260fd2fc5cb041277158ac294fc13dca640714527219f702fb459a59823a", size = 385233 }, - { url = "https://files.pythonhosted.org/packages/63/00/2fd32b16284cdb97cfe092822179bc0c3bcdd5e927dd39f986169a517642/cytoolz-1.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88662c0e07250d26f5af9bc95911e6137e124a5c1ec2ce4a5d74de96718ab242", size = 2062903 }, - { url = "https://files.pythonhosted.org/packages/85/39/b3cbb5a9847ba59584a263772ad4f8ca2dbfd2a0e11efd09211d1219804c/cytoolz-1.0.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:309dffa78b0961b4c0cf55674b828fbbc793cf2d816277a5c8293c0c16155296", size = 2139517 }, - { url = "https://files.pythonhosted.org/packages/ea/39/bfcab4a46d50c467e36fe704f19d8904efead417787806ee210327f68390/cytoolz-1.0.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:edb34246e6eb40343c5860fc51b24937698e4fa1ee415917a73ad772a9a1746b", size = 2154849 }, - { url = "https://files.pythonhosted.org/packages/fd/42/3bc6ee61b0aa47e1cb40819adc1a456d7efa809f0dea9faddacb43fdde8f/cytoolz-1.0.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a54da7a8e4348a18d45d4d5bc84af6c716d7f131113a4f1cc45569d37edff1b", size = 2102302 }, - { url = "https://files.pythonhosted.org/packages/00/66/3f636c6ddea7b18026b90a8c238af472e423b86e427b11df02213689b012/cytoolz-1.0.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:241c679c3b1913c0f7259cf1d9639bed5084c86d0051641d537a0980548aa266", size = 1960872 }, - { url = "https://files.pythonhosted.org/packages/40/36/cb3b7cdd651007b69f9c48e9d104cec7cb8dc53afa1d6a720e5ad08022fa/cytoolz-1.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5bfc860251a8f280ac79696fc3343cfc3a7c30b94199e0240b6c9e5b6b01a2a5", size = 2014430 }, - { url = "https://files.pythonhosted.org/packages/88/3f/2e9bd2a16cfd269808922147551dcb2d8b68ba54a2c4deca2fa6a6cd0d5f/cytoolz-1.0.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:c8edd1547014050c1bdad3ff85d25c82bd1c2a3c96830c6181521eb78b9a42b3", size = 2003127 }, - { url = "https://files.pythonhosted.org/packages/c4/7d/08604ff940aa784df8343c387fdf2489b948b714a6afb587775ae94da912/cytoolz-1.0.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:b349bf6162e8de215403d7f35f8a9b4b1853dc2a48e6e1a609a5b1a16868b296", size = 2142369 }, - { url = "https://files.pythonhosted.org/packages/d2/c6/39919a0645bdbdf720e97cae107f959ea9d1267fbc3b0d94fc6e1d12ac8f/cytoolz-1.0.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:1b18b35256219b6c3dd0fa037741b85d0bea39c552eab0775816e85a52834140", size = 2180427 }, - { url = "https://files.pythonhosted.org/packages/d8/03/dbb9d47556ee54337e7e0ac209d17ceff2d2a197c34de08005abc7a7449b/cytoolz-1.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:738b2350f340ff8af883eb301054eb724997f795d20d90daec7911c389d61581", size = 2069785 }, - { url = "https://files.pythonhosted.org/packages/ea/f8/11bb7b8947002231faae3ec2342df5896afbc19eb783a332cce6d219ff79/cytoolz-1.0.1-cp313-cp313-win32.whl", hash = "sha256:9cbd9c103df54fcca42be55ef40e7baea624ac30ee0b8bf1149f21146d1078d9", size = 320685 }, - { url = "https://files.pythonhosted.org/packages/40/eb/dde173cf2357084ca9423950be1f2f11ab11d65d8bd30165bfb8fd4213e9/cytoolz-1.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:90e577e08d3a4308186d9e1ec06876d4756b1e8164b92971c69739ea17e15297", size = 362898 }, - { url = "https://files.pythonhosted.org/packages/79/bc/16442ead0b86f64c75602d47c158ef22d5c82a004fcff3b3954b9102d255/cytoolz-1.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:980c323e626ba298b77ae62871b2de7c50b9d7219e2ddf706f52dd34b8be7349", size = 405818 }, - { url = "https://files.pythonhosted.org/packages/77/33/e660a734fcda5f83336cab7ce20d6011dfdc67f6e0e6d833badedf2a3b21/cytoolz-1.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:45f6fa1b512bc2a0f2de5123db932df06c7f69d12874fe06d67772b2828e2c8b", size = 386289 }, - { url = "https://files.pythonhosted.org/packages/fa/06/d776935b9f5753ee84630857b95e6f77656266e3ad456c97ae78829fc983/cytoolz-1.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f93f42d9100c415155ad1f71b0de362541afd4ac95e3153467c4c79972521b6b", size = 1946297 }, - { url = "https://files.pythonhosted.org/packages/bc/4e/d0babe9f3b81b248c92be2c6eb1b3d8bf4f663817a518910348a5fac1f12/cytoolz-1.0.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a76d20dec9c090cdf4746255bbf06a762e8cc29b5c9c1d138c380bbdb3122ade", size = 2028082 }, - { url = "https://files.pythonhosted.org/packages/70/79/280c26569953e61e490f8ebc0928f8dc5ec8e455144e425887aece6278e5/cytoolz-1.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:239039585487c69aa50c5b78f6a422016297e9dea39755761202fb9f0530fe87", size = 2012925 }, - { url = "https://files.pythonhosted.org/packages/9a/b1/8efbd06ba3dcfe0c5e44e68d098781e73535abcc7a49dd6ea88d5be4c98f/cytoolz-1.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c28307640ca2ab57b9fbf0a834b9bf563958cd9e038378c3a559f45f13c3c541", size = 1969409 }, - { url = "https://files.pythonhosted.org/packages/6c/ee/8064953c28a6eccb97267285da816b691f524e2d2265b559d95dbe741340/cytoolz-1.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:454880477bb901cee3a60f6324ec48c95d45acc7fecbaa9d49a5af737ded0595", size = 1873884 }, - { url = "https://files.pythonhosted.org/packages/05/81/761acff24d29dd2abf867ae2b2ec4c3bed5863492c997d9936d29117e52b/cytoolz-1.0.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:902115d1b1f360fd81e44def30ac309b8641661150fcbdde18ead446982ada6a", size = 1861041 }, - { url = "https://files.pythonhosted.org/packages/08/73/48fc7de900664bdc1a59fb1da9bfa22afc5178bb2590fe5a4c6ddaec8f95/cytoolz-1.0.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:e68e6b38473a3a79cee431baa22be31cac39f7df1bf23eaa737eaff42e213883", size = 1864089 }, - { url = "https://files.pythonhosted.org/packages/a2/8e/f53bf881bfd226f1ea75446360c9feeb97045bdfa0b75338c0919a93a83f/cytoolz-1.0.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:32fba3f63fcb76095b0a22f4bdcc22bc62a2bd2d28d58bf02fd21754c155a3ec", size = 2002961 }, - { url = "https://files.pythonhosted.org/packages/fa/fd/3583907d14c0828bed0758111a44dce38dea87186f19b96ba8bea58fce9f/cytoolz-1.0.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:0724ba4cf41eb40b6cf75250820ab069e44bdf4183ff78857aaf4f0061551075", size = 2008125 }, - { url = "https://files.pythonhosted.org/packages/f3/18/e27368ac982e813dae1ed737d52e9b896f2499c2150586f46b111119db99/cytoolz-1.0.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c42420e0686f887040d5230420ed44f0e960ccbfa29a0d65a3acd9ca52459209", size = 1908772 }, - { url = "https://files.pythonhosted.org/packages/2e/c5/6626c4df2a710cd772fb349d48de5435b8907c24838c8a605f286e794dd6/cytoolz-1.0.1-cp39-cp39-win32.whl", hash = "sha256:4ba8b16358ea56b1fe8e637ec421e36580866f2e787910bac1cf0a6997424a34", size = 324277 }, - { url = "https://files.pythonhosted.org/packages/8e/4f/34a4cfe7344d33624780fe299f3c441a94d56bf4313033d24f9d45adc6f6/cytoolz-1.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:92d27f84bf44586853d9562bfa3610ecec000149d030f793b4cb614fd9da1813", size = 365849 }, - { url = "https://files.pythonhosted.org/packages/d9/f7/ef2a10daaec5c0f7d781d50758c6187eee484256e356ae8ef178d6c48497/cytoolz-1.0.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:83d19d55738ad9c60763b94f3f6d3c6e4de979aeb8d76841c1401081e0e58d96", size = 345702 }, - { url = "https://files.pythonhosted.org/packages/c8/14/53c84adddedb67ff1546abb86fea04d26e24298c3ceab8436d20122ed0b9/cytoolz-1.0.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f112a71fad6ea824578e6393765ce5c054603afe1471a5c753ff6c67fd872d10", size = 385695 }, - { url = "https://files.pythonhosted.org/packages/bd/80/3ae356c5e7b8d7dc7d1adb52f6932fee85cd748ed4e1217c269d2dfd610f/cytoolz-1.0.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5a515df8f8aa6e1eaaf397761a6e4aff2eef73b5f920aedf271416d5471ae5ee", size = 406261 }, - { url = "https://files.pythonhosted.org/packages/0c/31/8e43761ffc82d90bf9cab7e0959712eedcd1e33c211397e143dd42d7af57/cytoolz-1.0.1-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:92c398e7b7023460bea2edffe5fcd0a76029580f06c3f6938ac3d198b47156f3", size = 397207 }, - { url = "https://files.pythonhosted.org/packages/d1/b9/fe9da37090b6444c65f848a83e390f87d8cb43d6a4df46de1556ad7e5ceb/cytoolz-1.0.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:3237e56211e03b13df47435b2369f5df281e02b04ad80a948ebd199b7bc10a47", size = 343358 }, - { url = "https://files.pythonhosted.org/packages/99/cf/fcea9849eeedc569d0d00bcab8d0ad07d0d0aa79664e6ff9e8745ccfd9a3/cytoolz-1.0.1-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:a5ca923d1fa632f7a4fb33c0766c6fba7f87141a055c305c3e47e256fb99c413", size = 344869 }, - { url = "https://files.pythonhosted.org/packages/9c/38/106e0bd8610ebe1a8717c686e0663227a61cc03ed869b1610e1d8455f746/cytoolz-1.0.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:058bf996bcae9aad3acaeeb937d42e0c77c081081e67e24e9578a6a353cb7fb2", size = 384769 }, - { url = "https://files.pythonhosted.org/packages/1c/a9/ac8a43c3adb93e9ccc42aa01c3fc86a0142f8265e3b869794e6fc471b976/cytoolz-1.0.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:69e2a1f41a3dad94a17aef4a5cc003323359b9f0a9d63d4cc867cb5690a2551d", size = 404914 }, - { url = "https://files.pythonhosted.org/packages/e5/ae/516ffeba7d0b6fe75f99a2a9ab74a5344c4b5b236cd1719bd5e4721f9bbc/cytoolz-1.0.1-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67daeeeadb012ec2b59d63cb29c4f2a2023b0c4957c3342d354b8bb44b209e9a", size = 396288 }, - { url = "https://files.pythonhosted.org/packages/b4/90/93e056d7554601619cf1f171c00f83b8a8f75beed680f35b413433f251c5/cytoolz-1.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:54d3d36bbf0d4344d1afa22c58725d1668e30ff9de3a8f56b03db1a6da0acb11", size = 342845 }, -] - [[package]] name = "debugpy" version = "1.8.12" @@ -670,11 +570,11 @@ wheels = [ [[package]] name = "decorator" -version = "5.2.0" +version = "5.2.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6e/e2/33c72e8409b39389b9a69e807e40d3466a63996ba4c65caaea1d31dfde16/decorator-5.2.0.tar.gz", hash = "sha256:1cf2ab68f8c1c7eae3895d82ab0daab41294cfbe6fbdebf50b44307299980762", size = 16973 } +sdist = { url = "https://files.pythonhosted.org/packages/43/fa/6d96a0978d19e17b68d634497769987b16c8f4cd0a7a05048bec693caa6b/decorator-5.2.1.tar.gz", hash = "sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360", size = 56711 } wheels = [ - { url = "https://files.pythonhosted.org/packages/f6/0e/fc5d7660912606d43f32470cf952846a47512d3674fe9a3196f1a80a638b/decorator-5.2.0-py3-none-any.whl", hash = "sha256:f30a69c066f698c7c11fa1fa3425f684d3b4b01b494ee41e73c0a14f3de48427", size = 9149 }, + { url = "https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a", size = 9190 }, ] [[package]] @@ -789,7 +689,7 @@ dependencies = [ { name = "pygments" }, { name = "sphinx", version = "7.4.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, - { name = "sphinx", version = "8.2.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "sphinx-basic-ng" }, ] sdist = { url = "https://files.pythonhosted.org/packages/a0/e2/d351d69a9a9e4badb4a5be062c2d0e87bd9e6c23b5e57337fef14bef34c8/furo-2024.8.6.tar.gz", hash = "sha256:b63e4cee8abfc3136d3bc03a3d45a76a850bada4d6374d24c1716b0e01394a01", size = 1661506 } @@ -866,7 +766,8 @@ dependencies = [ { name = "comm" }, { name = "debugpy" }, { name = "ipython", version = "8.18.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "ipython", version = "8.32.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "ipython", version = "8.33.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, + { name = "ipython", version = "9.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "jupyter-client" }, { name = "jupyter-core" }, { name = "matplotlib-inline" }, @@ -909,29 +810,65 @@ wheels = [ [[package]] name = "ipython" -version = "8.32.0" +version = "8.33.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.12'", - "python_full_version == '3.11.*'", "python_full_version == '3.10.*'", ] dependencies = [ - { name = "colorama", marker = "python_full_version >= '3.10' and sys_platform == 'win32'" }, - { name = "decorator", marker = "python_full_version >= '3.10'" }, + { name = "colorama", marker = "python_full_version == '3.10.*' and sys_platform == 'win32'" }, + { name = "decorator", marker = "python_full_version == '3.10.*'" }, { name = "exceptiongroup", marker = "python_full_version == '3.10.*'" }, - { name = "jedi", marker = "python_full_version >= '3.10'" }, - { name = "matplotlib-inline", marker = "python_full_version >= '3.10'" }, - { name = "pexpect", marker = "python_full_version >= '3.10' and sys_platform != 'emscripten' and sys_platform != 'win32'" }, - { name = "prompt-toolkit", marker = "python_full_version >= '3.10'" }, - { name = "pygments", marker = "python_full_version >= '3.10'" }, - { name = "stack-data", marker = "python_full_version >= '3.10'" }, - { name = "traitlets", marker = "python_full_version >= '3.10'" }, - { name = "typing-extensions", marker = "python_full_version >= '3.10' and python_full_version < '3.12'" }, + { name = "jedi", marker = "python_full_version == '3.10.*'" }, + { name = "matplotlib-inline", marker = "python_full_version == '3.10.*'" }, + { name = "pexpect", marker = "python_full_version == '3.10.*' and sys_platform != 'emscripten' and sys_platform != 'win32'" }, + { name = "prompt-toolkit", marker = "python_full_version == '3.10.*'" }, + { name = "pygments", marker = "python_full_version == '3.10.*'" }, + { name = "stack-data", marker = "python_full_version == '3.10.*'" }, + { name = "traitlets", marker = "python_full_version == '3.10.*'" }, + { name = "typing-extensions", marker = "python_full_version == '3.10.*'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/99/5d/27844489a849a9ceb94ea59c1adac9323fb77175a3076742ed76dcc87f07/ipython-8.33.0.tar.gz", hash = "sha256:4c3e36a6dfa9e8e3702bd46f3df668624c975a22ff340e96ea7277afbd76217d", size = 5508284 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/13/e7/7b144d0c3a16f56b213b2d9f9bee22e50f6e54265a551db9f43f09e2c084/ipython-8.33.0-py3-none-any.whl", hash = "sha256:aa5b301dfe1eaf0167ff3238a6825f810a029c9dad9d3f1597f30bd5ff65cc44", size = 826720 }, +] + +[[package]] +name = "ipython" +version = "9.0.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.12'", + "python_full_version == '3.11.*'", +] +dependencies = [ + { name = "colorama", marker = "python_full_version >= '3.11' and sys_platform == 'win32'" }, + { name = "decorator", marker = "python_full_version >= '3.11'" }, + { name = "ipython-pygments-lexers", marker = "python_full_version >= '3.11'" }, + { name = "jedi", marker = "python_full_version >= '3.11'" }, + { name = "matplotlib-inline", marker = "python_full_version >= '3.11'" }, + { name = "pexpect", marker = "python_full_version >= '3.11' and sys_platform != 'emscripten' and sys_platform != 'win32'" }, + { name = "prompt-toolkit", marker = "python_full_version >= '3.11'" }, + { name = "pygments", marker = "python_full_version >= '3.11'" }, + { name = "stack-data", marker = "python_full_version >= '3.11'" }, + { name = "traitlets", marker = "python_full_version >= '3.11'" }, + { name = "typing-extensions", marker = "python_full_version == '3.11.*'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9d/33/1901c9a842b301d8674f367dee597e654e402548a903faf7280aae8fc2d4/ipython-9.0.1.tar.gz", hash = "sha256:377ea91c8226b48dc9021ac9846a64761abc7ddf74c5efe38e6eb06f6e052f3a", size = 4365847 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/28/39/fda74f8215ef94a812dd780073c61a826a88a01e51f627a3454f7ae6951d/ipython-9.0.1-py3-none-any.whl", hash = "sha256:3e878273824b52e0a2280ed84f8193aba8c4ba9a6f45a438348a3d5ef1a34bd0", size = 600186 }, +] + +[[package]] +name = "ipython-pygments-lexers" +version = "1.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pygments", marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/36/80/4d2a072e0db7d250f134bc11676517299264ebe16d62a8619d49a78ced73/ipython-8.32.0.tar.gz", hash = "sha256:be2c91895b0b9ea7ba49d33b23e2040c352b33eb6a519cca7ce6e0c743444251", size = 5507441 } +sdist = { url = "https://files.pythonhosted.org/packages/ef/4c/5dd1d8af08107f88c7f741ead7a40854b8ac24ddf9ae850afbcf698aa552/ipython_pygments_lexers-1.1.1.tar.gz", hash = "sha256:09c0138009e56b6854f9535736f4171d855c8c08a563a0dcd8022f78355c7e81", size = 8393 } wheels = [ - { url = "https://files.pythonhosted.org/packages/e7/e1/f4474a7ecdb7745a820f6f6039dc43c66add40f1bcc66485607d93571af6/ipython-8.32.0-py3-none-any.whl", hash = "sha256:cae85b0c61eff1fc48b0a8002de5958b6528fa9c8defb1894da63f42613708aa", size = 825524 }, + { url = "https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl", hash = "sha256:a9462224a505ade19a605f71f8fa63c2048833ce50abc86768a0d81d876dc81c", size = 8074 }, ] [[package]] @@ -1025,26 +962,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl", hash = "sha256:841a89020971da1d8693f1a99997aefc5dc424bb1b251fd6322462a1b8842780", size = 15884 }, ] -[[package]] -name = "kahypar" -version = "1.3.5" -source = { registry = "https://pypi.org/simple" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b3/5b/cdb9eba201f8bd6a0d855a64b7244a58de63e16906a2ddc08725f95e8363/kahypar-1.3.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9ee3520d83c7e808134041e13218f0507882203063e18cc72d8d82531561bc56", size = 797929 }, - { url = "https://files.pythonhosted.org/packages/d2/92/14b7e97fee1521dfa9cc4c99b8ebedae516095b369802f87bcbc054ca21b/kahypar-1.3.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2218296b4197e1ee9b7be386e6d681cf6bf8f0b2d4d36971bb7c8c5561108b46", size = 1148768 }, - { url = "https://files.pythonhosted.org/packages/cc/8e/f83ebd65c4711df31c49c710443d4d5770c7b6f4fd752488e7d683b59187/kahypar-1.3.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:da02aca5d72c91cf270af15c7990922170c400996cfab77d13a1003cf0638de8", size = 798699 }, - { url = "https://files.pythonhosted.org/packages/df/c6/76860040bba58ba22aa919114db154a65092cc18a6ac10e0d6af9c3423b3/kahypar-1.3.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2afc0c30462d63be436d3c4275dcd8a12224b6e121411fe4eecb5306c1160185", size = 1149405 }, - { url = "https://files.pythonhosted.org/packages/4d/2b/7fbc6ab0676aa396e4145ce2a4e51f0df48c5b9388b34910f087d2be526a/kahypar-1.3.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:544e2ef9151d31754e03d3ee1e4219b9abd8415b06144c47ddd4f4ffd529640d", size = 804135 }, - { url = "https://files.pythonhosted.org/packages/04/d2/73161dd4b7ce84847649643fbdc83ed4e04267c09e62b171a5d29ee5eb2a/kahypar-1.3.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:075fb85c8964627e56900cc8dd121d2ba060d5496748484ef6d869df09ccfe0a", size = 1150204 }, - { url = "https://files.pythonhosted.org/packages/b8/20/f709a34862c8c5edd847ccab9b4a210f4c60d7af7106463708d1a542cf57/kahypar-1.3.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:565a0f11bbd566296875f9259448e97e7cf95e3b9a06ffb0d95ee0914b1f2e54", size = 804126 }, - { url = "https://files.pythonhosted.org/packages/4e/0e/82b8f96e8b04d1898b661ed22d6d91cb75ce032f2befbcd419d658e07506/kahypar-1.3.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8744fa4b7aed6792f833d015af7da84031cc366d6675cb90a7398bb01dcc9a1b", size = 1150280 }, - { url = "https://files.pythonhosted.org/packages/a8/c3/186e9ac5ae0b0ceb3f5fa1383c5d9fe59d786f14b22c901893078aef2f59/kahypar-1.3.5-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:597adfb11d0e776374086ad762bc799aaea2e4e393b4bc5dc9e3eb0010636c6c", size = 1152855 }, - { url = "https://files.pythonhosted.org/packages/26/1f/54987a477c4e3971a5c923ddb5ce59a2421bbcd9850f3de9ccbd379d7152/kahypar-1.3.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:90c1719ca7b5599bb6f2dc933806f9cc3eb05a5ec61d8c47b39a41a235ac1799", size = 798028 }, - { url = "https://files.pythonhosted.org/packages/7c/00/ad0e165353142f6280fb7deb9de64bc6d7c323095be4ce25f90623c33647/kahypar-1.3.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aea9d7633c1a5e94a62d5c9f6df1567164eff053fde8dc25432008dec222ae4c", size = 1149529 }, - { url = "https://files.pythonhosted.org/packages/da/74/9519ef25c6d41d79e283ae879e9a6f5a3a4bd05d6d45653c5bd4528de0a6/kahypar-1.3.5-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b738632ad7b4257469213738280d70c453f708e54e6a058358e53a594cebf72", size = 1149495 }, - { url = "https://files.pythonhosted.org/packages/f6/0f/ed8453463010513ffde64cfef508a19ff5ca5c5f7cc3b06d2e2683771557/kahypar-1.3.5-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a361871d8427cb2512eab647ff40066ea2f848920af5d4408bda8aaf3edab7a", size = 1148393 }, -] - [[package]] name = "kiwisolver" version = "1.4.7" @@ -1249,19 +1166,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b0/bf/ea8887e9f31a8f93ca306699d11909c6140151393a4216f0d9f85a004077/latexcodec-3.0.0-py3-none-any.whl", hash = "sha256:6f3477ad5e61a0a99bd31a6a370c34e88733a6bad9c921a3ffcfacada12f41a7", size = 18150 }, ] -[[package]] -name = "llvmlite" -version = "0.36.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/19/66/6b2c49c7c68da48d17059882fdb9ad9ac9e5ac3f22b00874d7996e3c44a8/llvmlite-0.36.0.tar.gz", hash = "sha256:765128fdf5f149ed0b889ffbe2b05eb1717f8e20a5c87fa2b4018fbcce0fcfc9", size = 126219 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/90/a9/ec0175e6c2d519fc450086ac60ffb1bdfad4a66e2bcc68f8275ec4bd89d4/llvmlite-0.36.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6a3abc8a8889aeb06bf9c4a7e5df5bc7bb1aa0aedd91a599813809abeec80b5a", size = 18513222 }, - { url = "https://files.pythonhosted.org/packages/c2/8b/b9a9e00ff28f8428687f287135853babbf6b8af3d695f8888e58a0312422/llvmlite-0.36.0-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:705f0323d931684428bb3451549603299bb5e17dd60fb979d67c3807de0debc1", size = 27443194 }, - { url = "https://files.pythonhosted.org/packages/21/e4/bd58362e7613bce9a570278352832289b2a9f1da48e8c22e1a2f883a2167/llvmlite-0.36.0-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:5a6548b4899facb182145147185e9166c69826fb424895f227e6b7cf924a8da1", size = 25268821 }, - { url = "https://files.pythonhosted.org/packages/8b/f5/73b92c97c5c1806103598ad121a41d53a9e975f719ae7d58298fcf7e25f7/llvmlite-0.36.0-cp39-cp39-win32.whl", hash = "sha256:ff52fb9c2be66b95b0e67d56fce11038397e5be1ea410ee53f5f1175fdbb107a", size = 12986003 }, - { url = "https://files.pythonhosted.org/packages/b7/ab/cf1bc85ae2aa7ce35c3bdeb34084b805ac5d2c9e49c1ac4a6eff20bb91dc/llvmlite-0.36.0-cp39-cp39-win_amd64.whl", hash = "sha256:1dee416ea49fd338c74ec15c0c013e5273b0961528169af06ff90772614f7f6c", size = 15985217 }, -] - [[package]] name = "markupsafe" version = "3.0.2" @@ -1395,7 +1299,7 @@ wheels = [ [[package]] name = "matplotlib" -version = "3.10.0" +version = "3.10.1" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.12'", @@ -1413,41 +1317,41 @@ dependencies = [ { name = "pyparsing", marker = "python_full_version >= '3.10'" }, { name = "python-dateutil", marker = "python_full_version >= '3.10'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/68/dd/fa2e1a45fce2d09f4aea3cee169760e672c8262325aa5796c49d543dc7e6/matplotlib-3.10.0.tar.gz", hash = "sha256:b886d02a581b96704c9d1ffe55709e49b4d2d52709ccebc4be42db856e511278", size = 36686418 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/09/ec/3cdff7b5239adaaacefcc4f77c316dfbbdf853c4ed2beec467e0fec31b9f/matplotlib-3.10.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2c5829a5a1dd5a71f0e31e6e8bb449bc0ee9dbfb05ad28fc0c6b55101b3a4be6", size = 8160551 }, - { url = "https://files.pythonhosted.org/packages/41/f2/b518f2c7f29895c9b167bf79f8529c63383ae94eaf49a247a4528e9a148d/matplotlib-3.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a2a43cbefe22d653ab34bb55d42384ed30f611bcbdea1f8d7f431011a2e1c62e", size = 8034853 }, - { url = "https://files.pythonhosted.org/packages/ed/8d/45754b4affdb8f0d1a44e4e2bcd932cdf35b256b60d5eda9f455bb293ed0/matplotlib-3.10.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:607b16c8a73943df110f99ee2e940b8a1cbf9714b65307c040d422558397dac5", size = 8446724 }, - { url = "https://files.pythonhosted.org/packages/09/5a/a113495110ae3e3395c72d82d7bc4802902e46dc797f6b041e572f195c56/matplotlib-3.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01d2b19f13aeec2e759414d3bfe19ddfb16b13a1250add08d46d5ff6f9be83c6", size = 8583905 }, - { url = "https://files.pythonhosted.org/packages/12/b1/8b1655b4c9ed4600c817c419f7eaaf70082630efd7556a5b2e77a8a3cdaf/matplotlib-3.10.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5e6c6461e1fc63df30bf6f80f0b93f5b6784299f721bc28530477acd51bfc3d1", size = 9395223 }, - { url = "https://files.pythonhosted.org/packages/5a/85/b9a54d64585a6b8737a78a61897450403c30f39e0bd3214270bb0b96f002/matplotlib-3.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:994c07b9d9fe8d25951e3202a68c17900679274dadfc1248738dcfa1bd40d7f3", size = 8025355 }, - { url = "https://files.pythonhosted.org/packages/0c/f1/e37f6c84d252867d7ddc418fff70fc661cfd363179263b08e52e8b748e30/matplotlib-3.10.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:fd44fc75522f58612ec4a33958a7e5552562b7705b42ef1b4f8c0818e304a363", size = 8171677 }, - { url = "https://files.pythonhosted.org/packages/c7/8b/92e9da1f28310a1f6572b5c55097b0c0ceb5e27486d85fb73b54f5a9b939/matplotlib-3.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c58a9622d5dbeb668f407f35f4e6bfac34bb9ecdcc81680c04d0258169747997", size = 8044945 }, - { url = "https://files.pythonhosted.org/packages/c5/cb/49e83f0fd066937a5bd3bc5c5d63093703f3637b2824df8d856e0558beef/matplotlib-3.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:845d96568ec873be63f25fa80e9e7fae4be854a66a7e2f0c8ccc99e94a8bd4ef", size = 8458269 }, - { url = "https://files.pythonhosted.org/packages/b2/7d/2d873209536b9ee17340754118a2a17988bc18981b5b56e6715ee07373ac/matplotlib-3.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5439f4c5a3e2e8eab18e2f8c3ef929772fd5641876db71f08127eed95ab64683", size = 8599369 }, - { url = "https://files.pythonhosted.org/packages/b8/03/57d6cbbe85c61fe4cbb7c94b54dce443d68c21961830833a1f34d056e5ea/matplotlib-3.10.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4673ff67a36152c48ddeaf1135e74ce0d4bce1bbf836ae40ed39c29edf7e2765", size = 9405992 }, - { url = "https://files.pythonhosted.org/packages/14/cf/e382598f98be11bf51dd0bc60eca44a517f6793e3dc8b9d53634a144620c/matplotlib-3.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:7e8632baebb058555ac0cde75db885c61f1212e47723d63921879806b40bec6a", size = 8034580 }, - { url = "https://files.pythonhosted.org/packages/44/c7/6b2d8cb7cc251d53c976799cacd3200add56351c175ba89ab9cbd7c1e68a/matplotlib-3.10.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4659665bc7c9b58f8c00317c3c2a299f7f258eeae5a5d56b4c64226fca2f7c59", size = 8172465 }, - { url = "https://files.pythonhosted.org/packages/42/2a/6d66d0fba41e13e9ca6512a0a51170f43e7e7ed3a8dfa036324100775612/matplotlib-3.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d44cb942af1693cced2604c33a9abcef6205601c445f6d0dc531d813af8a2f5a", size = 8043300 }, - { url = "https://files.pythonhosted.org/packages/90/60/2a60342b27b90a16bada939a85e29589902b41073f59668b904b15ea666c/matplotlib-3.10.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a994f29e968ca002b50982b27168addfd65f0105610b6be7fa515ca4b5307c95", size = 8448936 }, - { url = "https://files.pythonhosted.org/packages/a7/b2/d872fc3d753516870d520595ddd8ce4dd44fa797a240999f125f58521ad7/matplotlib-3.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b0558bae37f154fffda54d779a592bc97ca8b4701f1c710055b609a3bac44c8", size = 8594151 }, - { url = "https://files.pythonhosted.org/packages/f4/bd/b2f60cf7f57d014ab33e4f74602a2b5bdc657976db8196bbc022185f6f9c/matplotlib-3.10.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:503feb23bd8c8acc75541548a1d709c059b7184cde26314896e10a9f14df5f12", size = 9400347 }, - { url = "https://files.pythonhosted.org/packages/9f/6e/264673e64001b99d747aff5a288eca82826c024437a3694e19aed1decf46/matplotlib-3.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:c40ba2eb08b3f5de88152c2333c58cee7edcead0a2a0d60fcafa116b17117adc", size = 8039144 }, - { url = "https://files.pythonhosted.org/packages/72/11/1b2a094d95dcb6e6edd4a0b238177c439006c6b7a9fe8d31801237bf512f/matplotlib-3.10.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:96f2886f5c1e466f21cc41b70c5a0cd47bfa0015eb2d5793c88ebce658600e25", size = 8173073 }, - { url = "https://files.pythonhosted.org/packages/0d/c4/87b6ad2723070511a411ea719f9c70fde64605423b184face4e94986de9d/matplotlib-3.10.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:12eaf48463b472c3c0f8dbacdbf906e573013df81a0ab82f0616ea4b11281908", size = 8043892 }, - { url = "https://files.pythonhosted.org/packages/57/69/cb0812a136550b21361335e9ffb7d459bf6d13e03cb7b015555d5143d2d6/matplotlib-3.10.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2fbbabc82fde51391c4da5006f965e36d86d95f6ee83fb594b279564a4c5d0d2", size = 8450532 }, - { url = "https://files.pythonhosted.org/packages/ea/3a/bab9deb4fb199c05e9100f94d7f1c702f78d3241e6a71b784d2b88d7bebd/matplotlib-3.10.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad2e15300530c1a94c63cfa546e3b7864bd18ea2901317bae8bbf06a5ade6dcf", size = 8593905 }, - { url = "https://files.pythonhosted.org/packages/8b/66/742fd242f989adc1847ddf5f445815f73ad7c46aa3440690cc889cfa423c/matplotlib-3.10.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:3547d153d70233a8496859097ef0312212e2689cdf8d7ed764441c77604095ae", size = 9399609 }, - { url = "https://files.pythonhosted.org/packages/fa/d6/54cee7142cef7d910a324a7aedf335c0c147b03658b54d49ec48166f10a6/matplotlib-3.10.0-cp313-cp313-win_amd64.whl", hash = "sha256:c55b20591ced744aa04e8c3e4b7543ea4d650b6c3c4b208c08a05b4010e8b442", size = 8039076 }, - { url = "https://files.pythonhosted.org/packages/43/14/815d072dc36e88753433bfd0385113405efb947e6895ff7b4d2e8614a33b/matplotlib-3.10.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:9ade1003376731a971e398cc4ef38bb83ee8caf0aee46ac6daa4b0506db1fd06", size = 8211000 }, - { url = "https://files.pythonhosted.org/packages/9a/76/34e75f364194ec352678adcb540964be6f35ec7d3d8c75ebcb17e6839359/matplotlib-3.10.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:95b710fea129c76d30be72c3b38f330269363fbc6e570a5dd43580487380b5ff", size = 8087707 }, - { url = "https://files.pythonhosted.org/packages/c3/2b/b6bc0dff6a72d333bc7df94a66e6ce662d224e43daa8ad8ae4eaa9a77f55/matplotlib-3.10.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cdbaf909887373c3e094b0318d7ff230b2ad9dcb64da7ade654182872ab2593", size = 8477384 }, - { url = "https://files.pythonhosted.org/packages/c2/2d/b5949fb2b76e9b47ab05e25a5f5f887c70de20d8b0cbc704a4e2ee71c786/matplotlib-3.10.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d907fddb39f923d011875452ff1eca29a9e7f21722b873e90db32e5d8ddff12e", size = 8610334 }, - { url = "https://files.pythonhosted.org/packages/d6/9a/6e3c799d5134d9af44b01c787e1360bee38cf51850506ea2e743a787700b/matplotlib-3.10.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:3b427392354d10975c1d0f4ee18aa5844640b512d5311ef32efd4dd7db106ede", size = 9406777 }, - { url = "https://files.pythonhosted.org/packages/0e/dd/e6ae97151e5ed648ab2ea48885bc33d39202b640eec7a2910e2c843f7ac0/matplotlib-3.10.0-cp313-cp313t-win_amd64.whl", hash = "sha256:5fd41b0ec7ee45cd960a8e71aea7c946a28a0b8a4dcee47d2856b2af051f334c", size = 8109742 }, - { url = "https://files.pythonhosted.org/packages/32/5f/29def7ce4e815ab939b56280976ee35afffb3bbdb43f332caee74cb8c951/matplotlib-3.10.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:81713dd0d103b379de4516b861d964b1d789a144103277769238c732229d7f03", size = 8155500 }, - { url = "https://files.pythonhosted.org/packages/de/6d/d570383c9f7ca799d0a54161446f9ce7b17d6c50f2994b653514bcaa108f/matplotlib-3.10.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:359f87baedb1f836ce307f0e850d12bb5f1936f70d035561f90d41d305fdacea", size = 8032398 }, - { url = "https://files.pythonhosted.org/packages/c9/b4/680aa700d99b48e8c4393fa08e9ab8c49c0555ee6f4c9c0a5e8ea8dfde5d/matplotlib-3.10.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ae80dc3a4add4665cf2faa90138384a7ffe2a4e37c58d83e115b54287c4f06ef", size = 8587361 }, +sdist = { url = "https://files.pythonhosted.org/packages/2f/08/b89867ecea2e305f408fbb417139a8dd941ecf7b23a2e02157c36da546f0/matplotlib-3.10.1.tar.gz", hash = "sha256:e8d2d0e3881b129268585bf4765ad3ee73a4591d77b9a18c214ac7e3a79fb2ba", size = 36743335 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ee/b1/f70e27cf1cd76ce2a5e1aa5579d05afe3236052c6d9b9a96325bc823a17e/matplotlib-3.10.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:ff2ae14910be903f4a24afdbb6d7d3a6c44da210fc7d42790b87aeac92238a16", size = 8163654 }, + { url = "https://files.pythonhosted.org/packages/26/af/5ec3d4636106718bb62503a03297125d4514f98fe818461bd9e6b9d116e4/matplotlib-3.10.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0721a3fd3d5756ed593220a8b86808a36c5031fce489adb5b31ee6dbb47dd5b2", size = 8037943 }, + { url = "https://files.pythonhosted.org/packages/a1/3d/07f9003a71b698b848c9925d05979ffa94a75cd25d1a587202f0bb58aa81/matplotlib-3.10.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0673b4b8f131890eb3a1ad058d6e065fb3c6e71f160089b65f8515373394698", size = 8449510 }, + { url = "https://files.pythonhosted.org/packages/12/87/9472d4513ff83b7cd864311821793ab72234fa201ab77310ec1b585d27e2/matplotlib-3.10.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e875b95ac59a7908978fe307ecdbdd9a26af7fa0f33f474a27fcf8c99f64a19", size = 8586585 }, + { url = "https://files.pythonhosted.org/packages/31/9e/fe74d237d2963adae8608faeb21f778cf246dbbf4746cef87cffbc82c4b6/matplotlib-3.10.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:2589659ea30726284c6c91037216f64a506a9822f8e50592d48ac16a2f29e044", size = 9397911 }, + { url = "https://files.pythonhosted.org/packages/b6/1b/025d3e59e8a4281ab463162ad7d072575354a1916aba81b6a11507dfc524/matplotlib-3.10.1-cp310-cp310-win_amd64.whl", hash = "sha256:a97ff127f295817bc34517255c9db6e71de8eddaab7f837b7d341dee9f2f587f", size = 8052998 }, + { url = "https://files.pythonhosted.org/packages/a5/14/a1b840075be247bb1834b22c1e1d558740b0f618fe3a823740181ca557a1/matplotlib-3.10.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:057206ff2d6ab82ff3e94ebd94463d084760ca682ed5f150817b859372ec4401", size = 8174669 }, + { url = "https://files.pythonhosted.org/packages/0a/e4/300b08e3e08f9c98b0d5635f42edabf2f7a1d634e64cb0318a71a44ff720/matplotlib-3.10.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a144867dd6bf8ba8cb5fc81a158b645037e11b3e5cf8a50bd5f9917cb863adfe", size = 8047996 }, + { url = "https://files.pythonhosted.org/packages/75/f9/8d99ff5a2498a5f1ccf919fb46fb945109623c6108216f10f96428f388bc/matplotlib-3.10.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56c5d9fcd9879aa8040f196a235e2dcbdf7dd03ab5b07c0696f80bc6cf04bedd", size = 8461612 }, + { url = "https://files.pythonhosted.org/packages/40/b8/53fa08a5eaf78d3a7213fd6da1feec4bae14a81d9805e567013811ff0e85/matplotlib-3.10.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f69dc9713e4ad2fb21a1c30e37bd445d496524257dfda40ff4a8efb3604ab5c", size = 8602258 }, + { url = "https://files.pythonhosted.org/packages/40/87/4397d2ce808467af86684a622dd112664553e81752ea8bf61bdd89d24a41/matplotlib-3.10.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4c59af3e8aca75d7744b68e8e78a669e91ccbcf1ac35d0102a7b1b46883f1dd7", size = 9408896 }, + { url = "https://files.pythonhosted.org/packages/d7/68/0d03098b3feb786cbd494df0aac15b571effda7f7cbdec267e8a8d398c16/matplotlib-3.10.1-cp311-cp311-win_amd64.whl", hash = "sha256:11b65088c6f3dae784bc72e8d039a2580186285f87448babb9ddb2ad0082993a", size = 8061281 }, + { url = "https://files.pythonhosted.org/packages/7c/1d/5e0dc3b59c034e43de16f94deb68f4ad8a96b3ea00f4b37c160b7474928e/matplotlib-3.10.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:66e907a06e68cb6cfd652c193311d61a12b54f56809cafbed9736ce5ad92f107", size = 8175488 }, + { url = "https://files.pythonhosted.org/packages/7a/81/dae7e14042e74da658c3336ab9799128e09a1ee03964f2d89630b5d12106/matplotlib-3.10.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e9b4bb156abb8fa5e5b2b460196f7db7264fc6d62678c03457979e7d5254b7be", size = 8046264 }, + { url = "https://files.pythonhosted.org/packages/21/c4/22516775dcde10fc9c9571d155f90710761b028fc44f660508106c363c97/matplotlib-3.10.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1985ad3d97f51307a2cbfc801a930f120def19ba22864182dacef55277102ba6", size = 8452048 }, + { url = "https://files.pythonhosted.org/packages/63/23/c0615001f67ce7c96b3051d856baedc0c818a2ed84570b9bf9bde200f85d/matplotlib-3.10.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c96f2c2f825d1257e437a1482c5a2cf4fee15db4261bd6fc0750f81ba2b4ba3d", size = 8597111 }, + { url = "https://files.pythonhosted.org/packages/ca/c0/a07939a82aed77770514348f4568177d7dadab9787ebc618a616fe3d665e/matplotlib-3.10.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:35e87384ee9e488d8dd5a2dd7baf471178d38b90618d8ea147aced4ab59c9bea", size = 9402771 }, + { url = "https://files.pythonhosted.org/packages/a6/b6/a9405484fb40746fdc6ae4502b16a9d6e53282ba5baaf9ebe2da579f68c4/matplotlib-3.10.1-cp312-cp312-win_amd64.whl", hash = "sha256:cfd414bce89cc78a7e1d25202e979b3f1af799e416010a20ab2b5ebb3a02425c", size = 8063742 }, + { url = "https://files.pythonhosted.org/packages/60/73/6770ff5e5523d00f3bc584acb6031e29ee5c8adc2336b16cd1d003675fe0/matplotlib-3.10.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c42eee41e1b60fd83ee3292ed83a97a5f2a8239b10c26715d8a6172226988d7b", size = 8176112 }, + { url = "https://files.pythonhosted.org/packages/08/97/b0ca5da0ed54a3f6599c3ab568bdda65269bc27c21a2c97868c1625e4554/matplotlib-3.10.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4f0647b17b667ae745c13721602b540f7aadb2a32c5b96e924cd4fea5dcb90f1", size = 8046931 }, + { url = "https://files.pythonhosted.org/packages/df/9a/1acbdc3b165d4ce2dcd2b1a6d4ffb46a7220ceee960c922c3d50d8514067/matplotlib-3.10.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa3854b5f9473564ef40a41bc922be978fab217776e9ae1545c9b3a5cf2092a3", size = 8453422 }, + { url = "https://files.pythonhosted.org/packages/51/d0/2bc4368abf766203e548dc7ab57cf7e9c621f1a3c72b516cc7715347b179/matplotlib-3.10.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e496c01441be4c7d5f96d4e40f7fca06e20dcb40e44c8daa2e740e1757ad9e6", size = 8596819 }, + { url = "https://files.pythonhosted.org/packages/ab/1b/8b350f8a1746c37ab69dda7d7528d1fc696efb06db6ade9727b7887be16d/matplotlib-3.10.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5d45d3f5245be5b469843450617dcad9af75ca50568acf59997bed9311131a0b", size = 9402782 }, + { url = "https://files.pythonhosted.org/packages/89/06/f570373d24d93503988ba8d04f213a372fa1ce48381c5eb15da985728498/matplotlib-3.10.1-cp313-cp313-win_amd64.whl", hash = "sha256:8e8e25b1209161d20dfe93037c8a7f7ca796ec9aa326e6e4588d8c4a5dd1e473", size = 8063812 }, + { url = "https://files.pythonhosted.org/packages/fc/e0/8c811a925b5a7ad75135f0e5af46408b78af88bbb02a1df775100ef9bfef/matplotlib-3.10.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:19b06241ad89c3ae9469e07d77efa87041eac65d78df4fcf9cac318028009b01", size = 8214021 }, + { url = "https://files.pythonhosted.org/packages/4a/34/319ec2139f68ba26da9d00fce2ff9f27679fb799a6c8e7358539801fd629/matplotlib-3.10.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:01e63101ebb3014e6e9f80d9cf9ee361a8599ddca2c3e166c563628b39305dbb", size = 8090782 }, + { url = "https://files.pythonhosted.org/packages/77/ea/9812124ab9a99df5b2eec1110e9b2edc0b8f77039abf4c56e0a376e84a29/matplotlib-3.10.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f06bad951eea6422ac4e8bdebcf3a70c59ea0a03338c5d2b109f57b64eb3972", size = 8478901 }, + { url = "https://files.pythonhosted.org/packages/c9/db/b05bf463689134789b06dea85828f8ebe506fa1e37593f723b65b86c9582/matplotlib-3.10.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3dfb036f34873b46978f55e240cff7a239f6c4409eac62d8145bad3fc6ba5a3", size = 8613864 }, + { url = "https://files.pythonhosted.org/packages/c2/04/41ccec4409f3023a7576df3b5c025f1a8c8b81fbfe922ecfd837ac36e081/matplotlib-3.10.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dc6ab14a7ab3b4d813b88ba957fc05c79493a037f54e246162033591e770de6f", size = 9409487 }, + { url = "https://files.pythonhosted.org/packages/ac/c2/0d5aae823bdcc42cc99327ecdd4d28585e15ccd5218c453b7bcd827f3421/matplotlib-3.10.1-cp313-cp313t-win_amd64.whl", hash = "sha256:bc411ebd5889a78dabbc457b3fa153203e22248bfa6eedc6797be5df0164dbf9", size = 8134832 }, + { url = "https://files.pythonhosted.org/packages/c8/f6/10adb696d8cbeed2ab4c2e26ecf1c80dd3847bbf3891f4a0c362e0e08a5a/matplotlib-3.10.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:648406f1899f9a818cef8c0231b44dcfc4ff36f167101c3fd1c9151f24220fdc", size = 8158685 }, + { url = "https://files.pythonhosted.org/packages/3f/84/0603d917406072763e7f9bb37747d3d74d7ecd4b943a8c947cc3ae1cf7af/matplotlib-3.10.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:02582304e352f40520727984a5a18f37e8187861f954fea9be7ef06569cf85b4", size = 8035491 }, + { url = "https://files.pythonhosted.org/packages/fd/7d/6a8b31dd07ed856b3eae001c9129670ef75c4698fa1c2a6ac9f00a4a7054/matplotlib-3.10.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3809916157ba871bcdd33d3493acd7fe3037db5daa917ca6e77975a94cef779", size = 8590087 }, ] [[package]] @@ -1483,115 +1387,172 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c", size = 536198 }, ] +[[package]] +name = "mqt-core" +version = "3.0.0b5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/bb/25/b3aaccccffcce929820308f77da002aaf23f9eb359fd69c5bf3a4304e247/mqt_core-3.0.0b5.tar.gz", hash = "sha256:38c78a43f49a05434e0a3c1a8cbd68b03263e74f8efd03fbe319a27852eeda83", size = 435686 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1b/37/f49e71269feb23ad648255137d79bf4ad3d14e35a9518f530466fb3da879/mqt_core-3.0.0b5-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:12dfcf700552ea26387684eb74ffbb4ac164e08a2b77accfd8af21a8691d0201", size = 3227938 }, + { url = "https://files.pythonhosted.org/packages/ed/0c/b1eddffb8eccbe6bb5fe9905ae283a35efe0f3744b6f0e356137f05310c1/mqt_core-3.0.0b5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7ffdfd51f4f8f6228c549497404d1145f780a2e28394c88aa8d963c8e5c004ca", size = 2954762 }, + { url = "https://files.pythonhosted.org/packages/7f/5b/2c006408e72fab8b3b973919377789921c0d08c9b5ece829ce4f39905d99/mqt_core-3.0.0b5-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:07bee00553f2353995cfc19bb51e92d46c598bc815fbd34decce43d2235f9865", size = 3504408 }, + { url = "https://files.pythonhosted.org/packages/94/8f/1232747813d46e9f01af842fe0528127f027c9efa1f0fda9f95cb2939e8b/mqt_core-3.0.0b5-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2ed208f2f108839c54b79999aa068c8940852dcd2444ca6f9554c10c3ad52461", size = 3699611 }, + { url = "https://files.pythonhosted.org/packages/f7/3c/763f191335f9bee20a70f9cf1199a3a910b71da9a64b1436c021adad7594/mqt_core-3.0.0b5-cp310-cp310-win_amd64.whl", hash = "sha256:d4ffd0439a503c92f3c318e7e5795091a5aa3d5a65ee5731137cb76c51bf59a9", size = 4501597 }, + { url = "https://files.pythonhosted.org/packages/4f/1e/fd30cff749feb66367b6719403a9326c43a3cd6c986248895af4a4ac2374/mqt_core-3.0.0b5-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:38bda692c528af7caff4291476024dc6486a366dfd4d3485d9c5cd7c35ac637c", size = 3230575 }, + { url = "https://files.pythonhosted.org/packages/61/40/634d67a969e7eabf5ec81db7e74471e4f9a2605e347277cb09b4b03e8add/mqt_core-3.0.0b5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4cd2b2a070313610a6264a4a6fd4f2831450b0a4ca7b6cffb138c8265540ea76", size = 2956559 }, + { url = "https://files.pythonhosted.org/packages/1c/d4/360de84665967bd2c7fa2d2239e5bdb381cf141e62183c38d8a72abc15b0/mqt_core-3.0.0b5-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0987cc6a2466cfd45f5aa8b7608634976a8368a7fe38a822276dffdd9b40cc78", size = 3505680 }, + { url = "https://files.pythonhosted.org/packages/74/6d/f1aa7820d4914fcba7a6ab02f0446f605c380378f6a0e878f80963d8fd08/mqt_core-3.0.0b5-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dadc8b6716e7fa9d0182ab7b9a632286f4bde0fccdeaca2f7479ea2cc06b5c8b", size = 3700955 }, + { url = "https://files.pythonhosted.org/packages/dd/3f/111493643286ca4bda18615c70f9fc7eeec001937c9738a15d3a2228362f/mqt_core-3.0.0b5-cp311-cp311-win_amd64.whl", hash = "sha256:467c2f0d7f7537b81f6b125a696d7af0a64412fb9a6f4f6727a03967ff9243c1", size = 4503083 }, + { url = "https://files.pythonhosted.org/packages/31/b4/6127aca1d502756b14cde0374c743ed1d23018890392481eb3003d1e8207/mqt_core-3.0.0b5-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:d1419aee35e44cfbd122af9ed9996db2f15a9c41f9b9e068363a4aee10e2723e", size = 3273249 }, + { url = "https://files.pythonhosted.org/packages/ab/42/e7fdc9b6da7dd108844f0d8f19902f1b88b7029f7b72952d8f3272c41c8f/mqt_core-3.0.0b5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:dcd59d10412007848400267de1222272d1fabcf730165b8763ca1986ae53117e", size = 2994430 }, + { url = "https://files.pythonhosted.org/packages/5b/74/3da734ec04a5da96366a9184529c316283993140ad106fc61c86e050bd63/mqt_core-3.0.0b5-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b8a6019abd9ad983396a6dd161d89cb6fb4c103c118d45735b61e4c1b43ede5f", size = 3505321 }, + { url = "https://files.pythonhosted.org/packages/d5/00/a04e28c52a142f8e936c16f731808982c70b6f126f74d1a72c1fa79ef424/mqt_core-3.0.0b5-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:89311afe8394f423f057d8f698fe42110da618997fca29718efe8d4396b18455", size = 3699913 }, + { url = "https://files.pythonhosted.org/packages/c3/64/673df0facb76e9f6258e8b0e0036958ea398041cf58b18c2ac91b978c900/mqt_core-3.0.0b5-cp312-cp312-win_amd64.whl", hash = "sha256:0763576dfee7bf7100012556fd35e7f13af07dd66c9a7c6884f64a34dac0e9dd", size = 4504127 }, + { url = "https://files.pythonhosted.org/packages/87/74/9a5d1210e7ae766b3732862aa304e81e1c87b4d9a846646f8f95bd6ec103/mqt_core-3.0.0b5-cp313-cp313-macosx_10_15_x86_64.whl", hash = "sha256:c1c40ba6a9098d8e018d9c37019f1af2d43ea6875d8e20f8df2a4a0d478060f0", size = 3273357 }, + { url = "https://files.pythonhosted.org/packages/c4/c9/a15d044a4192229b3765abc3368e93d39d175a42ba0ccb6f7d87a79fb525/mqt_core-3.0.0b5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0f517d975650c95be5215617dff6e07c058139e5e59bdf4361f68b60338d1b11", size = 2994544 }, + { url = "https://files.pythonhosted.org/packages/d4/ca/64e7e83d1abbc002a06155e42155430d3a9c43f3149f74970ccc150fc7c1/mqt_core-3.0.0b5-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ec7ff12f4cf83c0955477e193404ab7a6904103d414bd42883a46109a5a83cf1", size = 3505438 }, + { url = "https://files.pythonhosted.org/packages/c0/32/2c0aed97e833c3f3556ebd2983b5274718dc31954eefcccf82db8e56f4f4/mqt_core-3.0.0b5-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4c2e1d37fc7ae3702389b6324dfe2f196f675a09f28229cb08ff1b9b3a388e69", size = 3699811 }, + { url = "https://files.pythonhosted.org/packages/ec/70/a5147b1558b0051c90d796b02113ccc1f8d32bd951ad8e1b67e9194ae31c/mqt_core-3.0.0b5-cp313-cp313-win_amd64.whl", hash = "sha256:1202ae2faadb66648d5f404333c763b9457c122bb2410daa590b3d59f2e9e734", size = 4504103 }, + { url = "https://files.pythonhosted.org/packages/c9/3f/a38c9f89f4bd3b171965071cb6bc2ccb3ea4827246493d03061b05f029f8/mqt_core-3.0.0b5-cp313-cp313t-macosx_10_15_x86_64.whl", hash = "sha256:5327880cd0f6a0b57d9673cbe23d1d79eddf52bfacfad7517c194a13684fa9e4", size = 3302456 }, + { url = "https://files.pythonhosted.org/packages/24/21/92965e9486cb45482973269afbe668f49a37154cda878788e989df73b420/mqt_core-3.0.0b5-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:6d66102bedbab29455f53aaca0b5d8e85d18b9ae7c33db5127e30dd2471aaacc", size = 3004858 }, + { url = "https://files.pythonhosted.org/packages/e5/87/fd9cb04285b421cf1c497de9791e7526826bfa6020697d21e243b436dd35/mqt_core-3.0.0b5-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1450ccb0ce56b1d16189ecb3dace259fb318548997990a7e2090cdbf6d133aa7", size = 3509624 }, + { url = "https://files.pythonhosted.org/packages/95/7e/a0e5a4216a97d9507149f8a3c8315ec7d8c0e8bace583379542fd9f3301e/mqt_core-3.0.0b5-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6da63e3fc4284882ee5f32428dd67e6f1afbf845facf80f74720e1ea1de0a541", size = 3704146 }, + { url = "https://files.pythonhosted.org/packages/f0/a9/7f3c8d73fa87c4161789ddcfbd98bbb15eff69408b041b6f9a7c95804bac/mqt_core-3.0.0b5-cp313-cp313t-win_amd64.whl", hash = "sha256:1f99c26b2033fc655fea24a133d98570505b509d94f064d3d273e1cc7c0adc46", size = 4539746 }, + { url = "https://files.pythonhosted.org/packages/1f/7b/552cf62bbaef6d9506977f9d4abdfbd332b845b52efd0342f3df2d7717d8/mqt_core-3.0.0b5-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:4773316d645b5732da12e41bba1435a2a00afbb68b4ebc51a2404255ccdef8db", size = 3228110 }, + { url = "https://files.pythonhosted.org/packages/68/4a/d4881fd4584f6838e578bed9c4fd8261748ec872425f58bb750cdd9c2772/mqt_core-3.0.0b5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:bd8d22dd10c0d96b85fb2297651fa1dbefc5116e62e457f8cd30772af90ae718", size = 2955037 }, + { url = "https://files.pythonhosted.org/packages/25/bc/e11620cd5fe8c5c4981d61d26858585c53370fe2cf3165768e6d30c1a76d/mqt_core-3.0.0b5-cp39-cp39-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d8f8412840d3f1251c3b567739140f2d655a8eead85712a4a2c216c5dd7dc588", size = 3504711 }, + { url = "https://files.pythonhosted.org/packages/6f/45/f06094e18cc19cdc30ef7fbb34a09ad047cd4693784c2b91025d5fcc8910/mqt_core-3.0.0b5-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ca413fdd74b9e3de63cd7f9618d78702a244e313f23efbcb32fdf064b6ae7506", size = 3699800 }, + { url = "https://files.pythonhosted.org/packages/3e/f0/c91105f7147d0efbd8dc1e8b687e3823fcac1444dc47741d62cf14edeb96/mqt_core-3.0.0b5-cp39-cp39-win_amd64.whl", hash = "sha256:c7a4395b8623521a32541bdd8b9badb06969066875e0073b4ddc845b14dcf2cf", size = 4502436 }, +] + +[package.optional-dependencies] +qiskit = [ + { name = "qiskit", extra = ["qasm3-import"] }, +] + [[package]] name = "mqt-ddsim" source = { editable = "." } dependencies = [ - { name = "qiskit", extra = ["qasm3-import"] }, + { name = "mqt-core", extra = ["qiskit"] }, ] -[package.optional-dependencies] -coverage = [ - { name = "pytest" }, - { name = "pytest-cov" }, +[package.dev-dependencies] +build = [ + { name = "mqt-core" }, + { name = "pybind11" }, + { name = "scikit-build-core" }, + { name = "setuptools-scm" }, ] dev = [ { name = "breathe" }, - { name = "cotengra" }, { name = "furo" }, { name = "graphviz" }, { name = "ipykernel" }, - { name = "kahypar" }, + { name = "mqt-core" }, { name = "nbsphinx" }, - { name = "networkx", version = "3.2.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "networkx", version = "3.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, - { name = "numpy", version = "2.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "numpy", version = "2.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, - { name = "opt-einsum" }, - { name = "pandas" }, + { name = "pybind11" }, { name = "pytest" }, { name = "pytest-cov" }, { name = "qiskit", extra = ["visualization"] }, - { name = "quimb" }, + { name = "scikit-build-core" }, { name = "setuptools-scm" }, - { name = "sparse" }, + { name = "sphinx", version = "7.4.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, + { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "sphinx-autoapi" }, { name = "sphinx-autodoc-typehints", version = "2.3.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, { name = "sphinx-autodoc-typehints", version = "3.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, { name = "sphinx-autodoc-typehints", version = "3.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "sphinx-copybutton" }, + { name = "sphinx-design" }, { name = "sphinxcontrib-bibtex" }, + { name = "sphinxcontrib-svg2pdfconverter" }, { name = "sphinxext-opengraph" }, ] docs = [ { name = "breathe" }, - { name = "cotengra" }, { name = "furo" }, { name = "graphviz" }, { name = "ipykernel" }, - { name = "kahypar" }, { name = "nbsphinx" }, - { name = "networkx", version = "3.2.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "networkx", version = "3.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, - { name = "numpy", version = "2.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "numpy", version = "2.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, - { name = "opt-einsum" }, - { name = "pandas" }, { name = "qiskit", extra = ["visualization"] }, - { name = "quimb" }, { name = "setuptools-scm" }, - { name = "sparse" }, + { name = "sphinx", version = "7.4.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, + { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "sphinx-autoapi" }, { name = "sphinx-autodoc-typehints", version = "2.3.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, { name = "sphinx-autodoc-typehints", version = "3.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, { name = "sphinx-autodoc-typehints", version = "3.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "sphinx-copybutton" }, + { name = "sphinx-design" }, { name = "sphinxcontrib-bibtex" }, + { name = "sphinxcontrib-svg2pdfconverter" }, { name = "sphinxext-opengraph" }, ] test = [ { name = "pytest" }, -] -tnflow = [ - { name = "cotengra" }, - { name = "kahypar" }, - { name = "networkx", version = "3.2.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "networkx", version = "3.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, - { name = "numpy", version = "2.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "numpy", version = "2.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, - { name = "opt-einsum" }, - { name = "pandas" }, - { name = "quimb" }, - { name = "sparse" }, + { name = "pytest-cov" }, ] [package.metadata] -requires-dist = [ - { name = "breathe", marker = "extra == 'docs'" }, - { name = "cotengra", marker = "extra == 'tnflow'" }, - { name = "furo", marker = "extra == 'docs'", specifier = ">=2023.9.10" }, - { name = "graphviz", marker = "extra == 'docs'" }, - { name = "ipykernel", marker = "extra == 'docs'" }, - { name = "kahypar", marker = "extra == 'tnflow'" }, - { name = "mqt-ddsim", extras = ["coverage", "docs", "tnflow"], marker = "extra == 'dev'" }, - { name = "mqt-ddsim", extras = ["test"], marker = "extra == 'coverage'" }, - { name = "mqt-ddsim", extras = ["tnflow"], marker = "extra == 'docs'" }, - { name = "nbsphinx", marker = "extra == 'docs'" }, - { name = "networkx", marker = "extra == 'tnflow'" }, - { name = "numpy", marker = "extra == 'tnflow'" }, - { name = "opt-einsum", marker = "extra == 'tnflow'" }, - { name = "pandas", marker = "extra == 'tnflow'" }, - { name = "pytest", marker = "extra == 'test'", specifier = ">=7.2" }, - { name = "pytest-cov", marker = "extra == 'coverage'", specifier = ">=4" }, - { name = "qiskit", extras = ["qasm3-import"], specifier = ">=1.0.0" }, - { name = "qiskit", extras = ["visualization"], marker = "extra == 'docs'" }, - { name = "quimb", marker = "extra == 'tnflow'" }, - { name = "setuptools-scm", marker = "extra == 'docs'", specifier = ">=8.1" }, - { name = "sparse", marker = "extra == 'tnflow'" }, - { name = "sphinx-autodoc-typehints", marker = "extra == 'docs'" }, - { name = "sphinx-copybutton", marker = "extra == 'docs'", specifier = ">=0.5" }, - { name = "sphinxcontrib-bibtex", marker = "extra == 'docs'", specifier = ">=2.4.2" }, - { name = "sphinxext-opengraph", marker = "extra == 'docs'", specifier = ">=0.9" }, -] -provides-extras = ["tnflow", "test", "coverage", "docs", "dev"] +requires-dist = [{ name = "mqt-core", extras = ["qiskit"], specifier = ">=3.0.0b5" }] + +[package.metadata.requires-dev] +build = [ + { name = "mqt-core", specifier = ">=3.0.0b5" }, + { name = "pybind11", specifier = ">=2.13.6" }, + { name = "scikit-build-core", specifier = ">=0.11.0" }, + { name = "setuptools-scm", specifier = ">=8.1" }, +] +dev = [ + { name = "breathe", specifier = ">=4.36.0" }, + { name = "furo", specifier = ">=2024.8.6" }, + { name = "graphviz", specifier = ">=0.20.3" }, + { name = "ipykernel", specifier = ">=6.29.5" }, + { name = "mqt-core", specifier = ">=3.0.0b5" }, + { name = "nbsphinx", specifier = ">=0.9.6" }, + { name = "pybind11", specifier = ">=2.13.6" }, + { name = "pytest", specifier = ">=8.3.4" }, + { name = "pytest-cov", specifier = ">=6" }, + { name = "qiskit", extras = ["visualization"], specifier = ">=1.0.0" }, + { name = "scikit-build-core", specifier = ">=0.11.0" }, + { name = "setuptools-scm", specifier = ">=8.1" }, + { name = "sphinx", specifier = ">=7.4.7" }, + { name = "sphinx", marker = "python_full_version >= '3.10'", specifier = ">=8.1.3" }, + { name = "sphinx", marker = "python_full_version >= '3.11'", specifier = ">=8.2.3" }, + { name = "sphinx-autoapi", specifier = ">=3.6.0" }, + { name = "sphinx-autodoc-typehints", specifier = ">=2.3.0" }, + { name = "sphinx-copybutton", specifier = ">=0.5.2" }, + { name = "sphinx-design", specifier = ">=0.6.1" }, + { name = "sphinxcontrib-bibtex", specifier = ">=2.6.3" }, + { name = "sphinxcontrib-svg2pdfconverter", specifier = ">=1.2.3" }, + { name = "sphinxext-opengraph", specifier = ">=0.9.1" }, +] +docs = [ + { name = "breathe", specifier = ">=4.36.0" }, + { name = "furo", specifier = ">=2024.8.6" }, + { name = "graphviz", specifier = ">=0.20.3" }, + { name = "ipykernel", specifier = ">=6.29.5" }, + { name = "nbsphinx", specifier = ">=0.9.6" }, + { name = "qiskit", extras = ["visualization"], specifier = ">=1.0.0" }, + { name = "setuptools-scm", specifier = ">=8.1" }, + { name = "sphinx", specifier = ">=7.4.7" }, + { name = "sphinx", marker = "python_full_version >= '3.10'", specifier = ">=8.1.3" }, + { name = "sphinx", marker = "python_full_version >= '3.11'", specifier = ">=8.2.3" }, + { name = "sphinx-autoapi", specifier = ">=3.6.0" }, + { name = "sphinx-autodoc-typehints", specifier = ">=2.3.0" }, + { name = "sphinx-copybutton", specifier = ">=0.5.2" }, + { name = "sphinx-design", specifier = ">=0.6.1" }, + { name = "sphinxcontrib-bibtex", specifier = ">=2.6.3" }, + { name = "sphinxcontrib-svg2pdfconverter", specifier = ">=1.2.3" }, + { name = "sphinxext-opengraph", specifier = ">=0.9.1" }, +] +test = [ + { name = "pytest", specifier = ">=8.3.4" }, + { name = "pytest-cov", specifier = ">=6" }, +] [[package]] name = "nbclient" @@ -1660,7 +1621,7 @@ dependencies = [ { name = "nbformat" }, { name = "sphinx", version = "7.4.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, - { name = "sphinx", version = "8.2.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "traitlets" }, ] sdist = { url = "https://files.pythonhosted.org/packages/62/38/6f6a0f9115b493af9d69b68335945827dd46e09de8ef525d1f58cd0870dc/nbsphinx-0.9.6.tar.gz", hash = "sha256:c2b28a2d702f1159a95b843831798e86e60a17fc647b9bff9ba1585355de54e3", size = 180213 } @@ -1677,51 +1638,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c", size = 5195 }, ] -[[package]] -name = "networkx" -version = "3.2.1" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.10'", -] -sdist = { url = "https://files.pythonhosted.org/packages/c4/80/a84676339aaae2f1cfdf9f418701dd634aef9cc76f708ef55c36ff39c3ca/networkx-3.2.1.tar.gz", hash = "sha256:9f1bb5cf3409bf324e0a722c20bdb4c20ee39bf1c30ce8ae499c8502b0b5e0c6", size = 2073928 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d5/f0/8fbc882ca80cf077f1b246c0e3c3465f7f415439bdea6b899f6b19f61f70/networkx-3.2.1-py3-none-any.whl", hash = "sha256:f18c69adc97877c42332c170849c96cefa91881c99a7cb3e95b7c659ebdc1ec2", size = 1647772 }, -] - -[[package]] -name = "networkx" -version = "3.4.2" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.12'", - "python_full_version == '3.11.*'", - "python_full_version == '3.10.*'", -] -sdist = { url = "https://files.pythonhosted.org/packages/fd/1d/06475e1cd5264c0b870ea2cc6fdb3e37177c1e565c43f56ff17a10e3937f/networkx-3.4.2.tar.gz", hash = "sha256:307c3669428c5362aab27c8a1260aa8f47c4e91d3891f48be0141738d8d053e1", size = 2151368 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b9/54/dd730b32ea14ea797530a4479b2ed46a6fb250f682a9cfb997e968bf0261/networkx-3.4.2-py3-none-any.whl", hash = "sha256:df5d4365b724cf81b8c6a7312509d0c22386097011ad1abe274afd5e9d3bbc5f", size = 1723263 }, -] - -[[package]] -name = "numba" -version = "0.53.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "llvmlite" }, - { name = "numpy", version = "2.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "numpy", version = "2.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, - { name = "setuptools" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/e3/7d/3d61160836e49f40913741c464f119551c15ed371c1d91ea50308495b93b/numba-0.53.1.tar.gz", hash = "sha256:9cd4e5216acdc66c4e9dab2dfd22ddb5bef151185c070d4a3cd8e78638aff5b0", size = 2213956 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/5f/c4/31d32d3e47a2a9f4c665b5158547b30f66e8b3f438fa8e6e695b47c70ad5/numba-0.53.1-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:224d197a46a9e602a16780d87636e199e2cdef528caef084a4d8fd8909c2455c", size = 2227187 }, - { url = "https://files.pythonhosted.org/packages/59/61/2d330282528a88a907278f5f6964e55b00461c688468966741720873e302/numba-0.53.1-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:aba7acb247a09d7f12bd17a8e28bbb04e8adef9fc20ca29835d03b7894e1b49f", size = 3098584 }, - { url = "https://files.pythonhosted.org/packages/2e/74/dec288f1365c695ee4a271eef1bd5439693e9263431a367c5ecde045d7e5/numba-0.53.1-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:bd126f1f49da6fc4b3169cf1d96f1c3b3f84a7badd11fe22da344b923a00e744", size = 3374647 }, - { url = "https://files.pythonhosted.org/packages/14/fe/ee29b1a645649105f32657eba0ab7cc9837abf7131f6ed1f3463ff6f97d4/numba-0.53.1-cp39-cp39-win32.whl", hash = "sha256:0ef9d1f347b251282ae46e5a5033600aa2d0dfa1ee8c16cb8137b8cd6f79e221", size = 2276146 }, - { url = "https://files.pythonhosted.org/packages/f5/0c/cab8c134f8814a0345cac9a1bd2ec0eec5ee4c1ea198ce536c69df8b9671/numba-0.53.1-cp39-cp39-win_amd64.whl", hash = "sha256:17146885cbe4e89c9d4abd4fcb8886dee06d4591943dc4343500c36ce2fcfa69", size = 2295290 }, -] - [[package]] name = "numpy" version = "2.0.2" @@ -1859,15 +1775,6 @@ parser = [ { name = "importlib-metadata", marker = "python_full_version < '3.10'" }, ] -[[package]] -name = "opt-einsum" -version = "3.4.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/8c/b9/2ac072041e899a52f20cf9510850ff58295003aa75525e58343591b0cbfb/opt_einsum-3.4.0.tar.gz", hash = "sha256:96ca72f1b886d148241348783498194c577fa30a8faac108586b14f1ba4473ac", size = 63004 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/23/cd/066e86230ae37ed0be70aae89aabf03ca8d9f39c8aea0dec8029455b5540/opt_einsum-3.4.0-py3-none-any.whl", hash = "sha256:69bb92469f86a1565195ece4ac0323943e83477171b91d24c35afe028a90d7cd", size = 71932 }, -] - [[package]] name = "packaging" version = "24.2" @@ -1951,6 +1858,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c6/ac/dac4a63f978e4dcb3c6d3a78c4d8e0192a113d288502a1216950c41b1027/parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18", size = 103650 }, ] +[[package]] +name = "pathspec" +version = "0.12.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ca/bc/f35b8446f4531a7cb215605d100cd88b7ac6f44ab3fc94870c120ab3adbf/pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712", size = 51043 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", size = 31191 }, +] + [[package]] name = "pbr" version = "6.1.1" @@ -2116,6 +2032,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0", size = 11842 }, ] +[[package]] +name = "pybind11" +version = "2.13.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d2/c1/72b9622fcb32ff98b054f724e213c7f70d6898baa714f4516288456ceaba/pybind11-2.13.6.tar.gz", hash = "sha256:ba6af10348c12b24e92fa086b39cfba0eff619b61ac77c406167d813b096d39a", size = 218403 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/13/2f/0f24b288e2ce56f51c920137620b4434a38fd80583dbbe24fc2a1656c388/pybind11-2.13.6-py3-none-any.whl", hash = "sha256:237c41e29157b962835d356b370ededd57594a26d5894a795960f0047cb5caf5", size = 243282 }, +] + [[package]] name = "pybtex" version = "0.24.0" @@ -2190,7 +2115,7 @@ wheels = [ [[package]] name = "pytest" -version = "8.3.4" +version = "8.3.5" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, @@ -2200,9 +2125,9 @@ dependencies = [ { name = "pluggy" }, { name = "tomli", marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/05/35/30e0d83068951d90a01852cb1cef56e5d8a09d20c7f511634cc2f7e0372a/pytest-8.3.4.tar.gz", hash = "sha256:965370d062bce11e73868e0335abac31b4d3de0e82f4007408d242b4f8610761", size = 1445919 } +sdist = { url = "https://files.pythonhosted.org/packages/ae/3c/c9d525a414d506893f0cd8a8d0de7706446213181570cdbd766691164e40/pytest-8.3.5.tar.gz", hash = "sha256:f4efe70cc14e511565ac476b57c279e12a855b11f48f212af1080ef2263d3845", size = 1450891 } wheels = [ - { url = "https://files.pythonhosted.org/packages/11/92/76a1c94d3afee238333bc0a42b82935dd8f9cf8ce9e336ff87ee14d9e1cf/pytest-8.3.4-py3-none-any.whl", hash = "sha256:50e16d954148559c9a74109af1eaf0c945ba2d8f30f0a3d3335edde19788b6f6", size = 343083 }, + { url = "https://files.pythonhosted.org/packages/30/3d/64ad57c803f1fa1e963a7946b6e0fea4a70df53c1a7fed304586539c2bac/pytest-8.3.5-py3-none-any.whl", hash = "sha256:c69214aa47deac29fad6c2a4f590b9c4a9fdb16a403176fe154b79c0b4d4d820", size = 343634 }, ] [[package]] @@ -2439,7 +2364,7 @@ qasm3-import = [ ] visualization = [ { name = "matplotlib", version = "3.9.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "matplotlib", version = "3.10.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "matplotlib", version = "3.10.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, { name = "pillow" }, { name = "pydot" }, { name = "pylatexenc" }, @@ -2459,27 +2384,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c2/f2/d061b1eb3edd70b4503c06ebe94e087d089de01187b7b5d8d99a43df010a/qiskit_qasm3_import-0.5.1-py3-none-any.whl", hash = "sha256:ba6cc1ce3b142c069be07e945816a4bc1458fafe950df4f0eb15ae97d5275102", size = 27614 }, ] -[[package]] -name = "quimb" -version = "1.10.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "autoray" }, - { name = "cotengra" }, - { name = "cytoolz" }, - { name = "numba" }, - { name = "numpy", version = "2.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "numpy", version = "2.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, - { name = "psutil" }, - { name = "scipy", version = "1.13.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "scipy", version = "1.15.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, - { name = "tqdm" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/aa/e9/96cbbb27a9689b2e6fa484b6226bcff6c520c75b49c0a615f2131323f49d/quimb-1.10.0.tar.gz", hash = "sha256:e79f1be2f9895d966479ccabbd5ec087fc047baad83d3fb08fed264e2d7cc3ff", size = 11495275 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/38/60/463095864b740c1731365f119e663d9f821b5f482362187921a64a8f9175/quimb-1.10.0-py3-none-any.whl", hash = "sha256:4d270e71c9f03a4a41862682fbffcd076c61d7e40c4b3785a31ae869ce8830c4", size = 1746891 }, -] - [[package]] name = "referencing" version = "0.36.2" @@ -2650,6 +2554,21 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/3e/79/9bdd52d2a33d468c81c1827de1b588080cb055d1d3561b194ab7bf2635b5/rustworkx-0.16.0-cp39-abi3-win_amd64.whl", hash = "sha256:905df608843c32fa45ac023687769fe13056edf7584474c801d5c50705d76e9b", size = 1953559 }, ] +[[package]] +name = "scikit-build-core" +version = "0.11.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, + { name = "packaging" }, + { name = "pathspec" }, + { name = "tomli", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/88/63/d99a097afa886b4534332f3dba46c2c9130c9b8bd0cb08beb8c8c395a55f/scikit_build_core-0.11.0.tar.gz", hash = "sha256:423d8b0885bf1942816c851f8ec7c1efc0a7ecad4f38ff43d5ba869a894b107b", size = 271991 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0a/ba/b37b9802f503894a46ef34aaa5851344cde48b39ab0af5057a6ee4f0d631/scikit_build_core-0.11.0-py3-none-any.whl", hash = "sha256:04508609970fb4819d211197b8315bde9ee493ef4d20f08aa7447b0bf652523c", size = 179546 }, +] + [[package]] name = "scipy" version = "1.13.1" @@ -2755,7 +2674,7 @@ version = "0.13.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "matplotlib", version = "3.9.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "matplotlib", version = "3.10.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "matplotlib", version = "3.10.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, { name = "numpy", version = "2.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, { name = "numpy", version = "2.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, { name = "pandas" }, @@ -2767,11 +2686,11 @@ wheels = [ [[package]] name = "setuptools" -version = "75.8.0" +version = "75.8.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/92/ec/089608b791d210aec4e7f97488e67ab0d33add3efccb83a056cbafe3a2a6/setuptools-75.8.0.tar.gz", hash = "sha256:c5afc8f407c626b8313a86e10311dd3f661c6cd9c09d4bf8c15c0e11f9f2b0e6", size = 1343222 } +sdist = { url = "https://files.pythonhosted.org/packages/d1/53/43d99d7687e8cdef5ab5f9ec5eaf2c0423c2b35133a2b7e7bc276fc32b21/setuptools-75.8.2.tar.gz", hash = "sha256:4880473a969e5f23f2a2be3646b2dfd84af9028716d398e46192f84bc36900d2", size = 1344083 } wheels = [ - { url = "https://files.pythonhosted.org/packages/69/8a/b9dc7678803429e4a3bc9ba462fa3dd9066824d3c607490235c6a796be5a/setuptools-75.8.0-py3-none-any.whl", hash = "sha256:e3982f444617239225d675215d51f6ba05f845d4eec313da4418fdbb56fb27e3", size = 1228782 }, + { url = "https://files.pythonhosted.org/packages/a9/38/7d7362e031bd6dc121e5081d8cb6aa6f6fedf2b67bf889962134c6da4705/setuptools-75.8.2-py3-none-any.whl", hash = "sha256:558e47c15f1811c1fa7adbd0096669bf76c1d3f433f58324df69f3f5ecac4e8f", size = 1229385 }, ] [[package]] @@ -2816,22 +2735,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d1/c2/fe97d779f3ef3b15f05c94a2f1e3d21732574ed441687474db9d342a7315/soupsieve-2.6-py3-none-any.whl", hash = "sha256:e72c4ff06e4fb6e4b5a9f0f55fe6e81514581fca1515028625d0f299c602ccc9", size = 36186 }, ] -[[package]] -name = "sparse" -version = "0.15.5" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "numba" }, - { name = "numpy", version = "2.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "numpy", version = "2.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, - { name = "scipy", version = "1.13.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "scipy", version = "1.15.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/8c/97/ef70784ece46b7071f357f89f69ae8b120f7a2dff1a70f9747563b709683/sparse-0.15.5.tar.gz", hash = "sha256:4c76ce0c96f5cd5c31b7e79e650f0022424c2b16f05f10049e9c6381ee4be266", size = 359719 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/4f/37/fcb96b950a972dac48e0fc9e3c528130ca8d8d1e0f09e727df3c6342c7c8/sparse-0.15.5-py2.py3-none-any.whl", hash = "sha256:cf608731f8564916443427bca323fe118e8c25a712ddf02dbe7673a961139706", size = 117384 }, -] - [[package]] name = "sphinx" version = "7.4.7" @@ -2897,7 +2800,7 @@ wheels = [ [[package]] name = "sphinx" -version = "8.2.1" +version = "8.2.3" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.12'", @@ -2922,9 +2825,27 @@ dependencies = [ { name = "sphinxcontrib-qthelp", marker = "python_full_version >= '3.11'" }, { name = "sphinxcontrib-serializinghtml", marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/99/4b/95bdb36eaee30698f2d244d52e1b9e58642af56525d4b02fcd0f7312c27c/sphinx-8.2.1.tar.gz", hash = "sha256:e4b932951b9c18b039f73b72e4e63afe967d90408700ec222b981ac24647c01e", size = 8321376 } +sdist = { url = "https://files.pythonhosted.org/packages/38/ad/4360e50ed56cb483667b8e6dadf2d3fda62359593faabbe749a27c4eaca6/sphinx-8.2.3.tar.gz", hash = "sha256:398ad29dee7f63a75888314e9424d40f52ce5a6a87ae88e7071e80af296ec348", size = 8321876 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/31/53/136e9eca6e0b9dc0e1962e2c908fbea2e5ac000c2a2fbd9a35797958c48b/sphinx-8.2.3-py3-none-any.whl", hash = "sha256:4405915165f13521d875a8c29c8970800a0141c14cc5416a38feca4ea5d9b9c3", size = 3589741 }, +] + +[[package]] +name = "sphinx-autoapi" +version = "3.6.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "astroid" }, + { name = "jinja2" }, + { name = "pyyaml" }, + { name = "sphinx", version = "7.4.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, + { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "stdlib-list", marker = "python_full_version < '3.10'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7f/a8/22b379a2a75ccb881217d3d4ae56d7d35f2d1bb4c8c0c51d0253676746a1/sphinx_autoapi-3.6.0.tar.gz", hash = "sha256:c685f274e41d0842ae7e199460c322c4bd7fec816ccc2da8d806094b4f64af06", size = 55417 } wheels = [ - { url = "https://files.pythonhosted.org/packages/cf/aa/282768cff0039b227a923cb65686539bb606e448c594d4fdee4d2c7765a1/sphinx-8.2.1-py3-none-any.whl", hash = "sha256:b5d2bb3cdf6207fcacde9f92085d2b97667b05b9c346eaec426ca4be8af505e9", size = 3589415 }, + { url = "https://files.pythonhosted.org/packages/58/17/0eda9dc80fcaf257222b506844207e71b5d59567c41bbdcca2a72da119b9/sphinx_autoapi-3.6.0-py3-none-any.whl", hash = "sha256:f3b66714493cab140b0e896d33ce7137654a16ac1edb6563edcbd47bf975f711", size = 35281 }, ] [[package]] @@ -2966,7 +2887,7 @@ resolution-markers = [ "python_full_version == '3.11.*'", ] dependencies = [ - { name = "sphinx", version = "8.2.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/cb/cc/d38e7260b1bd3af0c84ad8285dfd78236584b74544510584e07963e000ec/sphinx_autodoc_typehints-3.1.0.tar.gz", hash = "sha256:a6b7b0b6df0a380783ce5b29150c2d30352746f027a3e294d37183995d3f23ed", size = 36528 } wheels = [ @@ -2980,7 +2901,7 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "7.4.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, - { name = "sphinx", version = "8.2.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/98/0b/a866924ded68efec7a1759587a4e478aec7559d8165fac8b2ad1c0e774d6/sphinx_basic_ng-1.0.0b2.tar.gz", hash = "sha256:9ec55a47c90c8c002b5960c57492ec3021f5193cb26cebc2dc4ea226848651c9", size = 20736 } wheels = [ @@ -2994,13 +2915,27 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "7.4.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, - { name = "sphinx", version = "8.2.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/fc/2b/a964715e7f5295f77509e59309959f4125122d648f86b4fe7d70ca1d882c/sphinx-copybutton-0.5.2.tar.gz", hash = "sha256:4cf17c82fb9646d1bc9ca92ac280813a3b605d8c421225fd9913154103ee1fbd", size = 23039 } wheels = [ { url = "https://files.pythonhosted.org/packages/9e/48/1ea60e74949eecb12cdd6ac43987f9fd331156388dcc2319b45e2ebb81bf/sphinx_copybutton-0.5.2-py3-none-any.whl", hash = "sha256:fb543fd386d917746c9a2c50360c7905b605726b9355cd26e9974857afeae06e", size = 13343 }, ] +[[package]] +name = "sphinx-design" +version = "0.6.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "sphinx", version = "7.4.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, + { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2b/69/b34e0cb5336f09c6866d53b4a19d76c227cdec1bbc7ac4de63ca7d58c9c7/sphinx_design-0.6.1.tar.gz", hash = "sha256:b44eea3719386d04d765c1a8257caca2b3e6f8421d7b3a5e742c0fd45f84e632", size = 2193689 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c6/43/65c0acbd8cc6f50195a3a1fc195c404988b15c67090e73c7a41a9f57d6bd/sphinx_design-0.6.1-py3-none-any.whl", hash = "sha256:b11f37db1a802a183d61b159d9a202314d4d2fe29c163437001324fe2f19549c", size = 2215338 }, +] + [[package]] name = "sphinxcontrib-applehelp" version = "2.0.0" @@ -3022,7 +2957,7 @@ dependencies = [ { name = "setuptools", marker = "python_full_version >= '3.12'" }, { name = "sphinx", version = "7.4.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, - { name = "sphinx", version = "8.2.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/c1/ce/054a8ec04063f9a27772fea7188f796edbfa382e656d3b76428323861f0e/sphinxcontrib_bibtex-2.6.3.tar.gz", hash = "sha256:7c790347ef1cb0edf30de55fc324d9782d085e89c52c2b8faafa082e08e23946", size = 117177 } wheels = [ @@ -3074,6 +3009,20 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl", hash = "sha256:6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331", size = 92072 }, ] +[[package]] +name = "sphinxcontrib-svg2pdfconverter" +version = "1.2.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "sphinx", version = "7.4.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, + { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/55/df/038c33dd93daea6ca91f8168a5bbcab7744f030005a15e23d6a50793a264/sphinxcontrib_svg2pdfconverter-1.2.3.tar.gz", hash = "sha256:fb5d517b634c5629522004c59edce4d9050d89822408cab452c7d52fe5ae9824", size = 5774 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f1/85/8563d13887eb4181ff8cab9c97dc841bf3752a0df63c8d5fd2e890d2e7e7/sphinxcontrib_svg2pdfconverter-1.2.3-py3-none-any.whl", hash = "sha256:f757330fc0f89c2e4768d85e385b6dd6edc67f7ccb09b3dc6939cbcaf57a88ea", size = 8176 }, +] + [[package]] name = "sphinxext-opengraph" version = "0.9.1" @@ -3081,7 +3030,7 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "7.4.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, - { name = "sphinx", version = "8.2.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/1c/5b/4302fe33c88dbfb572e2c1cad26735164c23f16fb8dba94ddb1867d0ef06/sphinxext-opengraph-0.9.1.tar.gz", hash = "sha256:dd2868a1e7c9497977fbbf44cc0844a42af39ca65fe1bb0272518af225d06fc5", size = 1034511 } wheels = [ @@ -3102,6 +3051,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695", size = 24521 }, ] +[[package]] +name = "stdlib-list" +version = "0.11.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5d/09/8d5c564931ae23bef17420a6c72618463a59222ca4291a7dd88de8a0d490/stdlib_list-0.11.1.tar.gz", hash = "sha256:95ebd1d73da9333bba03ccc097f5bac05e3aa03e6822a0c0290f87e1047f1857", size = 60442 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/88/c7/4102536de33c19d090ed2b04e90e7452e2e3dc653cf3323208034eaaca27/stdlib_list-0.11.1-py3-none-any.whl", hash = "sha256:9029ea5e3dfde8cd4294cfd4d1797be56a67fc4693c606181730148c3fd1da29", size = 83620 }, +] + [[package]] name = "stevedore" version = "5.4.1" @@ -3220,15 +3178,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/6e/c2/61d3e0f47e2b74ef40a68b9e6ad5984f6241a942f7cd3bbfbdbd03861ea9/tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc", size = 14257 }, ] -[[package]] -name = "toolz" -version = "1.0.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/8a/0b/d80dfa675bf592f636d1ea0b835eab4ec8df6e9415d8cfd766df54456123/toolz-1.0.0.tar.gz", hash = "sha256:2c86e3d9a04798ac556793bced838816296a2f085017664e4995cb40a1047a02", size = 66790 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/03/98/eb27cc78ad3af8e302c9d8ff4977f5026676e130d28dd7578132a457170c/toolz-1.0.0-py3-none-any.whl", hash = "sha256:292c8f1c4e7516bf9086f8850935c799a874039c8bcf959d47b600e4c44a6236", size = 56383 }, -] - [[package]] name = "tornado" version = "6.4.2" @@ -3247,18 +3196,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/61/cc/58b1adeb1bb46228442081e746fcdbc4540905c87e8add7c277540934edb/tornado-6.4.2-cp38-abi3-win_amd64.whl", hash = "sha256:908b71bf3ff37d81073356a5fadcc660eb10c1476ee6e2725588626ce7e5ca38", size = 438907 }, ] -[[package]] -name = "tqdm" -version = "4.67.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "colorama", marker = "sys_platform == 'win32'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/a8/4b/29b4ef32e036bb34e4ab51796dd745cdba7ed47ad142a9f4a1eb8e0c744d/tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2", size = 169737 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2", size = 78540 }, -] - [[package]] name = "traitlets" version = "5.14.3"