flwr-nightly 1.15.0.dev20250122__tar.gz → 1.15.0.dev20250123__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 (331) hide show
  1. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/PKG-INFO +1 -1
  2. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/pyproject.toml +1 -1
  3. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/cli/config_utils.py +15 -2
  4. flwr_nightly-1.15.0.dev20250123/src/py/flwr/cli/constant.py +27 -0
  5. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/cli/log.py +17 -2
  6. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/cli/login/login.py +9 -1
  7. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/cli/ls.py +10 -2
  8. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/cli/run/run.py +20 -10
  9. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/cli/stop.py +9 -1
  10. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/common/config.py +21 -10
  11. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/LICENSE +0 -0
  12. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/README.md +0 -0
  13. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/__init__.py +0 -0
  14. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/cli/__init__.py +0 -0
  15. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/cli/app.py +0 -0
  16. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/cli/build.py +0 -0
  17. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/cli/cli_user_auth_interceptor.py +0 -0
  18. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/cli/example.py +0 -0
  19. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/cli/install.py +0 -0
  20. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/cli/login/__init__.py +0 -0
  21. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/cli/new/__init__.py +0 -0
  22. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/cli/new/new.py +0 -0
  23. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/cli/new/templates/__init__.py +0 -0
  24. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/cli/new/templates/app/.gitignore.tpl +0 -0
  25. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/cli/new/templates/app/LICENSE.tpl +0 -0
  26. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/cli/new/templates/app/README.baseline.md.tpl +0 -0
  27. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/cli/new/templates/app/README.flowertune.md.tpl +0 -0
  28. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/cli/new/templates/app/README.md.tpl +0 -0
  29. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/cli/new/templates/app/__init__.py +0 -0
  30. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/cli/new/templates/app/code/__init__.baseline.py.tpl +0 -0
  31. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
  32. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
  33. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/cli/new/templates/app/code/client.baseline.py.tpl +0 -0
  34. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/cli/new/templates/app/code/client.huggingface.py.tpl +0 -0
  35. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/cli/new/templates/app/code/client.jax.py.tpl +0 -0
  36. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/cli/new/templates/app/code/client.mlx.py.tpl +0 -0
  37. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/cli/new/templates/app/code/client.numpy.py.tpl +0 -0
  38. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -0
  39. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl +0 -0
  40. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -0
  41. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/cli/new/templates/app/code/dataset.baseline.py.tpl +0 -0
  42. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/cli/new/templates/app/code/flwr_tune/__init__.py +0 -0
  43. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/cli/new/templates/app/code/flwr_tune/client_app.py.tpl +0 -0
  44. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/cli/new/templates/app/code/flwr_tune/dataset.py.tpl +0 -0
  45. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/cli/new/templates/app/code/flwr_tune/models.py.tpl +0 -0
  46. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/cli/new/templates/app/code/flwr_tune/server_app.py.tpl +0 -0
  47. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/cli/new/templates/app/code/flwr_tune/strategy.py.tpl +0 -0
  48. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/cli/new/templates/app/code/model.baseline.py.tpl +0 -0
  49. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/cli/new/templates/app/code/server.baseline.py.tpl +0 -0
  50. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/cli/new/templates/app/code/server.huggingface.py.tpl +0 -0
  51. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/cli/new/templates/app/code/server.jax.py.tpl +0 -0
  52. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/cli/new/templates/app/code/server.mlx.py.tpl +0 -0
  53. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -0
  54. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -0
  55. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/cli/new/templates/app/code/server.sklearn.py.tpl +0 -0
  56. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -0
  57. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/cli/new/templates/app/code/strategy.baseline.py.tpl +0 -0
  58. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/cli/new/templates/app/code/task.huggingface.py.tpl +0 -0
  59. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/cli/new/templates/app/code/task.jax.py.tpl +0 -0
  60. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/cli/new/templates/app/code/task.mlx.py.tpl +0 -0
  61. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/cli/new/templates/app/code/task.numpy.py.tpl +0 -0
  62. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +0 -0
  63. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/cli/new/templates/app/code/task.sklearn.py.tpl +0 -0
  64. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/cli/new/templates/app/code/task.tensorflow.py.tpl +0 -0
  65. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/cli/new/templates/app/code/utils.baseline.py.tpl +0 -0
  66. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/cli/new/templates/app/pyproject.baseline.toml.tpl +0 -0
  67. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +0 -0
  68. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl +0 -0
  69. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/cli/new/templates/app/pyproject.jax.toml.tpl +0 -0
  70. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +0 -0
  71. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +0 -0
  72. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +0 -0
  73. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +0 -0
  74. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +0 -0
  75. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/cli/run/__init__.py +0 -0
  76. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/cli/utils.py +0 -0
  77. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/client/__init__.py +0 -0
  78. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/client/app.py +0 -0
  79. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/client/client.py +0 -0
  80. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/client/client_app.py +0 -0
  81. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/client/clientapp/__init__.py +0 -0
  82. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/client/clientapp/app.py +0 -0
  83. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/client/clientapp/clientappio_servicer.py +0 -0
  84. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/client/clientapp/utils.py +0 -0
  85. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/client/dpfedavg_numpy_client.py +0 -0
  86. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/client/grpc_adapter_client/__init__.py +0 -0
  87. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/client/grpc_adapter_client/connection.py +0 -0
  88. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/client/grpc_client/__init__.py +0 -0
  89. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/client/grpc_client/connection.py +0 -0
  90. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/client/grpc_rere_client/__init__.py +0 -0
  91. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/client/grpc_rere_client/client_interceptor.py +0 -0
  92. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/client/grpc_rere_client/connection.py +0 -0
  93. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/client/grpc_rere_client/grpc_adapter.py +0 -0
  94. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/client/heartbeat.py +0 -0
  95. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/client/message_handler/__init__.py +0 -0
  96. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/client/message_handler/message_handler.py +0 -0
  97. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/client/message_handler/task_handler.py +0 -0
  98. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/client/mod/__init__.py +0 -0
  99. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/client/mod/centraldp_mods.py +0 -0
  100. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/client/mod/comms_mods.py +0 -0
  101. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/client/mod/localdp_mod.py +0 -0
  102. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
  103. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
  104. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
  105. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/client/mod/utils.py +0 -0
  106. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/client/nodestate/__init__.py +0 -0
  107. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/client/nodestate/in_memory_nodestate.py +0 -0
  108. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/client/nodestate/nodestate.py +0 -0
  109. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/client/nodestate/nodestate_factory.py +0 -0
  110. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/client/numpy_client.py +0 -0
  111. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/client/rest_client/__init__.py +0 -0
  112. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/client/rest_client/connection.py +0 -0
  113. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/client/run_info_store.py +0 -0
  114. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/client/supernode/__init__.py +0 -0
  115. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/client/supernode/app.py +0 -0
  116. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/client/typing.py +0 -0
  117. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/common/__init__.py +0 -0
  118. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/common/address.py +0 -0
  119. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/common/args.py +0 -0
  120. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/common/auth_plugin/__init__.py +0 -0
  121. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/common/auth_plugin/auth_plugin.py +0 -0
  122. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/common/constant.py +0 -0
  123. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/common/context.py +0 -0
  124. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/common/date.py +0 -0
  125. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/common/differential_privacy.py +0 -0
  126. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/common/differential_privacy_constants.py +0 -0
  127. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/common/dp.py +0 -0
  128. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/common/exit/__init__.py +0 -0
  129. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/common/exit/exit.py +0 -0
  130. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/common/exit/exit_code.py +0 -0
  131. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/common/exit_handlers.py +0 -0
  132. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/common/grpc.py +0 -0
  133. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/common/logger.py +0 -0
  134. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/common/message.py +0 -0
  135. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/common/object_ref.py +0 -0
  136. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/common/parameter.py +0 -0
  137. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/common/pyproject.py +0 -0
  138. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/common/record/__init__.py +0 -0
  139. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/common/record/configsrecord.py +0 -0
  140. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/common/record/conversion_utils.py +0 -0
  141. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/common/record/metricsrecord.py +0 -0
  142. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/common/record/parametersrecord.py +0 -0
  143. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/common/record/recordset.py +0 -0
  144. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/common/record/typeddict.py +0 -0
  145. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/common/recordset_compat.py +0 -0
  146. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/common/retry_invoker.py +0 -0
  147. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/common/secure_aggregation/__init__.py +0 -0
  148. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
  149. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
  150. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -0
  151. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
  152. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/common/secure_aggregation/quantization.py +0 -0
  153. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
  154. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
  155. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/common/serde.py +0 -0
  156. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/common/telemetry.py +0 -0
  157. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/common/typing.py +0 -0
  158. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/common/version.py +0 -0
  159. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/proto/__init__.py +0 -0
  160. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/proto/clientappio_pb2.py +0 -0
  161. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/proto/clientappio_pb2.pyi +0 -0
  162. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/proto/clientappio_pb2_grpc.py +0 -0
  163. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/proto/clientappio_pb2_grpc.pyi +0 -0
  164. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/proto/error_pb2.py +0 -0
  165. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/proto/error_pb2.pyi +0 -0
  166. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/proto/error_pb2_grpc.py +0 -0
  167. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/proto/error_pb2_grpc.pyi +0 -0
  168. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/proto/exec_pb2.py +0 -0
  169. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/proto/exec_pb2.pyi +0 -0
  170. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/proto/exec_pb2_grpc.py +0 -0
  171. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/proto/exec_pb2_grpc.pyi +0 -0
  172. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/proto/fab_pb2.py +0 -0
  173. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/proto/fab_pb2.pyi +0 -0
  174. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/proto/fab_pb2_grpc.py +0 -0
  175. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/proto/fab_pb2_grpc.pyi +0 -0
  176. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/proto/fleet_pb2.py +0 -0
  177. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/proto/fleet_pb2.pyi +0 -0
  178. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/proto/fleet_pb2_grpc.py +0 -0
  179. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
  180. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/proto/grpcadapter_pb2.py +0 -0
  181. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/proto/grpcadapter_pb2.pyi +0 -0
  182. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/proto/grpcadapter_pb2_grpc.py +0 -0
  183. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/proto/grpcadapter_pb2_grpc.pyi +0 -0
  184. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/proto/log_pb2.py +0 -0
  185. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/proto/log_pb2.pyi +0 -0
  186. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/proto/log_pb2_grpc.py +0 -0
  187. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/proto/log_pb2_grpc.pyi +0 -0
  188. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/proto/message_pb2.py +0 -0
  189. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/proto/message_pb2.pyi +0 -0
  190. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/proto/message_pb2_grpc.py +0 -0
  191. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/proto/message_pb2_grpc.pyi +0 -0
  192. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/proto/node_pb2.py +0 -0
  193. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/proto/node_pb2.pyi +0 -0
  194. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/proto/node_pb2_grpc.py +0 -0
  195. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/proto/node_pb2_grpc.pyi +0 -0
  196. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/proto/recordset_pb2.py +0 -0
  197. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/proto/recordset_pb2.pyi +0 -0
  198. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/proto/recordset_pb2_grpc.py +0 -0
  199. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/proto/recordset_pb2_grpc.pyi +0 -0
  200. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/proto/run_pb2.py +0 -0
  201. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/proto/run_pb2.pyi +0 -0
  202. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/proto/run_pb2_grpc.py +0 -0
  203. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/proto/run_pb2_grpc.pyi +0 -0
  204. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/proto/serverappio_pb2.py +0 -0
  205. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/proto/serverappio_pb2.pyi +0 -0
  206. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/proto/serverappio_pb2_grpc.py +0 -0
  207. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/proto/serverappio_pb2_grpc.pyi +0 -0
  208. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/proto/simulationio_pb2.py +0 -0
  209. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/proto/simulationio_pb2.pyi +0 -0
  210. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/proto/simulationio_pb2_grpc.py +0 -0
  211. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/proto/simulationio_pb2_grpc.pyi +0 -0
  212. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/proto/task_pb2.py +0 -0
  213. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/proto/task_pb2.pyi +0 -0
  214. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/proto/task_pb2_grpc.py +0 -0
  215. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/proto/task_pb2_grpc.pyi +0 -0
  216. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/proto/transport_pb2.py +0 -0
  217. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/proto/transport_pb2.pyi +0 -0
  218. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/proto/transport_pb2_grpc.py +0 -0
  219. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
  220. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/py.typed +0 -0
  221. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/__init__.py +0 -0
  222. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/app.py +0 -0
  223. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/client_manager.py +0 -0
  224. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/client_proxy.py +0 -0
  225. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/compat/__init__.py +0 -0
  226. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/compat/app.py +0 -0
  227. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/compat/app_utils.py +0 -0
  228. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/compat/driver_client_proxy.py +0 -0
  229. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/compat/legacy_context.py +0 -0
  230. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/criterion.py +0 -0
  231. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/driver/__init__.py +0 -0
  232. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/driver/driver.py +0 -0
  233. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/driver/grpc_driver.py +0 -0
  234. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/driver/inmemory_driver.py +0 -0
  235. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/history.py +0 -0
  236. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/run_serverapp.py +0 -0
  237. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/server.py +0 -0
  238. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/server_app.py +0 -0
  239. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/server_config.py +0 -0
  240. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/serverapp/__init__.py +0 -0
  241. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/serverapp/app.py +0 -0
  242. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/serverapp_components.py +0 -0
  243. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/strategy/__init__.py +0 -0
  244. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/strategy/aggregate.py +0 -0
  245. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/strategy/bulyan.py +0 -0
  246. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
  247. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
  248. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
  249. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
  250. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
  251. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/strategy/fedadagrad.py +0 -0
  252. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/strategy/fedadam.py +0 -0
  253. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/strategy/fedavg.py +0 -0
  254. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/strategy/fedavg_android.py +0 -0
  255. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/strategy/fedavgm.py +0 -0
  256. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/strategy/fedmedian.py +0 -0
  257. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/strategy/fedopt.py +0 -0
  258. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/strategy/fedprox.py +0 -0
  259. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
  260. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
  261. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
  262. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
  263. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/strategy/fedyogi.py +0 -0
  264. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/strategy/krum.py +0 -0
  265. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/strategy/qfedavg.py +0 -0
  266. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/strategy/strategy.py +0 -0
  267. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/superlink/__init__.py +0 -0
  268. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/superlink/driver/__init__.py +0 -0
  269. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/superlink/driver/serverappio_grpc.py +0 -0
  270. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/superlink/driver/serverappio_servicer.py +0 -0
  271. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/superlink/ffs/__init__.py +0 -0
  272. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/superlink/ffs/disk_ffs.py +0 -0
  273. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/superlink/ffs/ffs.py +0 -0
  274. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/superlink/ffs/ffs_factory.py +0 -0
  275. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/superlink/fleet/__init__.py +0 -0
  276. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/superlink/fleet/grpc_adapter/__init__.py +0 -0
  277. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +0 -0
  278. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
  279. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
  280. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
  281. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
  282. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +0 -0
  283. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
  284. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +0 -0
  285. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +0 -0
  286. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
  287. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/superlink/fleet/message_handler/message_handler.py +0 -0
  288. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
  289. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +0 -0
  290. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
  291. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
  292. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
  293. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +0 -0
  294. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/superlink/fleet/vce/vce_api.py +0 -0
  295. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/superlink/linkstate/__init__.py +0 -0
  296. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/superlink/linkstate/in_memory_linkstate.py +0 -0
  297. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/superlink/linkstate/linkstate.py +0 -0
  298. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/superlink/linkstate/linkstate_factory.py +0 -0
  299. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/superlink/linkstate/sqlite_linkstate.py +0 -0
  300. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/superlink/linkstate/utils.py +0 -0
  301. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/superlink/simulation/__init__.py +0 -0
  302. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/superlink/simulation/simulationio_grpc.py +0 -0
  303. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/superlink/simulation/simulationio_servicer.py +0 -0
  304. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/superlink/utils.py +0 -0
  305. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/typing.py +0 -0
  306. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/utils/__init__.py +0 -0
  307. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/utils/tensorboard.py +0 -0
  308. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/utils/validator.py +0 -0
  309. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/workflow/__init__.py +0 -0
  310. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/workflow/constant.py +0 -0
  311. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/workflow/default_workflows.py +0 -0
  312. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
  313. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
  314. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +0 -0
  315. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/simulation/__init__.py +0 -0
  316. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/simulation/app.py +0 -0
  317. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/simulation/legacy_app.py +0 -0
  318. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/simulation/ray_transport/__init__.py +0 -0
  319. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
  320. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
  321. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/simulation/ray_transport/utils.py +0 -0
  322. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/simulation/run_simulation.py +0 -0
  323. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/simulation/simulationio_connection.py +0 -0
  324. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/superexec/__init__.py +0 -0
  325. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/superexec/app.py +0 -0
  326. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/superexec/deployment.py +0 -0
  327. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/superexec/exec_grpc.py +0 -0
  328. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/superexec/exec_servicer.py +0 -0
  329. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/superexec/exec_user_auth_interceptor.py +0 -0
  330. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/superexec/executor.py +0 -0
  331. {flwr_nightly-1.15.0.dev20250122 → flwr_nightly-1.15.0.dev20250123}/src/py/flwr/superexec/simulation.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: flwr-nightly
