From 8884ef69be53dcaa2ea4c7b3333e19a4d63dcde6 Mon Sep 17 00:00:00 2001 From: foefl Date: Thu, 20 Nov 2025 16:04:26 +0000 Subject: [PATCH] fix result reproduction error on different computers (#17) fixes #16 Co-authored-by: frasu Reviewed-on: https://git.d-opt.de/EKF-Diagnostic/sensor-anomalies/pulls/17 Co-authored-by: foefl Co-committed-by: foefl --- .gitattributes | 1 + .gitignore | 1 + pdm.lock | 327 ++++++------ pyproject.toml | 2 +- src/dopt_sensor_anomalies/constants.py | 7 +- src/dopt_sensor_anomalies/detection.c | 658 ++++++++++++------------ src/dopt_sensor_anomalies/detection.py | 2 +- tests/_models/model_left_hand_side.pth | Bin 15417039 -> 0 bytes tests/_models/model_right_hand_side.pth | Bin 18186447 -> 0 bytes 9 files changed, 496 insertions(+), 502 deletions(-) create mode 100644 .gitattributes delete mode 100644 tests/_models/model_left_hand_side.pth delete mode 100644 tests/_models/model_right_hand_side.pth diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..ec4a626 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +*.pth filter=lfs diff=lfs merge=lfs -text diff --git a/.gitignore b/.gitignore index 21e6a91..e1303b7 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,7 @@ reports/ *.code-workspace # credentials CREDENTIALS* +*.pth # Byte-compiled / optimized / DLL files __pycache__/ diff --git a/pdm.lock b/pdm.lock index c43ef38..45dfecf 100644 --- a/pdm.lock +++ b/pdm.lock @@ -5,7 +5,7 @@ groups = ["default", "dev", "lint", "nb", "tests"] strategy = ["inherit_metadata"] lock_version = "4.5.0" -content_hash = "sha256:2d4e7f16674111930c2b086fcc38a75340a0fe6373dcda206b781a3bb05e73cc" +content_hash = "sha256:80c4f12ed395aff33031d8f355fb80685376a4283dc025567f8a8f3ab45e77c1" [[metadata.targets]] requires_python = ">=3.11,<3.14" @@ -23,7 +23,7 @@ files = [ [[package]] name = "aiohttp" -version = "3.13.0" +version = "3.13.2" requires_python = ">=3.9" summary = "Async http client/server framework (asyncio)" groups = ["default"] @@ -38,58 +38,58 @@ dependencies = [ "yarl<2.0,>=1.17.0", ] files = [ - {file = "aiohttp-3.13.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:99eb94e97a42367fef5fc11e28cb2362809d3e70837f6e60557816c7106e2e20"}, - {file = "aiohttp-3.13.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4696665b2713021c6eba3e2b882a86013763b442577fe5d2056a42111e732eca"}, - {file = "aiohttp-3.13.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3e6a38366f7f0d0f6ed7a1198055150c52fda552b107dad4785c0852ad7685d1"}, - {file = "aiohttp-3.13.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:aab715b1a0c37f7f11f9f1f579c6fbaa51ef569e47e3c0a4644fba46077a9409"}, - {file = "aiohttp-3.13.0-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7972c82bed87d7bd8e374b60a6b6e816d75ba4f7c2627c2d14eed216e62738e1"}, - {file = "aiohttp-3.13.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ca8313cb852af788c78d5afdea24c40172cbfff8b35e58b407467732fde20390"}, - {file = "aiohttp-3.13.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6c333a2385d2a6298265f4b3e960590f787311b87f6b5e6e21bb8375914ef504"}, - {file = "aiohttp-3.13.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cc6d5fc5edbfb8041d9607f6a417997fa4d02de78284d386bea7ab767b5ea4f3"}, - {file = "aiohttp-3.13.0-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:7ddedba3d0043349edc79df3dc2da49c72b06d59a45a42c1c8d987e6b8d175b8"}, - {file = "aiohttp-3.13.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:23ca762140159417a6bbc959ca1927f6949711851e56f2181ddfe8d63512b5ad"}, - {file = "aiohttp-3.13.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:bfe824d6707a5dc3c5676685f624bc0c63c40d79dc0239a7fd6c034b98c25ebe"}, - {file = "aiohttp-3.13.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:3c11fa5dd2ef773a8a5a6daa40243d83b450915992eab021789498dc87acc114"}, - {file = "aiohttp-3.13.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:00fdfe370cffede3163ba9d3f190b32c0cfc8c774f6f67395683d7b0e48cdb8a"}, - {file = "aiohttp-3.13.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:6475e42ef92717a678bfbf50885a682bb360a6f9c8819fb1a388d98198fdcb80"}, - {file = "aiohttp-3.13.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:77da5305a410910218b99f2a963092f4277d8a9c1f429c1ff1b026d1826bd0b6"}, - {file = "aiohttp-3.13.0-cp311-cp311-win32.whl", hash = "sha256:2f9d9ea547618d907f2ee6670c9a951f059c5994e4b6de8dcf7d9747b420c820"}, - {file = "aiohttp-3.13.0-cp311-cp311-win_amd64.whl", hash = "sha256:0f19f7798996d4458c669bd770504f710014926e9970f4729cf55853ae200469"}, - {file = "aiohttp-3.13.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1c272a9a18a5ecc48a7101882230046b83023bb2a662050ecb9bfcb28d9ab53a"}, - {file = "aiohttp-3.13.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:97891a23d7fd4e1afe9c2f4473e04595e4acb18e4733b910b6577b74e7e21985"}, - {file = "aiohttp-3.13.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:475bd56492ce5f4cffe32b5533c6533ee0c406d1d0e6924879f83adcf51da0ae"}, - {file = "aiohttp-3.13.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c32ada0abb4bc94c30be2b681c42f058ab104d048da6f0148280a51ce98add8c"}, - {file = "aiohttp-3.13.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:4af1f8877ca46ecdd0bc0d4a6b66d4b2bddc84a79e2e8366bc0d5308e76bceb8"}, - {file = "aiohttp-3.13.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e04ab827ec4f775817736b20cdc8350f40327f9b598dec4e18c9ffdcbea88a93"}, - {file = "aiohttp-3.13.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a6d9487b9471ec36b0faedf52228cd732e89be0a2bbd649af890b5e2ce422353"}, - {file = "aiohttp-3.13.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2e66c57416352f36bf98f6641ddadd47c93740a22af7150d3e9a1ef6e983f9a8"}, - {file = "aiohttp-3.13.0-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:469167d5372f5bb3aedff4fc53035d593884fff2617a75317740e885acd48b04"}, - {file = "aiohttp-3.13.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a9f3546b503975a69b547c9fd1582cad10ede1ce6f3e313a2f547c73a3d7814f"}, - {file = "aiohttp-3.13.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:6b4174fcec98601f0cfdf308ee29a6ae53c55f14359e848dab4e94009112ee7d"}, - {file = "aiohttp-3.13.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:a533873a7a4ec2270fb362ee5a0d3b98752e4e1dc9042b257cd54545a96bd8ed"}, - {file = "aiohttp-3.13.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:ce887c5e54411d607ee0959cac15bb31d506d86a9bcaddf0b7e9d63325a7a802"}, - {file = "aiohttp-3.13.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:d871f6a30d43e32fc9252dc7b9febe1a042b3ff3908aa83868d7cf7c9579a59b"}, - {file = "aiohttp-3.13.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:222c828243b4789d79a706a876910f656fad4381661691220ba57b2ab4547865"}, - {file = "aiohttp-3.13.0-cp312-cp312-win32.whl", hash = "sha256:682d2e434ff2f1108314ff7f056ce44e457f12dbed0249b24e106e385cf154b9"}, - {file = "aiohttp-3.13.0-cp312-cp312-win_amd64.whl", hash = "sha256:0a2be20eb23888df130214b91c262a90e2de1553d6fb7de9e9010cec994c0ff2"}, - {file = "aiohttp-3.13.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:00243e51f16f6ec0fb021659d4af92f675f3cf9f9b39efd142aa3ad641d8d1e6"}, - {file = "aiohttp-3.13.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:059978d2fddc462e9211362cbc8446747ecd930537fa559d3d25c256f032ff54"}, - {file = "aiohttp-3.13.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:564b36512a7da3b386143c611867e3f7cfb249300a1bf60889bd9985da67ab77"}, - {file = "aiohttp-3.13.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4aa995b9156ae499393d949a456a7ab0b994a8241a96db73a3b73c7a090eff6a"}, - {file = "aiohttp-3.13.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:55ca0e95a3905f62f00900255ed807c580775174252999286f283e646d675a49"}, - {file = "aiohttp-3.13.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:49ce7525853a981fc35d380aa2353536a01a9ec1b30979ea4e35966316cace7e"}, - {file = "aiohttp-3.13.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2117be9883501eaf95503bd313eb4c7a23d567edd44014ba15835a1e9ec6d852"}, - {file = "aiohttp-3.13.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d169c47e40c911f728439da853b6fd06da83761012e6e76f11cb62cddae7282b"}, - {file = "aiohttp-3.13.0-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:703ad3f742fc81e543638a7bebddd35acadaa0004a5e00535e795f4b6f2c25ca"}, - {file = "aiohttp-3.13.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5bf635c3476f4119b940cc8d94ad454cbe0c377e61b4527f0192aabeac1e9370"}, - {file = "aiohttp-3.13.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:cfe6285ef99e7ee51cef20609be2bc1dd0e8446462b71c9db8bb296ba632810a"}, - {file = "aiohttp-3.13.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:34d8af6391c5f2e69749d7f037b614b8c5c42093c251f336bdbfa4b03c57d6c4"}, - {file = "aiohttp-3.13.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:12f5d820fadc5848d4559ea838aef733cf37ed2a1103bba148ac2f5547c14c29"}, - {file = "aiohttp-3.13.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:0f1338b61ea66f4757a0544ed8a02ccbf60e38d9cfb3225888888dd4475ebb96"}, - {file = "aiohttp-3.13.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:582770f82513419512da096e8df21ca44f86a2e56e25dc93c5ab4df0fe065bf0"}, - {file = "aiohttp-3.13.0-cp313-cp313-win32.whl", hash = "sha256:3194b8cab8dbc882f37c13ef1262e0a3d62064fa97533d3aa124771f7bf1ecee"}, - {file = "aiohttp-3.13.0-cp313-cp313-win_amd64.whl", hash = "sha256:7897298b3eedc790257fef8a6ec582ca04e9dbe568ba4a9a890913b925b8ea21"}, - {file = "aiohttp-3.13.0.tar.gz", hash = "sha256:378dbc57dd8cf341ce243f13fa1fa5394d68e2e02c15cd5f28eae35a70ec7f67"}, + {file = "aiohttp-3.13.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4647d02df098f6434bafd7f32ad14942f05a9caa06c7016fdcc816f343997dd0"}, + {file = "aiohttp-3.13.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e3403f24bcb9c3b29113611c3c16a2a447c3953ecf86b79775e7be06f7ae7ccb"}, + {file = "aiohttp-3.13.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:43dff14e35aba17e3d6d5ba628858fb8cb51e30f44724a2d2f0c75be492c55e9"}, + {file = "aiohttp-3.13.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e2a9ea08e8c58bb17655630198833109227dea914cd20be660f52215f6de5613"}, + {file = "aiohttp-3.13.2-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:53b07472f235eb80e826ad038c9d106c2f653584753f3ddab907c83f49eedead"}, + {file = "aiohttp-3.13.2-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e736c93e9c274fce6419af4aac199984d866e55f8a4cec9114671d0ea9688780"}, + {file = "aiohttp-3.13.2-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ff5e771f5dcbc81c64898c597a434f7682f2259e0cd666932a913d53d1341d1a"}, + {file = "aiohttp-3.13.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a3b6fb0c207cc661fa0bf8c66d8d9b657331ccc814f4719468af61034b478592"}, + {file = "aiohttp-3.13.2-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:97a0895a8e840ab3520e2288db7cace3a1981300d48babeb50e7425609e2e0ab"}, + {file = "aiohttp-3.13.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9e8f8afb552297aca127c90cb840e9a1d4bfd6a10d7d8f2d9176e1acc69bad30"}, + {file = "aiohttp-3.13.2-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:ed2f9c7216e53c3df02264f25d824b079cc5914f9e2deba94155190ef648ee40"}, + {file = "aiohttp-3.13.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:99c5280a329d5fa18ef30fd10c793a190d996567667908bef8a7f81f8202b948"}, + {file = "aiohttp-3.13.2-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:2ca6ffef405fc9c09a746cb5d019c1672cd7f402542e379afc66b370833170cf"}, + {file = "aiohttp-3.13.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:47f438b1a28e926c37632bff3c44df7d27c9b57aaf4e34b1def3c07111fdb782"}, + {file = "aiohttp-3.13.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9acda8604a57bb60544e4646a4615c1866ee6c04a8edef9b8ee6fd1d8fa2ddc8"}, + {file = "aiohttp-3.13.2-cp311-cp311-win32.whl", hash = "sha256:868e195e39b24aaa930b063c08bb0c17924899c16c672a28a65afded9c46c6ec"}, + {file = "aiohttp-3.13.2-cp311-cp311-win_amd64.whl", hash = "sha256:7fd19df530c292542636c2a9a85854fab93474396a52f1695e799186bbd7f24c"}, + {file = "aiohttp-3.13.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:b1e56bab2e12b2b9ed300218c351ee2a3d8c8fdab5b1ec6193e11a817767e47b"}, + {file = "aiohttp-3.13.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:364e25edaabd3d37b1db1f0cbcee8c73c9a3727bfa262b83e5e4cf3489a2a9dc"}, + {file = "aiohttp-3.13.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c5c94825f744694c4b8db20b71dba9a257cd2ba8e010a803042123f3a25d50d7"}, + {file = "aiohttp-3.13.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ba2715d842ffa787be87cbfce150d5e88c87a98e0b62e0f5aa489169a393dbbb"}, + {file = "aiohttp-3.13.2-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:585542825c4bc662221fb257889e011a5aa00f1ae4d75d1d246a5225289183e3"}, + {file = "aiohttp-3.13.2-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:39d02cb6025fe1aabca329c5632f48c9532a3dabccd859e7e2f110668972331f"}, + {file = "aiohttp-3.13.2-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e67446b19e014d37342f7195f592a2a948141d15a312fe0e700c2fd2f03124f6"}, + {file = "aiohttp-3.13.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4356474ad6333e41ccefd39eae869ba15a6c5299c9c01dfdcfdd5c107be4363e"}, + {file = "aiohttp-3.13.2-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:eeacf451c99b4525f700f078becff32c32ec327b10dcf31306a8a52d78166de7"}, + {file = "aiohttp-3.13.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d8a9b889aeabd7a4e9af0b7f4ab5ad94d42e7ff679aaec6d0db21e3b639ad58d"}, + {file = "aiohttp-3.13.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:fa89cb11bc71a63b69568d5b8a25c3ca25b6d54c15f907ca1c130d72f320b76b"}, + {file = "aiohttp-3.13.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:8aa7c807df234f693fed0ecd507192fc97692e61fee5702cdc11155d2e5cadc8"}, + {file = "aiohttp-3.13.2-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:9eb3e33fdbe43f88c3c75fa608c25e7c47bbd80f48d012763cb67c47f39a7e16"}, + {file = "aiohttp-3.13.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9434bc0d80076138ea986833156c5a48c9c7a8abb0c96039ddbb4afc93184169"}, + {file = "aiohttp-3.13.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ff15c147b2ad66da1f2cbb0622313f2242d8e6e8f9b79b5206c84523a4473248"}, + {file = "aiohttp-3.13.2-cp312-cp312-win32.whl", hash = "sha256:27e569eb9d9e95dbd55c0fc3ec3a9335defbf1d8bc1d20171a49f3c4c607b93e"}, + {file = "aiohttp-3.13.2-cp312-cp312-win_amd64.whl", hash = "sha256:8709a0f05d59a71f33fd05c17fc11fcb8c30140506e13c2f5e8ee1b8964e1b45"}, + {file = "aiohttp-3.13.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7519bdc7dfc1940d201651b52bf5e03f5503bda45ad6eacf64dda98be5b2b6be"}, + {file = "aiohttp-3.13.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:088912a78b4d4f547a1f19c099d5a506df17eacec3c6f4375e2831ec1d995742"}, + {file = "aiohttp-3.13.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5276807b9de9092af38ed23ce120539ab0ac955547b38563a9ba4f5b07b95293"}, + {file = "aiohttp-3.13.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1237c1375eaef0db4dcd7c2559f42e8af7b87ea7d295b118c60c36a6e61cb811"}, + {file = "aiohttp-3.13.2-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:96581619c57419c3d7d78703d5b78c1e5e5fc0172d60f555bdebaced82ded19a"}, + {file = "aiohttp-3.13.2-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a2713a95b47374169409d18103366de1050fe0ea73db358fc7a7acb2880422d4"}, + {file = "aiohttp-3.13.2-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:228a1cd556b3caca590e9511a89444925da87d35219a49ab5da0c36d2d943a6a"}, + {file = "aiohttp-3.13.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ac6cde5fba8d7d8c6ac963dbb0256a9854e9fafff52fbcc58fdf819357892c3e"}, + {file = "aiohttp-3.13.2-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f2bef8237544f4e42878c61cef4e2839fee6346dc60f5739f876a9c50be7fcdb"}, + {file = "aiohttp-3.13.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:16f15a4eac3bc2d76c45f7ebdd48a65d41b242eb6c31c2245463b40b34584ded"}, + {file = "aiohttp-3.13.2-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:bb7fb776645af5cc58ab804c58d7eba545a97e047254a52ce89c157b5af6cd0b"}, + {file = "aiohttp-3.13.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:e1b4951125ec10c70802f2cb09736c895861cd39fd9dcb35107b4dc8ae6220b8"}, + {file = "aiohttp-3.13.2-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:550bf765101ae721ee1d37d8095f47b1f220650f85fe1af37a90ce75bab89d04"}, + {file = "aiohttp-3.13.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:fe91b87fc295973096251e2d25a811388e7d8adf3bd2b97ef6ae78bc4ac6c476"}, + {file = "aiohttp-3.13.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e0c8e31cfcc4592cb200160344b2fb6ae0f9e4effe06c644b5a125d4ae5ebe23"}, + {file = "aiohttp-3.13.2-cp313-cp313-win32.whl", hash = "sha256:0740f31a60848d6edb296a0df827473eede90c689b8f9f2a4cdde74889eb2254"}, + {file = "aiohttp-3.13.2-cp313-cp313-win_amd64.whl", hash = "sha256:a88d13e7ca367394908f8a276b89d04a3652044612b9a408a0bb22a5ed976a1a"}, + {file = "aiohttp-3.13.2.tar.gz", hash = "sha256:40176a52c186aefef6eb3cad2cdd30cd06e3afbe88fe8ab2af9c0b90f228daca"}, ] [[package]] @@ -153,21 +153,6 @@ files = [ {file = "anomalib-2.1.0.tar.gz", hash = "sha256:b3e21cd6a7a5119151fe0b2b4ccf891b823f62ba540c1ec46b3538d7abdc8940"}, ] -[[package]] -name = "anomalib" -version = "2.1.0" -extras = ["vlm_clip"] -requires_python = ">=3.10" -summary = "anomalib - Anomaly Detection Library" -groups = ["default"] -dependencies = [ - "anomalib==2.1.0", -] -files = [ - {file = "anomalib-2.1.0-py3-none-any.whl", hash = "sha256:b1689a7e50f2be9fc802cd079165f13c3f5708518151702b31bf5cc1512545fd"}, - {file = "anomalib-2.1.0.tar.gz", hash = "sha256:b3e21cd6a7a5119151fe0b2b4ccf891b823f62ba540c1ec46b3538d7abdc8940"}, -] - [[package]] name = "antlr4-python3-runtime" version = "4.9.3" @@ -1111,29 +1096,29 @@ files = [ [[package]] name = "fsspec" -version = "2025.9.0" +version = "2025.10.0" requires_python = ">=3.9" summary = "File-system specification" groups = ["default"] files = [ - {file = "fsspec-2025.9.0-py3-none-any.whl", hash = "sha256:530dc2a2af60a414a832059574df4a6e10cce927f6f4a78209390fe38955cfb7"}, - {file = "fsspec-2025.9.0.tar.gz", hash = "sha256:19fd429483d25d28b65ec68f9f4adc16c17ea2c7c7bf54ec61360d478fb19c19"}, + {file = "fsspec-2025.10.0-py3-none-any.whl", hash = "sha256:7c7712353ae7d875407f97715f0e1ffcc21e33d5b24556cb1e090ae9409ec61d"}, + {file = "fsspec-2025.10.0.tar.gz", hash = "sha256:b6789427626f068f9a83ca4e8a3cc050850b6c0f71f99ddb4f542b8266a26a59"}, ] [[package]] name = "fsspec" -version = "2025.9.0" +version = "2025.10.0" extras = ["http"] requires_python = ">=3.9" summary = "File-system specification" groups = ["default"] dependencies = [ "aiohttp!=4.0.0a0,!=4.0.0a1", - "fsspec==2025.9.0", + "fsspec==2025.10.0", ] files = [ - {file = "fsspec-2025.9.0-py3-none-any.whl", hash = "sha256:530dc2a2af60a414a832059574df4a6e10cce927f6f4a78209390fe38955cfb7"}, - {file = "fsspec-2025.9.0.tar.gz", hash = "sha256:19fd429483d25d28b65ec68f9f4adc16c17ea2c7c7bf54ec61360d478fb19c19"}, + {file = "fsspec-2025.10.0-py3-none-any.whl", hash = "sha256:7c7712353ae7d875407f97715f0e1ffcc21e33d5b24556cb1e090ae9409ec61d"}, + {file = "fsspec-2025.10.0.tar.gz", hash = "sha256:b6789427626f068f9a83ca4e8a3cc050850b6c0f71f99ddb4f542b8266a26a59"}, ] [[package]] @@ -1245,17 +1230,17 @@ files = [ [[package]] name = "imageio" -version = "2.37.0" +version = "2.37.2" requires_python = ">=3.9" -summary = "Library for reading and writing a wide range of image, video, scientific, and volumetric data formats." +summary = "Read and write images and video across all major formats. Supports scientific and volumetric data." groups = ["default"] dependencies = [ "numpy", "pillow>=8.3.2", ] files = [ - {file = "imageio-2.37.0-py3-none-any.whl", hash = "sha256:11efa15b87bc7871b61590326b2d635439acc321cf7f8ce996f812543ce10eed"}, - {file = "imageio-2.37.0.tar.gz", hash = "sha256:71b57b3669666272c818497aebba2b4c5f20d5b37c81720e5e1a56d59c492996"}, + {file = "imageio-2.37.2-py3-none-any.whl", hash = "sha256:ad9adfb20335d718c03de457358ed69f141021a333c40a53e57273d8a5bd0b9b"}, + {file = "imageio-2.37.2.tar.gz", hash = "sha256:0212ef2727ac9caa5ca4b2c75ae89454312f440a756fcfc8ef1993e718f50f8a"}, ] [[package]] @@ -1440,7 +1425,7 @@ files = [ [[package]] name = "jsonargparse" -version = "4.41.0" +version = "4.43.0" requires_python = ">=3.9" summary = "Implement minimal boilerplate CLIs derived from type hints and parse from command line, config files and environment variables." groups = ["default"] @@ -1448,42 +1433,42 @@ dependencies = [ "PyYAML>=3.13", ] files = [ - {file = "jsonargparse-4.41.0-py3-none-any.whl", hash = "sha256:cd49b6a2fea723ee4d80f9df034f51af226128a7f166be8755d6acdeb3e077a7"}, - {file = "jsonargparse-4.41.0.tar.gz", hash = "sha256:ba1806bf0ed0ad1975e403dffb18b3a755fee3bfe4e7b36d8cce2f297b552b5f"}, + {file = "jsonargparse-4.43.0-py3-none-any.whl", hash = "sha256:9b0d427277ddf87fd6b7160fe83e83dc4418b0fe71b649b0586e7c56effa49f1"}, + {file = "jsonargparse-4.43.0.tar.gz", hash = "sha256:b1a4b4a5f938d2902d5f65e84ba361fb4a451c1f4609aac2c07e9c75d42e111f"}, ] [[package]] name = "jsonargparse" -version = "4.41.0" +version = "4.43.0" extras = ["signatures"] requires_python = ">=3.9" summary = "Implement minimal boilerplate CLIs derived from type hints and parse from command line, config files and environment variables." groups = ["default"] dependencies = [ "docstring-parser>=0.17", - "jsonargparse==4.41.0", + "jsonargparse==4.43.0", "jsonargparse[typing-extensions]", "typeshed-client>=2.8.2", ] files = [ - {file = "jsonargparse-4.41.0-py3-none-any.whl", hash = "sha256:cd49b6a2fea723ee4d80f9df034f51af226128a7f166be8755d6acdeb3e077a7"}, - {file = "jsonargparse-4.41.0.tar.gz", hash = "sha256:ba1806bf0ed0ad1975e403dffb18b3a755fee3bfe4e7b36d8cce2f297b552b5f"}, + {file = "jsonargparse-4.43.0-py3-none-any.whl", hash = "sha256:9b0d427277ddf87fd6b7160fe83e83dc4418b0fe71b649b0586e7c56effa49f1"}, + {file = "jsonargparse-4.43.0.tar.gz", hash = "sha256:b1a4b4a5f938d2902d5f65e84ba361fb4a451c1f4609aac2c07e9c75d42e111f"}, ] [[package]] name = "jsonargparse" -version = "4.41.0" +version = "4.43.0" extras = ["typing-extensions"] requires_python = ">=3.9" summary = "Implement minimal boilerplate CLIs derived from type hints and parse from command line, config files and environment variables." groups = ["default"] dependencies = [ - "jsonargparse==4.41.0", + "jsonargparse==4.43.0", "typing-extensions>=3.10.0.0; python_version < \"3.10\"", ] files = [ - {file = "jsonargparse-4.41.0-py3-none-any.whl", hash = "sha256:cd49b6a2fea723ee4d80f9df034f51af226128a7f166be8755d6acdeb3e077a7"}, - {file = "jsonargparse-4.41.0.tar.gz", hash = "sha256:ba1806bf0ed0ad1975e403dffb18b3a755fee3bfe4e7b36d8cce2f297b552b5f"}, + {file = "jsonargparse-4.43.0-py3-none-any.whl", hash = "sha256:9b0d427277ddf87fd6b7160fe83e83dc4418b0fe71b649b0586e7c56effa49f1"}, + {file = "jsonargparse-4.43.0.tar.gz", hash = "sha256:b1a4b4a5f938d2902d5f65e84ba361fb4a451c1f4609aac2c07e9c75d42e111f"}, ] [[package]] @@ -1809,48 +1794,48 @@ files = [ [[package]] name = "kornia" -version = "0.8.1" +version = "0.8.2" requires_python = ">=3.9" summary = "Open Source Differentiable Computer Vision Library for PyTorch" groups = ["default"] dependencies = [ "kornia-rs>=0.1.9", "packaging", - "torch>=1.9.1", + "torch>=2.0.0", ] files = [ - {file = "kornia-0.8.1-py2.py3-none-any.whl", hash = "sha256:5dcb00faa795dfb45a3630d771387290bc4f40473451352ca250e5bcc81af3d1"}, - {file = "kornia-0.8.1.tar.gz", hash = "sha256:9ce5a54a11df661794934a293f89f8b8d49e83dd09b0b9419f6082ab07afe433"}, + {file = "kornia-0.8.2-py2.py3-none-any.whl", hash = "sha256:32dfe77c9c74a87a2de49395aa3c2c376a1b63c27611a298b394d02d13905819"}, + {file = "kornia-0.8.2.tar.gz", hash = "sha256:5411b2ce0dd909d1608016308cd68faeef90f88c47f47e8ecd40553fd4d8b937"}, ] [[package]] name = "kornia-rs" -version = "0.1.9" +version = "0.1.10" requires_python = ">=3.8" summary = "Low level implementations for computer vision in Rust" groups = ["default"] files = [ - {file = "kornia_rs-0.1.9-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:a0f45987702e816f34bc0fcac253c504932d8ca877c9ab644d8445e7de737aec"}, - {file = "kornia_rs-0.1.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9bb863f3ff42919749b7db4a56f2adb076a10d3c57907305898c72e643fa3d5d"}, - {file = "kornia_rs-0.1.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54604bc8eb7d4d703eac19963378b4d6a72432a3f0da765edb1b0396d10def01"}, - {file = "kornia_rs-0.1.9-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6cdda9133297c4cff2c2c54be44d5c39bce715306d0bccb8ab1fae7c0dc7cf63"}, - {file = "kornia_rs-0.1.9-cp311-cp311-win_amd64.whl", hash = "sha256:689929d8dab80928feedbcdc2375060a3fe02b32fbf0dba12ae3fefb605fd089"}, - {file = "kornia_rs-0.1.9-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:889b4121f830d8827260f0246554f8bd722137d98db0bf3c2b0f5b1812cf5c63"}, - {file = "kornia_rs-0.1.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a0834f6aa44a35b486fe9802516dde24ec5d8b3b51563f18b488098062074671"}, - {file = "kornia_rs-0.1.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e52ead233c9d0b924eee4b906f26f32fde1e236a30723525dfb2b1a610bd48b"}, - {file = "kornia_rs-0.1.9-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e74a8901843e8e5e47f495927462288c7b7b8dc8a253495051c72a5fbda5f664"}, - {file = "kornia_rs-0.1.9-cp312-cp312-win_amd64.whl", hash = "sha256:fdfe0baa04800e541425730d03f3b3d217a1a6f0303926889b443b4562c0fda5"}, - {file = "kornia_rs-0.1.9-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:e82f5d90ad5b3d02d28535d19bf612e25ca559003d56fad1d12cd173be5d8418"}, - {file = "kornia_rs-0.1.9-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:876f0805ed8d05bd94d6b9a6c43161cdc74bc5c4508f5b737d6975d1dcf9016d"}, - {file = "kornia_rs-0.1.9-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00021bb1941766e1e9e8c2cdbebcf33a08f8de3586e6efc791b9580a7e52b5ed"}, - {file = "kornia_rs-0.1.9-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9feaa6d410bc4d0609f3c1f2c0c010743706c2f5eed6f5ded10f2b8fec32acdf"}, - {file = "kornia_rs-0.1.9-cp313-cp313-win_amd64.whl", hash = "sha256:4d063e9d74d2b198f080940cd1679cfb66004cd59bb7cc20e0bcf5874ce3d200"}, - {file = "kornia_rs-0.1.9-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:f8d03da3dba89fd290f4df012f49262cde128e3682632b5c498b34909d875190"}, - {file = "kornia_rs-0.1.9-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:cef15e7db4cd05ebedc25cd62616c38346f71f7e8a2fb751feacc8726e7e417e"}, - {file = "kornia_rs-0.1.9-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d6ea40aa2027f62e90c590112fc4be4a787092359ed041479d2b015c0483c97"}, - {file = "kornia_rs-0.1.9-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e9282a70c9e81710f04fdb23617c73191324ccc070c7f96d62efb5bf66dc242a"}, - {file = "kornia_rs-0.1.9-cp313-cp313t-win_amd64.whl", hash = "sha256:cd6b9860ca2fd6103340f4f977f74fa96562d89563e36c00059f2d96c7cea464"}, - {file = "kornia_rs-0.1.9.tar.gz", hash = "sha256:c7e45e84eb3c2454055326f86329e48a68743507460fb7e39315397fa6eeb9a0"}, + {file = "kornia_rs-0.1.10-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:6757940733f13c52c4f142b9b11e3e9bd12ef9d209e333300602e86e21f5ae2f"}, + {file = "kornia_rs-0.1.10-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:68e90101a34ba2bbce920332b25fd4d25c8c546d9a241b2606a6d886df2dd1ed"}, + {file = "kornia_rs-0.1.10-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b0adb81858a8963455f2f0da01fcd6ea3296147b918306488edeeaf6bc2a979"}, + {file = "kornia_rs-0.1.10-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c3e237a8428524ad9f86599c0c47b355bc3007669fe297ea3fbd59cd64bc2f7"}, + {file = "kornia_rs-0.1.10-cp311-cp311-win_amd64.whl", hash = "sha256:1d300ea6d4666e47302fba6cc438556d91e37ce41caf291a9a04a8f74c231d0b"}, + {file = "kornia_rs-0.1.10-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f0809277e51156d59be3c39605ba9659e94f7a4cf3b0b6c035ec2f06f6067881"}, + {file = "kornia_rs-0.1.10-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8ecf2ba0291cc1bb178073d56e46b16296a8864a20272b63af02ee88771cb574"}, + {file = "kornia_rs-0.1.10-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d874ca12dd58871f9849672d9bf9fa998398470a88b52d61223ce2133b196662"}, + {file = "kornia_rs-0.1.10-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f332a2a034cc791006f25c2d85e342a060887145e9236e8e43562badcadededf"}, + {file = "kornia_rs-0.1.10-cp312-cp312-win_amd64.whl", hash = "sha256:34111ce1c8abe930079b4b0aeb8d372f876c621a867ed03f77181de685e71a8f"}, + {file = "kornia_rs-0.1.10-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:950a943f91c2cff94d80282886b0d48bbc15ef4a7cc4b15ac819724dfdb2f414"}, + {file = "kornia_rs-0.1.10-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:63b802aaf95590276d3426edc6d23ff11caf269d2bc2ec37cb6c679b7b2a8ee0"}, + {file = "kornia_rs-0.1.10-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38087da7cdf2bffe10530c0d53335dd1fc107fae6521f2dd4797c6522b6d11b3"}, + {file = "kornia_rs-0.1.10-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa3464de8f9920d87415721c36840ceea23e054dcb54dd9f69189ba9eabce0c7"}, + {file = "kornia_rs-0.1.10-cp313-cp313-win_amd64.whl", hash = "sha256:c57d157bebe64c22e2e44c72455b1c7365eee4d767e0c187dc28f22d072ebaf7"}, + {file = "kornia_rs-0.1.10-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:0b375f02422ef5986caed612799b4ddcc91f57f303906868b0a8c397a17e7607"}, + {file = "kornia_rs-0.1.10-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f2bcfa438d6b5dbe07d573afc980f2871f6639b2eac5148b8c0bba4f82357b9a"}, + {file = "kornia_rs-0.1.10-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:021b0a02b2356b12b3954a298f369ed4fe2dd522dcf8b6d72f91bf3bd8eea201"}, + {file = "kornia_rs-0.1.10-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d9b07e2ae79e423b3248d94afd092e324c5ddfe3157fafc047531cc8bffa6a3"}, + {file = "kornia_rs-0.1.10-cp313-cp313t-win_amd64.whl", hash = "sha256:b80a037e34d63cb021bcd5fc571e41aff804a2981311f66e883768c6b8e5f8de"}, + {file = "kornia_rs-0.1.10.tar.gz", hash = "sha256:5fd3fbc65240fa751975f5870b079f98e7fdcaa2885ea577b3da324d8bf01d81"}, ] [[package]] @@ -1881,7 +1866,7 @@ files = [ [[package]] name = "lightning" -version = "2.5.5" +version = "2.5.6" requires_python = ">=3.9" summary = "The Deep Learning framework to train, deploy, and ship AI products Lightning fast." groups = ["default"] @@ -1897,8 +1882,8 @@ dependencies = [ "typing-extensions<6.0,>4.5.0", ] files = [ - {file = "lightning-2.5.5-py3-none-any.whl", hash = "sha256:69eb248beadd7b600bf48eff00a0ec8af171ec7a678d23787c4aedf12e225e8f"}, - {file = "lightning-2.5.5.tar.gz", hash = "sha256:4d3d66c5b1481364a7e6a1ce8ddde1777a04fa740a3145ec218a9941aed7dd30"}, + {file = "lightning-2.5.6-py3-none-any.whl", hash = "sha256:25bb2053078c2efc57c082fda89dfbd975dfa76beb08def191947c2b571a8c8a"}, + {file = "lightning-2.5.6.tar.gz", hash = "sha256:57b6abe87080895bc237fb7f36b7b4abaa2793760cbca00e3907e56607e0ed27"}, ] [[package]] @@ -3198,7 +3183,7 @@ files = [ [[package]] name = "pytorch-lightning" -version = "2.5.5" +version = "2.5.6" requires_python = ">=3.9" summary = "PyTorch Lightning is the lightweight PyTorch wrapper for ML researchers. Scale your models. Write less boilerplate." groups = ["default"] @@ -3213,8 +3198,8 @@ dependencies = [ "typing-extensions>4.5.0", ] files = [ - {file = "pytorch_lightning-2.5.5-py3-none-any.whl", hash = "sha256:0b533991df2353c0c6ea9ca10a7d0728b73631fd61f5a15511b19bee2aef8af0"}, - {file = "pytorch_lightning-2.5.5.tar.gz", hash = "sha256:d6fc8173d1d6e49abfd16855ea05d2eb2415e68593f33d43e59028ecb4e64087"}, + {file = "pytorch_lightning-2.5.6-py3-none-any.whl", hash = "sha256:037bad1e2fd94d5eb6c5144f045fd4c1070c3d38fc9c14d9f3774a3a9be54dff"}, + {file = "pytorch_lightning-2.5.6.tar.gz", hash = "sha256:c428faaceef74be50b870814d0d7e9f9c6ee748b8769a2afd3366bc69daf3a0f"}, ] [[package]] @@ -3518,7 +3503,7 @@ files = [ [[package]] name = "rich-argparse" -version = "1.7.1" +version = "1.7.2" requires_python = ">=3.8" summary = "Rich help formatters for argparse and optparse" groups = ["default"] @@ -3526,8 +3511,8 @@ dependencies = [ "rich>=11.0.0", ] files = [ - {file = "rich_argparse-1.7.1-py3-none-any.whl", hash = "sha256:a8650b42e4a4ff72127837632fba6b7da40784842f08d7395eb67a9cbd7b4bf9"}, - {file = "rich_argparse-1.7.1.tar.gz", hash = "sha256:d7a493cde94043e41ea68fb43a74405fa178de981bf7b800f7a3bd02ac5c27be"}, + {file = "rich_argparse-1.7.2-py3-none-any.whl", hash = "sha256:0559b1f47a19bbeb82bf15f95a057f99bcbbc98385532f57937f9fc57acc501a"}, + {file = "rich_argparse-1.7.2.tar.gz", hash = "sha256:64fd2e948fc96e8a1a06e0e72c111c2ce7f3af74126d75c0f5f63926e7289cd1"}, ] [[package]] @@ -3754,7 +3739,7 @@ files = [ [[package]] name = "scipy" -version = "1.16.2" +version = "1.16.3" requires_python = ">=3.11" summary = "Fundamental algorithms for scientific computing in Python" groups = ["default"] @@ -3762,47 +3747,47 @@ dependencies = [ "numpy<2.6,>=1.25.2", ] files = [ - {file = "scipy-1.16.2-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:6ab88ea43a57da1af33292ebd04b417e8e2eaf9d5aa05700be8d6e1b6501cd92"}, - {file = "scipy-1.16.2-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:c95e96c7305c96ede73a7389f46ccd6c659c4da5ef1b2789466baeaed3622b6e"}, - {file = "scipy-1.16.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:87eb178db04ece7c698220d523c170125dbffebb7af0345e66c3554f6f60c173"}, - {file = "scipy-1.16.2-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:4e409eac067dcee96a57fbcf424c13f428037827ec7ee3cb671ff525ca4fc34d"}, - {file = "scipy-1.16.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e574be127bb760f0dad24ff6e217c80213d153058372362ccb9555a10fc5e8d2"}, - {file = "scipy-1.16.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f5db5ba6188d698ba7abab982ad6973265b74bb40a1efe1821b58c87f73892b9"}, - {file = "scipy-1.16.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ec6e74c4e884104ae006d34110677bfe0098203a3fec2f3faf349f4cb05165e3"}, - {file = "scipy-1.16.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:912f46667d2d3834bc3d57361f854226475f695eb08c08a904aadb1c936b6a88"}, - {file = "scipy-1.16.2-cp311-cp311-win_amd64.whl", hash = "sha256:91e9e8a37befa5a69e9cacbe0bcb79ae5afb4a0b130fd6db6ee6cc0d491695fa"}, - {file = "scipy-1.16.2-cp311-cp311-win_arm64.whl", hash = "sha256:f3bf75a6dcecab62afde4d1f973f1692be013110cad5338007927db8da73249c"}, - {file = "scipy-1.16.2-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:89d6c100fa5c48472047632e06f0876b3c4931aac1f4291afc81a3644316bb0d"}, - {file = "scipy-1.16.2-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:ca748936cd579d3f01928b30a17dc474550b01272d8046e3e1ee593f23620371"}, - {file = "scipy-1.16.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:fac4f8ce2ddb40e2e3d0f7ec36d2a1e7f92559a2471e59aec37bd8d9de01fec0"}, - {file = "scipy-1.16.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:033570f1dcefd79547a88e18bccacff025c8c647a330381064f561d43b821232"}, - {file = "scipy-1.16.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ea3421209bf00c8a5ef2227de496601087d8f638a2363ee09af059bd70976dc1"}, - {file = "scipy-1.16.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f66bd07ba6f84cd4a380b41d1bf3c59ea488b590a2ff96744845163309ee8e2f"}, - {file = "scipy-1.16.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5e9feab931bd2aea4a23388c962df6468af3d808ddf2d40f94a81c5dc38f32ef"}, - {file = "scipy-1.16.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:03dfc75e52f72cf23ec2ced468645321407faad8f0fe7b1f5b49264adbc29cb1"}, - {file = "scipy-1.16.2-cp312-cp312-win_amd64.whl", hash = "sha256:0ce54e07bbb394b417457409a64fd015be623f36e330ac49306433ffe04bc97e"}, - {file = "scipy-1.16.2-cp312-cp312-win_arm64.whl", hash = "sha256:2a8ffaa4ac0df81a0b94577b18ee079f13fecdb924df3328fc44a7dc5ac46851"}, - {file = "scipy-1.16.2-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:84f7bf944b43e20b8a894f5fe593976926744f6c185bacfcbdfbb62736b5cc70"}, - {file = "scipy-1.16.2-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:5c39026d12edc826a1ef2ad35ad1e6d7f087f934bb868fc43fa3049c8b8508f9"}, - {file = "scipy-1.16.2-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:e52729ffd45b68777c5319560014d6fd251294200625d9d70fd8626516fc49f5"}, - {file = "scipy-1.16.2-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:024dd4a118cccec09ca3209b7e8e614931a6ffb804b2a601839499cb88bdf925"}, - {file = "scipy-1.16.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7a5dc7ee9c33019973a470556081b0fd3c9f4c44019191039f9769183141a4d9"}, - {file = "scipy-1.16.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c2275ff105e508942f99d4e3bc56b6ef5e4b3c0af970386ca56b777608ce95b7"}, - {file = "scipy-1.16.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:af80196eaa84f033e48444d2e0786ec47d328ba00c71e4299b602235ffef9acb"}, - {file = "scipy-1.16.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9fb1eb735fe3d6ed1f89918224e3385fbf6f9e23757cacc35f9c78d3b712dd6e"}, - {file = "scipy-1.16.2-cp313-cp313-win_amd64.whl", hash = "sha256:fda714cf45ba43c9d3bae8f2585c777f64e3f89a2e073b668b32ede412d8f52c"}, - {file = "scipy-1.16.2-cp313-cp313-win_arm64.whl", hash = "sha256:2f5350da923ccfd0b00e07c3e5cfb316c1c0d6c1d864c07a72d092e9f20db104"}, - {file = "scipy-1.16.2-cp313-cp313t-macosx_10_14_x86_64.whl", hash = "sha256:53d8d2ee29b925344c13bda64ab51785f016b1b9617849dac10897f0701b20c1"}, - {file = "scipy-1.16.2-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:9e05e33657efb4c6a9d23bd8300101536abd99c85cca82da0bffff8d8764d08a"}, - {file = "scipy-1.16.2-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:7fe65b36036357003b3ef9d37547abeefaa353b237e989c21027b8ed62b12d4f"}, - {file = "scipy-1.16.2-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:6406d2ac6d40b861cccf57f49592f9779071655e9f75cd4f977fa0bdd09cb2e4"}, - {file = "scipy-1.16.2-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ff4dc42bd321991fbf611c23fc35912d690f731c9914bf3af8f417e64aca0f21"}, - {file = "scipy-1.16.2-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:654324826654d4d9133e10675325708fb954bc84dae6e9ad0a52e75c6b1a01d7"}, - {file = "scipy-1.16.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:63870a84cd15c44e65220eaed2dac0e8f8b26bbb991456a033c1d9abfe8a94f8"}, - {file = "scipy-1.16.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:fa01f0f6a3050fa6a9771a95d5faccc8e2f5a92b4a2e5440a0fa7264a2398472"}, - {file = "scipy-1.16.2-cp313-cp313t-win_amd64.whl", hash = "sha256:116296e89fba96f76353a8579820c2512f6e55835d3fad7780fece04367de351"}, - {file = "scipy-1.16.2-cp313-cp313t-win_arm64.whl", hash = "sha256:98e22834650be81d42982360382b43b17f7ba95e0e6993e2a4f5b9ad9283a94d"}, - {file = "scipy-1.16.2.tar.gz", hash = "sha256:af029b153d243a80afb6eabe40b0a07f8e35c9adc269c019f364ad747f826a6b"}, + {file = "scipy-1.16.3-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:40be6cf99e68b6c4321e9f8782e7d5ff8265af28ef2cd56e9c9b2638fa08ad97"}, + {file = "scipy-1.16.3-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:8be1ca9170fcb6223cc7c27f4305d680ded114a1567c0bd2bfcbf947d1b17511"}, + {file = "scipy-1.16.3-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:bea0a62734d20d67608660f69dcda23e7f90fb4ca20974ab80b6ed40df87a005"}, + {file = "scipy-1.16.3-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:2a207a6ce9c24f1951241f4693ede2d393f59c07abc159b2cb2be980820e01fb"}, + {file = "scipy-1.16.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:532fb5ad6a87e9e9cd9c959b106b73145a03f04c7d57ea3e6f6bb60b86ab0876"}, + {file = "scipy-1.16.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0151a0749efeaaab78711c78422d413c583b8cdd2011a3c1d6c794938ee9fdb2"}, + {file = "scipy-1.16.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b7180967113560cca57418a7bc719e30366b47959dd845a93206fbed693c867e"}, + {file = "scipy-1.16.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:deb3841c925eeddb6afc1e4e4a45e418d19ec7b87c5df177695224078e8ec733"}, + {file = "scipy-1.16.3-cp311-cp311-win_amd64.whl", hash = "sha256:53c3844d527213631e886621df5695d35e4f6a75f620dca412bcd292f6b87d78"}, + {file = "scipy-1.16.3-cp311-cp311-win_arm64.whl", hash = "sha256:9452781bd879b14b6f055b26643703551320aa8d79ae064a71df55c00286a184"}, + {file = "scipy-1.16.3-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:81fc5827606858cf71446a5e98715ba0e11f0dbc83d71c7409d05486592a45d6"}, + {file = "scipy-1.16.3-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:c97176013d404c7346bf57874eaac5187d969293bf40497140b0a2b2b7482e07"}, + {file = "scipy-1.16.3-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:2b71d93c8a9936046866acebc915e2af2e292b883ed6e2cbe5c34beb094b82d9"}, + {file = "scipy-1.16.3-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:3d4a07a8e785d80289dfe66b7c27d8634a773020742ec7187b85ccc4b0e7b686"}, + {file = "scipy-1.16.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0553371015692a898e1aa858fed67a3576c34edefa6b7ebdb4e9dde49ce5c203"}, + {file = "scipy-1.16.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:72d1717fd3b5e6ec747327ce9bda32d5463f472c9dce9f54499e81fbd50245a1"}, + {file = "scipy-1.16.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1fb2472e72e24d1530debe6ae078db70fb1605350c88a3d14bc401d6306dbffe"}, + {file = "scipy-1.16.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c5192722cffe15f9329a3948c4b1db789fbb1f05c97899187dcf009b283aea70"}, + {file = "scipy-1.16.3-cp312-cp312-win_amd64.whl", hash = "sha256:56edc65510d1331dae01ef9b658d428e33ed48b4f77b1d51caf479a0253f96dc"}, + {file = "scipy-1.16.3-cp312-cp312-win_arm64.whl", hash = "sha256:a8a26c78ef223d3e30920ef759e25625a0ecdd0d60e5a8818b7513c3e5384cf2"}, + {file = "scipy-1.16.3-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:d2ec56337675e61b312179a1ad124f5f570c00f920cc75e1000025451b88241c"}, + {file = "scipy-1.16.3-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:16b8bc35a4cc24db80a0ec836a9286d0e31b2503cb2fd7ff7fb0e0374a97081d"}, + {file = "scipy-1.16.3-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:5803c5fadd29de0cf27fa08ccbfe7a9e5d741bf63e4ab1085437266f12460ff9"}, + {file = "scipy-1.16.3-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:b81c27fc41954319a943d43b20e07c40bdcd3ff7cf013f4fb86286faefe546c4"}, + {file = "scipy-1.16.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0c3b4dd3d9b08dbce0f3440032c52e9e2ab9f96ade2d3943313dfe51a7056959"}, + {file = "scipy-1.16.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7dc1360c06535ea6116a2220f760ae572db9f661aba2d88074fe30ec2aa1ff88"}, + {file = "scipy-1.16.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:663b8d66a8748051c3ee9c96465fb417509315b99c71550fda2591d7dd634234"}, + {file = "scipy-1.16.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eab43fae33a0c39006a88096cd7b4f4ef545ea0447d250d5ac18202d40b6611d"}, + {file = "scipy-1.16.3-cp313-cp313-win_amd64.whl", hash = "sha256:062246acacbe9f8210de8e751b16fc37458213f124bef161a5a02c7a39284304"}, + {file = "scipy-1.16.3-cp313-cp313-win_arm64.whl", hash = "sha256:50a3dbf286dbc7d84f176f9a1574c705f277cb6565069f88f60db9eafdbe3ee2"}, + {file = "scipy-1.16.3-cp313-cp313t-macosx_10_14_x86_64.whl", hash = "sha256:fb4b29f4cf8cc5a8d628bc8d8e26d12d7278cd1f219f22698a378c3d67db5e4b"}, + {file = "scipy-1.16.3-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:8d09d72dc92742988b0e7750bddb8060b0c7079606c0d24a8cc8e9c9c11f9079"}, + {file = "scipy-1.16.3-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:03192a35e661470197556de24e7cb1330d84b35b94ead65c46ad6f16f6b28f2a"}, + {file = "scipy-1.16.3-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:57d01cb6f85e34f0946b33caa66e892aae072b64b034183f3d87c4025802a119"}, + {file = "scipy-1.16.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:96491a6a54e995f00a28a3c3badfff58fd093bf26cd5fb34a2188c8c756a3a2c"}, + {file = "scipy-1.16.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cd13e354df9938598af2be05822c323e97132d5e6306b83a3b4ee6724c6e522e"}, + {file = "scipy-1.16.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:63d3cdacb8a824a295191a723ee5e4ea7768ca5ca5f2838532d9f2e2b3ce2135"}, + {file = "scipy-1.16.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e7efa2681ea410b10dde31a52b18b0154d66f2485328830e45fdf183af5aefc6"}, + {file = "scipy-1.16.3-cp313-cp313t-win_amd64.whl", hash = "sha256:2d1ae2cf0c350e7705168ff2429962a89ad90c2d49d1dd300686d8b2a5af22fc"}, + {file = "scipy-1.16.3-cp313-cp313t-win_arm64.whl", hash = "sha256:0c623a54f7b79dd88ef56da19bc2873afec9673a48f3b85b18e4d402bdd29a5a"}, + {file = "scipy-1.16.3.tar.gz", hash = "sha256:01e87659402762f43bd2fee13370553a17ada367d42e7487800bf2916535aecb"}, ] [[package]] @@ -3918,7 +3903,7 @@ files = [ [[package]] name = "tifffile" -version = "2025.10.4" +version = "2025.10.16" requires_python = ">=3.11" summary = "Read and write TIFF files" groups = ["default"] @@ -3926,8 +3911,8 @@ dependencies = [ "numpy", ] files = [ - {file = "tifffile-2025.10.4-py3-none-any.whl", hash = "sha256:7687d691e49026053181470cec70fa9250e3a586b2041041297e38b10bbd34e1"}, - {file = "tifffile-2025.10.4.tar.gz", hash = "sha256:2e437c16ab211be5bcdc79f71b4907359115f1f83b5d919e7c297c29725d3e38"}, + {file = "tifffile-2025.10.16-py3-none-any.whl", hash = "sha256:41463d979c1c262b0a5cdef2a7f95f0388a072ad82d899458b154a48609d759c"}, + {file = "tifffile-2025.10.16.tar.gz", hash = "sha256:425179ec7837ac0e07bc95d2ea5bea9b179ce854967c12ba07fc3f093e58efc1"}, ] [[package]] diff --git a/pyproject.toml b/pyproject.toml index 2879c50..5360d87 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -5,7 +5,7 @@ description = "anomaly detection for sensor images for quality assurance process authors = [ {name = "d-opt GmbH (resp.: Florian Foerster)", email = "f.foerster@d-opt.com"}, ] -dependencies = ["imutils>=0.5.4", "dopt-basics>=0.2.4", "numpy>=2.2.6", "anomalib[vlm_clip]>=2.1.0", "open-clip-torch>=3.2.0"] +dependencies = ["imutils>=0.5.4", "dopt-basics>=0.2.4", "numpy>=2.2.6", "open-clip-torch>=3.2.0", "anomalib==2.1.0"] requires-python = "<3.14,>=3.11" readme = "README.md" license = {text = "LicenseRef-Proprietary"} diff --git a/src/dopt_sensor_anomalies/constants.py b/src/dopt_sensor_anomalies/constants.py index 43fcef7..b07c649 100644 --- a/src/dopt_sensor_anomalies/constants.py +++ b/src/dopt_sensor_anomalies/constants.py @@ -6,9 +6,10 @@ STOP_FOLDER_NAME: Final[str] = "python" MODEL_FOLDER_NAME: Final[str] = "models" THRESHOLD_BW: Final[int] = 63 -BACKBONE: Final[str] = "resnet18" -LAYERS: Final[tuple[str, str]] = ("layer1", "layer2") -RATIO: Final[float] = 0.05 +BACKBONE: Final[str] = "wide_resnet50_2" +LAYERS: Final[tuple[str, ...]] = ("layer1", "layer2", "layer3") +RATIO: Final[float] = 0.01 +ANOMALY_THRESHOLD: Final[float] = 0.2 NUM_VALID_ELECTRODES: Final[int] = 6 HEATMAP_FILENAME_SUFFIX: Final[str] = "_Heatmap" diff --git a/src/dopt_sensor_anomalies/detection.c b/src/dopt_sensor_anomalies/detection.c index 3b31c35..05b7ab3 100644 --- a/src/dopt_sensor_anomalies/detection.c +++ b/src/dopt_sensor_anomalies/detection.c @@ -2882,8 +2882,8 @@ typedef struct { PyObject *__pyx_slice[2]; PyObject *__pyx_tuple[7]; PyObject *__pyx_codeobj_tab[12]; - PyObject *__pyx_string_tab[315]; - PyObject *__pyx_number_tab[17]; + PyObject *__pyx_string_tab[316]; + PyObject *__pyx_number_tab[16]; /* #### Code section: module_state_contents ### */ #if CYTHON_USE_FREELISTS @@ -3000,305 +3000,305 @@ static __pyx_mstatetype * const __pyx_mstate_global = &__pyx_mstate_global_stati #define __pyx_kp_u_t_SensorImages __pyx_string_tab[30] #define __pyx_kp_u_tuple_float_float __pyx_string_tab[31] #define __pyx_kp_u_tuple_t_CsvData_t_SensorImages __pyx_string_tab[32] -#define __pyx_n_u_Any __pyx_string_tab[33] -#define __pyx_n_u_BACKBONE __pyx_string_tab[34] -#define __pyx_n_u_Box __pyx_string_tab[35] -#define __pyx_n_u_CHAIN_APPROX_SIMPLE __pyx_string_tab[36] -#define __pyx_n_u_COLOR_BGR2GRAY __pyx_string_tab[37] -#define __pyx_n_u_COLOR_BGR2RGB __pyx_string_tab[38] -#define __pyx_n_u_Canny __pyx_string_tab[39] -#define __pyx_n_u_ContourCalculationError __pyx_string_tab[40] -#define __pyx_n_u_DETECTION_MODELS __pyx_string_tab[41] -#define __pyx_n_u_DataFrame __pyx_string_tab[42] -#define __pyx_n_u_Final __pyx_string_tab[43] -#define __pyx_n_u_HEATMAP_FILENAME_SUFFIX __pyx_string_tab[44] -#define __pyx_n_u_Image __pyx_string_tab[45] -#define __pyx_n_u_ImageNotReadError __pyx_string_tab[46] -#define __pyx_n_u_InferenceResult __pyx_string_tab[47] -#define __pyx_n_u_InvalidElectrodeCount __pyx_string_tab[48] -#define __pyx_n_u_LAYERS __pyx_string_tab[49] -#define __pyx_n_u_MODEL_FOLDER __pyx_string_tab[50] -#define __pyx_n_u_MORPH_CLOSE __pyx_string_tab[51] -#define __pyx_n_u_MORPH_RECT __pyx_string_tab[52] -#define __pyx_n_u_NDArray __pyx_string_tab[53] -#define __pyx_n_u_NUM_VALID_ELECTRODES __pyx_string_tab[54] -#define __pyx_n_u_None __pyx_string_tab[55] -#define __pyx_n_u_PIL __pyx_string_tab[56] -#define __pyx_n_u_Patchcore __pyx_string_tab[57] -#define __pyx_n_u_Path __pyx_string_tab[58] -#define __pyx_n_u_Pyx_PyDict_NextRef __pyx_string_tab[59] -#define __pyx_n_u_QUOTE_NONE __pyx_string_tab[60] -#define __pyx_n_u_RATIO __pyx_string_tab[61] -#define __pyx_n_u_RETR_TREE __pyx_string_tab[62] -#define __pyx_n_u_RGB __pyx_string_tab[63] -#define __pyx_n_u_SensorImages __pyx_string_tab[64] -#define __pyx_n_u_THRESHOLD_BW __pyx_string_tab[65] -#define __pyx_n_u_THRESH_BINARY __pyx_string_tab[66] -#define __pyx_n_u__8 __pyx_string_tab[67] -#define __pyx_n_u_accepted_boxes __pyx_string_tab[68] -#define __pyx_n_u_all __pyx_string_tab[69] -#define __pyx_n_u_alpha __pyx_string_tab[70] -#define __pyx_n_u_anomalib_models __pyx_string_tab[71] -#define __pyx_n_u_anomaly_detection __pyx_string_tab[72] -#define __pyx_n_u_anomaly_label __pyx_string_tab[73] -#define __pyx_n_u_anomaly_map __pyx_string_tab[74] -#define __pyx_n_u_anomaly_map_resized __pyx_string_tab[75] -#define __pyx_n_u_anomaly_score __pyx_string_tab[76] -#define __pyx_n_u_array __pyx_string_tab[77] -#define __pyx_n_u_astype __pyx_string_tab[78] -#define __pyx_n_u_asyncio_coroutines __pyx_string_tab[79] -#define __pyx_n_u_ax __pyx_string_tab[80] -#define __pyx_n_u_axes __pyx_string_tab[81] -#define __pyx_n_u_axis __pyx_string_tab[82] -#define __pyx_n_u_backbone __pyx_string_tab[83] -#define __pyx_n_u_bbox_inches __pyx_string_tab[84] -#define __pyx_n_u_binary __pyx_string_tab[85] -#define __pyx_n_u_bl __pyx_string_tab[86] -#define __pyx_n_u_blbrX __pyx_string_tab[87] -#define __pyx_n_u_blbrY __pyx_string_tab[88] -#define __pyx_n_u_bool __pyx_string_tab[89] -#define __pyx_n_u_boundingRect __pyx_string_tab[90] -#define __pyx_n_u_box __pyx_string_tab[91] -#define __pyx_n_u_boxPoints __pyx_string_tab[92] -#define __pyx_n_u_box_1 __pyx_string_tab[93] -#define __pyx_n_u_box_2 __pyx_string_tab[94] -#define __pyx_n_u_br __pyx_string_tab[95] -#define __pyx_n_u_c __pyx_string_tab[96] -#define __pyx_n_u_c1 __pyx_string_tab[97] -#define __pyx_n_u_c2 __pyx_string_tab[98] -#define __pyx_n_u_cast __pyx_string_tab[99] -#define __pyx_n_u_category __pyx_string_tab[100] -#define __pyx_n_u_center_dist __pyx_string_tab[101] -#define __pyx_n_u_check_box_redundancy __pyx_string_tab[102] -#define __pyx_n_u_checkpoint __pyx_string_tab[103] -#define __pyx_n_u_class_getitem __pyx_string_tab[104] -#define __pyx_n_u_cline_in_traceback __pyx_string_tab[105] -#define __pyx_n_u_close __pyx_string_tab[106] -#define __pyx_n_u_closed __pyx_string_tab[107] -#define __pyx_n_u_cmap __pyx_string_tab[108] -#define __pyx_n_u_cnts __pyx_string_tab[109] -#define __pyx_n_u_const __pyx_string_tab[110] -#define __pyx_n_u_constants __pyx_string_tab[111] -#define __pyx_n_u_contours __pyx_string_tab[112] -#define __pyx_n_u_convert __pyx_string_tab[113] -#define __pyx_n_u_copy __pyx_string_tab[114] -#define __pyx_n_u_coreset_sampling_ratio __pyx_string_tab[115] -#define __pyx_n_u_cpu __pyx_string_tab[116] -#define __pyx_n_u_cropped __pyx_string_tab[117] -#define __pyx_n_u_cropped_sensor_left __pyx_string_tab[118] -#define __pyx_n_u_cropped_sensor_right __pyx_string_tab[119] -#define __pyx_n_u_csv_2 __pyx_string_tab[120] -#define __pyx_n_u_cuda __pyx_string_tab[121] -#define __pyx_n_u_cv2 __pyx_string_tab[122] -#define __pyx_n_u_cvtColor __pyx_string_tab[123] -#define __pyx_n_u_dA __pyx_string_tab[124] -#define __pyx_n_u_dB __pyx_string_tab[125] -#define __pyx_n_u_data_csv __pyx_string_tab[126] -#define __pyx_n_u_detection_models __pyx_string_tab[127] -#define __pyx_n_u_device __pyx_string_tab[128] -#define __pyx_n_u_df __pyx_string_tab[129] -#define __pyx_n_u_dimA __pyx_string_tab[130] -#define __pyx_n_u_dimB __pyx_string_tab[131] -#define __pyx_n_u_dist __pyx_string_tab[132] -#define __pyx_n_u_distance __pyx_string_tab[133] -#define __pyx_n_u_dopt_basics __pyx_string_tab[134] -#define __pyx_n_u_dopt_sensor_anomalies __pyx_string_tab[135] -#define __pyx_n_u_dopt_sensor_anomalies__find_path __pyx_string_tab[136] -#define __pyx_n_u_dopt_sensor_anomalies_detection __pyx_string_tab[137] -#define __pyx_n_u_dtype __pyx_string_tab[138] -#define __pyx_n_u_edged __pyx_string_tab[139] -#define __pyx_n_u_enter __pyx_string_tab[140] -#define __pyx_n_u_enumerate __pyx_string_tab[141] -#define __pyx_n_u_errors __pyx_string_tab[142] -#define __pyx_n_u_euclidean __pyx_string_tab[143] -#define __pyx_n_u_eval __pyx_string_tab[144] -#define __pyx_n_u_existing __pyx_string_tab[145] -#define __pyx_n_u_exists __pyx_string_tab[146] -#define __pyx_n_u_exit __pyx_string_tab[147] -#define __pyx_n_u_extend __pyx_string_tab[148] -#define __pyx_n_u_figsize __pyx_string_tab[149] -#define __pyx_n_u_file_path __pyx_string_tab[150] -#define __pyx_n_u_file_stem __pyx_string_tab[151] -#define __pyx_n_u_filtered_cnts __pyx_string_tab[152] -#define __pyx_n_u_filterwarnings __pyx_string_tab[153] -#define __pyx_n_u_findContours __pyx_string_tab[154] -#define __pyx_n_u_find_paths __pyx_string_tab[155] -#define __pyx_n_u_float __pyx_string_tab[156] -#define __pyx_n_u_float32 __pyx_string_tab[157] -#define __pyx_n_u_folder_path __pyx_string_tab[158] -#define __pyx_n_u_from_numpy __pyx_string_tab[159] -#define __pyx_n_u_fromarray __pyx_string_tab[160] -#define __pyx_n_u_func __pyx_string_tab[161] -#define __pyx_n_u_genexpr __pyx_string_tab[162] -#define __pyx_n_u_getStructuringElement __pyx_string_tab[163] -#define __pyx_n_u_get_detection_models __pyx_string_tab[164] -#define __pyx_n_u_get_model_folder __pyx_string_tab[165] -#define __pyx_n_u_grab_contours __pyx_string_tab[166] -#define __pyx_n_u_gray __pyx_string_tab[167] -#define __pyx_n_u_header __pyx_string_tab[168] -#define __pyx_n_u_hspace __pyx_string_tab[169] -#define __pyx_n_u_i __pyx_string_tab[170] -#define __pyx_n_u_ignore __pyx_string_tab[171] -#define __pyx_n_u_image __pyx_string_tab[172] -#define __pyx_n_u_image_np __pyx_string_tab[173] -#define __pyx_n_u_image_rgb __pyx_string_tab[174] -#define __pyx_n_u_img __pyx_string_tab[175] -#define __pyx_n_u_img_np __pyx_string_tab[176] -#define __pyx_n_u_img_path __pyx_string_tab[177] -#define __pyx_n_u_imread __pyx_string_tab[178] -#define __pyx_n_u_imshow __pyx_string_tab[179] -#define __pyx_n_u_imutils __pyx_string_tab[180] -#define __pyx_n_u_index __pyx_string_tab[181] -#define __pyx_n_u_infer_image __pyx_string_tab[182] -#define __pyx_n_u_input_tensor __pyx_string_tab[183] -#define __pyx_n_u_int32 __pyx_string_tab[184] -#define __pyx_n_u_is_available __pyx_string_tab[185] -#define __pyx_n_u_is_coroutine __pyx_string_tab[186] -#define __pyx_n_u_is_duplicate __pyx_string_tab[187] -#define __pyx_n_u_is_sorted __pyx_string_tab[188] -#define __pyx_n_u_item __pyx_string_tab[189] -#define __pyx_n_u_items __pyx_string_tab[190] -#define __pyx_n_u_jet __pyx_string_tab[191] -#define __pyx_n_u_kernel __pyx_string_tab[192] -#define __pyx_n_u_layers __pyx_string_tab[193] -#define __pyx_n_u_left __pyx_string_tab[194] -#define __pyx_n_u_leftmost_x_fourth __pyx_string_tab[195] -#define __pyx_n_u_linalg __pyx_string_tab[196] -#define __pyx_n_u_load __pyx_string_tab[197] -#define __pyx_n_u_load_state_dict __pyx_string_tab[198] -#define __pyx_n_u_main __pyx_string_tab[199] -#define __pyx_n_u_matplotlib_pyplot __pyx_string_tab[200] -#define __pyx_n_u_max __pyx_string_tab[201] -#define __pyx_n_u_measure_length __pyx_string_tab[202] -#define __pyx_n_u_measure_length_locals_genexpr __pyx_string_tab[203] -#define __pyx_n_u_message __pyx_string_tab[204] -#define __pyx_n_u_midpoint __pyx_string_tab[205] -#define __pyx_n_u_min __pyx_string_tab[206] -#define __pyx_n_u_minAreaRect __pyx_string_tab[207] -#define __pyx_n_u_mode __pyx_string_tab[208] -#define __pyx_n_u_model __pyx_string_tab[209] -#define __pyx_n_u_model_state_dict __pyx_string_tab[210] -#define __pyx_n_u_module __pyx_string_tab[211] -#define __pyx_n_u_morphologyEx __pyx_string_tab[212] -#define __pyx_n_u_name __pyx_string_tab[213] -#define __pyx_n_u_next __pyx_string_tab[214] -#define __pyx_n_u_no_grad __pyx_string_tab[215] -#define __pyx_n_u_norm __pyx_string_tab[216] -#define __pyx_n_u_np __pyx_string_tab[217] -#define __pyx_n_u_npt __pyx_string_tab[218] -#define __pyx_n_u_num_contours __pyx_string_tab[219] -#define __pyx_n_u_numpy __pyx_string_tab[220] -#define __pyx_n_u_numpy_typing __pyx_string_tab[221] -#define __pyx_n_u_off __pyx_string_tab[222] -#define __pyx_n_u_order_points __pyx_string_tab[223] -#define __pyx_n_u_orig __pyx_string_tab[224] -#define __pyx_n_u_output __pyx_string_tab[225] -#define __pyx_n_u_pad_inches __pyx_string_tab[226] -#define __pyx_n_u_pandas __pyx_string_tab[227] -#define __pyx_n_u_parent __pyx_string_tab[228] -#define __pyx_n_u_pathlib __pyx_string_tab[229] -#define __pyx_n_u_permute __pyx_string_tab[230] -#define __pyx_n_u_perspective __pyx_string_tab[231] -#define __pyx_n_u_pil_image __pyx_string_tab[232] -#define __pyx_n_u_pipeline __pyx_string_tab[233] -#define __pyx_n_u_pixels_per_metric_X __pyx_string_tab[234] -#define __pyx_n_u_pixels_per_metric_Y __pyx_string_tab[235] -#define __pyx_n_u_plt __pyx_string_tab[236] -#define __pyx_n_u_pop __pyx_string_tab[237] -#define __pyx_n_u_pred_score __pyx_string_tab[238] -#define __pyx_n_u_pt_A __pyx_string_tab[239] -#define __pyx_n_u_pt_B __pyx_string_tab[240] -#define __pyx_n_u_pyplot __pyx_string_tab[241] -#define __pyx_n_u_qualname __pyx_string_tab[242] -#define __pyx_n_u_quoting __pyx_string_tab[243] -#define __pyx_n_u_rbox __pyx_string_tab[244] -#define __pyx_n_u_resize __pyx_string_tab[245] -#define __pyx_n_u_result __pyx_string_tab[246] -#define __pyx_n_u_result_pattern __pyx_string_tab[247] -#define __pyx_n_u_return __pyx_string_tab[248] -#define __pyx_n_u_right __pyx_string_tab[249] -#define __pyx_n_u_rightmost_x_third __pyx_string_tab[250] -#define __pyx_n_u_s1 __pyx_string_tab[251] -#define __pyx_n_u_s2 __pyx_string_tab[252] -#define __pyx_n_u_savefig __pyx_string_tab[253] -#define __pyx_n_u_scipy_spatial __pyx_string_tab[254] -#define __pyx_n_u_send __pyx_string_tab[255] -#define __pyx_n_u_sensor_images __pyx_string_tab[256] -#define __pyx_n_u_sep __pyx_string_tab[257] -#define __pyx_n_u_set_name __pyx_string_tab[258] -#define __pyx_n_u_setdefault __pyx_string_tab[259] -#define __pyx_n_u_shape __pyx_string_tab[260] -#define __pyx_n_u_side __pyx_string_tab[261] -#define __pyx_n_u_size_diff __pyx_string_tab[262] -#define __pyx_n_u_sort_contours __pyx_string_tab[263] -#define __pyx_n_u_squeeze __pyx_string_tab[264] -#define __pyx_n_u_stem __pyx_string_tab[265] -#define __pyx_n_u_str __pyx_string_tab[266] -#define __pyx_n_u_subplots __pyx_string_tab[267] -#define __pyx_n_u_subplots_adjust __pyx_string_tab[268] -#define __pyx_n_u_t __pyx_string_tab[269] -#define __pyx_n_u_test __pyx_string_tab[270] -#define __pyx_n_u_threshold __pyx_string_tab[271] -#define __pyx_n_u_throw __pyx_string_tab[272] -#define __pyx_n_u_tight __pyx_string_tab[273] -#define __pyx_n_u_tl __pyx_string_tab[274] -#define __pyx_n_u_tlblX __pyx_string_tab[275] -#define __pyx_n_u_tlblY __pyx_string_tab[276] -#define __pyx_n_u_tltrX __pyx_string_tab[277] -#define __pyx_n_u_tltrY __pyx_string_tab[278] -#define __pyx_n_u_to __pyx_string_tab[279] -#define __pyx_n_u_to_csv __pyx_string_tab[280] -#define __pyx_n_u_tolerance __pyx_string_tab[281] -#define __pyx_n_u_torch __pyx_string_tab[282] -#define __pyx_n_u_torch_device __pyx_string_tab[283] -#define __pyx_n_u_tr __pyx_string_tab[284] -#define __pyx_n_u_trbrX __pyx_string_tab[285] -#define __pyx_n_u_trbrY __pyx_string_tab[286] -#define __pyx_n_u_types __pyx_string_tab[287] -#define __pyx_n_u_typing __pyx_string_tab[288] -#define __pyx_n_u_uint8 __pyx_string_tab[289] -#define __pyx_n_u_unsqueeze __pyx_string_tab[290] -#define __pyx_n_u_user_img_path __pyx_string_tab[291] -#define __pyx_n_u_value __pyx_string_tab[292] -#define __pyx_n_u_values __pyx_string_tab[293] -#define __pyx_n_u_w __pyx_string_tab[294] -#define __pyx_n_u_warnings __pyx_string_tab[295] -#define __pyx_n_u_wrap_result __pyx_string_tab[296] -#define __pyx_n_u_wspace __pyx_string_tab[297] -#define __pyx_n_u_x1 __pyx_string_tab[298] -#define __pyx_n_u_x2 __pyx_string_tab[299] -#define __pyx_n_u_x_coords __pyx_string_tab[300] -#define __pyx_n_u_x_max __pyx_string_tab[301] -#define __pyx_n_u_x_middle __pyx_string_tab[302] -#define __pyx_n_u_x_min __pyx_string_tab[303] -#define __pyx_n_u_y_max __pyx_string_tab[304] -#define __pyx_n_u_y_min __pyx_string_tab[305] -#define __pyx_n_u_zip __pyx_string_tab[306] -#define __pyx_kp_b_iso88591_5_q_uM_AQ_9AWCq_Zq_r_q_Jb_5_1IX __pyx_string_tab[307] -#define __pyx_kp_b_iso88591_AQ_t9G1_q_5_ARRS_aq_nA_Q_a __pyx_string_tab[308] -#define __pyx_kp_b_iso88591_AT_Rt1D_AS_at2Q __pyx_string_tab[309] -#define __pyx_kp_b_iso88591_Cwas_1_vS_f_a_H_e1D_fE_q_2Q_7_q __pyx_string_tab[310] -#define __pyx_kp_b_iso88591_IQ_k_Y6MURS_wc_3c_a_F_IQm6_AS_9 __pyx_string_tab[311] -#define __pyx_kp_b_iso88591__6 __pyx_string_tab[312] -#define __pyx_kp_b_iso88591__7 __pyx_string_tab[313] -#define __pyx_kp_b_iso88591_q_D_D_q_q_awb_uARvQd_BfAQ_AWBgU __pyx_string_tab[314] -#define __pyx_float_0_2 __pyx_number_tab[0] -#define __pyx_float_0_5 __pyx_number_tab[1] -#define __pyx_float_0_8 __pyx_number_tab[2] -#define __pyx_float_2_0 __pyx_number_tab[3] -#define __pyx_float_255_0 __pyx_number_tab[4] -#define __pyx_int_0 __pyx_number_tab[5] -#define __pyx_int_1 __pyx_number_tab[6] -#define __pyx_int_2 __pyx_number_tab[7] -#define __pyx_int_5 __pyx_number_tab[8] -#define __pyx_int_6 __pyx_number_tab[9] -#define __pyx_int_12 __pyx_number_tab[10] -#define __pyx_int_20 __pyx_number_tab[11] -#define __pyx_int_50 __pyx_number_tab[12] -#define __pyx_int_100 __pyx_number_tab[13] -#define __pyx_int_255 __pyx_number_tab[14] -#define __pyx_int_500 __pyx_number_tab[15] -#define __pyx_int_1500 __pyx_number_tab[16] +#define __pyx_n_u_ANOMALY_THRESHOLD __pyx_string_tab[33] +#define __pyx_n_u_Any __pyx_string_tab[34] +#define __pyx_n_u_BACKBONE __pyx_string_tab[35] +#define __pyx_n_u_Box __pyx_string_tab[36] +#define __pyx_n_u_CHAIN_APPROX_SIMPLE __pyx_string_tab[37] +#define __pyx_n_u_COLOR_BGR2GRAY __pyx_string_tab[38] +#define __pyx_n_u_COLOR_BGR2RGB __pyx_string_tab[39] +#define __pyx_n_u_Canny __pyx_string_tab[40] +#define __pyx_n_u_ContourCalculationError __pyx_string_tab[41] +#define __pyx_n_u_DETECTION_MODELS __pyx_string_tab[42] +#define __pyx_n_u_DataFrame __pyx_string_tab[43] +#define __pyx_n_u_Final __pyx_string_tab[44] +#define __pyx_n_u_HEATMAP_FILENAME_SUFFIX __pyx_string_tab[45] +#define __pyx_n_u_Image __pyx_string_tab[46] +#define __pyx_n_u_ImageNotReadError __pyx_string_tab[47] +#define __pyx_n_u_InferenceResult __pyx_string_tab[48] +#define __pyx_n_u_InvalidElectrodeCount __pyx_string_tab[49] +#define __pyx_n_u_LAYERS __pyx_string_tab[50] +#define __pyx_n_u_MODEL_FOLDER __pyx_string_tab[51] +#define __pyx_n_u_MORPH_CLOSE __pyx_string_tab[52] +#define __pyx_n_u_MORPH_RECT __pyx_string_tab[53] +#define __pyx_n_u_NDArray __pyx_string_tab[54] +#define __pyx_n_u_NUM_VALID_ELECTRODES __pyx_string_tab[55] +#define __pyx_n_u_None __pyx_string_tab[56] +#define __pyx_n_u_PIL __pyx_string_tab[57] +#define __pyx_n_u_Patchcore __pyx_string_tab[58] +#define __pyx_n_u_Path __pyx_string_tab[59] +#define __pyx_n_u_Pyx_PyDict_NextRef __pyx_string_tab[60] +#define __pyx_n_u_QUOTE_NONE __pyx_string_tab[61] +#define __pyx_n_u_RATIO __pyx_string_tab[62] +#define __pyx_n_u_RETR_TREE __pyx_string_tab[63] +#define __pyx_n_u_RGB __pyx_string_tab[64] +#define __pyx_n_u_SensorImages __pyx_string_tab[65] +#define __pyx_n_u_THRESHOLD_BW __pyx_string_tab[66] +#define __pyx_n_u_THRESH_BINARY __pyx_string_tab[67] +#define __pyx_n_u__8 __pyx_string_tab[68] +#define __pyx_n_u_accepted_boxes __pyx_string_tab[69] +#define __pyx_n_u_all __pyx_string_tab[70] +#define __pyx_n_u_alpha __pyx_string_tab[71] +#define __pyx_n_u_anomalib_models __pyx_string_tab[72] +#define __pyx_n_u_anomaly_detection __pyx_string_tab[73] +#define __pyx_n_u_anomaly_label __pyx_string_tab[74] +#define __pyx_n_u_anomaly_map __pyx_string_tab[75] +#define __pyx_n_u_anomaly_map_resized __pyx_string_tab[76] +#define __pyx_n_u_anomaly_score __pyx_string_tab[77] +#define __pyx_n_u_array __pyx_string_tab[78] +#define __pyx_n_u_astype __pyx_string_tab[79] +#define __pyx_n_u_asyncio_coroutines __pyx_string_tab[80] +#define __pyx_n_u_ax __pyx_string_tab[81] +#define __pyx_n_u_axes __pyx_string_tab[82] +#define __pyx_n_u_axis __pyx_string_tab[83] +#define __pyx_n_u_backbone __pyx_string_tab[84] +#define __pyx_n_u_bbox_inches __pyx_string_tab[85] +#define __pyx_n_u_binary __pyx_string_tab[86] +#define __pyx_n_u_bl __pyx_string_tab[87] +#define __pyx_n_u_blbrX __pyx_string_tab[88] +#define __pyx_n_u_blbrY __pyx_string_tab[89] +#define __pyx_n_u_bool __pyx_string_tab[90] +#define __pyx_n_u_boundingRect __pyx_string_tab[91] +#define __pyx_n_u_box __pyx_string_tab[92] +#define __pyx_n_u_boxPoints __pyx_string_tab[93] +#define __pyx_n_u_box_1 __pyx_string_tab[94] +#define __pyx_n_u_box_2 __pyx_string_tab[95] +#define __pyx_n_u_br __pyx_string_tab[96] +#define __pyx_n_u_c __pyx_string_tab[97] +#define __pyx_n_u_c1 __pyx_string_tab[98] +#define __pyx_n_u_c2 __pyx_string_tab[99] +#define __pyx_n_u_cast __pyx_string_tab[100] +#define __pyx_n_u_category __pyx_string_tab[101] +#define __pyx_n_u_center_dist __pyx_string_tab[102] +#define __pyx_n_u_check_box_redundancy __pyx_string_tab[103] +#define __pyx_n_u_checkpoint __pyx_string_tab[104] +#define __pyx_n_u_class_getitem __pyx_string_tab[105] +#define __pyx_n_u_cline_in_traceback __pyx_string_tab[106] +#define __pyx_n_u_close __pyx_string_tab[107] +#define __pyx_n_u_closed __pyx_string_tab[108] +#define __pyx_n_u_cmap __pyx_string_tab[109] +#define __pyx_n_u_cnts __pyx_string_tab[110] +#define __pyx_n_u_const __pyx_string_tab[111] +#define __pyx_n_u_constants __pyx_string_tab[112] +#define __pyx_n_u_contours __pyx_string_tab[113] +#define __pyx_n_u_convert __pyx_string_tab[114] +#define __pyx_n_u_copy __pyx_string_tab[115] +#define __pyx_n_u_coreset_sampling_ratio __pyx_string_tab[116] +#define __pyx_n_u_cpu __pyx_string_tab[117] +#define __pyx_n_u_cropped __pyx_string_tab[118] +#define __pyx_n_u_cropped_sensor_left __pyx_string_tab[119] +#define __pyx_n_u_cropped_sensor_right __pyx_string_tab[120] +#define __pyx_n_u_csv_2 __pyx_string_tab[121] +#define __pyx_n_u_cuda __pyx_string_tab[122] +#define __pyx_n_u_cv2 __pyx_string_tab[123] +#define __pyx_n_u_cvtColor __pyx_string_tab[124] +#define __pyx_n_u_dA __pyx_string_tab[125] +#define __pyx_n_u_dB __pyx_string_tab[126] +#define __pyx_n_u_data_csv __pyx_string_tab[127] +#define __pyx_n_u_detection_models __pyx_string_tab[128] +#define __pyx_n_u_device __pyx_string_tab[129] +#define __pyx_n_u_df __pyx_string_tab[130] +#define __pyx_n_u_dimA __pyx_string_tab[131] +#define __pyx_n_u_dimB __pyx_string_tab[132] +#define __pyx_n_u_dist __pyx_string_tab[133] +#define __pyx_n_u_distance __pyx_string_tab[134] +#define __pyx_n_u_dopt_basics __pyx_string_tab[135] +#define __pyx_n_u_dopt_sensor_anomalies __pyx_string_tab[136] +#define __pyx_n_u_dopt_sensor_anomalies__find_path __pyx_string_tab[137] +#define __pyx_n_u_dopt_sensor_anomalies_detection __pyx_string_tab[138] +#define __pyx_n_u_dtype __pyx_string_tab[139] +#define __pyx_n_u_edged __pyx_string_tab[140] +#define __pyx_n_u_enter __pyx_string_tab[141] +#define __pyx_n_u_enumerate __pyx_string_tab[142] +#define __pyx_n_u_errors __pyx_string_tab[143] +#define __pyx_n_u_euclidean __pyx_string_tab[144] +#define __pyx_n_u_eval __pyx_string_tab[145] +#define __pyx_n_u_existing __pyx_string_tab[146] +#define __pyx_n_u_exists __pyx_string_tab[147] +#define __pyx_n_u_exit __pyx_string_tab[148] +#define __pyx_n_u_extend __pyx_string_tab[149] +#define __pyx_n_u_figsize __pyx_string_tab[150] +#define __pyx_n_u_file_path __pyx_string_tab[151] +#define __pyx_n_u_file_stem __pyx_string_tab[152] +#define __pyx_n_u_filtered_cnts __pyx_string_tab[153] +#define __pyx_n_u_filterwarnings __pyx_string_tab[154] +#define __pyx_n_u_findContours __pyx_string_tab[155] +#define __pyx_n_u_find_paths __pyx_string_tab[156] +#define __pyx_n_u_float __pyx_string_tab[157] +#define __pyx_n_u_float32 __pyx_string_tab[158] +#define __pyx_n_u_folder_path __pyx_string_tab[159] +#define __pyx_n_u_from_numpy __pyx_string_tab[160] +#define __pyx_n_u_fromarray __pyx_string_tab[161] +#define __pyx_n_u_func __pyx_string_tab[162] +#define __pyx_n_u_genexpr __pyx_string_tab[163] +#define __pyx_n_u_getStructuringElement __pyx_string_tab[164] +#define __pyx_n_u_get_detection_models __pyx_string_tab[165] +#define __pyx_n_u_get_model_folder __pyx_string_tab[166] +#define __pyx_n_u_grab_contours __pyx_string_tab[167] +#define __pyx_n_u_gray __pyx_string_tab[168] +#define __pyx_n_u_header __pyx_string_tab[169] +#define __pyx_n_u_hspace __pyx_string_tab[170] +#define __pyx_n_u_i __pyx_string_tab[171] +#define __pyx_n_u_ignore __pyx_string_tab[172] +#define __pyx_n_u_image __pyx_string_tab[173] +#define __pyx_n_u_image_np __pyx_string_tab[174] +#define __pyx_n_u_image_rgb __pyx_string_tab[175] +#define __pyx_n_u_img __pyx_string_tab[176] +#define __pyx_n_u_img_np __pyx_string_tab[177] +#define __pyx_n_u_img_path __pyx_string_tab[178] +#define __pyx_n_u_imread __pyx_string_tab[179] +#define __pyx_n_u_imshow __pyx_string_tab[180] +#define __pyx_n_u_imutils __pyx_string_tab[181] +#define __pyx_n_u_index __pyx_string_tab[182] +#define __pyx_n_u_infer_image __pyx_string_tab[183] +#define __pyx_n_u_input_tensor __pyx_string_tab[184] +#define __pyx_n_u_int32 __pyx_string_tab[185] +#define __pyx_n_u_is_available __pyx_string_tab[186] +#define __pyx_n_u_is_coroutine __pyx_string_tab[187] +#define __pyx_n_u_is_duplicate __pyx_string_tab[188] +#define __pyx_n_u_is_sorted __pyx_string_tab[189] +#define __pyx_n_u_item __pyx_string_tab[190] +#define __pyx_n_u_items __pyx_string_tab[191] +#define __pyx_n_u_jet __pyx_string_tab[192] +#define __pyx_n_u_kernel __pyx_string_tab[193] +#define __pyx_n_u_layers __pyx_string_tab[194] +#define __pyx_n_u_left __pyx_string_tab[195] +#define __pyx_n_u_leftmost_x_fourth __pyx_string_tab[196] +#define __pyx_n_u_linalg __pyx_string_tab[197] +#define __pyx_n_u_load __pyx_string_tab[198] +#define __pyx_n_u_load_state_dict __pyx_string_tab[199] +#define __pyx_n_u_main __pyx_string_tab[200] +#define __pyx_n_u_matplotlib_pyplot __pyx_string_tab[201] +#define __pyx_n_u_max __pyx_string_tab[202] +#define __pyx_n_u_measure_length __pyx_string_tab[203] +#define __pyx_n_u_measure_length_locals_genexpr __pyx_string_tab[204] +#define __pyx_n_u_message __pyx_string_tab[205] +#define __pyx_n_u_midpoint __pyx_string_tab[206] +#define __pyx_n_u_min __pyx_string_tab[207] +#define __pyx_n_u_minAreaRect __pyx_string_tab[208] +#define __pyx_n_u_mode __pyx_string_tab[209] +#define __pyx_n_u_model __pyx_string_tab[210] +#define __pyx_n_u_model_state_dict __pyx_string_tab[211] +#define __pyx_n_u_module __pyx_string_tab[212] +#define __pyx_n_u_morphologyEx __pyx_string_tab[213] +#define __pyx_n_u_name __pyx_string_tab[214] +#define __pyx_n_u_next __pyx_string_tab[215] +#define __pyx_n_u_no_grad __pyx_string_tab[216] +#define __pyx_n_u_norm __pyx_string_tab[217] +#define __pyx_n_u_np __pyx_string_tab[218] +#define __pyx_n_u_npt __pyx_string_tab[219] +#define __pyx_n_u_num_contours __pyx_string_tab[220] +#define __pyx_n_u_numpy __pyx_string_tab[221] +#define __pyx_n_u_numpy_typing __pyx_string_tab[222] +#define __pyx_n_u_off __pyx_string_tab[223] +#define __pyx_n_u_order_points __pyx_string_tab[224] +#define __pyx_n_u_orig __pyx_string_tab[225] +#define __pyx_n_u_output __pyx_string_tab[226] +#define __pyx_n_u_pad_inches __pyx_string_tab[227] +#define __pyx_n_u_pandas __pyx_string_tab[228] +#define __pyx_n_u_parent __pyx_string_tab[229] +#define __pyx_n_u_pathlib __pyx_string_tab[230] +#define __pyx_n_u_permute __pyx_string_tab[231] +#define __pyx_n_u_perspective __pyx_string_tab[232] +#define __pyx_n_u_pil_image __pyx_string_tab[233] +#define __pyx_n_u_pipeline __pyx_string_tab[234] +#define __pyx_n_u_pixels_per_metric_X __pyx_string_tab[235] +#define __pyx_n_u_pixels_per_metric_Y __pyx_string_tab[236] +#define __pyx_n_u_plt __pyx_string_tab[237] +#define __pyx_n_u_pop __pyx_string_tab[238] +#define __pyx_n_u_pred_score __pyx_string_tab[239] +#define __pyx_n_u_pt_A __pyx_string_tab[240] +#define __pyx_n_u_pt_B __pyx_string_tab[241] +#define __pyx_n_u_pyplot __pyx_string_tab[242] +#define __pyx_n_u_qualname __pyx_string_tab[243] +#define __pyx_n_u_quoting __pyx_string_tab[244] +#define __pyx_n_u_rbox __pyx_string_tab[245] +#define __pyx_n_u_resize __pyx_string_tab[246] +#define __pyx_n_u_result __pyx_string_tab[247] +#define __pyx_n_u_result_pattern __pyx_string_tab[248] +#define __pyx_n_u_return __pyx_string_tab[249] +#define __pyx_n_u_right __pyx_string_tab[250] +#define __pyx_n_u_rightmost_x_third __pyx_string_tab[251] +#define __pyx_n_u_s1 __pyx_string_tab[252] +#define __pyx_n_u_s2 __pyx_string_tab[253] +#define __pyx_n_u_savefig __pyx_string_tab[254] +#define __pyx_n_u_scipy_spatial __pyx_string_tab[255] +#define __pyx_n_u_send __pyx_string_tab[256] +#define __pyx_n_u_sensor_images __pyx_string_tab[257] +#define __pyx_n_u_sep __pyx_string_tab[258] +#define __pyx_n_u_set_name __pyx_string_tab[259] +#define __pyx_n_u_setdefault __pyx_string_tab[260] +#define __pyx_n_u_shape __pyx_string_tab[261] +#define __pyx_n_u_side __pyx_string_tab[262] +#define __pyx_n_u_size_diff __pyx_string_tab[263] +#define __pyx_n_u_sort_contours __pyx_string_tab[264] +#define __pyx_n_u_squeeze __pyx_string_tab[265] +#define __pyx_n_u_stem __pyx_string_tab[266] +#define __pyx_n_u_str __pyx_string_tab[267] +#define __pyx_n_u_subplots __pyx_string_tab[268] +#define __pyx_n_u_subplots_adjust __pyx_string_tab[269] +#define __pyx_n_u_t __pyx_string_tab[270] +#define __pyx_n_u_test __pyx_string_tab[271] +#define __pyx_n_u_threshold __pyx_string_tab[272] +#define __pyx_n_u_throw __pyx_string_tab[273] +#define __pyx_n_u_tight __pyx_string_tab[274] +#define __pyx_n_u_tl __pyx_string_tab[275] +#define __pyx_n_u_tlblX __pyx_string_tab[276] +#define __pyx_n_u_tlblY __pyx_string_tab[277] +#define __pyx_n_u_tltrX __pyx_string_tab[278] +#define __pyx_n_u_tltrY __pyx_string_tab[279] +#define __pyx_n_u_to __pyx_string_tab[280] +#define __pyx_n_u_to_csv __pyx_string_tab[281] +#define __pyx_n_u_tolerance __pyx_string_tab[282] +#define __pyx_n_u_torch __pyx_string_tab[283] +#define __pyx_n_u_torch_device __pyx_string_tab[284] +#define __pyx_n_u_tr __pyx_string_tab[285] +#define __pyx_n_u_trbrX __pyx_string_tab[286] +#define __pyx_n_u_trbrY __pyx_string_tab[287] +#define __pyx_n_u_types __pyx_string_tab[288] +#define __pyx_n_u_typing __pyx_string_tab[289] +#define __pyx_n_u_uint8 __pyx_string_tab[290] +#define __pyx_n_u_unsqueeze __pyx_string_tab[291] +#define __pyx_n_u_user_img_path __pyx_string_tab[292] +#define __pyx_n_u_value __pyx_string_tab[293] +#define __pyx_n_u_values __pyx_string_tab[294] +#define __pyx_n_u_w __pyx_string_tab[295] +#define __pyx_n_u_warnings __pyx_string_tab[296] +#define __pyx_n_u_wrap_result __pyx_string_tab[297] +#define __pyx_n_u_wspace __pyx_string_tab[298] +#define __pyx_n_u_x1 __pyx_string_tab[299] +#define __pyx_n_u_x2 __pyx_string_tab[300] +#define __pyx_n_u_x_coords __pyx_string_tab[301] +#define __pyx_n_u_x_max __pyx_string_tab[302] +#define __pyx_n_u_x_middle __pyx_string_tab[303] +#define __pyx_n_u_x_min __pyx_string_tab[304] +#define __pyx_n_u_y_max __pyx_string_tab[305] +#define __pyx_n_u_y_min __pyx_string_tab[306] +#define __pyx_n_u_zip __pyx_string_tab[307] +#define __pyx_kp_b_iso88591_5_q_uM_AQ_9AWCq_Zq_r_q_Jb_5_1IX __pyx_string_tab[308] +#define __pyx_kp_b_iso88591_AQ_t9G1_q_5_ARRS_aq_nA_Q_a __pyx_string_tab[309] +#define __pyx_kp_b_iso88591_AT_Rt1D_AS_at2Q __pyx_string_tab[310] +#define __pyx_kp_b_iso88591_Cwas_1_vS_f_a_H_e1D_fE_q_2Q_7_q __pyx_string_tab[311] +#define __pyx_kp_b_iso88591_IQ_k_Y6MURS_wc_3c_a_F_IQm6_AS_9 __pyx_string_tab[312] +#define __pyx_kp_b_iso88591__6 __pyx_string_tab[313] +#define __pyx_kp_b_iso88591__7 __pyx_string_tab[314] +#define __pyx_kp_b_iso88591_q_D_D_q_q_awb_uARvQd_BfAQ_AWBgU __pyx_string_tab[315] +#define __pyx_float_0_5 __pyx_number_tab[0] +#define __pyx_float_0_8 __pyx_number_tab[1] +#define __pyx_float_2_0 __pyx_number_tab[2] +#define __pyx_float_255_0 __pyx_number_tab[3] +#define __pyx_int_0 __pyx_number_tab[4] +#define __pyx_int_1 __pyx_number_tab[5] +#define __pyx_int_2 __pyx_number_tab[6] +#define __pyx_int_5 __pyx_number_tab[7] +#define __pyx_int_6 __pyx_number_tab[8] +#define __pyx_int_12 __pyx_number_tab[9] +#define __pyx_int_20 __pyx_number_tab[10] +#define __pyx_int_50 __pyx_number_tab[11] +#define __pyx_int_100 __pyx_number_tab[12] +#define __pyx_int_255 __pyx_number_tab[13] +#define __pyx_int_500 __pyx_number_tab[14] +#define __pyx_int_1500 __pyx_number_tab[15] /* #### Code section: module_state_clear ### */ #if CYTHON_USE_MODULE_STATE static CYTHON_SMALL_CODE int __pyx_m_clear(PyObject *m) { @@ -3330,8 +3330,8 @@ static CYTHON_SMALL_CODE int __pyx_m_clear(PyObject *m) { for (int i=0; i<2; ++i) { Py_CLEAR(clear_module_state->__pyx_slice[i]); } for (int i=0; i<7; ++i) { Py_CLEAR(clear_module_state->__pyx_tuple[i]); } for (int i=0; i<12; ++i) { Py_CLEAR(clear_module_state->__pyx_codeobj_tab[i]); } - for (int i=0; i<315; ++i) { Py_CLEAR(clear_module_state->__pyx_string_tab[i]); } - for (int i=0; i<17; ++i) { Py_CLEAR(clear_module_state->__pyx_number_tab[i]); } + for (int i=0; i<316; ++i) { Py_CLEAR(clear_module_state->__pyx_string_tab[i]); } + for (int i=0; i<16; ++i) { Py_CLEAR(clear_module_state->__pyx_number_tab[i]); } /* #### Code section: module_state_clear_contents ### */ /* CommonTypesMetaclass.module_state_clear */ Py_CLEAR(clear_module_state->__pyx_CommonTypesMetaclassType); @@ -3374,8 +3374,8 @@ static CYTHON_SMALL_CODE int __pyx_m_traverse(PyObject *m, visitproc visit, void for (int i=0; i<2; ++i) { __Pyx_VISIT_CONST(traverse_module_state->__pyx_slice[i]); } for (int i=0; i<7; ++i) { __Pyx_VISIT_CONST(traverse_module_state->__pyx_tuple[i]); } for (int i=0; i<12; ++i) { __Pyx_VISIT_CONST(traverse_module_state->__pyx_codeobj_tab[i]); } - for (int i=0; i<315; ++i) { __Pyx_VISIT_CONST(traverse_module_state->__pyx_string_tab[i]); } - for (int i=0; i<17; ++i) { __Pyx_VISIT_CONST(traverse_module_state->__pyx_number_tab[i]); } + for (int i=0; i<316; ++i) { __Pyx_VISIT_CONST(traverse_module_state->__pyx_string_tab[i]); } + for (int i=0; i<16; ++i) { __Pyx_VISIT_CONST(traverse_module_state->__pyx_number_tab[i]); } /* #### Code section: module_state_traverse_contents ### */ /* CommonTypesMetaclass.module_state_traverse */ Py_VISIT(traverse_module_state->__pyx_CommonTypesMetaclassType); @@ -8642,7 +8642,7 @@ static PyObject *__pyx_pf_21dopt_sensor_anomalies_9detection_6infer_image(CYTHON * output = model(input_tensor) * * anomaly_score = output.pred_score.item() # <<<<<<<<<<<<<< - * anomaly_label = bool(1 if anomaly_score >= 0.2 else 0) + * anomaly_label = bool(1 if anomaly_score >= const.ANOMALY_THRESHOLD else 0) * anomaly_map = output.anomaly_map.squeeze().cpu().numpy() */ if (unlikely(!__pyx_v_output)) { __Pyx_RaiseUnboundLocalError("output"); __PYX_ERR(0, 178, __pyx_L1_error) } @@ -8665,11 +8665,17 @@ static PyObject *__pyx_pf_21dopt_sensor_anomalies_9detection_6infer_image(CYTHON /* "dopt_sensor_anomalies/detection.py":179 * * anomaly_score = output.pred_score.item() - * anomaly_label = bool(1 if anomaly_score >= 0.2 else 0) # <<<<<<<<<<<<<< + * anomaly_label = bool(1 if anomaly_score >= const.ANOMALY_THRESHOLD else 0) # <<<<<<<<<<<<<< * anomaly_map = output.anomaly_map.squeeze().cpu().numpy() * */ - __pyx_t_2 = PyObject_RichCompare(__pyx_v_anomaly_score, __pyx_mstate_global->__pyx_float_0_2, Py_GE); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 179, __pyx_L1_error) + __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_mstate_global->__pyx_n_u_const); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 179, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_mstate_global->__pyx_n_u_ANOMALY_THRESHOLD); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 179, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = PyObject_RichCompare(__pyx_v_anomaly_score, __pyx_t_1, Py_GE); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 179, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_16 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely((__pyx_t_16 < 0))) __PYX_ERR(0, 179, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; if (__pyx_t_16) { @@ -8685,7 +8691,7 @@ static PyObject *__pyx_pf_21dopt_sensor_anomalies_9detection_6infer_image(CYTHON /* "dopt_sensor_anomalies/detection.py":180 * anomaly_score = output.pred_score.item() - * anomaly_label = bool(1 if anomaly_score >= 0.2 else 0) + * anomaly_label = bool(1 if anomaly_score >= const.ANOMALY_THRESHOLD else 0) * anomaly_map = output.anomaly_map.squeeze().cpu().numpy() # <<<<<<<<<<<<<< * * img_np = np.array(pil_image) @@ -12739,31 +12745,31 @@ static int __Pyx_InitCachedConstants(__pyx_mstatetype *__pyx_mstate) { static int __Pyx_InitConstants(__pyx_mstatetype *__pyx_mstate) { CYTHON_UNUSED_VAR(__pyx_mstate); { - const struct { const unsigned int length: 10; } index[] = {{1},{3},{3},{81},{51},{31},{72},{179},{72},{36},{1},{1},{1},{1},{8},{4},{7},{6},{13},{2},{47},{9},{24},{21},{4},{38},{5},{9},{17},{17},{14},{19},{32},{3},{8},{3},{19},{14},{13},{5},{23},{16},{9},{5},{23},{5},{17},{15},{21},{6},{12},{11},{10},{7},{20},{4},{3},{9},{4},{20},{10},{5},{9},{3},{12},{12},{13},{1},{14},{3},{5},{15},{17},{13},{11},{19},{13},{5},{6},{18},{2},{4},{4},{8},{11},{6},{2},{5},{5},{4},{12},{3},{9},{5},{5},{2},{1},{2},{2},{4},{8},{11},{20},{10},{17},{18},{5},{6},{4},{4},{5},{9},{8},{7},{4},{22},{3},{7},{19},{20},{3},{4},{3},{8},{2},{2},{8},{16},{6},{2},{4},{4},{4},{8},{11},{21},{33},{31},{5},{5},{9},{9},{6},{9},{4},{8},{6},{8},{6},{7},{9},{9},{13},{14},{12},{11},{5},{7},{11},{10},{9},{8},{7},{21},{20},{16},{13},{4},{6},{6},{1},{6},{5},{8},{9},{3},{6},{8},{6},{6},{7},{5},{11},{12},{5},{12},{13},{12},{9},{4},{5},{3},{6},{6},{4},{17},{6},{4},{15},{8},{17},{3},{14},{31},{7},{8},{3},{11},{4},{5},{16},{10},{12},{8},{4},{7},{4},{2},{3},{12},{5},{12},{3},{12},{4},{6},{10},{6},{6},{7},{7},{11},{9},{8},{19},{19},{3},{3},{10},{4},{4},{6},{12},{7},{4},{6},{6},{14},{6},{5},{17},{2},{2},{7},{13},{4},{13},{3},{12},{10},{5},{4},{9},{13},{7},{4},{3},{8},{15},{1},{8},{9},{5},{5},{2},{5},{5},{5},{5},{2},{6},{9},{5},{12},{2},{5},{5},{5},{6},{5},{9},{13},{5},{6},{1},{8},{11},{6},{2},{2},{8},{5},{8},{5},{5},{5},{3},{284},{118},{52},{898},{340},{2},{2},{139}}; - #if (CYTHON_COMPRESS_STRINGS) == 2 /* compression: bz2 (3091 bytes) */ -const char* const cstring = "BZh91AY&SY\355\244\247\\\000\001\240\177\377\377\377\377\377\377\377\377\377\277\377\377\377\277\377\377\362@@@@@@@@@@@@@\000@\000`\013\035\357\247\337/\033\337e:o\030v\305)\364j>\335V\336\353\331A\353\317\200\037|\032\247\221\020\246\232=#\311\251\355S\301\0314\300\324\236O@\005<\232\232l\243OM#'\265C@z\231\006\023\032\214\200\315&\206\203B\001\030\200\021\242i\351\006S*~E?T\3653Sj~\250\0314\0004\320\000\000\000\030\206\217D\003 jz# E6\247\252\236i\244\375SP\003M\000\030\200\000\032\000\000\000\000\r\0324\003\3244\00050$F\205\017L\247\223I\342Oi& \000\000\000\000\000\006\200\000\000\000\364\215=M4\006j\204MMO)\346\243Si\244\310\311\210\000h\003@\000\0004\000\003A\352\032\000\000\000\000\321I\355H\236\021\250dd\001\220\032\032\003@\000\000\000\000\000\000\000\000\000\002H\300a\316\316\005\017\326\034\377\332\220Cw%\030`3\301\310\352\216\221\212\200\024$\023B\003\372\003\004 L@\304\010M\003@\320\010\000g\361\316\004\200a\001=\004\210\216\344\277\210\032\231i\370/\344 \020 GK\262M\203#\006@\201\240H\022@\n\211%R\244\3237'&\245\025z\341DR\251<\310Nl\0053uIL\207D\367\022\236i\231pS\230-\320\347QJq\251\310\305\270\006\025M!\025X\220H \211\000\220\023\002\242\360\032\200\315\023ws6q\031c\013\023\311-\235\362\320\234\005/\210c\210V\215\022\250\r\342\225\330\032\032)\246k\001k\252U\216G\364W\020\362\025D\t\312Px\nxYq\001\021\230\263C\312\303rS\374i\037\347\326\371\277\025\\)\303\346O\227\317\177\274\322\201\2222\347\216\371.\376\034\311Qb/\373_\370\302R\254\312\003{Jm\006E\301\035\000\320\245,\222\306.\253),\306\021\252V\026\205\310lt\326E\325D\031f\352\240\220\257\357\235\302\263\301^\014\331M:\205\021\001b\314\313*l\347\332\313E\262\263o\n\224\203D)\352\214O\004\251D\261l}\335\241\350ag\006i\311\231\215u\000\013\023\007:\036\036\335\014\005>\2405_KHW\237\266\230/\334yj!\260\271\371\025\242\203\"\300\300h\024\336s\365\304\245\377~\350\234\342)\224\345\203\216\023\201\330}\261\242\210\020\311\2118\215\005\301\240\025\215\005:f4i\263D\316\251\275jI\003\320N\315\241\202\350""\033[\237\\0\260\236>^\351av\362K\211\033\312F\\d\200Y@?S)K+\005\223\230\2643Q\255\r\301O4&\265\235\237\302E\353\242Ye\372.\"1\352\375\354w\230\313\321\347\323\253\317\225\265\365\250;\022\300d-\320\277\220\345:\223\330\356\376\207\032\242\"5\304rq\234}\236\224<\371\305K\357v\306mx@N#/c4\335u\227S\355\221\306O\340Y]w\013\257\231\035\320\2108\033\361\363\301z\n\000v%\302\311J\270\321\333\206c\237\265\253\210\035=y\347af/6u\013zz\255Xr\226-g.\033\030\3359\252\032\1776\266\233\204\304y\330\245z3\311\303\200\257o]\343w\\\203\206\205\214=;\267\250M\332\374e\261(g\213\000\321\342\353\311\205\2604\360\270&S<\260\2458`PW]x\252Sc\332\027u.\026U\t\242\030\210\032\377ojb+\260\274\020\363\rt\310Y\261\023\177@\224Dc\232\240!G\241\355t\326\016f\335\360!\260q\341}|\245g\314\212\306\213\305AD\032\261\306\356\327\367 pm\303\025\265\250\030(\331\330\rP\351\370\313\302\177\221\030d\241\310\213\236\2038\260\326\202\263wm\346+\322\223h[qFr\375t\275ls\211w$e\335#\035\254\350\001_\352\331\203\342\343+?_\313\216\254\261\206\017p;\004\351m\020\265wb\021\261J\305\004\324\031$B\004\266\330\224\020\273\360m%\026 \265\304\\F\271\211\311\355D\000\211\212%\336R\241\270P\"v\252\362&\217\310\225\306\346c\013\210\345\302\242\213=\260\005\214\007tr\356R)\010\300_\253]_\007\375\270\234A\364\031B\352}\376\r\271W[\361\035\262\360)\213\255\2423\221\211\315\336\340]TeCi+\363qS\224\314q\0208\361`\256\200n\213\014\000\212\213\\\315\227\\6\233\t\344\036}\244]\203\257\263\340 _\220\330h\242\36159\267\215\322\327Y\260nen\350}\203i\373\307\001\307\300\274]\346\337^\303\327;\004\024g\337nC^C,\035\313TG?\263\244\254c\362p0\206vh\"\253\271\031;\005*\326\234\025j\342\271\331[\330\352\223K`\002X\021$\350)\307\253hgY\337$w+\013@\221\010K\252\323-\314\364\032q4\254\034\264\321\010\260\336\354\342\254\300\016\305\205\022\246\245\037\236\201m\270\312\344\027\230(\304\332\246\260\177k\257\030d\223\221\232\027\033b\312!S\253\203\2550\216:D\216vD\354K\035\034xe\227\r[5\363$\301\216\\\265X\266\334\307\345\301\202\372w\212""\t\204\361\356\255\254hr\031\240\356\212Pt\016hA\242M{D@\n\213Q\376J\026\033\311\216)AA\032\246\016\325W\301\236M\2640\276\253\260\rl.o\025x\263jM\251\304\030\016*\016\006\252\320Z\226D-\032\034;\311DK\331V\017S\031l&\327\330\322\346}\202\2619;\302\367\213\334\0368\262\336+\261m\322d\315\345p\312\363\311x\006\301\004s\235\265#\354pN\376\022\201\205a\327\020\027M\227\006omU\240m\211\242[\210\241\307%SP\347\3367\353\036^\317Q\3219\320N\330\265\236\314p\025\017\371\266\345\366v\267\235\210b\034\313\244\006x\013\270j!h\025\021\356\247\260\025\246P\251\0102\313\030\361\272\362\024\343\311\222\333jS\n\030\2633j|\335M\255\005\214A\031\020\252D{\330`\212\"\033\224\320\200\226v\2270\254d\315qWRU\300@\037P\247\216a\214,\215\241\252P\014`\016\3059\006\253sPi\214\3366\271\307q^\244\354\345wc\351\256O\362YB\205Ej\336g\331;f\266\035lM\002.v\276\341\240\017`\332\204A\351\327\214\260\257\242\351\206[\270\320\214\242\222A!\013L\267A\035\310+'\233\267g\254SC\2517\226p\326\265\017\254\212I`\272\202\245\007oU\033\267\312\314\242\271^\022\246\274#\n\214\005\"\327{\024\r\331\354!\351\322 A\301\340\030;\016\320\205&\030P\014-\254\202\032\350\246a\031x\361 \300\020NJ \010\262t\013b\036\240m\357\33280[\200\211\262\212\027\244e\331\036\241C\020E\353\n\261\"i\246\235;\344Hv\010H$\022\201\002\326\346Q\253\006\n0H\225\202\"EL\202\234\222\3444\204\3270A\010\006\240k\210+\007a\343\213\002\n\204\242)6h\201\211t\301m\226\203dA\307\001\250\214\315D\245\031\020D\327Q\240\255v\313u\320\363\255\200\313h\245~\024&\032\265\000\025f\000\273\315\013\374\005r\325\026\326\324\247\025bX2\253\273)\2426ST\343\327u\030\301\250\023\245\234\262\302\225\221\031\221R*\224\332&a\241\020Z\365\225\217\013\r\"\232\221\017j\205&3\2426!d\235\265*\352\260\257M\245\t\"\262\302\303T\252\244\013k\r\310q%c\031J\333\216\246\214\245K w\324\271\205\222\017.%\251u\235\003\313\323\017&\332\337X\026\3360'\212\367\264\202:\2277\222\222+\230\202\370)\270 \350\010\010`C\002=Z\327\001V1]\241\222\2260\275\324\310~\016\226\260\257\204""\022\212B\000H\306\221\223-p\251\32152\235_^^%h\243\036\025\225\254lU8\306\3356e\022\240\276\327)\272[)P,%Si)\023\304\314P\004\2562\000n\205q<(I+*\007\210SI\006\032\031\235*Q\205()\213\331\230\331\260\r\323\302\002\271%\033\010\020\2579\302\366\333%\004\201\241\031\030 6\262\273\004\014Q\266BH\210\266\226\312b\r*\256\006$a\254\222\313Sk\341\205c\026\313ZK\214\202fN8\242\002g\213{\337\242\204\270QU\022`h0\310\333[.\n|\203\324\243\261mUV%\253y\260NJ \261\3260\002\265\340\366\372\273\206\341\270p\271\267\201A\346aU\341\237wC\031\320+\330\270\227\235\265#\t\266\003u\267\320=n\333)\013\025\003~B\320 \221:\"\202'\267\225\"\341\202\200\037\t\245\010\300\035#0s\333'\300N\243d\026y\235\240\214\226q]\353\315\200n\215\006\025;b\251\221\231\031\213L\033\273pu\235\253T\036\334o\307\000\035\223%M\004B\263\252\245\030\273\032\324\361m\026\004Wz\2258\200\343DT^\2367A\253\306\312\352\346g\240Zi\313\341\263\335\261\340U\257+p\271\340\303\373k\321\321\302E\221\212}\361\201\271\255?H\312z\005\250\236\024\020\200\267?\205\177P`C\317X\327\343\272\"\350\304Zi\223\013\203M\254\021\017lF\321!\340\226\336\025Q\013\321(a\206\251W\002\212\242\232\"\230\212\361\322\240-\000\032\3123\000\314\005\201\222\301\270\202\020\225\021\341\256\003\000](\254F\267\250\316a1\304\211\003\226\236\030\313]\204+\025f\316\023\365)\361\374\205\376\337\305\371\210!+\257\305\232\313\3646\035~\303\331\0131\227s1r\251\224\007\001\335\364q\341\253\032_(\256\377\314\272%\3362\r@\226\\W1m\226\370\241\t\033\010A\357\000IBYk\234\275J\004\031d #r\311\262\013{\207\230\320\013U\031\277\211\377H\373\3115\002\002\204\n8\320\"\374\254H\350BK\236@\341\223#`\207*\r\261\231gq\t)b\213\024\364\333 \233%\261+O\357i\265d\262s\001L26A16\267?\020A\246i\003\346\232;Z\001\233*\t\251\201\2377\017\032\306'o\2539,\353\315\014\357\374\326\010?\327\005\023g\222}\263\246\332\332\241]\303\027)\334\345|*\020hW\t\235J\205Ji\250\225v\314\022\270\253\177\177tj\325\254\232\233\352\231\304\332\344\257\347\252+\226\241XPU\016\n\247\253v\365\212\264""\342\327\250\200+_Z\365k\356j$l3B\255#\024=\300\212\232\0026\305\35259\316\221\\Rx\014\321f\200\242Zs\no\276\3461\336\303\204]\031\314K-\233\262He\232\222\365%J\220\320+\335\346\270\245\335\345Q\010`JX\357f\251\340\224\244\246\251J\323\321\267r\374\237\345\366\255\215(\326\242\304\265e\245;\235\021`\213\020s,v\341:}\301\376\025\206\265|Wp\023\350z\330\272*\234\030\02060A\237t>\017X\346\0140\363\220\r)R\231\361\001\242\356\315}Q\263Wd8\004)v\332\243\264:x\356\206+\323\260|6\311\344'J\007\260\300_\320\3741'RtT8n\031\313\265e\314(kDxIq\257\005+*\254\316A\200\354H\252\354\346\220\"`\325L+fy2(\033\264\262\321R\232cRbt\205\326Qe+\022\241\312\304\242\036\261\\\301\236\364\260\"\261z\001\301\3510H\216\001\210\332JG'\306\321\3075x\311\003d\351\213\242\315\032S\233,\360\n\351@D\377\361w$S\205\t\016\332Ju\300"; - PyObject *data = __Pyx_DecompressString(cstring, 3091, 2); + const struct { const unsigned int length: 10; } index[] = {{1},{3},{3},{81},{51},{31},{72},{179},{72},{36},{1},{1},{1},{1},{8},{4},{7},{6},{13},{2},{47},{9},{24},{21},{4},{38},{5},{9},{17},{17},{14},{19},{32},{17},{3},{8},{3},{19},{14},{13},{5},{23},{16},{9},{5},{23},{5},{17},{15},{21},{6},{12},{11},{10},{7},{20},{4},{3},{9},{4},{20},{10},{5},{9},{3},{12},{12},{13},{1},{14},{3},{5},{15},{17},{13},{11},{19},{13},{5},{6},{18},{2},{4},{4},{8},{11},{6},{2},{5},{5},{4},{12},{3},{9},{5},{5},{2},{1},{2},{2},{4},{8},{11},{20},{10},{17},{18},{5},{6},{4},{4},{5},{9},{8},{7},{4},{22},{3},{7},{19},{20},{3},{4},{3},{8},{2},{2},{8},{16},{6},{2},{4},{4},{4},{8},{11},{21},{33},{31},{5},{5},{9},{9},{6},{9},{4},{8},{6},{8},{6},{7},{9},{9},{13},{14},{12},{11},{5},{7},{11},{10},{9},{8},{7},{21},{20},{16},{13},{4},{6},{6},{1},{6},{5},{8},{9},{3},{6},{8},{6},{6},{7},{5},{11},{12},{5},{12},{13},{12},{9},{4},{5},{3},{6},{6},{4},{17},{6},{4},{15},{8},{17},{3},{14},{31},{7},{8},{3},{11},{4},{5},{16},{10},{12},{8},{4},{7},{4},{2},{3},{12},{5},{12},{3},{12},{4},{6},{10},{6},{6},{7},{7},{11},{9},{8},{19},{19},{3},{3},{10},{4},{4},{6},{12},{7},{4},{6},{6},{14},{6},{5},{17},{2},{2},{7},{13},{4},{13},{3},{12},{10},{5},{4},{9},{13},{7},{4},{3},{8},{15},{1},{8},{9},{5},{5},{2},{5},{5},{5},{5},{2},{6},{9},{5},{12},{2},{5},{5},{5},{6},{5},{9},{13},{5},{6},{1},{8},{11},{6},{2},{2},{8},{5},{8},{5},{5},{5},{3},{287},{118},{52},{898},{340},{2},{2},{139}}; + #if (CYTHON_COMPRESS_STRINGS) == 2 /* compression: bz2 (3094 bytes) */ +const char* const cstring = "BZh91AY&SY\255l\2310\000\001\240\177\377\377\377\377\377\377\377\377\377\277\377\377\377\277\377\377\362@@@@@@@@@@@@@\000@\000`\013=\357\245\347\3367}\203\246\361\353\336\255D\327\336\307\272w2\335\273\326H\365y\360\003\357\201\251\221\022h\21546\223M\243I\223\323M3D\233\323CL\232S\311\244<\2434\365M4yC@d\320m\023\032\215\000\331&\206\203D\023\021\221\220\021\251\247\251\351\0324\002\214\204\365=\251\2426\223A\200F@\311\221\221\200C\324\364\233I\262\002\006\032\236\204\320\021\032\025\037\243MF\243\324<\240\032\006@\0004h\000\000\000\000\000\000\320\320h\rL\t!\250\324\323\324\362\236\324\364\243d\311\030i\032h2\000\000\000\000\032\000\000\000\003#OSM\001\232\240SS)\241\345=F\233S#@\r\000h\000\006\200\000\320\000\320\320\332\206\200\000\000\000%\021=\"1\032d&$\006F\215\006\2151\000\320\000\000\000\000\000\000\000\000\003I#\001{GD\024?W\264\277jA\r\235E\350\r r:\243\244b\240\005\t\004\323\200\376\200\301\010\023\0201\002\023@\3204\002\000\031\374tEb\273\t`Ff\216\234\344\026)f\266&s 0\303>\022\244\342\242\212\202(\320$\t \005T\222\255ZsnNMJ*\323\205QJ\265&\204\347\235Sn\271)\241\325K\364\2519\262\374T.7S\242\212T\032\241\030\267\000J\356\317$O|J*\212(\300\344$\n\344\310P\0259\327nU\010\310\232\302J\215$WM\260\314\230\005\rx[\010E\023\010T\006\261B\244&\023\n(\245@)UB#u\273\"\360\322\025<\na\0074\004\264(\266\200\204.\365\346xH\330\212;\224\017\263\374y\337\215>\004\346\371S\346s\245\370\032P:4y\303\275K\313\2272TX\213\376\367\376p\214k2\200\336\321\233\301\221s\343\246\032\027\324$\241\030\272\255\002YL#S\252'\030P\331\353&\026U\020c\233\252\202B\304\337;\205g\202\274\031\261\232\342\205\021\001b\314\313A6\2673(Rlm\013b\235\360h\205;\246.A)\322,\032\377whz\030M\237\240rgX\262\200\005\211\203\270\207{\267G<\256k\303T\340\346\350\343\364\242\345\177\326\226\202\033\205\301\272\234\322\026\365\205\203@L\334\007\335\020\207\374\376\002\232^(\2058\224P\224\021\226{=,X@\202\244\266\332b\002\260e\314D\371r24*\315\317\311\337MK\026\002\204v\206\315\2006\355\375xnge\2458=}\322""\271\211\213\275\006I\242>0\304\000\262\200\310FR*.\027Vg\341f\303Q\255\006\320\227\032\t\223/\243\373\322]\324\"R\267Z\236\036\376_\354\266w\314\273{5\362\366!\\y\222\031y\\0\025\356\346_\344 \352G\313\327\357\033\352xx\322\361\273\307K\376~\024\036;\005J\362\031\270\275M$\003w\036>W\032-\257\022\377R\357\036\356]\274qv8\360\362\3326\016\343{\337\357xi#\310\\:s\275K\243\221\241w\343\340\321\264\016\036\\q\221b-5\362\025|<\225\2501*Q\365.\305g~\2467_\004F\277\232i\250\264@B\033&R|\272\2644m\022\346\310\356\034\331\234\003\006\262\301\337\226\335\364\212Yo\212V\016\213eU\0162\2621\241\255\002\3340\204\252g\220\024\261\003\002\202\272\345\212\205-\251\341f\353\205r\202b-H_\027OJ/\021\221r;\2764\321\002\226\342\021\257`\203\303\337\212\\\035<\376?\203\206 \324skq\r\301\267\212\330\357\024\273\017P\315W\244$\204\312\033l\351o]\001\202k\0068-\2140\270\300\206\300$\337\346T\207\326\211\322\216:\211\302\021\232I\234l5\362W\276\205|\312\323p\030\252+_\320\237\017\r[$\234\243\275\221C\313(1\235\000+\375\333H>\0361\264\271\034\306\317\2260\302W\003\256N\222\314\026\262\223\220\217\212U\220MA\2120@\226\320#\0042\227\0372QX\027\270i\006\256\2218\312\324@\010\230\242^Q\215\r\302\200\3075e\022i.Ln:\r#\013\206\313\232\362\263\344\244\tU\r\262\317\222\367=\310\241\027.\213;O\324i\032\022WT\255T\271w!S\352\247\274\226\366\240-yh\255\361\300\214q\227<6j\353\253\332\032\266J\026\327\211\034B\206\374Q\031\352\014eb\000\032J\361i\352T\026\t\241$\004\205\223\010]\030\367sL.a1\032Cb\347\207he\r15\214\227\026ll\206\243\346`\033x\325{;\372\343\270zi\220rL\373U\3404\3400\271\233\324\345\026\376\266o\260\032M\\A\0043\232\212*\273\221\223\260R\253;\202\253XV9\226\335\245I]\240\003Q\031\247bE*\346\230\254\235\257\222\030\303IPF`\211|\232\245u\232\206\255\315S\223\013\315\020\213\r\316\305\225\342\001\311\202\301qU<\244\014\372L4\240\324D/r\352\361\037E\226\213\260E03Am\255\353\235\3252.ef\020\303\240@\351\223\316H\223\037\177\026\030qh\336\335\340LA\033\372\3672g\323\031\353\341\210\325n\214V""\021\204\307\372\317\027\022BPu\367J\232\216\nQ\306\0177\027\000*-G>0\260\334LqJ\n\006\252a'\252\313\007\224_0\302\371\356\340=\260\271\273,\306[S\027N @\224*hW:\r\t\225\303#\211\016\342\t\"V\345W5+]n\246f\312b\337l\204E0gKZ-`h\332\272\366\252J\233:Iz\312\301\205\247\202\256\0239\001V6\210\241\232X\014\361\202\310\312r\3510\023\253K\301\265\224Fw\007\230\354\035)\320Dm\220\353\213v\205\251\206\342\357>2\225\375\030FuR\236\265QLiX\250\267r_\201h0\355\365P\002\370\313\2544\020\254\n\210\362\243\234\025fN\251\004\027)-\243+HQ~\r\364\251j\026/+\316@5L\255]\274\376c\010F\226\025\310\217\201\013\202\210\206\3458@E\213H\312Y\311k\344\344\357\250+\013\216K\246\3003&\022\300\203\336\014\301\035\327g\313\325\342\2211\214Z51\207aZ\224s\3573\235\264F\r\354Jt\212\212\2654\317\236\232\351R\316+Fa\n\246\266\3303\001\253\032\220D\032\216[\341tvYH]y\032\010\311\350\202\004\003\2532\311\310f\350\2114\331\226:C\265\034Q\241-,\0238f\006\034\264\222b\022\207\016\251\322/|\254\352+\225\341\032k\301\241\230\200\250\315\252*\014\266o@x6\024\024\200\220\230\004\034\215\245\007{1E)\274\nA;\353\310\225(R8r\020\320\202\314SB\261\013q\260D\252\006\215\226l\034-\300D\335\242\205\340u\335n\025\016A\027\254*\344\211\246\335\2754\262$I\302\022\t\004\240@\265\271\213U\303\205\030#\025\202\"2\230\2056\2352\220bG\324(\205\305\210X\027\234FIC\204\"\277\022%R\351\3050\333\207<\257\020\"\021\2105\021\231\244\222\223\"\010F\232\215\002*\256\031X\357\032\267\0145\n\025\322\202Y\247@\0012\270\027h\320w\350\032mn\003\262r\3263\250\372\240Q\004\r1\004%\262\004\3020&\001\013\201l\360\n\272\340L!a\233\014\\bC\204A\242m\014\246\030\350\026\006(\353\230\031M1\371fT\346\024\224\220x\344\npf\333\307\030r\340\276_\312*\230\252i\212U\330L\230\320X11$&5\010\0168j\342\252wZ\204O<\357\347\230\016?\017\243\201S\362\265*\271\027\003B\214\3003\001\000\321\304\370\245\363\010\314\304\2000E+\237t\277#\325l\016\273u\021\304q;\"i\350B\311b\344\264\327\270\325\3618r\362dd\264\204\256\277\026S3hl;8\357h,\206]\310\302\334Y\224\007\001\335\364ra\254\032_(\254\237\231tK\034\322\030bX\321\\\345\271X\245HH\304\204\036\374\"\000\032\265\206\270\270\014\204\311\201!6\352\034\300[\334<\206\220]\364\346\376'|\363\267\224h\t\010 Y\302\241\027\345rO2T\\\262\007\014\231\033\004.\244\340\031\226\177\020\222\251m\313sN\002J\002\240\022\316}\352\300yM\036\200-\003#h\024\266^\345\342\t52@\371\031\035\215\020\325D\006U\022c7>\213\230\233\276\264\3255\341d5\277\362\\$\377\\\r\233\\s\253\033\220+,\026\266b\273\225\356\343\207HY\024\202\246\320\236\353\212uKn\030%\257=\375\375\267F\213\312w}c8\273|t\266(\212E\252T\320(\210$\357\243u\372t\\\215I\324\200\365\225\337z\316\023\252\033\rO\243@\304\377h\"q!;\201\366\335\345:\005]\023\200i""\266\247\206\313O@\231\367W\3007\356\\\026\006|\271E\265bI\014\263D\255V\030\221h\023\375\333\\R\254]BS,0\271\277\232\215F\020\305\252\014i\366\253W\221g\371f\325a\334\217V4Z\265-#K\2326H\247\223\231O\263\326\303\307\340\377\007\206\275+\326\004<\277\005\356gN&FG\227\327\022n\240\2061er\tR\2618\300\355\311\2233X\r(T\336|m;\264 \202\r\322\263?\3309\327pa\013\317\315\331\370[,\\\250H\030\321@\207\347\2103\330\325rtu_\301\023b\350\357\3600\361\037]\\\226\207N\322\273+3\220`;\022*\2739\244H\311\303\352\214+\347y1i\033\306\224\253\033\335\030\304\272\302\353\026u*\305D\212\261D=j\310\301\345zX\021V\225\000\337\364\034#\r\361\210\314\224l\245\215\233\035+&\212\007\312I\214\221f\217\031\315\326x\005\222P\021?\374]\311\024\341BB\265\262d\300"; + PyObject *data = __Pyx_DecompressString(cstring, 3094, 2); if (unlikely(!data)) __PYX_ERR(0, 1, __pyx_L1_error) const char* const bytes = __Pyx_PyBytes_AsString(data); #if !CYTHON_ASSUME_SAFE_MACROS if (likely(bytes)); else { Py_DECREF(data); __PYX_ERR(0, 1, __pyx_L1_error) } #endif - #elif (CYTHON_COMPRESS_STRINGS) != 0 /* compression: zlib (2997 bytes) */ -const char* const cstring = "x\332\215V\313r\333F\026\035\331\224M\333\362C\321#\2663I ?3\036\207\031Jv\036\036')\210\242,N\364\244d[\232\304\203j\002M\0226\010\200h\200\"]\225\252,\271\304\022K,\261\344\222K-\265\344\222K~B>a\316mH\262c;SS$\032\215F\367\355{\317=\3674\036\347\362\325\334B\265\340\330\276\023x\212\301}\256\373\246c+\266\343+-f\231\306#EO_\n\205y\\\216\273\236\343r\317\352(\302\361|n(U\317i(\026\257\372\212\357(\236Y\253\373\271\377i\320v\336\330\364\270\356\324l\36357J\rV\343x\021X\206\234\\\341x\311R\353\217\224\037\326\337Z\264\317\341I\325\tlC1m\305\257sr\251e\032\360\305$+9\245\300\322\035i\211i\007\\a6\263:\302\024\271u\307\347X\302|\245\320\361\353p\314\024\360\3222+\334c>\247\240|\317\324}\356\321$[\331,n~\371\340\333\007Xo\300\235\227\010F(\"\250\350\026\023\202\013\305\251*\225\300\264|r\243\343r\221SJU\245\343\004\212\315\341\014\340p1\357\355\005p\326V\004\367\245\327w\231\r'\031\341\243a\271i\327\356*\206\351\021b-N\253\227\231%xn=h\300;\332\013\350\330\2048\2670\307s\014\0304\0344\024j\203\371z]\232\345m\027\2571\rx\007\374Q\272J\371^\331y\033(\227\371u8\302\033\351jl\306\333\246\360s\367\377\371#3\014\rc<\247\213\226a\nV\2618\267\251\275\377\306\364\367JM\317\335\253\007\265\032\274\2562\235k\365\240\222\273\2473\275\316\277\024\035\341\363\206\022P\300\242\323\260L\373\225\310\3353Ej\305\260]?\267\276\244z\036\353\374l\273\271\252\345\000\002\273\366\342\235\361\300\264\375o_\344\\\273&<\375+\303q}\r\026\3009\215\331N\003T\342\342\253\023~\345\334\216\237[t\332\240\236h-1\200\232[:~\267\006\240,\204V\262\253 \216\255\3632\027\201\345\373\271miN\022O\370\201k\361\237\245/\367\025y{\221\016\235X\274\257\374q\305\013\325\356,\252\205\237\0267\326\213\330\271\260\242\226\3265us\263\274\261\253m\227\3266W\213\205\215\325\215\262\266\370\244<\377\244\254\356\275y*?Y\004A\355\316Q\225\024\230\245\007\226\244A\321\363\034o\251\270S,\354\2246\326\265\265\215\245\342\3526m\276\354\261\006_6\301\342\225\242\272\263\246nj\313\245\325\342\272\272V\324\266\237./\227v\245O\262""\001\303\313(\034i\352\235\220K\266,\301\3421}\n\304\214Uu\257X\336\226[i\313\033\253K\305\362\332FysE+\254nl\027\323n\031\376\034ef\375\351\232\366L]--iE\004\270S\306\262\355u\307\346\233\245\325Mb\240\356x\034\235\272\246mv\332\270\226PL\332:o\303\247\352\326\323\215\235\242\266\016\274\312*\342+\027w\312\332N\271X\004\036o\003\273\263R.n\257\300\023m\361y\332\327\026K\353jyOc\272\316]\320O\2538m.\230e1\313\255\263#:Tr\r\231\350\364\261\243\235p\343x\300b\025n\035?4\230\373VW\363\270 \021:\036\022\024\006\243x\231\240\302f\242c\353\246\223\303\260\023\200\254\330\274\315\310\005\324L\205\351\257*@\240\002\2474\323F\001\210\n\022\345u*\026~\336.5{\025\307\261*\244X z\031na.\376\233\0168.h]\236\232\371\212\247\353y}^\307\246:\324\250\346x\035\235\243\342=\ru\010p\271\376\212B\207\267\006L1[\357\3101\227\314h\232\324\030\255\306}\023\325G\217\360\023\016i\276\207\372$/u\313\021\\6\206\216\240u\354\r\201\204ajX\372$\025\026\367\026\3670\356v\010\010\350\225&X\303\205\301\232\346\021Qu7\320q\n\2700\224\336\216K\223\216\201w\206\344\211\000)\321\003\203\351\255y\275\345\027\034\313\361\014\325X4\300l\215T\3468UZ\232B\203\267L\235\033U\303l\250\270\026)z\272\0201\227BPa\302\324\305\0075\341\203\2039\255j\332\206F\242\367'\023N\\0(\337\334\250!\000-\305\036\267\240!\217\007N5%x\000h\r\316l\216j\222\252\t\\\344]`n\333\364\251\365\271mT\315\032\261\252jZ\\n-;$\215\350\3000v\240\024\244\017\373\314\263aF\220\237G\272 \336rZ*\222l\026\346\253\216e\300-i\021\207\243\006\357\334\016\365$a5\255\032\330\272\006\036\330Pk\017t\330\366\275@\367\003\017\346Q\371\r\004\205A\355]\314iL\366\264\324~\315c\025\355\230\020x\350\324!*\334\253\013\027l2\315\232\rb\310\323V6\232\355\246w\257V1\0335\374\345HMzi6\350$7\033\242\356\354\233\r\324\217%\020\030\220\"u\322R#\266\033\370\232/\263\0022/\314\233Bc-fZtbhx8\251<\364\r\010\263I\005\202~\372\rB\214\247K\274\344\376+\356\331\034\322\320\341\236 :\322\325p\204\257\265\021Y\340\371u\213d\264\006,\r\272\220\020XB\201A\247 \005\250\027\264""\276k9>I\212\333\241^\203\265\033\320\200\300\343 \270]\363\353\177|\312=\266\034\035G\365\017\271#\320\033\\\010\004\3250\rY\232\r\323\306_\005\010T\372\004\262\004:E\373\017\333;F\200pq\367\334:\212\244\326)\2665\315\206\364\243\005\247lGC&\014@\337\260]\034\227\310\374I\212$\013d\223K\277%\234j\025UFD\221*\003\\k@\0200\273\010:\325)H\240\301\320\342\210\360)Q\210\030_v\310\020\307M\270\351\207\210kZi\216\\\323\345\244)\256\331\006_4L\321\032\234\276\226\264\335\367\207\366\\\313w\241\003\304r\251\246(:\025\327b\212\250\2465\003f\245\2215\003\207*\310\203\262\2452\354\311\303*m\211@(\017\333\343`\260-\265D6G\031\005\271\237\334N\202\336\332\301\325\303\311a\346\\w\252\253v\267F\231+\341\351\360\273H\215\236\307\205\2709\304\343x\370oL\036\243\356\271\350j<\031\317\r3\227\273^8\0336\243\363\361\335d2\271\221\374\253W\351\217\245\226/\304\371\270\224\354\366\266zz\177\252\257\2160\3708z\215YsC\331\025\361\\\234\037a\277\231.\033\236\273\324\255\207l\230\235\014gB\0266G\231\351p9\372{\374\224&O\207K\321X4\023\331I!\351\220\365\217\302;\321D\274\222,&F\357Fo\271?7\312\\\354\226\273\255p\013&2\327\243\233\360Y\215\377\323\373\272?\333o\036d\016\226\017\357\0146\267\006[\345Q\346B7?\230\370k\244\016\263\023]4\2627K\033\243\371ml45=\274v\235\376\004\317\2250\023\252\341\3260s\3667\277\373]\370$\312\017\263\227\006\227>'\020F\031e\240<\354""\3752P\313\203\362\36603>\314~\032\3752\370\333\017}\326o\376~\346/\343\227\007\227>\203\3070?5\230\372\"\301\202\031\230B|\223\303\354\265h\362\250'w\035\236\277@\177\332\022Nuw\302\311\360fX\016\375(\037-\305\247\342;I&Q\223\355\336\251\336\255\036\353\371\375\371\376\026\326\\\272\374\226\247\nee\242[\350\356\003<\021\315\301S8\335\352n\207cp\271[\035L\337\211\331\340\356\312\341\330\341\344(s\251\313\303<0=\023U\343b2\2334{\247{\363=\304y\241\373Mx\233\300\277\320]\350\232\310\352\271x*V\311T\007\\x\024m\311\005\237\367\307\373\333\007c\204\371\366\340\n\014\307\"\311\365O\367\261'F\302\213\230V\217\365\344\263^3\365\211\322R\217\214x.\265\333@X\305x&6\222\233\311/D\214t\337\\<\026O\322V\001\2264\217\274\276\017\374&.\022\234\027\272\267@\020\033i\335\"\3225\341\317\367X\361\0218V\210\375\344aO\322\362Tx+4\242\2714c\371\367\214\334$\306\"}\243L\266;\336E6.w} \241\206\317\242\205\310J\346\022\271D\017\257\303E\225\272\225\360\014\000\r\242\345\370F,\007\214p.\\@4,\362\342O\222\237z\277\036\250\007[\243s\027\221\264iX\311\017\317\035\327\306\255\230\375\237\017\243,-\277\036\315\203\265\245\344y\017\033\27530\312\022p\025\320\261\200\354\336\210(\236Q\366:\002U\346\350]^>\317\2065@\017*\317\204\317Q\266[#\204'\302\033\241:<\356\214\262W\302\263a\023\263\207\037M\205\017\302V\264\033o\305\034a\277\377\3700:\025\335B\276W\300\275\247\275\271\337\263\177\031\317~\020\324i\000\202\212%\314\177\205\177A\212\034\246\334C\355b\247\tI=\365`\362\340\366\201\254\214+2{\337\014\256\377\330\367\016\246\017N\362y2\262s8{\330D\301\276\367\342\317\247\2162W\243\323\310\332\232\024\241%\020\032l\374\300\320\345\301\3459\220f!\256\014\276x\324\2771x\274q\350I]\270\216`Y\324\212\237'\313=\220\344\223\350\001\252\374L\\K\366z\214x\373\010$n\200lE*\361\352\201\232V\340\354\307\324B4R\271\310FR\234\276\210@\365\211n)\255\367\231\360U\374q2\236\354\r\276^;|\n\261\030\001\251}\260\354\032\352t!\322\343k\311\255\204\021%3\335\345\360^TB\016\032\220.\250C*@\333QV2\375;\022\223\231\360it;j""\016\224\177\364\306z\230rqp\361Sd\375e2\226L\216\260\333'R\260\325a\232i\310\346\024\006\236Ag%\247&\303\271a\366|\3676@\034\243\316]\214\334\215f\243\346\361\303\235\301\325\\\302{\337\364\357P\201\237\035\234\375\030F\316B\252\241\356\224\3416J\363\334\014\304\311\213&\243{\250F\022\350\3544ql*\314\217\244\350l\221\246_C\241\240\262\206\2313\277\325Pi'k\346\210\334[\304\020F\264l\222\243\247\303\274\224\343h.\036;9\237(\323\022V\302e\t\356\276\351\\\226\356\247\267\021\360\276\005\376\355G\225\370l\034\200\254\345\244\205#\307\350\337\350/R\242\2104)\216\317\243\305\250F\016'\363\311\263^\276\267\324?\205I\313\007s\007y\312\360\003\230\233\300\224\227\220[y\212\375\027x\246\220T"; - PyObject *data = __Pyx_DecompressString(cstring, 2997, 1); + #elif (CYTHON_COMPRESS_STRINGS) != 0 /* compression: zlib (3012 bytes) */ +const char* const cstring = "x\332\215V\313r\333F\026\035\331\224M\333\362C\321#\2663I ?3\036\207\031Jv\036\036')\210\242,N\364\244d[\232\304\323\005\002M\0226\010\200h\200\"]\225\252,\271\304\022K,\261\344\222K-\265\344\222K~B>a\316mH\262c;SS$\032\215F\367\355{\317=\3674\036\347\362\325\334B\265\340\330\276\023x\212\301}\256\373\246c+\266\343+-\3152\215G\212\236\276\024\212\346q9\356z\216\313=\253\243\010\307\363\271\241T=\247\241X\274\352+\276\243xf\255\356\347\376\247A\333yc\323\343\272S\263\315\327\334(5\264\032\307\213\3002\344\344\n\307K-\265\376H\371a\375\255E\373\034\236T\235\3006\024\323V\374:'\227Z\246\001_L\262\222S\nZ\272#-1\355\200+\232\255Y\035a\212\334\272\343s,\321|\245\320\361\353p\314\024\360\3222+\334\323|NA\371\236\251\373\334\243I\266\262Y\334\374\362\301\267\017\260\336\200;/\021\214PDP\321-M\010.\024\247\252T\002\323\362\311\215\216\313EN)U\225\216\023(6\2073\200\303\305\274\267\027\300Y[\021\334\227^\337\325l8\251\021>\014\313M\273vW1L\217\020kqZ\275\254Y\202\347\326\203\006\274\243\275\200\216M\210s\013s<\307\200A\303AC\24164_\257K\263\274\355\3425\246\001\357\200?JW)\337+;o\003\345j~\035\216\360F\272\032\233\361\266)\374\334\375\177\376\250\031\006\303\030\317\351\242e\230B\253X\234\333\324\336\177c\372{\245\246\347\356\325\203Z\r^W5\235\263zP\311\335\3235\275\316\277\024\035\341\363\206\022P\300\242\323\260L\373\225\310\3353Ej\305\260]?\267\276\244z\236\326\371\331vsU\313\001\004v\355\305;\343\201i\373\337\276\310\271vMx\372W\206\343\372\014\026\3009\246\331N\003T\342\342\253\023~\345\334\216\237[t\332\240\236h-i\0005\267t\374n\r@Y\010\255dWA\034[\347e.\002\313\367s\333\322\234$\236\360\003\327\342?K_\356+\362\366\"\035:\261x_\371\343\212\027\352\372\306\232\272\272\307vV\312\305\355\225\215\325%\325\356,\252\205\237\0267\326\213p\245\260\242\226\326\231\272\271Y\336\330e\333\245\265\315\325bacu\243\314\026\237\224\347\237\224\325\2757O\345'\213`\254\3359*\233\202f\351\201%yQ\364<\307[*\356\024\013;\245\215u\266\266\261T\\\335&o\226=\255\301\227M\320z\245\250\356\254""\251\233l\271\264Z\\W\327\212l\373\351\362riW:)\033P\276\214J\222\246\336\301\240d\313\232,\036\363\251@TYU\367\212\345m\271\025[FX\305\362\332Fys\205\025V7\266\213i\267\014\177\216R\265\376t\215=SWKK\254\210\000w\312X\266\275\356\330|\263\264\272I\224\324\035\217\243Sgl\263\323\306\265\204\352b\353\274\r\237\252[O7v\212l\035x\225U\304W.\356\224\331N\271X\004\036o#}\0020[|\236\366\331bi]-\3571M\327\271\013>\262\212\323\346B\263,\315r\353\332\021?*\271\206\314|\372\330a'd9\036\260\264\n\267\216\037\032\232\373V\227y\\\220*\035\017\t\nC\243x5A\225\256\211\216\255\233N\016\303N\000\366b\363\266F.\240\210*\232\376\252\002\004*p\212\2316*BT\220(\257S\261\360\363v\251\331\2538\216U!\t\003\363\313p\013s\361\337t@zA\353\362\324\314W<]\317\353\363:6\325!O5\307\353\350\034\022\3401\024&\300\345\372+\n\035\336\0320\245\331zG\216\271d\2061):\254\306}\023\345H\217\360\023\0161\337C\301\222\227\272\345\010.\033CG\320:\366\206b\30205Z\372$%\027\367\026\3670\356v\010\010\010\030\023Z\303\205\301\032\363\210\250\272\033\3508\026\\\030Jo\307\265J\347\302;C\362\210\200\266\350\201\241\351\255y\275\345\027\034\313\361\014\325X4\300lF\262s\234*\226\246\320\340-S\347F\3250\033*\256E\212\236.D\314\2452T4a\352\342\203\"\361\301\301\034\253\232\266\301H\005\377d\302\211\013\006\345\233\0335\004\300R\354q\013\032\362\274\340TS\202\007\200\326\340\232\315QMRF\201\213\274\013\314m\233>\265>\267\215\252Y#VUM\213\313\255e\207\264\022\035\030\306\016\224\202\364a_\363l\230\021\344\347\221.\210\267\234\226\022%\233\205\371\252c\031pKZ\304i\311\340\235\333\241\236$,c\325\300\326\031x`C\276=\320a\333\367\002\335\017<\230G\3457\020\024\006\331\273\230\323\230\354\261\324~\315\323*\354\230\020x\350\324!*\334\253\013\027l2\315\232\rb\310\343W6\314v\323\273W\253\230\215\032\376r\244&\2754\033t\264\233\rQw\366\315\006\352\307\022\010\014H\221:\261\324\210\355\006>\363eV@\346\205yS0\255\245\231\026\035!\014\017'\225\207\276\001\2456\251@\320O?J\210\361t\211\227\334\177\305=\233C\032:\334\023DG\272\032""\216\360Y\033\221\005\236_\267HFk\300\322\240\013\t\201%\024\030t\nR\200zA\353\273\226\343\223\244\270\035\3525\264v\003\032\020x\034\004\267k~\375\217O\271\307\226\243\343\354\376!w\004z\203\013\201\240\032\246!K\263a\332\370\253\000\201J\237@\226@\247h\377a{\307\010\020.\356\236[G\221\324:\3056c6\244\037-8e;\014\2310\000}\303vq~\"\363')\222,\220M.\375\270p\252UT\031\021E\252\014p\255\001A\300\354\"\350T\247 \201\206\206\026G\204O\211B\304\370\324C\2068n\302M\277L\\\323Js\344\232.'Mq\3156\370\3020\20558}>\261\335\367\207\366\\\313w\241\003\304r\251\246(:\025\327b\212(c\315@\263\322\310\232\201C\025\344A\331R\031\366\344a\225\266D \224\207\355q0\330\226Z\"\233\243\214\202\\\236!\362b^h-N\365\246\233\000\000!\371&}L\331\306Q\241\313\000\360I\3462Fj\226n\214\236\301\253\032v\021u\r\237s(j\332\036\311\250V\211W'\330\212f\300\371kN\245\213\357E|\337Q\010\342\370\3164\343e |\304\344c\n\332:\\G\372\014t\234}\237\274\365-\037\207\301.5{\350{\273\324\354\371\216\357\220\374\371\216\005y\201\266\371\216\247\327e\303R\t\364=\337\303\021B\315\236\374\342LS+\277\225\002\373\310-|xQ\200i\255\311\217@\331\210\375cM\331\367\322\023\016\201\356\313\362m\347\333\363mD\007~\2106\350\336Fc\032\006\304\014w\233N\304v\207z\257M\367\267\261\341\205\t\372\217\237\031f\246\302\207\321\331\250\031\237On'Ao\355\340\352\341\3440s\256;\325U\273[\243\314\225\360t\370]\244F\317\343B\334\034\342q<\3747&\217Q\367\\t5\236\214\347\206\231\313]/\234\r\233\321\371\370n2\231\334H\376\325\253\364\307R\313\027\342|\\Jv{[=\275?\325WG\030|\034\275\306\254\271\241\354\212x.\316\217\260\337LW\033\236\273\324\255\207\3320;\031\316\204Z\330\034e\246\303\345\350\357\361S\232<\035.Ec\321Ld'\205$\030'\034F\031e\240<""\354\3752P\313\203\362\36603>\314~\032\3752\370\333\017}\255\337\374\375\314_\306/\017.}\006\247a~j0\365E\202\00530\205\020'\207\331k\321\344QO\356:<\177\201\376\264%\234\352\356\204\223\341\315\260\034\372Q>Z\212O\305w\222L\242&\333\275S\275[=\255\347\367\347\373[Xs\351\362[\236*\224\230\211n\241\273\017\374D4\007O\341t\253\273\035\216\301\345nu0}'\326\006wW\016\307\016'G\231K]\036\346\001\353\231\250\032\027\223\331\244\331;\335\233\357!\316\013\335o\302\333\204\377\205\356B\327Db\317\305S\261J\246:\240\303\243hK.\370\274?\336\337>\030#\314\267\007W`8\026I\256\177\272\217=1\022^\304\264z\254'\237\365\232\251O\224\226zd\304s\251\335\006\302*\3063\261\221\334L~!n\244\373\346\342\261x\222\266\n\260\244y\344\365}\3407q\221\340\274\320\275\005\216\330H\353\026\361\256\t\177\276\307\212\217@\263B\354'\017{\222\231\247\302[\241\021\315\245\031\313\277g\344&\221\026\351\033e\262\335\361.\262q\271\353\003\t5|\026-DV2\227\310%zx\035.\252\324\255\204g\000h\020-\3077b9`\204s\341\002\242\321\"/\376$\371\251\367\353\201z\2605:w\021I\233\206\225\374\360\334qy\334\212\265\377\363a\224\245\345\327\243y\260\266\224<\357a\243w\006FY\002\256\002:\026\220\335\033\021\3053\312^G\240\312\034\275\313\313\347\331\260\006\350A\345\231\3609*wk\204\360Dx#T\207\307\235Q\366Jx6lb\366\360\243\251\360A\330\212v\343\255\230#\354\367\037\037F\247\242[\310\367\n\270\367\2647\367{\366/\343\331\017\202:\r@P\264\204\371\257\360/H\221\303\224{(_\3544!\251\247\036L\036\334>\220\225qEf\357\233\301\365\037\373\336\301\364\301I>OFv\016g\017\233(\330\367^\374\371\324Q\346jt\032Y[\223:\264\004B\203\215\037\030\272<\270<\007\322,\304\225\301\027\217\3727\006\2177\016=\251\013\327\021\254\026\265\342\347\311r\017$\371$z\200*?\023\327\222\275\236F\274}\004\0227@\266\"\225x\365@M+p\366cj!\032\251\\d\2431\022\247/\"P}\242[J\353}&|\025\177\234\214'{\203\257\327\016\237B,F@j\037,\273\206:]\210\364\370Zr+\321\210\222\231\356rx/*!\007\rH\027\324!\025\240\355(+\231\376\035\211\311L\3704\272\0355\007\312?zc=L\2718\270""\370)\262\3762\031K&G\330\355\023\251\331\3520\3154\224s\n\003\317 \265\222S\223\341\3340{\276{\033 \216Q\347.F\356F\263Q\363\370\341\316\340j.\341\275o\372w\250\300\317\016\316~\014#g\241\326\020x\312p\033\245yn\006\342\344E\223\321=T#itv\23286\025\346GRt\266H\326\257\241PPY\303\314\231\337j\250\264\2235sD\356-b\210F\264l\222\243\247\303\274\224\343h.\036;9\242(\323\022V\302e\t\356\276\351\\\226\356\247\267\021\360\276\005\376\355G\225\370l\034\200\254\345\244\205S\307\350\337\350/R\242\2104)\216\317\243\305\250F\016'\363\311\263^\276\267\324?\205I\313\007s\007y\312\360\003\230\233\300\224\227\220[y\220\375\027\312\265\227\r"; + PyObject *data = __Pyx_DecompressString(cstring, 3012, 1); if (unlikely(!data)) __PYX_ERR(0, 1, __pyx_L1_error) const char* const bytes = __Pyx_PyBytes_AsString(data); #if !CYTHON_ASSUME_SAFE_MACROS if (likely(bytes)); else { Py_DECREF(data); __PYX_ERR(0, 1, __pyx_L1_error) } #endif - #else /* compression: none (4941 bytes) */ -const char* const bytes = "<.1f.3fContour detection not valid: contours are not properly sorted from left to right.Contour detection not valid: no contours recognizedImage could not be read from: >No contours were found in the provided image. Can not continue analysis.Note that Cython is deliberately stricter than PEP-484 and rejects subclasses of builtin types. If you need to pass subclasses then set the 'annotation_typing' directive to False.Number of counted electrodes does not match the expected value: count = The provided path seems not to exist.,;?add_note.csvdisableenable, expected = gc.*huggingface_hub.*cache-system uses symlinks.*isenablednpt.NDArray[np.floating]npt.NDArray[np.uint8].pngsrc/dopt_sensor_anomalies/detection.pyt.Boxt.CsvDatat.DetectionModelst.InferenceResultt.SensorImagestuple[float, float]tuple[t.CsvData, t.SensorImages]AnyBACKBONEBoxCHAIN_APPROX_SIMPLECOLOR_BGR2GRAYCOLOR_BGR2RGBCannyContourCalculationErrorDETECTION_MODELSDataFrameFinalHEATMAP_FILENAME_SUFFIXImageImageNotReadErrorInferenceResultInvalidElectrodeCountLAYERSMODEL_FOLDERMORPH_CLOSEMORPH_RECTNDArrayNUM_VALID_ELECTRODESNonePILPatchcorePath__Pyx_PyDict_NextRefQUOTE_NONERATIORETR_TREERGBSensorImagesTHRESHOLD_BWTHRESH_BINARY_accepted_boxesallalphaanomalib.modelsanomaly_detectionanomaly_labelanomaly_mapanomaly_map_resizedanomaly_scorearrayastypeasyncio.coroutinesaxaxesaxisbackbonebbox_inchesbinaryblblbrXblbrYboolboundingRectboxboxPointsbox_1box_2brcc1c2castcategorycenter_distcheck_box_redundancycheckpoint__class_getitem__cline_in_tracebackcloseclosedcmapcntsconstconstantscontoursconvertcopycoreset_sampling_ratiocpucroppedcropped_sensor_leftcropped_sensor_rightcsvcudacv2cvtColordAdBdata_csvdetection_modelsdevicedfdimAdimBdistdistancedopt_basicsdopt_sensor_anomaliesdopt_sensor_anomalies._find_pathsdopt_sensor_anomalies.detectiondtypeedged__enter__enumerateerrorseuclideanevalexistingexists__exit__extendfigsizefile_pathfile_stemfiltered_cntsfilterwarningsfindContours_find_pathsfloatfloat32folder_pathfrom_numpyfromar""ray__func__genexprgetStructuringElementget_detection_modelsget_model_foldergrab_contoursgrayheaderhspaceiignoreimageimage_npimage_rgbimgimg_npimg_pathimreadimshowimutilsindexinfer_imageinput_tensorint32is_available_is_coroutineis_duplicateis_sorteditemitemsjetkernellayersleftleftmost_x_fourthlinalgloadload_state_dict__main__matplotlib.pyplotmaxmeasure_lengthmeasure_length..genexprmessagemidpointminminAreaRectmodemodelmodel_state_dict__module__morphologyEx__name__nextno_gradnormnpnptnum_contoursnumpynumpy.typingofforder_pointsorigoutputpad_inchespandasparentpathlibpermuteperspectivepil_imagepipelinepixels_per_metric_Xpixels_per_metric_Ypltpoppred_scorept_Apt_Bpyplot__qualname__quotingrboxresizeresultresult_patternreturnrightrightmost_x_thirds1s2savefigscipy.spatialsendsensor_imagessep__set_name__setdefaultshapesidesize_diffsort_contourssqueezestemstrsubplotssubplots_adjustt__test__thresholdthrowtighttltlblXtlblYtltrXtltrYtoto_csvtolerancetorchtorch_devicetrtrbrXtrbrYtypestypinguint8unsqueezeuser_img_pathvaluevalueswwarningswrap_resultwspacex1x2x_coordsx_maxx_middlex_miny_maxy_minzip\200\001\330\013\014\330\013\014\330\005\006\330\004\023\2205\230\007\230q\240\n\250%\250u\260M\300\030\310\021\330\004\t\210\023\210A\210Q\340\004\020\220\003\2209\230A\230W\240C\240q\330\004\020\220\005\220Z\230q\240\001\330\004\020\220\t\230\030\240\021\240!\330\004\017\210r\220\026\220q\230\n\240'\250\021\250\"\250J\260b\270\001\330\004\023\2205\230\013\2401\240I\250X\260Q\260c\270\023\270A\340\004\023\220<\230z\250\021\250!\330\004\023\220<\230s\240!\2401\340\004\t\210\025\210a\330\t\016\210h\220a\330\010\021\220\025\220a\220q\340\004\024\220F\230+\240U\250!\330\004\024\220D\230\001\230\025\230n\250C\250y\270\001\330\004\022\220&\230\014\240H\250B\250d\260\"\260F\270!\340\004\r\210R\210v\220Q\220a\330\004\032\230#\230W\240A\240^\2606\270\026\270q\300\004\300F\310&\320PQ\320QR\340\004\013\2101\320\014\034\230A\330\010\014\210A\330\010\034\230A\330\010\026\220a\330\010\026\220a""\200\001\340\023\024\330\031\032\330\031\032\330\005\006\330\004\020\220\004\220A\220Q\330\004\007\200t\2109\220G\2301\330\010\016\320\016\037\230q\240\001\340\004 \320 5\260\\\320AR\320RS\330\004\005\330\010\035\230\\\320)>\270a\270q\360\006\000\005\017\320\016\036\230n\250A\330\010\023\320\023(\250\001\340\004\025\220Q\330\010\021\220\021\330\010\031\230\021\330\010\021\220\021\330\010\026\220a\200\001\330\n\013\330\n\013\330\005\006\330\004\014\210A\210T\220\021\220#\220R\220t\2301\230D\240\002\240&\250\004\250A\250S\260\002\260$\260a\260t\2702\270Q\200\001\330\016\017\330\031\032\330\031\032\330\005\006\330\004 \240\001\330\004\014\210C\210w\220a\220s\230!\2301\330\004\007\200v\210S\220\001\330\010\016\210f\320\024&\240a\320'H\310\001\310\021\340\004\016\210e\2201\220D\230\006\230f\240E\250\026\250q\260\003\2602\260Q\330\004\013\2107\220%\220q\340\004\013\2103\210i\220q\230\t\240\023\240A\330\004\007\200y\220\003\220:\230Q\230f\240E\250\037\270\005\270S\300\001\340\004\r\210S\320\020&\240a\240s\250.\270\003\2701\330\004\r\210S\220\r\230Q\230h\240c\250\036\260q\330\004\014\210C\210v\220Q\220h\230d\240!\340\004\013\2103\210m\2301\230E\240\025\240d\250#\250\\\270\023\270A\330\004\013\2107\220.\240\001\240\021\330\004\007\200u\210C\210q\330\010\016\210f\320\024,\250A\330\014\r\360\006\000\005\013\210$\210h\220n\240A\240Q\330\004\017\210q\220\003\220=\240\001\240\022\2401\240C\240t\2505\260\001\330\004\020\220\002\220$\220d\230!\330\004\007\200t\2101\330\010\016\210f\320\024,\250A\330\014\r\360\006\000\005#\240!\330\004\037\230q\340\004\010\210\005\210Q\330\010\017\210t\2201\220A\220V\2303\230l\250!\2501\330\010\016\210c\220\032\2301\230A\330\010\016\210b\220\006\220a\220u\230F\240\"\240A\330\010\016\210d\220!\2203\220h\230a\230r\240\033\250K\260}\300A\300Q\340\t\r\210T\220\024\220V\2301\330\t\020\220\t\230\030\240\021\240$\240a\330\t\020\220\t\230\030\240\021\240$\240a\330\t\020\220\t\230\030\240\021\240$\240a\330\t\020\220\t\230\030\240\021\240$\240a\340\010\r\210T""\220\032\2302\230W\240I\250W\260A\330\010\r\210T\220\032\2302\230W\240I\250W\260A\340\010\013\2103\210b\220\004\220C\220s\230\"\230A\330\014\r\340\010\032\230!\330 !\340\010\013\2101\330\014\r\340\010\026\220g\230Q\230a\330\010\025\220W\230A\230Q\340\010\017\210s\220\"\220A\330\010\017\210s\220\"\220A\340\010\020\220\007\220q\330\014\r\330\022\023\2204\220v\230X\240Q\240e\2501\330\022\023\2204\220v\230X\240Q\240e\2501\330\022\023\2205\230\002\230$\230f\240H\250A\250U\260!\360\010\000\005\010\200t\2101\330\010\016\210f\320\024,\250A\330\014\r\360\006\000\005\024\2203\220a\220q\330\004\007\200}\220C\220u\230A\330\010\016\210f\320\024*\250!\330\014\r\330\014&\240a\320'A\300\021\300%\300q\360\006\000\005\020\210q\220\003\2207\320\032?\270r\300\024\300Q\330\004\017\210q\220\003\2207\320\032?\270r\300\024\300T\310\026\310q\320PQ\330\004\017\210q\220\003\2207\320\032?\270r\300\024\300Q\330\004\017\210q\220\003\2207\320\032?\270r\300\024\300T\310\026\310q\320PQ\340\004\030\230\003\2301\230M\250\021\250\"\250D\260\003\2601\330\004\030\230\003\2301\230M\250\021\250\"\250D\260\003\2601\330\004\017\320\017!\240\022\2403\240b\320(:\270\"\320\270f\300A\200\001\330\016\017\330\026\027\330\016\017\330\023\024\330\005\006\330\004\020\220\010\230\001\330\004\022\220(\230!\340\004\014\210I\220Q\330\010\021\220\025\220k\240\027\250\005\250Y\3206M\310U\320RS\340\004\007\200w\210c\220\031\230!\2303\230c\240\031\250$\250a\340\004\010\210\004\210F\220*\230I\240Q\240m\2606\270\021\330\010\020\220\004\220A\220S\230\010\240\001\240\022\2409\250A\330\010\025\220U\230%\230q\320 0\260\001\260\021\330\010\r\320\r\035\230Q\230j\250\001\250\021\340\010\021\220\033\230A\230W\240A\330\010\020\220\007\220q\230\001\230\023\230A\230V\2401\340\010\r\210T\220\021\220!\330\010\n\210%\210q\220\001\330\010\n\210'\220\021\220'\230\026\230q\330\010\n\210'\220\021\220&""\320\030.\250e\2607\270&\300\001\340\004\007\320\007\027\220q\230\007\230s\240'\250\021\330\004\007\200x\210q\330\t\025\220R\220r\230\021\230*\240A\240U\250!\330\010\024\220A\330\010\023\2201\340\004\007\200v\210Q\340\004\t\210\031\220!\2201\220A\330\004\006\200g\210Q\330\t\025\220R\220r\230\021\230!\330\010\r\210Q\330\010\016\210a\330\010\017\210q\330\010\020\220\003\2201\330\010\014\210A\230!\240\001\200\001\330\013\014\330\013\014\330\004\017\210q\330\005\006\330\004\010\210\004\210D\220\001\330\004\010\210\004\210D\220\001\330\004\017\210q\220\001\330\004\017\210q\220\001\340\004\022\220$\220a\220w\230b\240\007\240u\250A\250R\250v\260Q\260d\270\"\270B\270f\300A\300Q\330\004\020\220\004\220A\220W\230B\230g\240U\250!\2502\250V\2601\260D\270\002\270\"\270F\300!\3001\340\004\013\2104\210q\220\014\230B\230j\250\004\250J\260b\270\001"; + #else /* compression: none (4961 bytes) */ +const char* const bytes = "<.1f.3fContour detection not valid: contours are not properly sorted from left to right.Contour detection not valid: no contours recognizedImage could not be read from: >No contours were found in the provided image. Can not continue analysis.Note that Cython is deliberately stricter than PEP-484 and rejects subclasses of builtin types. If you need to pass subclasses then set the 'annotation_typing' directive to False.Number of counted electrodes does not match the expected value: count = The provided path seems not to exist.,;?add_note.csvdisableenable, expected = gc.*huggingface_hub.*cache-system uses symlinks.*isenablednpt.NDArray[np.floating]npt.NDArray[np.uint8].pngsrc/dopt_sensor_anomalies/detection.pyt.Boxt.CsvDatat.DetectionModelst.InferenceResultt.SensorImagestuple[float, float]tuple[t.CsvData, t.SensorImages]ANOMALY_THRESHOLDAnyBACKBONEBoxCHAIN_APPROX_SIMPLECOLOR_BGR2GRAYCOLOR_BGR2RGBCannyContourCalculationErrorDETECTION_MODELSDataFrameFinalHEATMAP_FILENAME_SUFFIXImageImageNotReadErrorInferenceResultInvalidElectrodeCountLAYERSMODEL_FOLDERMORPH_CLOSEMORPH_RECTNDArrayNUM_VALID_ELECTRODESNonePILPatchcorePath__Pyx_PyDict_NextRefQUOTE_NONERATIORETR_TREERGBSensorImagesTHRESHOLD_BWTHRESH_BINARY_accepted_boxesallalphaanomalib.modelsanomaly_detectionanomaly_labelanomaly_mapanomaly_map_resizedanomaly_scorearrayastypeasyncio.coroutinesaxaxesaxisbackbonebbox_inchesbinaryblblbrXblbrYboolboundingRectboxboxPointsbox_1box_2brcc1c2castcategorycenter_distcheck_box_redundancycheckpoint__class_getitem__cline_in_tracebackcloseclosedcmapcntsconstconstantscontoursconvertcopycoreset_sampling_ratiocpucroppedcropped_sensor_leftcropped_sensor_rightcsvcudacv2cvtColordAdBdata_csvdetection_modelsdevicedfdimAdimBdistdistancedopt_basicsdopt_sensor_anomaliesdopt_sensor_anomalies._find_pathsdopt_sensor_anomalies.detectiondtypeedged__enter__enumerateerrorseuclideanevalexistingexists__exit__extendfigsizefile_pathfile_stemfiltered_cntsfilterwarningsfindContours_find_pathsfloatfloat32folder_pat""hfrom_numpyfromarray__func__genexprgetStructuringElementget_detection_modelsget_model_foldergrab_contoursgrayheaderhspaceiignoreimageimage_npimage_rgbimgimg_npimg_pathimreadimshowimutilsindexinfer_imageinput_tensorint32is_available_is_coroutineis_duplicateis_sorteditemitemsjetkernellayersleftleftmost_x_fourthlinalgloadload_state_dict__main__matplotlib.pyplotmaxmeasure_lengthmeasure_length..genexprmessagemidpointminminAreaRectmodemodelmodel_state_dict__module__morphologyEx__name__nextno_gradnormnpnptnum_contoursnumpynumpy.typingofforder_pointsorigoutputpad_inchespandasparentpathlibpermuteperspectivepil_imagepipelinepixels_per_metric_Xpixels_per_metric_Ypltpoppred_scorept_Apt_Bpyplot__qualname__quotingrboxresizeresultresult_patternreturnrightrightmost_x_thirds1s2savefigscipy.spatialsendsensor_imagessep__set_name__setdefaultshapesidesize_diffsort_contourssqueezestemstrsubplotssubplots_adjustt__test__thresholdthrowtighttltlblXtlblYtltrXtltrYtoto_csvtolerancetorchtorch_devicetrtrbrXtrbrYtypestypinguint8unsqueezeuser_img_pathvaluevalueswwarningswrap_resultwspacex1x2x_coordsx_maxx_middlex_miny_maxy_minzip\200\001\330\013\014\330\013\014\330\005\006\330\004\023\2205\230\007\230q\240\n\250%\250u\260M\300\030\310\021\330\004\t\210\023\210A\210Q\340\004\020\220\003\2209\230A\230W\240C\240q\330\004\020\220\005\220Z\230q\240\001\330\004\020\220\t\230\030\240\021\240!\330\004\017\210r\220\026\220q\230\n\240'\250\021\250\"\250J\260b\270\001\330\004\023\2205\230\013\2401\240I\250X\260Q\260c\270\023\270A\340\004\023\220<\230z\250\021\250!\330\004\023\220<\230s\240!\2401\340\004\t\210\025\210a\330\t\016\210h\220a\330\010\021\220\025\220a\220q\340\004\024\220F\230+\240U\250!\330\004\024\220D\230\001\230\025\230n\250C\250u\3204L\310A\330\004\022\220&\230\014\240H\250B\250d\260\"\260F\270!\340\004\r\210R\210v\220Q\220a\330\004\032\230#\230W\240A\240^\2606\270\026\270q\300\004\300F\310&\320PQ\320QR\340\004\013\2101\320\014\034\230A\330\010\014\210A\330\010\034\230A\330\010\026""\220a\330\010\026\220a\200\001\340\023\024\330\031\032\330\031\032\330\005\006\330\004\020\220\004\220A\220Q\330\004\007\200t\2109\220G\2301\330\010\016\320\016\037\230q\240\001\340\004 \320 5\260\\\320AR\320RS\330\004\005\330\010\035\230\\\320)>\270a\270q\360\006\000\005\017\320\016\036\230n\250A\330\010\023\320\023(\250\001\340\004\025\220Q\330\010\021\220\021\330\010\031\230\021\330\010\021\220\021\330\010\026\220a\200\001\330\n\013\330\n\013\330\005\006\330\004\014\210A\210T\220\021\220#\220R\220t\2301\230D\240\002\240&\250\004\250A\250S\260\002\260$\260a\260t\2702\270Q\200\001\330\016\017\330\031\032\330\031\032\330\005\006\330\004 \240\001\330\004\014\210C\210w\220a\220s\230!\2301\330\004\007\200v\210S\220\001\330\010\016\210f\320\024&\240a\320'H\310\001\310\021\340\004\016\210e\2201\220D\230\006\230f\240E\250\026\250q\260\003\2602\260Q\330\004\013\2107\220%\220q\340\004\013\2103\210i\220q\230\t\240\023\240A\330\004\007\200y\220\003\220:\230Q\230f\240E\250\037\270\005\270S\300\001\340\004\r\210S\320\020&\240a\240s\250.\270\003\2701\330\004\r\210S\220\r\230Q\230h\240c\250\036\260q\330\004\014\210C\210v\220Q\220h\230d\240!\340\004\013\2103\210m\2301\230E\240\025\240d\250#\250\\\270\023\270A\330\004\013\2107\220.\240\001\240\021\330\004\007\200u\210C\210q\330\010\016\210f\320\024,\250A\330\014\r\360\006\000\005\013\210$\210h\220n\240A\240Q\330\004\017\210q\220\003\220=\240\001\240\022\2401\240C\240t\2505\260\001\330\004\020\220\002\220$\220d\230!\330\004\007\200t\2101\330\010\016\210f\320\024,\250A\330\014\r\360\006\000\005#\240!\330\004\037\230q\340\004\010\210\005\210Q\330\010\017\210t\2201\220A\220V\2303\230l\250!\2501\330\010\016\210c\220\032\2301\230A\330\010\016\210b\220\006\220a\220u\230F\240\"\240A\330\010\016\210d\220!\2203\220h\230a\230r\240\033\250K\260}\300A\300Q\340\t\r\210T\220\024\220V\2301\330\t\020\220\t\230\030\240\021\240$\240a\330\t\020\220\t\230\030\240\021\240$\240a\330\t\020\220\t\230\030\240\021\240$\240a\330\t\020\220\t\230\030\240\021""\240$\240a\340\010\r\210T\220\032\2302\230W\240I\250W\260A\330\010\r\210T\220\032\2302\230W\240I\250W\260A\340\010\013\2103\210b\220\004\220C\220s\230\"\230A\330\014\r\340\010\032\230!\330 !\340\010\013\2101\330\014\r\340\010\026\220g\230Q\230a\330\010\025\220W\230A\230Q\340\010\017\210s\220\"\220A\330\010\017\210s\220\"\220A\340\010\020\220\007\220q\330\014\r\330\022\023\2204\220v\230X\240Q\240e\2501\330\022\023\2204\220v\230X\240Q\240e\2501\330\022\023\2205\230\002\230$\230f\240H\250A\250U\260!\360\010\000\005\010\200t\2101\330\010\016\210f\320\024,\250A\330\014\r\360\006\000\005\024\2203\220a\220q\330\004\007\200}\220C\220u\230A\330\010\016\210f\320\024*\250!\330\014\r\330\014&\240a\320'A\300\021\300%\300q\360\006\000\005\020\210q\220\003\2207\320\032?\270r\300\024\300Q\330\004\017\210q\220\003\2207\320\032?\270r\300\024\300T\310\026\310q\320PQ\330\004\017\210q\220\003\2207\320\032?\270r\300\024\300Q\330\004\017\210q\220\003\2207\320\032?\270r\300\024\300T\310\026\310q\320PQ\340\004\030\230\003\2301\230M\250\021\250\"\250D\260\003\2601\330\004\030\230\003\2301\230M\250\021\250\"\250D\260\003\2601\330\004\017\320\017!\240\022\2403\240b\320(:\270\"\320\270f\300A\200\001\330\016\017\330\026\027\330\016\017\330\023\024\330\005\006\330\004\020\220\010\230\001\330\004\022\220(\230!\340\004\014\210I\220Q\330\010\021\220\025\220k\240\027\250\005\250Y\3206M\310U\320RS\340\004\007\200w\210c\220\031\230!\2303\230c\240\031\250$\250a\340\004\010\210\004\210F\220*\230I\240Q\240m\2606\270\021\330\010\020\220\004\220A\220S\230\010\240\001\240\022\2409\250A\330\010\025\220U\230%\230q\320 0\260\001\260\021\330\010\r\320\r\035\230Q\230j\250\001\250\021\340\010\021\220\033\230A\230W\240A\330\010\020\220\007\220q\230\001\230\023\230A\230V\2401\340\010\r\210T\220\021\220!\330\010\n\210%\210q\220\001\330\010\n\210'\220\021\220'\230\026\230q\330""\010\n\210'\220\021\220&\320\030.\250e\2607\270&\300\001\340\004\007\320\007\027\220q\230\007\230s\240'\250\021\330\004\007\200x\210q\330\t\025\220R\220r\230\021\230*\240A\240U\250!\330\010\024\220A\330\010\023\2201\340\004\007\200v\210Q\340\004\t\210\031\220!\2201\220A\330\004\006\200g\210Q\330\t\025\220R\220r\230\021\230!\330\010\r\210Q\330\010\016\210a\330\010\017\210q\330\010\020\220\003\2201\330\010\014\210A\230!\240\001\200\001\330\013\014\330\013\014\330\004\017\210q\330\005\006\330\004\010\210\004\210D\220\001\330\004\010\210\004\210D\220\001\330\004\017\210q\220\001\330\004\017\210q\220\001\340\004\022\220$\220a\220w\230b\240\007\240u\250A\250R\250v\260Q\260d\270\"\270B\270f\300A\300Q\330\004\020\220\004\220A\220W\230B\230g\240U\250!\2502\250V\2601\260D\270\002\270\"\270F\300!\3001\340\004\013\2104\210q\220\014\230B\230j\250\004\250J\260b\270\001"; PyObject *data = NULL; CYTHON_UNUSED_VAR(__Pyx_DecompressString); #endif PyObject **stringtab = __pyx_mstate->__pyx_string_tab; Py_ssize_t pos = 0; - for (int i = 0; i < 307; i++) { + for (int i = 0; i < 308; i++) { Py_ssize_t bytes_length = index[i].length; PyObject *string = PyUnicode_DecodeUTF8(bytes + pos, bytes_length, NULL); if (likely(string) && i >= 33) PyUnicode_InternInPlace(&string); @@ -12774,7 +12780,7 @@ const char* const bytes = "<.1f.3fContour detection not valid: contours are not stringtab[i] = string; pos += bytes_length; } - for (int i = 307; i < 315; i++) { + for (int i = 308; i < 316; i++) { Py_ssize_t bytes_length = index[i].length; PyObject *string = PyBytes_FromStringAndSize(bytes + pos, bytes_length); stringtab[i] = string; @@ -12785,14 +12791,14 @@ const char* const bytes = "<.1f.3fContour detection not valid: contours are not } } Py_XDECREF(data); - for (Py_ssize_t i = 0; i < 315; i++) { + for (Py_ssize_t i = 0; i < 316; i++) { if (unlikely(PyObject_Hash(stringtab[i]) == -1)) { __PYX_ERR(0, 1, __pyx_L1_error) } } #if CYTHON_IMMORTAL_CONSTANTS { - PyObject **table = stringtab + 307; + PyObject **table = stringtab + 308; for (Py_ssize_t i=0; i<8; ++i) { #if CYTHON_COMPILING_IN_CPYTHON_FREETHREADING Py_SET_REFCNT(table[i], _Py_IMMORTAL_REFCNT_LOCAL); @@ -12805,14 +12811,14 @@ const char* const bytes = "<.1f.3fContour detection not valid: contours are not } { PyObject **numbertab = __pyx_mstate->__pyx_number_tab; - double const c_constants[] = {0.2,0.5,0.8,2.0,255.0}; - for (int i = 0; i < 5; i++) { + double const c_constants[] = {0.5,0.8,2.0,255.0}; + for (int i = 0; i < 4; i++) { numbertab[i] = PyFloat_FromDouble(c_constants[i]); if (unlikely(!numbertab[i])) __PYX_ERR(0, 1, __pyx_L1_error) } } { - PyObject **numbertab = __pyx_mstate->__pyx_number_tab + 5; + PyObject **numbertab = __pyx_mstate->__pyx_number_tab + 4; int8_t const cint_constants_1[] = {0,1,2,5,6,12,20,50,100}; int16_t const cint_constants_2[] = {255,500,1500}; for (int i = 0; i < 12; i++) { @@ -12823,7 +12829,7 @@ const char* const bytes = "<.1f.3fContour detection not valid: contours are not #if CYTHON_IMMORTAL_CONSTANTS { PyObject **table = __pyx_mstate->__pyx_number_tab; - for (Py_ssize_t i=0; i<17; ++i) { + for (Py_ssize_t i=0; i<16; ++i) { #if CYTHON_COMPILING_IN_CPYTHON_FREETHREADING Py_SET_REFCNT(table[i], _Py_IMMORTAL_REFCNT_LOCAL); #else diff --git a/src/dopt_sensor_anomalies/detection.py b/src/dopt_sensor_anomalies/detection.py index 5bd5612..6f7a8b2 100644 --- a/src/dopt_sensor_anomalies/detection.py +++ b/src/dopt_sensor_anomalies/detection.py @@ -176,7 +176,7 @@ def infer_image( output = model(input_tensor) anomaly_score = output.pred_score.item() - anomaly_label = bool(1 if anomaly_score >= 0.2 else 0) + anomaly_label = bool(1 if anomaly_score >= const.ANOMALY_THRESHOLD else 0) anomaly_map = output.anomaly_map.squeeze().cpu().numpy() img_np = np.array(pil_image) diff --git a/tests/_models/model_left_hand_side.pth b/tests/_models/model_left_hand_side.pth deleted file mode 100644 index e19f6efa74aa615a2f72bfcd971088bae15cddcb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15417039 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