flwr-nightly 1.20.0.dev20250714__tar.gz → 1.20.0.dev20250716__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 (376) hide show
  1. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/PKG-INFO +2 -1
  2. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/client/grpc_rere_client/connection.py +10 -8
  3. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/client/rest_client/connection.py +11 -8
  4. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/common/grpc.py +12 -1
  5. flwr_nightly-1.20.0.dev20250714/py/flwr/common/inflatable_grpc_utils.py → flwr_nightly-1.20.0.dev20250716/py/flwr/common/inflatable_protobuf_utils.py +12 -10
  6. flwr_nightly-1.20.0.dev20250716/py/flwr/proto/fleet_pb2.py +57 -0
  7. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/proto/fleet_pb2.pyi +4 -19
  8. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/grid/grpc_grid.py +7 -7
  9. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/superlink/fleet/message_handler/message_handler.py +8 -13
  10. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/superlink/serverappio/serverappio_servicer.py +4 -8
  11. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/superlink/utils.py +1 -9
  12. flwr_nightly-1.20.0.dev20250716/py/flwr/supercore/grpc_health/__init__.py +22 -0
  13. flwr_nightly-1.20.0.dev20250716/py/flwr/supercore/grpc_health/simple_health_servicer.py +38 -0
  14. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/supercore/object_store/in_memory_object_store.py +31 -31
  15. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/supercore/object_store/object_store.py +16 -40
  16. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/pyproject.toml +2 -1
  17. flwr_nightly-1.20.0.dev20250714/py/flwr/common/inflatable_rest_utils.py +0 -99
  18. flwr_nightly-1.20.0.dev20250714/py/flwr/proto/fleet_pb2.py +0 -61
  19. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/README.md +0 -0
  20. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/__init__.py +0 -0
  21. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/app/__init__.py +0 -0
  22. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/app/error.py +0 -0
  23. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/app/metadata.py +0 -0
  24. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/cli/__init__.py +0 -0
  25. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/cli/app.py +0 -0
  26. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/cli/auth_plugin/__init__.py +0 -0
  27. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/cli/auth_plugin/oidc_cli_plugin.py +0 -0
  28. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/cli/build.py +0 -0
  29. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/cli/cli_user_auth_interceptor.py +0 -0
  30. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/cli/config_utils.py +0 -0
  31. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/cli/constant.py +0 -0
  32. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/cli/example.py +0 -0
  33. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/cli/install.py +0 -0
  34. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/cli/log.py +0 -0
  35. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/cli/login/__init__.py +0 -0
  36. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/cli/login/login.py +0 -0
  37. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/cli/ls.py +0 -0
  38. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/cli/new/__init__.py +0 -0
  39. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/cli/new/new.py +0 -0
  40. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/cli/new/templates/__init__.py +0 -0
  41. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/cli/new/templates/app/.gitignore.tpl +0 -0
  42. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/cli/new/templates/app/LICENSE.tpl +0 -0
  43. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/cli/new/templates/app/README.baseline.md.tpl +0 -0
  44. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/cli/new/templates/app/README.flowertune.md.tpl +0 -0
  45. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/cli/new/templates/app/README.md.tpl +0 -0
  46. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/cli/new/templates/app/__init__.py +0 -0
  47. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/cli/new/templates/app/code/__init__.baseline.py.tpl +0 -0
  48. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
  49. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
  50. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/cli/new/templates/app/code/client.baseline.py.tpl +0 -0
  51. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/cli/new/templates/app/code/client.huggingface.py.tpl +0 -0
  52. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/cli/new/templates/app/code/client.jax.py.tpl +0 -0
  53. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/cli/new/templates/app/code/client.mlx.py.tpl +0 -0
  54. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/cli/new/templates/app/code/client.numpy.py.tpl +0 -0
  55. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -0
  56. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl +0 -0
  57. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -0
  58. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/cli/new/templates/app/code/dataset.baseline.py.tpl +0 -0
  59. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/cli/new/templates/app/code/flwr_tune/__init__.py +0 -0
  60. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/cli/new/templates/app/code/flwr_tune/client_app.py.tpl +0 -0
  61. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/cli/new/templates/app/code/flwr_tune/dataset.py.tpl +0 -0
  62. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/cli/new/templates/app/code/flwr_tune/models.py.tpl +0 -0
  63. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/cli/new/templates/app/code/flwr_tune/server_app.py.tpl +0 -0
  64. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/cli/new/templates/app/code/flwr_tune/strategy.py.tpl +0 -0
  65. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/cli/new/templates/app/code/model.baseline.py.tpl +0 -0
  66. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/cli/new/templates/app/code/server.baseline.py.tpl +0 -0
  67. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/cli/new/templates/app/code/server.huggingface.py.tpl +0 -0
  68. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/cli/new/templates/app/code/server.jax.py.tpl +0 -0
  69. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/cli/new/templates/app/code/server.mlx.py.tpl +0 -0
  70. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -0
  71. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -0
  72. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/cli/new/templates/app/code/server.sklearn.py.tpl +0 -0
  73. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -0
  74. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/cli/new/templates/app/code/strategy.baseline.py.tpl +0 -0
  75. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/cli/new/templates/app/code/task.huggingface.py.tpl +0 -0
  76. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/cli/new/templates/app/code/task.jax.py.tpl +0 -0
  77. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/cli/new/templates/app/code/task.mlx.py.tpl +0 -0
  78. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/cli/new/templates/app/code/task.numpy.py.tpl +0 -0
  79. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +0 -0
  80. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/cli/new/templates/app/code/task.sklearn.py.tpl +0 -0
  81. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/cli/new/templates/app/code/task.tensorflow.py.tpl +0 -0
  82. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/cli/new/templates/app/code/utils.baseline.py.tpl +0 -0
  83. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/cli/new/templates/app/pyproject.baseline.toml.tpl +0 -0
  84. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +0 -0
  85. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl +0 -0
  86. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/cli/new/templates/app/pyproject.jax.toml.tpl +0 -0
  87. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +0 -0
  88. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +0 -0
  89. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +0 -0
  90. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +0 -0
  91. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +0 -0
  92. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/cli/run/__init__.py +0 -0
  93. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/cli/run/run.py +0 -0
  94. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/cli/stop.py +0 -0
  95. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/cli/utils.py +0 -0
  96. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/client/__init__.py +0 -0
  97. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/client/client.py +0 -0
  98. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/client/client_app.py +0 -0
  99. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/client/clientapp/__init__.py +0 -0
  100. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/client/clientapp/utils.py +0 -0
  101. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/client/dpfedavg_numpy_client.py +0 -0
  102. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/client/grpc_adapter_client/__init__.py +0 -0
  103. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/client/grpc_adapter_client/connection.py +0 -0
  104. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/client/grpc_rere_client/__init__.py +0 -0
  105. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/client/grpc_rere_client/client_interceptor.py +0 -0
  106. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/client/grpc_rere_client/grpc_adapter.py +0 -0
  107. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/client/message_handler/__init__.py +0 -0
  108. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/client/message_handler/message_handler.py +0 -0
  109. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/client/mod/__init__.py +0 -0
  110. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/client/mod/centraldp_mods.py +0 -0
  111. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/client/mod/comms_mods.py +0 -0
  112. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/client/mod/localdp_mod.py +0 -0
  113. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
  114. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
  115. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
  116. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/client/mod/utils.py +0 -0
  117. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/client/numpy_client.py +0 -0
  118. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/client/rest_client/__init__.py +0 -0
  119. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/client/run_info_store.py +0 -0
  120. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/client/typing.py +0 -0
  121. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/clientapp/__init__.py +0 -0
  122. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/common/__init__.py +0 -0
  123. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/common/address.py +0 -0
  124. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/common/args.py +0 -0
  125. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/common/auth_plugin/__init__.py +0 -0
  126. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/common/auth_plugin/auth_plugin.py +0 -0
  127. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/common/config.py +0 -0
  128. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/common/constant.py +0 -0
  129. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/common/context.py +0 -0
  130. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/common/date.py +0 -0
  131. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/common/differential_privacy.py +0 -0
  132. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/common/differential_privacy_constants.py +0 -0
  133. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/common/dp.py +0 -0
  134. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/common/event_log_plugin/__init__.py +0 -0
  135. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/common/event_log_plugin/event_log_plugin.py +0 -0
  136. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/common/exit/__init__.py +0 -0
  137. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/common/exit/exit.py +0 -0
  138. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/common/exit/exit_code.py +0 -0
  139. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/common/exit_handlers.py +0 -0
  140. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/common/heartbeat.py +0 -0
  141. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/common/inflatable.py +0 -0
  142. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/common/inflatable_utils.py +0 -0
  143. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/common/logger.py +0 -0
  144. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/common/message.py +0 -0
  145. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/common/object_ref.py +0 -0
  146. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/common/parameter.py +0 -0
  147. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/common/pyproject.py +0 -0
  148. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/common/record/__init__.py +0 -0
  149. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/common/record/array.py +0 -0
  150. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/common/record/arraychunk.py +0 -0
  151. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/common/record/arrayrecord.py +0 -0
  152. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/common/record/configrecord.py +0 -0
  153. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/common/record/conversion_utils.py +0 -0
  154. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/common/record/metricrecord.py +0 -0
  155. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/common/record/recorddict.py +0 -0
  156. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/common/record/typeddict.py +0 -0
  157. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/common/recorddict_compat.py +0 -0
  158. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/common/retry_invoker.py +0 -0
  159. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/common/secure_aggregation/__init__.py +0 -0
  160. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
  161. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
  162. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -0
  163. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
  164. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/common/secure_aggregation/quantization.py +0 -0
  165. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
  166. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
  167. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/common/serde.py +0 -0
  168. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/common/serde_utils.py +0 -0
  169. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/common/telemetry.py +0 -0
  170. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/common/typing.py +0 -0
  171. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/common/version.py +0 -0
  172. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/compat/__init__.py +0 -0
  173. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/compat/client/__init__.py +0 -0
  174. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/compat/client/app.py +0 -0
  175. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/compat/client/grpc_client/__init__.py +0 -0
  176. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/compat/client/grpc_client/connection.py +0 -0
  177. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/compat/common/__init__.py +0 -0
  178. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/compat/server/__init__.py +0 -0
  179. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/compat/server/app.py +0 -0
  180. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/compat/simulation/__init__.py +0 -0
  181. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/proto/__init__.py +0 -0
  182. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/proto/appio_pb2.py +0 -0
  183. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/proto/appio_pb2.pyi +0 -0
  184. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/proto/appio_pb2_grpc.py +0 -0
  185. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/proto/appio_pb2_grpc.pyi +0 -0
  186. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/proto/clientappio_pb2.py +0 -0
  187. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/proto/clientappio_pb2.pyi +0 -0
  188. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/proto/clientappio_pb2_grpc.py +0 -0
  189. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/proto/clientappio_pb2_grpc.pyi +0 -0
  190. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/proto/error_pb2.py +0 -0
  191. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/proto/error_pb2.pyi +0 -0
  192. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/proto/error_pb2_grpc.py +0 -0
  193. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/proto/error_pb2_grpc.pyi +0 -0
  194. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/proto/exec_pb2.py +0 -0
  195. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/proto/exec_pb2.pyi +0 -0
  196. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/proto/exec_pb2_grpc.py +0 -0
  197. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/proto/exec_pb2_grpc.pyi +0 -0
  198. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/proto/fab_pb2.py +0 -0
  199. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/proto/fab_pb2.pyi +0 -0
  200. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/proto/fab_pb2_grpc.py +0 -0
  201. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/proto/fab_pb2_grpc.pyi +0 -0
  202. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/proto/fleet_pb2_grpc.py +0 -0
  203. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
  204. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/proto/grpcadapter_pb2.py +0 -0
  205. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/proto/grpcadapter_pb2.pyi +0 -0
  206. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/proto/grpcadapter_pb2_grpc.py +0 -0
  207. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/proto/grpcadapter_pb2_grpc.pyi +0 -0
  208. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/proto/heartbeat_pb2.py +0 -0
  209. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/proto/heartbeat_pb2.pyi +0 -0
  210. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/proto/heartbeat_pb2_grpc.py +0 -0
  211. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/proto/heartbeat_pb2_grpc.pyi +0 -0
  212. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/proto/log_pb2.py +0 -0
  213. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/proto/log_pb2.pyi +0 -0
  214. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/proto/log_pb2_grpc.py +0 -0
  215. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/proto/log_pb2_grpc.pyi +0 -0
  216. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/proto/message_pb2.py +0 -0
  217. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/proto/message_pb2.pyi +0 -0
  218. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/proto/message_pb2_grpc.py +0 -0
  219. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/proto/message_pb2_grpc.pyi +0 -0
  220. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/proto/node_pb2.py +0 -0
  221. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/proto/node_pb2.pyi +0 -0
  222. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/proto/node_pb2_grpc.py +0 -0
  223. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/proto/node_pb2_grpc.pyi +0 -0
  224. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/proto/recorddict_pb2.py +0 -0
  225. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/proto/recorddict_pb2.pyi +0 -0
  226. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/proto/recorddict_pb2_grpc.py +0 -0
  227. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/proto/recorddict_pb2_grpc.pyi +0 -0
  228. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/proto/run_pb2.py +0 -0
  229. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/proto/run_pb2.pyi +0 -0
  230. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/proto/run_pb2_grpc.py +0 -0
  231. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/proto/run_pb2_grpc.pyi +0 -0
  232. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/proto/serverappio_pb2.py +0 -0
  233. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/proto/serverappio_pb2.pyi +0 -0
  234. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/proto/serverappio_pb2_grpc.py +0 -0
  235. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/proto/serverappio_pb2_grpc.pyi +0 -0
  236. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/proto/simulationio_pb2.py +0 -0
  237. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/proto/simulationio_pb2.pyi +0 -0
  238. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/proto/simulationio_pb2_grpc.py +0 -0
  239. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/proto/simulationio_pb2_grpc.pyi +0 -0
  240. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/proto/transport_pb2.py +0 -0
  241. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/proto/transport_pb2.pyi +0 -0
  242. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/proto/transport_pb2_grpc.py +0 -0
  243. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
  244. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/py.typed +0 -0
  245. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/__init__.py +0 -0
  246. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/app.py +0 -0
  247. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/client_manager.py +0 -0
  248. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/client_proxy.py +0 -0
  249. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/compat/__init__.py +0 -0
  250. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/compat/app.py +0 -0
  251. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/compat/app_utils.py +0 -0
  252. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/compat/grid_client_proxy.py +0 -0
  253. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/compat/legacy_context.py +0 -0
  254. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/criterion.py +0 -0
  255. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/fleet_event_log_interceptor.py +0 -0
  256. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/grid/__init__.py +0 -0
  257. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/grid/grid.py +0 -0
  258. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/grid/inmemory_grid.py +0 -0
  259. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/history.py +0 -0
  260. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/run_serverapp.py +0 -0
  261. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/server.py +0 -0
  262. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/server_app.py +0 -0
  263. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/server_config.py +0 -0
  264. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/serverapp/__init__.py +0 -0
  265. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/serverapp/app.py +0 -0
  266. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/serverapp_components.py +0 -0
  267. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/strategy/__init__.py +0 -0
  268. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/strategy/aggregate.py +0 -0
  269. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/strategy/bulyan.py +0 -0
  270. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
  271. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
  272. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
  273. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
  274. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
  275. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/strategy/fedadagrad.py +0 -0
  276. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/strategy/fedadam.py +0 -0
  277. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/strategy/fedavg.py +0 -0
  278. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/strategy/fedavg_android.py +0 -0
  279. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/strategy/fedavgm.py +0 -0
  280. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/strategy/fedmedian.py +0 -0
  281. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/strategy/fedopt.py +0 -0
  282. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/strategy/fedprox.py +0 -0
  283. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
  284. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
  285. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
  286. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
  287. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/strategy/fedyogi.py +0 -0
  288. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/strategy/krum.py +0 -0
  289. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/strategy/qfedavg.py +0 -0
  290. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/strategy/strategy.py +0 -0
  291. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/superlink/__init__.py +0 -0
  292. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/superlink/fleet/__init__.py +0 -0
  293. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/superlink/fleet/grpc_adapter/__init__.py +0 -0
  294. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +0 -0
  295. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
  296. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
  297. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
  298. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
  299. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +0 -0
  300. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
  301. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +0 -0
  302. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +0 -0
  303. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
  304. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
  305. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +0 -0
  306. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
  307. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
  308. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
  309. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +0 -0
  310. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/superlink/fleet/vce/vce_api.py +0 -0
  311. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/superlink/linkstate/__init__.py +0 -0
  312. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/superlink/linkstate/in_memory_linkstate.py +0 -0
  313. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/superlink/linkstate/linkstate.py +0 -0
  314. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/superlink/linkstate/linkstate_factory.py +0 -0
  315. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/superlink/linkstate/sqlite_linkstate.py +0 -0
  316. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/superlink/linkstate/utils.py +0 -0
  317. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/superlink/serverappio/__init__.py +0 -0
  318. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/superlink/serverappio/serverappio_grpc.py +0 -0
  319. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/superlink/simulation/__init__.py +0 -0
  320. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/superlink/simulation/simulationio_grpc.py +0 -0
  321. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/superlink/simulation/simulationio_servicer.py +0 -0
  322. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/typing.py +0 -0
  323. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/utils/__init__.py +0 -0
  324. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/utils/tensorboard.py +0 -0
  325. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/utils/validator.py +0 -0
  326. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/workflow/__init__.py +0 -0
  327. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/workflow/constant.py +0 -0
  328. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/workflow/default_workflows.py +0 -0
  329. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
  330. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
  331. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +0 -0
  332. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/serverapp/__init__.py +0 -0
  333. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/simulation/__init__.py +0 -0
  334. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/simulation/app.py +0 -0
  335. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/simulation/legacy_app.py +0 -0
  336. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/simulation/ray_transport/__init__.py +0 -0
  337. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
  338. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
  339. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/simulation/ray_transport/utils.py +0 -0
  340. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/simulation/run_simulation.py +0 -0
  341. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/simulation/simulationio_connection.py +0 -0
  342. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/supercore/__init__.py +0 -0
  343. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/supercore/ffs/__init__.py +0 -0
  344. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/supercore/ffs/disk_ffs.py +0 -0
  345. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/supercore/ffs/ffs.py +0 -0
  346. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/supercore/ffs/ffs_factory.py +0 -0
  347. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/supercore/license_plugin/__init__.py +0 -0
  348. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/supercore/license_plugin/license_plugin.py +0 -0
  349. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/supercore/object_store/__init__.py +0 -0
  350. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/supercore/object_store/object_store_factory.py +0 -0
  351. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/supercore/utils.py +0 -0
  352. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/superexec/__init__.py +0 -0
  353. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/superexec/app.py +0 -0
  354. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/superexec/deployment.py +0 -0
  355. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/superexec/exec_event_log_interceptor.py +0 -0
  356. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/superexec/exec_grpc.py +0 -0
  357. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/superexec/exec_license_interceptor.py +0 -0
  358. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/superexec/exec_servicer.py +0 -0
  359. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/superexec/exec_user_auth_interceptor.py +0 -0
  360. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/superexec/executor.py +0 -0
  361. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/superexec/simulation.py +0 -0
  362. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/superlink/__init__.py +0 -0
  363. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/supernode/__init__.py +0 -0
  364. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/supernode/cli/__init__.py +0 -0
  365. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/supernode/cli/flower_supernode.py +0 -0
  366. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/supernode/cli/flwr_clientapp.py +0 -0
  367. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/supernode/nodestate/__init__.py +0 -0
  368. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/supernode/nodestate/in_memory_nodestate.py +0 -0
  369. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/supernode/nodestate/nodestate.py +0 -0
  370. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/supernode/nodestate/nodestate_factory.py +0 -0
  371. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/supernode/runtime/__init__.py +0 -0
  372. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/supernode/runtime/run_clientapp.py +0 -0
  373. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/supernode/servicer/__init__.py +0 -0
  374. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/supernode/servicer/clientappio/__init__.py +0 -0
  375. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/supernode/servicer/clientappio/clientappio_servicer.py +0 -0
  376. {flwr_nightly-1.20.0.dev20250714 → flwr_nightly-1.20.0.dev20250716}/py/flwr/supernode/start_client_internal.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: flwr-nightly
