flwr-nightly 1.20.0.dev20250721__tar.gz → 1.20.0.dev20250723__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 (379) hide show
  1. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/PKG-INFO +1 -1
  2. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/common/constant.py +1 -1
  3. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/common/exit/exit_code.py +5 -0
  4. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/common/record/array.py +16 -3
  5. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/common/record/arraychunk.py +0 -3
  6. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/grid/grpc_grid.py +9 -9
  7. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/supercore/object_store/object_store.py +4 -2
  8. flwr_nightly-1.20.0.dev20250723/py/flwr/supercore/scheduler/__init__.py +22 -0
  9. flwr_nightly-1.20.0.dev20250723/py/flwr/supercore/scheduler/plugin.py +71 -0
  10. flwr_nightly-1.20.0.dev20250723/py/flwr/supernode/scheduler/__init__.py +22 -0
  11. flwr_nightly-1.20.0.dev20250723/py/flwr/supernode/scheduler/simple_clientapp_scheduler_plugin.py +49 -0
  12. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/supernode/start_client_internal.py +13 -7
  13. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/pyproject.toml +1 -1
  14. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/README.md +0 -0
  15. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/__init__.py +0 -0
  16. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/app/__init__.py +0 -0
  17. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/app/error.py +0 -0
  18. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/app/metadata.py +0 -0
  19. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/cli/__init__.py +0 -0
  20. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/cli/app.py +0 -0
  21. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/cli/auth_plugin/__init__.py +0 -0
  22. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/cli/auth_plugin/oidc_cli_plugin.py +0 -0
  23. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/cli/build.py +0 -0
  24. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/cli/cli_user_auth_interceptor.py +0 -0
  25. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/cli/config_utils.py +0 -0
  26. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/cli/constant.py +0 -0
  27. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/cli/example.py +0 -0
  28. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/cli/install.py +0 -0
  29. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/cli/log.py +0 -0
  30. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/cli/login/__init__.py +0 -0
  31. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/cli/login/login.py +0 -0
  32. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/cli/ls.py +0 -0
  33. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/cli/new/__init__.py +0 -0
  34. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/cli/new/new.py +0 -0
  35. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/cli/new/templates/__init__.py +0 -0
  36. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/cli/new/templates/app/.gitignore.tpl +0 -0
  37. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/cli/new/templates/app/LICENSE.tpl +0 -0
  38. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/cli/new/templates/app/README.baseline.md.tpl +0 -0
  39. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/cli/new/templates/app/README.flowertune.md.tpl +0 -0
  40. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/cli/new/templates/app/README.md.tpl +0 -0
  41. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/cli/new/templates/app/__init__.py +0 -0
  42. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/cli/new/templates/app/code/__init__.baseline.py.tpl +0 -0
  43. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
  44. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
  45. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/cli/new/templates/app/code/client.baseline.py.tpl +0 -0
  46. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/cli/new/templates/app/code/client.huggingface.py.tpl +0 -0
  47. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/cli/new/templates/app/code/client.jax.py.tpl +0 -0
  48. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/cli/new/templates/app/code/client.mlx.py.tpl +0 -0
  49. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/cli/new/templates/app/code/client.numpy.py.tpl +0 -0
  50. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -0
  51. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl +0 -0
  52. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -0
  53. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/cli/new/templates/app/code/dataset.baseline.py.tpl +0 -0
  54. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/cli/new/templates/app/code/flwr_tune/__init__.py +0 -0
  55. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/cli/new/templates/app/code/flwr_tune/client_app.py.tpl +0 -0
  56. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/cli/new/templates/app/code/flwr_tune/dataset.py.tpl +0 -0
  57. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/cli/new/templates/app/code/flwr_tune/models.py.tpl +0 -0
  58. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/cli/new/templates/app/code/flwr_tune/server_app.py.tpl +0 -0
  59. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/cli/new/templates/app/code/flwr_tune/strategy.py.tpl +0 -0
  60. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/cli/new/templates/app/code/model.baseline.py.tpl +0 -0
  61. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/cli/new/templates/app/code/server.baseline.py.tpl +0 -0
  62. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/cli/new/templates/app/code/server.huggingface.py.tpl +0 -0
  63. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/cli/new/templates/app/code/server.jax.py.tpl +0 -0
  64. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/cli/new/templates/app/code/server.mlx.py.tpl +0 -0
  65. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -0
  66. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -0
  67. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/cli/new/templates/app/code/server.sklearn.py.tpl +0 -0
  68. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -0
  69. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/cli/new/templates/app/code/strategy.baseline.py.tpl +0 -0
  70. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/cli/new/templates/app/code/task.huggingface.py.tpl +0 -0
  71. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/cli/new/templates/app/code/task.jax.py.tpl +0 -0
  72. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/cli/new/templates/app/code/task.mlx.py.tpl +0 -0
  73. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/cli/new/templates/app/code/task.numpy.py.tpl +0 -0
  74. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +0 -0
  75. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/cli/new/templates/app/code/task.sklearn.py.tpl +0 -0
  76. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/cli/new/templates/app/code/task.tensorflow.py.tpl +0 -0
  77. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/cli/new/templates/app/code/utils.baseline.py.tpl +0 -0
  78. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/cli/new/templates/app/pyproject.baseline.toml.tpl +0 -0
  79. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +0 -0
  80. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl +0 -0
  81. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/cli/new/templates/app/pyproject.jax.toml.tpl +0 -0
  82. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +0 -0
  83. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +0 -0
  84. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +0 -0
  85. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +0 -0
  86. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +0 -0
  87. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/cli/run/__init__.py +0 -0
  88. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/cli/run/run.py +0 -0
  89. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/cli/stop.py +0 -0
  90. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/cli/utils.py +0 -0
  91. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/client/__init__.py +0 -0
  92. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/client/client.py +0 -0
  93. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/client/client_app.py +0 -0
  94. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/client/clientapp/__init__.py +0 -0
  95. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/client/clientapp/utils.py +0 -0
  96. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/client/dpfedavg_numpy_client.py +0 -0
  97. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/client/grpc_adapter_client/__init__.py +0 -0
  98. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/client/grpc_adapter_client/connection.py +0 -0
  99. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/client/grpc_rere_client/__init__.py +0 -0
  100. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/client/grpc_rere_client/client_interceptor.py +0 -0
  101. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/client/grpc_rere_client/connection.py +0 -0
  102. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/client/grpc_rere_client/grpc_adapter.py +0 -0
  103. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/client/message_handler/__init__.py +0 -0
  104. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/client/message_handler/message_handler.py +0 -0
  105. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/client/mod/__init__.py +0 -0
  106. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/client/mod/centraldp_mods.py +0 -0
  107. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/client/mod/comms_mods.py +0 -0
  108. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/client/mod/localdp_mod.py +0 -0
  109. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
  110. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
  111. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
  112. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/client/mod/utils.py +0 -0
  113. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/client/numpy_client.py +0 -0
  114. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/client/rest_client/__init__.py +0 -0
  115. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/client/rest_client/connection.py +0 -0
  116. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/client/run_info_store.py +0 -0
  117. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/client/typing.py +0 -0
  118. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/clientapp/__init__.py +0 -0
  119. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/common/__init__.py +0 -0
  120. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/common/address.py +0 -0
  121. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/common/args.py +0 -0
  122. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/common/auth_plugin/__init__.py +0 -0
  123. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/common/auth_plugin/auth_plugin.py +0 -0
  124. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/common/config.py +0 -0
  125. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/common/context.py +0 -0
  126. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/common/date.py +0 -0
  127. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/common/differential_privacy.py +0 -0
  128. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/common/differential_privacy_constants.py +0 -0
  129. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/common/dp.py +0 -0
  130. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/common/event_log_plugin/__init__.py +0 -0
  131. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/common/event_log_plugin/event_log_plugin.py +0 -0
  132. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/common/exit/__init__.py +0 -0
  133. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/common/exit/exit.py +0 -0
  134. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/common/exit_handlers.py +0 -0
  135. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/common/grpc.py +0 -0
  136. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/common/heartbeat.py +0 -0
  137. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/common/inflatable.py +0 -0
  138. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/common/inflatable_protobuf_utils.py +0 -0
  139. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/common/inflatable_utils.py +0 -0
  140. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/common/logger.py +0 -0
  141. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/common/message.py +0 -0
  142. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/common/object_ref.py +0 -0
  143. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/common/parameter.py +0 -0
  144. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/common/pyproject.py +0 -0
  145. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/common/record/__init__.py +0 -0
  146. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/common/record/arrayrecord.py +0 -0
  147. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/common/record/configrecord.py +0 -0
  148. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/common/record/conversion_utils.py +0 -0
  149. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/common/record/metricrecord.py +0 -0
  150. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/common/record/recorddict.py +0 -0
  151. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/common/record/typeddict.py +0 -0
  152. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/common/recorddict_compat.py +0 -0
  153. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/common/retry_invoker.py +0 -0
  154. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/common/secure_aggregation/__init__.py +0 -0
  155. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
  156. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
  157. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -0
  158. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
  159. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/common/secure_aggregation/quantization.py +0 -0
  160. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
  161. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
  162. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/common/serde.py +0 -0
  163. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/common/serde_utils.py +0 -0
  164. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/common/telemetry.py +0 -0
  165. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/common/typing.py +0 -0
  166. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/common/version.py +0 -0
  167. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/compat/__init__.py +0 -0
  168. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/compat/client/__init__.py +0 -0
  169. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/compat/client/app.py +0 -0
  170. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/compat/client/grpc_client/__init__.py +0 -0
  171. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/compat/client/grpc_client/connection.py +0 -0
  172. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/compat/common/__init__.py +0 -0
  173. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/compat/server/__init__.py +0 -0
  174. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/compat/server/app.py +0 -0
  175. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/compat/simulation/__init__.py +0 -0
  176. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/proto/__init__.py +0 -0
  177. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/proto/appio_pb2.py +0 -0
  178. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/proto/appio_pb2.pyi +0 -0
  179. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/proto/appio_pb2_grpc.py +0 -0
  180. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/proto/appio_pb2_grpc.pyi +0 -0
  181. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/proto/clientappio_pb2.py +0 -0
  182. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/proto/clientappio_pb2.pyi +0 -0
  183. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/proto/clientappio_pb2_grpc.py +0 -0
  184. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/proto/clientappio_pb2_grpc.pyi +0 -0
  185. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/proto/error_pb2.py +0 -0
  186. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/proto/error_pb2.pyi +0 -0
  187. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/proto/error_pb2_grpc.py +0 -0
  188. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/proto/error_pb2_grpc.pyi +0 -0
  189. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/proto/exec_pb2.py +0 -0
  190. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/proto/exec_pb2.pyi +0 -0
  191. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/proto/exec_pb2_grpc.py +0 -0
  192. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/proto/exec_pb2_grpc.pyi +0 -0
  193. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/proto/fab_pb2.py +0 -0
  194. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/proto/fab_pb2.pyi +0 -0
  195. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/proto/fab_pb2_grpc.py +0 -0
  196. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/proto/fab_pb2_grpc.pyi +0 -0
  197. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/proto/fleet_pb2.py +0 -0
  198. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/proto/fleet_pb2.pyi +0 -0
  199. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/proto/fleet_pb2_grpc.py +0 -0
  200. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
  201. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/proto/grpcadapter_pb2.py +0 -0
  202. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/proto/grpcadapter_pb2.pyi +0 -0
  203. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/proto/grpcadapter_pb2_grpc.py +0 -0
  204. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/proto/grpcadapter_pb2_grpc.pyi +0 -0
  205. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/proto/heartbeat_pb2.py +0 -0
  206. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/proto/heartbeat_pb2.pyi +0 -0
  207. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/proto/heartbeat_pb2_grpc.py +0 -0
  208. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/proto/heartbeat_pb2_grpc.pyi +0 -0
  209. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/proto/log_pb2.py +0 -0
  210. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/proto/log_pb2.pyi +0 -0
  211. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/proto/log_pb2_grpc.py +0 -0
  212. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/proto/log_pb2_grpc.pyi +0 -0
  213. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/proto/message_pb2.py +0 -0
  214. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/proto/message_pb2.pyi +0 -0
  215. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/proto/message_pb2_grpc.py +0 -0
  216. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/proto/message_pb2_grpc.pyi +0 -0
  217. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/proto/node_pb2.py +0 -0
  218. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/proto/node_pb2.pyi +0 -0
  219. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/proto/node_pb2_grpc.py +0 -0
  220. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/proto/node_pb2_grpc.pyi +0 -0
  221. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/proto/recorddict_pb2.py +0 -0
  222. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/proto/recorddict_pb2.pyi +0 -0
  223. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/proto/recorddict_pb2_grpc.py +0 -0
  224. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/proto/recorddict_pb2_grpc.pyi +0 -0
  225. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/proto/run_pb2.py +0 -0
  226. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/proto/run_pb2.pyi +0 -0
  227. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/proto/run_pb2_grpc.py +0 -0
  228. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/proto/run_pb2_grpc.pyi +0 -0
  229. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/proto/serverappio_pb2.py +0 -0
  230. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/proto/serverappio_pb2.pyi +0 -0
  231. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/proto/serverappio_pb2_grpc.py +0 -0
  232. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/proto/serverappio_pb2_grpc.pyi +0 -0
  233. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/proto/simulationio_pb2.py +0 -0
  234. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/proto/simulationio_pb2.pyi +0 -0
  235. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/proto/simulationio_pb2_grpc.py +0 -0
  236. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/proto/simulationio_pb2_grpc.pyi +0 -0
  237. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/proto/transport_pb2.py +0 -0
  238. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/proto/transport_pb2.pyi +0 -0
  239. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/proto/transport_pb2_grpc.py +0 -0
  240. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
  241. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/py.typed +0 -0
  242. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/__init__.py +0 -0
  243. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/app.py +0 -0
  244. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/client_manager.py +0 -0
  245. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/client_proxy.py +0 -0
  246. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/compat/__init__.py +0 -0
  247. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/compat/app.py +0 -0
  248. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/compat/app_utils.py +0 -0
  249. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/compat/grid_client_proxy.py +0 -0
  250. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/compat/legacy_context.py +0 -0
  251. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/criterion.py +0 -0
  252. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/fleet_event_log_interceptor.py +0 -0
  253. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/grid/__init__.py +0 -0
  254. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/grid/grid.py +0 -0
  255. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/grid/inmemory_grid.py +0 -0
  256. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/history.py +0 -0
  257. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/run_serverapp.py +0 -0
  258. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/server.py +0 -0
  259. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/server_app.py +0 -0
  260. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/server_config.py +0 -0
  261. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/serverapp/__init__.py +0 -0
  262. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/serverapp/app.py +0 -0
  263. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/serverapp_components.py +0 -0
  264. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/strategy/__init__.py +0 -0
  265. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/strategy/aggregate.py +0 -0
  266. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/strategy/bulyan.py +0 -0
  267. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
  268. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
  269. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
  270. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
  271. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
  272. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/strategy/fedadagrad.py +0 -0
  273. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/strategy/fedadam.py +0 -0
  274. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/strategy/fedavg.py +0 -0
  275. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/strategy/fedavg_android.py +0 -0
  276. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/strategy/fedavgm.py +0 -0
  277. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/strategy/fedmedian.py +0 -0
  278. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/strategy/fedopt.py +0 -0
  279. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/strategy/fedprox.py +0 -0
  280. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
  281. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
  282. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
  283. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
  284. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/strategy/fedyogi.py +0 -0
  285. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/strategy/krum.py +0 -0
  286. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/strategy/qfedavg.py +0 -0
  287. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/strategy/strategy.py +0 -0
  288. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/superlink/__init__.py +0 -0
  289. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/superlink/fleet/__init__.py +0 -0
  290. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/superlink/fleet/grpc_adapter/__init__.py +0 -0
  291. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +0 -0
  292. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
  293. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
  294. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
  295. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
  296. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +0 -0
  297. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
  298. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +0 -0
  299. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +0 -0
  300. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
  301. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/superlink/fleet/message_handler/message_handler.py +0 -0
  302. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
  303. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +0 -0
  304. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
  305. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
  306. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
  307. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +0 -0
  308. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/superlink/fleet/vce/vce_api.py +0 -0
  309. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/superlink/linkstate/__init__.py +0 -0
  310. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/superlink/linkstate/in_memory_linkstate.py +0 -0
  311. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/superlink/linkstate/linkstate.py +0 -0
  312. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/superlink/linkstate/linkstate_factory.py +0 -0
  313. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/superlink/linkstate/sqlite_linkstate.py +0 -0
  314. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/superlink/linkstate/utils.py +0 -0
  315. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/superlink/serverappio/__init__.py +0 -0
  316. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/superlink/serverappio/serverappio_grpc.py +0 -0
  317. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/superlink/serverappio/serverappio_servicer.py +0 -0
  318. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/superlink/simulation/__init__.py +0 -0
  319. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/superlink/simulation/simulationio_grpc.py +0 -0
  320. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/superlink/simulation/simulationio_servicer.py +0 -0
  321. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/superlink/utils.py +0 -0
  322. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/typing.py +0 -0
  323. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/utils/__init__.py +0 -0
  324. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/utils/tensorboard.py +0 -0
  325. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/utils/validator.py +0 -0
  326. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/workflow/__init__.py +0 -0
  327. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/workflow/constant.py +0 -0
  328. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/workflow/default_workflows.py +0 -0
  329. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
  330. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
  331. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +0 -0
  332. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/serverapp/__init__.py +0 -0
  333. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/simulation/__init__.py +0 -0
  334. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/simulation/app.py +0 -0
  335. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/simulation/legacy_app.py +0 -0
  336. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/simulation/ray_transport/__init__.py +0 -0
  337. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
  338. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
  339. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/simulation/ray_transport/utils.py +0 -0
  340. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/simulation/run_simulation.py +0 -0
  341. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/simulation/simulationio_connection.py +0 -0
  342. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/supercore/__init__.py +0 -0
  343. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/supercore/ffs/__init__.py +0 -0
  344. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/supercore/ffs/disk_ffs.py +0 -0
  345. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/supercore/ffs/ffs.py +0 -0
  346. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/supercore/ffs/ffs_factory.py +0 -0
  347. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/supercore/grpc_health/__init__.py +0 -0
  348. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/supercore/grpc_health/simple_health_servicer.py +0 -0
  349. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/supercore/license_plugin/__init__.py +0 -0
  350. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/supercore/license_plugin/license_plugin.py +0 -0
  351. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/supercore/object_store/__init__.py +0 -0
  352. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/supercore/object_store/in_memory_object_store.py +0 -0
  353. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/supercore/object_store/object_store_factory.py +0 -0
  354. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/supercore/object_store/utils.py +0 -0
  355. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/supercore/utils.py +0 -0
  356. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/superexec/__init__.py +0 -0
  357. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/superexec/app.py +0 -0
  358. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/superexec/deployment.py +0 -0
  359. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/superexec/exec_event_log_interceptor.py +0 -0
  360. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/superexec/exec_grpc.py +0 -0
  361. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/superexec/exec_license_interceptor.py +0 -0
  362. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/superexec/exec_servicer.py +0 -0
  363. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/superexec/exec_user_auth_interceptor.py +0 -0
  364. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/superexec/executor.py +0 -0
  365. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/superexec/simulation.py +0 -0
  366. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/superlink/__init__.py +0 -0
  367. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/supernode/__init__.py +0 -0
  368. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/supernode/cli/__init__.py +0 -0
  369. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/supernode/cli/flower_supernode.py +0 -0
  370. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/supernode/cli/flwr_clientapp.py +0 -0
  371. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/supernode/nodestate/__init__.py +0 -0
  372. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/supernode/nodestate/in_memory_nodestate.py +0 -0
  373. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/supernode/nodestate/nodestate.py +0 -0
  374. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/supernode/nodestate/nodestate_factory.py +0 -0
  375. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/supernode/runtime/__init__.py +0 -0
  376. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/supernode/runtime/run_clientapp.py +0 -0
  377. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/supernode/servicer/__init__.py +0 -0
  378. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/supernode/servicer/clientappio/__init__.py +0 -0
  379. {flwr_nightly-1.20.0.dev20250721 → flwr_nightly-1.20.0.dev20250723}/py/flwr/supernode/servicer/clientappio/clientappio_servicer.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: flwr-nightly
