MEDfl 2.0.4.dev10__tar.gz → 2.0.4.dev12__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- MEDfl-2.0.4.dev12/MEDfl/rw/client.py +487 -0
- MEDfl-2.0.4.dev12/MEDfl/rw/model.py +147 -0
- MEDfl-2.0.4.dev12/MEDfl/rw/strategy.py +429 -0
- MEDfl-2.0.4.dev12/MEDfl.egg-info/PKG-INFO +212 -0
- MEDfl-2.0.4.dev12/PKG-INFO +212 -0
- MEDfl-2.0.4.dev12/README.md +192 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/setup.py +1 -1
- medfl-2.0.4.dev10/MEDfl/rw/client.py +0 -288
- medfl-2.0.4.dev10/MEDfl/rw/model.py +0 -47
- medfl-2.0.4.dev10/MEDfl/rw/strategy.py +0 -157
- medfl-2.0.4.dev10/MEDfl.egg-info/PKG-INFO +0 -121
- medfl-2.0.4.dev10/PKG-INFO +0 -121
- medfl-2.0.4.dev10/README.md +0 -70
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/.github/workflows/main.yml +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/.gitignore +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/.idea/.gitignore +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/.idea/MEDfl.iml +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/.idea/inspectionProfiles/profiles_settings.xml +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/.idea/misc.xml +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/.idea/modules.xml +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/.idea/vcs.xml +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/LICENSE +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/MEDfl/LearningManager/__init__.py +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/MEDfl/LearningManager/client.py +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/MEDfl/LearningManager/dynamicModal.py +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/MEDfl/LearningManager/federated_dataset.py +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/MEDfl/LearningManager/flpipeline.py +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/MEDfl/LearningManager/model.py +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/MEDfl/LearningManager/params.yaml +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/MEDfl/LearningManager/params_optimiser.py +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/MEDfl/LearningManager/plot.py +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/MEDfl/LearningManager/server.py +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/MEDfl/LearningManager/strategy.py +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/MEDfl/LearningManager/utils.py +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/MEDfl/NetManager/__init__.py +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/MEDfl/NetManager/database_connector.py +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/MEDfl/NetManager/dataset.py +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/MEDfl/NetManager/flsetup.py +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/MEDfl/NetManager/net_helper.py +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/MEDfl/NetManager/net_manager_queries.py +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/MEDfl/NetManager/network.py +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/MEDfl/NetManager/node.py +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/MEDfl/__init__.py +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/MEDfl/rw/__init__.py +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/MEDfl/rw/server.py +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/MEDfl/scripts/__init__.py +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/MEDfl/scripts/base.py +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/MEDfl/scripts/create_db.py +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/MEDfl.egg-info/SOURCES.txt +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/MEDfl.egg-info/dependency_links.txt +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/MEDfl.egg-info/requires.txt +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/MEDfl.egg-info/top_level.txt +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/alembic/README +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/alembic/__init__.py +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/alembic/__pycache__/env.cpython-38.pyc +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/alembic/alembic_logging.ini +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/alembic/debug.log +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/alembic/env.py +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/alembic/script.py.mako +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/alembic/versions/__pycache__/b159ee510a90_initial.cpython-38.pyc +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/alembic/versions/b159ee510a90_initial.py +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/alembic.ini +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/Makefile +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/.buildinfo +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/.doctrees/Medfl.LearningManager.doctree +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/.doctrees/Medfl.NetManager.doctree +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/.doctrees/Medfl.doctree +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/.doctrees/environment.pickle +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/.doctrees/index.doctree +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/.doctrees/modules.doctree +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/.nojekyll +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/Medfl.LearningManager.html +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/Medfl.NetManager.html +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/Medfl.html +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_modules/Medfl/LearningManager/client.html +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_modules/Medfl/LearningManager/dynamicModal.html +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_modules/Medfl/LearningManager/federated_dataset.html +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_modules/Medfl/LearningManager/flpipeline.html +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_modules/Medfl/LearningManager/model.html +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_modules/Medfl/LearningManager/plot.html +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_modules/Medfl/LearningManager/server.html +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_modules/Medfl/LearningManager/strategy.html +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_modules/Medfl/LearningManager/utils.html +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_modules/Medfl/NetManager/dataset.html +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_modules/Medfl/NetManager/flsetup.html +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_modules/Medfl/NetManager/net_helper.html +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_modules/Medfl/NetManager/network.html +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_modules/Medfl/NetManager/node.html +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_modules/index.html +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_sources/Medfl.LearningManager.rst.txt +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_sources/Medfl.NetManager.rst.txt +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_sources/Medfl.rst.txt +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_sources/index.rst.txt +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_sources/modules.rst.txt +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_static/MEDomics.png +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_static/_sphinx_javascript_frameworks_compat.js +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_static/basic.css +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_static/css/badge_only.css +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_static/css/fonts/Roboto-Slab-Bold.woff +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_static/css/fonts/Roboto-Slab-Bold.woff2 +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_static/css/fonts/Roboto-Slab-Regular.woff +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_static/css/fonts/Roboto-Slab-Regular.woff2 +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_static/css/fonts/fontawesome-webfont.eot +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_static/css/fonts/fontawesome-webfont.svg +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_static/css/fonts/fontawesome-webfont.ttf +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_static/css/fonts/fontawesome-webfont.woff +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_static/css/fonts/fontawesome-webfont.woff2 +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_static/css/fonts/lato-bold-italic.woff +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_static/css/fonts/lato-bold-italic.woff2 +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_static/css/fonts/lato-bold.woff +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_static/css/fonts/lato-bold.woff2 +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_static/css/fonts/lato-normal-italic.woff +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_static/css/fonts/lato-normal-italic.woff2 +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_static/css/fonts/lato-normal.woff +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_static/css/fonts/lato-normal.woff2 +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_static/css/theme.css +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_static/dark_mode_css/custom.css +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_static/dark_mode_css/dark.css +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_static/dark_mode_css/general.css +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_static/dark_mode_js/default_dark.js +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_static/dark_mode_js/default_light.js +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_static/dark_mode_js/theme_switcher.js +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_static/doctools.js +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_static/documentation_options.js +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_static/file.png +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_static/jquery.js +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_static/js/badge_only.js +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_static/js/html5shiv-printshiv.min.js +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_static/js/html5shiv.min.js +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_static/js/theme.js +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_static/language_data.js +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_static/minus.png +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_static/plus.png +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_static/pygments.css +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_static/searchtools.js +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_static/sphinx_highlight.js +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/genindex.html +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/index.html +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/modules.html +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/objects.inv +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/py-modindex.html +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/search.html +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/searchindex.js +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/doctrees/Documentation.doctree +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/doctrees/Installation.doctree +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/doctrees/Medfl.LearningManager.doctree +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/doctrees/Medfl.NetManager.doctree +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/doctrees/Medfl.doctree +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/doctrees/configuration_file.doctree +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/doctrees/environment.pickle +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/doctrees/index.doctree +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/doctrees/modules.doctree +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/doctrees/tutorials.doctree +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/.buildinfo +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/.nojekyll +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/Documentation.html +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/Installation.html +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/Medfl.LearningManager.html +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/Medfl.NetManager.html +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/Medfl.html +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_images/FTL_comp.png +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_images/LearningManager.png +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_images/MEDfl_Diagramm.png +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_images/NetManager_Diagramm.png +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_images/learningresults.png +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_images/mysqllogo.png +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_images/phpmyadmin.png +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_images/wampLogo.png +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_images/xampplogo.png +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_modules/index.html +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_sources/Documentation.rst.txt +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_sources/Installation.rst.txt +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_sources/Medfl.LearningManager.rst.txt +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_sources/Medfl.NetManager.rst.txt +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_sources/Medfl.rst.txt +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_sources/configuration_file.rst.txt +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_sources/index.rst.txt +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_sources/modules.rst.txt +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_sources/tutorials.rst.txt +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/MEDomics.png +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/_sphinx_javascript_frameworks_compat.js +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/basic.css +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/css/badge_only.css +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/css/fonts/Roboto-Slab-Bold.woff +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/css/fonts/Roboto-Slab-Bold.woff2 +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/css/fonts/Roboto-Slab-Regular.woff +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/css/fonts/Roboto-Slab-Regular.woff2 +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/css/fonts/fontawesome-webfont.eot +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/css/fonts/fontawesome-webfont.svg +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/css/fonts/fontawesome-webfont.ttf +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/css/fonts/fontawesome-webfont.woff +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/css/fonts/fontawesome-webfont.woff2 +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/css/fonts/lato-bold-italic.woff +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/css/fonts/lato-bold-italic.woff2 +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/css/fonts/lato-bold.woff +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/css/fonts/lato-bold.woff2 +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/css/fonts/lato-normal-italic.woff +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/css/fonts/lato-normal-italic.woff2 +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/css/fonts/lato-normal.woff +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/css/fonts/lato-normal.woff2 +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/css/theme.css +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/custom.css +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/dark_mode_css/custom.css +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/dark_mode_css/dark.css +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/dark_mode_css/general.css +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/dark_mode_js/default_dark.js +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/dark_mode_js/default_light.js +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/dark_mode_js/theme_switcher.js +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/doctools.js +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/documentation_options.js +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/file.png +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/jquery-3.6.0.js +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/jquery.js +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/js/badge_only.js +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/js/html5shiv-printshiv.min.js +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/js/html5shiv.min.js +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/js/theme.js +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/language_data.js +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/minus.png +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/plus.png +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/pygments.css +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/searchtools.js +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/sphinx_highlight.js +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/underscore-1.13.1.js +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/underscore.js +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/configuration_file.html +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/genindex.html +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/index.html +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/modules.html +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/objects.inv +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/py-modindex.html +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/search.html +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/searchindex.js +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/tutorials.html +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/make.bat +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/source/Documentation.rst +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/source/Installation.rst +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/source/Medfl.LearningManager.rst +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/source/Medfl.NetManager.rst +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/source/Medfl.rst +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/source/_static/custom.css +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/source/conf.py +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/source/configuration_file.rst +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/source/figures/Images/FL_gen.png +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/source/figures/Images/FTL_comp.png +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/source/figures/Images/FlDatasetDiagramm.png +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/source/figures/Images/GDP.png +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/source/figures/Images/LDP.png +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/source/figures/Images/LearningManager.png +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/source/figures/Images/MEDfl_Diagramm.png +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/source/figures/Images/Modelinit.png +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/source/figures/Images/NetManager_Diagramm.png +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/source/figures/Images/NetworkCreation.png +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/source/figures/Images/createServer.png +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/source/figures/Images/learningresults.png +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/source/figures/Images/logos/mysqllogo.png +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/source/figures/Images/logos/phpmyadmin.png +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/source/figures/Images/logos/wampLogo.png +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/source/figures/Images/logos/xampplogo.png +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/source/figures/Images/modeltest.png +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/source/figures/Images/netMan.png +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/source/figures/Images/nodecreation.png +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/source/figures/Images/pipeline.png +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/source/figures/Images/strategy.png +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/source/figures/MEDomics.png +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/source/index.rst +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/source/modules.rst +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/source/tutorials.rst +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/global_params.yaml +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/medfl.egg-info/PKG-INFO +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/medfl.egg-info/SOURCES.txt +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/medfl.egg-info/dependency_links.txt +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/medfl.egg-info/requires.txt +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/medfl.egg-info/top_level.txt +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/.ipynb_checkpoints/trainedModels/binary_classifier.pth +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/.ipynb_checkpoints/trainedModels/eicu_binary_classifier.pth +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/.ipynb_checkpoints/trainedModels/grid_search_classifier.pth +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/.ipynb_checkpoints/trainedModels/new_binary_classifier.pth +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/.ipynb_checkpoints/trainedModels/updated_model.pth +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/First_Tuto.ipynb +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/Images/FL_gen.png +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/Images/FTL_comp.png +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/Images/FlDatasetDiagramm.png +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/Images/GDP.png +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/Images/LDP.png +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/Images/LearningManager.png +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/Images/MEDfl_Diagramm.png +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/Images/MEDfl_bachmarking_plan.png +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/Images/Modelinit.png +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/Images/NetManager_Diagramm.png +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/Images/NetworkCreation.png +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/Images/createServer.png +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/Images/learningresults.png +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/Images/logos/mysqllogo.png +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/Images/logos/phpmyadmin.png +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/Images/logos/wampLogo.png +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/Images/logos/xampplogo.png +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/Images/modeltest.png +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/Images/netMan.png +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/Images/nodecreation.png +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/Images/optuna_optim_diag.png +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/Images/pipeline.png +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/Images/strategy.png +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/banchmarking/MEDfl_benchmarks.ipynb +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/banchmarking/banchmarking_plan.md +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/banchmarking/benchmarks_results.txt +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/banchmarking/network_architecture/net_bachmarking_conf_1.ipynb +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/banchmarking/network_architecture/net_bachmarking_conf_2.ipynb +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/banchmarking/transfer_learning/TL_activated.ipynb +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/banchmarking/transfer_learning/TL_dectivated.ipynb +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/data/chunk_1.csv +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/data/chunk_2.csv +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/data/chunk_3.csv +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/data/config_1/part_1.csv +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/data/config_1/part_2.csv +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/data/config_1/part_3.csv +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/data/config_1/test_1.csv +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/data/config_1/test_2.csv +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/data/eicu_sapsii_data.csv +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/data/eicu_sapsii_data_test.csv +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/data/eicu_sapsii_data_test_1.csv +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/data/masterDataSet/Mimic_ouael.csv +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/data/masterDataSet/Mimic_train.csv +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/data/masterDataSet/eICU.csv +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/data/nodesData/output_1.csv +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/data/nodesData/output_2.csv +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/data/nodesData/output_3.csv +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/data/nodesData/output_4.csv +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/data/nodesData/output_5.csv +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/data/test_1.csv +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/data/test_2.csv +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/data/test_3.csv +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/data/validation/Mimic_validation.csv +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/eicu_test.csv +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/eicu_test_1.csv +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/eicu_test_2.csv +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/eicu_test_3.csv +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/sapsii_score_knnimputed_eicu.csv +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/tutorial/1_DB.ipynb +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/tutorial/2_NetManager.ipynb +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/tutorial/3_TransferLearning copy.ipynb +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/tutorial/3_TransferLearning.ipynb +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/tutorial/4_LearningManager.ipynb +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/tutorial/5_LearningResults.ipynb +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/tutorial/6_ModelChoice.ipynb +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/tutorial/7_ParamsOptimiser.ipynb +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/tutorial/8_complete_tutorial.ipynb +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/tutorial/newplot2.png +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/tutorial/newplot4.png +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/requirements.txt +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/setup.cfg +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/setup_mysql.sh +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/tests/__init__.py +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/tests/__pycache__/test_dataset.cpython-38.pyc +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/tests/__pycache__/test_federated_dataset.cpython-38.pyc +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/tests/__pycache__/test_flpipeline.cpython-38.pyc +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/tests/__pycache__/test_flsetup.cpython-38.pyc +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/tests/__pycache__/test_network.cpython-38.pyc +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/tests/__pycache__/test_node.cpython-38.pyc +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/tests/test_dataset.py +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/tests/test_federated_dataset.py +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/tests/test_flpipeline.py +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/tests/test_flsetup.py +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/tests/test_network.py +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/tests/test_node.py +0 -0
- {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/workflows/migration.yml +0 -0
|
@@ -0,0 +1,487 @@
|
|
|
1
|
+
# client.py
|
|
2
|
+
|
|
3
|
+
import argparse
|
|
4
|
+
import pandas as pd
|
|
5
|
+
import flwr as fl
|
|
6
|
+
import torch
|
|
7
|
+
import torch.nn as nn
|
|
8
|
+
import torch.optim as optim
|
|
9
|
+
from torch.utils.data import TensorDataset, DataLoader
|
|
10
|
+
from sklearn.metrics import accuracy_score, roc_auc_score
|
|
11
|
+
from sklearn.model_selection import train_test_split
|
|
12
|
+
from MEDfl.rw.model import Net # votre définition de modèle
|
|
13
|
+
import socket
|
|
14
|
+
import platform
|
|
15
|
+
import psutil
|
|
16
|
+
import shutil
|
|
17
|
+
import numpy as np
|
|
18
|
+
|
|
19
|
+
try:
|
|
20
|
+
import GPUtil
|
|
21
|
+
except ImportError:
|
|
22
|
+
GPUtil = None
|
|
23
|
+
|
|
24
|
+
try:
|
|
25
|
+
import xgboost as xgb
|
|
26
|
+
except Exception:
|
|
27
|
+
xgb = None
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class DPConfig:
|
|
31
|
+
"""
|
|
32
|
+
Configuration for differential privacy.
|
|
33
|
+
|
|
34
|
+
Attributes:
|
|
35
|
+
noise_multiplier (float): Noise multiplier for DP.
|
|
36
|
+
max_grad_norm (float): Maximum gradient norm for clipping.
|
|
37
|
+
batch_size (int): Batch size for training.
|
|
38
|
+
secure_rng (bool): Use a secure random generator.
|
|
39
|
+
"""
|
|
40
|
+
|
|
41
|
+
def __init__(
|
|
42
|
+
self,
|
|
43
|
+
noise_multiplier: float = 1.0,
|
|
44
|
+
max_grad_norm: float = 1.0,
|
|
45
|
+
batch_size: int = 32,
|
|
46
|
+
secure_rng: bool = False,
|
|
47
|
+
):
|
|
48
|
+
self.noise_multiplier = noise_multiplier
|
|
49
|
+
self.max_grad_norm = max_grad_norm
|
|
50
|
+
self.batch_size = batch_size
|
|
51
|
+
self.secure_rng = secure_rng
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def booster_to_parameters(bst):
|
|
55
|
+
# Send JSON so the server can merge trees safely
|
|
56
|
+
raw = bst.save_raw(raw_format="json")
|
|
57
|
+
# NumPyClient expects a list of numpy arrays
|
|
58
|
+
return [np.frombuffer(raw, dtype=np.uint8)]
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def parameters_to_booster(parameters):
|
|
62
|
+
# Handle numpy uint8 array or raw bytes/bytearray
|
|
63
|
+
buf = parameters[0]
|
|
64
|
+
if isinstance(buf, (bytes, bytearray, memoryview)):
|
|
65
|
+
raw = bytes(buf)
|
|
66
|
+
else:
|
|
67
|
+
arr = np.asarray(buf, dtype=np.uint8)
|
|
68
|
+
raw = arr.tobytes()
|
|
69
|
+
|
|
70
|
+
booster = xgb.Booster()
|
|
71
|
+
# xgboost can load both JSON and binary buffers
|
|
72
|
+
booster.load_model(bytearray(raw))
|
|
73
|
+
return booster
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
class FlowerClient(fl.client.NumPyClient):
|
|
77
|
+
def __init__(
|
|
78
|
+
self,
|
|
79
|
+
server_address: str,
|
|
80
|
+
data_path: str = "data/data.csv",
|
|
81
|
+
dp_config: DPConfig = None,
|
|
82
|
+
model_type: str = "nn",
|
|
83
|
+
xgb_params: dict = None,
|
|
84
|
+
xgb_rounds: int = 50,
|
|
85
|
+
):
|
|
86
|
+
self.server_address = server_address
|
|
87
|
+
self.model_type = model_type.lower()
|
|
88
|
+
self.xgb_params = xgb_params or {}
|
|
89
|
+
self.xgb_rounds = xgb_rounds
|
|
90
|
+
|
|
91
|
+
# Store hostname for datasetConfig host-specific overrides
|
|
92
|
+
self.hostname = socket.gethostname()
|
|
93
|
+
|
|
94
|
+
# Load once; keep the DataFrame so we can rebuild splits from config later
|
|
95
|
+
self.df = pd.read_csv(data_path)
|
|
96
|
+
|
|
97
|
+
# Defaults at startup (can be overridden dynamically from config)'
|
|
98
|
+
default_target = self.df.columns[-1]
|
|
99
|
+
default_test_size = 0.20
|
|
100
|
+
|
|
101
|
+
# Build initial splits/buffers/metadata
|
|
102
|
+
self._prepare_splits(
|
|
103
|
+
target_name=default_target,
|
|
104
|
+
test_size=default_test_size,
|
|
105
|
+
dp_config=dp_config,
|
|
106
|
+
)
|
|
107
|
+
|
|
108
|
+
# Apply DP once at startup (NN only)
|
|
109
|
+
self.privacy_engine = None
|
|
110
|
+
if dp_config and self.model_type == "nn":
|
|
111
|
+
try:
|
|
112
|
+
from opacus import PrivacyEngine
|
|
113
|
+
|
|
114
|
+
self.privacy_engine = PrivacyEngine()
|
|
115
|
+
(
|
|
116
|
+
self.model,
|
|
117
|
+
self.optimizer,
|
|
118
|
+
self.train_loader,
|
|
119
|
+
) = self.privacy_engine.make_private(
|
|
120
|
+
module=self.model,
|
|
121
|
+
optimizer=self.optimizer,
|
|
122
|
+
data_loader=self.train_loader,
|
|
123
|
+
noise_multiplier=dp_config.noise_multiplier,
|
|
124
|
+
max_grad_norm=dp_config.max_grad_norm,
|
|
125
|
+
secure_rng=dp_config.secure_rng,
|
|
126
|
+
)
|
|
127
|
+
except ImportError:
|
|
128
|
+
print("Opacus non installé : exécution sans DP.")
|
|
129
|
+
|
|
130
|
+
# --------------------------------------------------------------------------
|
|
131
|
+
# Helpers to (re)prepare data from a target column and test_size
|
|
132
|
+
# --------------------------------------------------------------------------
|
|
133
|
+
def _prepare_splits(self, target_name, test_size, dp_config):
|
|
134
|
+
"""Create train/test split, tensors/DMatrices, and metadata for the chosen target/test_size."""
|
|
135
|
+
df = self.df
|
|
136
|
+
|
|
137
|
+
if target_name not in df.columns:
|
|
138
|
+
raise ValueError(f"Target '{target_name}' not found in CSV columns: {list(df.columns)}")
|
|
139
|
+
|
|
140
|
+
# Clamp and sanitize test_size
|
|
141
|
+
try:
|
|
142
|
+
ts = float(test_size)
|
|
143
|
+
except Exception:
|
|
144
|
+
ts = 0.20
|
|
145
|
+
ts = max(1e-6, min(ts, 0.9))
|
|
146
|
+
|
|
147
|
+
# Build X/y from chosen target
|
|
148
|
+
X_df = df.drop(columns=[target_name])
|
|
149
|
+
y_series = df[target_name]
|
|
150
|
+
X_full = X_df.values
|
|
151
|
+
|
|
152
|
+
# If y isn't numeric, factorize to integers (keep class labels for metadata)
|
|
153
|
+
if not np.issubdtype(np.asarray(y_series).dtype, np.number):
|
|
154
|
+
y_vals, uniques = pd.factorize(y_series)
|
|
155
|
+
y_full = y_vals.astype(np.float32, copy=False)
|
|
156
|
+
classes = list(map(str, uniques))
|
|
157
|
+
label_counts = y_series.value_counts().to_dict()
|
|
158
|
+
else:
|
|
159
|
+
y_full = y_series.values.astype(np.float32, copy=False)
|
|
160
|
+
classes = sorted(pd.Series(y_full).unique().tolist())
|
|
161
|
+
label_counts = pd.Series(y_full).value_counts().to_dict()
|
|
162
|
+
|
|
163
|
+
# Heuristic for stratification (classification-like)
|
|
164
|
+
is_classif = np.unique(y_full).shape[0] <= 50
|
|
165
|
+
strat = y_full if is_classif else None
|
|
166
|
+
|
|
167
|
+
X_train, X_test, y_train, y_test = train_test_split(
|
|
168
|
+
X_full,
|
|
169
|
+
y_full,
|
|
170
|
+
test_size=ts,
|
|
171
|
+
random_state=42,
|
|
172
|
+
stratify=strat if strat is not None else None,
|
|
173
|
+
)
|
|
174
|
+
|
|
175
|
+
# --- Update metadata used by get_properties ---
|
|
176
|
+
self.feature_names = X_df.columns.tolist()
|
|
177
|
+
self.target_name = target_name
|
|
178
|
+
self.label_counts = label_counts
|
|
179
|
+
self.classes = classes
|
|
180
|
+
|
|
181
|
+
# --- Build per-model buffers ---
|
|
182
|
+
if self.model_type == "nn":
|
|
183
|
+
# Train tensors
|
|
184
|
+
self.X_tensor = torch.tensor(X_train, dtype=torch.float32)
|
|
185
|
+
self.y_tensor = torch.tensor(y_train, dtype=torch.float32)
|
|
186
|
+
|
|
187
|
+
# Test tensors
|
|
188
|
+
self.X_test_tensor = torch.tensor(X_test, dtype=torch.float32)
|
|
189
|
+
self.y_test_tensor = torch.tensor(y_test, dtype=torch.float32)
|
|
190
|
+
|
|
191
|
+
# DataLoaders
|
|
192
|
+
batch_size = getattr(dp_config, "batch_size", 32) if dp_config else 32
|
|
193
|
+
train_ds = TensorDataset(self.X_tensor, self.y_tensor)
|
|
194
|
+
self.train_loader = DataLoader(train_ds, batch_size=batch_size, shuffle=True)
|
|
195
|
+
self.test_loader = DataLoader(
|
|
196
|
+
TensorDataset(self.X_test_tensor, self.y_test_tensor),
|
|
197
|
+
batch_size=batch_size,
|
|
198
|
+
shuffle=False,
|
|
199
|
+
)
|
|
200
|
+
|
|
201
|
+
# Create model/criterion/optimizer if not present
|
|
202
|
+
input_dim = X_train.shape[1]
|
|
203
|
+
if not hasattr(self, "model"):
|
|
204
|
+
self.model = Net(input_dim)
|
|
205
|
+
self.criterion = nn.BCEWithLogitsLoss()
|
|
206
|
+
self.optimizer = optim.SGD(self.model.parameters(), lr=0.01)
|
|
207
|
+
|
|
208
|
+
else:
|
|
209
|
+
# XGBoost DMatrices
|
|
210
|
+
if xgb is None:
|
|
211
|
+
raise ImportError("xgboost is not installed. `pip install xgboost`")
|
|
212
|
+
|
|
213
|
+
self.X_np = X_train.astype(np.float32, copy=False) # train
|
|
214
|
+
self.y_np = y_train.astype(np.float32, copy=False)
|
|
215
|
+
self.dtrain = xgb.DMatrix(self.X_np, label=self.y_np)
|
|
216
|
+
|
|
217
|
+
self.X_np_test = X_test.astype(np.float32, copy=False) # test
|
|
218
|
+
self.y_np_test = y_test.astype(np.float32, copy=False)
|
|
219
|
+
self.dtest = xgb.DMatrix(self.X_np_test, label=self.y_np_test)
|
|
220
|
+
|
|
221
|
+
# Cold-start booster only if not present yet
|
|
222
|
+
if not hasattr(self, "bst"):
|
|
223
|
+
self.bst = xgb.train(self.xgb_params, self.dtrain, num_boost_round=1)
|
|
224
|
+
|
|
225
|
+
# Remember current prep so we can skip unnecessary rebuilds
|
|
226
|
+
self._prepared_key = (self.target_name, float(ts))
|
|
227
|
+
|
|
228
|
+
def _pick_target_and_frac(self, cfg):
|
|
229
|
+
"""Pick ('target', 'testFrac') from a small dict; support alternative keys."""
|
|
230
|
+
if not isinstance(cfg, dict):
|
|
231
|
+
return None, None
|
|
232
|
+
tgt = cfg.get("target") or cfg.get("Target") or cfg.get("label")
|
|
233
|
+
frac = cfg.get("testFrac", cfg.get("test_size", None))
|
|
234
|
+
try:
|
|
235
|
+
frac = float(frac) if frac is not None else None
|
|
236
|
+
except Exception:
|
|
237
|
+
frac = None
|
|
238
|
+
return tgt, frac
|
|
239
|
+
|
|
240
|
+
def _resolve_dataset_from_cfg(self, ds_cfg):
|
|
241
|
+
"""
|
|
242
|
+
Resolve (target, test_size) from datasetConfig:
|
|
243
|
+
- If isGlobal=True, take globalConfig.{target,testFrac}
|
|
244
|
+
- else take datasetConfig[hostname].{target,testFrac}
|
|
245
|
+
- fallbacks: keep current settings or defaults
|
|
246
|
+
"""
|
|
247
|
+
default_target = getattr(self, "target_name", self.df.columns[-1])
|
|
248
|
+
default_frac = getattr(self, "_prepared_key", (None, 0.2))[1] if hasattr(self, "_prepared_key") else 0.2
|
|
249
|
+
|
|
250
|
+
if not isinstance(ds_cfg, dict):
|
|
251
|
+
return default_target, default_frac
|
|
252
|
+
|
|
253
|
+
is_global = bool(ds_cfg.get("isGlobal"))
|
|
254
|
+
if is_global:
|
|
255
|
+
tgt, frac = self._pick_target_and_frac(ds_cfg.get("globalConfig", {}))
|
|
256
|
+
else:
|
|
257
|
+
host_cfg = ds_cfg.get(self.hostname)
|
|
258
|
+
if not isinstance(host_cfg, dict):
|
|
259
|
+
lower_map = {str(k).lower(): v for k, v in ds_cfg.items() if isinstance(v, dict)}
|
|
260
|
+
host_cfg = lower_map.get(self.hostname.lower())
|
|
261
|
+
tgt, frac = self._pick_target_and_frac(host_cfg or {})
|
|
262
|
+
|
|
263
|
+
target = tgt if tgt else default_target
|
|
264
|
+
test_size = frac if frac is not None else default_frac
|
|
265
|
+
test_size = max(1e-6, min(float(test_size), 0.9))
|
|
266
|
+
return target, test_size
|
|
267
|
+
|
|
268
|
+
def _ensure_prepared_from_config(self, config, dp_config=None):
|
|
269
|
+
"""Check config['datasetConfig']; rebuild splits if (target,test_size) changed."""
|
|
270
|
+
ds_cfg = config.get("dataset_config") if isinstance(config, dict) else None
|
|
271
|
+
if not isinstance(ds_cfg, dict):
|
|
272
|
+
return
|
|
273
|
+
|
|
274
|
+
target, ts = self._resolve_dataset_from_cfg(ds_cfg)
|
|
275
|
+
current = getattr(self, "_prepared_key", None)
|
|
276
|
+
desired = (target, float(ts))
|
|
277
|
+
if current != desired:
|
|
278
|
+
# Do not re-apply DP dynamically here
|
|
279
|
+
self._prepare_splits(target_name=target, test_size=ts, dp_config=None)
|
|
280
|
+
|
|
281
|
+
# --------------------------------------------------------------------------
|
|
282
|
+
# Federated API
|
|
283
|
+
# --------------------------------------------------------------------------
|
|
284
|
+
def get_parameters(self, config):
|
|
285
|
+
if self.model_type == "nn":
|
|
286
|
+
return [val.cpu().numpy() for val in self.model.state_dict().values()]
|
|
287
|
+
else:
|
|
288
|
+
return booster_to_parameters(self.bst)
|
|
289
|
+
|
|
290
|
+
def set_parameters(self, parameters):
|
|
291
|
+
if self.model_type == "nn":
|
|
292
|
+
params_dict = zip(self.model.state_dict().keys(), parameters)
|
|
293
|
+
state_dict = {k: torch.tensor(v) for k, v in params_dict}
|
|
294
|
+
self.model.load_state_dict(state_dict, strict=True)
|
|
295
|
+
else:
|
|
296
|
+
if parameters and len(parameters) > 0:
|
|
297
|
+
self.bst = parameters_to_booster(parameters)
|
|
298
|
+
|
|
299
|
+
def fit(self, parameters, config):
|
|
300
|
+
self.set_parameters(parameters)
|
|
301
|
+
|
|
302
|
+
# Allow server to override target/test_size dynamically
|
|
303
|
+
self._ensure_prepared_from_config(config, dp_config=None)
|
|
304
|
+
|
|
305
|
+
if self.model_type == "nn":
|
|
306
|
+
self.model.train()
|
|
307
|
+
local_epochs = config.get("local_epochs", 5)
|
|
308
|
+
total_loss = 0.0
|
|
309
|
+
for _ in range(local_epochs):
|
|
310
|
+
for X_batch, y_batch in self.train_loader:
|
|
311
|
+
self.optimizer.zero_grad()
|
|
312
|
+
outputs = self.model(X_batch)
|
|
313
|
+
loss = self.criterion(outputs.squeeze(), y_batch)
|
|
314
|
+
loss.backward()
|
|
315
|
+
self.optimizer.step()
|
|
316
|
+
total_loss += loss.item() * X_batch.size(0)
|
|
317
|
+
|
|
318
|
+
avg_loss = total_loss / (len(self.train_loader.dataset) * max(local_epochs, 1))
|
|
319
|
+
with torch.no_grad():
|
|
320
|
+
logits = self.model(self.X_tensor).squeeze() # train set
|
|
321
|
+
probs = torch.sigmoid(logits).cpu().numpy()
|
|
322
|
+
y_true = self.y_tensor.cpu().numpy()
|
|
323
|
+
th = config.get("threshold", 0.5)
|
|
324
|
+
binary_preds = (probs >= th).astype(int)
|
|
325
|
+
acc = accuracy_score(y_true, binary_preds)
|
|
326
|
+
auc = roc_auc_score(y_true, probs)
|
|
327
|
+
|
|
328
|
+
metrics = {
|
|
329
|
+
"train_loss": avg_loss,
|
|
330
|
+
"train_accuracy": acc,
|
|
331
|
+
"train_auc": auc,
|
|
332
|
+
}
|
|
333
|
+
return self.get_parameters(config), len(self.X_tensor), metrics
|
|
334
|
+
|
|
335
|
+
else:
|
|
336
|
+
local_rounds = int(config.get("num_local_round", config.get("xgb_rounds", self.xgb_rounds)))
|
|
337
|
+
self.bst = xgb.train(
|
|
338
|
+
self.xgb_params,
|
|
339
|
+
self.dtrain,
|
|
340
|
+
num_boost_round=local_rounds,
|
|
341
|
+
xgb_model=self.bst, # continue from global
|
|
342
|
+
)
|
|
343
|
+
preds = self.bst.predict(self.dtrain)
|
|
344
|
+
th = config.get("threshold", 0.5)
|
|
345
|
+
binary_preds = (preds >= th).astype(int)
|
|
346
|
+
acc = float((binary_preds == self.y_np).mean())
|
|
347
|
+
auc = float(roc_auc_score(self.y_np, preds)) if len(np.unique(self.y_np)) > 1 else 0.0
|
|
348
|
+
|
|
349
|
+
metrics = {"train_accuracy": acc, "train_auc": auc}
|
|
350
|
+
return self.get_parameters(config), len(self.y_np), metrics
|
|
351
|
+
|
|
352
|
+
def evaluate(self, parameters, config):
|
|
353
|
+
self.set_parameters(parameters)
|
|
354
|
+
|
|
355
|
+
# Keep eval consistent with any overridden target/test_size
|
|
356
|
+
self._ensure_prepared_from_config(config, dp_config=None)
|
|
357
|
+
|
|
358
|
+
if self.model_type == "nn":
|
|
359
|
+
self.model.eval()
|
|
360
|
+
total_loss = 0.0
|
|
361
|
+
all_probs, all_true = [], []
|
|
362
|
+
with torch.no_grad():
|
|
363
|
+
for X_batch, y_batch in self.test_loader:
|
|
364
|
+
outputs = self.model(X_batch)
|
|
365
|
+
loss = self.criterion(outputs.squeeze(), y_batch)
|
|
366
|
+
total_loss += loss.item() * X_batch.size(0)
|
|
367
|
+
probs = torch.sigmoid(outputs.squeeze()).cpu().numpy()
|
|
368
|
+
all_probs.extend(probs.tolist())
|
|
369
|
+
all_true.extend(y_batch.cpu().numpy().tolist())
|
|
370
|
+
|
|
371
|
+
avg_loss = total_loss / len(self.test_loader.dataset)
|
|
372
|
+
th = config.get("threshold", 0.5)
|
|
373
|
+
binary_preds = [1 if p >= th else 0 for p in all_probs]
|
|
374
|
+
acc = accuracy_score(all_true, binary_preds)
|
|
375
|
+
auc = roc_auc_score(all_true, all_probs)
|
|
376
|
+
metrics = {"eval_loss": avg_loss, "eval_accuracy": acc, "eval_auc": auc}
|
|
377
|
+
return float(avg_loss), len(self.test_loader.dataset), metrics
|
|
378
|
+
|
|
379
|
+
else:
|
|
380
|
+
th = config.get("threshold", 0.5)
|
|
381
|
+
preds = self.bst.predict(self.dtest)
|
|
382
|
+
binary = (preds >= th).astype(int)
|
|
383
|
+
y_true = self.y_np_test
|
|
384
|
+
acc = float((binary == y_true).mean())
|
|
385
|
+
auc = float(roc_auc_score(y_true, preds)) if len(np.unique(y_true)) > 1 else 0.0
|
|
386
|
+
metrics = {"eval_accuracy": acc, "eval_auc": auc}
|
|
387
|
+
# loss optional for XGB; return 0.0 to satisfy Flower
|
|
388
|
+
return 0.0, len(y_true), metrics
|
|
389
|
+
|
|
390
|
+
def get_properties(self, config):
|
|
391
|
+
hostname = socket.gethostname()
|
|
392
|
+
os_type = platform.system()
|
|
393
|
+
|
|
394
|
+
if self.model_type == "nn":
|
|
395
|
+
num_samples = len(self.X_tensor) # train samples
|
|
396
|
+
num_features = self.X_tensor.shape[1]
|
|
397
|
+
else:
|
|
398
|
+
num_samples = len(self.y_np) # train samples
|
|
399
|
+
num_features = self.X_np.shape[1]
|
|
400
|
+
|
|
401
|
+
features_str = ",".join(self.feature_names)
|
|
402
|
+
classes_str = ",".join(map(str, self.classes))
|
|
403
|
+
dist_str = ",".join(f"{cls}:{cnt}" for cls, cnt in self.label_counts.items())
|
|
404
|
+
|
|
405
|
+
cpu_physical = psutil.cpu_count(logical=False)
|
|
406
|
+
cpu_logical = psutil.cpu_count(logical=True)
|
|
407
|
+
total_mem_gb = round(psutil.virtual_memory().total / (1024**3), 2)
|
|
408
|
+
driver_present = shutil.which('nvidia-smi') is not None
|
|
409
|
+
gpu_count = 0
|
|
410
|
+
if GPUtil and driver_present:
|
|
411
|
+
try:
|
|
412
|
+
gpu_count = len(GPUtil.getGPUs())
|
|
413
|
+
except Exception:
|
|
414
|
+
gpu_count = 0
|
|
415
|
+
|
|
416
|
+
return {
|
|
417
|
+
"hostname": hostname,
|
|
418
|
+
"os_type": os_type,
|
|
419
|
+
"num_samples": num_samples,
|
|
420
|
+
"num_features": num_features,
|
|
421
|
+
"features": features_str,
|
|
422
|
+
"target": self.target_name,
|
|
423
|
+
"classes": classes_str,
|
|
424
|
+
"label_distribution": dist_str,
|
|
425
|
+
"cpu_physical_cores": cpu_physical,
|
|
426
|
+
"cpu_logical_cores": cpu_logical,
|
|
427
|
+
"total_memory_gb": total_mem_gb,
|
|
428
|
+
"gpu_driver_present": str(driver_present),
|
|
429
|
+
"gpu_count": gpu_count,
|
|
430
|
+
"model_type": self.model_type,
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
def start(self) -> None:
|
|
434
|
+
fl.client.start_numpy_client(server_address=self.server_address, client=self)
|
|
435
|
+
|
|
436
|
+
|
|
437
|
+
if __name__ == "__main__":
|
|
438
|
+
parser = argparse.ArgumentParser(description="Flower client with NN/XGBoost + optional DP for NN")
|
|
439
|
+
parser.add_argument("--server_address", type=str, required=True, help="ex: 127.0.0.1:8080")
|
|
440
|
+
parser.add_argument("--data_path", type=str, default="data/data.csv", help="CSV path")
|
|
441
|
+
|
|
442
|
+
# Mode
|
|
443
|
+
parser.add_argument("--model", type=str, default="nn", choices=["nn", "xgb"], help="Client model type")
|
|
444
|
+
|
|
445
|
+
# DP (NN only)
|
|
446
|
+
parser.add_argument("--dp", action="store_true", help="Activer la confidentialité différentielle (NN uniquement)")
|
|
447
|
+
parser.add_argument("--noise_multiplier", type=float, default=1.0)
|
|
448
|
+
parser.add_argument("--max_grad_norm", type=float, default=1.0)
|
|
449
|
+
parser.add_argument("--batch_size", type=int, default=32)
|
|
450
|
+
|
|
451
|
+
# XGBoost params
|
|
452
|
+
parser.add_argument("--xgb_eta", type=float, default=0.1)
|
|
453
|
+
parser.add_argument("--xgb_max_depth", type=int, default=6)
|
|
454
|
+
parser.add_argument("--xgb_subsample", type=float, default=0.8)
|
|
455
|
+
parser.add_argument("--xgb_colsample_bytree", type=float, default=0.8)
|
|
456
|
+
parser.add_argument("--xgb_rounds", type=int, default=50)
|
|
457
|
+
args = parser.parse_args()
|
|
458
|
+
|
|
459
|
+
dp_config = None
|
|
460
|
+
if args.dp and args.model == "nn":
|
|
461
|
+
dp_config = DPConfig(
|
|
462
|
+
noise_multiplier=args.noise_multiplier,
|
|
463
|
+
max_grad_norm=args.max_grad_norm,
|
|
464
|
+
batch_size=args.batch_size,
|
|
465
|
+
)
|
|
466
|
+
|
|
467
|
+
xgb_params = None
|
|
468
|
+
if args.model == "xgb":
|
|
469
|
+
xgb_params = {
|
|
470
|
+
"objective": "binary:logistic",
|
|
471
|
+
"eval_metric": "logloss",
|
|
472
|
+
"eta": args.xgb_eta,
|
|
473
|
+
"max_depth": args.xgb_max_depth,
|
|
474
|
+
"subsample": args.xgb_subsample,
|
|
475
|
+
"colsample_bytree": args.xgb_colsample_bytree,
|
|
476
|
+
"tree_method": "hist",
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
client = FlowerClient(
|
|
480
|
+
server_address=args.server_address,
|
|
481
|
+
data_path=args.data_path,
|
|
482
|
+
dp_config=dp_config,
|
|
483
|
+
model_type=args.model,
|
|
484
|
+
xgb_params=xgb_params,
|
|
485
|
+
xgb_rounds=args.xgb_rounds if args.model == "xgb" else 0,
|
|
486
|
+
)
|
|
487
|
+
client.start()
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import math
|
|
2
|
+
from typing import List, Optional, Literal, Callable, Tuple
|
|
3
|
+
import torch
|
|
4
|
+
import torch.nn as nn
|
|
5
|
+
import torch.nn.functional as F
|
|
6
|
+
|
|
7
|
+
Task = Literal["binary", "multiclass", "multilabel", "regression"]
|
|
8
|
+
|
|
9
|
+
_ACTS = {
|
|
10
|
+
"relu": nn.ReLU,
|
|
11
|
+
"gelu": nn.GELU,
|
|
12
|
+
"leaky_relu": lambda: nn.LeakyReLU(0.01),
|
|
13
|
+
"tanh": nn.Tanh,
|
|
14
|
+
"elu": nn.ELU,
|
|
15
|
+
"silu": nn.SiLU,
|
|
16
|
+
"identity": nn.Identity,
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
def _make_activation(name: str) -> nn.Module:
|
|
20
|
+
if name not in _ACTS:
|
|
21
|
+
raise ValueError(f"Unsupported activation '{name}'. Choose from {list(_ACTS)}")
|
|
22
|
+
return _ACTS[name]()
|
|
23
|
+
|
|
24
|
+
class Net(nn.Module):
|
|
25
|
+
"""
|
|
26
|
+
Flexible MLP with task-aware output.
|
|
27
|
+
- hidden_dims: e.g., [128, 64, 32]
|
|
28
|
+
- activation: 'relu' | 'gelu' | 'leaky_relu' | ...
|
|
29
|
+
- batchnorm: apply BatchNorm1d after each linear (except output)
|
|
30
|
+
- dropout: float in [0,1] or list per hidden layer
|
|
31
|
+
- task: 'binary' | 'multiclass' | 'multilabel' | 'regression'
|
|
32
|
+
- num_classes: required for 'multiclass'; for 'binary' ignore; for 'multilabel' set to label count
|
|
33
|
+
- return_logits: always True for training (recommended). Use .predict() for post-activation outputs.
|
|
34
|
+
"""
|
|
35
|
+
|
|
36
|
+
def __init__(
|
|
37
|
+
self,
|
|
38
|
+
input_dim: int,
|
|
39
|
+
hidden_dims: List[int] = [64, 32],
|
|
40
|
+
activation: str = "relu",
|
|
41
|
+
batchnorm: bool = True,
|
|
42
|
+
dropout: Optional[float | List[float]] = 0.0,
|
|
43
|
+
task: Task = "binary",
|
|
44
|
+
num_classes: Optional[int] = None,
|
|
45
|
+
output_bias: bool = True,
|
|
46
|
+
return_logits: bool = True,
|
|
47
|
+
weight_init: Literal["kaiming", "xavier", "none"] = "kaiming",
|
|
48
|
+
):
|
|
49
|
+
super().__init__()
|
|
50
|
+
self.task = task
|
|
51
|
+
self.num_classes = num_classes
|
|
52
|
+
self.return_logits = return_logits
|
|
53
|
+
self.act = activation
|
|
54
|
+
|
|
55
|
+
if task == "multiclass":
|
|
56
|
+
if not num_classes or num_classes < 2:
|
|
57
|
+
raise ValueError("For 'multiclass', num_classes >= 2 is required.")
|
|
58
|
+
output_dim = num_classes
|
|
59
|
+
elif task == "binary":
|
|
60
|
+
output_dim = 1
|
|
61
|
+
elif task == "multilabel":
|
|
62
|
+
if not num_classes or num_classes < 1:
|
|
63
|
+
raise ValueError("For 'multilabel', set num_classes = number of labels.")
|
|
64
|
+
output_dim = num_classes
|
|
65
|
+
elif task == "regression":
|
|
66
|
+
output_dim = 1
|
|
67
|
+
else:
|
|
68
|
+
raise ValueError(f"Unknown task: {task}")
|
|
69
|
+
|
|
70
|
+
# Normalize dropout to list per hidden layer
|
|
71
|
+
if isinstance(dropout, (int, float)):
|
|
72
|
+
dropout = [float(dropout)] * len(hidden_dims)
|
|
73
|
+
elif dropout is None:
|
|
74
|
+
dropout = [0.0] * len(hidden_dims)
|
|
75
|
+
elif isinstance(dropout, list):
|
|
76
|
+
if len(dropout) != len(hidden_dims):
|
|
77
|
+
raise ValueError("Length of dropout list must match hidden_dims.")
|
|
78
|
+
else:
|
|
79
|
+
raise ValueError("dropout must be float|list[float]|None")
|
|
80
|
+
|
|
81
|
+
layers = []
|
|
82
|
+
in_dim = input_dim
|
|
83
|
+
self.blocks = nn.ModuleList()
|
|
84
|
+
for i, (h, p) in enumerate(zip(hidden_dims, dropout)):
|
|
85
|
+
block = nn.ModuleDict({
|
|
86
|
+
"lin": nn.Linear(in_dim, h, bias=True),
|
|
87
|
+
"bn": nn.BatchNorm1d(h) if batchnorm else nn.Identity(),
|
|
88
|
+
"act": _make_activation(activation),
|
|
89
|
+
"drop": nn.Dropout(p) if p and p > 0 else nn.Identity(),
|
|
90
|
+
})
|
|
91
|
+
self.blocks.append(block)
|
|
92
|
+
in_dim = h
|
|
93
|
+
|
|
94
|
+
self.out = nn.Linear(in_dim, output_dim, bias=output_bias)
|
|
95
|
+
|
|
96
|
+
# Weight init
|
|
97
|
+
if weight_init != "none":
|
|
98
|
+
self.apply(lambda m: self._init_weights(m, scheme=weight_init, activation=activation))
|
|
99
|
+
|
|
100
|
+
@staticmethod
|
|
101
|
+
def _init_weights(m: nn.Module, scheme: str, activation: str):
|
|
102
|
+
if isinstance(m, nn.Linear):
|
|
103
|
+
if scheme == "kaiming":
|
|
104
|
+
nonlinearity = "leaky_relu" if activation == "leaky_relu" else "relu"
|
|
105
|
+
nn.init.kaiming_uniform_(m.weight, a=math.sqrt(5) if activation == "leaky_relu" else 0, nonlinearity=nonlinearity)
|
|
106
|
+
elif scheme == "xavier":
|
|
107
|
+
nn.init.xavier_uniform_(m.weight)
|
|
108
|
+
if m.bias is not None:
|
|
109
|
+
fan_in, _ = nn.init._calculate_fan_in_and_fan_out(m.weight)
|
|
110
|
+
bound = 1 / math.sqrt(fan_in) if fan_in > 0 else 0
|
|
111
|
+
nn.init.uniform_(m.bias, -bound, bound)
|
|
112
|
+
|
|
113
|
+
def forward(self, x: torch.Tensor) -> torch.Tensor:
|
|
114
|
+
for blk in self.blocks:
|
|
115
|
+
x = blk["lin"](x)
|
|
116
|
+
x = blk["bn"](x)
|
|
117
|
+
x = blk["act"](x)
|
|
118
|
+
x = blk["drop"](x)
|
|
119
|
+
logits = self.out(x)
|
|
120
|
+
return logits if self.return_logits else self._apply_output_activation(logits)
|
|
121
|
+
|
|
122
|
+
# Inference helpers
|
|
123
|
+
def _apply_output_activation(self, logits: torch.Tensor) -> torch.Tensor:
|
|
124
|
+
if self.task == "binary":
|
|
125
|
+
return torch.sigmoid(logits) # (B, 1)
|
|
126
|
+
elif self.task == "multiclass":
|
|
127
|
+
return F.softmax(logits, dim=-1) # (B, C)
|
|
128
|
+
elif self.task == "multilabel":
|
|
129
|
+
return torch.sigmoid(logits) # (B, L)
|
|
130
|
+
elif self.task == "regression":
|
|
131
|
+
return logits # raw regression output
|
|
132
|
+
else:
|
|
133
|
+
raise RuntimeError("Invalid task")
|
|
134
|
+
|
|
135
|
+
@torch.no_grad()
|
|
136
|
+
def predict(self, x: torch.Tensor) -> torch.Tensor:
|
|
137
|
+
"""Apply appropriate post-processing for predictions."""
|
|
138
|
+
logits = self.forward(x) if self.return_logits else x
|
|
139
|
+
probs = self._apply_output_activation(logits) if self.return_logits else logits
|
|
140
|
+
if self.task == "binary":
|
|
141
|
+
return (probs >= 0.5).long()
|
|
142
|
+
elif self.task == "multiclass":
|
|
143
|
+
return probs.argmax(dim=-1)
|
|
144
|
+
elif self.task == "multilabel":
|
|
145
|
+
return (probs >= 0.5).long()
|
|
146
|
+
elif self.task == "regression":
|
|
147
|
+
return probs
|