3
- Version: 1.20.0.dev20250714
3
+ Version: 1.20.0.dev20250716
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
@@ -34,6 +34,7 @@ Provides-Extra: simulation
34
34
  Requires-Dist: click (<8.2.0)
35
35
  Requires-Dist: cryptography (>=44.0.1,<45.0.0)
36
36
  Requires-Dist: grpcio (>=1.62.3,<2.0.0,!=1.65.0)
37
+ Requires-Dist: grpcio-health-checking (>=1.62.3,<2.0.0)
37
38
  Requires-Dist: iterators (>=0.0.2,<0.0.3)
38
39
  Requires-Dist: numpy (>=1.26.0,<3.0.0)
39
40
  Requires-Dist: pathspec (>=0.12.1,<0.13.0)
@@ -31,11 +31,12 @@ from flwr.common.heartbeat import HeartbeatSender
31
31
  from flwr.common.inflatable import (
32
32
  get_all_nested_objects,
33
33
  get_object_tree,
34
+ iterate_object_tree,
34
35
  no_object_id_recompute,
35
36
  )
36
- from flwr.common.inflatable_grpc_utils import (
37
- make_pull_object_fn_grpc,
38
- make_push_object_fn_grpc,
37
+ from flwr.common.inflatable_protobuf_utils import (
38
+ make_pull_object_fn_protobuf,
39
+ make_push_object_fn_protobuf,
39
40
  )
40
41
  from flwr.common.inflatable_utils import (
41
42
  inflate_object_from_contents,
@@ -273,10 +274,11 @@ def grpc_request_response( # pylint: disable=R0913,R0914,R0915,R0917
273
274
  if message_proto:
274
275
  msg_id = message_proto.metadata.message_id
275
276
  run_id = message_proto.metadata.run_id
277
+ object_tree = response.message_object_trees[0]
276
278
  all_object_contents = pull_objects(
277
- list(response.objects_to_pull[msg_id].object_ids) + [msg_id],
278
- pull_object_fn=make_pull_object_fn_grpc(
279
- pull_object_grpc=stub.PullObject,
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,
280
282
  node=node,
281
283
  run_id=run_id,
282
284
  ),
@@ -328,8 +330,8 @@ def grpc_request_response( # pylint: disable=R0913,R0914,R0915,R0917
328
330
  )
329
331
  push_objects(
330
332
  all_objects,
331
- push_object_fn=make_push_object_fn_grpc(
332
- push_object_grpc=stub.PushObject,
333
+ push_object_fn=make_push_object_fn_protobuf(
334
+ push_object_protobuf=stub.PushObject,
333
335
  node=node,
334
336
  run_id=message.metadata.run_id,
335
337
  ),
@@ -14,6 +14,7 @@
14
14
  # ==============================================================================
15
15
  """Contextmanager for a REST request-response channel to the Flower server."""
16
16
 
17
+
17
18
  from collections.abc import Iterator
18
19
  from contextlib import contextmanager
19
20
  from logging import DEBUG, ERROR, INFO, WARN
@@ -30,11 +31,12 @@ from flwr.common.heartbeat import HeartbeatSender
30
31
  from flwr.common.inflatable import (
31
32
  get_all_nested_objects,
32
33
  get_object_tree,
34
+ iterate_object_tree,
33
35
  no_object_id_recompute,
34
36
  )
35
- from flwr.common.inflatable_rest_utils import (
36
- make_pull_object_fn_rest,
37
- make_push_object_fn_rest,
37
+ from flwr.common.inflatable_protobuf_utils import (
38
+ make_pull_object_fn_protobuf,
39
+ make_push_object_fn_protobuf,
38
40
  )
39
41
  from flwr.common.inflatable_utils import (
40
42
  inflate_object_from_contents,
@@ -333,10 +335,11 @@ def http_request_response( # pylint: disable=R0913,R0914,R0915,R0917
333
335
  return res
334
336
 
335
337
  try:
338
+ object_tree = res.message_object_trees[0]
336
339
  all_object_contents = pull_objects(
337
- list(res.objects_to_pull[msg_id].object_ids) + [msg_id],
338
- pull_object_fn=make_pull_object_fn_rest(
339
- pull_object_rest=fn,
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,
340
343
  node=node,
341
344
  run_id=run_id,
342
345
  ),
@@ -413,8 +416,8 @@ def http_request_response( # pylint: disable=R0913,R0914,R0915,R0917
413
416
  try:
414
417
  push_objects(
415
418
  all_objects,
416
- push_object_fn=make_push_object_fn_rest(
417
- push_object_rest=fn,
419
+ push_object_fn=make_push_object_fn_protobuf(
420
+ push_object_protobuf=fn,
418
421
  node=node,
419
422
  run_id=message_proto.metadata.run_id,
420
423
  ),
@@ -23,6 +23,9 @@ from logging import DEBUG, ERROR
23
23
  from typing import Any, Callable, Optional
24
24
 
25
25
  import grpc
26
+ from grpc_health.v1.health_pb2_grpc import add_HealthServicer_to_server
27
+
28
+ from flwr.supercore.grpc_health import SimpleHealthServicer
26
29
 
27
30
  from .address import is_port_in_use
28
31
  from .logger import log
@@ -98,7 +101,7 @@ def valid_certificates(certificates: tuple[bytes, bytes, bytes]) -> bool:
98
101
  return is_valid
99
102
 
100
103
 
101
- def generic_create_grpc_server( # pylint: disable=too-many-arguments,R0917
104
+ def generic_create_grpc_server( # pylint: disable=too-many-arguments, R0914, R0917
102
105
  servicer_and_add_fn: tuple[Any, AddServicerToServerFn],
103
106
  server_address: str,
104
107
  max_concurrent_workers: int = 1000,
@@ -106,6 +109,7 @@ def generic_create_grpc_server( # pylint: disable=too-many-arguments,R0917
106
109
  keepalive_time_ms: int = 210000,
107
110
  certificates: Optional[tuple[bytes, bytes, bytes]] = None,
108
111
  interceptors: Optional[Sequence[grpc.ServerInterceptor]] = None,
112
+ health_servicer: Optional[Any] = None,
109
113
  ) -> grpc.Server:
110
114
  """Create a gRPC server with a single servicer.
111
115
 
@@ -153,6 +157,10 @@ def generic_create_grpc_server( # pylint: disable=too-many-arguments,R0917
153
157
  * server private key.
154
158
  interceptors : Optional[Sequence[grpc.ServerInterceptor]] (default: None)
155
159
  A list of gRPC interceptors.
160
+ health_servicer : Optional[Any] (default: None)
161
+ An optional health servicer to add to the server. If provided, it should be an
162
+ instance of a class that inherits the `HealthServicer` class.
163
+ If None is provided, `SimpleHealthServicer` will be used by default.
156
164
 
157
165
  Returns
158
166
  -------
@@ -203,6 +211,9 @@ def generic_create_grpc_server( # pylint: disable=too-many-arguments,R0917
203
211
  )
204
212
  add_servicer_to_server_fn(servicer, server)
205
213
 
214
+ # Enable health service
215
+ add_HealthServicer_to_server(health_servicer or SimpleHealthServicer(), server)
216
+
206
217
  if certificates is not None:
207
218
  if not valid_certificates(certificates):
208
219
  sys.exit(1)
@@ -28,8 +28,8 @@ from flwr.proto.node_pb2 import Node # pylint: disable=E0611
28
28
  from .inflatable_utils import ObjectIdNotPreregisteredError, ObjectUnavailableError
29
29
 
30
30
 
31
- def make_pull_object_fn_grpc(
32
- pull_object_grpc: Callable[[PullObjectRequest], PullObjectResponse],
31
+ def make_pull_object_fn_protobuf(
32
+ pull_object_protobuf: Callable[[PullObjectRequest], PullObjectResponse],
33
33
  node: Node,
34
34
  run_id: int,
35
35
  ) -> Callable[[str], bytes]:
@@ -37,8 +37,9 @@ def make_pull_object_fn_grpc(
37
37
 
38
38
  Parameters
39
39
  ----------
40
- pull_object_grpc : Callable[[PullObjectRequest], PullObjectResponse]
41
- The gRPC function to pull objects, e.g., `FleetStub.PullObject`.
40
+ pull_object_protobuf : Callable[[PullObjectRequest], PullObjectResponse]
41
+ A callable that takes a `PullObjectRequest` and returns a `PullObjectResponse`.
42
+ This function is typically backed by a gRPC client stub.
42
43
  node : Node
43
44
  The node making the request.
44
45
  run_id : int
@@ -54,7 +55,7 @@ def make_pull_object_fn_grpc(
54
55
 
55
56
  def pull_object_fn(object_id: str) -> bytes:
56
57
  request = PullObjectRequest(node=node, run_id=run_id, object_id=object_id)
57
- response: PullObjectResponse = pull_object_grpc(request)
58
+ response: PullObjectResponse = pull_object_protobuf(request)
58
59
  if not response.object_found:
59
60
  raise ObjectIdNotPreregisteredError(object_id)
60
61
  if not response.object_available:
@@ -64,8 +65,8 @@ def make_pull_object_fn_grpc(
64
65
  return pull_object_fn
65
66
 
66
67
 
67
- def make_push_object_fn_grpc(
68
- push_object_grpc: Callable[[PushObjectRequest], PushObjectResponse],
68
+ def make_push_object_fn_protobuf(
69
+ push_object_protobuf: Callable[[PushObjectRequest], PushObjectResponse],
69
70
  node: Node,
70
71
  run_id: int,
71
72
  ) -> Callable[[str, bytes], None]:
@@ -73,8 +74,9 @@ def make_push_object_fn_grpc(
73
74
 
74
75
  Parameters
75
76
  ----------
76
- push_object_grpc : Callable[[PushObjectRequest], PushObjectResponse]
77
- The gRPC function to push objects, e.g., `FleetStub.PushObject`.
77
+ push_object_protobuf : Callable[[PushObjectRequest], PushObjectResponse]
78
+ A callable that takes a `PushObjectRequest` and returns a `PushObjectResponse`.
79
+ This function is typically backed by a gRPC client stub.
78
80
  node : Node
79
81
  The node making the request.
80
82
  run_id : int
@@ -92,7 +94,7 @@ def make_push_object_fn_grpc(
92
94
  request = PushObjectRequest(
93
95
  node=node, run_id=run_id, object_id=object_id, object_content=object_content
94
96
  )
95
- response: PushObjectResponse = push_object_grpc(request)
97
+ response: PushObjectResponse = push_object_protobuf(request)
96
98
  if not response.stored:
97
99
  raise ObjectIdNotPreregisteredError(object_id)
98
100
 
@@ -0,0 +1,57 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Generated by the protocol buffer compiler. DO NOT EDIT!
3
+ # source: flwr/proto/fleet.proto
4
+ # Protobuf Python Version: 4.25.1
5
+ """Generated protocol buffer code."""
6
+ from google.protobuf import descriptor as _descriptor
7
+ from google.protobuf import descriptor_pool as _descriptor_pool
8
+ from google.protobuf import symbol_database as _symbol_database
9
+ from google.protobuf.internal import builder as _builder
10
+ # @@protoc_insertion_point(imports)
11
+
12
+ _sym_db = _symbol_database.Default()
13
+
14
+
15
+ from flwr.proto import heartbeat_pb2 as flwr_dot_proto_dot_heartbeat__pb2
16
+ from flwr.proto import node_pb2 as flwr_dot_proto_dot_node__pb2
17
+ from flwr.proto import run_pb2 as flwr_dot_proto_dot_run__pb2
18
+ from flwr.proto import fab_pb2 as flwr_dot_proto_dot_fab__pb2
19
+ from flwr.proto import message_pb2 as flwr_dot_proto_dot_message__pb2
20
+
21
+
22
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x16\x66lwr/proto/fleet.proto\x12\nflwr.proto\x1a\x1a\x66lwr/proto/heartbeat.proto\x1a\x15\x66lwr/proto/node.proto\x1a\x14\x66lwr/proto/run.proto\x1a\x14\x66lwr/proto/fab.proto\x1a\x18\x66lwr/proto/message.proto\"/\n\x11\x43reateNodeRequest\x12\x1a\n\x12heartbeat_interval\x18\x01 \x01(\x01\"4\n\x12\x43reateNodeResponse\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\"3\n\x11\x44\x65leteNodeRequest\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\"\x14\n\x12\x44\x65leteNodeResponse\"J\n\x13PullMessagesRequest\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\x12\x13\n\x0bmessage_ids\x18\x02 \x03(\t\"\xa2\x01\n\x14PullMessagesResponse\x12(\n\treconnect\x18\x01 \x01(\x0b\x32\x15.flwr.proto.Reconnect\x12*\n\rmessages_list\x18\x02 \x03(\x0b\x32\x13.flwr.proto.Message\x12\x34\n\x14message_object_trees\x18\x03 \x03(\x0b\x32\x16.flwr.proto.ObjectTree\"\x97\x01\n\x13PushMessagesRequest\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\x12*\n\rmessages_list\x18\x02 \x03(\x0b\x32\x13.flwr.proto.Message\x12\x34\n\x14message_object_trees\x18\x03 \x03(\x0b\x32\x16.flwr.proto.ObjectTree\"\xcb\x02\n\x14PushMessagesResponse\x12(\n\treconnect\x18\x01 \x01(\x0b\x32\x15.flwr.proto.Reconnect\x12>\n\x07results\x18\x02 \x03(\x0b\x32-.flwr.proto.PushMessagesResponse.ResultsEntry\x12L\n\x0fobjects_to_push\x18\x03 \x03(\x0b\x32\x33.flwr.proto.PushMessagesResponse.ObjectsToPushEntry\x1a.\n\x0cResultsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\r:\x02\x38\x01\x1aK\n\x12ObjectsToPushEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12$\n\x05value\x18\x02 \x01(\x0b\x32\x15.flwr.proto.ObjectIDs:\x02\x38\x01\"\x1e\n\tReconnect\x12\x11\n\treconnect\x18\x01 \x01(\x04\x32\xca\x06\n\x05\x46leet\x12M\n\nCreateNode\x12\x1d.flwr.proto.CreateNodeRequest\x1a\x1e.flwr.proto.CreateNodeResponse\"\x00\x12M\n\nDeleteNode\x12\x1d.flwr.proto.DeleteNodeRequest\x1a\x1e.flwr.proto.DeleteNodeResponse\"\x00\x12\x62\n\x11SendNodeHeartbeat\x12$.flwr.proto.SendNodeHeartbeatRequest\x1a%.flwr.proto.SendNodeHeartbeatResponse\"\x00\x12S\n\x0cPullMessages\x12\x1f.flwr.proto.PullMessagesRequest\x1a .flwr.proto.PullMessagesResponse\"\x00\x12S\n\x0cPushMessages\x12\x1f.flwr.proto.PushMessagesRequest\x1a .flwr.proto.PushMessagesResponse\"\x00\x12\x41\n\x06GetRun\x12\x19.flwr.proto.GetRunRequest\x1a\x1a.flwr.proto.GetRunResponse\"\x00\x12\x41\n\x06GetFab\x12\x19.flwr.proto.GetFabRequest\x1a\x1a.flwr.proto.GetFabResponse\"\x00\x12M\n\nPushObject\x12\x1d.flwr.proto.PushObjectRequest\x1a\x1e.flwr.proto.PushObjectResponse\"\x00\x12M\n\nPullObject\x12\x1d.flwr.proto.PullObjectRequest\x1a\x1e.flwr.proto.PullObjectResponse\"\x00\x12q\n\x16\x43onfirmMessageReceived\x12).flwr.proto.ConfirmMessageReceivedRequest\x1a*.flwr.proto.ConfirmMessageReceivedResponse\"\x00\x62\x06proto3')
23
+
24
+ _globals = globals()
25
+ _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
26
+ _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'flwr.proto.fleet_pb2', _globals)
27
+ if _descriptor._USE_C_DESCRIPTORS == False:
28
+ DESCRIPTOR._options = None
29
+ _globals['_PUSHMESSAGESRESPONSE_RESULTSENTRY']._options = None
30
+ _globals['_PUSHMESSAGESRESPONSE_RESULTSENTRY']._serialized_options = b'8\001'
31
+ _globals['_PUSHMESSAGESRESPONSE_OBJECTSTOPUSHENTRY']._options = None
32
+ _globals['_PUSHMESSAGESRESPONSE_OBJECTSTOPUSHENTRY']._serialized_options = b'8\001'
33
+ _globals['_CREATENODEREQUEST']._serialized_start=159
34
+ _globals['_CREATENODEREQUEST']._serialized_end=206
35
+ _globals['_CREATENODERESPONSE']._serialized_start=208
36
+ _globals['_CREATENODERESPONSE']._serialized_end=260
37
+ _globals['_DELETENODEREQUEST']._serialized_start=262
38
+ _globals['_DELETENODEREQUEST']._serialized_end=313
39
+ _globals['_DELETENODERESPONSE']._serialized_start=315
40
+ _globals['_DELETENODERESPONSE']._serialized_end=335
41
+ _globals['_PULLMESSAGESREQUEST']._serialized_start=337
42
+ _globals['_PULLMESSAGESREQUEST']._serialized_end=411
43
+ _globals['_PULLMESSAGESRESPONSE']._serialized_start=414
44
+ _globals['_PULLMESSAGESRESPONSE']._serialized_end=576
45
+ _globals['_PUSHMESSAGESREQUEST']._serialized_start=579
46
+ _globals['_PUSHMESSAGESREQUEST']._serialized_end=730
47
+ _globals['_PUSHMESSAGESRESPONSE']._serialized_start=733
48
+ _globals['_PUSHMESSAGESRESPONSE']._serialized_end=1064
49
+ _globals['_PUSHMESSAGESRESPONSE_RESULTSENTRY']._serialized_start=941
50
+ _globals['_PUSHMESSAGESRESPONSE_RESULTSENTRY']._serialized_end=987
51
+ _globals['_PUSHMESSAGESRESPONSE_OBJECTSTOPUSHENTRY']._serialized_start=989
52
+ _globals['_PUSHMESSAGESRESPONSE_OBJECTSTOPUSHENTRY']._serialized_end=1064
53
+ _globals['_RECONNECT']._serialized_start=1066
54
+ _globals['_RECONNECT']._serialized_end=1096
55
+ _globals['_FLEET']._serialized_start=1099
56
+ _globals['_FLEET']._serialized_end=1941
57
+ # @@protoc_insertion_point(module_scope)
@@ -78,38 +78,23 @@ global___PullMessagesRequest = PullMessagesRequest
78
78
 
79
79
  class PullMessagesResponse(google.protobuf.message.Message):
80
80
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
81
- class ObjectsToPullEntry(google.protobuf.message.Message):
82
- DESCRIPTOR: google.protobuf.descriptor.Descriptor
83
- KEY_FIELD_NUMBER: builtins.int
84
- VALUE_FIELD_NUMBER: builtins.int
85
- key: typing.Text
86
- @property
87
- def value(self) -> flwr.proto.message_pb2.ObjectIDs: ...
88
- def __init__(self,
89
- *,
90
- key: typing.Text = ...,
91
- value: typing.Optional[flwr.proto.message_pb2.ObjectIDs] = ...,
92
- ) -> None: ...
93
- def HasField(self, field_name: typing_extensions.Literal["value",b"value"]) -> builtins.bool: ...
94
- def ClearField(self, field_name: typing_extensions.Literal["key",b"key","value",b"value"]) -> None: ...
95
-
96
81
  RECONNECT_FIELD_NUMBER: builtins.int
97
82
  MESSAGES_LIST_FIELD_NUMBER: builtins.int
98
- OBJECTS_TO_PULL_FIELD_NUMBER: builtins.int
83
+ MESSAGE_OBJECT_TREES_FIELD_NUMBER: builtins.int
99
84
  @property
100
85
  def reconnect(self) -> global___Reconnect: ...
101
86
  @property
102
87
  def messages_list(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[flwr.proto.message_pb2.Message]: ...
103
88
  @property
104
- def objects_to_pull(self) -> google.protobuf.internal.containers.MessageMap[typing.Text, flwr.proto.message_pb2.ObjectIDs]: ...
89
+ def message_object_trees(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[flwr.proto.message_pb2.ObjectTree]: ...
105
90
  def __init__(self,
106
91
  *,
107
92
  reconnect: typing.Optional[global___Reconnect] = ...,
108
93
  messages_list: typing.Optional[typing.Iterable[flwr.proto.message_pb2.Message]] = ...,
109
- objects_to_pull: typing.Optional[typing.Mapping[typing.Text, flwr.proto.message_pb2.ObjectIDs]] = ...,
94
+ message_object_trees: typing.Optional[typing.Iterable[flwr.proto.message_pb2.ObjectTree]] = ...,
110
95
  ) -> None: ...
111
96
  def HasField(self, field_name: typing_extensions.Literal["reconnect",b"reconnect"]) -> builtins.bool: ...
112
- def ClearField(self, field_name: typing_extensions.Literal["messages_list",b"messages_list","objects_to_pull",b"objects_to_pull","reconnect",b"reconnect"]) -> None: ...
97
+ def ClearField(self, field_name: typing_extensions.Literal["message_object_trees",b"message_object_trees","messages_list",b"messages_list","reconnect",b"reconnect"]) -> None: ...
113
98
  global___PullMessagesResponse = PullMessagesResponse
114
99
 
115
100
  class PushMessagesRequest(google.protobuf.message.Message):
@@ -33,9 +33,9 @@ from flwr.common.inflatable import (
33
33
  get_object_tree,
34
34
  no_object_id_recompute,
35
35
  )
36
- from flwr.common.inflatable_grpc_utils import (
37
- make_pull_object_fn_grpc,
38
- make_push_object_fn_grpc,
36
+ from flwr.common.inflatable_protobuf_utils import (
37
+ make_pull_object_fn_protobuf,
38
+ make_push_object_fn_protobuf,
39
39
  )
40
40
  from flwr.common.inflatable_utils import (
41
41
  inflate_object_from_contents,
@@ -240,8 +240,8 @@ class GrpcGrid(Grid):
240
240
  # Push only object that are not in the store
241
241
  push_objects(
242
242
  all_objects,
243
- push_object_fn=make_push_object_fn_grpc(
244
- push_object_grpc=self._stub.PushObject,
243
+ push_object_fn=make_push_object_fn_protobuf(
244
+ push_object_protobuf=self._stub.PushObject,
245
245
  node=self.node,
246
246
  run_id=run_id,
247
247
  ),
@@ -308,8 +308,8 @@ class GrpcGrid(Grid):
308
308
  msg_id = msg_proto.metadata.message_id
309
309
  all_object_contents = pull_objects(
310
310
  list(res.objects_to_pull[msg_id].object_ids) + [msg_id],
311
- pull_object_fn=make_pull_object_fn_grpc(
312
- pull_object_grpc=self._stub.PullObject,
311
+ pull_object_fn=make_pull_object_fn_protobuf(
312
+ pull_object_protobuf=self._stub.PullObject,
313
313
  node=self.node,
314
314
  run_id=run_id,
315
315
  ),
@@ -46,7 +46,6 @@ from flwr.proto.heartbeat_pb2 import ( # pylint: disable=E0611
46
46
  from flwr.proto.message_pb2 import ( # pylint: disable=E0611
47
47
  ConfirmMessageReceivedRequest,
48
48
  ConfirmMessageReceivedResponse,
49
- ObjectIDs,
50
49
  PullObjectRequest,
51
50
  PullObjectResponse,
52
51
  PushObjectRequest,
@@ -113,25 +112,22 @@ def pull_messages(
113
112
 
114
113
  # Convert to Messages
115
114
  msg_proto = []
116
- objects_to_pull: dict[str, ObjectIDs] = {}
115
+ trees = []
117
116
  for msg in message_list:
118
117
  try:
119
- msg_proto.append(message_to_proto(msg))
120
-
118
+ # Retrieve Message object tree from ObjectStore
121
119
  msg_object_id = msg.metadata.message_id
122
- descendants = store.get_message_descendant_ids(msg_object_id)
123
- # Include the object_id of the message itself
124
- objects_to_pull[msg_object_id] = ObjectIDs(
125
- object_ids=descendants + [msg_object_id]
126
- )
120
+ obj_tree = store.get_object_tree(msg_object_id)
121
+
122
+ # Add Message and its object tree to the response
123
+ msg_proto.append(message_to_proto(msg))
124
+ trees.append(obj_tree)
127
125
  except NoObjectInStoreError as e:
128
126
  log(ERROR, e.message)
129
127
  # Delete message ins from state
130
128
  state.delete_messages(message_ins_ids={msg_object_id})
131
129
 
132
- return PullMessagesResponse(
133
- messages_list=msg_proto, objects_to_pull=objects_to_pull
134
- )
130
+ return PullMessagesResponse(messages_list=msg_proto, message_object_trees=trees)
135
131
 
136
132
 
137
133
  def push_messages(
@@ -287,6 +283,5 @@ def confirm_message_received(
287
283
 
288
284
  # Delete the message object
289
285
  store.delete(request.message_object_id)
290
- store.delete_message_descendant_ids(request.message_object_id)
291
286
 
292
287
  return ConfirmMessageReceivedResponse()
@@ -27,6 +27,7 @@ from flwr.common.inflatable import (
27
27
  UnexpectedObjectContentError,
28
28
  get_all_nested_objects,
29
29
  get_object_tree,
30
+ iterate_object_tree,
30
31
  no_object_id_recompute,
31
32
  )
32
33
  from flwr.common.logger import log
@@ -211,12 +212,6 @@ class ServerAppIoServicer(serverappio_pb2_grpc.ServerAppIoServicer):
211
212
  if msg_res.metadata.src_node_id == SUPERLINK_NODE_ID:
212
213
  with no_object_id_recompute():
213
214
  all_objects = get_all_nested_objects(msg_res)
214
- descendants = list(all_objects.keys())[:-1]
215
- message_obj_id = msg_res.metadata.message_id
216
- # Store mapping
217
- store.set_message_descendant_ids(
218
- msg_object_id=message_obj_id, descendant_ids=descendants
219
- )
220
215
  # Preregister
221
216
  store.preregister(request.run_id, get_object_tree(msg_res))
222
217
  # Store objects
@@ -247,7 +242,9 @@ class ServerAppIoServicer(serverappio_pb2_grpc.ServerAppIoServicer):
247
242
 
248
243
  try:
249
244
  msg_object_id = msg.metadata.message_id
250
- descendants = store.get_message_descendant_ids(msg_object_id)
245
+ obj_tree = store.get_object_tree(msg_object_id)
246
+ descendants = [node.object_id for node in iterate_object_tree(obj_tree)]
247
+ descendants = descendants[:-1] # Exclude the message itself
251
248
  # Add mapping of message object ID to its descendants
252
249
  objects_to_pull[msg_object_id] = ObjectIDs(object_ids=descendants)
253
250
  except NoObjectInStoreError as e:
@@ -513,7 +510,6 @@ class ServerAppIoServicer(serverappio_pb2_grpc.ServerAppIoServicer):
513
510
 
514
511
  # Delete the message object
515
512
  store.delete(request.message_object_id)
516
- store.delete_message_descendant_ids(request.message_object_id)
517
513
 
518
514
  return ConfirmMessageReceivedResponse()
519
515
 
@@ -20,7 +20,6 @@ from typing import Optional, Union
20
20
  import grpc
21
21
 
22
22
  from flwr.common.constant import Status, SubStatus
23
- from flwr.common.inflatable import iterate_object_tree
24
23
  from flwr.common.typing import RunStatus
25
24
  from flwr.proto.appio_pb2 import PushAppMessagesRequest # pylint: disable=E0611
26
25
  from flwr.proto.fleet_pb2 import PushMessagesRequest # pylint: disable=E0611
@@ -90,17 +89,10 @@ def store_mapping_and_register_objects(
90
89
  run_id = request.messages_list[0].metadata.run_id
91
90
 
92
91
  for object_tree in request.message_object_trees:
93
- all_object_ids = [obj.object_id for obj in iterate_object_tree(object_tree)]
94
- msg_object_id, descendant_ids = all_object_ids[-1], all_object_ids[:-1]
95
- # Store mapping
96
- store.set_message_descendant_ids(
97
- msg_object_id=msg_object_id, descendant_ids=descendant_ids
98
- )
99
-
100
92
  # Preregister
101
93
  object_ids_just_registered = store.preregister(run_id, object_tree)
102
94
  # Keep track of objects that need to be pushed
103
- objects_to_push[msg_object_id] = ObjectIDs(
95
+ objects_to_push[object_tree.object_id] = ObjectIDs(
104
96
  object_ids=object_ids_just_registered
105
97
  )
106
98
 
@@ -0,0 +1,22 @@
1
+ # Copyright 2025 Flower Labs GmbH. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ # ==============================================================================
15
+ """GRPC health servicers."""
16
+
17
+
18
+ from .simple_health_servicer import SimpleHealthServicer
19
+
20
+ __all__ = [
21
+ "SimpleHealthServicer",
22
+ ]
@@ -0,0 +1,38 @@
1
+ # Copyright 2025 Flower Labs GmbH. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ # ==============================================================================
15
+ """Simple gRPC health servicers."""
16
+
17
+
18
+ import grpc
19
+
20
+ # pylint: disable=E0611
21
+ from grpc_health.v1.health_pb2 import HealthCheckRequest, HealthCheckResponse
22
+ from grpc_health.v1.health_pb2_grpc import HealthServicer
23
+
24
+ # pylint: enable=E0611
25
+
26
+
27
+ class SimpleHealthServicer(HealthServicer): # type: ignore
28
+ """A simple gRPC health servicer that always returns SERVING."""
29
+
30
+ def Check(
31
+ self, request: HealthCheckRequest, context: grpc.RpcContext
32
+ ) -> HealthCheckResponse:
33
+ """Return a HealthCheckResponse with SERVING status."""
34
+ return HealthCheckResponse(status=HealthCheckResponse.SERVING)
35
+
36
+ def Watch(self, request: HealthCheckRequest, context: grpc.RpcContext) -> None:
37
+ """Watch the health status (not implemented)."""
38
+ context.abort(grpc.StatusCode.UNIMPLEMENTED, "Watch is not implemented")
@@ -20,7 +20,6 @@ from dataclasses import dataclass
20
20
  from typing import Optional
21
21
 
22
22
  from flwr.common.inflatable import (
23
- get_object_children_ids_from_object_content,
24
23
  get_object_id,
25
24
  is_valid_sha256_hash,
26
25
  iterate_object_tree,
@@ -37,6 +36,7 @@ class ObjectEntry:
37
36
 
38
37
  content: bytes
39
38
  is_available: bool
39
+ child_object_ids: list[str] # List of child object IDs
40
40
  ref_count: int # Number of references (direct parents) to this object
41
41
  runs: set[int] # Set of run IDs that used this object
42
42
 
@@ -70,6 +70,9 @@ class InMemoryObjectStore(ObjectStore):
70
70
  self.store[obj_id] = ObjectEntry(
71
71
  content=b"", # Initially empty content
72
72
  is_available=False, # Initially not available
73
+ child_object_ids=[ # List of child object IDs
74
+ child.object_id for child in tree_node.children
75
+ ],
73
76
  ref_count=0, # Reference count starts at 0
74
77
  runs={run_id}, # Start with the current run ID
75
78
  )
@@ -102,6 +105,32 @@ class InMemoryObjectStore(ObjectStore):
102
105
 
103
106
  return new_objects
104
107
 
108
+ def get_object_tree(self, object_id: str) -> ObjectTree:
109
+ """Get the object tree for a given object ID."""
110
+ with self.lock_store:
111
+ # Raise an exception if there's no object with the given ID
112
+ if not (object_entry := self.store.get(object_id)):
113
+ raise NoObjectInStoreError(
114
+ f"Object with ID '{object_id}' was not pre-registered."
115
+ )
116
+
117
+ # Build the object trees of all children
118
+ try:
119
+ child_trees = [
120
+ self.get_object_tree(child_id)
121
+ for child_id in object_entry.child_object_ids
122
+ ]
123
+ except NoObjectInStoreError as e:
124
+ # Raise an error if any child object is missing
125
+ # This indicates an integrity issue
126
+ raise NoObjectInStoreError(
127
+ f"Object tree for object ID '{object_id}' contains missing "
128
+ "children. This may indicate a corrupted object store."
129
+ ) from e
130
+
131
+ # Create and return the ObjectTree for the current object
132
+ return ObjectTree(object_id=object_id, children=child_trees)
133
+
105
134
  def put(self, object_id: str, object_content: bytes) -> None:
106
135
  """Put an object into the store."""
107
136
  if self.verify:
@@ -128,29 +157,6 @@ class InMemoryObjectStore(ObjectStore):
128
157
  self.store[object_id].content = object_content
129
158
  self.store[object_id].is_available = True
130
159
 
131
- def set_message_descendant_ids(
132
- self, msg_object_id: str, descendant_ids: list[str]
133
- ) -> None:
134
- """Store the mapping from a ``Message`` object ID to the object IDs of its
135
- descendants."""
136
- with self.lock_msg_mapping:
137
- self.msg_descendant_objects_mapping[msg_object_id] = descendant_ids
138
-
139
- def get_message_descendant_ids(self, msg_object_id: str) -> list[str]:
140
- """Retrieve the object IDs of all descendants of a given Message."""
141
- with self.lock_msg_mapping:
142
- if msg_object_id not in self.msg_descendant_objects_mapping:
143
- raise NoObjectInStoreError(
144
- f"No message registered in Object Store with ID '{msg_object_id}'. "
145
- "Mapping to descendants could not be found."
146
- )
147
- return self.msg_descendant_objects_mapping[msg_object_id]
148
-
149
- def delete_message_descendant_ids(self, msg_object_id: str) -> None:
150
- """Delete the mapping from a ``Message`` object ID to its descendants."""
151
- with self.lock_msg_mapping:
152
- self.msg_descendant_objects_mapping.pop(msg_object_id, None)
153
-
154
160
  def get(self, object_id: str) -> Optional[bytes]:
155
161
  """Get an object from the store."""
156
162
  with self.lock_store:
@@ -177,10 +183,7 @@ class InMemoryObjectStore(ObjectStore):
177
183
  self.run_objects_mapping[run_id].discard(object_id)
178
184
 
179
185
  # Decrease the reference count of its children
180
- children_ids = get_object_children_ids_from_object_content(
181
- object_entry.content
182
- )
183
- for child_id in children_ids:
186
+ for child_id in object_entry.child_object_ids:
184
187
  self.store[child_id].ref_count -= 1
185
188
 
186
189
  # Recursively try to delete the child object
@@ -205,9 +208,6 @@ class InMemoryObjectStore(ObjectStore):
205
208
  # Delete the message object and its unreferenced descendants
206
209
  self.delete(object_id)
207
210
 
208
- # Delete the message's descendants mapping
209
- self.delete_message_descendant_ids(object_id)
210
-
211
211
  # Remove the run from the mapping
212
212
  del self.run_objects_mapping[run_id]
213
213