From 9c7de670febef2807325562c0569528d458f0d48 Mon Sep 17 00:00:00 2001 From: Marquess Valdez Date: Mon, 6 Mar 2023 17:54:46 -0800 Subject: [PATCH] Foundational support for implementing Program with qcs-sdk-python (#1518) * tear out members, start replacing with rust API (WIP) * first pass as integrating with qcs_sdk.quil * fix low hanging fruit, introduce snapshot testing for passing tests, annotate others with improvements that need to be made * update poetry.lock * more test annotations, fixes, snapshots * deprecation warnings and cleanup * Gate tests and snapshots, pre-replacement with quil-rs * add test for FORKED gate * back Gate with RSGate * fix deprecated notice * test improvements * more cleanup * various cleanups * add more snaps * clean up program per feedback * feat!: The `calibrations` method on `Program` now only returns `DefCalibration`s. A `Program`s the `DefMeasureCalibrations` can be retrieved via the new `measure_calibrations` method. * update instruction handling logic * deprecate valid protoquil/quilt methods * add compatibility layer by overriding quil_rs.Gate superclass methods * remove gate __init__ method * remove old comments * revert defcal changes * safer type checking on conversion methods * simplify ParameterDesignator Type * forbidden metaclass shenanigans * Update pyquil/quil.py Co-authored-by: Kalan <22137047+kalzoo@users.noreply.github.com> * use deprecated decorator * update qcs-sdk-python dependency spec --------- Co-authored-by: Kalan <22137047+kalzoo@users.noreply.github.com> --- poetry.lock | 1344 ++++++++++++++++---- pyproject.toml | 8 +- pyquil/api/_abstract_compiler.py | 21 +- pyquil/api/_compiler.py | 17 +- pyquil/api/_compiler_client.py | 5 +- pyquil/quil.py | 748 +++-------- pyquil/quilatom.py | 104 +- pyquil/quilbase.py | 157 ++- test/unit/__snapshots__/test_api.ambr | 20 + test/unit/__snapshots__/test_main.ambr | 6 + test/unit/__snapshots__/test_paulis.ambr | 10 + test/unit/__snapshots__/test_quil.ambr | 323 +++++ test/unit/__snapshots__/test_quilbase.ambr | 60 + test/unit/test_api.py | 9 +- test/unit/test_main.py | 15 +- test/unit/test_noise.py | 25 +- test/unit/test_numpy.py | 10 + test/unit/test_operator_estimation.py | 1 + test/unit/test_paulis.py | 43 +- test/unit/test_paulis_with_placeholders.py | 2 +- test/unit/test_program.py | 2 +- test/unit/test_quantum_computer.py | 39 +- test/unit/test_quil.py | 289 ++--- test/unit/test_quilbase.py | 73 ++ test/unit/test_quilt.py | 4 + 25 files changed, 2191 insertions(+), 1144 deletions(-) create mode 100644 test/unit/__snapshots__/test_api.ambr create mode 100644 test/unit/__snapshots__/test_main.ambr create mode 100644 test/unit/__snapshots__/test_paulis.ambr create mode 100644 test/unit/__snapshots__/test_quil.ambr create mode 100644 test/unit/__snapshots__/test_quilbase.ambr create mode 100644 test/unit/test_quilbase.py diff --git a/poetry.lock b/poetry.lock index d40a81690..f7d5e07f1 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,3 +1,5 @@ +# This file is automatically @generated by Poetry and should not be changed by hand. + [[package]] name = "alabaster" version = "0.7.12" @@ -5,6 +7,10 @@ description = "A configurable sidebar-enabled Sphinx theme" category = "main" optional = true python-versions = "*" +files = [ + {file = "alabaster-0.7.12-py2.py3-none-any.whl", hash = "sha256:446438bdcca0e05bd45ea2de1668c1d9b032e1a9154c2c259092d77031ddd359"}, + {file = "alabaster-0.7.12.tar.gz", hash = "sha256:a661d72d58e6ea8a57f7a86e37d86716863ee5e92788398526d58b26a4e4dc02"}, +] [[package]] name = "anyio" @@ -13,15 +19,18 @@ description = "High level compatibility layer for multiple asynchronous event lo category = "main" optional = false python-versions = ">=3.6.2" +files = [ + {file = "anyio-3.6.2-py3-none-any.whl", hash = "sha256:fbbe32bd270d2a2ef3ed1c5d45041250284e31fc0a4df4a5a6071842051a51e3"}, + {file = "anyio-3.6.2.tar.gz", hash = "sha256:25ea0d673ae30af41a0c442f81cf3b38c7e79fdc7b60335a4c14e05eb0947421"}, +] [package.dependencies] idna = ">=2.8" sniffio = ">=1.1" -typing-extensions = {version = "*", markers = "python_version < \"3.8\""} [package.extras] -doc = ["packaging", "sphinx-rtd-theme", "sphinx-autodoc-typehints (>=1.2.0)"] -test = ["coverage[toml] (>=4.5)", "hypothesis (>=4.0)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "contextlib2", "uvloop (<0.15)", "mock (>=4)", "uvloop (>=0.15)"] +doc = ["packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] +test = ["contextlib2", "coverage[toml] (>=4.5)", "hypothesis (>=4.0)", "mock (>=4)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (<0.15)", "uvloop (>=0.15)"] trio = ["trio (>=0.16,<0.22)"] [[package]] @@ -31,6 +40,10 @@ description = "Disable App Nap on macOS >= 10.9" category = "main" optional = true python-versions = "*" +files = [ + {file = "appnope-0.1.3-py2.py3-none-any.whl", hash = "sha256:265a455292d0bd8a72453494fa24df5a11eb18373a60c7c0430889f22548605e"}, + {file = "appnope-0.1.3.tar.gz", hash = "sha256:02bd91c4de869fbb1e1c50aafc4098827a7a54ab2f39d9dcba6c9547ed920e24"}, +] [[package]] name = "atomicwrites" @@ -39,6 +52,9 @@ description = "Atomic file writes." category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "atomicwrites-1.4.1.tar.gz", hash = "sha256:81b2c9071a49367a7f770170e5eec8cb66567cfbbc8c73d20ce5ca4a8d71cf11"}, +] [[package]] name = "attrs" @@ -47,12 +63,16 @@ description = "Classes Without Boilerplate" category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "attrs-20.3.0-py2.py3-none-any.whl", hash = "sha256:31b2eced602aa8423c2aea9c76a724617ed67cf9513173fd3a4f03e3a929c7e6"}, + {file = "attrs-20.3.0.tar.gz", hash = "sha256:832aa3cde19744e49938b91fea06d69ecb9e649c93ba974535d08ad92164f700"}, +] [package.extras] -dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface", "furo", "sphinx", "pre-commit"] +dev = ["coverage[toml] (>=5.0.2)", "furo", "hypothesis", "pre-commit", "pympler", "pytest (>=4.3.0)", "six", "sphinx", "zope.interface"] docs = ["furo", "sphinx", "zope.interface"] tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface"] -tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six"] +tests-no-zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six"] [[package]] name = "babel" @@ -61,6 +81,10 @@ description = "Internationalization utilities" category = "main" optional = true python-versions = ">=3.6" +files = [ + {file = "Babel-2.11.0-py3-none-any.whl", hash = "sha256:1ad3eca1c885218f6dce2ab67291178944f810a10a9b5f3cb8382a5a232b64fe"}, + {file = "Babel-2.11.0.tar.gz", hash = "sha256:5ef4b3226b0180dedded4229651c8b0e1a3a6a2837d45a073272f313e4cf97f6"}, +] [package.dependencies] pytz = ">=2015.7" @@ -72,6 +96,10 @@ description = "Specifications for callback functions passed in to an API" category = "main" optional = true python-versions = "*" +files = [ + {file = "backcall-0.2.0-py2.py3-none-any.whl", hash = "sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255"}, + {file = "backcall-0.2.0.tar.gz", hash = "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e"}, +] [[package]] name = "beautifulsoup4" @@ -80,6 +108,10 @@ description = "Screen-scraping library" category = "main" optional = true python-versions = ">=3.6.0" +files = [ + {file = "beautifulsoup4-4.11.1-py3-none-any.whl", hash = "sha256:58d5c3d29f5a36ffeb94f02f0d786cd53014cf9b3b3951d42e0080d8a9498d30"}, + {file = "beautifulsoup4-4.11.1.tar.gz", hash = "sha256:ad9aa55b65ef2808eb405f46cf74df7fcb7044d5cbc26487f96eb2ef2e436693"}, +] [package.dependencies] soupsieve = ">1.2" @@ -95,6 +127,29 @@ description = "The uncompromising code formatter." category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "black-22.10.0-1fixedarch-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:5cc42ca67989e9c3cf859e84c2bf014f6633db63d1cbdf8fdb666dcd9e77e3fa"}, + {file = "black-22.10.0-1fixedarch-cp311-cp311-macosx_11_0_x86_64.whl", hash = "sha256:5d8f74030e67087b219b032aa33a919fae8806d49c867846bfacde57f43972ef"}, + {file = "black-22.10.0-1fixedarch-cp37-cp37m-macosx_10_16_x86_64.whl", hash = "sha256:197df8509263b0b8614e1df1756b1dd41be6738eed2ba9e9769f3880c2b9d7b6"}, + {file = "black-22.10.0-1fixedarch-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:2644b5d63633702bc2c5f3754b1b475378fbbfb481f62319388235d0cd104c2d"}, + {file = "black-22.10.0-1fixedarch-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:e41a86c6c650bcecc6633ee3180d80a025db041a8e2398dcc059b3afa8382cd4"}, + {file = "black-22.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2039230db3c6c639bd84efe3292ec7b06e9214a2992cd9beb293d639c6402edb"}, + {file = "black-22.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14ff67aec0a47c424bc99b71005202045dc09270da44a27848d534600ac64fc7"}, + {file = "black-22.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:819dc789f4498ecc91438a7de64427c73b45035e2e3680c92e18795a839ebb66"}, + {file = "black-22.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5b9b29da4f564ba8787c119f37d174f2b69cdfdf9015b7d8c5c16121ddc054ae"}, + {file = "black-22.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8b49776299fece66bffaafe357d929ca9451450f5466e997a7285ab0fe28e3b"}, + {file = "black-22.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:21199526696b8f09c3997e2b4db8d0b108d801a348414264d2eb8eb2532e540d"}, + {file = "black-22.10.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e464456d24e23d11fced2bc8c47ef66d471f845c7b7a42f3bd77bf3d1789650"}, + {file = "black-22.10.0-cp37-cp37m-win_amd64.whl", hash = "sha256:9311e99228ae10023300ecac05be5a296f60d2fd10fff31cf5c1fa4ca4b1988d"}, + {file = "black-22.10.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fba8a281e570adafb79f7755ac8721b6cf1bbf691186a287e990c7929c7692ff"}, + {file = "black-22.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:915ace4ff03fdfff953962fa672d44be269deb2eaf88499a0f8805221bc68c87"}, + {file = "black-22.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:444ebfb4e441254e87bad00c661fe32df9969b2bf224373a448d8aca2132b395"}, + {file = "black-22.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:974308c58d057a651d182208a484ce80a26dac0caef2895836a92dd6ebd725e0"}, + {file = "black-22.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72ef3925f30e12a184889aac03d77d031056860ccae8a1e519f6cbb742736383"}, + {file = "black-22.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:432247333090c8c5366e69627ccb363bc58514ae3e63f7fc75c54b1ea80fa7de"}, + {file = "black-22.10.0-py3-none-any.whl", hash = "sha256:c957b2b4ea88587b46cf49d1dc17681c1e672864fd7af32fc1e9664d572b3458"}, + {file = "black-22.10.0.tar.gz", hash = "sha256:f513588da599943e0cde4e32cc9879e825d58720d6557062d1098c5ad80080e1"}, +] [package.dependencies] click = ">=8.0.0" @@ -102,7 +157,6 @@ mypy-extensions = ">=0.4.3" pathspec = ">=0.9.0" platformdirs = ">=2" tomli = {version = ">=1.1.0", markers = "python_full_version < \"3.11.0a7\""} -typed-ast = {version = ">=1.4.2", markers = "python_version < \"3.8\" and implementation_name == \"cpython\""} typing-extensions = {version = ">=3.10.0.0", markers = "python_version < \"3.10\""} [package.extras] @@ -118,6 +172,10 @@ description = "An easy safelist-based HTML-sanitizing tool." category = "main" optional = true python-versions = ">=3.7" +files = [ + {file = "bleach-5.0.1-py3-none-any.whl", hash = "sha256:085f7f33c15bd408dd9b17a4ad77c577db66d76203e5984b1bd59baeee948b2a"}, + {file = "bleach-5.0.1.tar.gz", hash = "sha256:0d03255c47eb9bd2f26aa9bb7f2107732e7e8fe195ca2f64709fcf3b0a4a085c"}, +] [package.dependencies] six = ">=1.9.0" @@ -125,15 +183,19 @@ webencodings = "*" [package.extras] css = ["tinycss2 (>=1.1.0,<1.2)"] -dev = ["build (==0.8.0)", "flake8 (==4.0.1)", "hashin (==0.17.0)", "pip-tools (==6.6.2)", "pytest (==7.1.2)", "Sphinx (==4.3.2)", "tox (==3.25.0)", "twine (==4.0.1)", "wheel (==0.37.1)", "black (==22.3.0)", "mypy (==0.961)"] +dev = ["Sphinx (==4.3.2)", "black (==22.3.0)", "build (==0.8.0)", "flake8 (==4.0.1)", "hashin (==0.17.0)", "mypy (==0.961)", "pip-tools (==6.6.2)", "pytest (==7.1.2)", "tox (==3.25.0)", "twine (==4.0.1)", "wheel (==0.37.1)"] [[package]] name = "certifi" -version = "2022.12.7" +version = "2022.9.24" description = "Python package for providing Mozilla's CA Bundle." category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "certifi-2022.9.24-py3-none-any.whl", hash = "sha256:90c1a32f1d68f940488354e36370f6cca89f0f106db09518524c88d6ed83f382"}, + {file = "certifi-2022.9.24.tar.gz", hash = "sha256:0d9c601124e5a6ba9712dbc60d9c53c21e34f5f641fe83002317394311bdce14"}, +] [[package]] name = "cffi" @@ -142,6 +204,72 @@ description = "Foreign Function Interface for Python calling C code." category = "main" optional = false python-versions = "*" +files = [ + {file = "cffi-1.15.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2"}, + {file = "cffi-1.15.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2"}, + {file = "cffi-1.15.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914"}, + {file = "cffi-1.15.1-cp27-cp27m-win32.whl", hash = "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3"}, + {file = "cffi-1.15.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e"}, + {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162"}, + {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b"}, + {file = "cffi-1.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21"}, + {file = "cffi-1.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4"}, + {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01"}, + {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e"}, + {file = "cffi-1.15.1-cp310-cp310-win32.whl", hash = "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2"}, + {file = "cffi-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d"}, + {file = "cffi-1.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac"}, + {file = "cffi-1.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c"}, + {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef"}, + {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8"}, + {file = "cffi-1.15.1-cp311-cp311-win32.whl", hash = "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d"}, + {file = "cffi-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104"}, + {file = "cffi-1.15.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e"}, + {file = "cffi-1.15.1-cp36-cp36m-win32.whl", hash = "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf"}, + {file = "cffi-1.15.1-cp36-cp36m-win_amd64.whl", hash = "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497"}, + {file = "cffi-1.15.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426"}, + {file = "cffi-1.15.1-cp37-cp37m-win32.whl", hash = "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9"}, + {file = "cffi-1.15.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045"}, + {file = "cffi-1.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192"}, + {file = "cffi-1.15.1-cp38-cp38-win32.whl", hash = "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314"}, + {file = "cffi-1.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5"}, + {file = "cffi-1.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585"}, + {file = "cffi-1.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27"}, + {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76"}, + {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3"}, + {file = "cffi-1.15.1-cp39-cp39-win32.whl", hash = "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee"}, + {file = "cffi-1.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c"}, + {file = "cffi-1.15.1.tar.gz", hash = "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9"}, +] [package.dependencies] pycparser = "*" @@ -153,9 +281,13 @@ description = "The Real First Universal Charset Detector. Open, modern and activ category = "main" optional = true python-versions = ">=3.6.0" +files = [ + {file = "charset-normalizer-2.1.1.tar.gz", hash = "sha256:5a3d016c7c547f69d6f81fb0db9449ce888b418b5b9952cc5e6e66843e9dd845"}, + {file = "charset_normalizer-2.1.1-py3-none-any.whl", hash = "sha256:83e9a75d1911279afd89352c68b45348559d1fc0506b054b346651b5e7fee29f"}, +] [package.extras] -unicode_backport = ["unicodedata2"] +unicode-backport = ["unicodedata2"] [[package]] name = "click" @@ -164,10 +296,13 @@ description = "Composable command line interface toolkit" category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, + {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, +] [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} -importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} [[package]] name = "colorama" @@ -176,6 +311,21 @@ description = "Cross-platform colored terminal text." category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "colored" +version = "1.4.4" +description = "Simple library for color and formatting to terminal" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "colored-1.4.4.tar.gz", hash = "sha256:04ff4d4dd514274fe3b99a21bb52fb96f2688c01e93fba7bef37221e7cb56ce0"}, +] [[package]] name = "commonmark" @@ -184,9 +334,13 @@ description = "Python parser for the CommonMark Markdown spec" category = "main" optional = true python-versions = "*" +files = [ + {file = "commonmark-0.9.1-py2.py3-none-any.whl", hash = "sha256:da2f38c92590f83de410ba1a3cbceafbc74fee9def35f9251ba9a971d6d66fd9"}, + {file = "commonmark-0.9.1.tar.gz", hash = "sha256:452f9dc859be7f06631ddcb328b6919c67984aca654e5fefb3914d54691aed60"}, +] [package.extras] -test = ["hypothesis (==3.55.3)", "flake8 (==3.7.8)"] +test = ["flake8 (==3.7.8)", "hypothesis (==3.55.3)"] [[package]] name = "coverage" @@ -195,6 +349,58 @@ description = "Code coverage measurement for Python" category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "coverage-6.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ef8674b0ee8cc11e2d574e3e2998aea5df5ab242e012286824ea3c6970580e53"}, + {file = "coverage-6.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:784f53ebc9f3fd0e2a3f6a78b2be1bd1f5575d7863e10c6e12504f240fd06660"}, + {file = "coverage-6.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b4a5be1748d538a710f87542f22c2cad22f80545a847ad91ce45e77417293eb4"}, + {file = "coverage-6.5.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:83516205e254a0cb77d2d7bb3632ee019d93d9f4005de31dca0a8c3667d5bc04"}, + {file = "coverage-6.5.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af4fffaffc4067232253715065e30c5a7ec6faac36f8fc8d6f64263b15f74db0"}, + {file = "coverage-6.5.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:97117225cdd992a9c2a5515db1f66b59db634f59d0679ca1fa3fe8da32749cae"}, + {file = "coverage-6.5.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a1170fa54185845505fbfa672f1c1ab175446c887cce8212c44149581cf2d466"}, + {file = "coverage-6.5.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:11b990d520ea75e7ee8dcab5bc908072aaada194a794db9f6d7d5cfd19661e5a"}, + {file = "coverage-6.5.0-cp310-cp310-win32.whl", hash = "sha256:5dbec3b9095749390c09ab7c89d314727f18800060d8d24e87f01fb9cfb40b32"}, + {file = "coverage-6.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:59f53f1dc5b656cafb1badd0feb428c1e7bc19b867479ff72f7a9dd9b479f10e"}, + {file = "coverage-6.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4a5375e28c5191ac38cca59b38edd33ef4cc914732c916f2929029b4bfb50795"}, + {file = "coverage-6.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4ed2820d919351f4167e52425e096af41bfabacb1857186c1ea32ff9983ed75"}, + {file = "coverage-6.5.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:33a7da4376d5977fbf0a8ed91c4dffaaa8dbf0ddbf4c8eea500a2486d8bc4d7b"}, + {file = "coverage-6.5.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8fb6cf131ac4070c9c5a3e21de0f7dc5a0fbe8bc77c9456ced896c12fcdad91"}, + {file = "coverage-6.5.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a6b7d95969b8845250586f269e81e5dfdd8ff828ddeb8567a4a2eaa7313460c4"}, + {file = "coverage-6.5.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:1ef221513e6f68b69ee9e159506d583d31aa3567e0ae84eaad9d6ec1107dddaa"}, + {file = "coverage-6.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cca4435eebea7962a52bdb216dec27215d0df64cf27fc1dd538415f5d2b9da6b"}, + {file = "coverage-6.5.0-cp311-cp311-win32.whl", hash = "sha256:98e8a10b7a314f454d9eff4216a9a94d143a7ee65018dd12442e898ee2310578"}, + {file = "coverage-6.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:bc8ef5e043a2af066fa8cbfc6e708d58017024dc4345a1f9757b329a249f041b"}, + {file = "coverage-6.5.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4433b90fae13f86fafff0b326453dd42fc9a639a0d9e4eec4d366436d1a41b6d"}, + {file = "coverage-6.5.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4f05d88d9a80ad3cac6244d36dd89a3c00abc16371769f1340101d3cb899fc3"}, + {file = "coverage-6.5.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:94e2565443291bd778421856bc975d351738963071e9b8839ca1fc08b42d4bef"}, + {file = "coverage-6.5.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:027018943386e7b942fa832372ebc120155fd970837489896099f5cfa2890f79"}, + {file = "coverage-6.5.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:255758a1e3b61db372ec2736c8e2a1fdfaf563977eedbdf131de003ca5779b7d"}, + {file = "coverage-6.5.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:851cf4ff24062c6aec510a454b2584f6e998cada52d4cb58c5e233d07172e50c"}, + {file = "coverage-6.5.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:12adf310e4aafddc58afdb04d686795f33f4d7a6fa67a7a9d4ce7d6ae24d949f"}, + {file = "coverage-6.5.0-cp37-cp37m-win32.whl", hash = "sha256:b5604380f3415ba69de87a289a2b56687faa4fe04dbee0754bfcae433489316b"}, + {file = "coverage-6.5.0-cp37-cp37m-win_amd64.whl", hash = "sha256:4a8dbc1f0fbb2ae3de73eb0bdbb914180c7abfbf258e90b311dcd4f585d44bd2"}, + {file = "coverage-6.5.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d900bb429fdfd7f511f868cedd03a6bbb142f3f9118c09b99ef8dc9bf9643c3c"}, + {file = "coverage-6.5.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2198ea6fc548de52adc826f62cb18554caedfb1d26548c1b7c88d8f7faa8f6ba"}, + {file = "coverage-6.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c4459b3de97b75e3bd6b7d4b7f0db13f17f504f3d13e2a7c623786289dd670e"}, + {file = "coverage-6.5.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:20c8ac5386253717e5ccc827caad43ed66fea0efe255727b1053a8154d952398"}, + {file = "coverage-6.5.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b07130585d54fe8dff3d97b93b0e20290de974dc8177c320aeaf23459219c0b"}, + {file = "coverage-6.5.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:dbdb91cd8c048c2b09eb17713b0c12a54fbd587d79adcebad543bc0cd9a3410b"}, + {file = "coverage-6.5.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:de3001a203182842a4630e7b8d1a2c7c07ec1b45d3084a83d5d227a3806f530f"}, + {file = "coverage-6.5.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e07f4a4a9b41583d6eabec04f8b68076ab3cd44c20bd29332c6572dda36f372e"}, + {file = "coverage-6.5.0-cp38-cp38-win32.whl", hash = "sha256:6d4817234349a80dbf03640cec6109cd90cba068330703fa65ddf56b60223a6d"}, + {file = "coverage-6.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:7ccf362abd726b0410bf8911c31fbf97f09f8f1061f8c1cf03dfc4b6372848f6"}, + {file = "coverage-6.5.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:633713d70ad6bfc49b34ead4060531658dc6dfc9b3eb7d8a716d5873377ab745"}, + {file = "coverage-6.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:95203854f974e07af96358c0b261f1048d8e1083f2de9b1c565e1be4a3a48cfc"}, + {file = "coverage-6.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9023e237f4c02ff739581ef35969c3739445fb059b060ca51771e69101efffe"}, + {file = "coverage-6.5.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:265de0fa6778d07de30bcf4d9dc471c3dc4314a23a3c6603d356a3c9abc2dfcf"}, + {file = "coverage-6.5.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f830ed581b45b82451a40faabb89c84e1a998124ee4212d440e9c6cf70083e5"}, + {file = "coverage-6.5.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7b6be138d61e458e18d8e6ddcddd36dd96215edfe5f1168de0b1b32635839b62"}, + {file = "coverage-6.5.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:42eafe6778551cf006a7c43153af1211c3aaab658d4d66fa5fcc021613d02518"}, + {file = "coverage-6.5.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:723e8130d4ecc8f56e9a611e73b31219595baa3bb252d539206f7bbbab6ffc1f"}, + {file = "coverage-6.5.0-cp39-cp39-win32.whl", hash = "sha256:d9ecf0829c6a62b9b573c7bb6d4dcd6ba8b6f80be9ba4fc7ed50bf4ac9aecd72"}, + {file = "coverage-6.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:fc2af30ed0d5ae0b1abdb4ebdce598eafd5b35397d4d75deb341a614d333d987"}, + {file = "coverage-6.5.0-pp36.pp37.pp38-none-any.whl", hash = "sha256:1431986dac3923c5945271f169f59c45b8802a114c8f548d611f2015133df77a"}, + {file = "coverage-6.5.0.tar.gz", hash = "sha256:f642e90754ee3e06b0e7e51bce3379590e76b7f76b708e1a71ff043f87025c84"}, +] [package.extras] toml = ["tomli"] @@ -206,6 +412,10 @@ description = "Decorators for Humans" category = "main" optional = false python-versions = ">=3.5" +files = [ + {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, + {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, +] [[package]] name = "defusedxml" @@ -214,6 +424,25 @@ description = "XML bomb protection for Python stdlib modules" category = "main" optional = true python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61"}, + {file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"}, +] + +[[package]] +name = "deprecation" +version = "2.1.0" +description = "A library to handle automated deprecations" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "deprecation-2.1.0-py2.py3-none-any.whl", hash = "sha256:a10811591210e1fb0e768a8c25517cabeabcba6f0bf96564f8ff45189f90b14a"}, + {file = "deprecation-2.1.0.tar.gz", hash = "sha256:72b3bde64e5d778694b0cf68178aed03d15e15477116add3fb773e581f9518ff"}, +] + +[package.dependencies] +packaging = "*" [[package]] name = "docutils" @@ -222,6 +451,10 @@ description = "Docutils -- Python Documentation Utilities" category = "main" optional = true python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "docutils-0.16-py2.py3-none-any.whl", hash = "sha256:0c5b78adfbf7762415433f5515cd5c9e762339e23369dbe8000d84a4bf4ab3af"}, + {file = "docutils-0.16.tar.gz", hash = "sha256:c2de3a60e9e7d07be26b7f2b00ca0309c207e06c100f9cc2a94931fc75a478fc"}, +] [[package]] name = "entrypoints" @@ -230,6 +463,10 @@ description = "Discover and load entry points from installed packages." category = "main" optional = true python-versions = ">=3.6" +files = [ + {file = "entrypoints-0.4-py3-none-any.whl", hash = "sha256:f174b5ff827504fd3cd97cc3f8649f3693f51538c7e4bdf3ef002c8429d42f9f"}, + {file = "entrypoints-0.4.tar.gz", hash = "sha256:b706eddaa9218a19ebcd67b56818f05bb27589b1ca9e8d797b74affad4ccacd4"}, +] [[package]] name = "execnet" @@ -238,6 +475,10 @@ description = "execnet: rapid multi-Python deployment" category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "execnet-1.9.0-py2.py3-none-any.whl", hash = "sha256:a295f7cc774947aac58dde7fdc85f4aa00c42adf5d8f5468fc630c1acf30a142"}, + {file = "execnet-1.9.0.tar.gz", hash = "sha256:8f694f3ba9cc92cab508b152dcfe322153975c29bda272e2fd7f3f00f36e47c5"}, +] [package.extras] testing = ["pre-commit"] @@ -249,9 +490,13 @@ description = "Fastest Python implementation of JSON schema" category = "main" optional = true python-versions = "*" +files = [ + {file = "fastjsonschema-2.16.2-py3-none-any.whl", hash = "sha256:21f918e8d9a1a4ba9c22e09574ba72267a6762d47822db9add95f6454e51cc1c"}, + {file = "fastjsonschema-2.16.2.tar.gz", hash = "sha256:01e366f25d9047816fe3d288cbfc3e10541daf0af2044763f3d0ade42476da18"}, +] [package.extras] -devel = ["colorama", "jsonschema", "json-spec", "pylint", "pytest", "pytest-benchmark", "pytest-cache", "validictory"] +devel = ["colorama", "json-spec", "jsonschema", "pylint", "pytest", "pytest-benchmark", "pytest-cache", "validictory"] [[package]] name = "flake8" @@ -260,9 +505,12 @@ description = "the modular source code checker: pep8 pyflakes and co" category = "dev" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" +files = [ + {file = "flake8-3.9.2-py2.py3-none-any.whl", hash = "sha256:bf8fd333346d844f616e8d47905ef3a3384edae6b4e9beb0c5101e25e3110907"}, + {file = "flake8-3.9.2.tar.gz", hash = "sha256:07528381786f2a6237b061f6e96610a4167b226cb926e2aa2b6b1d78057c576b"}, +] [package.dependencies] -importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} mccabe = ">=0.6.0,<0.7.0" pycodestyle = ">=2.7.0,<2.8.0" pyflakes = ">=2.3.0,<2.4.0" @@ -274,6 +522,10 @@ description = "Let your Python tests travel through time" category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "freezegun-1.2.2-py3-none-any.whl", hash = "sha256:ea1b963b993cb9ea195adbd893a48d573fda951b0da64f60883d7e988b606c9f"}, + {file = "freezegun-1.2.2.tar.gz", hash = "sha256:cd22d1ba06941384410cd967d8a99d5ae2442f57dfafeff2fda5de8dc5c05446"}, +] [package.dependencies] python-dateutil = ">=2.7" @@ -285,9 +537,10 @@ description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" category = "main" optional = false python-versions = ">=3.7" - -[package.dependencies] -typing-extensions = {version = "*", markers = "python_version < \"3.8\""} +files = [ + {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, + {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, +] [[package]] name = "httpcore" @@ -296,6 +549,10 @@ description = "A minimal low-level HTTP client." category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "httpcore-0.16.2-py3-none-any.whl", hash = "sha256:52c79095197178856724541e845f2db86d5f1527640d9254b5b8f6f6cebfdee6"}, + {file = "httpcore-0.16.2.tar.gz", hash = "sha256:c35c5176dc82db732acfd90b581a3062c999a72305df30c0fc8fafd8e4aca068"}, +] [package.dependencies] anyio = ">=3.0,<5.0" @@ -314,6 +571,10 @@ description = "The next generation HTTP client." category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "httpx-0.23.1-py3-none-any.whl", hash = "sha256:0b9b1f0ee18b9978d637b0776bfd7f54e2ca278e063e3586d8f01cda89e042a8"}, + {file = "httpx-0.23.1.tar.gz", hash = "sha256:202ae15319be24efe9a8bd4ed4360e68fde7b38bcc2ce87088d416f026667d19"}, +] [package.dependencies] certifi = "*" @@ -334,6 +595,10 @@ description = "Internationalized Domain Names in Applications (IDNA)" category = "main" optional = false python-versions = ">=3.5" +files = [ + {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, + {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, +] [[package]] name = "imagesize" @@ -342,6 +607,10 @@ description = "Getting image size from png/jpeg/jpeg2000/gif file" category = "main" optional = true python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b"}, + {file = "imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a"}, +] [[package]] name = "importlib-metadata" @@ -350,30 +619,37 @@ description = "Read metadata from Python packages" category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "importlib_metadata-4.13.0-py3-none-any.whl", hash = "sha256:8a8a81bcf996e74fee46f0d16bd3eaa382a7eb20fd82445c3ad11f4090334116"}, + {file = "importlib_metadata-4.13.0.tar.gz", hash = "sha256:dd0173e8f150d6815e098fd354f6414b0f079af4644ddfe90c71e2fc6174346d"}, +] [package.dependencies] -typing-extensions = {version = ">=3.6.4", markers = "python_version < \"3.8\""} zipp = ">=0.5" [package.extras] -docs = ["sphinx (>=3.5)", "jaraco.packaging (>=9)", "rst.linker (>=1.9)", "furo", "jaraco.tidelift (>=1.4)"] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)"] perf = ["ipython"] -testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "flake8 (<5)", "pytest-cov", "pytest-enabler (>=1.3)", "packaging", "pyfakefs", "flufl.flake8", "pytest-perf (>=0.9.2)", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)", "importlib-resources (>=1.3)"] +testing = ["flake8 (<5)", "flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)"] [[package]] name = "importlib-resources" -version = "5.10.1" +version = "5.10.0" description = "Read resources from Python packages" category = "main" optional = true python-versions = ">=3.7" +files = [ + {file = "importlib_resources-5.10.0-py3-none-any.whl", hash = "sha256:ee17ec648f85480d523596ce49eae8ead87d5631ae1551f913c0100b5edd3437"}, + {file = "importlib_resources-5.10.0.tar.gz", hash = "sha256:c01b1b94210d9849f286b86bb51bcea7cd56dde0600d8db721d7b81330711668"}, +] [package.dependencies] zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} [package.extras] -docs = ["sphinx (>=3.5)", "jaraco.packaging (>=9)", "rst.linker (>=1.9)", "furo", "jaraco.tidelift (>=1.4)"] -testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "flake8 (<5)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)", "pytest-flake8"] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)"] +testing = ["flake8 (<5)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] [[package]] name = "iniconfig" @@ -382,6 +658,10 @@ description = "iniconfig: brain-dead simple config-ini parsing" category = "dev" optional = false python-versions = "*" +files = [ + {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, + {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, +] [[package]] name = "ipython" @@ -390,6 +670,10 @@ description = "IPython: Productive Interactive Computing" category = "main" optional = true python-versions = ">=3.7" +files = [ + {file = "ipython-7.34.0-py3-none-any.whl", hash = "sha256:c175d2440a1caff76116eb719d40538fbb316e214eda85c5515c303aacbfb23e"}, + {file = "ipython-7.34.0.tar.gz", hash = "sha256:af3bdb46aa292bce5615b1b2ebc76c2080c5f77f54bda2ec72461317273e7cd6"}, +] [package.dependencies] appnope = {version = "*", markers = "sys_platform == \"darwin\""} @@ -402,6 +686,7 @@ pexpect = {version = ">4.3", markers = "sys_platform != \"win32\""} pickleshare = "*" prompt-toolkit = ">=2.0.0,<3.0.0 || >3.0.0,<3.0.1 || >3.0.1,<3.1.0" pygments = "*" +setuptools = ">=18.5" traitlets = ">=4.2" [package.extras] @@ -410,10 +695,10 @@ doc = ["Sphinx (>=1.3)"] kernel = ["ipykernel"] nbconvert = ["nbconvert"] nbformat = ["nbformat"] -notebook = ["notebook", "ipywidgets"] +notebook = ["ipywidgets", "notebook"] parallel = ["ipyparallel"] qtconsole = ["qtconsole"] -test = ["nose (>=0.10.1)", "requests", "testpath", "pygments", "nbformat", "ipykernel", "numpy (>=1.17)"] +test = ["ipykernel", "nbformat", "nose (>=0.10.1)", "numpy (>=1.17)", "pygments", "requests", "testpath"] [[package]] name = "iso8601" @@ -422,6 +707,10 @@ description = "Simple module to parse ISO 8601 dates" category = "main" optional = false python-versions = ">=3.6.2,<4.0" +files = [ + {file = "iso8601-1.1.0-py3-none-any.whl", hash = "sha256:8400e90141bf792bce2634df533dc57e3bee19ea120a87bebcd3da89a58ad73f"}, + {file = "iso8601-1.1.0.tar.gz", hash = "sha256:32811e7b81deee2063ea6d2e94f8819a86d1f3811e49d23623a41fa832bef03f"}, +] [[package]] name = "jedi" @@ -430,12 +719,16 @@ description = "An autocompletion tool for Python that can be used for text edito category = "main" optional = true python-versions = ">=3.6" +files = [ + {file = "jedi-0.18.2-py2.py3-none-any.whl", hash = "sha256:203c1fd9d969ab8f2119ec0a3342e0b49910045abe6af0a3ae83a5764d54639e"}, + {file = "jedi-0.18.2.tar.gz", hash = "sha256:bae794c30d07f6d910d32a7048af09b5a39ed740918da923c6b780790ebac612"}, +] [package.dependencies] parso = ">=0.8.0,<0.9.0" [package.extras] -docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx-rtd-theme (==0.4.3)", "sphinx (==1.8.5)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"] +docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx (==1.8.5)", "sphinx-rtd-theme (==0.4.3)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"] qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] testing = ["Django (<3.1)", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] @@ -446,6 +739,10 @@ description = "A very fast and expressive template engine." category = "main" optional = true python-versions = ">=3.7" +files = [ + {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, + {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, +] [package.dependencies] MarkupSafe = ">=2.0" @@ -460,14 +757,16 @@ description = "An implementation of JSON Schema validation for Python" category = "main" optional = true python-versions = ">=3.7" +files = [ + {file = "jsonschema-4.17.3-py3-none-any.whl", hash = "sha256:a870ad254da1a8ca84b6a2905cac29d265f805acc57af304784962a2aa6508f6"}, + {file = "jsonschema-4.17.3.tar.gz", hash = "sha256:0f864437ab8b6076ba6707453ef8f98a6a0d512a80e93f8abdb676f737ecb60d"}, +] [package.dependencies] attrs = ">=17.4.0" -importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} importlib-resources = {version = ">=1.4.0", markers = "python_version < \"3.9\""} pkgutil-resolve-name = {version = ">=1.3.10", markers = "python_version < \"3.9\""} pyrsistent = ">=0.14.0,<0.17.0 || >0.17.0,<0.17.1 || >0.17.1,<0.17.2 || >0.17.2" -typing-extensions = {version = "*", markers = "python_version < \"3.8\""} [package.extras] format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] @@ -475,11 +774,15 @@ format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339- [[package]] name = "jupyter-client" -version = "7.4.8" +version = "7.4.7" description = "Jupyter protocol implementation and client libraries" category = "main" optional = true python-versions = ">=3.7" +files = [ + {file = "jupyter_client-7.4.7-py3-none-any.whl", hash = "sha256:df56ae23b8e1da1b66f89dee1368e948b24a7f780fa822c5735187589fc4c157"}, + {file = "jupyter_client-7.4.7.tar.gz", hash = "sha256:330f6b627e0b4bf2f54a3a0dd9e4a22d2b649c8518168afedce2c96a1ceb2860"}, +] [package.dependencies] entrypoints = "*" @@ -491,7 +794,7 @@ tornado = ">=6.2" traitlets = "*" [package.extras] -doc = ["ipykernel", "myst-parser", "sphinx-rtd-theme", "sphinx (>=1.3.6)", "sphinxcontrib-github-alt"] +doc = ["ipykernel", "myst-parser", "sphinx (>=1.3.6)", "sphinx-rtd-theme", "sphinxcontrib-github-alt"] test = ["codecov", "coverage", "ipykernel (>=6.12)", "ipython", "mypy", "pre-commit", "pytest", "pytest-asyncio (>=0.18)", "pytest-cov", "pytest-timeout"] [[package]] @@ -501,6 +804,10 @@ description = "Jupyter core package. A base package on which Jupyter projects re category = "main" optional = true python-versions = ">=3.7" +files = [ + {file = "jupyter_core-4.12.0-py3-none-any.whl", hash = "sha256:a54672c539333258495579f6964144924e0aa7b07f7069947bef76d7ea5cb4c1"}, + {file = "jupyter_core-4.12.0.tar.gz", hash = "sha256:87f39d7642412ae8a52291cc68e71ac01dfa2c735df2701f8108251d51b4f460"}, +] [package.dependencies] pywin32 = {version = ">=1.0", markers = "sys_platform == \"win32\" and platform_python_implementation != \"PyPy\""} @@ -516,6 +823,10 @@ description = "Pygments theme using JupyterLab CSS variables" category = "main" optional = true python-versions = ">=3.7" +files = [ + {file = "jupyterlab_pygments-0.2.2-py2.py3-none-any.whl", hash = "sha256:2405800db07c9f770863bcf8049a529c3dd4d3e28536638bd7c1c01d2748309f"}, + {file = "jupyterlab_pygments-0.2.2.tar.gz", hash = "sha256:7405d7fde60819d905a9fa8ce89e4cd830e318cdad22a0030f7a901da705585d"}, +] [[package]] name = "lark" @@ -524,9 +835,12 @@ description = "a modern parsing library" category = "main" optional = false python-versions = "*" +files = [ + {file = "lark-0.11.3.tar.gz", hash = "sha256:3100d9749b5a85735ec428b83100876a5da664804579e729c23a36341f961e7e"}, +] [package.extras] -atomic_cache = ["atomicwrites"] +atomic-cache = ["atomicwrites"] nearley = ["js2py"] regex = ["regex"] @@ -537,6 +851,48 @@ description = "Safely add untrusted strings to HTML/XML markup." category = "main" optional = true python-versions = ">=3.7" +files = [ + {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10c1bfff05d95783da83491be968e8fe789263689c02724e0c691933c52994f5"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7bd98b796e2b6553da7225aeb61f447f80a1ca64f41d83612e6139ca5213aa4"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b09bf97215625a311f669476f44b8b318b075847b49316d3e28c08e41a7a573f"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:694deca8d702d5db21ec83983ce0bb4b26a578e71fbdbd4fdcd387daa90e4d5e"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:efc1913fd2ca4f334418481c7e595c00aad186563bbc1ec76067848c7ca0a933"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-win32.whl", hash = "sha256:4a33dea2b688b3190ee12bd7cfa29d39c9ed176bda40bfa11099a3ce5d3a7ac6"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:dda30ba7e87fbbb7eab1ec9f58678558fd9a6b8b853530e176eabd064da81417"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:671cd1187ed5e62818414afe79ed29da836dde67166a9fac6d435873c44fdd02"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3799351e2336dc91ea70b034983ee71cf2f9533cdff7c14c90ea126bfd95d65a"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e72591e9ecd94d7feb70c1cbd7be7b3ebea3f548870aa91e2732960fa4d57a37"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6fbf47b5d3728c6aea2abb0589b5d30459e369baa772e0f37a0320185e87c980"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d5ee4f386140395a2c818d149221149c54849dfcfcb9f1debfe07a8b8bd63f9a"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bcb3ed405ed3222f9904899563d6fc492ff75cce56cba05e32eff40e6acbeaa3"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e1c0b87e09fa55a220f058d1d49d3fb8df88fbfab58558f1198e08c1e1de842a"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-win32.whl", hash = "sha256:8dc1c72a69aa7e082593c4a203dcf94ddb74bb5c8a731e4e1eb68d031e8498ff"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:97a68e6ada378df82bc9f16b800ab77cbf4b2fada0081794318520138c088e4a"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8c843bbcda3a2f1e3c2ab25913c80a3c5376cd00c6e8c4a86a89a28c8dc5452"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e576a51ad59e4bfaac456023a78f6b5e6e7651dcd383bcc3e18d06f9b55d6d1"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b9fe39a2ccc108a4accc2676e77da025ce383c108593d65cc909add5c3bd601"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96e37a3dc86e80bf81758c152fe66dbf60ed5eca3d26305edf01892257049925"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6d0072fea50feec76a4c418096652f2c3238eaa014b2f94aeb1d56a66b41403f"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:089cf3dbf0cd6c100f02945abeb18484bd1ee57a079aefd52cffd17fba910b88"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6a074d34ee7a5ce3effbc526b7083ec9731bb3cbf921bbe1d3005d4d2bdb3a63"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-win32.whl", hash = "sha256:421be9fbf0ffe9ffd7a378aafebbf6f4602d564d34be190fc19a193232fd12b1"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e04e26803c9c3851c931eac40c695602c6295b8d432cbe78609649ad9bd2da8a"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b87db4360013327109564f0e591bd2a3b318547bcef31b468a92ee504d07ae4f"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99a2a507ed3ac881b975a2976d59f38c19386d128e7a9a18b7df6fff1fd4c1d6"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56442863ed2b06d19c37f94d999035e15ee982988920e12a5b4ba29b62ad1f77"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ce11ee3f23f79dbd06fb3d63e2f6af7b12db1d46932fe7bd8afa259a5996603"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:33b74d289bd2f5e527beadcaa3f401e0df0a89927c1559c8566c066fa4248ab7"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:43093fb83d8343aac0b1baa75516da6092f58f41200907ef92448ecab8825135"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8e3dcf21f367459434c18e71b2a9532d96547aef8a871872a5bd69a715c15f96"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-win32.whl", hash = "sha256:d4306c36ca495956b6d568d276ac11fdd9c30a36f1b6eb928070dc5360b22e1c"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247"}, + {file = "MarkupSafe-2.1.1.tar.gz", hash = "sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b"}, +] [[package]] name = "matplotlib-inline" @@ -545,6 +901,10 @@ description = "Inline Matplotlib backend for Jupyter" category = "main" optional = true python-versions = ">=3.5" +files = [ + {file = "matplotlib-inline-0.1.6.tar.gz", hash = "sha256:f887e5f10ba98e8d2b150ddcf4702c1e5f8b3a20005eb0f74bfdbd360ee6f304"}, + {file = "matplotlib_inline-0.1.6-py3-none-any.whl", hash = "sha256:f1f41aab5328aa5aaea9b16d083b128102f8712542f819fe7e6a420ff581b311"}, +] [package.dependencies] traitlets = "*" @@ -556,6 +916,10 @@ description = "McCabe checker, plugin for flake8" category = "dev" optional = false python-versions = "*" +files = [ + {file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"}, + {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"}, +] [[package]] name = "mistune" @@ -564,19 +928,10 @@ description = "A sane Markdown parser with useful plugins and renderers" category = "main" optional = true python-versions = "*" - -[[package]] -name = "mock" -version = "4.0.3" -description = "Rolling backport of unittest.mock for all Pythons" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.extras] -build = ["twine", "wheel", "blurb"] -docs = ["sphinx"] -test = ["pytest (<5.4)", "pytest-cov"] +files = [ + {file = "mistune-2.0.4-py2.py3-none-any.whl", hash = "sha256:182cc5ee6f8ed1b807de6b7bb50155df7b66495412836b9a74c8fbdfc75fe36d"}, + {file = "mistune-2.0.4.tar.gz", hash = "sha256:9ee0a66053e2267aba772c71e06891fa8f1af6d4b01d5e84e267b4570d4d9808"}, +] [[package]] name = "msgpack" @@ -585,6 +940,29 @@ description = "MessagePack (de)serializer." category = "main" optional = false python-versions = "*" +files = [ + {file = "msgpack-0.6.2-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:774f5edc3475917cd95fe593e625d23d8580f9b48b570d8853d06cac171cd170"}, + {file = "msgpack-0.6.2-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:a06efd0482a1942aad209a6c18321b5e22d64eb531ea20af138b28172d8f35ba"}, + {file = "msgpack-0.6.2-cp27-cp27m-win32.whl", hash = "sha256:8a3ada8401736df2bf497f65589293a86c56e197a80ae7634ec2c3150a2f5082"}, + {file = "msgpack-0.6.2-cp27-cp27m-win_amd64.whl", hash = "sha256:b8b4bd3dafc7b92608ae5462add1c8cc881851c2d4f5d8977fdea5b081d17f21"}, + {file = "msgpack-0.6.2-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:24149a75643aeaa81ece4259084d11b792308a6cf74e796cbb35def94c89a25a"}, + {file = "msgpack-0.6.2-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:757bd71a9b89e4f1db0622af4436d403e742506dbea978eba566815dc65ec895"}, + {file = "msgpack-0.6.2-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:32fea0ea3cd1ef820286863a6202dcfd62a539b8ec3edcbdff76068a8c2cc6ce"}, + {file = "msgpack-0.6.2-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:db7ff14abc73577b0bcbcf73ecff97d3580ecaa0fc8724babce21fdf3fe08ef6"}, + {file = "msgpack-0.6.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:187794cd1eb73acccd528247e3565f6760bd842d7dc299241f830024a7dd5610"}, + {file = "msgpack-0.6.2-cp36-cp36m-macosx_10_6_intel.whl", hash = "sha256:b24afc52e18dccc8c175de07c1d680bdf315844566f4952b5bedb908894bec79"}, + {file = "msgpack-0.6.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:355f7fd0f90134229eaeefaee3cf42e0afc8518e8f3cd4b25f541a7104dcb8f9"}, + {file = "msgpack-0.6.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:76df51492bc6fa6cc8b65d09efdb67cbba3cbfe55004c3afc81352af92b4a43c"}, + {file = "msgpack-0.6.2-cp36-cp36m-win32.whl", hash = "sha256:f0f47bafe9c9b8ed03e19a100a743662dd8c6d0135e684feea720a0d0046d116"}, + {file = "msgpack-0.6.2-cp36-cp36m-win_amd64.whl", hash = "sha256:c6e5024fc0cdf7f83b6624850309ddd7e06c48a75fa0d1c5173de4d93300eb19"}, + {file = "msgpack-0.6.2-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:30b88c47e0cdb6062daed88ca283b0d84fa0d2ad6c273aa0788152a1c643e408"}, + {file = "msgpack-0.6.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:229a0ccdc39e9b6c6d1033cd8aecd9c296823b6c87f0de3943c59b8bc7c64bee"}, + {file = "msgpack-0.6.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:4abdb88a9b67e64810fb54b0c24a1fd76b12297b4f7a1467d85a14dd8367191a"}, + {file = "msgpack-0.6.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:dedf54d72d9e7b6d043c244c8213fe2b8bbfe66874b9a65b39c4cc892dd99dd4"}, + {file = "msgpack-0.6.2-cp37-cp37m-win32.whl", hash = "sha256:0cc7ca04e575ba34fea7cfcd76039f55def570e6950e4155a4174368142c8e1b"}, + {file = "msgpack-0.6.2-cp37-cp37m-win_amd64.whl", hash = "sha256:1904b7cb65342d0998b75908304a03cb004c63ef31e16c8c43fee6b989d7f0d7"}, + {file = "msgpack-0.6.2.tar.gz", hash = "sha256:ea3c2f859346fcd55fc46e96885301d9c2f7a36d453f5d8f2967840efa1e1830"}, +] [[package]] name = "mypy" @@ -593,11 +971,36 @@ description = "Optional static typing for Python" category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "mypy-0.981-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4bc460e43b7785f78862dab78674e62ec3cd523485baecfdf81a555ed29ecfa0"}, + {file = "mypy-0.981-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:756fad8b263b3ba39e4e204ee53042671b660c36c9017412b43af210ddee7b08"}, + {file = "mypy-0.981-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a16a0145d6d7d00fbede2da3a3096dcc9ecea091adfa8da48fa6a7b75d35562d"}, + {file = "mypy-0.981-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce65f70b14a21fdac84c294cde75e6dbdabbcff22975335e20827b3b94bdbf49"}, + {file = "mypy-0.981-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6e35d764784b42c3e256848fb8ed1d4292c9fc0098413adb28d84974c095b279"}, + {file = "mypy-0.981-cp310-cp310-win_amd64.whl", hash = "sha256:e53773073c864d5f5cec7f3fc72fbbcef65410cde8cc18d4f7242dea60dac52e"}, + {file = "mypy-0.981-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6ee196b1d10b8b215e835f438e06965d7a480f6fe016eddbc285f13955cca659"}, + {file = "mypy-0.981-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ad21d4c9d3673726cf986ea1d0c9fb66905258709550ddf7944c8f885f208be"}, + {file = "mypy-0.981-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d1debb09043e1f5ee845fa1e96d180e89115b30e47c5d3ce53bc967bab53f62d"}, + {file = "mypy-0.981-cp37-cp37m-win_amd64.whl", hash = "sha256:9f362470a3480165c4c6151786b5379351b790d56952005be18bdbdd4c7ce0ae"}, + {file = "mypy-0.981-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:c9e0efb95ed6ca1654951bd5ec2f3fa91b295d78bf6527e026529d4aaa1e0c30"}, + {file = "mypy-0.981-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e178eaffc3c5cd211a87965c8c0df6da91ed7d258b5fc72b8e047c3771317ddb"}, + {file = "mypy-0.981-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:06e1eac8d99bd404ed8dd34ca29673c4346e76dd8e612ea507763dccd7e13c7a"}, + {file = "mypy-0.981-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa38f82f53e1e7beb45557ff167c177802ba7b387ad017eab1663d567017c8ee"}, + {file = "mypy-0.981-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:64e1f6af81c003f85f0dfed52db632817dabb51b65c0318ffbf5ff51995bbb08"}, + {file = "mypy-0.981-cp38-cp38-win_amd64.whl", hash = "sha256:e1acf62a8c4f7c092462c738aa2c2489e275ed386320c10b2e9bff31f6f7e8d6"}, + {file = "mypy-0.981-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b6ede64e52257931315826fdbfc6ea878d89a965580d1a65638ef77cb551f56d"}, + {file = "mypy-0.981-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:eb3978b191b9fa0488524bb4ffedf2c573340e8c2b4206fc191d44c7093abfb7"}, + {file = "mypy-0.981-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:77f8fcf7b4b3cc0c74fb33ae54a4cd00bb854d65645c48beccf65fa10b17882c"}, + {file = "mypy-0.981-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f64d2ce043a209a297df322eb4054dfbaa9de9e8738291706eaafda81ab2b362"}, + {file = "mypy-0.981-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2ee3dbc53d4df7e6e3b1c68ac6a971d3a4fb2852bf10a05fda228721dd44fae1"}, + {file = "mypy-0.981-cp39-cp39-win_amd64.whl", hash = "sha256:8e8e49aa9cc23aa4c926dc200ce32959d3501c4905147a66ce032f05cb5ecb92"}, + {file = "mypy-0.981-py3-none-any.whl", hash = "sha256:794f385653e2b749387a42afb1e14c2135e18daeb027e0d97162e4b7031210f8"}, + {file = "mypy-0.981.tar.gz", hash = "sha256:ad77c13037d3402fbeffda07d51e3f228ba078d1c7096a73759c9419ea031bf4"}, +] [package.dependencies] mypy-extensions = ">=0.4.3" tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} -typed-ast = {version = ">=1.4.0,<2", markers = "python_version < \"3.8\""} typing-extensions = ">=3.10" [package.extras] @@ -612,6 +1015,10 @@ description = "Experimental type system extensions for programs checked with the category = "dev" optional = false python-versions = "*" +files = [ + {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, + {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, +] [[package]] name = "nbclient" @@ -620,6 +1027,10 @@ description = "A client library for executing notebooks. Formerly nbconvert's Ex category = "main" optional = true python-versions = ">=3.7.0" +files = [ + {file = "nbclient-0.7.2-py3-none-any.whl", hash = "sha256:d97ac6257de2794f5397609df754fcbca1a603e94e924eb9b99787c031ae2e7c"}, + {file = "nbclient-0.7.2.tar.gz", hash = "sha256:884a3f4a8c4fc24bb9302f263e0af47d97f0d01fe11ba714171b320c8ac09547"}, +] [package.dependencies] jupyter-client = ">=6.1.12" @@ -629,16 +1040,20 @@ traitlets = ">=5.3" [package.extras] dev = ["pre-commit"] -docs = ["autodoc-traits", "mock", "moto", "myst-parser", "nbclient", "sphinx-book-theme", "sphinx (>=1.7)"] -test = ["ipykernel", "ipython", "ipywidgets", "nbconvert (>=7.0.0)", "pytest-asyncio", "pytest-cov (>=4.0)", "pytest (>=7.0)", "testpath", "xmltodict"] +docs = ["autodoc-traits", "mock", "moto", "myst-parser", "nbclient[test]", "sphinx (>=1.7)", "sphinx-book-theme"] +test = ["ipykernel", "ipython", "ipywidgets", "nbconvert (>=7.0.0)", "pytest (>=7.0)", "pytest-asyncio", "pytest-cov (>=4.0)", "testpath", "xmltodict"] [[package]] name = "nbconvert" -version = "7.2.6" +version = "7.2.5" description = "Converting Jupyter Notebooks" category = "main" optional = true python-versions = ">=3.7" +files = [ + {file = "nbconvert-7.2.5-py3-none-any.whl", hash = "sha256:3e90e108bb5637b5b8a1422af1156af1368b39dd25369ff7faa7dfdcdef18f81"}, + {file = "nbconvert-7.2.5.tar.gz", hash = "sha256:8fdc44fd7d9424db7fdc6e1e834a02f6b8620ffb653767388be2f9eb16f84184"}, +] [package.dependencies] beautifulsoup4 = "*" @@ -659,12 +1074,12 @@ tinycss2 = "*" traitlets = ">=5.0" [package.extras] -all = ["nbconvert"] -docs = ["ipykernel", "ipython", "myst-parser", "nbsphinx (>=0.2.12)", "pydata-sphinx-theme", "sphinx (==5.0.2)"] -qtpdf = ["nbconvert"] +all = ["ipykernel", "ipython", "ipywidgets (>=7)", "myst-parser", "nbsphinx (>=0.2.12)", "pre-commit", "pyppeteer (>=1,<1.1)", "pyqtwebengine (>=5.15)", "pytest", "pytest-cov", "pytest-dependency", "sphinx (==5.0.2)", "sphinx-rtd-theme", "tornado (>=6.1)"] +docs = ["ipython", "myst-parser", "nbsphinx (>=0.2.12)", "sphinx (==5.0.2)", "sphinx-rtd-theme"] +qtpdf = ["pyqtwebengine (>=5.15)"] qtpng = ["pyqtwebengine (>=5.15)"] serve = ["tornado (>=6.1)"] -test = ["ipykernel", "ipywidgets (>=7)", "pre-commit", "pyppeteer (>=1,<1.1)", "pytest", "pytest-dependency"] +test = ["ipykernel", "ipywidgets (>=7)", "pre-commit", "pyppeteer (>=1,<1.1)", "pytest", "pytest-cov", "pytest-dependency"] webpdf = ["pyppeteer (>=1,<1.1)"] [[package]] @@ -674,10 +1089,13 @@ description = "The Jupyter Notebook format" category = "main" optional = true python-versions = ">=3.7" +files = [ + {file = "nbformat-5.7.0-py3-none-any.whl", hash = "sha256:1b05ec2c552c2f1adc745f4eddce1eac8ca9ffd59bb9fd859e827eaa031319f9"}, + {file = "nbformat-5.7.0.tar.gz", hash = "sha256:1d4760c15c1a04269ef5caf375be8b98dd2f696e5eb9e603ec2bf091f9b0d3f3"}, +] [package.dependencies] fastjsonschema = "*" -importlib-metadata = {version = ">=3.6", markers = "python_version < \"3.8\""} jsonschema = ">=2.6" jupyter-core = "*" traitlets = ">=5.1" @@ -692,6 +1110,10 @@ description = "Jupyter Notebook Tools for Sphinx" category = "main" optional = true python-versions = ">=3.6" +files = [ + {file = "nbsphinx-0.8.10-py3-none-any.whl", hash = "sha256:6076fba58020420927899362579f12779a43091eb238f414519ec25b4a8cfc96"}, + {file = "nbsphinx-0.8.10.tar.gz", hash = "sha256:a8d68046f8aab916e2940b9b3819bd3ef9ddce868aa38845ea366645cabb6254"}, +] [package.dependencies] docutils = "*" @@ -708,6 +1130,10 @@ description = "Patch asyncio to allow nested event loops" category = "main" optional = false python-versions = ">=3.5" +files = [ + {file = "nest_asyncio-1.5.6-py3-none-any.whl", hash = "sha256:b9a953fb40dceaa587d109609098db21900182b16440652454a146cffb06e8b8"}, + {file = "nest_asyncio-1.5.6.tar.gz", hash = "sha256:d267cc1ff794403f7df692964d1d2a3fa9418ffea2a3f6859a439ff482fef290"}, +] [[package]] name = "networkx" @@ -716,13 +1142,17 @@ description = "Python package for creating and manipulating graphs and networks" category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "networkx-2.6.3-py3-none-any.whl", hash = "sha256:80b6b89c77d1dfb64a4c7854981b60aeea6360ac02c6d4e4913319e0a313abef"}, + {file = "networkx-2.6.3.tar.gz", hash = "sha256:c0946ed31d71f1b732b5aaa6da5a0388a345019af232ce2f49c766e2d6795c51"}, +] [package.extras] -default = ["numpy (>=1.19)", "scipy (>=1.5,!=1.6.1)", "matplotlib (>=3.3)", "pandas (>=1.1)"] +default = ["matplotlib (>=3.3)", "numpy (>=1.19)", "pandas (>=1.1)", "scipy (>=1.5,!=1.6.1)"] developer = ["black (==21.5b1)", "pre-commit (>=2.12)"] -doc = ["sphinx (>=4.0,<5.0)", "pydata-sphinx-theme (>=0.6,<1.0)", "sphinx-gallery (>=0.9,<1.0)", "numpydoc (>=1.1)", "pillow (>=8.2)", "nb2plots (>=0.6)", "texext (>=0.6.6)"] -extra = ["lxml (>=4.5)", "pygraphviz (>=1.7)", "pydot (>=1.4.1)"] -test = ["pytest (>=6.2)", "pytest-cov (>=2.12)", "codecov (>=2.1)"] +doc = ["nb2plots (>=0.6)", "numpydoc (>=1.1)", "pillow (>=8.2)", "pydata-sphinx-theme (>=0.6,<1.0)", "sphinx (>=4.0,<5.0)", "sphinx-gallery (>=0.9,<1.0)", "texext (>=0.6.6)"] +extra = ["lxml (>=4.5)", "pydot (>=1.4.1)", "pygraphviz (>=1.7)"] +test = ["codecov (>=2.1)", "pytest (>=6.2)", "pytest-cov (>=2.12)"] [[package]] name = "numpy" @@ -731,6 +1161,39 @@ description = "NumPy is the fundamental package for array computing with Python. category = "main" optional = false python-versions = ">=3.7,<3.11" +files = [ + {file = "numpy-1.21.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8737609c3bbdd48e380d463134a35ffad3b22dc56295eff6f79fd85bd0eeeb25"}, + {file = "numpy-1.21.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:fdffbfb6832cd0b300995a2b08b8f6fa9f6e856d562800fea9182316d99c4e8e"}, + {file = "numpy-1.21.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3820724272f9913b597ccd13a467cc492a0da6b05df26ea09e78b171a0bb9da6"}, + {file = "numpy-1.21.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f17e562de9edf691a42ddb1eb4a5541c20dd3f9e65b09ded2beb0799c0cf29bb"}, + {file = "numpy-1.21.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f30427731561ce75d7048ac254dbe47a2ba576229250fb60f0fb74db96501a1"}, + {file = "numpy-1.21.6-cp310-cp310-win32.whl", hash = "sha256:d4bf4d43077db55589ffc9009c0ba0a94fa4908b9586d6ccce2e0b164c86303c"}, + {file = "numpy-1.21.6-cp310-cp310-win_amd64.whl", hash = "sha256:d136337ae3cc69aa5e447e78d8e1514be8c3ec9b54264e680cf0b4bd9011574f"}, + {file = "numpy-1.21.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6aaf96c7f8cebc220cdfc03f1d5a31952f027dda050e5a703a0d1c396075e3e7"}, + {file = "numpy-1.21.6-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:67c261d6c0a9981820c3a149d255a76918278a6b03b6a036800359aba1256d46"}, + {file = "numpy-1.21.6-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a6be4cb0ef3b8c9250c19cc122267263093eee7edd4e3fa75395dfda8c17a8e2"}, + {file = "numpy-1.21.6-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7c4068a8c44014b2d55f3c3f574c376b2494ca9cc73d2f1bd692382b6dffe3db"}, + {file = "numpy-1.21.6-cp37-cp37m-win32.whl", hash = "sha256:7c7e5fa88d9ff656e067876e4736379cc962d185d5cd808014a8a928d529ef4e"}, + {file = "numpy-1.21.6-cp37-cp37m-win_amd64.whl", hash = "sha256:bcb238c9c96c00d3085b264e5c1a1207672577b93fa666c3b14a45240b14123a"}, + {file = "numpy-1.21.6-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:82691fda7c3f77c90e62da69ae60b5ac08e87e775b09813559f8901a88266552"}, + {file = "numpy-1.21.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:643843bcc1c50526b3a71cd2ee561cf0d8773f062c8cbaf9ffac9fdf573f83ab"}, + {file = "numpy-1.21.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:357768c2e4451ac241465157a3e929b265dfac85d9214074985b1786244f2ef3"}, + {file = "numpy-1.21.6-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9f411b2c3f3d76bba0865b35a425157c5dcf54937f82bbeb3d3c180789dd66a6"}, + {file = "numpy-1.21.6-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4aa48afdce4660b0076a00d80afa54e8a97cd49f457d68a4342d188a09451c1a"}, + {file = "numpy-1.21.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6a96eef20f639e6a97d23e57dd0c1b1069a7b4fd7027482a4c5c451cd7732f4"}, + {file = "numpy-1.21.6-cp38-cp38-win32.whl", hash = "sha256:5c3c8def4230e1b959671eb959083661b4a0d2e9af93ee339c7dada6759a9470"}, + {file = "numpy-1.21.6-cp38-cp38-win_amd64.whl", hash = "sha256:bf2ec4b75d0e9356edea834d1de42b31fe11f726a81dfb2c2112bc1eaa508fcf"}, + {file = "numpy-1.21.6-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:4391bd07606be175aafd267ef9bea87cf1b8210c787666ce82073b05f202add1"}, + {file = "numpy-1.21.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:67f21981ba2f9d7ba9ade60c9e8cbaa8cf8e9ae51673934480e45cf55e953673"}, + {file = "numpy-1.21.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ee5ec40fdd06d62fe5d4084bef4fd50fd4bb6bfd2bf519365f569dc470163ab0"}, + {file = "numpy-1.21.6-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1dbe1c91269f880e364526649a52eff93ac30035507ae980d2fed33aaee633ac"}, + {file = "numpy-1.21.6-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d9caa9d5e682102453d96a0ee10c7241b72859b01a941a397fd965f23b3e016b"}, + {file = "numpy-1.21.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58459d3bad03343ac4b1b42ed14d571b8743dc80ccbf27444f266729df1d6f5b"}, + {file = "numpy-1.21.6-cp39-cp39-win32.whl", hash = "sha256:7f5ae4f304257569ef3b948810816bc87c9146e8c446053539947eedeaa32786"}, + {file = "numpy-1.21.6-cp39-cp39-win_amd64.whl", hash = "sha256:e31f0bb5928b793169b87e3d1e070f2342b22d5245c755e2b81caa29756246c3"}, + {file = "numpy-1.21.6-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:dd1c8f6bd65d07d3810b90d02eba7997e32abbdf1277a481d698969e921a3be0"}, + {file = "numpy-1.21.6.zip", hash = "sha256:ecb55251139706669fdec2ff073c98ef8e9a84473e51e716211b41aa0f18e656"}, +] [[package]] name = "packaging" @@ -739,6 +1202,10 @@ description = "Core utilities for Python packages" category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, + {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"}, +] [package.dependencies] pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" @@ -750,6 +1217,10 @@ description = "Utilities for writing pandoc filters in python" category = "main" optional = true python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pandocfilters-1.5.0-py2.py3-none-any.whl", hash = "sha256:33aae3f25fd1a026079f5d27bdd52496f0e0803b3469282162bafdcbdf6ef14f"}, + {file = "pandocfilters-1.5.0.tar.gz", hash = "sha256:0b679503337d233b4339a817bfc8c50064e2eff681314376a47cb582305a7a38"}, +] [[package]] name = "parso" @@ -758,6 +1229,10 @@ description = "A Python Parser" category = "main" optional = true python-versions = ">=3.6" +files = [ + {file = "parso-0.8.3-py2.py3-none-any.whl", hash = "sha256:c001d4636cd3aecdaf33cbb40aebb59b094be2a74c556778ef5576c175e19e75"}, + {file = "parso-0.8.3.tar.gz", hash = "sha256:8c07be290bb59f03588915921e29e8a50002acaf2cdc5fa0e0114f91709fafa0"}, +] [package.extras] qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] @@ -770,6 +1245,10 @@ description = "Utility library for gitignore style pattern matching of file path category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "pathspec-0.10.2-py3-none-any.whl", hash = "sha256:88c2606f2c1e818b978540f73ecc908e13999c6c3a383daf3705652ae79807a5"}, + {file = "pathspec-0.10.2.tar.gz", hash = "sha256:8f6bf73e5758fd365ef5d58ce09ac7c27d2833a8d7da51712eac6e27e35141b0"}, +] [[package]] name = "pexpect" @@ -778,6 +1257,10 @@ description = "Pexpect allows easy control of interactive console applications." category = "main" optional = true python-versions = "*" +files = [ + {file = "pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937"}, + {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"}, +] [package.dependencies] ptyprocess = ">=0.5" @@ -789,6 +1272,10 @@ description = "Tiny 'shelve'-like database with concurrency support" category = "main" optional = true python-versions = "*" +files = [ + {file = "pickleshare-0.7.5-py2.py3-none-any.whl", hash = "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56"}, + {file = "pickleshare-0.7.5.tar.gz", hash = "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca"}, +] [[package]] name = "pkgutil-resolve-name" @@ -797,18 +1284,26 @@ description = "Resolve a name to an object." category = "main" optional = true python-versions = ">=3.6" +files = [ + {file = "pkgutil_resolve_name-1.3.10-py3-none-any.whl", hash = "sha256:ca27cc078d25c5ad71a9de0a7a330146c4e014c2462d9af19c6b828280649c5e"}, + {file = "pkgutil_resolve_name-1.3.10.tar.gz", hash = "sha256:357d6c9e6a755653cfd78893817c0853af365dd51ec97f3d358a819373bbd174"}, +] [[package]] name = "platformdirs" -version = "2.6.0" +version = "2.5.4" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "platformdirs-2.5.4-py3-none-any.whl", hash = "sha256:af0276409f9a02373d540bf8480021a048711d572745aef4b7842dad245eba10"}, + {file = "platformdirs-2.5.4.tar.gz", hash = "sha256:1006647646d80f16130f052404c6b901e80ee4ed6bef6792e1f238a8969106f7"}, +] [package.extras] -docs = ["furo (>=2022.9.29)", "proselint (>=0.13)", "sphinx-autodoc-typehints (>=1.19.4)", "sphinx (>=5.3)"] -test = ["appdirs (==1.4.4)", "pytest-cov (>=4)", "pytest-mock (>=3.10)", "pytest (>=7.2)"] +docs = ["furo (>=2022.9.29)", "proselint (>=0.13)", "sphinx (>=5.3)", "sphinx-autodoc-typehints (>=1.19.4)"] +test = ["appdirs (==1.4.4)", "pytest (>=7.2)", "pytest-cov (>=4)", "pytest-mock (>=3.10)"] [[package]] name = "pluggy" @@ -817,21 +1312,26 @@ description = "plugin and hook calling mechanisms for python" category = "dev" optional = false python-versions = ">=3.6" - -[package.dependencies] -importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} +files = [ + {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, + {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, +] [package.extras] -testing = ["pytest-benchmark", "pytest"] -dev = ["tox", "pre-commit"] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] [[package]] name = "prompt-toolkit" -version = "3.0.36" +version = "3.0.33" description = "Library for building powerful interactive command lines in Python" category = "main" optional = true python-versions = ">=3.6.2" +files = [ + {file = "prompt_toolkit-3.0.33-py3-none-any.whl", hash = "sha256:ced598b222f6f4029c0800cefaa6a17373fb580cd093223003475ce32805c35b"}, + {file = "prompt_toolkit-3.0.33.tar.gz", hash = "sha256:535c29c31216c77302877d5120aef6c94ff573748a5b5ca5b1b1f76f5e700c73"}, +] [package.dependencies] wcwidth = "*" @@ -843,6 +1343,10 @@ description = "Run a subprocess in a pseudo terminal" category = "main" optional = true python-versions = "*" +files = [ + {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, + {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, +] [[package]] name = "py" @@ -851,6 +1355,10 @@ description = "library with cross-python path, ini-parsing, io, code, log facili category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, + {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, +] [[package]] name = "pycodestyle" @@ -859,6 +1367,10 @@ description = "Python style guide checker" category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pycodestyle-2.7.0-py2.py3-none-any.whl", hash = "sha256:514f76d918fcc0b55c6680472f0a37970994e07bbb80725808c17089be302068"}, + {file = "pycodestyle-2.7.0.tar.gz", hash = "sha256:c389c1d06bf7904078ca03399a4816f974a1d590090fecea0c63ec26ebaf1cef"}, +] [[package]] name = "pycparser" @@ -867,6 +1379,10 @@ description = "C parser in Python" category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, + {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, +] [[package]] name = "pydantic" @@ -875,6 +1391,44 @@ description = "Data validation and settings management using python type hints" category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "pydantic-1.10.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bb6ad4489af1bac6955d38ebcb95079a836af31e4c4f74aba1ca05bb9f6027bd"}, + {file = "pydantic-1.10.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a1f5a63a6dfe19d719b1b6e6106561869d2efaca6167f84f5ab9347887d78b98"}, + {file = "pydantic-1.10.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:352aedb1d71b8b0736c6d56ad2bd34c6982720644b0624462059ab29bd6e5912"}, + {file = "pydantic-1.10.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:19b3b9ccf97af2b7519c42032441a891a5e05c68368f40865a90eb88833c2559"}, + {file = "pydantic-1.10.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e9069e1b01525a96e6ff49e25876d90d5a563bc31c658289a8772ae186552236"}, + {file = "pydantic-1.10.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:355639d9afc76bcb9b0c3000ddcd08472ae75318a6eb67a15866b87e2efa168c"}, + {file = "pydantic-1.10.2-cp310-cp310-win_amd64.whl", hash = "sha256:ae544c47bec47a86bc7d350f965d8b15540e27e5aa4f55170ac6a75e5f73b644"}, + {file = "pydantic-1.10.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a4c805731c33a8db4b6ace45ce440c4ef5336e712508b4d9e1aafa617dc9907f"}, + {file = "pydantic-1.10.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d49f3db871575e0426b12e2f32fdb25e579dea16486a26e5a0474af87cb1ab0a"}, + {file = "pydantic-1.10.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37c90345ec7dd2f1bcef82ce49b6235b40f282b94d3eec47e801baf864d15525"}, + {file = "pydantic-1.10.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b5ba54d026c2bd2cb769d3468885f23f43710f651688e91f5fb1edcf0ee9283"}, + {file = "pydantic-1.10.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:05e00dbebbe810b33c7a7362f231893183bcc4251f3f2ff991c31d5c08240c42"}, + {file = "pydantic-1.10.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2d0567e60eb01bccda3a4df01df677adf6b437958d35c12a3ac3e0f078b0ee52"}, + {file = "pydantic-1.10.2-cp311-cp311-win_amd64.whl", hash = "sha256:c6f981882aea41e021f72779ce2a4e87267458cc4d39ea990729e21ef18f0f8c"}, + {file = "pydantic-1.10.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c4aac8e7103bf598373208f6299fa9a5cfd1fc571f2d40bf1dd1955a63d6eeb5"}, + {file = "pydantic-1.10.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81a7b66c3f499108b448f3f004801fcd7d7165fb4200acb03f1c2402da73ce4c"}, + {file = "pydantic-1.10.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bedf309630209e78582ffacda64a21f96f3ed2e51fbf3962d4d488e503420254"}, + {file = "pydantic-1.10.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:9300fcbebf85f6339a02c6994b2eb3ff1b9c8c14f502058b5bf349d42447dcf5"}, + {file = "pydantic-1.10.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:216f3bcbf19c726b1cc22b099dd409aa371f55c08800bcea4c44c8f74b73478d"}, + {file = "pydantic-1.10.2-cp37-cp37m-win_amd64.whl", hash = "sha256:dd3f9a40c16daf323cf913593083698caee97df2804aa36c4b3175d5ac1b92a2"}, + {file = "pydantic-1.10.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b97890e56a694486f772d36efd2ba31612739bc6f3caeee50e9e7e3ebd2fdd13"}, + {file = "pydantic-1.10.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9cabf4a7f05a776e7793e72793cd92cc865ea0e83a819f9ae4ecccb1b8aa6116"}, + {file = "pydantic-1.10.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06094d18dd5e6f2bbf93efa54991c3240964bb663b87729ac340eb5014310624"}, + {file = "pydantic-1.10.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cc78cc83110d2f275ec1970e7a831f4e371ee92405332ebfe9860a715f8336e1"}, + {file = "pydantic-1.10.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1ee433e274268a4b0c8fde7ad9d58ecba12b069a033ecc4645bb6303c062d2e9"}, + {file = "pydantic-1.10.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:7c2abc4393dea97a4ccbb4ec7d8658d4e22c4765b7b9b9445588f16c71ad9965"}, + {file = "pydantic-1.10.2-cp38-cp38-win_amd64.whl", hash = "sha256:0b959f4d8211fc964772b595ebb25f7652da3f22322c007b6fed26846a40685e"}, + {file = "pydantic-1.10.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c33602f93bfb67779f9c507e4d69451664524389546bacfe1bee13cae6dc7488"}, + {file = "pydantic-1.10.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5760e164b807a48a8f25f8aa1a6d857e6ce62e7ec83ea5d5c5a802eac81bad41"}, + {file = "pydantic-1.10.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6eb843dcc411b6a2237a694f5e1d649fc66c6064d02b204a7e9d194dff81eb4b"}, + {file = "pydantic-1.10.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4b8795290deaae348c4eba0cebb196e1c6b98bdbe7f50b2d0d9a4a99716342fe"}, + {file = "pydantic-1.10.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:e0bedafe4bc165ad0a56ac0bd7695df25c50f76961da29c050712596cf092d6d"}, + {file = "pydantic-1.10.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2e05aed07fa02231dbf03d0adb1be1d79cabb09025dd45aa094aa8b4e7b9dcda"}, + {file = "pydantic-1.10.2-cp39-cp39-win_amd64.whl", hash = "sha256:c1ba1afb396148bbc70e9eaa8c06c1716fdddabaf86e7027c5988bae2a829ab6"}, + {file = "pydantic-1.10.2-py3-none-any.whl", hash = "sha256:1b6ee725bd6e83ec78b1aa32c5b1fa67a3a65badddde3976bca5fe4568f27709"}, + {file = "pydantic-1.10.2.tar.gz", hash = "sha256:91b8e218852ef6007c2b98cd861601c6a09f1aa32bbbb74fab5b1c33d4a1e410"}, +] [package.dependencies] typing-extensions = ">=4.1.0" @@ -890,6 +1444,10 @@ description = "passive checker of Python programs" category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pyflakes-2.3.1-py2.py3-none-any.whl", hash = "sha256:7893783d01b8a89811dd72d7dfd4d84ff098e5eed95cfa8905b22bbffe52efc3"}, + {file = "pyflakes-2.3.1.tar.gz", hash = "sha256:f5bc8ecabc05bb9d291eb5203d6810b49040f6ff446a756326104746cc00c1db"}, +] [[package]] name = "pygments" @@ -898,6 +1456,10 @@ description = "Pygments is a syntax highlighting package written in Python." category = "main" optional = true python-versions = ">=3.6" +files = [ + {file = "Pygments-2.13.0-py3-none-any.whl", hash = "sha256:f643f331ab57ba3c9d89212ee4a2dabc6e94f117cf4eefde99a0574720d14c42"}, + {file = "Pygments-2.13.0.tar.gz", hash = "sha256:56a8508ae95f98e2b9bdf93a6be5ae3f7d8af858b43e02c5a2ff083726be40c1"}, +] [package.extras] plugins = ["importlib-metadata"] @@ -909,12 +1471,16 @@ description = "JSON Web Token implementation in Python" category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "PyJWT-2.6.0-py3-none-any.whl", hash = "sha256:d83c3d892a77bbb74d3e1a2cfa90afaadb60945205d1095d9221f04466f64c14"}, + {file = "PyJWT-2.6.0.tar.gz", hash = "sha256:69285c7e31fc44f68a1feb309e948e0df53259d579295e6cfe2b1792329f05fd"}, +] [package.extras] crypto = ["cryptography (>=3.4.0)"] -dev = ["sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface", "cryptography (>=3.4.0)", "pytest (>=6.0.0,<7.0.0)", "coverage[toml] (==5.0.4)", "pre-commit"] +dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pytest (>=6.0.0,<7.0.0)", "sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] docs = ["sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] -tests = ["pytest (>=6.0.0,<7.0.0)", "coverage[toml] (==5.0.4)"] +tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] [[package]] name = "pyparsing" @@ -923,9 +1489,13 @@ description = "pyparsing module - Classes and methods to define and execute pars category = "main" optional = false python-versions = ">=3.6.8" +files = [ + {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, + {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, +] [package.extras] -diagrams = ["railroad-diagrams", "jinja2"] +diagrams = ["jinja2", "railroad-diagrams"] [[package]] name = "pyrsistent" @@ -934,6 +1504,30 @@ description = "Persistent/Functional/Immutable data structures" category = "main" optional = true python-versions = ">=3.7" +files = [ + {file = "pyrsistent-0.19.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d6982b5a0237e1b7d876b60265564648a69b14017f3b5f908c5be2de3f9abb7a"}, + {file = "pyrsistent-0.19.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:187d5730b0507d9285a96fca9716310d572e5464cadd19f22b63a6976254d77a"}, + {file = "pyrsistent-0.19.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:055ab45d5911d7cae397dc418808d8802fb95262751872c841c170b0dbf51eed"}, + {file = "pyrsistent-0.19.2-cp310-cp310-win32.whl", hash = "sha256:456cb30ca8bff00596519f2c53e42c245c09e1a4543945703acd4312949bfd41"}, + {file = "pyrsistent-0.19.2-cp310-cp310-win_amd64.whl", hash = "sha256:b39725209e06759217d1ac5fcdb510e98670af9e37223985f330b611f62e7425"}, + {file = "pyrsistent-0.19.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2aede922a488861de0ad00c7630a6e2d57e8023e4be72d9d7147a9fcd2d30712"}, + {file = "pyrsistent-0.19.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:879b4c2f4d41585c42df4d7654ddffff1239dc4065bc88b745f0341828b83e78"}, + {file = "pyrsistent-0.19.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c43bec251bbd10e3cb58ced80609c5c1eb238da9ca78b964aea410fb820d00d6"}, + {file = "pyrsistent-0.19.2-cp37-cp37m-win32.whl", hash = "sha256:d690b18ac4b3e3cab73b0b7aa7dbe65978a172ff94970ff98d82f2031f8971c2"}, + {file = "pyrsistent-0.19.2-cp37-cp37m-win_amd64.whl", hash = "sha256:3ba4134a3ff0fc7ad225b6b457d1309f4698108fb6b35532d015dca8f5abed73"}, + {file = "pyrsistent-0.19.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a178209e2df710e3f142cbd05313ba0c5ebed0a55d78d9945ac7a4e09d923308"}, + {file = "pyrsistent-0.19.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e371b844cec09d8dc424d940e54bba8f67a03ebea20ff7b7b0d56f526c71d584"}, + {file = "pyrsistent-0.19.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:111156137b2e71f3a9936baf27cb322e8024dac3dc54ec7fb9f0bcf3249e68bb"}, + {file = "pyrsistent-0.19.2-cp38-cp38-win32.whl", hash = "sha256:e5d8f84d81e3729c3b506657dddfe46e8ba9c330bf1858ee33108f8bb2adb38a"}, + {file = "pyrsistent-0.19.2-cp38-cp38-win_amd64.whl", hash = "sha256:9cd3e9978d12b5d99cbdc727a3022da0430ad007dacf33d0bf554b96427f33ab"}, + {file = "pyrsistent-0.19.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f1258f4e6c42ad0b20f9cfcc3ada5bd6b83374516cd01c0960e3cb75fdca6770"}, + {file = "pyrsistent-0.19.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21455e2b16000440e896ab99e8304617151981ed40c29e9507ef1c2e4314ee95"}, + {file = "pyrsistent-0.19.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bfd880614c6237243ff53a0539f1cb26987a6dc8ac6e66e0c5a40617296a045e"}, + {file = "pyrsistent-0.19.2-cp39-cp39-win32.whl", hash = "sha256:71d332b0320642b3261e9fee47ab9e65872c2bd90260e5d225dabeed93cbd42b"}, + {file = "pyrsistent-0.19.2-cp39-cp39-win_amd64.whl", hash = "sha256:dec3eac7549869365fe263831f576c8457f6c833937c68542d08fde73457d291"}, + {file = "pyrsistent-0.19.2-py3-none-any.whl", hash = "sha256:ea6b79a02a28550c98b6ca9c35b9f492beaa54d7c5c9e9949555893c8a9234d0"}, + {file = "pyrsistent-0.19.2.tar.gz", hash = "sha256:bfa0351be89c9fcbcb8c9879b826f4353be10f58f8a677efab0c017bf7137ec2"}, +] [[package]] name = "pytest" @@ -942,12 +1536,15 @@ description = "pytest: simple powerful testing with Python" category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "pytest-6.2.5-py3-none-any.whl", hash = "sha256:7310f8d27bc79ced999e760ca304d69f6ba6c6649c0b60fb0e04a4a77cacc134"}, + {file = "pytest-6.2.5.tar.gz", hash = "sha256:131b36680866a76e6781d13f101efb86cf674ebb9762eb70d3082b6f29889e89"}, +] [package.dependencies] atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""} attrs = ">=19.2.0" colorama = {version = "*", markers = "sys_platform == \"win32\""} -importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} iniconfig = "*" packaging = "*" pluggy = ">=0.12,<2.0" @@ -964,6 +1561,10 @@ description = "Pytest plugin for measuring coverage." category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "pytest-cov-2.12.1.tar.gz", hash = "sha256:261ceeb8c227b726249b376b8526b600f38667ee314f910353fa318caa01f4d7"}, + {file = "pytest_cov-2.12.1-py2.py3-none-any.whl", hash = "sha256:261bb9e47e65bd099c89c3edf92972865210c36813f80ede5277dceb77a4a62a"}, +] [package.dependencies] coverage = ">=5.2.1" @@ -971,7 +1572,7 @@ pytest = ">=4.6" toml = "*" [package.extras] -testing = ["fields", "hunter", "process-tests", "six", "pytest-xdist", "virtualenv"] +testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtualenv"] [[package]] name = "pytest-forked" @@ -980,6 +1581,10 @@ description = "run tests in isolated forked subprocesses" category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "pytest-forked-1.4.0.tar.gz", hash = "sha256:8b67587c8f98cbbadfdd804539ed5455b6ed03802203485dd2f53c1422d7440e"}, + {file = "pytest_forked-1.4.0-py3-none-any.whl", hash = "sha256:bbbb6717efc886b9d64537b41fb1497cfaf3c9601276be8da2cccfea5a3c8ad8"}, +] [package.dependencies] py = "*" @@ -992,6 +1597,10 @@ description = "Wrap tests with fixtures in freeze_time" category = "dev" optional = false python-versions = "*" +files = [ + {file = "pytest-freezegun-0.4.2.zip", hash = "sha256:19c82d5633751bf3ec92caa481fb5cffaac1787bd485f0df6436fd6242176949"}, + {file = "pytest_freezegun-0.4.2-py2.py3-none-any.whl", hash = "sha256:5318a6bfb8ba4b709c8471c94d0033113877b3ee02da5bfcd917c1889cde99a7"}, +] [package.dependencies] freezegun = ">0.3" @@ -1004,12 +1613,16 @@ description = "Thin-wrapper around the mock package for easier use with pytest" category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "pytest-mock-3.10.0.tar.gz", hash = "sha256:fbbdb085ef7c252a326fd8cdcac0aa3b1333d8811f131bdcc701002e1be7ed4f"}, + {file = "pytest_mock-3.10.0-py3-none-any.whl", hash = "sha256:f4c973eeae0282963eb293eb173ce91b091a79c1334455acfac9ddee8a1c784b"}, +] [package.dependencies] pytest = ">=5.0" [package.extras] -dev = ["pre-commit", "tox", "pytest-asyncio"] +dev = ["pre-commit", "pytest-asyncio", "tox"] [[package]] name = "pytest-rerunfailures" @@ -1018,9 +1631,14 @@ description = "pytest plugin to re-run tests to eliminate flaky failures" category = "dev" optional = false python-versions = ">=3.5" +files = [ + {file = "pytest-rerunfailures-9.1.1.tar.gz", hash = "sha256:1cb11a17fc121b3918414eb5eaf314ee325f2e693ac7cb3f6abf7560790827f2"}, + {file = "pytest_rerunfailures-9.1.1-py3-none-any.whl", hash = "sha256:2eb7d0ad651761fbe80e064b0fd415cf6730cdbc53c16a145fd84b66143e609f"}, +] [package.dependencies] pytest = ">=5.0" +setuptools = ">=40.0" [[package]] name = "pytest-timeout" @@ -1029,6 +1647,10 @@ description = "py.test plugin to abort hanging tests" category = "dev" optional = false python-versions = "*" +files = [ + {file = "pytest-timeout-1.4.2.tar.gz", hash = "sha256:20b3113cf6e4e80ce2d403b6fb56e9e1b871b510259206d40ff8d609f48bda76"}, + {file = "pytest_timeout-1.4.2-py2.py3-none-any.whl", hash = "sha256:541d7aa19b9a6b4e475c759fd6073ef43d7cdc9a92d95644c260076eb257a063"}, +] [package.dependencies] pytest = ">=3.6.0" @@ -1040,6 +1662,10 @@ description = "pytest xdist plugin for distributed testing and loop-on-failing m category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "pytest-xdist-2.5.0.tar.gz", hash = "sha256:4580deca3ff04ddb2ac53eba39d76cb5dd5edeac050cb6fbc768b0dd712b4edf"}, + {file = "pytest_xdist-2.5.0-py3-none-any.whl", hash = "sha256:6fe5c74fec98906deb8f2d2b616b5c782022744978e7bd4695d39c8f42d0ce65"}, +] [package.dependencies] execnet = ">=1.1" @@ -1058,6 +1684,10 @@ description = "Extensions to the standard Python datetime module" category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, + {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, +] [package.dependencies] six = ">=1.5" @@ -1069,6 +1699,54 @@ description = "Python wrapper around rapidjson" category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "python-rapidjson-1.9.tar.gz", hash = "sha256:be7d351c7112dac608133a23f60e95395668d0981a07f4037f63e0e88afcf01a"}, + {file = "python_rapidjson-1.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a01e42b35987e27d97f1f722de5221cfdf621d0d8aa530cd00ffa8acecdba0b9"}, + {file = "python_rapidjson-1.9-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41388e80cb0300dc33d3f1f06e5c2719aa9ef60b30fbee8a8bb6b35b203eda18"}, + {file = "python_rapidjson-1.9-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:875d468d2a965d92d479ef2d6df7dc5ee289ae1275008580631656c65e612be5"}, + {file = "python_rapidjson-1.9-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c229cd186316ecf5474d25e8bfdc83c97256454403ac5e9656d38bd26f1cf910"}, + {file = "python_rapidjson-1.9-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ff1f2d24689352e24cc753c2f0a4dd06478304b41acb7bfea482b37a285f21de"}, + {file = "python_rapidjson-1.9-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:eec5e7f5667484a0f837c829355b24978c4311b053a699f4e3fef05c3c3410b5"}, + {file = "python_rapidjson-1.9-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4ffb853b2f4e7ffc8e6201e369926200fa36ae10db780d2b7431885ba75e9f58"}, + {file = "python_rapidjson-1.9-cp310-cp310-win32.whl", hash = "sha256:e5cc8dde6ea51e75669330bbb7f2677b12c9f46ce106f52fa0c9b58b8a272a36"}, + {file = "python_rapidjson-1.9-cp310-cp310-win_amd64.whl", hash = "sha256:708de2b1ec6971e018348920ea1cd75b85452bf31dbf0f73743d75f67700c820"}, + {file = "python_rapidjson-1.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5a51b4a4b226bd8ce45710e0af4b55be7371b00d917702599d2583672cbbb78b"}, + {file = "python_rapidjson-1.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:118acc14c7b40c30e69d3e87d9f3ec96b518251ead5e522cd23905b4b1163838"}, + {file = "python_rapidjson-1.9-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8bccf158e78a299d95bcebba17a50640aabd96a737a6c51054dcacfc90fc8af"}, + {file = "python_rapidjson-1.9-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fdf1b88c8372db7d470d56a0ef1c53aac581ef51f4e4bed8651adb991e0bd441"}, + {file = "python_rapidjson-1.9-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a854dddc7e3014ac5e4fea7ae48547f4c06298ec6ca97fe25c209233067dec21"}, + {file = "python_rapidjson-1.9-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:f89af19b413012daa7a2d0361020c0a5d6d14ae2960923c8f1a921677d570e08"}, + {file = "python_rapidjson-1.9-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:11d9851dcb3e4351da3bc497b4e2896db183ffa501482d5241fd472cbf947348"}, + {file = "python_rapidjson-1.9-cp311-cp311-win32.whl", hash = "sha256:10b177a5980a7d9753dc123ae40f149b31b21c834d4e55883d4ad570963483fe"}, + {file = "python_rapidjson-1.9-cp311-cp311-win_amd64.whl", hash = "sha256:2eadfc7df1b747f691b79b3d7523d3934945660faaf3ac367d49fafef834a29e"}, + {file = "python_rapidjson-1.9-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:27a80f84bc7b748b9b87d89d99d05e856eafbc7f4da1376375a24fa07cbcc76b"}, + {file = "python_rapidjson-1.9-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68bdc0d3352dc7dc2aff62c5ea73277a501fbf4873457dfddd5835440df23d1d"}, + {file = "python_rapidjson-1.9-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:83454b2afb89b38104c8ea6a63a758f6cf2109ba3905de98d5fd488eff97a35d"}, + {file = "python_rapidjson-1.9-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fb487d65594f14bf9541415337c9a390695c61b1dc1535380e9955fdacafd858"}, + {file = "python_rapidjson-1.9-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c25dcc70b8d3a6cf615ce47cb18b52d0540363c8efd7c77c60368a779add9983"}, + {file = "python_rapidjson-1.9-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:559e9d67bb719a446f6322fcd7260793370dacb6212682e863a06eeef545a5b1"}, + {file = "python_rapidjson-1.9-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d376e3c2034f8749baf2250ca2f76222217845b3c6d054b24729b8facae29ed7"}, + {file = "python_rapidjson-1.9-cp37-cp37m-win32.whl", hash = "sha256:10da4f444b05b356fbb11622305c09b1f409194d31f15ba8c519682f49a3e646"}, + {file = "python_rapidjson-1.9-cp37-cp37m-win_amd64.whl", hash = "sha256:f48364cad2c1cf1cb4ac5f304c073928cf8344cb60b5be312206f4888786d81e"}, + {file = "python_rapidjson-1.9-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:aa5fe5f8a715170e6329fd67e4b5c79c9c3fa3a6a5d16304709493125d3fac55"}, + {file = "python_rapidjson-1.9-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba786f0a575c75f3fd3eff4d35e0159cea1e8384dba0f3b560da2f9e952affce"}, + {file = "python_rapidjson-1.9-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8552b363238e4762616149238d719d247936767c6c959a36492cf5e049b4d070"}, + {file = "python_rapidjson-1.9-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb9c69eafd04840e369f9a21918fccfe2a59dc2e533af102e1098b3cb7604d8a"}, + {file = "python_rapidjson-1.9-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2e4adc00ffde5f59795fac2eab280805d100fdb334c512399928b5a44689aefb"}, + {file = "python_rapidjson-1.9-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:54bafd1d5d5acec17297d6c5cb5de884e4f6b5d154e1d984cf06fd5e86f1d323"}, + {file = "python_rapidjson-1.9-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4c7a4e54772073f2a18c89a3aeaf168f1feeecbbe26c4d7395814a5eb7297630"}, + {file = "python_rapidjson-1.9-cp38-cp38-win32.whl", hash = "sha256:05c33a6b582026140fc508de1ad6f9f7a90edd97844c348a0b6d01c55c655bbf"}, + {file = "python_rapidjson-1.9-cp38-cp38-win_amd64.whl", hash = "sha256:72706275a1d58eaa59e75ba064ba4048b95e51440fec1b8402076bb042190a41"}, + {file = "python_rapidjson-1.9-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:31d245ca102c6498dad9ad85f9a96bdfac790b174505dc77ee664cab0c92859e"}, + {file = "python_rapidjson-1.9-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd86188afbc0fafcf3e234990a9a535eaac311b5aeb925426cbb4f86f19c6e10"}, + {file = "python_rapidjson-1.9-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c4b941d9548b0af83586a88db2b532574c687feb4fbb84daafd324fa3c822350"}, + {file = "python_rapidjson-1.9-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3cdf9b07197b2bf1c5b0c33d66d872d5b7ec3e1600d897dd1f3f1ce37018103d"}, + {file = "python_rapidjson-1.9-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:661537c1fbee359b048154f4fce794bd8cc6ed4d97c68fed439ab8727f74691e"}, + {file = "python_rapidjson-1.9-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:ec920c316e032f366f244baa6e6354da562deb31bc33167682f77111987e7c77"}, + {file = "python_rapidjson-1.9-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7abbff592461e9899a71e00eeeeea09473ee4dad4cd4ec1565b3a74ee96849af"}, + {file = "python_rapidjson-1.9-cp39-cp39-win32.whl", hash = "sha256:496e33bd1fb8bd37532d603879dfe9797c4a0809d45dfef6b46b34e741d06789"}, + {file = "python_rapidjson-1.9-cp39-cp39-win_amd64.whl", hash = "sha256:22f988f6334ad540fc04b3e9fea347ae62888e7c216b1e8b3205cfa4835aebe6"}, +] [[package]] name = "pytz" @@ -1077,6 +1755,10 @@ description = "World timezone definitions, modern and historical" category = "main" optional = true python-versions = "*" +files = [ + {file = "pytz-2022.6-py2.py3-none-any.whl", hash = "sha256:222439474e9c98fced559f1709d89e6c9cbf8d79c794ff3eb9f8800064291427"}, + {file = "pytz-2022.6.tar.gz", hash = "sha256:e89512406b793ca39f5971bc999cc538ce125c0e51c27941bef4568b460095e2"}, +] [[package]] name = "pywin32" @@ -1085,6 +1767,22 @@ description = "Python for Window Extensions" category = "main" optional = true python-versions = "*" +files = [ + {file = "pywin32-305-cp310-cp310-win32.whl", hash = "sha256:421f6cd86e84bbb696d54563c48014b12a23ef95a14e0bdba526be756d89f116"}, + {file = "pywin32-305-cp310-cp310-win_amd64.whl", hash = "sha256:73e819c6bed89f44ff1d690498c0a811948f73777e5f97c494c152b850fad478"}, + {file = "pywin32-305-cp310-cp310-win_arm64.whl", hash = "sha256:742eb905ce2187133a29365b428e6c3b9001d79accdc30aa8969afba1d8470f4"}, + {file = "pywin32-305-cp311-cp311-win32.whl", hash = "sha256:19ca459cd2e66c0e2cc9a09d589f71d827f26d47fe4a9d09175f6aa0256b51c2"}, + {file = "pywin32-305-cp311-cp311-win_amd64.whl", hash = "sha256:326f42ab4cfff56e77e3e595aeaf6c216712bbdd91e464d167c6434b28d65990"}, + {file = "pywin32-305-cp311-cp311-win_arm64.whl", hash = "sha256:4ecd404b2c6eceaca52f8b2e3e91b2187850a1ad3f8b746d0796a98b4cea04db"}, + {file = "pywin32-305-cp36-cp36m-win32.whl", hash = "sha256:48d8b1659284f3c17b68587af047d110d8c44837736b8932c034091683e05863"}, + {file = "pywin32-305-cp36-cp36m-win_amd64.whl", hash = "sha256:13362cc5aa93c2beaf489c9c9017c793722aeb56d3e5166dadd5ef82da021fe1"}, + {file = "pywin32-305-cp37-cp37m-win32.whl", hash = "sha256:a55db448124d1c1484df22fa8bbcbc45c64da5e6eae74ab095b9ea62e6d00496"}, + {file = "pywin32-305-cp37-cp37m-win_amd64.whl", hash = "sha256:109f98980bfb27e78f4df8a51a8198e10b0f347257d1e265bb1a32993d0c973d"}, + {file = "pywin32-305-cp38-cp38-win32.whl", hash = "sha256:9dd98384da775afa009bc04863426cb30596fd78c6f8e4e2e5bbf4edf8029504"}, + {file = "pywin32-305-cp38-cp38-win_amd64.whl", hash = "sha256:56d7a9c6e1a6835f521788f53b5af7912090674bb84ef5611663ee1595860fc7"}, + {file = "pywin32-305-cp39-cp39-win32.whl", hash = "sha256:9d968c677ac4d5cbdaa62fd3014ab241718e619d8e36ef8e11fb930515a1e918"}, + {file = "pywin32-305-cp39-cp39-win_amd64.whl", hash = "sha256:50768c6b7c3f0b38b7fb14dd4104da93ebced5f1a50dc0e834594bff6fbe1271"}, +] [[package]] name = "pyzmq" @@ -1093,6 +1791,82 @@ description = "Python bindings for 0MQ" category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "pyzmq-24.0.1-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:28b119ba97129d3001673a697b7cce47fe6de1f7255d104c2f01108a5179a066"}, + {file = "pyzmq-24.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bcbebd369493d68162cddb74a9c1fcebd139dfbb7ddb23d8f8e43e6c87bac3a6"}, + {file = "pyzmq-24.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ae61446166983c663cee42c852ed63899e43e484abf080089f771df4b9d272ef"}, + {file = "pyzmq-24.0.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:87f7ac99b15270db8d53f28c3c7b968612993a90a5cf359da354efe96f5372b4"}, + {file = "pyzmq-24.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9dca7c3956b03b7663fac4d150f5e6d4f6f38b2462c1e9afd83bcf7019f17913"}, + {file = "pyzmq-24.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:8c78bfe20d4c890cb5580a3b9290f700c570e167d4cdcc55feec07030297a5e3"}, + {file = "pyzmq-24.0.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:48f721f070726cd2a6e44f3c33f8ee4b24188e4b816e6dd8ba542c8c3bb5b246"}, + {file = "pyzmq-24.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:afe1f3bc486d0ce40abb0a0c9adb39aed3bbac36ebdc596487b0cceba55c21c1"}, + {file = "pyzmq-24.0.1-cp310-cp310-win32.whl", hash = "sha256:3e6192dbcefaaa52ed81be88525a54a445f4b4fe2fffcae7fe40ebb58bd06bfd"}, + {file = "pyzmq-24.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:86de64468cad9c6d269f32a6390e210ca5ada568c7a55de8e681ca3b897bb340"}, + {file = "pyzmq-24.0.1-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:838812c65ed5f7c2bd11f7b098d2e5d01685a3f6d1f82849423b570bae698c00"}, + {file = "pyzmq-24.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:dfb992dbcd88d8254471760879d48fb20836d91baa90f181c957122f9592b3dc"}, + {file = "pyzmq-24.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7abddb2bd5489d30ffeb4b93a428130886c171b4d355ccd226e83254fcb6b9ef"}, + {file = "pyzmq-24.0.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:94010bd61bc168c103a5b3b0f56ed3b616688192db7cd5b1d626e49f28ff51b3"}, + {file = "pyzmq-24.0.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:8242543c522d84d033fe79be04cb559b80d7eb98ad81b137ff7e0a9020f00ace"}, + {file = "pyzmq-24.0.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ccb94342d13e3bf3ffa6e62f95b5e3f0bc6bfa94558cb37f4b3d09d6feb536ff"}, + {file = "pyzmq-24.0.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:6640f83df0ae4ae1104d4c62b77e9ef39be85ebe53f636388707d532bee2b7b8"}, + {file = "pyzmq-24.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a180dbd5ea5d47c2d3b716d5c19cc3fb162d1c8db93b21a1295d69585bfddac1"}, + {file = "pyzmq-24.0.1-cp311-cp311-win32.whl", hash = "sha256:624321120f7e60336be8ec74a172ae7fba5c3ed5bf787cc85f7e9986c9e0ebc2"}, + {file = "pyzmq-24.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:1724117bae69e091309ffb8255412c4651d3f6355560d9af312d547f6c5bc8b8"}, + {file = "pyzmq-24.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:15975747462ec49fdc863af906bab87c43b2491403ab37a6d88410635786b0f4"}, + {file = "pyzmq-24.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b947e264f0e77d30dcbccbb00f49f900b204b922eb0c3a9f0afd61aaa1cedc3d"}, + {file = "pyzmq-24.0.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0ec91f1bad66f3ee8c6deb65fa1fe418e8ad803efedd69c35f3b5502f43bd1dc"}, + {file = "pyzmq-24.0.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:db03704b3506455d86ec72c3358a779e9b1d07b61220dfb43702b7b668edcd0d"}, + {file = "pyzmq-24.0.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:e7e66b4e403c2836ac74f26c4b65d8ac0ca1eef41dfcac2d013b7482befaad83"}, + {file = "pyzmq-24.0.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:7a23ccc1083c260fa9685c93e3b170baba45aeed4b524deb3f426b0c40c11639"}, + {file = "pyzmq-24.0.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:fa0ae3275ef706c0309556061185dd0e4c4cd3b7d6f67ae617e4e677c7a41e2e"}, + {file = "pyzmq-24.0.1-cp36-cp36m-win32.whl", hash = "sha256:f01de4ec083daebf210531e2cca3bdb1608dbbbe00a9723e261d92087a1f6ebc"}, + {file = "pyzmq-24.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:de4217b9eb8b541cf2b7fde4401ce9d9a411cc0af85d410f9d6f4333f43640be"}, + {file = "pyzmq-24.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:78068e8678ca023594e4a0ab558905c1033b2d3e806a0ad9e3094e231e115a33"}, + {file = "pyzmq-24.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77c2713faf25a953c69cf0f723d1b7dd83827b0834e6c41e3fb3bbc6765914a1"}, + {file = "pyzmq-24.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8bb4af15f305056e95ca1bd086239b9ebc6ad55e9f49076d27d80027f72752f6"}, + {file = "pyzmq-24.0.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:0f14cffd32e9c4c73da66db97853a6aeceaac34acdc0fae9e5bbc9370281864c"}, + {file = "pyzmq-24.0.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:0108358dab8c6b27ff6b985c2af4b12665c1bc659648284153ee501000f5c107"}, + {file = "pyzmq-24.0.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:d66689e840e75221b0b290b0befa86f059fb35e1ee6443bce51516d4d61b6b99"}, + {file = "pyzmq-24.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ae08ac90aa8fa14caafc7a6251bd218bf6dac518b7bff09caaa5e781119ba3f2"}, + {file = "pyzmq-24.0.1-cp37-cp37m-win32.whl", hash = "sha256:8421aa8c9b45ea608c205db9e1c0c855c7e54d0e9c2c2f337ce024f6843cab3b"}, + {file = "pyzmq-24.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:54d8b9c5e288362ec8595c1d98666d36f2070fd0c2f76e2b3c60fbad9bd76227"}, + {file = "pyzmq-24.0.1-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:acbd0a6d61cc954b9f535daaa9ec26b0a60a0d4353c5f7c1438ebc88a359a47e"}, + {file = "pyzmq-24.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:47b11a729d61a47df56346283a4a800fa379ae6a85870d5a2e1e4956c828eedc"}, + {file = "pyzmq-24.0.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:abe6eb10122f0d746a0d510c2039ae8edb27bc9af29f6d1b05a66cc2401353ff"}, + {file = "pyzmq-24.0.1-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:07bec1a1b22dacf718f2c0e71b49600bb6a31a88f06527dfd0b5aababe3fa3f7"}, + {file = "pyzmq-24.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f0d945a85b70da97ae86113faf9f1b9294efe66bd4a5d6f82f2676d567338b66"}, + {file = "pyzmq-24.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:1b7928bb7580736ffac5baf814097be342ba08d3cfdfb48e52773ec959572287"}, + {file = "pyzmq-24.0.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b946da90dc2799bcafa682692c1d2139b2a96ec3c24fa9fc6f5b0da782675330"}, + {file = "pyzmq-24.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c8840f064b1fb377cffd3efeaad2b190c14d4c8da02316dae07571252d20b31f"}, + {file = "pyzmq-24.0.1-cp38-cp38-win32.whl", hash = "sha256:4854f9edc5208f63f0841c0c667260ae8d6846cfa233c479e29fdc85d42ebd58"}, + {file = "pyzmq-24.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:42d4f97b9795a7aafa152a36fe2ad44549b83a743fd3e77011136def512e6c2a"}, + {file = "pyzmq-24.0.1-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:52afb0ac962963fff30cf1be775bc51ae083ef4c1e354266ab20e5382057dd62"}, + {file = "pyzmq-24.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8bad8210ad4df68c44ff3685cca3cda448ee46e20d13edcff8909eba6ec01ca4"}, + {file = "pyzmq-24.0.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:dabf1a05318d95b1537fd61d9330ef4313ea1216eea128a17615038859da3b3b"}, + {file = "pyzmq-24.0.1-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5bd3d7dfd9cd058eb68d9a905dec854f86649f64d4ddf21f3ec289341386c44b"}, + {file = "pyzmq-24.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8012bce6836d3f20a6c9599f81dfa945f433dab4dbd0c4917a6fb1f998ab33d"}, + {file = "pyzmq-24.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c31805d2c8ade9b11feca4674eee2b9cce1fec3e8ddb7bbdd961a09dc76a80ea"}, + {file = "pyzmq-24.0.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:3104f4b084ad5d9c0cb87445cc8cfd96bba710bef4a66c2674910127044df209"}, + {file = "pyzmq-24.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:df0841f94928f8af9c7a1f0aaaffba1fb74607af023a152f59379c01c53aee58"}, + {file = "pyzmq-24.0.1-cp39-cp39-win32.whl", hash = "sha256:a435ef8a3bd95c8a2d316d6e0ff70d0db524f6037411652803e118871d703333"}, + {file = "pyzmq-24.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:2032d9cb994ce3b4cba2b8dfae08c7e25bc14ba484c770d4d3be33c27de8c45b"}, + {file = "pyzmq-24.0.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:bb5635c851eef3a7a54becde6da99485eecf7d068bd885ac8e6d173c4ecd68b0"}, + {file = "pyzmq-24.0.1-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:83ea1a398f192957cb986d9206ce229efe0ee75e3c6635baff53ddf39bd718d5"}, + {file = "pyzmq-24.0.1-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:941fab0073f0a54dc33d1a0460cb04e0d85893cb0c5e1476c785000f8b359409"}, + {file = "pyzmq-24.0.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e8f482c44ccb5884bf3f638f29bea0f8dc68c97e38b2061769c4cb697f6140d"}, + {file = "pyzmq-24.0.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:613010b5d17906c4367609e6f52e9a2595e35d5cc27d36ff3f1b6fa6e954d944"}, + {file = "pyzmq-24.0.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:65c94410b5a8355cfcf12fd600a313efee46ce96a09e911ea92cf2acf6708804"}, + {file = "pyzmq-24.0.1-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:20e7eeb1166087db636c06cae04a1ef59298627f56fb17da10528ab52a14c87f"}, + {file = "pyzmq-24.0.1-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a2712aee7b3834ace51738c15d9ee152cc5a98dc7d57dd93300461b792ab7b43"}, + {file = "pyzmq-24.0.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a7c280185c4da99e0cc06c63bdf91f5b0b71deb70d8717f0ab870a43e376db8"}, + {file = "pyzmq-24.0.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:858375573c9225cc8e5b49bfac846a77b696b8d5e815711b8d4ba3141e6e8879"}, + {file = "pyzmq-24.0.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:80093b595921eed1a2cead546a683b9e2ae7f4a4592bb2ab22f70d30174f003a"}, + {file = "pyzmq-24.0.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f3f3154fde2b1ff3aa7b4f9326347ebc89c8ef425ca1db8f665175e6d3bd42f"}, + {file = "pyzmq-24.0.1-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abb756147314430bee5d10919b8493c0ccb109ddb7f5dfd2fcd7441266a25b75"}, + {file = "pyzmq-24.0.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:44e706bac34e9f50779cb8c39f10b53a4d15aebb97235643d3112ac20bd577b4"}, + {file = "pyzmq-24.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:687700f8371643916a1d2c61f3fdaa630407dd205c38afff936545d7b7466066"}, + {file = "pyzmq-24.0.1.tar.gz", hash = "sha256:216f5d7dbb67166759e59b0479bca82b8acf9bed6015b526b8eb10143fb08e77"}, +] [package.dependencies] cffi = {version = "*", markers = "implementation_name == \"pypy\""} @@ -1105,6 +1879,10 @@ description = "A client library for accessing the Rigetti QCS API" category = "main" optional = false python-versions = ">=3.7,<4.0" +files = [ + {file = "qcs-api-client-0.21.2.tar.gz", hash = "sha256:817c331aeaae6be01cb751c0eede84956c6b141ec31dbf6fc9f5b75959da1d4b"}, + {file = "qcs_api_client-0.21.2-py3-none-any.whl", hash = "sha256:3f33ccf92a2ad7ef1f2368f7e98181c06aa267fe9817b81a4a3134535d00728c"}, +] [package.dependencies] attrs = ">=20.1.0,<21.0.0" @@ -1119,12 +1897,20 @@ toml = ">=0.10.2,<0.11.0" [[package]] name = "qcs-sdk-python" -version = "0.4.2" +version = "0.5.0-rc.8" description = "Python interface for the QCS Rust SDK" category = "main" optional = false -python-versions = "^3.7" +python-versions = "^3.8" +files = [] +develop = false +[package.source] +type = "git" +url = "https://github.com/rigetti/qcs-sdk-rust" +reference = "reexport-quil-py" +resolved_reference = "97692714637d3ae121537a6f10d734a526b3943f" +subdirectory = "crates/python" [[package]] name = "recommonmark" version = "0.7.1" @@ -1132,6 +1918,10 @@ description = "A docutils-compatibility bridge to CommonMark, enabling you to wr category = "main" optional = true python-versions = "*" +files = [ + {file = "recommonmark-0.7.1-py2.py3-none-any.whl", hash = "sha256:1b1db69af0231efce3fa21b94ff627ea33dee7079a01dd0a7f8482c3da148b3f"}, + {file = "recommonmark-0.7.1.tar.gz", hash = "sha256:bdb4db649f2222dcd8d2d844f0006b958d627f732415d399791ee436a3686d67"}, +] [package.dependencies] commonmark = ">=0.8.1" @@ -1145,6 +1935,10 @@ description = "Python HTTP for Humans." category = "main" optional = true python-versions = ">=3.7, <4" +files = [ + {file = "requests-2.28.1-py3-none-any.whl", hash = "sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349"}, + {file = "requests-2.28.1.tar.gz", hash = "sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983"}, +] [package.dependencies] certifi = ">=2017.4.17" @@ -1154,7 +1948,7 @@ urllib3 = ">=1.21.1,<1.27" [package.extras] socks = ["PySocks (>=1.5.6,!=1.5.7)"] -use_chardet_on_py3 = ["chardet (>=3.0.2,<6)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] [[package]] name = "respx" @@ -1163,6 +1957,10 @@ description = "A utility for mocking out the Python HTTPX and HTTP Core librarie category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "respx-0.20.1-py2.py3-none-any.whl", hash = "sha256:372f06991c03d1f7f480a420a2199d01f1815b6ed5a802f4e4628043a93bd03e"}, + {file = "respx-0.20.1.tar.gz", hash = "sha256:cc47a86d7010806ab65abdcf3b634c56337a737bb5c4d74c19a0dfca83b3bc73"}, +] [package.dependencies] httpx = ">=0.21.0" @@ -1174,6 +1972,10 @@ description = "Easy to use retry decorator." category = "main" optional = false python-versions = "*" +files = [ + {file = "retry-0.9.2-py2.py3-none-any.whl", hash = "sha256:ccddf89761fa2c726ab29391837d4327f819ea14d244c232a1d24c67a2f98606"}, + {file = "retry-0.9.2.tar.gz", hash = "sha256:f8bfa8b99b69c4506d6f5bd3b0aabf77f98cdb17f3c9fc3f5ca820033336fba4"}, +] [package.dependencies] decorator = ">=3.4.2" @@ -1186,6 +1988,10 @@ description = "Retrying" category = "main" optional = false python-versions = "*" +files = [ + {file = "retrying-1.3.4-py3-none-any.whl", hash = "sha256:8cc4d43cb8e1125e0ff3344e9de678fefd85db3b750b81b2240dc0183af37b35"}, + {file = "retrying-1.3.4.tar.gz", hash = "sha256:345da8c5765bd982b1d1915deb9102fd3d1f7ad16bd84a9700b85f64d24e8f3e"}, +] [package.dependencies] six = ">=1.7.0" @@ -1197,6 +2003,10 @@ description = "Format dates according to the RFC 3339." category = "main" optional = false python-versions = "*" +files = [ + {file = "rfc3339-6.2-py3-none-any.whl", hash = "sha256:f44316b21b21db90a625cde04ebb0d46268f153e6093021fa5893e92a96f58a3"}, + {file = "rfc3339-6.2.tar.gz", hash = "sha256:d53c3b5eefaef892b7240ba2a91fef012e86faa4d0a0ca782359c490e00ad4d0"}, +] [[package]] name = "rfc3986" @@ -1205,6 +2015,10 @@ description = "Validating URI References per RFC 3986" category = "main" optional = false python-versions = "*" +files = [ + {file = "rfc3986-1.5.0-py2.py3-none-any.whl", hash = "sha256:a86d6e1f5b1dc238b218b012df0aa79409667bb209e58da56d0b94704e712a97"}, + {file = "rfc3986-1.5.0.tar.gz", hash = "sha256:270aaf10d87d0d4e095063c65bf3ddbc6ee3d0b226328ce21e036f946e421835"}, +] [package.dependencies] idna = {version = "*", optional = true, markers = "extra == \"idna2008\""} @@ -1219,6 +2033,9 @@ description = "The RPC framework and message specification for Rigetti QCS." category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "rpcq-3.10.0.tar.gz", hash = "sha256:bf21780a1cb1e8676b988c44004d49a168d8937ce2a458c00beb37fa41023684"}, +] [package.dependencies] msgpack = ">=0.6,<1.0" @@ -1233,6 +2050,10 @@ description = "ruamel.yaml is a YAML parser/emitter that supports roundtrip pres category = "main" optional = false python-versions = ">=3" +files = [ + {file = "ruamel.yaml-0.17.21-py3-none-any.whl", hash = "sha256:742b35d3d665023981bd6d16b3d24248ce5df75fdb4e2924e93a05c1f8b61ca7"}, + {file = "ruamel.yaml-0.17.21.tar.gz", hash = "sha256:8b7ce697a2f212752a35c1ac414471dc16c424c9573be4926b56ff3f5d23b7af"}, +] [package.dependencies] "ruamel.yaml.clib" = {version = ">=0.2.6", markers = "platform_python_implementation == \"CPython\" and python_version < \"3.11\""} @@ -1248,6 +2069,42 @@ description = "C version of reader, parser and emitter for ruamel.yaml derived f category = "main" optional = false python-versions = ">=3.5" +files = [ + {file = "ruamel.yaml.clib-0.2.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d5859983f26d8cd7bb5c287ef452e8aacc86501487634573d260968f753e1d71"}, + {file = "ruamel.yaml.clib-0.2.7-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:debc87a9516b237d0466a711b18b6ebeb17ba9f391eb7f91c649c5c4ec5006c7"}, + {file = "ruamel.yaml.clib-0.2.7-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:df5828871e6648db72d1c19b4bd24819b80a755c4541d3409f0f7acd0f335c80"}, + {file = "ruamel.yaml.clib-0.2.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:efa08d63ef03d079dcae1dfe334f6c8847ba8b645d08df286358b1f5293d24ab"}, + {file = "ruamel.yaml.clib-0.2.7-cp310-cp310-win32.whl", hash = "sha256:763d65baa3b952479c4e972669f679fe490eee058d5aa85da483ebae2009d231"}, + {file = "ruamel.yaml.clib-0.2.7-cp310-cp310-win_amd64.whl", hash = "sha256:d000f258cf42fec2b1bbf2863c61d7b8918d31ffee905da62dede869254d3b8a"}, + {file = "ruamel.yaml.clib-0.2.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:045e0626baf1c52e5527bd5db361bc83180faaba2ff586e763d3d5982a876a9e"}, + {file = "ruamel.yaml.clib-0.2.7-cp311-cp311-macosx_12_6_arm64.whl", hash = "sha256:721bc4ba4525f53f6a611ec0967bdcee61b31df5a56801281027a3a6d1c2daf5"}, + {file = "ruamel.yaml.clib-0.2.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:41d0f1fa4c6830176eef5b276af04c89320ea616655d01327d5ce65e50575c94"}, + {file = "ruamel.yaml.clib-0.2.7-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:4b3a93bb9bc662fc1f99c5c3ea8e623d8b23ad22f861eb6fce9377ac07ad6072"}, + {file = "ruamel.yaml.clib-0.2.7-cp36-cp36m-macosx_12_0_arm64.whl", hash = "sha256:a234a20ae07e8469da311e182e70ef6b199d0fbeb6c6cc2901204dd87fb867e8"}, + {file = "ruamel.yaml.clib-0.2.7-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:15910ef4f3e537eea7fe45f8a5d19997479940d9196f357152a09031c5be59f3"}, + {file = "ruamel.yaml.clib-0.2.7-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:370445fd795706fd291ab00c9df38a0caed0f17a6fb46b0f607668ecb16ce763"}, + {file = "ruamel.yaml.clib-0.2.7-cp36-cp36m-win32.whl", hash = "sha256:ecdf1a604009bd35c674b9225a8fa609e0282d9b896c03dd441a91e5f53b534e"}, + {file = "ruamel.yaml.clib-0.2.7-cp36-cp36m-win_amd64.whl", hash = "sha256:f34019dced51047d6f70cb9383b2ae2853b7fc4dce65129a5acd49f4f9256646"}, + {file = "ruamel.yaml.clib-0.2.7-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2aa261c29a5545adfef9296b7e33941f46aa5bbd21164228e833412af4c9c75f"}, + {file = "ruamel.yaml.clib-0.2.7-cp37-cp37m-macosx_12_0_arm64.whl", hash = "sha256:f01da5790e95815eb5a8a138508c01c758e5f5bc0ce4286c4f7028b8dd7ac3d0"}, + {file = "ruamel.yaml.clib-0.2.7-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:40d030e2329ce5286d6b231b8726959ebbe0404c92f0a578c0e2482182e38282"}, + {file = "ruamel.yaml.clib-0.2.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:c3ca1fbba4ae962521e5eb66d72998b51f0f4d0f608d3c0347a48e1af262efa7"}, + {file = "ruamel.yaml.clib-0.2.7-cp37-cp37m-win32.whl", hash = "sha256:7bdb4c06b063f6fd55e472e201317a3bb6cdeeee5d5a38512ea5c01e1acbdd93"}, + {file = "ruamel.yaml.clib-0.2.7-cp37-cp37m-win_amd64.whl", hash = "sha256:be2a7ad8fd8f7442b24323d24ba0b56c51219513cfa45b9ada3b87b76c374d4b"}, + {file = "ruamel.yaml.clib-0.2.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:91a789b4aa0097b78c93e3dc4b40040ba55bef518f84a40d4442f713b4094acb"}, + {file = "ruamel.yaml.clib-0.2.7-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:99e77daab5d13a48a4054803d052ff40780278240a902b880dd37a51ba01a307"}, + {file = "ruamel.yaml.clib-0.2.7-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:3243f48ecd450eddadc2d11b5feb08aca941b5cd98c9b1db14b2fd128be8c697"}, + {file = "ruamel.yaml.clib-0.2.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:8831a2cedcd0f0927f788c5bdf6567d9dc9cc235646a434986a852af1cb54b4b"}, + {file = "ruamel.yaml.clib-0.2.7-cp38-cp38-win32.whl", hash = "sha256:3110a99e0f94a4a3470ff67fc20d3f96c25b13d24c6980ff841e82bafe827cac"}, + {file = "ruamel.yaml.clib-0.2.7-cp38-cp38-win_amd64.whl", hash = "sha256:92460ce908546ab69770b2e576e4f99fbb4ce6ab4b245345a3869a0a0410488f"}, + {file = "ruamel.yaml.clib-0.2.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5bc0667c1eb8f83a3752b71b9c4ba55ef7c7058ae57022dd9b29065186a113d9"}, + {file = "ruamel.yaml.clib-0.2.7-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:4a4d8d417868d68b979076a9be6a38c676eca060785abaa6709c7b31593c35d1"}, + {file = "ruamel.yaml.clib-0.2.7-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:bf9a6bc4a0221538b1a7de3ed7bca4c93c02346853f44e1cd764be0023cd3640"}, + {file = "ruamel.yaml.clib-0.2.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:a7b301ff08055d73223058b5c46c55638917f04d21577c95e00e0c4d79201a6b"}, + {file = "ruamel.yaml.clib-0.2.7-cp39-cp39-win32.whl", hash = "sha256:d5e51e2901ec2366b79f16c2299a03e74ba4531ddcfacc1416639c557aef0ad8"}, + {file = "ruamel.yaml.clib-0.2.7-cp39-cp39-win_amd64.whl", hash = "sha256:184faeaec61dbaa3cace407cffc5819f7b977e75360e8d5ca19461cd851a5fc5"}, + {file = "ruamel.yaml.clib-0.2.7.tar.gz", hash = "sha256:1f08fd5a2bea9c4180db71678e850b995d2a5f4537be0e94557668cf0f5f9497"}, +] [[package]] name = "scipy" @@ -1256,10 +2113,58 @@ description = "SciPy: Scientific Library for Python" category = "main" optional = false python-versions = ">=3.7,<3.11" +files = [ + {file = "scipy-1.7.3-1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:c9e04d7e9b03a8a6ac2045f7c5ef741be86727d8f49c45db45f244bdd2bcff17"}, + {file = "scipy-1.7.3-1-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:b0e0aeb061a1d7dcd2ed59ea57ee56c9b23dd60100825f98238c06ee5cc4467e"}, + {file = "scipy-1.7.3-1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:b78a35c5c74d336f42f44106174b9851c783184a85a3fe3e68857259b37b9ffb"}, + {file = "scipy-1.7.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:173308efba2270dcd61cd45a30dfded6ec0085b4b6eb33b5eb11ab443005e088"}, + {file = "scipy-1.7.3-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:21b66200cf44b1c3e86495e3a436fc7a26608f92b8d43d344457c54f1c024cbc"}, + {file = "scipy-1.7.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ceebc3c4f6a109777c0053dfa0282fddb8893eddfb0d598574acfb734a926168"}, + {file = "scipy-1.7.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f7eaea089345a35130bc9a39b89ec1ff69c208efa97b3f8b25ea5d4c41d88094"}, + {file = "scipy-1.7.3-cp310-cp310-win_amd64.whl", hash = "sha256:304dfaa7146cffdb75fbf6bb7c190fd7688795389ad060b970269c8576d038e9"}, + {file = "scipy-1.7.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:033ce76ed4e9f62923e1f8124f7e2b0800db533828c853b402c7eec6e9465d80"}, + {file = "scipy-1.7.3-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:4d242d13206ca4302d83d8a6388c9dfce49fc48fdd3c20efad89ba12f785bf9e"}, + {file = "scipy-1.7.3-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8499d9dd1459dc0d0fe68db0832c3d5fc1361ae8e13d05e6849b358dc3f2c279"}, + {file = "scipy-1.7.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca36e7d9430f7481fc7d11e015ae16fbd5575615a8e9060538104778be84addf"}, + {file = "scipy-1.7.3-cp37-cp37m-win32.whl", hash = "sha256:e2c036492e673aad1b7b0d0ccdc0cb30a968353d2c4bf92ac8e73509e1bf212c"}, + {file = "scipy-1.7.3-cp37-cp37m-win_amd64.whl", hash = "sha256:866ada14a95b083dd727a845a764cf95dd13ba3dc69a16b99038001b05439709"}, + {file = "scipy-1.7.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:65bd52bf55f9a1071398557394203d881384d27b9c2cad7df9a027170aeaef93"}, + {file = "scipy-1.7.3-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:f99d206db1f1ae735a8192ab93bd6028f3a42f6fa08467d37a14eb96c9dd34a3"}, + {file = "scipy-1.7.3-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5f2cfc359379c56b3a41b17ebd024109b2049f878badc1e454f31418c3a18436"}, + {file = "scipy-1.7.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb7ae2c4dbdb3c9247e07acc532f91077ae6dbc40ad5bd5dca0bb5a176ee9bda"}, + {file = "scipy-1.7.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95c2d250074cfa76715d58830579c64dff7354484b284c2b8b87e5a38321672c"}, + {file = "scipy-1.7.3-cp38-cp38-win32.whl", hash = "sha256:87069cf875f0262a6e3187ab0f419f5b4280d3dcf4811ef9613c605f6e4dca95"}, + {file = "scipy-1.7.3-cp38-cp38-win_amd64.whl", hash = "sha256:7edd9a311299a61e9919ea4192dd477395b50c014cdc1a1ac572d7c27e2207fa"}, + {file = "scipy-1.7.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:eef93a446114ac0193a7b714ce67659db80caf940f3232bad63f4c7a81bc18df"}, + {file = "scipy-1.7.3-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:eb326658f9b73c07081300daba90a8746543b5ea177184daed26528273157294"}, + {file = "scipy-1.7.3-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:93378f3d14fff07572392ce6a6a2ceb3a1f237733bd6dcb9eb6a2b29b0d19085"}, + {file = "scipy-1.7.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edad1cf5b2ce1912c4d8ddad20e11d333165552aba262c882e28c78bbc09dbf6"}, + {file = "scipy-1.7.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d1cc2c19afe3b5a546ede7e6a44ce1ff52e443d12b231823268019f608b9b12"}, + {file = "scipy-1.7.3-cp39-cp39-win32.whl", hash = "sha256:2c56b820d304dffcadbbb6cbfbc2e2c79ee46ea291db17e288e73cd3c64fefa9"}, + {file = "scipy-1.7.3-cp39-cp39-win_amd64.whl", hash = "sha256:3f78181a153fa21c018d346f595edd648344751d7f03ab94b398be2ad083ed3e"}, + {file = "scipy-1.7.3.tar.gz", hash = "sha256:ab5875facfdef77e0a47d5fd39ea178b58e60e454a4c85aa1e52fcb80db7babf"}, +] [package.dependencies] numpy = ">=1.16.5,<1.23.0" +[[package]] +name = "setuptools" +version = "67.0.0" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "setuptools-67.0.0-py3-none-any.whl", hash = "sha256:9d790961ba6219e9ff7d9557622d2fe136816a264dd01d5997cfc057d804853d"}, + {file = "setuptools-67.0.0.tar.gz", hash = "sha256:883131c5b6efa70b9101c7ef30b2b7b780a4283d5fc1616383cdf22c83cbefe6"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8 (<5)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] + [[package]] name = "six" version = "1.16.0" @@ -1267,6 +2172,10 @@ description = "Python 2 and 3 compatibility utilities" category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] [[package]] name = "sniffio" @@ -1275,6 +2184,10 @@ description = "Sniff out which async library your code is running under" category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "sniffio-1.3.0-py3-none-any.whl", hash = "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384"}, + {file = "sniffio-1.3.0.tar.gz", hash = "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101"}, +] [[package]] name = "snowballstemmer" @@ -1283,6 +2196,10 @@ description = "This package provides 29 stemmers for 28 languages generated from category = "main" optional = true python-versions = "*" +files = [ + {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"}, + {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"}, +] [[package]] name = "soupsieve" @@ -1291,6 +2208,10 @@ description = "A modern CSS selector implementation for Beautiful Soup." category = "main" optional = true python-versions = ">=3.6" +files = [ + {file = "soupsieve-2.3.2.post1-py3-none-any.whl", hash = "sha256:3b2503d3c7084a42b1ebd08116e5f81aadfaea95863628c80a3b774a11b7c759"}, + {file = "soupsieve-2.3.2.post1.tar.gz", hash = "sha256:fc53893b3da2c33de295667a0e19f078c14bf86544af307354de5fcf12a3f30d"}, +] [[package]] name = "sphinx" @@ -1299,6 +2220,10 @@ description = "Python documentation generator" category = "main" optional = true python-versions = ">=3.6" +files = [ + {file = "Sphinx-4.5.0-py3-none-any.whl", hash = "sha256:ebf612653238bcc8f4359627a9b7ce44ede6fdd75d9d30f68255c7383d3a6226"}, + {file = "Sphinx-4.5.0.tar.gz", hash = "sha256:7bf8ca9637a4ee15af412d1a1d9689fec70523a68ca9bb9127c2f3eeb344e2e6"}, +] [package.dependencies] alabaster = ">=0.7,<0.8" @@ -1321,8 +2246,8 @@ sphinxcontrib-serializinghtml = ">=1.1.5" [package.extras] docs = ["sphinxcontrib-websupport"] -lint = ["flake8 (>=3.5.0)", "isort", "mypy (>=0.931)", "docutils-stubs", "types-typed-ast", "types-requests"] -test = ["pytest", "pytest-cov", "html5lib", "cython", "typed-ast"] +lint = ["docutils-stubs", "flake8 (>=3.5.0)", "isort", "mypy (>=0.931)", "types-requests", "types-typed-ast"] +test = ["cython", "html5lib", "pytest", "pytest-cov", "typed-ast"] [[package]] name = "sphinx-rtd-theme" @@ -1331,6 +2256,10 @@ description = "Read the Docs theme for Sphinx" category = "main" optional = true python-versions = "*" +files = [ + {file = "sphinx_rtd_theme-0.5.2-py2.py3-none-any.whl", hash = "sha256:4a05bdbe8b1446d77a01e20a23ebc6777c74f43237035e76be89699308987d6f"}, + {file = "sphinx_rtd_theme-0.5.2.tar.gz", hash = "sha256:32bd3b5d13dc8186d7a42fc816a23d32e83a4827d7d9882948e7b837c232da5a"}, +] [package.dependencies] docutils = "<0.17" @@ -1346,10 +2275,14 @@ description = "sphinxcontrib-applehelp is a sphinx extension which outputs Apple category = "main" optional = true python-versions = ">=3.5" +files = [ + {file = "sphinxcontrib-applehelp-1.0.2.tar.gz", hash = "sha256:a072735ec80e7675e3f432fcae8610ecf509c5f1869d17e2eecff44389cdbc58"}, + {file = "sphinxcontrib_applehelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:806111e5e962be97c29ec4c1e7fe277bfd19e9652fb1a4392105b43e01af885a"}, +] [package.extras] +lint = ["docutils-stubs", "flake8", "mypy"] test = ["pytest"] -lint = ["docutils-stubs", "mypy", "flake8"] [[package]] name = "sphinxcontrib-devhelp" @@ -1358,10 +2291,14 @@ description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp category = "main" optional = true python-versions = ">=3.5" +files = [ + {file = "sphinxcontrib-devhelp-1.0.2.tar.gz", hash = "sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4"}, + {file = "sphinxcontrib_devhelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e"}, +] [package.extras] +lint = ["docutils-stubs", "flake8", "mypy"] test = ["pytest"] -lint = ["docutils-stubs", "mypy", "flake8"] [[package]] name = "sphinxcontrib-htmlhelp" @@ -1370,10 +2307,14 @@ description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML h category = "main" optional = true python-versions = ">=3.6" +files = [ + {file = "sphinxcontrib-htmlhelp-2.0.0.tar.gz", hash = "sha256:f5f8bb2d0d629f398bf47d0d69c07bc13b65f75a81ad9e2f71a63d4b7a2f6db2"}, + {file = "sphinxcontrib_htmlhelp-2.0.0-py2.py3-none-any.whl", hash = "sha256:d412243dfb797ae3ec2b59eca0e52dac12e75a241bf0e4eb861e450d06c6ed07"}, +] [package.extras] +lint = ["docutils-stubs", "flake8", "mypy"] test = ["html5lib", "pytest"] -lint = ["docutils-stubs", "mypy", "flake8"] [[package]] name = "sphinxcontrib-jsmath" @@ -1382,9 +2323,13 @@ description = "A sphinx extension which renders display math in HTML via JavaScr category = "main" optional = true python-versions = ">=3.5" +files = [ + {file = "sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"}, + {file = "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178"}, +] [package.extras] -test = ["mypy", "flake8", "pytest"] +test = ["flake8", "mypy", "pytest"] [[package]] name = "sphinxcontrib-qthelp" @@ -1393,10 +2338,14 @@ description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp d category = "main" optional = true python-versions = ">=3.5" +files = [ + {file = "sphinxcontrib-qthelp-1.0.3.tar.gz", hash = "sha256:4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72"}, + {file = "sphinxcontrib_qthelp-1.0.3-py2.py3-none-any.whl", hash = "sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6"}, +] [package.extras] +lint = ["docutils-stubs", "flake8", "mypy"] test = ["pytest"] -lint = ["docutils-stubs", "mypy", "flake8"] [[package]] name = "sphinxcontrib-serializinghtml" @@ -1405,10 +2354,30 @@ description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs category = "main" optional = true python-versions = ">=3.5" +files = [ + {file = "sphinxcontrib-serializinghtml-1.1.5.tar.gz", hash = "sha256:aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952"}, + {file = "sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl", hash = "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd"}, +] [package.extras] +lint = ["docutils-stubs", "flake8", "mypy"] test = ["pytest"] -lint = ["docutils-stubs", "mypy", "flake8"] + +[[package]] +name = "syrupy" +version = "3.0.6" +description = "Pytest Snapshot Test Utility" +category = "dev" +optional = false +python-versions = ">=3.7,<4" +files = [ + {file = "syrupy-3.0.6-py3-none-any.whl", hash = "sha256:9c18e22264026b34239bcc87ab7cc8d893eb17236ea7dae634217ea4f22a848d"}, + {file = "syrupy-3.0.6.tar.gz", hash = "sha256:583aa5ca691305c27902c3e29a1ce9da50ff9ab5f184c54b1dc124a16e4a6cf4"}, +] + +[package.dependencies] +colored = ">=1.3.92,<2.0.0" +pytest = ">=5.1.0,<8.0.0" [[package]] name = "tinycss2" @@ -1417,13 +2386,17 @@ description = "A tiny CSS parser" category = "main" optional = true python-versions = ">=3.7" +files = [ + {file = "tinycss2-1.2.1-py3-none-any.whl", hash = "sha256:2b80a96d41e7c3914b8cda8bc7f705a4d9c49275616e886103dd839dfc847847"}, + {file = "tinycss2-1.2.1.tar.gz", hash = "sha256:8cff3a8f066c2ec677c06dbc7b45619804a6938478d9d73c284b29d14ecb0627"}, +] [package.dependencies] webencodings = ">=0.4" [package.extras] +doc = ["sphinx", "sphinx_rtd_theme"] test = ["flake8", "isort", "pytest"] -doc = ["sphinx-rtd-theme", "sphinx"] [[package]] name = "toml" @@ -1432,6 +2405,10 @@ description = "Python Library for Tom's Obvious, Minimal Language" category = "main" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, + {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, +] [[package]] name = "tomli" @@ -1440,6 +2417,10 @@ description = "A lil' TOML parser" category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] [[package]] name = "tornado" @@ -1448,6 +2429,19 @@ description = "Tornado is a Python web framework and asynchronous networking lib category = "main" optional = true python-versions = ">= 3.7" +files = [ + {file = "tornado-6.2-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:20f638fd8cc85f3cbae3c732326e96addff0a15e22d80f049e00121651e82e72"}, + {file = "tornado-6.2-cp37-abi3-macosx_10_9_x86_64.whl", hash = "sha256:87dcafae3e884462f90c90ecc200defe5e580a7fbbb4365eda7c7c1eb809ebc9"}, + {file = "tornado-6.2-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba09ef14ca9893954244fd872798b4ccb2367c165946ce2dd7376aebdde8e3ac"}, + {file = "tornado-6.2-cp37-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b8150f721c101abdef99073bf66d3903e292d851bee51910839831caba341a75"}, + {file = "tornado-6.2-cp37-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3a2f5999215a3a06a4fc218026cd84c61b8b2b40ac5296a6db1f1451ef04c1e"}, + {file = "tornado-6.2-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:5f8c52d219d4995388119af7ccaa0bcec289535747620116a58d830e7c25d8a8"}, + {file = "tornado-6.2-cp37-abi3-musllinux_1_1_i686.whl", hash = "sha256:6fdfabffd8dfcb6cf887428849d30cf19a3ea34c2c248461e1f7d718ad30b66b"}, + {file = "tornado-6.2-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:1d54d13ab8414ed44de07efecb97d4ef7c39f7438cf5e976ccd356bebb1b5fca"}, + {file = "tornado-6.2-cp37-abi3-win32.whl", hash = "sha256:5c87076709343557ef8032934ce5f637dbb552efa7b21d08e89ae7619ed0eb23"}, + {file = "tornado-6.2-cp37-abi3-win_amd64.whl", hash = "sha256:e5f923aa6a47e133d1cf87d60700889d7eae68988704e20c75fb2d65677a8e4b"}, + {file = "tornado-6.2.tar.gz", hash = "sha256:9b630419bde84ec666bfd7ea0a4cb2a8a651c2d5cccdbdd1972a0c859dfc3c13"}, +] [[package]] name = "traitlets" @@ -1456,19 +2450,15 @@ description = "Traitlets Python configuration system" category = "main" optional = true python-versions = ">=3.7" +files = [ + {file = "traitlets-5.6.0-py3-none-any.whl", hash = "sha256:1410755385d778aed847d68deb99b3ba30fbbf489e17a1e8cbb753060d5cce73"}, + {file = "traitlets-5.6.0.tar.gz", hash = "sha256:10b6ed1c9cedee83e795db70a8b9c2db157bb3778ec4587a349ecb7ef3b1033b"}, +] [package.extras] docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] test = ["pre-commit", "pytest"] -[[package]] -name = "typed-ast" -version = "1.5.4" -description = "a fork of Python 2 and 3 ast modules with type comment support" -category = "dev" -optional = false -python-versions = ">=3.6" - [[package]] name = "types-python-dateutil" version = "2.8.19.4" @@ -1476,6 +2466,10 @@ description = "Typing stubs for python-dateutil" category = "main" optional = false python-versions = "*" +files = [ + {file = "types-python-dateutil-2.8.19.4.tar.gz", hash = "sha256:351a8ca9afd4aea662f87c1724d2e1ae59f9f5f99691be3b3b11d2393cd3aaa1"}, + {file = "types_python_dateutil-2.8.19.4-py3-none-any.whl", hash = "sha256:722a55be8e2eeff749c3e166e7895b0e2f4d29ab4921c0cff27aa6b997d7ee2e"}, +] [[package]] name = "types-retry" @@ -1484,6 +2478,10 @@ description = "Typing stubs for retry" category = "main" optional = false python-versions = "*" +files = [ + {file = "types-retry-0.9.9.tar.gz", hash = "sha256:b1087b274680b542c796549e8488898d0b22cd89988ef1016ef56d4367ff4f41"}, + {file = "types_retry-0.9.9-py3-none-any.whl", hash = "sha256:c5208407527661c37ee826a81abe8e7560e138c8deeccce61bf3f5441f2085f0"}, +] [[package]] name = "typing-extensions" @@ -1492,6 +2490,10 @@ description = "Backported and Experimental Type Hints for Python 3.7+" category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "typing_extensions-4.4.0-py3-none-any.whl", hash = "sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e"}, + {file = "typing_extensions-4.4.0.tar.gz", hash = "sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa"}, +] [[package]] name = "urllib3" @@ -1500,10 +2502,14 @@ description = "HTTP library with thread-safe connection pooling, file post, and category = "main" optional = true python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +files = [ + {file = "urllib3-1.26.13-py2.py3-none-any.whl", hash = "sha256:47cc05d99aaa09c9e72ed5809b60e7ba354e64b59c9c173ac3018642d8bb41fc"}, + {file = "urllib3-1.26.13.tar.gz", hash = "sha256:c083dd0dce68dbfbe1129d5271cb90f9447dea7d52097c6e0126120c521ddea8"}, +] [package.extras] -brotli = ["brotlicffi (>=0.8.0)", "brotli (>=1.0.9)", "brotlipy (>=0.6.0)"] -secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "urllib3-secure-extra", "ipaddress"] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] +secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] [[package]] @@ -1513,6 +2519,10 @@ description = "Measures the displayed width of unicode strings in a terminal" category = "main" optional = true python-versions = "*" +files = [ + {file = "wcwidth-0.2.5-py2.py3-none-any.whl", hash = "sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784"}, + {file = "wcwidth-0.2.5.tar.gz", hash = "sha256:c4d647b99872929fdb7bdcaa4fbe7f01413ed3d98077df798530e5b04f116c83"}, +] [[package]] name = "webencodings" @@ -1521,6 +2531,10 @@ description = "Character encoding aliases for legacy web content" category = "main" optional = true python-versions = "*" +files = [ + {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, + {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, +] [[package]] name = "zipp" @@ -1529,146 +2543,20 @@ description = "Backport of pathlib-compatible object wrapper for zip files" category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "zipp-3.11.0-py3-none-any.whl", hash = "sha256:83a28fcb75844b5c0cdaf5aa4003c2d728c77e05f5aeabe8e95e56727005fbaa"}, + {file = "zipp-3.11.0.tar.gz", hash = "sha256:a7a22e05929290a67401440b39690ae6563279bced5f314609d9d03798f56766"}, +] [package.extras] -docs = ["sphinx (>=3.5)", "jaraco.packaging (>=9)", "rst.linker (>=1.9)", "furo", "jaraco.tidelift (>=1.4)"] -testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "flake8 (<5)", "pytest-cov", "pytest-enabler (>=1.3)", "jaraco.itertools", "func-timeout", "jaraco.functools", "more-itertools", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)", "pytest-flake8"] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)"] +testing = ["flake8 (<5)", "func-timeout", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] [extras] docs = ["Sphinx", "sphinx-rtd-theme", "nbsphinx", "recommonmark"] latex = ["ipython"] [metadata] -lock-version = "1.1" -python-versions = "^3.7,<3.11" -content-hash = "7d43df26822adfb7039c26d9e460d5f6c30fb767c74f0ef0ea3b008c4813f68e" - -[metadata.files] -alabaster = [] -anyio = [] -appnope = [] -atomicwrites = [] -attrs = [] -babel = [] -backcall = [] -beautifulsoup4 = [] -black = [] -bleach = [] -certifi = [] -cffi = [] -charset-normalizer = [] -click = [] -colorama = [] -commonmark = [] -coverage = [] -decorator = [] -defusedxml = [] -docutils = [] -entrypoints = [] -execnet = [] -fastjsonschema = [] -flake8 = [] -freezegun = [] -h11 = [] -httpcore = [] -httpx = [] -idna = [] -imagesize = [] -importlib-metadata = [] -importlib-resources = [] -iniconfig = [] -ipython = [] -iso8601 = [] -jedi = [] -jinja2 = [] -jsonschema = [] -jupyter-client = [] -jupyter-core = [] -jupyterlab-pygments = [] -lark = [] -markupsafe = [] -matplotlib-inline = [] -mccabe = [] -mistune = [] -mock = [] -msgpack = [] -mypy = [] -mypy-extensions = [] -nbclient = [] -nbconvert = [] -nbformat = [] -nbsphinx = [] -nest-asyncio = [] -networkx = [] -numpy = [] -packaging = [] -pandocfilters = [] -parso = [] -pathspec = [] -pexpect = [] -pickleshare = [] -pkgutil-resolve-name = [] -platformdirs = [] -pluggy = [] -prompt-toolkit = [] -ptyprocess = [] -py = [] -pycodestyle = [] -pycparser = [] -pydantic = [] -pyflakes = [] -pygments = [] -pyjwt = [] -pyparsing = [] -pyrsistent = [] -pytest = [] -pytest-cov = [] -pytest-forked = [] -pytest-freezegun = [] -pytest-mock = [] -pytest-rerunfailures = [] -pytest-timeout = [] -pytest-xdist = [] -python-dateutil = [] -python-rapidjson = [] -pytz = [] -pywin32 = [] -pyzmq = [] -qcs-api-client = [] -qcs-sdk-python = [] -recommonmark = [] -requests = [] -respx = [] -retry = [] -retrying = [] -rfc3339 = [] -rfc3986 = [] -rpcq = [] -"ruamel.yaml" = [] -"ruamel.yaml.clib" = [] -scipy = [] -six = [] -sniffio = [] -snowballstemmer = [] -soupsieve = [] -sphinx = [] -sphinx-rtd-theme = [] -sphinxcontrib-applehelp = [] -sphinxcontrib-devhelp = [] -sphinxcontrib-htmlhelp = [] -sphinxcontrib-jsmath = [] -sphinxcontrib-qthelp = [] -sphinxcontrib-serializinghtml = [] -tinycss2 = [] -toml = [] -tomli = [] -tornado = [] -traitlets = [] -typed-ast = [] -types-python-dateutil = [] -types-retry = [] -typing-extensions = [] -urllib3 = [] -wcwidth = [] -webencodings = [] -zipp = [] +lock-version = "2.0" +python-versions = "^3.8,<3.11" +content-hash = "1f2de6d8dccda55ef48bcf43175b557ee3ae00d64370b37e80a0422833b43c03" diff --git a/pyproject.toml b/pyproject.toml index 72ff636f6..7c7113008 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "pyquil" -version = "4.0.0-rc.6" +version = "4.0.0-rc.4" description = "A Python library for creating Quantum Instruction Language (Quil) programs." authors = ["Rigetti Computing "] readme = "README.md" @@ -19,14 +19,14 @@ keywords = ["quantum", "quil", "programming", "hybrid"] packages = [{ include = "pyquil" }] [tool.poetry.dependencies] -python = "^3.7,<3.11" +python = "^3.8,<3.11" numpy = "^1.21" scipy = "^1.7.3" lark = "^0.11.1" rpcq = "^3.10.0" networkx = "^2.5" importlib-metadata = { version = ">=3.7.3,<5", python = "<3.8" } -qcs-sdk-python = "0.4.2" +qcs-sdk-python = { git = "https://github.com/rigetti/qcs-sdk-rust", subdirectory = "crates/python", branch = "reexport-quil-py" } qcs-api-client = ">=0.21.0,<0.22.0" retry = "^0.9.2" types-python-dateutil = "^2.8.19" @@ -40,6 +40,7 @@ Sphinx = { version = "^4.0.2", optional = true } sphinx-rtd-theme = { version = "^0.5.2", optional = true } nbsphinx = { version = "^0.8.6", optional = true } recommonmark = { version = "^0.7.1", optional = true } +deprecation = "^2.1.0" [tool.poetry.dev-dependencies] black = "^22.8.0" @@ -55,6 +56,7 @@ pytest-freezegun = "^0.4.2" respx = "^0.20" nest-asyncio = "^1.5.6" mock = { version = "^4.0", python = "<3.8" } +syrupy = "^3.0.6" [tool.poetry.extras] latex = ["ipython"] diff --git a/pyquil/api/_abstract_compiler.py b/pyquil/api/_abstract_compiler.py index a128d371f..13af63bf4 100644 --- a/pyquil/api/_abstract_compiler.py +++ b/pyquil/api/_abstract_compiler.py @@ -125,30 +125,19 @@ def quil_to_native_quil(self, program: Program, *, protoquil: Optional[bool] = N """ Convert a Quil program into native Quil, which is supported for execution on a QPU. """ - - # This is a work-around needed because calling `qcs_sdk.compile` happens _before_ - # the event loop is available. Wrapping it in a Python async function ensures that - # the event loop is available. This is a limitation of pyo3: - # https://pyo3.rs/v0.17.1/ecosystem/async-await.html#a-note-about-asynciorun - async def _compile(*args, **kwargs) -> str: # type: ignore - return await qcs_sdk.compile(*args, **kwargs) - # TODO This ISA isn't always going to be available. Specifically, if the quantum processor is # a QVM-type processor, then `quantum_processor` will have a CompilerISA, not a QCSISA. # This will have to be addressed as part of this issue: https://github.com/rigetti/pyquil/issues/1496 target_device = compiler_isa_to_target_quantum_processor(self.quantum_processor.to_compiler_isa()) - native_quil = self._event_loop.run_until_complete( - _compile( - program.out(calibrations=False), - json.dumps(target_device.asdict(), indent=2), # type: ignore - timeout=self._compiler_client.timeout, - ) + + native_quil = qcs_sdk.compile( + program.out(calibrations=False), + json.dumps(target_device.asdict(), indent=2), # type: ignore + timeout=self._compiler_client.timeout, ) native_program = Program(native_quil) native_program.num_shots = program.num_shots - native_program._calibrations = program._calibrations - native_program._waveforms = program._waveforms native_program._memory = program._memory.copy() return native_program diff --git a/pyquil/api/_compiler.py b/pyquil/api/_compiler.py index b5f5c77c8..bffed60d9 100644 --- a/pyquil/api/_compiler.py +++ b/pyquil/api/_compiler.py @@ -103,19 +103,10 @@ def native_quil_to_executable(self, nq_program: Program) -> QuantumExecutable: """ rewrite_response = qcs_sdk.rewrite_arithmetic(nq_program.out()) - # This is a work-around needed because calling `qcs_sdk.translate` happens _before_ - # the event loop is available. Wrapping it in a Python async function ensures that - # the event loop is available. This is a limitation of pyo3: - # https://pyo3.rs/v0.17.1/ecosystem/async-await.html#a-note-about-asynciorun - async def _translate(*args): - return await qcs_sdk.translate(*args) - - translated_program = self._event_loop.run_until_complete( - _translate( - rewrite_response["program"], - nq_program.num_shots, - self.quantum_processor_id, - ) + translated_program = qcs_sdk.translate( + rewrite_response["program"], + nq_program.num_shots, + self.quantum_processor_id, ) return EncryptedProgram( diff --git a/pyquil/api/_compiler_client.py b/pyquil/api/_compiler_client.py index 65a7a4733..055ab81c0 100644 --- a/pyquil/api/_compiler_client.py +++ b/pyquil/api/_compiler_client.py @@ -181,10 +181,7 @@ def get_version(self) -> str: Get version info for compiler server. """ - async def _get_quilc_version() -> str: - return await qcs_sdk.get_quilc_version() - - return self._event_loop.run_until_complete(_get_quilc_version()) + return qcs_sdk.get_quilc_version() def compile_to_native_quil(self, request: CompileToNativeQuilRequest) -> CompileToNativeQuilResponse: """ diff --git a/pyquil/quil.py b/pyquil/quil.py index 54efbe86b..ad326b07d 100644 --- a/pyquil/quil.py +++ b/pyquil/quil.py @@ -16,10 +16,9 @@ """ Module for creating and defining Quil programs. """ -import itertools import types -import warnings from collections import defaultdict +from copy import deepcopy from typing import ( Any, Dict, @@ -36,10 +35,11 @@ no_type_check, ) +from deprecation import deprecated import numpy as np -from rpcq.messages import NativeQuilMetadata, ParameterAref +from rpcq.messages import ParameterAref -from pyquil._parser.parser import run_parser +from pyquil._version import pyquil_version from pyquil._memory import Memory from pyquil.gates import MEASURE, RESET, MOVE from pyquil.noise import _check_kraus_ops, _create_kraus_pragmas, pauli_kraus_map @@ -64,7 +64,6 @@ Gate, Measurement, Pragma, - Halt, AbstractInstruction, Jump, JumpConditional, @@ -72,22 +71,7 @@ JumpUnless, JumpWhen, Declare, - Reset, ResetQubit, - DelayFrames, - DelayQubits, - Fence, - FenceAll, - Pulse, - Capture, - RawCapture, - SetFrequency, - ShiftFrequency, - SetPhase, - ShiftPhase, - SwapPhase, - SetScale, - DefPermutationGate, DefCalibration, DefFrame, DefMeasureCalibration, @@ -100,9 +84,12 @@ match_calibration, ) +from qcs_sdk.quil.program import Program as RSProgram +from qcs_sdk.quil.instructions import Instruction as RSInstruction, Gate as RSGate + InstructionDesignator = Union[ AbstractInstruction, - DefGate, + RSInstruction, "Program", List[Any], Tuple[Any, ...], @@ -126,57 +113,39 @@ class Program: """Contents of memory to be used as program parameters during execution""" def __init__(self, *instructions: InstructionDesignator): - self._defined_gates: List[DefGate] = [] - - self._calibrations: List[Union[DefCalibration, DefMeasureCalibration]] = [] - self._waveforms: Dict[str, DefWaveform] = {} - self._frames: Dict[Frame, DefFrame] = {} - - # Implementation note: the key difference between the private _instructions and - # the public instructions property below is that the private _instructions list - # may contain placeholder labels. - self._instructions: List[AbstractInstruction] = [] - - # Performance optimization: as stated above _instructions may contain placeholder - # labels so the program must first be have its labels instantiated. - # _synthesized_instructions is simply a cache on the result of the _synthesize() - # method. It is marked as None whenever new instructions are added. - self._synthesized_instructions: Optional[List[AbstractInstruction]] = None - - self._declarations: Dict[str, Declare] = {} - + self._program = RSProgram() self.inst(*instructions) - # Filled in with quil_to_native_quil - self.native_quil_metadata: Optional[NativeQuilMetadata] = None - # default number of shots to loop through self.num_shots = 1 + # Will be moved to rust... later self._memory = Memory() - # Note to developers: Have you changed this method? Have you changed the fields which - # live on `Program`? Please update `Program.copy()`! - @property - def calibrations(self) -> List[Union[DefCalibration, DefMeasureCalibration]]: + def calibrations(self) -> List[DefCalibration]: """A list of Quil-T calibration definitions.""" - return self._calibrations + return self._program.calibrations.calibrations + + @property + def measure_calibrations(self) -> List[DefMeasureCalibration]: + """A list of measure calibrations""" + return self._program.measure_calibrations @property def waveforms(self) -> Dict[str, DefWaveform]: """A mapping from waveform names to their corresponding definitions.""" - return self._waveforms + return self._program.waveforms @property def frames(self) -> Dict[Frame, DefFrame]: """A mapping from Quil-T frames to their definitions.""" - return self._frames + return self._program.frames.get_all_frames() @property def declarations(self) -> Dict[str, Declare]: """A mapping from declared region names to their declarations.""" - return self._declarations + return self._program.declarations def copy_everything_except_instructions(self) -> "Program": """ @@ -184,48 +153,32 @@ def copy_everything_except_instructions(self) -> "Program": :return: a new Program """ - new_prog = Program() - new_prog._calibrations = self.calibrations.copy() - new_prog._declarations = self._declarations.copy() - new_prog._waveforms = self.waveforms.copy() - new_prog._defined_gates = self._defined_gates.copy() - new_prog._frames = self.frames.copy() - if self.native_quil_metadata is not None: - # TODO: remove this type: ignore once rpcq._base.Message gets type hints. - new_prog.native_quil_metadata = self.native_quil_metadata.copy() # type: ignore + new_prog = Program(self._program.to_headers()) new_prog.num_shots = self.num_shots new_prog._memory = self._memory.copy() return new_prog def copy(self) -> "Program": """ - Perform a shallow copy of this program. - - QuilAtom and AbstractInstruction objects should be treated as immutable to avoid - strange behavior when performing a copy. + Perform a deep copy of this program. :return: a new Program """ - new_prog = self.copy_everything_except_instructions() - new_prog._instructions = self._instructions.copy() - return new_prog + return deepcopy(self) @property def defined_gates(self) -> List[DefGate]: """ A list of defined gates on the program. """ - return self._defined_gates + return self._program.defined_gates @property def instructions(self) -> List[AbstractInstruction]: """ Fill in any placeholders and return a list of quil AbstractInstructions. """ - if self._synthesized_instructions is None: - self._synthesize() - assert self._synthesized_instructions is not None - return self._synthesized_instructions + return self._program.to_instructions(False) def inst(self, *instructions: InstructionDesignator) -> "Program": """ @@ -258,56 +211,20 @@ def inst(self, *instructions: InstructionDesignator) -> "Program": elif isinstance(instruction, tuple): if len(instruction) == 0: raise ValueError("tuple should have at least one element") - elif len(instruction) == 1: - self.inst(instruction[0]) else: - op = instruction[0] - if op == "MEASURE": - if len(instruction) == 2: - self.measure(instruction[1], None) - else: - self.measure(instruction[1], instruction[2]) - else: - params: List[ParameterDesignator] = [] - possible_params = instruction[1] - rest: Sequence[Any] = instruction[2:] - if isinstance(possible_params, list): - params = possible_params - else: - rest = [possible_params] + list(rest) - self.gate(op, params, rest) + self.inst(" ".join(map(str, instruction))) elif isinstance(instruction, str): - self.inst(run_parser(instruction.strip())) + self.inst(RSProgram.from_string(instruction.strip())) elif isinstance(instruction, Program): - if id(self) == id(instruction): - raise ValueError("Nesting a program inside itself is not supported") - - for defgate in instruction._defined_gates: - self.inst(defgate) - for instr in instruction._instructions: - self.inst(instr) - - # Implementation note: these two base cases are the only ones which modify the program - elif isinstance(instruction, DefGate): - defined_gate_names = [gate.name for gate in self._defined_gates] - if instruction.name in defined_gate_names: - warnings.warn("Gate {} has already been defined in this program".format(instruction.name)) - - self._defined_gates.append(instruction) - elif isinstance(instruction, DefCalibration) or isinstance(instruction, DefMeasureCalibration): - self.calibrations.append(instruction) - elif isinstance(instruction, DefWaveform): - self.waveforms[instruction.name] = instruction - elif isinstance(instruction, DefFrame): - self.frames[instruction.frame] = instruction + self.inst(instruction._program) + elif isinstance(instruction, RSInstruction): + self._program.add_instruction(instruction) + elif isinstance(instruction, RSProgram): + self._program += instruction elif isinstance(instruction, AbstractInstruction): - self._instructions.append(instruction) - self._synthesized_instructions = None - - if isinstance(instruction, Declare): - self._declarations[instruction.name] = instruction + self.inst(RSProgram.from_string(str(instruction))) else: - raise TypeError("Invalid instruction: {}".format(instruction)) + raise ValueError("Invalid instruction: {}".format(instruction)) return self @@ -485,7 +402,6 @@ def _set_parameter_values_at_runtime(self) -> "Program": ] self.prepend_instructions(move_instructions) - self._sort_declares_to_program_start() return self @@ -503,9 +419,8 @@ def prepend_instructions(self, instructions: Iterable[AbstractInstruction]) -> " """ Prepend instructions to the beginning of the program. """ - self._instructions = [*instructions, *self._instructions] - self._synthesized_instructions = None - return self + new_prog = Program(*instructions) + return new_prog + self def while_do(self, classical_reg: MemoryReferenceDesignator, q_program: "Program") -> "Program": """ @@ -537,6 +452,7 @@ def while_do(self, classical_reg: MemoryReferenceDesignator, q_program: "Program self.inst(JumpTarget(label_end)) return self + # TODO: Implement control flow methods in quil-rs def if_then( self, classical_reg: MemoryReferenceDesignator, @@ -573,7 +489,8 @@ def if_then( label_then = LabelPlaceholder("THEN") label_end = LabelPlaceholder("END") - self.inst(JumpWhen(target=label_then, condition=unpack_classical_reg(classical_reg))) + jump_when = JumpWhen(target=label_then, condition=unpack_classical_reg(classical_reg)) + self.inst(jump_when) self.inst(else_program) self.inst(Jump(label_end)) self.inst(JumpTarget(label_then)) @@ -642,18 +559,17 @@ def out(self, *, calibrations: Optional[bool] = True) -> str: """ Serializes the Quil program to a string suitable for submitting to the QVM or QPU. """ + if calibrations: + return str(self._program) + else: + return str(self._program.into_simplified()) - return "\n".join( - itertools.chain( - (dg.out() for dg in self._defined_gates), - (wf.out() for wf in self.waveforms.values()), - (fdef.out() for fdef in self.frames.values()), - (cal.out() for cal in self.calibrations) if calibrations else list(), - (instr.out() for instr in self.instructions), - [""], - ) - ) - + @deprecated( + deprecated_in="4.0", + removed_in="5.0", + current_version=pyquil_version, + details="The indices flag will be removed. Use get_qubit_indices() instead.", + ) def get_qubits(self, indices: bool = True) -> Set[QubitDesignator]: """ Returns all of the qubit indices used in this program, including gate applications and @@ -672,28 +588,18 @@ def get_qubits(self, indices: bool = True) -> Set[QubitDesignator]: wrapping :py:class:`Qubit` object :return: A set of all the qubit indices used in this program """ - qubits: Set[QubitDesignator] = set() - for instr in self.instructions: - if isinstance( - instr, - ( - Gate, - Measurement, - ResetQubit, - Pulse, - Capture, - RawCapture, - ShiftFrequency, - SetFrequency, - SetPhase, - ShiftPhase, - SwapPhase, - SetScale, - ), - ): - qubits |= instr.get_qubits(indices=indices) - return qubits + if indices: + return self.get_qubit_indices() + return self._program.get_used_qubits() + + def get_qubit_indices(self) -> Set[int]: + """ + Returns the index of each qubit used in the program. Will raise an exception if any of the + qubits are placeholders. + """ + return {q.as_fixed() for q in self._program.get_used_qubits()} + # TODO: Port calibrations logic from quil-rs def match_calibrations(self, instr: AbstractInstruction) -> Optional[CalibrationMatch]: """ Attempt to match a calibration to the provided instruction. @@ -719,6 +625,7 @@ def match_calibrations(self, instr: AbstractInstruction) -> Optional[Calibration return None + # TODO: Port calibrations logic from quil-rs def get_calibration(self, instr: AbstractInstruction) -> Optional[Union[DefCalibration, DefMeasureCalibration]]: """ Get the calibration corresponding to the provided instruction. @@ -732,6 +639,7 @@ def get_calibration(self, instr: AbstractInstruction) -> Optional[Union[DefCalib return None + # TODO: Port calibrations logic from quil-rs def calibrate( self, instruction: AbstractInstruction, @@ -776,93 +684,52 @@ def calibrate( else: return [instruction] + @deprecated( + deprecated_in="4.0", + removed_in="5.0", + current_version=pyquil_version, + details="This function always returns True and will be removed.", + ) def is_protoquil(self, quilt: bool = False) -> bool: """ - Protoquil programs may only contain gates, Pragmas, and RESET. It may not contain - classical instructions or jumps. - - :return: True if the Program is Protoquil, False otherwise + This function has been deprecated and will always return True. """ - try: - if quilt: - validate_protoquil(self, quilt=quilt) - else: - validate_protoquil(self) - return True - except ValueError: - return False + return True + @deprecated( + deprecated_in="4.0", + removed_in="5.0", + current_version=pyquil_version, + details="This function always returns True and will be removed.", + ) def is_supported_on_qpu(self) -> bool: """ - Whether the program can be compiled to the hardware to execute on a QPU. These Quil - programs are more restricted than Protoquil: for instance, RESET must be before any - gates or MEASUREs, and MEASURE on a qubit must be after any gates on that qubit. - - :return: True if the Program is supported Quil, False otherwise + This function has been deprecated and will always return True. """ - try: - validate_supported_quil(self) - return True - except ValueError: - return False + return True - def _sort_declares_to_program_start(self) -> None: - """ - Re-order DECLARE instructions within this program to the beginning, followed by - all other instructions. Reordering is stable among DECLARE and non-DECLARE instructions. - """ - self._instructions = sorted(self._instructions, key=lambda instruction: not isinstance(instruction, Declare)) - - def pop(self) -> AbstractInstruction: - """ - Pops off the last instruction. - - :return: The instruction that was popped. - """ - res = self._instructions.pop() - self._synthesized_instructions = None - return res - - def dagger(self, inv_dict: Optional[Any] = None, suffix: str = "-INV") -> "Program": + def dagger(self) -> "Program": """ Creates the conjugate transpose of the Quil program. The program must contain only gate applications. - Note: the keyword arguments inv_dict and suffix are kept only - for backwards compatibility and have no effect. - :return: The Quil program's inverse """ - if any(not isinstance(instr, Gate) for instr in self._instructions): - raise ValueError("Program to be daggered must contain only gate applications") - - # This is a bit hacky. Gate.dagger() mutates the gate object, rather than returning a fresh - # (and daggered) copy. Also, mypy doesn't understand that we already asserted that every - # instr in _instructions is a Gate, above, so help mypy out with a cast. - surely_gate_instructions = cast(List[Gate], Program(self.out())._instructions) - return Program([instr.dagger() for instr in reversed(surely_gate_instructions)]) + return Program(self._program.dagger()) - def _synthesize(self) -> "Program": + @deprecated( + deprecated_in="4.0", removed_in="5.0", current_version=pyquil_version, details="This function will be removed." + ) + def pop(self) -> AbstractInstruction: """ - Assigns all placeholder labels to actual values. - - Changed in 1.9: Either all qubits must be defined or all undefined. If qubits are - undefined, this method will not help you. You must explicitly call `address_qubits` - which will return a new Program. - - Changed in 1.9: This function now returns ``self`` and updates - ``self._synthesized_instructions``. - - Changed in 2.0: This function will add an instruction to the top of the program - to declare a register of bits called ``ro`` if and only if there are no other - declarations in the program. - - Changed in 3.0: Removed above change regarding implicit ``ro`` declaration. - - :return: This object with the ``_synthesized_instructions`` member set. + Removes the last instruction from the program and returns it """ - self._synthesized_instructions = instantiate_labels(self._instructions) - return self + last = self.instructions[-1] + instructions = self._program.to_headers() + self.instructions + new_program = Program(instructions[:-1]) + self._program = new_program._program + self._memory = new_program._memory + return last def __add__(self, other: InstructionDesignator) -> "Program": """ @@ -874,31 +741,17 @@ def __add__(self, other: InstructionDesignator) -> "Program": p = Program() p.inst(self) p.inst(other) - p._calibrations = self.calibrations.copy() - p._waveforms = self.waveforms.copy() - p._frames = self.frames.copy() - p._memory = self._memory.copy() - if isinstance(other, Program): - p.calibrations.extend(other.calibrations) - p.waveforms.update(other.waveforms) - p.frames.update(other.frames) - p._memory.values.update(other._memory.values) return p - def __iadd__(self, other: InstructionDesignator) -> "Program": + def __iadd__(self, other) -> "Program": """ - Concatenate two programs together using +=, returning a new one. + Concatenate two programs together by appending the right-hand side to the left. :param other: Another program or instruction to concatenate to this one. :return: A newly concatenated program. """ - self.inst(other) - if isinstance(other, Program): - self.calibrations.extend(other.calibrations) - self.waveforms.update(other.waveforms) - self.frames.update(other.frames) - self._memory.values.update(other._memory.copy().values) - return self + p = Program(other) + return self._program.add_instructions(p._program.instructions) def __getitem__(self, index: Union[slice, int]) -> Union[AbstractInstruction, "Program"]: """ @@ -917,10 +770,10 @@ def __iter__(self) -> Iterator[AbstractInstruction]: """ return self.instructions.__iter__() - def __eq__(self, other: object) -> bool: - return isinstance(other, self.__class__) and self.out() == other.out() + def __eq__(self, other: "Program") -> bool: + return self._program == other._program - def __ne__(self, other: object) -> bool: + def __ne__(self, other: "Program") -> bool: return not self.__eq__(other) def __len__(self) -> int: @@ -933,164 +786,81 @@ def __str__(self) -> str: This may not be suitable for submission to a QPU or QVM for example if your program contains unaddressed QubitPlaceholders """ - return "\n".join( - itertools.chain( - (str(dg) for dg in self._defined_gates), - (str(wf) for wf in self.waveforms.values()), - (str(fdef) for fdef in self.frames.values()), - (str(cal) for cal in self.calibrations), - (str(instr) for instr in self.instructions), - [""], - ) - ) - + return str(self._program) -def _what_type_of_qubit_does_it_use( - program: Program, -) -> Tuple[bool, bool, List[Union[Qubit, QubitPlaceholder]]]: - """Helper function to peruse through a program's qubits. - This function will also enforce the condition that a Program uses either all placeholders - or all instantiated qubits to avoid accidentally mixing the two. This function will warn - if your program doesn't use any qubits. - - :return: tuple of (whether the program uses placeholder qubits, whether the program uses - real qubits, a list of qubits ordered by their first appearance in the program) +def merge_with_pauli_noise( + prog_list: Iterable[Program], probabilities: Sequence[float], qubits: Sequence[int] +) -> Program: """ - has_placeholders = False - has_real_qubits = False + Insert pauli noise channels between each item in the list of programs. + This noise channel is implemented as a single noisy identity gate acting on the provided qubits. + This method does not rely on merge_programs and so avoids the inclusion of redundant Kraus + Pragmas that would occur if merge_programs was called directly on programs with distinct noisy + gate definitions. - # We probably want to index qubits in the order they are encountered in the program - # so an ordered set would be nice. Python doesn't *have* an ordered set. Use the keys - # of an ordered dictionary instead - qubits = {} + :param prog_list: an iterable such as a program or a list of programs. + If a program is provided, a single noise gate will be applied after each gate in the + program. If a list of programs is provided, the noise gate will be applied after each + program. + :param probabilities: The 4^num_qubits list of probabilities specifying the desired pauli + channel. There should be either 4 or 16 probabilities specified in the order + I, X, Y, Z or II, IX, IY, IZ, XI, XX, XY, etc respectively. + :param qubits: a list of the qubits that the noisy gate should act on. + :return: A single program with noisy gates inserted between each element of the program list. + """ + p = Program() + p.defgate("pauli_noise", np.eye(2 ** len(qubits))) + p.define_noisy_gate("pauli_noise", qubits, pauli_kraus_map(probabilities)) + for elem in prog_list: + p.inst(Program(elem)) + if isinstance(elem, Measurement): + continue # do not apply noise after measurement + p.inst(("pauli_noise", *qubits)) + return p - for instr in program: - if isinstance(instr, Gate): - for q in instr.qubits: - qubits[q] = 1 - if isinstance(q, QubitPlaceholder): - has_placeholders = True - elif isinstance(q, Qubit): - has_real_qubits = True - else: - raise ValueError("Unknown qubit type {}".format(q)) - elif isinstance(instr, Measurement): - qubits[instr.qubit] = 1 - if isinstance(instr.qubit, QubitPlaceholder): - has_placeholders = True - elif isinstance(instr.qubit, Qubit): - has_real_qubits = True - else: - raise ValueError("Unknown qubit type {}".format(instr.qubit)) - elif isinstance(instr, Pragma): - for arg in instr.args: - if isinstance(arg, QubitPlaceholder): - qubits[arg] = 1 - has_placeholders = True - elif isinstance(arg, Qubit): - qubits[arg] = 1 - has_real_qubits = True - if not (has_placeholders or has_real_qubits): - warnings.warn("Your program doesn't use any qubits") - - if has_placeholders and has_real_qubits: - raise ValueError("Your program mixes instantiated qubits with placeholders") - - # The isinstance checks above make sure that if any qubit is a - # FormalArgument (which is permitted by Gate.qubits), then an - # error should be raised. Unfortunately this doesn't help mypy - # narrow down the return type, so gotta cast. - return ( - has_placeholders, - has_real_qubits, - cast(List[Union[Qubit, QubitPlaceholder]], list(qubits.keys())), - ) +# TODO: These should come from quil-rs. Requires Instruction::Measurement be ported +def get_classical_addresses_from_program(program: Program) -> Dict[str, List[int]]: + """ + Returns a sorted list of classical addresses found in the MEASURE instructions in the program. -def get_default_qubit_mapping(program: Program) -> Dict[Union[Qubit, QubitPlaceholder], Qubit]: + :param program: The program from which to get the classical addresses. + :return: A mapping from memory region names to lists of offsets appearing in the program. """ - Takes a program which contains qubit placeholders and provides a mapping to the integers - 0 through N-1. + addresses: Dict[str, List[int]] = defaultdict(list) + flattened_addresses = {} - The output of this function is suitable for input to :py:func:`address_qubits`. + # Required to use the `classical_reg.address` int attribute. + # See https://github.com/rigetti/pyquil/issues/388. + for instr in program: + if isinstance(instr, Measurement) and instr.classical_reg: + addresses[instr.classical_reg.name].append(instr.classical_reg.offset) - :param program: A program containing qubit placeholders - :return: A dictionary mapping qubit placeholder to an addressed qubit from 0 through N-1. - """ - fake_qubits, real_qubits, qubits = _what_type_of_qubit_does_it_use(program) - if real_qubits: - warnings.warn("This program contains integer qubits, so getting a mapping doesn't make sense.") - # _what_type_of_qubit_does_it_use ensures that if real_qubits is True, then qubits contains - # only real Qubits, not QubitPlaceholders. Help mypy figure this out with cast. - return {q: cast(Qubit, q) for q in qubits} - return {qp: Qubit(i) for i, qp in enumerate(qubits)} + # flatten duplicates + for k, v in addresses.items(): + reduced_list = list(set(v)) + reduced_list.sort() + flattened_addresses[k] = reduced_list + + return flattened_addresses -@no_type_check def address_qubits( program: Program, qubit_mapping: Optional[Dict[QubitPlaceholder, Union[Qubit, int]]] = None ) -> Program: """ Takes a program which contains placeholders and assigns them all defined values. - Either all qubits must be defined or all undefined. If qubits are undefined, you may provide a qubit mapping to specify how placeholders get mapped to actual qubits. If a mapping is not provided, integers 0 through N are used. - This function will also instantiate any label placeholders. - :param program: The program. :param qubit_mapping: A dictionary-like object that maps from :py:class:`QubitPlaceholder` to :py:class:`Qubit` or ``int`` (but not both). :return: A new Program with all qubit and label placeholders assigned to real qubits and labels. """ - fake_qubits, real_qubits, qubits = _what_type_of_qubit_does_it_use(program) - if real_qubits: - if qubit_mapping is not None: - warnings.warn("A qubit mapping was provided but the program does not " "contain any placeholders to map!") - return program - - if qubit_mapping is None: - qubit_mapping = {qp: Qubit(i) for i, qp in enumerate(qubits)} - else: - if all(isinstance(v, Qubit) for v in qubit_mapping.values()): - pass # we good - elif all(isinstance(v, int) for v in qubit_mapping.values()): - qubit_mapping = {k: Qubit(v) for k, v in qubit_mapping.items()} - else: - raise ValueError("Qubit mapping must map to type Qubit or int (but not both)") - - result: List[AbstractInstruction] = [] - for instr in program: - # Remap qubits on Gate, Measurement, and ResetQubit instructions - if isinstance(instr, Gate): - remapped_qubits = [qubit_mapping[q] for q in instr.qubits] - gate = Gate(instr.name, instr.params, remapped_qubits) - gate.modifiers = instr.modifiers - result.append(gate) - elif isinstance(instr, Measurement): - result.append(Measurement(qubit_mapping[instr.qubit], instr.classical_reg)) - elif isinstance(instr, ResetQubit): - result.append(ResetQubit(qubit_mapping[instr.qubit])) - elif isinstance(instr, Pragma): - new_args: List[Union[Qubit, int, str]] = [] - for arg in instr.args: - # Pragmas can have arguments that represent things besides qubits, so here we - # make sure to just look up the QubitPlaceholders. - if isinstance(arg, QubitPlaceholder): - new_args.append(qubit_mapping[arg]) - else: - new_args.append(arg) - result.append(Pragma(instr.command, new_args, instr.freeform_string)) - # Otherwise simply add it to the result - else: - result.append(instr) - - new_program = program.copy() - new_program._instructions = result - - return new_program + return program def _get_label( @@ -1100,7 +870,6 @@ def _get_label( ) -> Tuple[Label, Dict[LabelPlaceholder, Label], int]: """Helper function to either get the appropriate label for a given placeholder or generate a new label and update the mapping. - See :py:func:`instantiate_labels` for usage. """ if placeholder in label_mapping: @@ -1116,7 +885,6 @@ def instantiate_labels(instructions: Iterable[AbstractInstruction]) -> List[Abst """ Takes an iterable of instructions which may contain label placeholders and assigns them all defined values. - :return: list of instructions with all label placeholders assigned to real labels. """ label_i = 1 @@ -1139,207 +907,59 @@ def instantiate_labels(instructions: Iterable[AbstractInstruction]) -> List[Abst return result -def merge_with_pauli_noise( - prog_list: Iterable[Program], probabilities: Sequence[float], qubits: Sequence[int] -) -> Program: +@deprecated( + deprecated_in="4.0", + removed_in="5.0", + current_version=pyquil_version, + details="The Program class sorts instructions automatically. This function will be removed.", +) +def percolate_declares(program: Program) -> Program: """ - Insert pauli noise channels between each item in the list of programs. - This noise channel is implemented as a single noisy identity gate acting on the provided qubits. - This method does not rely on merge_programs and so avoids the inclusion of redundant Kraus - Pragmas that would occur if merge_programs was called directly on programs with distinct noisy - gate definitions. + As of pyQuil v4.0, the Program class does this automatically. This function is deprecated + and just immediately returns the passed in program. - :param prog_list: an iterable such as a program or a list of programs. - If a program is provided, a single noise gate will be applied after each gate in the - program. If a list of programs is provided, the noise gate will be applied after each - program. - :param probabilities: The 4^num_qubits list of probabilities specifying the desired pauli - channel. There should be either 4 or 16 probabilities specified in the order - I, X, Y, Z or II, IX, IY, IZ, XI, XX, XY, etc respectively. - :param qubits: a list of the qubits that the noisy gate should act on. - :return: A single program with noisy gates inserted between each element of the program list. + :param program: A program. """ - p = Program() - p.defgate("pauli_noise", np.eye(2 ** len(qubits))) - p.define_noisy_gate("pauli_noise", qubits, pauli_kraus_map(probabilities)) - for elem in prog_list: - p.inst(Program(elem)) - if isinstance(elem, Measurement): - continue # do not apply noise after measurement - p.inst(("pauli_noise", *qubits)) - return p + return program -# TODO: does this need modification? +@deprecated( + deprecated_in="4.0", + removed_in="5.0", + current_version=pyquil_version, + details="This function will be removed. Use Program addition instead.", +) def merge_programs(prog_list: Sequence[Program]) -> Program: """ Merges a list of pyQuil programs into a single one by appending them in sequence. - If multiple programs in the list contain the same gate and/or noisy gate definition - with identical name, this definition will only be applied once. If different definitions - with the same name appear multiple times in the program list, each will be applied once - in the order of last occurrence. - - :param prog_list: A list of pyquil programs - :return: a single pyQuil program """ - definitions = [gate for prog in prog_list for gate in Program(prog).defined_gates] - seen: Dict[str, List[DefGate]] = {} - # Collect definitions in reverse order and reapply definitions in reverse - # collected order to ensure that the last occurrence of a definition is applied last. - for definition in reversed(definitions): - name = definition.name - if name in seen.keys(): - # Do not add truly identical definitions with the same name - # If two different definitions share a name, we include each definition so as to provide - # a waring to the user when the contradictory defgate is called. - if definition not in seen[name]: - seen[name].append(definition) - else: - seen[name] = [definition] - new_definitions = [gate for key in seen.keys() for gate in reversed(seen[key])] - - # Combine programs without gate definitions; avoid call to _synthesize by using _instructions - p = Program(*[prog._instructions for prog in prog_list]) - - for definition in new_definitions: - if isinstance(definition, DefPermutationGate): - p.inst(DefPermutationGate(definition.name, list(definition.permutation))) - else: - p.defgate(definition.name, definition.matrix, definition.parameters) - - return p - - -def get_classical_addresses_from_program(program: Program) -> Dict[str, List[int]]: - """ - Returns a sorted list of classical addresses found in the MEASURE instructions in the program. - - :param program: The program from which to get the classical addresses. - :return: A mapping from memory region names to lists of offsets appearing in the program. - """ - addresses: Dict[str, List[int]] = defaultdict(list) - flattened_addresses = {} - - # Required to use the `classical_reg.address` int attribute. - # See https://github.com/rigetti/pyquil/issues/388. - for instr in program: - if isinstance(instr, Measurement) and instr.classical_reg: - addresses[instr.classical_reg.name].append(instr.classical_reg.offset) - - # flatten duplicates - for k, v in addresses.items(): - reduced_list = list(set(v)) - reduced_list.sort() - flattened_addresses[k] = reduced_list - - return flattened_addresses - - -def percolate_declares(program: Program) -> Program: - """ - Move all the DECLARE statements to the top of the program. Return a fresh object. - - :param program: Perhaps jumbled program. - :return: Program with DECLAREs all at the top and otherwise the same sorted contents. - """ - declare_program = Program() - instrs_program = Program() - - for instr in program: - if isinstance(instr, Declare): - declare_program += instr - else: - instrs_program += instr - - p = declare_program + instrs_program - p._defined_gates = program._defined_gates - - return p + merged_program = Program() + for prog in prog_list: + merged_program += prog + return merged_program +@deprecated( + deprecated_in="4.0", + removed_in="5.0", + current_version=pyquil_version, + details="This is now a no-op and will be removed in future versions of pyQuil.", +) def validate_protoquil(program: Program, quilt: bool = False) -> None: """ - Ensure that a program is valid ProtoQuil or Quil-T, otherwise raise a ValueError. - Protoquil is a subset of Quil which excludes control flow and classical instructions. - - :param quilt: Validate the program as Quil-T. - :param program: The Quil program to validate. - """ - """ - Ensure that a program is valid ProtoQuil, otherwise raise a ValueError. - Protoquil is a subset of Quil which excludes control flow and classical instructions. - - :param program: The Quil program to validate. + This function has been deprecated. It is now a no-op. """ - if quilt: - valid_instruction_types = tuple( - [ - Pragma, - Declare, - Halt, - Gate, - Measurement, - Reset, - ResetQubit, - DelayQubits, - DelayFrames, - Fence, - FenceAll, - ShiftFrequency, - SetFrequency, - SetScale, - ShiftPhase, - SetPhase, - SwapPhase, - Pulse, - Capture, - RawCapture, - DefCalibration, - DefFrame, - DefMeasureCalibration, - DefWaveform, - ] - ) - else: - valid_instruction_types = tuple([Pragma, Declare, Gate, Reset, ResetQubit, Measurement]) - if program.calibrations: - raise ValueError("ProtoQuil validation failed: Quil-T calibrations are not allowed.") - if program.waveforms: - raise ValueError("ProtoQuil validation failed: Quil-T waveform definitions are not allowed.") - if program.frames: - raise ValueError("ProtoQuil validation failed: Quil-T frame definitions are not allowed.") - - for instr in program.instructions: - if not isinstance(instr, valid_instruction_types): - # Instructions like MOVE, NOT, JUMP, JUMP-UNLESS will fail here - raise ValueError(f"ProtoQuil validation failed: {instr} is not allowed.") + pass +@deprecated( + deprecated_in="4.0", + removed_in="5.0", + current_version=pyquil_version, + details="This is now a no-op and will be removed in future versions of pyQuil.", +) def validate_supported_quil(program: Program) -> None: """ - Ensure that a program is supported Quil which can run on any QPU, otherwise raise a ValueError. - We support a global RESET before any gates, and MEASUREs on each qubit after any gates - on that qubit. PRAGMAs and DECLAREs are always allowed. - - :param program: The Quil program to validate. + This function has been deprecated. It is now a no-op. """ - gates_seen = False - measured_qubits: Set[int] = set() - for instr in program.instructions: - if isinstance(instr, Pragma) or isinstance(instr, Declare): - continue - elif isinstance(instr, Gate): - gates_seen = True - if any(q.index in measured_qubits for q in instr.qubits): - raise ValueError("Cannot apply gates to qubits that were already measured.") - elif isinstance(instr, Reset): - if gates_seen: - raise ValueError("RESET can only be applied before any gate applications.") - elif isinstance(instr, ResetQubit): - raise ValueError("Only global RESETs are currently supported.") - elif isinstance(instr, Measurement): - if instr.qubit.index in measured_qubits: - raise ValueError("Multiple measurements per qubit is not supported.") - measured_qubits.add(instr.qubit.index) - else: - raise ValueError(f"Unhandled instruction type in supported Quil validation: {instr}") + pass diff --git a/pyquil/quilatom.py b/pyquil/quilatom.py index 86a94537f..bf1efe97e 100644 --- a/pyquil/quilatom.py +++ b/pyquil/quilatom.py @@ -16,12 +16,14 @@ from dataclasses import dataclass from fractions import Fraction -from numbers import Complex +from math import pi +from numbers import Complex, Number from typing import ( Any, Callable, ClassVar, List, + Iterable, Mapping, NoReturn, Optional, @@ -34,6 +36,8 @@ import numpy as np +import qcs_sdk.quil.instructions as quil_rs + class QuilAtom(object): """ @@ -155,7 +159,40 @@ def register(cls, n: int) -> List["QubitPlaceholder"]: return [cls() for _ in range(n)] -QubitDesignator = Union[Qubit, QubitPlaceholder, FormalArgument, int] +QubitDesignator = Union[Qubit, QubitPlaceholder, FormalArgument, quil_rs.Qubit, int] + + +def _convert_to_rs_qubit(qubit: QubitDesignator) -> quil_rs.Qubit: + if isinstance(qubit, quil_rs.Qubit): + return qubit + if isinstance(qubit, Qubit): + return quil_rs.Qubit.from_fixed(qubit.index) + if isinstance(qubit, QubitPlaceholder): + raise NotImplementedError("QubitPlaceholders aren't implemented in quil-rs") + if isinstance(qubit, FormalArgument): + return quil_rs.Qubit.from_variable(qubit.name) + if isinstance(qubit, int): + return quil_rs.Qubit.from_fixed(qubit) + raise ValueError(f"{type(qubit)} is not a valid QubitDesignator") + + +def _convert_to_rs_qubits(qubits: Iterable[QubitDesignator]) -> List[quil_rs.Qubit]: + return [_convert_to_rs_qubit(qubit) for qubit in qubits] + + +def _convert_to_py_qubit(qubit: QubitDesignator) -> QubitDesignator: + if isinstance(qubit, quil_rs.Qubit): + if qubit.is_fixed(): + return Qubit(qubit.to_fixed()) + if qubit.is_variable(): + return FormalArgument(qubit.to_variable()) + if isinstance(qubit, (Qubit, QubitPlaceholder, FormalArgument, int)): + return qubit + raise ValueError(f"{type(qubit)} is not a valid QubitDesignator") + + +def _convert_to_py_qubits(qubits: Iterable[QubitDesignator]) -> List[QubitDesignator]: + return [_convert_to_py_qubit(qubit) for qubit in qubits] def unpack_qubit(qubit: Union[QubitDesignator, FormalArgument]) -> Union[Qubit, QubitPlaceholder, FormalArgument]: @@ -196,7 +233,7 @@ def qubit_index(qubit: QubitDesignator) -> int: # int. However, specifying Union[str, int] as the generic type argument to List doesn't sufficiently # constrain the types, and mypy gets confused in unpack_classical_reg, below. Hence, just specify # List[Any] here. -MemoryReferenceDesignator = Union["MemoryReference", Tuple[str, int], List[Any], str] +MemoryReferenceDesignator = Union["MemoryReference", quil_rs.MemoryReference, Tuple[str, int], List[Any], str] def unpack_classical_reg(c: MemoryReferenceDesignator) -> "MemoryReference": @@ -271,7 +308,44 @@ def __hash__(self) -> int: return hash(id(self)) -ParameterDesignator = Union["Expression", "MemoryReference", np.int_, int, float, complex] +ParameterDesignator = Union["Expression", "MemoryReference", quil_rs.Expression, Number] + + +def _convert_to_rs_expression(parameter: ParameterDesignator) -> quil_rs.Expression: + if isinstance(parameter, quil_rs.Expression): + return parameter + elif isinstance(parameter, (Expression, MemoryReference, Number)): + return quil_rs.Expression.parse_from_str(str(parameter)) + raise ValueError(f"{type(parameter)} is not a valid ParameterDesignator") + + +def _convert_to_rs_expressions(parameters: Iterable[ParameterDesignator]) -> List[ParameterDesignator]: + return [_convert_to_rs_expression(parameter) for parameter in parameters] + + +def _convert_to_py_parameter(parameter: ParameterDesignator) -> ParameterDesignator: + if isinstance(parameter, quil_rs.Expression): + if parameter.is_address(): + return MemoryReference._from_rs_memory_reference(parameter.to_address()) + if parameter.is_function_call(): + return Function._from_rs_function_call(parameter.to_function_call()) + if parameter.is_infix(): + return BinaryExp._from_rs_infix_expression(parameter.to_infix()) + if parameter.is_prefix(): + raise NotImplementedError("prefix conversion not implemented") + if parameter.is_number(): + return parameter.to_number() + if parameter.is_pi(): + return pi + if parameter.is_variable(): + return Parameter(parameter.to_variable()) + elif isinstance(parameter, (Expression, MemoryReference, Number)): + return parameter + raise ValueError(f"{type(parameter)} is not a valid ParameterDesignator") + + +def _convert_to_py_parameters(parameters: Iterable[ParameterDesignator]) -> List[ParameterDesignator]: + return [_convert_to_py_parameter(parameter) for parameter in parameters] def format_parameter(element: ParameterDesignator) -> str: @@ -317,7 +391,7 @@ def format_parameter(element: ParameterDesignator) -> str: ExpressionValueDesignator = Union[int, float, complex] -ExpressionDesignator = Union["Expression", ExpressionValueDesignator] +ExpressionDesignator = Union["Expression", quil_rs.Expression, ExpressionValueDesignator] class Expression(object): @@ -498,6 +572,22 @@ def __init__(self, op1: ExpressionDesignator, op2: ExpressionDesignator): self.op1 = op1 self.op2 = op2 + @classmethod + def _from_rs_infix_expression(cls, infix_expression: quil_rs.InfixExpression): + left = _convert_to_py_parameter(infix_expression.left) + right = _convert_to_py_parameter(infix_expression.right) + if infix_expression.operator.is_plus(): + return Add(left, right) + if infix_expression.operator.is_minus(): + return Sub(left, right) + if infix_expression.operator.is_slash(): + return Div(left, right) + if infix_expression.operator.is_star(): + return Mul(left, right) + if infix_expression.operator.is_caret(): + return Pow(left, right) + raise ValueError(f"{type(infix_expression)} is not a valid InfixExpression") + def _substitute(self, d: ParameterSubstitutionsMapDesignator) -> Union["BinaryExp", ExpressionValueDesignator]: sop1, sop2 = substitute(self.op1, d), substitute(self.op2, d) return self.fn(sop1, sop2) @@ -676,6 +766,10 @@ def __init__(self, name: str, offset: int = 0, declared_size: Optional[int] = No self.offset = offset self.declared_size = declared_size + @classmethod + def _from_rs_memory_reference(cls, memory_reference: quil_rs.MemoryReference) -> "MemoryReference": + return cls(memory_reference.name, memory_reference.index) + def out(self) -> str: if self.declared_size is not None and self.declared_size == 1 and self.offset == 0: return "{}".format(self.name) diff --git a/pyquil/quilbase.py b/pyquil/quilbase.py index 476602d8b..1738e0d67 100644 --- a/pyquil/quilbase.py +++ b/pyquil/quilbase.py @@ -16,6 +16,7 @@ """ Contains the core pyQuil objects that correspond to Quil instructions. """ +import abc import collections import json @@ -37,8 +38,10 @@ cast, ) +from deprecation import deprecated import numpy as np +from pyquil._version import pyquil_version from pyquil.quilatom import ( Expression, ExpressionDesignator, @@ -54,6 +57,11 @@ QubitPlaceholder, FormalArgument, _contained_parameters, + _convert_to_py_qubits, + _convert_to_rs_expressions, + _convert_to_rs_qubit, + _convert_to_rs_qubits, + _convert_to_py_parameters, format_parameter, unpack_qubit, _complex_str, @@ -64,26 +72,42 @@ from dataclasses import dataclass +import qcs_sdk.quil.instructions as quil_rs -class AbstractInstruction(object): + +class _InstructionMeta(abc.ABCMeta): """ - Abstract class for representing single instructions. + A metaclass that allows us to group all instruction types from quil-rs and pyQuil as an `AbstractInstruction`. + As such, this should _only_ be used as a metaclass for `AbstractInstruction`. """ - def out(self) -> str: - pass + @classmethod + def __instancecheck__(cls, __instance: Any) -> bool: + if isinstance(__instance, (quil_rs.Instruction)): + return True + try: + quil_rs.Instruction(__instance) + return True + except Exception: + return False + + +class AbstractInstruction(metaclass=_InstructionMeta): + """ + Abstract class for representing single instructions. + """ def __str__(self) -> str: - return self.out() + return self.__str__() def __eq__(self, other: object) -> bool: - return isinstance(other, self.__class__) and self.out() == other.out() + return isinstance(other, self.__class__) and str(self) == str(other) def __ne__(self, other: object) -> bool: return not self.__eq__(other) def __hash__(self) -> int: - return hash(self.out()) + return hash(str(self)) RESERVED_WORDS: Container[str] = [ @@ -178,70 +202,58 @@ def _join_strings(*args: str) -> str: return " ".join(map(str, args)) -class Gate(AbstractInstruction): +class Gate(quil_rs.Gate, AbstractInstruction): """ This is the pyQuil object for a quantum gate instruction. """ - def __init__( - self, + def __new__( + cls, name: str, params: Iterable[ParameterDesignator], qubits: Iterable[Union[Qubit, QubitPlaceholder, FormalArgument]], - ): - if not isinstance(name, str): - raise TypeError("Gate name must be a string") - - if name in RESERVED_WORDS: - raise ValueError("Cannot use {} for a gate name since it's a reserved word".format(name)) - - if not isinstance(params, collections.abc.Iterable): - raise TypeError("Gate params must be an Iterable") - - if not isinstance(qubits, collections.abc.Iterable): - raise TypeError("Gate arguments must be an Iterable") - - for qubit in qubits: - if not isinstance(qubit, (Qubit, QubitPlaceholder, FormalArgument)): - raise TypeError("Gate arguments must all be Qubits") - - qubits_list = list(qubits) - if len(qubits_list) == 0: - raise TypeError("Gate arguments must be non-empty") + modifiers: Iterable[quil_rs.GateModifier] = [], + ) -> "Gate": + return super().__new__(cls, name, _convert_to_rs_expressions(params), _convert_to_rs_qubits(qubits), modifiers) + + @classmethod + def _from_rs_gate(cls, gate: quil_rs.Gate) -> "Gate": + return cls(gate.name, gate.parameters, gate.qubits, gate.modifiers) + + @deprecated( + deprecated_in="4.0", + removed_in="5.0", + current_version=pyquil_version, + details="The indices flag will be removed, use get_qubit_indices() instead.", + ) + def get_qubits(self, indices: bool = True) -> Set[QubitDesignator]: + if indices: + return self.get_qubit_indices() + else: + return set(_convert_to_py_qubits(super().qubits)) - self.name = name - self.params = list(params) - self.qubits = qubits_list - self.modifiers: List[str] = [] + @property + def qubits(self): + return list(self.get_qubits(indices=False)) - def get_qubits(self, indices: bool = True) -> Set[QubitDesignator]: - return {_extract_qubit_index(q, indices) for q in self.qubits} + @property + def params(self): + return _convert_to_py_parameters(super().parameters) - def out(self) -> str: - if self.params: - return "{}{}{} {}".format( - " ".join(self.modifiers) + " " if self.modifiers else "", - self.name, - _format_params(self.params), - _format_qubits_out(self.qubits), - ) - else: - return "{}{} {}".format( - " ".join(self.modifiers) + " " if self.modifiers else "", - self.name, - _format_qubits_out(self.qubits), - ) + def get_qubit_indices(self) -> Set[int]: + return {qubit.as_fixed() for qubit in super().qubits} def controlled(self, control_qubit: Union[QubitDesignator, Sequence[QubitDesignator]]) -> "Gate": """ Add the CONTROLLED modifier to the gate with the given control qubit or Sequence of control qubits. """ - control_qubit = control_qubit if isinstance(control_qubit, Sequence) else [control_qubit] - for qubit in control_qubit: - qubit = unpack_qubit(qubit) - self.modifiers.insert(0, "CONTROLLED") - self.qubits.insert(0, qubit) + if isinstance(control_qubit, Sequence): + for qubit in control_qubit: + self = super().controlled(_convert_to_rs_qubit(qubit)) + else: + self = super().controlled(_convert_to_rs_qubit(control_qubit)) + return self def forked(self, fork_qubit: QubitDesignator, alt_params: List[ParameterDesignator]) -> "Gate": @@ -249,44 +261,18 @@ def forked(self, fork_qubit: QubitDesignator, alt_params: List[ParameterDesignat Add the FORKED modifier to the gate with the given fork qubit and given additional parameters. """ - if not isinstance(alt_params, list): - raise TypeError("Gate params must be a list") - if len(self.params) != len(alt_params): - raise ValueError("Expected {} parameters but received {}".format(len(self.params), len(alt_params))) - - fork_qubit = unpack_qubit(fork_qubit) - - self.modifiers.insert(0, "FORKED") - self.qubits.insert(0, fork_qubit) - self.params += alt_params - + self = super().forked(_convert_to_rs_qubit(fork_qubit), _convert_to_rs_expressions(alt_params)) return self def dagger(self) -> "Gate": """ Add the DAGGER modifier to the gate. """ - self.modifiers.insert(0, "DAGGER") - + self = super().dagger() return self - def __repr__(self) -> str: - return "" - - def __str__(self) -> str: - if self.params: - return "{}{}{} {}".format( - " ".join(self.modifiers) + " " if self.modifiers else "", - self.name, - _format_params(self.params), - _format_qubits_str(self.qubits), - ) - else: - return "{}{} {}".format( - " ".join(self.modifiers) + " " if self.modifiers else "", - self.name, - _format_qubits_str(self.qubits), - ) + def out(self) -> str: + return str(self) def _strip_modifiers(gate: Gate, limit: Optional[int] = None) -> Gate: @@ -1225,7 +1211,6 @@ def get_qubits(self, indices: bool = True) -> Set[QubitDesignator]: class DelayFrames(AbstractInstruction): def __init__(self, frames: List[Frame], duration: float): - # all frames should be on the same qubits if len(frames) == 0: raise ValueError("DELAY expected nonempty list of frames.") diff --git a/test/unit/__snapshots__/test_api.ambr b/test/unit/__snapshots__/test_api.ambr new file mode 100644 index 000000000..5b886a8ce --- /dev/null +++ b/test/unit/__snapshots__/test_api.ambr @@ -0,0 +1,20 @@ +# name: test_local_rb_sequence + list([ + ''' + H 0 + PHASE(1.5707963267948966) 0 + H 0 + PHASE(1.5707963267948966) 0 + PHASE(1.5707963267948966) 0 + + ''', + ''' + H 0 + PHASE(1.5707963267948966) 0 + H 0 + PHASE(1.5707963267948966) 0 + PHASE(1.5707963267948966) 0 + + ''', + ]) +# --- diff --git a/test/unit/__snapshots__/test_main.ambr b/test/unit/__snapshots__/test_main.ambr new file mode 100644 index 000000000..e71ec19fb --- /dev/null +++ b/test/unit/__snapshots__/test_main.ambr @@ -0,0 +1,6 @@ +# name: test_remove_reset_from_program + DEFGATE XGATE: + 0, 1 + 1, 0 + X 0 +# --- diff --git a/test/unit/__snapshots__/test_paulis.ambr b/test/unit/__snapshots__/test_paulis.ambr new file mode 100644 index 000000000..5ccbe37d7 --- /dev/null +++ b/test/unit/__snapshots__/test_paulis.ambr @@ -0,0 +1,10 @@ +# name: test_ordered + ''' + CNOT 3 2 + CNOT 2 1 + RZ(1) 1 + CNOT 2 1 + CNOT 3 2 + + ''' +# --- diff --git a/test/unit/__snapshots__/test_quil.ambr b/test/unit/__snapshots__/test_quil.ambr new file mode 100644 index 000000000..81d78d637 --- /dev/null +++ b/test/unit/__snapshots__/test_quil.ambr @@ -0,0 +1,323 @@ +# name: test_binary_classicals + ''' + AND ro[0] ro[1] + MOVE ro[0] ro[1] + CONVERT ro[0] ro[1] + IOR ro[0] ro[1] + XOR ro[0] ro[1] + ADD ro[0] ro[1] + SUB ro[0] ro[1] + MUL ro[0] ro[1] + DIV ro[0] ro[1] + EXCHANGE ro[0] ro[1] + + ''' +# --- +# name: test_construction_syntax + ''' + DECLARE ro BIT[2] + X 0 + Y 1 + Z 0 + MEASURE 0 ro[1] + + ''' +# --- +# name: test_construction_syntax.1 + ''' + DECLARE ro BIT[3] + X 0 + Y 1 + MEASURE 0 ro[1] + MEASURE 1 ro[2] + + ''' +# --- +# name: test_construction_syntax.2 + ''' + DECLARE ro BIT[2] + X 0 + MEASURE 0 ro[1] + Y 1 + X 0 + MEASURE 0 ro[0] + + ''' +# --- +# name: test_controlled_gates + ''' + CNOT 0 1 + CCNOT 0 1 2 + + ''' +# --- +# name: test_def_gate + ''' + DEFGATE SQRT-X AS MATRIX: + (0.5+0.5i), (0.5-0.5i) + (0.5-0.5i), (0.5+0.5i) + + SQRT-X 0 + + ''' +# --- +# name: test_defgate + ''' + DEFGATE TEST: + 1.0, 0 + 0, 1.0 + + ''' +# --- +# name: test_defgate.1 + 'TEST 1 2' +# --- +# name: test_defgate.2 + 'TEST 1 2' +# --- +# name: test_defgate_param + ''' + DEFGATE TEST: + 1.0, 0 + 0, 1.0 + + ''' +# --- +# name: test_defgate_param.1 + 'TEST 1' +# --- +# name: test_define_qft + ''' + X 0 + H 2 + CPHASE(1.5707963267948966) 1 2 + H 1 + CPHASE(0.7853981633974483) 0 2 + CPHASE(1.5707963267948966) 0 1 + H 0 + SWAP 0 2 + + ''' +# --- +# name: test_gate + 'TEST 1 2' +# --- +# name: test_inst_gates + ''' + H 0 + X 1 + + ''' +# --- +# name: test_inst_rs_gate + ''' + X 0 + + ''' +# --- +# name: test_inst_string + ''' + Y 0 + X 1 + + ''' +# --- +# name: test_inst_tuple + ''' + Y 0 + X 1 + + ''' +# --- +# name: test_kraus + ''' + X 0 + PRAGMA NO-NOISE + X 1 + + ''' +# --- +# name: test_measure_all + ''' + DECLARE ro BIT[4] + MEASURE 0 ro[0] + MEASURE 1 ro[1] + MEASURE 2 ro[3] + + ''' +# --- +# name: test_measure_all_noncontig + ''' + DECLARE ro BIT[11] + H 0 + H 10 + MEASURE 0 ro[0] + MEASURE 10 ro[10] + + ''' +# --- +# name: test_measurement_calls + ''' + DECLARE ro BIT[2] + MEASURE 0 ro[1] + MEASURE 0 ro[1] + + ''' +# --- +# name: test_memory_reference_unpacking + ''' + AND ro[0] ro[1] + MOVE ro[0] ro[1] + CONVERT ro[0] ro[1] + IOR ro[0] ro[1] + XOR ro[0] ro[1] + ADD ro[0] ro[1] + SUB ro[0] ro[1] + MUL ro[0] ro[1] + DIV ro[0] ro[1] + EXCHANGE ro[0] ro[1] + + ''' +# --- +# name: test_merge_with_pauli_noise + ''' + DEFGATE pauli_noise AS MATRIX: + 1, 0 + 0, 1 + + PRAGMA ADD-KRAUS pauli_noise 0 "(0.0 0.0 0.0 0.0)" + PRAGMA ADD-KRAUS pauli_noise 0 "(0.0 1.0 1.0 0.0)" + PRAGMA ADD-KRAUS pauli_noise 0 "(0.0 0.0 0.0 0.0)" + PRAGMA ADD-KRAUS pauli_noise 0 "(0.0 0.0 0.0 -0.0)" + X 0 + Z 0 + + ''' +# --- +# name: test_multiqubit_gate + ''' + DEFGATE X-SQRT-X AS MATRIX: + 0, (0.5+0.5i), 0, (0.5-0.5i) + (0.5+0.5i), 0, (0.5-0.5i), 0 + 0, (0.5-0.5i), 0, (0.5+0.5i) + (0.5-0.5i), 0, (0.5+0.5i), 0 + + X-SQRT-X 0 1 + + ''' +# --- +# name: test_phases + ''' + PHASE(3.141592653589793) 1 + CPHASE00(3.141592653589793) 0 1 + CPHASE01(3.141592653589793) 0 1 + CPHASE10(3.141592653589793) 0 1 + CPHASE(3.141592653589793) 0 1 + + ''' +# --- +# name: test_prog_init + ''' + DECLARE ro BIT[1] + X 0 + MEASURE 0 ro[0] + + ''' +# --- +# name: test_program_pop + ''' + X 0 + + ''' +# --- +# name: test_program_pop.1 + ''' + X 1 + + ''' +# --- +# name: test_program_string + ''' + Y 0 + X 1 + + ''' +# --- +# name: test_program_tuple + ''' + Y 0 + X 1 + + ''' +# --- +# name: test_rotations + ''' + RX(0.5) 0 + RY(0.1) 1 + RZ(1.4) 2 + + ''' +# --- +# name: test_simple_instructions + ''' + HALT + WAIT + RESET + NOP + + ''' +# --- +# name: test_singles + ''' + I 0 + X 0 + Y 1 + Z 1 + H 2 + T 2 + S 1 + + ''' +# --- +# name: test_swaps + ''' + SWAP 0 1 + CSWAP 0 1 2 + ISWAP 0 1 + PSWAP(3.141592653589793) 0 1 + + ''' +# --- +# name: test_ternary_classicals + ''' + LOAD ro[0] ro n[0] + STORE ro n[0] ro[0] + STORE ro n[0] 0 + STORE ro n[0] 0.1 + EQ ro[0] ro[1] 0 + EQ ro[0] ro[1] 0 + EQ ro[0] ro[1] ro[0] + GE ro[0] ro[1] 1 + GE ro[0] ro[1] 1.1 + GE ro[0] ro[1] ro[1] + GT ro[0] ro[1] 2 + GT ro[0] ro[1] 2.2 + GT ro[0] ro[1] ro[2] + LE ro[0] ro[1] 3 + LE ro[0] ro[1] 3.3 + LE ro[0] ro[1] ro[3] + LT ro[0] ro[1] 4 + LT ro[0] ro[1] 4.4 + LT ro[0] ro[1] ro[4] + + ''' +# --- +# name: test_unary_classicals + ''' + MOVE ro[0] 1 + MOVE ro[1] 0 + NOT ro[2] + NEG ro[3] + + ''' +# --- diff --git a/test/unit/__snapshots__/test_quilbase.ambr b/test/unit/__snapshots__/test_quilbase.ambr new file mode 100644 index 000000000..83686d090 --- /dev/null +++ b/test/unit/__snapshots__/test_quilbase.ambr @@ -0,0 +1,60 @@ +# name: TestGate.test_controlled_modifier[CPHASE-Expression] + 'CONTROLLED CPHASE(1.5707963267948966) 5 0 1' +# --- +# name: TestGate.test_controlled_modifier[RZ-MemoryReference-Expression] + 'CONTROLLED RZ((alpha[0]-beta[0])) 5 0' +# --- +# name: TestGate.test_controlled_modifier[RZ-MemoryReference] + 'CONTROLLED RZ(theta[0]) 5 0' +# --- +# name: TestGate.test_controlled_modifier[X-Gate] + 'CONTROLLED X 5 0' +# --- +# name: TestGate.test_dagger_modifier[CPHASE-Expression] + 'DAGGER CPHASE(1.5707963267948966) 0 1' +# --- +# name: TestGate.test_dagger_modifier[RZ-MemoryReference-Expression] + 'DAGGER RZ((alpha[0]-beta[0])) 0' +# --- +# name: TestGate.test_dagger_modifier[RZ-MemoryReference] + 'DAGGER RZ(theta[0]) 0' +# --- +# name: TestGate.test_dagger_modifier[X-Gate] + 'DAGGER X 0' +# --- +# name: TestGate.test_forked_modifier[CPHASE-Expression] + 'FORKED CPHASE(1.57079632679489660) 5 0 1' +# --- +# name: TestGate.test_forked_modifier[RZ-MemoryReference-Expression] + 'FORKED RZ((alpha[0]-beta[0])0) 5 0' +# --- +# name: TestGate.test_forked_modifier[RZ-MemoryReference] + 'FORKED RZ(theta[0]0) 5 0' +# --- +# name: TestGate.test_forked_modifier[X-Gate] + 'FORKED X 5 0' +# --- +# name: TestGate.test_repr[CPHASE-Expression] + 'Gate { name: "CPHASE", parameters: [Number(Complex { re: 1.5707963267948966, im: 0.0 })], qubits: [Fixed(0), Fixed(1)], modifiers: [] }' +# --- +# name: TestGate.test_repr[RZ-MemoryReference-Expression] + 'Gate { name: "RZ", parameters: [Infix(InfixExpression { left: Address(MemoryReference { name: "alpha", index: 0 }), operator: Minus, right: Address(MemoryReference { name: "beta", index: 0 }) })], qubits: [Fixed(0)], modifiers: [] }' +# --- +# name: TestGate.test_repr[RZ-MemoryReference] + 'Gate { name: "RZ", parameters: [Address(MemoryReference { name: "theta", index: 0 })], qubits: [Fixed(0)], modifiers: [] }' +# --- +# name: TestGate.test_repr[X-Gate] + 'Gate { name: "X", parameters: [], qubits: [Fixed(0)], modifiers: [] }' +# --- +# name: TestGate.test_str[CPHASE-Expression] + 'CPHASE(1.5707963267948966) 0 1' +# --- +# name: TestGate.test_str[RZ-MemoryReference-Expression] + 'RZ((alpha[0]-beta[0])) 0' +# --- +# name: TestGate.test_str[RZ-MemoryReference] + 'RZ(theta[0]) 0' +# --- +# name: TestGate.test_str[X-Gate] + 'X 0' +# --- diff --git a/test/unit/test_api.py b/test/unit/test_api.py index 4b0f7de24..b5ce58c38 100644 --- a/test/unit/test_api.py +++ b/test/unit/test_api.py @@ -56,6 +56,7 @@ RB_REPLY = [Program("H 0\nH 0\n"), Program("PHASE(pi/2) 0\nPHASE(pi/2) 0\n")] +# TODO: quil-rs needs to implement program_unitary def test_quil_to_native_quil(compiler): response = compiler.quil_to_native_quil(BELL_STATE) p_unitary = program_unitary(response, n_qubits=2) @@ -65,12 +66,9 @@ def test_quil_to_native_quil(compiler): assert np.allclose(p_unitary, scale_out_phase(compiled_p_unitary, p_unitary)) -def test_local_rb_sequence(benchmarker): +def test_local_rb_sequence(benchmarker, snapshot): response = benchmarker.generate_rb_sequence(2, [PHASE(np.pi / 2, 0), H(0)], seed=52) - assert [prog.out() for prog in response] == [ - "H 0\nPHASE(pi/2) 0\nH 0\nPHASE(pi/2) 0\nPHASE(pi/2) 0\n", - "H 0\nPHASE(pi/2) 0\nH 0\nPHASE(pi/2) 0\nPHASE(pi/2) 0\n", - ] + assert [prog.out() for prog in response] == snapshot def test_local_conjugate_request(benchmarker): @@ -82,4 +80,3 @@ def test_local_conjugate_request(benchmarker): def test_apply_clifford_to_pauli(benchmarker): response = benchmarker.apply_clifford_to_pauli(Program("H 0"), PauliTerm("I", 0, 0.34)) assert response == PauliTerm("I", 0, 0.34) - diff --git a/test/unit/test_main.py b/test/unit/test_main.py index 2b01850ed..5e4f4d67f 100644 --- a/test/unit/test_main.py +++ b/test/unit/test_main.py @@ -99,23 +99,16 @@ def test_experiment_deser(tmpdir): """ -TRIMMED_PROG = """ -DEFGATE XGATE: - 0, 1 - 1, 0 - -X 0 -""" - - -def test_remove_reset_from_program(): +# TODO: isinstance compatibility +def test_remove_reset_from_program(snapshot): p = Program(DEFGATE_X) p += RESET() p += X(0) new_p = _remove_reset_from_program(p) - assert "\n" + new_p.out() == TRIMMED_PROG + assert new_p.out() == snapshot +# TODO: isinstance compatibility def test_generate_experiment_program(): # simplest example p = Program() diff --git a/test/unit/test_noise.py b/test/unit/test_noise.py index f7b17b690..145c79d9f 100644 --- a/test/unit/test_noise.py +++ b/test/unit/test_noise.py @@ -35,10 +35,10 @@ def test_pauli_kraus_map(): probabilities = [0.1, 0.2, 0.3, 0.4] k1, k2, k3, k4 = pauli_kraus_map(probabilities) - assert np.allclose(k1, np.sqrt(0.1) * np.eye(2), atol=1 * 10 ** -8) - assert np.allclose(k2, np.sqrt(0.2) * np.array([[0, 1.0], [1.0, 0]]), atol=1 * 10 ** -8) - assert np.allclose(k3, np.sqrt(0.3) * np.array([[0, -1.0j], [1.0j, 0]]), atol=1 * 10 ** -8) - assert np.allclose(k4, np.sqrt(0.4) * np.array([[1, 0], [0, -1]]), atol=1 * 10 ** -8) + assert np.allclose(k1, np.sqrt(0.1) * np.eye(2), atol=1 * 10**-8) + assert np.allclose(k2, np.sqrt(0.2) * np.array([[0, 1.0], [1.0, 0]]), atol=1 * 10**-8) + assert np.allclose(k3, np.sqrt(0.3) * np.array([[0, -1.0j], [1.0j, 0]]), atol=1 * 10**-8) + assert np.allclose(k4, np.sqrt(0.4) * np.array([[1, 0], [0, -1]]), atol=1 * 10**-8) two_q_pauli_kmaps = pauli_kraus_map(np.kron(probabilities, list(reversed(probabilities)))) q1_pauli_kmaps = [k1, k2, k3, k4] @@ -103,6 +103,7 @@ def test_damping_after_dephasing(): np.testing.assert_allclose(noisy_rho, target_rho) +# TODO isinstance compatibility def test_noise_helpers(): gates = RX(np.pi / 2, 0), RX(-np.pi / 2, 1), I(1), CZ(0, 1) prog = Program(*gates) @@ -110,6 +111,7 @@ def test_noise_helpers(): assert set(inferred_gates) == set(gates) +# TODO isinstance compatibility def test_decoherence_noise(): prog = Program(RX(np.pi / 2, 0), CZ(0, 1), RZ(np.pi, 0)) gates = _get_program_gates(prog) @@ -279,6 +281,7 @@ def test_readout_compensation(): assert np.isclose(zm[1, 1, 1], 1.0) +# TODO: quil-rs PRAGMA parsing def test_estimate_assignment_probs(mocker: MockerFixture): mock_qc = mocker.patch("pyquil.api.QuantumComputer").return_value mock_compiler = mocker.patch("pyquil.api._abstract_compiler.AbstractCompiler").return_value @@ -291,8 +294,18 @@ def test_estimate_assignment_probs(mocker: MockerFixture): mock_qc.compiler = mock_compiler mock_qc mock_qc.run.side_effect = [ - QAMExecutionResult(executable=None, readout_data={'ro': np.array([[0]]) * int(round(p00 * trials)) + np.array([[1]]) * int(round((1 - p00) * trials))}), # I gate results - QAMExecutionResult(executable=None, readout_data={'ro': np.array([[1]]) * int(round(p11 * trials)) + np.array([[0]]) * int(round((1 - p11) * trials))}), # X gate results + QAMExecutionResult( + executable=None, + readout_data={ + "ro": np.array([[0]]) * int(round(p00 * trials)) + np.array([[1]]) * int(round((1 - p00) * trials)) + }, + ), # I gate results + QAMExecutionResult( + executable=None, + readout_data={ + "ro": np.array([[1]]) * int(round(p11 * trials)) + np.array([[0]]) * int(round((1 - p11) * trials)) + }, + ), # X gate results ] ap_target = np.array([[p00, 1 - p11], [1 - p00, p11]]) diff --git a/test/unit/test_numpy.py b/test/unit/test_numpy.py index c1044b583..ad5b73b76 100644 --- a/test/unit/test_numpy.py +++ b/test/unit/test_numpy.py @@ -56,6 +56,7 @@ def test_wfn_ordering_tensordot(): np.testing.assert_allclose(two_q_wfn[:, 0], 1 / np.sqrt(2) * np.ones(2)) +# TODO isinstance compatibility def test_einsum_simulator_H(): prog = Program(H(0)) qam = PyQVM(n_qubits=1, quantum_simulator_type=NumpyWavefunctionSimulator) @@ -64,6 +65,7 @@ def test_einsum_simulator_H(): np.testing.assert_allclose(wf, 1 / np.sqrt(2) * np.ones(2)) +# TODO isinstance compatibility def test_einsum_simulator_1(): prog = Program(H(0), CNOT(0, 1)) qam = PyQVM(n_qubits=2, quantum_simulator_type=NumpyWavefunctionSimulator) @@ -72,6 +74,7 @@ def test_einsum_simulator_1(): np.testing.assert_allclose(wf, 1 / np.sqrt(2) * np.reshape([1, 0, 0, 1], (2, 2))) +# TODO isinstance compatibility def test_einsum_simulator_CNOT(): prog = Program(X(0), CNOT(0, 1)) qam = PyQVM(n_qubits=2, quantum_simulator_type=NumpyWavefunctionSimulator) @@ -80,6 +83,7 @@ def test_einsum_simulator_CNOT(): np.testing.assert_allclose(wf, np.reshape([0, 0, 0, 1], (2, 2))) +# TODO isinstance compatibility def test_einsum_simulator_CCNOT(): prog = Program(X(2), X(0), CCNOT(2, 1, 0)) qam = PyQVM(n_qubits=3, quantum_simulator_type=NumpyWavefunctionSimulator) @@ -90,6 +94,7 @@ def test_einsum_simulator_CCNOT(): np.testing.assert_allclose(wf, should_be) +# TODO isinstance compatibility def test_einsum_simulator_10q(): prog = Program(H(0)) for i in range(10 - 1): @@ -103,6 +108,7 @@ def test_einsum_simulator_10q(): np.testing.assert_allclose(wf, should_be) +# TODO isinstance compatibility def test_measure(): qam = PyQVM(n_qubits=3, quantum_simulator_type=NumpyWavefunctionSimulator) qam.execute(Program(Declare("ro", "BIT", 64), H(0), CNOT(0, 1), MEASURE(0, MemoryReference("ro", 63)))) @@ -131,6 +137,7 @@ def include_measures(request): return request.param +# TODO isinstance compatibility def test_vs_ref_simulator(n_qubits, prog_length, include_measures): if include_measures: seed = 52 @@ -160,6 +167,7 @@ def test_all_bitstrings(): np.testing.assert_array_equal(bitstrings_ref, bitstrings_new) +# TODO isinstance compatibility def test_sample_bitstrings(): prog = Program(H(0), H(1)) qam = PyQVM(n_qubits=3, quantum_simulator_type=NumpyWavefunctionSimulator, seed=52) @@ -186,6 +194,7 @@ def test_expectation(): assert val == 0.4 +# TODO isinstance compatibility def test_expectation_vs_ref_qvm(n_qubits): for _ in range(20): prog = _generate_random_program(n_qubits=n_qubits, length=10) @@ -201,6 +210,7 @@ def test_expectation_vs_ref_qvm(n_qubits): np.testing.assert_allclose(ref_exp, np_exp, atol=1e-15) +# TODO isinstance compatibility def test_defgate(): # regression test for https://github.com/rigetti/pyquil/issues/1059 theta = np.pi / 2 diff --git a/test/unit/test_operator_estimation.py b/test/unit/test_operator_estimation.py index 57d971ffb..60c943b61 100644 --- a/test/unit/test_operator_estimation.py +++ b/test/unit/test_operator_estimation.py @@ -36,6 +36,7 @@ from pyquil.quilbase import Pragma +# TODO: Instruction API and compatibility def test_measure_observables(client_configuration: QCSClientConfiguration): expts = [ ExperimentSetting(TensorProductState(), o1 * o2) diff --git a/test/unit/test_paulis.py b/test/unit/test_paulis.py index 5807b1bc2..ad6ab1772 100644 --- a/test/unit/test_paulis.py +++ b/test/unit/test_paulis.py @@ -291,7 +291,7 @@ def test_exponentiate_1(): para_prog = exponential_map(generator) prog = para_prog(1) result_prog = Program().inst(RZ(2.0, 0)) - assert prog == result_prog + assert str(prog) == str(result_prog) def test_exponentiate_2(): @@ -300,7 +300,7 @@ def test_exponentiate_2(): para_prog = exponential_map(generator) prog = para_prog(1) result_prog = Program().inst(CNOT(0, 1)).inst(RZ(2.0, 1)).inst(CNOT(0, 1)) - assert prog == result_prog + assert str(prog) == str(result_prog) def test_exponentiate_bp0_ZX(): @@ -309,7 +309,7 @@ def test_exponentiate_bp0_ZX(): param_prog = exponential_map(generator) prog = param_prog(1) result_prog = Program().inst([H(0), CNOT(0, 1), RZ(2.0, 1), CNOT(0, 1), H(0)]) - assert prog == result_prog + assert str(prog) == str(result_prog) def test_exponentiate_bp1_XZ(): @@ -318,7 +318,7 @@ def test_exponentiate_bp1_XZ(): para_prog = exponential_map(generator) prog = para_prog(1) result_prog = Program().inst([H(1), CNOT(0, 1), RZ(2.0, 1), CNOT(0, 1), H(1)]) - assert prog == result_prog + assert str(prog) == str(result_prog) def test_exponentiate_bp0_ZY(): @@ -327,7 +327,7 @@ def test_exponentiate_bp0_ZY(): para_prog = exponential_map(generator) prog = para_prog(1) result_prog = Program().inst([RX(math.pi / 2.0, 0), CNOT(0, 1), RZ(2.0, qubit=1), CNOT(0, 1), RX(-math.pi / 2, 0)]) - assert prog == result_prog + assert str(prog) == str(result_prog) def test_exponentiate_bp1_YZ(): @@ -336,7 +336,7 @@ def test_exponentiate_bp1_YZ(): para_prog = exponential_map(generator) prog = para_prog(1) result_prog = Program().inst([RX(math.pi / 2.0, 1), CNOT(0, 1), RZ(2.0, 1), CNOT(0, 1), RX(-math.pi / 2.0, 1)]) - assert prog == result_prog + assert str(prog) == str(result_prog) def test_exponentiate_3cob(): @@ -357,7 +357,7 @@ def test_exponentiate_3cob(): H(2), ] ) - assert prog == result_prog + assert str(prog) == str(result_prog) def test_exponentiate_3ns(): @@ -380,21 +380,21 @@ def test_exponentiate_3ns(): RX(-math.pi / 2.0, 3), ] ) - assert prog == result_prog + assert str(prog) == str(result_prog) def test_exponentiate_commuting_pauli_sum(): pauli_sum = PauliSum([PauliTerm("Z", 0, 0.5), PauliTerm("Z", 1, 0.5)]) prog = Program().inst(RZ(1.0, 0)).inst(RZ(1.0, 1)) result_prog = exponentiate_commuting_pauli_sum(pauli_sum)(1.0) - assert prog == result_prog + assert str(prog) == str(result_prog) def test_exponentiate_prog(): ham = PauliTerm("Z", 0) result_prog = Program(RZ(2.0, 0)) prog = exponentiate(ham) - assert prog == result_prog + assert str(prog) == str(result_prog) def test_exponentiate_identity(): @@ -402,19 +402,19 @@ def test_exponentiate_identity(): para_prog = exponential_map(generator) prog = para_prog(1) result_prog = Program() - assert prog == result_prog + assert str(prog) == str(result_prog) generator = PauliTerm("I", 1, 1.0) para_prog = exponential_map(generator) prog = para_prog(1) result_prog = Program().inst([X(0), PHASE(-1.0, 0), X(0), PHASE(-1.0, 0)]) - assert prog == result_prog + assert str(prog) == str(result_prog) generator = PauliTerm("I", 10, 0.08) para_prog = exponential_map(generator) prog = para_prog(1) result_prog = Program().inst([X(0), PHASE(-0.08, 0), X(0), PHASE(-0.08, 0)]) - assert prog == result_prog + assert str(prog) == str(result_prog) def test_trotterize(): @@ -428,22 +428,22 @@ def test_trotterize(): prog = trotterize(term_one, term_one) result_prog = Program().inst([H(0), RZ(2.0, 0), H(0), H(0), RZ(2.0, 0), H(0)]) - assert prog == result_prog + assert str(prog) == str(result_prog) # trotter_order 1 steps 1 prog = trotterize(term_one, term_two, trotter_steps=1) result_prog = Program().inst([H(0), RZ(2.0, 0), H(0), RZ(2.0, 0)]) - assert prog == result_prog + assert str(prog) == str(result_prog) # trotter_order 1 steps 2 prog = trotterize(term_one, term_two, trotter_steps=2) result_prog = Program().inst([H(0), RZ(1.0, 0), H(0), RZ(1.0, 0), H(0), RZ(1.0, 0), H(0), RZ(1.0, 0)]) - assert prog == result_prog + assert str(prog) == str(result_prog) # trotter_order 2 steps 1 prog = trotterize(term_one, term_two, trotter_order=2) result_prog = Program().inst([H(0), RZ(1.0, 0), H(0), RZ(2.0, 0), H(0), RZ(1.0, 0), H(0)]) - assert prog == result_prog + assert str(prog) == str(result_prog) # trotter_order 2 steps 2 prog = trotterize(term_one, term_two, trotter_order=2, trotter_steps=2) @@ -465,7 +465,7 @@ def test_trotterize(): H(0), ] ) - assert prog == result_prog + assert str(prog) == str(result_prog) # trotter_order 3 steps 1 prog = trotterize(term_one, term_two, trotter_order=3, trotter_steps=1) @@ -485,9 +485,10 @@ def test_trotterize(): RZ(2.0, 0), ] ) - assert prog == result_prog + assert str(prog) == str(result_prog) +# TODO: program_unitary rewrite def test_trotterize_order(): def expmi(hermitian_matrix): """Compute the matrix exponential of -1j * hermitian_matrix.""" @@ -681,10 +682,10 @@ def test_from_list(): pterm = PauliTerm.from_list([("X", 0), ("Y", 0)]) -def test_ordered(): +def test_ordered(snapshot): term = sZ(3) * sZ(2) * sZ(1) prog = exponential_map(term)(0.5) - assert prog.out() == "CNOT 3 2\nCNOT 2 1\nRZ(1.0) 1\nCNOT 2 1\nCNOT 3 2\n" + assert str(prog) == snapshot def test_numpy_integer_types(): diff --git a/test/unit/test_paulis_with_placeholders.py b/test/unit/test_paulis_with_placeholders.py index 6f99482cb..42896f041 100644 --- a/test/unit/test_paulis_with_placeholders.py +++ b/test/unit/test_paulis_with_placeholders.py @@ -230,7 +230,7 @@ def test_ps_sub(): b = sX(q0) - 1.0 assert re.match(r"\(1\+0j\)\*Xq\d+ \+ \(-1\+0j\)\*I", str(b)) - +# TODO: Qubit placeholders def test_exponentiate_1(): # test rotation of single qubit q = QubitPlaceholder.register(8) diff --git a/test/unit/test_program.py b/test/unit/test_program.py index 06d2bab7c..21dc38a4f 100644 --- a/test/unit/test_program.py +++ b/test/unit/test_program.py @@ -82,5 +82,5 @@ def test_adding_does_not_mutate(): """ ) p_all = p1 + p2 - assert p1 == original_p1 + assert str(p1) == str(original_p1) assert p1.calibrations != p_all.calibrations diff --git a/test/unit/test_quantum_computer.py b/test/unit/test_quantum_computer.py index b9d66321e..b109d0649 100644 --- a/test/unit/test_quantum_computer.py +++ b/test/unit/test_quantum_computer.py @@ -143,6 +143,7 @@ def test_construct_strength_two_orthogonal_array(): assert np.allclose(_construct_strength_two_orthogonal_array(3), answer) +# TODO: isinstance compatibility def test_measure_bitstrings(client_configuration: QCSClientConfiguration): quantum_processor = NxQuantumProcessor(nx.complete_graph(2)) dummy_compiler = DummyCompiler(quantum_processor=quantum_processor, client_configuration=client_configuration) @@ -188,6 +189,7 @@ def test_check_min_num_trials_for_symmetrized_readout(): # We sometimes narrowly miss the np.mean(parity) < 0.15 assertion, below. Alternatively, that upper # bound could be relaxed. +# TODO: get_classical_adresses implementation @pytest.mark.flaky(reruns=1) def test_run(client_configuration: QCSClientConfiguration): quantum_processor = NxQuantumProcessor(nx.complete_graph(3)) @@ -196,17 +198,17 @@ def test_run(client_configuration: QCSClientConfiguration): qam=QVM(client_configuration=client_configuration, gate_noise=(0.01, 0.01, 0.01)), compiler=DummyCompiler(quantum_processor=quantum_processor, client_configuration=client_configuration), ) - result = qc.run( - Program( - Declare("ro", "BIT", 3), - H(0), - CNOT(0, 1), - CNOT(1, 2), - MEASURE(0, MemoryReference("ro", 0)), - MEASURE(1, MemoryReference("ro", 1)), - MEASURE(2, MemoryReference("ro", 2)), - ).wrap_in_numshots_loop(1000) - ) + p = Program( + Declare("ro", "BIT", 3), + H(0), + CNOT(0, 1), + CNOT(1, 2), + MEASURE(0, MemoryReference("ro", 0)), + MEASURE(1, MemoryReference("ro", 1)), + MEASURE(2, MemoryReference("ro", 2)), + ).wrap_in_numshots_loop(1000) + result = qc.run(p) + print(result) bitstrings = result.readout_data.get("ro") assert bitstrings.shape == (1000, 3) @@ -214,6 +216,7 @@ def test_run(client_configuration: QCSClientConfiguration): assert 0 < np.mean(parity) < 0.15 +# TODO: isintance compatibility def test_run_pyqvm_noiseless(client_configuration: QCSClientConfiguration): quantum_processor = NxQuantumProcessor(nx.complete_graph(3)) qc = QuantumComputer( @@ -233,6 +236,7 @@ def test_run_pyqvm_noiseless(client_configuration: QCSClientConfiguration): assert np.mean(parity) == 0 +# TODO: isinstance compatibility def test_run_pyqvm_noisy(client_configuration: QCSClientConfiguration): quantum_processor = NxQuantumProcessor(nx.complete_graph(3)) qc = QuantumComputer( @@ -252,6 +256,7 @@ def test_run_pyqvm_noisy(client_configuration: QCSClientConfiguration): assert 0 < np.mean(parity) < 0.15 +# TODO: Noisy gates def test_readout_symmetrization(client_configuration: QCSClientConfiguration): quantum_processor = NxQuantumProcessor(nx.complete_graph(3)) noise_model = decoherence_noise_with_asymmetric_ro(quantum_processor.to_compiler_isa()) @@ -417,6 +422,7 @@ def test_qc(client_configuration: QCSClientConfiguration): assert str(qc) == "9q-square-noisy-qvm" +# TODO: Noisy gates def test_qc_run(client_configuration: QCSClientConfiguration): qc = get_qc("9q-square-noisy-qvm", client_configuration=client_configuration) bs = qc.run( @@ -461,6 +467,7 @@ def test_qc_error(client_configuration: QCSClientConfiguration): get_qc("5q", as_qvm=False, client_configuration=client_configuration) +# TODO: Declarations API @pytest.mark.parametrize("param", [np.pi, [np.pi], np.array([np.pi])]) def test_run_with_parameters(client_configuration: QCSClientConfiguration, param): quantum_processor = NxQuantumProcessor(nx.complete_graph(3)) @@ -502,6 +509,7 @@ def test_run_with_bad_parameters(client_configuration: QCSClientConfiguration, p executable.write_memory(region_name="theta", value=param) +# TODO: Declarations API def test_reset(client_configuration: QCSClientConfiguration): quantum_processor = NxQuantumProcessor(nx.complete_graph(3)) qc = QuantumComputer( @@ -540,6 +548,7 @@ def test_get_qvm_with_topology(client_configuration: QCSClientConfiguration): assert min(qc.qubits()) == 5 +# TODO: get_classical_adresses implementation def test_get_qvm_with_topology_2(client_configuration: QCSClientConfiguration): topo = nx.from_edgelist([(5, 6), (6, 7)]) qc = _get_qvm_with_topology( @@ -572,6 +581,7 @@ def test_parse_mix_qvm_and_noisy_flag(): assert noisy +# TODO: noisy gates def test_noisy(client_configuration: QCSClientConfiguration): # https://github.com/rigetti/pyquil/issues/764 p = Program( @@ -607,6 +617,7 @@ def check_random_columns(oa, strength): check_random_columns(oa, strength) +# TODO: Memory management def test_qc_expectation(client_configuration: QCSClientConfiguration, dummy_compiler: DummyCompiler): qc = QuantumComputer(name="testy!", qam=QVM(client_configuration=client_configuration), compiler=dummy_compiler) @@ -642,6 +653,7 @@ def test_qc_expectation(client_configuration: QCSClientConfiguration, dummy_comp assert results[2].total_counts == 40 +# TODO: Memory management def test_qc_expectation_larger_lattice(client_configuration: QCSClientConfiguration, dummy_compiler: DummyCompiler): qc = QuantumComputer(name="testy!", qam=QVM(client_configuration=client_configuration), compiler=dummy_compiler) @@ -686,6 +698,7 @@ def asymmetric_ro_model(qubits: list, p00: float = 0.95, p11: float = 0.90) -> N return NoiseModel([], aprobs) +# TODO: get_classical_adresses implementation def test_qc_calibration_1q(client_configuration: QCSClientConfiguration): # noise model with 95% symmetrized readout fidelity per qubit noise_model = asymmetric_ro_model([0], 0.945, 0.955) @@ -710,6 +723,7 @@ def test_qc_calibration_1q(client_configuration: QCSClientConfiguration): assert results[0].total_counts == 20000 +# TODO: get_classical_adresses implementation def test_qc_calibration_2q(client_configuration: QCSClientConfiguration): # noise model with 95% symmetrized readout fidelity per qubit noise_model = asymmetric_ro_model([0, 1], 0.945, 0.955) @@ -734,6 +748,7 @@ def test_qc_calibration_2q(client_configuration: QCSClientConfiguration): assert results[0].total_counts == 40000 +# TODO: get_classical_adresses implementation def test_qc_joint_expectation(client_configuration: QCSClientConfiguration, dummy_compiler: DummyCompiler): qc = QuantumComputer(name="testy!", qam=QVM(client_configuration=client_configuration), compiler=dummy_compiler) @@ -772,6 +787,7 @@ def test_get_qc_noisy_qpu_error(client_configuration: QCSClientConfiguration, du get_qc("Aspen-8", noisy=True) +# TODO: get_classical_adresses implementation def test_qc_joint_calibration(client_configuration: QCSClientConfiguration): # noise model with 95% symmetrized readout fidelity per qubit noise_model = asymmetric_ro_model([0, 1], 0.945, 0.955) @@ -803,6 +819,7 @@ def test_qc_joint_calibration(client_configuration: QCSClientConfiguration): assert results[0].additional_results[1].total_counts == 40000 +# TODO: get_classical_adresses implementation def test_qc_expectation_on_qvm(client_configuration: QCSClientConfiguration, dummy_compiler: DummyCompiler): # regression test for https://github.com/rigetti/forest-tutorials/issues/2 qc = QuantumComputer(name="testy!", qam=QVM(client_configuration=client_configuration), compiler=dummy_compiler) diff --git a/test/unit/test_quil.py b/test/unit/test_quil.py index 3f1ed15ac..43ff6ff66 100644 --- a/test/unit/test_quil.py +++ b/test/unit/test_quil.py @@ -19,6 +19,7 @@ import numpy as np import pytest +import qcs_sdk.quil.instructions as quil_rs from pyquil.gates import ( I, @@ -75,7 +76,6 @@ address_qubits, get_classical_addresses_from_program, Pragma, - validate_protoquil, validate_supported_quil, ) from pyquil.quilatom import MemoryReference, Parameter, QubitPlaceholder, Sub, quil_cos, quil_sin @@ -92,19 +92,19 @@ from test.unit.utils import parse_equals -def test_gate(): +def test_gate(snapshot): tg = Gate("TEST", qubits=[Qubit(1), Qubit(2)], params=[]) - assert tg.out() == "TEST 1 2" + assert tg.out() == snapshot -def test_defgate(): +def test_defgate(snapshot): dg = DefGate("TEST", np.array([[1.0, 0.0], [0.0, 1.0]])) - assert dg.out() == "DEFGATE TEST:\n 1.0, 0\n 0, 1.0\n" + assert dg.out() == snapshot test = dg.get_constructor() tg = test(Qubit(1), Qubit(2)) - assert tg.out() == "TEST 1 2" + assert tg.out() == snapshot tg = test(1, 2) - assert tg.out() == "TEST 1 2" + assert tg.out() == snapshot def test_defgate_non_square_should_throw_error(): @@ -119,40 +119,47 @@ def test_defgate_non_unitary_should_throw_error(): assert str(error_info.value) == "Matrix must be unitary." -def test_defgate_param(): +def test_defgate_param(snapshot): dgp = DefGate("TEST", [[1.0, 0.0], [0.0, 1.0]]) - assert dgp.out() == "DEFGATE TEST:\n 1.0, 0\n 0, 1.0\n" + assert dgp.out() == snapshot test = dgp.get_constructor() tg = test(Qubit(1)) - assert tg.out() == "TEST 1" + assert tg.out() == snapshot -def test_inst_gates(): +def test_inst_gates(snapshot): p = Program() p.inst(H(0), X(1)) assert len(p) == 2 - assert p.out() == "H 0\nX 1\n" + assert p.out() == snapshot -def test_inst_tuple(): +def test_inst_tuple(snapshot): p = Program() p.inst(("Y", 0), ("X", 1)) assert len(p) == 2 - assert p.out() == "Y 0\nX 1\n" + assert p.out() == snapshot -def test_inst_string(): +def test_inst_rs_gate(snapshot): + p = Program() + q = quil_rs.Qubit.from_fixed(0) + p.inst(quil_rs.Gate("X", [], [q], [])) + assert p.out() == snapshot + + +def test_inst_string(snapshot): p = Program() p.inst("Y 0", "X 1") assert len(p) == 2 - assert p.out() == "Y 0\nX 1\n" + assert p.out() == snapshot -def test_program_pop(): +def test_program_pop(snapshot): prog = Program(X(0), X(1)) instruction = prog.pop() - assert prog.out() == "X 0\n" - assert Program(instruction).out() == "X 1\n" + assert prog.out() == snapshot + assert Program(instruction).out() == snapshot def test_len_zero(): @@ -165,6 +172,7 @@ def test_len_one(): assert len(prog) == 1 +# TODO: if_then, label placeholder method handling def test_len_nested(): p = Program(Declare("ro", "BIT"), H(0)).measure(0, MemoryReference("ro", 0)) q = Program(H(0), CNOT(0, 1)) @@ -172,14 +180,15 @@ def test_len_nested(): assert len(p) == 9 -def test_plus_operator(): +def test_plus_operator(snapshot): p = Program() p += H(0) p += [X(0), Y(0), Z(0)] assert len(p) == 4 - assert p.out() == "H 0\nX 0\nY 0\nZ 0\n" + assert p.out() == snapshot +# TODO: if_then, label placeholder method handling def test_indexing(): program = ( Program(Declare("ro", "BIT"), H(0), Y(1), CNOT(0, 1)) @@ -195,13 +204,13 @@ def test_iteration(): gate_list = [H(0), Y(1), CNOT(0, 1)] program = Program(gate_list) for ii, instruction in enumerate(program): - assert instruction == gate_list[ii] + assert str(instruction) == gate_list[ii].out() # https://github.com/rigetti/pyquil/issues/265 gate_generator = (gate_list[ii] for ii in range(3)) program = Program(gate_generator) for ii, instruction in enumerate(program): - assert instruction == gate_list[ii] + assert str(instruction) == gate_list[ii].out() def test_program_plus_program(): @@ -216,19 +225,18 @@ def test_program_plus_program(): assert r.out() == "X 0\nY 0\n" -def test_program_tuple(): +def test_program_tuple(snapshot): p = Program() p.inst(("Y", 0), ("X", 1)) assert len(p) == 2 - assert p.out() == "Y 0\nX 1\n" + assert p.out() == snapshot -def test_program_string(): +def test_program_string(snapshot): p = Program() p.inst("Y 0", "X 1") assert len(p.instructions) == 2 - assert p.instructions == [Y(0), X(1)] - assert p.out() == "Y 0\nX 1\n" + assert p.out() == snapshot def test_program_slice(): @@ -236,12 +244,13 @@ def test_program_slice(): assert isinstance(p[1:], Program) -def test_prog_init(): +def test_prog_init(snapshot): p = Program() p.inst(Declare("ro", "BIT"), X(0)).measure(0, MemoryReference("ro", 0)) - assert p.out() == ("DECLARE ro BIT[1]\nX 0\nMEASURE 0 ro[0]\n") + assert p.out() == snapshot +# TODO: declarations API def test_classical_regs(): p = Program() p.inst( @@ -249,19 +258,19 @@ def test_classical_regs(): Declare("reg", "BIT", 2), X(0), ).measure(0, MemoryReference("reg", 1)) - assert p.out() == "DECLARE ro BIT[2]\nDECLARE reg BIT[2]\nX 0\nMEASURE 0 reg[1]\n" + assert p.out() == "DECLARE reg BIT[2]\nDECLARE ro BIT[2]\nX 0\nMEASURE 0 reg[1]\n" assert p.declarations == { "ro": Declare("ro", "BIT", 2), "reg": Declare("reg", "BIT", 2), } -def test_simple_instructions(): +def test_simple_instructions(snapshot): p = Program().inst(HALT, WAIT, RESET(), NOP) - assert p.out() == "HALT\nWAIT\nRESET\nNOP\n" + assert p.out() == snapshot -def test_unary_classicals(): +def test_unary_classicals(snapshot): p = Program() p.inst( MOVE(MemoryReference("ro", 0), 1), @@ -269,10 +278,10 @@ def test_unary_classicals(): NOT(MemoryReference("ro", 2)), NEG(MemoryReference("ro", 3)), ) - assert p.out() == "MOVE ro[0] 1\nMOVE ro[1] 0\nNOT ro[2]\nNEG ro[3]\n" + assert p.out() == snapshot -def test_binary_classicals(): +def test_binary_classicals(snapshot): p = Program() p.inst( @@ -288,21 +297,10 @@ def test_binary_classicals(): EXCHANGE(MemoryReference("ro", 0), MemoryReference("ro", 1)), ) - assert ( - p.out() == "AND ro[0] ro[1]\n" - "MOVE ro[0] ro[1]\n" - "CONVERT ro[0] ro[1]\n" - "IOR ro[0] ro[1]\n" - "XOR ro[0] ro[1]\n" - "ADD ro[0] ro[1]\n" - "SUB ro[0] ro[1]\n" - "MUL ro[0] ro[1]\n" - "DIV ro[0] ro[1]\n" - "EXCHANGE ro[0] ro[1]\n" - ) + assert p.out() == snapshot -def test_memory_reference_unpacking(): +def test_memory_reference_unpacking(snapshot): p = Program() p.inst( @@ -318,21 +316,10 @@ def test_memory_reference_unpacking(): EXCHANGE("ro", ("ro", 1)), ) - assert ( - p.out() == "AND ro[0] ro[1]\n" - "MOVE ro[0] ro[1]\n" - "CONVERT ro[0] ro[1]\n" - "IOR ro[0] ro[1]\n" - "XOR ro[0] ro[1]\n" - "ADD ro[0] ro[1]\n" - "SUB ro[0] ro[1]\n" - "MUL ro[0] ro[1]\n" - "DIV ro[0] ro[1]\n" - "EXCHANGE ro[0] ro[1]\n" - ) + assert p.out() == snapshot -def test_ternary_classicals(): +def test_ternary_classicals(snapshot): p = Program() p.inst( LOAD(MemoryReference("ro", 0), "ro", MemoryReference("n", 0)), @@ -355,49 +342,29 @@ def test_ternary_classicals(): LT(MemoryReference("ro", 0), MemoryReference("ro", 1), 4.4), LT(MemoryReference("ro", 0), MemoryReference("ro", 1), MemoryReference("ro", 4)), ) - assert ( - p.out() == "LOAD ro[0] ro n[0]\n" - "STORE ro n[0] ro[0]\n" - "STORE ro n[0] 0\n" - "STORE ro n[0] 0.1\n" - "EQ ro[0] ro[1] 0\n" - "EQ ro[0] ro[1] 0.0\n" - "EQ ro[0] ro[1] ro[0]\n" - "GE ro[0] ro[1] 1\n" - "GE ro[0] ro[1] 1.1\n" - "GE ro[0] ro[1] ro[1]\n" - "GT ro[0] ro[1] 2\n" - "GT ro[0] ro[1] 2.2\n" - "GT ro[0] ro[1] ro[2]\n" - "LE ro[0] ro[1] 3\n" - "LE ro[0] ro[1] 3.3\n" - "LE ro[0] ro[1] ro[3]\n" - "LT ro[0] ro[1] 4\n" - "LT ro[0] ro[1] 4.4\n" - "LT ro[0] ro[1] ro[4]\n" - ) + assert p.out() == snapshot -def test_measurement_calls(): +def test_measurement_calls(snapshot): p = Program() p.inst( Declare("ro", "BIT", 2), MEASURE(0, MemoryReference("ro", 1)), MEASURE(0, MemoryReference("ro", 1)), ) - assert p.out() == ("DECLARE ro BIT[2]\nMEASURE 0 ro[1]\nMEASURE 0 ro[1]\n") + assert p.out() == snapshot -def test_measure_all(): +def test_measure_all(snapshot): p = Program() mem = p.declare("ro", memory_size=4) p.measure_all((0, mem[0]), (1, mem[1]), (2, mem[3])) - assert p.out() == "DECLARE ro BIT[4]\nMEASURE 0 ro[0]\nMEASURE 1 ro[1]\nMEASURE 2 ro[3]\n" + assert p.out() == snapshot p = Program([H(idx) for idx in range(4)]) p.measure_all() for idx in range(4): - assert p[idx + 5] == MEASURE(idx, MemoryReference("ro", idx)) + assert str(p[idx + 4]) == MEASURE(idx, MemoryReference("ro", idx)).out() p = Program() p.measure_all() @@ -426,13 +393,13 @@ def test_dagger(): p += PHASE(pi, target).controlled(control) p += CNOT(cnot_control, target).controlled(control) - for instr, instr_dagger in zip(reversed(p._instructions), p.dagger()._instructions): - assert "DAGGER " + instr.out() == instr_dagger.out() + for instr, instr_dagger in zip(reversed(p.instructions), p.dagger().instructions): + assert "DAGGER " + str(instr) == str(instr_dagger) -def test_construction_syntax(): +def test_construction_syntax(snapshot): p = Program().inst(Declare("ro", "BIT", 2), X(0), Y(1), Z(0)).measure(0, MemoryReference("ro", 1)) - assert p.out() == ("DECLARE ro BIT[2]\nX 0\nY 1\nZ 0\nMEASURE 0 ro[1]\n") + assert p.out() == snapshot p = ( Program() .inst(Declare("ro", "BIT", 3), X(0)) @@ -440,7 +407,7 @@ def test_construction_syntax(): .measure(0, MemoryReference("ro", 1)) .inst(MEASURE(1, MemoryReference("ro", 2))) ) - assert p.out() == ("DECLARE ro BIT[3]\nX 0\nY 1\nMEASURE 0 ro[1]\nMEASURE 1 ro[2]\n") + assert p.out() == snapshot p = ( Program() .inst(Declare("ro", "BIT", 2), X(0)) @@ -448,25 +415,25 @@ def test_construction_syntax(): .inst(Y(1), X(0)) .measure(0, MemoryReference("ro", 0)) ) - assert p.out() == ("DECLARE ro BIT[2]\nX 0\nMEASURE 0 ro[1]\nY 1\nX 0\nMEASURE 0 ro[0]\n") + assert p.out() == snapshot -def test_singles(): +def test_singles(snapshot): p = Program(I(0), X(0), Y(1), Z(1), H(2), T(2), S(1)) - assert p.out() == "I 0\nX 0\nY 1\nZ 1\nH 2\nT 2\nS 1\n" + assert p.out() == snapshot -def test_rotations(): +def test_rotations(snapshot): p = Program(RX(0.5, 0), RY(0.1, 1), RZ(1.4, 2)) - assert p.out() == "RX(0.5) 0\nRY(0.1) 1\nRZ(1.4) 2\n" + assert p.out() == snapshot -def test_controlled_gates(): +def test_controlled_gates(snapshot): p = Program(CNOT(0, 1), CCNOT(0, 1, 2)) - assert p.out() == "CNOT 0 1\nCCNOT 0 1 2\n" + assert p.out() == snapshot -def test_phases(): +def test_phases(snapshot): p = Program( PHASE(np.pi, 1), CPHASE00(np.pi, 0, 1), @@ -474,24 +441,25 @@ def test_phases(): CPHASE10(np.pi, 0, 1), CPHASE(np.pi, 0, 1), ) - assert p.out() == "PHASE(pi) 1\nCPHASE00(pi) 0 1\n" "CPHASE01(pi) 0 1\nCPHASE10(pi) 0 1\n" "CPHASE(pi) 0 1\n" + assert p.out() == snapshot -def test_swaps(): +def test_swaps(snapshot): p = Program(SWAP(0, 1), CSWAP(0, 1, 2), ISWAP(0, 1), PSWAP(np.pi, 0, 1)) - assert p.out() == "SWAP 0 1\nCSWAP 0 1 2\nISWAP 0 1\nPSWAP(pi) 0 1\n" + assert p.out() == snapshot -def test_def_gate(): +def test_def_gate(snapshot): # First we define the new gate from a matrix sqrt_x = np.array([[0.5 + 0.5j, 0.5 - 0.5j], [0.5 - 0.5j, 0.5 + 0.5j]]) p = Program().defgate("SQRT-X", sqrt_x) # Then we can use the new gate p.inst(("SQRT-X", 0)) - assert p.out() == "DEFGATE SQRT-X:\n 0.5+0.5i, 0.5-0.5i\n 0.5-0.5i, 0.5+0.5i\n\nSQRT-X 0\n" + assert p.out() == snapshot +# TODO: Parameterized DEFGATE parsing fix, instruction constructors def test_def_gate_with_parameters(): theta = Parameter("theta") rx = np.array( @@ -514,7 +482,7 @@ def test_def_gate_with_parameters(): assert p.out() == "MY_RX(pi) 0\n" -def test_multiqubit_gate(): +def test_multiqubit_gate(snapshot): # A multi-qubit defgate example x_gate_matrix = np.array(([0.0, 1.0], [1.0, 0.0])) sqrt_x = np.array([[0.5 + 0.5j, 0.5 - 0.5j], [0.5 - 0.5j, 0.5 + 0.5j]]) @@ -524,15 +492,10 @@ def test_multiqubit_gate(): # Then we can use the new gate p.inst(("X-SQRT-X", 0, 1)) - assert ( - p.out() == "DEFGATE X-SQRT-X:\n 0.0, 0.5+0.5i, 0.0, 0.5-0.5i\n " - "0.5+0.5i, 0.0, 0.5-0.5i, 0.0\n " - "0.0, 0.5-0.5i, 0.0, 0.5+0.5i\n " - "0.5-0.5i, 0.0, 0.5+0.5i, 0.0\n\nX-SQRT-X 0 1\n" - ) + assert p.out() == snapshot -def test_define_qft(): +def test_define_qft(snapshot): def qft3(q0, q1, q2): p = Program() p.inst( @@ -551,9 +514,10 @@ def qft3(q0, q1, q2): prog = state_prep + qft3(0, 1, 2) output = prog.out() - assert output == "X 0\nH 2\nCPHASE(pi/2) 1 2\nH 1\nCPHASE(pi/4) 0 " "2\nCPHASE(pi/2) 0 1\nH 0\nSWAP 0 2\n" + assert output == snapshot +# TODO: Rework control flow methods def test_control_flows(): outer_loop = Program() classical_flag_register = outer_loop.declare("classical_flag_register", "BIT") @@ -581,6 +545,7 @@ def test_control_flows(): ) +# TODO: Rework control flow methods def test_control_flows_2(): # create a program that branches based on the value of a classical register x_prog = Program(X(0)) @@ -604,6 +569,7 @@ def test_control_flows_2(): ) +# TODO: Rework control flow methods def test_if_option(): p = ( Program(Declare("ro", "BIT", 1), X(0)) @@ -624,6 +590,7 @@ def test_if_option(): assert isinstance(p.instructions[3], JumpWhen) +# TODO: Instruction constructors def test_qubit_placeholder(): p = Program() @@ -645,6 +612,7 @@ def test_qubit_placeholder(): assert e.match(r"Qubit q\d+ has not been assigned an index") +# TODO: Instruction constructors def test_qubit_placeholder_2(): p = Program() @@ -666,6 +634,7 @@ def test_qubit_placeholder_2(): assert e.match("Your program mixes instantiated qubits with placeholders") +# TODO: Instruction constructors def test_qubit_placeholder_new(): p = Program() @@ -688,6 +657,7 @@ def test_qubit_placeholder_new(): assert p.out() == "H 0\nCNOT 1 3\nH 2\nX 4\n" +# TODO: Instruction constructors def test_multiaddress(): p = Program() q0, q1 = [QubitPlaceholder() for _ in range(2)] @@ -708,6 +678,7 @@ def test_multiaddress(): assert p2.out() == "CNOT 9 10\nRZ(1.0) 10\nCNOT 9 10\n" +# TODO: address_qubits should defer to quil-py program def test_multiple_instantiate(): p = Program() q = QubitPlaceholder() @@ -717,6 +688,7 @@ def test_multiple_instantiate(): assert p.out() == "H 0\n" +# TODO: How to handle Placeholders def test_reuse_placeholder(): p = Program() q1 = QubitPlaceholder() @@ -728,6 +700,7 @@ def test_reuse_placeholder(): assert p.out() == "H 0\nH 1\nCNOT 0 1\n" +# TODO: DEFGATE param parsing fix def test_pauli_gate(): s = """DEFGATE U(%beta) p q AS PAULI-SUM: ZZ(-1*%beta/4) p q @@ -744,6 +717,7 @@ def test_pauli_gate(): assert p.out() == s +# TODO: Deprecate or migrate program merging logic to quil-rs def test_prog_merge(): prog_0 = Program(X(0)) prog_1 = Program(Y(0)) @@ -757,8 +731,8 @@ def test_prog_merge(): assert ( merge_programs([prog_0, prog_1]).out() == """DEFGATE test: - 1.0, 0 - 0, 1.0 + 1, 0 + 0, 1 X 0 test 0 @@ -831,28 +805,14 @@ def test_prog_merge(): ) -def test_merge_with_pauli_noise(): +def test_merge_with_pauli_noise(snapshot): p = Program(X(0)).inst(Z(0)) probs = [0.0, 1.0, 0.0, 0.0] merged = merge_with_pauli_noise(p, probs, [0]) - assert ( - merged.out() - == """DEFGATE pauli_noise: - 1.0, 0 - 0, 1.0 - -PRAGMA ADD-KRAUS pauli_noise 0 "(0.0 0.0 0.0 0.0)" -PRAGMA ADD-KRAUS pauli_noise 0 "(0.0 1.0 1.0 0.0)" -PRAGMA ADD-KRAUS pauli_noise 0 "(0.0 0.0 0.0 0.0)" -PRAGMA ADD-KRAUS pauli_noise 0 "(0.0 0.0 0.0 -0.0)" -X 0 -pauli_noise 0 -Z 0 -pauli_noise 0 -""" - ) + assert merged.out() == snapshot +# TODO: Placeholders def test_get_qubits(): pq = Program(Declare("ro", "BIT"), X(0), CNOT(0, 4), MEASURE(5, MemoryReference("ro", 0))) assert pq.get_qubits() == {0, 4, 5} @@ -874,17 +834,20 @@ def test_get_qubits(): assert e.match("Your program mixes instantiated qubits with placeholders") +# TODO: Placeholders def test_get_qubit_placeholders(): qs = QubitPlaceholder.register(8) pq = Program(Declare("ro", "BIT"), X(qs[0]), CNOT(qs[0], qs[4]), MEASURE(qs[5], MemoryReference("ro", 0))) assert pq.get_qubits() == {qs[i] for i in [0, 4, 5]} +# TODO: Instruction constructors def test_get_qubits_not_as_indices(): pq = Program(Declare("ro", "BIT"), X(0), CNOT(0, 4), MEASURE(5, MemoryReference("ro", 0))) assert pq.get_qubits(indices=False) == {Qubit(i) for i in [0, 4, 5]} +# TODO: Qubit placeholders def test_eq(): p1 = Program() q1 = QubitPlaceholder() @@ -899,7 +862,7 @@ def test_eq(): assert not p1 != p2 -def test_kraus(): +def test_kraus(snapshot): pq = Program(X(0)) pq.define_noisy_gate("X", (0,), [[[0.0, 1.0], [1.0, 0.0]], [[0.0, 0.0], [0.0, 0.0]]]) pq.inst(X(1)) @@ -934,13 +897,7 @@ def test_kraus(): pq_nn.no_noise() pq_nn.inst(X(1)) - assert ( - pq_nn.out() - == """X 0 -PRAGMA NO-NOISE -X 1 -""" - ) + assert pq_nn.out() == snapshot def test_define_noisy_readout(): @@ -979,6 +936,7 @@ def test_define_noisy_readout(): pq.define_noisy_readout(1.0, 0.5, 0.5) +# TODO: Control flow methods rework # https://github.com/rigetti/pyquil/issues/72 def test_if_then_inherits_defined_gates(): p1 = Program() @@ -998,6 +956,7 @@ def test_if_then_inherits_defined_gates(): assert p3.defined_gates[0] in p1.defined_gates +# TODO: Placeholders # https://github.com/rigetti/pyquil/issues/124 def test_allocating_qubits_on_multiple_programs(): p = Program() @@ -1019,6 +978,7 @@ def test_installing_programs_inside_other_programs(): assert len(p) == 0 +# TODO: Control flow methods rework # https://github.com/rigetti/pyquil/issues/168 def test_nesting_a_program_inside_itself(): p = Program(H(0)).measure(0, MemoryReference("ro", 0)) @@ -1026,6 +986,7 @@ def test_nesting_a_program_inside_itself(): p.if_then(MemoryReference("ro", 0), p) +# TODO: Placeholders # https://github.com/rigetti/pyquil/issues/170 def test_inline_placeholder(): p = Program() @@ -1039,6 +1000,7 @@ def test_defgate_integer_input(): assert dg.out() == "DEFGATE TEST:\n 1, 0\n 0, 1\n" +# TODO: Placeholders def test_out_vs_str(): qs = QubitPlaceholder.register(6) pq = Program( @@ -1057,6 +1019,7 @@ def test_out_vs_str(): assert re.fullmatch(should_be_re, string_version, flags=re.MULTILINE) +# TODO: Re-implement get_classical_addresses_from_program def test_get_classical_addresses_from_program(): p = Program(Declare("ro", "BIT", 4), [H(i) for i in range(4)]) assert get_classical_addresses_from_program(p) == {} @@ -1065,6 +1028,7 @@ def test_get_classical_addresses_from_program(): assert get_classical_addresses_from_program(p) == {"ro": [0, 1, 3]} +# TODO: Re-implement get_classical_addresses_from_program def test_get_classical_addresses_from_quil_program(): """ Tests that can get_classical_addresses_from_program can handle both MEASURE @@ -1078,6 +1042,7 @@ def test_get_classical_addresses_from_quil_program(): assert get_classical_addresses_from_program(p) == {"ro": [1]} +# TODO: Placeholders def test_pragma_with_placeholders(): q = QubitPlaceholder() q2 = QubitPlaceholder() @@ -1109,6 +1074,7 @@ def test_declare(): assert program.out() == ("DECLARE read_out BIT[5]\nMEASURE 0 read_out[4]\n") +# TODO: Placeholders def test_reset(): p = Program() p.reset(0) @@ -1127,17 +1093,17 @@ def test_reset(): assert program.out() == "X 0\nRESET 0\n" -def test_copy(): +def test_copy(snapshot): prog1 = Program(H(0), CNOT(0, 1)) prog2 = prog1.copy().measure_all() - assert prog1.out() == "\n".join(["H 0", "CNOT 0 1", ""]) - assert prog2.out() == "\n".join(["H 0", "CNOT 0 1", "DECLARE ro BIT[2]", "MEASURE 0 ro[0]", "MEASURE 1 ro[1]", ""]) + assert prog1.out() == snapshot + assert prog2.out() == snapshot -def test_measure_all_noncontig(): +def test_measure_all_noncontig(snapshot): prog = Program(H(0), H(10)) prog.measure_all() - assert prog.out() == "\n".join(["H 0", "H 10", "DECLARE ro BIT[11]", "MEASURE 0 ro[0]", "MEASURE 10 ro[10]", ""]) + assert prog.out() == snapshot def test_validate_supported_quil_reset_first(): @@ -1161,11 +1127,13 @@ def test_validate_supported_quil_measure_last(): assert not prog.is_supported_on_qpu() +# TODO: Fix PRAGMA DELAY parsing def test_validate_supported_quil_with_pragma(): prog = Program(RESET(), H(1), Pragma("DELAY"), MEASURE(1, None)) assert prog.is_supported_on_qpu() +# TODO: Re-write validate_supported_quil def test_validate_supported_quil_suite(): validate_supported_quil( Program( @@ -1265,38 +1233,21 @@ def test_validate_supported_quil_suite(): ) +# TODO: Re-write validate_supported_quil def test_validate_supported_quil_multiple_measures(): prog = Program(RESET(), H(1), Pragma("DELAY"), MEASURE(1, None), MEASURE(1, None)) with pytest.raises(ValueError): validate_supported_quil(prog) +# is_protoquil was deprecated and should always return True def test_is_protoquil(): - prog = Program(Declare("ro", "BIT"), MEASURE(1, MemoryReference("ro", 0)), H(1), RESET()) - validate_protoquil(prog) + prog = Program(RESET(), H(1), Pragma("DELAY"), MEASURE(1, None), MEASURE(1, None)) assert prog.is_protoquil() - - prog = ( - Program(Declare("ro", "BIT"), H(0), Y(1), CNOT(0, 1)) - .measure(0, MemoryReference("ro", 0)) - .if_then(MemoryReference("ro", 0), Program(X(0)), Program()) - ) - with pytest.raises(ValueError): - validate_protoquil(prog) - assert not prog.is_protoquil() - - prog = Program(Declare("ro", "BIT"), ClassicalNot(MemoryReference("ro", 0))) - with pytest.raises(ValueError): - validate_protoquil(prog) - assert not prog.is_protoquil() - - prog = Program(DefCalibration("I", [], [Qubit(0)], []), I(0)) - with pytest.raises(ValueError): - validate_protoquil(prog) - assert not prog.is_protoquil() assert prog.is_protoquil(quilt=True) +# TODO: Subtract memory regions def test_subtracting_memory_regions(): # https://github.com/rigetti/pyquil/issues/709 p = Program() @@ -1323,6 +1274,7 @@ def test_memory_reference_iteration(): assert len([i for i in r]) == 10 +# TODO: Placeholders def test_placeholders_preserves_modifiers(): cs = QubitPlaceholder.register(3) ts = QubitPlaceholder.register(1) @@ -1341,6 +1293,7 @@ def _eval_as_np_pi(exp): return eval(exp.replace("pi", repr(np.pi)).replace("theta[0]", "1")) +# TODO: Instruction API def test_params_pi_and_precedence(): trivial_pi = "3 * theta[0] / (2 * pi)" prog = Program(f"RX({trivial_pi}) 0") diff --git a/test/unit/test_quilbase.py b/test/unit/test_quilbase.py new file mode 100644 index 000000000..4b999536a --- /dev/null +++ b/test/unit/test_quilbase.py @@ -0,0 +1,73 @@ +from math import pi +from typing import List +from pyquil.quil import Program +from pyquil.quilbase import Gate, MemoryReference, ParameterDesignator +from pyquil.quilatom import BinaryExp, Qubit +from pyquil.api._compiler import QPUCompiler +import pytest + + +@pytest.mark.parametrize( + ("name", "params", "qubits"), + [ + ("X", [], [Qubit(0)]), + ("CPHASE", [pi / 2], [Qubit(0), Qubit(1)]), + ("RZ", [MemoryReference("theta", 0, 1)], [Qubit(0)]), + ("RZ", [MemoryReference("alpha", 0) - MemoryReference("beta")], [Qubit(0)]), + ], + ids=("X-Gate", "CPHASE-Expression", "RZ-MemoryReference", "RZ-MemoryReference-Expression"), +) +class TestGate: + @pytest.fixture + def gate(self, name, params, qubits) -> Gate: + return Gate(name, params, qubits) + + @pytest.fixture + def program(self, params, gate) -> Program: + """Creates a valid quil program using the gate and declaring memory regions for any of it's parameters""" + program = Program(gate) + for param in params: + if isinstance(param, MemoryReference): + program.declare(param.name, "REAL", param.declared_size or 1) + if isinstance(param, BinaryExp): + if isinstance(param.op1, MemoryReference): + program.declare(param.op1.name, "REAL", param.op1.declared_size or 1) + if isinstance(param.op2, MemoryReference): + program.declare(param.op2.name, "REAL", param.op2.declared_size or 1) + + return program + + def test_str(self, gate, snapshot): + assert str(gate) == snapshot + + def test_name(self, gate, name): + assert gate.name == name + + def test_params(self, gate, params): + assert gate.params == params + + def test_qubits(self, gate, qubits): + assert gate.qubits == qubits + + def test_get_qubits(self, gate, qubits): + assert gate.get_qubit_indices() == {q.index for q in qubits} + assert gate.get_qubits(indices=False) == set(qubits) + + def test_controlled_modifier(self, gate, snapshot): + assert str(gate.controlled([Qubit(5)])) == snapshot + + def test_dagger_modifier(self, gate, snapshot): + assert str(gate.dagger()) == snapshot + + def test_forked_modifier(self, gate, params, snapshot): + alt_params: List[ParameterDesignator] = [n for n in range(len(params))] + assert str(gate.forked(Qubit(5), alt_params)) == snapshot + + def test_repr(self, gate, snapshot): + assert repr(gate) == snapshot + + def test_compile(self, program, compiler: QPUCompiler): + try: + compiler.quil_to_native_quil(program) + except Exception as e: + assert False, f"Failed to compile the program: {e}\n{program}" diff --git a/test/unit/test_quilt.py b/test/unit/test_quilt.py index d74d93b32..5b966ed7b 100644 --- a/test/unit/test_quilt.py +++ b/test/unit/test_quilt.py @@ -80,6 +80,7 @@ def _match(cal, instr): return match_calibration(instr, cal) +# TODO: Calibration API: match calibration def test_simple_gate_calibration_match(): matches = [ ("DEFCAL X 0", "X 0"), @@ -104,6 +105,7 @@ def test_simple_gate_calibration_match(): assert _match(cal, instr) is None +# TODO: Calibration API: match calibration def test_parametric_calibration_match(): matches = [ ("DEFCAL RX(0.0) 0", "RX(0.0) 0"), @@ -134,6 +136,7 @@ def test_memory_reference_parameter(): assert _match("DEFCAL RX(%theta) q", "DECLARE theta REAL\nRZ(theta) 0") is None +# TODO: Calibration API: match calibration def test_measure_calibration_match(): matches = [ ("DEFCAL MEASURE 0", "MEASURE 0"), @@ -190,6 +193,7 @@ def test_program_match_last(): assert match == CalibrationMatch(cal=second, settings={}) +# TODO: Calibrate single instructions @pytest.mark.parametrize( "program_input,gate,program_output", [