flwr-nightly 1.19.0.dev20250609__tar.gz → 1.19.0.dev20250610__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 (364) hide show
  1. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/PKG-INFO +1 -1
  2. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/client/grpc_rere_client/connection.py +3 -1
  3. flwr_nightly-1.19.0.dev20250610/py/flwr/common/inflatable_grpc_utils.py +99 -0
  4. flwr_nightly-1.19.0.dev20250609/py/flwr/common/inflatable_grpc_utils.py → flwr_nightly-1.19.0.dev20250610/py/flwr/common/inflatable_utils.py +61 -82
  5. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/grid/grpc_grid.py +3 -1
  6. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +21 -56
  7. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/fleet/message_handler/message_handler.py +57 -1
  8. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/supernode/start_client_internal.py +101 -59
  9. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/pyproject.toml +1 -1
  10. flwr_nightly-1.19.0.dev20250609/py/flwr/common/inflatable_utils.py +0 -75
  11. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/README.md +0 -0
  12. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/__init__.py +0 -0
  13. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/app/__init__.py +0 -0
  14. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/app/error.py +0 -0
  15. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/app/metadata.py +0 -0
  16. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/__init__.py +0 -0
  17. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/app.py +0 -0
  18. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/auth_plugin/__init__.py +0 -0
  19. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/auth_plugin/oidc_cli_plugin.py +0 -0
  20. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/build.py +0 -0
  21. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/cli_user_auth_interceptor.py +0 -0
  22. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/config_utils.py +0 -0
  23. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/constant.py +0 -0
  24. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/example.py +0 -0
  25. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/install.py +0 -0
  26. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/log.py +0 -0
  27. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/login/__init__.py +0 -0
  28. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/login/login.py +0 -0
  29. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/ls.py +0 -0
  30. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/__init__.py +0 -0
  31. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/new.py +0 -0
  32. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/__init__.py +0 -0
  33. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/.gitignore.tpl +0 -0
  34. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/LICENSE.tpl +0 -0
  35. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/README.baseline.md.tpl +0 -0
  36. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/README.flowertune.md.tpl +0 -0
  37. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/README.md.tpl +0 -0
  38. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/__init__.py +0 -0
  39. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/__init__.baseline.py.tpl +0 -0
  40. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
  41. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
  42. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/client.baseline.py.tpl +0 -0
  43. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/client.huggingface.py.tpl +0 -0
  44. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/client.jax.py.tpl +0 -0
  45. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/client.mlx.py.tpl +0 -0
  46. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/client.numpy.py.tpl +0 -0
  47. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -0
  48. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl +0 -0
  49. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -0
  50. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/dataset.baseline.py.tpl +0 -0
  51. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/flwr_tune/__init__.py +0 -0
  52. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/flwr_tune/client_app.py.tpl +0 -0
  53. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/flwr_tune/dataset.py.tpl +0 -0
  54. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/flwr_tune/models.py.tpl +0 -0
  55. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/flwr_tune/server_app.py.tpl +0 -0
  56. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/flwr_tune/strategy.py.tpl +0 -0
  57. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/model.baseline.py.tpl +0 -0
  58. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/server.baseline.py.tpl +0 -0
  59. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/server.huggingface.py.tpl +0 -0
  60. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/server.jax.py.tpl +0 -0
  61. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/server.mlx.py.tpl +0 -0
  62. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -0
  63. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -0
  64. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/server.sklearn.py.tpl +0 -0
  65. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -0
  66. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/strategy.baseline.py.tpl +0 -0
  67. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/task.huggingface.py.tpl +0 -0
  68. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/task.jax.py.tpl +0 -0
  69. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/task.mlx.py.tpl +0 -0
  70. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/task.numpy.py.tpl +0 -0
  71. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +0 -0
  72. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/task.sklearn.py.tpl +0 -0
  73. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/task.tensorflow.py.tpl +0 -0
  74. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/utils.baseline.py.tpl +0 -0
  75. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/pyproject.baseline.toml.tpl +0 -0
  76. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +0 -0
  77. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl +0 -0
  78. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/pyproject.jax.toml.tpl +0 -0
  79. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +0 -0
  80. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +0 -0
  81. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +0 -0
  82. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +0 -0
  83. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +0 -0
  84. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/run/__init__.py +0 -0
  85. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/run/run.py +0 -0
  86. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/stop.py +0 -0
  87. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/utils.py +0 -0
  88. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/client/__init__.py +0 -0
  89. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/client/client.py +0 -0
  90. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/client/client_app.py +0 -0
  91. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/client/clientapp/__init__.py +0 -0
  92. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/client/clientapp/utils.py +0 -0
  93. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/client/dpfedavg_numpy_client.py +0 -0
  94. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/client/grpc_adapter_client/__init__.py +0 -0
  95. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/client/grpc_adapter_client/connection.py +0 -0
  96. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/client/grpc_rere_client/__init__.py +0 -0
  97. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/client/grpc_rere_client/client_interceptor.py +0 -0
  98. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/client/grpc_rere_client/grpc_adapter.py +0 -0
  99. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/client/message_handler/__init__.py +0 -0
  100. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/client/message_handler/message_handler.py +0 -0
  101. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/client/mod/__init__.py +0 -0
  102. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/client/mod/centraldp_mods.py +0 -0
  103. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/client/mod/comms_mods.py +0 -0
  104. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/client/mod/localdp_mod.py +0 -0
  105. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
  106. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
  107. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
  108. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/client/mod/utils.py +0 -0
  109. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/client/numpy_client.py +0 -0
  110. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/client/rest_client/__init__.py +0 -0
  111. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/client/rest_client/connection.py +0 -0
  112. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/client/run_info_store.py +0 -0
  113. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/client/typing.py +0 -0
  114. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/clientapp/__init__.py +0 -0
  115. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/__init__.py +0 -0
  116. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/address.py +0 -0
  117. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/args.py +0 -0
  118. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/auth_plugin/__init__.py +0 -0
  119. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/auth_plugin/auth_plugin.py +0 -0
  120. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/config.py +0 -0
  121. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/constant.py +0 -0
  122. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/context.py +0 -0
  123. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/date.py +0 -0
  124. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/differential_privacy.py +0 -0
  125. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/differential_privacy_constants.py +0 -0
  126. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/dp.py +0 -0
  127. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/event_log_plugin/__init__.py +0 -0
  128. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/event_log_plugin/event_log_plugin.py +0 -0
  129. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/exit/__init__.py +0 -0
  130. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/exit/exit.py +0 -0
  131. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/exit/exit_code.py +0 -0
  132. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/exit_handlers.py +0 -0
  133. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/grpc.py +0 -0
  134. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/heartbeat.py +0 -0
  135. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/inflatable.py +0 -0
  136. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/logger.py +0 -0
  137. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/message.py +0 -0
  138. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/object_ref.py +0 -0
  139. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/parameter.py +0 -0
  140. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/pyproject.py +0 -0
  141. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/record/__init__.py +0 -0
  142. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/record/array.py +0 -0
  143. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/record/arrayrecord.py +0 -0
  144. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/record/configrecord.py +0 -0
  145. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/record/conversion_utils.py +0 -0
  146. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/record/metricrecord.py +0 -0
  147. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/record/recorddict.py +0 -0
  148. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/record/typeddict.py +0 -0
  149. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/recorddict_compat.py +0 -0
  150. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/retry_invoker.py +0 -0
  151. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/secure_aggregation/__init__.py +0 -0
  152. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
  153. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
  154. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -0
  155. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
  156. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/secure_aggregation/quantization.py +0 -0
  157. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
  158. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
  159. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/serde.py +0 -0
  160. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/serde_utils.py +0 -0
  161. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/telemetry.py +0 -0
  162. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/typing.py +0 -0
  163. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/version.py +0 -0
  164. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/compat/__init__.py +0 -0
  165. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/compat/client/__init__.py +0 -0
  166. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/compat/client/app.py +0 -0
  167. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/compat/client/grpc_client/__init__.py +0 -0
  168. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/compat/client/grpc_client/connection.py +0 -0
  169. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/compat/common/__init__.py +0 -0
  170. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/compat/server/__init__.py +0 -0
  171. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/compat/server/app.py +0 -0
  172. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/compat/simulation/__init__.py +0 -0
  173. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/__init__.py +0 -0
  174. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/clientappio_pb2.py +0 -0
  175. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/clientappio_pb2.pyi +0 -0
  176. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/clientappio_pb2_grpc.py +0 -0
  177. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/clientappio_pb2_grpc.pyi +0 -0
  178. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/error_pb2.py +0 -0
  179. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/error_pb2.pyi +0 -0
  180. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/error_pb2_grpc.py +0 -0
  181. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/error_pb2_grpc.pyi +0 -0
  182. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/exec_pb2.py +0 -0
  183. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/exec_pb2.pyi +0 -0
  184. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/exec_pb2_grpc.py +0 -0
  185. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/exec_pb2_grpc.pyi +0 -0
  186. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/fab_pb2.py +0 -0
  187. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/fab_pb2.pyi +0 -0
  188. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/fab_pb2_grpc.py +0 -0
  189. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/fab_pb2_grpc.pyi +0 -0
  190. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/fleet_pb2.py +0 -0
  191. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/fleet_pb2.pyi +0 -0
  192. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/fleet_pb2_grpc.py +0 -0
  193. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
  194. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/grpcadapter_pb2.py +0 -0
  195. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/grpcadapter_pb2.pyi +0 -0
  196. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/grpcadapter_pb2_grpc.py +0 -0
  197. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/grpcadapter_pb2_grpc.pyi +0 -0
  198. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/heartbeat_pb2.py +0 -0
  199. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/heartbeat_pb2.pyi +0 -0
  200. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/heartbeat_pb2_grpc.py +0 -0
  201. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/heartbeat_pb2_grpc.pyi +0 -0
  202. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/log_pb2.py +0 -0
  203. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/log_pb2.pyi +0 -0
  204. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/log_pb2_grpc.py +0 -0
  205. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/log_pb2_grpc.pyi +0 -0
  206. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/message_pb2.py +0 -0
  207. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/message_pb2.pyi +0 -0
  208. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/message_pb2_grpc.py +0 -0
  209. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/message_pb2_grpc.pyi +0 -0
  210. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/node_pb2.py +0 -0
  211. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/node_pb2.pyi +0 -0
  212. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/node_pb2_grpc.py +0 -0
  213. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/node_pb2_grpc.pyi +0 -0
  214. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/recorddict_pb2.py +0 -0
  215. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/recorddict_pb2.pyi +0 -0
  216. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/recorddict_pb2_grpc.py +0 -0
  217. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/recorddict_pb2_grpc.pyi +0 -0
  218. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/run_pb2.py +0 -0
  219. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/run_pb2.pyi +0 -0
  220. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/run_pb2_grpc.py +0 -0
  221. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/run_pb2_grpc.pyi +0 -0
  222. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/serverappio_pb2.py +0 -0
  223. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/serverappio_pb2.pyi +0 -0
  224. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/serverappio_pb2_grpc.py +0 -0
  225. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/serverappio_pb2_grpc.pyi +0 -0
  226. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/simulationio_pb2.py +0 -0
  227. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/simulationio_pb2.pyi +0 -0
  228. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/simulationio_pb2_grpc.py +0 -0
  229. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/simulationio_pb2_grpc.pyi +0 -0
  230. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/transport_pb2.py +0 -0
  231. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/transport_pb2.pyi +0 -0
  232. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/transport_pb2_grpc.py +0 -0
  233. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
  234. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/py.typed +0 -0
  235. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/__init__.py +0 -0
  236. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/app.py +0 -0
  237. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/client_manager.py +0 -0
  238. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/client_proxy.py +0 -0
  239. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/compat/__init__.py +0 -0
  240. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/compat/app.py +0 -0
  241. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/compat/app_utils.py +0 -0
  242. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/compat/grid_client_proxy.py +0 -0
  243. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/compat/legacy_context.py +0 -0
  244. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/criterion.py +0 -0
  245. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/fleet_event_log_interceptor.py +0 -0
  246. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/grid/__init__.py +0 -0
  247. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/grid/grid.py +0 -0
  248. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/grid/inmemory_grid.py +0 -0
  249. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/history.py +0 -0
  250. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/run_serverapp.py +0 -0
  251. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/server.py +0 -0
  252. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/server_app.py +0 -0
  253. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/server_config.py +0 -0
  254. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/serverapp/__init__.py +0 -0
  255. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/serverapp/app.py +0 -0
  256. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/serverapp_components.py +0 -0
  257. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/strategy/__init__.py +0 -0
  258. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/strategy/aggregate.py +0 -0
  259. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/strategy/bulyan.py +0 -0
  260. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
  261. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
  262. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
  263. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
  264. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
  265. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/strategy/fedadagrad.py +0 -0
  266. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/strategy/fedadam.py +0 -0
  267. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/strategy/fedavg.py +0 -0
  268. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/strategy/fedavg_android.py +0 -0
  269. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/strategy/fedavgm.py +0 -0
  270. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/strategy/fedmedian.py +0 -0
  271. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/strategy/fedopt.py +0 -0
  272. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/strategy/fedprox.py +0 -0
  273. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
  274. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
  275. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
  276. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
  277. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/strategy/fedyogi.py +0 -0
  278. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/strategy/krum.py +0 -0
  279. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/strategy/qfedavg.py +0 -0
  280. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/strategy/strategy.py +0 -0
  281. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/__init__.py +0 -0
  282. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/ffs/__init__.py +0 -0
  283. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/ffs/disk_ffs.py +0 -0
  284. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/ffs/ffs.py +0 -0
  285. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/ffs/ffs_factory.py +0 -0
  286. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/fleet/__init__.py +0 -0
  287. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/fleet/grpc_adapter/__init__.py +0 -0
  288. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +0 -0
  289. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
  290. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
  291. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
  292. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
  293. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +0 -0
  294. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
  295. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +0 -0
  296. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
  297. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
  298. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +0 -0
  299. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
  300. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
  301. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
  302. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +0 -0
  303. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/fleet/vce/vce_api.py +0 -0
  304. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/linkstate/__init__.py +0 -0
  305. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/linkstate/in_memory_linkstate.py +0 -0
  306. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/linkstate/linkstate.py +0 -0
  307. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/linkstate/linkstate_factory.py +0 -0
  308. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/linkstate/sqlite_linkstate.py +0 -0
  309. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/linkstate/utils.py +0 -0
  310. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/serverappio/__init__.py +0 -0
  311. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/serverappio/serverappio_grpc.py +0 -0
  312. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/serverappio/serverappio_servicer.py +0 -0
  313. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/simulation/__init__.py +0 -0
  314. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/simulation/simulationio_grpc.py +0 -0
  315. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/simulation/simulationio_servicer.py +0 -0
  316. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/utils.py +0 -0
  317. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/typing.py +0 -0
  318. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/utils/__init__.py +0 -0
  319. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/utils/tensorboard.py +0 -0
  320. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/utils/validator.py +0 -0
  321. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/workflow/__init__.py +0 -0
  322. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/workflow/constant.py +0 -0
  323. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/workflow/default_workflows.py +0 -0
  324. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
  325. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
  326. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +0 -0
  327. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/serverapp/__init__.py +0 -0
  328. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/simulation/__init__.py +0 -0
  329. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/simulation/app.py +0 -0
  330. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/simulation/legacy_app.py +0 -0
  331. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/simulation/ray_transport/__init__.py +0 -0
  332. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
  333. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
  334. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/simulation/ray_transport/utils.py +0 -0
  335. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/simulation/run_simulation.py +0 -0
  336. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/simulation/simulationio_connection.py +0 -0
  337. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/supercore/__init__.py +0 -0
  338. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/supercore/object_store/__init__.py +0 -0
  339. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/supercore/object_store/in_memory_object_store.py +0 -0
  340. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/supercore/object_store/object_store.py +0 -0
  341. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/supercore/object_store/object_store_factory.py +0 -0
  342. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/superexec/__init__.py +0 -0
  343. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/superexec/app.py +0 -0
  344. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/superexec/deployment.py +0 -0
  345. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/superexec/exec_event_log_interceptor.py +0 -0
  346. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/superexec/exec_grpc.py +0 -0
  347. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/superexec/exec_servicer.py +0 -0
  348. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/superexec/exec_user_auth_interceptor.py +0 -0
  349. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/superexec/executor.py +0 -0
  350. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/superexec/simulation.py +0 -0
  351. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/superlink/__init__.py +0 -0
  352. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/supernode/__init__.py +0 -0
  353. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/supernode/cli/__init__.py +0 -0
  354. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/supernode/cli/flower_supernode.py +0 -0
  355. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/supernode/cli/flwr_clientapp.py +0 -0
  356. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/supernode/nodestate/__init__.py +0 -0
  357. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/supernode/nodestate/in_memory_nodestate.py +0 -0
  358. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/supernode/nodestate/nodestate.py +0 -0
  359. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/supernode/nodestate/nodestate_factory.py +0 -0
  360. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/supernode/runtime/__init__.py +0 -0
  361. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/supernode/runtime/run_clientapp.py +0 -0
  362. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/supernode/servicer/__init__.py +0 -0
  363. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/py/flwr/supernode/servicer/clientappio/__init__.py +0 -0
  364. {flwr_nightly-1.19.0.dev20250609 → flwr_nightly-1.19.0.dev20250610}/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.19.0.dev20250609
