flwr-nightly 1.19.0.dev20250521__tar.gz → 1.19.0.dev20250522__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 (357) hide show
  1. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/PKG-INFO +1 -1
  2. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/client/grpc_adapter_client/connection.py +4 -4
  3. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/client/grpc_rere_client/connection.py +4 -4
  4. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/client/rest_client/connection.py +4 -4
  5. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/client/start_client_internal.py +85 -198
  6. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/client/supernode/app.py +0 -8
  7. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/common/inflatable.py +23 -0
  8. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/common/inflatable_grpc_utils.py +2 -0
  9. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/compat/client/app.py +2 -2
  10. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/app.py +12 -1
  11. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +6 -1
  12. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/superlink/serverappio/serverappio_grpc.py +3 -0
  13. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/superlink/serverappio/serverappio_servicer.py +6 -1
  14. flwr_nightly-1.19.0.dev20250522/py/flwr/supercore/object_store/__init__.py +23 -0
  15. flwr_nightly-1.19.0.dev20250522/py/flwr/supercore/object_store/in_memory_object_store.py +65 -0
  16. flwr_nightly-1.19.0.dev20250522/py/flwr/supercore/object_store/object_store.py +86 -0
  17. flwr_nightly-1.19.0.dev20250522/py/flwr/supercore/object_store/object_store_factory.py +44 -0
  18. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/pyproject.toml +1 -1
  19. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/README.md +0 -0
  20. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/__init__.py +0 -0
  21. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/app/__init__.py +0 -0
  22. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/app/error.py +0 -0
  23. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/app/metadata.py +0 -0
  24. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/cli/__init__.py +0 -0
  25. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/cli/app.py +0 -0
  26. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/cli/auth_plugin/__init__.py +0 -0
  27. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/cli/auth_plugin/oidc_cli_plugin.py +0 -0
  28. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/cli/build.py +0 -0
  29. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/cli/cli_user_auth_interceptor.py +0 -0
  30. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/cli/config_utils.py +0 -0
  31. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/cli/constant.py +0 -0
  32. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/cli/example.py +0 -0
  33. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/cli/install.py +0 -0
  34. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/cli/log.py +0 -0
  35. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/cli/login/__init__.py +0 -0
  36. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/cli/login/login.py +0 -0
  37. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/cli/ls.py +0 -0
  38. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/cli/new/__init__.py +0 -0
  39. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/cli/new/new.py +0 -0
  40. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/cli/new/templates/__init__.py +0 -0
  41. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/cli/new/templates/app/.gitignore.tpl +0 -0
  42. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/cli/new/templates/app/LICENSE.tpl +0 -0
  43. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/cli/new/templates/app/README.baseline.md.tpl +0 -0
  44. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/cli/new/templates/app/README.flowertune.md.tpl +0 -0
  45. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/cli/new/templates/app/README.md.tpl +0 -0
  46. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/cli/new/templates/app/__init__.py +0 -0
  47. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/cli/new/templates/app/code/__init__.baseline.py.tpl +0 -0
  48. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
  49. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
  50. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/cli/new/templates/app/code/client.baseline.py.tpl +0 -0
  51. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/cli/new/templates/app/code/client.huggingface.py.tpl +0 -0
  52. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/cli/new/templates/app/code/client.jax.py.tpl +0 -0
  53. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/cli/new/templates/app/code/client.mlx.py.tpl +0 -0
  54. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/cli/new/templates/app/code/client.numpy.py.tpl +0 -0
  55. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -0
  56. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl +0 -0
  57. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -0
  58. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/cli/new/templates/app/code/dataset.baseline.py.tpl +0 -0
  59. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/cli/new/templates/app/code/flwr_tune/__init__.py +0 -0
  60. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/cli/new/templates/app/code/flwr_tune/client_app.py.tpl +0 -0
  61. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/cli/new/templates/app/code/flwr_tune/dataset.py.tpl +0 -0
  62. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/cli/new/templates/app/code/flwr_tune/models.py.tpl +0 -0
  63. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/cli/new/templates/app/code/flwr_tune/server_app.py.tpl +0 -0
  64. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/cli/new/templates/app/code/flwr_tune/strategy.py.tpl +0 -0
  65. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/cli/new/templates/app/code/model.baseline.py.tpl +0 -0
  66. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/cli/new/templates/app/code/server.baseline.py.tpl +0 -0
  67. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/cli/new/templates/app/code/server.huggingface.py.tpl +0 -0
  68. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/cli/new/templates/app/code/server.jax.py.tpl +0 -0
  69. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/cli/new/templates/app/code/server.mlx.py.tpl +0 -0
  70. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -0
  71. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -0
  72. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/cli/new/templates/app/code/server.sklearn.py.tpl +0 -0
  73. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -0
  74. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/cli/new/templates/app/code/strategy.baseline.py.tpl +0 -0
  75. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/cli/new/templates/app/code/task.huggingface.py.tpl +0 -0
  76. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/cli/new/templates/app/code/task.jax.py.tpl +0 -0
  77. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/cli/new/templates/app/code/task.mlx.py.tpl +0 -0
  78. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/cli/new/templates/app/code/task.numpy.py.tpl +0 -0
  79. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +0 -0
  80. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/cli/new/templates/app/code/task.sklearn.py.tpl +0 -0
  81. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/cli/new/templates/app/code/task.tensorflow.py.tpl +0 -0
  82. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/cli/new/templates/app/code/utils.baseline.py.tpl +0 -0
  83. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/cli/new/templates/app/pyproject.baseline.toml.tpl +0 -0
  84. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +0 -0
  85. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl +0 -0
  86. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/cli/new/templates/app/pyproject.jax.toml.tpl +0 -0
  87. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +0 -0
  88. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +0 -0
  89. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +0 -0
  90. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +0 -0
  91. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +0 -0
  92. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/cli/run/__init__.py +0 -0
  93. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/cli/run/run.py +0 -0
  94. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/cli/stop.py +0 -0
  95. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/cli/utils.py +0 -0
  96. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/client/__init__.py +0 -0
  97. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/client/client.py +0 -0
  98. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/client/client_app.py +0 -0
  99. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/client/clientapp/__init__.py +0 -0
  100. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/client/clientapp/app.py +0 -0
  101. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/client/clientapp/clientappio_servicer.py +0 -0
  102. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/client/clientapp/utils.py +0 -0
  103. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/client/dpfedavg_numpy_client.py +0 -0
  104. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/client/grpc_adapter_client/__init__.py +0 -0
  105. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/client/grpc_rere_client/__init__.py +0 -0
  106. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/client/grpc_rere_client/client_interceptor.py +0 -0
  107. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/client/grpc_rere_client/grpc_adapter.py +0 -0
  108. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/client/message_handler/__init__.py +0 -0
  109. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/client/message_handler/message_handler.py +0 -0
  110. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/client/mod/__init__.py +0 -0
  111. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/client/mod/centraldp_mods.py +0 -0
  112. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/client/mod/comms_mods.py +0 -0
  113. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/client/mod/localdp_mod.py +0 -0
  114. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
  115. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
  116. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
  117. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/client/mod/utils.py +0 -0
  118. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/client/numpy_client.py +0 -0
  119. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/client/rest_client/__init__.py +0 -0
  120. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/client/run_info_store.py +0 -0
  121. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/client/supernode/__init__.py +0 -0
  122. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/client/typing.py +0 -0
  123. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/clientapp/__init__.py +0 -0
  124. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/common/__init__.py +0 -0
  125. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/common/address.py +0 -0
  126. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/common/args.py +0 -0
  127. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/common/auth_plugin/__init__.py +0 -0
  128. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/common/auth_plugin/auth_plugin.py +0 -0
  129. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/common/config.py +0 -0
  130. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/common/constant.py +0 -0
  131. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/common/context.py +0 -0
  132. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/common/date.py +0 -0
  133. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/common/differential_privacy.py +0 -0
  134. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/common/differential_privacy_constants.py +0 -0
  135. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/common/dp.py +0 -0
  136. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/common/event_log_plugin/__init__.py +0 -0
  137. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/common/event_log_plugin/event_log_plugin.py +0 -0
  138. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/common/exit/__init__.py +0 -0
  139. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/common/exit/exit.py +0 -0
  140. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/common/exit/exit_code.py +0 -0
  141. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/common/exit_handlers.py +0 -0
  142. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/common/grpc.py +0 -0
  143. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/common/heartbeat.py +0 -0
  144. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/common/logger.py +0 -0
  145. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/common/message.py +0 -0
  146. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/common/object_ref.py +0 -0
  147. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/common/parameter.py +0 -0
  148. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/common/pyproject.py +0 -0
  149. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/common/record/__init__.py +0 -0
  150. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/common/record/array.py +0 -0
  151. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/common/record/arrayrecord.py +0 -0
  152. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/common/record/configrecord.py +0 -0
  153. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/common/record/conversion_utils.py +0 -0
  154. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/common/record/metricrecord.py +0 -0
  155. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/common/record/recorddict.py +0 -0
  156. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/common/record/typeddict.py +0 -0
  157. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/common/recorddict_compat.py +0 -0
  158. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/common/retry_invoker.py +0 -0
  159. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/common/secure_aggregation/__init__.py +0 -0
  160. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
  161. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
  162. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -0
  163. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
  164. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/common/secure_aggregation/quantization.py +0 -0
  165. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
  166. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
  167. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/common/serde.py +0 -0
  168. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/common/serde_utils.py +0 -0
  169. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/common/telemetry.py +0 -0
  170. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/common/typing.py +0 -0
  171. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/common/version.py +0 -0
  172. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/compat/__init__.py +0 -0
  173. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/compat/client/__init__.py +0 -0
  174. {flwr_nightly-1.19.0.dev20250521/py/flwr → flwr_nightly-1.19.0.dev20250522/py/flwr/compat}/client/grpc_client/__init__.py +0 -0
  175. {flwr_nightly-1.19.0.dev20250521/py/flwr → flwr_nightly-1.19.0.dev20250522/py/flwr/compat}/client/grpc_client/connection.py +0 -0
  176. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/compat/common/__init__.py +0 -0
  177. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/compat/server/__init__.py +0 -0
  178. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/compat/simulation/__init__.py +0 -0
  179. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/proto/__init__.py +0 -0
  180. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/proto/clientappio_pb2.py +0 -0
  181. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/proto/clientappio_pb2.pyi +0 -0
  182. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/proto/clientappio_pb2_grpc.py +0 -0
  183. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/proto/clientappio_pb2_grpc.pyi +0 -0
  184. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/proto/error_pb2.py +0 -0
  185. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/proto/error_pb2.pyi +0 -0
  186. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/proto/error_pb2_grpc.py +0 -0
  187. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/proto/error_pb2_grpc.pyi +0 -0
  188. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/proto/exec_pb2.py +0 -0
  189. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/proto/exec_pb2.pyi +0 -0
  190. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/proto/exec_pb2_grpc.py +0 -0
  191. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/proto/exec_pb2_grpc.pyi +0 -0
  192. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/proto/fab_pb2.py +0 -0
  193. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/proto/fab_pb2.pyi +0 -0
  194. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/proto/fab_pb2_grpc.py +0 -0
  195. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/proto/fab_pb2_grpc.pyi +0 -0
  196. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/proto/fleet_pb2.py +0 -0
  197. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/proto/fleet_pb2.pyi +0 -0
  198. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/proto/fleet_pb2_grpc.py +0 -0
  199. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
  200. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/proto/grpcadapter_pb2.py +0 -0
  201. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/proto/grpcadapter_pb2.pyi +0 -0
  202. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/proto/grpcadapter_pb2_grpc.py +0 -0
  203. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/proto/grpcadapter_pb2_grpc.pyi +0 -0
  204. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/proto/heartbeat_pb2.py +0 -0
  205. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/proto/heartbeat_pb2.pyi +0 -0
  206. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/proto/heartbeat_pb2_grpc.py +0 -0
  207. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/proto/heartbeat_pb2_grpc.pyi +0 -0
  208. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/proto/log_pb2.py +0 -0
  209. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/proto/log_pb2.pyi +0 -0
  210. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/proto/log_pb2_grpc.py +0 -0
  211. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/proto/log_pb2_grpc.pyi +0 -0
  212. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/proto/message_pb2.py +0 -0
  213. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/proto/message_pb2.pyi +0 -0
  214. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/proto/message_pb2_grpc.py +0 -0
  215. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/proto/message_pb2_grpc.pyi +0 -0
  216. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/proto/node_pb2.py +0 -0
  217. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/proto/node_pb2.pyi +0 -0
  218. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/proto/node_pb2_grpc.py +0 -0
  219. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/proto/node_pb2_grpc.pyi +0 -0
  220. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/proto/recorddict_pb2.py +0 -0
  221. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/proto/recorddict_pb2.pyi +0 -0
  222. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/proto/recorddict_pb2_grpc.py +0 -0
  223. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/proto/recorddict_pb2_grpc.pyi +0 -0
  224. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/proto/run_pb2.py +0 -0
  225. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/proto/run_pb2.pyi +0 -0
  226. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/proto/run_pb2_grpc.py +0 -0
  227. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/proto/run_pb2_grpc.pyi +0 -0
  228. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/proto/serverappio_pb2.py +0 -0
  229. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/proto/serverappio_pb2.pyi +0 -0
  230. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/proto/serverappio_pb2_grpc.py +0 -0
  231. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/proto/serverappio_pb2_grpc.pyi +0 -0
  232. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/proto/simulationio_pb2.py +0 -0
  233. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/proto/simulationio_pb2.pyi +0 -0
  234. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/proto/simulationio_pb2_grpc.py +0 -0
  235. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/proto/simulationio_pb2_grpc.pyi +0 -0
  236. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/proto/transport_pb2.py +0 -0
  237. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/proto/transport_pb2.pyi +0 -0
  238. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/proto/transport_pb2_grpc.py +0 -0
  239. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
  240. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/py.typed +0 -0
  241. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/__init__.py +0 -0
  242. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/client_manager.py +0 -0
  243. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/client_proxy.py +0 -0
  244. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/compat/__init__.py +0 -0
  245. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/compat/app.py +0 -0
  246. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/compat/app_utils.py +0 -0
  247. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/compat/grid_client_proxy.py +0 -0
  248. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/compat/legacy_context.py +0 -0
  249. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/criterion.py +0 -0
  250. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/fleet_event_log_interceptor.py +0 -0
  251. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/grid/__init__.py +0 -0
  252. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/grid/grid.py +0 -0
  253. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/grid/grpc_grid.py +0 -0
  254. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/grid/inmemory_grid.py +0 -0
  255. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/history.py +0 -0
  256. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/run_serverapp.py +0 -0
  257. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/server.py +0 -0
  258. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/server_app.py +0 -0
  259. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/server_config.py +0 -0
  260. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/serverapp/__init__.py +0 -0
  261. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/serverapp/app.py +0 -0
  262. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/serverapp_components.py +0 -0
  263. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/strategy/__init__.py +0 -0
  264. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/strategy/aggregate.py +0 -0
  265. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/strategy/bulyan.py +0 -0
  266. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
  267. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
  268. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
  269. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
  270. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
  271. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/strategy/fedadagrad.py +0 -0
  272. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/strategy/fedadam.py +0 -0
  273. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/strategy/fedavg.py +0 -0
  274. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/strategy/fedavg_android.py +0 -0
  275. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/strategy/fedavgm.py +0 -0
  276. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/strategy/fedmedian.py +0 -0
  277. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/strategy/fedopt.py +0 -0
  278. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/strategy/fedprox.py +0 -0
  279. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
  280. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
  281. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
  282. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
  283. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/strategy/fedyogi.py +0 -0
  284. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/strategy/krum.py +0 -0
  285. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/strategy/qfedavg.py +0 -0
  286. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/strategy/strategy.py +0 -0
  287. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/superlink/__init__.py +0 -0
  288. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/superlink/ffs/__init__.py +0 -0
  289. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/superlink/ffs/disk_ffs.py +0 -0
  290. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/superlink/ffs/ffs.py +0 -0
  291. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/superlink/ffs/ffs_factory.py +0 -0
  292. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/superlink/fleet/__init__.py +0 -0
  293. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/superlink/fleet/grpc_adapter/__init__.py +0 -0
  294. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +0 -0
  295. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
  296. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
  297. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
  298. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
  299. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +0 -0
  300. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
  301. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +0 -0
  302. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
  303. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/superlink/fleet/message_handler/message_handler.py +0 -0
  304. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
  305. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +0 -0
  306. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
  307. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
  308. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
  309. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +0 -0
  310. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/superlink/fleet/vce/vce_api.py +0 -0
  311. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/superlink/linkstate/__init__.py +0 -0
  312. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/superlink/linkstate/in_memory_linkstate.py +0 -0
  313. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/superlink/linkstate/linkstate.py +0 -0
  314. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/superlink/linkstate/linkstate_factory.py +0 -0
  315. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/superlink/linkstate/sqlite_linkstate.py +0 -0
  316. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/superlink/linkstate/utils.py +0 -0
  317. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/superlink/serverappio/__init__.py +0 -0
  318. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/superlink/simulation/__init__.py +0 -0
  319. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/superlink/simulation/simulationio_grpc.py +0 -0
  320. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/superlink/simulation/simulationio_servicer.py +0 -0
  321. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/superlink/utils.py +0 -0
  322. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/typing.py +0 -0
  323. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/utils/__init__.py +0 -0
  324. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/utils/tensorboard.py +0 -0
  325. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/utils/validator.py +0 -0
  326. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/workflow/__init__.py +0 -0
  327. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/workflow/constant.py +0 -0
  328. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/workflow/default_workflows.py +0 -0
  329. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
  330. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
  331. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +0 -0
  332. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/serverapp/__init__.py +0 -0
  333. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/simulation/__init__.py +0 -0
  334. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/simulation/app.py +0 -0
  335. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/simulation/legacy_app.py +0 -0
  336. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/simulation/ray_transport/__init__.py +0 -0
  337. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
  338. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
  339. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/simulation/ray_transport/utils.py +0 -0
  340. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/simulation/run_simulation.py +0 -0
  341. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/simulation/simulationio_connection.py +0 -0
  342. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/supercore/__init__.py +0 -0
  343. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/superexec/__init__.py +0 -0
  344. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/superexec/app.py +0 -0
  345. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/superexec/deployment.py +0 -0
  346. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/superexec/exec_event_log_interceptor.py +0 -0
  347. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/superexec/exec_grpc.py +0 -0
  348. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/superexec/exec_servicer.py +0 -0
  349. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/superexec/exec_user_auth_interceptor.py +0 -0
  350. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/superexec/executor.py +0 -0
  351. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/superexec/simulation.py +0 -0
  352. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/superlink/__init__.py +0 -0
  353. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/supernode/__init__.py +0 -0
  354. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/supernode/nodestate/__init__.py +0 -0
  355. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/supernode/nodestate/in_memory_nodestate.py +0 -0
  356. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/supernode/nodestate/nodestate.py +0 -0
  357. {flwr_nightly-1.19.0.dev20250521 → flwr_nightly-1.19.0.dev20250522}/py/flwr/supernode/nodestate/nodestate_factory.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: flwr-nightly
