flwr-nightly 1.19.0.dev20250603__tar.gz → 1.19.0.dev20250605__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 (362) hide show
  1. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/PKG-INFO +1 -1
  2. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/client/grpc_rere_client/connection.py +49 -8
  3. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/common/inflatable_grpc_utils.py +9 -4
  4. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/common/message.py +11 -0
  5. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/compat/app_utils.py +50 -28
  6. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/grid/grpc_grid.py +76 -34
  7. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/superlink/ffs/__init__.py +2 -0
  8. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/supernode/cli/flwr_clientapp.py +8 -0
  9. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/supernode/runtime/run_clientapp.py +22 -1
  10. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/supernode/start_client_internal.py +90 -114
  11. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/pyproject.toml +1 -1
  12. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/README.md +0 -0
  13. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/__init__.py +0 -0
  14. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/app/__init__.py +0 -0
  15. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/app/error.py +0 -0
  16. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/app/metadata.py +0 -0
  17. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/cli/__init__.py +0 -0
  18. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/cli/app.py +0 -0
  19. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/cli/auth_plugin/__init__.py +0 -0
  20. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/cli/auth_plugin/oidc_cli_plugin.py +0 -0
  21. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/cli/build.py +0 -0
  22. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/cli/cli_user_auth_interceptor.py +0 -0
  23. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/cli/config_utils.py +0 -0
  24. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/cli/constant.py +0 -0
  25. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/cli/example.py +0 -0
  26. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/cli/install.py +0 -0
  27. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/cli/log.py +0 -0
  28. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/cli/login/__init__.py +0 -0
  29. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/cli/login/login.py +0 -0
  30. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/cli/ls.py +0 -0
  31. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/cli/new/__init__.py +0 -0
  32. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/cli/new/new.py +0 -0
  33. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/cli/new/templates/__init__.py +0 -0
  34. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/cli/new/templates/app/.gitignore.tpl +0 -0
  35. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/cli/new/templates/app/LICENSE.tpl +0 -0
  36. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/cli/new/templates/app/README.baseline.md.tpl +0 -0
  37. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/cli/new/templates/app/README.flowertune.md.tpl +0 -0
  38. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/cli/new/templates/app/README.md.tpl +0 -0
  39. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/cli/new/templates/app/__init__.py +0 -0
  40. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/cli/new/templates/app/code/__init__.baseline.py.tpl +0 -0
  41. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
  42. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
  43. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/cli/new/templates/app/code/client.baseline.py.tpl +0 -0
  44. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/cli/new/templates/app/code/client.huggingface.py.tpl +0 -0
  45. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/cli/new/templates/app/code/client.jax.py.tpl +0 -0
  46. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/cli/new/templates/app/code/client.mlx.py.tpl +0 -0
  47. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/cli/new/templates/app/code/client.numpy.py.tpl +0 -0
  48. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -0
  49. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl +0 -0
  50. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -0
  51. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/cli/new/templates/app/code/dataset.baseline.py.tpl +0 -0
  52. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/cli/new/templates/app/code/flwr_tune/__init__.py +0 -0
  53. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/cli/new/templates/app/code/flwr_tune/client_app.py.tpl +0 -0
  54. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/cli/new/templates/app/code/flwr_tune/dataset.py.tpl +0 -0
  55. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/cli/new/templates/app/code/flwr_tune/models.py.tpl +0 -0
  56. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/cli/new/templates/app/code/flwr_tune/server_app.py.tpl +0 -0
  57. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/cli/new/templates/app/code/flwr_tune/strategy.py.tpl +0 -0
  58. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/cli/new/templates/app/code/model.baseline.py.tpl +0 -0
  59. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/cli/new/templates/app/code/server.baseline.py.tpl +0 -0
  60. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/cli/new/templates/app/code/server.huggingface.py.tpl +0 -0
  61. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/cli/new/templates/app/code/server.jax.py.tpl +0 -0
  62. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/cli/new/templates/app/code/server.mlx.py.tpl +0 -0
  63. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -0
  64. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -0
  65. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/cli/new/templates/app/code/server.sklearn.py.tpl +0 -0
  66. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -0
  67. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/cli/new/templates/app/code/strategy.baseline.py.tpl +0 -0
  68. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/cli/new/templates/app/code/task.huggingface.py.tpl +0 -0
  69. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/cli/new/templates/app/code/task.jax.py.tpl +0 -0
  70. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/cli/new/templates/app/code/task.mlx.py.tpl +0 -0
  71. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/cli/new/templates/app/code/task.numpy.py.tpl +0 -0
  72. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +0 -0
  73. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/cli/new/templates/app/code/task.sklearn.py.tpl +0 -0
  74. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/cli/new/templates/app/code/task.tensorflow.py.tpl +0 -0
  75. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/cli/new/templates/app/code/utils.baseline.py.tpl +0 -0
  76. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/cli/new/templates/app/pyproject.baseline.toml.tpl +0 -0
  77. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +0 -0
  78. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl +0 -0
  79. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/cli/new/templates/app/pyproject.jax.toml.tpl +0 -0
  80. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +0 -0
  81. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +0 -0
  82. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +0 -0
  83. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +0 -0
  84. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +0 -0
  85. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/cli/run/__init__.py +0 -0
  86. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/cli/run/run.py +0 -0
  87. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/cli/stop.py +0 -0
  88. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/cli/utils.py +0 -0
  89. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/client/__init__.py +0 -0
  90. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/client/client.py +0 -0
  91. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/client/client_app.py +0 -0
  92. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/client/clientapp/__init__.py +0 -0
  93. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/client/clientapp/utils.py +0 -0
  94. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/client/dpfedavg_numpy_client.py +0 -0
  95. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/client/grpc_adapter_client/__init__.py +0 -0
  96. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/client/grpc_adapter_client/connection.py +0 -0
  97. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/client/grpc_rere_client/__init__.py +0 -0
  98. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/client/grpc_rere_client/client_interceptor.py +0 -0
  99. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/client/grpc_rere_client/grpc_adapter.py +0 -0
  100. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/client/message_handler/__init__.py +0 -0
  101. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/client/message_handler/message_handler.py +0 -0
  102. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/client/mod/__init__.py +0 -0
  103. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/client/mod/centraldp_mods.py +0 -0
  104. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/client/mod/comms_mods.py +0 -0
  105. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/client/mod/localdp_mod.py +0 -0
  106. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
  107. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
  108. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
  109. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/client/mod/utils.py +0 -0
  110. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/client/numpy_client.py +0 -0
  111. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/client/rest_client/__init__.py +0 -0
  112. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/client/rest_client/connection.py +0 -0
  113. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/client/run_info_store.py +0 -0
  114. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/client/typing.py +0 -0
  115. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/clientapp/__init__.py +0 -0
  116. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/common/__init__.py +0 -0
  117. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/common/address.py +0 -0
  118. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/common/args.py +0 -0
  119. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/common/auth_plugin/__init__.py +0 -0
  120. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/common/auth_plugin/auth_plugin.py +0 -0
  121. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/common/config.py +0 -0
  122. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/common/constant.py +0 -0
  123. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/common/context.py +0 -0
  124. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/common/date.py +0 -0
  125. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/common/differential_privacy.py +0 -0
  126. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/common/differential_privacy_constants.py +0 -0
  127. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/common/dp.py +0 -0
  128. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/common/event_log_plugin/__init__.py +0 -0
  129. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/common/event_log_plugin/event_log_plugin.py +0 -0
  130. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/common/exit/__init__.py +0 -0
  131. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/common/exit/exit.py +0 -0
  132. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/common/exit/exit_code.py +0 -0
  133. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/common/exit_handlers.py +0 -0
  134. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/common/grpc.py +0 -0
  135. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/common/heartbeat.py +0 -0
  136. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/common/inflatable.py +0 -0
  137. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/common/logger.py +0 -0
  138. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/common/object_ref.py +0 -0
  139. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/common/parameter.py +0 -0
  140. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/common/pyproject.py +0 -0
  141. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/common/record/__init__.py +0 -0
  142. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/common/record/array.py +0 -0
  143. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/common/record/arrayrecord.py +0 -0
  144. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/common/record/configrecord.py +0 -0
  145. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/common/record/conversion_utils.py +0 -0
  146. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/common/record/metricrecord.py +0 -0
  147. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/common/record/recorddict.py +0 -0
  148. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/common/record/typeddict.py +0 -0
  149. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/common/recorddict_compat.py +0 -0
  150. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/common/retry_invoker.py +0 -0
  151. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/common/secure_aggregation/__init__.py +0 -0
  152. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
  153. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
  154. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -0
  155. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
  156. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/common/secure_aggregation/quantization.py +0 -0
  157. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
  158. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
  159. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/common/serde.py +0 -0
  160. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/common/serde_utils.py +0 -0
  161. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/common/telemetry.py +0 -0
  162. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/common/typing.py +0 -0
  163. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/common/version.py +0 -0
  164. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/compat/__init__.py +0 -0
  165. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/compat/client/__init__.py +0 -0
  166. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/compat/client/app.py +0 -0
  167. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/compat/client/grpc_client/__init__.py +0 -0
  168. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/compat/client/grpc_client/connection.py +0 -0
  169. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/compat/common/__init__.py +0 -0
  170. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/compat/server/__init__.py +0 -0
  171. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/compat/server/app.py +0 -0
  172. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/compat/simulation/__init__.py +0 -0
  173. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/proto/__init__.py +0 -0
  174. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/proto/clientappio_pb2.py +0 -0
  175. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/proto/clientappio_pb2.pyi +0 -0
  176. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/proto/clientappio_pb2_grpc.py +0 -0
  177. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/proto/clientappio_pb2_grpc.pyi +0 -0
  178. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/proto/error_pb2.py +0 -0
  179. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/proto/error_pb2.pyi +0 -0
  180. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/proto/error_pb2_grpc.py +0 -0
  181. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/proto/error_pb2_grpc.pyi +0 -0
  182. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/proto/exec_pb2.py +0 -0
  183. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/proto/exec_pb2.pyi +0 -0
  184. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/proto/exec_pb2_grpc.py +0 -0
  185. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/proto/exec_pb2_grpc.pyi +0 -0
  186. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/proto/fab_pb2.py +0 -0
  187. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/proto/fab_pb2.pyi +0 -0
  188. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/proto/fab_pb2_grpc.py +0 -0
  189. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/proto/fab_pb2_grpc.pyi +0 -0
  190. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/proto/fleet_pb2.py +0 -0
  191. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/proto/fleet_pb2.pyi +0 -0
  192. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/proto/fleet_pb2_grpc.py +0 -0
  193. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
  194. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/proto/grpcadapter_pb2.py +0 -0
  195. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/proto/grpcadapter_pb2.pyi +0 -0
  196. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/proto/grpcadapter_pb2_grpc.py +0 -0
  197. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/proto/grpcadapter_pb2_grpc.pyi +0 -0
  198. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/proto/heartbeat_pb2.py +0 -0
  199. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/proto/heartbeat_pb2.pyi +0 -0
  200. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/proto/heartbeat_pb2_grpc.py +0 -0
  201. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/proto/heartbeat_pb2_grpc.pyi +0 -0
  202. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/proto/log_pb2.py +0 -0
  203. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/proto/log_pb2.pyi +0 -0
  204. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/proto/log_pb2_grpc.py +0 -0
  205. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/proto/log_pb2_grpc.pyi +0 -0
  206. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/proto/message_pb2.py +0 -0
  207. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/proto/message_pb2.pyi +0 -0
  208. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/proto/message_pb2_grpc.py +0 -0
  209. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/proto/message_pb2_grpc.pyi +0 -0
  210. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/proto/node_pb2.py +0 -0
  211. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/proto/node_pb2.pyi +0 -0
  212. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/proto/node_pb2_grpc.py +0 -0
  213. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/proto/node_pb2_grpc.pyi +0 -0
  214. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/proto/recorddict_pb2.py +0 -0
  215. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/proto/recorddict_pb2.pyi +0 -0
  216. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/proto/recorddict_pb2_grpc.py +0 -0
  217. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/proto/recorddict_pb2_grpc.pyi +0 -0
  218. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/proto/run_pb2.py +0 -0
  219. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/proto/run_pb2.pyi +0 -0
  220. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/proto/run_pb2_grpc.py +0 -0
  221. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/proto/run_pb2_grpc.pyi +0 -0
  222. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/proto/serverappio_pb2.py +0 -0
  223. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/proto/serverappio_pb2.pyi +0 -0
  224. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/proto/serverappio_pb2_grpc.py +0 -0
  225. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/proto/serverappio_pb2_grpc.pyi +0 -0
  226. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/proto/simulationio_pb2.py +0 -0
  227. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/proto/simulationio_pb2.pyi +0 -0
  228. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/proto/simulationio_pb2_grpc.py +0 -0
  229. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/proto/simulationio_pb2_grpc.pyi +0 -0
  230. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/proto/transport_pb2.py +0 -0
  231. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/proto/transport_pb2.pyi +0 -0
  232. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/proto/transport_pb2_grpc.py +0 -0
  233. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
  234. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/py.typed +0 -0
  235. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/__init__.py +0 -0
  236. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/app.py +0 -0
  237. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/client_manager.py +0 -0
  238. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/client_proxy.py +0 -0
  239. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/compat/__init__.py +0 -0
  240. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/compat/app.py +0 -0
  241. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/compat/grid_client_proxy.py +0 -0
  242. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/compat/legacy_context.py +0 -0
  243. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/criterion.py +0 -0
  244. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/fleet_event_log_interceptor.py +0 -0
  245. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/grid/__init__.py +0 -0
  246. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/grid/grid.py +0 -0
  247. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/grid/inmemory_grid.py +0 -0
  248. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/history.py +0 -0
  249. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/run_serverapp.py +0 -0
  250. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/server.py +0 -0
  251. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/server_app.py +0 -0
  252. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/server_config.py +0 -0
  253. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/serverapp/__init__.py +0 -0
  254. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/serverapp/app.py +0 -0
  255. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/serverapp_components.py +0 -0
  256. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/strategy/__init__.py +0 -0
  257. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/strategy/aggregate.py +0 -0
  258. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/strategy/bulyan.py +0 -0
  259. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
  260. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
  261. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
  262. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
  263. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
  264. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/strategy/fedadagrad.py +0 -0
  265. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/strategy/fedadam.py +0 -0
  266. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/strategy/fedavg.py +0 -0
  267. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/strategy/fedavg_android.py +0 -0
  268. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/strategy/fedavgm.py +0 -0
  269. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/strategy/fedmedian.py +0 -0
  270. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/strategy/fedopt.py +0 -0
  271. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/strategy/fedprox.py +0 -0
  272. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
  273. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
  274. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
  275. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
  276. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/strategy/fedyogi.py +0 -0
  277. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/strategy/krum.py +0 -0
  278. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/strategy/qfedavg.py +0 -0
  279. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/strategy/strategy.py +0 -0
  280. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/superlink/__init__.py +0 -0
  281. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/superlink/ffs/disk_ffs.py +0 -0
  282. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/superlink/ffs/ffs.py +0 -0
  283. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/superlink/ffs/ffs_factory.py +0 -0
  284. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/superlink/fleet/__init__.py +0 -0
  285. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/superlink/fleet/grpc_adapter/__init__.py +0 -0
  286. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +0 -0
  287. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
  288. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
  289. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
  290. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
  291. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +0 -0
  292. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
  293. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +0 -0
  294. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +0 -0
  295. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
  296. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/superlink/fleet/message_handler/message_handler.py +0 -0
  297. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
  298. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +0 -0
  299. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
  300. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
  301. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
  302. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +0 -0
  303. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/superlink/fleet/vce/vce_api.py +0 -0
  304. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/superlink/linkstate/__init__.py +0 -0
  305. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/superlink/linkstate/in_memory_linkstate.py +0 -0
  306. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/superlink/linkstate/linkstate.py +0 -0
  307. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/superlink/linkstate/linkstate_factory.py +0 -0
  308. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/superlink/linkstate/sqlite_linkstate.py +0 -0
  309. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/superlink/linkstate/utils.py +0 -0
  310. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/superlink/serverappio/__init__.py +0 -0
  311. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/superlink/serverappio/serverappio_grpc.py +0 -0
  312. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/superlink/serverappio/serverappio_servicer.py +0 -0
  313. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/superlink/simulation/__init__.py +0 -0
  314. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/superlink/simulation/simulationio_grpc.py +0 -0
  315. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/superlink/simulation/simulationio_servicer.py +0 -0
  316. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/superlink/utils.py +0 -0
  317. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/typing.py +0 -0
  318. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/utils/__init__.py +0 -0
  319. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/utils/tensorboard.py +0 -0
  320. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/utils/validator.py +0 -0
  321. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/workflow/__init__.py +0 -0
  322. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/workflow/constant.py +0 -0
  323. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/workflow/default_workflows.py +0 -0
  324. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
  325. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
  326. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +0 -0
  327. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/serverapp/__init__.py +0 -0
  328. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/simulation/__init__.py +0 -0
  329. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/simulation/app.py +0 -0
  330. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/simulation/legacy_app.py +0 -0
  331. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/simulation/ray_transport/__init__.py +0 -0
  332. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
  333. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
  334. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/simulation/ray_transport/utils.py +0 -0
  335. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/simulation/run_simulation.py +0 -0
  336. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/simulation/simulationio_connection.py +0 -0
  337. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/supercore/__init__.py +0 -0
  338. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/supercore/object_store/__init__.py +0 -0
  339. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/supercore/object_store/in_memory_object_store.py +0 -0
  340. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/supercore/object_store/object_store.py +0 -0
  341. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/supercore/object_store/object_store_factory.py +0 -0
  342. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/superexec/__init__.py +0 -0
  343. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/superexec/app.py +0 -0
  344. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/superexec/deployment.py +0 -0
  345. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/superexec/exec_event_log_interceptor.py +0 -0
  346. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/superexec/exec_grpc.py +0 -0
  347. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/superexec/exec_servicer.py +0 -0
  348. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/superexec/exec_user_auth_interceptor.py +0 -0
  349. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/superexec/executor.py +0 -0
  350. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/superexec/simulation.py +0 -0
  351. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/superlink/__init__.py +0 -0
  352. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/supernode/__init__.py +0 -0
  353. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/supernode/cli/__init__.py +0 -0
  354. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/supernode/cli/flower_supernode.py +0 -0
  355. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/supernode/nodestate/__init__.py +0 -0
  356. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/supernode/nodestate/in_memory_nodestate.py +0 -0
  357. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/supernode/nodestate/nodestate.py +0 -0
  358. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/supernode/nodestate/nodestate_factory.py +0 -0
  359. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/supernode/runtime/__init__.py +0 -0
  360. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/supernode/servicer/__init__.py +0 -0
  361. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/py/flwr/supernode/servicer/clientappio/__init__.py +0 -0
  362. {flwr_nightly-1.19.0.dev20250603 → flwr_nightly-1.19.0.dev20250605}/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.19.0.dev20250603
