From ebd42ce0488c7b6377791a18f1e229421854b9ef Mon Sep 17 00:00:00 2001 From: Daniel Haag <121057143+denialhaag@users.noreply.github.com> Date: Tue, 14 Oct 2025 00:25:21 +0200 Subject: [PATCH 1/3] =?UTF-8?q?=F0=9F=91=B7=20Enable=20testing=20on=20Pyth?= =?UTF-8?q?on=203.14?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/cd.yml | 2 +- noxfile.py | 4 +- pyproject.toml | 5 + uv.lock | 210 +++++++++++++++++++++++---------------- 4 files changed, 131 insertions(+), 90 deletions(-) diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index 5b783b0a..d22f9759 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -37,5 +37,5 @@ jobs: - name: Generate artifact attestation for sdist and wheel(s) uses: actions/attest@59d89421af93a897026c735860bf21b6eb4f7b26 # v4.1.0 with: - subject-path: "dist/*" + subject-path: dist/* - uses: pypa/gh-action-pypi-publish@cef221092ed1bacb1cc03d23a2d87d1d172e277b # v1.14.0 diff --git a/noxfile.py b/noxfile.py index 229099d0..69a77a53 100755 --- a/noxfile.py +++ b/noxfile.py @@ -30,9 +30,7 @@ nox.options.default_venv_backend = "uv" -# TODO(denialhaag): Add 3.14 when all dependencies support it -# https://github.com/munich-quantum-toolkit/qecc/issues/464 -PYTHON_ALL_VERSIONS = ["3.10", "3.11", "3.12", "3.13"] +PYTHON_ALL_VERSIONS = ["3.10", "3.11", "3.12", "3.13", "3.14"] if os.environ.get("CI", None): nox.options.error_on_missing_interpreters = True diff --git a/pyproject.toml b/pyproject.toml index bd4f4d85..ca14bb9c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -42,6 +42,7 @@ classifiers = [ "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", + "Programming Language :: Python :: 3.14", "Topic :: Scientific/Engineering :: Electronic Design Automation (EDA)", "Typing :: Typed", ] @@ -51,12 +52,16 @@ dependencies = [ "numpy>=1.24.1", "numpy>=1.26; python_version >= '3.12'", "numpy>=2.1; python_version >= '3.13'", + "numpy>=2.3.2; python_version >= '3.14'", "numba>=0.57", "numba>=0.59; python_version >= '3.12'", "numba>=0.61; python_version >= '3.13'", + "numba>=0.63.1; python_version >= '3.14'", "scipy>=1.15.2", + "scipy>=1.16.1; python_version >= '3.14'", "z3-solver>=4.15.3", "multiprocess>=0.70.17", + "multiprocess>=0.70.19; python_version >= '3.14'", "ldpc>=2.3.10", "stim>=1.14.0", "pymatching>=2.2.2", diff --git a/uv.lock b/uv.lock index 78b77e29..ffd55979 100644 --- a/uv.lock +++ b/uv.lock @@ -159,11 +159,11 @@ wheels = [ [[package]] name = "certifi" -version = "2026.4.22" +version = "2026.5.20" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/25/ee/6caf7a40c36a1220410afe15a1cc64993a1f864871f698c0f93acb72842a/certifi-2026.4.22.tar.gz", hash = "sha256:8d455352a37b71bf76a79caa83a3d6c25afee4a385d632127b6afb3963f1c580", size = 137077, upload-time = "2026-04-22T11:26:11.191Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/ce/ee2ecad540810a79593028e88299baeae54d346cc7a0d94b6199988b89b1/certifi-2026.5.20.tar.gz", hash = "sha256:69dea482ab64caa7b9f6aba1c6bf48bb6a5448d1c0f1b17ab42ad8c763a5344d", size = 135422, upload-time = "2026-05-20T11:46:50.073Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl", hash = "sha256:3cb2210c8f88ba2318d29b0388d1023c8492ff72ecdde4ebdaddbb13a31b1c4a", size = 135707, upload-time = "2026-04-22T11:26:09.372Z" }, + { url = "https://files.pythonhosted.org/packages/59/8c/57e832b7af6d7c5abe66eb3fbe3a3a32f4d11ea23a1aa7131371035be991/certifi-2026.5.20-py3-none-any.whl", hash = "sha256:3c52e209ba0a4ad7aebe60436a4ab349c39e1e602e8c134221e546902ad25897", size = 134134, upload-time = "2026-05-20T11:46:48.578Z" }, ] [[package]] @@ -361,14 +361,14 @@ wheels = [ [[package]] name = "click" -version = "8.4.0" +version = "8.4.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "platform_machine != 'arm64' and sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/23/e4/796662cd90cf80e3a363c99db2b88e0e394b988a575f60a17e16440cd011/click-8.4.0.tar.gz", hash = "sha256:638f1338fe1235c8f4e008e4a8a254fb5c5fbdcbb40ece3c9142ebb78e792973", size = 350843, upload-time = "2026-05-17T00:47:58.425Z" } +sdist = { url = "https://files.pythonhosted.org/packages/9b/98/518d8e5081007684232226f475082b30087d0f585e8457db087298259f49/click-8.4.1.tar.gz", hash = "sha256:918b5633eddf6b41c32d4f454bf0de810065c74e3f7dbf8ee5452f8be88d3e96", size = 353007, upload-time = "2026-05-22T04:08:37.769Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ee/ae/8e92f8058baf87f6c7d86ee7e457668690195cc77efedb8d3797a06e3940/click-8.4.0-py3-none-any.whl", hash = "sha256:40c50b7c6c6adac2823d411041ec84f3f103f1b280d5e9ce0d7f998995832f81", size = 116147, upload-time = "2026-05-17T00:47:56.842Z" }, + { url = "https://files.pythonhosted.org/packages/c7/0d/67e5b4109ea4a837e80daa87c2c696711955e40449a97e8926672534def2/click-8.4.1-py3-none-any.whl", hash = "sha256:482be17c6991b8c19c5429a1e995d9b0efdbb63172824c41f99965dc0ade8ec2", size = 116639, upload-time = "2026-05-22T04:08:35.26Z" }, ] [[package]] @@ -922,50 +922,80 @@ wheels = [ [[package]] name = "greenlet" -version = "3.5.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/3c/3f/dbf99fb14bfeb88c28f16729215478c0e265cacd6dc22270c8f31bb6892f/greenlet-3.5.0.tar.gz", hash = "sha256:d419647372241bc68e957bf38d5c1f98852155e4146bd1e4121adea81f4f01e4", size = 196995, upload-time = "2026-04-27T13:37:15.544Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/25/ce/6f9f008266273aa14a2e011945797ac5802b97b8b40efe7afe1ee6c1afc9/greenlet-3.5.0-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:804a70b328e706b785c6ef16187051c394a63dd1a906d89be24b6ad77759f13f", size = 600508, upload-time = "2026-04-27T12:52:37.876Z" }, - { url = "https://files.pythonhosted.org/packages/e0/6d/b0f3272c2368ea2c1aa19a5ad70db0be8f8dff6e6d3d1eb82efa00cbcf19/greenlet-3.5.0-cp310-cp310-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:884f649de075b84739713d41dd4dfd41e2b910bfb769c4a3ea02ec1da52cd9bb", size = 613283, upload-time = "2026-04-27T12:59:37.957Z" }, - { url = "https://files.pythonhosted.org/packages/ed/ac/0b509b6fb93551ce5a01612ee1acda7f7dda4bbb66c99aeb2ab403d205dc/greenlet-3.5.0-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4b28037cb07768933c54d81bfe47a85f9f402f57d7d69743b991a713b63954eb", size = 613418, upload-time = "2026-04-27T12:25:23.852Z" }, - { url = "https://files.pythonhosted.org/packages/03/03/2b2b680ec87aaa97998fb5b8d76658d4d3560386864f17efab33ba7c2e24/greenlet-3.5.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cda05425526240807408156b6960a17a79a0c760b813573b67027823be760977", size = 1572229, upload-time = "2026-04-27T12:53:23.509Z" }, - { url = "https://files.pythonhosted.org/packages/61/e4/42b259e7a19aff1a270a4bd82caf6353109ed6860c9454e18f37162b83ae/greenlet-3.5.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9c615f869163e14bb1ced20322d8038fb680b08236521ac3f30cd4c1288785a0", size = 1639886, upload-time = "2026-04-27T12:25:22.325Z" }, - { url = "https://files.pythonhosted.org/packages/6f/b4/733ca47b883b67c57f90d3ecb21055c9ec753597d10754ac201644061f9d/greenlet-3.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:ba8f0bdc2fae6ce915dfd0c16d2d00bca7e4247c1eae4416e06430e522137858", size = 237795, upload-time = "2026-04-27T12:21:40.118Z" }, - { url = "https://files.pythonhosted.org/packages/95/82/800646c7ffc5dbabd75ddd2f6b519bb898c0c9c969e5d0473bfe5d20bcce/greenlet-3.5.0-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:362624e6a8e5bca3b8233e45eef33903a100e9539a2b995c364d595dbc4018b3", size = 604264, upload-time = "2026-04-27T12:52:39.494Z" }, - { url = "https://files.pythonhosted.org/packages/ca/ac/354867c0bba812fc33b15bc55aedafedd0aee3c7dd91dfca22444157dc0c/greenlet-3.5.0-cp311-cp311-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5ecd83806b0f4c2f53b1018e0005cd82269ea01d42befc0368730028d850ed1c", size = 616099, upload-time = "2026-04-27T12:59:39.623Z" }, - { url = "https://files.pythonhosted.org/packages/ff/b0/815bece7399e01cadb69014219eebd0042339875c59a59b0820a46ece356/greenlet-3.5.0-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0ff251e9a0279522e62f6176412869395a64ddf2b5c5f782ff609a8216a4e662", size = 615198, upload-time = "2026-04-27T12:25:25.928Z" }, - { url = "https://files.pythonhosted.org/packages/10/80/3b2c0a895d6698f6ddb31b07942ebfa982f3e30888bc5546a5b5990de8b2/greenlet-3.5.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6d874e79afd41a96e11ff4c5d0bc90a80973e476fda1c2c64985667397df432b", size = 1574927, upload-time = "2026-04-27T12:53:25.81Z" }, - { url = "https://files.pythonhosted.org/packages/44/0e/f354af514a4c61454dbc68e44d47544a5a4d6317e30b77ddfa3a09f4c5f3/greenlet-3.5.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0ed006e4b86c59de7467eb2601cd1b77b5a7d657d1ee55e30fe30d76451edba4", size = 1642683, upload-time = "2026-04-27T12:25:23.9Z" }, - { url = "https://files.pythonhosted.org/packages/fa/6a/87f38255201e993a1915265ebb80cd7c2c78b04a45744995abbf6b259fd8/greenlet-3.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:703cb211b820dbffbbc55a16bfc6e4583a6e6e990f33a119d2cc8b83211119c8", size = 238115, upload-time = "2026-04-27T12:21:48.845Z" }, - { url = "https://files.pythonhosted.org/packages/e3/f8/450fe3c5938fa737ea4d22699772e6e34e8e24431a47bf4e8a1ceed4a98e/greenlet-3.5.0-cp311-cp311-win_arm64.whl", hash = "sha256:6c18dfb59c70f5a94acd271c72e90128c3c776e41e5f07767908c8c1b74ad339", size = 235017, upload-time = "2026-04-27T12:22:26.768Z" }, - { url = "https://files.pythonhosted.org/packages/b7/aa/caed9e5adf742315fc7be2a84196373aab4816e540e38ba0d76cb7584d68/greenlet-3.5.0-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3ec9ea74e7268ace7f9aab1b1a4e730193fc661b39a993cd91c606c32d4a3628", size = 601775, upload-time = "2026-04-27T12:52:41.045Z" }, - { url = "https://files.pythonhosted.org/packages/c7/af/90ae08497400a941595d12774447f752d3dfe0fbb012e35b76bc5c0ff37e/greenlet-3.5.0-cp312-cp312-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:54d243512da35485fc7a6bf3c178fdda6327a9d6506fcdd62b1abd1e41b2927b", size = 614436, upload-time = "2026-04-27T12:59:41.595Z" }, - { url = "https://files.pythonhosted.org/packages/2b/e0/2e13df68f367e2f9960616927d60857dd7e56aaadd59a47c644216b2f920/greenlet-3.5.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d280a7f5c331622c69f97eb167f33577ff2d1df282c41cd15907fc0a3ca198c", size = 611388, upload-time = "2026-04-27T12:25:28.008Z" }, - { url = "https://files.pythonhosted.org/packages/82/f7/393c64055132ac0d488ef6be549253b7e6274194863967ddc0bc8f5b87b8/greenlet-3.5.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1eb67d5adefb5bd2e182d42678a328979a209e4e82eb93575708185d31d1f588", size = 1570768, upload-time = "2026-04-27T12:53:28.099Z" }, - { url = "https://files.pythonhosted.org/packages/b8/4b/eaf7735253522cf56d1b74d672a58f54fc114702ceaf05def59aae72f6e1/greenlet-3.5.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2628d6c86f6cb0cb45e0c3c54058bbec559f57eaae699447748cb3928150577e", size = 1635983, upload-time = "2026-04-27T12:25:26.903Z" }, - { url = "https://files.pythonhosted.org/packages/4c/fe/4fb3a0805bd5165da5ebf858da7cc01cce8061674106d2cf5bdab32cbfde/greenlet-3.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:d4d9f0624c775f2dfc56ba54d515a8c771044346852a918b405914f6b19d7fd8", size = 238840, upload-time = "2026-04-27T12:23:54.806Z" }, - { url = "https://files.pythonhosted.org/packages/cb/cb/baa584cb00532126ffe12d9787db0a60c5a4f55c27bfe2666df5d4c30a32/greenlet-3.5.0-cp312-cp312-win_arm64.whl", hash = "sha256:83ed9f27f1680b50e89f40f6df348a290ea234b249a4003d366663a12eab94f2", size = 235615, upload-time = "2026-04-27T12:21:38.57Z" }, - { url = "https://files.pythonhosted.org/packages/4a/ba/b28ddbe6bfad6a8ac196ef0e8cff37bc65b79735995b9e410923fffeeb70/greenlet-3.5.0-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a717fbc46d8a354fa675f7c1e813485b6ba3885f9bef0cd56e5ba27d758ff5b", size = 604414, upload-time = "2026-04-27T12:52:42.358Z" }, - { url = "https://files.pythonhosted.org/packages/09/06/4b69f8f0b67603a8be2790e55107a190b376f2627fe0eaf5695d85ffb3cd/greenlet-3.5.0-cp313-cp313-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ddc090c5c1792b10246a78e8c2163ebbe04cf877f9d785c230a7b27b39ad038e", size = 617349, upload-time = "2026-04-27T12:59:43.32Z" }, - { url = "https://files.pythonhosted.org/packages/8a/17/a3918541fd0ddefe024a69de6d16aa7b46d36ac19562adaa63c7fa180eff/greenlet-3.5.0-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2094acd54b272cb6eae8c03dd87b3fa1820a4cef18d6889c378d503500a1dc13", size = 613927, upload-time = "2026-04-27T12:25:30.28Z" }, - { url = "https://files.pythonhosted.org/packages/ee/e1/bd0af6213c7dd33175d8a462d4c1fe1175124ebed4855bc1475a5b5242c2/greenlet-3.5.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5e05ba267789ea87b5a155cf0e810b1ab88bf18e9e8740813945ceb8ee4350ba", size = 1570893, upload-time = "2026-04-27T12:53:29.483Z" }, - { url = "https://files.pythonhosted.org/packages/9b/2a/0789702f864f5382cb476b93d7a9c823c10472658102ccd65f415747d2e2/greenlet-3.5.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0ecec963079cd58cbd14723582384f11f166fd58883c15dcbfb342e0bc9b5846", size = 1636060, upload-time = "2026-04-27T12:25:28.845Z" }, - { url = "https://files.pythonhosted.org/packages/b2/8f/22bf9df92bbff0eb07842b60f7e63bf7675a9742df628437a9f02d09137f/greenlet-3.5.0-cp313-cp313-win_amd64.whl", hash = "sha256:728d9667d8f2f586644b748dbd9bb67e50d6a9381767d1357714ea6825bb3bf5", size = 238740, upload-time = "2026-04-27T12:24:01.341Z" }, - { url = "https://files.pythonhosted.org/packages/b6/b7/9c5c3d653bd4ff614277c049ac676422e2c557db47b4fe43e6313fc005dc/greenlet-3.5.0-cp313-cp313-win_arm64.whl", hash = "sha256:47422135b1d308c14b2c6e758beedb1acd33bb91679f5670edf77bf46244722b", size = 235525, upload-time = "2026-04-27T12:23:12.308Z" }, - { url = "https://files.pythonhosted.org/packages/af/a6/046c0a28e21833e4086918218cfb3d8bed51c075a1b700f20b9d7861c0f4/greenlet-3.5.0-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:55fa7ea52771be44af0de27d8b80c02cd18c2c3cddde6c847ecebdf72418b6a1", size = 651166, upload-time = "2026-04-27T12:52:43.644Z" }, - { url = "https://files.pythonhosted.org/packages/47/f8/4af27f71c5ff32a7fbc516adb46370d9c4ae2bc7bd3dc7d066ac542b4b15/greenlet-3.5.0-cp314-cp314-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a97e4821aa710603f94de0da25f25096454d78ffdace5dc77f3a006bc01abba3", size = 663792, upload-time = "2026-04-27T12:59:44.93Z" }, - { url = "https://files.pythonhosted.org/packages/a3/59/1bd6d7428d6ed9106efbb8c52310c60fd04f6672490f452aeaa3829aa436/greenlet-3.5.0-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8f52a464e4ed91780bdfbbdd2b97197f3accaa629b98c200f4dffada759f3ae7", size = 660933, upload-time = "2026-04-27T12:25:33.276Z" }, - { url = "https://files.pythonhosted.org/packages/83/e4/b903e5a5fae1e8a28cdd32a0cfbfd560b668c25b692f67768822ddc5f40f/greenlet-3.5.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:762612baf1161ccb8437c0161c668a688223cba28e1bf038f4eb47b13e39ccdf", size = 1618401, upload-time = "2026-04-27T12:53:31.062Z" }, - { url = "https://files.pythonhosted.org/packages/0e/e3/5ec408a329acb854fb607a122e1ee5fb3ff649f9a97952948a90803c0d8e/greenlet-3.5.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:57a43c6079a89713522bc4bcb9f75070ecf5d3dbad7792bfe42239362cbf2a16", size = 1682038, upload-time = "2026-04-27T12:25:31.838Z" }, - { url = "https://files.pythonhosted.org/packages/91/20/6b165108058767ee643c55c5c4904d591a830ee2b3c7dbd359828fbc829f/greenlet-3.5.0-cp314-cp314-win_amd64.whl", hash = "sha256:3bc59be3945ae9750b9e7d45067d01ae3fe90ea5f9ade99239dabdd6e28a5033", size = 239835, upload-time = "2026-04-27T12:24:54.136Z" }, - { url = "https://files.pythonhosted.org/packages/4e/62/1c498375cee177b55d980c1db319f26470e5309e54698c8f8fc06c0fd539/greenlet-3.5.0-cp314-cp314-win_arm64.whl", hash = "sha256:a96fcee45e03fe30a62669fd16ab5c9d3c172660d3085605cb1e2d1280d3c988", size = 236862, upload-time = "2026-04-27T12:23:24.957Z" }, - { url = "https://files.pythonhosted.org/packages/15/5e/8744c52e2c027b5a8772a01561934c8835f869733e101f62075c60430340/greenlet-3.5.0-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7fc391b1566f2907d17aaebe78f8855dc45675159a775fcf9e61f8ee0078e87f", size = 650723, upload-time = "2026-04-27T12:52:45.412Z" }, - { url = "https://files.pythonhosted.org/packages/00/ef/7b4c39c03cf46ceca512c5d3f914afd85aa30b2cc9a93015b0dd73e4be6c/greenlet-3.5.0-cp314-cp314t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:680bd0e7ad5e8daa8a4aa89f68fd6adc834b8a8036dc256533f7e08f4a4b01f7", size = 656529, upload-time = "2026-04-27T12:59:46.295Z" }, - { url = "https://files.pythonhosted.org/packages/0b/b5/c7768f352f5c010f92064d0063f987e7dc0cd290a6d92a34109015ce4aa1/greenlet-3.5.0-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ddb36c7d6c9c0a65f18c7258634e0c416c6ab59caac8c987b96f80c2ebda0112", size = 654364, upload-time = "2026-04-27T12:25:35.64Z" }, - { url = "https://files.pythonhosted.org/packages/ef/d0/079ebe12e4b1fc758857ce5be1a5e73f06870f2101e52611d1e71925ce54/greenlet-3.5.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e5ddf316ced87539144621453c3aef229575825fe60c604e62bedc4003f372b2", size = 1614204, upload-time = "2026-04-27T12:53:32.618Z" }, - { url = "https://files.pythonhosted.org/packages/6d/89/6c2fb63df3596552d20e58fb4d96669243388cf680cff222758812c7bfaa/greenlet-3.5.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:4a448128607be0de65342dc9b31be7f948ef4cc0bc8832069350abefd310a8f2", size = 1675480, upload-time = "2026-04-27T12:25:34.168Z" }, - { url = "https://files.pythonhosted.org/packages/15/32/77ee8a6c1564fc345a491a4e85b3bf360e4cf26eac98c4532d2fdb96e01f/greenlet-3.5.0-cp314-cp314t-win_amd64.whl", hash = "sha256:d60097128cb0a1cab9ea541186ea13cd7b847b8449a7787c2e2350da0cb82d86", size = 245324, upload-time = "2026-04-27T12:24:40.295Z" }, +version = "3.5.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6d/6e/802acd792aebb2256fbbee8cacf2727faaeb6f240ac11008f09eae4414bc/greenlet-3.5.1.tar.gz", hash = "sha256:5a56aeb7d5d9cc4b3a735efb5095bd4b4f6f0e4f93e5ca876d0e2315137b7829", size = 197356, upload-time = "2026-05-20T15:05:03.917Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b9/f7/6762a56fa5f6c2295c449c6524e10ce481e381c994cc44d9d03aef0700fb/greenlet-3.5.1-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e5cc9606aa5f4e0bde0d3bd502b44f743864c3ffa5cfa1011b1e30f5aa02366f", size = 599696, upload-time = "2026-05-20T14:00:02.906Z" }, + { url = "https://files.pythonhosted.org/packages/0f/05/85a511e68ee109aff0aa00b4b497806091dd2d82ce209e49c6e801bd5d92/greenlet-3.5.1-cp310-cp310-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c3d35f87c7253b715d13d679e0783d845910144f282cb939fe1ba4ac8616269c", size = 612618, upload-time = "2026-05-20T14:05:39.202Z" }, + { url = "https://files.pythonhosted.org/packages/2e/19/60df45065b2981ff894fdd51e7c99a3a4b107412822b083d88d5d528f663/greenlet-3.5.1-cp310-cp310-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:00929c98ec525fd9bf075875d8c5f6a983a90906cdf78a66e6de2d8e466c2a19", size = 619237, upload-time = "2026-05-20T14:09:06.421Z" }, + { url = "https://files.pythonhosted.org/packages/89/b8/8b83d18ae07c46c019617f35afd7b47aab7f9b4fbb12fc637d681e10bdd8/greenlet-3.5.1-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:540dae7b956209af4d70a3be35927b4055f617763771e5e84a5255bea934d2f5", size = 612947, upload-time = "2026-05-20T13:14:23.469Z" }, + { url = "https://files.pythonhosted.org/packages/26/9a/4ba4c2bc9d9df5f41bb8943fb7bb11e440352e6b9c2e36716b6e85f8b82d/greenlet-3.5.1-cp310-cp310-manylinux_2_39_riscv64.whl", hash = "sha256:001775efe7b8e758861294c7a27c28af87f3f3f1c20468a2bc618c45b346c061", size = 415653, upload-time = "2026-05-20T14:01:36.999Z" }, + { url = "https://files.pythonhosted.org/packages/5d/14/ad1f9fc9b82384c010212464a3702bd911f95dab2f1180bc6fbcfb1f958c/greenlet-3.5.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ed8cdb691169715a9a492844a83246f090182247d1a5031dc78a403f68ba1e97", size = 1571425, upload-time = "2026-05-20T14:02:22.671Z" }, + { url = "https://files.pythonhosted.org/packages/46/1c/43b8203cf10f4292c9e3d270e9e5f5ade79115a0a0ca5ea6f1be5f8915a7/greenlet-3.5.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9d59e840387076a51016777a9328b3f2c427c6f9208a6e958bad251be50a648d", size = 1638688, upload-time = "2026-05-20T13:14:30.026Z" }, + { url = "https://files.pythonhosted.org/packages/ac/6e/0344b1e99f58f71715456e46492101fd2daa408957b8186ade0a4b515da7/greenlet-3.5.1-cp310-cp310-win_amd64.whl", hash = "sha256:b9152fca4a6466e114aaec745ae61cba739903a109754a9d4e1262f01e9259b1", size = 237763, upload-time = "2026-05-20T13:11:35.659Z" }, + { url = "https://files.pythonhosted.org/packages/81/0e/5e5457be3d256918f6a4756f073548a3f0190836e2cc94aa6d0d617a940b/greenlet-3.5.1-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a0cbed8bb44e23c5b199f888f4e4ce096b45ad9f25ff74a7ad0213875e936bb2", size = 603479, upload-time = "2026-05-20T14:00:04.757Z" }, + { url = "https://files.pythonhosted.org/packages/6d/e1/f89a21d58d308298e6f275f13a1b472ed96c680b601a371b08be6a725989/greenlet-3.5.1-cp311-cp311-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a203a8bd0acb0701653d3bbb26e404854a68674139ed5cbb778830f42b09bb33", size = 615495, upload-time = "2026-05-20T14:05:40.87Z" }, + { url = "https://files.pythonhosted.org/packages/2c/f2/8fd452fd81adb9ec79c8275c1375702ab0fd6bee4952da12eaa09b9508d8/greenlet-3.5.1-cp311-cp311-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6ebeb75c81211f5c702576cf81f315e77e23cfdb2c7c6fcb9dd143e6de35c360", size = 623515, upload-time = "2026-05-20T14:09:07.853Z" }, + { url = "https://files.pythonhosted.org/packages/75/de/af6cef182862d2ccd6975440d21c9058a77c3f9b469abf94e322dfd2e0e3/greenlet-3.5.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8a271fcd66c74615cda6a964fda3f304267a12e50a084472218a39bb0376f563", size = 614754, upload-time = "2026-05-20T13:14:24.947Z" }, + { url = "https://files.pythonhosted.org/packages/ec/bc/c318aa9f3ffc77320fddcee3d892be957b42e2ff947198d9450b004f3a38/greenlet-3.5.1-cp311-cp311-manylinux_2_39_riscv64.whl", hash = "sha256:017a544f0385d441e88714160d089d6900ef46c9eff9d99b6715a5ef2d127747", size = 418439, upload-time = "2026-05-20T14:01:38.446Z" }, + { url = "https://files.pythonhosted.org/packages/1a/c6/50e520283a9f19388a7326b05f9e8637e566003475eacaadad04f558c68d/greenlet-3.5.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ded7b068c7c31c1a8657d4fd42d886b3e051ae29f88b80c5ff9d502257b0f071", size = 1574097, upload-time = "2026-05-20T14:02:24.003Z" }, + { url = "https://files.pythonhosted.org/packages/21/1c/13abd1f4860d987fa5e1170a01930d6e6cd40d328de487a3c9fdaff0ffd0/greenlet-3.5.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d0932b81d72f552ded9d810d00021b64d89f2195a91ce115b893f943b7a4ab3c", size = 1641058, upload-time = "2026-05-20T13:14:31.83Z" }, + { url = "https://files.pythonhosted.org/packages/f5/56/5f332b7705545eac2dc01b4e9254d24a793f2656d55d5cc6b94ee59d22ae/greenlet-3.5.1-cp311-cp311-win_amd64.whl", hash = "sha256:88e300d136eac057b2397aa1cfd7328b4c87c7eb66a09c7bc6a1292234db474e", size = 238089, upload-time = "2026-05-20T13:14:03.229Z" }, + { url = "https://files.pythonhosted.org/packages/d9/a9/a3c2fa886c5b94863fb0e61b3bc14610b7aa94cf4f17f8741b11708305fc/greenlet-3.5.1-cp311-cp311-win_arm64.whl", hash = "sha256:cc6ab7e555c8a112ad3a76e368e86e12a2754bcae1652a5602e133ec7b635523", size = 234989, upload-time = "2026-05-20T13:08:27.715Z" }, + { url = "https://files.pythonhosted.org/packages/38/ff/a4f436709716965eaab9f36ea7b906c8a927fbe32fb1372a2071d964f6b1/greenlet-3.5.1-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ffea73584b216150eab159b6d12348fb253e68757974de1e2c40d8a318ac89ed", size = 601585, upload-time = "2026-05-20T14:00:06.141Z" }, + { url = "https://files.pythonhosted.org/packages/65/ad/54bc3fcee3ad368a61b19b67d88117f7a8c29727bf71fffdeda81fbd946e/greenlet-3.5.1-cp312-cp312-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1072b4f9edcc1e192d9283a66a3e68d6b84c561de33a83d7858beb9ba1effe10", size = 614215, upload-time = "2026-05-20T14:05:42.675Z" }, + { url = "https://files.pythonhosted.org/packages/7c/6c/de5b1b388cd2d9fbdfeab324863daba37d54e6e233ddbefd70b385a8c591/greenlet-3.5.1-cp312-cp312-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:89101bfd5011e069be974903cb3a4e4523845e4ece2d62dcd8d358933c0ef249", size = 620094, upload-time = "2026-05-20T14:09:09.18Z" }, + { url = "https://files.pythonhosted.org/packages/40/69/b91cda0647df839483201545913514c2827ebea5e5ccdf931842763bc127/greenlet-3.5.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:add5217d68b31130f0beca584d7fef4878327d2e31642b66618a14eef312b63b", size = 611358, upload-time = "2026-05-20T13:14:26.37Z" }, + { url = "https://files.pythonhosted.org/packages/4a/43/1204baffab8a6476464795a7ccf394a3248d4f22c9f87173a15b36b6d971/greenlet-3.5.1-cp312-cp312-manylinux_2_39_riscv64.whl", hash = "sha256:e6cd99ea59dd5d89f0c956606571d79bfe6f68c9eb7f4a4083a41a7f1587edee", size = 422782, upload-time = "2026-05-20T14:01:39.597Z" }, + { url = "https://files.pythonhosted.org/packages/59/90/3cf77e080350cd02fa307bb2abf05df48f4482c240275bbd2c203ba8bb1c/greenlet-3.5.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a5ea42a752d47a145eae922b605cd1634665ac3d5ec1e72402d5048e8d60d207", size = 1570475, upload-time = "2026-05-20T14:02:25.29Z" }, + { url = "https://files.pythonhosted.org/packages/65/2c/18cece62045e74598c3c393f70dce4a63f56222015ba29a5d4eeb04f764c/greenlet-3.5.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c5551170cf4f5ff5623e9af81323751979fee2c731e2287b61f73cd27257b823", size = 1635625, upload-time = "2026-05-20T13:14:34.027Z" }, + { url = "https://files.pythonhosted.org/packages/30/f5/310d104ddf41eb5a70f4c268d22508dfb0c3c8e86fec152be34d0d2ed819/greenlet-3.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:3c8bb982ad117d29478ef8f5533e97df21f1e2befd17a299257b0c96d1371c0b", size = 238791, upload-time = "2026-05-20T13:10:39.018Z" }, + { url = "https://files.pythonhosted.org/packages/62/90/ceca11f504cd23a8047a3dea31919adc48df9b626dd0c13f0d858734fdfd/greenlet-3.5.1-cp312-cp312-win_arm64.whl", hash = "sha256:80eb4b04dadc4e67df3fae179a32c4706a3f495bc7f22fc8a81115d5f5512188", size = 235580, upload-time = "2026-05-20T13:08:45.056Z" }, + { url = "https://files.pythonhosted.org/packages/b1/bf/387f9b6b865fd2ae0d0be09e0004827295a01b71be76ed350dd1e28a91a4/greenlet-3.5.1-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1ffdb3c0bb002c99cd8f298957e046c3dbf6006b5b7cdf11a4e19194624a0a0a", size = 604370, upload-time = "2026-05-20T14:00:07.492Z" }, + { url = "https://files.pythonhosted.org/packages/32/f5/169ce3d4e4c67291bd18f8cbe0299c9f3e45102c7f1fb3c14780c93e4532/greenlet-3.5.1-cp313-cp313-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7715a5a2c3378ba602c3a440558261e13a820bb53a82693aacd7b7f6d964e283", size = 616987, upload-time = "2026-05-20T14:05:44.237Z" }, + { url = "https://files.pythonhosted.org/packages/19/ba/c24110c55dffa55aa6e1d98b45310da33801aeba7686ff0190fe5d46fd32/greenlet-3.5.1-cp313-cp313-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d40a890035c0058cadbdc4af7569800fd28a0e527a0fdbb7b5f9418f176846ce", size = 622911, upload-time = "2026-05-20T14:09:10.598Z" }, + { url = "https://files.pythonhosted.org/packages/ee/e5/7f2e41d5273be07e77560d61ea4e56485b4d6c316d2a84518c62d1364061/greenlet-3.5.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dc71ff466927a201b08305acac451ebe1aedfcea002f62f1f2f2ac2ac1e6a135", size = 613911, upload-time = "2026-05-20T13:14:27.539Z" }, + { url = "https://files.pythonhosted.org/packages/ec/7b/d20db2e8a5ad6c038702f3179b136f93f0a3d1a21a0c0777f3e470cdf4b2/greenlet-3.5.1-cp313-cp313-manylinux_2_39_riscv64.whl", hash = "sha256:67821bb03e4e98664490edb787ff6af501194c29bbee0f5c1dfdcf1dc3d9d436", size = 425228, upload-time = "2026-05-20T14:01:40.837Z" }, + { url = "https://files.pythonhosted.org/packages/c5/a4/fbdc67579b73615a1f91615e814303cc71e06128f7baaba87be79b8fb90c/greenlet-3.5.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cd443683db272ebaaca03af98c0b063ab30db70ea8a31a1559f35e3f7b744ccd", size = 1570689, upload-time = "2026-05-20T14:02:27.225Z" }, + { url = "https://files.pythonhosted.org/packages/e6/b4/77abbe35078be39718a46cd49caf16bceb35662f97a34101dca28aa98e47/greenlet-3.5.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:089fff7a6ce8d9316d1f65ebc00273a56be258c1725b32b94de90a3a979557e1", size = 1635602, upload-time = "2026-05-20T13:14:36.344Z" }, + { url = "https://files.pythonhosted.org/packages/37/f7/129f27ca700845b8ee8ca88ce7f43435a1239c2eddb7677fc938822762cf/greenlet-3.5.1-cp313-cp313-win_amd64.whl", hash = "sha256:110a1ca7b49b014b097f6078272c3f4ed31af45b254de5228b79adba879f6af9", size = 238683, upload-time = "2026-05-20T13:11:50.57Z" }, + { url = "https://files.pythonhosted.org/packages/6d/5c/a485a36e87df8d8fd0632ee01511244f5156a20ed3746cc6599340326395/greenlet-3.5.1-cp313-cp313-win_arm64.whl", hash = "sha256:f16ba1efc0715b680a18b8123d90dad887c6112ae3555b4b5c32c149540c6b4e", size = 235499, upload-time = "2026-05-20T13:12:42.028Z" }, + { url = "https://files.pythonhosted.org/packages/ec/71/c4270398c2eba968a6071af1dfbdcaeee6ec1c24bc8b435b8cc452700da6/greenlet-3.5.1-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5e300185139abc337ade480c327183adf42a875ac7181bfe66d7d4efea31fbea", size = 651106, upload-time = "2026-05-20T14:00:09.448Z" }, + { url = "https://files.pythonhosted.org/packages/1a/ab/71e34b78a44ec271fb5f550c17bc46d301ddc5953890d935f270b0dcdb5a/greenlet-3.5.1-cp314-cp314-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7ffdb990dcaa0234cf9845aead5df2e3c3a8b6507d409274dd87e0d5ab05ffc2", size = 663478, upload-time = "2026-05-20T14:05:45.88Z" }, + { url = "https://files.pythonhosted.org/packages/c6/2d/2d80842910da44f78c286532d084b8a5c3717c844ae80ceb3858738ae89a/greenlet-3.5.1-cp314-cp314-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6c09df69dc1712d131332054a858a3e5cca400967fa3a672e2324fbb0971448c", size = 667767, upload-time = "2026-05-20T14:09:12.15Z" }, + { url = "https://files.pythonhosted.org/packages/77/96/4efd6fa5c62c85426a0c19077a586258ebc3a2a146ff2493e4312a697a22/greenlet-3.5.1-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2f82b3597e9d83b63408affed0b48fd0f54935edac4302237b9a837be0dae33c", size = 660800, upload-time = "2026-05-20T13:14:29.129Z" }, + { url = "https://files.pythonhosted.org/packages/e9/d3/dad2eecedfbb1ed7050a20dcfae40c1442b74bc7423608be2c7e03ee7133/greenlet-3.5.1-cp314-cp314-manylinux_2_39_riscv64.whl", hash = "sha256:a4764e0bfc6a4d114c865b32520805c16a990ef5f286a514413b05d5ecd6a23d", size = 470786, upload-time = "2026-05-20T14:01:42.064Z" }, + { url = "https://files.pythonhosted.org/packages/7a/e0/6c71401a25cac7000261304e866a2f2cc04dc74810d40e2f118aa4799495/greenlet-3.5.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c0141e37414c10164e702b8fb1473304221ad98f71600850c6ef7ff4880feba0", size = 1617518, upload-time = "2026-05-20T14:02:28.662Z" }, + { url = "https://files.pythonhosted.org/packages/41/26/c5c06643e8c0af9e7bf18e16cb51d0ab7625155f0392e1c9015d66d556cd/greenlet-3.5.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:50ae25a67bea74ea41fb14b960bc532df73eb713417b2d61892dced82fe8d3bc", size = 1681593, upload-time = "2026-05-20T13:14:39.417Z" }, + { url = "https://files.pythonhosted.org/packages/8a/bd/e11a108317485075e68af9d23039619b86b28130c3b50d227d42edece64b/greenlet-3.5.1-cp314-cp314-win_amd64.whl", hash = "sha256:8a17c42330e261299766b75ac1ea32caa437a9453c8f65d16a13140db378ecd3", size = 239800, upload-time = "2026-05-20T13:09:30.128Z" }, + { url = "https://files.pythonhosted.org/packages/47/f8/8e8e8417b7bf28639a5a56356ef934d0375e1d0c70a57e04d7701e870ffe/greenlet-3.5.1-cp314-cp314-win_arm64.whl", hash = "sha256:7b5f5fae05b8ac6d176a61b60c394a8cbdc2b5b91b81793066e68745cf165e54", size = 236862, upload-time = "2026-05-20T13:09:10.498Z" }, + { url = "https://files.pythonhosted.org/packages/44/44/ba14b23e9757707050c2f397d305bbcae62e5d7cad122f8b6baec5ae4a1f/greenlet-3.5.1-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a19570c52a21420dcbc94e661994bc325c0b5b11304540fed514586da5dc8f2e", size = 650840, upload-time = "2026-05-20T14:00:11.079Z" }, + { url = "https://files.pythonhosted.org/packages/a8/37/5ddc2b686a6844f91abecef43411842426da2e1573f60b49ecf2547f4ae1/greenlet-3.5.1-cp314-cp314t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3d955c89b75eeca4723d7cc14135f393cd47c32e2a6cb4a8e4c6e760a26b0986", size = 656416, upload-time = "2026-05-20T14:05:47.118Z" }, + { url = "https://files.pythonhosted.org/packages/8c/46/5987dcd1a2570ba84f3b187536b2ca3ae97613387e57f5cfa99df068fe5e/greenlet-3.5.1-cp314-cp314t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ea37d5a157eb9493820d3792ac4ece28619a394391d2b9f2f78057d396ff0f0f", size = 656607, upload-time = "2026-05-20T14:09:13.949Z" }, + { url = "https://files.pythonhosted.org/packages/e1/f0/d17510297c35a2992712f0bf84de3779749999f7d3d63aa1f09db7c62dbe/greenlet-3.5.1-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:de2daaaebd1a5aa88c49045b6baf9310b3263796bd88db713edf37cf53e7bb4e", size = 654397, upload-time = "2026-05-20T13:14:30.696Z" }, + { url = "https://files.pythonhosted.org/packages/2c/c1/6da0a9ddcc29d7e51ef14883fa3dc1e53b3f4ffba00582106c7bf55da1d8/greenlet-3.5.1-cp314-cp314t-manylinux_2_39_riscv64.whl", hash = "sha256:8d8a23250ea3ec7b36de8fa4b541e9e2db3ee82915cc060ab0631609ad8b28de", size = 488287, upload-time = "2026-05-20T14:01:43.143Z" }, + { url = "https://files.pythonhosted.org/packages/37/eb/147387705bb89092645b012586e7273cb5ed3c90ef7eaf3a69173eaf0209/greenlet-3.5.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:3bfbd69cc349e43bf3a8ae1c85548ff0718efc887615c2db16c3833d7b0b072d", size = 1614469, upload-time = "2026-05-20T14:02:30.192Z" }, + { url = "https://files.pythonhosted.org/packages/a6/4e/37ee0da7732b7aa9896f17e15579a9df34b9fcb9dd494f0adfa749af6623/greenlet-3.5.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:4378720dd888136c27215a0214d32a4d37c3852765d45bc37aad0623423cfd78", size = 1675115, upload-time = "2026-05-20T13:14:40.972Z" }, + { url = "https://files.pythonhosted.org/packages/57/f3/97dfcf4a6eb5077f8a672234216fb5923eb89f2cab7081cb10b2cf75b605/greenlet-3.5.1-cp314-cp314t-win_amd64.whl", hash = "sha256:45718441607f9325d948db98cbc691276059316d0358c188c246da4e1d4d23d2", size = 245246, upload-time = "2026-05-20T13:12:22.646Z" }, + { url = "https://files.pythonhosted.org/packages/df/59/fa9c6e87dc8ad27a95dabe2f29f372b733d05a8a67470f6c901ed9975655/greenlet-3.5.1-cp315-cp315-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9b1ec3274918a81d3ea778b9e75b56b72b33f300edb6cf7f3a7fe1dae56683de", size = 656428, upload-time = "2026-05-20T14:00:12.556Z" }, + { url = "https://files.pythonhosted.org/packages/f6/f9/e753408871eaa61dfe35e619cfc67512b036fde99893685d50eea9e07146/greenlet-3.5.1-cp315-cp315-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:111e2390ffffc47d5840b01711dd7fac07d4c09283d0283e7f3264b14e284c64", size = 667064, upload-time = "2026-05-20T14:05:48.662Z" }, + { url = "https://files.pythonhosted.org/packages/dc/74/807a047255bf1e09303627c46dc043dca596b6958a354d904f32ab382005/greenlet-3.5.1-cp315-cp315-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:10a9a1c0bfbc93d41156ffcb90c75fbc05544054faf15dcc1fdf9765f8b607f0", size = 672962, upload-time = "2026-05-20T14:09:15.532Z" }, + { url = "https://files.pythonhosted.org/packages/96/27/5565b5b40389f1c7753003a07e21892fda8660926787036d5bc0308b8113/greenlet-3.5.1-cp315-cp315-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e630136e905fe5ff43e86945ae41220b6d1470956a39220e708110ac48d01ea5", size = 665697, upload-time = "2026-05-20T13:14:32.943Z" }, + { url = "https://files.pythonhosted.org/packages/76/32/19d4e13225193c29b13e308015223f7d75fd3d8623d49dd19040d2ce8ec1/greenlet-3.5.1-cp315-cp315-manylinux_2_39_riscv64.whl", hash = "sha256:ef08c1567c78074b22d1a200183d52d04a14df447bf70bcbb6a3507a48e776fc", size = 476047, upload-time = "2026-05-20T14:01:44.39Z" }, + { url = "https://files.pythonhosted.org/packages/cf/82/e7de4178c0c2d1c9a5a3be3cc0b33e46a85b3ee4a77c071bf7ad8600e079/greenlet-3.5.1-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:975eac34b44a7077ca4d421348455b94f0f518246a7f14bc6d2fdcfe5b584368", size = 1621256, upload-time = "2026-05-20T14:02:31.91Z" }, + { url = "https://files.pythonhosted.org/packages/00/10/f2dddcf7dacac17dfc68691809589adad06135eb28930429cf58a6467a2f/greenlet-3.5.1-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:9ab3c3a0b2ae6198e67c898dad5215a49f9ae0d0081b3c3ec59f333e39eeca26", size = 1685956, upload-time = "2026-05-20T13:14:42.55Z" }, + { url = "https://files.pythonhosted.org/packages/22/17/4a232b32133230ada52f70e9d7f5b65b0caef8772f01849bd8d149e7e4ca/greenlet-3.5.1-cp315-cp315-win_amd64.whl", hash = "sha256:cbfc69be86e10dcfef5b1e6269d1d6926552aa89ee39e1de3353360c1b6989ab", size = 239802, upload-time = "2026-05-20T13:13:15.481Z" }, + { url = "https://files.pythonhosted.org/packages/c2/ae/4e623a7e6d4d2a5f4cb8e4c82de4169fc637942caae68d6e676b8a128ac5/greenlet-3.5.1-cp315-cp315-win_arm64.whl", hash = "sha256:92fd6d44ac5e5a887c8a5dc4a8ba0ba908527c31c12f78c6bc7dcfe8aab279f6", size = 236853, upload-time = "2026-05-20T13:15:37.301Z" }, + { url = "https://files.pythonhosted.org/packages/23/a1/59b0a7c7d140ff1a75626680b9a9899b79a9176cab298b394968fb023295/greenlet-3.5.1-cp315-cp315t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7546556f0d649f99f6a361098a55f761181bb2ea12ff150bb16d26092ad88244", size = 655333, upload-time = "2026-05-20T14:00:14.758Z" }, + { url = "https://files.pythonhosted.org/packages/72/1b/5efe127597625042218939d01855109f352779050768b670b52edcc16a6c/greenlet-3.5.1-cp315-cp315t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d5ee3ea898009fa898f85f9982255d35278c477bebe185beca249cab42d4526c", size = 659443, upload-time = "2026-05-20T14:05:50.159Z" }, + { url = "https://files.pythonhosted.org/packages/c9/9d/1dcdf7b95ab3cf8c7b6d7277c18a5e167312f2b362ddfcc5d5e6d8d84b43/greenlet-3.5.1-cp315-cp315t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a57b0d05a0448eed231d59c0ceb287dde984551e54cbc51ac2d4865712838e9c", size = 659998, upload-time = "2026-05-20T14:09:16.912Z" }, + { url = "https://files.pythonhosted.org/packages/6c/6d/c404246ea4d22d097a7426d0efb5b781bd7eb67715f09e79001bd552ab18/greenlet-3.5.1-cp315-cp315t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a5c81f74d204d3edd136ebfd50dce53acbb776995d721a0fe801626cfc93b8cd", size = 658356, upload-time = "2026-05-20T13:14:35.091Z" }, + { url = "https://files.pythonhosted.org/packages/05/7e/c4959664fc231d587d66d8e81f2095e98056ba1954beafdcbe635e251052/greenlet-3.5.1-cp315-cp315t-manylinux_2_39_riscv64.whl", hash = "sha256:b0703c2cef53e01baec47f7a3868009913ad71ec678bbecb42a6f40895e4ce62", size = 494470, upload-time = "2026-05-20T14:01:45.611Z" }, + { url = "https://files.pythonhosted.org/packages/51/02/f8ee37fb6d2219329f350af241c27fcf12df57e723d11f6fc6d3bacdadaa/greenlet-3.5.1-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:2c18ef16bf6d4dd410e4dd52996888ea1497be26892fe5bbc73580aba4287b8e", size = 1619216, upload-time = "2026-05-20T14:02:33.403Z" }, + { url = "https://files.pythonhosted.org/packages/93/c5/3dc9475ace2c7a3680da12372cddd7f1ac874eb410a1ac48d3e9dab83782/greenlet-3.5.1-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:17d86354f0ae6b61bf9be5148d0dd34e06c3cb7c602c671f79f29ac3b150e659", size = 1678427, upload-time = "2026-05-20T13:14:43.71Z" }, + { url = "https://files.pythonhosted.org/packages/df/4e/750c15c317a41ffb36f0bf40b933e3d744a7dede61889f74443ea69690cf/greenlet-3.5.1-cp315-cp315t-win_amd64.whl", hash = "sha256:e7516cf6ae6b8a582c2770a0caed47b8a48373ed732c33d69a72913ae6ac923e", size = 245225, upload-time = "2026-05-20T13:13:59.366Z" }, + { url = "https://files.pythonhosted.org/packages/4f/fd/d3baea2eeb7b617efd47e87ca06e2ec2c6118d303aa9e918e0ce16eadc10/greenlet-3.5.1-cp315-cp315t-win_arm64.whl", hash = "sha256:5028648bf2253ec4745add746129d3904121fa7fe871a76bed23c5720573ce0a", size = 239590, upload-time = "2026-05-20T13:13:37.382Z" }, ] [[package]] @@ -979,11 +1009,11 @@ wheels = [ [[package]] name = "idna" -version = "3.15" +version = "3.16" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/82/77/7b3966d0b9d1d31a36ddf1746926a11dface89a83409bf1483f0237aa758/idna-3.15.tar.gz", hash = "sha256:ca962446ea538f7092a95e057da437618e886f4d349216d2b1e294abfdb65fdc", size = 199245, upload-time = "2026-05-12T22:45:57.011Z" } +sdist = { url = "https://files.pythonhosted.org/packages/1a/88/bcf9709822fe69d02c2a6a77956c98ce6ea8ca8767a9aadcedc7eb6a2390/idna-3.16.tar.gz", hash = "sha256:d7a6da03db833450fca25d2358ac9ff06cd624577a4aea3a596d5c0f77b8e03d", size = 203770, upload-time = "2026-05-22T00:16:18.781Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d2/23/408243171aa9aaba178d3e2559159c24c1171a641aa83b67bdd3394ead8e/idna-3.15-py3-none-any.whl", hash = "sha256:048adeaf8c2d788c40fee287673ccaa74c24ffd8dcf09ffa555a2fbb59f10ac8", size = 72340, upload-time = "2026-05-12T22:45:55.733Z" }, + { url = "https://files.pythonhosted.org/packages/94/16/70255075a9859a0e3adb789b68ceb0e210dec03934245fd98d248226572f/idna-3.16-py3-none-any.whl", hash = "sha256:cc246e3a3f89580c3a951b5ad298ca4638078b2cdd4f115654332b5c26daded5", size = 74165, upload-time = "2026-05-22T00:16:16.698Z" }, ] [[package]] @@ -1749,18 +1779,22 @@ requires-dist = [ { name = "fastcore", marker = "extra == 'qsample'", specifier = ">=1.8.1" }, { name = "ldpc", specifier = ">=2.3.10" }, { name = "multiprocess", specifier = ">=0.70.17" }, + { name = "multiprocess", marker = "python_full_version >= '3.14'", specifier = ">=0.70.19" }, { name = "networkx", specifier = ">=3.4.2" }, { name = "numba", specifier = ">=0.57" }, { name = "numba", marker = "python_full_version >= '3.12'", specifier = ">=0.59" }, { name = "numba", marker = "python_full_version >= '3.13'", specifier = ">=0.61" }, + { name = "numba", marker = "python_full_version >= '3.14'", specifier = ">=0.63.1" }, { name = "numpy", specifier = ">=1.24.1" }, { name = "numpy", marker = "python_full_version >= '3.12'", specifier = ">=1.26" }, { name = "numpy", marker = "python_full_version >= '3.13'", specifier = ">=2.1" }, + { name = "numpy", marker = "python_full_version >= '3.14'", specifier = ">=2.3.2" }, { name = "pymatching", specifier = ">=2.2.2" }, { name = "qecsim", specifier = ">=1.0b9" }, { name = "qiskit", extras = ["qasm3-import"], specifier = ">=1.0.0" }, { name = "qsample", marker = "extra == 'qsample'", specifier = ">=0.0.2" }, { name = "scipy", specifier = ">=1.15.2" }, + { name = "scipy", marker = "python_full_version >= '3.14'", specifier = ">=1.16.1" }, { name = "sinter", specifier = ">=1.14.0" }, { name = "stim", specifier = ">=1.14.0" }, { name = "tqdm", specifier = ">=4.66.2" }, @@ -2586,7 +2620,7 @@ sdist = { url = "https://files.pythonhosted.org/packages/5d/ab/34ec41718af73c001 [[package]] name = "pymatching" -version = "2.3.1" +version = "2.4.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "matplotlib", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine != 'arm64' and sys_platform == 'win32') or sys_platform == 'linux'" }, @@ -2597,20 +2631,23 @@ dependencies = [ { name = "scipy", version = "1.15.3", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version < '3.11' and platform_machine == 'arm64' and sys_platform == 'darwin') or (python_full_version < '3.11' and platform_machine != 'arm64' and sys_platform == 'win32') or (python_full_version < '3.11' and sys_platform == 'linux')" }, { name = "scipy", version = "1.17.1", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version >= '3.11' and platform_machine == 'arm64' and sys_platform == 'darwin') or (python_full_version >= '3.11' and platform_machine != 'arm64' and sys_platform == 'win32') or (python_full_version >= '3.11' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c5/92/60f1419500b49afb0925b0536538c352ef71b4bf182c28b0e3861141fc81/pymatching-2.3.1.tar.gz", hash = "sha256:dac1afab0a190a003a3689a18c3afc5c99a5beaa6a099d79e3d4c8b24c1fa7c5", size = 347052, upload-time = "2025-09-25T21:46:25.293Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/19/39472c89d532e576890320eff5e9738e4b4d7828d027315f7e198ba0be8c/pymatching-2.4.0.tar.gz", hash = "sha256:0c30dafa506b086f50d15530debd7b7b39228597d22c52d5ccd114bcbb0a2326", size = 347169, upload-time = "2026-05-22T18:10:07.471Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/92/65/4e414c1a09b198b5ab771a9249cbbfe47c29951914e1393f787aaf8041b4/pymatching-2.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9f3bd434808ce6dc59730bed2fbb22bb2cc5454f13f4833ba621240e0d75d4f6", size = 380012, upload-time = "2025-09-25T21:45:57.439Z" }, - { url = "https://files.pythonhosted.org/packages/c4/3c/ecdc80293a45b4702a8fdb0630ebca9e93efd91a3b6b6986a81be9a5a3a1/pymatching-2.3.1-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fba6c1320dcad0268073cbba3b5e7296d94c61944a798cf8674cbaef68d9af91", size = 623778, upload-time = "2025-09-25T21:46:00.058Z" }, - { url = "https://files.pythonhosted.org/packages/ce/22/6757dc12b3adb5fc97adc414bee2fe63ce66fb534548288ef2d7e6b326f0/pymatching-2.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:b902eab5d530990eb577eabafc8969115252baa48eb9e9c7734b6bca97edc98c", size = 345417, upload-time = "2025-09-25T21:46:01.281Z" }, - { url = "https://files.pythonhosted.org/packages/9b/94/eee399cae91c349481467b03189832277ea79781f331cc04bde51834a1e1/pymatching-2.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:020a7bd1f8a2d312fe98f4eee594cff98395272ab868f93ee202adbdec1901bf", size = 381265, upload-time = "2025-09-25T21:46:02.262Z" }, - { url = "https://files.pythonhosted.org/packages/24/dc/946e33cdc7aa734913f2c97326ddcea0f0fdd3cfdcd7b986e5326f5d3ee3/pymatching-2.3.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d462371c7d9864fb1b7993018f16e2f105d732e5671c56dd14c9a789a1aa4861", size = 624637, upload-time = "2025-09-25T21:46:05.025Z" }, - { url = "https://files.pythonhosted.org/packages/56/97/14767cb0cb81de1cd2fc3211072bc3bdd08d0d4ae054eafa5584273a6a53/pymatching-2.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d27bd5cf79b25268dfce11fb9e3a47acd0a5c1f88815c2fab333eaa8bd45b7b", size = 346047, upload-time = "2025-09-25T21:46:05.991Z" }, - { url = "https://files.pythonhosted.org/packages/33/e9/cf2302b391f7c692feed5c1cddb07c2667722dd2944232cfb4c1a691e2ca/pymatching-2.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4bde7bac71e3b1b1d55569c664a7a2d0b0d87962df12b9b45ce3e287d0ac0dff", size = 380195, upload-time = "2025-09-25T21:46:07.26Z" }, - { url = "https://files.pythonhosted.org/packages/da/b5/25e97b533495a839780c89dac2b56e2b683100945ac4149645f9d95e7aee/pymatching-2.3.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b90cf168645adb78c9f81dd60c9e97e2aae005386b5795b54c8b4055d1492b1b", size = 626112, upload-time = "2025-09-25T21:46:09.591Z" }, - { url = "https://files.pythonhosted.org/packages/d9/50/e34731b6e7f1a46facaa5c189cc95a55b49a00730203d09f211ef4d5ee58/pymatching-2.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:1f3a0d307b30ef52b7a9cabb58ec27a08ef057e09bcbd00ffe3c40f4e31e606d", size = 347938, upload-time = "2025-09-25T21:46:10.65Z" }, - { url = "https://files.pythonhosted.org/packages/e0/ee/1e89ba6a2811fad9f1c8d4254812c97904ee386e0490cdd0ee8c68d5d1cd/pymatching-2.3.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5c010d2dc808a58e80874ada568a4d2bb8c9e81959b858e2e56a84ccc6b2b4ac", size = 380256, upload-time = "2025-09-25T21:46:11.567Z" }, - { url = "https://files.pythonhosted.org/packages/6f/22/0d0494562792575be67358dcd8951678449b273af168dd5e52b887e51ab1/pymatching-2.3.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d0edddbae8437d173d7c1314c9cb853d4abc9b84be9b2274f76972ba89b1b5b5", size = 625873, upload-time = "2025-09-25T21:46:14.068Z" }, - { url = "https://files.pythonhosted.org/packages/1f/c4/0e53ff3c9312ffb0e1677ebb62172660c5614077dca9c69ccfc31b90b7e4/pymatching-2.3.1-cp313-cp313-win_amd64.whl", hash = "sha256:7ebce2e8bc98379f0bb7643a0ef0171142cf384ba626e46108c84249c868f0a6", size = 347977, upload-time = "2025-09-25T21:46:15.044Z" }, + { url = "https://files.pythonhosted.org/packages/81/56/f12f6ffbae1eb625cd5865e819a68c4c3a18ca66a805b922d627bdaaf6d1/pymatching-2.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c51ee0ffa161f35ae6b887a0bebdf85e3fa456139e56d5e070823ef0434f692f", size = 380016, upload-time = "2026-05-22T18:09:21.66Z" }, + { url = "https://files.pythonhosted.org/packages/95/b7/fb2c636ecd614617f5facf075b9b01d2bde4bdac3f84fe930b8e9db8079e/pymatching-2.4.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fd8699227cda0d9c95152ee67ce2e5119fc845ff7951bfd8ed34dab9628733c1", size = 623826, upload-time = "2026-05-22T18:09:25.285Z" }, + { url = "https://files.pythonhosted.org/packages/3d/e3/eb30dd8f5e0e209d0fc703fcf43a6a4c37703339198ba12a9c92b78c4393/pymatching-2.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:4683b652ba3983bc26405107382d666d8ccf68f53ea50fc5fb274251871177ec", size = 345239, upload-time = "2026-05-22T18:09:27.033Z" }, + { url = "https://files.pythonhosted.org/packages/0e/21/e1985ee29b8cc3f317c8a2504fdee1bb9ba1e13c1dd1220a9bcf35ad537c/pymatching-2.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:133168b1fec946bfc992a9e5abbdbbc7eebc672b04d27cfd060ea153eb6cf576", size = 381268, upload-time = "2026-05-22T18:09:28.887Z" }, + { url = "https://files.pythonhosted.org/packages/0b/6c/9b5a4c35727d74917b8a611f8cacbe9e5c81198648bcd7b5958f6573d39e/pymatching-2.4.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ac25684a41ab859cbb0f2ea34d86485aa89d4d22f97df684f9579c167c7d560a", size = 624601, upload-time = "2026-05-22T18:09:32.111Z" }, + { url = "https://files.pythonhosted.org/packages/7c/27/990d222ce88eba0f9afa4af68dc00adaf0134348c743feee0c1ab647f9eb/pymatching-2.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:1a1b831f8ebf47f5e2a865d1bcc250da208c57ff881a37177ee548248da447c2", size = 345942, upload-time = "2026-05-22T18:09:33.822Z" }, + { url = "https://files.pythonhosted.org/packages/80/bc/4983d49570d97b4489de8ed1580faea58e63a16e6c7046e45aaa636ea054/pymatching-2.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:881f3410975b5a2d393561d44fa4513c878653d0e718e55930b08f52e9a04fc5", size = 380199, upload-time = "2026-05-22T18:09:35.25Z" }, + { url = "https://files.pythonhosted.org/packages/0f/03/b3186c28500a5aa751f7fc37b52fe6129ba24092604a8118faea456f482c/pymatching-2.4.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:15e6d73153713a8f383f44ba4497d478fb4c4d765fbdd30f9fc1e1d47af75760", size = 626230, upload-time = "2026-05-22T18:09:38.547Z" }, + { url = "https://files.pythonhosted.org/packages/60/c8/d9abe73cc6dbaddf61d3c5875a9687aaa9591a976b109cc7cb6b7595cccb/pymatching-2.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:eb4428581a2578a8cc77f695ab267c184f444d9de5cb25301fe9f3f893214ea4", size = 347707, upload-time = "2026-05-22T18:09:40.805Z" }, + { url = "https://files.pythonhosted.org/packages/ac/18/375faa94219e1781ef5fc05aac95a2ba1047e0071069f2aae1416bfeb393/pymatching-2.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:fe3baa498155a227f5ce1ee6fe07f40524d9fb9961ac299a2050e69f7de50dba", size = 380257, upload-time = "2026-05-22T18:09:43.042Z" }, + { url = "https://files.pythonhosted.org/packages/80/8d/a4450b34a032cc7eee70b45c21a03d32c89dad311ea5b41deb386539fbcb/pymatching-2.4.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6450797ca5001449fcf5b43a68181a783f4ca50650f880a02ef5bf91b13aa359", size = 625936, upload-time = "2026-05-22T18:09:46.059Z" }, + { url = "https://files.pythonhosted.org/packages/c3/c5/ca8cd432ce388cdbdc7df86110a2987d7526743269416d0a1cc83d5b2fd7/pymatching-2.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:a14022ecf4e810152db998d14429d430630433b9ed1edc2abe53494753b0a0ca", size = 347728, upload-time = "2026-05-22T18:09:47.678Z" }, + { url = "https://files.pythonhosted.org/packages/13/65/4289d2923789a407ca34e67b0d44f47caeba1f2219abdfa5f679a66e6e72/pymatching-2.4.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0e071c90c108daf1c6f8cefcac9ad4989a1a1694fe7433ee413cef7b65f4207e", size = 381252, upload-time = "2026-05-22T18:09:49.122Z" }, + { url = "https://files.pythonhosted.org/packages/33/13/be44c3e2f8749652c23adc77a94c4efe5383287a4c01a548cc031d0e439c/pymatching-2.4.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:70869b2a4a8fab2f1e54cc0b68fd050b7556133b5ce8c2d2d5d4f4d1319c14d3", size = 625898, upload-time = "2026-05-22T18:09:52.415Z" }, + { url = "https://files.pythonhosted.org/packages/17/0d/eb2df17fe0bf089c43445ba759e89150a0d36fb7fcbc44e750d8d31f0dbe/pymatching-2.4.0-cp314-cp314-win_amd64.whl", hash = "sha256:5c5ce4ed245d3670ea7d62b09f8a29b105533b032a3d21fdf6df04c9b6441ff1", size = 356304, upload-time = "2026-05-22T18:09:54.3Z" }, ] [[package]] @@ -3294,7 +3331,7 @@ wheels = [ [[package]] name = "sinter" -version = "1.15.0" +version = "1.16.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "matplotlib", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine != 'arm64' and sys_platform == 'win32') or sys_platform == 'linux'" }, @@ -3304,10 +3341,7 @@ dependencies = [ { name = "scipy", version = "1.17.1", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version >= '3.11' and platform_machine == 'arm64' and sys_platform == 'darwin') or (python_full_version >= '3.11' and platform_machine != 'arm64' and sys_platform == 'win32') or (python_full_version >= '3.11' and sys_platform == 'linux')" }, { name = "stim", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine != 'arm64' and sys_platform == 'win32') or sys_platform == 'linux'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/78/ce/ba7f22ac1535b95b16f046678d133b2af65288effb6e4e99c28b576ef54d/sinter-1.15.0.tar.gz", hash = "sha256:47c7e4412d73bcbd5cabca49b6d9bfc0b33eb18d333f525076512e0efa873d45", size = 176702, upload-time = "2025-05-07T06:19:38.872Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/62/45/be8193757e44880348dc9561bedadce0b815b408c959ceaf56c1863fd65d/sinter-1.15.0-py3-none-any.whl", hash = "sha256:6bec05cc643e301192c2acaca9ede464576572635c5e25a592e48294b7e53bed", size = 196891, upload-time = "2025-05-07T06:19:37.398Z" }, -] +sdist = { url = "https://files.pythonhosted.org/packages/cd/6b/b546cc9240fb1b64417c8ca00038ce1927ffd6e8a0d4e46ad237242dbcd8/sinter-1.16.0.tar.gz", hash = "sha256:fd0f7bff97cb951345893f53b347d76f99b53977590054abc3d057150f82037b", size = 177330, upload-time = "2026-05-22T05:41:49.762Z" } [[package]] name = "six" @@ -3715,25 +3749,29 @@ wheels = [ [[package]] name = "stim" -version = "1.15.0" +version = "1.16.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version < '3.11' and platform_machine == 'arm64' and sys_platform == 'darwin') or (python_full_version < '3.11' and platform_machine != 'arm64' and sys_platform == 'win32') or (python_full_version < '3.11' and sys_platform == 'linux')" }, { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version >= '3.11' and platform_machine == 'arm64' and sys_platform == 'darwin') or (python_full_version >= '3.11' and platform_machine != 'arm64' and sys_platform == 'win32') or (python_full_version >= '3.11' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/77/15/0218eacd61cda992daf398bc36daf9830c8b430157a3ac0c06379598d24a/stim-1.15.0.tar.gz", hash = "sha256:95236006859d6754be99629d4fb44788e742e962ac8c59caad421ca088f7350e", size = 853226, upload-time = "2025-05-07T06:19:30.452Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/16/85/e82bd61413db51c92642620340c9175f0e1e93d2afc5274e8fa775831326/stim-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6f240c196f23126bfed79bd78de5baa1fdde9c8fbfe56de032a12657fc42da37", size = 1824039, upload-time = "2025-05-07T06:18:31.537Z" }, - { url = "https://files.pythonhosted.org/packages/d8/06/b267359c50d735ca718dd487ec57842d0ed34865b62b0d8e6bdc3381d611/stim-1.15.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31c55fad7529d6ee508f268534eeca1433017f2e83082f88275bea362b94f30f", size = 4982908, upload-time = "2025-05-07T06:18:33.035Z" }, - { url = "https://files.pythonhosted.org/packages/c6/2c/84b07f2fe78f382c3514ce3863554ae47019536293d366e80e57598fe9cb/stim-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:d94638feaac9d037690779c383592bb898eda9db460d23fc0652d10030d570c9", size = 2624472, upload-time = "2025-05-07T06:18:34.678Z" }, - { url = "https://files.pythonhosted.org/packages/a8/82/0a01580071c6d50107298e93faa88250fc30f1538117ec887ec48de7816d/stim-1.15.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0bb3757c69c9b16fd24ff7400b5cddb22017c4cae84fc4b7b73f84373cb03c00", size = 1826988, upload-time = "2025-05-07T06:18:38.598Z" }, - { url = "https://files.pythonhosted.org/packages/d7/c1/1dfa90b0622070eb39b4260eca26814d6fbac0f278e23b156072d9fac86b/stim-1.15.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0fb249f1a2897a22cbe4e0c2627abf49188cbbf19b942d4749972d1c3bdf12c", size = 4989254, upload-time = "2025-05-07T06:18:40.628Z" }, - { url = "https://files.pythonhosted.org/packages/cb/27/5b8e8155e7fb75a9313e70f77a62233e0b9041c5acb60f6cf5a908d221e8/stim-1.15.0-cp311-cp311-win_amd64.whl", hash = "sha256:6e3b61a2d9dc4b4312f5cf2ccf9c9f7175fe13a12e5c08df99835c5275680919", size = 2625370, upload-time = "2025-05-07T06:18:42.65Z" }, - { url = "https://files.pythonhosted.org/packages/46/f3/5aa6a7b31bcc9fb2540f65954b99dbf1e8c5fcd8d0aa164857b74e5eae9a/stim-1.15.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc613f78bc88b4318d7f34f9fddacec52638c11b72cc618f911bdd7ca153f938", size = 1838840, upload-time = "2025-05-07T06:18:46.025Z" }, - { url = "https://files.pythonhosted.org/packages/5b/25/f3b56b07c0c3fb31cb973a5c47ef88da022a859940dd46c910b706fc74aa/stim-1.15.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fdd9e5ab85ba2fb113b8834422518f6e46a4aea2e0f6f7305cfc2ad0fcd07086", size = 4968123, upload-time = "2025-05-07T06:18:48.197Z" }, - { url = "https://files.pythonhosted.org/packages/81/7e/abfed103a045a6ee8c7f3f00cd820d1cf9127304066aec42ea9fb89ee9c0/stim-1.15.0-cp312-cp312-win_amd64.whl", hash = "sha256:e92d5be90f6c92bada6b5aea64dfe9c80813a06e1316a71d5a36203dd24492f5", size = 2625908, upload-time = "2025-05-07T06:18:49.681Z" }, - { url = "https://files.pythonhosted.org/packages/bb/99/10604264cd7159573d6d01cdf5f9675c71580dcc3df5c533fccabad59cda/stim-1.15.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:35e36d0479015b4dcb4261b8b68be85067cbd4bac5632bdfdb3ee3f8671d05a9", size = 1838700, upload-time = "2025-05-07T06:18:52.95Z" }, - { url = "https://files.pythonhosted.org/packages/25/97/1bf3bf16129667eff1c0d0f3bb95262a2bec8c8d1227aa973b8e2a1935b6/stim-1.15.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb9465ab120837ecbd26b5af216a00715f04da087ddcfa09646892c8de720d09", size = 4967782, upload-time = "2025-05-07T06:18:54.94Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/77/bd/c0f5d6241cdb806400a63e0c7febe22982ddf1c8761142bb0ea6b51d3f50/stim-1.16.0.tar.gz", hash = "sha256:9092a996429dcf616d8d4ca01fec886b7b310caf9425a39fcfe499005636bd52", size = 882497, upload-time = "2026-05-22T05:41:56.575Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/71/cc/f7ebbe95361ce7b5c5da47ce024543846d6aca9fbbedd6833aeb33dccf15/stim-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:84b777678cc12e808b3d6747d57e07eed951f8ec18047a936dfa25dbc950a2e2", size = 1889327, upload-time = "2026-05-22T05:41:21.869Z" }, + { url = "https://files.pythonhosted.org/packages/c5/30/90d9ed81b10c4850e108b81346c2c6e2784126945342d591272ed090e027/stim-1.16.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:41c02d52af847e0ab886c35751e8f7e17e2e0d055e390ece93a50a12dcf87e56", size = 5235305, upload-time = "2026-05-22T05:41:23.6Z" }, + { url = "https://files.pythonhosted.org/packages/4c/43/4e5036fdc3c8bdfb4d774a4fff0cb8a0f44609ae18aa858ae37f61649cd1/stim-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:609666b77197d45705e1579a9840123a53cebe614e8bf1d496c0df24f797e653", size = 2753255, upload-time = "2026-05-22T05:41:25.49Z" }, + { url = "https://files.pythonhosted.org/packages/be/37/3742215d5fd4e090ce7ae964e43d978d1ac9865b5865530a6d5f1063a124/stim-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1890bda08adfd6daa875d1d5e41039c5ae8c58faabc7cd1813f8d8de9f1536a2", size = 1892693, upload-time = "2026-05-22T05:41:28.958Z" }, + { url = "https://files.pythonhosted.org/packages/d4/d8/a84d59b49395e4f8e080991915929c69e1e6a40c411a9c0998904dbf8bef/stim-1.16.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bd2d28093818f981f8dedb2be160b62d818279b81748d72dc4fca6cdd160291d", size = 5248218, upload-time = "2026-05-22T05:41:31.191Z" }, + { url = "https://files.pythonhosted.org/packages/b8/87/a845b9d17ab5e352eee30169a58bd8213e85ff47c6340daff2f8a25ed28e/stim-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:b367f90826e796417932ea46c0e53d80e3c5bebac0c6633c0aa07a8fcaa4298b", size = 2755461, upload-time = "2026-05-22T05:41:33.426Z" }, + { url = "https://files.pythonhosted.org/packages/51/e3/45a8c0889f4629027cbdd8ed8e9f5824b5bd8b12b0f5d24be27ec0c2a3dc/stim-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b8580dfbe5ff27594dd15a83b24262630b82cf089d1463d29dbee90ffbc6898b", size = 1902644, upload-time = "2026-05-22T05:41:36.132Z" }, + { url = "https://files.pythonhosted.org/packages/e4/71/db565f5bd0f273414e90d85551eed1c75f7b689847bd605a7cf0c4c0386d/stim-1.16.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:883b24c3c95fa69818e931e8b60daf4fc8195d159d321e7548d8706dbac16558", size = 5307850, upload-time = "2026-05-22T05:41:37.69Z" }, + { url = "https://files.pythonhosted.org/packages/bb/65/0ddfa6f76c4a137aefeee4d51a65945e0ec77cc2221322f13a5768f4c488/stim-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:85b9c544c65377a42c6b5c9a57616a5ed5580e1cabb286a604800a045c7a12fb", size = 2760794, upload-time = "2026-05-22T05:41:39.731Z" }, + { url = "https://files.pythonhosted.org/packages/21/40/9499fb076b819b479bffad35afd34e84a93c86f117fb5431dab211adff4f/stim-1.16.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:66dbc6532169df84d127ceede353b15445e845a94aa008c5d0a4062b51cc2b02", size = 1902498, upload-time = "2026-05-22T05:41:43.564Z" }, + { url = "https://files.pythonhosted.org/packages/dd/d1/6a9bca80b6ffe0fc4a3b0375ac18ff9fb1e815d152691332e55d1a9e5fa2/stim-1.16.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f22a009bad1e7816aeb70bdeafb6789e4840710da070f69cde91e2ac6cf1e800", size = 5307953, upload-time = "2026-05-22T05:41:45.32Z" }, + { url = "https://files.pythonhosted.org/packages/d7/15/db7f4b80a0903e0962f5d824ca8cb5a962836399bd45fda59961782ebb20/stim-1.16.0-cp313-cp313-win_amd64.whl", hash = "sha256:55231457b5897b0ef798059aae01d9e8247fc8b2089e8a27f9f4bb13b0342af2", size = 2760785, upload-time = "2026-05-22T05:41:47.156Z" }, + { url = "https://files.pythonhosted.org/packages/b2/d1/a898d8e587a8718daabaf886f2d0c22c126a691886765096a0776b5b463c/stim-1.16.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1fa60a13ef921d6e6aea420e2fe7551d71a4a07b513d86da89e39259dd3739f9", size = 1898162, upload-time = "2026-05-22T05:41:50.973Z" }, + { url = "https://files.pythonhosted.org/packages/fc/b2/8535802f6eb5230678b067cde35b81fc612c612698f192b31164c6a19b9f/stim-1.16.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f94040cbeeff786e7fb8860249e54d9ba3f777b5b098d21f1eccd072d3a3c32a", size = 5311829, upload-time = "2026-05-22T05:41:53.291Z" }, + { url = "https://files.pythonhosted.org/packages/f5/85/be0fe295a5c5426aec0a2f8497360d9db8083d62c04de81bf744d29a131e/stim-1.16.0-cp314-cp314-win_amd64.whl", hash = "sha256:ed3aa70f82690946ba6f70abb9dad448d49ab9499fa5161de5f286da87c30ab1", size = 2825951, upload-time = "2026-05-22T05:41:55.018Z" }, ] [[package]] From 5215b1d760862a764038c178f7b5684001c02542 Mon Sep 17 00:00:00 2001 From: Daniel Haag <121057143+denialhaag@users.noreply.github.com> Date: Fri, 22 May 2026 20:34:09 +0200 Subject: [PATCH 2/3] Fix ty errors --- .../stim_interface/color_code_stim.py | 2 +- src/mqt/qecc/circuit_synthesis/cat_states.py | 36 ++++++------- .../qecc/circuit_synthesis/circuit_utils.py | 17 +++--- src/mqt/qecc/circuit_synthesis/circuits.py | 6 +-- src/mqt/qecc/circuit_synthesis/encoding.py | 30 +++++------ src/mqt/qecc/circuit_synthesis/noise.py | 2 +- src/mqt/qecc/circuit_synthesis/operations.py | 52 +++++++++---------- src/mqt/qecc/circuit_synthesis/simulation.py | 14 ++--- src/mqt/qecc/cococo/internal_testing.py | 20 +++---- tests/circuit_synthesis/test_circuits.py | 14 ++--- tests/circuit_synthesis/test_utils.py | 26 +++++----- 11 files changed, 110 insertions(+), 109 deletions(-) diff --git a/src/mqt/qecc/cc_decoder/stim_interface/color_code_stim.py b/src/mqt/qecc/cc_decoder/stim_interface/color_code_stim.py index 641e851a..a2042539 100644 --- a/src/mqt/qecc/cc_decoder/stim_interface/color_code_stim.py +++ b/src/mqt/qecc/cc_decoder/stim_interface/color_code_stim.py @@ -89,7 +89,7 @@ def gen_stim_circuit_memory_experiment( """Generate a stim circuit for a memory experiment on the 2D color code.""" data_qubits = range(len(pcm[0])) circuit = stim.Circuit() - circuit.append("R", data_qubits) # ty: ignore[no-matching-overload] + circuit.append("R", data_qubits) # initialization circuit = add_checks_one_round(pcm, circuit, False, 0) diff --git a/src/mqt/qecc/circuit_synthesis/cat_states.py b/src/mqt/qecc/circuit_synthesis/cat_states.py index 7654f466..e8d47fa1 100644 --- a/src/mqt/qecc/circuit_synthesis/cat_states.py +++ b/src/mqt/qecc/circuit_synthesis/cat_states.py @@ -73,9 +73,9 @@ def cat_state_line(w: int) -> stim.Circuit: noisy stim circuit preparing the cat state """ circ = stim.Circuit() - circ.append("H", [0]) # ty: ignore[no-matching-overload] + circ.append("H", [0]) for i in reversed(range(1, w)): - circ.append("CX", [0, i]) # ty: ignore[no-matching-overload] + circ.append("CX", [0, i]) return circ @@ -153,7 +153,7 @@ def sample_cat_state( circ = self._get_noisy_circ(p) # Final, *noise-free* measurement of data qubits circ.append("TICK") # ty: ignore[invalid-argument-type] - circ.append("MR", list(range(self.w1))) # ty: ignore[no-matching-overload] + circ.append("MR", list(range(self.w1))) if batch_size is None: batch_size = n_samples @@ -290,8 +290,8 @@ def _add_qubit_initializations(circ: stim.Circuit) -> stim.Circuit: hadamard_qubits.update(t.value for t in gate.targets_copy()) with_inits = with_inits[::-1] - with_inits.append("RX", list(hadamard_qubits - is_initialized)) # ty: ignore[no-matching-overload] - with_inits.append("R", [q for q in range(circ.num_qubits) if q not in hadamard_qubits and q not in is_initialized]) # ty: ignore[no-matching-overload] + with_inits.append("RX", list(hadamard_qubits - is_initialized)) + with_inits.append("R", [q for q in range(circ.num_qubits) if q not in hadamard_qubits and q not in is_initialized]) return with_inits[::-1] @@ -417,14 +417,14 @@ def fault_gens_from_circuit(circ: stim.Circuit) -> list[int]: def _ft_w_4_cat_state() -> tuple[stim.Circuit, list[tuple[list[int], list[int]]]]: circ = stim.Circuit() - circ.append("RX", [4]) # ty: ignore[no-matching-overload] - circ.append("R", [0, 1, 2, 3]) # ty: ignore[no-matching-overload] - circ.append("CX", [4, 0]) # ty: ignore[no-matching-overload] - circ.append("CX", [0, 1]) # ty: ignore[no-matching-overload] - circ.append("CX", [1, 2]) # ty: ignore[no-matching-overload] - circ.append("CX", [2, 3]) # ty: ignore[no-matching-overload] - circ.append("CX", [3, 4]) # ty: ignore[no-matching-overload] - circ.append("MR", [4]) # ty: ignore[no-matching-overload] + circ.append("RX", [4]) + circ.append("R", [0, 1, 2, 3]) + circ.append("CX", [4, 0]) + circ.append("CX", [0, 1]) + circ.append("CX", [1, 2]) + circ.append("CX", [2, 3]) + circ.append("CX", [3, 4]) + circ.append("MR", [4]) return circ, [([4], [0, 1, 2, 3])] @@ -490,10 +490,10 @@ def _recurse(w1: int, w2: int) -> tuple[stim.Circuit, list[tuple[list[int], list new_measurements = [] for i in range(n_meas): anc = circ.num_qubits - circ.append("R", [anc]) # ty: ignore[no-matching-overload] - circ.append("CX", [i, anc]) # ty: ignore[no-matching-overload] - circ.append("CX", [i + w1, anc]) # ty: ignore[no-matching-overload] - circ.append("MR", [anc]) # ty: ignore[no-matching-overload] + circ.append("R", [anc]) + circ.append("CX", [i, anc]) + circ.append("CX", [i + w1, anc]) + circ.append("MR", [anc]) new_measurements.append(anc) data_to_flip = list(range(w1)) if w1 < w2 else list(range(w1, w1 + w2)) @@ -629,7 +629,7 @@ def simulate_recursive_cat_construction( circ_run += circ_base circ_run.append("TICK") # ty: ignore[invalid-argument-type] # measure data at the end - circ_run.append("MR", list(range(w))) # ty: ignore[no-matching-overload] + circ_run.append("MR", list(range(w))) data_cols_start = len(meas_index_of_qubit) # data bits are at the end circ_noisy = circ_run diff --git a/src/mqt/qecc/circuit_synthesis/circuit_utils.py b/src/mqt/qecc/circuit_synthesis/circuit_utils.py index b4fae265..480305ed 100644 --- a/src/mqt/qecc/circuit_synthesis/circuit_utils.py +++ b/src/mqt/qecc/circuit_synthesis/circuit_utils.py @@ -45,7 +45,7 @@ def relabel_qubits(circ: Circuit, qubit_mapping: dict[int, int] | int) -> Circui relabelled_qubits = [qubit_mapping[q.value] for q in op.targets_copy()] else: relabelled_qubits = [q.value + qubit_mapping for q in op.targets_copy()] - new_circ.append(op.name, relabelled_qubits) # ty: ignore[no-matching-overload] + new_circ.append(op.name, relabelled_qubits) return new_circ @@ -67,10 +67,10 @@ def qiskit_to_stim_circuit(qc: QuantumCircuit) -> Circuit: op = gate.operation.name qubit = qc.find_bit(gate.qubits[0])[0] if op in single_qubit_gate_map: - stim_circuit.append(single_qubit_gate_map[op], [qubit]) # ty: ignore[no-matching-overload] + stim_circuit.append(single_qubit_gate_map[op], [qubit]) elif op == "cx": target = qc.find_bit(gate.qubits[1])[0] - stim_circuit.append("CX", [qubit, target]) # ty: ignore[no-matching-overload] + stim_circuit.append("CX", [qubit, target]) elif op == "barrier": stim_circuit.append("TICK") # ty: ignore[invalid-argument-type] else: @@ -149,8 +149,9 @@ def collect_circuit_layers(circ: Circuit, scheduling_method: str = "asap") -> li assert isinstance(instr, CircuitInstruction) for grp in instr.target_groups(): qubits = [q.qubit_value for q in grp] - circ_copy.append(instr.name, qubits) # ty: ignore[no-matching-overload] - circ_copy.append("TICK", []) # ty: ignore[no-matching-overload] + assert all(qubit is not None for qubit in qubits) + circ_copy.append(instr.name, cast("list[int]", qubits)) + circ_copy.append("TICK", []) if scheduling_method == "alap": circ_copy = circ_copy[::-1] # Reverse the circuit for ALAP scheduling @@ -181,7 +182,7 @@ def collect_circuit_layers(circ: Circuit, scheduling_method: str = "asap") -> li # Check if any qubit from this instruction is already used in the layer if not any(qubit_layer_used[q] for q in qubits): - layer.append(instr.name, qubits) # ty: ignore[no-matching-overload] + layer.append(instr.name, qubits) instr_to_delete.append(idx) # Mark this instruction for removal # Mark the qubits used in this instruction @@ -229,7 +230,7 @@ def remove_single_qubit_gates(circ: Circuit) -> Circuit: assert isinstance(op, CircuitInstruction) if all(len(grp) == 1 for grp in op.target_groups()): continue - new_circ.append(op.name, _get_qubit_values(op)) # ty: ignore[no-matching-overload] + new_circ.append(op.name, _get_qubit_values(op)) return new_circ @@ -246,7 +247,7 @@ def remove_swap_gates(circ: Circuit) -> Circuit: for op in circ: if op.name == "SWAP": continue - new_circ.append(op.name, _get_qubit_values(op)) # ty: ignore[no-matching-overload] + new_circ.append(op.name, _get_qubit_values(op)) return new_circ diff --git a/src/mqt/qecc/circuit_synthesis/circuits.py b/src/mqt/qecc/circuit_synthesis/circuits.py index bf17a099..88549ef9 100644 --- a/src/mqt/qecc/circuit_synthesis/circuits.py +++ b/src/mqt/qecc/circuit_synthesis/circuits.py @@ -179,7 +179,7 @@ def to_stim_circuit(self, with_resets: bool = True) -> stim.Circuit: result = stim.Circuit() for qubit, basis in self._initializations.items(): - result.append("R" + basis, [qubit]) # ty: ignore[no-matching-overload] + result.append("R" + basis, [qubit]) result += self._circ @@ -387,10 +387,10 @@ def to_stim_circuit(self, with_resets: bool = True) -> stim.Circuit: if with_resets: for qubit, basis in self._initializations.items(): - stim_circuit.append("R" + basis, [qubit]) # ty: ignore[no-matching-overload] + stim_circuit.append("R" + basis, [qubit]) if self.cnots: - stim_circuit.append("CX", [qubit for pair in self.cnots for qubit in pair]) # ty: ignore[no-matching-overload] + stim_circuit.append("CX", [qubit for pair in self.cnots for qubit in pair]) return stim_circuit diff --git a/src/mqt/qecc/circuit_synthesis/encoding.py b/src/mqt/qecc/circuit_synthesis/encoding.py index caa183b5..c8a69676 100644 --- a/src/mqt/qecc/circuit_synthesis/encoding.py +++ b/src/mqt/qecc/circuit_synthesis/encoding.py @@ -456,27 +456,27 @@ def cz_var(depth: int, q1: int, q2: int) -> z3.BoolRef: # Single-qubit gates. for q in range(n): if model_bool(model, h_gate[depth][q]): - reduction.append("H", [q]) # ty: ignore[no-matching-overload] + reduction.append("H", [q]) elif model_bool(model, s_gate[depth][q]): - reduction.append("S", [q]) # ty: ignore[no-matching-overload] + reduction.append("S", [q]) elif model_bool(model, sqrt_x_gate[depth][q]): - reduction.append("SQRT_X", [q]) # ty: ignore[no-matching-overload] + reduction.append("SQRT_X", [q]) # Two-qubit gates. for (control, target), gate in cx_gate[depth].items(): if model_bool(model, gate): - reduction.append("CX", [control, target]) # ty: ignore[no-matching-overload] + reduction.append("CX", [control, target]) for (q1, q2), gate in cz_gate[depth].items(): if model_bool(model, gate): - reduction.append("CZ", [q1, q2]) # ty: ignore[no-matching-overload] + reduction.append("CZ", [q1, q2]) # Normalize terminal X-pivot ancillas to Z-pivot ancillas. # In the final encoder this becomes initial H preparation of those ancillas. x_pivot_ancillas: list[int] = [q for q in range(n) if model_bool(model, x_pivot[q])] if x_pivot_ancillas: - reduction.append("H", x_pivot_ancillas) # ty: ignore[no-matching-overload] + reduction.append("H", x_pivot_ancillas) # Extract which physical qubits carry the input logical qubits. encoding_qubits: list[int] = [] @@ -496,7 +496,7 @@ def cz_var(depth: int, q1: int, q2: int) -> z3.BoolRef: encoder_circuit = stim.Circuit() if ancilla_qubits: - encoder_circuit.append("RZ", ancilla_qubits) # ty: ignore[no-matching-overload] + encoder_circuit.append("RZ", ancilla_qubits) encoder_circuit += reduction.inverse() @@ -533,11 +533,11 @@ def cz_var(depth: int, q1: int, q2: int) -> z3.BoolRef: for q, (xv, zv) in enumerate(zip(x_correction, z_correction, strict=False)): if xv == 1 and zv == 1: - encoder_circuit.append("Y", [q]) # ty: ignore[no-matching-overload] + encoder_circuit.append("Y", [q]) elif xv == 1: - encoder_circuit.append("X", [q]) # ty: ignore[no-matching-overload] + encoder_circuit.append("X", [q]) elif zv == 1: - encoder_circuit.append("Z", [q]) # ty: ignore[no-matching-overload] + encoder_circuit.append("Z", [q]) return CliffordIsometry.from_stim_circuit(encoder_circuit) @@ -744,7 +744,7 @@ def gottesman_encoding_circuit(tableau: StabilizerTableau | Sequence[str]) -> Cl z_part[row] = t if x_part[row][column] == 0: - circ.append("H", [column]) # ty: ignore[no-matching-overload] + circ.append("H", [column]) t = x_part[:, column].copy() x_part[:, column] = z_part[:, column] z_part[:, column] = t @@ -753,18 +753,18 @@ def gottesman_encoding_circuit(tableau: StabilizerTableau | Sequence[str]) -> Cl for q in np.where(x_part[row])[0]: if q == column: continue - circ.append("CX", [column, q]) # ty: ignore[no-matching-overload] + circ.append("CX", [column, q]) x_part[:, q] ^= x_part[:, column] z_part[:, column] ^= z_part[:, q] if z_part[row][column] == 1: - circ.append("S", [column]) # ty: ignore[no-matching-overload] + circ.append("S", [column]) z_part[:, column] ^= x_part[:, column] for q in np.where(z_part[row])[0]: if q == column: continue - circ.append("CZ", [column, q]) # ty: ignore[no-matching-overload] + circ.append("CZ", [column, q]) z_part[:, q] ^= x_part[:, column] z_part[:, column] ^= x_part[:, q] @@ -772,7 +772,7 @@ def gottesman_encoding_circuit(tableau: StabilizerTableau | Sequence[str]) -> Cl x_part[:, column] = 0 x_part[row, column] = 1 - circ.append("H", initialized) # ty: ignore[no-matching-overload] + circ.append("H", initialized) circ = circ.inverse() signs = [s.sign for s in circ.to_tableau().to_stabilizers()] diff --git a/src/mqt/qecc/circuit_synthesis/noise.py b/src/mqt/qecc/circuit_synthesis/noise.py index 0609907f..819d00fb 100644 --- a/src/mqt/qecc/circuit_synthesis/noise.py +++ b/src/mqt/qecc/circuit_synthesis/noise.py @@ -244,7 +244,7 @@ def apply(self, circ: Circuit) -> Circuit: assert isinstance(op, CircuitInstruction) for grp in op.target_groups(): layer_circ = Circuit() - layer_circ.append(op.name, grp) # ty: ignore[no-matching-overload] + layer_circ.append(op.name, grp) layers.append(layer_circ) if self.resets_alap: diff --git a/src/mqt/qecc/circuit_synthesis/operations.py b/src/mqt/qecc/circuit_synthesis/operations.py index 5d25b22a..798d80c2 100644 --- a/src/mqt/qecc/circuit_synthesis/operations.py +++ b/src/mqt/qecc/circuit_synthesis/operations.py @@ -187,18 +187,18 @@ def append_to_circuit(self, circuit: stim.Circuit) -> None: basis_change = {"Z": [], "X": ["H"], "Y": ["S_DAG", "H"]} undo_basis_change = {"Z": [], "X": ["H"], "Y": ["H", "S"]} for g in basis_change[p_i]: - circuit.append(g, [i]) # ty: ignore[no-matching-overload] + circuit.append(g, [i]) for g in basis_change[p_j]: - circuit.append(g, [j]) # ty: ignore[no-matching-overload] + circuit.append(g, [j]) - circuit.append("CZ", [i, j]) # ty: ignore[no-matching-overload] - circuit.append("S", [i]) # ty: ignore[no-matching-overload] - circuit.append("S", [j]) # ty: ignore[no-matching-overload] + circuit.append("CZ", [i, j]) + circuit.append("S", [i]) + circuit.append("S", [j]) for g in undo_basis_change[p_j]: - circuit.append(g, [j]) # ty: ignore[no-matching-overload] + circuit.append(g, [j]) for g in undo_basis_change[p_i]: - circuit.append(g, [i]) # ty: ignore[no-matching-overload] + circuit.append(g, [i]) def qubits(self) -> set[int]: """Get the set of qubits involved in the operation. @@ -395,29 +395,29 @@ def append_to_circuit(self, circuit: stim.Circuit) -> None: circuit: The Stim circuit to append the operation to. """ if self.clifford in {"H", "S", "I"}: - circuit.append(self.clifford, [self.qubit]) # ty: ignore[no-matching-overload] + circuit.append(self.clifford, [self.qubit]) elif self.clifford == "SDAG": - circuit.append("S_DAG", [self.qubit]) # ty: ignore[no-matching-overload] + circuit.append("S_DAG", [self.qubit]) elif self.clifford == "HS": - circuit.append("H", [self.qubit]) # ty: ignore[no-matching-overload] - circuit.append("S", [self.qubit]) # ty: ignore[no-matching-overload] + circuit.append("H", [self.qubit]) + circuit.append("S", [self.qubit]) elif self.clifford == "SH": - circuit.append("S", [self.qubit]) # ty: ignore[no-matching-overload] - circuit.append("H", [self.qubit]) # ty: ignore[no-matching-overload] + circuit.append("S", [self.qubit]) + circuit.append("H", [self.qubit]) elif self.clifford == "HSH": - circuit.append("H", [self.qubit]) # ty: ignore[no-matching-overload] - circuit.append("S", [self.qubit]) # ty: ignore[no-matching-overload] - circuit.append("H", [self.qubit]) # ty: ignore[no-matching-overload] + circuit.append("H", [self.qubit]) + circuit.append("S", [self.qubit]) + circuit.append("H", [self.qubit]) elif self.clifford == "SDAGH": - circuit.append("S_DAG", [self.qubit]) # ty: ignore[no-matching-overload] - circuit.append("H", [self.qubit]) # ty: ignore[no-matching-overload] + circuit.append("S_DAG", [self.qubit]) + circuit.append("H", [self.qubit]) elif self.clifford == "HSDAG": - circuit.append("H", [self.qubit]) # ty: ignore[no-matching-overload] - circuit.append("S_DAG", [self.qubit]) # ty: ignore[no-matching-overload] + circuit.append("H", [self.qubit]) + circuit.append("S_DAG", [self.qubit]) elif self.clifford == "HSDAGH": - circuit.append("H", [self.qubit]) # ty: ignore[no-matching-overload] - circuit.append("S_DAG", [self.qubit]) # ty: ignore[no-matching-overload] - circuit.append("H", [self.qubit]) # ty: ignore[no-matching-overload] + circuit.append("H", [self.qubit]) + circuit.append("S_DAG", [self.qubit]) + circuit.append("H", [self.qubit]) else: msg = f"Unsupported single-qubit Clifford operation: {self.clifford}" raise ValueError(msg) @@ -501,7 +501,7 @@ def append_to_circuit(self, circuit: stim.Circuit) -> None: Args: circuit: The Stim circuit to append the operation to. """ - circuit.append(self.pauli, [self.qubit]) # ty: ignore[no-matching-overload] + circuit.append(self.pauli, [self.qubit]) def qubits(self) -> set[int]: """Get the set of qubits involved in the operation. @@ -574,7 +574,7 @@ def append_to_circuit(self, circuit: stim.Circuit) -> None: Args: circuit: The Stim circuit to append the operation to. """ - circuit.append("CNOT", [self.control, self.target]) # ty: ignore[no-matching-overload] + circuit.append("CNOT", [self.control, self.target]) def qubits(self) -> set[int]: """Get the set of qubits involved in the operation. @@ -644,7 +644,7 @@ def append_to_circuit(self, circuit: stim.Circuit) -> None: Args: circuit: The Stim circuit to append the operation to. """ - circuit.append("SWAP", [self.qubit_a, self.qubit_b]) # ty: ignore[no-matching-overload] + circuit.append("SWAP", [self.qubit_a, self.qubit_b]) def qubits(self) -> set[int]: """Get the set of qubits involved in the operation. diff --git a/src/mqt/qecc/circuit_synthesis/simulation.py b/src/mqt/qecc/circuit_synthesis/simulation.py index 6d072183..5642ed6b 100644 --- a/src/mqt/qecc/circuit_synthesis/simulation.py +++ b/src/mqt/qecc/circuit_synthesis/simulation.py @@ -87,9 +87,9 @@ def _build_noisy_circuit(self, noise: NoiseModel) -> stim.Circuit: noisy_circ = noise.apply(self.circ) if self.zero_state: - noisy_circ.append("MR", self.data_qubits) # ty: ignore[no-matching-overload] + noisy_circ.append("MR", self.data_qubits) else: - noisy_circ.append("MRX", self.data_qubits) # ty: ignore[no-matching-overload] + noisy_circ.append("MRX", self.data_qubits) self._noisy_circ = noisy_circ return noisy_circ @@ -104,13 +104,13 @@ def _build_noisy_gadget(self, noise: NoiseModel, p: float) -> stim.Circuit: ctrls = self.data_qubits if self.zero_state else anc_qubits trgts = anc_qubits if self.zero_state else self.data_qubits - noisy_circ.append("CX", [item for pair in zip(ctrls, trgts, strict=False) for item in pair]) # ty: ignore[no-matching-overload] + noisy_circ.append("CX", [item for pair in zip(ctrls, trgts, strict=False) for item in pair]) if self.zero_state: - noisy_circ.append("MRX", self.data_qubits) # ty: ignore[no-matching-overload] - noisy_circ.append("MRX", anc_qubits) # ty: ignore[no-matching-overload] + noisy_circ.append("MRX", self.data_qubits) + noisy_circ.append("MRX", anc_qubits) else: - noisy_circ.append("MR", self.data_qubits) # ty: ignore[no-matching-overload] - noisy_circ.append("MR", anc_qubits) # ty: ignore[no-matching-overload] + noisy_circ.append("MR", self.data_qubits) + noisy_circ.append("MR", anc_qubits) self._noisy_circ = noisy_circ return noisy_circ diff --git a/src/mqt/qecc/cococo/internal_testing.py b/src/mqt/qecc/cococo/internal_testing.py index acd098a5..45abfd4d 100644 --- a/src/mqt/qecc/cococo/internal_testing.py +++ b/src/mqt/qecc/cococo/internal_testing.py @@ -63,7 +63,7 @@ def random_initial_state(n_qubits: int) -> stim.Circuit: # choose a random Pauli: I, X, Y, Z p = random.choice(["I", "X", "Y", "Z"]) # noqa: S311 if p != "I": - c.append(p, [q]) # ty: ignore[no-matching-overload] + c.append(p, [q]) return c @@ -118,16 +118,16 @@ def check_order_dyn_gates_st( initial_circ_order = initial_state.copy() for el3 in terminal_pairs_trans: if isinstance(el3, tuple): - initial_circ_order.append("CNOT", [el3[0], el3[1]]) # ty: ignore[no-matching-overload] + initial_circ_order.append("CNOT", [el3[0], el3[1]]) elif isinstance(el3, int): - initial_circ_order.append("s", el3) # ty: ignore[no-matching-overload] + initial_circ_order.append("s", el3) dyn_circ_order = initial_state.copy() for el2 in gates_schedule: if isinstance(el2, tuple): - dyn_circ_order.append("CNOT", [el2[0], el2[1]]) # ty: ignore[no-matching-overload] + dyn_circ_order.append("CNOT", [el2[0], el2[1]]) elif isinstance(el2, int): - dyn_circ_order.append("s", el2) # ty: ignore[no-matching-overload] + dyn_circ_order.append("s", el2) sim1 = stim.TableauSimulator() sim1.do_circuit(initial_circ_order) @@ -178,16 +178,16 @@ def check_order_dyn_gates(terminal_pairs: Sequence[pos | tuple[pos, pos]], sched initial_circ_order = initial_state.copy() for el in terminal_pairs_trans: if isinstance(el, tuple): - initial_circ_order.append("CNOT", [el[0], el[1]]) # ty: ignore[no-matching-overload] + initial_circ_order.append("CNOT", [el[0], el[1]]) elif isinstance(el, int): # type: ignore[unreachable] - initial_circ_order.append("s", el) # ty: ignore[no-matching-overload] + initial_circ_order.append("s", el) dyn_circ_order = initial_state.copy() for el in gates_schedule: - if isinstance(el, tuple): - dyn_circ_order.append("CNOT", [el[0], el[1]]) # ty: ignore[no-matching-overload] + if isinstance(el, tuple) and isinstance(el[0], int) and isinstance(el[1], int): + dyn_circ_order.append("CNOT", [el[0], el[1]]) elif isinstance(el, int): # type: ignore[unreachable] - dyn_circ_order.append("s", el) # ty: ignore[no-matching-overload] + dyn_circ_order.append("s", el) sim1 = stim.TableauSimulator() sim1.do_circuit(initial_circ_order) diff --git a/tests/circuit_synthesis/test_circuits.py b/tests/circuit_synthesis/test_circuits.py index 97c28a83..b25663c6 100644 --- a/tests/circuit_synthesis/test_circuits.py +++ b/tests/circuit_synthesis/test_circuits.py @@ -644,8 +644,8 @@ def test_trivial_isometry(): def rep_code_encoder() -> stim.Circuit: """Encoding isometry of the repetition code.""" circ = stim.Circuit() - circ.append("R", [1, 2]) # ty: ignore[no-matching-overload] - circ.append("CX", [0, 1, 1, 2]) # ty: ignore[no-matching-overload] + circ.append("R", [1, 2]) + circ.append("CX", [0, 1, 1, 2]) return circ @@ -653,11 +653,11 @@ def rep_code_encoder() -> stim.Circuit: def five_qubit_code_encoder() -> stim.Circuit: """Encoding isometry of the five-qubit code.""" circ = stim.Circuit() - circ.append("RX", [1, 2, 3, 4]) # ty: ignore[no-matching-overload] - circ.append("H", [0]) # ty: ignore[no-matching-overload] - circ.append("CZ", [0, 1, 0, 2, 0, 3, 0, 4]) # ty: ignore[no-matching-overload] - circ.append("H", [0]) # ty: ignore[no-matching-overload] - circ.append("CZ", [0, 1, 2, 3, 1, 2, 3, 4, 0, 4]) # ty: ignore[no-matching-overload] + circ.append("RX", [1, 2, 3, 4]) + circ.append("H", [0]) + circ.append("CZ", [0, 1, 0, 2, 0, 3, 0, 4]) + circ.append("H", [0]) + circ.append("CZ", [0, 1, 2, 3, 1, 2, 3, 4, 0, 4]) return circ diff --git a/tests/circuit_synthesis/test_utils.py b/tests/circuit_synthesis/test_utils.py index 3afe6f61..ca45ce58 100644 --- a/tests/circuit_synthesis/test_utils.py +++ b/tests/circuit_synthesis/test_utils.py @@ -266,10 +266,10 @@ def test_w_flag(w: int, z_measurement: bool) -> None: def test_compact_stim_circuit() -> None: """Test compaction method.""" circ = stim.Circuit() - circ.append("H", [0]) # ty: ignore[no-matching-overload] - circ.append("CX", [0, 1]) # ty: ignore[no-matching-overload] - circ.append("H", [2]) # ty: ignore[no-matching-overload] - circ.append("CX", [2, 3]) # ty: ignore[no-matching-overload] + circ.append("H", [0]) + circ.append("CX", [0, 1]) + circ.append("H", [2]) + circ.append("CX", [2, 3]) assert len(circ) == 4 compacted = compact_stim_circuit(circ, scheduling_method="asap") @@ -281,10 +281,10 @@ def test_compact_stim_circuit() -> None: def test_compose_compact_stim_circuits() -> None: """Test compaction method.""" circ1 = stim.Circuit() - circ1.append("H", [0]) # ty: ignore[no-matching-overload] - circ1.append("CX", [0, 1]) # ty: ignore[no-matching-overload] + circ1.append("H", [0]) + circ1.append("CX", [0, 1]) circ2 = stim.Circuit() - circ2.append("CX", [2, 3]) # ty: ignore[no-matching-overload] + circ2.append("CX", [2, 3]) compacted1 = compose_compact_stim_circuits([circ1, circ2], align="start") assert len(compacted1) == 2 @@ -499,10 +499,10 @@ def test_compact_stim_circuit_empty() -> None: def test_collect_circuit_layers_asap() -> None: """Test collecting circuit layers with ASAP scheduling.""" circ = stim.Circuit() - circ.append("RX", [0]) # ty: ignore[no-matching-overload] - circ.append("CX", [0, 1]) # ty: ignore[no-matching-overload] + circ.append("RX", [0]) + circ.append("CX", [0, 1]) circ.append("TICK") # ty: ignore[invalid-argument-type] - circ.append("H", [2]) # ty: ignore[no-matching-overload] + circ.append("H", [2]) layers = collect_circuit_layers(circ, scheduling_method="asap") @@ -516,10 +516,10 @@ def test_collect_circuit_layers_asap() -> None: def test_collect_circuit_layers_alap() -> None: """Test collecting circuit layers with ALAP scheduling.""" circ = stim.Circuit() - circ.append("RX", [0]) # ty: ignore[no-matching-overload] - circ.append("CX", [0, 1]) # ty: ignore[no-matching-overload] + circ.append("RX", [0]) + circ.append("CX", [0, 1]) circ.append("TICK") # ty: ignore[invalid-argument-type] - circ.append("H", [2]) # ty: ignore[no-matching-overload] + circ.append("H", [2]) layers = collect_circuit_layers(circ, scheduling_method="alap") From ea8b08a0519e3968686b1d8075ce17cace118502 Mon Sep 17 00:00:00 2001 From: Daniel Haag <121057143+denialhaag@users.noreply.github.com> Date: Fri, 22 May 2026 21:00:31 +0200 Subject: [PATCH 3/3] Force pymatching>=2.4.0 for Python 3.14 --- pyproject.toml | 1 + uv.lock | 1 + 2 files changed, 2 insertions(+) diff --git a/pyproject.toml b/pyproject.toml index ca14bb9c..b6a4da97 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -65,6 +65,7 @@ dependencies = [ "ldpc>=2.3.10", "stim>=1.14.0", "pymatching>=2.2.2", + "pymatching>=2.4.0; python_version >= '3.14'", "bposd>=1.6", "qecsim>=1.0b9", "sinter>=1.14.0", diff --git a/uv.lock b/uv.lock index ffd55979..214863b3 100644 --- a/uv.lock +++ b/uv.lock @@ -1790,6 +1790,7 @@ requires-dist = [ { name = "numpy", marker = "python_full_version >= '3.13'", specifier = ">=2.1" }, { name = "numpy", marker = "python_full_version >= '3.14'", specifier = ">=2.3.2" }, { name = "pymatching", specifier = ">=2.2.2" }, + { name = "pymatching", marker = "python_full_version >= '3.14'", specifier = ">=2.4.0" }, { name = "qecsim", specifier = ">=1.0b9" }, { name = "qiskit", extras = ["qasm3-import"], specifier = ">=1.0.0" }, { name = "qsample", marker = "extra == 'qsample'", specifier = ">=0.0.2" },