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