3
+ Version: 1.19.0.dev20250605
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
@@ -14,11 +14,10 @@
14
14
  # ==============================================================================
15
15
  """Contextmanager for a gRPC request-response channel to the Flower server."""
16
16
 
17
-
18
17
  from collections.abc import Iterator, Sequence
19
18
  from contextlib import contextmanager
20
19
  from copy import copy
21
- from logging import ERROR
20
+ from logging import DEBUG, ERROR
22
21
  from pathlib import Path
23
22
  from typing import Callable, Optional, Union, cast
24
23
 
@@ -31,13 +30,21 @@ from flwr.common import GRPC_MAX_MESSAGE_LENGTH
31
30
  from flwr.common.constant import HEARTBEAT_CALL_TIMEOUT, HEARTBEAT_DEFAULT_INTERVAL
32
31
  from flwr.common.grpc import create_channel, on_channel_state_change
33
32
  from flwr.common.heartbeat import HeartbeatSender
33
+ from flwr.common.inflatable_grpc_utils import (
34
+ pull_object_from_servicer,
35
+ push_object_to_servicer,
36
+ )
34
37
  from flwr.common.logger import log
35
- from flwr.common.message import Message
38
+ from flwr.common.message import (
39
+ Message,
40
+ get_message_to_descendant_id_mapping,
41
+ remove_content_from_message,
42
+ )
36
43
  from flwr.common.retry_invoker import RetryInvoker, _wrap_stub
