flwr-nightly 1.20.0.dev20250718__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.dev20250718 → flwr_nightly-1.20.0.dev20250720}/PKG-INFO +1 -1
  2. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/build.py +1 -1
  3. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/client/grpc_adapter_client/connection.py +6 -0
  4. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/client/grpc_rere_client/connection.py +57 -1
  5. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/client/rest_client/connection.py +91 -21
  6. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/inflatable_utils.py +50 -12
  7. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/superlink/fleet/message_handler/message_handler.py +1 -2
  8. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/superlink/serverappio/serverappio_servicer.py +1 -2
  9. flwr_nightly-1.20.0.dev20250720/py/flwr/supercore/object_store/utils.py +48 -0
  10. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/supernode/runtime/run_clientapp.py +64 -11
  11. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/supernode/servicer/clientappio/clientappio_servicer.py +16 -4
  12. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/supernode/start_client_internal.py +27 -3
  13. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/pyproject.toml +1 -1
  14. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/README.md +0 -0
  15. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/__init__.py +0 -0
  16. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/app/__init__.py +0 -0
  17. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/app/error.py +0 -0
  18. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/app/metadata.py +0 -0
  19. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/__init__.py +0 -0
  20. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/app.py +0 -0
  21. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/auth_plugin/__init__.py +0 -0
  22. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/auth_plugin/oidc_cli_plugin.py +0 -0
  23. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/cli_user_auth_interceptor.py +0 -0
  24. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/config_utils.py +0 -0
  25. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/constant.py +0 -0
  26. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/example.py +0 -0
  27. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/install.py +0 -0
  28. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/log.py +0 -0
  29. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/login/__init__.py +0 -0
  30. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/login/login.py +0 -0
  31. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/ls.py +0 -0
  32. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/__init__.py +0 -0
  33. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/new.py +0 -0
  34. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/__init__.py +0 -0
  35. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/.gitignore.tpl +0 -0
  36. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/LICENSE.tpl +0 -0
  37. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/README.baseline.md.tpl +0 -0
  38. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/README.flowertune.md.tpl +0 -0
  39. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/README.md.tpl +0 -0
  40. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/__init__.py +0 -0
  41. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/code/__init__.baseline.py.tpl +0 -0
  42. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
  43. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
  44. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/code/client.baseline.py.tpl +0 -0
  45. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/code/client.huggingface.py.tpl +0 -0
  46. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/code/client.jax.py.tpl +0 -0
  47. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/code/client.mlx.py.tpl +0 -0
  48. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/code/client.numpy.py.tpl +0 -0
  49. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -0
  50. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl +0 -0
  51. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -0
  52. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/code/dataset.baseline.py.tpl +0 -0
  53. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/code/flwr_tune/__init__.py +0 -0
  54. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/code/flwr_tune/client_app.py.tpl +0 -0
  55. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/code/flwr_tune/dataset.py.tpl +0 -0
  56. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/code/flwr_tune/models.py.tpl +0 -0
  57. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/code/flwr_tune/server_app.py.tpl +0 -0
  58. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/code/flwr_tune/strategy.py.tpl +0 -0
  59. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/code/model.baseline.py.tpl +0 -0
  60. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/code/server.baseline.py.tpl +0 -0
  61. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/code/server.huggingface.py.tpl +0 -0
  62. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/code/server.jax.py.tpl +0 -0
  63. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/code/server.mlx.py.tpl +0 -0
  64. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -0
  65. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -0
  66. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/code/server.sklearn.py.tpl +0 -0
  67. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -0
  68. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/code/strategy.baseline.py.tpl +0 -0
  69. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/code/task.huggingface.py.tpl +0 -0
  70. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/code/task.jax.py.tpl +0 -0
  71. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/code/task.mlx.py.tpl +0 -0
  72. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/code/task.numpy.py.tpl +0 -0
  73. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +0 -0
  74. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/code/task.sklearn.py.tpl +0 -0
  75. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/code/task.tensorflow.py.tpl +0 -0
  76. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/code/utils.baseline.py.tpl +0 -0
  77. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/pyproject.baseline.toml.tpl +0 -0
  78. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +0 -0
  79. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl +0 -0
  80. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/pyproject.jax.toml.tpl +0 -0
  81. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +0 -0
  82. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +0 -0
  83. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +0 -0
  84. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +0 -0
  85. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +0 -0
  86. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/run/__init__.py +0 -0
  87. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/run/run.py +0 -0
  88. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/stop.py +0 -0
  89. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/cli/utils.py +0 -0
  90. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/client/__init__.py +0 -0
  91. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/client/client.py +0 -0
  92. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/client/client_app.py +0 -0
  93. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/client/clientapp/__init__.py +0 -0
  94. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/client/clientapp/utils.py +0 -0
  95. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/client/dpfedavg_numpy_client.py +0 -0
  96. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/client/grpc_adapter_client/__init__.py +0 -0
  97. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/client/grpc_rere_client/__init__.py +0 -0
  98. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/client/grpc_rere_client/client_interceptor.py +0 -0
  99. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/client/grpc_rere_client/grpc_adapter.py +0 -0
  100. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/client/message_handler/__init__.py +0 -0
  101. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/client/message_handler/message_handler.py +0 -0
  102. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/client/mod/__init__.py +0 -0
  103. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/client/mod/centraldp_mods.py +0 -0
  104. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/client/mod/comms_mods.py +0 -0
  105. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/client/mod/localdp_mod.py +0 -0
  106. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
  107. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
  108. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
  109. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/client/mod/utils.py +0 -0
  110. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/client/numpy_client.py +0 -0
  111. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/client/rest_client/__init__.py +0 -0
  112. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/client/run_info_store.py +0 -0
  113. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/client/typing.py +0 -0
  114. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/clientapp/__init__.py +0 -0
  115. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/__init__.py +0 -0
  116. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/address.py +0 -0
  117. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/args.py +0 -0
  118. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/auth_plugin/__init__.py +0 -0
  119. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/auth_plugin/auth_plugin.py +0 -0
  120. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/config.py +0 -0
  121. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/constant.py +0 -0
  122. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/context.py +0 -0
  123. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/date.py +0 -0
  124. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/differential_privacy.py +0 -0
  125. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/differential_privacy_constants.py +0 -0
  126. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/dp.py +0 -0
  127. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/event_log_plugin/__init__.py +0 -0
  128. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/event_log_plugin/event_log_plugin.py +0 -0
  129. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/exit/__init__.py +0 -0
  130. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/exit/exit.py +0 -0
  131. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/exit/exit_code.py +0 -0
  132. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/exit_handlers.py +0 -0
  133. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/grpc.py +0 -0
  134. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/heartbeat.py +0 -0
  135. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/inflatable.py +0 -0
  136. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/inflatable_protobuf_utils.py +0 -0
  137. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/logger.py +0 -0
  138. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/message.py +0 -0
  139. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/object_ref.py +0 -0
  140. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/parameter.py +0 -0
  141. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/pyproject.py +0 -0
  142. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/record/__init__.py +0 -0
  143. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/record/array.py +0 -0
  144. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/record/arraychunk.py +0 -0
  145. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/record/arrayrecord.py +0 -0
  146. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/record/configrecord.py +0 -0
  147. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/record/conversion_utils.py +0 -0
  148. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/record/metricrecord.py +0 -0
  149. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/record/recorddict.py +0 -0
  150. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/record/typeddict.py +0 -0
  151. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/recorddict_compat.py +0 -0
  152. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/retry_invoker.py +0 -0
  153. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/secure_aggregation/__init__.py +0 -0
  154. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
  155. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
  156. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -0
  157. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
  158. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/secure_aggregation/quantization.py +0 -0
  159. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
  160. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
  161. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/serde.py +0 -0
  162. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/serde_utils.py +0 -0
  163. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/telemetry.py +0 -0
  164. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/typing.py +0 -0
  165. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/common/version.py +0 -0
  166. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/compat/__init__.py +0 -0
  167. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/compat/client/__init__.py +0 -0
  168. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/compat/client/app.py +0 -0
  169. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/compat/client/grpc_client/__init__.py +0 -0
  170. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/compat/client/grpc_client/connection.py +0 -0
  171. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/compat/common/__init__.py +0 -0
  172. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/compat/server/__init__.py +0 -0
  173. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/compat/server/app.py +0 -0
  174. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/compat/simulation/__init__.py +0 -0
  175. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/__init__.py +0 -0
  176. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/appio_pb2.py +0 -0
  177. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/appio_pb2.pyi +0 -0
  178. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/appio_pb2_grpc.py +0 -0
  179. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/appio_pb2_grpc.pyi +0 -0
  180. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/clientappio_pb2.py +0 -0
  181. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/clientappio_pb2.pyi +0 -0
  182. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/clientappio_pb2_grpc.py +0 -0
  183. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/clientappio_pb2_grpc.pyi +0 -0
  184. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/error_pb2.py +0 -0
  185. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/error_pb2.pyi +0 -0
  186. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/error_pb2_grpc.py +0 -0
  187. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/error_pb2_grpc.pyi +0 -0
  188. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/exec_pb2.py +0 -0
  189. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/exec_pb2.pyi +0 -0
  190. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/exec_pb2_grpc.py +0 -0
  191. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/exec_pb2_grpc.pyi +0 -0
  192. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/fab_pb2.py +0 -0
  193. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/fab_pb2.pyi +0 -0
  194. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/fab_pb2_grpc.py +0 -0
  195. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/fab_pb2_grpc.pyi +0 -0
  196. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/fleet_pb2.py +0 -0
  197. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/fleet_pb2.pyi +0 -0
  198. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/fleet_pb2_grpc.py +0 -0
  199. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
  200. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/grpcadapter_pb2.py +0 -0
  201. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/grpcadapter_pb2.pyi +0 -0
  202. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/grpcadapter_pb2_grpc.py +0 -0
  203. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/grpcadapter_pb2_grpc.pyi +0 -0
  204. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/heartbeat_pb2.py +0 -0
  205. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/heartbeat_pb2.pyi +0 -0
  206. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/heartbeat_pb2_grpc.py +0 -0
  207. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/heartbeat_pb2_grpc.pyi +0 -0
  208. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/log_pb2.py +0 -0
  209. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/log_pb2.pyi +0 -0
  210. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/log_pb2_grpc.py +0 -0
  211. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/log_pb2_grpc.pyi +0 -0
  212. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/message_pb2.py +0 -0
  213. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/message_pb2.pyi +0 -0
  214. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/message_pb2_grpc.py +0 -0
  215. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/message_pb2_grpc.pyi +0 -0
  216. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/node_pb2.py +0 -0
  217. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/node_pb2.pyi +0 -0
  218. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/node_pb2_grpc.py +0 -0
  219. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/node_pb2_grpc.pyi +0 -0
  220. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/recorddict_pb2.py +0 -0
  221. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/recorddict_pb2.pyi +0 -0
  222. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/recorddict_pb2_grpc.py +0 -0
  223. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/recorddict_pb2_grpc.pyi +0 -0
  224. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/run_pb2.py +0 -0
  225. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/run_pb2.pyi +0 -0
  226. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/run_pb2_grpc.py +0 -0
  227. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/run_pb2_grpc.pyi +0 -0
  228. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/serverappio_pb2.py +0 -0
  229. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/serverappio_pb2.pyi +0 -0
  230. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/serverappio_pb2_grpc.py +0 -0
  231. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/serverappio_pb2_grpc.pyi +0 -0
  232. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/simulationio_pb2.py +0 -0
  233. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/simulationio_pb2.pyi +0 -0
  234. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/simulationio_pb2_grpc.py +0 -0
  235. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/simulationio_pb2_grpc.pyi +0 -0
  236. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/transport_pb2.py +0 -0
  237. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/transport_pb2.pyi +0 -0
  238. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/transport_pb2_grpc.py +0 -0
  239. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
  240. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/py.typed +0 -0
  241. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/__init__.py +0 -0
  242. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/app.py +0 -0
  243. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/client_manager.py +0 -0
  244. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/client_proxy.py +0 -0
  245. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/compat/__init__.py +0 -0
  246. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/compat/app.py +0 -0
  247. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/compat/app_utils.py +0 -0
  248. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/compat/grid_client_proxy.py +0 -0
  249. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/compat/legacy_context.py +0 -0
  250. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/criterion.py +0 -0
  251. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/fleet_event_log_interceptor.py +0 -0
  252. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/grid/__init__.py +0 -0
  253. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/grid/grid.py +0 -0
  254. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/grid/grpc_grid.py +0 -0
  255. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/grid/inmemory_grid.py +0 -0
  256. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/history.py +0 -0
  257. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/run_serverapp.py +0 -0
  258. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/server.py +0 -0
  259. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/server_app.py +0 -0
  260. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/server_config.py +0 -0
  261. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/serverapp/__init__.py +0 -0
  262. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/serverapp/app.py +0 -0
  263. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/serverapp_components.py +0 -0
  264. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/strategy/__init__.py +0 -0
  265. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/strategy/aggregate.py +0 -0
  266. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/strategy/bulyan.py +0 -0
  267. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
  268. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
  269. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
  270. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
  271. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
  272. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/strategy/fedadagrad.py +0 -0
  273. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/strategy/fedadam.py +0 -0
  274. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/strategy/fedavg.py +0 -0
  275. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/strategy/fedavg_android.py +0 -0
  276. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/strategy/fedavgm.py +0 -0
  277. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/strategy/fedmedian.py +0 -0
  278. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/strategy/fedopt.py +0 -0
  279. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/strategy/fedprox.py +0 -0
  280. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
  281. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
  282. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
  283. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
  284. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/strategy/fedyogi.py +0 -0
  285. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/strategy/krum.py +0 -0
  286. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/strategy/qfedavg.py +0 -0
  287. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/strategy/strategy.py +0 -0
  288. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/superlink/__init__.py +0 -0
  289. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/superlink/fleet/__init__.py +0 -0
  290. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/superlink/fleet/grpc_adapter/__init__.py +0 -0
  291. {flwr_nightly-1.20.0.dev20250718 → 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.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
  293. {flwr_nightly-1.20.0.dev20250718 → 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.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
  295. {flwr_nightly-1.20.0.dev20250718 → 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.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +0 -0
  297. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
  298. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +0 -0
  299. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +0 -0
  300. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
  301. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
  302. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +0 -0
  303. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
  304. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
  305. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
  306. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +0 -0
  307. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/superlink/fleet/vce/vce_api.py +0 -0
  308. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/superlink/linkstate/__init__.py +0 -0
  309. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/superlink/linkstate/in_memory_linkstate.py +0 -0
  310. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/superlink/linkstate/linkstate.py +0 -0
  311. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/superlink/linkstate/linkstate_factory.py +0 -0
  312. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/superlink/linkstate/sqlite_linkstate.py +0 -0
  313. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/superlink/linkstate/utils.py +0 -0
  314. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/superlink/serverappio/__init__.py +0 -0
  315. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/superlink/serverappio/serverappio_grpc.py +0 -0
  316. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/superlink/simulation/__init__.py +0 -0
  317. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/superlink/simulation/simulationio_grpc.py +0 -0
  318. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/superlink/simulation/simulationio_servicer.py +0 -0
  319. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/superlink/utils.py +0 -0
  320. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/typing.py +0 -0
  321. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/utils/__init__.py +0 -0
  322. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/utils/tensorboard.py +0 -0
  323. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/utils/validator.py +0 -0
  324. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/workflow/__init__.py +0 -0
  325. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/workflow/constant.py +0 -0
  326. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/workflow/default_workflows.py +0 -0
  327. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
  328. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
  329. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +0 -0
  330. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/serverapp/__init__.py +0 -0
  331. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/simulation/__init__.py +0 -0
  332. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/simulation/app.py +0 -0
  333. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/simulation/legacy_app.py +0 -0
  334. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/simulation/ray_transport/__init__.py +0 -0
  335. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
  336. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
  337. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/simulation/ray_transport/utils.py +0 -0
  338. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/simulation/run_simulation.py +0 -0
  339. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/simulation/simulationio_connection.py +0 -0
  340. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/supercore/__init__.py +0 -0
  341. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/supercore/ffs/__init__.py +0 -0
  342. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/supercore/ffs/disk_ffs.py +0 -0
  343. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/supercore/ffs/ffs.py +0 -0
  344. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/supercore/ffs/ffs_factory.py +0 -0
  345. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/supercore/grpc_health/__init__.py +0 -0
  346. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/supercore/grpc_health/simple_health_servicer.py +0 -0
  347. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/supercore/license_plugin/__init__.py +0 -0
  348. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/supercore/license_plugin/license_plugin.py +0 -0
  349. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/supercore/object_store/__init__.py +0 -0
  350. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/supercore/object_store/in_memory_object_store.py +0 -0
  351. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/supercore/object_store/object_store.py +0 -0
  352. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/supercore/object_store/object_store_factory.py +0 -0
  353. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/supercore/utils.py +0 -0
  354. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/superexec/__init__.py +0 -0
  355. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/superexec/app.py +0 -0
  356. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/superexec/deployment.py +0 -0
  357. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/superexec/exec_event_log_interceptor.py +0 -0
  358. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/superexec/exec_grpc.py +0 -0
  359. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/superexec/exec_license_interceptor.py +0 -0
  360. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/superexec/exec_servicer.py +0 -0
  361. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/superexec/exec_user_auth_interceptor.py +0 -0
  362. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/superexec/executor.py +0 -0
  363. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/superexec/simulation.py +0 -0
  364. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/superlink/__init__.py +0 -0
  365. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/supernode/__init__.py +0 -0
  366. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/supernode/cli/__init__.py +0 -0
  367. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/supernode/cli/flower_supernode.py +0 -0
  368. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/supernode/cli/flwr_clientapp.py +0 -0
  369. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/supernode/nodestate/__init__.py +0 -0
  370. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/supernode/nodestate/in_memory_nodestate.py +0 -0
  371. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/supernode/nodestate/nodestate.py +0 -0
  372. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/supernode/nodestate/nodestate_factory.py +0 -0
  373. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/supernode/runtime/__init__.py +0 -0
  374. {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250720}/py/flwr/supernode/servicer/__init__.py +0 -0
  375. {flwr_nightly-1.20.0.dev20250718 → 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.dev20250718
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
@@ -19,6 +19,7 @@ import os
19
19
  import random
20
20
  import threading
21
21
  import time
22
+ from collections.abc import Iterable, Iterator
22
23
  from typing import Callable, Optional, TypeVar
23
24
 
24
25
  from flwr.proto.message_pb2 import ObjectTree # pylint: disable=E0611
@@ -110,24 +111,61 @@ def push_objects(
110
111
  max_concurrent_pushes : int (default: MAX_CONCURRENT_PUSHES)
111
112
  The maximum number of concurrent pushes to perform.
112
113
  """
113
- if object_ids_to_push is not None:
114
- # Filter objects to push only those with IDs in the set
115
- objects = {k: v for k, v in objects.items() if k in object_ids_to_push}
116
-
117
114
  lock = threading.Lock()
118
115
 
119
- 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:
120
160
  """Push a single object."""
121
- object_content = objects[obj_id].deflate()
122
- if not keep_objects:
123
- with lock:
124
- del objects[obj_id]
125
- 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)
126
164
 
127
- # Push all objects concurrently
165
+ # Push all object contents concurrently
128
166
  num_workers = get_num_workers(max_concurrent_pushes)
129
167
  with concurrent.futures.ThreadPoolExecutor(max_workers=num_workers) as executor:
130
- list(executor.map(push, list(objects.keys())))
168
+ list(executor.map(push, object_contents))
131
169
 
132
170
 
133
171
  def pull_objects( # pylint: disable=too-many-arguments,too-many-locals
@@ -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
@@ -32,13 +32,23 @@ from flwr.common import Context, Message
32
32
  from flwr.common.config import get_flwr_dir
33
33
  from flwr.common.constant import ErrorCode
34
34
  from flwr.common.grpc import create_channel, on_channel_state_change
35
+ from flwr.common.inflatable import (
36
+ get_all_nested_objects,
37
+ get_object_tree,
38
+ no_object_id_recompute,
39
+ )
40
+ from flwr.common.inflatable_protobuf_utils import (
41
+ make_confirm_message_received_fn_protobuf,
42
+ make_pull_object_fn_protobuf,
43
+ make_push_object_fn_protobuf,
44
+ )
45
+ from flwr.common.inflatable_utils import pull_and_inflate_object_from_tree, push_objects
35
46
  from flwr.common.logger import log
36
47
  from flwr.common.retry_invoker import _make_simple_grpc_retry_invoker, _wrap_stub
37
48
  from flwr.common.serde import (
38
49
  context_from_proto,
39
50
  context_to_proto,
40
51
  fab_from_proto,
41
- message_from_proto,
42
52
  message_to_proto,
43
53
  run_from_proto,
44
54
  )
@@ -61,6 +71,7 @@ from flwr.proto.clientappio_pb2 import (
61
71
  RequestTokenResponse,
62
72
  )
63
73
  from flwr.proto.clientappio_pb2_grpc import ClientAppIoStub
74
+ from flwr.proto.node_pb2 import Node # pylint: disable=E0611
64
75
  from flwr.supercore.utils import mask_string
65
76
 
66
77
 
@@ -204,12 +215,6 @@ def pull_clientappinputs(
204
215
  masked_token = mask_string(token)
205
216
  log(INFO, "[flwr-clientapp] Pull `ClientAppInputs` for token %s", masked_token)
206
217
  try:
207
- # Pull Message
208
- pull_msg_res: PullAppMessagesResponse = stub.PullMessage(
209
- PullAppMessagesRequest(token=token)
210
- )
211
- message = message_from_proto(pull_msg_res.messages_list[0])
212
-
213
218
  # Pull Context, Run and (optional) FAB
214
219
  res: PullAppInputsResponse = stub.PullClientAppInputs(
215
220
  PullAppInputsRequest(token=token)
@@ -217,6 +222,26 @@ def pull_clientappinputs(
217
222
  context = context_from_proto(res.context)
218
223
  run = run_from_proto(res.run)
219
224
  fab = fab_from_proto(res.fab) if res.fab else None
225
+
226
+ # Pull and inflate the message
227
+ pull_msg_res: PullAppMessagesResponse = stub.PullMessage(
228
+ PullAppMessagesRequest(token=token)
229
+ )
230
+ run_id = context.run_id
231
+ node = Node(node_id=context.node_id)
232
+ object_tree = pull_msg_res.message_object_trees[0]
233
+ message = pull_and_inflate_object_from_tree(
234
+ object_tree,
235
+ make_pull_object_fn_protobuf(stub.PullObject, node, run_id),
236
+ make_confirm_message_received_fn_protobuf(
237
+ stub.ConfirmMessageReceived, node, run_id
238
+ ),
239
+ return_type=Message,
240
+ )
241
+
242
+ # Set the message ID
243
+ # The deflated message doesn't contain the message_id (its own object_id)
244
+ message.metadata.__dict__["_message_id"] = object_tree.object_id
220
245
  return message, context, run, fab
221
246
  except grpc.RpcError as e:
222
247
  log(ERROR, "[PullClientAppInputs] gRPC error occurred: %s", str(e))
@@ -236,10 +261,38 @@ def push_clientappoutputs(
236
261
 
237
262
  try:
238
263
 
239
- # Push Message
240
- _ = stub.PushMessage(
241
- PushAppMessagesRequest(token=token, messages_list=[proto_message])
242
- )
264
+ with no_object_id_recompute():
265
+ # Get object tree and all objects to push
266
+ object_tree = get_object_tree(message)
267
+
268
+ # Push Message
269
+ # This is temporary. The message should not contain its content
270
+ push_msg_res = stub.PushMessage(
271
+ PushAppMessagesRequest(
272
+ token=token,
273
+ messages_list=[proto_message],
274
+ message_object_trees=[object_tree],
275
+ )
276
+ )
277
+ del proto_message
278
+
279
+ # Retrieve the object IDs to push
280
+ object_ids_to_push = set(
281
+ push_msg_res.objects_to_push[object_tree.object_id].object_ids
282
+ )
283
+
284
+ # Push all objects
285
+ all_objects = get_all_nested_objects(message)
286
+ del message
287
+ push_objects(
288
+ all_objects,
289
+ make_push_object_fn_protobuf(
290
+ stub.PushObject,
291
+ Node(node_id=context.node_id),
292
+ run_id=context.run_id,
293
+ ),
294
+ object_ids_to_push=object_ids_to_push,
295
+ )
243
296
 
244
297
  # Push Context
245
298
  res: PushAppOutputsResponse = stub.PushClientAppOutputs(
@@ -63,6 +63,7 @@ from flwr.proto.message_pb2 import (
63
63
  # pylint: disable=E0601
64
64
  from flwr.supercore.ffs import FfsFactory
65
65
  from flwr.supercore.object_store import NoObjectInStoreError, ObjectStoreFactory
66
+ from flwr.supercore.object_store.utils import store_mapping_and_register_objects
66
67
  from flwr.supernode.nodestate import NodeStateFactory
67
68
 
68
69
 
@@ -178,8 +179,9 @@ class ClientAppIoServicer(clientappio_pb2_grpc.ClientAppIoServicer):
178
179
  self, request: PullAppMessagesRequest, context: grpc.ServicerContext
179
180
  ) -> PullAppMessagesResponse:
180
181
  """Pull one Message."""
181
- # Initialize state and ffs connection
182
+ # Initialize state and store connection
182
183
  state = self.state_factory.state()
184
+ store = self.objectstore_factory.store()
183
185
 
184
186
  # Validate the token
185
187
  run_id = state.get_run_id_by_token(request.token)
@@ -193,14 +195,21 @@ class ClientAppIoServicer(clientappio_pb2_grpc.ClientAppIoServicer):
193
195
  # Retrieve message for this run
194
196
  message = state.get_messages(run_ids=[run_id], is_reply=False)[0]
195
197
 
196
- return PullAppMessagesResponse(messages_list=[message_to_proto(message)])
198
+ # Retrieve the object tree for the message
199
+ object_tree = store.get_object_tree(message.metadata.message_id)
200
+
201
+ return PullAppMessagesResponse(
202
+ messages_list=[message_to_proto(message)],
203
+ message_object_trees=[object_tree],
204
+ )
197
205
 
198
206
  def PushMessage(
199
207
  self, request: PushAppMessagesRequest, context: grpc.ServicerContext
200
208
  ) -> PushAppMessagesResponse:
201
209
  """Push one Message."""
202
- # Initialize state connection
210
+ # Initialize state and store connection
203
211
  state = self.state_factory.state()
212
+ store = self.objectstore_factory.store()
204
213
 
205
214
  # Validate the token
206
215
  run_id = state.get_run_id_by_token(request.token)
@@ -214,7 +223,10 @@ class ClientAppIoServicer(clientappio_pb2_grpc.ClientAppIoServicer):
214
223
  # Save the message to the state
215
224
  state.store_message(message_from_proto(request.messages_list[0]))
216
225
 
217
- return PushAppMessagesResponse()
226
+ # Store Message object to descendants mapping and preregister objects
227
+ objects_to_push = store_mapping_and_register_objects(store, request=request)
228
+
229
+ return PushAppMessagesResponse(objects_to_push=objects_to_push)
218
230
 
219
231
  def PushObject(
220
232
  self, request: PushObjectRequest, context: grpc.ServicerContext