3
- Version: 1.15.0.dev20250122
3
+ Version: 1.15.0.dev20250123
4
4
  Summary: Flower: A Friendly Federated AI Framework
5
5
  Home-page: https://flower.ai
6
6
  License: Apache-2.0
@@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api"
4
4
 
5
5
  [tool.poetry]
6
6
  name = "flwr-nightly"
7
- version = "1.15.0.dev20250122"
7
+ version = "1.15.0.dev20250123"
8
8
  description = "Flower: A Friendly Federated AI Framework"
9
9
  license = "Apache-2.0"
10
10
  authors = ["The Flower Authors <hello@flower.ai>"]
@@ -21,7 +21,13 @@ from typing import Any, Optional, Union
21
21
  import tomli
22
22
  import typer
23
23
 
24
- from flwr.common.config import get_fab_config, get_metadata_from_config, validate_config
24
+ from flwr.common.config import (
25
+ fuse_dicts,
26
+ get_fab_config,
27
+ get_metadata_from_config,
28
+ parse_config_args,
29
+ validate_config,
30
+ )
25
31
 
26
32
 
27
33
  def get_fab_metadata(fab_file: Union[Path, bytes]) -> tuple[str, str]:
@@ -127,7 +133,9 @@ def process_loaded_project_config(
127
133
 
128
134
 
129
135
  def validate_federation_in_project_config(
130
- federation: Optional[str], config: dict[str, Any]
136
+ federation: Optional[str],
137
+ config: dict[str, Any],
138
+ overrides: Optional[list[str]] = None,
131
139
  ) -> tuple[str, dict[str, Any]]:
132
140
  """Validate the federation name in the Flower project configuration."""
133
141
  federation = federation or config["tool"]["flwr"]["federations"].get("default")
@@ -157,6 +165,11 @@ def validate_federation_in_project_config(
157
165
  )
158
166
  raise typer.Exit(code=1)
159
167
 
168
+ # Override the federation configuration if provided
169
+ if overrides:
170
+ overrides_dict = parse_config_args(overrides, flatten=False)
171
+ federation_config = fuse_dicts(federation_config, overrides_dict)
172
+
160
173
  return federation, federation_config
161
174
 
162
175
 
@@ -0,0 +1,27 @@
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 CLI commands."""
16
+
17
+
18
+ # The help message for `--federation-config` option
19
+ FEDERATION_CONFIG_HELP_MESSAGE = (
20
+ "Override federation configuration values in the format:\n\n"
21
+ "`--federation-config 'key1=value1 key2=value2' --federation-config "
22
+ "'key3=value3'`\n\nValues can be of any type supported in TOML, such as "
23
+ "bool, int, float, or string. Ensure that the keys (`key1`, `key2`, `key3` "
24
+ "in this example) exist in the federation configuration under the "
25
+ "`[tool.flwr.federations.<YOUR_FEDERATION>]` table of the `pyproject.toml` "
26
+ "for proper overriding."
27
+ )
@@ -29,6 +29,7 @@ from flwr.cli.config_utils import (
29
29
  process_loaded_project_config,
30
30
  validate_federation_in_project_config,
31
31
  )
32
+ from flwr.cli.constant import FEDERATION_CONFIG_HELP_MESSAGE
32
33
  from flwr.common.constant import CONN_RECONNECT_INTERVAL, CONN_REFRESH_PERIOD
33
34
  from flwr.common.logger import log as logger
34
35
  from flwr.proto.exec_pb2 import StreamLogsRequest # pylint: disable=E0611
@@ -57,6 +58,8 @@ def start_stream(
57
58
  logger(ERROR, "Invalid run_id `%s`, exiting", run_id)
58
59
  if e.code() == grpc.StatusCode.CANCELLED:
59
60
  pass
61
+ else:
62
+ raise e
60
63
  finally:
61
64
  channel.close()
62
65
 
@@ -123,6 +126,7 @@ def print_logs(run_id: int, channel: grpc.Channel, timeout: int) -> None:
123
126
  break
124
127
  if e.code() == grpc.StatusCode.CANCELLED:
125
128
  break
129
+ raise e
126
130
  except KeyboardInterrupt:
127
131
  logger(DEBUG, "Stream interrupted by user")
128
132
  finally:
@@ -143,6 +147,13 @@ def log(
143
147
  Optional[str],
144
148
  typer.Argument(help="Name of the federation to run the app on"),
145
149
  ] = None,
150
+ federation_config_overrides: Annotated[
151
+ Optional[list[str]],
152
+ typer.Option(
153
+ "--federation-config",
154
+ help=FEDERATION_CONFIG_HELP_MESSAGE,
155
+ ),
156
+ ] = None,
146
157
  stream: Annotated[
147
158
  bool,
148
159
  typer.Option(
@@ -158,11 +169,15 @@ def log(
158
169
  config, errors, warnings = load_and_validate(path=pyproject_path)
159
170
  config = process_loaded_project_config(config, errors, warnings)
160
171
  federation, federation_config = validate_federation_in_project_config(
161
- federation, config
172
+ federation, config, federation_config_overrides
162
173
  )
163
174
  exit_if_no_address(federation_config, "log")
164
175
 
165
- _log_with_exec_api(app, federation, federation_config, run_id, stream)
176
+ try:
177
+ _log_with_exec_api(app, federation, federation_config, run_id, stream)
178
+ except Exception as err: # pylint: disable=broad-except
179
+ typer.secho(str(err), fg=typer.colors.RED, bold=True)
180
+ raise typer.Exit(code=1) from None
166
181
 
167
182
 
168
183
  def _log_with_exec_api(
@@ -26,6 +26,7 @@ from flwr.cli.config_utils import (
26
26
  process_loaded_project_config,
27
27
  validate_federation_in_project_config,
28
28
  )
29
+ from flwr.cli.constant import FEDERATION_CONFIG_HELP_MESSAGE
29
30
  from flwr.common.typing import UserAuthLoginDetails
30
31
  from flwr.proto.exec_pb2 import ( # pylint: disable=E0611
31
32
  GetLoginDetailsRequest,
@@ -45,6 +46,13 @@ def login( # pylint: disable=R0914
45
46
  Optional[str],
46
47
  typer.Argument(help="Name of the federation to login into."),
47
48
  ] = None,
49
+ federation_config_overrides: Annotated[
50
+ Optional[list[str]],
51
+ typer.Option(
52
+ "--federation-config",
53
+ help=FEDERATION_CONFIG_HELP_MESSAGE,
54
+ ),
55
+ ] = None,
48
56
  ) -> None:
49
57
  """Login to Flower SuperLink."""
50
58
  typer.secho("Loading project configuration... ", fg=typer.colors.BLUE)
@@ -54,7 +62,7 @@ def login( # pylint: disable=R0914
54
62
 
55
63
  config = process_loaded_project_config(config, errors, warnings)
56
64
  federation, federation_config = validate_federation_in_project_config(
57
- federation, config
65
+ federation, config, federation_config_overrides
58
66
  )
59
67
  exit_if_no_address(federation_config, "login")
60
68
  channel = init_channel(app, federation_config, None)
@@ -32,6 +32,7 @@ from flwr.cli.config_utils import (
32
32
  process_loaded_project_config,
33
33
  validate_federation_in_project_config,
34
34
  )
35
+ from flwr.cli.constant import FEDERATION_CONFIG_HELP_MESSAGE
35
36
  from flwr.common.constant import FAB_CONFIG_FILE, CliOutputFormat, SubStatus
36
37
  from flwr.common.date import format_timedelta, isoformat8601_utc
37
38
  from flwr.common.logger import print_json_error, redirect_output, restore_output
@@ -48,7 +49,7 @@ from .utils import init_channel, try_obtain_cli_auth_plugin, unauthenticated_exc
48
49
  _RunListType = tuple[int, str, str, str, str, str, str, str, str]
49
50
 
50
51
 
51
- def ls( # pylint: disable=too-many-locals, too-many-branches
52
+ def ls( # pylint: disable=too-many-locals, too-many-branches, R0913, R0917
52
53
  app: Annotated[
53
54
  Path,
54
55
  typer.Argument(help="Path of the Flower project"),
@@ -57,6 +58,13 @@ def ls( # pylint: disable=too-many-locals, too-many-branches
57
58
  Optional[str],
58
59
  typer.Argument(help="Name of the federation"),
59
60
  ] = None,
61
+ federation_config_overrides: Annotated[
62
+ Optional[list[str]],
63
+ typer.Option(
64
+ "--federation-config",
65
+ help=FEDERATION_CONFIG_HELP_MESSAGE,
66
+ ),
67
+ ] = None,
60
68
  runs: Annotated[
61
69
  bool,
62
70
  typer.Option(
@@ -106,7 +114,7 @@ def ls( # pylint: disable=too-many-locals, too-many-branches
106
114
  config, errors, warnings = load_and_validate(path=pyproject_path)
107
115
  config = process_loaded_project_config(config, errors, warnings)
108
116
  federation, federation_config = validate_federation_in_project_config(
109
- federation, config
117
+ federation, config, federation_config_overrides
110
118
  )
111
119
  exit_if_no_address(federation_config, "ls")
112
120
 
@@ -31,6 +31,7 @@ from flwr.cli.config_utils import (
31
31
  process_loaded_project_config,
32
32
  validate_federation_in_project_config,
33
33
  )
34
+ from flwr.cli.constant import FEDERATION_CONFIG_HELP_MESSAGE
34
35
  from flwr.common.config import (
35
36
  flatten_dict,
36
37
  parse_config_args,
@@ -57,7 +58,7 @@ from ..utils import (
57
58
  CONN_REFRESH_PERIOD = 60 # Connection refresh period for log streaming (seconds)
58
59
 
59
60
 
60
- # pylint: disable-next=too-many-locals
61
+ # pylint: disable-next=too-many-locals, R0913, R0917
61
62
  def run(
62
63
  app: Annotated[
63
64
  Path,
@@ -67,16 +68,23 @@ def run(
67
68
  Optional[str],
68
69
  typer.Argument(help="Name of the federation to run the app on."),
69
70
  ] = None,
70
- config_overrides: Annotated[
71
+ run_config_overrides: Annotated[
71
72
  Optional[list[str]],
72
73
  typer.Option(
73
74
  "--run-config",
74
75
  "-c",
75
- help="Override configuration key-value pairs, should be of the format:\n\n"
76
- '`--run-config \'key1="value1" key2="value2"\' '
77
- "--run-config 'key3=\"value3\"'`\n\n"
78
- "Note that `key1`, `key2`, and `key3` in this example need to exist "
79
- "inside the `pyproject.toml` in order to be properly overriden.",
76
+ help="Override run configuration values in the format:\n\n"
77
+ "`--run-config 'key1=value1 key2=value2' --run-config 'key3=value3'`\n\n"
78
+ "Values can be of any type supported in TOML, such as bool, int, "
79
+ "float, or string. Ensure that the keys (`key1`, `key2`, `key3` "
80
+ "in this example) exist in `pyproject.toml` for proper overriding.",
81
+ ),
82
+ ] = None,
83
+ federation_config_overrides: Annotated[
84
+ Optional[list[str]],
85
+ typer.Option(
86
+ "--federation-config",
87
+ help=FEDERATION_CONFIG_HELP_MESSAGE,
80
88
  ),
81
89
  ] = None,
82
90
  stream: Annotated[
@@ -108,7 +116,7 @@ def run(
108
116
  config, errors, warnings = load_and_validate(path=pyproject_path)
109
117
  config = process_loaded_project_config(config, errors, warnings)
110
118
  federation, federation_config = validate_federation_in_project_config(
111
- federation, config
119
+ federation, config, federation_config_overrides
112
120
  )
113
121
 
114
122
  if "address" in federation_config:
@@ -116,12 +124,14 @@ def run(
116
124
  app,
117
125
  federation,
118
126
  federation_config,
119
- config_overrides,
127
+ run_config_overrides,
120
128
  stream,
121
129
  output_format,
122
130
  )
123
131
  else:
124
- _run_without_exec_api(app, federation_config, config_overrides, federation)
132
+ _run_without_exec_api(
133
+ app, federation_config, run_config_overrides, federation
134
+ )
125
135
  except (typer.Exit, Exception) as err: # pylint: disable=broad-except
126
136
  if suppress_output:
127
137
  restore_output()
@@ -29,6 +29,7 @@ from flwr.cli.config_utils import (
29
29
  process_loaded_project_config,
30
30
  validate_federation_in_project_config,
31
31
  )
32
+ from flwr.cli.constant import FEDERATION_CONFIG_HELP_MESSAGE
32
33
  from flwr.common.constant import FAB_CONFIG_FILE, CliOutputFormat
33
34
  from flwr.common.logger import print_json_error, redirect_output, restore_output
34
35
  from flwr.proto.exec_pb2 import StopRunRequest, StopRunResponse # pylint: disable=E0611
@@ -50,6 +51,13 @@ def stop( # pylint: disable=R0914
50
51
  Optional[str],
51
52
  typer.Argument(help="Name of the federation"),
52
53
  ] = None,
54
+ federation_config_overrides: Annotated[
55
+ Optional[list[str]],
56
+ typer.Option(
57
+ "--federation-config",
58
+ help=FEDERATION_CONFIG_HELP_MESSAGE,
59
+ ),
60
+ ] = None,
53
61
  output_format: Annotated[
54
62
  str,
55
63
  typer.Option(
@@ -73,7 +81,7 @@ def stop( # pylint: disable=R0914
73
81
  config, errors, warnings = load_and_validate(path=pyproject_path)
74
82
  config = process_loaded_project_config(config, errors, warnings)
75
83
  federation, federation_config = validate_federation_in_project_config(
76
- federation, config
84
+ federation, config, federation_config_overrides
77
85
  )
78
86
  exit_if_no_address(federation_config, "stop")
79
87
 
@@ -20,7 +20,7 @@ import re
20
20
  import zipfile
21
21
  from io import BytesIO
22
22
  from pathlib import Path
23
- from typing import IO, Any, Optional, Union, cast, get_args
23
+ from typing import IO, Any, Optional, TypeVar, Union, cast, get_args
24
24
 
25
25
  import tomli
26
26
 
@@ -35,6 +35,8 @@ from flwr.common.typing import Run, UserConfig, UserConfigValue
35
35
 
36
36
  from . import ConfigsRecord, object_ref
37
37
 
38
+ T_dict = TypeVar("T_dict", bound=dict[str, Any]) # pylint: disable=invalid-name
39
+
38
40
 
39
41
  def get_flwr_dir(provided_path: Optional[str] = None) -> Path:
40
42
  """Return the Flower home directory based on env variables."""
@@ -93,19 +95,28 @@ def get_project_config(project_dir: Union[str, Path]) -> dict[str, Any]:
93
95
 
94
96
 
95
97
  def fuse_dicts(
96
- main_dict: UserConfig,
97
- override_dict: UserConfig,
98
- ) -> UserConfig:
98
+ main_dict: T_dict,
99
+ override_dict: T_dict,
100
+ check_keys: bool = True,
101
+ ) -> T_dict:
99
102
  """Merge a config with the overrides.
100
103
 
101
- Remove the nesting by adding the nested keys as prefixes separated by dots, and fuse
102
- it with the override dict.
104
+ If `check_keys` is set to True, an error will be raised if the override
105
+ dictionary contains keys that are not present in the main dictionary.
106
+ Otherwise, only the keys present in the main dictionary will be updated.
103
107
  """
104
- fused_dict = main_dict.copy()
108
+ if not isinstance(main_dict, dict) or not isinstance(override_dict, dict):
109
+ raise ValueError("Both dictionaries must be of type dict")
110
+
111
+ fused_dict = cast(T_dict, main_dict.copy())
105
112
 
106
113
  for key, value in override_dict.items():
107
114
  if key in main_dict:
115
+ if isinstance(value, dict):
116
+ fused_dict[key] = fuse_dicts(main_dict[key], value)
108
117
  fused_dict[key] = value
118
+ elif check_keys:
119
+ raise ValueError(f"Key '{key}' is not present in the main dictionary")
109
120
 
110
121
  return fused_dict
111
122
 
@@ -194,8 +205,8 @@ def unflatten_dict(flat_dict: dict[str, Any]) -> dict[str, Any]:
194
205
 
195
206
 
196
207
  def parse_config_args(
197
- config: Optional[list[str]],
198
- ) -> UserConfig:
208
+ config: Optional[list[str]], flatten: bool = True
209
+ ) -> dict[str, Any]:
199
210
  """Parse separator separated list of key-value pairs separated by '='."""
200
211
  overrides: UserConfig = {}
201
212
 
@@ -223,7 +234,7 @@ def parse_config_args(
223
234
  matches = pattern.findall(config_line)
224
235
  toml_str = "\n".join(f"{k} = {v}" for k, v in matches)
225
236
  overrides.update(tomli.loads(toml_str))
226
- flat_overrides = flatten_dict(overrides)
237
+ flat_overrides = flatten_dict(overrides) if flatten else overrides
227
238
 
228
239
  return flat_overrides
229
240