3
- Version: 1.19.0.dev20250521
3
+ Version: 1.19.0.dev20250522
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
@@ -45,10 +45,10 @@ def grpc_adapter( # pylint: disable=R0913,too-many-positional-arguments
45
45
  tuple[
46
46
  Callable[[], Optional[Message]],
47
47
  Callable[[Message], None],
48
- Optional[Callable[[], Optional[int]]],
49
- Optional[Callable[[], None]],
50
- Optional[Callable[[int], Run]],
51
- Optional[Callable[[str, int], Fab]],
48
+ Callable[[], Optional[int]],
49
+ Callable[[], None],
50
+ Callable[[int], Run],
51
+ Callable[[str, int], Fab],
52
52
  ]
53
53
  ]:
54
54
  """Primitives for request/response-based interaction with a server via GrpcAdapter.
@@ -74,10 +74,10 @@ def grpc_request_response( # pylint: disable=R0913,R0914,R0915,R0917
74
74
  tuple[
75
75
  Callable[[], Optional[Message]],
76
76
  Callable[[Message], None],
77
- Optional[Callable[[], Optional[int]]],
78
- Optional[Callable[[], None]],
79
- Optional[Callable[[int], Run]],
80
- Optional[Callable[[str, int], Fab]],
77
+ Callable[[], Optional[int]],
78
+ Callable[[], None],
79
+ Callable[[int], Run],
80
+ Callable[[str, int], Fab],
81
81
  ]
82
82
  ]:
83
83
  """Primitives for request/response-based interaction with a server.