3
+ Version: 1.19.0.dev20250610
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
@@ -32,9 +32,11 @@ 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 import get_all_nested_objects
34
34
  from flwr.common.inflatable_grpc_utils import (
35
- inflate_object_from_contents,
36
35
  make_pull_object_fn_grpc,
37
36
  make_push_object_fn_grpc,
37
+ )
38
+ from flwr.common.inflatable_utils import (
39
+ inflate_object_from_contents,
38
40
  pull_objects,
39
41
  push_objects,
40
42
  )
@@ -0,0 +1,99 @@
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 typing import Callable
19
+
20
+ from flwr.proto.message_pb2 import ( # pylint: disable=E0611
21
+ PullObjectRequest,
22
+ PullObjectResponse,
23
+ PushObjectRequest,
24
+ PushObjectResponse,
25
+ )
26
+ from flwr.proto.node_pb2 import Node # pylint: disable=E0611
27
+
28
+ from .inflatable_utils import ObjectIdNotPreregisteredError, ObjectUnavailableError
29
+
30
+
31
+ def make_pull_object_fn_grpc(
32
+ pull_object_grpc: Callable[[PullObjectRequest], PullObjectResponse],
33
+ node: Node,
34
+ run_id: int,
35
+ ) -> Callable[[str], bytes]:
36
+ """Create a pull object function that uses gRPC to pull objects.
37
+
38
+ Parameters
39
+ ----------
40
+ pull_object_grpc : Callable[[PullObjectRequest], PullObjectResponse]
41
+ The gRPC function to pull objects, e.g., `FleetStub.PullObject`.
42
+ node : Node
43
+ The node making the request.
44
+ run_id : int
45
+ The run ID for the current operation.
46
+
47
+ Returns
48
+ -------
49
+ Callable[[str], bytes]
50
+ A function that takes an object ID and returns the object content as bytes.
51
+ The function raises `ObjectIdNotPreregisteredError` if the object ID is not
52
+ pre-registered, or `ObjectUnavailableError` if the object is not yet available.
53
+ """
54
+
55
+ def pull_object_fn(object_id: str) -> bytes:
56
+ request = PullObjectRequest(node=node, run_id=run_id, object_id=object_id)
57
+ response: PullObjectResponse = pull_object_grpc(request)
58
+ if not response.object_found:
59
+ raise ObjectIdNotPreregisteredError(object_id)
60
+ if not response.object_available:
61
+ raise ObjectUnavailableError(object_id)
62
+ return response.object_content
63
+
64
+ return pull_object_fn
65
+
66
+
67
+ def make_push_object_fn_grpc(
68
+ push_object_grpc: Callable[[PushObjectRequest], PushObjectResponse],
69
+ node: Node,
70
+ run_id: int,
71
+ ) -> Callable[[str, bytes], None]:
72
+ """Create a push object function that uses gRPC to push objects.
73
+
74
+ Parameters
75
+ ----------
76
+ push_object_grpc : Callable[[PushObjectRequest], PushObjectResponse]
77
+ The gRPC function to push objects, e.g., `FleetStub.PushObject`.
78
+ node : Node
79
+ The node making the request.
80
+ run_id : int
81
+ The run ID for the current operation.
82
+
83
+ Returns
84
+ -------
85
+ Callable[[str, bytes], None]
86
+ A function that takes an object ID and its content as bytes, and pushes it
87
+ to the servicer. The function raises `ObjectIdNotPreregisteredError` if
88
+ the object ID is not pre-registered.
89
+ """
90
+
91
+ def push_object_fn(object_id: str, object_content: bytes) -> None:
92
+ request = PushObjectRequest(
93
+ node=node, run_id=run_id, object_id=object_id, object_content=object_content
94
+ )
95
+ response: PushObjectResponse = push_object_grpc(request)
96
+ if not response.stored:
97
+ raise ObjectIdNotPreregisteredError(object_id)
98
+
99
+ return push_object_fn
@@ -12,8 +12,7 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
  # ==============================================================================
