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.
Files changed (366) hide show
  1. MEDfl-2.0.4.dev12/MEDfl/rw/client.py +487 -0
  2. MEDfl-2.0.4.dev12/MEDfl/rw/model.py +147 -0
  3. MEDfl-2.0.4.dev12/MEDfl/rw/strategy.py +429 -0
  4. MEDfl-2.0.4.dev12/MEDfl.egg-info/PKG-INFO +212 -0
  5. MEDfl-2.0.4.dev12/PKG-INFO +212 -0
  6. MEDfl-2.0.4.dev12/README.md +192 -0
  7. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/setup.py +1 -1
  8. medfl-2.0.4.dev10/MEDfl/rw/client.py +0 -288
  9. medfl-2.0.4.dev10/MEDfl/rw/model.py +0 -47
  10. medfl-2.0.4.dev10/MEDfl/rw/strategy.py +0 -157
  11. medfl-2.0.4.dev10/MEDfl.egg-info/PKG-INFO +0 -121
  12. medfl-2.0.4.dev10/PKG-INFO +0 -121
  13. medfl-2.0.4.dev10/README.md +0 -70
  14. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/.github/workflows/main.yml +0 -0
  15. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/.gitignore +0 -0
  16. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/.idea/.gitignore +0 -0
  17. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/.idea/MEDfl.iml +0 -0
  18. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/.idea/inspectionProfiles/profiles_settings.xml +0 -0
  19. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/.idea/misc.xml +0 -0
  20. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/.idea/modules.xml +0 -0
  21. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/.idea/vcs.xml +0 -0
  22. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/LICENSE +0 -0
  23. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/MEDfl/LearningManager/__init__.py +0 -0
  24. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/MEDfl/LearningManager/client.py +0 -0
  25. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/MEDfl/LearningManager/dynamicModal.py +0 -0
  26. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/MEDfl/LearningManager/federated_dataset.py +0 -0
  27. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/MEDfl/LearningManager/flpipeline.py +0 -0
  28. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/MEDfl/LearningManager/model.py +0 -0
  29. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/MEDfl/LearningManager/params.yaml +0 -0
  30. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/MEDfl/LearningManager/params_optimiser.py +0 -0
  31. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/MEDfl/LearningManager/plot.py +0 -0
  32. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/MEDfl/LearningManager/server.py +0 -0
  33. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/MEDfl/LearningManager/strategy.py +0 -0
  34. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/MEDfl/LearningManager/utils.py +0 -0
  35. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/MEDfl/NetManager/__init__.py +0 -0
  36. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/MEDfl/NetManager/database_connector.py +0 -0
  37. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/MEDfl/NetManager/dataset.py +0 -0
  38. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/MEDfl/NetManager/flsetup.py +0 -0
  39. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/MEDfl/NetManager/net_helper.py +0 -0
  40. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/MEDfl/NetManager/net_manager_queries.py +0 -0
  41. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/MEDfl/NetManager/network.py +0 -0
  42. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/MEDfl/NetManager/node.py +0 -0
  43. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/MEDfl/__init__.py +0 -0
  44. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/MEDfl/rw/__init__.py +0 -0
  45. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/MEDfl/rw/server.py +0 -0
  46. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/MEDfl/scripts/__init__.py +0 -0
  47. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/MEDfl/scripts/base.py +0 -0
  48. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/MEDfl/scripts/create_db.py +0 -0
  49. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/MEDfl.egg-info/SOURCES.txt +0 -0
  50. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/MEDfl.egg-info/dependency_links.txt +0 -0
  51. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/MEDfl.egg-info/requires.txt +0 -0
  52. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/MEDfl.egg-info/top_level.txt +0 -0
  53. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/alembic/README +0 -0
  54. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/alembic/__init__.py +0 -0
  55. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/alembic/__pycache__/env.cpython-38.pyc +0 -0
  56. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/alembic/alembic_logging.ini +0 -0
  57. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/alembic/debug.log +0 -0
  58. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/alembic/env.py +0 -0
  59. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/alembic/script.py.mako +0 -0
  60. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/alembic/versions/__pycache__/b159ee510a90_initial.cpython-38.pyc +0 -0
  61. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/alembic/versions/b159ee510a90_initial.py +0 -0
  62. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/alembic.ini +0 -0
  63. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/Makefile +0 -0
  64. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/.buildinfo +0 -0
  65. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/.doctrees/Medfl.LearningManager.doctree +0 -0
  66. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/.doctrees/Medfl.NetManager.doctree +0 -0
  67. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/.doctrees/Medfl.doctree +0 -0
  68. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/.doctrees/environment.pickle +0 -0
  69. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/.doctrees/index.doctree +0 -0
  70. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/.doctrees/modules.doctree +0 -0
  71. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/.nojekyll +0 -0
  72. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/Medfl.LearningManager.html +0 -0
  73. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/Medfl.NetManager.html +0 -0
  74. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/Medfl.html +0 -0
  75. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_modules/Medfl/LearningManager/client.html +0 -0
  76. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_modules/Medfl/LearningManager/dynamicModal.html +0 -0
  77. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_modules/Medfl/LearningManager/federated_dataset.html +0 -0
  78. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_modules/Medfl/LearningManager/flpipeline.html +0 -0
  79. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_modules/Medfl/LearningManager/model.html +0 -0
  80. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_modules/Medfl/LearningManager/plot.html +0 -0
  81. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_modules/Medfl/LearningManager/server.html +0 -0
  82. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_modules/Medfl/LearningManager/strategy.html +0 -0
  83. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_modules/Medfl/LearningManager/utils.html +0 -0
  84. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_modules/Medfl/NetManager/dataset.html +0 -0
  85. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_modules/Medfl/NetManager/flsetup.html +0 -0
  86. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_modules/Medfl/NetManager/net_helper.html +0 -0
  87. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_modules/Medfl/NetManager/network.html +0 -0
  88. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_modules/Medfl/NetManager/node.html +0 -0
  89. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_modules/index.html +0 -0
  90. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_sources/Medfl.LearningManager.rst.txt +0 -0
  91. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_sources/Medfl.NetManager.rst.txt +0 -0
  92. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_sources/Medfl.rst.txt +0 -0
  93. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_sources/index.rst.txt +0 -0
  94. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_sources/modules.rst.txt +0 -0
  95. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_static/MEDomics.png +0 -0
  96. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_static/_sphinx_javascript_frameworks_compat.js +0 -0
  97. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_static/basic.css +0 -0
  98. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_static/css/badge_only.css +0 -0
  99. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_static/css/fonts/Roboto-Slab-Bold.woff +0 -0
  100. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_static/css/fonts/Roboto-Slab-Bold.woff2 +0 -0
  101. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_static/css/fonts/Roboto-Slab-Regular.woff +0 -0
  102. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_static/css/fonts/Roboto-Slab-Regular.woff2 +0 -0
  103. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_static/css/fonts/fontawesome-webfont.eot +0 -0
  104. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_static/css/fonts/fontawesome-webfont.svg +0 -0
  105. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_static/css/fonts/fontawesome-webfont.ttf +0 -0
  106. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_static/css/fonts/fontawesome-webfont.woff +0 -0
  107. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_static/css/fonts/fontawesome-webfont.woff2 +0 -0
  108. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_static/css/fonts/lato-bold-italic.woff +0 -0
  109. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_static/css/fonts/lato-bold-italic.woff2 +0 -0
  110. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_static/css/fonts/lato-bold.woff +0 -0
  111. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_static/css/fonts/lato-bold.woff2 +0 -0
  112. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_static/css/fonts/lato-normal-italic.woff +0 -0
  113. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_static/css/fonts/lato-normal-italic.woff2 +0 -0
  114. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_static/css/fonts/lato-normal.woff +0 -0
  115. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_static/css/fonts/lato-normal.woff2 +0 -0
  116. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_static/css/theme.css +0 -0
  117. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_static/dark_mode_css/custom.css +0 -0
  118. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_static/dark_mode_css/dark.css +0 -0
  119. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_static/dark_mode_css/general.css +0 -0
  120. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_static/dark_mode_js/default_dark.js +0 -0
  121. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_static/dark_mode_js/default_light.js +0 -0
  122. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_static/dark_mode_js/theme_switcher.js +0 -0
  123. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_static/doctools.js +0 -0
  124. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_static/documentation_options.js +0 -0
  125. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_static/file.png +0 -0
  126. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_static/jquery.js +0 -0
  127. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_static/js/badge_only.js +0 -0
  128. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_static/js/html5shiv-printshiv.min.js +0 -0
  129. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_static/js/html5shiv.min.js +0 -0
  130. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_static/js/theme.js +0 -0
  131. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_static/language_data.js +0 -0
  132. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_static/minus.png +0 -0
  133. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_static/plus.png +0 -0
  134. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_static/pygments.css +0 -0
  135. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_static/searchtools.js +0 -0
  136. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/_static/sphinx_highlight.js +0 -0
  137. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/genindex.html +0 -0
  138. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/index.html +0 -0
  139. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/modules.html +0 -0
  140. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/objects.inv +0 -0
  141. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/py-modindex.html +0 -0
  142. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/search.html +0 -0
  143. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/_build/searchindex.js +0 -0
  144. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/doctrees/Documentation.doctree +0 -0
  145. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/doctrees/Installation.doctree +0 -0
  146. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/doctrees/Medfl.LearningManager.doctree +0 -0
  147. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/doctrees/Medfl.NetManager.doctree +0 -0
  148. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/doctrees/Medfl.doctree +0 -0
  149. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/doctrees/configuration_file.doctree +0 -0
  150. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/doctrees/environment.pickle +0 -0
  151. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/doctrees/index.doctree +0 -0
  152. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/doctrees/modules.doctree +0 -0
  153. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/doctrees/tutorials.doctree +0 -0
  154. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/.buildinfo +0 -0
  155. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/.nojekyll +0 -0
  156. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/Documentation.html +0 -0
  157. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/Installation.html +0 -0
  158. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/Medfl.LearningManager.html +0 -0
  159. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/Medfl.NetManager.html +0 -0
  160. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/Medfl.html +0 -0
  161. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_images/FTL_comp.png +0 -0
  162. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_images/LearningManager.png +0 -0
  163. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_images/MEDfl_Diagramm.png +0 -0
  164. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_images/NetManager_Diagramm.png +0 -0
  165. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_images/learningresults.png +0 -0
  166. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_images/mysqllogo.png +0 -0
  167. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_images/phpmyadmin.png +0 -0
  168. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_images/wampLogo.png +0 -0
  169. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_images/xampplogo.png +0 -0
  170. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_modules/index.html +0 -0
  171. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_sources/Documentation.rst.txt +0 -0
  172. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_sources/Installation.rst.txt +0 -0
  173. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_sources/Medfl.LearningManager.rst.txt +0 -0
  174. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_sources/Medfl.NetManager.rst.txt +0 -0
  175. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_sources/Medfl.rst.txt +0 -0
  176. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_sources/configuration_file.rst.txt +0 -0
  177. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_sources/index.rst.txt +0 -0
  178. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_sources/modules.rst.txt +0 -0
  179. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_sources/tutorials.rst.txt +0 -0
  180. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/MEDomics.png +0 -0
  181. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/_sphinx_javascript_frameworks_compat.js +0 -0
  182. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/basic.css +0 -0
  183. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/css/badge_only.css +0 -0
  184. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/css/fonts/Roboto-Slab-Bold.woff +0 -0
  185. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/css/fonts/Roboto-Slab-Bold.woff2 +0 -0
  186. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/css/fonts/Roboto-Slab-Regular.woff +0 -0
  187. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/css/fonts/Roboto-Slab-Regular.woff2 +0 -0
  188. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/css/fonts/fontawesome-webfont.eot +0 -0
  189. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/css/fonts/fontawesome-webfont.svg +0 -0
  190. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/css/fonts/fontawesome-webfont.ttf +0 -0
  191. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/css/fonts/fontawesome-webfont.woff +0 -0
  192. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/css/fonts/fontawesome-webfont.woff2 +0 -0
  193. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/css/fonts/lato-bold-italic.woff +0 -0
  194. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/css/fonts/lato-bold-italic.woff2 +0 -0
  195. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/css/fonts/lato-bold.woff +0 -0
  196. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/css/fonts/lato-bold.woff2 +0 -0
  197. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/css/fonts/lato-normal-italic.woff +0 -0
  198. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/css/fonts/lato-normal-italic.woff2 +0 -0
  199. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/css/fonts/lato-normal.woff +0 -0
  200. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/css/fonts/lato-normal.woff2 +0 -0
  201. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/css/theme.css +0 -0
  202. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/custom.css +0 -0
  203. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/dark_mode_css/custom.css +0 -0
  204. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/dark_mode_css/dark.css +0 -0
  205. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/dark_mode_css/general.css +0 -0
  206. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/dark_mode_js/default_dark.js +0 -0
  207. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/dark_mode_js/default_light.js +0 -0
  208. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/dark_mode_js/theme_switcher.js +0 -0
  209. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/doctools.js +0 -0
  210. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/documentation_options.js +0 -0
  211. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/file.png +0 -0
  212. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/jquery-3.6.0.js +0 -0
  213. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/jquery.js +0 -0
  214. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/js/badge_only.js +0 -0
  215. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/js/html5shiv-printshiv.min.js +0 -0
  216. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/js/html5shiv.min.js +0 -0
  217. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/js/theme.js +0 -0
  218. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/language_data.js +0 -0
  219. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/minus.png +0 -0
  220. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/plus.png +0 -0
  221. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/pygments.css +0 -0
  222. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/searchtools.js +0 -0
  223. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/sphinx_highlight.js +0 -0
  224. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/underscore-1.13.1.js +0 -0
  225. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/_static/underscore.js +0 -0
  226. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/configuration_file.html +0 -0
  227. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/genindex.html +0 -0
  228. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/index.html +0 -0
  229. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/modules.html +0 -0
  230. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/objects.inv +0 -0
  231. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/py-modindex.html +0 -0
  232. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/search.html +0 -0
  233. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/searchindex.js +0 -0
  234. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/build/html/tutorials.html +0 -0
  235. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/make.bat +0 -0
  236. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/source/Documentation.rst +0 -0
  237. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/source/Installation.rst +0 -0
  238. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/source/Medfl.LearningManager.rst +0 -0
  239. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/source/Medfl.NetManager.rst +0 -0
  240. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/source/Medfl.rst +0 -0
  241. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/source/_static/custom.css +0 -0
  242. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/source/conf.py +0 -0
  243. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/source/configuration_file.rst +0 -0
  244. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/source/figures/Images/FL_gen.png +0 -0
  245. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/source/figures/Images/FTL_comp.png +0 -0
  246. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/source/figures/Images/FlDatasetDiagramm.png +0 -0
  247. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/source/figures/Images/GDP.png +0 -0
  248. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/source/figures/Images/LDP.png +0 -0
  249. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/source/figures/Images/LearningManager.png +0 -0
  250. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/source/figures/Images/MEDfl_Diagramm.png +0 -0
  251. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/source/figures/Images/Modelinit.png +0 -0
  252. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/source/figures/Images/NetManager_Diagramm.png +0 -0
  253. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/source/figures/Images/NetworkCreation.png +0 -0
  254. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/source/figures/Images/createServer.png +0 -0
  255. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/source/figures/Images/learningresults.png +0 -0
  256. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/source/figures/Images/logos/mysqllogo.png +0 -0
  257. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/source/figures/Images/logos/phpmyadmin.png +0 -0
  258. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/source/figures/Images/logos/wampLogo.png +0 -0
  259. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/source/figures/Images/logos/xampplogo.png +0 -0
  260. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/source/figures/Images/modeltest.png +0 -0
  261. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/source/figures/Images/netMan.png +0 -0
  262. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/source/figures/Images/nodecreation.png +0 -0
  263. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/source/figures/Images/pipeline.png +0 -0
  264. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/source/figures/Images/strategy.png +0 -0
  265. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/source/figures/MEDomics.png +0 -0
  266. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/source/index.rst +0 -0
  267. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/source/modules.rst +0 -0
  268. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/docs/source/tutorials.rst +0 -0
  269. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/global_params.yaml +0 -0
  270. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/medfl.egg-info/PKG-INFO +0 -0
  271. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/medfl.egg-info/SOURCES.txt +0 -0
  272. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/medfl.egg-info/dependency_links.txt +0 -0
  273. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/medfl.egg-info/requires.txt +0 -0
  274. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/medfl.egg-info/top_level.txt +0 -0
  275. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/.ipynb_checkpoints/trainedModels/binary_classifier.pth +0 -0
  276. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/.ipynb_checkpoints/trainedModels/eicu_binary_classifier.pth +0 -0
  277. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/.ipynb_checkpoints/trainedModels/grid_search_classifier.pth +0 -0
  278. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/.ipynb_checkpoints/trainedModels/new_binary_classifier.pth +0 -0
  279. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/.ipynb_checkpoints/trainedModels/updated_model.pth +0 -0
  280. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/First_Tuto.ipynb +0 -0
  281. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/Images/FL_gen.png +0 -0
  282. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/Images/FTL_comp.png +0 -0
  283. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/Images/FlDatasetDiagramm.png +0 -0
  284. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/Images/GDP.png +0 -0
  285. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/Images/LDP.png +0 -0
  286. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/Images/LearningManager.png +0 -0
  287. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/Images/MEDfl_Diagramm.png +0 -0
  288. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/Images/MEDfl_bachmarking_plan.png +0 -0
  289. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/Images/Modelinit.png +0 -0
  290. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/Images/NetManager_Diagramm.png +0 -0
  291. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/Images/NetworkCreation.png +0 -0
  292. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/Images/createServer.png +0 -0
  293. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/Images/learningresults.png +0 -0
  294. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/Images/logos/mysqllogo.png +0 -0
  295. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/Images/logos/phpmyadmin.png +0 -0
  296. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/Images/logos/wampLogo.png +0 -0
  297. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/Images/logos/xampplogo.png +0 -0
  298. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/Images/modeltest.png +0 -0
  299. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/Images/netMan.png +0 -0
  300. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/Images/nodecreation.png +0 -0
  301. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/Images/optuna_optim_diag.png +0 -0
  302. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/Images/pipeline.png +0 -0
  303. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/Images/strategy.png +0 -0
  304. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/banchmarking/MEDfl_benchmarks.ipynb +0 -0
  305. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/banchmarking/banchmarking_plan.md +0 -0
  306. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/banchmarking/benchmarks_results.txt +0 -0
  307. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/banchmarking/network_architecture/net_bachmarking_conf_1.ipynb +0 -0
  308. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/banchmarking/network_architecture/net_bachmarking_conf_2.ipynb +0 -0
  309. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/banchmarking/transfer_learning/TL_activated.ipynb +0 -0
  310. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/banchmarking/transfer_learning/TL_dectivated.ipynb +0 -0
  311. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/data/chunk_1.csv +0 -0
  312. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/data/chunk_2.csv +0 -0
  313. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/data/chunk_3.csv +0 -0
  314. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/data/config_1/part_1.csv +0 -0
  315. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/data/config_1/part_2.csv +0 -0
  316. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/data/config_1/part_3.csv +0 -0
  317. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/data/config_1/test_1.csv +0 -0
  318. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/data/config_1/test_2.csv +0 -0
  319. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/data/eicu_sapsii_data.csv +0 -0
  320. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/data/eicu_sapsii_data_test.csv +0 -0
  321. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/data/eicu_sapsii_data_test_1.csv +0 -0
  322. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/data/masterDataSet/Mimic_ouael.csv +0 -0
  323. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/data/masterDataSet/Mimic_train.csv +0 -0
  324. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/data/masterDataSet/eICU.csv +0 -0
  325. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/data/nodesData/output_1.csv +0 -0
  326. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/data/nodesData/output_2.csv +0 -0
  327. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/data/nodesData/output_3.csv +0 -0
  328. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/data/nodesData/output_4.csv +0 -0
  329. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/data/nodesData/output_5.csv +0 -0
  330. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/data/test_1.csv +0 -0
  331. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/data/test_2.csv +0 -0
  332. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/data/test_3.csv +0 -0
  333. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/data/validation/Mimic_validation.csv +0 -0
  334. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/eicu_test.csv +0 -0
  335. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/eicu_test_1.csv +0 -0
  336. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/eicu_test_2.csv +0 -0
  337. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/eicu_test_3.csv +0 -0
  338. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/sapsii_score_knnimputed_eicu.csv +0 -0
  339. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/tutorial/1_DB.ipynb +0 -0
  340. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/tutorial/2_NetManager.ipynb +0 -0
  341. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/tutorial/3_TransferLearning copy.ipynb +0 -0
  342. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/tutorial/3_TransferLearning.ipynb +0 -0
  343. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/tutorial/4_LearningManager.ipynb +0 -0
  344. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/tutorial/5_LearningResults.ipynb +0 -0
  345. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/tutorial/6_ModelChoice.ipynb +0 -0
  346. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/tutorial/7_ParamsOptimiser.ipynb +0 -0
  347. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/tutorial/8_complete_tutorial.ipynb +0 -0
  348. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/tutorial/newplot2.png +0 -0
  349. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/notebooks/tutorial/newplot4.png +0 -0
  350. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/requirements.txt +0 -0
  351. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/setup.cfg +0 -0
  352. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/setup_mysql.sh +0 -0
  353. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/tests/__init__.py +0 -0
  354. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/tests/__pycache__/test_dataset.cpython-38.pyc +0 -0
  355. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/tests/__pycache__/test_federated_dataset.cpython-38.pyc +0 -0
  356. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/tests/__pycache__/test_flpipeline.cpython-38.pyc +0 -0
  357. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/tests/__pycache__/test_flsetup.cpython-38.pyc +0 -0
  358. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/tests/__pycache__/test_network.cpython-38.pyc +0 -0
  359. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/tests/__pycache__/test_node.cpython-38.pyc +0 -0
  360. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/tests/test_dataset.py +0 -0
  361. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/tests/test_federated_dataset.py +0 -0
  362. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/tests/test_flpipeline.py +0 -0
  363. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/tests/test_flsetup.py +0 -0
  364. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/tests/test_network.py +0 -0
  365. {medfl-2.0.4.dev10 → MEDfl-2.0.4.dev12}/tests/test_node.py +0 -0
  366. {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