@@ -87,10 +87,10 @@ def http_request_response( # pylint: disable=R0913,R0914,R0915,R0917
87
87
  tuple[
88
88
  Callable[[], Optional[Message]],
89
89
  Callable[[Message], None],
90
- Optional[Callable[[], Optional[int]]],
91
- Optional[Callable[[], None]],
92
- Optional[Callable[[int], Run]],
93
- Optional[Callable[[str, int], Fab]],
90
+ Callable[[], Optional[int]],
91
+ Callable[[], None],
92
+ Callable[[int], Run],
93
+ Callable[[str, int], Fab],
94
94
  ]
95
95
  ]:
96
96
  """Primitives for request/response-based interaction with a server.
@@ -24,7 +24,7 @@ from contextlib import AbstractContextManager
24
24
  from logging import ERROR, INFO, WARN
25
25
  from os import urandom
26
26
  from pathlib import Path
27
- from typing import Callable, Optional, Union, cast
27
+ from typing import Callable, Optional, Union
28
28
 
29
29
  import grpc
30
30
  from cryptography.hazmat.primitives.asymmetric import ec
@@ -32,32 +32,25 @@ from grpc import RpcError
32
32
 
33
33
  from flwr.app.error import Error
34
34
  from flwr.cli.config_utils import get_fab_metadata
35
- from flwr.cli.install import install_from_fab
36
- from flwr.client.client import Client
37
- from flwr.client.client_app import ClientApp, LoadClientAppError
38
35
  from flwr.client.clientapp.app import flwr_clientapp
39
36
  from flwr.client.clientapp.clientappio_servicer import (
40
37
  ClientAppInputs,
41
38
  ClientAppIoServicer,
42
39
  )
43
40
  from flwr.client.grpc_adapter_client.connection import grpc_adapter
44
- from flwr.client.grpc_client.connection import grpc_connection
45
41
  from flwr.client.grpc_rere_client.connection import grpc_request_response
46
42
  from flwr.client.message_handler.message_handler import handle_control_message
47
43
  from flwr.client.run_info_store import DeprecatedRunInfoStore
48
- from flwr.client.typing import ClientFnExt
49
- from flwr.common import GRPC_MAX_MESSAGE_LENGTH, Context, Message
44
+ from flwr.common import GRPC_MAX_MESSAGE_LENGTH, Message
50
45
  from flwr.common.address import parse_address
51
46
  from flwr.common.constant import (
52
47
  CLIENT_OCTET,
53
48
  CLIENTAPPIO_API_DEFAULT_SERVER_ADDRESS,
54
- ISOLATION_MODE_PROCESS,
55
49
  ISOLATION_MODE_SUBPROCESS,
56
50
  MAX_RETRY_DELAY,
57
51
  RUN_ID_NUM_BYTES,
58
52
  SERVER_OCTET,
59
53
  TRANSPORT_TYPE_GRPC_ADAPTER,
60
- TRANSPORT_TYPE_GRPC_BIDI,
61
54
  TRANSPORT_TYPE_GRPC_RERE,
62
55
  TRANSPORT_TYPE_REST,
63
56
  TRANSPORT_TYPES,
@@ -72,20 +65,6 @@ from flwr.proto.clientappio_pb2_grpc import add_ClientAppIoServicer_to_server
72
65
  from flwr.supernode.nodestate import NodeStateFactory
73
66
 
74
67
 
75
- def _check_actionable_client(
76
- client: Optional[Client], client_fn: Optional[ClientFnExt]
77
- ) -> None:
78
- if client_fn is None and client is None:
79
- raise ValueError(
80
- "Both `client_fn` and `client` are `None`, but one is required"
81
- )
82
-
83
- if client_fn is not None and client is not None:
84
- raise ValueError(
85
- "Both `client_fn` and `client` are provided, but only one is allowed"
86
- )
87
-
88
-
89
68
  # pylint: disable=import-outside-toplevel
90
69
  # pylint: disable=too-many-branches
91
70
  # pylint: disable=too-many-locals
@@ -95,21 +74,18 @@ def start_client_internal(
95
74
  *,
96
75
  server_address: str,
97
76
  node_config: UserConfig,
98
- load_client_app_fn: Optional[Callable[[str, str, str], ClientApp]] = None,
99
- client_fn: Optional[ClientFnExt] = None,
100
- client: Optional[Client] = None,
101
77
  grpc_max_message_length: int = GRPC_MAX_MESSAGE_LENGTH,
102
78
  root_certificates: Optional[Union[bytes, str]] = None,
103
79
  insecure: Optional[bool] = None,
104
- transport: Optional[str] = None,
80
+ transport: str,
105
81
  authentication_keys: Optional[
106
82
  tuple[ec.EllipticCurvePrivateKey, ec.EllipticCurvePublicKey]
107
83
  ] = None,
108
84
  max_retries: Optional[int] = None,
109
85
  max_wait_time: Optional[float] = None,
110
86
  flwr_path: Optional[Path] = None,
111
- isolation: Optional[str] = None,
112
- clientappio_api_address: Optional[str] = CLIENTAPPIO_API_DEFAULT_SERVER_ADDRESS,
87
+ isolation: str = ISOLATION_MODE_SUBPROCESS,
88
+ clientappio_api_address: str = CLIENTAPPIO_API_DEFAULT_SERVER_ADDRESS,
113
89
  ) -> None:
114
90
  """Start a Flower client node which connects to a Flower server.