15
- """InflatableObject utils."""
16
-
15
+ """InflatableObject utilities."""
17
16
 
18
17
  import concurrent.futures
19
18
  import random
@@ -21,15 +20,9 @@ import threading
21
20
  import time
22
21
  from typing import Callable, Optional
23
22
 
24
- from flwr.proto.message_pb2 import ( # pylint: disable=E0611
25
- PullObjectRequest,
26
- PullObjectResponse,
27
- PushObjectRequest,
28
- PushObjectResponse,
29
- )
30
- from flwr.proto.node_pb2 import Node # pylint: disable=E0611
31
-
32
23
  from .constant import (
24
+ HEAD_BODY_DIVIDER,
25
+ HEAD_VALUE_DIVIDER,
33
26
  MAX_CONCURRENT_PULLS,
34
27
  MAX_CONCURRENT_PUSHES,
35
28
  PULL_BACKOFF_CAP,
@@ -37,7 +30,14 @@ from .constant import (
37
30
  PULL_MAX_TIME,
38
31
  PULL_MAX_TRIES_PER_OBJECT,
39
32
  )
40
- from .inflatable import InflatableObject, get_object_head_values_from_object_content
33
+ from .inflatable import (
34
+ InflatableObject,
35
+ UnexpectedObjectContentError,
36
+ _get_object_head,
37
+ get_object_head_values_from_object_content,
38
+ get_object_id,
39
+ is_valid_sha256_hash,
40
+ )
41
41
  from .message import Message
42
42
  from .record import Array, ArrayRecord, ConfigRecord, MetricRecord, RecordDict
43
43
 
@@ -67,77 +67,6 @@ class ObjectIdNotPreregisteredError(Exception):
67
67
  super().__init__(f"Object with ID '{object_id}' could not be found.")
68
68
 
69
69
 
70
- def make_pull_object_fn_grpc(
71
- pull_object_grpc: Callable[[PullObjectRequest], PullObjectResponse],
72
- node: Node,
73
- run_id: int,
74
- ) -> Callable[[str], bytes]:
75
- """Create a pull object function that uses gRPC to pull objects.
76
-
77
- Parameters
78
- ----------
79
- pull_object_grpc : Callable[[PullObjectRequest], PullObjectResponse]
80
- The gRPC function to pull objects, e.g., `FleetStub.PullObject`.
81
- node : Node
82
- The node making the request.
83
- run_id : int
84
- The run ID for the current operation.
85
-
86
- Returns
87
- -------
88
- Callable[[str], bytes]
89
- A function that takes an object ID and returns the object content as bytes.
90
- The function raises `ObjectIdNotPreregisteredError` if the object ID is not
91
- pre-registered, or `ObjectUnavailableError` if the object is not yet available.
92
- """
93
-
94
- def pull_object_fn(object_id: str) -> bytes:
95
- request = PullObjectRequest(node=node, run_id=run_id, object_id=object_id)
96
- response: PullObjectResponse = pull_object_grpc(request)
97
- if not response.object_found:
98
- raise ObjectIdNotPreregisteredError(object_id)
99
- if not response.object_available:
100
- raise ObjectUnavailableError(object_id)
101
- return response.object_content
102
-
103
- return pull_object_fn
104
-
105
-
106
- def make_push_object_fn_grpc(
107
- push_object_grpc: Callable[[PushObjectRequest], PushObjectResponse],
108
- node: Node,
109
- run_id: int,
110
- ) -> Callable[[str, bytes], None]:
111
- """Create a push object function that uses gRPC to push objects.
112
-
113
- Parameters
114
- ----------
115
- push_object_grpc : Callable[[PushObjectRequest], PushObjectResponse]
116
- The gRPC function to push objects, e.g., `FleetStub.PushObject`.
117
- node : Node
118
- The node making the request.
119
- run_id : int
120
- The run ID for the current operation.
121
-
122
- Returns
123
- -------
124
- Callable[[str, bytes], None]
125
- A function that takes an object ID and its content as bytes, and pushes it
126
- to the servicer. The function raises `ObjectIdNotPreregisteredError` if
127
- the object ID is not pre-registered.
128
- """
129
-
130
- def push_object_fn(object_id: str, object_content: bytes) -> None:
131
- request = PushObjectRequest(
132
- node=node, run_id=run_id, object_id=object_id, object_content=object_content
133
- )
134
- response: PushObjectResponse = push_object_grpc(request)
135
- if not response.stored:
136
- raise ObjectIdNotPreregisteredError(object_id)
137
-
138
- return push_object_fn
139
-
140
-
141
70
  def push_objects(
142
71
  objects: dict[str, InflatableObject],
143
72
  push_object_fn: Callable[[str, bytes], None],
@@ -360,3 +289,53 @@ def inflate_object_from_contents(
360
289
  del object_content # Free memory after inflation
361
290
  objects[object_id] = obj
362
291
  return obj
292
+
293
+
294
+ def validate_object_content(content: bytes) -> None:
295
+ """Validate the deflated content of an InflatableObject."""
296
+ try:
297
+ # Check if there is a head-body divider
298
+ index = content.find(HEAD_BODY_DIVIDER)
299
+ if index == -1:
300
+ raise ValueError(
301
+ "Unexpected format for object content. Head and body "
302
+ "could not be split."
303
+ )
304
+
305
+ head = _get_object_head(content)
306
+
307
+ # check if the head has three parts:
308
+ # <object_type> <children_ids> <object_body_len>
309
+ head_decoded = head.decode(encoding="utf-8")
310
+ head_parts = head_decoded.split(HEAD_VALUE_DIVIDER)
311
+
312
+ if len(head_parts) != 3:
313
+ raise ValueError("Unexpected format for object head.")
314
+
315
+ obj_type, children_str, body_len = head_parts
316
+
317
+ # Check that children IDs are valid IDs
318
+ children = children_str.split(",")
319
+ for children_id in children:
320
+ if children_id and not is_valid_sha256_hash(children_id):
321
+ raise ValueError(
322
+ f"Detected invalid object ID ({children_id}) in children."
323
+ )
324
+
325
+ # Check that object type is recognized
326
+ if obj_type not in inflatable_class_registry:
327
+ if obj_type != "CustomDataClass": # to allow for the class in tests
328
+ raise ValueError(f"Object of type {obj_type} is not supported.")
329
+
330
+ # Check if the body length in the head matches that of the body
331
+ actual_body_len = len(content) - len(head) - len(HEAD_BODY_DIVIDER)
332
+ if actual_body_len != int(body_len):
333
+ raise ValueError(
334
+ f"Object content length expected {body_len} bytes but got "
335
+ f"{actual_body_len} bytes."
336
+ )
337
+
338
+ except ValueError as err:
339
+ raise UnexpectedObjectContentError(
340
+ object_id=get_object_id(content), reason=str(err)
341
+ ) from err
@@ -30,9 +30,11 @@ from flwr.common.constant import (
30
30
  from flwr.common.grpc import create_channel, on_channel_state_change
31
31
  from flwr.common.inflatable import get_all_nested_objects
32
32
  from flwr.common.inflatable_grpc_utils import (
33
- inflate_object_from_contents,
34
33
  make_pull_object_fn_grpc,
35
34
  make_push_object_fn_grpc,
35
+ )
36
+ from flwr.common.inflatable_utils import (
37
+ inflate_object_from_contents,
36
38
  pull_objects,
37
39
  push_objects,
38
40
  )
@@ -15,12 +15,11 @@
15
15
  """Fleet API gRPC request-response servicer."""
16
16
 
17
17
 
18
- from logging import DEBUG, ERROR, INFO
18
+ from logging import DEBUG, INFO
19
19
 
20
20
  import grpc
21
21
  from google.protobuf.json_format import MessageToDict
22
22
 
23
- from flwr.common.constant import Status
24
23
  from flwr.common.inflatable import UnexpectedObjectContentError
25
24
  from flwr.common.logger import log
26
25
  from flwr.common.typing import InvalidRunStatusException
@@ -50,9 +49,8 @@ from flwr.proto.run_pb2 import GetRunRequest, GetRunResponse # pylint: disable=
50
49
  from flwr.server.superlink.ffs.ffs_factory import FfsFactory
51
50
  from flwr.server.superlink.fleet.message_handler import message_handler
52
51
  from flwr.server.superlink.linkstate import LinkStateFactory
53
- from flwr.server.superlink.utils import abort_grpc_context, check_abort
52
+ from flwr.server.superlink.utils import abort_grpc_context
54
53
  from flwr.supercore.object_store import ObjectStoreFactory
55
- from flwr.supercore.object_store.object_store import NoObjectInStoreError
56
54
 
57
55
 
58
56
  class FleetServicer(fleet_pb2_grpc.FleetServicer):
@@ -185,36 +183,20 @@ class FleetServicer(fleet_pb2_grpc.FleetServicer):
185
183
  request.object_id,
186
184
  )
187
185
 
188
- state = self.state_factory.state()
189
-
190
- # Abort if the run is not running
191
- abort_msg = check_abort(
192
- request.run_id,
193
- [Status.PENDING, Status.STARTING, Status.FINISHED],
194
- state,
195
- )
196
- if abort_msg:
197
- abort_grpc_context(abort_msg, context)
198
-
199
- if request.node.node_id not in state.get_nodes(run_id=request.run_id):
200
- # Cancel insertion in ObjectStore
201
- context.abort(grpc.StatusCode.FAILED_PRECONDITION, "Unexpected node ID.")
202
-
203
- # Init store
204
- store = self.objectstore_factory.store()
205
-
206
- # Insert in store
207
- stored = False
208
186
  try:
209
- store.put(request.object_id, request.object_content)
210
- stored = True
211
- except (NoObjectInStoreError, ValueError) as e:
212
- log(ERROR, str(e))
187
+ # Insert in Store
188
+ res = message_handler.push_object(
189
+ request=request,
190
+ state=self.state_factory.state(),
191
+ store=self.objectstore_factory.store(),
192
+ )
193
+ except InvalidRunStatusException as e:
194
+ abort_grpc_context(e.message, context)
213
195
  except UnexpectedObjectContentError as e:
214
196
  # Object content is not valid
215
197
  context.abort(grpc.StatusCode.FAILED_PRECONDITION, str(e))
216
198
 
217
- return PushObjectResponse(stored=stored)
199
+ return res
218
200
 
219
201
  def PullObject(
220
202
  self, request: PullObjectRequest, context: grpc.ServicerContext
@@ -226,31 +208,14 @@ class FleetServicer(fleet_pb2_grpc.FleetServicer):
226
208
  request.object_id,
227
209
  )
228
210
 
229
- state = self.state_factory.state()
230
-
231
- # Abort if the run is not running
232
- abort_msg = check_abort(
233
- request.run_id,
234
- [Status.PENDING, Status.STARTING, Status.FINISHED],
235
- state,
236
- )
237
- if abort_msg:
238
- abort_grpc_context(abort_msg, context)
239
-
240
- if request.node.node_id not in state.get_nodes(run_id=request.run_id):
241
- # Cancel insertion in ObjectStore
242
- context.abort(grpc.StatusCode.FAILED_PRECONDITION, "Unexpected node ID.")
243
-
244
- # Init store
245
- store = self.objectstore_factory.store()
246
-
247
- # Fetch from store
248
- content = store.get(request.object_id)
249
- if content is not None:
250
- object_available = content != b""
251
- return PullObjectResponse(
252
- object_found=True,
253
- object_available=object_available,
254
- object_content=content,
211
+ try:
212
+ # Fetch from store
213
+ res = message_handler.pull_object(
214
+ request=request,
215
+ state=self.state_factory.state(),
216
+ store=self.objectstore_factory.store(),
255
217
  )
256
- return PullObjectResponse(object_found=False, object_available=False)
218
+ except InvalidRunStatusException as e:
219
+ abort_grpc_context(e.message, context)
220
+
221
+ return res
@@ -19,6 +19,7 @@ from typing import Optional
19
19
 
20
20
  from flwr.common import Message, log
21
21
  from flwr.common.constant import Status
22
+ from flwr.common.inflatable import UnexpectedObjectContentError
22
23
  from flwr.common.serde import (
23
24
  fab_to_proto,
24
25
  message_from_proto,
@@ -42,7 +43,13 @@ from flwr.proto.heartbeat_pb2 import ( # pylint: disable=E0611
42
43
  SendNodeHeartbeatRequest,
43
44
  SendNodeHeartbeatResponse,
44
45
  )
45
- from flwr.proto.message_pb2 import ObjectIDs # pylint: disable=E0611
46
+ from flwr.proto.message_pb2 import ( # pylint: disable=E0611
47
+ ObjectIDs,
48
+ PullObjectRequest,
49
+ PullObjectResponse,
50
+ PushObjectRequest,
51
+ PushObjectResponse,
52
+ )
46
53
  from flwr.proto.node_pb2 import Node # pylint: disable=E0611
47
54
  from flwr.proto.run_pb2 import ( # pylint: disable=E0611
48
55
  GetRunRequest,
@@ -203,3 +210,52 @@ def get_fab(
203
210
  return GetFabResponse(fab=fab_to_proto(fab))
204
211
 
205
212
  raise ValueError(f"Found no FAB with hash: {request.hash_str}")
213
+
214
+
215
+ def push_object(
216
+ request: PushObjectRequest, state: LinkState, store: ObjectStore
217
+ ) -> PushObjectResponse:
218
+ """Push Object."""
219
+ abort_msg = check_abort(
220
+ request.run_id,
221
+ [Status.PENDING, Status.STARTING, Status.FINISHED],
222
+ state,
223
+ )
224
+ if abort_msg:
225
+ raise InvalidRunStatusException(abort_msg)
226
+
227
+ stored = False
228
+ try:
229
+ store.put(request.object_id, request.object_content)
230
+ stored = True
231
+ except (NoObjectInStoreError, ValueError) as e:
232
+ log(ERROR, str(e))
233
+ except UnexpectedObjectContentError as e:
234
+ # Object content is not valid
235
+ log(ERROR, str(e))
236
+ raise
237
+ return PushObjectResponse(stored=stored)
238
+
239
+
240
+ def pull_object(
241
+ request: PullObjectRequest, state: LinkState, store: ObjectStore
242
+ ) -> PullObjectResponse:
243
+ """Pull Object."""
244
+ abort_msg = check_abort(
245
+ request.run_id,
246
+ [Status.PENDING, Status.STARTING, Status.FINISHED],
247
+ state,
248
+ )
249
+ if abort_msg:
250
+ raise InvalidRunStatusException(abort_msg)
251
+
252
+ # Fetch from store
253
+ content = store.get(request.object_id)
254
+ if content is not None:
255
+ object_available = content != b""
256
+ return PullObjectResponse(
257
+ object_found=True,
258
+ object_available=object_available,
259
+ object_content=content,
260
+ )
261
+ return PullObjectResponse(object_found=False, object_available=False)
@@ -52,9 +52,9 @@ from flwr.common.logger import log
52
52
  from flwr.common.retry_invoker import RetryInvoker, RetryState, exponential
53
53
  from flwr.common.typing import Fab, Run, RunNotRunningException, UserConfig
54
54
  from flwr.proto.clientappio_pb2_grpc import add_ClientAppIoServicer_to_server
55
- from flwr.server.superlink.ffs import FfsFactory
56
- from flwr.supercore.object_store import ObjectStoreFactory
57
- from flwr.supernode.nodestate import NodeStateFactory
55
+ from flwr.server.superlink.ffs import Ffs, FfsFactory
56
+ from flwr.supercore.object_store import ObjectStore, ObjectStoreFactory
57
+ from flwr.supernode.nodestate import NodeState, NodeStateFactory
58
58
  from flwr.supernode.servicer.clientappio import ClientAppInputs, ClientAppIoServicer
59
59
 
60
60
  DEFAULT_FFS_DIR = get_flwr_dir() / "supernode" / "ffs"
@@ -145,7 +145,7 @@ def start_client_internal(
145
145
  # Initialize NodeState, Ffs, and ObjectStore
146
146
  state = state_factory.state()
147
147
  ffs = ffs_factory.ffs()
148
- _store = object_store_factory.store()
148
+ store = object_store_factory.store()
149
149
 
150
150
  with _init_connection(
151
151
  transport=transport,
@@ -166,63 +166,20 @@ def start_client_internal(
166
166
 
167
167
  # pylint: disable=too-many-nested-blocks
168
168
  while True:
169
- # Pull message
170
- if (message := receive()) is None:
171
- time.sleep(3)
172
- continue
173
-
174
- # Log message reception
175
- log(INFO, "")
176
- if message.metadata.group_id:
177
- log(
178
- INFO,
179
- "[RUN %s, ROUND %s]",
180
- message.metadata.run_id,
181
- message.metadata.group_id,
182
- )
183
- else:
184
- log(INFO, "[RUN %s]", message.metadata.run_id)
185
- log(
186
- INFO,
187
- "Received: %s message %s",
188
- message.metadata.message_type,
189
- message.metadata.message_id,
169
+ # The signature of the function will change after
170
+ # completing the transition to the `NodeState`-based SuperNode
171
+ run_id = _pull_and_store_message(
172
+ state=state,
173
+ ffs=ffs,
174
+ object_store=store,
175
+ node_config=node_config,
176
+ receive=receive,
177
+ get_run=get_run,
178
+ get_fab=get_fab,
190
179
  )
191
180
 
192
- # Ensure the run and FAB are available
193
- run_id = message.metadata.run_id
194
- try:
195
- # Check if the message is from an unknown run
196
- if (run_info := state.get_run(run_id)) is None:
197
- # Pull run info from SuperLink
198
- run_info = get_run(run_id)
199
- state.store_run(run_info)
200
-
201
- # Pull and store the FAB
202
- fab = get_fab(run_info.fab_hash, run_id)
203
- ffs.put(fab.content, {})
204
-
205
- # Initialize the context
206
- run_cfg = get_fused_config_from_fab(fab.content, run_info)
207
- run_ctx = Context(
208
- run_id=run_id,
209
- node_id=state.get_node_id(),
210
- node_config=node_config,
211
- state=RecordDict(),
212
- run_config=run_cfg,
213
- )
214
- state.store_context(run_ctx)
215
-
216
- # Store the message in the state
217
- state.store_message(message)
218
- except RunNotRunningException:
219
- log(
220
- INFO,
221
- "Run ID %s is not in `RUNNING` status. Ignoring message %s.",
222
- run_id,
223
- message.metadata.message_id,
224
- )
225
- time.sleep(3)
181
+ if run_id is None:
182
+ time.sleep(3) # Wait for 3s before asking again
226
183
  continue
227
184
 
228
185
  try:
@@ -302,6 +259,91 @@ def start_client_internal(
302
259
  log(INFO, "")
303
260
 
304
261
 
262
+ def _pull_and_store_message( # pylint: disable=too-many-positional-arguments
263
+ state: NodeState,
264
+ ffs: Ffs,
265
+ object_store: ObjectStore, # pylint: disable=unused-argument
266
+ node_config: UserConfig,
267
+ receive: Callable[[], Optional[Message]],
268
+ get_run: Callable[[int], Run],
269
+ get_fab: Callable[[str, int], Fab],
270
+ ) -> Optional[int]:
271
+ """Pull a message from the SuperLink and store it in the state.
272
+
273
+ This function current returns None if no message is received,
274
+ or run_id if a message is received and processed successfully.
275
+ This behavior will change in the future to return None after
276
+ completing transition to the `NodeState`-based SuperNode.
277
+ """
278
+ message = None
279
+ try:
280
+ # Pull message
281
+ if (message := receive()) is None:
282
+ return None
283
+
284
+ # Log message reception
285
+ log(INFO, "")
286
+ if message.metadata.group_id:
287
+ log(
288
+ INFO,
289
+ "[RUN %s, ROUND %s]",
290
+ message.metadata.run_id,
291
+ message.metadata.group_id,
292
+ )
293
+ else:
294
+ log(INFO, "[RUN %s]", message.metadata.run_id)
295
+ log(
296
+ INFO,
297
+ "Received: %s message %s",
298
+ message.metadata.message_type,
299
+ message.metadata.message_id,
300
+ )
301
+
302
+ # Ensure the run and FAB are available
303
+ run_id = message.metadata.run_id
304
+
305
+ # Check if the message is from an unknown run
306
+ if (run_info := state.get_run(run_id)) is None:
307
+ # Pull run info from SuperLink
308
+ run_info = get_run(run_id)
309
+ state.store_run(run_info)
310
+
311
+ # Pull and store the FAB
312
+ fab = get_fab(run_info.fab_hash, run_id)
313
+ ffs.put(fab.content, {})
314
+
315
+ # Initialize the context
316
+ run_cfg = get_fused_config_from_fab(fab.content, run_info)
317
+ run_ctx = Context(
318
+ run_id=run_id,
319
+ node_id=state.get_node_id(),
320
+ node_config=node_config,
321
+ state=RecordDict(),
322
+ run_config=run_cfg,
323
+ )
324
+ state.store_context(run_ctx)
325
+
326
+ # Store the message in the state
327
+ state.store_message(message)
328
+ except RunNotRunningException:
329
+ if message is None:
330
+ log(
331
+ INFO,
332
+ "Run transitioned to a non-`RUNNING` status while receiving a message. "
333
+ "Ignoring the message.",
334
+ )
335
+ else:
336
+ log(
337
+ INFO,
338
+ "Run ID %s is not in `RUNNING` status. Ignoring message %s.",
339
+ run_id,
340
+ message.metadata.message_id,
341
+ )
342
+ return None
343
+
344
+ return run_id
345
+
346
+
305
347
  @contextmanager
306
348
  def _init_connection( # pylint: disable=too-many-positional-arguments
307
349
  transport: str,