37
44
  from flwr.common.secure_aggregation.crypto.symmetric_encryption import (
38
45
  generate_key_pairs,
39
46
  )
40
- from flwr.common.serde import message_from_proto, message_to_proto, run_from_proto
47
+ from flwr.common.serde import message_to_proto, run_from_proto
41
48
  from flwr.common.typing import Fab, Run, RunNotRunningException
42
49
  from flwr.proto.fab_pb2 import GetFabRequest, GetFabResponse # pylint: disable=E0611
43
50
  from flwr.proto.fleet_pb2 import ( # pylint: disable=E0611
@@ -46,6 +53,7 @@ from flwr.proto.fleet_pb2 import ( # pylint: disable=E0611
46
53
  PullMessagesRequest,
47
54
  PullMessagesResponse,
48
55
  PushMessagesRequest,
56
+ PushMessagesResponse,
49
57
  )
50
58
  from flwr.proto.fleet_pb2_grpc import FleetStub # pylint: disable=E0611
51
59
  from flwr.proto.heartbeat_pb2 import ( # pylint: disable=E0611
@@ -254,7 +262,24 @@ def grpc_request_response( # pylint: disable=R0913,R0914,R0915,R0917
254
262
  message_proto = None
255
263
 
256
264
  # Construct the Message
257
- in_message = message_from_proto(message_proto) if message_proto else None
265
+ in_message: Optional[Message] = None
266
+
267
+ if message_proto:
268
+ in_message = cast(
269
+ Message,
270
+ pull_object_from_servicer(
271
+ object_id=message_proto.metadata.message_id,
272
+ stub=stub,
273
+ node=node,
274
+ run_id=message_proto.metadata.run_id,
275
+ ),
276
+ )
277
+
278
+ if in_message:
279
+ # The deflated message doesn't contain the message_id (its own object_id)
280
+ # Inject
281
+ # pylint: disable-next=W0212
282
+ in_message.metadata._message_id = message_proto.metadata.message_id # type: ignore
258
283
 
259
284
  # Remember `metadata` of the in message
260
285
  nonlocal metadata
@@ -284,9 +309,25 @@ def grpc_request_response( # pylint: disable=R0913,R0914,R0915,R0917
284
309
  return
285
310
 
286
311
  # Serialize Message
287
- message_proto = message_to_proto(message=message)
288
- request = PushMessagesRequest(node=node, messages_list=[message_proto])
289
- _ = stub.PushMessages(request)
312
+ message_proto = message_to_proto(message=remove_content_from_message(message))
313
+ descendants_mapping = get_message_to_descendant_id_mapping(message)
314
+ request = PushMessagesRequest(
315
+ node=node,
316
+ messages_list=[message_proto],
317
+ msg_to_descendant_mapping=descendants_mapping,
318
+ )
319
+ response: PushMessagesResponse = stub.PushMessages(request=request)
320
+
321
+ if response.objects_to_push:
322
+ objs_to_push = set(response.objects_to_push[message.object_id].object_ids)
323
+ push_object_to_servicer(
324
+ message,
325
+ stub,
326
+ node,
327
+ run_id=message.metadata.run_id,
328
+ object_ids_to_push=objs_to_push,
329
+ )
330
+ log(DEBUG, "Pushed %s objects to servicer.", len(objs_to_push))
290
331
 
291
332
  # Cleanup
292
333
  metadata = None
@@ -15,6 +15,7 @@
15
15
  """InflatableObject utils."""
16
16
 
17
17
 
18
+ from time import sleep
18
19
  from typing import Optional, Union
19
20
 
20
21
  from flwr.client.grpc_rere_client.grpc_adapter import GrpcAdapter
@@ -94,10 +95,14 @@ def pull_object_from_servicer(
94
95
  ) -> InflatableObject:
95
96
  """Recursively inflate an object by pulling it from the servicer."""
96
97
  # Pull object
97
- object_proto: PullObjectResponse = stub.PullObject(
98
- PullObjectRequest(node=node, run_id=run_id, object_id=object_id)
99
- )
100
- object_content = object_proto.object_content
98
+ object_available = False
99
+ while not object_available:
100
+ object_proto: PullObjectResponse = stub.PullObject(
101
+ PullObjectRequest(node=node, run_id=run_id, object_id=object_id)
102
+ )
103
+ object_available = object_proto.object_available
104
+ object_content = object_proto.object_content
105
+ sleep(0.1)
101
106
 
102
107
  # Extract object class and object_ids of children
103
108
  obj_type, children_obj_ids, _ = get_object_head_values_from_object_content(
@@ -426,6 +426,17 @@ def make_message(
426
426
  return Message(metadata=metadata, content=content, error=error) # type: ignore
427
427
 
428
428
 
429
+ def remove_content_from_message(message: Message) -> Message:
430
+ """Return a copy of the Message but with an empty RecordDict as content.
431
+
432
+ If message has no content, it returns itself.
433
+ """
434
+ if message.has_error():
435
+ return message
436
+
437
+ return make_message(metadata=message.metadata, content=RecordDict())
438
+
439
+
429
440
  def _limit_reply_ttl(
430
441
  current: float, reply_ttl: float | None, reply_to: Message
431
442
  ) -> float:
@@ -16,6 +16,7 @@
16
16
 
17
17
 
18
18
  import threading
19
+ from typing import Any, Callable
19
20
 
20
21
  from flwr.common.typing import RunNotRunningException
21
22
 
@@ -80,36 +81,57 @@ def _update_client_manager(
80
81
  """Update the nodes list in the client manager."""
81
82
  # Loop until the grid is disconnected
82
83
  registered_nodes: dict[int, GridClientProxy] = {}
84
+ lock = threading.RLock()
85
+
86
+ def update_registered_nodes() -> None:
87
+ with lock:
88
+ all_node_ids = set(grid.get_node_ids())
89
+ dead_nodes = set(registered_nodes).difference(all_node_ids)
90
+ new_nodes = all_node_ids.difference(registered_nodes)
91
+
92
+ # Unregister dead nodes
93
+ for node_id in dead_nodes:
94
+ client_proxy = registered_nodes[node_id]
95
+ client_manager.unregister(client_proxy)
96
+ del registered_nodes[node_id]
97
+
98
+ # Register new nodes
99
+ for node_id in new_nodes:
100
+ client_proxy = GridClientProxy(
101
+ node_id=node_id,
102
+ grid=grid,
103
+ run_id=grid.run.run_id,
104
+ )
105
+ if client_manager.register(client_proxy):
106
+ registered_nodes[node_id] = client_proxy
107
+ else:
108
+ raise RuntimeError("Could not register node.")
109
+
110
+ # Get the wrapped method of ClientManager instance
111
+ def get_wrapped_method(method_name: str) -> Callable[..., Any]:
112
+ original_method = getattr(client_manager, method_name)
113
+
114
+ def wrapped_method(*args: Any, **kwargs: Any) -> Any:
115
+ # Update registered nodes before calling the original method
116
+ update_registered_nodes()
117
+ return original_method(*args, **kwargs)
118
+
119
+ return wrapped_method
120
+
121
+ # Wrap the ClientManager
122
+ for method_name in ["num_available", "all", "sample"]:
123
+ setattr(client_manager, method_name, get_wrapped_method(method_name))
124
+
125
+ c_done.set()
126
+
83
127
  while not f_stop.is_set():
128
+ # Sleep for 5 seconds
129
+ if not f_stop.is_set():
130
+ f_stop.wait(5)
131
+
84
132
  try:
85
- all_node_ids = set(grid.get_node_ids())
133
+ # Update registered nodes
134
+ update_registered_nodes()
86
135
  except RunNotRunningException:
87
136
  f_stop.set()
88
137
  break
89
- dead_nodes = set(registered_nodes).difference(all_node_ids)
90
- new_nodes = all_node_ids.difference(registered_nodes)
91
-
92
- # Unregister dead nodes
93
- for node_id in dead_nodes:
94
- client_proxy = registered_nodes[node_id]
95
- client_manager.unregister(client_proxy)
96
- del registered_nodes[node_id]
97
-
98
- # Register new nodes
99
- for node_id in new_nodes:
100
- client_proxy = GridClientProxy(
101
- node_id=node_id,
102
- grid=grid,
103
- run_id=grid.run.run_id,
104
- )
105
- if client_manager.register(client_proxy):
106
- registered_nodes[node_id] = client_proxy
107
- else:
108
- raise RuntimeError("Could not register node.")
109
-
110
- # Flag first pass for nodes registration is completed
111
- c_done.set()
112
-
113
- # Sleep for 3 seconds
114
- if not f_stop.is_set():
115
- f_stop.wait(3)
@@ -28,11 +28,18 @@ from flwr.common.constant import (
28
28
  SUPERLINK_NODE_ID,
29
29
  )
30
30
  from flwr.common.grpc import create_channel, on_channel_state_change
31
+ from flwr.common.inflatable_grpc_utils import (
32
+ pull_object_from_servicer,
33
+ push_object_to_servicer,
34
+ )
31
35
  from flwr.common.logger import log, warn_deprecated_feature
36
+ from flwr.common.message import (
37
+ get_message_to_descendant_id_mapping,
38
+ remove_content_from_message,
39
+ )
32
40
  from flwr.common.retry_invoker import _make_simple_grpc_retry_invoker, _wrap_stub
33
- from flwr.common.serde import message_from_proto, message_to_proto, run_from_proto
41
+ from flwr.common.serde import message_to_proto, run_from_proto
34
42
  from flwr.common.typing import Run
35
- from flwr.proto.message_pb2 import Message as ProtoMessage # pylint: disable=E0611
36
43
  from flwr.proto.node_pb2 import Node # pylint: disable=E0611
37
44
  from flwr.proto.run_pb2 import GetRunRequest, GetRunResponse # pylint: disable=E0611
38
45
  from flwr.proto.serverappio_pb2 import ( # pylint: disable=E0611
@@ -198,6 +205,35 @@ class GrpcGrid(Grid):
198
205
  )
199
206
  return [node.node_id for node in res.nodes]
200
207
 
208
+ def _try_push_message(self, run_id: int, message: Message) -> str:
209
+ """Push one message and its associated objects."""
210
+ # Compute mapping of message descendants
211
+ descendants_mapping = get_message_to_descendant_id_mapping(message)
212
+
213
+ # Call GrpcServerAppIoStub method
214
+ res: PushInsMessagesResponse = self._stub.PushMessages(
215
+ PushInsMessagesRequest(
216
+ messages_list=[message_to_proto(remove_content_from_message(message))],
217
+ run_id=run_id,
218
+ msg_to_descendant_mapping=descendants_mapping,
219
+ )
220
+ )
221
+
222
+ # Push objects
223
+ msg_id = res.message_ids[0]
224
+ # If Message was added to the LinkState correctly
225
+ if msg_id is not None:
226
+ obj_ids_to_push = set(res.objects_to_push[msg_id].object_ids)
227
+ # Push only object that are not in the store
228
+ push_object_to_servicer(
229
+ message,
230
+ self._stub,
231
+ node=self.node,
232
+ run_id=run_id,
233
+ object_ids_to_push=obj_ids_to_push,
234
+ )
235
+ return msg_id
236
+
201
237
  def push_messages(self, messages: Iterable[Message]) -> Iterable[str]:
202
238
  """Push messages to specified node IDs.
203
239
 
@@ -206,58 +242,64 @@ class GrpcGrid(Grid):
206
242
  """
207
243
  # Construct Messages
208
244
  run_id = cast(Run, self._run).run_id
209
- message_proto_list: list[ProtoMessage] = []
210
- for msg in messages:
211
- # Populate metadata
212
- msg.metadata.__dict__["_run_id"] = run_id
213
- msg.metadata.__dict__["_src_node_id"] = self.node.node_id
214
- msg.metadata.__dict__["_message_id"] = msg.object_id
215
- # Check message
216
- self._check_message(msg)
217
- # Convert to proto
218
- msg_proto = message_to_proto(msg)
219
- # Add to list
220
- message_proto_list.append(msg_proto)
221
-
245
+ message_ids: list[str] = []
222
246
  try:
223
- # Call GrpcServerAppIoStub method
224
- res: PushInsMessagesResponse = self._stub.PushMessages(
225
- PushInsMessagesRequest(messages_list=message_proto_list, run_id=run_id)
226
- )
227
- if len([msg_id for msg_id in res.message_ids if msg_id]) != len(
228
- message_proto_list
229
- ):
230
- log(
231
- WARNING,
232
- "Not all messages could be pushed to the SuperLink. The returned "
233
- "list has `None` for those messages (the order is preserved as "
234
- "passed to `push_messages`). This could be due to a malformed "
235
- "message.",
236
- )
237
- return list(res.message_ids)
247
+ for msg in messages:
248
+ # Populate metadata
249
+ msg.metadata.__dict__["_run_id"] = run_id
250
+ msg.metadata.__dict__["_src_node_id"] = self.node.node_id
251
+ msg.metadata.__dict__["_message_id"] = msg.object_id
252
+ # Check message
253
+ self._check_message(msg)
254
+ # Try pushing message and its objects
255
+ message_ids.append(self._try_push_message(run_id, msg))
256
+
238
257
  except grpc.RpcError as e:
239
258
  if e.code() == grpc.StatusCode.RESOURCE_EXHAUSTED: # pylint: disable=E1101
240
259
  log(ERROR, ERROR_MESSAGE_PUSH_MESSAGES_RESOURCE_EXHAUSTED)
241
260
  return []
242
261
  raise
243
262
 
263
+ if None in message_ids:
264
+ log(
265
+ WARNING,
266
+ "Not all messages could be pushed to the SuperLink. The returned "
267
+ "list has `None` for those messages (the order is preserved as "
268
+ "passed to `push_messages`). This could be due to a malformed "
269
+ "message.",
270
+ )
271
+
272
+ return message_ids
273
+
244
274
  def pull_messages(self, message_ids: Iterable[str]) -> Iterable[Message]:
245
275
  """Pull messages based on message IDs.
246
276
 
247
277
  This method is used to collect messages from the SuperLink that correspond to a
248
278
  set of given message IDs.
249
279
  """
280
+ run_id = cast(Run, self._run).run_id
250
281
  try:
251
282
  # Pull Messages
252
283
  res: PullResMessagesResponse = self._stub.PullMessages(
253
284
  PullResMessagesRequest(
254
285
  message_ids=message_ids,
255
- run_id=cast(Run, self._run).run_id,
286
+ run_id=run_id,
256
287
  )
257
288
  )
258
- # Convert Message from Protobuf representation
259
- msgs = [message_from_proto(msg_proto) for msg_proto in res.messages_list]
260
- return msgs
289
+ # Pull Messages from store
290
+ inflated_msgs: list[Message] = []
291
+ for msg_proto in res.messages_list:
292
+
293
+ message = pull_object_from_servicer(
294
+ msg_proto.metadata.message_id,
295
+ self._stub,
296
+ node=self.node,
297
+ run_id=run_id,
298
+ )
299
+ inflated_msgs.append(cast(Message, message))
300
+
301
+ return inflated_msgs
302
+
261
303
  except grpc.RpcError as e:
262
304
  if e.code() == grpc.StatusCode.RESOURCE_EXHAUSTED: # pylint: disable=E1101
263
305
  log(ERROR, ERROR_MESSAGE_PULL_MESSAGES_RESOURCE_EXHAUSTED)
@@ -17,8 +17,10 @@
17
17
 
18
18
  from .disk_ffs import DiskFfs as DiskFfs
19
19
  from .ffs import Ffs as Ffs
20
+ from .ffs_factory import FfsFactory as FfsFactory
20
21
 
21
22
  __all__ = [
22
23
  "DiskFfs",
23
24
  "Ffs",
25
+ "FfsFactory",
24
26
  ]
@@ -48,6 +48,7 @@ def flwr_clientapp() -> None:
48
48
  token=args.token,
49
49
  flwr_dir=args.flwr_dir,
50
50
  certificates=None,
51
+ parent_pid=args.parent_pid,
51
52
  )
52
53
 
53
54
 
@@ -69,5 +70,12 @@ def _parse_args_run_flwr_clientapp() -> argparse.ArgumentParser:
69
70
  required=False,
70
71
  help="Unique token generated by SuperNode for each ClientApp execution",
71
72
  )
73
+ parser.add_argument(
74
+ "--parent-pid",
75
+ type=int,
76
+ default=None,
77
+ help="The PID of the parent process. When set, the process will terminate "
78
+ "when the parent process exits.",
79
+ )
72
80
  add_args_flwr_app_common(parser=parser)
73
81
  return parser
@@ -16,6 +16,8 @@
16
16
 
17
17
 
18
18
  import gc
19
+ import os
20
+ import threading
19
21
  import time
20
22
  from logging import DEBUG, ERROR, INFO
21
23
  from typing import Optional
@@ -54,14 +56,19 @@ from flwr.proto.clientappio_pb2 import (
54
56
  from flwr.proto.clientappio_pb2_grpc import ClientAppIoStub
55
57
 
56
58
 
57
- def run_clientapp( # pylint: disable=R0914
59
+ def run_clientapp( # pylint: disable=R0913, R0914, R0917
58
60
  clientappio_api_address: str,
59
61
  run_once: bool,
60
62
  token: Optional[int] = None,
61
63
  flwr_dir: Optional[str] = None,
62
64
  certificates: Optional[bytes] = None,
65
+ parent_pid: Optional[int] = None,
63
66
  ) -> None:
64
67
  """Run Flower ClientApp process."""
68
+ # Monitor the main process in case of SIGKILL
69
+ if parent_pid is not None:
70
+ start_parent_process_monitor(parent_pid)
71
+
65
72
  channel = create_channel(
66
73
  server_address=clientappio_api_address,
67
74
  insecure=(certificates is None),
@@ -151,6 +158,20 @@ def run_clientapp( # pylint: disable=R0914
151
158
  channel.close()
152
159
 
153
160
 
161
+ def start_parent_process_monitor(
162
+ parent_pid: int,
163
+ ) -> None:
164
+ """Monitor the parent process and exit if it terminates."""
165
+
166
+ def monitor() -> None:
167
+ while True:
168
+ time.sleep(0.2)
169
+ if os.getppid() != parent_pid:
170
+ os.kill(os.getpid(), 9)
171
+
172
+ threading.Thread(target=monitor, daemon=True).start()
173
+
174
+
154
175
  def get_token(stub: grpc.Channel) -> Optional[int]:
155
176
  """Get a token from SuperNode."""
156
177
  log(DEBUG, "[flwr-clientapp] Request token")