115
91
 
@@ -121,13 +97,6 @@ def start_client_internal(
121
97
  would be `"[::]:8080"`.
122
98
  node_config: UserConfig
123
99
  The configuration of the node.
124
- load_client_app_fn : Optional[Callable[[], ClientApp]] (default: None)
125
- A function that can be used to load a `ClientApp` instance.
126
- client_fn : Optional[ClientFnExt]
127
- A callable that instantiates a Client. (default: None)
128
- client : Optional[flwr.client.Client]
129
- An implementation of the abstract base
130
- class `flwr.client.Client` (default: None)
131
100
  grpc_max_message_length : int (default: 536_870_912, this equals 512MB)
132
101
  The maximum length of gRPC messages that can be exchanged with the
133
102
  Flower server. The default should be sufficient for most models.
@@ -142,10 +111,10 @@ def start_client_internal(
142
111
  insecure : Optional[bool] (default: None)
143
112
  Starts an insecure gRPC connection when True. Enables HTTPS connection
144
113
  when False, using system certificates if `root_certificates` is None.
145
- transport : Optional[str] (default: None)
114
+ transport : str
146
115
  Configure the transport layer. Allowed values:
147
- - 'grpc-bidi': gRPC, bidirectional streaming
148
- - 'grpc-rere': gRPC, request-response (experimental)
116
+ - 'grpc-rere': gRPC, request-response
117
+ - 'grpc-adapter': gRPC via 3rd party adapter (experimental)
149
118
  - 'rest': HTTP (experimental)
150
119
  authentication_keys : Optional[Tuple[PrivateKey, PublicKey]] (default: None)
151
120
  Tuple containing the elliptic curve private key and public key for
@@ -162,56 +131,24 @@ def start_client_internal(
162
131
  If set to None, there is no limit to the total time.
163
132
  flwr_path: Optional[Path] (default: None)
164
133
  The fully resolved path containing installed Flower Apps.
165
- isolation : Optional[str] (default: None)
134
+ isolation : str (default: ISOLATION_MODE_SUBPROCESS)
166
135
  Isolation mode for `ClientApp`. Possible values are `subprocess` and
167
- `process`. Defaults to `None`, which runs the `ClientApp` in the same process
168
- as the SuperNode. If `subprocess`, the `ClientApp` runs in a subprocess started
136
+ `process`. If `subprocess`, the `ClientApp` runs in a subprocess started
169
137
  by the SueprNode and communicates using gRPC at the address
170
138
  `clientappio_api_address`. If `process`, the `ClientApp` runs in a separate
171
139
  isolated process and communicates using gRPC at the address
172
140
  `clientappio_api_address`.
173
- clientappio_api_address : Optional[str]
141
+ clientappio_api_address : str
174
142
  (default: `CLIENTAPPIO_API_DEFAULT_SERVER_ADDRESS`)
175
143
  The SuperNode gRPC server address.
176
144
  """
177
145
  if insecure is None:
178
146
  insecure = root_certificates is None
179
147
 
180
- if load_client_app_fn is None:
181
- _check_actionable_client(client, client_fn)
182
-
183
- if client_fn is None:
184
- # Wrap `Client` instance in `client_fn`
185
- def single_client_factory(
186
- context: Context, # pylint: disable=unused-argument
187
- ) -> Client:
188
- if client is None: # Added this to keep mypy happy
189
- raise ValueError(
190
- "Both `client_fn` and `client` are `None`, but one is required"
191
- )
192
- return client # Always return the same instance
193
-
194
- client_fn = single_client_factory
195
-
196
- def _load_client_app(_1: str, _2: str, _3: str) -> ClientApp:
197
- return ClientApp(client_fn=client_fn)
198
-
199
- load_client_app_fn = _load_client_app
200
-
201
- if isolation:
202
- if clientappio_api_address is None:
203
- raise ValueError(
204
- f"`clientappio_api_address` required when `isolation` is "
205
- f"{ISOLATION_MODE_SUBPROCESS} or {ISOLATION_MODE_PROCESS}",
206
- )
207
- _clientappio_grpc_server, clientappio_servicer = run_clientappio_api_grpc(
208
- address=clientappio_api_address,
209
- certificates=None,
210
- )
211
- clientappio_api_address = cast(str, clientappio_api_address)
212
-
213
- # At this point, only `load_client_app_fn` should be used
214
- # Both `client` and `client_fn` must not be used directly
148
+ _clientappio_grpc_server, clientappio_servicer = run_clientappio_api_grpc(
149
+ address=clientappio_api_address,
150
+ certificates=None,
151
+ )
215
152
 
216
153
  # Initialize connection context manager
217
154
  connection, address, connection_error_type = _init_connection(
@@ -278,30 +215,15 @@ def start_client_internal(
278
215
 
279
216
  # Register node when connecting the first time
280
217
  if run_info_store is None:
281
- if create_node is None:
282
- if transport not in ["grpc-bidi", None]:
283
- raise NotImplementedError(
284
- "All transports except `grpc-bidi` require "
285
- "an implementation for `create_node()`.'"
286
- )
287
- # gRPC-bidi doesn't have the concept of node_id,
288
- # so we set it to -1
289
- run_info_store = DeprecatedRunInfoStore(
290
- node_id=-1,
291
- node_config={},
292
- )
293
- else:
294
- # Call create_node fn to register node
295
- # and store node_id in state
296
- if (node_id := create_node()) is None:
297
- raise ValueError(
298
- "Failed to register SuperNode with the SuperLink"
299
- )
300
- state.set_node_id(node_id)
301
- run_info_store = DeprecatedRunInfoStore(
302
- node_id=state.get_node_id(),
303
- node_config=node_config,
304
- )
218
+ # Call create_node fn to register node
219
+ # and store node_id in state
220
+ if (node_id := create_node()) is None:
221
+ raise ValueError("Failed to register SuperNode with the SuperLink")
222
+ state.set_node_id(node_id)
223
+ run_info_store = DeprecatedRunInfoStore(
224
+ node_id=state.get_node_id(),
225
+ node_config=node_config,
226
+ )
305
227
 
306
228
  # pylint: disable=too-many-nested-blocks
307
229
  while True:
@@ -336,18 +258,11 @@ def start_client_internal(
336
258
  # Get run info
337
259
  run_id = message.metadata.run_id
338
260
  if run_id not in runs:
339
- if get_run is not None:
340
- runs[run_id] = get_run(run_id)
341
- # If get_run is None, i.e., in grpc-bidi mode
342
- else:
343
- runs[run_id] = Run.create_empty(run_id=run_id)
261
+ runs[run_id] = get_run(run_id)
344
262
 
345
263
  run: Run = runs[run_id]
346
264
  if get_fab is not None and run.fab_hash:
347
265
  fab = get_fab(run.fab_hash, run_id)
348
- if not isolation:
349
- # If `ClientApp` runs in the same process, install the FAB
350
- install_from_fab(fab.content, flwr_path, True)
351
266
  fab_id, fab_version = get_fab_metadata(fab.content)
352
267
  else:
353
268
  fab = None
@@ -374,94 +289,72 @@ def start_client_internal(
374
289
 
375
290
  # Handle app loading and task message
376
291
  try:
377
- if isolation:
378
- # Two isolation modes:
379
- # 1. `subprocess`: SuperNode is starting the ClientApp
380
- # process as a subprocess.
381
- # 2. `process`: ClientApp process gets started separately
382
- # (via `flwr-clientapp`), for example, in a separate
383
- # Docker container.
384
-
385
- # Generate SuperNode token
386
- token = int.from_bytes(urandom(RUN_ID_NUM_BYTES), "little")
387
-
388
- # Mode 1: SuperNode starts ClientApp as subprocess
389
- start_subprocess = isolation == ISOLATION_MODE_SUBPROCESS
390
-
391
- # Share Message and Context with servicer
392
- clientappio_servicer.set_inputs(
393
- clientapp_input=ClientAppInputs(
394
- message=message,
395
- context=context,
396
- run=run,
397
- fab=fab,
398
- token=token,
399
- ),
400
- token_returned=start_subprocess,
401
- )
292
+ # Two isolation modes:
293
+ # 1. `subprocess`: SuperNode is starting the ClientApp
294
+ # process as a subprocess.
295
+ # 2. `process`: ClientApp process gets started separately
296
+ # (via `flwr-clientapp`), for example, in a separate
297
+ # Docker container.
298
+
299
+ # Generate SuperNode token
300
+ token = int.from_bytes(urandom(RUN_ID_NUM_BYTES), "little")
301
+
302
+ # Mode 1: SuperNode starts ClientApp as subprocess
303
+ start_subprocess = isolation == ISOLATION_MODE_SUBPROCESS
304
+
305
+ # Share Message and Context with servicer
306
+ clientappio_servicer.set_inputs(
307
+ clientapp_input=ClientAppInputs(
308
+ message=message,
309
+ context=context,
310
+ run=run,
311
+ fab=fab,
312
+ token=token,
313
+ ),
314
+ token_returned=start_subprocess,
315
+ )
402
316
 
403
- if start_subprocess:
404
- _octet, _colon, _port = (
405
- clientappio_api_address.rpartition(":")
406
- )
407
- io_address = (
408
- f"{CLIENT_OCTET}:{_port}"
409
- if _octet == SERVER_OCTET
410
- else clientappio_api_address
411
- )
412
- # Start ClientApp subprocess
413
- command = [
414
- "flwr-clientapp",
415
- "--clientappio-api-address",
416
- io_address,
417
- "--token",
418
- str(token),
419
- ]
420
- command.append("--insecure")
421
-
422
- proc = mp_spawn_context.Process(
423
- target=_run_flwr_clientapp,
424
- args=(command, os.getpid()),
425
- daemon=True,
426
- )
427
- proc.start()
428
- proc.join()
429
- else:
430
- # Wait for output to become available
431
- while not clientappio_servicer.has_outputs():
432
- time.sleep(0.1)
433
-
434
- outputs = clientappio_servicer.get_outputs()
435
- reply_message, context = outputs.message, outputs.context
436
- else:
437
- # Load ClientApp instance
438
- client_app: ClientApp = load_client_app_fn(
439
- fab_id, fab_version, run.fab_hash
317
+ if start_subprocess:
318
+ _octet, _colon, _port = clientappio_api_address.rpartition(
319
+ ":"
320
+ )
321
+ io_address = (
322
+ f"{CLIENT_OCTET}:{_port}"
323
+ if _octet == SERVER_OCTET
324
+ else clientappio_api_address
440
325
  )
326
+ # Start ClientApp subprocess
327
+ command = [
328
+ "flwr-clientapp",
329
+ "--clientappio-api-address",
330
+ io_address,
331
+ "--token",
332
+ str(token),
333
+ ]
334
+ command.append("--insecure")
335
+
336
+ proc = mp_spawn_context.Process(
337
+ target=_run_flwr_clientapp,
338
+ args=(command, os.getpid()),
339
+ daemon=True,
340
+ )
341
+ proc.start()
342
+ proc.join()
343
+ else:
344
+ # Wait for output to become available
345
+ while not clientappio_servicer.has_outputs():
346
+ time.sleep(0.1)
441
347
 
442
- # Execute ClientApp
443
- reply_message = client_app(message=message, context=context)
348
+ outputs = clientappio_servicer.get_outputs()
349
+ reply_message, context = outputs.message, outputs.context
444
350
  except Exception as ex: # pylint: disable=broad-exception-caught
445
351
 
446
- # Legacy grpc-bidi
447
- if transport in ["grpc-bidi", None]:
448
- log(ERROR, "Client raised an exception.", exc_info=ex)
449
- # Raise exception, crash process
450
- raise ex
451
-
452
352
  # Don't update/change DeprecatedRunInfoStore
453
353
 
454
354
  e_code = ErrorCode.CLIENT_APP_RAISED_EXCEPTION
455
355
  # Ex fmt: "<class 'ZeroDivisionError'>:<'division by zero'>"
456
356
  reason = str(type(ex)) + ":<'" + str(ex) + "'>"
457
357
  exc_entity = "ClientApp"
458
- if isinstance(ex, LoadClientAppError):
459
- reason = (
460
- "An exception was raised when attempting to load "
461
- "`ClientApp`"
462
- )
463
- e_code = ErrorCode.LOAD_CLIENT_APP_EXCEPTION
464
- exc_entity = "SuperNode"
465
358
 
466
359
  log(ERROR, "%s raised an exception", exc_entity, exc_info=ex)
467
360
 
@@ -509,7 +402,7 @@ def start_client_internal(
509
402
  time.sleep(sleep_duration)
510
403
 
511
404
 
512
- def _init_connection(transport: Optional[str], server_address: str) -> tuple[
405
+ def _init_connection(transport: str, server_address: str) -> tuple[
513
406
  Callable[
514
407
  [
515
408
  str,
@@ -523,10 +416,10 @@ def _init_connection(transport: Optional[str], server_address: str) -> tuple[
523
416
  tuple[
524
417
  Callable[[], Optional[Message]],
525
418
  Callable[[Message], None],
526
- Optional[Callable[[], Optional[int]]],
527
- Optional[Callable[[], None]],
528
- Optional[Callable[[int], Run]],
529
- Optional[Callable[[str, int], Fab]],
419
+ Callable[[], Optional[int]],
420
+ Callable[[], None],
421
+ Callable[[int], Run],
422
+ Callable[[str, int], Fab],
530
423
  ]
531
424
  ],
532
425
  ],
@@ -543,10 +436,6 @@ def _init_connection(transport: Optional[str], server_address: str) -> tuple[
543
436
  host, port, is_v6 = parsed_address
544
437
  address = f"[{host}]:{port}" if is_v6 else f"{host}:{port}"
545
438
 
546
- # Set the default transport layer
547
- if transport is None:
548
- transport = TRANSPORT_TYPE_GRPC_BIDI
549
-
550
439
  # Use either gRPC bidirectional streaming or REST request/response
551
440
  if transport == TRANSPORT_TYPE_REST:
552
441
  try:
@@ -562,8 +451,6 @@ def _init_connection(transport: Optional[str], server_address: str) -> tuple[
562
451
  connection, error_type = grpc_request_response, RpcError
563
452
  elif transport == TRANSPORT_TYPE_GRPC_ADAPTER:
564
453
  connection, error_type = grpc_adapter, RpcError
565
- elif transport == TRANSPORT_TYPE_GRPC_BIDI:
566
- connection, error_type = grpc_connection, RpcError
567
454
  else:
568
455
  raise ValueError(
569
456
  f"Unknown transport type: {transport} (possible: {TRANSPORT_TYPES})"
@@ -43,7 +43,6 @@ from flwr.common.exit import ExitCode, flwr_exit
43
43
  from flwr.common.exit_handlers import register_exit_handlers
44
44
  from flwr.common.logger import log
45
45
 
46
- from ..clientapp.utils import get_load_client_app_fn
47
46
  from ..start_client_internal import start_client_internal
48
47
 
49
48
 
@@ -64,12 +63,6 @@ def run_supernode() -> None:
64
63
  )
65
64
 
66
65
  root_certificates = try_obtain_root_certificates(args, args.superlink)
67
- load_fn = get_load_client_app_fn(
68
- default_app_ref="",
69
- app_path=None,
70
- flwr_dir=args.flwr_dir,
71
- multi_app=True,
72
- )
73
66
  authentication_keys = _try_setup_client_authentication(args)
74
67
 
75
68
  log(DEBUG, "Isolation mode: %s", args.isolation)
@@ -82,7 +75,6 @@ def run_supernode() -> None:
82
75
 
83
76
  start_client_internal(
84
77
  server_address=args.superlink,
85
- load_client_app_fn=load_fn,
86
78
  transport=args.transport,
87
79
  root_certificates=root_certificates,
88
80
  insecure=args.insecure,
@@ -112,6 +112,29 @@ def _get_object_body(object_content: bytes) -> bytes:
112
112
  return object_content.split(HEAD_BODY_DIVIDER, 1)[1]
113
113
 
114
114
 
115
+ def is_valid_sha256_hash(object_id: str) -> bool:
116
+ """Check if the given string is a valid SHA-256 hash.
117
+
118
+ Parameters
119
+ ----------
120
+ object_id : str
121
+ The string to check.
122
+
123
+ Returns
124
+ -------
125
+ bool
126
+ ``True`` if the string is a valid SHA-256 hash, ``False`` otherwise.
127
+ """
128
+ if len(object_id) != 64:
129
+ return False
130
+ try:
131
+ # If base 16 int conversion succeeds, it's a valid hexadecimal str
132
+ int(object_id, 16)
133
+ return True
134
+ except ValueError:
135
+ return False
136
+
137
+
115
138
  def get_object_type_from_object_content(object_content: bytes) -> str:
116
139
  """Return object type from bytes."""
117
140
  return get_object_head_values_from_object_content(object_content)[0]
@@ -31,6 +31,7 @@ from .inflatable import (
31
31
  get_object_head_values_from_object_content,
32
32
  get_object_id,
33
33
  )
34
+ from .message import Message
34
35
  from .record import Array, ArrayRecord, ConfigRecord, MetricRecord, RecordDict
35
36
 
36
37
  # Helper registry that maps names of classes to their type
@@ -38,6 +39,7 @@ inflatable_class_registry: dict[str, type[InflatableObject]] = {
38
39
  Array.__qualname__: Array,
39
40
  ArrayRecord.__qualname__: ArrayRecord,
40
41
  ConfigRecord.__qualname__: ConfigRecord,
42
+ Message.__qualname__: Message,
41
43
  MetricRecord.__qualname__: MetricRecord,
42
44
  RecordDict.__qualname__: RecordDict,
43
45
  }
@@ -41,7 +41,6 @@ from flwr.client.clientapp.clientappio_servicer import (
41
41
  ClientAppIoServicer,
42
42
  )
43
43
  from flwr.client.grpc_adapter_client.connection import grpc_adapter
44
- from flwr.client.grpc_client.connection import grpc_connection
45
44
  from flwr.client.grpc_rere_client.connection import grpc_request_response
46
45
  from flwr.client.message_handler.message_handler import handle_control_message
47
46
  from flwr.client.numpy_client import NumPyClient
@@ -69,6 +68,7 @@ from flwr.common.grpc import generic_create_grpc_server
69
68
  from flwr.common.logger import log, warn_deprecated_feature
70
69
  from flwr.common.retry_invoker import RetryInvoker, RetryState, exponential
71
70
  from flwr.common.typing import Fab, Run, RunNotRunningException, UserConfig
71
+ from flwr.compat.client.grpc_client.connection import grpc_connection
72
72
  from flwr.proto.clientappio_pb2_grpc import add_ClientAppIoServicer_to_server
73
73
  from flwr.supernode.nodestate import NodeStateFactory
74
74
 
@@ -794,7 +794,7 @@ def _init_connection(transport: Optional[str], server_address: str) -> tuple[
794
794
  elif transport == TRANSPORT_TYPE_GRPC_ADAPTER:
795
795
  connection, error_type = grpc_adapter, RpcError
796
796
  elif transport == TRANSPORT_TYPE_GRPC_BIDI:
797
- connection, error_type = grpc_connection, RpcError
797
+ connection, error_type = grpc_connection, RpcError # type: ignore[assignment]
798
798
  else:
799
799
  raise ValueError(
800
800
  f"Unknown transport type: {transport} (possible: {TRANSPORT_TYPES})"
@@ -71,6 +71,7 @@ from flwr.proto.grpcadapter_pb2_grpc import add_GrpcAdapterServicer_to_server
71
71
  from flwr.server.fleet_event_log_interceptor import FleetEventLogInterceptor
72
72
  from flwr.server.serverapp.app import flwr_serverapp
73
73
  from flwr.simulation.app import flwr_simulation
74
+ from flwr.supercore.object_store import ObjectStoreFactory
74
75
  from flwr.superexec.app import load_executor
75
76
  from flwr.superexec.exec_grpc import run_exec_api_grpc
76
77
 
@@ -307,6 +308,9 @@ def run_superlink() -> None:
307
308
  # Initialize FfsFactory
308
309
  ffs_factory = FfsFactory(args.storage_dir)
309
310
 
311
+ # Initialize ObjectStoreFactory
312
+ objectstore_factory = ObjectStoreFactory()
313
+
310
314
  # Start Exec API
311
315
  executor = load_executor(args)
312
316
  exec_server: grpc.Server = run_exec_api_grpc(
@@ -343,6 +347,7 @@ def run_superlink() -> None:
343
347
  address=serverappio_address,
344
348
  state_factory=state_factory,
345
349
  ffs_factory=ffs_factory,
350
+ objectstore_factory=objectstore_factory,
346
351
  certificates=None, # ServerAppIo API doesn't support SSL yet
347
352
  )
348
353
  grpc_servers.append(serverappio_server)
@@ -421,6 +426,7 @@ def run_superlink() -> None:
421
426
  address=fleet_address,
422
427
  state_factory=state_factory,
423
428
  ffs_factory=ffs_factory,
429
+ objectstore_factory=objectstore_factory,
424
430
  certificates=certificates,
425
431
  interceptors=interceptors,
426
432
  )
@@ -430,6 +436,7 @@ def run_superlink() -> None:
430
436
  address=fleet_address,
431
437
  state_factory=state_factory,
432
438
  ffs_factory=ffs_factory,
439
+ objectstore_factory=objectstore_factory,
433
440
  certificates=certificates,
434
441
  )
435
442
  grpc_servers.append(fleet_server)
@@ -668,10 +675,11 @@ def _try_obtain_fleet_event_log_writer_plugin() -> Optional[EventLogWriterPlugin
668
675
  sys.exit("No Fleet API event log writer plugins are currently supported.")
669
676
 
670
677
 
671
- def _run_fleet_api_grpc_rere(
678
+ def _run_fleet_api_grpc_rere( # pylint: disable=R0913, R0917
672
679
  address: str,
673
680
  state_factory: LinkStateFactory,
674
681
  ffs_factory: FfsFactory,
682
+ objectstore_factory: ObjectStoreFactory,
675
683
  certificates: Optional[tuple[bytes, bytes, bytes]],
676
684
  interceptors: Optional[Sequence[grpc.ServerInterceptor]] = None,
677
685
  ) -> grpc.Server:
@@ -680,6 +688,7 @@ def _run_fleet_api_grpc_rere(
680
688
  fleet_servicer = FleetServicer(
681
689
  state_factory=state_factory,
682
690
  ffs_factory=ffs_factory,
691
+ objectstore_factory=objectstore_factory,
683
692
  )
684
693
  fleet_add_servicer_to_server_fn = add_FleetServicer_to_server
685
694
  fleet_grpc_server = generic_create_grpc_server(
@@ -700,6 +709,7 @@ def _run_fleet_api_grpc_adapter(
700
709
  address: str,
701
710
  state_factory: LinkStateFactory,
702
711
  ffs_factory: FfsFactory,
712
+ objectstore_factory: ObjectStoreFactory,
703
713
  certificates: Optional[tuple[bytes, bytes, bytes]],
704
714
  ) -> grpc.Server:
705
715
  """Run Fleet API (GrpcAdapter)."""
@@ -707,6 +717,7 @@ def _run_fleet_api_grpc_adapter(
707
717
  fleet_servicer = GrpcAdapterServicer(
708
718
  state_factory=state_factory,
709
719
  ffs_factory=ffs_factory,
720
+ objectstore_factory=objectstore_factory,
710
721
  )
711
722
  fleet_add_servicer_to_server_fn = add_GrpcAdapterServicer_to_server
712
723
  fleet_grpc_server = generic_create_grpc_server(