flwr-nightly 1.20.0.dev20250720__tar.gz → 1.20.0.dev20250721__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.dev20250720 → flwr_nightly-1.20.0.dev20250721}/PKG-INFO +1 -1
  2. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/client/grpc_adapter_client/connection.py +5 -4
  3. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/client/grpc_rere_client/connection.py +34 -92
  4. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/client/rest_client/connection.py +39 -120
  5. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/supernode/runtime/run_clientapp.py +2 -1
  6. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/supernode/start_client_internal.py +62 -23
  7. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/pyproject.toml +1 -1
  8. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/README.md +0 -0
  9. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/__init__.py +0 -0
  10. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/app/__init__.py +0 -0
  11. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/app/error.py +0 -0
  12. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/app/metadata.py +0 -0
  13. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/__init__.py +0 -0
  14. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/app.py +0 -0
  15. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/auth_plugin/__init__.py +0 -0
  16. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/auth_plugin/oidc_cli_plugin.py +0 -0
  17. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/build.py +0 -0
  18. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/cli_user_auth_interceptor.py +0 -0
  19. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/config_utils.py +0 -0
  20. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/constant.py +0 -0
  21. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/example.py +0 -0
  22. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/install.py +0 -0
  23. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/log.py +0 -0
  24. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/login/__init__.py +0 -0
  25. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/login/login.py +0 -0
  26. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/ls.py +0 -0
  27. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/__init__.py +0 -0
  28. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/new.py +0 -0
  29. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/__init__.py +0 -0
  30. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/.gitignore.tpl +0 -0
  31. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/LICENSE.tpl +0 -0
  32. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/README.baseline.md.tpl +0 -0
  33. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/README.flowertune.md.tpl +0 -0
  34. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/README.md.tpl +0 -0
  35. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/__init__.py +0 -0
  36. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/code/__init__.baseline.py.tpl +0 -0
  37. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
  38. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
  39. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/code/client.baseline.py.tpl +0 -0
  40. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/code/client.huggingface.py.tpl +0 -0
  41. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/code/client.jax.py.tpl +0 -0
  42. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/code/client.mlx.py.tpl +0 -0
  43. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/code/client.numpy.py.tpl +0 -0
  44. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -0
  45. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl +0 -0
  46. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -0
  47. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/code/dataset.baseline.py.tpl +0 -0
  48. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/code/flwr_tune/__init__.py +0 -0
  49. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/code/flwr_tune/client_app.py.tpl +0 -0
  50. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/code/flwr_tune/dataset.py.tpl +0 -0
  51. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/code/flwr_tune/models.py.tpl +0 -0
  52. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/code/flwr_tune/server_app.py.tpl +0 -0
  53. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/code/flwr_tune/strategy.py.tpl +0 -0
  54. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/code/model.baseline.py.tpl +0 -0
  55. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/code/server.baseline.py.tpl +0 -0
  56. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/code/server.huggingface.py.tpl +0 -0
  57. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/code/server.jax.py.tpl +0 -0
  58. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/code/server.mlx.py.tpl +0 -0
  59. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -0
  60. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -0
  61. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/code/server.sklearn.py.tpl +0 -0
  62. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -0
  63. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/code/strategy.baseline.py.tpl +0 -0
  64. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/code/task.huggingface.py.tpl +0 -0
  65. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/code/task.jax.py.tpl +0 -0
  66. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/code/task.mlx.py.tpl +0 -0
  67. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/code/task.numpy.py.tpl +0 -0
  68. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +0 -0
  69. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/code/task.sklearn.py.tpl +0 -0
  70. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/code/task.tensorflow.py.tpl +0 -0
  71. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/code/utils.baseline.py.tpl +0 -0
  72. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/pyproject.baseline.toml.tpl +0 -0
  73. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +0 -0
  74. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl +0 -0
  75. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/pyproject.jax.toml.tpl +0 -0
  76. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +0 -0
  77. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +0 -0
  78. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +0 -0
  79. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +0 -0
  80. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +0 -0
  81. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/run/__init__.py +0 -0
  82. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/run/run.py +0 -0
  83. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/stop.py +0 -0
  84. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/utils.py +0 -0
  85. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/client/__init__.py +0 -0
  86. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/client/client.py +0 -0
  87. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/client/client_app.py +0 -0
  88. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/client/clientapp/__init__.py +0 -0
  89. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/client/clientapp/utils.py +0 -0
  90. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/client/dpfedavg_numpy_client.py +0 -0
  91. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/client/grpc_adapter_client/__init__.py +0 -0
  92. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/client/grpc_rere_client/__init__.py +0 -0
  93. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/client/grpc_rere_client/client_interceptor.py +0 -0
  94. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/client/grpc_rere_client/grpc_adapter.py +0 -0
  95. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/client/message_handler/__init__.py +0 -0
  96. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/client/message_handler/message_handler.py +0 -0
  97. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/client/mod/__init__.py +0 -0
  98. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/client/mod/centraldp_mods.py +0 -0
  99. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/client/mod/comms_mods.py +0 -0
  100. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/client/mod/localdp_mod.py +0 -0
  101. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
  102. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
  103. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
  104. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/client/mod/utils.py +0 -0
  105. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/client/numpy_client.py +0 -0
  106. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/client/rest_client/__init__.py +0 -0
  107. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/client/run_info_store.py +0 -0
  108. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/client/typing.py +0 -0
  109. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/clientapp/__init__.py +0 -0
  110. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/__init__.py +0 -0
  111. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/address.py +0 -0
  112. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/args.py +0 -0
  113. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/auth_plugin/__init__.py +0 -0
  114. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/auth_plugin/auth_plugin.py +0 -0
  115. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/config.py +0 -0
  116. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/constant.py +0 -0
  117. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/context.py +0 -0
  118. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/date.py +0 -0
  119. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/differential_privacy.py +0 -0
  120. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/differential_privacy_constants.py +0 -0
  121. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/dp.py +0 -0
  122. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/event_log_plugin/__init__.py +0 -0
  123. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/event_log_plugin/event_log_plugin.py +0 -0
  124. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/exit/__init__.py +0 -0
  125. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/exit/exit.py +0 -0
  126. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/exit/exit_code.py +0 -0
  127. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/exit_handlers.py +0 -0
  128. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/grpc.py +0 -0
  129. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/heartbeat.py +0 -0
  130. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/inflatable.py +0 -0
  131. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/inflatable_protobuf_utils.py +0 -0
  132. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/inflatable_utils.py +0 -0
  133. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/logger.py +0 -0
  134. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/message.py +0 -0
  135. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/object_ref.py +0 -0
  136. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/parameter.py +0 -0
  137. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/pyproject.py +0 -0
  138. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/record/__init__.py +0 -0
  139. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/record/array.py +0 -0
  140. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/record/arraychunk.py +0 -0
  141. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/record/arrayrecord.py +0 -0
  142. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/record/configrecord.py +0 -0
  143. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/record/conversion_utils.py +0 -0
  144. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/record/metricrecord.py +0 -0
  145. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/record/recorddict.py +0 -0
  146. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/record/typeddict.py +0 -0
  147. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/recorddict_compat.py +0 -0
  148. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/retry_invoker.py +0 -0
  149. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/secure_aggregation/__init__.py +0 -0
  150. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
  151. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
  152. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -0
  153. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
  154. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/secure_aggregation/quantization.py +0 -0
  155. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
  156. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
  157. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/serde.py +0 -0
  158. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/serde_utils.py +0 -0
  159. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/telemetry.py +0 -0
  160. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/typing.py +0 -0
  161. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/version.py +0 -0
  162. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/compat/__init__.py +0 -0
  163. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/compat/client/__init__.py +0 -0
  164. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/compat/client/app.py +0 -0
  165. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/compat/client/grpc_client/__init__.py +0 -0
  166. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/compat/client/grpc_client/connection.py +0 -0
  167. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/compat/common/__init__.py +0 -0
  168. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/compat/server/__init__.py +0 -0
  169. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/compat/server/app.py +0 -0
  170. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/compat/simulation/__init__.py +0 -0
  171. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/__init__.py +0 -0
  172. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/appio_pb2.py +0 -0
  173. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/appio_pb2.pyi +0 -0
  174. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/appio_pb2_grpc.py +0 -0
  175. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/appio_pb2_grpc.pyi +0 -0
  176. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/clientappio_pb2.py +0 -0
  177. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/clientappio_pb2.pyi +0 -0
  178. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/clientappio_pb2_grpc.py +0 -0
  179. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/clientappio_pb2_grpc.pyi +0 -0
  180. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/error_pb2.py +0 -0
  181. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/error_pb2.pyi +0 -0
  182. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/error_pb2_grpc.py +0 -0
  183. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/error_pb2_grpc.pyi +0 -0
  184. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/exec_pb2.py +0 -0
  185. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/exec_pb2.pyi +0 -0
  186. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/exec_pb2_grpc.py +0 -0
  187. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/exec_pb2_grpc.pyi +0 -0
  188. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/fab_pb2.py +0 -0
  189. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/fab_pb2.pyi +0 -0
  190. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/fab_pb2_grpc.py +0 -0
  191. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/fab_pb2_grpc.pyi +0 -0
  192. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/fleet_pb2.py +0 -0
  193. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/fleet_pb2.pyi +0 -0
  194. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/fleet_pb2_grpc.py +0 -0
  195. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
  196. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/grpcadapter_pb2.py +0 -0
  197. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/grpcadapter_pb2.pyi +0 -0
  198. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/grpcadapter_pb2_grpc.py +0 -0
  199. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/grpcadapter_pb2_grpc.pyi +0 -0
  200. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/heartbeat_pb2.py +0 -0
  201. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/heartbeat_pb2.pyi +0 -0
  202. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/heartbeat_pb2_grpc.py +0 -0
  203. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/heartbeat_pb2_grpc.pyi +0 -0
  204. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/log_pb2.py +0 -0
  205. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/log_pb2.pyi +0 -0
  206. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/log_pb2_grpc.py +0 -0
  207. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/log_pb2_grpc.pyi +0 -0
  208. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/message_pb2.py +0 -0
  209. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/message_pb2.pyi +0 -0
  210. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/message_pb2_grpc.py +0 -0
  211. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/message_pb2_grpc.pyi +0 -0
  212. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/node_pb2.py +0 -0
  213. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/node_pb2.pyi +0 -0
  214. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/node_pb2_grpc.py +0 -0
  215. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/node_pb2_grpc.pyi +0 -0
  216. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/recorddict_pb2.py +0 -0
  217. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/recorddict_pb2.pyi +0 -0
  218. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/recorddict_pb2_grpc.py +0 -0
  219. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/recorddict_pb2_grpc.pyi +0 -0
  220. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/run_pb2.py +0 -0
  221. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/run_pb2.pyi +0 -0
  222. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/run_pb2_grpc.py +0 -0
  223. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/run_pb2_grpc.pyi +0 -0
  224. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/serverappio_pb2.py +0 -0
  225. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/serverappio_pb2.pyi +0 -0
  226. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/serverappio_pb2_grpc.py +0 -0
  227. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/serverappio_pb2_grpc.pyi +0 -0
  228. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/simulationio_pb2.py +0 -0
  229. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/simulationio_pb2.pyi +0 -0
  230. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/simulationio_pb2_grpc.py +0 -0
  231. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/simulationio_pb2_grpc.pyi +0 -0
  232. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/transport_pb2.py +0 -0
  233. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/transport_pb2.pyi +0 -0
  234. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/transport_pb2_grpc.py +0 -0
  235. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
  236. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/py.typed +0 -0
  237. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/__init__.py +0 -0
  238. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/app.py +0 -0
  239. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/client_manager.py +0 -0
  240. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/client_proxy.py +0 -0
  241. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/compat/__init__.py +0 -0
  242. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/compat/app.py +0 -0
  243. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/compat/app_utils.py +0 -0
  244. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/compat/grid_client_proxy.py +0 -0
  245. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/compat/legacy_context.py +0 -0
  246. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/criterion.py +0 -0
  247. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/fleet_event_log_interceptor.py +0 -0
  248. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/grid/__init__.py +0 -0
  249. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/grid/grid.py +0 -0
  250. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/grid/grpc_grid.py +0 -0
  251. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/grid/inmemory_grid.py +0 -0
  252. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/history.py +0 -0
  253. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/run_serverapp.py +0 -0
  254. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/server.py +0 -0
  255. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/server_app.py +0 -0
  256. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/server_config.py +0 -0
  257. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/serverapp/__init__.py +0 -0
  258. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/serverapp/app.py +0 -0
  259. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/serverapp_components.py +0 -0
  260. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/strategy/__init__.py +0 -0
  261. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/strategy/aggregate.py +0 -0
  262. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/strategy/bulyan.py +0 -0
  263. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
  264. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
  265. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
  266. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
  267. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
  268. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/strategy/fedadagrad.py +0 -0
  269. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/strategy/fedadam.py +0 -0
  270. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/strategy/fedavg.py +0 -0
  271. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/strategy/fedavg_android.py +0 -0
  272. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/strategy/fedavgm.py +0 -0
  273. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/strategy/fedmedian.py +0 -0
  274. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/strategy/fedopt.py +0 -0
  275. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/strategy/fedprox.py +0 -0
  276. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
  277. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
  278. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
  279. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
  280. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/strategy/fedyogi.py +0 -0
  281. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/strategy/krum.py +0 -0
  282. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/strategy/qfedavg.py +0 -0
  283. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/strategy/strategy.py +0 -0
  284. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/superlink/__init__.py +0 -0
  285. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/superlink/fleet/__init__.py +0 -0
  286. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/superlink/fleet/grpc_adapter/__init__.py +0 -0
  287. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +0 -0
  288. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
  289. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
  290. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
  291. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
  292. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +0 -0
  293. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
  294. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +0 -0
  295. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +0 -0
  296. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
  297. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/superlink/fleet/message_handler/message_handler.py +0 -0
  298. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
  299. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +0 -0
  300. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
  301. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
  302. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
  303. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +0 -0
  304. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/superlink/fleet/vce/vce_api.py +0 -0
  305. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/superlink/linkstate/__init__.py +0 -0
  306. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/superlink/linkstate/in_memory_linkstate.py +0 -0
  307. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/superlink/linkstate/linkstate.py +0 -0
  308. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/superlink/linkstate/linkstate_factory.py +0 -0
  309. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/superlink/linkstate/sqlite_linkstate.py +0 -0
  310. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/superlink/linkstate/utils.py +0 -0
  311. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/superlink/serverappio/__init__.py +0 -0
  312. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/superlink/serverappio/serverappio_grpc.py +0 -0
  313. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/superlink/serverappio/serverappio_servicer.py +0 -0
  314. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/superlink/simulation/__init__.py +0 -0
  315. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/superlink/simulation/simulationio_grpc.py +0 -0
  316. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/superlink/simulation/simulationio_servicer.py +0 -0
  317. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/superlink/utils.py +0 -0
  318. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/typing.py +0 -0
  319. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/utils/__init__.py +0 -0
  320. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/utils/tensorboard.py +0 -0
  321. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/utils/validator.py +0 -0
  322. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/workflow/__init__.py +0 -0
  323. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/workflow/constant.py +0 -0
  324. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/workflow/default_workflows.py +0 -0
  325. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
  326. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
  327. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +0 -0
  328. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/serverapp/__init__.py +0 -0
  329. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/simulation/__init__.py +0 -0
  330. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/simulation/app.py +0 -0
  331. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/simulation/legacy_app.py +0 -0
  332. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/simulation/ray_transport/__init__.py +0 -0
  333. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
  334. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
  335. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/simulation/ray_transport/utils.py +0 -0
  336. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/simulation/run_simulation.py +0 -0
  337. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/simulation/simulationio_connection.py +0 -0
  338. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/supercore/__init__.py +0 -0
  339. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/supercore/ffs/__init__.py +0 -0
  340. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/supercore/ffs/disk_ffs.py +0 -0
  341. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/supercore/ffs/ffs.py +0 -0
  342. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/supercore/ffs/ffs_factory.py +0 -0
  343. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/supercore/grpc_health/__init__.py +0 -0
  344. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/supercore/grpc_health/simple_health_servicer.py +0 -0
  345. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/supercore/license_plugin/__init__.py +0 -0
  346. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/supercore/license_plugin/license_plugin.py +0 -0
  347. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/supercore/object_store/__init__.py +0 -0
  348. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/supercore/object_store/in_memory_object_store.py +0 -0
  349. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/supercore/object_store/object_store.py +0 -0
  350. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/supercore/object_store/object_store_factory.py +0 -0
  351. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/supercore/object_store/utils.py +0 -0
  352. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/supercore/utils.py +0 -0
  353. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/superexec/__init__.py +0 -0
  354. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/superexec/app.py +0 -0
  355. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/superexec/deployment.py +0 -0
  356. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/superexec/exec_event_log_interceptor.py +0 -0
  357. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/superexec/exec_grpc.py +0 -0
  358. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/superexec/exec_license_interceptor.py +0 -0
  359. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/superexec/exec_servicer.py +0 -0
  360. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/superexec/exec_user_auth_interceptor.py +0 -0
  361. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/superexec/executor.py +0 -0
  362. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/superexec/simulation.py +0 -0
  363. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/superlink/__init__.py +0 -0
  364. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/supernode/__init__.py +0 -0
  365. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/supernode/cli/__init__.py +0 -0
  366. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/supernode/cli/flower_supernode.py +0 -0
  367. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/supernode/cli/flwr_clientapp.py +0 -0
  368. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/supernode/nodestate/__init__.py +0 -0
  369. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/supernode/nodestate/in_memory_nodestate.py +0 -0
  370. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/supernode/nodestate/nodestate.py +0 -0
  371. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/supernode/nodestate/nodestate_factory.py +0 -0
  372. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/supernode/runtime/__init__.py +0 -0
  373. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/supernode/servicer/__init__.py +0 -0
  374. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/supernode/servicer/clientappio/__init__.py +0 -0
  375. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250721}/py/flwr/supernode/servicer/clientappio/clientappio_servicer.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: flwr-nightly