3
- Version: 1.20.0.dev20250721
3
+ Version: 1.20.0.dev20250723
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
@@ -123,7 +123,7 @@ AUTHZ_TYPE_YAML_KEY = "authz_type" # For key name in YAML file
123
123
  PUBLIC_KEY_HEADER = "flwr-public-key-bin" # Must end with "-bin" for binary data
124
124
  SIGNATURE_HEADER = "flwr-signature-bin" # Must end with "-bin" for binary data
125
125
  TIMESTAMP_HEADER = "flwr-timestamp"
126
- TIMESTAMP_TOLERANCE = 10 # General tolerance for timestamp verification
126
+ TIMESTAMP_TOLERANCE = 300 # General tolerance for timestamp verification
127
127
  SYSTEM_TIME_TOLERANCE = 5 # Allowance for system time drift
128
128
 
129
129
  # Constants for grpc retry
@@ -31,6 +31,7 @@ class ExitCode:
31
31
  SUPERLINK_THREAD_CRASH = 100
32
32
  SUPERLINK_LICENSE_INVALID = 101
33
33
  SUPERLINK_LICENSE_MISSING = 102
34
+ SUPERLINK_LICENSE_URL_INVALID = 103
34
35
 
35
36
  # ServerApp-specific exit codes (200-299)
