flwr-nightly 1.20.0.dev20250720__tar.gz → 1.20.0.dev20250722__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.dev20250722}/PKG-INFO +1 -1
  2. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/client/grpc_adapter_client/connection.py +5 -4
  3. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/client/grpc_rere_client/connection.py +34 -92
  4. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/client/rest_client/connection.py +39 -120
  5. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/common/constant.py +1 -1
  6. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/common/record/array.py +16 -3
  7. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/common/record/arraychunk.py +0 -3
  8. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/supercore/object_store/object_store.py +4 -2
  9. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/supernode/runtime/run_clientapp.py +2 -1
  10. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/supernode/start_client_internal.py +69 -24
  11. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/pyproject.toml +1 -1
  12. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/README.md +0 -0
  13. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/__init__.py +0 -0
  14. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/app/__init__.py +0 -0
  15. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/app/error.py +0 -0
  16. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/app/metadata.py +0 -0
  17. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/cli/__init__.py +0 -0
  18. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/cli/app.py +0 -0
  19. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/cli/auth_plugin/__init__.py +0 -0
  20. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/cli/auth_plugin/oidc_cli_plugin.py +0 -0
  21. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/cli/build.py +0 -0
  22. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/cli/cli_user_auth_interceptor.py +0 -0
  23. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/cli/config_utils.py +0 -0
  24. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/cli/constant.py +0 -0
  25. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/cli/example.py +0 -0
  26. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/cli/install.py +0 -0
  27. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/cli/log.py +0 -0
  28. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/cli/login/__init__.py +0 -0
  29. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/cli/login/login.py +0 -0
  30. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/cli/ls.py +0 -0
  31. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/cli/new/__init__.py +0 -0
  32. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/cli/new/new.py +0 -0
  33. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/cli/new/templates/__init__.py +0 -0
  34. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/cli/new/templates/app/.gitignore.tpl +0 -0
  35. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/cli/new/templates/app/LICENSE.tpl +0 -0
  36. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/cli/new/templates/app/README.baseline.md.tpl +0 -0
  37. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/cli/new/templates/app/README.flowertune.md.tpl +0 -0
  38. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/cli/new/templates/app/README.md.tpl +0 -0
  39. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/cli/new/templates/app/__init__.py +0 -0
  40. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/cli/new/templates/app/code/__init__.baseline.py.tpl +0 -0
  41. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
  42. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
  43. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/cli/new/templates/app/code/client.baseline.py.tpl +0 -0
  44. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/cli/new/templates/app/code/client.huggingface.py.tpl +0 -0
  45. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/cli/new/templates/app/code/client.jax.py.tpl +0 -0
  46. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/cli/new/templates/app/code/client.mlx.py.tpl +0 -0
  47. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/cli/new/templates/app/code/client.numpy.py.tpl +0 -0
  48. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -0
  49. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl +0 -0
  50. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -0
  51. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/cli/new/templates/app/code/dataset.baseline.py.tpl +0 -0
  52. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/cli/new/templates/app/code/flwr_tune/__init__.py +0 -0
  53. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/cli/new/templates/app/code/flwr_tune/client_app.py.tpl +0 -0
  54. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/cli/new/templates/app/code/flwr_tune/dataset.py.tpl +0 -0
  55. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/cli/new/templates/app/code/flwr_tune/models.py.tpl +0 -0
  56. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/cli/new/templates/app/code/flwr_tune/server_app.py.tpl +0 -0
  57. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/cli/new/templates/app/code/flwr_tune/strategy.py.tpl +0 -0
  58. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/cli/new/templates/app/code/model.baseline.py.tpl +0 -0
  59. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/cli/new/templates/app/code/server.baseline.py.tpl +0 -0
  60. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/cli/new/templates/app/code/server.huggingface.py.tpl +0 -0
  61. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/cli/new/templates/app/code/server.jax.py.tpl +0 -0
  62. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/cli/new/templates/app/code/server.mlx.py.tpl +0 -0
  63. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -0
  64. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -0
  65. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/cli/new/templates/app/code/server.sklearn.py.tpl +0 -0
  66. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -0
  67. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/cli/new/templates/app/code/strategy.baseline.py.tpl +0 -0
  68. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/cli/new/templates/app/code/task.huggingface.py.tpl +0 -0
  69. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/cli/new/templates/app/code/task.jax.py.tpl +0 -0
  70. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/cli/new/templates/app/code/task.mlx.py.tpl +0 -0
  71. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/cli/new/templates/app/code/task.numpy.py.tpl +0 -0
  72. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +0 -0
  73. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/cli/new/templates/app/code/task.sklearn.py.tpl +0 -0
  74. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/cli/new/templates/app/code/task.tensorflow.py.tpl +0 -0
  75. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/cli/new/templates/app/code/utils.baseline.py.tpl +0 -0
  76. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/cli/new/templates/app/pyproject.baseline.toml.tpl +0 -0
  77. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +0 -0
  78. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl +0 -0
  79. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/cli/new/templates/app/pyproject.jax.toml.tpl +0 -0
  80. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +0 -0
  81. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +0 -0
  82. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +0 -0
  83. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +0 -0
  84. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +0 -0
  85. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/cli/run/__init__.py +0 -0
  86. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/cli/run/run.py +0 -0
  87. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/cli/stop.py +0 -0
  88. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/cli/utils.py +0 -0
  89. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/client/__init__.py +0 -0
  90. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/client/client.py +0 -0
  91. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/client/client_app.py +0 -0
  92. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/client/clientapp/__init__.py +0 -0
  93. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/client/clientapp/utils.py +0 -0
  94. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/client/dpfedavg_numpy_client.py +0 -0
  95. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/client/grpc_adapter_client/__init__.py +0 -0
  96. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/client/grpc_rere_client/__init__.py +0 -0
  97. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/client/grpc_rere_client/client_interceptor.py +0 -0
  98. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/client/grpc_rere_client/grpc_adapter.py +0 -0
  99. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/client/message_handler/__init__.py +0 -0
  100. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/client/message_handler/message_handler.py +0 -0
  101. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/client/mod/__init__.py +0 -0
  102. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/client/mod/centraldp_mods.py +0 -0
  103. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/client/mod/comms_mods.py +0 -0
  104. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/client/mod/localdp_mod.py +0 -0
  105. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
  106. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
  107. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
  108. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/client/mod/utils.py +0 -0
  109. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/client/numpy_client.py +0 -0
  110. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/client/rest_client/__init__.py +0 -0
  111. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/client/run_info_store.py +0 -0
  112. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/client/typing.py +0 -0
  113. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/clientapp/__init__.py +0 -0
  114. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/common/__init__.py +0 -0
  115. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/common/address.py +0 -0
  116. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/common/args.py +0 -0
  117. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/common/auth_plugin/__init__.py +0 -0
  118. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/common/auth_plugin/auth_plugin.py +0 -0
  119. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/common/config.py +0 -0
  120. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/common/context.py +0 -0
  121. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/common/date.py +0 -0
  122. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/common/differential_privacy.py +0 -0
  123. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/common/differential_privacy_constants.py +0 -0
  124. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/common/dp.py +0 -0
  125. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/common/event_log_plugin/__init__.py +0 -0
  126. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/common/event_log_plugin/event_log_plugin.py +0 -0
  127. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/common/exit/__init__.py +0 -0
  128. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/common/exit/exit.py +0 -0
  129. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/common/exit/exit_code.py +0 -0
  130. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/common/exit_handlers.py +0 -0
  131. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/common/grpc.py +0 -0
  132. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/common/heartbeat.py +0 -0
  133. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/common/inflatable.py +0 -0
  134. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/common/inflatable_protobuf_utils.py +0 -0
  135. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/common/inflatable_utils.py +0 -0
  136. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/common/logger.py +0 -0
  137. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/common/message.py +0 -0
  138. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/common/object_ref.py +0 -0
  139. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/common/parameter.py +0 -0
  140. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/common/pyproject.py +0 -0
  141. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/common/record/__init__.py +0 -0
  142. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/common/record/arrayrecord.py +0 -0
  143. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/common/record/configrecord.py +0 -0
  144. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/common/record/conversion_utils.py +0 -0
  145. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/common/record/metricrecord.py +0 -0
  146. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/common/record/recorddict.py +0 -0
  147. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/common/record/typeddict.py +0 -0
  148. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/common/recorddict_compat.py +0 -0
  149. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/common/retry_invoker.py +0 -0
  150. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/common/secure_aggregation/__init__.py +0 -0
  151. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
  152. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
  153. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -0
  154. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
  155. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/common/secure_aggregation/quantization.py +0 -0
  156. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
  157. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
  158. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/common/serde.py +0 -0
  159. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/common/serde_utils.py +0 -0
  160. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/common/telemetry.py +0 -0
  161. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/common/typing.py +0 -0
  162. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/common/version.py +0 -0
  163. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/compat/__init__.py +0 -0
  164. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/compat/client/__init__.py +0 -0
  165. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/compat/client/app.py +0 -0
  166. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/compat/client/grpc_client/__init__.py +0 -0
  167. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/compat/client/grpc_client/connection.py +0 -0
  168. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/compat/common/__init__.py +0 -0
  169. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/compat/server/__init__.py +0 -0
  170. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/compat/server/app.py +0 -0
  171. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/compat/simulation/__init__.py +0 -0
  172. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/proto/__init__.py +0 -0
  173. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/proto/appio_pb2.py +0 -0
  174. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/proto/appio_pb2.pyi +0 -0
  175. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/proto/appio_pb2_grpc.py +0 -0
  176. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/proto/appio_pb2_grpc.pyi +0 -0
  177. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/proto/clientappio_pb2.py +0 -0
  178. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/proto/clientappio_pb2.pyi +0 -0
  179. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/proto/clientappio_pb2_grpc.py +0 -0
  180. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/proto/clientappio_pb2_grpc.pyi +0 -0
  181. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/proto/error_pb2.py +0 -0
  182. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/proto/error_pb2.pyi +0 -0
  183. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/proto/error_pb2_grpc.py +0 -0
  184. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/proto/error_pb2_grpc.pyi +0 -0
  185. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/proto/exec_pb2.py +0 -0
  186. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/proto/exec_pb2.pyi +0 -0
  187. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/proto/exec_pb2_grpc.py +0 -0
  188. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/proto/exec_pb2_grpc.pyi +0 -0
  189. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/proto/fab_pb2.py +0 -0
  190. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/proto/fab_pb2.pyi +0 -0
  191. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/proto/fab_pb2_grpc.py +0 -0
  192. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/proto/fab_pb2_grpc.pyi +0 -0
  193. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/proto/fleet_pb2.py +0 -0
  194. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/proto/fleet_pb2.pyi +0 -0
  195. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/proto/fleet_pb2_grpc.py +0 -0
  196. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
  197. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/proto/grpcadapter_pb2.py +0 -0
  198. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/proto/grpcadapter_pb2.pyi +0 -0
  199. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/proto/grpcadapter_pb2_grpc.py +0 -0
  200. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/proto/grpcadapter_pb2_grpc.pyi +0 -0
  201. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/proto/heartbeat_pb2.py +0 -0
  202. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/proto/heartbeat_pb2.pyi +0 -0
  203. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/proto/heartbeat_pb2_grpc.py +0 -0
  204. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/proto/heartbeat_pb2_grpc.pyi +0 -0
  205. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/proto/log_pb2.py +0 -0
  206. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/proto/log_pb2.pyi +0 -0
  207. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/proto/log_pb2_grpc.py +0 -0
  208. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/proto/log_pb2_grpc.pyi +0 -0
  209. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/proto/message_pb2.py +0 -0
  210. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/proto/message_pb2.pyi +0 -0
  211. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/proto/message_pb2_grpc.py +0 -0
  212. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/proto/message_pb2_grpc.pyi +0 -0
  213. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/proto/node_pb2.py +0 -0
  214. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/proto/node_pb2.pyi +0 -0
  215. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/proto/node_pb2_grpc.py +0 -0
  216. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/proto/node_pb2_grpc.pyi +0 -0
  217. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/proto/recorddict_pb2.py +0 -0
  218. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/proto/recorddict_pb2.pyi +0 -0
  219. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/proto/recorddict_pb2_grpc.py +0 -0
  220. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/proto/recorddict_pb2_grpc.pyi +0 -0
  221. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/proto/run_pb2.py +0 -0
  222. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/proto/run_pb2.pyi +0 -0
  223. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/proto/run_pb2_grpc.py +0 -0
  224. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/proto/run_pb2_grpc.pyi +0 -0
  225. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/proto/serverappio_pb2.py +0 -0
  226. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/proto/serverappio_pb2.pyi +0 -0
  227. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/proto/serverappio_pb2_grpc.py +0 -0
  228. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/proto/serverappio_pb2_grpc.pyi +0 -0
  229. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/proto/simulationio_pb2.py +0 -0
  230. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/proto/simulationio_pb2.pyi +0 -0
  231. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/proto/simulationio_pb2_grpc.py +0 -0
  232. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/proto/simulationio_pb2_grpc.pyi +0 -0
  233. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/proto/transport_pb2.py +0 -0
  234. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/proto/transport_pb2.pyi +0 -0
  235. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/proto/transport_pb2_grpc.py +0 -0
  236. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
  237. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/py.typed +0 -0
  238. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/__init__.py +0 -0
  239. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/app.py +0 -0
  240. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/client_manager.py +0 -0
  241. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/client_proxy.py +0 -0
  242. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/compat/__init__.py +0 -0
  243. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/compat/app.py +0 -0
  244. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/compat/app_utils.py +0 -0
  245. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/compat/grid_client_proxy.py +0 -0
  246. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/compat/legacy_context.py +0 -0
  247. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/criterion.py +0 -0
  248. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/fleet_event_log_interceptor.py +0 -0
  249. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/grid/__init__.py +0 -0
  250. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/grid/grid.py +0 -0
  251. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/grid/grpc_grid.py +0 -0
  252. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/grid/inmemory_grid.py +0 -0
  253. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/history.py +0 -0
  254. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/run_serverapp.py +0 -0
  255. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/server.py +0 -0
  256. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/server_app.py +0 -0
  257. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/server_config.py +0 -0
  258. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/serverapp/__init__.py +0 -0
  259. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/serverapp/app.py +0 -0
  260. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/serverapp_components.py +0 -0
  261. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/strategy/__init__.py +0 -0
  262. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/strategy/aggregate.py +0 -0
  263. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/strategy/bulyan.py +0 -0
  264. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
  265. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
  266. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
  267. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
  268. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
  269. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/strategy/fedadagrad.py +0 -0
  270. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/strategy/fedadam.py +0 -0
  271. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/strategy/fedavg.py +0 -0
  272. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/strategy/fedavg_android.py +0 -0
  273. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/strategy/fedavgm.py +0 -0
  274. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/strategy/fedmedian.py +0 -0
  275. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/strategy/fedopt.py +0 -0
  276. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/strategy/fedprox.py +0 -0
  277. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
  278. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
  279. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
  280. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
  281. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/strategy/fedyogi.py +0 -0
  282. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/strategy/krum.py +0 -0
  283. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/strategy/qfedavg.py +0 -0
  284. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/strategy/strategy.py +0 -0
  285. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/superlink/__init__.py +0 -0
  286. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/superlink/fleet/__init__.py +0 -0
  287. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/superlink/fleet/grpc_adapter/__init__.py +0 -0
  288. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +0 -0
  289. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
  290. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
  291. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
  292. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
  293. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +0 -0
  294. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
  295. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +0 -0
  296. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +0 -0
  297. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
  298. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/superlink/fleet/message_handler/message_handler.py +0 -0
  299. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
  300. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +0 -0
  301. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
  302. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
  303. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
  304. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +0 -0
  305. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/superlink/fleet/vce/vce_api.py +0 -0
  306. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/superlink/linkstate/__init__.py +0 -0
  307. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/superlink/linkstate/in_memory_linkstate.py +0 -0
  308. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/superlink/linkstate/linkstate.py +0 -0
  309. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/superlink/linkstate/linkstate_factory.py +0 -0
  310. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/superlink/linkstate/sqlite_linkstate.py +0 -0
  311. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/superlink/linkstate/utils.py +0 -0
  312. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/superlink/serverappio/__init__.py +0 -0
  313. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/superlink/serverappio/serverappio_grpc.py +0 -0
  314. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/superlink/serverappio/serverappio_servicer.py +0 -0
  315. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/superlink/simulation/__init__.py +0 -0
  316. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/superlink/simulation/simulationio_grpc.py +0 -0
  317. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/superlink/simulation/simulationio_servicer.py +0 -0
  318. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/superlink/utils.py +0 -0
  319. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/typing.py +0 -0
  320. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/utils/__init__.py +0 -0
  321. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/utils/tensorboard.py +0 -0
  322. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/utils/validator.py +0 -0
  323. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/workflow/__init__.py +0 -0
  324. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/workflow/constant.py +0 -0
  325. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/workflow/default_workflows.py +0 -0
  326. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
  327. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
  328. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +0 -0
  329. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/serverapp/__init__.py +0 -0
  330. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/simulation/__init__.py +0 -0
  331. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/simulation/app.py +0 -0
  332. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/simulation/legacy_app.py +0 -0
  333. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/simulation/ray_transport/__init__.py +0 -0
  334. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
  335. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
  336. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/simulation/ray_transport/utils.py +0 -0
  337. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/simulation/run_simulation.py +0 -0
  338. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/simulation/simulationio_connection.py +0 -0
  339. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/supercore/__init__.py +0 -0
  340. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/supercore/ffs/__init__.py +0 -0
  341. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/supercore/ffs/disk_ffs.py +0 -0
  342. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/supercore/ffs/ffs.py +0 -0
  343. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/supercore/ffs/ffs_factory.py +0 -0
  344. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/supercore/grpc_health/__init__.py +0 -0
  345. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/supercore/grpc_health/simple_health_servicer.py +0 -0
  346. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/supercore/license_plugin/__init__.py +0 -0
  347. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/supercore/license_plugin/license_plugin.py +0 -0
  348. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/supercore/object_store/__init__.py +0 -0
  349. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/supercore/object_store/in_memory_object_store.py +0 -0
  350. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/supercore/object_store/object_store_factory.py +0 -0
  351. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/supercore/object_store/utils.py +0 -0
  352. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/supercore/utils.py +0 -0
  353. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/superexec/__init__.py +0 -0
  354. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/superexec/app.py +0 -0
  355. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/superexec/deployment.py +0 -0
  356. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/superexec/exec_event_log_interceptor.py +0 -0
  357. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/superexec/exec_grpc.py +0 -0
  358. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/superexec/exec_license_interceptor.py +0 -0
  359. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/superexec/exec_servicer.py +0 -0
  360. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/superexec/exec_user_auth_interceptor.py +0 -0
  361. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/superexec/executor.py +0 -0
  362. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/superexec/simulation.py +0 -0
  363. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/superlink/__init__.py +0 -0
  364. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/supernode/__init__.py +0 -0
  365. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/supernode/cli/__init__.py +0 -0
  366. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/supernode/cli/flower_supernode.py +0 -0
  367. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/supernode/cli/flwr_clientapp.py +0 -0
  368. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/supernode/nodestate/__init__.py +0 -0
  369. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/supernode/nodestate/in_memory_nodestate.py +0 -0
  370. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/supernode/nodestate/nodestate.py +0 -0
  371. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/supernode/nodestate/nodestate_factory.py +0 -0
  372. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/supernode/runtime/__init__.py +0 -0
  373. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/supernode/servicer/__init__.py +0 -0
  374. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/py/flwr/supernode/servicer/clientappio/__init__.py +0 -0
  375. {flwr_nightly-1.20.0.dev20250720 → flwr_nightly-1.20.0.dev20250722}/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.dev20250722
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
@@ -123,7 +123,7 @@ AUTHZ_TYPE_YAML_KEY = "authz_type" # For key name in YAML file
123
123
  PUBLIC_KEY_HEADER = "flwr-public-key-bin" # Must end with "-bin" for binary data
