From ed990c098f575d9b333bb8b3fb0dd7326724d472 Mon Sep 17 00:00:00 2001 From: Luis Montero Date: Thu, 8 Feb 2024 13:38:50 +0100 Subject: [PATCH] chore: update Concrete Python to 2.5.1 - update Concrete Python to 2.5.1 - update FastAPI following vulnerability alerts - update mypy and solve some type hint issues --- Makefile | 2 +- deps_licenses/licenses_linux_user.txt | 10 +- deps_licenses/licenses_mac_intel_user.txt | 10 +- deps_licenses/licenses_mac_silicon_user.txt | 15 +- .../licenses_mac_silicon_user.txt.md5 | 2 +- poetry.lock | 304 +++++++++++------- pyproject.toml | 8 +- .../ml/quantization/base_quantized_op.py | 12 +- src/concrete/ml/quantization/post_training.py | 29 +- src/concrete/ml/quantization/quantizers.py | 20 +- src/concrete/ml/sklearn/qnn.py | 6 +- 11 files changed, 259 insertions(+), 159 deletions(-) diff --git a/Makefile b/Makefile index 7b1d1f9b73..1de00d50c9 100644 --- a/Makefile +++ b/Makefile @@ -19,7 +19,7 @@ OPEN_PR="true" # Force the installation of a Concrete Python version, which is very useful with nightly versions # /!\ WARNING /!\: This version should NEVER be a wildcard as it might create some # issues when trying to run it in the future. -CONCRETE_PYTHON_VERSION="concrete-python==2.5.0" +CONCRETE_PYTHON_VERSION="concrete-python==2.5.1" # Force the installation of Concrete Python's latest version, release-candidates included # CONCRETE_PYTHON_VERSION="$$(poetry run python \ diff --git a/deps_licenses/licenses_linux_user.txt b/deps_licenses/licenses_linux_user.txt index 06973639d9..3382fd123e 100644 --- a/deps_licenses/licenses_linux_user.txt +++ b/deps_licenses/licenses_linux_user.txt @@ -1,6 +1,7 @@ Name, Version, License GitPython, 3.1.41, BSD License PyYAML, 6.0.1, MIT License +annotated-types, 0.6.0, MIT License anyio, 4.2.0, MIT License boto3, 1.34.37, Apache Software License botocore, 1.34.37, Apache Software License @@ -9,11 +10,11 @@ certifi, 2023.7.22, Mozilla Public License 2.0 (MPL 2.0) charset-normalizer, 3.3.2, MIT License click, 8.1.7, BSD License coloredlogs, 15.0.1, MIT License -concrete-python, 2.5, BSD-3-Clause +concrete-python, 2.5.1, BSD-3-Clause dependencies, 2.0.1, BSD License dill, 0.3.8, BSD License exceptiongroup, 1.2.0, MIT License -fastapi, 0.102.0, MIT License +fastapi, 0.109.2, MIT License filelock, 3.13.1, The Unlicense (Unlicense) flatbuffers, 23.5.26, Apache Software License fsspec, 2024.2.0, BSD License @@ -43,7 +44,8 @@ packaging, 23.2, Apache Software License; BSD License pluggy, 1.4.0, MIT License protobuf, 3.20.3, BSD-3-Clause psutil, 5.9.8, BSD License -pydantic, 1.10.14, MIT License +pydantic, 2.6.1, MIT License +pydantic_core, 2.16.2, MIT License pytest, 7.4.1, MIT License pytest-json-report, 1.5.0, MIT pytest-metadata, 3.1.0, Mozilla Public License 2.0 (MPL 2.0) @@ -60,7 +62,7 @@ skops, 0.5.0, MIT skorch, 0.11.0, new BSD 3-Clause smmap, 5.0.1, BSD License sniffio, 1.3.0, Apache Software License; MIT License -starlette, 0.27.0, BSD License +starlette, 0.36.3, BSD License sympy, 1.12, BSD License tabulate, 0.8.10, MIT License threadpoolctl, 3.2.0, BSD License diff --git a/deps_licenses/licenses_mac_intel_user.txt b/deps_licenses/licenses_mac_intel_user.txt index a4f62a220c..deb4314a80 100644 --- a/deps_licenses/licenses_mac_intel_user.txt +++ b/deps_licenses/licenses_mac_intel_user.txt @@ -1,6 +1,7 @@ Name, Version, License GitPython, 3.1.41, BSD License PyYAML, 6.0.1, MIT License +annotated-types, 0.6.0, MIT License anyio, 4.2.0, MIT License boto3, 1.34.37, Apache Software License botocore, 1.34.37, Apache Software License @@ -9,11 +10,11 @@ certifi, 2023.7.22, Mozilla Public License 2.0 (MPL 2.0) charset-normalizer, 3.3.2, MIT License click, 8.1.7, BSD License coloredlogs, 15.0.1, MIT License -concrete-python, 2.5, BSD-3-Clause +concrete-python, 2.5.1, BSD-3-Clause dependencies, 2.0.1, BSD License dill, 0.3.8, BSD License exceptiongroup, 1.2.0, MIT License -fastapi, 0.102.0, MIT License +fastapi, 0.109.2, MIT License filelock, 3.13.1, The Unlicense (Unlicense) flatbuffers, 23.5.26, Apache Software License fsspec, 2024.2.0, BSD License @@ -39,7 +40,8 @@ packaging, 23.2, Apache Software License; BSD License pluggy, 1.4.0, MIT License protobuf, 3.20.3, BSD-3-Clause psutil, 5.9.8, BSD License -pydantic, 1.10.14, MIT License +pydantic, 2.6.1, MIT License +pydantic_core, 2.16.2, MIT License pytest, 7.4.1, MIT License pytest-json-report, 1.5.0, MIT pytest-metadata, 3.1.0, Mozilla Public License 2.0 (MPL 2.0) @@ -56,7 +58,7 @@ skops, 0.5.0, MIT skorch, 0.11.0, new BSD 3-Clause smmap, 5.0.1, BSD License sniffio, 1.3.0, Apache Software License; MIT License -starlette, 0.27.0, BSD License +starlette, 0.36.3, BSD License sympy, 1.12, BSD License tabulate, 0.8.10, MIT License threadpoolctl, 3.2.0, BSD License diff --git a/deps_licenses/licenses_mac_silicon_user.txt b/deps_licenses/licenses_mac_silicon_user.txt index 3cc266d606..aee8c479b5 100644 --- a/deps_licenses/licenses_mac_silicon_user.txt +++ b/deps_licenses/licenses_mac_silicon_user.txt @@ -1,6 +1,7 @@ Name, Version, License GitPython, 3.1.41, BSD License PyYAML, 6.0.1, MIT License +annotated-types, 0.6.0, MIT License anyio, 4.2.0, MIT License boto3, 1.34.37, Apache Software License botocore, 1.34.37, Apache Software License @@ -9,11 +10,11 @@ certifi, 2023.7.22, Mozilla Public License 2.0 (MPL 2.0) charset-normalizer, 3.3.2, MIT License click, 8.1.7, BSD License coloredlogs, 15.0.1, MIT License -concrete-python, 2.5, BSD-3-Clause +concrete-python, 2.5.1, BSD-3-Clause dependencies, 2.0.1, BSD License dill, 0.3.8, BSD License exceptiongroup, 1.2.0, MIT License -fastapi, 0.102.0, MIT License +fastapi, 0.109.2, MIT License filelock, 3.13.1, The Unlicense (Unlicense) flatbuffers, 23.5.26, Apache Software License fsspec, 2024.2.0, BSD License @@ -39,7 +40,8 @@ packaging, 23.2, Apache Software License; BSD License pluggy, 1.4.0, MIT License protobuf, 3.20.3, BSD-3-Clause psutil, 5.9.8, BSD License -pydantic, 1.10.14, MIT License +pydantic, 2.6.1, MIT License +pydantic_core, 2.16.2, MIT License pytest, 7.4.1, MIT License pytest-json-report, 1.5.0, MIT pytest-metadata, 3.1.0, Mozilla Public License 2.0 (MPL 2.0) @@ -56,7 +58,7 @@ skops, 0.5.0, MIT skorch, 0.11.0, new BSD 3-Clause smmap, 5.0.1, BSD License sniffio, 1.3.0, Apache Software License; MIT License -starlette, 0.27.0, BSD License +starlette, 0.36.3, BSD License sympy, 1.12, BSD License tabulate, 0.8.10, MIT License threadpoolctl, 3.2.0, BSD License @@ -65,8 +67,9 @@ tomli, 2.0.1, MIT License torch, 1.13.1, BSD License tqdm, 4.66.1, MIT License; Mozilla Public License 2.0 (MPL 2.0) transformers, 4.37.2, Apache Software License -typing_extensions, 4.5.0, Python Software Foundation License -urllib3, 2.0.7, MIT License +typing_extensions, 4.8.0, Python Software Foundation License +urllib3, 1.26.18, MIT License uvicorn, 0.21.1, BSD License xgboost, 1.6.2, Apache Software License z3-solver, 4.12.5.0, MIT License +zipp, 3.17.0, MIT License diff --git a/deps_licenses/licenses_mac_silicon_user.txt.md5 b/deps_licenses/licenses_mac_silicon_user.txt.md5 index 9bbd5eac4c..b034f733a8 100644 --- a/deps_licenses/licenses_mac_silicon_user.txt.md5 +++ b/deps_licenses/licenses_mac_silicon_user.txt.md5 @@ -1 +1 @@ -f709427468f5be4ee6836603495fea72 +9c3d935d7550eb54ba02c322722e34d9 diff --git a/poetry.lock b/poetry.lock index 6dbf6d9467..092c50325a 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.6.1 and should not be changed by hand. [[package]] name = "absl-py" @@ -132,6 +132,20 @@ files = [ {file = "alabaster-0.7.13.tar.gz", hash = "sha256:a27a4a084d5e690e16e01e03ad2b2e552c61a65469419b907243193de1a84ae2"}, ] +[[package]] +name = "annotated-types" +version = "0.6.0" +description = "Reusable constraint types to use with typing.Annotated" +optional = false +python-versions = ">=3.8" +files = [ + {file = "annotated_types-0.6.0-py3-none-any.whl", hash = "sha256:0641064de18ba7a25dee8f96403ebc39113d0cb953a01429249d5c7564666a43"}, + {file = "annotated_types-0.6.0.tar.gz", hash = "sha256:563339e807e53ffd9c267e99fc6d9ea23eb8443c08f112651963e24e22f84a5d"}, +] + +[package.dependencies] +typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.9\""} + [[package]] name = "anyio" version = "4.2.0" @@ -815,23 +829,23 @@ test = ["pytest"] [[package]] name = "concrete-python" -version = "2.5" +version = "2.5.1" description = "A state-of-the-art homomorphic encryption framework" optional = false python-versions = ">=3.8" files = [ - {file = "concrete_python-2.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b9cb6f281ae0d7c5e3fe8f43584a61fbd3f8ddb640656a4ea091af012814a02e"}, - {file = "concrete_python-2.5-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:f38b6873eea1f8e72ec5d5ccdcbf4f611f576213ea6ba474ecda2c7ce818ae40"}, - {file = "concrete_python-2.5-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:fa26ec5f11c03d7fad6f7b82b0509a4db488dc921c9eb649fc1be403e27e358f"}, - {file = "concrete_python-2.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:78ae8c3b4362a05515857b3c81395abcd0e199997a9993d06098875771ac7c57"}, - {file = "concrete_python-2.5-cp311-cp311-macosx_11_0_x86_64.whl", hash = "sha256:a7979f317394f0cdbdf93be613ac433e5de3fddca3c7b17d0f3989c153fac2c7"}, - {file = "concrete_python-2.5-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:21073c95ef3eaff7e95fe646f27b75b133ff81ed2e57d7bb33b08c19dee5211e"}, - {file = "concrete_python-2.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:43145e7397a4f1ec34fae4535a76b2022609728dcf50bed340757ad6c9e9d7d9"}, - {file = "concrete_python-2.5-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:2d631616c3102decd5ca071e4f2cf2d26308948fc461d14803ba73e4d01998ab"}, - {file = "concrete_python-2.5-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:f9c99ca634dd86efbef8f8baec66c3a63a3e80f759b1befebb19ba7be93bd68b"}, - {file = "concrete_python-2.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8ccad39025a35ebc234f2c086bd18033eca478d97e8e429b6855b65495aa0e11"}, - {file = "concrete_python-2.5-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:4e2323982fed6168d09b9648e6feebdadbc236051afc398b2b59f9cb177b757e"}, - {file = "concrete_python-2.5-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:9c168f18b3c6a1938bdb6306b7be2ffd6d2076e45cfd4935b7a842f0b72d1091"}, + {file = "concrete_python-2.5.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7251d8ee55c9773dc9bcb771b286200068cbc70a352969489ba5a8d40ccb99c0"}, + {file = "concrete_python-2.5.1-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:235bf2b65fa9a5510e46b47155fda75a52e2dce018b9b553b1ee0b4496d12335"}, + {file = "concrete_python-2.5.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:6cef83fceea20aa6806d24e96784394f759c7cbd734f194ef8efb2fff5619198"}, + {file = "concrete_python-2.5.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bf13c62a46c5a5a249d749a34f5671d080a767a7996bf4c0878aeaaddbd672ab"}, + {file = "concrete_python-2.5.1-cp311-cp311-macosx_11_0_x86_64.whl", hash = "sha256:a9953917ac3eecbb2424f2efd8dfb9cbff02b98a7e8c140684f87112ad1a125d"}, + {file = "concrete_python-2.5.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:34f8774fd68bfc9e281c51f4766ea4739ff869ceab589fac7976a1b6825a2959"}, + {file = "concrete_python-2.5.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ad0126a84b15500d0aeea480057df45ab3aa8628228ef726a3a2f254f7a6ecd6"}, + {file = "concrete_python-2.5.1-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:0ebdf576daedc5b3d487ea9217c31ffca4f6bb0dd633d00c50f095373ce004c4"}, + {file = "concrete_python-2.5.1-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:67a89c6030374d356e0164fba5f8779ac1acf2e7994d2fd0129c7218b3f6890f"}, + {file = "concrete_python-2.5.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2482e4eb518038a7f4f5c4fa647fe0ffce0acb49c3b3b657a3e49206b2856c86"}, + {file = "concrete_python-2.5.1-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:5b465e7181eab814b0a9bd1d1215e2bdde89e1ba7c7bf068081664003c64fcca"}, + {file = "concrete_python-2.5.1-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:0ec8dbcdf7ce225aa3e2b72c82aa79e340dc6595b1c0e392b93fe9eb9dd72f4c"}, ] [package.dependencies] @@ -843,7 +857,8 @@ torch = ">=1.13" z3-solver = ">=4.12" [package.extras] -dev = ["auditwheel (==5.3.0)", "black (==23.1.0)", "delocate (==0.10.4)", "isort (==5.12.0)", "mypy (==1.1.1)", "pybind11 (==2.10.4)", "pydocstyle (==6.3.0)", "pylint (==2.17.1)", "pytest (==7.2.2)", "pytest-cov (==4.0.0)", "pytest-randomly (==3.15.0)", "pytest-xdist (==3.2.1)", "ruff (==0.0.259)", "wheel (==0.40.0)"] +dev = ["auditwheel (==5.3.0)", "black (==23.1.0)", "delocate (==0.10.4)", "isort (==5.12.0)", "matplotlib (>=3.7)", "mypy (==1.1.1)", "pillow (>=10.2)", "pybind11 (==2.10.4)", "pydocstyle (==6.3.0)", "pygraphviz (>=1.11)", "pylint (==2.17.1)", "pytest (==7.2.2)", "pytest-cov (==4.0.0)", "pytest-randomly (==3.15.0)", "pytest-xdist (==3.2.1)", "ruff (==0.0.259)", "wheel (==0.40.0)"] +full = ["matplotlib (>=3.7)", "pillow (>=10.2)", "pygraphviz (>=1.11)"] [[package]] name = "contourpy" @@ -1246,22 +1261,22 @@ tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipyth [[package]] name = "fastapi" -version = "0.102.0" +version = "0.109.2" description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "fastapi-0.102.0-py3-none-any.whl", hash = "sha256:34db27d0af54ee0d92c540e83c6ee6a11de93f63bbdf73fda54fff9a10c52569"}, - {file = "fastapi-0.102.0.tar.gz", hash = "sha256:e3652cb9bdf4df1dedda4fce9454e9f75a8c969b5cdd3faf1bd5c6f5d2daab08"}, + {file = "fastapi-0.109.2-py3-none-any.whl", hash = "sha256:2c9bab24667293b501cad8dd388c05240c850b58ec5876ee3283c47d6e1e3a4d"}, + {file = "fastapi-0.109.2.tar.gz", hash = "sha256:f3817eac96fe4f65a2ebb4baa000f394e55f5fccdaf7f75250804bc58f354f73"}, ] [package.dependencies] pydantic = ">=1.7.4,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0 || >2.0.0,<2.0.1 || >2.0.1,<2.1.0 || >2.1.0,<3.0.0" -starlette = ">=0.27.0,<0.28.0" -typing-extensions = ">=4.5.0" +starlette = ">=0.36.3,<0.37.0" +typing-extensions = ">=4.8.0" [package.extras] -all = ["email-validator (>=2.0.0)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=2.11.2)", "orjson (>=3.2.1)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.5)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"] +all = ["email-validator (>=2.0.0)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=2.11.2)", "orjson (>=3.2.1)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.7)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"] [[package]] name = "fastjsonschema" @@ -3379,52 +3394,49 @@ files = [ [[package]] name = "mypy" -version = "0.991" +version = "1.8.0" description = "Optional static typing for Python" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "mypy-0.991-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7d17e0a9707d0772f4a7b878f04b4fd11f6f5bcb9b3813975a9b13c9332153ab"}, - {file = "mypy-0.991-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0714258640194d75677e86c786e80ccf294972cc76885d3ebbb560f11db0003d"}, - {file = "mypy-0.991-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0c8f3be99e8a8bd403caa8c03be619544bc2c77a7093685dcf308c6b109426c6"}, - {file = "mypy-0.991-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc9ec663ed6c8f15f4ae9d3c04c989b744436c16d26580eaa760ae9dd5d662eb"}, - {file = "mypy-0.991-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4307270436fd7694b41f913eb09210faff27ea4979ecbcd849e57d2da2f65305"}, - {file = "mypy-0.991-cp310-cp310-win_amd64.whl", hash = "sha256:901c2c269c616e6cb0998b33d4adbb4a6af0ac4ce5cd078afd7bc95830e62c1c"}, - {file = "mypy-0.991-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d13674f3fb73805ba0c45eb6c0c3053d218aa1f7abead6e446d474529aafc372"}, - {file = "mypy-0.991-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1c8cd4fb70e8584ca1ed5805cbc7c017a3d1a29fb450621089ffed3e99d1857f"}, - {file = "mypy-0.991-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:209ee89fbb0deed518605edddd234af80506aec932ad28d73c08f1400ef80a33"}, - {file = "mypy-0.991-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37bd02ebf9d10e05b00d71302d2c2e6ca333e6c2a8584a98c00e038db8121f05"}, - {file = "mypy-0.991-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:26efb2fcc6b67e4d5a55561f39176821d2adf88f2745ddc72751b7890f3194ad"}, - {file = "mypy-0.991-cp311-cp311-win_amd64.whl", hash = "sha256:3a700330b567114b673cf8ee7388e949f843b356a73b5ab22dd7cff4742a5297"}, - {file = "mypy-0.991-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:1f7d1a520373e2272b10796c3ff721ea1a0712288cafaa95931e66aa15798813"}, - {file = "mypy-0.991-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:641411733b127c3e0dab94c45af15fea99e4468f99ac88b39efb1ad677da5711"}, - {file = "mypy-0.991-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:3d80e36b7d7a9259b740be6d8d906221789b0d836201af4234093cae89ced0cd"}, - {file = "mypy-0.991-cp37-cp37m-win_amd64.whl", hash = "sha256:e62ebaad93be3ad1a828a11e90f0e76f15449371ffeecca4a0a0b9adc99abcef"}, - {file = "mypy-0.991-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:b86ce2c1866a748c0f6faca5232059f881cda6dda2a893b9a8373353cfe3715a"}, - {file = "mypy-0.991-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ac6e503823143464538efda0e8e356d871557ef60ccd38f8824a4257acc18d93"}, - {file = "mypy-0.991-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0cca5adf694af539aeaa6ac633a7afe9bbd760df9d31be55ab780b77ab5ae8bf"}, - {file = "mypy-0.991-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a12c56bf73cdab116df96e4ff39610b92a348cc99a1307e1da3c3768bbb5b135"}, - {file = "mypy-0.991-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:652b651d42f155033a1967739788c436491b577b6a44e4c39fb340d0ee7f0d70"}, - {file = "mypy-0.991-cp38-cp38-win_amd64.whl", hash = "sha256:4175593dc25d9da12f7de8de873a33f9b2b8bdb4e827a7cae952e5b1a342e243"}, - {file = "mypy-0.991-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:98e781cd35c0acf33eb0295e8b9c55cdbef64fcb35f6d3aa2186f289bed6e80d"}, - {file = "mypy-0.991-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6d7464bac72a85cb3491c7e92b5b62f3dcccb8af26826257760a552a5e244aa5"}, - {file = "mypy-0.991-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c9166b3f81a10cdf9b49f2d594b21b31adadb3d5e9db9b834866c3258b695be3"}, - {file = "mypy-0.991-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8472f736a5bfb159a5e36740847808f6f5b659960115ff29c7cecec1741c648"}, - {file = "mypy-0.991-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5e80e758243b97b618cdf22004beb09e8a2de1af481382e4d84bc52152d1c476"}, - {file = "mypy-0.991-cp39-cp39-win_amd64.whl", hash = "sha256:74e259b5c19f70d35fcc1ad3d56499065c601dfe94ff67ae48b85596b9ec1461"}, - {file = "mypy-0.991-py3-none-any.whl", hash = "sha256:de32edc9b0a7e67c2775e574cb061a537660e51210fbf6006b0b36ea695ae9bb"}, - {file = "mypy-0.991.tar.gz", hash = "sha256:3c0165ba8f354a6d9881809ef29f1a9318a236a6d81c690094c5df32107bde06"}, -] - -[package.dependencies] -mypy-extensions = ">=0.4.3" + {file = "mypy-1.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:485a8942f671120f76afffff70f259e1cd0f0cfe08f81c05d8816d958d4577d3"}, + {file = "mypy-1.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:df9824ac11deaf007443e7ed2a4a26bebff98d2bc43c6da21b2b64185da011c4"}, + {file = "mypy-1.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2afecd6354bbfb6e0160f4e4ad9ba6e4e003b767dd80d85516e71f2e955ab50d"}, + {file = "mypy-1.8.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8963b83d53ee733a6e4196954502b33567ad07dfd74851f32be18eb932fb1cb9"}, + {file = "mypy-1.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:e46f44b54ebddbeedbd3d5b289a893219065ef805d95094d16a0af6630f5d410"}, + {file = "mypy-1.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:855fe27b80375e5c5878492f0729540db47b186509c98dae341254c8f45f42ae"}, + {file = "mypy-1.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4c886c6cce2d070bd7df4ec4a05a13ee20c0aa60cb587e8d1265b6c03cf91da3"}, + {file = "mypy-1.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d19c413b3c07cbecf1f991e2221746b0d2a9410b59cb3f4fb9557f0365a1a817"}, + {file = "mypy-1.8.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9261ed810972061388918c83c3f5cd46079d875026ba97380f3e3978a72f503d"}, + {file = "mypy-1.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:51720c776d148bad2372ca21ca29256ed483aa9a4cdefefcef49006dff2a6835"}, + {file = "mypy-1.8.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:52825b01f5c4c1c4eb0db253ec09c7aa17e1a7304d247c48b6f3599ef40db8bd"}, + {file = "mypy-1.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f5ac9a4eeb1ec0f1ccdc6f326bcdb464de5f80eb07fb38b5ddd7b0de6bc61e55"}, + {file = "mypy-1.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afe3fe972c645b4632c563d3f3eff1cdca2fa058f730df2b93a35e3b0c538218"}, + {file = "mypy-1.8.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:42c6680d256ab35637ef88891c6bd02514ccb7e1122133ac96055ff458f93fc3"}, + {file = "mypy-1.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:720a5ca70e136b675af3af63db533c1c8c9181314d207568bbe79051f122669e"}, + {file = "mypy-1.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:028cf9f2cae89e202d7b6593cd98db6759379f17a319b5faf4f9978d7084cdc6"}, + {file = "mypy-1.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4e6d97288757e1ddba10dd9549ac27982e3e74a49d8d0179fc14d4365c7add66"}, + {file = "mypy-1.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f1478736fcebb90f97e40aff11a5f253af890c845ee0c850fe80aa060a267c6"}, + {file = "mypy-1.8.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42419861b43e6962a649068a61f4a4839205a3ef525b858377a960b9e2de6e0d"}, + {file = "mypy-1.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:2b5b6c721bd4aabaadead3a5e6fa85c11c6c795e0c81a7215776ef8afc66de02"}, + {file = "mypy-1.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5c1538c38584029352878a0466f03a8ee7547d7bd9f641f57a0f3017a7c905b8"}, + {file = "mypy-1.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4ef4be7baf08a203170f29e89d79064463b7fc7a0908b9d0d5114e8009c3a259"}, + {file = "mypy-1.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7178def594014aa6c35a8ff411cf37d682f428b3b5617ca79029d8ae72f5402b"}, + {file = "mypy-1.8.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ab3c84fa13c04aeeeabb2a7f67a25ef5d77ac9d6486ff33ded762ef353aa5592"}, + {file = "mypy-1.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:99b00bc72855812a60d253420d8a2eae839b0afa4938f09f4d2aa9bb4654263a"}, + {file = "mypy-1.8.0-py3-none-any.whl", hash = "sha256:538fd81bb5e430cc1381a443971c0475582ff9f434c16cd46d2c66763ce85d9d"}, + {file = "mypy-1.8.0.tar.gz", hash = "sha256:6ff8b244d7085a0b425b56d327b480c3b29cafbd2eff27316a004f9a7391ae07"}, +] + +[package.dependencies] +mypy-extensions = ">=1.0.0" tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} -typing-extensions = ">=3.10" +typing-extensions = ">=4.1.0" [package.extras] dmypy = ["psutil (>=4.0)"] install-types = ["pip"] -python2 = ["typed-ast (>=1.4.0,<2)"] +mypyc = ["setuptools (>=50)"] reports = ["lxml"] [[package]] @@ -4569,55 +4581,113 @@ files = [ [[package]] name = "pydantic" -version = "1.10.14" -description = "Data validation and settings management using python type hints" +version = "2.6.1" +description = "Data validation using Python type hints" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +files = [ + {file = "pydantic-2.6.1-py3-none-any.whl", hash = "sha256:0b6a909df3192245cb736509a92ff69e4fef76116feffec68e93a567347bae6f"}, + {file = "pydantic-2.6.1.tar.gz", hash = "sha256:4fd5c182a2488dc63e6d32737ff19937888001e2a6d86e94b3f233104a5d1fa9"}, +] + +[package.dependencies] +annotated-types = ">=0.4.0" +pydantic-core = "2.16.2" +typing-extensions = ">=4.6.1" + +[package.extras] +email = ["email-validator (>=2.0.0)"] + +[[package]] +name = "pydantic-core" +version = "2.16.2" +description = "" +optional = false +python-versions = ">=3.8" files = [ - {file = "pydantic-1.10.14-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7f4fcec873f90537c382840f330b90f4715eebc2bc9925f04cb92de593eae054"}, - {file = "pydantic-1.10.14-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e3a76f571970fcd3c43ad982daf936ae39b3e90b8a2e96c04113a369869dc87"}, - {file = "pydantic-1.10.14-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82d886bd3c3fbeaa963692ef6b643159ccb4b4cefaf7ff1617720cbead04fd1d"}, - {file = "pydantic-1.10.14-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:798a3d05ee3b71967844a1164fd5bdb8c22c6d674f26274e78b9f29d81770c4e"}, - {file = "pydantic-1.10.14-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:23d47a4b57a38e8652bcab15a658fdb13c785b9ce217cc3a729504ab4e1d6bc9"}, - {file = "pydantic-1.10.14-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f9f674b5c3bebc2eba401de64f29948ae1e646ba2735f884d1594c5f675d6f2a"}, - {file = "pydantic-1.10.14-cp310-cp310-win_amd64.whl", hash = "sha256:24a7679fab2e0eeedb5a8924fc4a694b3bcaac7d305aeeac72dd7d4e05ecbebf"}, - {file = "pydantic-1.10.14-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9d578ac4bf7fdf10ce14caba6f734c178379bd35c486c6deb6f49006e1ba78a7"}, - {file = "pydantic-1.10.14-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fa7790e94c60f809c95602a26d906eba01a0abee9cc24150e4ce2189352deb1b"}, - {file = "pydantic-1.10.14-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aad4e10efa5474ed1a611b6d7f0d130f4aafadceb73c11d9e72823e8f508e663"}, - {file = "pydantic-1.10.14-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1245f4f61f467cb3dfeced2b119afef3db386aec3d24a22a1de08c65038b255f"}, - {file = "pydantic-1.10.14-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:21efacc678a11114c765eb52ec0db62edffa89e9a562a94cbf8fa10b5db5c046"}, - {file = "pydantic-1.10.14-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:412ab4a3f6dbd2bf18aefa9f79c7cca23744846b31f1d6555c2ee2b05a2e14ca"}, - {file = "pydantic-1.10.14-cp311-cp311-win_amd64.whl", hash = "sha256:e897c9f35281f7889873a3e6d6b69aa1447ceb024e8495a5f0d02ecd17742a7f"}, - {file = "pydantic-1.10.14-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d604be0f0b44d473e54fdcb12302495fe0467c56509a2f80483476f3ba92b33c"}, - {file = "pydantic-1.10.14-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a42c7d17706911199798d4c464b352e640cab4351efe69c2267823d619a937e5"}, - {file = "pydantic-1.10.14-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:596f12a1085e38dbda5cbb874d0973303e34227b400b6414782bf205cc14940c"}, - {file = "pydantic-1.10.14-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bfb113860e9288d0886e3b9e49d9cf4a9d48b441f52ded7d96db7819028514cc"}, - {file = "pydantic-1.10.14-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:bc3ed06ab13660b565eed80887fcfbc0070f0aa0691fbb351657041d3e874efe"}, - {file = "pydantic-1.10.14-cp37-cp37m-win_amd64.whl", hash = "sha256:ad8c2bc677ae5f6dbd3cf92f2c7dc613507eafe8f71719727cbc0a7dec9a8c01"}, - {file = "pydantic-1.10.14-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c37c28449752bb1f47975d22ef2882d70513c546f8f37201e0fec3a97b816eee"}, - {file = "pydantic-1.10.14-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:49a46a0994dd551ec051986806122767cf144b9702e31d47f6d493c336462597"}, - {file = "pydantic-1.10.14-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:53e3819bd20a42470d6dd0fe7fc1c121c92247bca104ce608e609b59bc7a77ee"}, - {file = "pydantic-1.10.14-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0fbb503bbbbab0c588ed3cd21975a1d0d4163b87e360fec17a792f7d8c4ff29f"}, - {file = "pydantic-1.10.14-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:336709883c15c050b9c55a63d6c7ff09be883dbc17805d2b063395dd9d9d0022"}, - {file = "pydantic-1.10.14-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4ae57b4d8e3312d486e2498d42aed3ece7b51848336964e43abbf9671584e67f"}, - {file = "pydantic-1.10.14-cp38-cp38-win_amd64.whl", hash = "sha256:dba49d52500c35cfec0b28aa8b3ea5c37c9df183ffc7210b10ff2a415c125c4a"}, - {file = "pydantic-1.10.14-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c66609e138c31cba607d8e2a7b6a5dc38979a06c900815495b2d90ce6ded35b4"}, - {file = "pydantic-1.10.14-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d986e115e0b39604b9eee3507987368ff8148222da213cd38c359f6f57b3b347"}, - {file = "pydantic-1.10.14-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:646b2b12df4295b4c3148850c85bff29ef6d0d9621a8d091e98094871a62e5c7"}, - {file = "pydantic-1.10.14-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282613a5969c47c83a8710cc8bfd1e70c9223feb76566f74683af889faadc0ea"}, - {file = "pydantic-1.10.14-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:466669501d08ad8eb3c4fecd991c5e793c4e0bbd62299d05111d4f827cded64f"}, - {file = "pydantic-1.10.14-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:13e86a19dca96373dcf3190fcb8797d40a6f12f154a244a8d1e8e03b8f280593"}, - {file = "pydantic-1.10.14-cp39-cp39-win_amd64.whl", hash = "sha256:08b6ec0917c30861e3fe71a93be1648a2aa4f62f866142ba21670b24444d7fd8"}, - {file = "pydantic-1.10.14-py3-none-any.whl", hash = "sha256:8ee853cd12ac2ddbf0ecbac1c289f95882b2d4482258048079d13be700aa114c"}, - {file = "pydantic-1.10.14.tar.gz", hash = "sha256:46f17b832fe27de7850896f3afee50ea682220dd218f7e9c88d436788419dca6"}, -] - -[package.dependencies] -typing-extensions = ">=4.2.0" - -[package.extras] -dotenv = ["python-dotenv (>=0.10.4)"] -email = ["email-validator (>=1.0.3)"] + {file = "pydantic_core-2.16.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:3fab4e75b8c525a4776e7630b9ee48aea50107fea6ca9f593c98da3f4d11bf7c"}, + {file = "pydantic_core-2.16.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8bde5b48c65b8e807409e6f20baee5d2cd880e0fad00b1a811ebc43e39a00ab2"}, + {file = "pydantic_core-2.16.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2924b89b16420712e9bb8192396026a8fbd6d8726224f918353ac19c4c043d2a"}, + {file = "pydantic_core-2.16.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:16aa02e7a0f539098e215fc193c8926c897175d64c7926d00a36188917717a05"}, + {file = "pydantic_core-2.16.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:936a787f83db1f2115ee829dd615c4f684ee48ac4de5779ab4300994d8af325b"}, + {file = "pydantic_core-2.16.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:459d6be6134ce3b38e0ef76f8a672924460c455d45f1ad8fdade36796df1ddc8"}, + {file = "pydantic_core-2.16.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f9ee4febb249c591d07b2d4dd36ebcad0ccd128962aaa1801508320896575ef"}, + {file = "pydantic_core-2.16.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:40a0bd0bed96dae5712dab2aba7d334a6c67cbcac2ddfca7dbcc4a8176445990"}, + {file = "pydantic_core-2.16.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:870dbfa94de9b8866b37b867a2cb37a60c401d9deb4a9ea392abf11a1f98037b"}, + {file = "pydantic_core-2.16.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:308974fdf98046db28440eb3377abba274808bf66262e042c412eb2adf852731"}, + {file = "pydantic_core-2.16.2-cp310-none-win32.whl", hash = "sha256:a477932664d9611d7a0816cc3c0eb1f8856f8a42435488280dfbf4395e141485"}, + {file = "pydantic_core-2.16.2-cp310-none-win_amd64.whl", hash = "sha256:8f9142a6ed83d90c94a3efd7af8873bf7cefed2d3d44387bf848888482e2d25f"}, + {file = "pydantic_core-2.16.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:406fac1d09edc613020ce9cf3f2ccf1a1b2f57ab00552b4c18e3d5276c67eb11"}, + {file = "pydantic_core-2.16.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ce232a6170dd6532096cadbf6185271e4e8c70fc9217ebe105923ac105da9978"}, + {file = "pydantic_core-2.16.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a90fec23b4b05a09ad988e7a4f4e081711a90eb2a55b9c984d8b74597599180f"}, + {file = "pydantic_core-2.16.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8aafeedb6597a163a9c9727d8a8bd363a93277701b7bfd2749fbefee2396469e"}, + {file = "pydantic_core-2.16.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9957433c3a1b67bdd4c63717eaf174ebb749510d5ea612cd4e83f2d9142f3fc8"}, + {file = "pydantic_core-2.16.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b0d7a9165167269758145756db43a133608a531b1e5bb6a626b9ee24bc38a8f7"}, + {file = "pydantic_core-2.16.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dffaf740fe2e147fedcb6b561353a16243e654f7fe8e701b1b9db148242e1272"}, + {file = "pydantic_core-2.16.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f8ed79883b4328b7f0bd142733d99c8e6b22703e908ec63d930b06be3a0e7113"}, + {file = "pydantic_core-2.16.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:cf903310a34e14651c9de056fcc12ce090560864d5a2bb0174b971685684e1d8"}, + {file = "pydantic_core-2.16.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:46b0d5520dbcafea9a8645a8164658777686c5c524d381d983317d29687cce97"}, + {file = "pydantic_core-2.16.2-cp311-none-win32.whl", hash = "sha256:70651ff6e663428cea902dac297066d5c6e5423fda345a4ca62430575364d62b"}, + {file = "pydantic_core-2.16.2-cp311-none-win_amd64.whl", hash = "sha256:98dc6f4f2095fc7ad277782a7c2c88296badcad92316b5a6e530930b1d475ebc"}, + {file = "pydantic_core-2.16.2-cp311-none-win_arm64.whl", hash = "sha256:ef6113cd31411eaf9b39fc5a8848e71c72656fd418882488598758b2c8c6dfa0"}, + {file = "pydantic_core-2.16.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:88646cae28eb1dd5cd1e09605680c2b043b64d7481cdad7f5003ebef401a3039"}, + {file = "pydantic_core-2.16.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7b883af50eaa6bb3299780651e5be921e88050ccf00e3e583b1e92020333304b"}, + {file = "pydantic_core-2.16.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bf26c2e2ea59d32807081ad51968133af3025c4ba5753e6a794683d2c91bf6e"}, + {file = "pydantic_core-2.16.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:99af961d72ac731aae2a1b55ccbdae0733d816f8bfb97b41909e143de735f522"}, + {file = "pydantic_core-2.16.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:02906e7306cb8c5901a1feb61f9ab5e5c690dbbeaa04d84c1b9ae2a01ebe9379"}, + {file = "pydantic_core-2.16.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5362d099c244a2d2f9659fb3c9db7c735f0004765bbe06b99be69fbd87c3f15"}, + {file = "pydantic_core-2.16.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ac426704840877a285d03a445e162eb258924f014e2f074e209d9b4ff7bf380"}, + {file = "pydantic_core-2.16.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b94cbda27267423411c928208e89adddf2ea5dd5f74b9528513f0358bba019cb"}, + {file = "pydantic_core-2.16.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:6db58c22ac6c81aeac33912fb1af0e930bc9774166cdd56eade913d5f2fff35e"}, + {file = "pydantic_core-2.16.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:396fdf88b1b503c9c59c84a08b6833ec0c3b5ad1a83230252a9e17b7dfb4cffc"}, + {file = "pydantic_core-2.16.2-cp312-none-win32.whl", hash = "sha256:7c31669e0c8cc68400ef0c730c3a1e11317ba76b892deeefaf52dcb41d56ed5d"}, + {file = "pydantic_core-2.16.2-cp312-none-win_amd64.whl", hash = "sha256:a3b7352b48fbc8b446b75f3069124e87f599d25afb8baa96a550256c031bb890"}, + {file = "pydantic_core-2.16.2-cp312-none-win_arm64.whl", hash = "sha256:a9e523474998fb33f7c1a4d55f5504c908d57add624599e095c20fa575b8d943"}, + {file = "pydantic_core-2.16.2-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:ae34418b6b389d601b31153b84dce480351a352e0bb763684a1b993d6be30f17"}, + {file = "pydantic_core-2.16.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:732bd062c9e5d9582a30e8751461c1917dd1ccbdd6cafb032f02c86b20d2e7ec"}, + {file = "pydantic_core-2.16.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4b52776a2e3230f4854907a1e0946eec04d41b1fc64069ee774876bbe0eab55"}, + {file = "pydantic_core-2.16.2-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ef551c053692b1e39e3f7950ce2296536728871110e7d75c4e7753fb30ca87f4"}, + {file = "pydantic_core-2.16.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ebb892ed8599b23fa8f1799e13a12c87a97a6c9d0f497525ce9858564c4575a4"}, + {file = "pydantic_core-2.16.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aa6c8c582036275997a733427b88031a32ffa5dfc3124dc25a730658c47a572f"}, + {file = "pydantic_core-2.16.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4ba0884a91f1aecce75202473ab138724aa4fb26d7707f2e1fa6c3e68c84fbf"}, + {file = "pydantic_core-2.16.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7924e54f7ce5d253d6160090ddc6df25ed2feea25bfb3339b424a9dd591688bc"}, + {file = "pydantic_core-2.16.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:69a7b96b59322a81c2203be537957313b07dd333105b73db0b69212c7d867b4b"}, + {file = "pydantic_core-2.16.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:7e6231aa5bdacda78e96ad7b07d0c312f34ba35d717115f4b4bff6cb87224f0f"}, + {file = "pydantic_core-2.16.2-cp38-none-win32.whl", hash = "sha256:41dac3b9fce187a25c6253ec79a3f9e2a7e761eb08690e90415069ea4a68ff7a"}, + {file = "pydantic_core-2.16.2-cp38-none-win_amd64.whl", hash = "sha256:f685dbc1fdadb1dcd5b5e51e0a378d4685a891b2ddaf8e2bba89bd3a7144e44a"}, + {file = "pydantic_core-2.16.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:55749f745ebf154c0d63d46c8c58594d8894b161928aa41adbb0709c1fe78b77"}, + {file = "pydantic_core-2.16.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b30b0dd58a4509c3bd7eefddf6338565c4905406aee0c6e4a5293841411a1286"}, + {file = "pydantic_core-2.16.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18de31781cdc7e7b28678df7c2d7882f9692ad060bc6ee3c94eb15a5d733f8f7"}, + {file = "pydantic_core-2.16.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5864b0242f74b9dd0b78fd39db1768bc3f00d1ffc14e596fd3e3f2ce43436a33"}, + {file = "pydantic_core-2.16.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8f9186ca45aee030dc8234118b9c0784ad91a0bb27fc4e7d9d6608a5e3d386c"}, + {file = "pydantic_core-2.16.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cc6f6c9be0ab6da37bc77c2dda5f14b1d532d5dbef00311ee6e13357a418e646"}, + {file = "pydantic_core-2.16.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa057095f621dad24a1e906747179a69780ef45cc8f69e97463692adbcdae878"}, + {file = "pydantic_core-2.16.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6ad84731a26bcfb299f9eab56c7932d46f9cad51c52768cace09e92a19e4cf55"}, + {file = "pydantic_core-2.16.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:3b052c753c4babf2d1edc034c97851f867c87d6f3ea63a12e2700f159f5c41c3"}, + {file = "pydantic_core-2.16.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e0f686549e32ccdb02ae6f25eee40cc33900910085de6aa3790effd391ae10c2"}, + {file = "pydantic_core-2.16.2-cp39-none-win32.whl", hash = "sha256:7afb844041e707ac9ad9acad2188a90bffce2c770e6dc2318be0c9916aef1469"}, + {file = "pydantic_core-2.16.2-cp39-none-win_amd64.whl", hash = "sha256:9da90d393a8227d717c19f5397688a38635afec89f2e2d7af0df037f3249c39a"}, + {file = "pydantic_core-2.16.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5f60f920691a620b03082692c378661947d09415743e437a7478c309eb0e4f82"}, + {file = "pydantic_core-2.16.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:47924039e785a04d4a4fa49455e51b4eb3422d6eaacfde9fc9abf8fdef164e8a"}, + {file = "pydantic_core-2.16.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e6294e76b0380bb7a61eb8a39273c40b20beb35e8c87ee101062834ced19c545"}, + {file = "pydantic_core-2.16.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe56851c3f1d6f5384b3051c536cc81b3a93a73faf931f404fef95217cf1e10d"}, + {file = "pydantic_core-2.16.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9d776d30cde7e541b8180103c3f294ef7c1862fd45d81738d156d00551005784"}, + {file = "pydantic_core-2.16.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:72f7919af5de5ecfaf1eba47bf9a5d8aa089a3340277276e5636d16ee97614d7"}, + {file = "pydantic_core-2.16.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:4bfcbde6e06c56b30668a0c872d75a7ef3025dc3c1823a13cf29a0e9b33f67e8"}, + {file = "pydantic_core-2.16.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ff7c97eb7a29aba230389a2661edf2e9e06ce616c7e35aa764879b6894a44b25"}, + {file = "pydantic_core-2.16.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:9b5f13857da99325dcabe1cc4e9e6a3d7b2e2c726248ba5dd4be3e8e4a0b6d0e"}, + {file = "pydantic_core-2.16.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:a7e41e3ada4cca5f22b478c08e973c930e5e6c7ba3588fb8e35f2398cdcc1545"}, + {file = "pydantic_core-2.16.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:60eb8ceaa40a41540b9acae6ae7c1f0a67d233c40dc4359c256ad2ad85bdf5e5"}, + {file = "pydantic_core-2.16.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7beec26729d496a12fd23cf8da9944ee338c8b8a17035a560b585c36fe81af20"}, + {file = "pydantic_core-2.16.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:22c5f022799f3cd6741e24f0443ead92ef42be93ffda0d29b2597208c94c3753"}, + {file = "pydantic_core-2.16.2-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:eca58e319f4fd6df004762419612122b2c7e7d95ffafc37e890252f869f3fb2a"}, + {file = "pydantic_core-2.16.2-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:ed957db4c33bc99895f3a1672eca7e80e8cda8bd1e29a80536b4ec2153fa9804"}, + {file = "pydantic_core-2.16.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:459c0d338cc55d099798618f714b21b7ece17eb1a87879f2da20a3ff4c7628e2"}, + {file = "pydantic_core-2.16.2.tar.gz", hash = "sha256:0ba503850d8b8dcc18391f10de896ae51d37fe5fe43dbfb6a35c5c5cad271a06"}, +] + +[package.dependencies] +typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" [[package]] name = "pydocstyle" @@ -6321,13 +6391,13 @@ tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] [[package]] name = "starlette" -version = "0.27.0" +version = "0.36.3" description = "The little ASGI library that shines." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "starlette-0.27.0-py3-none-any.whl", hash = "sha256:918416370e846586541235ccd38a474c08b80443ed31c578a418e2209b3eef91"}, - {file = "starlette-0.27.0.tar.gz", hash = "sha256:6a6b0d042acb8d469a01eba54e9cda6cbd24ac602c4cd016723117d6a7e73b75"}, + {file = "starlette-0.36.3-py3-none-any.whl", hash = "sha256:13d429aa93a61dc40bf503e8c801db1f1bca3dc706b10ef2434a36123568f044"}, + {file = "starlette-0.36.3.tar.gz", hash = "sha256:90a671733cfb35771d8cc605e0b679d23b992f8dcfad48cc60b38cb29aeb7080"}, ] [package.dependencies] @@ -6335,7 +6405,7 @@ anyio = ">=3.4.0,<5" typing-extensions = {version = ">=3.10.0", markers = "python_version < \"3.10\""} [package.extras] -full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart", "pyyaml"] +full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart (>=0.0.7)", "pyyaml"] [[package]] name = "sympy" @@ -7112,13 +7182,13 @@ files = [ [[package]] name = "typing-extensions" -version = "4.5.0" -description = "Backported and Experimental Type Hints for Python 3.7+" +version = "4.8.0" +description = "Backported and Experimental Type Hints for Python 3.8+" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "typing_extensions-4.5.0-py3-none-any.whl", hash = "sha256:fb33085c39dd998ac16d1431ebc293a8b3eedd00fd4a32de0ff79002c19511b4"}, - {file = "typing_extensions-4.5.0.tar.gz", hash = "sha256:5cb5f4a79139d699607b3ef622a1dedafa84e115ab0024e0d9c044a9479ca7cb"}, + {file = "typing_extensions-4.8.0-py3-none-any.whl", hash = "sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0"}, + {file = "typing_extensions-4.8.0.tar.gz", hash = "sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef"}, ] [[package]] diff --git a/pyproject.toml b/pyproject.toml index 3cc440062f..147371f58f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -34,13 +34,13 @@ readme = "README.md" # Investigate if it is better to fix specific versions or use lower and upper bounds # FIXME: https://github.com/zama-ai/concrete-ml-internal/issues/2665 python = ">=3.8.1,<3.11" -concrete-python = "2.5.0" +concrete-python = "2.5.1" setuptools = "65.6.3" skops = {version = "0.5.0"} xgboost = "1.6.2" skorch = "0.11.0" torch = "1.13.1" -typing-extensions = "4.5.0" +typing-extensions = "4.8.0" brevitas = "0.8.0" onnxoptimizer = "0.3.10" onnxruntime = "1.13.1" @@ -53,7 +53,7 @@ protobuf = "3.20.3" # Deployment boto3 = "^1.23.5" -fastapi = "^0.102.0" +fastapi = "^0.109.1" uvicorn = "^0.21.0" tqdm = "^4.64.1" transformers = "^4.36.0" @@ -70,7 +70,7 @@ pylint = "^2.13.0" pytest = "7.4.1" pytest-cov = "^4.1.0" pytest_codeblocks = "^0.14.0" -mypy = "^0.991" +mypy = "^1.8.0" pydocstyle = "^6.1.1" python-semantic-release = "^7.27.0" semver = "^2.13.0" diff --git a/src/concrete/ml/quantization/base_quantized_op.py b/src/concrete/ml/quantization/base_quantized_op.py index 1beac84122..385295e07c 100644 --- a/src/concrete/ml/quantization/base_quantized_op.py +++ b/src/concrete/ml/quantization/base_quantized_op.py @@ -20,7 +20,14 @@ UniformQuantizationParameters, ) -ONNXOpInputOutputType = Union[numpy.ndarray, QuantizedArray, None] +ONNXOpInputOutputType = Union[ + numpy.ndarray, + QuantizedArray, + None, + bool, + int, + float, +] ALL_QUANTIZED_OPS: Set[Type] = set() @@ -969,7 +976,8 @@ def cnp_round( # Update the lsbs_to_remove value in the dictionary self.lsbs_to_remove[rounding_operation_id] = max( - self.lsbs_to_remove.get(rounding_operation_id, 0), computed_lsbs_to_remove + self.lsbs_to_remove.get(rounding_operation_id, 0), + computed_lsbs_to_remove, ) # Rounding logic diff --git a/src/concrete/ml/quantization/post_training.py b/src/concrete/ml/quantization/post_training.py index 0225085075..f90fb868cd 100644 --- a/src/concrete/ml/quantization/post_training.py +++ b/src/concrete/ml/quantization/post_training.py @@ -400,7 +400,9 @@ def _calibrate_layers_activation( ) @abstractmethod - def _process_initializer(self, n_bits: int, values: numpy.ndarray) -> QuantizedArray: + def _process_initializer( + self, n_bits: int, values: Union[numpy.ndarray, float, int, bool] + ) -> Union[QuantizedArray, RawOpOutput]: """Transform a constant tensor according to the model conversion mode. The values supplied are floating point values that will be quantized. @@ -410,7 +412,8 @@ def _process_initializer(self, n_bits: int, values: numpy.ndarray) -> QuantizedA values (numpy.ndarray): Float values that initialize this tensor Returns: - QuantizedArray: a quantized tensor with integer values on n_bits bits + Union[QuantizedArray, RawOpOutput]: a quantized tensor with integer + values on n_bits bits """ @abstractmethod @@ -535,14 +538,13 @@ def _quantize_layers(self, *input_calibration_data: numpy.ndarray): curr_cst_inputs[input_idx] = value else: # Initializers are ndarray or scalar - assert value is not None - assert isinstance(value, numpy.ndarray) or numpy.isscalar(value) + assert isinstance(value, (numpy.ndarray, float, int, bool)) curr_cst_inputs[input_idx] = self._process_initializer( self.n_bits_op_weights, value ) else: # Initializers are ndarray or scalar - assert isinstance(value, numpy.ndarray) or numpy.isscalar(value) + assert isinstance(value, (numpy.ndarray, float, int, bool)) curr_cst_inputs[input_idx] = value has_variable_inputs = (len(curr_inputs) - len(curr_cst_inputs)) > 0 @@ -865,7 +867,9 @@ def _process_layer( True, quantized_op, *calibration_data, quantizers=quantizers ) - def _process_initializer(self, n_bits: int, values: numpy.ndarray): + def _process_initializer( + self, n_bits: int, values: Union[numpy.ndarray, float, int, bool] + ) -> Union[QuantizedArray, RawOpOutput]: """Quantize a network constant tensor (a weights tensor). The values supplied are floating point values that will be quantized. @@ -875,13 +879,14 @@ def _process_initializer(self, n_bits: int, values: numpy.ndarray): values (numpy.ndarray): Float values that initialize this tensor Returns: - QuantizedArray: a quantized tensor with integer values on n_bits bits + Union[QuantizedArray, RawOpOutput]: a quantized tensor with integer + values on n_bits bits """ if isinstance(values, numpy.ndarray) and numpy.issubdtype(values.dtype, numpy.integer): return values.view(RawOpOutput) - assert isinstance(values, (numpy.ndarray, float)) + assert isinstance(values, numpy.ndarray) is_signed = is_symmetric = self._check_distribution_is_symmetric_around_zero(values) return QuantizedArray( @@ -990,7 +995,9 @@ def _process_layer( False, quantized_op, *calibration_data, quantizers=quantizers ) - def _process_initializer(self, n_bits: int, values: numpy.ndarray): + def _process_initializer( + self, n_bits: int, values: Union[numpy.ndarray, float, int, bool] + ) -> Union[QuantizedArray, RawOpOutput]: """Process an already quantized weight tensor. The values supplied are in floating point, but are discrete, in the sense @@ -1003,8 +1010,8 @@ def _process_initializer(self, n_bits: int, values: numpy.ndarray): values (numpy.ndarray): Discrete float values that initialize this tensor Returns: - QuantizedArray: a quantized tensor with integer values on n_bits bits and with alpha as - the scaling factor. + Union[QuantizedArray, RawOpOutput]: a quantized tensor with integer values on + n_bits bits and with alpha as the scaling factor. """ # Assume that integer initializer op inputs are raw values that should not be quantized diff --git a/src/concrete/ml/quantization/quantizers.py b/src/concrete/ml/quantization/quantizers.py index 9369e1e385..caae2ad766 100644 --- a/src/concrete/ml/quantization/quantizers.py +++ b/src/concrete/ml/quantization/quantizers.py @@ -832,7 +832,7 @@ class QuantizedArray: def __init__( self, n_bits, - values: Optional[numpy.ndarray], + values: Union[None, float, int, numpy.ndarray], value_is_float: bool = True, options: Optional[QuantizationOptions] = None, stats: Optional[MinMaxQuantizationStats] = None, @@ -873,9 +873,9 @@ def __eq__(self, other): def _values_setup( self, - values: numpy.ndarray, + values: Union[numpy.ndarray, float, int], value_is_float: bool, - options: QuantizationOptions = None, + options: Optional[QuantizationOptions] = None, stats: Optional[MinMaxQuantizationStats] = None, params: Optional[UniformQuantizationParameters] = None, ): @@ -898,12 +898,15 @@ def _values_setup( f"got {values.dtype}: {values}", ) - self.values = deepcopy(values) if isinstance(values, numpy.ndarray) else values + assert isinstance(values, (numpy.ndarray, float)) + self.values = ( + deepcopy(values) if isinstance(values, numpy.ndarray) else numpy.array(values) + ) # If no stats are provided, compute them. # Note that this cannot be done during tracing if stats is None: - self.quantizer.compute_quantization_stats(values) + self.quantizer.compute_quantization_stats(self.values) # If the quantization params are not provided, compute them # Note that during tracing, this does not use the tracer in any way and just @@ -929,7 +932,10 @@ def _values_setup( "when int/uint was required", ) - self.qvalues = deepcopy(values) if isinstance(values, numpy.ndarray) else values + assert isinstance(values, (numpy.ndarray, int, Tracer)) + self.qvalues = ( + deepcopy(values) if isinstance(values, numpy.ndarray) else numpy.array(values) + ) # Populate self.values self.dequant() @@ -994,7 +1000,7 @@ def update_values(self, values: numpy.ndarray) -> numpy.ndarray: Returns: qvalues (numpy.ndarray): Corresponding qvalues """ - self.values = deepcopy(values) if isinstance(values, numpy.ndarray) else values + self.values = deepcopy(values) if isinstance(values, numpy.ndarray) else numpy.array(values) self.quant() return self.qvalues diff --git a/src/concrete/ml/sklearn/qnn.py b/src/concrete/ml/sklearn/qnn.py index 1bbbbcfd57..2981a66de6 100644 --- a/src/concrete/ml/sklearn/qnn.py +++ b/src/concrete/ml/sklearn/qnn.py @@ -141,7 +141,8 @@ def __init__( virtual_params = kwargs.pop("virtual_params_", {}) self._kwargs = kwargs - vars(self).update(kwargs) + for key, value in kwargs.items(): + setattr(self, key, value) self.history_ = history self.initialized_ = initialized @@ -448,7 +449,8 @@ def __init__( virtual_params = kwargs.pop("virtual_params_", {}) self._kwargs = kwargs - vars(self).update(kwargs) + for key, value in kwargs.items(): + setattr(self, key, value) self.history_ = history self.initialized_ = initialized