flwr-nightly 1.19.0.dev20250604__tar.gz → 1.19.0.dev20250606__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 (363) hide show
  1. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/PKG-INFO +1 -1
  2. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/client/grpc_rere_client/connection.py +18 -8
  3. flwr_nightly-1.19.0.dev20250606/py/flwr/common/inflatable_grpc_utils.py +227 -0
  4. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/message.py +11 -0
  5. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/compat/app_utils.py +50 -28
  6. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/grid/grpc_grid.py +17 -8
  7. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/pyproject.toml +1 -1
  8. flwr_nightly-1.19.0.dev20250604/py/flwr/common/inflatable_grpc_utils.py +0 -122
  9. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/README.md +0 -0
  10. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/__init__.py +0 -0
  11. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/app/__init__.py +0 -0
  12. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/app/error.py +0 -0
  13. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/app/metadata.py +0 -0
  14. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/__init__.py +0 -0
  15. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/app.py +0 -0
  16. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/auth_plugin/__init__.py +0 -0
  17. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/auth_plugin/oidc_cli_plugin.py +0 -0
  18. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/build.py +0 -0
  19. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/cli_user_auth_interceptor.py +0 -0
  20. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/config_utils.py +0 -0
  21. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/constant.py +0 -0
  22. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/example.py +0 -0
  23. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/install.py +0 -0
  24. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/log.py +0 -0
  25. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/login/__init__.py +0 -0
  26. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/login/login.py +0 -0
  27. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/ls.py +0 -0
  28. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/__init__.py +0 -0
  29. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/new.py +0 -0
  30. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/__init__.py +0 -0
  31. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/.gitignore.tpl +0 -0
  32. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/LICENSE.tpl +0 -0
  33. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/README.baseline.md.tpl +0 -0
  34. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/README.flowertune.md.tpl +0 -0
  35. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/README.md.tpl +0 -0
  36. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/__init__.py +0 -0
  37. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/code/__init__.baseline.py.tpl +0 -0
  38. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
  39. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
  40. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/code/client.baseline.py.tpl +0 -0
  41. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/code/client.huggingface.py.tpl +0 -0
  42. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/code/client.jax.py.tpl +0 -0
  43. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/code/client.mlx.py.tpl +0 -0
  44. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/code/client.numpy.py.tpl +0 -0
  45. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -0
  46. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl +0 -0
  47. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -0
  48. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/code/dataset.baseline.py.tpl +0 -0
  49. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/code/flwr_tune/__init__.py +0 -0
  50. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/code/flwr_tune/client_app.py.tpl +0 -0
  51. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/code/flwr_tune/dataset.py.tpl +0 -0
  52. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/code/flwr_tune/models.py.tpl +0 -0
  53. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/code/flwr_tune/server_app.py.tpl +0 -0
  54. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/code/flwr_tune/strategy.py.tpl +0 -0
  55. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/code/model.baseline.py.tpl +0 -0
  56. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/code/server.baseline.py.tpl +0 -0
  57. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/code/server.huggingface.py.tpl +0 -0
  58. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/code/server.jax.py.tpl +0 -0
  59. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/code/server.mlx.py.tpl +0 -0
  60. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -0
  61. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -0
  62. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/code/server.sklearn.py.tpl +0 -0
  63. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -0
  64. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/code/strategy.baseline.py.tpl +0 -0
  65. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/code/task.huggingface.py.tpl +0 -0
  66. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/code/task.jax.py.tpl +0 -0
  67. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/code/task.mlx.py.tpl +0 -0
  68. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/code/task.numpy.py.tpl +0 -0
  69. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +0 -0
  70. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/code/task.sklearn.py.tpl +0 -0
  71. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/code/task.tensorflow.py.tpl +0 -0
  72. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/code/utils.baseline.py.tpl +0 -0
  73. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/pyproject.baseline.toml.tpl +0 -0
  74. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +0 -0
  75. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl +0 -0
  76. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/pyproject.jax.toml.tpl +0 -0
  77. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +0 -0
  78. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +0 -0
  79. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +0 -0
  80. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +0 -0
  81. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +0 -0
  82. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/run/__init__.py +0 -0
  83. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/run/run.py +0 -0
  84. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/stop.py +0 -0
  85. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/utils.py +0 -0
  86. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/client/__init__.py +0 -0
  87. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/client/client.py +0 -0
  88. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/client/client_app.py +0 -0
  89. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/client/clientapp/__init__.py +0 -0
  90. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/client/clientapp/utils.py +0 -0
  91. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/client/dpfedavg_numpy_client.py +0 -0
  92. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/client/grpc_adapter_client/__init__.py +0 -0
  93. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/client/grpc_adapter_client/connection.py +0 -0
  94. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/client/grpc_rere_client/__init__.py +0 -0
  95. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/client/grpc_rere_client/client_interceptor.py +0 -0
  96. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/client/grpc_rere_client/grpc_adapter.py +0 -0
  97. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/client/message_handler/__init__.py +0 -0
  98. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/client/message_handler/message_handler.py +0 -0
  99. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/client/mod/__init__.py +0 -0
  100. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/client/mod/centraldp_mods.py +0 -0
  101. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/client/mod/comms_mods.py +0 -0
  102. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/client/mod/localdp_mod.py +0 -0
  103. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
  104. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
  105. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
  106. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/client/mod/utils.py +0 -0
  107. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/client/numpy_client.py +0 -0
  108. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/client/rest_client/__init__.py +0 -0
  109. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/client/rest_client/connection.py +0 -0
  110. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/client/run_info_store.py +0 -0
  111. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/client/typing.py +0 -0
  112. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/clientapp/__init__.py +0 -0
  113. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/__init__.py +0 -0
  114. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/address.py +0 -0
  115. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/args.py +0 -0
  116. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/auth_plugin/__init__.py +0 -0
  117. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/auth_plugin/auth_plugin.py +0 -0
  118. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/config.py +0 -0
  119. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/constant.py +0 -0
  120. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/context.py +0 -0
  121. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/date.py +0 -0
  122. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/differential_privacy.py +0 -0
  123. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/differential_privacy_constants.py +0 -0
  124. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/dp.py +0 -0
  125. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/event_log_plugin/__init__.py +0 -0
  126. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/event_log_plugin/event_log_plugin.py +0 -0
  127. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/exit/__init__.py +0 -0
  128. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/exit/exit.py +0 -0
  129. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/exit/exit_code.py +0 -0
  130. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/exit_handlers.py +0 -0
  131. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/grpc.py +0 -0
  132. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/heartbeat.py +0 -0
  133. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/inflatable.py +0 -0
  134. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/logger.py +0 -0
  135. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/object_ref.py +0 -0
  136. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/parameter.py +0 -0
  137. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/pyproject.py +0 -0
  138. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/record/__init__.py +0 -0
  139. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/record/array.py +0 -0
  140. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/record/arrayrecord.py +0 -0
  141. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/record/configrecord.py +0 -0
  142. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/record/conversion_utils.py +0 -0
  143. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/record/metricrecord.py +0 -0
  144. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/record/recorddict.py +0 -0
  145. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/record/typeddict.py +0 -0
  146. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/recorddict_compat.py +0 -0
  147. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/retry_invoker.py +0 -0
  148. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/secure_aggregation/__init__.py +0 -0
  149. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
  150. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
  151. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -0
  152. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
  153. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/secure_aggregation/quantization.py +0 -0
  154. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
  155. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
  156. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/serde.py +0 -0
  157. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/serde_utils.py +0 -0
  158. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/telemetry.py +0 -0
  159. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/typing.py +0 -0
  160. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/version.py +0 -0
  161. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/compat/__init__.py +0 -0
  162. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/compat/client/__init__.py +0 -0
  163. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/compat/client/app.py +0 -0
  164. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/compat/client/grpc_client/__init__.py +0 -0
  165. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/compat/client/grpc_client/connection.py +0 -0
  166. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/compat/common/__init__.py +0 -0
  167. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/compat/server/__init__.py +0 -0
  168. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/compat/server/app.py +0 -0
  169. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/compat/simulation/__init__.py +0 -0
  170. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/__init__.py +0 -0
  171. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/clientappio_pb2.py +0 -0
  172. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/clientappio_pb2.pyi +0 -0
  173. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/clientappio_pb2_grpc.py +0 -0
  174. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/clientappio_pb2_grpc.pyi +0 -0
  175. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/error_pb2.py +0 -0
  176. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/error_pb2.pyi +0 -0
  177. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/error_pb2_grpc.py +0 -0
  178. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/error_pb2_grpc.pyi +0 -0
  179. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/exec_pb2.py +0 -0
  180. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/exec_pb2.pyi +0 -0
  181. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/exec_pb2_grpc.py +0 -0
  182. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/exec_pb2_grpc.pyi +0 -0
  183. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/fab_pb2.py +0 -0
  184. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/fab_pb2.pyi +0 -0
  185. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/fab_pb2_grpc.py +0 -0
  186. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/fab_pb2_grpc.pyi +0 -0
  187. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/fleet_pb2.py +0 -0
  188. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/fleet_pb2.pyi +0 -0
  189. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/fleet_pb2_grpc.py +0 -0
  190. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
  191. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/grpcadapter_pb2.py +0 -0
  192. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/grpcadapter_pb2.pyi +0 -0
  193. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/grpcadapter_pb2_grpc.py +0 -0
  194. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/grpcadapter_pb2_grpc.pyi +0 -0
  195. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/heartbeat_pb2.py +0 -0
  196. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/heartbeat_pb2.pyi +0 -0
  197. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/heartbeat_pb2_grpc.py +0 -0
  198. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/heartbeat_pb2_grpc.pyi +0 -0
  199. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/log_pb2.py +0 -0
  200. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/log_pb2.pyi +0 -0
  201. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/log_pb2_grpc.py +0 -0
  202. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/log_pb2_grpc.pyi +0 -0
  203. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/message_pb2.py +0 -0
  204. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/message_pb2.pyi +0 -0
  205. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/message_pb2_grpc.py +0 -0
  206. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/message_pb2_grpc.pyi +0 -0
  207. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/node_pb2.py +0 -0
  208. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/node_pb2.pyi +0 -0
  209. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/node_pb2_grpc.py +0 -0
  210. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/node_pb2_grpc.pyi +0 -0
  211. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/recorddict_pb2.py +0 -0
  212. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/recorddict_pb2.pyi +0 -0
  213. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/recorddict_pb2_grpc.py +0 -0
  214. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/recorddict_pb2_grpc.pyi +0 -0
  215. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/run_pb2.py +0 -0
  216. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/run_pb2.pyi +0 -0
  217. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/run_pb2_grpc.py +0 -0
  218. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/run_pb2_grpc.pyi +0 -0
  219. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/serverappio_pb2.py +0 -0
  220. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/serverappio_pb2.pyi +0 -0
  221. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/serverappio_pb2_grpc.py +0 -0
  222. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/serverappio_pb2_grpc.pyi +0 -0
  223. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/simulationio_pb2.py +0 -0
  224. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/simulationio_pb2.pyi +0 -0
  225. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/simulationio_pb2_grpc.py +0 -0
  226. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/simulationio_pb2_grpc.pyi +0 -0
  227. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/transport_pb2.py +0 -0
  228. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/transport_pb2.pyi +0 -0
  229. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/transport_pb2_grpc.py +0 -0
  230. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
  231. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/py.typed +0 -0
  232. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/__init__.py +0 -0
  233. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/app.py +0 -0
  234. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/client_manager.py +0 -0
  235. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/client_proxy.py +0 -0
  236. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/compat/__init__.py +0 -0
  237. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/compat/app.py +0 -0
  238. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/compat/grid_client_proxy.py +0 -0
  239. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/compat/legacy_context.py +0 -0
  240. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/criterion.py +0 -0
  241. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/fleet_event_log_interceptor.py +0 -0
  242. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/grid/__init__.py +0 -0
  243. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/grid/grid.py +0 -0
  244. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/grid/inmemory_grid.py +0 -0
  245. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/history.py +0 -0
  246. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/run_serverapp.py +0 -0
  247. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/server.py +0 -0
  248. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/server_app.py +0 -0
  249. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/server_config.py +0 -0
  250. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/serverapp/__init__.py +0 -0
  251. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/serverapp/app.py +0 -0
  252. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/serverapp_components.py +0 -0
  253. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/strategy/__init__.py +0 -0
  254. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/strategy/aggregate.py +0 -0
  255. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/strategy/bulyan.py +0 -0
  256. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
  257. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
  258. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
  259. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
  260. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
  261. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/strategy/fedadagrad.py +0 -0
  262. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/strategy/fedadam.py +0 -0
  263. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/strategy/fedavg.py +0 -0
  264. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/strategy/fedavg_android.py +0 -0
  265. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/strategy/fedavgm.py +0 -0
  266. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/strategy/fedmedian.py +0 -0
  267. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/strategy/fedopt.py +0 -0
  268. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/strategy/fedprox.py +0 -0
  269. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
  270. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
  271. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
  272. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
  273. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/strategy/fedyogi.py +0 -0
  274. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/strategy/krum.py +0 -0
  275. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/strategy/qfedavg.py +0 -0
  276. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/strategy/strategy.py +0 -0
  277. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/superlink/__init__.py +0 -0
  278. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/superlink/ffs/__init__.py +0 -0
  279. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/superlink/ffs/disk_ffs.py +0 -0
  280. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/superlink/ffs/ffs.py +0 -0
  281. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/superlink/ffs/ffs_factory.py +0 -0
  282. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/superlink/fleet/__init__.py +0 -0
  283. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/superlink/fleet/grpc_adapter/__init__.py +0 -0
  284. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +0 -0
  285. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
  286. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
  287. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
  288. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
  289. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +0 -0
  290. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
  291. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +0 -0
  292. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +0 -0
  293. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
  294. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/superlink/fleet/message_handler/message_handler.py +0 -0
  295. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
  296. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +0 -0
  297. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
  298. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
  299. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
  300. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +0 -0
  301. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/superlink/fleet/vce/vce_api.py +0 -0
  302. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/superlink/linkstate/__init__.py +0 -0
  303. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/superlink/linkstate/in_memory_linkstate.py +0 -0
  304. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/superlink/linkstate/linkstate.py +0 -0
  305. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/superlink/linkstate/linkstate_factory.py +0 -0
  306. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/superlink/linkstate/sqlite_linkstate.py +0 -0
  307. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/superlink/linkstate/utils.py +0 -0
  308. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/superlink/serverappio/__init__.py +0 -0
  309. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/superlink/serverappio/serverappio_grpc.py +0 -0
  310. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/superlink/serverappio/serverappio_servicer.py +0 -0
  311. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/superlink/simulation/__init__.py +0 -0
  312. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/superlink/simulation/simulationio_grpc.py +0 -0
  313. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/superlink/simulation/simulationio_servicer.py +0 -0
  314. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/superlink/utils.py +0 -0
  315. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/typing.py +0 -0
  316. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/utils/__init__.py +0 -0
  317. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/utils/tensorboard.py +0 -0
  318. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/utils/validator.py +0 -0
  319. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/workflow/__init__.py +0 -0
  320. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/workflow/constant.py +0 -0
  321. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/workflow/default_workflows.py +0 -0
  322. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
  323. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
  324. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +0 -0
  325. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/serverapp/__init__.py +0 -0
  326. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/simulation/__init__.py +0 -0
  327. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/simulation/app.py +0 -0
  328. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/simulation/legacy_app.py +0 -0
  329. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/simulation/ray_transport/__init__.py +0 -0
  330. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
  331. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
  332. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/simulation/ray_transport/utils.py +0 -0
  333. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/simulation/run_simulation.py +0 -0
  334. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/simulation/simulationio_connection.py +0 -0
  335. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/supercore/__init__.py +0 -0
  336. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/supercore/object_store/__init__.py +0 -0
  337. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/supercore/object_store/in_memory_object_store.py +0 -0
  338. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/supercore/object_store/object_store.py +0 -0
  339. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/supercore/object_store/object_store_factory.py +0 -0
  340. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/superexec/__init__.py +0 -0
  341. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/superexec/app.py +0 -0
  342. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/superexec/deployment.py +0 -0
  343. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/superexec/exec_event_log_interceptor.py +0 -0
  344. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/superexec/exec_grpc.py +0 -0
  345. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/superexec/exec_servicer.py +0 -0
  346. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/superexec/exec_user_auth_interceptor.py +0 -0
  347. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/superexec/executor.py +0 -0
  348. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/superexec/simulation.py +0 -0
  349. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/superlink/__init__.py +0 -0
  350. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/supernode/__init__.py +0 -0
  351. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/supernode/cli/__init__.py +0 -0
  352. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/supernode/cli/flower_supernode.py +0 -0
  353. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/supernode/cli/flwr_clientapp.py +0 -0
  354. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/supernode/nodestate/__init__.py +0 -0
  355. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/supernode/nodestate/in_memory_nodestate.py +0 -0
  356. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/supernode/nodestate/nodestate.py +0 -0
  357. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/supernode/nodestate/nodestate_factory.py +0 -0
  358. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/supernode/runtime/__init__.py +0 -0
  359. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/supernode/runtime/run_clientapp.py +0 -0
  360. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/supernode/servicer/__init__.py +0 -0
  361. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/supernode/servicer/clientappio/__init__.py +0 -0
  362. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/supernode/servicer/clientappio/clientappio_servicer.py +0 -0
  363. {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/supernode/start_client_internal.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: flwr-nightly
3
- Version: 1.19.0.dev20250604
3
+ Version: 1.19.0.dev20250606
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
@@ -31,11 +31,17 @@ from flwr.common.constant import HEARTBEAT_CALL_TIMEOUT, HEARTBEAT_DEFAULT_INTER
31
31
  from flwr.common.grpc import create_channel, on_channel_state_change
32
32
  from flwr.common.heartbeat import HeartbeatSender
33
33
  from flwr.common.inflatable_grpc_utils import (
34
+ make_pull_object_fn_grpc,
35
+ make_push_object_fn_grpc,
34
36
  pull_object_from_servicer,
35
37
  push_object_to_servicer,
36
38
  )
37
39
  from flwr.common.logger import log
38
- from flwr.common.message import Message, get_message_to_descendant_id_mapping
40
+ from flwr.common.message import (
41
+ Message,
42
+ get_message_to_descendant_id_mapping,
43
+ remove_content_from_message,
44
+ )
39
45
  from flwr.common.retry_invoker import RetryInvoker, _wrap_stub
40
46
  from flwr.common.secure_aggregation.crypto.symmetric_encryption import (
41
47
  generate_key_pairs,
@@ -265,9 +271,11 @@ def grpc_request_response( # pylint: disable=R0913,R0914,R0915,R0917
265
271
  Message,
266
272
  pull_object_from_servicer(
267
273
  object_id=message_proto.metadata.message_id,
268
- stub=stub,
269
- node=node,
270
- run_id=message_proto.metadata.run_id,
274
+ pull_object_fn=make_pull_object_fn_grpc(
275
+ pull_object_grpc=stub.PullObject,
276
+ node=node,
277
+ run_id=message_proto.metadata.run_id,
278
+ ),
271
279
  ),
272
280
  )
273
281
 
@@ -305,7 +313,7 @@ def grpc_request_response( # pylint: disable=R0913,R0914,R0915,R0917
305
313
  return
306
314
 
307
315
  # Serialize Message
308
- message_proto = message_to_proto(message=message)
316
+ message_proto = message_to_proto(message=remove_content_from_message(message))
309
317
  descendants_mapping = get_message_to_descendant_id_mapping(message)
310
318
  request = PushMessagesRequest(
311
319
  node=node,
@@ -318,9 +326,11 @@ def grpc_request_response( # pylint: disable=R0913,R0914,R0915,R0917
318
326
  objs_to_push = set(response.objects_to_push[message.object_id].object_ids)
319
327
  push_object_to_servicer(
320
328
  message,
321
- stub,
322
- node,
323
- run_id=message.metadata.run_id,
329
+ push_object_fn=make_push_object_fn_grpc(
330
+ push_object_grpc=stub.PushObject,
331
+ node=node,
332
+ run_id=message.metadata.run_id,
333
+ ),
324
334
  object_ids_to_push=objs_to_push,
325
335
  )
326
336
  log(DEBUG, "Pushed %s objects to servicer.", len(objs_to_push))
@@ -0,0 +1,227 @@
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
+ """InflatableObject utils."""
16
+
17
+
18
+ from time import sleep
19
+ from typing import Callable, Optional
20
+
21
+ from flwr.proto.message_pb2 import ( # pylint: disable=E0611
22
+ PullObjectRequest,
23
+ PullObjectResponse,
24
+ PushObjectRequest,
25
+ PushObjectResponse,
26
+ )
27
+ from flwr.proto.node_pb2 import Node # pylint: disable=E0611
28
+
29
+ from .inflatable import (
30
+ InflatableObject,
31
+ get_object_head_values_from_object_content,
32
+ get_object_id,
33
+ )
34
+ from .message import Message
35
+ from .record import Array, ArrayRecord, ConfigRecord, MetricRecord, RecordDict
36
+
37
+ # Helper registry that maps names of classes to their type
38
+ inflatable_class_registry: dict[str, type[InflatableObject]] = {
39
+ Array.__qualname__: Array,
40
+ ArrayRecord.__qualname__: ArrayRecord,
41
+ ConfigRecord.__qualname__: ConfigRecord,
42
+ Message.__qualname__: Message,
43
+ MetricRecord.__qualname__: MetricRecord,
44
+ RecordDict.__qualname__: RecordDict,
45
+ }
46
+
47
+
48
+ class ObjectUnavailableError(Exception):
49
+ """Exception raised when an object has been pre-registered but is not yet
50
+ available."""
51
+
52
+ def __init__(self, object_id: str):
53
+ super().__init__(f"Object with ID '{object_id}' is not yet available.")
54
+
55
+
56
+ class ObjectIdNotPreregisteredError(Exception):
57
+ """Exception raised when an object ID is not pre-registered."""
58
+
59
+ def __init__(self, object_id: str):
60
+ super().__init__(f"Object with ID '{object_id}' could not be found.")
61
+
62
+
63
+ def push_object_to_servicer(
64
+ obj: InflatableObject,
65
+ push_object_fn: Callable[[str, bytes], None],
66
+ object_ids_to_push: Optional[set[str]] = None,
67
+ ) -> set[str]:
68
+ """Recursively deflate an object and push it to the servicer.
69
+
70
+ Objects with the same ID are not pushed twice. If `object_ids_to_push` is set,
71
+ only objects with those IDs are pushed. It returns the set of pushed object
72
+ IDs.
73
+
74
+ Parameters
75
+ ----------
76
+ obj : InflatableObject
77
+ The object to push.
78
+ push_object_fn : Callable[[str, bytes], None]
79
+ A function that takes an object ID and its content as bytes, and pushes
80
+ it to the servicer. This function should raise `ObjectIdNotPreregisteredError`
81
+ if the object ID is not pre-registered.
82
+ object_ids_to_push : Optional[set[str]] (default: None)
83
+ A set of object IDs to push. If object ID of the given object is not in this
84
+ set, the object will not be pushed.
85
+
86
+ Returns
87
+ -------
88
+ set[str]
89
+ A set of object IDs that were pushed to the servicer.
90
+ """
91
+ pushed_object_ids: set[str] = set()
92
+ # Push children if it has any
93
+ if children := obj.children:
94
+ for child in children.values():
95
+ pushed_object_ids |= push_object_to_servicer(
96
+ child, push_object_fn, object_ids_to_push
97
+ )
98
+
99
+ # Deflate object and push
100
+ object_content = obj.deflate()
101
+ object_id = get_object_id(object_content)
102
+ # Push always if no object set is specified, or if the object is in the set
103
+ if object_ids_to_push is None or object_id in object_ids_to_push:
104
+ # The function may raise an error if the object ID is not pre-registered
105
+ push_object_fn(object_id, object_content)
106
+ pushed_object_ids.add(object_id)
107
+
108
+ return pushed_object_ids
109
+
110
+
111
+ def pull_object_from_servicer(
112
+ object_id: str,
113
+ pull_object_fn: Callable[[str], bytes],
114
+ ) -> InflatableObject:
115
+ """Recursively inflate an object by pulling it from the servicer.
116
+
117
+ Parameters
118
+ ----------
119
+ object_id : str
120
+ The ID of the object to pull.
121
+ pull_object_fn : Callable[[str], bytes]
122
+ A function that takes an object ID and returns the object content as bytes.
123
+ The function should raise `ObjectUnavailableError` if the object is not yet
124
+ available, or `ObjectIdNotPreregisteredError` if the object ID is not
125
+ pre-registered.
126
+
127
+ Returns
128
+ -------
129
+ InflatableObject
130
+ The pulled object.
131
+ """
132
+ # Pull object
133
+ while True:
134
+ try:
135
+ # The function may raise an error if the object ID is not pre-registered
136
+ object_content: bytes = pull_object_fn(object_id)
137
+ break # Exit loop if object is successfully pulled
138
+ except ObjectUnavailableError:
139
+ sleep(0.1) # Retry after a short delay
140
+
141
+ # Extract object class and object_ids of children
142
+ obj_type, children_obj_ids, _ = get_object_head_values_from_object_content(
143
+ object_content=object_content
144
+ )
145
+ # Resolve object class
146
+ cls_type = inflatable_class_registry[obj_type]
147
+
148
+ # Pull all children objects
149
+ children: dict[str, InflatableObject] = {}
150
+ for child_object_id in children_obj_ids:
151
+ children[child_object_id] = pull_object_from_servicer(
152
+ child_object_id, pull_object_fn
153
+ )
154
+
155
+ # Inflate object passing its children
156
+ return cls_type.inflate(object_content, children=children)
157
+
158
+
159
+ def make_pull_object_fn_grpc(
160
+ pull_object_grpc: Callable[[PullObjectRequest], PullObjectResponse],
161
+ node: Node,
162
+ run_id: int,
163
+ ) -> Callable[[str], bytes]:
164
+ """Create a pull object function that uses gRPC to pull objects.
165
+
166
+ Parameters
167
+ ----------
168
+ pull_object_grpc : Callable[[PullObjectRequest], PullObjectResponse]
169
+ The gRPC function to pull objects, e.g., `FleetStub.PullObject`.
170
+ node : Node
171
+ The node making the request.
172
+ run_id : int
173
+ The run ID for the current operation.
174
+
175
+ Returns
176
+ -------
177
+ Callable[[str], bytes]
178
+ A function that takes an object ID and returns the object content as bytes.
179
+ The function raises `ObjectIdNotPreregisteredError` if the object ID is not
180
+ pre-registered, or `ObjectUnavailableError` if the object is not yet available.
181
+ """
182
+
183
+ def pull_object_fn(object_id: str) -> bytes:
184
+ request = PullObjectRequest(node=node, run_id=run_id, object_id=object_id)
185
+ response: PullObjectResponse = pull_object_grpc(request)
186
+ if not response.object_found:
187
+ raise ObjectIdNotPreregisteredError(object_id)
188
+ if not response.object_available:
189
+ raise ObjectUnavailableError(object_id)
190
+ return response.object_content
191
+
192
+ return pull_object_fn
193
+
194
+
195
+ def make_push_object_fn_grpc(
196
+ push_object_grpc: Callable[[PushObjectRequest], PushObjectResponse],
197
+ node: Node,
198
+ run_id: int,
199
+ ) -> Callable[[str, bytes], None]:
200
+ """Create a push object function that uses gRPC to push objects.
201
+
202
+ Parameters
203
+ ----------
204
+ push_object_grpc : Callable[[PushObjectRequest], PushObjectResponse]
205
+ The gRPC function to push objects, e.g., `FleetStub.PushObject`.
206
+ node : Node
207
+ The node making the request.
208
+ run_id : int
209
+ The run ID for the current operation.
210
+
211
+ Returns
212
+ -------
213
+ Callable[[str, bytes], None]
214
+ A function that takes an object ID and its content as bytes, and pushes it
215
+ to the servicer. The function raises `ObjectIdNotPreregisteredError` if
216
+ the object ID is not pre-registered.
217
+ """
218
+
219
+ def push_object_fn(object_id: str, object_content: bytes) -> None:
220
+ request = PushObjectRequest(
221
+ node=node, run_id=run_id, object_id=object_id, object_content=object_content
222
+ )
223
+ response: PushObjectResponse = push_object_grpc(request)
224
+ if not response.stored:
225
+ raise ObjectIdNotPreregisteredError(object_id)
226
+
227
+ return push_object_fn
@@ -426,6 +426,17 @@ def make_message(
426
426
  return Message(metadata=metadata, content=content, error=error) # type: ignore
427
427
 
428
428
 
429
+ def remove_content_from_message(message: Message) -> Message:
430
+ """Return a copy of the Message but with an empty RecordDict as content.
431
+
432
+ If message has no content, it returns itself.
433
+ """
434
+ if message.has_error():
435
+ return message
436
+
437
+ return make_message(metadata=message.metadata, content=RecordDict())
438
+
439
+
429
440
  def _limit_reply_ttl(
430
441
  current: float, reply_ttl: float | None, reply_to: Message
431
442
  ) -> float:
@@ -16,6 +16,7 @@
16
16
 
17
17
 
18
18
  import threading
19
+ from typing import Any, Callable
19
20
 
20
21
  from flwr.common.typing import RunNotRunningException
21
22
 
@@ -80,36 +81,57 @@ def _update_client_manager(
80
81
  """Update the nodes list in the client manager."""
81
82
  # Loop until the grid is disconnected
82
83
  registered_nodes: dict[int, GridClientProxy] = {}
84
+ lock = threading.RLock()
85
+
86
+ def update_registered_nodes() -> None:
87
+ with lock:
88
+ all_node_ids = set(grid.get_node_ids())
89
+ dead_nodes = set(registered_nodes).difference(all_node_ids)
90
+ new_nodes = all_node_ids.difference(registered_nodes)
91
+
92
+ # Unregister dead nodes
93
+ for node_id in dead_nodes:
94
+ client_proxy = registered_nodes[node_id]
95
+ client_manager.unregister(client_proxy)
96
+ del registered_nodes[node_id]
97
+
98
+ # Register new nodes
99
+ for node_id in new_nodes:
100
+ client_proxy = GridClientProxy(
101
+ node_id=node_id,
102
+ grid=grid,
103
+ run_id=grid.run.run_id,
104
+ )
105
+ if client_manager.register(client_proxy):
106
+ registered_nodes[node_id] = client_proxy
107
+ else:
108
+ raise RuntimeError("Could not register node.")
109
+
110
+ # Get the wrapped method of ClientManager instance
111
+ def get_wrapped_method(method_name: str) -> Callable[..., Any]:
112
+ original_method = getattr(client_manager, method_name)
113
+
114
+ def wrapped_method(*args: Any, **kwargs: Any) -> Any:
115
+ # Update registered nodes before calling the original method
116
+ update_registered_nodes()
117
+ return original_method(*args, **kwargs)
118
+
119
+ return wrapped_method
120
+
121
+ # Wrap the ClientManager
122
+ for method_name in ["num_available", "all", "sample"]:
123
+ setattr(client_manager, method_name, get_wrapped_method(method_name))
124
+
125
+ c_done.set()
126
+
83
127
  while not f_stop.is_set():
128
+ # Sleep for 5 seconds
129
+ if not f_stop.is_set():
130
+ f_stop.wait(5)
131
+
84
132
  try:
85
- all_node_ids = set(grid.get_node_ids())
133
+ # Update registered nodes
134
+ update_registered_nodes()
86
135
  except RunNotRunningException:
87
136
  f_stop.set()
88
137
  break
89
- dead_nodes = set(registered_nodes).difference(all_node_ids)
90
- new_nodes = all_node_ids.difference(registered_nodes)
91
-
92
- # Unregister dead nodes
93
- for node_id in dead_nodes:
94
- client_proxy = registered_nodes[node_id]
95
- client_manager.unregister(client_proxy)
96
- del registered_nodes[node_id]
97
-
98
- # Register new nodes
99
- for node_id in new_nodes:
100
- client_proxy = GridClientProxy(
101
- node_id=node_id,
102
- grid=grid,
103
- run_id=grid.run.run_id,
104
- )
105
- if client_manager.register(client_proxy):
106
- registered_nodes[node_id] = client_proxy
107
- else:
108
- raise RuntimeError("Could not register node.")
109
-
110
- # Flag first pass for nodes registration is completed
111
- c_done.set()
112
-
113
- # Sleep for 3 seconds
114
- if not f_stop.is_set():
115
- f_stop.wait(3)
@@ -29,11 +29,16 @@ from flwr.common.constant import (
29
29
  )
30
30
  from flwr.common.grpc import create_channel, on_channel_state_change
31
31
  from flwr.common.inflatable_grpc_utils import (
32
+ make_pull_object_fn_grpc,
33
+ make_push_object_fn_grpc,
32
34
  pull_object_from_servicer,
33
35
  push_object_to_servicer,
34
36
  )
35
37
  from flwr.common.logger import log, warn_deprecated_feature
36
- from flwr.common.message import get_message_to_descendant_id_mapping
38
+ from flwr.common.message import (
39
+ get_message_to_descendant_id_mapping,
40
+ remove_content_from_message,
41
+ )
37
42
  from flwr.common.retry_invoker import _make_simple_grpc_retry_invoker, _wrap_stub
38
43
  from flwr.common.serde import message_to_proto, run_from_proto
39
44
  from flwr.common.typing import Run
@@ -210,7 +215,7 @@ class GrpcGrid(Grid):
210
215
  # Call GrpcServerAppIoStub method
211
216
  res: PushInsMessagesResponse = self._stub.PushMessages(
212
217
  PushInsMessagesRequest(
213
- messages_list=[message_to_proto(message)],
218
+ messages_list=[message_to_proto(remove_content_from_message(message))],
214
219
  run_id=run_id,
215
220
  msg_to_descendant_mapping=descendants_mapping,
216
221
  )
@@ -224,9 +229,11 @@ class GrpcGrid(Grid):
224
229
  # Push only object that are not in the store
225
230
  push_object_to_servicer(
226
231
  message,
227
- self._stub,
228
- node=self.node,
229
- run_id=run_id,
232
+ push_object_fn=make_push_object_fn_grpc(
233
+ push_object_grpc=self._stub.PushObject,
234
+ node=self.node,
235
+ run_id=run_id,
236
+ ),
230
237
  object_ids_to_push=obj_ids_to_push,
231
238
  )
232
239
  return msg_id
@@ -289,9 +296,11 @@ class GrpcGrid(Grid):
289
296
 
290
297
  message = pull_object_from_servicer(
291
298
  msg_proto.metadata.message_id,
292
- self._stub,
293
- node=self.node,
294
- run_id=run_id,
299
+ pull_object_fn=make_pull_object_fn_grpc(
300
+ pull_object_grpc=self._stub.PullObject,
301
+ node=self.node,
302
+ run_id=run_id,
303
+ ),
295
304
  )
296
305
  inflated_msgs.append(cast(Message, message))
297
306
 
@@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api"
4
4
 
5
5
  [tool.poetry]
6
6
  name = "flwr-nightly"
7
- version = "1.19.0.dev20250604"
7
+ version = "1.19.0.dev20250606"
8
8
  description = "Flower: A Friendly Federated AI Framework"
9
9
  license = "Apache-2.0"
10
10
  authors = ["The Flower Authors <hello@flower.ai>"]
@@ -1,122 +0,0 @@
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
- """InflatableObject utils."""
16
-
17
-
18
- from time import sleep
19
- from typing import Optional, Union
20
-
21
- from flwr.client.grpc_rere_client.grpc_adapter import GrpcAdapter
22
- from flwr.proto.fleet_pb2_grpc import FleetStub # pylint: disable=E0611
23
- from flwr.proto.message_pb2 import ( # pylint: disable=E0611
24
- PullObjectRequest,
25
- PullObjectResponse,
26
- PushObjectRequest,
27
- PushObjectResponse,
28
- )
29
- from flwr.proto.node_pb2 import Node # pylint: disable=E0611
30
- from flwr.proto.serverappio_pb2_grpc import ServerAppIoStub # pylint: disable=E0611
31
-
32
- from .inflatable import (
33
- InflatableObject,
34
- get_object_head_values_from_object_content,
35
- get_object_id,
36
- )
37
- from .message import Message
38
- from .record import Array, ArrayRecord, ConfigRecord, MetricRecord, RecordDict
39
-
40
- # Helper registry that maps names of classes to their type
41
- inflatable_class_registry: dict[str, type[InflatableObject]] = {
42
- Array.__qualname__: Array,
43
- ArrayRecord.__qualname__: ArrayRecord,
44
- ConfigRecord.__qualname__: ConfigRecord,
45
- Message.__qualname__: Message,
46
- MetricRecord.__qualname__: MetricRecord,
47
- RecordDict.__qualname__: RecordDict,
48
- }
49
-
50
-
51
- def push_object_to_servicer(
52
- obj: InflatableObject,
53
- stub: Union[FleetStub, ServerAppIoStub, GrpcAdapter],
54
- node: Node,
55
- run_id: int,
56
- object_ids_to_push: Optional[set[str]] = None,
57
- ) -> set[str]:
58
- """Recursively deflate an object and push it to the servicer.
59
-
60
- Objects with the same ID are not pushed twice. If `object_ids_to_push` is set,
61
- only objects with those IDs are pushed. It returns the set of pushed object
62
- IDs.
63
- """
64
- pushed_object_ids: set[str] = set()
65
- # Push children if it has any
66
- if children := obj.children:
67
- for child in children.values():
68
- pushed_object_ids |= push_object_to_servicer(
69
- child, stub, node, run_id, object_ids_to_push
70
- )
71
-
72
- # Deflate object and push
73
- object_content = obj.deflate()
74
- object_id = get_object_id(object_content)
75
- # Push always if no object set is specified, or if the object is in the set
76
- if object_ids_to_push is None or object_id in object_ids_to_push:
77
- _: PushObjectResponse = stub.PushObject(
78
- PushObjectRequest(
79
- node=node,
80
- run_id=run_id,
81
- object_id=object_id,
82
- object_content=object_content,
83
- )
84
- )
85
- pushed_object_ids.add(object_id)
86
-
87
- return pushed_object_ids
88
-
89
-
90
- def pull_object_from_servicer(
91
- object_id: str,
92
- stub: Union[FleetStub, ServerAppIoStub, GrpcAdapter],
93
- node: Node,
94
- run_id: int,
95
- ) -> InflatableObject:
96
- """Recursively inflate an object by pulling it from the servicer."""
97
- # Pull object
98
- object_available = False
99
- while not object_available:
100
- object_proto: PullObjectResponse = stub.PullObject(
101
- PullObjectRequest(node=node, run_id=run_id, object_id=object_id)
102
- )
103
- object_available = object_proto.object_available
104
- object_content = object_proto.object_content
105
- sleep(0.1)
106
-
107
- # Extract object class and object_ids of children
108
- obj_type, children_obj_ids, _ = get_object_head_values_from_object_content(
109
- object_content=object_content
110
- )
111
- # Resolve object class
112
- cls_type = inflatable_class_registry[obj_type]
113
-
114
- # Pull all children objects
115
- children: dict[str, InflatableObject] = {}
116
- for child_object_id in children_obj_ids:
117
- children[child_object_id] = pull_object_from_servicer(
118
- child_object_id, stub, node, run_id
119
- )
120
-
121
- # Inflate object passing its children
122
- return cls_type.inflate(object_content, children=children)