flwr-nightly 1.20.0.dev20250717__tar.gz → 1.20.0.dev20250720__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 (375) hide show
  1. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/PKG-INFO +1 -1
  2. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/build.py +1 -1
  3. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/client/grpc_adapter_client/connection.py +6 -0
  4. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/client/grpc_rere_client/connection.py +57 -1
  5. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/client/rest_client/connection.py +91 -21
  6. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/inflatable_protobuf_utils.py +40 -0
  7. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/inflatable_utils.py +128 -13
  8. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/superlink/fleet/message_handler/message_handler.py +1 -2
  9. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/superlink/serverappio/serverappio_servicer.py +1 -2
  10. flwr_nightly-1.20.0.dev20250720/py/flwr/supercore/object_store/utils.py +48 -0
  11. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/supernode/runtime/run_clientapp.py +64 -11
  12. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/supernode/servicer/clientappio/clientappio_servicer.py +16 -4
  13. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/supernode/start_client_internal.py +27 -3
  14. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/pyproject.toml +1 -1
  15. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/README.md +0 -0
  16. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/__init__.py +0 -0
  17. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/app/__init__.py +0 -0
  18. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/app/error.py +0 -0
  19. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/app/metadata.py +0 -0
  20. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/__init__.py +0 -0
  21. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/app.py +0 -0
  22. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/auth_plugin/__init__.py +0 -0
  23. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/auth_plugin/oidc_cli_plugin.py +0 -0
  24. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/cli_user_auth_interceptor.py +0 -0
  25. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/config_utils.py +0 -0
  26. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/constant.py +0 -0
  27. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/example.py +0 -0
  28. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/install.py +0 -0
  29. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/log.py +0 -0
  30. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/login/__init__.py +0 -0
  31. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/login/login.py +0 -0
  32. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/ls.py +0 -0
  33. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/__init__.py +0 -0
  34. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/new.py +0 -0
  35. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/__init__.py +0 -0
  36. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/.gitignore.tpl +0 -0
  37. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/LICENSE.tpl +0 -0
  38. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/README.baseline.md.tpl +0 -0
  39. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/README.flowertune.md.tpl +0 -0
  40. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/README.md.tpl +0 -0
  41. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/__init__.py +0 -0
  42. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/code/__init__.baseline.py.tpl +0 -0
  43. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
  44. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
  45. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/code/client.baseline.py.tpl +0 -0
  46. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/code/client.huggingface.py.tpl +0 -0
  47. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/code/client.jax.py.tpl +0 -0
  48. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/code/client.mlx.py.tpl +0 -0
  49. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/code/client.numpy.py.tpl +0 -0
  50. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -0
  51. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl +0 -0
  52. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -0
  53. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/code/dataset.baseline.py.tpl +0 -0
  54. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/code/flwr_tune/__init__.py +0 -0
  55. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/code/flwr_tune/client_app.py.tpl +0 -0
  56. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/code/flwr_tune/dataset.py.tpl +0 -0
  57. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/code/flwr_tune/models.py.tpl +0 -0
  58. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/code/flwr_tune/server_app.py.tpl +0 -0
  59. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/code/flwr_tune/strategy.py.tpl +0 -0
  60. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/code/model.baseline.py.tpl +0 -0
  61. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/code/server.baseline.py.tpl +0 -0
  62. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/code/server.huggingface.py.tpl +0 -0
  63. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/code/server.jax.py.tpl +0 -0
  64. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/code/server.mlx.py.tpl +0 -0
  65. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -0
  66. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -0
  67. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/code/server.sklearn.py.tpl +0 -0
  68. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -0
  69. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/code/strategy.baseline.py.tpl +0 -0
  70. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/code/task.huggingface.py.tpl +0 -0
  71. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/code/task.jax.py.tpl +0 -0
  72. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/code/task.mlx.py.tpl +0 -0
  73. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/code/task.numpy.py.tpl +0 -0
  74. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +0 -0
  75. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/code/task.sklearn.py.tpl +0 -0
  76. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/code/task.tensorflow.py.tpl +0 -0
  77. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/code/utils.baseline.py.tpl +0 -0
  78. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/pyproject.baseline.toml.tpl +0 -0
  79. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +0 -0
  80. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl +0 -0
  81. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/pyproject.jax.toml.tpl +0 -0
  82. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +0 -0
  83. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +0 -0
  84. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +0 -0
  85. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +0 -0
  86. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +0 -0
  87. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/run/__init__.py +0 -0
  88. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/run/run.py +0 -0
  89. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/stop.py +0 -0
  90. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/utils.py +0 -0
  91. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/client/__init__.py +0 -0
  92. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/client/client.py +0 -0
  93. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/client/client_app.py +0 -0
  94. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/client/clientapp/__init__.py +0 -0
  95. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/client/clientapp/utils.py +0 -0
  96. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/client/dpfedavg_numpy_client.py +0 -0
  97. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/client/grpc_adapter_client/__init__.py +0 -0
  98. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/client/grpc_rere_client/__init__.py +0 -0
  99. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/client/grpc_rere_client/client_interceptor.py +0 -0
  100. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/client/grpc_rere_client/grpc_adapter.py +0 -0
  101. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/client/message_handler/__init__.py +0 -0
  102. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/client/message_handler/message_handler.py +0 -0
  103. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/client/mod/__init__.py +0 -0
  104. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/client/mod/centraldp_mods.py +0 -0
  105. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/client/mod/comms_mods.py +0 -0
  106. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/client/mod/localdp_mod.py +0 -0
  107. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
  108. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
  109. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
  110. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/client/mod/utils.py +0 -0
  111. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/client/numpy_client.py +0 -0
  112. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/client/rest_client/__init__.py +0 -0
  113. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/client/run_info_store.py +0 -0
  114. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/client/typing.py +0 -0
  115. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/clientapp/__init__.py +0 -0
  116. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/__init__.py +0 -0
  117. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/address.py +0 -0
  118. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/args.py +0 -0
  119. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/auth_plugin/__init__.py +0 -0
  120. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/auth_plugin/auth_plugin.py +0 -0
  121. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/config.py +0 -0
  122. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/constant.py +0 -0
  123. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/context.py +0 -0
  124. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/date.py +0 -0
  125. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/differential_privacy.py +0 -0
  126. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/differential_privacy_constants.py +0 -0
  127. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/dp.py +0 -0
  128. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/event_log_plugin/__init__.py +0 -0
  129. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/event_log_plugin/event_log_plugin.py +0 -0
  130. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/exit/__init__.py +0 -0
  131. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/exit/exit.py +0 -0
  132. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/exit/exit_code.py +0 -0
  133. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/exit_handlers.py +0 -0
  134. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/grpc.py +0 -0
  135. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/heartbeat.py +0 -0
  136. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/inflatable.py +0 -0
  137. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/logger.py +0 -0
  138. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/message.py +0 -0
  139. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/object_ref.py +0 -0
  140. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/parameter.py +0 -0
  141. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/pyproject.py +0 -0
  142. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/record/__init__.py +0 -0
  143. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/record/array.py +0 -0
  144. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/record/arraychunk.py +0 -0
  145. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/record/arrayrecord.py +0 -0
  146. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/record/configrecord.py +0 -0
  147. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/record/conversion_utils.py +0 -0
  148. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/record/metricrecord.py +0 -0
  149. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/record/recorddict.py +0 -0
  150. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/record/typeddict.py +0 -0
  151. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/recorddict_compat.py +0 -0
  152. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/retry_invoker.py +0 -0
  153. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/secure_aggregation/__init__.py +0 -0
  154. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
  155. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
  156. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -0
  157. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
  158. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/secure_aggregation/quantization.py +0 -0
  159. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
  160. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
  161. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/serde.py +0 -0
  162. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/serde_utils.py +0 -0
  163. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/telemetry.py +0 -0
  164. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/typing.py +0 -0
  165. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/version.py +0 -0
  166. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/compat/__init__.py +0 -0
  167. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/compat/client/__init__.py +0 -0
  168. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/compat/client/app.py +0 -0
  169. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/compat/client/grpc_client/__init__.py +0 -0
  170. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/compat/client/grpc_client/connection.py +0 -0
  171. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/compat/common/__init__.py +0 -0
  172. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/compat/server/__init__.py +0 -0
  173. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/compat/server/app.py +0 -0
  174. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/compat/simulation/__init__.py +0 -0
  175. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/__init__.py +0 -0
  176. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/appio_pb2.py +0 -0
  177. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/appio_pb2.pyi +0 -0
  178. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/appio_pb2_grpc.py +0 -0
  179. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/appio_pb2_grpc.pyi +0 -0
  180. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/clientappio_pb2.py +0 -0
  181. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/clientappio_pb2.pyi +0 -0
  182. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/clientappio_pb2_grpc.py +0 -0
  183. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/clientappio_pb2_grpc.pyi +0 -0
  184. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/error_pb2.py +0 -0
  185. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/error_pb2.pyi +0 -0
  186. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/error_pb2_grpc.py +0 -0
  187. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/error_pb2_grpc.pyi +0 -0
  188. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/exec_pb2.py +0 -0
  189. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/exec_pb2.pyi +0 -0
  190. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/exec_pb2_grpc.py +0 -0
  191. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/exec_pb2_grpc.pyi +0 -0
  192. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/fab_pb2.py +0 -0
  193. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/fab_pb2.pyi +0 -0
  194. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/fab_pb2_grpc.py +0 -0
  195. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/fab_pb2_grpc.pyi +0 -0
  196. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/fleet_pb2.py +0 -0
  197. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/fleet_pb2.pyi +0 -0
  198. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/fleet_pb2_grpc.py +0 -0
  199. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
  200. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/grpcadapter_pb2.py +0 -0
  201. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/grpcadapter_pb2.pyi +0 -0
  202. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/grpcadapter_pb2_grpc.py +0 -0
  203. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/grpcadapter_pb2_grpc.pyi +0 -0
  204. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/heartbeat_pb2.py +0 -0
  205. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/heartbeat_pb2.pyi +0 -0
  206. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/heartbeat_pb2_grpc.py +0 -0
  207. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/heartbeat_pb2_grpc.pyi +0 -0
  208. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/log_pb2.py +0 -0
  209. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/log_pb2.pyi +0 -0
  210. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/log_pb2_grpc.py +0 -0
  211. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/log_pb2_grpc.pyi +0 -0
  212. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/message_pb2.py +0 -0
  213. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/message_pb2.pyi +0 -0
  214. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/message_pb2_grpc.py +0 -0
  215. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/message_pb2_grpc.pyi +0 -0
  216. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/node_pb2.py +0 -0
  217. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/node_pb2.pyi +0 -0
  218. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/node_pb2_grpc.py +0 -0
  219. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/node_pb2_grpc.pyi +0 -0
  220. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/recorddict_pb2.py +0 -0
  221. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/recorddict_pb2.pyi +0 -0
  222. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/recorddict_pb2_grpc.py +0 -0
  223. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/recorddict_pb2_grpc.pyi +0 -0
  224. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/run_pb2.py +0 -0
  225. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/run_pb2.pyi +0 -0
  226. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/run_pb2_grpc.py +0 -0
  227. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/run_pb2_grpc.pyi +0 -0
  228. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/serverappio_pb2.py +0 -0
  229. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/serverappio_pb2.pyi +0 -0
  230. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/serverappio_pb2_grpc.py +0 -0
  231. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/serverappio_pb2_grpc.pyi +0 -0
  232. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/simulationio_pb2.py +0 -0
  233. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/simulationio_pb2.pyi +0 -0
  234. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/simulationio_pb2_grpc.py +0 -0
  235. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/simulationio_pb2_grpc.pyi +0 -0
  236. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/transport_pb2.py +0 -0
  237. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/transport_pb2.pyi +0 -0
  238. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/transport_pb2_grpc.py +0 -0
  239. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
  240. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/py.typed +0 -0
  241. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/__init__.py +0 -0
  242. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/app.py +0 -0
  243. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/client_manager.py +0 -0
  244. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/client_proxy.py +0 -0
  245. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/compat/__init__.py +0 -0
  246. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/compat/app.py +0 -0
  247. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/compat/app_utils.py +0 -0
  248. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/compat/grid_client_proxy.py +0 -0
  249. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/compat/legacy_context.py +0 -0
  250. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/criterion.py +0 -0
  251. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/fleet_event_log_interceptor.py +0 -0
  252. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/grid/__init__.py +0 -0
  253. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/grid/grid.py +0 -0
  254. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/grid/grpc_grid.py +0 -0
  255. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/grid/inmemory_grid.py +0 -0
  256. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/history.py +0 -0
  257. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/run_serverapp.py +0 -0
  258. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/server.py +0 -0
  259. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/server_app.py +0 -0
  260. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/server_config.py +0 -0
  261. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/serverapp/__init__.py +0 -0
  262. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/serverapp/app.py +0 -0
  263. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/serverapp_components.py +0 -0
  264. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/strategy/__init__.py +0 -0
  265. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/strategy/aggregate.py +0 -0
  266. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/strategy/bulyan.py +0 -0
  267. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
  268. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
  269. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
  270. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
  271. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
  272. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/strategy/fedadagrad.py +0 -0
  273. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/strategy/fedadam.py +0 -0
  274. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/strategy/fedavg.py +0 -0
  275. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/strategy/fedavg_android.py +0 -0
  276. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/strategy/fedavgm.py +0 -0
  277. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/strategy/fedmedian.py +0 -0
  278. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/strategy/fedopt.py +0 -0
  279. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/strategy/fedprox.py +0 -0
  280. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
  281. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
  282. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
  283. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
  284. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/strategy/fedyogi.py +0 -0
  285. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/strategy/krum.py +0 -0
  286. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/strategy/qfedavg.py +0 -0
  287. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/strategy/strategy.py +0 -0
  288. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/superlink/__init__.py +0 -0
  289. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/superlink/fleet/__init__.py +0 -0
  290. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/superlink/fleet/grpc_adapter/__init__.py +0 -0
  291. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +0 -0
  292. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
  293. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
  294. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
  295. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
  296. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +0 -0
  297. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
  298. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +0 -0
  299. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +0 -0
  300. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
  301. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
  302. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +0 -0
  303. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
  304. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
  305. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
  306. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +0 -0
  307. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/superlink/fleet/vce/vce_api.py +0 -0
  308. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/superlink/linkstate/__init__.py +0 -0
  309. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/superlink/linkstate/in_memory_linkstate.py +0 -0
  310. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/superlink/linkstate/linkstate.py +0 -0
  311. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/superlink/linkstate/linkstate_factory.py +0 -0
  312. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/superlink/linkstate/sqlite_linkstate.py +0 -0
  313. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/superlink/linkstate/utils.py +0 -0
  314. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/superlink/serverappio/__init__.py +0 -0
  315. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/superlink/serverappio/serverappio_grpc.py +0 -0
  316. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/superlink/simulation/__init__.py +0 -0
  317. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/superlink/simulation/simulationio_grpc.py +0 -0
  318. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/superlink/simulation/simulationio_servicer.py +0 -0
  319. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/superlink/utils.py +0 -0
  320. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/typing.py +0 -0
  321. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/utils/__init__.py +0 -0
  322. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/utils/tensorboard.py +0 -0
  323. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/utils/validator.py +0 -0
  324. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/workflow/__init__.py +0 -0
  325. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/workflow/constant.py +0 -0
  326. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/workflow/default_workflows.py +0 -0
  327. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
  328. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
  329. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +0 -0
  330. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/serverapp/__init__.py +0 -0
  331. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/simulation/__init__.py +0 -0
  332. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/simulation/app.py +0 -0
  333. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/simulation/legacy_app.py +0 -0
  334. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/simulation/ray_transport/__init__.py +0 -0
  335. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
  336. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
  337. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/simulation/ray_transport/utils.py +0 -0
  338. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/simulation/run_simulation.py +0 -0
  339. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/simulation/simulationio_connection.py +0 -0
  340. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/supercore/__init__.py +0 -0
  341. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/supercore/ffs/__init__.py +0 -0
  342. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/supercore/ffs/disk_ffs.py +0 -0
  343. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/supercore/ffs/ffs.py +0 -0
  344. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/supercore/ffs/ffs_factory.py +0 -0
  345. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/supercore/grpc_health/__init__.py +0 -0
  346. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/supercore/grpc_health/simple_health_servicer.py +0 -0
  347. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/supercore/license_plugin/__init__.py +0 -0
  348. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/supercore/license_plugin/license_plugin.py +0 -0
  349. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/supercore/object_store/__init__.py +0 -0
  350. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/supercore/object_store/in_memory_object_store.py +0 -0
  351. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/supercore/object_store/object_store.py +0 -0
  352. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/supercore/object_store/object_store_factory.py +0 -0
  353. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/supercore/utils.py +0 -0
  354. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/superexec/__init__.py +0 -0
  355. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/superexec/app.py +0 -0
  356. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/superexec/deployment.py +0 -0
  357. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/superexec/exec_event_log_interceptor.py +0 -0
  358. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/superexec/exec_grpc.py +0 -0
  359. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/superexec/exec_license_interceptor.py +0 -0
  360. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/superexec/exec_servicer.py +0 -0
  361. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/superexec/exec_user_auth_interceptor.py +0 -0
  362. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/superexec/executor.py +0 -0
  363. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/superexec/simulation.py +0 -0
  364. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/superlink/__init__.py +0 -0
  365. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/supernode/__init__.py +0 -0
  366. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/supernode/cli/__init__.py +0 -0
  367. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/supernode/cli/flower_supernode.py +0 -0
  368. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/supernode/cli/flwr_clientapp.py +0 -0
  369. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/supernode/nodestate/__init__.py +0 -0
  370. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/supernode/nodestate/in_memory_nodestate.py +0 -0
  371. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/supernode/nodestate/nodestate.py +0 -0
  372. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/supernode/nodestate/nodestate_factory.py +0 -0
  373. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/supernode/runtime/__init__.py +0 -0
  374. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/supernode/servicer/__init__.py +0 -0
  375. {flwr_nightly-1.20.0.dev20250717 → flwr_nightly-1.20.0.dev20250720}/py/flwr/supernode/servicer/clientappio/__init__.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: flwr-nightly
