From 7c8afc6c21ce014d52b96933ccca68cc77cfa218 Mon Sep 17 00:00:00 2001 From: pablosuvi Date: Fri, 24 Jul 2026 09:36:21 +0100 Subject: [PATCH 1/4] Add pytest to .toml file and modify import ordering --- pyproject.toml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 7977071..c2b1acf 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -23,8 +23,8 @@ dependencies = [ "pandas", "qkernel4eo", "qutip", - "scipy", - "scikit-learn" + "scikit-learn", + "scipy" ] @@ -39,6 +39,7 @@ qkernel4eo = { git = "ssh://git@github.com/ICHEC/qkernel4eo.git" } [dependency-groups] dev = [ + "ipykernel", + "pytest", "ruff", - "ipykernel" ] From 742ca23d00b9b863a17e8a9560d9c471542e1c5c Mon Sep 17 00:00:00 2001 From: pablosuvi Date: Fri, 24 Jul 2026 09:37:39 +0100 Subject: [PATCH 2/4] Uv sync --- uv.lock | 215 +++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 214 insertions(+), 1 deletion(-) diff --git a/uv.lock b/uv.lock index b754aee..986b182 100644 --- a/uv.lock +++ b/uv.lock @@ -1333,7 +1333,8 @@ name = "exceptiongroup" version = "1.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "typing-extensions", version = "4.16.0", source = { registry = "https://pypi.org/simple" } }, + { name = "typing-extensions", version = "4.13.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9' or python_full_version >= '3.11'" }, + { name = "typing-extensions", version = "4.16.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9' and python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } wheels = [ @@ -1751,6 +1752,45 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a4/ed/1f1afb2e9e7f38a545d628f864d562a5ae64fe6f7a10e28ffb9b185b4e89/importlib_resources-6.5.2-py3-none-any.whl", hash = "sha256:789cfdc3ed28c78b67a06acb8126751ced69a3d5f79c095a98298cd8a760ccec", size = 37461, upload-time = "2025-01-03T18:51:54.306Z" }, ] +[[package]] +name = "iniconfig" +version = "2.1.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.9.2' and python_full_version < '3.10'", + "python_full_version > '3.9' and python_full_version < '3.9.2'", + "python_full_version == '3.9'", + "python_full_version < '3.9'", +] +sdist = { url = "https://files.pythonhosted.org/packages/f2/97/ebf4da567aa6827c909642694d71c9fcf53e5b504f2d96afea02718862f3/iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7", size = 4793, upload-time = "2025-03-19T20:09:59.721Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760", size = 6050, upload-time = "2025-03-19T20:10:01.071Z" }, +] + +[[package]] +name = "iniconfig" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and sys_platform == 'emscripten'", + "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.12.*' and sys_platform == 'win32'", + "python_full_version == '3.12.*' and sys_platform == 'emscripten'", + "python_full_version == '3.12.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and sys_platform == 'emscripten'", + "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.10.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, +] + [[package]] name = "ipykernel" version = "6.29.5" @@ -4834,6 +4874,45 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/81/e6/cd9575ac904136b3cbf7aa7ee819ef86eedb7274e46f230e94ea4342e729/platformdirs-4.10.0-py3-none-any.whl", hash = "sha256:fb516cdb12eb0d857d0cd85a7c57cea4d060bee4578d6cf5a14dfdf8cbf8784a", size = 22743, upload-time = "2026-05-28T03:32:52.175Z" }, ] +[[package]] +name = "pluggy" +version = "1.5.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.9'", +] +sdist = { url = "https://files.pythonhosted.org/packages/96/2d/02d4312c973c6050a18b314a5ad0b3210edb65a906f868e31c111dede4a6/pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1", size = 67955, upload-time = "2024-04-20T21:34:42.531Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669", size = 20556, upload-time = "2024-04-20T21:34:40.434Z" }, +] + +[[package]] +name = "pluggy" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and sys_platform == 'emscripten'", + "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.12.*' and sys_platform == 'win32'", + "python_full_version == '3.12.*' and sys_platform == 'emscripten'", + "python_full_version == '3.12.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and sys_platform == 'emscripten'", + "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.10.*'", + "python_full_version >= '3.9.2' and python_full_version < '3.10'", + "python_full_version > '3.9' and python_full_version < '3.9.2'", + "python_full_version == '3.9'", +] +sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, +] + [[package]] name = "ply" version = "3.11" @@ -5125,6 +5204,82 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl", hash = "sha256:850ba148bd908d7e2411587e247a1e4f0327839c40e2e5e6d05a007ecc69911d", size = 122781, upload-time = "2026-01-21T03:57:55.912Z" }, ] +[[package]] +name = "pytest" +version = "8.3.5" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.9'", +] +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "exceptiongroup" }, + { name = "iniconfig", version = "2.1.0", source = { registry = "https://pypi.org/simple" } }, + { name = "packaging" }, + { name = "pluggy", version = "1.5.0", source = { registry = "https://pypi.org/simple" } }, + { name = "tomli" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ae/3c/c9d525a414d506893f0cd8a8d0de7706446213181570cdbd766691164e40/pytest-8.3.5.tar.gz", hash = "sha256:f4efe70cc14e511565ac476b57c279e12a855b11f48f212af1080ef2263d3845", size = 1450891, upload-time = "2025-03-02T12:54:54.503Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/30/3d/64ad57c803f1fa1e963a7946b6e0fea4a70df53c1a7fed304586539c2bac/pytest-8.3.5-py3-none-any.whl", hash = "sha256:c69214aa47deac29fad6c2a4f590b9c4a9fdb16a403176fe154b79c0b4d4d820", size = 343634, upload-time = "2025-03-02T12:54:52.069Z" }, +] + +[[package]] +name = "pytest" +version = "8.4.2" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.9.2' and python_full_version < '3.10'", + "python_full_version > '3.9' and python_full_version < '3.9.2'", + "python_full_version == '3.9'", +] +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "exceptiongroup" }, + { name = "iniconfig", version = "2.1.0", source = { registry = "https://pypi.org/simple" } }, + { name = "packaging" }, + { name = "pluggy", version = "1.6.0", source = { registry = "https://pypi.org/simple" } }, + { name = "pygments", version = "2.20.0", source = { registry = "https://pypi.org/simple" } }, + { name = "tomli" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a3/5c/00a0e072241553e1a7496d638deababa67c5058571567b92a7eaa258397c/pytest-8.4.2.tar.gz", hash = "sha256:86c0d0b93306b961d58d62a4db4879f27fe25513d4b969df351abdddb3c30e01", size = 1519618, upload-time = "2025-09-04T14:34:22.711Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a8/a4/20da314d277121d6534b3a980b29035dcd51e6744bd79075a6ce8fa4eb8d/pytest-8.4.2-py3-none-any.whl", hash = "sha256:872f880de3fc3a5bdc88a11b39c9710c3497a547cfa9320bc3c5e62fbf272e79", size = 365750, upload-time = "2025-09-04T14:34:20.226Z" }, +] + +[[package]] +name = "pytest" +version = "9.1.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and sys_platform == 'emscripten'", + "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.12.*' and sys_platform == 'win32'", + "python_full_version == '3.12.*' and sys_platform == 'emscripten'", + "python_full_version == '3.12.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and sys_platform == 'emscripten'", + "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.10.*'", +] +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, + { name = "iniconfig", version = "2.3.0", source = { registry = "https://pypi.org/simple" } }, + { name = "packaging" }, + { name = "pluggy", version = "1.6.0", source = { registry = "https://pypi.org/simple" } }, + { name = "pygments", version = "2.20.0", source = { registry = "https://pypi.org/simple" } }, + { name = "tomli", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e4/47/b9efed96c114afcfa3c9d3fe98a76a1d14c74a9e266d397cf6eb64be5e01/pytest-9.1.1.tar.gz", hash = "sha256:1088fbde8f2b49d95a549a195707afa7a76a3ce9bcadc26b6d71f0ffda5fe313", size = 1636369, upload-time = "2026-06-19T10:58:32.857Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/24/25/1de2678b631f5a49215c6c96fff41ba892b0a34df68d6d80292b1b48aa7f/pytest-9.1.1-py3-none-any.whl", hash = "sha256:37a86b45efb9a47a61a36449063e8e18d0cab3161329fc099eb21783169c4f0c", size = 386536, upload-time = "2026-06-19T10:58:31.347Z" }, +] + [[package]] name = "python-dateutil" version = "2.9.0.post0" @@ -7198,6 +7353,9 @@ dev = [ { name = "ipykernel", version = "6.29.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, { name = "ipykernel", version = "6.31.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, { name = "ipykernel", version = "7.3.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "pytest", version = "8.3.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "pytest", version = "8.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "pytest", version = "9.1.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, { name = "ruff" }, ] @@ -7215,6 +7373,7 @@ requires-dist = [ [package.metadata.requires-dev] dev = [ { name = "ipykernel" }, + { name = "pytest" }, { name = "ruff" }, ] @@ -8749,6 +8908,60 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c8/e8/d381de4a3cc4e3682cba0338f43250893508aad0b310af1d0635f7b04413/tifffile-2026.7.14-py3-none-any.whl", hash = "sha256:4eb20372e76edf2c9fed922b1e3a0a0567be3560bd2008336115763bb1f3c034", size = 270614, upload-time = "2026-07-14T23:41:30.078Z" }, ] +[[package]] +name = "tomli" +version = "2.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/22/de/48c59722572767841493b26183a0d1cc411d54fd759c5607c4590b6563a6/tomli-2.4.1.tar.gz", hash = "sha256:7c7e1a961a0b2f2472c1ac5b69affa0ae1132c39adcb67aba98568702b9cc23f", size = 17543, upload-time = "2026-03-25T20:22:03.828Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/11/db3d5885d8528263d8adc260bb2d28ebf1270b96e98f0e0268d32b8d9900/tomli-2.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f8f0fc26ec2cc2b965b7a3b87cd19c5c6b8c5e5f436b984e85f486d652285c30", size = 154704, upload-time = "2026-03-25T20:21:10.473Z" }, + { url = "https://files.pythonhosted.org/packages/6d/f7/675db52c7e46064a9aa928885a9b20f4124ecb9bc2e1ce74c9106648d202/tomli-2.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4ab97e64ccda8756376892c53a72bd1f964e519c77236368527f758fbc36a53a", size = 149454, upload-time = "2026-03-25T20:21:12.036Z" }, + { url = "https://files.pythonhosted.org/packages/61/71/81c50943cf953efa35bce7646caab3cf457a7d8c030b27cfb40d7235f9ee/tomli-2.4.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96481a5786729fd470164b47cdb3e0e58062a496f455ee41b4403be77cb5a076", size = 237561, upload-time = "2026-03-25T20:21:13.098Z" }, + { url = "https://files.pythonhosted.org/packages/48/c1/f41d9cb618acccca7df82aaf682f9b49013c9397212cb9f53219e3abac37/tomli-2.4.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5a881ab208c0baf688221f8cecc5401bd291d67e38a1ac884d6736cbcd8247e9", size = 243824, upload-time = "2026-03-25T20:21:14.569Z" }, + { url = "https://files.pythonhosted.org/packages/22/e4/5a816ecdd1f8ca51fb756ef684b90f2780afc52fc67f987e3c61d800a46d/tomli-2.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47149d5bd38761ac8be13a84864bf0b7b70bc051806bc3669ab1cbc56216b23c", size = 242227, upload-time = "2026-03-25T20:21:15.712Z" }, + { url = "https://files.pythonhosted.org/packages/6b/49/2b2a0ef529aa6eec245d25f0c703e020a73955ad7edf73e7f54ddc608aa5/tomli-2.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ec9bfaf3ad2df51ace80688143a6a4ebc09a248f6ff781a9945e51937008fcbc", size = 247859, upload-time = "2026-03-25T20:21:17.001Z" }, + { url = "https://files.pythonhosted.org/packages/83/bd/6c1a630eaca337e1e78c5903104f831bda934c426f9231429396ce3c3467/tomli-2.4.1-cp311-cp311-win32.whl", hash = "sha256:ff2983983d34813c1aeb0fa89091e76c3a22889ee83ab27c5eeb45100560c049", size = 97204, upload-time = "2026-03-25T20:21:18.079Z" }, + { url = "https://files.pythonhosted.org/packages/42/59/71461df1a885647e10b6bb7802d0b8e66480c61f3f43079e0dcd315b3954/tomli-2.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:5ee18d9ebdb417e384b58fe414e8d6af9f4e7a0ae761519fb50f721de398dd4e", size = 108084, upload-time = "2026-03-25T20:21:18.978Z" }, + { url = "https://files.pythonhosted.org/packages/b8/83/dceca96142499c069475b790e7913b1044c1a4337e700751f48ed723f883/tomli-2.4.1-cp311-cp311-win_arm64.whl", hash = "sha256:c2541745709bad0264b7d4705ad453b76ccd191e64aa6f0fc66b69a293a45ece", size = 95285, upload-time = "2026-03-25T20:21:20.309Z" }, + { url = "https://files.pythonhosted.org/packages/c1/ba/42f134a3fe2b370f555f44b1d72feebb94debcab01676bf918d0cb70e9aa/tomli-2.4.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c742f741d58a28940ce01d58f0ab2ea3ced8b12402f162f4d534dfe18ba1cd6a", size = 155924, upload-time = "2026-03-25T20:21:21.626Z" }, + { url = "https://files.pythonhosted.org/packages/dc/c7/62d7a17c26487ade21c5422b646110f2162f1fcc95980ef7f63e73c68f14/tomli-2.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7f86fd587c4ed9dd76f318225e7d9b29cfc5a9d43de44e5754db8d1128487085", size = 150018, upload-time = "2026-03-25T20:21:23.002Z" }, + { url = "https://files.pythonhosted.org/packages/5c/05/79d13d7c15f13bdef410bdd49a6485b1c37d28968314eabee452c22a7fda/tomli-2.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ff18e6a727ee0ab0388507b89d1bc6a22b138d1e2fa56d1ad494586d61d2eae9", size = 244948, upload-time = "2026-03-25T20:21:24.04Z" }, + { url = "https://files.pythonhosted.org/packages/10/90/d62ce007a1c80d0b2c93e02cab211224756240884751b94ca72df8a875ca/tomli-2.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:136443dbd7e1dee43c68ac2694fde36b2849865fa258d39bf822c10e8068eac5", size = 253341, upload-time = "2026-03-25T20:21:25.177Z" }, + { url = "https://files.pythonhosted.org/packages/1a/7e/caf6496d60152ad4ed09282c1885cca4eea150bfd007da84aea07bcc0a3e/tomli-2.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5e262d41726bc187e69af7825504c933b6794dc3fbd5945e41a79bb14c31f585", size = 248159, upload-time = "2026-03-25T20:21:26.364Z" }, + { url = "https://files.pythonhosted.org/packages/99/e7/c6f69c3120de34bbd882c6fba7975f3d7a746e9218e56ab46a1bc4b42552/tomli-2.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5cb41aa38891e073ee49d55fbc7839cfdb2bc0e600add13874d048c94aadddd1", size = 253290, upload-time = "2026-03-25T20:21:27.46Z" }, + { url = "https://files.pythonhosted.org/packages/d6/2f/4a3c322f22c5c66c4b836ec58211641a4067364f5dcdd7b974b4c5da300c/tomli-2.4.1-cp312-cp312-win32.whl", hash = "sha256:da25dc3563bff5965356133435b757a795a17b17d01dbc0f42fb32447ddfd917", size = 98141, upload-time = "2026-03-25T20:21:28.492Z" }, + { url = "https://files.pythonhosted.org/packages/24/22/4daacd05391b92c55759d55eaee21e1dfaea86ce5c571f10083360adf534/tomli-2.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:52c8ef851d9a240f11a88c003eacb03c31fc1c9c4ec64a99a0f922b93874fda9", size = 108847, upload-time = "2026-03-25T20:21:29.386Z" }, + { url = "https://files.pythonhosted.org/packages/68/fd/70e768887666ddd9e9f5d85129e84910f2db2796f9096aa02b721a53098d/tomli-2.4.1-cp312-cp312-win_arm64.whl", hash = "sha256:f758f1b9299d059cc3f6546ae2af89670cb1c4d48ea29c3cacc4fe7de3058257", size = 95088, upload-time = "2026-03-25T20:21:30.677Z" }, + { url = "https://files.pythonhosted.org/packages/07/06/b823a7e818c756d9a7123ba2cda7d07bc2dd32835648d1a7b7b7a05d848d/tomli-2.4.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:36d2bd2ad5fb9eaddba5226aa02c8ec3fa4f192631e347b3ed28186d43be6b54", size = 155866, upload-time = "2026-03-25T20:21:31.65Z" }, + { url = "https://files.pythonhosted.org/packages/14/6f/12645cf7f08e1a20c7eb8c297c6f11d31c1b50f316a7e7e1e1de6e2e7b7e/tomli-2.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:eb0dc4e38e6a1fd579e5d50369aa2e10acfc9cace504579b2faabb478e76941a", size = 149887, upload-time = "2026-03-25T20:21:33.028Z" }, + { url = "https://files.pythonhosted.org/packages/5c/e0/90637574e5e7212c09099c67ad349b04ec4d6020324539297b634a0192b0/tomli-2.4.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c7f2c7f2b9ca6bdeef8f0fa897f8e05085923eb091721675170254cbc5b02897", size = 243704, upload-time = "2026-03-25T20:21:34.51Z" }, + { url = "https://files.pythonhosted.org/packages/10/8f/d3ddb16c5a4befdf31a23307f72828686ab2096f068eaf56631e136c1fdd/tomli-2.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f3c6818a1a86dd6dca7ddcaaf76947d5ba31aecc28cb1b67009a5877c9a64f3f", size = 251628, upload-time = "2026-03-25T20:21:36.012Z" }, + { url = "https://files.pythonhosted.org/packages/e3/f1/dbeeb9116715abee2485bf0a12d07a8f31af94d71608c171c45f64c0469d/tomli-2.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d312ef37c91508b0ab2cee7da26ec0b3ed2f03ce12bd87a588d771ae15dcf82d", size = 247180, upload-time = "2026-03-25T20:21:37.136Z" }, + { url = "https://files.pythonhosted.org/packages/d3/74/16336ffd19ed4da28a70959f92f506233bd7cfc2332b20bdb01591e8b1d1/tomli-2.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:51529d40e3ca50046d7606fa99ce3956a617f9b36380da3b7f0dd3dd28e68cb5", size = 251674, upload-time = "2026-03-25T20:21:38.298Z" }, + { url = "https://files.pythonhosted.org/packages/16/f9/229fa3434c590ddf6c0aa9af64d3af4b752540686cace29e6281e3458469/tomli-2.4.1-cp313-cp313-win32.whl", hash = "sha256:2190f2e9dd7508d2a90ded5ed369255980a1bcdd58e52f7fe24b8162bf9fedbd", size = 97976, upload-time = "2026-03-25T20:21:39.316Z" }, + { url = "https://files.pythonhosted.org/packages/6a/1e/71dfd96bcc1c775420cb8befe7a9d35f2e5b1309798f009dca17b7708c1e/tomli-2.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:8d65a2fbf9d2f8352685bc1364177ee3923d6baf5e7f43ea4959d7d8bc326a36", size = 108755, upload-time = "2026-03-25T20:21:40.248Z" }, + { url = "https://files.pythonhosted.org/packages/83/7a/d34f422a021d62420b78f5c538e5b102f62bea616d1d75a13f0a88acb04a/tomli-2.4.1-cp313-cp313-win_arm64.whl", hash = "sha256:4b605484e43cdc43f0954ddae319fb75f04cc10dd80d830540060ee7cd0243cd", size = 95265, upload-time = "2026-03-25T20:21:41.219Z" }, + { url = "https://files.pythonhosted.org/packages/3c/fb/9a5c8d27dbab540869f7c1f8eb0abb3244189ce780ba9cd73f3770662072/tomli-2.4.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:fd0409a3653af6c147209d267a0e4243f0ae46b011aa978b1080359fddc9b6cf", size = 155726, upload-time = "2026-03-25T20:21:42.23Z" }, + { url = "https://files.pythonhosted.org/packages/62/05/d2f816630cc771ad836af54f5001f47a6f611d2d39535364f148b6a92d6b/tomli-2.4.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:a120733b01c45e9a0c34aeef92bf0cf1d56cfe81ed9d47d562f9ed591a9828ac", size = 149859, upload-time = "2026-03-25T20:21:43.386Z" }, + { url = "https://files.pythonhosted.org/packages/ce/48/66341bdb858ad9bd0ceab5a86f90eddab127cf8b046418009f2125630ecb/tomli-2.4.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:559db847dc486944896521f68d8190be1c9e719fced785720d2216fe7022b662", size = 244713, upload-time = "2026-03-25T20:21:44.474Z" }, + { url = "https://files.pythonhosted.org/packages/df/6d/c5fad00d82b3c7a3ab6189bd4b10e60466f22cfe8a08a9394185c8a8111c/tomli-2.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01f520d4f53ef97964a240a035ec2a869fe1a37dde002b57ebc4417a27ccd853", size = 252084, upload-time = "2026-03-25T20:21:45.62Z" }, + { url = "https://files.pythonhosted.org/packages/00/71/3a69e86f3eafe8c7a59d008d245888051005bd657760e96d5fbfb0b740c2/tomli-2.4.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7f94b27a62cfad8496c8d2513e1a222dd446f095fca8987fceef261225538a15", size = 247973, upload-time = "2026-03-25T20:21:46.937Z" }, + { url = "https://files.pythonhosted.org/packages/67/50/361e986652847fec4bd5e4a0208752fbe64689c603c7ae5ea7cb16b1c0ca/tomli-2.4.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:ede3e6487c5ef5d28634ba3f31f989030ad6af71edfb0055cbbd14189ff240ba", size = 256223, upload-time = "2026-03-25T20:21:48.467Z" }, + { url = "https://files.pythonhosted.org/packages/8c/9a/b4173689a9203472e5467217e0154b00e260621caa227b6fa01feab16998/tomli-2.4.1-cp314-cp314-win32.whl", hash = "sha256:3d48a93ee1c9b79c04bb38772ee1b64dcf18ff43085896ea460ca8dec96f35f6", size = 98973, upload-time = "2026-03-25T20:21:49.526Z" }, + { url = "https://files.pythonhosted.org/packages/14/58/640ac93bf230cd27d002462c9af0d837779f8773bc03dee06b5835208214/tomli-2.4.1-cp314-cp314-win_amd64.whl", hash = "sha256:88dceee75c2c63af144e456745e10101eb67361050196b0b6af5d717254dddf7", size = 109082, upload-time = "2026-03-25T20:21:50.506Z" }, + { url = "https://files.pythonhosted.org/packages/d5/2f/702d5e05b227401c1068f0d386d79a589bb12bf64c3d2c72ce0631e3bc49/tomli-2.4.1-cp314-cp314-win_arm64.whl", hash = "sha256:b8c198f8c1805dc42708689ed6864951fd2494f924149d3e4bce7710f8eb5232", size = 96490, upload-time = "2026-03-25T20:21:51.474Z" }, + { url = "https://files.pythonhosted.org/packages/45/4b/b877b05c8ba62927d9865dd980e34a755de541eb65fffba52b4cc495d4d2/tomli-2.4.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:d4d8fe59808a54658fcc0160ecfb1b30f9089906c50b23bcb4c69eddc19ec2b4", size = 164263, upload-time = "2026-03-25T20:21:52.543Z" }, + { url = "https://files.pythonhosted.org/packages/24/79/6ab420d37a270b89f7195dec5448f79400d9e9c1826df982f3f8e97b24fd/tomli-2.4.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7008df2e7655c495dd12d2a4ad038ff878d4ca4b81fccaf82b714e07eae4402c", size = 160736, upload-time = "2026-03-25T20:21:53.674Z" }, + { url = "https://files.pythonhosted.org/packages/02/e0/3630057d8eb170310785723ed5adcdfb7d50cb7e6455f85ba8a3deed642b/tomli-2.4.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1d8591993e228b0c930c4bb0db464bdad97b3289fb981255d6c9a41aedc84b2d", size = 270717, upload-time = "2026-03-25T20:21:55.129Z" }, + { url = "https://files.pythonhosted.org/packages/7a/b4/1613716072e544d1a7891f548d8f9ec6ce2faf42ca65acae01d76ea06bb0/tomli-2.4.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:734e20b57ba95624ecf1841e72b53f6e186355e216e5412de414e3c51e5e3c41", size = 278461, upload-time = "2026-03-25T20:21:56.228Z" }, + { url = "https://files.pythonhosted.org/packages/05/38/30f541baf6a3f6df77b3df16b01ba319221389e2da59427e221ef417ac0c/tomli-2.4.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8a650c2dbafa08d42e51ba0b62740dae4ecb9338eefa093aa5c78ceb546fcd5c", size = 274855, upload-time = "2026-03-25T20:21:57.653Z" }, + { url = "https://files.pythonhosted.org/packages/77/a3/ec9dd4fd2c38e98de34223b995a3b34813e6bdadf86c75314c928350ed14/tomli-2.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:504aa796fe0569bb43171066009ead363de03675276d2d121ac1a4572397870f", size = 283144, upload-time = "2026-03-25T20:21:59.089Z" }, + { url = "https://files.pythonhosted.org/packages/ef/be/605a6261cac79fba2ec0c9827e986e00323a1945700969b8ee0b30d85453/tomli-2.4.1-cp314-cp314t-win32.whl", hash = "sha256:b1d22e6e9387bf4739fbe23bfa80e93f6b0373a7f1b96c6227c32bef95a4d7a8", size = 108683, upload-time = "2026-03-25T20:22:00.214Z" }, + { url = "https://files.pythonhosted.org/packages/12/64/da524626d3b9cc40c168a13da8335fe1c51be12c0a63685cc6db7308daae/tomli-2.4.1-cp314-cp314t-win_amd64.whl", hash = "sha256:2c1c351919aca02858f740c6d33adea0c5deea37f9ecca1cc1ef9e884a619d26", size = 121196, upload-time = "2026-03-25T20:22:01.169Z" }, + { url = "https://files.pythonhosted.org/packages/5a/cd/e80b62269fc78fc36c9af5a6b89c835baa8af28ff5ad28c7028d60860320/tomli-2.4.1-cp314-cp314t-win_arm64.whl", hash = "sha256:eab21f45c7f66c13f2a9e0e1535309cee140182a9cdae1e041d02e47291e8396", size = 100393, upload-time = "2026-03-25T20:22:02.137Z" }, + { url = "https://files.pythonhosted.org/packages/7b/61/cceae43728b7de99d9b847560c262873a1f6c98202171fd5ed62640b494b/tomli-2.4.1-py3-none-any.whl", hash = "sha256:0d85819802132122da43cb86656f8d1f8c6587d54ae7dcaf30e90533028b49fe", size = 14583, upload-time = "2026-03-25T20:22:03.012Z" }, +] + [[package]] name = "tornado" version = "6.4.2" From 486d60ea2f2a5879507b2656b4064234ce2afe7e Mon Sep 17 00:00:00 2001 From: pablosuvi Date: Fri, 24 Jul 2026 10:22:56 +0100 Subject: [PATCH 3/4] Add tests --- tests/hamiltonian_test.py | 115 ++++++++++++++++++++++++++++ tests/kernel_test.py | 157 ++++++++++++++++++++++++++++++++++++++ tests/simulator_test.py | 61 +++++++++++++++ 3 files changed, 333 insertions(+) create mode 100644 tests/hamiltonian_test.py create mode 100644 tests/kernel_test.py create mode 100644 tests/simulator_test.py diff --git a/tests/hamiltonian_test.py b/tests/hamiltonian_test.py new file mode 100644 index 0000000..a133fdf --- /dev/null +++ b/tests/hamiltonian_test.py @@ -0,0 +1,115 @@ +import numpy as np +import pytest +import qutip +from qat.core import Observable +from qkernel4eo.embeddings.chain_embedding import ChainEmbedding +from qkernel4eo.embeddings.radial_embedding import RadialEmbedding + +from qkernel.hamiltonian import Hamiltonian, MyQLMHamiltonian, QuTiPHamiltonian + +RNG = np.random.default_rng(42) +# 3 features: satisfies chain embedding constraint |-c_1 + n*c_2| = |-36+30| = 6 <= 38 +# 2 samples: normalise_array needs at least 2 rows along axis=0 to avoid 0/0 = NaN +N_QBITS = 3 +BANDS = RNG.random((2, N_QBITS)) + +QBITS_LIST = [ + RadialEmbedding(BANDS).embed()[0], # shape (N_QBITS, 2) + ChainEmbedding(BANDS).embed()[0], # shape (N_QBITS, 2) +] + + +@pytest.fixture +def myqlm(): + return MyQLMHamiltonian(QBITS_LIST) + + +@pytest.fixture +def qutip_h(): + return QuTiPHamiltonian(QBITS_LIST) + + +# --- Hamiltonian (abstract base) --- + + +def test_cannot_instantiate_abstract(): + with pytest.raises(TypeError): + Hamiltonian(QBITS_LIST) + + +def test_nqbits_set_correctly(myqlm): + assert myqlm.nqbits == N_QBITS + + +def test_default_parameters(myqlm): + assert myqlm.omega == 2 * np.pi + assert myqlm.delta == 0 + assert myqlm.c6 == 865723.02 + + +def test_generate_hamiltonians_list_length(myqlm): + result = myqlm.generate_hamiltonians_list() + assert len(result) == len(QBITS_LIST) + + +# --- MyQLMHamiltonian --- + + +def test_myqlm_returns_three_terms(myqlm): + result = myqlm.generate_hamiltonian(QBITS_LIST[0]) + assert len(result) == 3 + + +def test_myqlm_coefficients(myqlm): + result = myqlm.generate_hamiltonian(QBITS_LIST[0]) + assert result[0][0] == myqlm.omega + assert result[1][0] == -myqlm.delta + assert result[2][0] == myqlm.c6 + + +def test_myqlm_terms_are_observables(myqlm): + result = myqlm.generate_hamiltonian(QBITS_LIST[0]) + for _, obs in result: + assert isinstance(obs, Observable) + + +def test_myqlm_custom_parameters(): + h = MyQLMHamiltonian(QBITS_LIST, omega=1.0, delta=0.5, c6=100.0) + result = h.generate_hamiltonian(QBITS_LIST[0]) + assert result[0][0] == 1.0 + assert result[1][0] == -0.5 + assert result[2][0] == 100.0 + + +# --- QuTiPHamiltonian --- + + +def test_qutip_returns_qobj(qutip_h): + result = qutip_h.generate_hamiltonian(QBITS_LIST[0]) + assert isinstance(result, qutip.Qobj) + + +def test_qutip_hamiltonian_shape(qutip_h): + result = qutip_h.generate_hamiltonian(QBITS_LIST[0]) + dim = 2**N_QBITS + assert result.shape == (dim, dim) + + +def test_qutip_hamiltonian_is_hermitian(qutip_h): + result = qutip_h.generate_hamiltonian(QBITS_LIST[0]) + assert result.isherm + + +def test_qutip_op_single_qubit_shape(qutip_h): + op = qutip_h._qutip_op(0, qutip.sigmax()) + assert op.shape == (2**N_QBITS, 2**N_QBITS) + + +def test_qutip_op_two_qubit_shape(qutip_h): + op = qutip_h._qutip_op(0, qutip.num(2), 1, qutip.num(2)) + assert op.shape == (2**N_QBITS, 2**N_QBITS) + + +def test_qutip_generate_hamiltonians_list_length(qutip_h): + result = qutip_h.generate_hamiltonians_list() + assert len(result) == len(QBITS_LIST) diff --git a/tests/kernel_test.py b/tests/kernel_test.py new file mode 100644 index 0000000..661f64e --- /dev/null +++ b/tests/kernel_test.py @@ -0,0 +1,157 @@ +import numpy as np +import pytest + +from qkernel.kernel import ( + Kernel, + exponential_distance, + exponential_jensen_shannon_distance, +) + +RNG = np.random.default_rng(42) +N_TRAIN = 4 +N_TEST = 2 +N_STATES = 8 # 3 qubits → 2^3 states +N_QUBITS = 3 + + +def make_probs(n, rng): + x = rng.random((n, N_STATES)) + return x / x.sum(axis=1, keepdims=True) + + +P_TRAIN = make_probs(N_TRAIN, RNG) +P_TEST = make_probs(N_TEST, RNG) + + +@pytest.fixture +def kernel(): + return Kernel(P_TRAIN, P_TEST, excitations=False, distance_fn="exp_js") + + +# --- exponential_jensen_shannon_distance --- + + +def test_exp_js_identical_distributions(): + p = np.array([0.25, 0.25, 0.25, 0.25]) + np.testing.assert_allclose(exponential_jensen_shannon_distance(p, p), 1.0) + + +def test_exp_js_different_distributions(): + p = np.array([1.0, 0.0]) + q = np.array([0.0, 1.0]) + result = exponential_jensen_shannon_distance(p, q) + assert 0 < result < 1 + + +def test_exp_js_mu_scaling(): + p = np.array([0.5, 0.5]) + q = np.array([1.0, 0.0]) + r1 = exponential_jensen_shannon_distance(p, q, mu=1) + r2 = exponential_jensen_shannon_distance(p, q, mu=2) + assert r2 < r1 + + +# --- exponential_distance --- + + +def test_exp_dist_identical_distributions(): + p = np.array([0.25, 0.25, 0.25, 0.25]) + np.testing.assert_allclose(exponential_distance(p, p), 1.0) + + +def test_exp_dist_known_value(): + p = np.array([1.0, 0.0]) + q = np.array([0.0, 1.0]) + np.testing.assert_allclose(exponential_distance(p, q), np.exp(-2.0)) + + +def test_exp_dist_mu_scaling(): + p = np.array([0.5, 0.5]) + q = np.array([1.0, 0.0]) + r1 = exponential_distance(p, q, mu=1) + r2 = exponential_distance(p, q, mu=2) + assert r2 < r1 + + +# --- Kernel.__init__ --- + + +def test_kernel_stores_distributions_without_excitations(): + k = Kernel(P_TRAIN, P_TEST, excitations=False, distance_fn="exp_js") + np.testing.assert_array_equal(k.p_train, P_TRAIN) + np.testing.assert_array_equal(k.p_test, P_TEST) + + +def test_kernel_transforms_with_excitations(): + k = Kernel(P_TRAIN, P_TEST, excitations=True, distance_fn="exp_js") + assert k.p_train.shape == (N_TRAIN, N_QUBITS + 1) + assert k.p_test.shape == (N_TEST, N_QUBITS + 1) + + +def test_kernel_distance_kwargs_defaults_to_empty(kernel): + assert kernel.distance_kwargs == {} + + +def test_kernel_n_train_n_test(kernel): + assert kernel.n_train == N_TRAIN + assert kernel.n_test == N_TEST + + +def test_kernel_exp_distance_fn(): + k = Kernel(P_TRAIN, P_TEST, excitations=False, distance_fn="exp") + gram = k.compute_gram_train() + assert gram.shape == (N_TRAIN, N_TRAIN) + + +# --- compute_gram_train --- + + +def test_gram_train_shape(kernel): + assert kernel.compute_gram_train().shape == (N_TRAIN, N_TRAIN) + + +def test_gram_train_diagonal_is_ones(kernel): + gram = kernel.compute_gram_train() + np.testing.assert_allclose(np.diag(gram), 1.0) + + +def test_gram_train_is_symmetric(kernel): + gram = kernel.compute_gram_train() + np.testing.assert_allclose(gram, gram.T) + + +def test_gram_train_values_in_range(kernel): + gram = kernel.compute_gram_train() + assert np.all(gram > 0) and np.all(gram <= 1) + + +# --- compute_gram_test --- + + +def test_gram_test_shape(kernel): + assert kernel.compute_gram_test().shape == (N_TEST, N_TRAIN) + + +def test_gram_test_values_in_range(kernel): + gram = kernel.compute_gram_test() + assert np.all(gram > 0) and np.all(gram <= 1) + + +def test_gram_test_custom_mu(): + k1 = Kernel( + P_TRAIN, + P_TEST, + excitations=False, + distance_fn="exp_js", + distance_kwargs={"mu": 1}, + ) + k2 = Kernel( + P_TRAIN, + P_TEST, + excitations=False, + distance_fn="exp_js", + distance_kwargs={"mu": 10}, + ) + gram1 = k1.compute_gram_test() + gram2 = k2.compute_gram_test() + assert gram2.mean() < gram1.mean() diff --git a/tests/simulator_test.py b/tests/simulator_test.py new file mode 100644 index 0000000..2b2855c --- /dev/null +++ b/tests/simulator_test.py @@ -0,0 +1,61 @@ +import numpy as np +import pytest +from qkernel4eo.embeddings.chain_embedding import ChainEmbedding +from qkernel4eo.embeddings.radial_embedding import RadialEmbedding + +from qkernel.hamiltonian import QuTiPHamiltonian +from qkernel.simulator import QuTiPSimulator, Simulator + +RNG = np.random.default_rng(42) +# 3 features: satisfies chain embedding constraint |-c_1 + n*c_2| = |-36+30| = 6 <= 38 +# 2 samples: normalise_array needs at least 2 rows along axis=0 to avoid 0/0 = NaN +N_QBITS = 3 +BANDS = RNG.random((2, N_QBITS)) + +QBITS_LIST = [ + RadialEmbedding(BANDS).embed()[0], # shape (N_QBITS, 2) + ChainEmbedding(BANDS).embed()[0], # shape (N_QBITS, 2) +] + +HAMILTONIANS_LIST = QuTiPHamiltonian(QBITS_LIST).generate_hamiltonians_list() + + +@pytest.fixture +def simulator(): + return QuTiPSimulator(HAMILTONIANS_LIST) + + +# --- Simulator (abstract base) --- + + +def test_cannot_instantiate_abstract(): + with pytest.raises(TypeError): + Simulator(HAMILTONIANS_LIST) + + +# --- QuTiPSimulator --- + + +def test_evolve_hamiltonian_returns_array(simulator): + result = simulator._evolve_hamiltonian(HAMILTONIANS_LIST[0]) + assert isinstance(result, np.ndarray) + + +def test_evolve_hamiltonian_shape(simulator): + result = simulator._evolve_hamiltonian(HAMILTONIANS_LIST[0]) + assert result.shape == (2**N_QBITS,) + + +def test_get_probabilities_list_length(simulator): + result = simulator.get_probabilities_list() + assert len(result) == len(HAMILTONIANS_LIST) + + +def test_probabilities_are_nonnegative(simulator): + for probs in simulator.get_probabilities_list(): + assert np.all(probs >= 0) + + +def test_probabilities_sum_to_one(simulator): + for probs in simulator.get_probabilities_list(): + np.testing.assert_allclose(probs.sum(), 1.0, atol=1e-10) From 270b2d9d3e84216e7148b442e915646ad9b0a06b Mon Sep 17 00:00:00 2001 From: pablosuvi Date: Fri, 24 Jul 2026 11:01:43 +0100 Subject: [PATCH 4/4] Modify tests --- tests/hamiltonian_test.py | 24 +++++++++++++----------- tests/simulator_test.py | 12 +++++++----- 2 files changed, 20 insertions(+), 16 deletions(-) diff --git a/tests/hamiltonian_test.py b/tests/hamiltonian_test.py index a133fdf..844b896 100644 --- a/tests/hamiltonian_test.py +++ b/tests/hamiltonian_test.py @@ -13,10 +13,12 @@ N_QBITS = 3 BANDS = RNG.random((2, N_QBITS)) -QBITS_LIST = [ - RadialEmbedding(BANDS).embed()[0], # shape (N_QBITS, 2) - ChainEmbedding(BANDS).embed()[0], # shape (N_QBITS, 2) -] +QBITS_LIST = np.array( + [ + RadialEmbedding(BANDS).embed()[0], # shape (N_QBITS, 2) + ChainEmbedding(BANDS).embed()[0], # shape (N_QBITS, 2) + ] +) # stacked to shape (N, N_QBITS, 2) since Hamiltonian.__init__ reads qbits.shape[1] @pytest.fixture @@ -56,26 +58,26 @@ def test_generate_hamiltonians_list_length(myqlm): def test_myqlm_returns_three_terms(myqlm): - result = myqlm.generate_hamiltonian(QBITS_LIST[0]) + result = myqlm.generate_single_hamiltonian(QBITS_LIST[0]) assert len(result) == 3 def test_myqlm_coefficients(myqlm): - result = myqlm.generate_hamiltonian(QBITS_LIST[0]) + result = myqlm.generate_single_hamiltonian(QBITS_LIST[0]) assert result[0][0] == myqlm.omega assert result[1][0] == -myqlm.delta assert result[2][0] == myqlm.c6 def test_myqlm_terms_are_observables(myqlm): - result = myqlm.generate_hamiltonian(QBITS_LIST[0]) + result = myqlm.generate_single_hamiltonian(QBITS_LIST[0]) for _, obs in result: assert isinstance(obs, Observable) def test_myqlm_custom_parameters(): h = MyQLMHamiltonian(QBITS_LIST, omega=1.0, delta=0.5, c6=100.0) - result = h.generate_hamiltonian(QBITS_LIST[0]) + result = h.generate_single_hamiltonian(QBITS_LIST[0]) assert result[0][0] == 1.0 assert result[1][0] == -0.5 assert result[2][0] == 100.0 @@ -85,18 +87,18 @@ def test_myqlm_custom_parameters(): def test_qutip_returns_qobj(qutip_h): - result = qutip_h.generate_hamiltonian(QBITS_LIST[0]) + result = qutip_h.generate_single_hamiltonian(QBITS_LIST[0]) assert isinstance(result, qutip.Qobj) def test_qutip_hamiltonian_shape(qutip_h): - result = qutip_h.generate_hamiltonian(QBITS_LIST[0]) + result = qutip_h.generate_single_hamiltonian(QBITS_LIST[0]) dim = 2**N_QBITS assert result.shape == (dim, dim) def test_qutip_hamiltonian_is_hermitian(qutip_h): - result = qutip_h.generate_hamiltonian(QBITS_LIST[0]) + result = qutip_h.generate_single_hamiltonian(QBITS_LIST[0]) assert result.isherm diff --git a/tests/simulator_test.py b/tests/simulator_test.py index 2b2855c..48046ea 100644 --- a/tests/simulator_test.py +++ b/tests/simulator_test.py @@ -12,10 +12,12 @@ N_QBITS = 3 BANDS = RNG.random((2, N_QBITS)) -QBITS_LIST = [ - RadialEmbedding(BANDS).embed()[0], # shape (N_QBITS, 2) - ChainEmbedding(BANDS).embed()[0], # shape (N_QBITS, 2) -] +QBITS_LIST = np.array( + [ + RadialEmbedding(BANDS).embed()[0], # shape (N_QBITS, 2) + ChainEmbedding(BANDS).embed()[0], # shape (N_QBITS, 2) + ] +) # stacked to shape (N, N_QBITS, 2) since Hamiltonian.__init__ reads qbits.shape[1] HAMILTONIANS_LIST = QuTiPHamiltonian(QBITS_LIST).generate_hamiltonians_list() @@ -43,7 +45,7 @@ def test_evolve_hamiltonian_returns_array(simulator): def test_evolve_hamiltonian_shape(simulator): result = simulator._evolve_hamiltonian(HAMILTONIANS_LIST[0]) - assert result.shape == (2**N_QBITS,) + assert result.flatten().shape == (2**N_QBITS,) def test_get_probabilities_list_length(simulator):