124
124
  SIGNATURE_HEADER = "flwr-signature-bin" # Must end with "-bin" for binary data
125
125
  TIMESTAMP_HEADER = "flwr-timestamp"
126
- TIMESTAMP_TOLERANCE = 10 # General tolerance for timestamp verification
126
+ TIMESTAMP_TOLERANCE = 300 # General tolerance for timestamp verification
127
127
  SYSTEM_TIME_TOLERANCE = 5 # Allowance for system time drift
128
128
 
129
129
  # Constants for grpc retry
@@ -264,14 +264,22 @@ class Array(InflatableObject):
264
264
 
265
265
  def slice_array(self) -> list[tuple[str, InflatableObject]]:
266
266
  """Slice Array data and construct a list of ArrayChunks."""
267
- children: list[tuple[str, InflatableObject]] = []
267
+ # Return cached chunks if they exist
268
+ if "_chunks" in self.__dict__:
269
+ return cast(list[tuple[str, InflatableObject]], self.__dict__["_chunks"])
270
+
271
+ # Chunks are not children as some of them may be identical
272
+ chunks: list[tuple[str, InflatableObject]] = []
268
273
  # memoryview allows for zero-copy slicing
269
274
  data_view = memoryview(self.data)
270
275
  for start in range(0, len(data_view), MAX_ARRAY_CHUNK_SIZE):