3
- Version: 1.20.0.dev20250717
3
+ Version: 1.20.0.dev20250720
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
@@ -184,7 +184,7 @@ def build_fab(app: Path) -> tuple[bytes, str, dict[str, Any]]:
184
184
  # Read the file content manually
185
185
  file_contents = file_path.read_bytes()
186
186
 
187
- archive_path = str(file_path.relative_to(app))
187
+ archive_path = str(file_path.relative_to(app)).replace("\\", "/")
188
188
  write_to_zip(fab_file, archive_path, file_contents)
189
189
 
190
190
  # Calculate file info
@@ -49,6 +49,9 @@ def grpc_adapter( # pylint: disable=R0913,too-many-positional-arguments
49
49
  Callable[[], None],
50
50
  Callable[[int], Run],
51
51
  Callable[[str, int], Fab],
52
+ Callable[[int, str], bytes],
53
+ Callable[[int, str, bytes], None],
54
+ Callable[[int, str], None],
52
55
  ]
53
56
  ]:
54
57
  """Primitives for request/response-based interaction with a server via GrpcAdapter.
@@ -83,6 +86,9 @@ def grpc_adapter( # pylint: disable=R0913,too-many-positional-arguments
83
86
  delete_node : Optional[Callable]
84
87
  get_run : Optional[Callable]
85
88
  get_fab : Optional[Callable]
89
+ pull_object : Callable[[str], bytes]
90
+ push_object : Callable[[str, bytes], None]
91
+ confirm_message_received : Callable[[str], None]
86
92
  """