36
37
 
@@ -70,6 +71,10 @@ EXIT_CODE_HELP = {
70
71
  "The license is missing. Please specify the license key by setting the "
71
72
  "environment variable `FLWR_LICENSE_KEY`."
72
73
  ),
74
+ ExitCode.SUPERLINK_LICENSE_URL_INVALID: (
75
+ "The license URL is invalid. Please ensure that the `FLWR_LICENSE_URL` "
76
+ "environment variable is set to a valid URL."
77
+ ),
73
78
  # ServerApp-specific exit codes (200-299)
74
79
  # SuperNode-specific exit codes (300-399)
75
80
  ExitCode.SUPERNODE_REST_ADDRESS_INVALID: (
@@ -264,14 +264,22 @@ class Array(InflatableObject):
264
264
 
265
265
  def slice_array(self) -> list[tuple[str, InflatableObject]]:
266
266
  """Slice Array data and construct a list of ArrayChunks."""
267
- children: list[tuple[str, InflatableObject]] = []
267
+ # Return cached chunks if they exist
268
+ if "_chunks" in self.__dict__:
269
+ return cast(list[tuple[str, InflatableObject]], self.__dict__["_chunks"])
270
+
271
+ # Chunks are not children as some of them may be identical
272
+ chunks: list[tuple[str, InflatableObject]] = []
268
273
  # memoryview allows for zero-copy slicing
269
274
  data_view = memoryview(self.data)
270
275
  for start in range(0, len(data_view), MAX_ARRAY_CHUNK_SIZE):
271
276
  end = min(start + MAX_ARRAY_CHUNK_SIZE, len(data_view))
272
277
  ac = ArrayChunk(data_view[start:end])
273
- children.append((ac.object_id, ac))
274
- return children
278
+ chunks.append((ac.object_id, ac))
279
+
280
+ # Cache the chunks for future use
281
+ self.__dict__["_chunks"] = chunks
282
+ return chunks
275
283
 
276
284
  def deflate(self) -> bytes:
277
285
  """Deflate the Array."""
@@ -386,4 +394,9 @@ class Array(InflatableObject):
386
394
  if name in ("dtype", "shape", "stype", "data"):
387
395
  # Mark as dirty if any of the main attributes are set
388
396
  self.is_dirty = True
397
+ # Clear cached object ID
398
+ self.__dict__.pop("_object_id", None)
399
+ # Clear cached chunks if data is set
400
+ if name == "data":
401
+ self.__dict__.pop("_chunks", None)
389
402
  super().__setattr__(name, value)
@@ -28,9 +28,6 @@ class ArrayChunk(InflatableObject):
28
28
 
29
29
  data: memoryview
30
30
 
31
- def __init__(self, data: bytes) -> None:
32
- self.data = memoryview(data)
33
-
34
31
  def deflate(self) -> bytes:
35
32
  """Deflate the ArrayChunk."""
36
33
  return add_header_to_object_body(object_body=self.data, obj=self)
@@ -260,15 +260,15 @@ class GrpcGrid(Grid):
260
260
  run_id = cast(Run, self._run).run_id
261
261
  message_ids: list[str] = []
262
262
  try:
263
- for msg in messages:
264
- # Populate metadata
265
- msg.metadata.__dict__["_run_id"] = run_id
266
- msg.metadata.__dict__["_src_node_id"] = self.node.node_id
267
- msg.metadata.__dict__["_message_id"] = msg.object_id
268
- # Check message
269
- self._check_message(msg)
270
- # Try pushing message and its objects
271
- with no_object_id_recompute():
263
+ with no_object_id_recompute():
264
+ for msg in messages:
265
+ # Populate metadata
266
+ msg.metadata.__dict__["_run_id"] = run_id
267
+ msg.metadata.__dict__["_src_node_id"] = self.node.node_id
268
+ msg.metadata.__dict__["_message_id"] = msg.object_id
269
+ # Check message
270
+ self._check_message(msg)
271
+ # Try pushing message and its objects
272
272
  message_ids.append(self._try_push_message(run_id, msg))
273
273
 
274
274
  except grpc.RpcError as e:
@@ -99,8 +99,10 @@ class ObjectStore(abc.ABC):
99
99
 
100
100
  Returns
101
101
  -------
102
- bytes
103
- The object stored under the given object_id.
102
+ Optional[bytes]
103
+ The object stored under the given object_id if it exists, else None.
104
+ The returned bytes will be b"" if the object is not yet available,
105
+ but has been preregistered.
104
106
  """
105
107
 
106
108
  @abc.abstractmethod
@@ -0,0 +1,22 @@
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 App Scheduler."""
16
+
17
+
18
+ from .plugin import SchedulerPlugin
19
+
20
+ __all__ = [
21
+ "SchedulerPlugin",
22
+ ]
@@ -0,0 +1,71 @@
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
+ """Abstract base class SchedulerPlugin."""
16
+
17
+
18
+ from abc import ABC, abstractmethod
19
+ from collections.abc import Sequence
20
+ from typing import Callable, Optional
21
+
22
+ from flwr.common.typing import Run
23
+
24
+
25
+ class SchedulerPlugin(ABC):
26
+ """Abstract base class for Scheduler plugins."""
27
+
28
+ def __init__(
29
+ self,
30
+ appio_api_address: str,
31
+ flwr_dir: str,
32
+ get_run: Callable[[int], Run],
33
+ ) -> None:
34
+ self.appio_api_address = appio_api_address
35
+ self.flwr_dir = flwr_dir
36
+ self.get_run = get_run
37
+
38
+ @abstractmethod
39
+ def select_run_id(self, candidate_run_ids: Sequence[int]) -> Optional[int]:
40
+ """Select a run ID to execute from a sequence of candidates.
41
+
42
+ A candidate run ID is one that has at least one pending message and is
43
+ not currently in progress (i.e., not associated with a token).
44
+
45
+ Parameters
46
+ ----------
47
+ candidate_run_ids : Sequence[int]
48
+ A sequence of candidate run IDs to choose from.
49
+
50
+ Returns
51
+ -------
52
+ Optional[int]
53
+ The selected run ID, or None if no suitable candidate is found.
54
+ """
55
+
56
+ @abstractmethod
57
+ def launch_app(self, token: str, run_id: int) -> None:
58
+ """Launch the application associated with a given run ID and token.
59
+
60
+ This method starts the application process using the given `token`.
61
+ The `run_id` is used solely for bookkeeping purposes, allowing any
62
+ scheduler implementation to associate this launch with a specific run.
63
+
64
+ Parameters
65
+ ----------
66
+ token : str
67
+ The token required to run the application.
68
+ run_id : int
69
+ The ID of the run associated with the token, used for tracking or
70
+ logging purposes.
71
+ """
@@ -0,0 +1,22 @@
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 ClientApp Scheduler."""
16
+
17
+
18
+ from .simple_clientapp_scheduler_plugin import SimpleClientAppSchedulerPlugin
19
+
20
+ __all__ = [
21
+ "SimpleClientAppSchedulerPlugin",
22
+ ]
@@ -0,0 +1,49 @@
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
+ """Simple Flower ClientApp Scheduler plugin."""
16
+
17
+
18
+ import os
19
+ import subprocess
20
+ from collections.abc import Sequence
21
+ from typing import Optional
22
+
23
+ from flwr.supercore.scheduler import SchedulerPlugin
24
+
25
+
26
+ class SimpleClientAppSchedulerPlugin(SchedulerPlugin):
27
+ """Simple Flower ClientApp Scheduler plugin.
28
+
29
+ The plugin always selects the first candidate run ID.
30
+ """
31
+
32
+ def select_run_id(self, candidate_run_ids: Sequence[int]) -> Optional[int]:
33
+ """Select a run ID to execute from a sequence of candidates."""
34
+ if not candidate_run_ids:
35
+ return None
36
+ return candidate_run_ids[0]
37
+
38
+ def launch_app(self, token: str, run_id: int) -> None:
39
+ """Launch the application associated with a given run ID and token."""
40
+ cmds = ["flwr-clientapp", "--insecure"]
41
+ cmds += ["--clientappio-api-address", self.appio_api_address]
42
+ cmds += ["--token", token]
43
+ cmds += ["--parent-pid", str(os.getpid())]
44
+ cmds += ["--flwr-dir", self.flwr_dir]
45
+ # Launch the client app without waiting for it to complete.
46
+ # Since we don't need to manage the process, we intentionally avoid using
47
+ # a `with` statement. Suppress the pylint warning for it in this case.
48
+ # pylint: disable-next=consider-using-with
49
+ subprocess.Popen(cmds)
@@ -23,7 +23,7 @@ from contextlib import contextmanager
23
23
  from functools import partial
24
24
  from logging import INFO, WARN
25
25
  from pathlib import Path
26
- from typing import Callable, Optional, Union
26
+ from typing import Callable, Optional, Union, cast
27
27
 
28
28
  import grpc
29
29
  from cryptography.hazmat.primitives.asymmetric import ec
@@ -384,23 +384,29 @@ def _push_messages(
384
384
 
385
385
  # Define the iterator for yielding object contents
386
386
  # This will yield (object_id, content) pairs
387
- def yield_object_contents(_obj_tree: ObjectTree) -> Iterator[tuple[str, bytes]]:
387
+ def yield_object_contents(
388
+ _obj_tree: ObjectTree, obj_id_set: set[str]
389
+ ) -> Iterator[tuple[str, bytes]]:
388
390
  for tree in iterate_object_tree(_obj_tree):
389
- while (content := object_store.get(tree.object_id)) is None:
391
+ if tree.object_id not in obj_id_set:
392
+ continue
393
+ while (content := object_store.get(tree.object_id)) == b"":
390
394
  # Wait for the content to be available
391
395
  time.sleep(0.5)
392
-
393
- yield tree.object_id, content
396
+ # At this point, content is guaranteed to be available
397
+ # therefore we can yield it after casting it to bytes
398
+ yield tree.object_id, cast(bytes, content)
394
399
 
395
400
  # Send the message
396
401
  try:
397
402
  # Send the reply message with its ObjectTree
398
- send(message, object_tree)
403
+ # Get the IDs of objects to send
404
+ ids_obj_to_send = send(message, object_tree)
399
405
 
400
406
  # Push object contents from the ObjectStore
401
407
  run_id = message.metadata.run_id
402
408
  push_object_contents_from_iterable(
403
- yield_object_contents(object_tree),
409
+ yield_object_contents(object_tree, ids_obj_to_send),
404
410
  # Use functools.partial to bind run_id explicitly,
405
411
  # avoiding late binding issues and satisfying flake8 (B023)
406
412
  # Equivalent to:
@@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api"
4
4
 
5
5
  [tool.poetry]
6
6
  name = "flwr-nightly"
7
- version = "1.20.0.dev20250721"
7
+ version = "1.20.0.dev20250723"
8
8
  description = "Flower: A Friendly Federated AI Framework"
9
9
  license = "Apache-2.0"
10
10
  authors = ["The Flower Authors <hello@flower.ai>"]