diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3e663823..95b09acc 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -99,7 +99,7 @@ jobs: clang-version: 21 cmake-args: -DBUILD_MQT_QUSAT_BINDINGS=ON files-changed-only: true - install-pkgs: "pybind11==3.0.1" + install-pkgs: "nanobind==2.10.2" setup-python: true setup-z3: true cpp-linter-extra-args: "-std=c++20" @@ -140,6 +140,7 @@ jobs: uses: munich-quantum-toolkit/workflows/.github/workflows/reusable-python-linter.yml@d6314c45667c131055a0389afc110e8dedc6da3f # v1.17.11 with: setup-z3: true + check-stubs: true build-sdist: name: 🚀 CD diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 59d74fea..8e189dff 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -130,7 +130,7 @@ repos: - id: disallow-caps name: Disallow improper capitalization language: pygrep - entry: PyBind|Numpy|Cmake|CCache|Github|PyTest|Mqt|Tum|MQTopt|MQTref + entry: Nanobind|Numpy|Cmake|CCache|Github|PyTest|Mqt|Tum|MQTopt|MQTref exclude: .pre-commit-config.yaml # Check best practices for scientific Python code diff --git a/CMakeLists.txt b/CMakeLists.txt index bcde7368..2def9fe1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -21,12 +21,14 @@ if(BUILD_MQT_QUSAT_BINDINGS) # ensure that the BINDINGS option is set set(BINDINGS ON - CACHE BOOL "Enable settings related to Python bindings" FORCE) - # cmake-lint: disable=C0103 + CACHE INTERNAL "Enable settings related to Python bindings") + # Some common settings for finding Python set(Python_FIND_VIRTUALENV FIRST CACHE STRING "Give precedence to virtualenvs when searching for Python") - # cmake-lint: disable=C0103 + set(Python_FIND_FRAMEWORK + LAST + CACHE STRING "Prefer Brew/Conda to Apple framework Python") set(Python_ARTIFACTS_INTERACTIVE ON CACHE BOOL "Prevent multiple searches for Python and instead cache the results.") @@ -37,7 +39,8 @@ if(BUILD_MQT_QUSAT_BINDINGS) endif() # top-level call to find Python - find_package(Python 3.10 REQUIRED COMPONENTS Interpreter Development.Module) + find_package(Python 3.10 REQUIRED COMPONENTS Interpreter Development.Module + ${SKBUILD_SABI_COMPONENT}) endif() # Add path for custom modules diff --git a/bindings/CMakeLists.txt b/bindings/CMakeLists.txt index 922ca835..ee61a68c 100644 --- a/bindings/CMakeLists.txt +++ b/bindings/CMakeLists.txt @@ -25,7 +25,7 @@ list( ${BASEPOINT}/../../core/lib ${BASEPOINT}/../../core/lib64) -add_mqt_python_binding( +add_mqt_python_binding_nanobind( QUSAT ${MQT_QUSAT_TARGET_NAME}-bindings bindings.cpp @@ -34,8 +34,8 @@ add_mqt_python_binding( INSTALL_DIR . LINK_LIBS - MQT::QuSAT - pybind11_json) + MQT::QuSAT) + target_compile_definitions(${MQT_QUSAT_TARGET_NAME}-bindings PRIVATE Z3_FOUND) # Install directive for scikit-build-core diff --git a/bindings/bindings.cpp b/bindings/bindings.cpp index 9cdc1b12..b86196f4 100644 --- a/bindings/bindings.cpp +++ b/bindings/bindings.cpp @@ -9,14 +9,16 @@ */ #include "SatEncoder.hpp" +#include "ir/QuantumComputation.hpp" -#include -#include -#include // IWYU pragma: keep +#include +#include // NOLINT(misc-include-cleaner) +#include // NOLINT(misc-include-cleaner) +#include // NOLINT(misc-include-cleaner) -namespace py = pybind11; namespace nl = nlohmann; -using namespace pybind11::literals; +namespace nb = nanobind; +using namespace nb::literals; nl::basic_json<> checkEquivalence(qc::QuantumComputation& qc1, qc::QuantumComputation& qc2, @@ -26,7 +28,8 @@ nl::basic_json<> checkEquivalence(qc::QuantumComputation& qc1, try { results["equivalent"] = encoder.testEqual(qc1, qc2, inputs); } catch (std::exception const& e) { - py::print("Could not check equivalence: ", e.what()); + nb::print( + ("Could not check equivalence: " + std::string(e.what())).c_str()); return {}; } results["statistics"] = encoder.getStats().to_json(); @@ -38,16 +41,33 @@ std::string printDIMACS(qc::QuantumComputation& qc) { return encoder.generateDIMACS(qc); } -PYBIND11_MODULE(MQT_QUSAT_MODULE_NAME, m, py::mod_gil_not_used()) { +NB_MODULE(MQT_QUSAT_MODULE_NAME, m) { + nb::module_::import_("mqt.core.ir"); + m.doc() = "Python interface for the MQT QuSAT quantum circuit satisfiability tool"; - m.def("check_equivalence", &checkEquivalence, - "Check the equivalence of two clifford circuits for the given inputs." - "If no inputs are given, the all zero state is used as input.", - "circ1"_a, "circ2"_a, "inputs"_a = std::vector()); + m.def( + "check_equivalence", + [](qc::QuantumComputation& circ1, qc::QuantumComputation& circ2, + const std::optional>& inputs) { + const nb::module_ json = nb::module_::import_("json"); + const nb::object loads = json.attr("loads"); + if (!inputs.has_value()) { + return loads( + checkEquivalence(circ1, circ2, std::vector{}) + .dump()); + } + return loads(checkEquivalence(circ1, circ2, inputs.value()).dump()); + }, + "circ1"_a, "circ2"_a, "inputs"_a = nb::none(), + nb::sig("def check_equivalence(circ1: mqt.core.ir.QuantumComputation, " + "circ2: mqt.core.ir.QuantumComputation, inputs: " + "collections.abc.Sequence[str] | None = None) " + "-> dict[str, typing.Any]"), + "Check the equivalence of two clifford circuits for the given inputs. " + "If no inputs are given, the all zero state is used as input."); - m.def("generate_dimacs", &printDIMACS, - "Output the DIMACS CNF representation from Z3 of the given circuit.", - "circ"_a); + m.def("generate_dimacs", &printDIMACS, "circ"_a, + "Output the DIMACS CNF representation from Z3 of the given circuit."); } diff --git a/cmake/ExternalDependencies.cmake b/cmake/ExternalDependencies.cmake index d0c3b3f3..0baf18b1 100644 --- a/cmake/ExternalDependencies.cmake +++ b/cmake/ExternalDependencies.cmake @@ -28,23 +28,15 @@ if(BUILD_MQT_QUSAT_BINDINGS) message(STATUS "Found mqt-core package: ${mqt-core_DIR}") endif() - if(NOT SKBUILD) - # Manually detect the installed pybind11 package. - execute_process( - COMMAND "${Python_EXECUTABLE}" -m pybind11 --cmakedir - OUTPUT_STRIP_TRAILING_WHITESPACE - OUTPUT_VARIABLE pybind11_DIR) - - # Add the detected directory to the CMake prefix path. - list(APPEND CMAKE_PREFIX_PATH "${pybind11_DIR}") - endif() - - # add pybind11 library - find_package(pybind11 3.0.1 CONFIG REQUIRED) + execute_process( + COMMAND "${Python_EXECUTABLE}" -m nanobind --cmake_dir + OUTPUT_STRIP_TRAILING_WHITESPACE + OUTPUT_VARIABLE nanobind_ROOT) + find_package(nanobind CONFIG REQUIRED) endif() # cmake-format: off -set(MQT_CORE_MINIMUM_VERSION 3.3.1 +set(MQT_CORE_MINIMUM_VERSION 3.4.0 CACHE STRING "MQT Core minimum version") set(MQT_CORE_VERSION 3.4.0 CACHE STRING "MQT Core version") @@ -72,14 +64,5 @@ if(BUILD_MQT_QUSAT_TESTS) list(APPEND FETCH_PACKAGES googletest) endif() -if(BUILD_MQT_QUSAT_BINDINGS) - # add pybind11_json library - FetchContent_Declare( - pybind11_json - GIT_REPOSITORY https://github.com/pybind/pybind11_json - FIND_PACKAGE_ARGS) - list(APPEND FETCH_PACKAGES pybind11_json) -endif() - # Make all declared dependencies available. FetchContent_MakeAvailable(${FETCH_PACKAGES}) diff --git a/noxfile.py b/noxfile.py index 0bc651fd..1361028b 100755 --- a/noxfile.py +++ b/noxfile.py @@ -21,6 +21,7 @@ import shutil import sys import tempfile +from pathlib import Path from typing import TYPE_CHECKING import nox @@ -173,5 +174,51 @@ def docs(session: nox.Session) -> None: ) +@nox.session(reuse_venv=True, venv_backend="uv") +def stubs(session: nox.Session) -> None: + """Generate type stubs for Python bindings using nanobind.""" + env = {"UV_PROJECT_ENVIRONMENT": session.virtualenv.location} + session.run( + "uv", + "sync", + "--no-dev", + "--group", + "build", + env=env, + ) + + package_root = Path(__file__).parent / "python" / "mqt" / "qusat" + + session.run( + "python", + "-m", + "nanobind.stubgen", + "--recursive", + "--include-private", + "--output-dir", + str(package_root), + "--module", + "mqt.qusat.pyqusat", + ) + + pyi_files = list(package_root.glob("**/*.pyi")) + + if not pyi_files: + session.warn("No .pyi files found") + return + + if shutil.which("prek") is None: + session.install("prek") + + # Allow both 0 (no issues) and 1 as success codes for fixing up stubs + success_codes = [0, 1] + session.run("prek", "run", "license-tools", "--files", *pyi_files, external=True, success_codes=success_codes) + session.run("prek", "run", "ruff-check", "--files", *pyi_files, external=True, success_codes=success_codes) + session.run("prek", "run", "ruff-format", "--files", *pyi_files, external=True, success_codes=success_codes) + + # Run ruff-check again to ensure everything is clean + session.run("prek", "run", "ruff-check", "--files", *pyi_files, external=True) + + if __name__ == "__main__": nox.main() diff --git a/pyproject.toml b/pyproject.toml index 7aa6351a..b5a7c247 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,9 +1,9 @@ [build-system] requires = [ - "pybind11>=3.0.1", + "nanobind>=2.10.2", "scikit-build-core>=0.11.6", "setuptools-scm>=9.2.2", - "mqt.core~=3.3.1", + "mqt.core~=3.4.0", ] build-backend = "scikit_build_core.build" @@ -40,7 +40,7 @@ classifiers = [ ] requires-python = ">=3.10" dependencies = [ - "mqt.core~=3.3.1", + "mqt.core~=3.4.0", ] dynamic = ["version"] @@ -63,6 +63,9 @@ wheel.install-dir = "mqt/qusat" # Explicitly set the package directory wheel.packages = ["python/mqt"] +# Enable Stable ABI builds for CPython 3.12+ +wheel.py-api = "cp312" + # Set required Ninja version ninja.version = ">=1.10" @@ -293,9 +296,9 @@ before-all = "/opt/python/cp311-cp311/bin/pip install z3-solver==4.12.6" repair-wheel-command = [ "export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/python/cp311-cp311/lib/python3.11/site-packages/z3/lib", """auditwheel repair -w {dest_dir} {wheel} \ - --exclude libmqt-core-ir.so.3.3 \ - --exclude libmqt-core-qasm.so.3.3 \ - --exclude libmqt-core-circuit-optimizer.so.3.3""", + --exclude libmqt-core-ir.so.3.4 \ + --exclude libmqt-core-qasm.so.3.4 \ + --exclude libmqt-core-circuit-optimizer.so.3.4""", ] [tool.cibuildwheel.macos] @@ -309,6 +312,11 @@ repair-wheel-command = """delvewheel repair -w {dest_dir} {wheel} --namespace-pk --exclude mqt-core-qasm.dll \ --exclude mqt-core-circuit-optimizer.dll""" +[[tool.cibuildwheel.overrides]] +select = "cp312-*" +inherit.repair-wheel-command = "append" +repair-wheel-command = "uvx abi3audit --strict --report {wheel}" + [tool.uv] required-version = ">=0.6.9" @@ -324,10 +332,10 @@ mqt-qusat = { workspace = true } [dependency-groups] build = [ - "pybind11>=3.0.1", + "nanobind>=2.10.2", "scikit-build-core>=0.11.6", "setuptools-scm>=9.2.2", - "mqt.core~=3.3.1", + "mqt.core~=3.4.0", ] docs = [ "furo>=2025.09.25", diff --git a/python/mqt/qusat/pyqusat.pyi b/python/mqt/qusat/pyqusat.pyi index 4bc88b12..098a6945 100644 --- a/python/mqt/qusat/pyqusat.pyi +++ b/python/mqt/qusat/pyqusat.pyi @@ -6,14 +6,15 @@ # # Licensed under the MIT License +from collections.abc import Sequence from typing import Any -from mqt.core.ir import QuantumComputation +import mqt.core.ir def check_equivalence( - circ1: QuantumComputation, - circ2: QuantumComputation, -) -> dict[str, Any]: ... -def generate_dimacs( - circ: QuantumComputation, -) -> str: ... + circ1: mqt.core.ir.QuantumComputation, circ2: mqt.core.ir.QuantumComputation, inputs: Sequence[str] | None = None +) -> dict[str, Any]: + """Check the equivalence of two clifford circuits for the given inputs. If no inputs are given, the all zero state is used as input.""" + +def generate_dimacs(circ: mqt.core.ir.QuantumComputation) -> str: + """Output the DIMACS CNF representation from Z3 of the given circuit.""" diff --git a/uv.lock b/uv.lock index 8f32b4fb..af9ae2fe 100644 --- a/uv.lock +++ b/uv.lock @@ -1023,52 +1023,34 @@ wheels = [ [[package]] name = "mqt-core" -version = "3.3.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/69/b9/52f64b0bf94496d2b5bb59e0ebd3b185b8f962448995e3ddf33381b60c91/mqt_core-3.3.3.tar.gz", hash = "sha256:019039e3643f3e3c02bd3cd4cdc71769e1682280382a2753a7f80781991af4ab", size = 573713, upload-time = "2025-11-10T23:18:35.186Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/46/0d/1880eb0ad2e01eabebe23fae0c3c27fffbb6feba8a7cd89b92a038f8a9fe/mqt_core-3.3.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fde7f0082fe37af2fc00357644bf92c2c0f97b1d931ddaebbee3c238788acb46", size = 6040209, upload-time = "2025-11-10T23:17:14.024Z" }, - { url = "https://files.pythonhosted.org/packages/e8/8c/b3892f6ab7b530ffc779d1bce7cf599bf49ecf6648ea94f5d2423c2a7f8b/mqt_core-3.3.3-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:bafd36247ab70e1162f5cc855250f6ab9dcb6d3527714f76d7dcc3d57540d6b5", size = 6381139, upload-time = "2025-11-10T23:17:16.184Z" }, - { url = "https://files.pythonhosted.org/packages/b6/04/55e7527fac3c7f0764e63e69749da219109093c0af6357d3dacb5e6b381c/mqt_core-3.3.3-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b68d14e3120c1b181ab7c80794197ae58130a3f944f51487e31a7feed7bfdf73", size = 8152582, upload-time = "2025-11-10T23:17:18.431Z" }, - { url = "https://files.pythonhosted.org/packages/93/4d/51641842862ee482161c3acc4b800f846e3828f45c0df6a9ebdeed981f4f/mqt_core-3.3.3-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ab5f113b8d28063cc2b6bc37dee8f81cb29f9ee863577c9fe36bd0ff01355cab", size = 8557442, upload-time = "2025-11-10T23:17:20.249Z" }, - { url = "https://files.pythonhosted.org/packages/30/1b/d1f4dbe7423b9c3bf88f7ec1cc94bc2474c30f93074a4094dd73aa66d29f/mqt_core-3.3.3-cp310-cp310-win_amd64.whl", hash = "sha256:c4989544d7c6e545a6976d97351d113e37526e05a1c826107965f2c74acf847d", size = 4308521, upload-time = "2025-11-10T23:17:22.173Z" }, - { url = "https://files.pythonhosted.org/packages/2c/16/329cf09d804ba211bbe1808fffb34d172f092aa53d896f3880efbafbc519/mqt_core-3.3.3-cp310-cp310-win_arm64.whl", hash = "sha256:b18b89039d5cc4f8656413af25aff33516ee90247e979832e62cb8297732a16e", size = 4432160, upload-time = "2025-11-10T23:17:24.612Z" }, - { url = "https://files.pythonhosted.org/packages/9f/df/2c342969af601ce0d58826f59681ce123c936c55e68d6b6ecd1b51c424e8/mqt_core-3.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:83154e0c739c29e48c8d999a64b3c843d92f3319518b0efeff91b554a5138021", size = 6044138, upload-time = "2025-11-10T23:17:26.45Z" }, - { url = "https://files.pythonhosted.org/packages/76/92/a1912510e6b4f5e1f6839117a3b9b265e522fa4626aaebc1e875c7439f9d/mqt_core-3.3.3-cp311-cp311-macosx_11_0_x86_64.whl", hash = "sha256:9f4016b6e24c0685acbfa2ea7284eeb2d6a527b3dfb81f08a14498ad6b9edfbe", size = 6386057, upload-time = "2025-11-10T23:17:28.433Z" }, - { url = "https://files.pythonhosted.org/packages/6f/d2/66b5b108176591cadb20f632ecfc76cb4771c6fb6528c4ecc7f20595fcd4/mqt_core-3.3.3-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:56899315ee2fc28ee66431e51258ad372384167d7046670e0d478d57bdf8f130", size = 8154908, upload-time = "2025-11-10T23:17:30.266Z" }, - { url = "https://files.pythonhosted.org/packages/ce/0b/9f317439d986f59805912ce432cab8a5dd71636a783ecd191687eb2fb51f/mqt_core-3.3.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:170a65554e2e969ac1d8868dc6d66dc9f6fa56558980001e55e98b45af72c902", size = 8559256, upload-time = "2025-11-10T23:17:32.495Z" }, - { url = "https://files.pythonhosted.org/packages/69/c7/fa22c7eead964ea35366001c48eed2d8f0321ae8e3d065a1dcc4100b4c14/mqt_core-3.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:7690ab2ae876ad53eb0fcf4679b2a8d7ac0373f9f16243f392d6d2c74b9e82f1", size = 4311202, upload-time = "2025-11-10T23:17:35.004Z" }, - { url = "https://files.pythonhosted.org/packages/0e/c2/6c17d6e0bb179281c1673ced4697b71a72b944c5248689f3260713cce9bd/mqt_core-3.3.3-cp311-cp311-win_arm64.whl", hash = "sha256:ceb462aecfc92faa8c3bb27bb668ddc2ee09d33d0315dc7b3ac5b2e8f4d6d53a", size = 4436130, upload-time = "2025-11-10T23:17:36.658Z" }, - { url = "https://files.pythonhosted.org/packages/7c/09/0499c783b008a22c6a6cc8d4b8a3c558129c1a42bb54cde08bf7432c38b6/mqt_core-3.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:95d4d75ae1f8a8d8efef859a83aa300ab3a9607ba1bc7e6ad9d3c1c5a6fa77f4", size = 6097127, upload-time = "2025-11-10T23:17:38.615Z" }, - { url = "https://files.pythonhosted.org/packages/d7/07/ed7c402ca76e63ad03fa839da989972f1d8db6bf92bfe01c7731fd7dcdd3/mqt_core-3.3.3-cp312-cp312-macosx_11_0_x86_64.whl", hash = "sha256:9b5d2b95276c2e6df67d324d0f2b23b6d3cea6be9d95535c0b1e49ffeec82d57", size = 6445438, upload-time = "2025-11-10T23:17:40.488Z" }, - { url = "https://files.pythonhosted.org/packages/29/6b/d13deb36be8f1600b107eec65ea94a039af4f135aaf414bb8fa227bae46d/mqt_core-3.3.3-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:406fc83525a1ca07a28830c3a97d243c18b74725f55bd40f0712a048be61dba4", size = 8156427, upload-time = "2025-11-10T23:17:42.329Z" }, - { url = "https://files.pythonhosted.org/packages/e3/62/b053d11b5725850f0959e5ad4b7e4234e8c97ab8a848dbce3f63371b5f3d/mqt_core-3.3.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4376d114dba2d74d08ca908074a307ef1e2e80b0c7b1c50f938d446eede0f116", size = 8561379, upload-time = "2025-11-10T23:17:44.718Z" }, - { url = "https://files.pythonhosted.org/packages/98/62/f62c6cca399c65096daa5b5212d76af25517012bd56d1fdc6eff25ea98c7/mqt_core-3.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:5d4af39f82efb0c29773ae4ae21a338aefc8db30dc4ef97835bc7e6f929c91d2", size = 4317083, upload-time = "2025-11-10T23:17:47.118Z" }, - { url = "https://files.pythonhosted.org/packages/1c/bd/0a7d3b40d5f4c7049ed626ec8e78c2cad01957e8bc00619ac825007205ec/mqt_core-3.3.3-cp312-cp312-win_arm64.whl", hash = "sha256:7ffb61ae1ceb12060fb1dfefb7082c63af807caf5ff23e955dc4f12089e24bee", size = 4438407, upload-time = "2025-11-10T23:17:48.937Z" }, - { url = "https://files.pythonhosted.org/packages/a9/81/2d5137461b05495392d5675e009a47040dec38d0a9fc38d3f2221393959c/mqt_core-3.3.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a83471adb84c1976b0e3ff15f6c8e0384972d7e313b42c66ac3a3848551d3a6f", size = 6097200, upload-time = "2025-11-10T23:17:50.951Z" }, - { url = "https://files.pythonhosted.org/packages/83/9b/0c0f34c4433f518134e32675f03d80545dcf8da37740949319ec4fe50ce0/mqt_core-3.3.3-cp313-cp313-macosx_11_0_x86_64.whl", hash = "sha256:6c4b57623ed88ec331069a7af8dcfba204868480d3e87032cc65da01e135e900", size = 6445754, upload-time = "2025-11-10T23:17:52.735Z" }, - { url = "https://files.pythonhosted.org/packages/12/1b/c46710d10df4332615c6e224db8958b042d5bd6bf81b09ec1c8fcc68770a/mqt_core-3.3.3-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3e5cb758d9919a9941ee538af6642cb8ca6cb49a692f996b895f602462821fb3", size = 8156529, upload-time = "2025-11-10T23:17:54.533Z" }, - { url = "https://files.pythonhosted.org/packages/23/e4/42690d370f232274ccb8965ef81e7aa432e4b59687da5f04224d2368a18e/mqt_core-3.3.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:16ebe8683b11c7cbeaed37972c4c1d740f47becee6a41586fab186e74e41c319", size = 8561593, upload-time = "2025-11-10T23:17:56.752Z" }, - { url = "https://files.pythonhosted.org/packages/83/48/39d2b7a952a063a07b575365c1575cc899a6c2d0f0ea6b7708475724db8c/mqt_core-3.3.3-cp313-cp313-win_amd64.whl", hash = "sha256:99530d5c87623dbd9d7942578998439594a1e8230374f46b4aac2e6fc379882e", size = 4317075, upload-time = "2025-11-10T23:17:58.68Z" }, - { url = "https://files.pythonhosted.org/packages/8c/4a/2410e50861c8318698c6b65fcf2a120f2a851aaa991e286382ea80107ed9/mqt_core-3.3.3-cp313-cp313-win_arm64.whl", hash = "sha256:6190b176172e0e11259ad74e98ab3ab5b78fea710c49260f542f458e3ab1bef9", size = 4438384, upload-time = "2025-11-10T23:18:00.346Z" }, - { url = "https://files.pythonhosted.org/packages/4f/85/1618dbae0128645a6a2a18e1195eaf3c69ed1ffc2a526539cbbb59a04f55/mqt_core-3.3.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:94d76c9a2a2802243cda29e90ec4260715f4e971d34dba9b5e92aa03931f6f8e", size = 6115519, upload-time = "2025-11-10T23:18:02.023Z" }, - { url = "https://files.pythonhosted.org/packages/9e/78/cad40e452e3770b68bb0f0ac0f6ecbf9453e3898b1463dfffa63f5534094/mqt_core-3.3.3-cp313-cp313t-macosx_11_0_x86_64.whl", hash = "sha256:ae7fc758f209e0925378ce308de32922eadf73e1d8e9c02c05fff2be2268aca4", size = 6472221, upload-time = "2025-11-10T23:18:04.26Z" }, - { url = "https://files.pythonhosted.org/packages/82/05/820fb315976cf3b23b2bd3399f4c0f0dd36e6ea06bc4087242ba00e8cd5e/mqt_core-3.3.3-cp313-cp313t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:14cdf40be95933f26c342e7f3ecbe389a96d85875f116b8af02388a9b845697d", size = 8165519, upload-time = "2025-11-10T23:18:05.966Z" }, - { url = "https://files.pythonhosted.org/packages/23/77/bd7afbe5755870914cabd795ce6fcb1fbcbb6a24f4a81fc3b2adc2d4099f/mqt_core-3.3.3-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9b23f5845dd966315557ab9d56a249e2269bd211053bcff1f521a76ce8543adc", size = 8570617, upload-time = "2025-11-10T23:18:07.689Z" }, - { url = "https://files.pythonhosted.org/packages/5c/9b/4bfcdee654ef11345705c6b6dd909a89872685203d0d5ff4aeefd60c52d3/mqt_core-3.3.3-cp313-cp313t-win_amd64.whl", hash = "sha256:16d4aba78a246eb40e27dddd1b740d175591ee83daaea7fbe1359f5fd237fece", size = 4366876, upload-time = "2025-11-10T23:18:09.715Z" }, - { url = "https://files.pythonhosted.org/packages/b0/3a/72544dec851e0c8540998c24274933d02df2b9ab7bba000358bb27813e79/mqt_core-3.3.3-cp313-cp313t-win_arm64.whl", hash = "sha256:75ba22ba8061bd404098e4ad0b90d3cb9d866e0e7946e37c7997602632775804", size = 4464509, upload-time = "2025-11-10T23:18:11.715Z" }, - { url = "https://files.pythonhosted.org/packages/5a/02/1d94f921b6d84268b8a33095bbbff8c5220610be2ce419f5b0a6c759e7dd/mqt_core-3.3.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:9c08ee6253af6f56c60c23ddd907eb6abce1d9620c06b8916682038389984d86", size = 6098681, upload-time = "2025-11-10T23:18:13.733Z" }, - { url = "https://files.pythonhosted.org/packages/c4/57/967bf7c971b2820fa30924c605497502fd549e68d6ddbd5dea90784d93f8/mqt_core-3.3.3-cp314-cp314-macosx_11_0_x86_64.whl", hash = "sha256:45fa41bb2c60ebc25337631bd556360fff6ede410796048ea067d8011cff2976", size = 6448267, upload-time = "2025-11-10T23:18:15.412Z" }, - { url = "https://files.pythonhosted.org/packages/2f/25/bbd13143d2bb3b2b7ba7bfbfa7fd82e044d3df30347fc979e93c4fea163d/mqt_core-3.3.3-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f290acbb492710debf175cea0106ec1fefcad39c38575cb78ed6d3ecae658207", size = 8156649, upload-time = "2025-11-10T23:18:17.014Z" }, - { url = "https://files.pythonhosted.org/packages/c9/87/4fb270039ac3f98b17e8603e3fd1456b55c73d59f9f588fb6d24f7398494/mqt_core-3.3.3-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:084b08dca96d631db7913dbf787677bf82707756436ba21a78c0af96c50631be", size = 8561701, upload-time = "2025-11-10T23:18:19.283Z" }, - { url = "https://files.pythonhosted.org/packages/64/55/785af2b4767497104f70cb0096cc07edc870442edaa90a88fad8e57a61ea/mqt_core-3.3.3-cp314-cp314-win_amd64.whl", hash = "sha256:6ea8d568e92d6767ca72f9ecda2f3e9c0ceb7e9c3eed18b009ac8844bdb0dd32", size = 4377634, upload-time = "2025-11-10T23:18:21.67Z" }, - { url = "https://files.pythonhosted.org/packages/8c/98/a9ff5139b674e3161a838cd4b980111ef162dbe5810d23d98c53fa35db73/mqt_core-3.3.3-cp314-cp314-win_arm64.whl", hash = "sha256:f9726936062c2dd1b975a6172e7065eed2224a814a40f5e72dc2d62dbae45730", size = 4502319, upload-time = "2025-11-10T23:18:23.301Z" }, - { url = "https://files.pythonhosted.org/packages/a3/80/36ffcd92ed7ef2bafd69e2ccef6d4856dc4585dcdd5a3a2029ea5692a86d/mqt_core-3.3.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:46c5cf993b77aa96fc1e58bd305bb32caeae0d3785cf40a8f5c0dde1c279d9ed", size = 6115514, upload-time = "2025-11-10T23:18:24.961Z" }, - { url = "https://files.pythonhosted.org/packages/d6/47/63a1a8550b9fd89b7f888a493a29dac3edd2aa591c3c17a41bec6f2d35e8/mqt_core-3.3.3-cp314-cp314t-macosx_11_0_x86_64.whl", hash = "sha256:b9b95fb3bb66c4d40423a4803534334e79890d481b5d4633295c9aceebf4610b", size = 6472251, upload-time = "2025-11-10T23:18:26.626Z" }, - { url = "https://files.pythonhosted.org/packages/7a/fb/3c0076d1700a2e9b3ac2d7ebc726bdb6b0b8eb767e3dc594b8de340f3417/mqt_core-3.3.3-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f1872ed53ba11c583d0e79b476c16c135cd4dda930f7c41933a198514fa790ec", size = 8165472, upload-time = "2025-11-10T23:18:28.48Z" }, - { url = "https://files.pythonhosted.org/packages/dc/5f/2e76b3e4692a804a125a3bc36bb8cc4808a2ee474d953231c2ca35960c1a/mqt_core-3.3.3-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b40f0caab3489aa718f9e1ad95f66f76d43c28aa8b8fa1ff0181d5bfb2dc2e85", size = 8570635, upload-time = "2025-11-10T23:18:30.209Z" }, - { url = "https://files.pythonhosted.org/packages/f8/4c/50064cb72bd8f3602090bc4fd4d4516d2c992b3a6610cb6e43a6affaa9f7/mqt_core-3.3.3-cp314-cp314t-win_amd64.whl", hash = "sha256:22277b27c865b5aceee792b7a43a4a860459df613034187948226a916426c198", size = 4440028, upload-time = "2025-11-10T23:18:32.145Z" }, - { url = "https://files.pythonhosted.org/packages/55/5f/e9f70f6ffdae5788f67d2b28bcc5f91551400a7ccb9d22bd8c8145ff5077/mqt_core-3.3.3-cp314-cp314t-win_arm64.whl", hash = "sha256:c62ccd3f1b777a846521a574d8aa85f60b484318df445147342bea4ca67af490", size = 4525130, upload-time = "2025-11-10T23:18:33.734Z" }, +version = "3.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/bb/6d/c3b4f17a8e695d715379ad298d0e51790ad7e2a60f0f68f1c08703ca8beb/mqt_core-3.4.0.tar.gz", hash = "sha256:daa752050e1001cb72e7cc1fd0c0aeff8a526aefae29e414b26920739a4aa681", size = 633636, upload-time = "2026-01-08T22:08:41.588Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/16/9b/960d498f34f88df402a7b76a18eec8113c86f8c233eba7313a9e1530dff6/mqt_core-3.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c58e5d223d2f59ff9146970b8a5202e07718dd3ce2191291469b347019ced674", size = 5114257, upload-time = "2026-01-08T22:08:01.23Z" }, + { url = "https://files.pythonhosted.org/packages/b7/f0/8bbf1160a26f99799556a73a150873522ccb824cc45f3e9fdac44ecbd6a2/mqt_core-3.4.0-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:30176b938ae76544cf70be31cdddbf2de8c83d8035af7f39ce11d5dd46c77b4c", size = 5547616, upload-time = "2026-01-08T22:08:03.399Z" }, + { url = "https://files.pythonhosted.org/packages/c7/78/19b0395b9568dc2d76056a998516adeed3775f98750a7a9bd988851be194/mqt_core-3.4.0-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:59fcd0711f49517c612946225c3b588448f8e0683f2a7aca596e7bc0eb48ed03", size = 6572454, upload-time = "2026-01-08T22:08:06.308Z" }, + { url = "https://files.pythonhosted.org/packages/c4/08/ae8859715f9eb6c16b707064fc0ea1171f3bc7804175b642b85571e4ef01/mqt_core-3.4.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0bd27347bfd1310e4496c4f79a72076bb2638425968efd0724a3a2cbf0025b9b", size = 6991090, upload-time = "2026-01-08T22:08:08.201Z" }, + { url = "https://files.pythonhosted.org/packages/68/7a/4e413df061c1fa788205abeaff27ec5f40cb786403145fc505bc5a1b8d47/mqt_core-3.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:e49fd8f7b9ef12e4ebeed98a4bf8347559e938a0caec2f0b952e8a760cc4c60b", size = 3972046, upload-time = "2026-01-08T22:08:10.118Z" }, + { url = "https://files.pythonhosted.org/packages/eb/d7/8b5b7cd47df3bd1191bc58ce78dee23f0b6ac594e499121a984643ea9b55/mqt_core-3.4.0-cp310-cp310-win_arm64.whl", hash = "sha256:e1edc694f169b0f7b2a79b397efa6268349cddf94cbc396586c2cd68457bacfa", size = 3973622, upload-time = "2026-01-08T22:08:11.665Z" }, + { url = "https://files.pythonhosted.org/packages/40/16/4a82f02632d4cc22070490399f37f5a0019d0e669c9c0f610283e0a54b29/mqt_core-3.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:33cf21ad638892fa2fc6913840dca1e50cc531776c7f6b2fdb3cee0bad6004f1", size = 5115319, upload-time = "2026-01-08T22:08:13.483Z" }, + { url = "https://files.pythonhosted.org/packages/60/d9/3bdb720b99764a7ab3da8f103ccdb5d20cc069c893503d11f018716b7d06/mqt_core-3.4.0-cp311-cp311-macosx_11_0_x86_64.whl", hash = "sha256:226eab23b0b53a0018a435001a5d34b362bed8f7659939155e3ec58042b333d4", size = 5548833, upload-time = "2026-01-08T22:08:15.518Z" }, + { url = "https://files.pythonhosted.org/packages/90/df/e3b6ef95b7181c9455689325da68e5befb7faa1f01cc19106435909ee9a6/mqt_core-3.4.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:31846c555f23b9f7a710f9a70fc1882bd63d3bd19430488912f543debc4e646a", size = 6573090, upload-time = "2026-01-08T22:08:16.992Z" }, + { url = "https://files.pythonhosted.org/packages/e1/2e/484b9d559263301412bb7da49b5939b15fcef27f3c6c7a743f61ed2fbeb2/mqt_core-3.4.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:10d2c477c74fc873d442df27434586011d4749a159cb388bb49daf4f89ac4ca5", size = 6991703, upload-time = "2026-01-08T22:08:18.806Z" }, + { url = "https://files.pythonhosted.org/packages/fc/67/4b7929ff1c8d7c127fd2aac0d2d51580a8c177d066d6b7288bedfdaea03e/mqt_core-3.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:d759f38cf09dfdd822f170262b395b76bdd4da2144dc5fd8a4a1d8346f5c0cc2", size = 3972643, upload-time = "2026-01-08T22:08:20.2Z" }, + { url = "https://files.pythonhosted.org/packages/d8/e4/2640e3ae0e1eab43aaf0fca2fc4fdcd098059cf1f86b9b6ddd7a3044c72a/mqt_core-3.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:ba9f687a96f6e42fd019e6098a7e54867d0173727613fbce92a893dd1f8f6950", size = 3974154, upload-time = "2026-01-08T22:08:21.596Z" }, + { url = "https://files.pythonhosted.org/packages/e1/86/0973049ec3f15ae9e47bb3a5d0222110c26ef86da336932575403fe63f77/mqt_core-3.4.0-cp312-abi3-macosx_11_0_arm64.whl", hash = "sha256:df2d6cb96de949d90d5051dd8c85354cce308207d655ee2365c92f5adcea135d", size = 5111559, upload-time = "2026-01-08T22:08:23.068Z" }, + { url = "https://files.pythonhosted.org/packages/23/da/eabcece4479a59753ab51a9a259146419d5cb2a7547de7f7fde7214c5900/mqt_core-3.4.0-cp312-abi3-macosx_11_0_x86_64.whl", hash = "sha256:bad7520308ea3dc528305b5e0610bc2053b67a6c7526a69bf69bda62551c4ef9", size = 5545608, upload-time = "2026-01-08T22:08:24.578Z" }, + { url = "https://files.pythonhosted.org/packages/6e/28/39d9bf7563c48a1bb77fc1f489cc757e92fe25dffd931c909ff31dfcecaa/mqt_core-3.4.0-cp312-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f86da5c06dd16e90ecfed2e328e655153e0cf336a6bb75effa74071a85d16f2f", size = 6559438, upload-time = "2026-01-08T22:08:26.058Z" }, + { url = "https://files.pythonhosted.org/packages/ff/a4/c61d64b69d5801d4cd4da23bb20042828e78d4ce9274f13032a5ca838981/mqt_core-3.4.0-cp312-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b0b37033ac2a1e8325257d649f7014ccbbe516a2004541008cfca18f89124ff4", size = 6975946, upload-time = "2026-01-08T22:08:27.679Z" }, + { url = "https://files.pythonhosted.org/packages/a3/47/aa597c38630ddcfed4482f381bb7970c3186fe189fdd6463d2171c55554d/mqt_core-3.4.0-cp312-abi3-win_amd64.whl", hash = "sha256:3c67121831eb9a6a82fb857148220d792463893063a6145f347a73d208d2b63c", size = 3965527, upload-time = "2026-01-08T22:08:29.246Z" }, + { url = "https://files.pythonhosted.org/packages/d7/3f/b5970789acb4ac81efbf584c0e71341c61fec6a1fba8a37dffd8fdc6c37e/mqt_core-3.4.0-cp312-abi3-win_arm64.whl", hash = "sha256:dcd597ff11027bdccecb243b9bf9055e7a8bc5f92af51349bd9a3051f6bd3c89", size = 3967823, upload-time = "2026-01-08T22:08:30.593Z" }, + { url = "https://files.pythonhosted.org/packages/84/e5/5f7c5e760446ee0f820425de983c3f3476a5c6ab2fd8909f19941f808895/mqt_core-3.4.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:545b8fe227d07d9c7c80868392dc9bb5c8902734809c3dafc565fd684dd785b2", size = 5125079, upload-time = "2026-01-08T22:08:32.107Z" }, + { url = "https://files.pythonhosted.org/packages/8a/fb/bafce65cbb74013df50b8c841bcefda9ab436965f7f7257c3c90c69c0b90/mqt_core-3.4.0-cp314-cp314t-macosx_11_0_x86_64.whl", hash = "sha256:3068fadbf7512d11f9ecb18e1e1785658657cd7b00759f1bfc67948d4af311fc", size = 5560107, upload-time = "2026-01-08T22:08:33.759Z" }, + { url = "https://files.pythonhosted.org/packages/90/a7/736986cfdc0ebe3a74f2c732156484a6349a02dc389e0b6f7e997dcfbdee/mqt_core-3.4.0-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8dbf325a30580cf2951774b3ab7fa539b7272a5a173ba25b98c753aac4faff66", size = 6584391, upload-time = "2026-01-08T22:08:35.16Z" }, + { url = "https://files.pythonhosted.org/packages/fc/9b/d16f996c915b23d8a58d74433dc1fbee55dbe0b40515c4a8e70a3c7f64f7/mqt_core-3.4.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:485a5133698c70c02430170bab46b88d24dd4188d6c63ebb3c91bdd3ccd7f782", size = 7000710, upload-time = "2026-01-08T22:08:36.735Z" }, + { url = "https://files.pythonhosted.org/packages/b6/38/232705301ea975356e06bed18e152424b5f48919961aa862275627689b1c/mqt_core-3.4.0-cp314-cp314t-win_amd64.whl", hash = "sha256:2f51451a78b8fd4cb55c4a4d9b23f97c806305e699d313178fa3c8b9952fe558", size = 4061549, upload-time = "2026-01-08T22:08:38.884Z" }, + { url = "https://files.pythonhosted.org/packages/24/61/2b6e1ce9f3747d8cd336ff73a084ac1b5771111889467de214dbca3af8c0/mqt_core-3.4.0-cp314-cp314t-win_arm64.whl", hash = "sha256:e6f1765f3569a533af790fbaee2c7a21a0a4b34611ff914b17a6c4dfdea08120", size = 4048399, upload-time = "2026-01-08T22:08:40.279Z" }, ] [[package]] @@ -1086,15 +1068,15 @@ qiskit = [ [package.dev-dependencies] build = [ { name = "mqt-core" }, - { name = "pybind11" }, + { name = "nanobind" }, { name = "scikit-build-core" }, { name = "setuptools-scm" }, ] dev = [ { name = "mqt-core" }, + { name = "nanobind" }, { name = "nox" }, { name = "numpy", version = "2.4.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.13'" }, - { name = "pybind11" }, { name = "pytest" }, { name = "pytest-cov" }, { name = "pytest-sugar" }, @@ -1126,24 +1108,24 @@ test = [ [package.metadata] requires-dist = [ - { name = "mqt-core", specifier = "~=3.3.1" }, + { name = "mqt-core", specifier = "~=3.4.0" }, { name = "qiskit", extras = ["qasm3-import"], marker = "extra == 'qiskit'", specifier = ">=1.0.0" }, ] provides-extras = ["qiskit"] [package.metadata.requires-dev] build = [ - { name = "mqt-core", specifier = "~=3.3.1" }, - { name = "pybind11", specifier = ">=3.0.1" }, + { name = "mqt-core", specifier = "~=3.4.0" }, + { name = "nanobind", specifier = ">=2.10.2" }, { name = "scikit-build-core", specifier = ">=0.11.6" }, { name = "setuptools-scm", specifier = ">=9.2.2" }, ] dev = [ - { name = "mqt-core", specifier = "~=3.3.1" }, + { name = "mqt-core", specifier = "~=3.4.0" }, + { name = "nanobind", specifier = ">=2.10.2" }, { name = "nox", specifier = ">=2025.11.12" }, { name = "numpy", marker = "python_full_version >= '3.13'", specifier = ">=2.1" }, { name = "numpy", marker = "python_full_version >= '3.14'", specifier = ">=2.3.2" }, - { name = "pybind11", specifier = ">=3.0.1" }, { name = "pytest", specifier = ">=9.0.1" }, { name = "pytest-cov", specifier = ">=7.0.0" }, { name = "pytest-sugar", specifier = ">=1.1.1" }, @@ -1215,6 +1197,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/5f/df/76d0321c3797b54b60fef9ec3bd6f4cfd124b9e422182156a1dd418722cf/myst_parser-4.0.1-py3-none-any.whl", hash = "sha256:9134e88959ec3b5780aedf8a99680ea242869d012e8821db3126d427edc9c95d", size = 84579, upload-time = "2025-02-12T10:53:02.078Z" }, ] +[[package]] +name = "nanobind" +version = "2.10.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d1/7b/818fe4f6d1fdd516a14386ba86f2cbbac1b7304930da0f029724e9001658/nanobind-2.10.2.tar.gz", hash = "sha256:08509910ce6d1fadeed69cb0880d4d4fcb77739c6af9bd8fb4419391a3ca4c6b", size = 993651, upload-time = "2025-12-10T10:55:32.335Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/14/06/cb08965f985a5e1b9cb55ed96337c1f6daaa6b9cbdaeabe6bb3f7a1a11df/nanobind-2.10.2-py3-none-any.whl", hash = "sha256:6976c1b04b90481d2612b346485a3063818c6faa5077fe9d8bbc9b5fbe29c380", size = 246514, upload-time = "2025-12-10T10:55:30.741Z" }, +] + [[package]] name = "nbclient" version = "0.10.4" @@ -1552,15 +1543,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0", size = 11842, upload-time = "2024-07-21T12:58:20.04Z" }, ] -[[package]] -name = "pybind11" -version = "3.0.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/2f/7b/a6d8dcb83c457e24a9df1e4d8fd5fb8034d4bbc62f3c324681e8a9ba57c2/pybind11-3.0.1.tar.gz", hash = "sha256:9c0f40056a016da59bab516efb523089139fcc6f2ba7e4930854c61efb932051", size = 546914, upload-time = "2025-08-22T20:09:27.265Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/cd/8a/37362fc2b949d5f733a8b0f2ff51ba423914cabefe69f1d1b6aab710f5fe/pybind11-3.0.1-py3-none-any.whl", hash = "sha256:aa8f0aa6e0a94d3b64adfc38f560f33f15e589be2175e103c0a33c6bce55ee89", size = 293611, upload-time = "2025-08-22T20:09:25.235Z" }, -] - [[package]] name = "pybtex" version = "0.25.1"