87
93
  if authentication_keys is not None:
88
94
  log(ERROR, "Client authentication is not supported for this transport type.")
@@ -35,6 +35,7 @@ from flwr.common.inflatable import (
35
35
  no_object_id_recompute,
36
36
  )
37
37
  from flwr.common.inflatable_protobuf_utils import (
38
+ make_confirm_message_received_fn_protobuf,
38
39
  make_pull_object_fn_protobuf,
39
40
  make_push_object_fn_protobuf,
40
41
  )
@@ -94,6 +95,9 @@ def grpc_request_response( # pylint: disable=R0913,R0914,R0915,R0917
94
95
  Callable[[], None],
95
96
  Callable[[int], Run],
96
97
  Callable[[str, int], Fab],
98
+ Callable[[int, str], bytes],
99
+ Callable[[int, str, bytes], None],
100
+ Callable[[int, str], None],
97
101
  ]
98
102
  ]:
99
103
  """Primitives for request/response-based interaction with a server.
@@ -136,6 +140,9 @@ def grpc_request_response( # pylint: disable=R0913,R0914,R0915,R0917
136
140
  create_node : Optional[Callable]
137
141
  delete_node : Optional[Callable]
138
142
  get_run : Optional[Callable]
143
+ pull_object : Callable[[str], bytes]
144
+ push_object : Callable[[str, bytes], None]
145
+ confirm_message_received : Callable[[str], None]
139
146
  """