3
- Version: 1.20.0.dev20250720
3
+ Version: 1.20.0.dev20250721
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
@@ -29,6 +29,7 @@ from flwr.common.logger import log
29
29
  from flwr.common.message import Message
30
30
  from flwr.common.retry_invoker import RetryInvoker
31
31
  from flwr.common.typing import Fab, Run
32
+ from flwr.proto.message_pb2 import ObjectTree # pylint: disable=E0611
32
33
 
33
34
 
34
35
  @contextmanager
@@ -43,8 +44,8 @@ def grpc_adapter( # pylint: disable=R0913,too-many-positional-arguments
43
44
  ] = None,
44
45
  ) -> Iterator[
45
46
  tuple[
46
- Callable[[], Optional[Message]],
47
- Callable[[Message], None],
47
+ Callable[[], Optional[tuple[Message, ObjectTree]]],
48
+ Callable[[Message, ObjectTree], set[str]],
48
49
  Callable[[], Optional[int]],
49
50
  Callable[[], None],
50
51
  Callable[[int], Run],
@@ -80,8 +81,8 @@ def grpc_adapter( # pylint: disable=R0913,too-many-positional-arguments
80
81
 
81
82
  Returns
82
83
  -------
83
- receive : Callable
84
- send : Callable
84
+ receive : Callable[[], Optional[tuple[Message, ObjectTree]]]
85
+ send : Callable[[Message, ObjectTree], set[str]]
85
86
  create_node : Optional[Callable]
86
87
  delete_node : Optional[Callable]
87
88
  get_run : Optional[Callable]
@@ -17,7 +17,7 @@
17
17
 
18
18
  from collections.abc import Iterator, Sequence
19
19
  from contextlib import contextmanager
20
- from logging import DEBUG, ERROR
20
+ from logging import ERROR
21
21
  from pathlib import Path
22
22
  from typing import Callable, Optional, Union, cast
23
23
 
@@ -28,29 +28,18 @@ from flwr.common import GRPC_MAX_MESSAGE_LENGTH
28
28
  from flwr.common.constant import HEARTBEAT_CALL_TIMEOUT, HEARTBEAT_DEFAULT_INTERVAL
29
29
  from flwr.common.grpc import create_channel, on_channel_state_change
30
30
  from flwr.common.heartbeat import HeartbeatSender
31
- from flwr.common.inflatable import (
32
- get_all_nested_objects,
33
- get_object_tree,
34
- iterate_object_tree,
35
- no_object_id_recompute,
36
- )
37
31
  from flwr.common.inflatable_protobuf_utils import (
38
32
  make_confirm_message_received_fn_protobuf,
39
33
  make_pull_object_fn_protobuf,
40
34
  make_push_object_fn_protobuf,
41
35
  )
42
- from flwr.common.inflatable_utils import (
43
- inflate_object_from_contents,
44
- pull_objects,
45
- push_objects,
46
- )
47
36
  from flwr.common.logger import log
48
37
  from flwr.common.message import Message, remove_content_from_message
49
38
  from flwr.common.retry_invoker import RetryInvoker, _wrap_stub
50
39
  from flwr.common.secure_aggregation.crypto.symmetric_encryption import (
51
40
  generate_key_pairs,
52
41
  )
53
- from flwr.common.serde import message_to_proto, run_from_proto
42
+ from flwr.common.serde import message_from_proto, message_to_proto, run_from_proto
54
43
  from flwr.common.typing import Fab, Run, RunNotRunningException
55
44
  from flwr.proto.fab_pb2 import GetFabRequest, GetFabResponse # pylint: disable=E0611
56
45
  from flwr.proto.fleet_pb2 import ( # pylint: disable=E0611
@@ -66,9 +55,7 @@ from flwr.proto.heartbeat_pb2 import ( # pylint: disable=E0611
66
55
  SendNodeHeartbeatRequest,
67
56
  SendNodeHeartbeatResponse,
68
57
  )
69
- from flwr.proto.message_pb2 import ( # pylint: disable=E0611
70
- ConfirmMessageReceivedRequest,
71
- )
58
+ from flwr.proto.message_pb2 import ObjectTree # pylint: disable=E0611
72
59
  from flwr.proto.node_pb2 import Node # pylint: disable=E0611
73
60
  from flwr.proto.run_pb2 import GetRunRequest, GetRunResponse # pylint: disable=E0611
74
61
 
@@ -89,8 +76,8 @@ def grpc_request_response( # pylint: disable=R0913,R0914,R0915,R0917
89
76
  adapter_cls: Optional[Union[type[FleetStub], type[GrpcAdapter]]] = None,
90
77
  ) -> Iterator[
91
78
  tuple[
92
- Callable[[], Optional[Message]],
93
- Callable[[Message], None],
79
+ Callable[[], Optional[tuple[Message, ObjectTree]]],
80
+ Callable[[Message, ObjectTree], set[str]],
94
81
  Callable[[], Optional[int]],
95
82
  Callable[[], None],
96
83
  Callable[[int], Run],
@@ -253,98 +240,53 @@ def grpc_request_response( # pylint: disable=R0913,R0914,R0915,R0917
253
240
  # Cleanup
254
241
  node = None
255
242
 
256
- def receive() -> Optional[Message]:
257
- """Receive next message from server."""
243
+ def receive() -> Optional[tuple[Message, ObjectTree]]:
244
+ """Pull a message with its ObjectTree from SuperLink."""
258
245
  # Get Node
259
246
  if node is None:
260
247
  log(ERROR, "Node instance missing")
261
248
  return None
262
249
 
263
- # Request instructions (message) from server
250
+ # Try to pull a message with its object tree from SuperLink
264
251
  request = PullMessagesRequest(node=node)
265
252
  response: PullMessagesResponse = stub.PullMessages(request=request)
266
253
 
267
- # Get the current Messages
268
- message_proto = (
269
- None if len(response.messages_list) == 0 else response.messages_list[0]
270
- )
254
+ # If no messages are available, return None
255
+ if len(response.messages_list) == 0:
256
+ return None
271
257
 
272
- # Discard the current message if not valid
273
- if message_proto is not None and not (
274
- message_proto.metadata.dst_node_id == node.node_id
275
- ):
276
- message_proto = None
258
+ # Get the current Message and its object tree
259
+ message_proto = response.messages_list[0]
260
+ object_tree = response.message_object_trees[0]
277
261
 
278
262
  # Construct the Message
279
- in_message: Optional[Message] = None
280
-
281
- if message_proto:
282
- msg_id = message_proto.metadata.message_id
283
- run_id = message_proto.metadata.run_id
284
- object_tree = response.message_object_trees[0]
285
- all_object_contents = pull_objects(
286
- [tree.object_id for tree in iterate_object_tree(object_tree)],
287
- pull_object_fn=make_pull_object_fn_protobuf(
288
- pull_object_protobuf=stub.PullObject,
289
- node=node,
290
- run_id=run_id,
291
- ),
292
- )
293
-
294
- # Confirm that the message has been received
295
- stub.ConfirmMessageReceived(
296
- ConfirmMessageReceivedRequest(
297
- node=node, run_id=run_id, message_object_id=msg_id
298
- )
299
- )
263
+ in_message = message_from_proto(message_proto)
300
264
 
301
- in_message = cast(
302
- Message, inflate_object_from_contents(msg_id, all_object_contents)
303
- )
304
- # The deflated message doesn't contain the message_id (its own object_id)
305
- # Inject
306
- in_message.metadata.__dict__["_message_id"] = msg_id
307
-
308
- # Return the message if available
309
- return in_message
265
+ # Return the Message and its object tree
266
+ return in_message, object_tree
310
267
 
311
- def send(message: Message) -> None:
312
- """Send message reply to server."""
268
+ def send(message: Message, object_tree: ObjectTree) -> set[str]:
269
+ """Send the message with its ObjectTree to SuperLink."""
313
270
  # Get Node
314
271
  if node is None:
315
272
  log(ERROR, "Node instance missing")
316
- return
273
+ return set()
317
274
 
318
- with no_object_id_recompute():
319
- # Get all nested objects
320
- all_objects = get_all_nested_objects(message)
321
- object_tree = get_object_tree(message)
275
+ # Remove the content from the message if it has
276
+ if message.has_content():
277
+ message = remove_content_from_message(message)
322
278
 
323
- # Serialize Message
324
- message_proto = message_to_proto(
325
- message=remove_content_from_message(message)
326
- )
327
- request = PushMessagesRequest(
328
- node=node,
329
- messages_list=[message_proto],
330
- message_object_trees=[object_tree],
331
- )
332
- response: PushMessagesResponse = stub.PushMessages(request=request)
333
-
334
- if response.objects_to_push:
335
- objs_to_push = set(
336
- response.objects_to_push[message.object_id].object_ids
337
- )
338
- push_objects(
339
- all_objects,
340
- push_object_fn=make_push_object_fn_protobuf(
341
- push_object_protobuf=stub.PushObject,
342
- node=node,
343
- run_id=message.metadata.run_id,
344
- ),
345
- object_ids_to_push=objs_to_push,
346
- )
347
- log(DEBUG, "Pushed %s objects to servicer.", len(objs_to_push))
279
+ # Send the message with its ObjectTree to SuperLink
280
+ request = PushMessagesRequest(
281
+ node=node,
282
+ messages_list=[message_to_proto(message)],
283
+ message_object_trees=[object_tree],
284
+ )
285
+ response: PushMessagesResponse = stub.PushMessages(request=request)
286
+
287
+ # Get and return the object IDs to push
288
+ object_ids_to_push = response.objects_to_push[object_tree.object_id]
289
+ return set(object_ids_to_push.object_ids)
348
290
 
349
291
  def get_run(run_id: int) -> Run:
350
292
  # Call FleetAPI
@@ -17,8 +17,8 @@
17
17
 
18
18
  from collections.abc import Iterator
19
19
  from contextlib import contextmanager
20
- from logging import DEBUG, ERROR, INFO, WARN
21
- from typing import Callable, Optional, TypeVar, Union, cast
20
+ from logging import ERROR, WARN
21
+ from typing import Callable, Optional, TypeVar, Union
22
22
 
23
23
  from cryptography.hazmat.primitives.asymmetric import ec
24
24
  from google.protobuf.message import Message as GrpcMessage
@@ -28,26 +28,15 @@ from flwr.common import GRPC_MAX_MESSAGE_LENGTH
28
28
  from flwr.common.constant import HEARTBEAT_DEFAULT_INTERVAL
29
29
  from flwr.common.exit import ExitCode, flwr_exit
30
30
  from flwr.common.heartbeat import HeartbeatSender
31
- from flwr.common.inflatable import (
32
- get_all_nested_objects,
33
- get_object_tree,
34
- iterate_object_tree,
35
- no_object_id_recompute,
36
- )
37
31
  from flwr.common.inflatable_protobuf_utils import (
38
32
  make_confirm_message_received_fn_protobuf,
39
33
  make_pull_object_fn_protobuf,
40
34
  make_push_object_fn_protobuf,
41
35
  )
42
- from flwr.common.inflatable_utils import (
43
- inflate_object_from_contents,
44
- pull_objects,
45
- push_objects,
46
- )
47
36
  from flwr.common.logger import log
48
37
  from flwr.common.message import Message, remove_content_from_message
49
38
  from flwr.common.retry_invoker import RetryInvoker
50
- from flwr.common.serde import message_to_proto, run_from_proto
39
+ from flwr.common.serde import message_from_proto, message_to_proto, run_from_proto
51
40
  from flwr.common.typing import Fab, Run
52
41
  from flwr.proto.fab_pb2 import GetFabRequest, GetFabResponse # pylint: disable=E0611
53
42
  from flwr.proto.fleet_pb2 import ( # pylint: disable=E0611
@@ -67,6 +56,7 @@ from flwr.proto.heartbeat_pb2 import ( # pylint: disable=E0611
67
56
  from flwr.proto.message_pb2 import ( # pylint: disable=E0611
68
57
  ConfirmMessageReceivedRequest,
69
58
  ConfirmMessageReceivedResponse,
59
+ ObjectTree,
70
60
  PullObjectRequest,
71
61
  PullObjectResponse,
72
62
  PushObjectRequest,
@@ -109,8 +99,8 @@ def http_request_response( # pylint: disable=R0913,R0914,R0915,R0917
109
99
  ] = None,
110
100
  ) -> Iterator[
111
101
  tuple[
112
- Callable[[], Optional[Message]],
113
- Callable[[Message], None],
102
+ Callable[[], Optional[tuple[Message, ObjectTree]]],
103
+ Callable[[Message, ObjectTree], set[str]],
114
104
  Callable[[], Optional[int]],
115
105
  Callable[[], None],
116
106
  Callable[[int], Run],
@@ -316,8 +306,7 @@ def http_request_response( # pylint: disable=R0913,R0914,R0915,R0917
316
306
  """Set delete_node."""
317
307
  nonlocal node
318
308
  if node is None:
319
- log(ERROR, "Node instance missing")
320
- return
309
+ raise RuntimeError("Node instance missing")
321
310
 
322
311
  # Stop the heartbeat sender
323
312
  heartbeat_sender.stop()
@@ -333,125 +322,55 @@ def http_request_response( # pylint: disable=R0913,R0914,R0915,R0917
333
322
  # Cleanup
334
323
  node = None
335
324
 
336
- def receive() -> Optional[Message]:
337
- """Receive next Message from server."""
325
+ def receive() -> Optional[tuple[Message, ObjectTree]]:
326
+ """Pull a message with its ObjectTree from SuperLink."""
338
327
  # Get Node
339
328
  if node is None:
340
- log(ERROR, "Node instance missing")
341
- return None
329
+ raise RuntimeError("Node instance missing")
342
330
 
343
- # Request instructions (message) from server
331
+ # Try to pull a message with its object tree from SuperLink
344
332
  req = PullMessagesRequest(node=node)
345
-
346
- # Send the request
347
333
  res = _request(req, PullMessagesResponse, PATH_PULL_MESSAGES)
348
334
  if res is None:
349
- return None
335
+ raise ValueError("PushMessagesResponse is None.")
350
336
 
351
- # Get the current Messages
352
- message_proto = None if len(res.messages_list) == 0 else res.messages_list[0]
337
+ # If no messages are available, return None
338
+ if len(res.messages_list) == 0:
339
+ return None
353
340
 
354
- # Discard the current message if not valid
355
- if message_proto is not None and not (
356
- message_proto.metadata.dst_node_id == node.node_id
357
- ):
358
- message_proto = None
341
+ # Get the current Message and its object tree
342
+ message_proto = res.messages_list[0]
343
+ object_tree = res.message_object_trees[0]
359
344
 
360
345
  # Construct the Message
361
- in_message: Optional[Message] = None
362
-
363
- if message_proto:
364
- log(INFO, "[Node] POST /%s: success", PATH_PULL_MESSAGES)
365
- msg_id = message_proto.metadata.message_id
366
- run_id = message_proto.metadata.run_id
367
-
368
- try:
369
- object_tree = res.message_object_trees[0]
370
- all_object_contents = pull_objects(
371
- [tree.object_id for tree in iterate_object_tree(object_tree)],
372
- pull_object_fn=make_pull_object_fn_protobuf(
373
- pull_object_protobuf=_pull_object_protobuf,
374
- node=node,
375
- run_id=run_id,
376
- ),
377
- )
378
-
379
- # Confirm that the message has been received
380
- _request(
381
- req=ConfirmMessageReceivedRequest(
382
- node=node, run_id=run_id, message_object_id=msg_id
383
- ),
384
- res_type=ConfirmMessageReceivedResponse,
385
- api_path=PATH_CONFIRM_MESSAGE_RECEIVED,
386
- )
387
- except ValueError as e:
388
- log(
389
- ERROR,
390
- "Pulling objects failed. Potential irrecoverable error: %s",
391
- str(e),
392
- )
393
- in_message = cast(
394
- Message, inflate_object_from_contents(msg_id, all_object_contents)
395
- )
396
- # The deflated message doesn't contain the message_id (its own object_id)
397
- # Inject
398
- in_message.metadata.__dict__["_message_id"] = msg_id
346
+ in_message = message_from_proto(message_proto)
399
347
 
400
- return in_message
348
+ # Return the Message and its object tree
349
+ return in_message, object_tree
401
350
 
402
- def send(message: Message) -> None:
403
- """Send Message result back to server."""
351
+ def send(message: Message, object_tree: ObjectTree) -> set[str]:
352
+ """Send the message with its ObjectTree to SuperLink."""
404
353
  # Get Node
405
354
  if node is None:
406
- log(ERROR, "Node instance missing")
407
- return
355
+ raise RuntimeError("Node instance missing")
408
356
 
409
- with no_object_id_recompute():
410
- # Get all nested objects
411
- all_objects = get_all_nested_objects(message)
412
- object_tree = get_object_tree(message)
357
+ # Remove the content from the message if it has
358
+ if message.has_content():
359
+ message = remove_content_from_message(message)
413
360
 
414
- # Serialize Message
415
- message_proto = message_to_proto(
416
- message=remove_content_from_message(message)
417
- )
418
- req = PushMessagesRequest(
419
- node=node,
420
- messages_list=[message_proto],
421
- message_object_trees=[object_tree],
422
- )
361
+ # Send the message with its ObjectTree to SuperLink
362
+ req = PushMessagesRequest(
363
+ node=node,
364
+ messages_list=[message_to_proto(message)],
365
+ message_object_trees=[object_tree],
366
+ )
367
+ res = _request(req, PushMessagesResponse, PATH_PUSH_MESSAGES)
368
+ if res is None:
369
+ raise ValueError("PushMessagesResponse is None.")
423
370
 
424
- # Send the request
425
- res = _request(req, PushMessagesResponse, PATH_PUSH_MESSAGES)
426
- if res:
427
- log(
428
- INFO,
429
- "[Node] POST /%s: success, created result %s",
430
- PATH_PUSH_MESSAGES,
431
- res.results, # pylint: disable=no-member
432
- )
433
-
434
- if res and res.objects_to_push:
435
- objs_to_push = set(res.objects_to_push[message.object_id].object_ids)
436
-
437
- try:
438
- push_objects(
439
- all_objects,
440
- push_object_fn=make_push_object_fn_protobuf(
441
- push_object_protobuf=_push_object_protobuf,
442
- node=node,
443
- run_id=message_proto.metadata.run_id,
444
- ),
445
- object_ids_to_push=objs_to_push,
446
- )
447
- log(DEBUG, "Pushed %s objects to servicer.", len(objs_to_push))
448
- except ValueError as e:
449
- log(
450
- ERROR,
451
- "Pushing objects failed. Potential irrecoverable error: %s",
452
- str(e),
453
- )
454
- log(ERROR, str(e))
371
+ # Get and return the object IDs to push
372
+ object_ids_to_push = res.objects_to_push[object_tree.object_id]
373
+ return set(object_ids_to_push.object_ids)
455
374
 
456
375
  def get_run(run_id: int) -> Run:
457
376
  # Construct the request
@@ -44,6 +44,7 @@ from flwr.common.inflatable_protobuf_utils import (
44
44
  )
45
45
  from flwr.common.inflatable_utils import pull_and_inflate_object_from_tree, push_objects
46
46
  from flwr.common.logger import log
47
+ from flwr.common.message import remove_content_from_message
47
48
  from flwr.common.retry_invoker import _make_simple_grpc_retry_invoker, _wrap_stub
48
49
  from flwr.common.serde import (
49
50
  context_from_proto,
@@ -256,7 +257,7 @@ def push_clientappoutputs(
256
257
  log(INFO, "[flwr-clientapp] Push `ClientAppOutputs` for token %s", masked_token)
257
258
  # Set message ID
258
259
  message.metadata.__dict__["_message_id"] = message.object_id
259
- proto_message = message_to_proto(message)
260
+ proto_message = message_to_proto(remove_content_from_message(message))
260
261
  proto_context = context_to_proto(context)
261
262
 
262
263
  try:
@@ -20,6 +20,7 @@ import subprocess
20
20
  import time
21
21
  from collections.abc import Iterator
22
22
  from contextlib import contextmanager
23
+ from functools import partial
23
24
  from logging import INFO, WARN
24
25
  from pathlib import Path
25
26
  from typing import Callable, Optional, Union
@@ -47,16 +48,17 @@ from flwr.common.constant import (
47
48
  from flwr.common.exit import ExitCode, flwr_exit
48
49
  from flwr.common.exit_handlers import register_exit_handlers
49
50
  from flwr.common.grpc import generic_create_grpc_server
50
- from flwr.common.inflatable import (
51
- get_all_nested_objects,
52
- get_object_tree,
53
- no_object_id_recompute,
51
+ from flwr.common.inflatable import iterate_object_tree
52
+ from flwr.common.inflatable_utils import (
53
+ pull_objects,
54
+ push_object_contents_from_iterable,
54
55
  )
55
56
  from flwr.common.logger import log
56
57
  from flwr.common.retry_invoker import RetryInvoker, RetryState, exponential
57
58
  from flwr.common.telemetry import EventType
58
59
  from flwr.common.typing import Fab, Run, RunNotRunningException, UserConfig
59
60
  from flwr.proto.clientappio_pb2_grpc import add_ClientAppIoServicer_to_server
61
+ from flwr.proto.message_pb2 import ObjectTree # pylint: disable=E0611
60
62
  from flwr.supercore.ffs import Ffs, FfsFactory
61
63
  from flwr.supercore.object_store import ObjectStore, ObjectStoreFactory
62
64
  from flwr.supernode.nodestate import NodeState, NodeStateFactory
@@ -237,7 +239,7 @@ def start_client_internal(
237
239
 
238
240
  _push_messages(
239
241
  state=state,
240
- store=store,
242
+ object_store=store,
241
243
  send=send,
242
244
  push_object=push_object,
243
245
  )
@@ -251,11 +253,11 @@ def _pull_and_store_message( # pylint: disable=too-many-positional-arguments
251
253
  ffs: Ffs,
252
254
  object_store: ObjectStore,
253
255
  node_config: UserConfig,
254
- receive: Callable[[], Optional[Message]],
256
+ receive: Callable[[], Optional[tuple[Message, ObjectTree]]],
255
257
  get_run: Callable[[int], Run],
256
258
  get_fab: Callable[[str, int], Fab],
257
- pull_object: Callable[[int, str], bytes], # pylint: disable=W0613
258
- confirm_message_received: Callable[[int, str], None], # pylint: disable=W0613
259
+ pull_object: Callable[[int, str], bytes],
260
+ confirm_message_received: Callable[[int, str], None],
259
261
  ) -> Optional[int]:
260
262
  """Pull a message from the SuperLink and store it in the state.
261
263
 
@@ -267,8 +269,9 @@ def _pull_and_store_message( # pylint: disable=too-many-positional-arguments
267
269
  message = None
268
270
  try:
269
271
  # Pull message
270
- if (message := receive()) is None:
272
+ if (recv := receive()) is None:
271
273
  return None
274
+ message, object_tree = recv
272
275
 
273
276
  # Log message reception
274
277
  log(INFO, "")
@@ -312,16 +315,22 @@ def _pull_and_store_message( # pylint: disable=too-many-positional-arguments
312
315
  )
313
316
  state.store_context(run_ctx)
314
317
 
315
- # Store the message in the state
316
- # This shall be removed after the transition to ObjectStore
318
+ # Preregister the object tree of the message
319
+ obj_ids_to_pull = object_store.preregister(run_id, object_tree)
320
+
321
+ # Store the message in the state (note this message has no content)
317
322
  state.store_message(message)
318
323
 
319
- # Store the message in ObjectStore
320
- # This is a temporary solution to store messages in ObjectStore
321
- with no_object_id_recompute():
322
- object_store.preregister(run_id, get_object_tree(message))
323
- for obj_id, obj in get_all_nested_objects(message).items():
324
- object_store.put(obj_id, obj.deflate())
324
+ # Pull and store objects of the message in the ObjectStore
325
+ obj_contents = pull_objects(
326
+ obj_ids_to_pull,
327
+ pull_object_fn=lambda obj_id: pull_object(run_id, obj_id),
328
+ )
329
+ for obj_id in list(obj_contents.keys()):
330
+ object_store.put(obj_id, obj_contents.pop(obj_id))
331
+
332
+ # Confirm that the message was received
333
+ confirm_message_received(run_id, message.metadata.message_id)
325
334
 
326
335
  except RunNotRunningException:
327
336
  if message is None:
@@ -344,9 +353,9 @@ def _pull_and_store_message( # pylint: disable=too-many-positional-arguments
344
353
 
345
354
  def _push_messages(
346
355
  state: NodeState,
347
- store: ObjectStore, # pylint: disable=W0613
348
- send: Callable[[Message], None],
349
- push_object: Callable[[int, str, bytes], None], # pylint: disable=W0613
356
+ object_store: ObjectStore,
357
+ send: Callable[[Message, ObjectTree], set[str]],
358
+ push_object: Callable[[int, str, bytes], None],
350
359
  ) -> None:
351
360
  """Push reply messages to the SuperLink."""
352
361
  # Get messages to send
@@ -370,9 +379,34 @@ def _push_messages(
370
379
  message.metadata.message_type,
371
380
  )
372
381
 
382
+ # Get the object tree for the message
383
+ object_tree = object_store.get_object_tree(message.metadata.message_id)
384
+
385
+ # Define the iterator for yielding object contents
386
+ # This will yield (object_id, content) pairs
387
+ def yield_object_contents(_obj_tree: ObjectTree) -> Iterator[tuple[str, bytes]]:
388
+ for tree in iterate_object_tree(_obj_tree):
389
+ while (content := object_store.get(tree.object_id)) is None:
390
+ # Wait for the content to be available
391
+ time.sleep(0.5)
392
+
393
+ yield tree.object_id, content
394
+
373
395
  # Send the message
374
396
  try:
375
- send(message)
397
+ # Send the reply message with its ObjectTree
398
+ send(message, object_tree)
399
+
400
+ # Push object contents from the ObjectStore
401
+ run_id = message.metadata.run_id
402
+ push_object_contents_from_iterable(
403
+ yield_object_contents(object_tree),
404
+ # Use functools.partial to bind run_id explicitly,
405
+ # avoiding late binding issues and satisfying flake8 (B023)
406
+ # Equivalent to:
407
+ # lambda object_id, content: push_object(run_id, object_id, content)
408
+ push_object_fn=partial(push_object, run_id),
409
+ )
376
410
  log(INFO, "Sent successfully")
377
411
  except RunNotRunningException:
378
412
  log(
@@ -390,6 +424,11 @@ def _push_messages(
390
424
  ]
391
425
  )
392
426
 
427
+ # Delete all its objects from the ObjectStore
428
+ # No need to delete objects of the message it replies to, as it is
429
+ # already deleted when the ClientApp calls `ConfirmMessageReceived`
430
+ object_store.delete(message.metadata.message_id)
431
+
393
432
 
394
433
  @contextmanager
395
434
  def _init_connection( # pylint: disable=too-many-positional-arguments
@@ -404,8 +443,8 @@ def _init_connection( # pylint: disable=too-many-positional-arguments
404
443
  max_wait_time: Optional[float] = None,
405
444
  ) -> Iterator[
406
445
  tuple[
407
- Callable[[], Optional[Message]],
408
- Callable[[Message], None],
446
+ Callable[[], Optional[tuple[Message, ObjectTree]]],
447
+ Callable[[Message, ObjectTree], set[str]],
409
448
  Callable[[], Optional[int]],
410
449
  Callable[[], None],
411
450
  Callable[[int], Run],
@@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api"
4
4
 
5
5
  [tool.poetry]
6
6
  name = "flwr-nightly"
7
- version = "1.20.0.dev20250720"
7
+ version = "1.20.0.dev20250721"
8
8
  description = "Flower: A Friendly Federated AI Framework"
9
9
  license = "Apache-2.0"
10
10
  authors = ["The Flower Authors <hello@flower.ai>"]