flwr-nightly 1.11.0.dev20240821__tar.gz → 1.11.0.dev20240823__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.

Potentially problematic release.


This version of flwr-nightly might be problematic. Click here for more details.

Files changed (294) hide show
  1. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/PKG-INFO +1 -1
  2. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/pyproject.toml +1 -1
  3. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/cli/build.py +1 -1
  4. flwr_nightly-1.11.0.dev20240823/src/py/flwr/cli/new/templates/app/README.md.tpl +20 -0
  5. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/cli/run/run.py +10 -0
  6. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/client/client.py +22 -1
  7. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/client/numpy_client.py +22 -1
  8. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/client/rest_client/connection.py +1 -1
  9. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/client/supernode/app.py +5 -48
  10. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/common/address.py +43 -0
  11. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/app.py +6 -0
  12. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +15 -2
  13. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +5 -0
  14. flwr_nightly-1.11.0.dev20240823/src/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +184 -0
  15. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/superlink/fleet/vce/backend/backend.py +1 -2
  16. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +13 -4
  17. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/superlink/fleet/vce/vce_api.py +2 -6
  18. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +1 -0
  19. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +1 -0
  20. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/simulation/run_simulation.py +48 -17
  21. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/superexec/simulation.py +20 -1
  22. flwr_nightly-1.11.0.dev20240821/src/py/flwr/cli/new/templates/app/README.md.tpl +0 -43
  23. flwr_nightly-1.11.0.dev20240821/src/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +0 -235
  24. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/LICENSE +0 -0
  25. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/README.md +0 -0
  26. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/__init__.py +0 -0
  27. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/cli/__init__.py +0 -0
  28. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/cli/app.py +0 -0
  29. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/cli/config_utils.py +0 -0
  30. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/cli/example.py +0 -0
  31. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/cli/install.py +0 -0
  32. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/cli/new/__init__.py +0 -0
  33. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/cli/new/new.py +0 -0
  34. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/cli/new/templates/__init__.py +0 -0
  35. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/cli/new/templates/app/.gitignore.tpl +0 -0
  36. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/cli/new/templates/app/README.flowertune.md.tpl +0 -0
  37. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/cli/new/templates/app/__init__.py +0 -0
  38. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
  39. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
  40. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/cli/new/templates/app/code/client.huggingface.py.tpl +0 -0
  41. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/cli/new/templates/app/code/client.jax.py.tpl +0 -0
  42. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/cli/new/templates/app/code/client.mlx.py.tpl +0 -0
  43. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/cli/new/templates/app/code/client.numpy.py.tpl +0 -0
  44. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -0
  45. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl +0 -0
  46. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -0
  47. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/cli/new/templates/app/code/flwr_tune/__init__.py +0 -0
  48. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/cli/new/templates/app/code/flwr_tune/app.py.tpl +0 -0
  49. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/cli/new/templates/app/code/flwr_tune/client.py.tpl +0 -0
  50. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/cli/new/templates/app/code/flwr_tune/config.yaml.tpl +0 -0
  51. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/cli/new/templates/app/code/flwr_tune/dataset.py.tpl +0 -0
  52. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/cli/new/templates/app/code/flwr_tune/models.py.tpl +0 -0
  53. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/cli/new/templates/app/code/flwr_tune/server.py.tpl +0 -0
  54. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/cli/new/templates/app/code/flwr_tune/static_config.yaml.tpl +0 -0
  55. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/cli/new/templates/app/code/server.huggingface.py.tpl +0 -0
  56. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/cli/new/templates/app/code/server.jax.py.tpl +0 -0
  57. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/cli/new/templates/app/code/server.mlx.py.tpl +0 -0
  58. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -0
  59. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -0
  60. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/cli/new/templates/app/code/server.sklearn.py.tpl +0 -0
  61. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -0
  62. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/cli/new/templates/app/code/task.huggingface.py.tpl +0 -0
  63. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/cli/new/templates/app/code/task.jax.py.tpl +0 -0
  64. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/cli/new/templates/app/code/task.mlx.py.tpl +0 -0
  65. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +0 -0
  66. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/cli/new/templates/app/code/task.tensorflow.py.tpl +0 -0
  67. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +0 -0
  68. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl +0 -0
  69. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/cli/new/templates/app/pyproject.jax.toml.tpl +0 -0
  70. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +0 -0
  71. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +0 -0
  72. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +0 -0
  73. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +0 -0
  74. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +0 -0
  75. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/cli/run/__init__.py +0 -0
  76. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/cli/utils.py +0 -0
  77. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/client/__init__.py +0 -0
  78. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/client/app.py +0 -0
  79. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/client/client_app.py +0 -0
  80. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/client/clientapp/__init__.py +0 -0
  81. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/client/clientapp/app.py +0 -0
  82. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/client/clientapp/clientappio_servicer.py +0 -0
  83. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/client/clientapp/utils.py +0 -0
  84. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/client/dpfedavg_numpy_client.py +0 -0
  85. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/client/grpc_adapter_client/__init__.py +0 -0
  86. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/client/grpc_adapter_client/connection.py +0 -0
  87. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/client/grpc_client/__init__.py +0 -0
  88. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/client/grpc_client/connection.py +0 -0
  89. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/client/grpc_rere_client/__init__.py +0 -0
  90. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/client/grpc_rere_client/client_interceptor.py +0 -0
  91. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/client/grpc_rere_client/connection.py +0 -0
  92. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/client/grpc_rere_client/grpc_adapter.py +0 -0
  93. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/client/heartbeat.py +0 -0
  94. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/client/message_handler/__init__.py +0 -0
  95. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/client/message_handler/message_handler.py +0 -0
  96. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/client/message_handler/task_handler.py +0 -0
  97. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/client/mod/__init__.py +0 -0
  98. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/client/mod/centraldp_mods.py +0 -0
  99. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/client/mod/comms_mods.py +0 -0
  100. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/client/mod/localdp_mod.py +0 -0
  101. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
  102. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
  103. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
  104. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/client/mod/utils.py +0 -0
  105. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/client/node_state.py +0 -0
  106. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/client/node_state_tests.py +0 -0
  107. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/client/rest_client/__init__.py +0 -0
  108. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/client/supernode/__init__.py +0 -0
  109. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/client/typing.py +0 -0
  110. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/common/__init__.py +0 -0
  111. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/common/config.py +0 -0
  112. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/common/constant.py +0 -0
  113. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/common/context.py +0 -0
  114. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/common/date.py +0 -0
  115. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/common/differential_privacy.py +0 -0
  116. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/common/differential_privacy_constants.py +0 -0
  117. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/common/dp.py +0 -0
  118. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/common/exit_handlers.py +0 -0
  119. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/common/grpc.py +0 -0
  120. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/common/logger.py +0 -0
  121. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/common/message.py +0 -0
  122. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/common/object_ref.py +0 -0
  123. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/common/parameter.py +0 -0
  124. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/common/pyproject.py +0 -0
  125. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/common/record/__init__.py +0 -0
  126. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/common/record/configsrecord.py +0 -0
  127. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/common/record/conversion_utils.py +0 -0
  128. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/common/record/metricsrecord.py +0 -0
  129. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/common/record/parametersrecord.py +0 -0
  130. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/common/record/recordset.py +0 -0
  131. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/common/record/typeddict.py +0 -0
  132. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/common/recordset_compat.py +0 -0
  133. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/common/retry_invoker.py +0 -0
  134. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/common/secure_aggregation/__init__.py +0 -0
  135. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
  136. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
  137. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -0
  138. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
  139. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/common/secure_aggregation/quantization.py +0 -0
  140. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
  141. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
  142. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/common/serde.py +0 -0
  143. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/common/telemetry.py +0 -0
  144. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/common/typing.py +0 -0
  145. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/common/version.py +0 -0
  146. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/__init__.py +0 -0
  147. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/clientappio_pb2.py +0 -0
  148. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/clientappio_pb2.pyi +0 -0
  149. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/clientappio_pb2_grpc.py +0 -0
  150. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/clientappio_pb2_grpc.pyi +0 -0
  151. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/common_pb2.py +0 -0
  152. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/common_pb2.pyi +0 -0
  153. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/common_pb2_grpc.py +0 -0
  154. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/common_pb2_grpc.pyi +0 -0
  155. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/driver_pb2.py +0 -0
  156. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/driver_pb2.pyi +0 -0
  157. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/driver_pb2_grpc.py +0 -0
  158. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/driver_pb2_grpc.pyi +0 -0
  159. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/error_pb2.py +0 -0
  160. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/error_pb2.pyi +0 -0
  161. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/error_pb2_grpc.py +0 -0
  162. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/error_pb2_grpc.pyi +0 -0
  163. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/exec_pb2.py +0 -0
  164. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/exec_pb2.pyi +0 -0
  165. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/exec_pb2_grpc.py +0 -0
  166. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/exec_pb2_grpc.pyi +0 -0
  167. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/fab_pb2.py +0 -0
  168. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/fab_pb2.pyi +0 -0
  169. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/fab_pb2_grpc.py +0 -0
  170. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/fab_pb2_grpc.pyi +0 -0
  171. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/fleet_pb2.py +0 -0
  172. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/fleet_pb2.pyi +0 -0
  173. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/fleet_pb2_grpc.py +0 -0
  174. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
  175. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/grpcadapter_pb2.py +0 -0
  176. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/grpcadapter_pb2.pyi +0 -0
  177. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/grpcadapter_pb2_grpc.py +0 -0
  178. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/grpcadapter_pb2_grpc.pyi +0 -0
  179. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/message_pb2.py +0 -0
  180. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/message_pb2.pyi +0 -0
  181. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/message_pb2_grpc.py +0 -0
  182. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/message_pb2_grpc.pyi +0 -0
  183. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/node_pb2.py +0 -0
  184. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/node_pb2.pyi +0 -0
  185. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/node_pb2_grpc.py +0 -0
  186. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/node_pb2_grpc.pyi +0 -0
  187. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/recordset_pb2.py +0 -0
  188. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/recordset_pb2.pyi +0 -0
  189. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/recordset_pb2_grpc.py +0 -0
  190. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/recordset_pb2_grpc.pyi +0 -0
  191. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/run_pb2.py +0 -0
  192. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/run_pb2.pyi +0 -0
  193. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/run_pb2_grpc.py +0 -0
  194. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/run_pb2_grpc.pyi +0 -0
  195. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/task_pb2.py +0 -0
  196. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/task_pb2.pyi +0 -0
  197. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/task_pb2_grpc.py +0 -0
  198. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/task_pb2_grpc.pyi +0 -0
  199. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/transport_pb2.py +0 -0
  200. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/transport_pb2.pyi +0 -0
  201. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/transport_pb2_grpc.py +0 -0
  202. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
  203. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/py.typed +0 -0
  204. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/__init__.py +0 -0
  205. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/client_manager.py +0 -0
  206. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/client_proxy.py +0 -0
  207. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/compat/__init__.py +0 -0
  208. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/compat/app.py +0 -0
  209. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/compat/app_utils.py +0 -0
  210. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/compat/driver_client_proxy.py +0 -0
  211. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/compat/legacy_context.py +0 -0
  212. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/criterion.py +0 -0
  213. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/driver/__init__.py +0 -0
  214. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/driver/driver.py +0 -0
  215. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/driver/grpc_driver.py +0 -0
  216. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/driver/inmemory_driver.py +0 -0
  217. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/history.py +0 -0
  218. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/run_serverapp.py +0 -0
  219. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/server.py +0 -0
  220. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/server_app.py +0 -0
  221. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/server_config.py +0 -0
  222. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/serverapp_components.py +0 -0
  223. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/strategy/__init__.py +0 -0
  224. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/strategy/aggregate.py +0 -0
  225. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/strategy/bulyan.py +0 -0
  226. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
  227. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
  228. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
  229. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
  230. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
  231. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/strategy/fedadagrad.py +0 -0
  232. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/strategy/fedadam.py +0 -0
  233. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/strategy/fedavg.py +0 -0
  234. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/strategy/fedavg_android.py +0 -0
  235. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/strategy/fedavgm.py +0 -0
  236. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/strategy/fedmedian.py +0 -0
  237. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/strategy/fedopt.py +0 -0
  238. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/strategy/fedprox.py +0 -0
  239. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
  240. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
  241. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
  242. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
  243. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/strategy/fedyogi.py +0 -0
  244. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/strategy/krum.py +0 -0
  245. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/strategy/qfedavg.py +0 -0
  246. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/strategy/strategy.py +0 -0
  247. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/superlink/__init__.py +0 -0
  248. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/superlink/driver/__init__.py +0 -0
  249. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/superlink/driver/driver_grpc.py +0 -0
  250. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/superlink/driver/driver_servicer.py +0 -0
  251. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/superlink/ffs/__init__.py +0 -0
  252. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/superlink/ffs/disk_ffs.py +0 -0
  253. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/superlink/ffs/ffs.py +0 -0
  254. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/superlink/ffs/ffs_factory.py +0 -0
  255. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/superlink/fleet/__init__.py +0 -0
  256. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/superlink/fleet/grpc_adapter/__init__.py +0 -0
  257. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
  258. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
  259. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
  260. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
  261. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
  262. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +0 -0
  263. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +0 -0
  264. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
  265. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/superlink/fleet/message_handler/message_handler.py +0 -0
  266. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
  267. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
  268. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
  269. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/superlink/state/__init__.py +0 -0
  270. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/superlink/state/in_memory_state.py +0 -0
  271. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/superlink/state/sqlite_state.py +0 -0
  272. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/superlink/state/state.py +0 -0
  273. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/superlink/state/state_factory.py +0 -0
  274. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/superlink/state/utils.py +0 -0
  275. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/typing.py +0 -0
  276. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/utils/__init__.py +0 -0
  277. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/utils/tensorboard.py +0 -0
  278. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/utils/validator.py +0 -0
  279. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/workflow/__init__.py +0 -0
  280. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/workflow/constant.py +0 -0
  281. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/workflow/default_workflows.py +0 -0
  282. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
  283. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/simulation/__init__.py +0 -0
  284. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/simulation/app.py +0 -0
  285. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/simulation/ray_transport/__init__.py +0 -0
  286. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
  287. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
  288. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/simulation/ray_transport/utils.py +0 -0
  289. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/superexec/__init__.py +0 -0
  290. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/superexec/app.py +0 -0
  291. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/superexec/deployment.py +0 -0
  292. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/superexec/exec_grpc.py +0 -0
  293. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/superexec/exec_servicer.py +0 -0
  294. {flwr_nightly-1.11.0.dev20240821 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/superexec/executor.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: flwr-nightly
3
- Version: 1.11.0.dev20240821
3
+ Version: 1.11.0.dev20240823
4
4
  Summary: Flower: A Friendly Federated Learning Framework
5
5
  Home-page: https://flower.ai
6
6
  License: Apache-2.0
@@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api"
4
4
 
5
5
  [tool.poetry]
6
6
  name = "flwr-nightly"
7
- version = "1.11.0.dev20240821"
7
+ version = "1.11.0.dev20240823"
8
8
  description = "Flower: A Friendly Federated Learning Framework"
9
9
  license = "Apache-2.0"
10
10
  authors = ["The Flower Authors <hello@flower.ai>"]
@@ -89,7 +89,7 @@ def build(
89
89
  # Set the name of the zip file
90
90
  fab_filename = (
91
91
  f"{conf['tool']['flwr']['app']['publisher']}"
92
- f".{app.name}"
92
+ f".{conf['project']['name']}"
93
93
  f".{conf['project']['version'].replace('.', '-')}.fab"
94
94
  )
95
95
  list_file_content = ""
@@ -0,0 +1,20 @@
1
+ # $project_name: A Flower / $framework_str app
2
+
3
+ ## Install dependencies and project
4
+
5
+ ```bash
6
+ pip install -e .
7
+ ```
8
+
9
+ ## Run with the Simulation Engine
10
+
11
+ In the `$project_name` directory, use `flwr run` to run a local simulation:
12
+
13
+ ```bash
14
+ flwr run .
15
+ ```
16
+
17
+ ## Run with the Deployment Engine
18
+
19
+ > \[!NOTE\]
20
+ > An update to this example will show how to run this Flower application with the Deployment Engine and TLS certificates, or with Docker.
@@ -15,6 +15,7 @@
15
15
  """Flower command line interface `run` command."""
16
16
 
17
17
  import hashlib
18
+ import json
18
19
  import subprocess
19
20
  import sys
20
21
  from logging import DEBUG
@@ -192,6 +193,8 @@ def _run_without_superexec(
192
193
  ) -> None:
193
194
  try:
194
195
  num_supernodes = federation_config["options"]["num-supernodes"]
196
+ verbose: Optional[bool] = federation_config["options"].get("verbose")
197
+ backend_cfg = federation_config["options"].get("backend", {})
195
198
  except KeyError as err:
196
199
  typer.secho(
197
200
  "❌ The project's `pyproject.toml` needs to declare the number of"
@@ -212,6 +215,13 @@ def _run_without_superexec(
212
215
  f"{num_supernodes}",
213
216
  ]
214
217
 
218
+ if backend_cfg:
219
+ # Stringify as JSON
220
+ command.extend(["--backend-config", json.dumps(backend_cfg)])
221
+
222
+ if verbose:
223
+ command.extend(["--verbose"])
224
+
215
225
  if config_overrides:
216
226
  command.extend(["--run-config", f"{' '.join(config_overrides)}"])
217
227
 
@@ -33,12 +33,13 @@ from flwr.common import (
33
33
  Parameters,
34
34
  Status,
35
35
  )
36
+ from flwr.common.logger import warn_deprecated_feature_with_example
36
37
 
37
38
 
38
39
  class Client(ABC):
39
40
  """Abstract base class for Flower clients."""
40
41
 
41
- context: Context
42
+ _context: Context
42
43
 
43
44
  def get_properties(self, ins: GetPropertiesIns) -> GetPropertiesRes:
44
45
  """Return set of client's properties.
@@ -141,6 +142,26 @@ class Client(ABC):
141
142
  metrics={},
142
143
  )
143
144
 
145
+ @property
146
+ def context(self) -> Context:
147
+ """Getter for `Context` client attribute."""
148
+ warn_deprecated_feature_with_example(
149
+ "Accessing the context via the client's attribute is deprecated.",
150
+ example_message="Instead, pass it to the client's "
151
+ "constructor in your `client_fn()` which already "
152
+ "receives a context object.",
153
+ code_example="def client_fn(context: Context) -> Client:\n\n"
154
+ "\t\t# Your existing client_fn\n\n"
155
+ "\t\t# Pass `context` to the constructor\n"
156
+ "\t\treturn FlowerClient(context).to_client()",
157
+ )
158
+ return self._context
159
+
160
+ @context.setter
161
+ def context(self, context: Context) -> None:
162
+ """Setter for `Context` client attribute."""
163
+ self._context = context
164
+
144
165
  def get_context(self) -> Context:
145
166
  """Get the run context from this client."""
146
167
  return self.context
@@ -27,6 +27,7 @@ from flwr.common import (
27
27
  ndarrays_to_parameters,
28
28
  parameters_to_ndarrays,
29
29
  )
30
+ from flwr.common.logger import warn_deprecated_feature_with_example
30
31
  from flwr.common.typing import (
31
32
  Code,
32
33
  EvaluateIns,
@@ -70,7 +71,7 @@ Example
70
71
  class NumPyClient(ABC):
71
72
  """Abstract base class for Flower clients using NumPy."""
72
73
 
73
- context: Context
74
+ _context: Context
74
75
 
75
76
  def get_properties(self, config: Config) -> Dict[str, Scalar]:
76
77
  """Return a client's set of properties.
@@ -174,6 +175,26 @@ class NumPyClient(ABC):
174
175
  _ = (self, parameters, config)
175
176
  return 0.0, 0, {}
176
177
 
178
+ @property
179
+ def context(self) -> Context:
180
+ """Getter for `Context` client attribute."""
181
+ warn_deprecated_feature_with_example(
182
+ "Accessing the context via the client's attribute is deprecated.",
183
+ example_message="Instead, pass it to the client's "
184
+ "constructor in your `client_fn()` which already "
185
+ "receives a context object.",
186
+ code_example="def client_fn(context: Context) -> Client:\n\n"
187
+ "\t\t# Your existing client_fn\n\n"
188
+ "\t\t# Pass `context` to the constructor\n"
189
+ "\t\treturn FlowerClient(context).to_client()",
190
+ )
191
+ return self._context
192
+
193
+ @context.setter
194
+ def context(self, context: Context) -> None:
195
+ """Setter for `Context` client attribute."""
196
+ self._context = context
197
+
177
198
  def get_context(self) -> Context:
178
199
  """Get the run context from this client."""
179
200
  return self.context
@@ -275,7 +275,7 @@ def http_request_response( # pylint: disable=,R0913, R0914, R0915
275
275
  req = DeleteNodeRequest(node=node)
276
276
 
277
277
  # Send the request
278
- res = _request(req, DeleteNodeResponse, PATH_CREATE_NODE)
278
+ res = _request(req, DeleteNodeResponse, PATH_DELETE_NODE)
279
279
  if res is None:
280
280
  return
281
281
 
@@ -16,7 +16,7 @@
16
16
 
17
17
  import argparse
18
18
  import sys
19
- from logging import DEBUG, INFO, WARN
19
+ from logging import DEBUG, ERROR, INFO, WARN
20
20
  from pathlib import Path
21
21
  from typing import Optional, Tuple
22
22
 
@@ -90,33 +90,12 @@ def run_supernode() -> None:
90
90
 
91
91
  def run_client_app() -> None:
92
92
  """Run Flower client app."""
93
- log(INFO, "Long-running Flower client starting")
94
-
95
93
  event(EventType.RUN_CLIENT_APP_ENTER)
96
-
97
- args = _parse_args_run_client_app().parse_args()
98
-
99
- _warn_deprecated_server_arg(args)
100
-
101
- root_certificates = _get_certificates(args)
102
- load_fn = get_load_client_app_fn(
103
- default_app_ref=getattr(args, "client-app"),
104
- app_path=args.dir,
105
- multi_app=False,
106
- )
107
- authentication_keys = _try_setup_client_authentication(args)
108
-
109
- start_client_internal(
110
- server_address=args.superlink,
111
- node_config=parse_config_args([args.node_config]),
112
- load_client_app_fn=load_fn,
113
- transport=args.transport,
114
- root_certificates=root_certificates,
115
- insecure=args.insecure,
116
- authentication_keys=authentication_keys,
117
- max_retries=args.max_retries,
118
- max_wait_time=args.max_wait_time,
94
+ log(
95
+ ERROR,
96
+ "The command `flower-client-app` has been replaced by `flower-supernode`.",
119
97
  )
98
+ log(INFO, "Execute `flower-supernode --help` to learn how to use it.")
120
99
  register_exit_handlers(event_type=EventType.RUN_CLIENT_APP_LEAVE)
121
100
 
122
101
 
@@ -227,28 +206,6 @@ def _parse_args_run_supernode() -> argparse.ArgumentParser:
227
206
  return parser
228
207
 
229
208
 
230
- def _parse_args_run_client_app() -> argparse.ArgumentParser:
231
- """Parse flower-client-app command line arguments."""
232
- parser = argparse.ArgumentParser(
233
- description="Start a Flower client app",
234
- )
235
-
236
- parser.add_argument(
237
- "client-app",
238
- help="For example: `client:app` or `project.package.module:wrapper.app`",
239
- )
240
- _parse_args_common(parser=parser)
241
- parser.add_argument(
242
- "--dir",
243
- default="",
244
- help="Add specified directory to the PYTHONPATH and load Flower "
245
- "app from there."
246
- " Default: current working directory.",
247
- )
248
-
249
- return parser
250
-
251
-
252
209
  def _parse_args_common(parser: argparse.ArgumentParser) -> None:
253
210
  parser.add_argument(
254
211
  "--insecure",
@@ -14,6 +14,7 @@
14
14
  # ==============================================================================
15
15
  """Flower IP address utils."""
16
16
 
17
+ import socket
17
18
  from ipaddress import ip_address
18
19
  from typing import Optional, Tuple
19
20
 
@@ -57,3 +58,45 @@ def parse_address(address: str) -> Optional[Tuple[str, int, Optional[bool]]]:
57
58
 
58
59
  except ValueError:
59
60
  return None
61
+
62
+
63
+ def is_port_in_use(address: str) -> bool:
64
+ """Check if the port specified in address is in use.
65
+
66
+ Parameters
67
+ ----------
68
+ address : str
69
+ The string representation of a domain, an IPv4, or an IPV6 address
70
+ with the port number.
71
+
72
+ For example, '127.0.0.1:8080', or `[::1]:8080`.
73
+
74
+ Returns
75
+ -------
76
+ bool
77
+ If the port provided is in use or can't be parsed,
78
+ the function will return True, otherwise it will return False.
79
+ """
80
+ parsed_address = parse_address(address)
81
+ if not parsed_address:
82
+ return True
83
+ host, port, is_v6 = parsed_address
84
+
85
+ if is_v6:
86
+ protocol = socket.AF_INET6
87
+ else:
88
+ protocol = socket.AF_INET
89
+
90
+ with socket.socket(protocol, socket.SOCK_STREAM) as s:
91
+ s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
92
+ try:
93
+ if is_v6:
94
+ # For IPv6, provide `flowinfo` and `scopeid` as 0
95
+ s.bind((host, port, 0, 0))
96
+ else:
97
+ # For IPv4
98
+ s.bind((host, port))
99
+ except OSError:
100
+ return True
101
+
102
+ return False
@@ -271,6 +271,7 @@ def run_superlink() -> None:
271
271
  ssl_keyfile,
272
272
  ssl_certfile,
273
273
  state_factory,
274
+ ffs_factory,
274
275
  num_workers,
275
276
  ),
276
277
  )
@@ -310,6 +311,7 @@ def run_superlink() -> None:
310
311
  fleet_server = _run_fleet_api_grpc_adapter(
311
312
  address=fleet_address,
312
313
  state_factory=state_factory,
314
+ ffs_factory=ffs_factory,
313
315
  certificates=certificates,
314
316
  )
315
317
  grpc_servers.append(fleet_server)
@@ -516,12 +518,14 @@ def _run_fleet_api_grpc_rere(
516
518
  def _run_fleet_api_grpc_adapter(
517
519
  address: str,
518
520
  state_factory: StateFactory,
521
+ ffs_factory: FfsFactory,
519
522
  certificates: Optional[Tuple[bytes, bytes, bytes]],
520
523
  ) -> grpc.Server:
521
524
  """Run Fleet API (GrpcAdapter)."""
522
525
  # Create Fleet API gRPC server
523
526
  fleet_servicer = GrpcAdapterServicer(
524
527
  state_factory=state_factory,
528
+ ffs_factory=ffs_factory,
525
529
  )
526
530
  fleet_add_servicer_to_server_fn = add_GrpcAdapterServicer_to_server
527
531
  fleet_grpc_server = generic_create_grpc_server(
@@ -544,6 +548,7 @@ def _run_fleet_api_rest(
544
548
  ssl_keyfile: Optional[str],
545
549
  ssl_certfile: Optional[str],
546
550
  state_factory: StateFactory,
551
+ ffs_factory: FfsFactory,
547
552
  num_workers: int,
548
553
  ) -> None:
549
554
  """Run Driver API (REST-based)."""
@@ -558,6 +563,7 @@ def _run_fleet_api_rest(
558
563
 
559
564
  # See: https://www.starlette.io/applications/#accessing-the-app-instance
560
565
  fast_api_app.state.STATE_FACTORY = state_factory
566
+ fast_api_app.state.FFS_FACTORY = ffs_factory
561
567
 
562
568
  uvicorn.run(
563
569
  app="flwr.server.superlink.fleet.rest_rere.rest_api:app",
@@ -23,6 +23,7 @@ from google.protobuf.message import Message as GrpcMessage
23
23
 
24
24
  from flwr.common.logger import log
25
25
  from flwr.proto import grpcadapter_pb2_grpc # pylint: disable=E0611
26
+ from flwr.proto.fab_pb2 import GetFabRequest, GetFabResponse # pylint: disable=E0611
26
27
  from flwr.proto.fleet_pb2 import ( # pylint: disable=E0611
27
28
  CreateNodeRequest,
28
29
  CreateNodeResponse,
@@ -37,6 +38,7 @@ from flwr.proto.fleet_pb2 import ( # pylint: disable=E0611
37
38
  )
38
39
  from flwr.proto.grpcadapter_pb2 import MessageContainer # pylint: disable=E0611
39
40
  from flwr.proto.run_pb2 import GetRunRequest, GetRunResponse # pylint: disable=E0611
41
+ from flwr.server.superlink.ffs.ffs_factory import FfsFactory
40
42
  from flwr.server.superlink.fleet.message_handler import message_handler
41
43
  from flwr.server.superlink.state import StateFactory
42
44
 
@@ -60,10 +62,11 @@ def _handle(
60
62
  class GrpcAdapterServicer(grpcadapter_pb2_grpc.GrpcAdapterServicer):
61
63
  """Fleet API via GrpcAdapter servicer."""
62
64
 
63
- def __init__(self, state_factory: StateFactory) -> None:
65
+ def __init__(self, state_factory: StateFactory, ffs_factory: FfsFactory) -> None:
64
66
  self.state_factory = state_factory
67
+ self.ffs_factory = ffs_factory
65
68
 
66
- def SendReceive(
69
+ def SendReceive( # pylint: disable=too-many-return-statements
67
70
  self, request: MessageContainer, context: grpc.ServicerContext
68
71
  ) -> MessageContainer:
69
72
  """."""
@@ -80,6 +83,8 @@ class GrpcAdapterServicer(grpcadapter_pb2_grpc.GrpcAdapterServicer):
80
83
  return _handle(request, PushTaskResRequest, self._push_task_res)
81
84
  if request.grpc_message_name == GetRunRequest.__qualname__:
82
85
  return _handle(request, GetRunRequest, self._get_run)
86
+ if request.grpc_message_name == GetFabRequest.__qualname__:
87
+ return _handle(request, GetFabRequest, self._get_fab)
83
88
  raise ValueError(f"Invalid grpc_message_name: {request.grpc_message_name}")
84
89
 
85
90
  def _create_node(self, request: CreateNodeRequest) -> CreateNodeResponse:
@@ -129,3 +134,11 @@ class GrpcAdapterServicer(grpcadapter_pb2_grpc.GrpcAdapterServicer):
129
134
  request=request,
130
135
  state=self.state_factory.state(),
131
136
  )
137
+
138
+ def _get_fab(self, request: GetFabRequest) -> GetFabResponse:
139
+ """Get FAB."""
140
+ log(INFO, "GrpcAdapter.GetFab")
141
+ return message_handler.get_fab(
142
+ request=request,
143
+ ffs=self.ffs_factory.ffs(),
144
+ )
@@ -23,6 +23,7 @@ from typing import Any, Callable, Optional, Sequence, Tuple, Union
23
23
  import grpc
24
24
 
25
25
  from flwr.common import GRPC_MAX_MESSAGE_LENGTH
26
+ from flwr.common.address import is_port_in_use
26
27
  from flwr.common.logger import log
27
28
  from flwr.proto.transport_pb2_grpc import ( # pylint: disable=E0611
28
29
  add_FlowerServiceServicer_to_server,
@@ -218,6 +219,10 @@ def generic_create_grpc_server( # pylint: disable=too-many-arguments
218
219
  server : grpc.Server
219
220
  A non-running instance of a gRPC server.
220
221
  """
222
+ # Check if port is in use
223
+ if is_port_in_use(server_address):
224
+ sys.exit(f"Port in server address {server_address} is already in use.")
225
+
221
226
  # Deconstruct tuple into servicer and function
222
227
  servicer, add_servicer_to_server_fn = servicer_and_add_fn
223
228
 
@@ -0,0 +1,184 @@
1
+ # Copyright 2024 Flower Labs GmbH. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ # ==============================================================================
15
+ """Experimental REST API server."""
16
+
17
+
18
+ from __future__ import annotations
19
+
20
+ import sys
21
+ from typing import Awaitable, Callable, TypeVar
22
+
23
+ from google.protobuf.message import Message as GrpcMessage
24
+
25
+ from flwr.common.constant import MISSING_EXTRA_REST
26
+ from flwr.proto.fab_pb2 import GetFabRequest, GetFabResponse # pylint: disable=E0611
27
+ from flwr.proto.fleet_pb2 import ( # pylint: disable=E0611
28
+ CreateNodeRequest,
29
+ CreateNodeResponse,
30
+ DeleteNodeRequest,
31
+ DeleteNodeResponse,
32
+ PingRequest,
33
+ PingResponse,
34
+ PullTaskInsRequest,
35
+ PullTaskInsResponse,
36
+ PushTaskResRequest,
37
+ PushTaskResResponse,
38
+ )
39
+ from flwr.proto.run_pb2 import GetRunRequest, GetRunResponse # pylint: disable=E0611
40
+ from flwr.server.superlink.ffs.ffs import Ffs
41
+ from flwr.server.superlink.fleet.message_handler import message_handler
42
+ from flwr.server.superlink.state import State
43
+
44
+ try:
45
+ from starlette.applications import Starlette
46
+ from starlette.datastructures import Headers
47
+ from starlette.exceptions import HTTPException
48
+ from starlette.requests import Request
49
+ from starlette.responses import Response
50
+ from starlette.routing import Route
51
+ except ModuleNotFoundError:
52
+ sys.exit(MISSING_EXTRA_REST)
53
+
54
+
55
+ GrpcRequest = TypeVar("GrpcRequest", bound=GrpcMessage)
56
+ GrpcResponse = TypeVar("GrpcResponse", bound=GrpcMessage)
57
+
58
+ GrpcAsyncFunction = Callable[[GrpcRequest], Awaitable[GrpcResponse]]
59
+ RestEndPoint = Callable[[Request], Awaitable[Response]]
60
+
61
+
62
+ def rest_request_response(
63
+ grpc_request_type: type[GrpcRequest],
64
+ ) -> Callable[[GrpcAsyncFunction[GrpcRequest, GrpcResponse]], RestEndPoint]:
65
+ """Convert an async gRPC-based function into a RESTful HTTP endpoint."""
66
+
67
+ def decorator(func: GrpcAsyncFunction[GrpcRequest, GrpcResponse]) -> RestEndPoint:
68
+ async def wrapper(request: Request) -> Response:
69
+ _check_headers(request.headers)
70
+
71
+ # Get the request body as raw bytes
72
+ grpc_req_bytes: bytes = await request.body()
73
+
74
+ # Deserialize ProtoBuf
75
+ grpc_req = grpc_request_type.FromString(grpc_req_bytes)
76
+ grpc_res = await func(grpc_req)
77
+ return Response(
78
+ status_code=200,
79
+ content=grpc_res.SerializeToString(),
80
+ headers={"Content-Type": "application/protobuf"},
81
+ )
82
+
83
+ return wrapper
84
+
85
+ return decorator
86
+
87
+
88
+ @rest_request_response(CreateNodeRequest)
89
+ async def create_node(request: CreateNodeRequest) -> CreateNodeResponse:
90
+ """Create Node."""
91
+ # Get state from app
92
+ state: State = app.state.STATE_FACTORY.state()
93
+
94
+ # Handle message
95
+ return message_handler.create_node(request=request, state=state)
96
+
97
+
98
+ @rest_request_response(DeleteNodeRequest)
99
+ async def delete_node(request: DeleteNodeRequest) -> DeleteNodeResponse:
100
+ """Delete Node Id."""
101
+ # Get state from app
102
+ state: State = app.state.STATE_FACTORY.state()
103
+
104
+ # Handle message
105
+ return message_handler.delete_node(request=request, state=state)
106
+
107
+
108
+ @rest_request_response(PullTaskInsRequest)
109
+ async def pull_task_ins(request: PullTaskInsRequest) -> PullTaskInsResponse:
110
+ """Pull TaskIns."""
111
+ # Get state from app
112
+ state: State = app.state.STATE_FACTORY.state()
113
+
114
+ # Handle message
115
+ return message_handler.pull_task_ins(request=request, state=state)
116
+
117
+
118
+ # Check if token is needed here
119
+ @rest_request_response(PushTaskResRequest)
120
+ async def push_task_res(request: PushTaskResRequest) -> PushTaskResResponse:
121
+ """Push TaskRes."""
122
+ # Get state from app
123
+ state: State = app.state.STATE_FACTORY.state()
124
+
125
+ # Handle message
126
+ return message_handler.push_task_res(request=request, state=state)
127
+
128
+
129
+ @rest_request_response(PingRequest)
130
+ async def ping(request: PingRequest) -> PingResponse:
131
+ """Ping."""
132
+ # Get state from app
133
+ state: State = app.state.STATE_FACTORY.state()
134
+
135
+ # Handle message
136
+ return message_handler.ping(request=request, state=state)
137
+
138
+
139
+ @rest_request_response(GetRunRequest)
140
+ async def get_run(request: GetRunRequest) -> GetRunResponse:
141
+ """GetRun."""
142
+ # Get state from app
143
+ state: State = app.state.STATE_FACTORY.state()
144
+
145
+ # Handle message
146
+ return message_handler.get_run(request=request, state=state)
147
+
148
+
149
+ @rest_request_response(GetFabRequest)
150
+ async def get_fab(request: GetFabRequest) -> GetFabResponse:
151
+ """GetRun."""
152
+ # Get ffs from app
153
+ ffs: Ffs = app.state.FFS_FACTORY.state()
154
+
155
+ # Handle message
156
+ return message_handler.get_fab(request=request, ffs=ffs)
157
+
158
+
159
+ routes = [
160
+ Route("/api/v0/fleet/create-node", create_node, methods=["POST"]),
161
+ Route("/api/v0/fleet/delete-node", delete_node, methods=["POST"]),
162
+ Route("/api/v0/fleet/pull-task-ins", pull_task_ins, methods=["POST"]),
163
+ Route("/api/v0/fleet/push-task-res", push_task_res, methods=["POST"]),
164
+ Route("/api/v0/fleet/ping", ping, methods=["POST"]),
165
+ Route("/api/v0/fleet/get-run", get_run, methods=["POST"]),
166
+ Route("/api/v0/fleet/get-fab", get_fab, methods=["POST"]),
167
+ ]
168
+
169
+ app: Starlette = Starlette(
170
+ debug=False,
171
+ routes=routes,
172
+ )
173
+
174
+
175
+ def _check_headers(headers: Headers) -> None:
176
+ """Check if expected headers are set."""
177
+ if "content-type" not in headers:
178
+ raise HTTPException(status_code=400, detail="Missing header `Content-Type`")
179
+ if headers["content-type"] != "application/protobuf":
180
+ raise HTTPException(status_code=400, detail="Unsupported `Content-Type`")
181
+ if "accept" not in headers:
182
+ raise HTTPException(status_code=400, detail="Missing header `Accept`")
183
+ if headers["accept"] != "application/protobuf":
184
+ raise HTTPException(status_code=400, detail="Unsupported `Accept`")
@@ -33,7 +33,7 @@ class Backend(ABC):
33
33
  """Construct a backend."""
34
34
 
35
35
  @abstractmethod
36
- def build(self) -> None:
36
+ def build(self, app_fn: Callable[[], ClientApp]) -> None:
37
37
  """Build backend.
38
38
 
39
39
  Different components need to be in place before workers in a backend are ready
@@ -60,7 +60,6 @@ class Backend(ABC):
60
60
  @abstractmethod
61
61
  def process_message(
62
62
  self,
63
- app: Callable[[], ClientApp],
64
63
  message: Message,
65
64
  context: Context,
66
65
  ) -> Tuple[Message, Context]:
@@ -16,7 +16,7 @@
16
16
 
17
17
  import sys
18
18
  from logging import DEBUG, ERROR
19
- from typing import Callable, Dict, Tuple, Union
19
+ from typing import Callable, Dict, Optional, Tuple, Union
20
20
 
21
21
  import ray
22
22
 
@@ -63,6 +63,8 @@ class RayBackend(Backend):
63
63
  actor_kwargs=actor_kwargs,
64
64
  )
65
65
 
66
+ self.app_fn: Optional[Callable[[], ClientApp]] = None
67
+
66
68
  def _validate_client_resources(self, config: BackendConfig) -> ClientResourcesDict:
67
69
  client_resources_config = config.get(self.client_resources_key)
68
70
  client_resources: ClientResourcesDict = {}
@@ -126,14 +128,15 @@ class RayBackend(Backend):
126
128
  """Report whether the pool has idle actors."""
127
129
  return self.pool.is_actor_available()
128
130
 
129
- def build(self) -> None:
131
+ def build(self, app_fn: Callable[[], ClientApp]) -> None:
130
132
  """Build pool of Ray actors that this backend will submit jobs to."""
131
133
  self.pool.add_actors_to_pool(self.pool.actors_capacity)
134
+ # Set ClientApp callable that ray actors will use
135
+ self.app_fn = app_fn
132
136
  log(DEBUG, "Constructed ActorPool with: %i actors", self.pool.num_actors)
133
137
 
134
138
  def process_message(
135
139
  self,
136
- app: Callable[[], ClientApp],
137
140
  message: Message,
138
141
  context: Context,
139
142
  ) -> Tuple[Message, Context]:
@@ -143,11 +146,17 @@ class RayBackend(Backend):
143
146
  """
144
147
  partition_id = context.node_config[PARTITION_ID_KEY]
145
148
 
149
+ if self.app_fn is None:
150
+ raise ValueError(
151
+ "Unspecified function to load a `ClientApp`. "
152
+ "Call the backend's `build()` method before processing messages."
153
+ )
154
+
146
155
  try:
147
156
  # Submit a task to the pool
148
157
  future = self.pool.submit(
149
158
  lambda a, a_fn, mssg, cid, state: a.run.remote(a_fn, mssg, cid, state),
150
- (app, message, str(partition_id), context),
159
+ (self.app_fn, message, str(partition_id), context),
151
160
  )
152
161
 
153
162
  # Fetch result