271
276
  end = min(start + MAX_ARRAY_CHUNK_SIZE, len(data_view))
272
277
  ac = ArrayChunk(data_view[start:end])
273
- children.append((ac.object_id, ac))
274
- return children
278
+ chunks.append((ac.object_id, ac))
279
+
280
+ # Cache the chunks for future use
281
+ self.__dict__["_chunks"] = chunks
282
+ return chunks
275
283
 
276
284
  def deflate(self) -> bytes:
277
285
  """Deflate the Array."""
@@ -386,4 +394,9 @@ class Array(InflatableObject):
386
394
  if name in ("dtype", "shape", "stype", "data"):
387
395
  # Mark as dirty if any of the main attributes are set
388
396
  self.is_dirty = True
397
+ # Clear cached object ID
398
+ self.__dict__.pop("_object_id", None)
399
+ # Clear cached chunks if data is set
400
+ if name == "data":
401
+ self.__dict__.pop("_chunks", None)
389
402
  super().__setattr__(name, value)
@@ -28,9 +28,6 @@ class ArrayChunk(InflatableObject):
28
28
 
29
29
  data: memoryview
30
30
 
31
- def __init__(self, data: bytes) -> None:
32
- self.data = memoryview(data)
33
-
34
31
  def deflate(self) -> bytes:
35
32
  """Deflate the ArrayChunk."""
36
33
  return add_header_to_object_body(object_body=self.data, obj=self)
@@ -99,8 +99,10 @@ class ObjectStore(abc.ABC):
99
99
 
100
100
  Returns
101
101
  -------
102
- bytes
103
- The object stored under the given object_id.
102
+ Optional[bytes]
103
+ The object stored under the given object_id if it exists, else None.
104
+ The returned bytes will be b"" if the object is not yet available,
105
+ but has been preregistered.
104
106
  """
105
107
 
106
108
  @abc.abstractmethod
@@ -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: