flwr-nightly 1.22.0.dev20250917__tar.gz → 1.22.0.dev20250918__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 (422) hide show
  1. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/PKG-INFO +1 -1
  2. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/new.py +2 -0
  3. flwr_nightly-1.22.0.dev20250918/py/flwr/cli/new/templates/app/code/client.xgboost.py.tpl +110 -0
  4. flwr_nightly-1.22.0.dev20250918/py/flwr/cli/new/templates/app/code/server.xgboost.py.tpl +56 -0
  5. flwr_nightly-1.22.0.dev20250918/py/flwr/cli/new/templates/app/code/task.xgboost.py.tpl +67 -0
  6. flwr_nightly-1.22.0.dev20250918/py/flwr/cli/new/templates/app/pyproject.xgboost.toml.tpl +61 -0
  7. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/exit/exit_code.py +4 -0
  8. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/serverapp/strategy/__init__.py +2 -0
  9. flwr_nightly-1.22.0.dev20250918/py/flwr/serverapp/strategy/fedxgb_cyclic.py +220 -0
  10. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/supercore/cli/flower_superexec.py +26 -1
  11. flwr_nightly-1.22.0.dev20250918/py/flwr/supercore/constant.py +19 -0
  12. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/supercore/superexec/plugin/exec_plugin.py +11 -1
  13. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/supercore/superexec/run_superexec.py +16 -2
  14. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/pyproject.toml +1 -1
  15. flwr_nightly-1.22.0.dev20250917/py/flwr/serverapp/strategy/strategy_utils_tests.py +0 -323
  16. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/README.md +0 -0
  17. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/__init__.py +0 -0
  18. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/app/__init__.py +0 -0
  19. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/app/error.py +0 -0
  20. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/app/exception.py +0 -0
  21. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/app/metadata.py +0 -0
  22. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/__init__.py +0 -0
  23. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/app.py +0 -0
  24. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/auth_plugin/__init__.py +0 -0
  25. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/auth_plugin/oidc_cli_plugin.py +0 -0
  26. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/build.py +0 -0
  27. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/cli_user_auth_interceptor.py +0 -0
  28. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/config_utils.py +0 -0
  29. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/constant.py +0 -0
  30. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/example.py +0 -0
  31. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/install.py +0 -0
  32. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/log.py +0 -0
  33. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/login/__init__.py +0 -0
  34. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/login/login.py +0 -0
  35. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/ls.py +0 -0
  36. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/__init__.py +0 -0
  37. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/__init__.py +0 -0
  38. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/.gitignore.tpl +0 -0
  39. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/LICENSE.tpl +0 -0
  40. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/README.baseline.md.tpl +0 -0
  41. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/README.flowertune.md.tpl +0 -0
  42. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/README.md.tpl +0 -0
  43. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/__init__.py +0 -0
  44. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/code/__init__.baseline.py.tpl +0 -0
  45. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
  46. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
  47. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/code/__init__.pytorch_legacy_api.py.tpl +0 -0
  48. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/code/client.baseline.py.tpl +0 -0
  49. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/code/client.huggingface.py.tpl +0 -0
  50. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/code/client.jax.py.tpl +0 -0
  51. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/code/client.mlx.py.tpl +0 -0
  52. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/code/client.numpy.py.tpl +0 -0
  53. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -0
  54. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/code/client.pytorch_legacy_api.py.tpl +0 -0
  55. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl +0 -0
  56. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -0
  57. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/code/dataset.baseline.py.tpl +0 -0
  58. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/code/flwr_tune/__init__.py +0 -0
  59. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/code/flwr_tune/client_app.py.tpl +0 -0
  60. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/code/flwr_tune/dataset.py.tpl +0 -0
  61. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/code/flwr_tune/models.py.tpl +0 -0
  62. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/code/flwr_tune/server_app.py.tpl +0 -0
  63. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/code/flwr_tune/strategy.py.tpl +0 -0
  64. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/code/model.baseline.py.tpl +0 -0
  65. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/code/server.baseline.py.tpl +0 -0
  66. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/code/server.huggingface.py.tpl +0 -0
  67. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/code/server.jax.py.tpl +0 -0
  68. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/code/server.mlx.py.tpl +0 -0
  69. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -0
  70. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -0
  71. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/code/server.pytorch_legacy_api.py.tpl +0 -0
  72. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/code/server.sklearn.py.tpl +0 -0
  73. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -0
  74. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/code/strategy.baseline.py.tpl +0 -0
  75. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/code/task.huggingface.py.tpl +0 -0
  76. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/code/task.jax.py.tpl +0 -0
  77. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/code/task.mlx.py.tpl +0 -0
  78. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/code/task.numpy.py.tpl +0 -0
  79. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +0 -0
  80. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/code/task.pytorch_legacy_api.py.tpl +0 -0
  81. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/code/task.sklearn.py.tpl +0 -0
  82. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/code/task.tensorflow.py.tpl +0 -0
  83. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/code/utils.baseline.py.tpl +0 -0
  84. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/pyproject.baseline.toml.tpl +0 -0
  85. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +0 -0
  86. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl +0 -0
  87. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/pyproject.jax.toml.tpl +0 -0
  88. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +0 -0
  89. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +0 -0
  90. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +0 -0
  91. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/pyproject.pytorch_legacy_api.toml.tpl +0 -0
  92. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +0 -0
  93. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +0 -0
  94. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/pull.py +0 -0
  95. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/run/__init__.py +0 -0
  96. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/run/run.py +0 -0
  97. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/stop.py +0 -0
  98. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/utils.py +0 -0
  99. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/client/__init__.py +0 -0
  100. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/client/client.py +0 -0
  101. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/client/client_app.py +0 -0
  102. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/client/clientapp/__init__.py +0 -0
  103. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/client/clientapp/utils.py +0 -0
  104. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/client/dpfedavg_numpy_client.py +0 -0
  105. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/client/grpc_adapter_client/__init__.py +0 -0
  106. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/client/grpc_adapter_client/connection.py +0 -0
  107. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/client/grpc_rere_client/__init__.py +0 -0
  108. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/client/grpc_rere_client/client_interceptor.py +0 -0
  109. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/client/grpc_rere_client/connection.py +0 -0
  110. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/client/grpc_rere_client/grpc_adapter.py +0 -0
  111. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/client/message_handler/__init__.py +0 -0
  112. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/client/message_handler/message_handler.py +0 -0
  113. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/client/mod/__init__.py +0 -0
  114. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/client/mod/centraldp_mods.py +0 -0
  115. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/client/mod/comms_mods.py +0 -0
  116. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/client/mod/localdp_mod.py +0 -0
  117. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
  118. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
  119. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
  120. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/client/mod/utils.py +0 -0
  121. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/client/numpy_client.py +0 -0
  122. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/client/rest_client/__init__.py +0 -0
  123. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/client/rest_client/connection.py +0 -0
  124. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/client/run_info_store.py +0 -0
  125. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/client/typing.py +0 -0
  126. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/clientapp/__init__.py +0 -0
  127. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/clientapp/mod/__init__.py +0 -0
  128. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/clientapp/mod/centraldp_mods.py +0 -0
  129. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/__init__.py +0 -0
  130. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/address.py +0 -0
  131. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/args.py +0 -0
  132. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/auth_plugin/__init__.py +0 -0
  133. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/auth_plugin/auth_plugin.py +0 -0
  134. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/config.py +0 -0
  135. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/constant.py +0 -0
  136. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/context.py +0 -0
  137. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/date.py +0 -0
  138. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/differential_privacy.py +0 -0
  139. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/differential_privacy_constants.py +0 -0
  140. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/dp.py +0 -0
  141. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/event_log_plugin/__init__.py +0 -0
  142. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/event_log_plugin/event_log_plugin.py +0 -0
  143. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/exit/__init__.py +0 -0
  144. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/exit/exit.py +0 -0
  145. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/exit/exit_handler.py +0 -0
  146. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/exit/signal_handler.py +0 -0
  147. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/grpc.py +0 -0
  148. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/heartbeat.py +0 -0
  149. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/inflatable.py +0 -0
  150. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/inflatable_protobuf_utils.py +0 -0
  151. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/inflatable_utils.py +0 -0
  152. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/logger.py +0 -0
  153. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/message.py +0 -0
  154. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/object_ref.py +0 -0
  155. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/parameter.py +0 -0
  156. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/pyproject.py +0 -0
  157. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/record/__init__.py +0 -0
  158. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/record/array.py +0 -0
  159. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/record/arraychunk.py +0 -0
  160. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/record/arrayrecord.py +0 -0
  161. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/record/configrecord.py +0 -0
  162. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/record/conversion_utils.py +0 -0
  163. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/record/metricrecord.py +0 -0
  164. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/record/recorddict.py +0 -0
  165. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/record/typeddict.py +0 -0
  166. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/recorddict_compat.py +0 -0
  167. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/retry_invoker.py +0 -0
  168. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/secure_aggregation/__init__.py +0 -0
  169. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
  170. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
  171. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -0
  172. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
  173. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/secure_aggregation/quantization.py +0 -0
  174. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
  175. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
  176. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/serde.py +0 -0
  177. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/serde_utils.py +0 -0
  178. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/telemetry.py +0 -0
  179. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/typing.py +0 -0
  180. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/version.py +0 -0
  181. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/compat/__init__.py +0 -0
  182. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/compat/client/__init__.py +0 -0
  183. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/compat/client/app.py +0 -0
  184. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/compat/client/grpc_client/__init__.py +0 -0
  185. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/compat/client/grpc_client/connection.py +0 -0
  186. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/compat/common/__init__.py +0 -0
  187. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/compat/server/__init__.py +0 -0
  188. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/compat/server/app.py +0 -0
  189. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/compat/simulation/__init__.py +0 -0
  190. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/__init__.py +0 -0
  191. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/appio_pb2.py +0 -0
  192. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/appio_pb2.pyi +0 -0
  193. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/appio_pb2_grpc.py +0 -0
  194. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/appio_pb2_grpc.pyi +0 -0
  195. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/clientappio_pb2.py +0 -0
  196. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/clientappio_pb2.pyi +0 -0
  197. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/clientappio_pb2_grpc.py +0 -0
  198. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/clientappio_pb2_grpc.pyi +0 -0
  199. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/control_pb2.py +0 -0
  200. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/control_pb2.pyi +0 -0
  201. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/control_pb2_grpc.py +0 -0
  202. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/control_pb2_grpc.pyi +0 -0
  203. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/error_pb2.py +0 -0
  204. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/error_pb2.pyi +0 -0
  205. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/error_pb2_grpc.py +0 -0
  206. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/error_pb2_grpc.pyi +0 -0
  207. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/fab_pb2.py +0 -0
  208. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/fab_pb2.pyi +0 -0
  209. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/fab_pb2_grpc.py +0 -0
  210. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/fab_pb2_grpc.pyi +0 -0
  211. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/fleet_pb2.py +0 -0
  212. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/fleet_pb2.pyi +0 -0
  213. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/fleet_pb2_grpc.py +0 -0
  214. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
  215. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/grpcadapter_pb2.py +0 -0
  216. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/grpcadapter_pb2.pyi +0 -0
  217. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/grpcadapter_pb2_grpc.py +0 -0
  218. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/grpcadapter_pb2_grpc.pyi +0 -0
  219. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/heartbeat_pb2.py +0 -0
  220. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/heartbeat_pb2.pyi +0 -0
  221. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/heartbeat_pb2_grpc.py +0 -0
  222. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/heartbeat_pb2_grpc.pyi +0 -0
  223. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/log_pb2.py +0 -0
  224. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/log_pb2.pyi +0 -0
  225. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/log_pb2_grpc.py +0 -0
  226. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/log_pb2_grpc.pyi +0 -0
  227. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/message_pb2.py +0 -0
  228. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/message_pb2.pyi +0 -0
  229. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/message_pb2_grpc.py +0 -0
  230. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/message_pb2_grpc.pyi +0 -0
  231. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/node_pb2.py +0 -0
  232. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/node_pb2.pyi +0 -0
  233. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/node_pb2_grpc.py +0 -0
  234. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/node_pb2_grpc.pyi +0 -0
  235. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/recorddict_pb2.py +0 -0
  236. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/recorddict_pb2.pyi +0 -0
  237. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/recorddict_pb2_grpc.py +0 -0
  238. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/recorddict_pb2_grpc.pyi +0 -0
  239. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/run_pb2.py +0 -0
  240. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/run_pb2.pyi +0 -0
  241. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/run_pb2_grpc.py +0 -0
  242. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/run_pb2_grpc.pyi +0 -0
  243. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/serverappio_pb2.py +0 -0
  244. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/serverappio_pb2.pyi +0 -0
  245. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/serverappio_pb2_grpc.py +0 -0
  246. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/serverappio_pb2_grpc.pyi +0 -0
  247. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/simulationio_pb2.py +0 -0
  248. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/simulationio_pb2.pyi +0 -0
  249. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/simulationio_pb2_grpc.py +0 -0
  250. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/simulationio_pb2_grpc.pyi +0 -0
  251. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/transport_pb2.py +0 -0
  252. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/transport_pb2.pyi +0 -0
  253. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/transport_pb2_grpc.py +0 -0
  254. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
  255. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/py.typed +0 -0
  256. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/__init__.py +0 -0
  257. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/app.py +0 -0
  258. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/client_manager.py +0 -0
  259. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/client_proxy.py +0 -0
  260. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/compat/__init__.py +0 -0
  261. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/compat/app.py +0 -0
  262. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/compat/app_utils.py +0 -0
  263. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/compat/grid_client_proxy.py +0 -0
  264. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/compat/legacy_context.py +0 -0
  265. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/criterion.py +0 -0
  266. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/fleet_event_log_interceptor.py +0 -0
  267. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/grid/__init__.py +0 -0
  268. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/grid/grid.py +0 -0
  269. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/grid/grpc_grid.py +0 -0
  270. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/grid/inmemory_grid.py +0 -0
  271. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/history.py +0 -0
  272. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/run_serverapp.py +0 -0
  273. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/server.py +0 -0
  274. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/server_app.py +0 -0
  275. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/server_config.py +0 -0
  276. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/serverapp/__init__.py +0 -0
  277. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/serverapp/app.py +0 -0
  278. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/serverapp_components.py +0 -0
  279. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/strategy/__init__.py +0 -0
  280. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/strategy/aggregate.py +0 -0
  281. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/strategy/bulyan.py +0 -0
  282. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
  283. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
  284. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
  285. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
  286. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
  287. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/strategy/fedadagrad.py +0 -0
  288. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/strategy/fedadam.py +0 -0
  289. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/strategy/fedavg.py +0 -0
  290. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/strategy/fedavg_android.py +0 -0
  291. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/strategy/fedavgm.py +0 -0
  292. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/strategy/fedmedian.py +0 -0
  293. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/strategy/fedopt.py +0 -0
  294. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/strategy/fedprox.py +0 -0
  295. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
  296. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
  297. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
  298. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
  299. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/strategy/fedyogi.py +0 -0
  300. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/strategy/krum.py +0 -0
  301. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/strategy/qfedavg.py +0 -0
  302. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/strategy/strategy.py +0 -0
  303. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/superlink/__init__.py +0 -0
  304. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/superlink/fleet/__init__.py +0 -0
  305. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/superlink/fleet/grpc_adapter/__init__.py +0 -0
  306. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +0 -0
  307. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
  308. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
  309. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
  310. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
  311. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +0 -0
  312. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
  313. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +0 -0
  314. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +0 -0
  315. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
  316. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/superlink/fleet/message_handler/message_handler.py +0 -0
  317. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
  318. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +0 -0
  319. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
  320. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
  321. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
  322. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +0 -0
  323. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/superlink/fleet/vce/vce_api.py +0 -0
  324. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/superlink/linkstate/__init__.py +0 -0
  325. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/superlink/linkstate/in_memory_linkstate.py +0 -0
  326. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/superlink/linkstate/linkstate.py +0 -0
  327. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/superlink/linkstate/linkstate_factory.py +0 -0
  328. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/superlink/linkstate/sqlite_linkstate.py +0 -0
  329. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/superlink/linkstate/utils.py +0 -0
  330. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/superlink/serverappio/__init__.py +0 -0
  331. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/superlink/serverappio/serverappio_grpc.py +0 -0
  332. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/superlink/serverappio/serverappio_servicer.py +0 -0
  333. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/superlink/simulation/__init__.py +0 -0
  334. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/superlink/simulation/simulationio_grpc.py +0 -0
  335. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/superlink/simulation/simulationio_servicer.py +0 -0
  336. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/superlink/utils.py +0 -0
  337. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/typing.py +0 -0
  338. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/utils/__init__.py +0 -0
  339. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/utils/tensorboard.py +0 -0
  340. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/utils/validator.py +0 -0
  341. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/workflow/__init__.py +0 -0
  342. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/workflow/constant.py +0 -0
  343. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/workflow/default_workflows.py +0 -0
  344. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
  345. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
  346. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +0 -0
  347. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/serverapp/__init__.py +0 -0
  348. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/serverapp/dp_fixed_clipping.py +0 -0
  349. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/serverapp/exception.py +0 -0
  350. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/serverapp/strategy/dp_fixed_clipping.py +0 -0
  351. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/serverapp/strategy/fedadagrad.py +0 -0
  352. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/serverapp/strategy/fedadam.py +0 -0
  353. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/serverapp/strategy/fedavg.py +0 -0
  354. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/serverapp/strategy/fedavgm.py +0 -0
  355. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/serverapp/strategy/fedmedian.py +0 -0
  356. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/serverapp/strategy/fedopt.py +0 -0
  357. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/serverapp/strategy/fedprox.py +0 -0
  358. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/serverapp/strategy/fedtrimmedavg.py +0 -0
  359. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/serverapp/strategy/fedxgb_bagging.py +0 -0
  360. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/serverapp/strategy/fedyogi.py +0 -0
  361. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/serverapp/strategy/result.py +0 -0
  362. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/serverapp/strategy/strategy.py +0 -0
  363. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/serverapp/strategy/strategy_utils.py +0 -0
  364. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/simulation/__init__.py +0 -0
  365. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/simulation/app.py +0 -0
  366. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/simulation/legacy_app.py +0 -0
  367. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/simulation/ray_transport/__init__.py +0 -0
  368. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
  369. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
  370. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/simulation/ray_transport/utils.py +0 -0
  371. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/simulation/run_simulation.py +0 -0
  372. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/simulation/simulationio_connection.py +0 -0
  373. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/supercore/__init__.py +0 -0
  374. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/supercore/app_utils.py +0 -0
  375. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/supercore/cli/__init__.py +0 -0
  376. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/supercore/corestate/__init__.py +0 -0
  377. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/supercore/corestate/corestate.py +0 -0
  378. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/supercore/ffs/__init__.py +0 -0
  379. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/supercore/ffs/disk_ffs.py +0 -0
  380. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/supercore/ffs/ffs.py +0 -0
  381. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/supercore/ffs/ffs_factory.py +0 -0
  382. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/supercore/grpc_health/__init__.py +0 -0
  383. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/supercore/grpc_health/health_server.py +0 -0
  384. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/supercore/grpc_health/simple_health_servicer.py +0 -0
  385. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/supercore/license_plugin/__init__.py +0 -0
  386. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/supercore/license_plugin/license_plugin.py +0 -0
  387. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/supercore/object_store/__init__.py +0 -0
  388. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/supercore/object_store/in_memory_object_store.py +0 -0
  389. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/supercore/object_store/object_store.py +0 -0
  390. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/supercore/object_store/object_store_factory.py +0 -0
  391. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/supercore/object_store/utils.py +0 -0
  392. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/supercore/superexec/__init__.py +0 -0
  393. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/supercore/superexec/plugin/__init__.py +0 -0
  394. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/supercore/superexec/plugin/base_exec_plugin.py +0 -0
  395. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/supercore/superexec/plugin/clientapp_exec_plugin.py +0 -0
  396. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/supercore/superexec/plugin/serverapp_exec_plugin.py +0 -0
  397. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/supercore/superexec/plugin/simulation_exec_plugin.py +0 -0
  398. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/supercore/utils.py +0 -0
  399. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/superlink/__init__.py +0 -0
  400. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/superlink/artifact_provider/__init__.py +0 -0
  401. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/superlink/artifact_provider/artifact_provider.py +0 -0
  402. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/superlink/servicer/__init__.py +0 -0
  403. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/superlink/servicer/control/__init__.py +0 -0
  404. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/superlink/servicer/control/control_event_log_interceptor.py +0 -0
  405. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/superlink/servicer/control/control_grpc.py +0 -0
  406. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/superlink/servicer/control/control_license_interceptor.py +0 -0
  407. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/superlink/servicer/control/control_servicer.py +0 -0
  408. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/superlink/servicer/control/control_user_auth_interceptor.py +0 -0
  409. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/supernode/__init__.py +0 -0
  410. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/supernode/cli/__init__.py +0 -0
  411. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/supernode/cli/flower_supernode.py +0 -0
  412. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/supernode/cli/flwr_clientapp.py +0 -0
  413. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/supernode/nodestate/__init__.py +0 -0
  414. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/supernode/nodestate/in_memory_nodestate.py +0 -0
  415. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/supernode/nodestate/nodestate.py +0 -0
  416. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/supernode/nodestate/nodestate_factory.py +0 -0
  417. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/supernode/runtime/__init__.py +0 -0
  418. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/supernode/runtime/run_clientapp.py +0 -0
  419. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/supernode/servicer/__init__.py +0 -0
  420. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/supernode/servicer/clientappio/__init__.py +0 -0
  421. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/supernode/servicer/clientappio/clientappio_servicer.py +0 -0
  422. {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/supernode/start_client_internal.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: flwr-nightly
3
- Version: 1.22.0.dev20250917
3
+ Version: 1.22.0.dev20250918
4
4
  Summary: Flower: A Friendly Federated AI Framework
5
5
  License: Apache-2.0
6
6
  Keywords: Artificial Intelligence,Federated AI,Federated Analytics,Federated Evaluation,Federated Learning,Flower,Machine Learning
@@ -41,6 +41,7 @@ class MlFramework(str, Enum):
41
41
  JAX = "JAX"
42
42
  MLX = "MLX"
43
43
  NUMPY = "NumPy"
44
+ XGBOOST = "XGBoost"
44
45
  FLOWERTUNE = "FlowerTune"
45
46
  BASELINE = "Flower Baseline"
46
47
  PYTORCH_LEGACY_API = "PyTorch (Legacy API, deprecated)"
@@ -247,6 +248,7 @@ def new(
247
248
  MlFramework.TENSORFLOW.value,
248
249
  MlFramework.SKLEARN.value,
249
250
  MlFramework.NUMPY.value,
251
+ MlFramework.XGBOOST.value,
250
252
  "pytorch_legacy_api",
251
253
  ]
252
254
  if framework_str in frameworks_with_tasks:
@@ -0,0 +1,110 @@
1
+ """$project_name: A Flower / $framework_str app."""
2
+
3
+ import warnings
4
+
5
+ import numpy as np
6
+ import xgboost as xgb
7
+ from flwr.app import ArrayRecord, Context, Message, MetricRecord, RecordDict
8
+ from flwr.clientapp import ClientApp
9
+ from flwr.common.config import unflatten_dict
10
+
11
+ from $import_name.task import load_data, replace_keys
12
+
13
+ warnings.filterwarnings("ignore", category=UserWarning)
14
+
15
+
16
+ # Flower ClientApp
17
+ app = ClientApp()
18
+
19
+
20
+ def _local_boost(bst_input, num_local_round, train_dmatrix):
21
+ # Update trees based on local training data.
22
+ for i in range(num_local_round):
23
+ bst_input.update(train_dmatrix, bst_input.num_boosted_rounds())
24
+
25
+ # Bagging: extract the last N=num_local_round trees for sever aggregation
26
+ bst = bst_input[
27
+ bst_input.num_boosted_rounds()
28
+ - num_local_round : bst_input.num_boosted_rounds()
29
+ ]
30
+ return bst
31
+
32
+
33
+ @app.train()
34
+ def train(msg: Message, context: Context) -> Message:
35
+ # Load model and data
36
+ partition_id = context.node_config["partition-id"]
37
+ num_partitions = context.node_config["num-partitions"]
38
+ train_dmatrix, _, num_train, _ = load_data(partition_id, num_partitions)
39
+
40
+ # Read from run config
41
+ num_local_round = context.run_config["local-epochs"]
42
+ # Flatted config dict and replace "-" with "_"
43
+ cfg = replace_keys(unflatten_dict(context.run_config))
44
+ params = cfg["params"]
45
+
46
+ global_round = msg.content["config"]["server-round"]
47
+ if global_round == 1:
48
+ # First round local training
49
+ bst = xgb.train(
50
+ params,
51
+ train_dmatrix,
52
+ num_boost_round=num_local_round,
53
+ )
54
+ else:
55
+ bst = xgb.Booster(params=params)
56
+ global_model = bytearray(msg.content["arrays"]["0"].numpy().tobytes())
57
+
58
+ # Load global model into booster
59
+ bst.load_model(global_model)
60
+
61
+ # Local training
62
+ bst = _local_boost(bst, num_local_round, train_dmatrix)
63
+
64
+ # Save model
65
+ local_model = bst.save_raw("json")
66
+ model_np = np.frombuffer(local_model, dtype=np.uint8)
67
+
68
+ # Construct reply message
69
+ # Note: we store the model as the first item in a list into ArrayRecord,
70
+ # which can be accessed using index ["0"].
71
+ model_record = ArrayRecord([model_np])
72
+ metrics = {
73
+ "num-examples": num_train,
74
+ }
75
+ metric_record = MetricRecord(metrics)
76
+ content = RecordDict({"arrays": model_record, "metrics": metric_record})
77
+ return Message(content=content, reply_to=msg)
78
+
79
+
80
+ @app.evaluate()
81
+ def evaluate(msg: Message, context: Context) -> Message:
82
+ # Load model and data
83
+ partition_id = context.node_config["partition-id"]
84
+ num_partitions = context.node_config["num-partitions"]
85
+ _, valid_dmatrix, _, num_val = load_data(partition_id, num_partitions)
86
+
87
+ # Load config
88
+ cfg = replace_keys(unflatten_dict(context.run_config))
89
+ params = cfg["params"]
90
+
91
+ # Load global model
92
+ bst = xgb.Booster(params=params)
93
+ global_model = bytearray(msg.content["arrays"]["0"].numpy().tobytes())
94
+ bst.load_model(global_model)
95
+
96
+ # Run evaluation
97
+ eval_results = bst.eval_set(
98
+ evals=[(valid_dmatrix, "valid")],
99
+ iteration=bst.num_boosted_rounds() - 1,
100
+ )
101
+ auc = float(eval_results.split("\t")[1].split(":")[1])
102
+
103
+ # Construct and return reply Message
104
+ metrics = {
105
+ "auc": auc,
106
+ "num-examples": num_val,
107
+ }
108
+ metric_record = MetricRecord(metrics)
109
+ content = RecordDict({"metrics": metric_record})
110
+ return Message(content=content, reply_to=msg)
@@ -0,0 +1,56 @@
1
+ """$project_name: A Flower / $framework_str app."""
2
+
3
+ import numpy as np
4
+ import xgboost as xgb
5
+ from flwr.app import ArrayRecord, Context
6
+ from flwr.common.config import unflatten_dict
7
+ from flwr.serverapp import Grid, ServerApp
8
+ from flwr.serverapp.strategy import FedXgbBagging
9
+
10
+ from $import_name.task import replace_keys
11
+
12
+ # Create ServerApp
13
+ app = ServerApp()
14
+
15
+
16
+ @app.main()
17
+ def main(grid: Grid, context: Context) -> None:
18
+ # Read run config
19
+ num_rounds = context.run_config["num-server-rounds"]
20
+ fraction_train = context.run_config["fraction-train"]
21
+ fraction_evaluate = context.run_config["fraction-evaluate"]
22
+ # Flatted config dict and replace "-" with "_"
23
+ cfg = replace_keys(unflatten_dict(context.run_config))
24
+ params = cfg["params"]
25
+
26
+ # Init global model
27
+ # Init with an empty object; the XGBooster will be created
28
+ # and trained on the client side.
29
+ global_model = b""
30
+ # Note: we store the model as the first item in a list into ArrayRecord,
31
+ # which can be accessed using index ["0"].
32
+ arrays = ArrayRecord([np.frombuffer(global_model, dtype=np.uint8)])
33
+
34
+ # Initialize FedXgbBagging strategy
35
+ strategy = FedXgbBagging(
36
+ fraction_train=fraction_train,
37
+ fraction_evaluate=fraction_evaluate,
38
+ )
39
+
40
+ # Start strategy, run FedXgbBagging for `num_rounds`
41
+ result = strategy.start(
42
+ grid=grid,
43
+ initial_arrays=arrays,
44
+ num_rounds=num_rounds,
45
+ )
46
+
47
+ # Save final model to disk
48
+ bst = xgb.Booster(params=params)
49
+ global_model = bytearray(result.arrays["0"].numpy().tobytes())
50
+
51
+ # Load global model into booster
52
+ bst.load_model(global_model)
53
+
54
+ # Save model
55
+ print("\nSaving final model to disk...")
56
+ bst.save_model("final_model.json")
@@ -0,0 +1,67 @@
1
+ """$project_name: A Flower / $framework_str app."""
2
+
3
+ import xgboost as xgb
4
+ from flwr_datasets import FederatedDataset
5
+ from flwr_datasets.partitioner import IidPartitioner
6
+
7
+
8
+ def train_test_split(partition, test_fraction, seed):
9
+ """Split the data into train and validation set given split rate."""
10
+ train_test = partition.train_test_split(test_size=test_fraction, seed=seed)
11
+ partition_train = train_test["train"]
12
+ partition_test = train_test["test"]
13
+
14
+ num_train = len(partition_train)
15
+ num_test = len(partition_test)
16
+
17
+ return partition_train, partition_test, num_train, num_test
18
+
19
+
20
+ def transform_dataset_to_dmatrix(data):
21
+ """Transform dataset to DMatrix format for xgboost."""
22
+ x = data["inputs"]
23
+ y = data["label"]
24
+ new_data = xgb.DMatrix(x, label=y)
25
+ return new_data
26
+
27
+
28
+ fds = None # Cache FederatedDataset
29
+
30
+
31
+ def load_data(partition_id, num_clients):
32
+ """Load partition HIGGS data."""
33
+ # Only initialize `FederatedDataset` once
34
+ global fds
35
+ if fds is None:
36
+ partitioner = IidPartitioner(num_partitions=num_clients)
37
+ fds = FederatedDataset(
38
+ dataset="jxie/higgs",
39
+ partitioners={"train": partitioner},
40
+ )
41
+
42
+ # Load the partition for this `partition_id`
43
+ partition = fds.load_partition(partition_id, split="train")
44
+ partition.set_format("numpy")
45
+
46
+ # Train/test splitting
47
+ train_data, valid_data, num_train, num_val = train_test_split(
48
+ partition, test_fraction=0.2, seed=42
49
+ )
50
+
51
+ # Reformat data to DMatrix for xgboost
52
+ train_dmatrix = transform_dataset_to_dmatrix(train_data)
53
+ valid_dmatrix = transform_dataset_to_dmatrix(valid_data)
54
+
55
+ return train_dmatrix, valid_dmatrix, num_train, num_val
56
+
57
+
58
+ def replace_keys(input_dict, match="-", target="_"):
59
+ """Recursively replace match string with target string in dictionary keys."""
60
+ new_dict = {}
61
+ for key, value in input_dict.items():
62
+ new_key = key.replace(match, target)
63
+ if isinstance(value, dict):
64
+ new_dict[new_key] = replace_keys(value, match, target)
65
+ else:
66
+ new_dict[new_key] = value
67
+ return new_dict
@@ -0,0 +1,61 @@
1
+ # =====================================================================
2
+ # For a full TOML configuration guide, check the Flower docs:
3
+ # https://flower.ai/docs/framework/how-to-configure-pyproject-toml.html
4
+ # =====================================================================
5
+
6
+ [build-system]
7
+ requires = ["hatchling"]
8
+ build-backend = "hatchling.build"
9
+
10
+ [project]
11
+ name = "$package_name"
12
+ version = "1.0.0"
13
+ description = ""
14
+ license = "Apache-2.0"
15
+ # Dependencies for your Flower App
16
+ dependencies = [
17
+ "flwr[simulation]>=1.22.0",
18
+ "flwr-datasets>=0.5.0",
19
+ "xgboost>=2.0.0",
20
+ ]
21
+
22
+ [tool.hatch.build.targets.wheel]
23
+ packages = ["."]
24
+
25
+ [tool.flwr.app]
26
+ publisher = "$username"
27
+
28
+ [tool.flwr.app.components]
29
+ serverapp = "$import_name.server_app:app"
30
+ clientapp = "$import_name.client_app:app"
31
+
32
+ # Custom config values accessible via `context.run_config`
33
+ [tool.flwr.app.config]
34
+ num-server-rounds = 3
35
+ fraction-train = 0.1
36
+ fraction-evaluate = 0.1
37
+ local-epochs = 1
38
+
39
+ # XGBoost parameters
40
+ params.objective = "binary:logistic"
41
+ params.eta = 0.1 # Learning rate
42
+ params.max-depth = 8
43
+ params.eval-metric = "auc"
44
+ params.nthread = 16
45
+ params.num-parallel-tree = 1
46
+ params.subsample = 1
47
+ params.tree-method = "hist"
48
+
49
+ # Default federation to use when running the app
50
+ [tool.flwr.federations]
51
+ default = "local-simulation"
52
+
53
+ # Local simulation federation with 10 virtual SuperNodes
54
+ [tool.flwr.federations.local-simulation]
55
+ options.num-supernodes = 10
56
+
57
+ # Remote federation example for use with SuperLink
58
+ [tool.flwr.federations.remote-federation]
59
+ address = "<SUPERLINK-ADDRESS>:<PORT>"
60
+ insecure = true # Remove this line to enable TLS
61
+ # root-certificates = "<PATH/TO/ca.crt>" # For TLS setup
@@ -45,6 +45,7 @@ class ExitCode:
45
45
  SUPERNODE_NODE_AUTH_KEYS_INVALID = 302
46
46
 
47
47
  # SuperExec-specific exit codes (400-499)
48
+ SUPEREXEC_INVALID_PLUGIN_CONFIG = 400
48
49
 
49
50
  # Common exit codes (600-699)
50
51
  COMMON_ADDRESS_INVALID = 600
@@ -112,6 +113,9 @@ EXIT_CODE_HELP = {
112
113
  "file and try again."
113
114
  ),
114
115
  # SuperExec-specific exit codes (400-499)
116
+ ExitCode.SUPEREXEC_INVALID_PLUGIN_CONFIG: (
117
+ "The YAML configuration for the SuperExec plugin is invalid."
118
+ ),
115
119
  # Common exit codes (600-699)
116
120
  ExitCode.COMMON_ADDRESS_INVALID: (
117
121
  "Please provide a valid URL, IPv4 or IPv6 address."
@@ -27,6 +27,7 @@ from .fedmedian import FedMedian
27
27
  from .fedprox import FedProx
28
28
  from .fedtrimmedavg import FedTrimmedAvg
29
29
  from .fedxgb_bagging import FedXgbBagging
30
+ from .fedxgb_cyclic import FedXgbCyclic
30
31
  from .fedyogi import FedYogi
31
32
  from .result import Result
32
33
  from .strategy import Strategy
@@ -42,6 +43,7 @@ __all__ = [
42
43
  "FedProx",
43
44
  "FedTrimmedAvg",
44
45
  "FedXgbBagging",
46
+ "FedXgbCyclic",
45
47
  "FedYogi",
46
48
  "Result",
47
49
  "Strategy",
@@ -0,0 +1,220 @@
1
+ # Copyright 2025 Flower Labs GmbH. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ # ==============================================================================
15
+ """Flower message-based FedXgbCyclic strategy."""
16
+
17
+
18
+ from collections.abc import Iterable
19
+ from logging import INFO
20
+ from typing import Callable, Optional, cast
21
+
22
+ from flwr.common import (
23
+ ArrayRecord,
24
+ ConfigRecord,
25
+ Message,
26
+ MessageType,
27
+ MetricRecord,
28
+ RecordDict,
29
+ log,
30
+ )
31
+ from flwr.server import Grid
32
+
33
+ from .fedavg import FedAvg
34
+ from .strategy_utils import sample_nodes
35
+
36
+
37
+ # pylint: disable=line-too-long
38
+ class FedXgbCyclic(FedAvg):
39
+ """Configurable FedXgbCyclic strategy implementation.
40
+
41
+ Parameters
42
+ ----------
43
+ fraction_train : float (default: 1.0)
44
+ Fraction of nodes used during training. In case `min_train_nodes`
45
+ is larger than `fraction_train * total_connected_nodes`, `min_train_nodes`
46
+ will still be sampled.
47
+ fraction_evaluate : float (default: 1.0)
48
+ Fraction of nodes used during validation. In case `min_evaluate_nodes`
49
+ is larger than `fraction_evaluate * total_connected_nodes`,
50
+ `min_evaluate_nodes` will still be sampled.
51
+ min_available_nodes : int (default: 2)
52
+ Minimum number of total nodes in the system.
53
+ weighted_by_key : str (default: "num-examples")
54
+ The key within each MetricRecord whose value is used as the weight when
55
+ computing weighted averages for both ArrayRecords and MetricRecords.
56
+ arrayrecord_key : str (default: "arrays")
57
+ Key used to store the ArrayRecord when constructing Messages.
58
+ configrecord_key : str (default: "config")
59
+ Key used to store the ConfigRecord when constructing Messages.
60
+ train_metrics_aggr_fn : Optional[callable] (default: None)
61
+ Function with signature (list[RecordDict], str) -> MetricRecord,
62
+ used to aggregate MetricRecords from training round replies.
63
+ If `None`, defaults to `aggregate_metricrecords`, which performs a weighted
64
+ average using the provided weight factor key.
65
+ evaluate_metrics_aggr_fn : Optional[callable] (default: None)
66
+ Function with signature (list[RecordDict], str) -> MetricRecord,
67
+ used to aggregate MetricRecords from training round replies.
68
+ If `None`, defaults to `aggregate_metricrecords`, which performs a weighted
69
+ average using the provided weight factor key.
70
+ """
71
+
72
+ # pylint: disable=too-many-arguments,too-many-positional-arguments
73
+ def __init__(
74
+ self,
75
+ fraction_train: float = 1.0,
76
+ fraction_evaluate: float = 1.0,
77
+ min_available_nodes: int = 2,
78
+ weighted_by_key: str = "num-examples",
79
+ arrayrecord_key: str = "arrays",
80
+ configrecord_key: str = "config",
81
+ train_metrics_aggr_fn: Optional[
82
+ Callable[[list[RecordDict], str], MetricRecord]
83
+ ] = None,
84
+ evaluate_metrics_aggr_fn: Optional[
85
+ Callable[[list[RecordDict], str], MetricRecord]
86
+ ] = None,
87
+ ) -> None:
88
+ super().__init__(
89
+ fraction_train=fraction_train,
90
+ fraction_evaluate=fraction_evaluate,
91
+ min_train_nodes=2,
92
+ min_evaluate_nodes=2,
93
+ min_available_nodes=min_available_nodes,
94
+ weighted_by_key=weighted_by_key,
95
+ arrayrecord_key=arrayrecord_key,
96
+ configrecord_key=configrecord_key,
97
+ train_metrics_aggr_fn=train_metrics_aggr_fn,
98
+ evaluate_metrics_aggr_fn=evaluate_metrics_aggr_fn,
99
+ )
100
+
101
+ self.registered_nodes: dict[int, int] = {}
102
+
103
+ if fraction_train not in (0.0, 1.0):
104
+ raise ValueError(
105
+ "fraction_train can only be set to 1.0 or 0.0 for FedXgbCyclic."
106
+ )
107
+ if fraction_evaluate not in (0.0, 1.0):
108
+ raise ValueError(
109
+ "fraction_evaluate can only be set to 1.0 or 0.0 for FedXgbCyclic."
110
+ )
111
+
112
+ def _reorder_nodes(self, node_ids: list[int]) -> list[int]:
113
+ """Re-order node ids based on registered nodes.
114
+
115
+ Each node ID is assigned a persistent index in `self.registered_nodes`
116
+ the first time it appears. The input list is then reordered according
117
+ to these stored indices, and the result is compacted into ascending
118
+ order (1..N) for the current call.
119
+ """
120
+ # Assign new indices to unknown nodes
121
+ next_index = max(self.registered_nodes.values(), default=0) + 1
122
+ for nid in node_ids:
123
+ if nid not in self.registered_nodes:
124
+ self.registered_nodes[nid] = next_index
125
+ next_index += 1
126
+
127
+ # Sort node_ids by their stored indices
128
+ sorted_by_index = sorted(node_ids, key=lambda x: self.registered_nodes[x])
129
+
130
+ # Compact re-map of indices just for this output list
131
+ unique_indices = sorted(self.registered_nodes[nid] for nid in sorted_by_index)
132
+ remap = {old: new for new, old in enumerate(unique_indices, start=1)}
133
+
134
+ # Build the result list ordered by compact indices
135
+ result_list = [
136
+ nid
137
+ for _, nid in sorted(
138
+ (remap[self.registered_nodes[nid]], nid) for nid in sorted_by_index
139
+ )
140
+ ]
141
+ return result_list
142
+
143
+ def _make_sampling(
144
+ self, grid: Grid, server_round: int, configure_type: str
145
+ ) -> list[int]:
146
+ """Sample nodes using the Grid."""
147
+ # Sample nodes
148
+ num_nodes = int(len(list(grid.get_node_ids())) * self.fraction_train)
149
+ sample_size = max(num_nodes, self.min_train_nodes)
150
+ node_ids, _ = sample_nodes(grid, self.min_available_nodes, sample_size)
151
+
152
+ # Re-order node_ids
153
+ node_ids = self._reorder_nodes(node_ids)
154
+
155
+ # Sample the clients sequentially given server_round
156
+ sampled_idx = (server_round - 1) % len(node_ids)
157
+ sampled_node_id = [node_ids[sampled_idx]]
158
+
159
+ log(
160
+ INFO,
161
+ f"{configure_type}: Sampled %s nodes (out of %s)",
162
+ len(sampled_node_id),
163
+ len(node_ids),
164
+ )
165
+ return sampled_node_id
166
+
167
+ def configure_train(
168
+ self, server_round: int, arrays: ArrayRecord, config: ConfigRecord, grid: Grid
169
+ ) -> Iterable[Message]:
170
+ """Configure the next round of federated training."""
171
+ # Sample one node
172
+ sampled_node_id = self._make_sampling(grid, server_round, "configure_train")
173
+
174
+ # Always inject current server round
175
+ config["server-round"] = server_round
176
+
177
+ # Construct messages
178
+ record = RecordDict(
179
+ {self.arrayrecord_key: arrays, self.configrecord_key: config}
180
+ )
181
+ return self._construct_messages(record, sampled_node_id, MessageType.TRAIN)
182
+
183
+ def aggregate_train(
184
+ self,
185
+ server_round: int,
186
+ replies: Iterable[Message],
187
+ ) -> tuple[Optional[ArrayRecord], Optional[MetricRecord]]:
188
+ """Aggregate ArrayRecords and MetricRecords in the received Messages."""
189
+ valid_replies, _ = self._check_and_log_replies(replies, is_train=True)
190
+
191
+ arrays, metrics = None, None
192
+ if valid_replies:
193
+ reply_contents = [msg.content for msg in valid_replies]
194
+ array_record_key = next(iter(reply_contents[0].array_records.keys()))
195
+
196
+ # Fetch the client model from current round as global model
197
+ arrays = cast(ArrayRecord, reply_contents[0][array_record_key])
198
+
199
+ # Aggregate MetricRecords
200
+ metrics = self.train_metrics_aggr_fn(
201
+ reply_contents,
202
+ self.weighted_by_key,
203
+ )
204
+ return arrays, metrics
205
+
206
+ def configure_evaluate(
207
+ self, server_round: int, arrays: ArrayRecord, config: ConfigRecord, grid: Grid
208
+ ) -> Iterable[Message]:
209
+ """Configure the next round of federated evaluation."""
210
+ # Sample one node
211
+ sampled_node_id = self._make_sampling(grid, server_round, "configure_evaluate")
212
+
213
+ # Always inject current server round
214
+ config["server-round"] = server_round
215
+
216
+ # Construct messages
217
+ record = RecordDict(
218
+ {self.arrayrecord_key: arrays, self.configrecord_key: config}
219
+ )
220
+ return self._construct_messages(record, sampled_node_id, MessageType.EVALUATE)
@@ -17,7 +17,9 @@
17
17
 
18
18
  import argparse
19
19
  from logging import INFO
20
- from typing import Optional
20
+ from typing import Any, Optional
21
+
22
+ import yaml
21
23
 
22
24
  from flwr.common import EventType, event
23
25
  from flwr.common.constant import ExecPluginType
@@ -26,6 +28,7 @@ from flwr.common.logger import log
26
28
  from flwr.proto.clientappio_pb2_grpc import ClientAppIoStub
27
29
  from flwr.proto.serverappio_pb2_grpc import ServerAppIoStub
28
30
  from flwr.proto.simulationio_pb2_grpc import SimulationIoStub
31
+ from flwr.supercore.constant import EXEC_PLUGIN_SECTION
29
32
  from flwr.supercore.grpc_health import add_args_health
30
33
  from flwr.supercore.superexec.plugin import (
31
34
  ClientAppExecPlugin,
@@ -36,6 +39,7 @@ from flwr.supercore.superexec.plugin import (
36
39
  from flwr.supercore.superexec.run_superexec import run_superexec
37
40
 
38
41
  try:
42
+ from flwr.ee import add_ee_args_superexec
39
43
  from flwr.ee.constant import ExecEePluginType
40
44
  from flwr.ee.exec_plugin import get_ee_plugin_and_stub_class
41
45
  except ImportError:
@@ -54,6 +58,10 @@ except ImportError:
54
58
  """Get the EE plugin class and stub class based on the plugin type."""
55
59
  return None
56
60
 
61
+ # pylint: disable-next=unused-argument
62
+ def add_ee_args_superexec(parser: argparse.ArgumentParser) -> None:
63
+ """Add EE-specific arguments to the parser."""
64
+
57
65
 
58
66
  def flower_superexec() -> None:
59
67
  """Run `flower-superexec` command."""
@@ -70,12 +78,28 @@ def flower_superexec() -> None:
70
78
  # Trigger telemetry event
71
79
  event(EventType.RUN_SUPEREXEC_ENTER, {"plugin_type": args.plugin_type})
72
80
 
81
+ # Load plugin config from YAML file if provided
82
+ plugin_config = None
83
+ if plugin_config_path := getattr(args, "plugin_config", None):
84
+ try:
85
+ with open(plugin_config_path, encoding="utf-8") as file:
86
+ yaml_config: Optional[dict[str, Any]] = yaml.safe_load(file)
87
+ if yaml_config is None or EXEC_PLUGIN_SECTION not in yaml_config:
88
+ raise ValueError(f"Missing '{EXEC_PLUGIN_SECTION}' section.")
89
+ plugin_config = yaml_config[EXEC_PLUGIN_SECTION]
90
+ except (FileNotFoundError, yaml.YAMLError, ValueError) as e:
91
+ flwr_exit(
92
+ ExitCode.SUPEREXEC_INVALID_PLUGIN_CONFIG,
93
+ f"Failed to load plugin config from '{plugin_config_path}': {e!r}",
94
+ )
95
+
73
96
  # Get the plugin class and stub class based on the plugin type
74
97
  plugin_class, stub_class = _get_plugin_and_stub_class(args.plugin_type)
75
98
  run_superexec(
76
99
  plugin_class=plugin_class,
77
100
  stub_class=stub_class, # type: ignore
78
101
  appio_api_address=args.appio_api_address,
102
+ plugin_config=plugin_config,
79
103
  flwr_dir=args.flwr_dir,
80
104
  parent_pid=args.parent_pid,
81
105
  health_server_address=args.health_server_address,
@@ -122,6 +146,7 @@ def _parse_args() -> argparse.ArgumentParser:
122
146
  help="The PID of the parent process. When set, the process will terminate "
123
147
  "when the parent process exits.",
124
148
  )
149
+ add_ee_args_superexec(parser)
125
150
  add_args_health(parser)
126
151
  return parser
127
152
 
@@ -0,0 +1,19 @@
1
+ # Copyright 2025 Flower Labs GmbH. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ # ==============================================================================
15
+ """Constants for Flower infrastructure."""
16
+
17
+
18
+ # Top-level key in YAML config for exec plugin settings
19
+ EXEC_PLUGIN_SECTION = "exec_plugin"