MEDfl 2.0.5.dev0__tar.gz → 2.0.5.dev1__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.5.dev1/MEDfl/rw/client.py +512 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/MEDfl/rw/model.py +3 -3
- medfl-2.0.5.dev1/MEDfl/rw/strategy.py +199 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/MEDfl.egg-info/PKG-INFO +33 -2
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/PKG-INFO +33 -2
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/setup.py +1 -1
- MEDfl-2.0.5.dev0/MEDfl/rw/client.py +0 -487
- MEDfl-2.0.5.dev0/MEDfl/rw/strategy.py +0 -429
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/.github/workflows/main.yml +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/.gitignore +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/.idea/.gitignore +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/.idea/MEDfl.iml +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/.idea/inspectionProfiles/profiles_settings.xml +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/.idea/misc.xml +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/.idea/modules.xml +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/.idea/vcs.xml +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/LICENSE +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/MEDfl/LearningManager/__init__.py +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/MEDfl/LearningManager/client.py +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/MEDfl/LearningManager/dynamicModal.py +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/MEDfl/LearningManager/federated_dataset.py +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/MEDfl/LearningManager/flpipeline.py +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/MEDfl/LearningManager/model.py +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/MEDfl/LearningManager/params.yaml +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/MEDfl/LearningManager/params_optimiser.py +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/MEDfl/LearningManager/plot.py +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/MEDfl/LearningManager/server.py +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/MEDfl/LearningManager/strategy.py +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/MEDfl/LearningManager/utils.py +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/MEDfl/NetManager/__init__.py +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/MEDfl/NetManager/database_connector.py +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/MEDfl/NetManager/dataset.py +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/MEDfl/NetManager/flsetup.py +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/MEDfl/NetManager/net_helper.py +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/MEDfl/NetManager/net_manager_queries.py +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/MEDfl/NetManager/network.py +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/MEDfl/NetManager/node.py +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/MEDfl/__init__.py +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/MEDfl/rw/__init__.py +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/MEDfl/rw/server.py +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/MEDfl/scripts/__init__.py +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/MEDfl/scripts/base.py +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/MEDfl/scripts/create_db.py +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/MEDfl.egg-info/SOURCES.txt +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/MEDfl.egg-info/dependency_links.txt +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/MEDfl.egg-info/requires.txt +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/MEDfl.egg-info/top_level.txt +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/README.md +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/alembic/README +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/alembic/__init__.py +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/alembic/__pycache__/env.cpython-38.pyc +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/alembic/alembic_logging.ini +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/alembic/debug.log +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/alembic/env.py +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/alembic/script.py.mako +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/alembic/versions/__pycache__/b159ee510a90_initial.cpython-38.pyc +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/alembic/versions/b159ee510a90_initial.py +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/alembic.ini +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/Makefile +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/_build/.buildinfo +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/_build/.doctrees/Medfl.LearningManager.doctree +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/_build/.doctrees/Medfl.NetManager.doctree +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/_build/.doctrees/Medfl.doctree +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/_build/.doctrees/environment.pickle +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/_build/.doctrees/index.doctree +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/_build/.doctrees/modules.doctree +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/_build/.nojekyll +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/_build/Medfl.LearningManager.html +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/_build/Medfl.NetManager.html +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/_build/Medfl.html +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/_build/_modules/Medfl/LearningManager/client.html +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/_build/_modules/Medfl/LearningManager/dynamicModal.html +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/_build/_modules/Medfl/LearningManager/federated_dataset.html +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/_build/_modules/Medfl/LearningManager/flpipeline.html +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/_build/_modules/Medfl/LearningManager/model.html +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/_build/_modules/Medfl/LearningManager/plot.html +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/_build/_modules/Medfl/LearningManager/server.html +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/_build/_modules/Medfl/LearningManager/strategy.html +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/_build/_modules/Medfl/LearningManager/utils.html +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/_build/_modules/Medfl/NetManager/dataset.html +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/_build/_modules/Medfl/NetManager/flsetup.html +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/_build/_modules/Medfl/NetManager/net_helper.html +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/_build/_modules/Medfl/NetManager/network.html +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/_build/_modules/Medfl/NetManager/node.html +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/_build/_modules/index.html +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/_build/_sources/Medfl.LearningManager.rst.txt +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/_build/_sources/Medfl.NetManager.rst.txt +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/_build/_sources/Medfl.rst.txt +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/_build/_sources/index.rst.txt +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/_build/_sources/modules.rst.txt +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/_build/_static/MEDomics.png +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/_build/_static/_sphinx_javascript_frameworks_compat.js +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/_build/_static/basic.css +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/_build/_static/css/badge_only.css +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/_build/_static/css/fonts/Roboto-Slab-Bold.woff +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/_build/_static/css/fonts/Roboto-Slab-Bold.woff2 +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/_build/_static/css/fonts/Roboto-Slab-Regular.woff +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/_build/_static/css/fonts/Roboto-Slab-Regular.woff2 +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/_build/_static/css/fonts/fontawesome-webfont.eot +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/_build/_static/css/fonts/fontawesome-webfont.svg +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/_build/_static/css/fonts/fontawesome-webfont.ttf +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/_build/_static/css/fonts/fontawesome-webfont.woff +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/_build/_static/css/fonts/fontawesome-webfont.woff2 +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/_build/_static/css/fonts/lato-bold-italic.woff +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/_build/_static/css/fonts/lato-bold-italic.woff2 +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/_build/_static/css/fonts/lato-bold.woff +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/_build/_static/css/fonts/lato-bold.woff2 +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/_build/_static/css/fonts/lato-normal-italic.woff +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/_build/_static/css/fonts/lato-normal-italic.woff2 +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/_build/_static/css/fonts/lato-normal.woff +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/_build/_static/css/fonts/lato-normal.woff2 +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/_build/_static/css/theme.css +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/_build/_static/dark_mode_css/custom.css +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/_build/_static/dark_mode_css/dark.css +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/_build/_static/dark_mode_css/general.css +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/_build/_static/dark_mode_js/default_dark.js +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/_build/_static/dark_mode_js/default_light.js +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/_build/_static/dark_mode_js/theme_switcher.js +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/_build/_static/doctools.js +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/_build/_static/documentation_options.js +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/_build/_static/file.png +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/_build/_static/jquery.js +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/_build/_static/js/badge_only.js +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/_build/_static/js/html5shiv-printshiv.min.js +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/_build/_static/js/html5shiv.min.js +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/_build/_static/js/theme.js +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/_build/_static/language_data.js +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/_build/_static/minus.png +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/_build/_static/plus.png +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/_build/_static/pygments.css +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/_build/_static/searchtools.js +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/_build/_static/sphinx_highlight.js +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/_build/genindex.html +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/_build/index.html +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/_build/modules.html +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/_build/objects.inv +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/_build/py-modindex.html +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/_build/search.html +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/_build/searchindex.js +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/doctrees/Documentation.doctree +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/doctrees/Installation.doctree +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/doctrees/Medfl.LearningManager.doctree +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/doctrees/Medfl.NetManager.doctree +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/doctrees/Medfl.doctree +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/doctrees/configuration_file.doctree +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/doctrees/environment.pickle +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/doctrees/index.doctree +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/doctrees/modules.doctree +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/doctrees/tutorials.doctree +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/html/.buildinfo +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/html/.nojekyll +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/html/Documentation.html +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/html/Installation.html +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/html/Medfl.LearningManager.html +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/html/Medfl.NetManager.html +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/html/Medfl.html +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/html/_images/FTL_comp.png +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/html/_images/LearningManager.png +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/html/_images/MEDfl_Diagramm.png +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/html/_images/NetManager_Diagramm.png +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/html/_images/learningresults.png +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/html/_images/mysqllogo.png +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/html/_images/phpmyadmin.png +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/html/_images/wampLogo.png +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/html/_images/xampplogo.png +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/html/_modules/index.html +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/html/_sources/Documentation.rst.txt +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/html/_sources/Installation.rst.txt +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/html/_sources/Medfl.LearningManager.rst.txt +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/html/_sources/Medfl.NetManager.rst.txt +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/html/_sources/Medfl.rst.txt +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/html/_sources/configuration_file.rst.txt +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/html/_sources/index.rst.txt +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/html/_sources/modules.rst.txt +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/html/_sources/tutorials.rst.txt +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/html/_static/MEDomics.png +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/html/_static/_sphinx_javascript_frameworks_compat.js +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/html/_static/basic.css +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/html/_static/css/badge_only.css +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/html/_static/css/fonts/Roboto-Slab-Bold.woff +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/html/_static/css/fonts/Roboto-Slab-Bold.woff2 +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/html/_static/css/fonts/Roboto-Slab-Regular.woff +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/html/_static/css/fonts/Roboto-Slab-Regular.woff2 +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/html/_static/css/fonts/fontawesome-webfont.eot +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/html/_static/css/fonts/fontawesome-webfont.svg +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/html/_static/css/fonts/fontawesome-webfont.ttf +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/html/_static/css/fonts/fontawesome-webfont.woff +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/html/_static/css/fonts/fontawesome-webfont.woff2 +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/html/_static/css/fonts/lato-bold-italic.woff +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/html/_static/css/fonts/lato-bold-italic.woff2 +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/html/_static/css/fonts/lato-bold.woff +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/html/_static/css/fonts/lato-bold.woff2 +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/html/_static/css/fonts/lato-normal-italic.woff +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/html/_static/css/fonts/lato-normal-italic.woff2 +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/html/_static/css/fonts/lato-normal.woff +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/html/_static/css/fonts/lato-normal.woff2 +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/html/_static/css/theme.css +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/html/_static/custom.css +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/html/_static/dark_mode_css/custom.css +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/html/_static/dark_mode_css/dark.css +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/html/_static/dark_mode_css/general.css +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/html/_static/dark_mode_js/default_dark.js +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/html/_static/dark_mode_js/default_light.js +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/html/_static/dark_mode_js/theme_switcher.js +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/html/_static/doctools.js +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/html/_static/documentation_options.js +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/html/_static/file.png +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/html/_static/jquery-3.6.0.js +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/html/_static/jquery.js +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/html/_static/js/badge_only.js +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/html/_static/js/html5shiv-printshiv.min.js +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/html/_static/js/html5shiv.min.js +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/html/_static/js/theme.js +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/html/_static/language_data.js +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/html/_static/minus.png +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/html/_static/plus.png +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/html/_static/pygments.css +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/html/_static/searchtools.js +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/html/_static/sphinx_highlight.js +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/html/_static/underscore-1.13.1.js +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/html/_static/underscore.js +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/html/configuration_file.html +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/html/genindex.html +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/html/index.html +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/html/modules.html +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/html/objects.inv +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/html/py-modindex.html +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/html/search.html +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/html/searchindex.js +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/build/html/tutorials.html +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/make.bat +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/source/Documentation.rst +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/source/Installation.rst +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/source/Medfl.LearningManager.rst +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/source/Medfl.NetManager.rst +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/source/Medfl.rst +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/source/_static/custom.css +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/source/conf.py +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/source/configuration_file.rst +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/source/figures/Images/FL_gen.png +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/source/figures/Images/FTL_comp.png +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/source/figures/Images/FlDatasetDiagramm.png +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/source/figures/Images/GDP.png +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/source/figures/Images/LDP.png +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/source/figures/Images/LearningManager.png +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/source/figures/Images/MEDfl_Diagramm.png +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/source/figures/Images/Modelinit.png +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/source/figures/Images/NetManager_Diagramm.png +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/source/figures/Images/NetworkCreation.png +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/source/figures/Images/createServer.png +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/source/figures/Images/learningresults.png +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/source/figures/Images/logos/mysqllogo.png +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/source/figures/Images/logos/phpmyadmin.png +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/source/figures/Images/logos/wampLogo.png +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/source/figures/Images/logos/xampplogo.png +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/source/figures/Images/modeltest.png +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/source/figures/Images/netMan.png +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/source/figures/Images/nodecreation.png +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/source/figures/Images/pipeline.png +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/source/figures/Images/strategy.png +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/source/figures/MEDomics.png +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/source/index.rst +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/source/modules.rst +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/docs/source/tutorials.rst +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/global_params.yaml +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/medfl.egg-info/PKG-INFO +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/medfl.egg-info/SOURCES.txt +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/medfl.egg-info/dependency_links.txt +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/medfl.egg-info/requires.txt +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/medfl.egg-info/top_level.txt +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/notebooks/.ipynb_checkpoints/trainedModels/binary_classifier.pth +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/notebooks/.ipynb_checkpoints/trainedModels/eicu_binary_classifier.pth +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/notebooks/.ipynb_checkpoints/trainedModels/grid_search_classifier.pth +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/notebooks/.ipynb_checkpoints/trainedModels/new_binary_classifier.pth +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/notebooks/.ipynb_checkpoints/trainedModels/updated_model.pth +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/notebooks/First_Tuto.ipynb +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/notebooks/Images/FL_gen.png +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/notebooks/Images/FTL_comp.png +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/notebooks/Images/FlDatasetDiagramm.png +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/notebooks/Images/GDP.png +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/notebooks/Images/LDP.png +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/notebooks/Images/LearningManager.png +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/notebooks/Images/MEDfl_Diagramm.png +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/notebooks/Images/MEDfl_bachmarking_plan.png +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/notebooks/Images/Modelinit.png +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/notebooks/Images/NetManager_Diagramm.png +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/notebooks/Images/NetworkCreation.png +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/notebooks/Images/createServer.png +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/notebooks/Images/learningresults.png +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/notebooks/Images/logos/mysqllogo.png +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/notebooks/Images/logos/phpmyadmin.png +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/notebooks/Images/logos/wampLogo.png +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/notebooks/Images/logos/xampplogo.png +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/notebooks/Images/modeltest.png +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/notebooks/Images/netMan.png +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/notebooks/Images/nodecreation.png +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/notebooks/Images/optuna_optim_diag.png +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/notebooks/Images/pipeline.png +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/notebooks/Images/strategy.png +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/notebooks/banchmarking/MEDfl_benchmarks.ipynb +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/notebooks/banchmarking/banchmarking_plan.md +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/notebooks/banchmarking/benchmarks_results.txt +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/notebooks/banchmarking/network_architecture/net_bachmarking_conf_1.ipynb +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/notebooks/banchmarking/network_architecture/net_bachmarking_conf_2.ipynb +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/notebooks/banchmarking/transfer_learning/TL_activated.ipynb +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/notebooks/banchmarking/transfer_learning/TL_dectivated.ipynb +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/notebooks/data/chunk_1.csv +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/notebooks/data/chunk_2.csv +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/notebooks/data/chunk_3.csv +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/notebooks/data/config_1/part_1.csv +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/notebooks/data/config_1/part_2.csv +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/notebooks/data/config_1/part_3.csv +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/notebooks/data/config_1/test_1.csv +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/notebooks/data/config_1/test_2.csv +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/notebooks/data/eicu_sapsii_data.csv +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/notebooks/data/eicu_sapsii_data_test.csv +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/notebooks/data/eicu_sapsii_data_test_1.csv +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/notebooks/data/masterDataSet/Mimic_ouael.csv +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/notebooks/data/masterDataSet/Mimic_train.csv +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/notebooks/data/masterDataSet/eICU.csv +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/notebooks/data/nodesData/output_1.csv +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/notebooks/data/nodesData/output_2.csv +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/notebooks/data/nodesData/output_3.csv +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/notebooks/data/nodesData/output_4.csv +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/notebooks/data/nodesData/output_5.csv +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/notebooks/data/test_1.csv +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/notebooks/data/test_2.csv +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/notebooks/data/test_3.csv +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/notebooks/data/validation/Mimic_validation.csv +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/notebooks/eicu_test.csv +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/notebooks/eicu_test_1.csv +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/notebooks/eicu_test_2.csv +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/notebooks/eicu_test_3.csv +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/notebooks/sapsii_score_knnimputed_eicu.csv +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/notebooks/tutorial/1_DB.ipynb +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/notebooks/tutorial/2_NetManager.ipynb +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/notebooks/tutorial/3_TransferLearning copy.ipynb +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/notebooks/tutorial/3_TransferLearning.ipynb +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/notebooks/tutorial/4_LearningManager.ipynb +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/notebooks/tutorial/5_LearningResults.ipynb +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/notebooks/tutorial/6_ModelChoice.ipynb +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/notebooks/tutorial/7_ParamsOptimiser.ipynb +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/notebooks/tutorial/8_complete_tutorial.ipynb +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/notebooks/tutorial/newplot2.png +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/notebooks/tutorial/newplot4.png +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/requirements.txt +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/setup.cfg +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/setup_mysql.sh +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/tests/__init__.py +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/tests/__pycache__/test_dataset.cpython-38.pyc +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/tests/__pycache__/test_federated_dataset.cpython-38.pyc +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/tests/__pycache__/test_flpipeline.cpython-38.pyc +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/tests/__pycache__/test_flsetup.cpython-38.pyc +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/tests/__pycache__/test_network.cpython-38.pyc +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/tests/__pycache__/test_node.cpython-38.pyc +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/tests/test_dataset.py +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/tests/test_federated_dataset.py +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/tests/test_flpipeline.py +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/tests/test_flsetup.py +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/tests/test_network.py +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/tests/test_node.py +0 -0
- {MEDfl-2.0.5.dev0 → medfl-2.0.5.dev1}/workflows/migration.yml +0 -0
|
@@ -0,0 +1,512 @@
|
|
|
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
|
+
|
|
25
|
+
class DPConfig:
|
|
26
|
+
"""
|
|
27
|
+
Configuration for differential privacy.
|
|
28
|
+
|
|
29
|
+
Attributes:
|
|
30
|
+
noise_multiplier (float): Noise multiplier for DP.
|
|
31
|
+
max_grad_norm (float): Maximum gradient norm for clipping.
|
|
32
|
+
batch_size (int): Batch size for training.
|
|
33
|
+
secure_rng (bool): Use a secure random generator.
|
|
34
|
+
"""
|
|
35
|
+
|
|
36
|
+
def __init__(
|
|
37
|
+
self,
|
|
38
|
+
noise_multiplier: float = 1.0,
|
|
39
|
+
max_grad_norm: float = 1.0,
|
|
40
|
+
batch_size: int = 32,
|
|
41
|
+
secure_rng: bool = False,
|
|
42
|
+
):
|
|
43
|
+
self.noise_multiplier = noise_multiplier
|
|
44
|
+
self.max_grad_norm = max_grad_norm
|
|
45
|
+
self.batch_size = batch_size
|
|
46
|
+
self.secure_rng = secure_rng
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
class FlowerClient(fl.client.NumPyClient):
|
|
50
|
+
def __init__(
|
|
51
|
+
self,
|
|
52
|
+
server_address: str,
|
|
53
|
+
data_path: str = "data/data.csv",
|
|
54
|
+
dp_config: DPConfig = None,
|
|
55
|
+
# NEW (optional client overrides; do NOT remove old args)
|
|
56
|
+
val_frac: float | None = None,
|
|
57
|
+
test_frac: float | None = None,
|
|
58
|
+
id_col: str | None = None,
|
|
59
|
+
test_ids: str | None = None,
|
|
60
|
+
seed: int = 42,
|
|
61
|
+
):
|
|
62
|
+
self.server_address = server_address
|
|
63
|
+
self.dp_config = dp_config
|
|
64
|
+
self.client_val_frac = val_frac
|
|
65
|
+
self.client_test_frac = test_frac
|
|
66
|
+
self.id_col = id_col
|
|
67
|
+
self.test_ids = test_ids
|
|
68
|
+
self.seed = seed
|
|
69
|
+
|
|
70
|
+
# Load the CSV once; actual column selection happens on first fit using server config
|
|
71
|
+
self._df = pd.read_csv(data_path)
|
|
72
|
+
|
|
73
|
+
# Defaults used only for get_properties BEFORE first fit (last column target)
|
|
74
|
+
self.feature_names = self._df.columns[:-1].tolist()
|
|
75
|
+
self.target_name = self._df.columns[-1]
|
|
76
|
+
self.label_counts = self._df[self.target_name].value_counts().to_dict()
|
|
77
|
+
self.classes = sorted(self.label_counts.keys())
|
|
78
|
+
|
|
79
|
+
# Tensors for metrics before first fit (fallback to all-but-last as features)
|
|
80
|
+
X_default = self._df.iloc[:, :-1].values
|
|
81
|
+
y_default = self._df.iloc[:, -1].values
|
|
82
|
+
self.X_tensor = torch.tensor(X_default, dtype=torch.float32)
|
|
83
|
+
self.y_tensor = torch.tensor(y_default, dtype=torch.float32)
|
|
84
|
+
|
|
85
|
+
# Placeholders; we lazily build loaders/model on the first fit when we see server config
|
|
86
|
+
self.train_loader: DataLoader | None = None
|
|
87
|
+
self.val_loader: DataLoader | None = None
|
|
88
|
+
self.test_loader: DataLoader | None = None
|
|
89
|
+
|
|
90
|
+
self.model: Net | None = None
|
|
91
|
+
self.criterion = nn.BCEWithLogitsLoss()
|
|
92
|
+
self.optimizer: optim.Optimizer | None = None
|
|
93
|
+
|
|
94
|
+
# Effective settings (filled at first fit)
|
|
95
|
+
self.effective_features: list[str] = self.feature_names[:]
|
|
96
|
+
self.effective_target: str = self.target_name
|
|
97
|
+
self.effective_val_frac: float = float(self.client_val_frac) if self.client_val_frac is not None else 0.0
|
|
98
|
+
self.effective_test_frac: float = float(self.client_test_frac) if self.client_test_frac is not None else 0.0
|
|
99
|
+
|
|
100
|
+
self._initialized = False
|
|
101
|
+
self._dp_attached = False # to avoid wrapping twice
|
|
102
|
+
|
|
103
|
+
# ---------- helpers
|
|
104
|
+
|
|
105
|
+
def _mk_loader(self, X: np.ndarray, y: np.ndarray, batch_size: int, shuffle: bool) -> DataLoader:
|
|
106
|
+
x_t = torch.tensor(X, dtype=torch.float32)
|
|
107
|
+
y_t = torch.tensor(y, dtype=torch.float32)
|
|
108
|
+
return DataLoader(TensorDataset(x_t, y_t), batch_size=batch_size, shuffle=shuffle)
|
|
109
|
+
|
|
110
|
+
def _lazy_init_from_server_config(self, config: dict):
|
|
111
|
+
"""
|
|
112
|
+
Build model and (train, val, test) loaders once, using:
|
|
113
|
+
- Server-enforced schema: config['features'] (comma-separated), config['target']
|
|
114
|
+
- Split fractions: client overrides win; else use server's val_fraction/test_fraction
|
|
115
|
+
"""
|
|
116
|
+
# ---------- schema from server (enforced if provided)
|
|
117
|
+
srv_features = (config.get("features") or "").strip()
|
|
118
|
+
srv_target = (config.get("target") or "").strip()
|
|
119
|
+
print(f"[Client] Initializing with server schema: features='{srv_features}', target='{srv_target}'")
|
|
120
|
+
|
|
121
|
+
if srv_target:
|
|
122
|
+
if srv_target not in self._df.columns:
|
|
123
|
+
raise ValueError(f"Server-specified target '{srv_target}' not in CSV columns {list(self._df.columns)}")
|
|
124
|
+
target_col = srv_target
|
|
125
|
+
else:
|
|
126
|
+
target_col = self._df.columns[-1] # fallback (keeps backward compatibility)
|
|
127
|
+
|
|
128
|
+
if srv_features:
|
|
129
|
+
feat_cols = [c.strip() for c in srv_features.split(",") if c.strip()]
|
|
130
|
+
missing = [c for c in feat_cols if c not in self._df.columns]
|
|
131
|
+
if missing:
|
|
132
|
+
raise ValueError(f"Server-specified feature(s) not found in CSV: {missing}")
|
|
133
|
+
else:
|
|
134
|
+
feat_cols = [c for c in self._df.columns if c != target_col]
|
|
135
|
+
|
|
136
|
+
# ---------- fractions: client overrides > server defaults > fallback (0.10/0.10)
|
|
137
|
+
srv_val = config.get("val_fraction", None)
|
|
138
|
+
srv_test = config.get("test_fraction", None)
|
|
139
|
+
val_frac = self.client_val_frac if self.client_val_frac is not None else (float(srv_val) if srv_val is not None else 0.10)
|
|
140
|
+
test_frac = self.client_test_frac if self.client_test_frac is not None else (float(srv_test) if srv_test is not None else 0.10)
|
|
141
|
+
|
|
142
|
+
if not (0.0 <= val_frac < 1.0):
|
|
143
|
+
raise ValueError(f"Invalid val_frac: {val_frac} (must be 0 <= val_frac < 1)")
|
|
144
|
+
|
|
145
|
+
# ---------- extract arrays with the enforced schema
|
|
146
|
+
X_all = self._df[feat_cols].values
|
|
147
|
+
y_all = self._df[target_col].values
|
|
148
|
+
|
|
149
|
+
# Keep tensors for global metrics logging (same behavior as before)
|
|
150
|
+
self.X_tensor = torch.tensor(X_all, dtype=torch.float32)
|
|
151
|
+
self.y_tensor = torch.tensor(y_all, dtype=torch.float32)
|
|
152
|
+
|
|
153
|
+
# ---------- split
|
|
154
|
+
if self.test_ids and self.test_ids.strip(): # ID-based mode
|
|
155
|
+
print("[Client] Using ID-based test selection")
|
|
156
|
+
test_ids_list = [i.strip() for i in self.test_ids.split(',') if i.strip()]
|
|
157
|
+
|
|
158
|
+
if self.id_col and self.id_col in self._df.columns:
|
|
159
|
+
id_series = self._df[self.id_col]
|
|
160
|
+
else:
|
|
161
|
+
print(f"[Client] Falling back to line numbers (index) as IDs since id_col='{self.id_col}' is invalid or not provided")
|
|
162
|
+
id_series = self._df.index
|
|
163
|
+
try:
|
|
164
|
+
test_ids_list = [int(i) for i in test_ids_list]
|
|
165
|
+
except ValueError:
|
|
166
|
+
raise ValueError("Test IDs must be integers when using line numbers as IDs")
|
|
167
|
+
|
|
168
|
+
test_mask = id_series.isin(test_ids_list)
|
|
169
|
+
if not test_mask.any():
|
|
170
|
+
print("[Client] Warning: No matching IDs found for test set; it will be empty")
|
|
171
|
+
|
|
172
|
+
X_test = X_all[test_mask]
|
|
173
|
+
y_test = y_all[test_mask]
|
|
174
|
+
X_trval = X_all[~test_mask]
|
|
175
|
+
y_trval = y_all[~test_mask]
|
|
176
|
+
|
|
177
|
+
actual_test_frac = len(y_test) / len(y_all) if len(y_all) > 0 else 0.0
|
|
178
|
+
if val_frac + actual_test_frac >= 1.0:
|
|
179
|
+
raise ValueError(f"Validation fraction {val_frac} + actual test fraction {actual_test_frac} >= 1.0")
|
|
180
|
+
|
|
181
|
+
self.effective_test_frac = actual_test_frac # For logging
|
|
182
|
+
|
|
183
|
+
else: # Fraction-based mode (existing)
|
|
184
|
+
if not (0.0 <= test_frac < 1.0 and (val_frac + test_frac) < 1.0):
|
|
185
|
+
raise ValueError(f"Invalid fractions: val={val_frac}, test={test_frac} (require 0 <= val,test < 1 and val+test < 1)")
|
|
186
|
+
|
|
187
|
+
strat_all = y_all if len(np.unique(y_all)) > 1 else None
|
|
188
|
+
X_trval, X_test, y_trval, y_test = train_test_split(
|
|
189
|
+
X_all, y_all, test_size=test_frac, random_state=self.seed, stratify=strat_all
|
|
190
|
+
)
|
|
191
|
+
|
|
192
|
+
# Split val from trval (common to both modes)
|
|
193
|
+
if val_frac > 0 and len(y_trval) > 0:
|
|
194
|
+
actual_test_frac = len(y_test) / len(y_all) if len(y_all) > 0 else 0.0
|
|
195
|
+
rel_val = val_frac / (1.0 - actual_test_frac) if (1.0 - actual_test_frac) > 0 else 0.0
|
|
196
|
+
strat_tr = y_trval if len(np.unique(y_trval)) > 1 else None
|
|
197
|
+
X_train, X_val, y_train, y_val = train_test_split(
|
|
198
|
+
X_trval, y_trval, test_size=rel_val, random_state=self.seed, stratify=strat_tr
|
|
199
|
+
)
|
|
200
|
+
else:
|
|
201
|
+
X_train, y_train = X_trval, y_trval
|
|
202
|
+
X_val, y_val = np.empty((0, X_all.shape[1])), np.empty((0,))
|
|
203
|
+
|
|
204
|
+
# ---------- build loaders
|
|
205
|
+
batch_size = self.dp_config.batch_size if self.dp_config else 32
|
|
206
|
+
self.train_loader = self._mk_loader(X_train, y_train, batch_size, shuffle=True)
|
|
207
|
+
self.val_loader = self._mk_loader(X_val, y_val, batch_size, shuffle=False) if len(y_val) else None
|
|
208
|
+
self.test_loader = self._mk_loader(X_test, y_test, batch_size, shuffle=False)
|
|
209
|
+
|
|
210
|
+
# ---------- model/optimizer
|
|
211
|
+
input_dim = X_all.shape[1]
|
|
212
|
+
self.model = Net(input_dim)
|
|
213
|
+
self.optimizer = optim.SGD(self.model.parameters(), lr=0.01)
|
|
214
|
+
|
|
215
|
+
# ---------- attach DP (same behavior as before; only wraps the train loader)
|
|
216
|
+
if self.dp_config and not self._dp_attached:
|
|
217
|
+
try:
|
|
218
|
+
from opacus import PrivacyEngine
|
|
219
|
+
privacy_engine = PrivacyEngine()
|
|
220
|
+
(self.model, self.optimizer, self.train_loader) = privacy_engine.make_private(
|
|
221
|
+
module=self.model,
|
|
222
|
+
optimizer=self.optimizer,
|
|
223
|
+
data_loader=self.train_loader,
|
|
224
|
+
noise_multiplier=self.dp_config.noise_multiplier,
|
|
225
|
+
max_grad_norm=self.dp_config.max_grad_norm,
|
|
226
|
+
secure_rng=self.dp_config.secure_rng,
|
|
227
|
+
)
|
|
228
|
+
self._dp_attached = True
|
|
229
|
+
except ImportError:
|
|
230
|
+
print("Opacus non installé : exécution sans DP.")
|
|
231
|
+
|
|
232
|
+
# ---------- record effective settings
|
|
233
|
+
self.effective_features = feat_cols
|
|
234
|
+
self.effective_target = target_col
|
|
235
|
+
self.effective_val_frac = float(val_frac)
|
|
236
|
+
# effective_test_frac already set above if ID mode; otherwise use the input
|
|
237
|
+
if self.test_ids and self.test_ids.strip():
|
|
238
|
+
pass # Already set
|
|
239
|
+
else:
|
|
240
|
+
self.effective_test_frac = float(test_frac)
|
|
241
|
+
|
|
242
|
+
self._initialized = True
|
|
243
|
+
print(f"[Client] Initialized with features={feat_cols}, target={target_col}, val={val_frac}, test={self.effective_test_frac}")
|
|
244
|
+
|
|
245
|
+
# ---------- FL API
|
|
246
|
+
|
|
247
|
+
def get_parameters(self, config):
|
|
248
|
+
# Ensure the model/dataloaders are built before the very first call
|
|
249
|
+
if not self._initialized:
|
|
250
|
+
# Use server config if provided; otherwise fall back to last-col target/all features
|
|
251
|
+
try:
|
|
252
|
+
self._lazy_init_from_server_config(config if isinstance(config, dict) else {})
|
|
253
|
+
except Exception as e:
|
|
254
|
+
# As a last resort, initialize with local defaults so Flower can proceed
|
|
255
|
+
# (server-enforced schema will still be used on first fit if present)
|
|
256
|
+
if not self._initialized:
|
|
257
|
+
self._lazy_init_from_server_config({})
|
|
258
|
+
return [val.cpu().numpy() for val in self.model.state_dict().values()]
|
|
259
|
+
|
|
260
|
+
def set_parameters(self, parameters):
|
|
261
|
+
params_dict = zip(self.model.state_dict().keys(), parameters)
|
|
262
|
+
state_dict = {k: torch.tensor(v) for k, v in params_dict}
|
|
263
|
+
self.model.load_state_dict(state_dict, strict=True)
|
|
264
|
+
|
|
265
|
+
def fit(self, parameters, config):
|
|
266
|
+
# Lazy init when we see the server config for the first time
|
|
267
|
+
if not self._initialized:
|
|
268
|
+
self._lazy_init_from_server_config(config)
|
|
269
|
+
|
|
270
|
+
self.set_parameters(parameters)
|
|
271
|
+
self.model.train()
|
|
272
|
+
|
|
273
|
+
local_epochs = config.get("local_epochs", 5)
|
|
274
|
+
total_loss = 0.0
|
|
275
|
+
print(f"Training for {local_epochs} epochs...")
|
|
276
|
+
|
|
277
|
+
for epoch in range(local_epochs):
|
|
278
|
+
print(f"Epoch {epoch + 1}/{local_epochs}")
|
|
279
|
+
for X_batch, y_batch in self.train_loader:
|
|
280
|
+
self.optimizer.zero_grad()
|
|
281
|
+
outputs = self.model(X_batch)
|
|
282
|
+
loss = self.criterion(outputs.squeeze(), y_batch)
|
|
283
|
+
loss.backward()
|
|
284
|
+
self.optimizer.step()
|
|
285
|
+
total_loss += loss.item() * X_batch.size(0)
|
|
286
|
+
|
|
287
|
+
avg_loss = total_loss / (len(self.train_loader.dataset) * local_epochs)
|
|
288
|
+
|
|
289
|
+
# Compute metrics on FULL data (keeps your previous behavior)
|
|
290
|
+
with torch.no_grad():
|
|
291
|
+
logits = self.model(self.X_tensor).squeeze()
|
|
292
|
+
probs = torch.sigmoid(logits).cpu().numpy()
|
|
293
|
+
y_true = self.y_tensor.cpu().numpy()
|
|
294
|
+
binary_preds = (probs >= 0.5).astype(int)
|
|
295
|
+
try:
|
|
296
|
+
auc = roc_auc_score(y_true, probs)
|
|
297
|
+
except Exception:
|
|
298
|
+
auc = float("nan")
|
|
299
|
+
acc = accuracy_score(y_true, binary_preds)
|
|
300
|
+
|
|
301
|
+
hostname = socket.gethostname()
|
|
302
|
+
os_type = platform.system()
|
|
303
|
+
metrics = {
|
|
304
|
+
"hostname": hostname,
|
|
305
|
+
"os_type": os_type,
|
|
306
|
+
"train_loss": avg_loss,
|
|
307
|
+
"train_accuracy": acc,
|
|
308
|
+
"train_auc": auc,
|
|
309
|
+
# Helpful for debugging/visibility
|
|
310
|
+
"features": ",".join(self.effective_features),
|
|
311
|
+
"target": self.effective_target,
|
|
312
|
+
"val_fraction": self.effective_val_frac,
|
|
313
|
+
"test_fraction": self.effective_test_frac,
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
return self.get_parameters(config), len(self.train_loader.dataset), metrics
|
|
317
|
+
|
|
318
|
+
def evaluate(self, parameters, config):
|
|
319
|
+
# Ensure initialized (in case server calls evaluate before fit on round 1)
|
|
320
|
+
if not self._initialized:
|
|
321
|
+
self._lazy_init_from_server_config(config)
|
|
322
|
+
|
|
323
|
+
self.set_parameters(parameters)
|
|
324
|
+
self.model.eval()
|
|
325
|
+
|
|
326
|
+
# Evaluate on TEST split (not the training loader)
|
|
327
|
+
total_loss = 0.0
|
|
328
|
+
all_probs, all_true = [], []
|
|
329
|
+
with torch.no_grad():
|
|
330
|
+
for X_batch, y_batch in self.test_loader:
|
|
331
|
+
outputs = self.model(X_batch)
|
|
332
|
+
loss = self.criterion(outputs.squeeze(), y_batch)
|
|
333
|
+
total_loss += loss.item() * X_batch.size(0)
|
|
334
|
+
probs = torch.sigmoid(outputs.squeeze()).cpu().numpy()
|
|
335
|
+
all_probs.extend(probs.tolist())
|
|
336
|
+
all_true.extend(y_batch.cpu().numpy().tolist())
|
|
337
|
+
|
|
338
|
+
avg_loss = total_loss / len(self.test_loader.dataset) if len(self.test_loader.dataset) > 0 else 0.0
|
|
339
|
+
binary_preds = [1 if p >= 0.5 else 0 for p in all_probs]
|
|
340
|
+
try:
|
|
341
|
+
auc = roc_auc_score(all_true, all_probs)
|
|
342
|
+
except Exception:
|
|
343
|
+
auc = float("nan")
|
|
344
|
+
acc = accuracy_score(all_true, binary_preds)
|
|
345
|
+
|
|
346
|
+
metrics = {
|
|
347
|
+
"eval_loss": avg_loss,
|
|
348
|
+
"eval_accuracy": acc,
|
|
349
|
+
"eval_auc": auc,
|
|
350
|
+
}
|
|
351
|
+
print(f"Evaluation metrics: {metrics}")
|
|
352
|
+
|
|
353
|
+
return float(avg_loss), len(self.test_loader.dataset), metrics
|
|
354
|
+
|
|
355
|
+
def get_properties(self, config):
|
|
356
|
+
"""
|
|
357
|
+
Return dataset statistics before training starts.
|
|
358
|
+
Only scalar values allowed (int, float, str, bool, bytes).
|
|
359
|
+
Note: before first fit, this uses fallback (last column is target).
|
|
360
|
+
"""
|
|
361
|
+
hostname = socket.gethostname()
|
|
362
|
+
os_type = platform.system()
|
|
363
|
+
|
|
364
|
+
# If already initialized, report the effective (server-enforced) view
|
|
365
|
+
if self._initialized:
|
|
366
|
+
num_samples = int(self.X_tensor.shape[0])
|
|
367
|
+
num_features = int(self.X_tensor.shape[1])
|
|
368
|
+
features_str = ",".join(self.effective_features)
|
|
369
|
+
target_name = self.effective_target
|
|
370
|
+
label_counts = pd.Series(self.y_tensor.numpy()).value_counts().to_dict()
|
|
371
|
+
classes = sorted(label_counts.keys())
|
|
372
|
+
else:
|
|
373
|
+
num_samples = len(self.X_tensor)
|
|
374
|
+
num_features = self.X_tensor.shape[1]
|
|
375
|
+
features_str = ",".join(self.feature_names)
|
|
376
|
+
target_name = self.target_name
|
|
377
|
+
label_counts = self.label_counts
|
|
378
|
+
classes = self.classes
|
|
379
|
+
|
|
380
|
+
classes_str = ",".join(map(str, classes))
|
|
381
|
+
dist_str = ",".join(f"{cls}:{cnt}" for cls, cnt in label_counts.items())
|
|
382
|
+
|
|
383
|
+
cpu_physical = psutil.cpu_count(logical=False)
|
|
384
|
+
cpu_logical = psutil.cpu_count(logical=True)
|
|
385
|
+
total_mem_gb = round(psutil.virtual_memory().total / (1024**3), 2)
|
|
386
|
+
driver_present = shutil.which('nvidia-smi') is not None
|
|
387
|
+
gpu_count = 0
|
|
388
|
+
if GPUtil and driver_present:
|
|
389
|
+
try:
|
|
390
|
+
gpu_count = len(GPUtil.getGPUs())
|
|
391
|
+
except Exception:
|
|
392
|
+
gpu_count = 0
|
|
393
|
+
|
|
394
|
+
return {
|
|
395
|
+
"hostname": hostname,
|
|
396
|
+
"os_type": os_type,
|
|
397
|
+
"num_samples": num_samples,
|
|
398
|
+
"num_features": num_features,
|
|
399
|
+
"features": features_str,
|
|
400
|
+
"target": target_name,
|
|
401
|
+
"classes": classes_str,
|
|
402
|
+
"label_distribution": dist_str,
|
|
403
|
+
"cpu_physical_cores": cpu_physical,
|
|
404
|
+
"cpu_logical_cores": cpu_logical,
|
|
405
|
+
"total_memory_gb": total_mem_gb,
|
|
406
|
+
"gpu_driver_present": str(driver_present),
|
|
407
|
+
"gpu_count": gpu_count,
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
def start(self) -> None:
|
|
411
|
+
"""
|
|
412
|
+
Start this client against its configured server_address.
|
|
413
|
+
Blocks until the server shuts down.
|
|
414
|
+
"""
|
|
415
|
+
fl.client.start_numpy_client(
|
|
416
|
+
server_address=self.server_address,
|
|
417
|
+
client=self,
|
|
418
|
+
)
|
|
419
|
+
|
|
420
|
+
|
|
421
|
+
if __name__ == "__main__":
|
|
422
|
+
parser = argparse.ArgumentParser(
|
|
423
|
+
description="Flower client with DP support and metrics"
|
|
424
|
+
)
|
|
425
|
+
parser.add_argument(
|
|
426
|
+
"--server_address",
|
|
427
|
+
type=str,
|
|
428
|
+
required=True,
|
|
429
|
+
help="Adresse du serveur Flower (ex : 127.0.0.1:8080)",
|
|
430
|
+
)
|
|
431
|
+
parser.add_argument(
|
|
432
|
+
"--data_path",
|
|
433
|
+
type=str,
|
|
434
|
+
default="data/data.csv",
|
|
435
|
+
help="Chemin vers les données CSV",
|
|
436
|
+
)
|
|
437
|
+
parser.add_argument(
|
|
438
|
+
"--dp",
|
|
439
|
+
action="store_true",
|
|
440
|
+
help="Activer la confidentialité différentielle",
|
|
441
|
+
)
|
|
442
|
+
parser.add_argument(
|
|
443
|
+
"--noise_multiplier",
|
|
444
|
+
type=float,
|
|
445
|
+
default=1.0,
|
|
446
|
+
help="Noise multiplier pour DP",
|
|
447
|
+
)
|
|
448
|
+
parser.add_argument(
|
|
449
|
+
"--max_grad_norm",
|
|
450
|
+
type=float,
|
|
451
|
+
default=1.0,
|
|
452
|
+
help="Norme max pour le clipping",
|
|
453
|
+
)
|
|
454
|
+
parser.add_argument(
|
|
455
|
+
"--batch_size",
|
|
456
|
+
type=int,
|
|
457
|
+
default=32,
|
|
458
|
+
help="Taille du batch",
|
|
459
|
+
)
|
|
460
|
+
# NEW — client-local optional overrides (keeps all old args intact)
|
|
461
|
+
parser.add_argument(
|
|
462
|
+
"--val_frac",
|
|
463
|
+
type=float,
|
|
464
|
+
default=None,
|
|
465
|
+
help="Fraction de validation (priorité au client si fourni)",
|
|
466
|
+
)
|
|
467
|
+
parser.add_argument(
|
|
468
|
+
"--test_frac",
|
|
469
|
+
type=float,
|
|
470
|
+
default=None,
|
|
471
|
+
help="Fraction de test (priorité au client si fourni; ignoré si --test_ids fourni)",
|
|
472
|
+
)
|
|
473
|
+
parser.add_argument(
|
|
474
|
+
"--id_col",
|
|
475
|
+
type=str,
|
|
476
|
+
default=None,
|
|
477
|
+
help="Colonne des IDs pour la sélection du test (optionnel; fallback aux numéros de ligne si absent)",
|
|
478
|
+
)
|
|
479
|
+
parser.add_argument(
|
|
480
|
+
"--test_ids",
|
|
481
|
+
type=str,
|
|
482
|
+
default=None,
|
|
483
|
+
help="Liste d'IDs pour le test, séparés par virgule (ex: '1,3,5'; active le mode ID-based si fourni)",
|
|
484
|
+
)
|
|
485
|
+
parser.add_argument(
|
|
486
|
+
"--seed",
|
|
487
|
+
type=int,
|
|
488
|
+
default=42,
|
|
489
|
+
help="Graine aléatoire pour les splits",
|
|
490
|
+
)
|
|
491
|
+
|
|
492
|
+
args = parser.parse_args()
|
|
493
|
+
|
|
494
|
+
dp_config = None
|
|
495
|
+
if args.dp:
|
|
496
|
+
dp_config = DPConfig(
|
|
497
|
+
noise_multiplier=args.noise_multiplier,
|
|
498
|
+
max_grad_norm=args.max_grad_norm,
|
|
499
|
+
batch_size=args.batch_size,
|
|
500
|
+
)
|
|
501
|
+
|
|
502
|
+
client = FlowerClient(
|
|
503
|
+
server_address=args.server_address,
|
|
504
|
+
data_path=args.data_path,
|
|
505
|
+
dp_config=dp_config,
|
|
506
|
+
val_frac=args.val_frac, # optional, overrides server if set
|
|
507
|
+
test_frac=args.test_frac, # optional, overrides server if set
|
|
508
|
+
id_col=args.id_col, # new
|
|
509
|
+
test_ids=args.test_ids, # new
|
|
510
|
+
seed=args.seed,
|
|
511
|
+
)
|
|
512
|
+
client.start()
|
|
@@ -134,9 +134,8 @@ class Net(nn.Module):
|
|
|
134
134
|
|
|
135
135
|
@torch.no_grad()
|
|
136
136
|
def predict(self, x: torch.Tensor) -> torch.Tensor:
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
probs = self._apply_output_activation(logits) if self.return_logits else logits
|
|
137
|
+
out = self.forward(x) # always run forward
|
|
138
|
+
probs = self._apply_output_activation(out) if self.return_logits else out
|
|
140
139
|
if self.task == "binary":
|
|
141
140
|
return (probs >= 0.5).long()
|
|
142
141
|
elif self.task == "multiclass":
|
|
@@ -145,3 +144,4 @@ class Net(nn.Module):
|
|
|
145
144
|
return (probs >= 0.5).long()
|
|
146
145
|
elif self.task == "regression":
|
|
147
146
|
return probs
|
|
147
|
+
|