140
147
  if isinstance(root_certificates, str):
141
148
  root_certificates = Path(root_certificates).read_bytes()
@@ -354,9 +361,58 @@ def grpc_request_response( # pylint: disable=R0913,R0914,R0915,R0917
354
361
 
355
362
  return Fab(get_fab_response.fab.hash_str, get_fab_response.fab.content)
356
363
 
364
+ def pull_object(run_id: int, object_id: str) -> bytes:
365
+ """Pull the object from the SuperLink."""
366
+ # Check Node
367
+ if node is None:
368
+ raise RuntimeError("Node instance missing")
369
+
370
+ fn = make_pull_object_fn_protobuf(
371
+ pull_object_protobuf=stub.PullObject,
372
+ node=node,
373
+ run_id=run_id,
374
+ )
375
+ return fn(object_id)
376
+
377
+ def push_object(run_id: int, object_id: str, contents: bytes) -> None:
378
+ """Push the object to the SuperLink."""
379
+ # Check Node
380
+ if node is None:
381
+ raise RuntimeError("Node instance missing")
382
+
383
+ fn = make_push_object_fn_protobuf(
384
+ push_object_protobuf=stub.PushObject,
385
+ node=node,
386
+ run_id=run_id,
387
+ )
388
+ fn(object_id, contents)
389
+
390
+ def confirm_message_received(run_id: int, object_id: str) -> None:
391
+ """Confirm that the message has been received."""
392
+ # Check Node
393
+ if node is None:
394
+ raise RuntimeError("Node instance missing")
395
+
396
+ fn = make_confirm_message_received_fn_protobuf(
397
+ confirm_message_received_protobuf=stub.ConfirmMessageReceived,
398
+ node=node,
399
+ run_id=run_id,
400
+ )
401
+ fn(object_id)
402
+
357
403
  try:
358
404
  # Yield methods
359
- yield (receive, send, create_node, delete_node, get_run, get_fab)
405
+ yield (
406
+ receive,
407
+ send,
408
+ create_node,
409
+ delete_node,
410
+ get_run,
411
+ get_fab,
412
+ pull_object,
413
+ push_object,
414
+ confirm_message_received,
415
+ )
360
416
  except Exception as exc: # pylint: disable=broad-except
361
417
  log(ERROR, exc)
362
418
  # Cleanup
@@ -35,6 +35,7 @@ from flwr.common.inflatable import (
35
35
  no_object_id_recompute,
36
36
  )
37
37
  from flwr.common.inflatable_protobuf_utils import (
38
+ make_confirm_message_received_fn_protobuf,
38
39
  make_pull_object_fn_protobuf,
39
40
  make_push_object_fn_protobuf,
40
41
  )
@@ -114,6 +115,9 @@ def http_request_response( # pylint: disable=R0913,R0914,R0915,R0917
114
115
  Callable[[], None],
115
116
  Callable[[int], Run],
116
117
  Callable[[str, int], Fab],
118
+ Callable[[int, str], bytes],
119
+ Callable[[int, str, bytes], None],
120
+ Callable[[int, str], None],
117
121
  ]
118
122
  ]:
119
123
  """Primitives for request/response-based interaction with a server.
@@ -149,6 +153,9 @@ def http_request_response( # pylint: disable=R0913,R0914,R0915,R0917
149
153
  create_node : Optional[Callable]
150
154
  delete_node : Optional[Callable]
151
155
  get_run : Optional[Callable]
156
+ pull_object : Callable[[str], bytes]
157
+ push_object : Callable[[str, bytes], None]
158
+ confirm_message_received : Callable[[str], None]
152
159
  """
153
160
  log(
154
161
  WARN,
@@ -230,6 +237,38 @@ def http_request_response( # pylint: disable=R0913,R0914,R0915,R0917
230
237
  grpc_res.ParseFromString(res.content)
231
238
  return grpc_res
232
239
 
240
+ def _pull_object_protobuf(request: PullObjectRequest) -> PullObjectResponse:
241
+ res = _request(
242
+ req=request,
243
+ res_type=PullObjectResponse,
244
+ api_path=PATH_PULL_OBJECT,
245
+ )
246
+ if res is None:
247
+ raise ValueError(f"{PullObjectResponse.__name__} is None.")
248
+ return res
249
+
250
+ def _push_object_protobuf(request: PushObjectRequest) -> PushObjectResponse:
251
+ res = _request(
252
+ req=request,
253
+ res_type=PushObjectResponse,
254
+ api_path=PATH_PUSH_OBJECT,
255
+ )
256
+ if res is None:
257
+ raise ValueError(f"{PushObjectResponse.__name__} is None.")
258
+ return res
259
+
260
+ def _confirm_message_received_protobuf(
261
+ request: ConfirmMessageReceivedRequest,
262
+ ) -> ConfirmMessageReceivedResponse:
263
+ res = _request(
264
+ req=request,
265
+ res_type=ConfirmMessageReceivedResponse,
266
+ api_path=PATH_CONFIRM_MESSAGE_RECEIVED,
267
+ )
268
+ if res is None:
269
+ raise ValueError(f"{ConfirmMessageReceivedResponse.__name__} is None.")
270
+ return res
271
+
233
272
  def send_node_heartbeat() -> bool:
234
273
  # Get Node
235
274
  if node is None:
@@ -326,20 +365,12 @@ def http_request_response( # pylint: disable=R0913,R0914,R0915,R0917
326
365
  msg_id = message_proto.metadata.message_id
327
366
  run_id = message_proto.metadata.run_id
328
367
 
329
- def fn(request: PullObjectRequest) -> PullObjectResponse:
330
- res = _request(
331
- req=request, res_type=PullObjectResponse, api_path=PATH_PULL_OBJECT
332
- )
333
- if res is None:
334
- raise ValueError("PushObjectResponse is None.")
335
- return res
336
-
337
368
  try:
338
369
  object_tree = res.message_object_trees[0]
339
370
  all_object_contents = pull_objects(
340
371
  [tree.object_id for tree in iterate_object_tree(object_tree)],
341
372
  pull_object_fn=make_pull_object_fn_protobuf(
342
- pull_object_protobuf=fn,
373
+ pull_object_protobuf=_pull_object_protobuf,
343
374
  node=node,
344
375
  run_id=run_id,
345
376
  ),
@@ -403,21 +434,11 @@ def http_request_response( # pylint: disable=R0913,R0914,R0915,R0917
403
434
  if res and res.objects_to_push:
404
435
  objs_to_push = set(res.objects_to_push[message.object_id].object_ids)
405
436
 
406
- def fn(request: PushObjectRequest) -> PushObjectResponse:
407
- res = _request(
408
- req=request,
409
- res_type=PushObjectResponse,
410
- api_path=PATH_PUSH_OBJECT,
411
- )
412
- if res is None:
413
- raise ValueError("PushObjectResponse is None.")
414
- return res
415
-
416
437
  try:
417
438
  push_objects(
418
439
  all_objects,
419
440
  push_object_fn=make_push_object_fn_protobuf(
420
- push_object_protobuf=fn,
441
+ push_object_protobuf=_push_object_protobuf,
421
442
  node=node,
422
443
  run_id=message_proto.metadata.run_id,
423
444
  ),
@@ -457,9 +478,58 @@ def http_request_response( # pylint: disable=R0913,R0914,R0915,R0917
457
478
  res.fab.content,
458
479
  )
459
480
 
481
+ def pull_object(run_id: int, object_id: str) -> bytes:
482
+ """Pull the object from the SuperLink."""
483
+ # Check Node
484
+ if node is None:
485
+ raise RuntimeError("Node instance missing")
486
+
487
+ fn = make_pull_object_fn_protobuf(
488
+ pull_object_protobuf=_pull_object_protobuf,
489
+ node=node,
490
+ run_id=run_id,
491
+ )
492
+ return fn(object_id)
493
+
494
+ def push_object(run_id: int, object_id: str, contents: bytes) -> None:
495
+ """Push the object to the SuperLink."""
496
+ # Check Node
497
+ if node is None:
498
+ raise RuntimeError("Node instance missing")
499
+
500
+ fn = make_push_object_fn_protobuf(
501
+ push_object_protobuf=_push_object_protobuf,
502
+ node=node,
503
+ run_id=run_id,
504
+ )
505
+ fn(object_id, contents)
506
+
507
+ def confirm_message_received(run_id: int, object_id: str) -> None:
508
+ """Confirm that the message has been received."""
509
+ # Check Node
510
+ if node is None:
511
+ raise RuntimeError("Node instance missing")
512
+
513
+ fn = make_confirm_message_received_fn_protobuf(
514
+ confirm_message_received_protobuf=_confirm_message_received_protobuf,
515
+ node=node,
516
+ run_id=run_id,
517
+ )
518
+ fn(object_id)
519
+
460
520
  try:
461
521
  # Yield methods
462
- yield (receive, send, create_node, delete_node, get_run, get_fab)
522
+ yield (
523
+ receive,
524
+ send,
525
+ create_node,
526
+ delete_node,
527
+ get_run,
528
+ get_fab,
529
+ pull_object,
530
+ push_object,
531
+ confirm_message_received,
532
+ )
463
533
  except Exception as exc: # pylint: disable=broad-except
464
534
  log(ERROR, exc)
465
535
  # Cleanup
@@ -18,6 +18,8 @@
18
18
  from typing import Callable
19
19
 
20
20
  from flwr.proto.message_pb2 import ( # pylint: disable=E0611
21
+ ConfirmMessageReceivedRequest,
22
+ ConfirmMessageReceivedResponse,
21
23
  PullObjectRequest,
22
24
  PullObjectResponse,
23
25
  PushObjectRequest,
@@ -27,6 +29,10 @@ from flwr.proto.node_pb2 import Node # pylint: disable=E0611
27
29
 
28
30
  from .inflatable_utils import ObjectIdNotPreregisteredError, ObjectUnavailableError
29
31
 
32
+ ConfirmMessageReceivedProtobuf = Callable[
33
+ [ConfirmMessageReceivedRequest], ConfirmMessageReceivedResponse
34
+ ]
35
+
30
36
 
31
37
  def make_pull_object_fn_protobuf(
32
38
  pull_object_protobuf: Callable[[PullObjectRequest], PullObjectResponse],
@@ -99,3 +105,37 @@ def make_push_object_fn_protobuf(
99
105
  raise ObjectIdNotPreregisteredError(object_id)
100
106
 
101
107
  return push_object_fn
108
+
109
+
110
+ def make_confirm_message_received_fn_protobuf(
111
+ confirm_message_received_protobuf: ConfirmMessageReceivedProtobuf,
112
+ node: Node,
113
+ run_id: int,
114
+ ) -> Callable[[str], None]:
115
+ """Create a confirm message received function that uses protobuf.
116
+
117
+ Parameters
118
+ ----------
119
+ confirm_message_received_protobuf : ConfirmMessageReceivedProtobuf
120
+ A callable that takes a `ConfirmMessageReceivedRequest` and returns a
121
+ `ConfirmMessageReceivedResponse`, confirming message receipt.
122
+ This function is typically backed by a gRPC client stub.
123
+ node : Node
124
+ The node making the request.
125
+ run_id : int
126
+ The run ID for the current message.
127
+
128
+ Returns
129
+ -------
130
+ Callable[[str], None]
131
+ A wrapper function that takes an object ID and confirms that
132
+ the message has been received.
133
+ """
134
+
135
+ def confirm_message_received_fn(object_id: str) -> None:
136
+ request = ConfirmMessageReceivedRequest(
137
+ node=node, run_id=run_id, message_object_id=object_id
138
+ )
139
+ confirm_message_received_protobuf(request)
140
+
141
+ return confirm_message_received_fn
@@ -19,7 +19,10 @@ import os
19
19
  import random
20
20
  import threading
21
21
  import time
22
- from typing import Callable, Optional
22
+ from collections.abc import Iterable, Iterator
23
+ from typing import Callable, Optional, TypeVar
24
+
25
+ from flwr.proto.message_pb2 import ObjectTree # pylint: disable=E0611
23
26
 
24
27
  from .constant import (
25
28
  HEAD_BODY_DIVIDER,
@@ -38,6 +41,7 @@ from .inflatable import (
38
41
  get_object_head_values_from_object_content,
39
42
  get_object_id,
40
43
  is_valid_sha256_hash,
44
+ iterate_object_tree,
41
45
  )
42
46
  from .message import Message
43
47
  from .record import Array, ArrayRecord, ConfigRecord, MetricRecord, RecordDict
@@ -54,6 +58,8 @@ inflatable_class_registry: dict[str, type[InflatableObject]] = {
54
58
  RecordDict.__qualname__: RecordDict,
55
59
  }
56
60
 
61
+ T = TypeVar("T", bound=InflatableObject)
62
+
57
63
 
58
64
  class ObjectUnavailableError(Exception):
59
65
  """Exception raised when an object has been pre-registered but is not yet
@@ -105,24 +111,61 @@ def push_objects(
105
111
  max_concurrent_pushes : int (default: MAX_CONCURRENT_PUSHES)
106
112
  The maximum number of concurrent pushes to perform.
107
113
  """
108
- if object_ids_to_push is not None:
109
- # Filter objects to push only those with IDs in the set
110
- objects = {k: v for k, v in objects.items() if k in object_ids_to_push}
111
-
112
114
  lock = threading.Lock()
113
115
 
114
- def push(obj_id: str) -> None:
116
+ def iter_dict_items() -> Iterator[tuple[str, bytes]]:
117
+ """Iterate over the dictionary items."""
118
+ for obj_id in list(objects.keys()):
119
+ # Skip the object if no need to push it
120
+ if object_ids_to_push is not None and obj_id not in object_ids_to_push:
121
+ continue
122
+
123
+ # Deflate the object content
124
+ object_content = objects[obj_id].deflate()
125
+ if not keep_objects:
126
+ with lock:
127
+ del objects[obj_id]
128
+
129
+ yield obj_id, object_content
130
+
131
+ push_object_contents_from_iterable(
132
+ iter_dict_items(),
133
+ push_object_fn,
134
+ max_concurrent_pushes=max_concurrent_pushes,
135
+ )
136
+
137
+
138
+ def push_object_contents_from_iterable(
139
+ object_contents: Iterable[tuple[str, bytes]],
140
+ push_object_fn: Callable[[str, bytes], None],
141
+ *,
142
+ max_concurrent_pushes: int = MAX_CONCURRENT_PUSHES,
143
+ ) -> None:
144
+ """Push multiple object contents to the servicer.
145
+
146
+ Parameters
147
+ ----------
148
+ object_contents : Iterable[tuple[str, bytes]]
149
+ An iterable of `(object_id, object_content)` pairs.
150
+ `object_id` is the object ID, and `object_content` is the object content.
151
+ push_object_fn : Callable[[str, bytes], None]
152
+ A function that takes an object ID and its content as bytes, and pushes
153
+ it to the servicer. This function should raise `ObjectIdNotPreregisteredError`
154
+ if the object ID is not pre-registered.
155
+ max_concurrent_pushes : int (default: MAX_CONCURRENT_PUSHES)
156
+ The maximum number of concurrent pushes to perform.
157
+ """
158
+
159
+ def push(args: tuple[str, bytes]) -> None:
115
160
  """Push a single object."""
116
- object_content = objects[obj_id].deflate()
117
- if not keep_objects:
118
- with lock:
119
- del objects[obj_id]
120
- push_object_fn(obj_id, object_content)
161
+ obj_id, obj_content = args
162
+ # Push the object using the provided function
163
+ push_object_fn(obj_id, obj_content)
121
164
 
122
- # Push all objects concurrently
165
+ # Push all object contents concurrently
123
166
  num_workers = get_num_workers(max_concurrent_pushes)
124
167
  with concurrent.futures.ThreadPoolExecutor(max_workers=num_workers) as executor:
125
- list(executor.map(push, list(objects.keys())))
168
+ list(executor.map(push, object_contents))
126
169
 
127
170
 
128
171
  def pull_objects( # pylint: disable=too-many-arguments,too-many-locals
@@ -348,3 +391,75 @@ def validate_object_content(content: bytes) -> None:
348
391
  raise UnexpectedObjectContentError(
349
392
  object_id=get_object_id(content), reason=str(err)
350
393
  ) from err
394
+
395
+
396
+ def pull_and_inflate_object_from_tree( # pylint: disable=R0913
397
+ object_tree: ObjectTree,
398
+ pull_object_fn: Callable[[str], bytes],
399
+ confirm_object_received_fn: Callable[[str], None],
400
+ *,
401
+ return_type: type[T] = InflatableObject, # type: ignore
402
+ max_concurrent_pulls: int = MAX_CONCURRENT_PULLS,
403
+ max_time: Optional[float] = PULL_MAX_TIME,
404
+ max_tries_per_object: Optional[int] = PULL_MAX_TRIES_PER_OBJECT,
405
+ initial_backoff: float = PULL_INITIAL_BACKOFF,
406
+ backoff_cap: float = PULL_BACKOFF_CAP,
407
+ ) -> T:
408
+ """Pull and inflate the head object from the provided object tree.
409
+
410
+ Parameters
411
+ ----------
412
+ object_tree : ObjectTree
413
+ The object tree containing the object ID and its descendants.
414
+ pull_object_fn : Callable[[str], bytes]
415
+ A function that takes an object ID and returns the object content as bytes.
416
+ confirm_object_received_fn : Callable[[str], None]
417
+ A function to confirm that the object has been received.
418
+ return_type : type[T] (default: InflatableObject)
419
+ The type of the object to return. Must be a subclass of `InflatableObject`.
420
+ max_concurrent_pulls : int (default: MAX_CONCURRENT_PULLS)
421
+ The maximum number of concurrent pulls to perform.
422
+ max_time : Optional[float] (default: PULL_MAX_TIME)
423
+ The maximum time to wait for all pulls to complete. If `None`, waits
424
+ indefinitely.
425
+ max_tries_per_object : Optional[int] (default: PULL_MAX_TRIES_PER_OBJECT)
426
+ The maximum number of attempts to pull each object. If `None`, pulls
427
+ indefinitely until the object is available.
428
+ initial_backoff : float (default: PULL_INITIAL_BACKOFF)
429
+ The initial backoff time in seconds for retrying pulls after an
430
+ `ObjectUnavailableError`.
431
+ backoff_cap : float (default: PULL_BACKOFF_CAP)
432
+ The maximum backoff time in seconds. Backoff times will not exceed this value.
433
+
434
+ Returns
435
+ -------
436
+ T
437
+ An instance of the specified return type containing the inflated object.
438
+ """
439
+ # Pull the main object and all its descendants
440
+ pulled_object_contents = pull_objects(
441
+ [tree.object_id for tree in iterate_object_tree(object_tree)],
442
+ pull_object_fn,
443
+ max_concurrent_pulls=max_concurrent_pulls,
444
+ max_time=max_time,
445
+ max_tries_per_object=max_tries_per_object,
446
+ initial_backoff=initial_backoff,
447
+ backoff_cap=backoff_cap,
448
+ )
449
+
450
+ # Confirm that all objects were pulled
451
+ confirm_object_received_fn(object_tree.object_id)
452
+
453
+ # Inflate the main object
454
+ inflated_object = inflate_object_from_contents(
455
+ object_tree.object_id, pulled_object_contents, keep_object_contents=False
456
+ )
457
+
458
+ # Check if the inflated object is of the expected type
459
+ if not isinstance(inflated_object, return_type):
460
+ raise TypeError(
461
+ f"Expected object of type {return_type.__name__}, "
462
+ f"but got {type(inflated_object).__name__}."
463
+ )
464
+
465
+ return inflated_object
@@ -61,8 +61,7 @@ from flwr.server.superlink.linkstate import LinkState
61
61
  from flwr.server.superlink.utils import check_abort
62
62
  from flwr.supercore.ffs import Ffs
63
63
  from flwr.supercore.object_store import NoObjectInStoreError, ObjectStore
64
-
65
- from ...utils import store_mapping_and_register_objects
64
+ from flwr.supercore.object_store.utils import store_mapping_and_register_objects
66
65
 
67
66
 
68
67
  def create_node(
@@ -87,8 +87,7 @@ from flwr.server.superlink.utils import abort_if
87
87
  from flwr.server.utils.validator import validate_message
88
88
  from flwr.supercore.ffs import Ffs, FfsFactory
89
89
  from flwr.supercore.object_store import NoObjectInStoreError, ObjectStoreFactory
90
-
91
- from ..utils import store_mapping_and_register_objects
90
+ from flwr.supercore.object_store.utils import store_mapping_and_register_objects
92
91
 
93
92
 
94
93
  class ServerAppIoServicer(serverappio_pb2_grpc.ServerAppIoServicer):
@@ -0,0 +1,48 @@
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
+ """Utils for ObjectStore."""
16
+
17
+
18
+ from typing import Union
19
+
20
+ from flwr.proto.appio_pb2 import PushAppMessagesRequest # pylint: disable=E0611
21
+ from flwr.proto.fleet_pb2 import PushMessagesRequest # pylint: disable=E0611
22
+ from flwr.proto.message_pb2 import ObjectIDs # pylint: disable=E0611
23
+
24
+ from . import ObjectStore
25
+
26
+
27
+ def store_mapping_and_register_objects(
28
+ store: ObjectStore, request: Union[PushAppMessagesRequest, PushMessagesRequest]
29
+ ) -> dict[str, ObjectIDs]:
30
+ """Store Message object to descendants mapping and preregister objects."""
31
+ if not request.messages_list:
32
+ return {}
33
+
34
+ objects_to_push: dict[str, ObjectIDs] = {}
35
+
36
+ # Get run_id from the first message in the list
37
+ # All messages of a request should in the same run
38
+ run_id = request.messages_list[0].metadata.run_id
39
+
40
+ for object_tree in request.message_object_trees:
41
+ # Preregister
42
+ object_ids_just_registered = store.preregister(run_id, object_tree)
43
+ # Keep track of objects that need to be pushed
44
+ objects_to_push[object_tree.object_id] = ObjectIDs(
45
+ object_ids=object_ids_just_registered
46
+ )
47
+
48
+ return objects_to_push