flwr-nightly 1.9.0.dev20240517__tar.gz → 1.9.0.dev20240519__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 (231) hide show
  1. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/PKG-INFO +1 -1
  2. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/pyproject.toml +1 -1
  3. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/cli/new/new.py +2 -0
  4. flwr_nightly-1.9.0.dev20240519/src/py/flwr/cli/new/templates/app/code/client.jax.py.tpl +55 -0
  5. flwr_nightly-1.9.0.dev20240519/src/py/flwr/cli/new/templates/app/code/server.jax.py.tpl +12 -0
  6. flwr_nightly-1.9.0.dev20240519/src/py/flwr/cli/new/templates/app/code/task.jax.py.tpl +57 -0
  7. flwr_nightly-1.9.0.dev20240519/src/py/flwr/cli/new/templates/app/pyproject.jax.toml.tpl +28 -0
  8. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/server/driver/__init__.py +3 -2
  9. flwr_nightly-1.9.0.dev20240519/src/py/flwr/server/driver/inmemory_driver.py +181 -0
  10. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/server/server.py +8 -1
  11. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +6 -1
  12. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/server/workflow/default_workflows.py +48 -25
  13. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/simulation/run_simulation.py +2 -31
  14. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/LICENSE +0 -0
  15. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/README.md +0 -0
  16. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/__init__.py +0 -0
  17. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/cli/__init__.py +0 -0
  18. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/cli/app.py +0 -0
  19. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/cli/build.py +0 -0
  20. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/cli/config_utils.py +0 -0
  21. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/cli/example.py +0 -0
  22. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/cli/new/__init__.py +0 -0
  23. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/cli/new/templates/__init__.py +0 -0
  24. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/cli/new/templates/app/.gitignore.tpl +0 -0
  25. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/cli/new/templates/app/README.md.tpl +0 -0
  26. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/cli/new/templates/app/__init__.py +0 -0
  27. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
  28. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
  29. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/cli/new/templates/app/code/client.hf.py.tpl +0 -0
  30. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/cli/new/templates/app/code/client.mlx.py.tpl +0 -0
  31. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/cli/new/templates/app/code/client.numpy.py.tpl +0 -0
  32. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -0
  33. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl +0 -0
  34. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -0
  35. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/cli/new/templates/app/code/server.hf.py.tpl +0 -0
  36. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/cli/new/templates/app/code/server.mlx.py.tpl +0 -0
  37. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -0
  38. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -0
  39. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/cli/new/templates/app/code/server.sklearn.py.tpl +0 -0
  40. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -0
  41. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/cli/new/templates/app/code/task.hf.py.tpl +0 -0
  42. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/cli/new/templates/app/code/task.mlx.py.tpl +0 -0
  43. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +0 -0
  44. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/cli/new/templates/app/code/task.tensorflow.py.tpl +0 -0
  45. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/cli/new/templates/app/pyproject.hf.toml.tpl +0 -0
  46. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +0 -0
  47. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +0 -0
  48. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +0 -0
  49. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +0 -0
  50. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +0 -0
  51. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/cli/run/__init__.py +0 -0
  52. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/cli/run/run.py +0 -0
  53. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/cli/utils.py +0 -0
  54. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/client/__init__.py +0 -0
  55. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/client/app.py +0 -0
  56. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/client/client.py +0 -0
  57. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/client/client_app.py +0 -0
  58. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/client/dpfedavg_numpy_client.py +0 -0
  59. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/client/grpc_client/__init__.py +0 -0
  60. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/client/grpc_client/connection.py +0 -0
  61. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/client/grpc_rere_client/__init__.py +0 -0
  62. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/client/grpc_rere_client/client_interceptor.py +0 -0
  63. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/client/grpc_rere_client/connection.py +0 -0
  64. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/client/heartbeat.py +0 -0
  65. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/client/message_handler/__init__.py +0 -0
  66. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/client/message_handler/message_handler.py +0 -0
  67. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/client/message_handler/task_handler.py +0 -0
  68. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/client/mod/__init__.py +0 -0
  69. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/client/mod/centraldp_mods.py +0 -0
  70. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/client/mod/comms_mods.py +0 -0
  71. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/client/mod/localdp_mod.py +0 -0
  72. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
  73. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
  74. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
  75. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/client/mod/utils.py +0 -0
  76. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/client/node_state.py +0 -0
  77. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/client/node_state_tests.py +0 -0
  78. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/client/numpy_client.py +0 -0
  79. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/client/rest_client/__init__.py +0 -0
  80. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/client/rest_client/connection.py +0 -0
  81. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/client/supernode/__init__.py +0 -0
  82. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/client/supernode/app.py +0 -0
  83. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/client/typing.py +0 -0
  84. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/common/__init__.py +0 -0
  85. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/common/address.py +0 -0
  86. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/common/constant.py +0 -0
  87. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/common/context.py +0 -0
  88. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/common/date.py +0 -0
  89. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/common/differential_privacy.py +0 -0
  90. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/common/differential_privacy_constants.py +0 -0
  91. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/common/dp.py +0 -0
  92. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/common/exit_handlers.py +0 -0
  93. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/common/grpc.py +0 -0
  94. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/common/logger.py +0 -0
  95. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/common/message.py +0 -0
  96. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/common/object_ref.py +0 -0
  97. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/common/parameter.py +0 -0
  98. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/common/pyproject.py +0 -0
  99. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/common/record/__init__.py +0 -0
  100. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/common/record/configsrecord.py +0 -0
  101. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/common/record/conversion_utils.py +0 -0
  102. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/common/record/metricsrecord.py +0 -0
  103. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/common/record/parametersrecord.py +0 -0
  104. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/common/record/recordset.py +0 -0
  105. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/common/record/typeddict.py +0 -0
  106. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/common/recordset_compat.py +0 -0
  107. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/common/retry_invoker.py +0 -0
  108. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/common/secure_aggregation/__init__.py +0 -0
  109. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
  110. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
  111. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -0
  112. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
  113. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/common/secure_aggregation/quantization.py +0 -0
  114. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
  115. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
  116. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/common/serde.py +0 -0
  117. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/common/telemetry.py +0 -0
  118. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/common/typing.py +0 -0
  119. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/common/version.py +0 -0
  120. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/proto/__init__.py +0 -0
  121. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/proto/driver_pb2.py +0 -0
  122. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/proto/driver_pb2.pyi +0 -0
  123. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/proto/driver_pb2_grpc.py +0 -0
  124. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/proto/driver_pb2_grpc.pyi +0 -0
  125. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/proto/error_pb2.py +0 -0
  126. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/proto/error_pb2.pyi +0 -0
  127. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/proto/error_pb2_grpc.py +0 -0
  128. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/proto/error_pb2_grpc.pyi +0 -0
  129. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/proto/fleet_pb2.py +0 -0
  130. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/proto/fleet_pb2.pyi +0 -0
  131. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/proto/fleet_pb2_grpc.py +0 -0
  132. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
  133. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/proto/node_pb2.py +0 -0
  134. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/proto/node_pb2.pyi +0 -0
  135. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/proto/node_pb2_grpc.py +0 -0
  136. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/proto/node_pb2_grpc.pyi +0 -0
  137. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/proto/recordset_pb2.py +0 -0
  138. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/proto/recordset_pb2.pyi +0 -0
  139. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/proto/recordset_pb2_grpc.py +0 -0
  140. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/proto/recordset_pb2_grpc.pyi +0 -0
  141. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/proto/task_pb2.py +0 -0
  142. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/proto/task_pb2.pyi +0 -0
  143. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/proto/task_pb2_grpc.py +0 -0
  144. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/proto/task_pb2_grpc.pyi +0 -0
  145. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/proto/transport_pb2.py +0 -0
  146. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/proto/transport_pb2.pyi +0 -0
  147. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/proto/transport_pb2_grpc.py +0 -0
  148. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
  149. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/py.typed +0 -0
  150. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/server/__init__.py +0 -0
  151. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/server/app.py +0 -0
  152. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/server/client_manager.py +0 -0
  153. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/server/client_proxy.py +0 -0
  154. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/server/compat/__init__.py +0 -0
  155. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/server/compat/app.py +0 -0
  156. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/server/compat/app_utils.py +0 -0
  157. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/server/compat/driver_client_proxy.py +0 -0
  158. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/server/compat/legacy_context.py +0 -0
  159. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/server/criterion.py +0 -0
  160. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/server/driver/driver.py +0 -0
  161. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/server/driver/grpc_driver.py +0 -0
  162. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/server/history.py +0 -0
  163. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/server/run_serverapp.py +0 -0
  164. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/server/server_app.py +0 -0
  165. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/server/server_config.py +0 -0
  166. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/server/strategy/__init__.py +0 -0
  167. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/server/strategy/aggregate.py +0 -0
  168. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/server/strategy/bulyan.py +0 -0
  169. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
  170. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
  171. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
  172. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
  173. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
  174. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/server/strategy/fedadagrad.py +0 -0
  175. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/server/strategy/fedadam.py +0 -0
  176. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/server/strategy/fedavg.py +0 -0
  177. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/server/strategy/fedavg_android.py +0 -0
  178. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/server/strategy/fedavgm.py +0 -0
  179. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/server/strategy/fedmedian.py +0 -0
  180. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/server/strategy/fedopt.py +0 -0
  181. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/server/strategy/fedprox.py +0 -0
  182. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
  183. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
  184. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
  185. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
  186. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/server/strategy/fedyogi.py +0 -0
  187. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/server/strategy/krum.py +0 -0
  188. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/server/strategy/qfedavg.py +0 -0
  189. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/server/strategy/strategy.py +0 -0
  190. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/server/superlink/__init__.py +0 -0
  191. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/server/superlink/driver/__init__.py +0 -0
  192. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/server/superlink/driver/driver_grpc.py +0 -0
  193. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/server/superlink/driver/driver_servicer.py +0 -0
  194. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/server/superlink/fleet/__init__.py +0 -0
  195. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
  196. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
  197. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
  198. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
  199. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +0 -0
  200. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
  201. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +0 -0
  202. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +0 -0
  203. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
  204. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/server/superlink/fleet/message_handler/message_handler.py +0 -0
  205. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
  206. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +0 -0
  207. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
  208. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
  209. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
  210. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/server/superlink/fleet/vce/vce_api.py +0 -0
  211. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/server/superlink/state/__init__.py +0 -0
  212. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/server/superlink/state/in_memory_state.py +0 -0
  213. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/server/superlink/state/sqlite_state.py +0 -0
  214. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/server/superlink/state/state.py +0 -0
  215. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/server/superlink/state/state_factory.py +0 -0
  216. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/server/superlink/state/utils.py +0 -0
  217. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/server/typing.py +0 -0
  218. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/server/utils/__init__.py +0 -0
  219. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/server/utils/tensorboard.py +0 -0
  220. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/server/utils/validator.py +0 -0
  221. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/server/workflow/__init__.py +0 -0
  222. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/server/workflow/constant.py +0 -0
  223. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
  224. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
  225. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +0 -0
  226. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/simulation/__init__.py +0 -0
  227. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/simulation/app.py +0 -0
  228. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/simulation/ray_transport/__init__.py +0 -0
  229. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
  230. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
  231. {flwr_nightly-1.9.0.dev20240517 → flwr_nightly-1.9.0.dev20240519}/src/py/flwr/simulation/ray_transport/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: flwr-nightly
3
- Version: 1.9.0.dev20240517
3
+ Version: 1.9.0.dev20240519
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.9.0.dev20240517"
7
+ version = "1.9.0.dev20240519"
8
8
  description = "Flower: A Friendly Federated Learning Framework"
9
9
  license = "Apache-2.0"
10
10
  authors = ["The Flower Authors <hello@flower.ai>"]
@@ -37,6 +37,7 @@ class MlFramework(str, Enum):
37
37
  NUMPY = "NumPy"
38
38
  PYTORCH = "PyTorch"
39
39
  TENSORFLOW = "TensorFlow"
40
+ JAX = "JAX"
40
41
  HUGGINGFACE = "HF"
41
42
  MLX = "MLX"
42
43
  SKLEARN = "sklearn"
@@ -155,6 +156,7 @@ def new(
155
156
  # Depending on the framework, generate task.py file
156
157
  frameworks_with_tasks = [
157
158
  MlFramework.PYTORCH.value.lower(),
159
+ MlFramework.JAX.value.lower(),
158
160
  MlFramework.HUGGINGFACE.value.lower(),
159
161
  MlFramework.MLX.value.lower(),
160
162
  MlFramework.TENSORFLOW.value.lower(),
@@ -0,0 +1,55 @@
1
+ """$project_name: A Flower / JAX app."""
2
+
3
+ import jax
4
+ from flwr.client import NumPyClient, ClientApp
5
+
6
+ from $import_name.task import (
7
+ evaluation,
8
+ get_params,
9
+ load_data,
10
+ load_model,
11
+ loss_fn,
12
+ set_params,
13
+ train,
14
+ )
15
+
16
+
17
+ # Define Flower Client and client_fn
18
+ class FlowerClient(NumPyClient):
19
+ def __init__(self):
20
+ self.train_x, self.train_y, self.test_x, self.test_y = load_data()
21
+ self.grad_fn = jax.grad(loss_fn)
22
+ model_shape = self.train_x.shape[1:]
23
+
24
+ self.params = load_model(model_shape)
25
+
26
+ def get_parameters(self, config):
27
+ return get_params(self.params)
28
+
29
+ def set_parameters(self, parameters):
30
+ set_params(self.params, parameters)
31
+
32
+ def fit(self, parameters, config):
33
+ self.set_parameters(parameters)
34
+ self.params, loss, num_examples = train(
35
+ self.params, self.grad_fn, self.train_x, self.train_y
36
+ )
37
+ parameters = self.get_parameters(config={})
38
+ return parameters, num_examples, {"loss": float(loss)}
39
+
40
+ def evaluate(self, parameters, config):
41
+ self.set_parameters(parameters)
42
+ loss, num_examples = evaluation(
43
+ self.params, self.grad_fn, self.test_x, self.test_y
44
+ )
45
+ return float(loss), num_examples, {"loss": float(loss)}
46
+
47
+ def client_fn(cid):
48
+ # Return Client instance
49
+ return FlowerClient().to_client()
50
+
51
+
52
+ # Flower ClientApp
53
+ app = ClientApp(
54
+ client_fn,
55
+ )
@@ -0,0 +1,12 @@
1
+ """$project_name: A Flower / JAX app."""
2
+
3
+ import flwr as fl
4
+
5
+ # Configure the strategy
6
+ strategy = fl.server.strategy.FedAvg()
7
+
8
+ # Flower ServerApp
9
+ app = fl.server.ServerApp(
10
+ config=fl.server.ServerConfig(num_rounds=3),
11
+ strategy=strategy,
12
+ )
@@ -0,0 +1,57 @@
1
+ """$project_name: A Flower / JAX app."""
2
+
3
+ import jax
4
+ import jax.numpy as jnp
5
+ from sklearn.datasets import make_regression
6
+ from sklearn.model_selection import train_test_split
7
+ import numpy as np
8
+
9
+ key = jax.random.PRNGKey(0)
10
+
11
+
12
+ def load_data():
13
+ # Load dataset
14
+ X, y = make_regression(n_features=3, random_state=0)
15
+ X, X_test, y, y_test = train_test_split(X, y)
16
+ return X, y, X_test, y_test
17
+
18
+
19
+ def load_model(model_shape):
20
+ # Extract model parameters
21
+ params = {"b": jax.random.uniform(key), "w": jax.random.uniform(key, model_shape)}
22
+ return params
23
+
24
+
25
+ def loss_fn(params, X, y):
26
+ # Return MSE as loss
27
+ err = jnp.dot(X, params["w"]) + params["b"] - y
28
+ return jnp.mean(jnp.square(err))
29
+
30
+
31
+ def train(params, grad_fn, X, y):
32
+ loss = 1_000_000
33
+ num_examples = X.shape[0]
34
+ for epochs in range(50):
35
+ grads = grad_fn(params, X, y)
36
+ params = jax.tree.map(lambda p, g: p - 0.05 * g, params, grads)
37
+ loss = loss_fn(params, X, y)
38
+ return params, loss, num_examples
39
+
40
+
41
+ def evaluation(params, grad_fn, X_test, y_test):
42
+ num_examples = X_test.shape[0]
43
+ err_test = loss_fn(params, X_test, y_test)
44
+ loss_test = jnp.mean(jnp.square(err_test))
45
+ return loss_test, num_examples
46
+
47
+
48
+ def get_params(params):
49
+ parameters = []
50
+ for _, val in params.items():
51
+ parameters.append(np.array(val))
52
+ return parameters
53
+
54
+
55
+ def set_params(local_params, global_params):
56
+ for key, value in list(zip(local_params.keys(), global_params)):
57
+ local_params[key] = value
@@ -0,0 +1,28 @@
1
+ [build-system]
2
+ requires = ["hatchling"]
3
+ build-backend = "hatchling.build"
4
+
5
+ [project]
6
+ name = "$package_name"
7
+ version = "1.0.0"
8
+ description = ""
9
+ authors = [
10
+ { name = "The Flower Authors", email = "hello@flower.ai" },
11
+ ]
12
+ license = {text = "Apache License (2.0)"}
13
+ dependencies = [
14
+ "flwr[simulation]>=1.8.0,<2.0",
15
+ "jax==0.4.26",
16
+ "jaxlib==0.4.26",
17
+ "scikit-learn==1.4.2",
18
+ ]
19
+
20
+ [tool.hatch.build.targets.wheel]
21
+ packages = ["."]
22
+
23
+ [flower]
24
+ publisher = "$username"
25
+
26
+ [flower.components]
27
+ serverapp = "$import_name.server:app"
28
+ clientapp = "$import_name.client:app"
@@ -16,10 +16,11 @@
16
16
 
17
17
 
18
18
  from .driver import Driver
19
- from .grpc_driver import GrpcDriver, GrpcDriverHelper
19
+ from .grpc_driver import GrpcDriver
20
+ from .inmemory_driver import InMemoryDriver
20
21
 
21
22
  __all__ = [
22
23
  "Driver",
23
24
  "GrpcDriver",
24
- "GrpcDriverHelper",
25
+ "InMemoryDriver",
25
26
  ]
@@ -0,0 +1,181 @@
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
+ """Flower in-memory Driver."""
16
+
17
+
18
+ import time
19
+ import warnings
20
+ from typing import Iterable, List, Optional
21
+ from uuid import UUID
22
+
23
+ from flwr.common import DEFAULT_TTL, Message, Metadata, RecordSet
24
+ from flwr.common.serde import message_from_taskres, message_to_taskins
25
+ from flwr.proto.node_pb2 import Node # pylint: disable=E0611
26
+ from flwr.server.superlink.state import StateFactory
27
+
28
+ from .driver import Driver
29
+
30
+
31
+ class InMemoryDriver(Driver):
32
+ """`InMemoryDriver` class provides an interface to the Driver API.
33
+
34
+ Parameters
35
+ ----------
36
+ state_factory : StateFactory
37
+ A StateFactory embedding a state that this driver can interface with.
38
+ fab_id : str (default: None)
39
+ The identifier of the FAB used in the run.
40
+ fab_version : str (default: None)
41
+ The version of the FAB used in the run.
42
+ """
43
+
44
+ def __init__(
45
+ self,
46
+ state_factory: StateFactory,
47
+ fab_id: Optional[str] = None,
48
+ fab_version: Optional[str] = None,
49
+ ) -> None:
50
+ self.run_id: Optional[int] = None
51
+ self.fab_id = fab_id if fab_id is not None else ""
52
+ self.fab_version = fab_version if fab_version is not None else ""
53
+ self.node = Node(node_id=0, anonymous=True)
54
+ self.state = state_factory.state()
55
+
56
+ def _check_message(self, message: Message) -> None:
57
+ # Check if the message is valid
58
+ if not (
59
+ message.metadata.run_id == self.run_id
60
+ and message.metadata.src_node_id == self.node.node_id
61
+ and message.metadata.message_id == ""
62
+ and message.metadata.reply_to_message == ""
63
+ and message.metadata.ttl > 0
64
+ ):
65
+ raise ValueError(f"Invalid message: {message}")
66
+
67
+ def _get_run_id(self) -> int:
68
+ """Return run_id.
69
+
70
+ If unset, create a new run.
71
+ """
72
+ if self.run_id is None:
73
+ self.run_id = self.state.create_run(
74
+ fab_id=self.fab_id, fab_version=self.fab_version
75
+ )
76
+ return self.run_id
77
+
78
+ def create_message( # pylint: disable=too-many-arguments
79
+ self,
80
+ content: RecordSet,
81
+ message_type: str,
82
+ dst_node_id: int,
83
+ group_id: str,
84
+ ttl: Optional[float] = None,
85
+ ) -> Message:
86
+ """Create a new message with specified parameters.
87
+
88
+ This method constructs a new `Message` with given content and metadata.
89
+ The `run_id` and `src_node_id` will be set automatically.
90
+ """
91
+ run_id = self._get_run_id()
92
+ if ttl:
93
+ warnings.warn(
94
+ "A custom TTL was set, but note that the SuperLink does not enforce "
95
+ "the TTL yet. The SuperLink will start enforcing the TTL in a future "
96
+ "version of Flower.",
97
+ stacklevel=2,
98
+ )
99
+ ttl_ = DEFAULT_TTL if ttl is None else ttl
100
+
101
+ metadata = Metadata(
102
+ run_id=run_id,
103
+ message_id="", # Will be set by the server
104
+ src_node_id=self.node.node_id,
105
+ dst_node_id=dst_node_id,
106
+ reply_to_message="",
107
+ group_id=group_id,
108
+ ttl=ttl_,
109
+ message_type=message_type,
110
+ )
111
+ return Message(metadata=metadata, content=content)
112
+
113
+ def get_node_ids(self) -> List[int]:
114
+ """Get node IDs."""
115
+ run_id = self._get_run_id()
116
+ return list(self.state.get_nodes(run_id))
117
+
118
+ def push_messages(self, messages: Iterable[Message]) -> Iterable[str]:
119
+ """Push messages to specified node IDs.
120
+
121
+ This method takes an iterable of messages and sends each message
122
+ to the node specified in `dst_node_id`.
123
+ """
124
+ task_ids: List[str] = []
125
+ for msg in messages:
126
+ # Check message
127
+ self._check_message(msg)
128
+ # Convert Message to TaskIns
129
+ taskins = message_to_taskins(msg)
130
+ # Store in state
131
+ taskins.task.pushed_at = time.time()
132
+ task_id = self.state.store_task_ins(taskins)
133
+ if task_id:
134
+ task_ids.append(str(task_id))
135
+
136
+ return task_ids
137
+
138
+ def pull_messages(self, message_ids: Iterable[str]) -> Iterable[Message]:
139
+ """Pull messages based on message IDs.
140
+
141
+ This method is used to collect messages from the SuperLink that correspond to a
142
+ set of given message IDs.
143
+ """
144
+ msg_ids = {UUID(msg_id) for msg_id in message_ids}
145
+ # Pull TaskRes
146
+ task_res_list = self.state.get_task_res(task_ids=msg_ids, limit=len(msg_ids))
147
+ # Delete tasks in state
148
+ self.state.delete_tasks(msg_ids)
149
+ # Convert TaskRes to Message
150
+ msgs = [message_from_taskres(taskres) for taskres in task_res_list]
151
+ return msgs
152
+
153
+ def send_and_receive(
154
+ self,
155
+ messages: Iterable[Message],
156
+ *,
157
+ timeout: Optional[float] = None,
158
+ ) -> Iterable[Message]:
159
+ """Push messages to specified node IDs and pull the reply messages.
160
+
161
+ This method sends a list of messages to their destination node IDs and then
162
+ waits for the replies. It continues to pull replies until either all replies are
163
+ received or the specified timeout duration is exceeded.
164
+ """
165
+ # Push messages
166
+ msg_ids = set(self.push_messages(messages))
167
+
168
+ # Pull messages
169
+ end_time = time.time() + (timeout if timeout is not None else 0.0)
170
+ ret: List[Message] = []
171
+ while timeout is None or time.time() < end_time:
172
+ res_msgs = self.pull_messages(msg_ids)
173
+ ret.extend(res_msgs)
174
+ msg_ids.difference_update(
175
+ {msg.metadata.reply_to_message for msg in res_msgs}
176
+ )
177
+ if len(msg_ids) == 0:
178
+ break
179
+ # Sleep
180
+ time.sleep(3)
181
+ return ret
@@ -282,7 +282,14 @@ class Server:
282
282
  get_parameters_res = random_client.get_parameters(
283
283
  ins=ins, timeout=timeout, group_id=server_round
284
284
  )
285
- log(INFO, "Received initial parameters from one random client")
285
+ if get_parameters_res.status.code == Code.OK:
286
+ log(INFO, "Received initial parameters from one random client")
287
+ else:
288
+ log(
289
+ WARN,
290
+ "Failed to receive initial parameters from the client."
291
+ " Empty initial parameters will be used.",
292
+ )
286
293
  return get_parameters_res.parameters
287
294
 
288
295
 
@@ -55,7 +55,12 @@ class RayBackend(Backend):
55
55
  runtime_env = (
56
56
  self._configure_runtime_env(work_dir=work_dir) if work_dir else None
57
57
  )
58
- if backend_config.get("silent", False):
58
+
59
+ if backend_config.get("mute_logging", False):
60
+ init_ray(
61
+ logging_level=WARNING, log_to_driver=False, runtime_env=runtime_env
62
+ )
63
+ elif backend_config.get("silent", False):
59
64
  init_ray(logging_level=WARNING, log_to_driver=True, runtime_env=runtime_env)
60
65
  else:
61
66
  init_ray(runtime_env=runtime_env)
@@ -18,12 +18,22 @@
18
18
  import io
19
19
  import timeit
20
20
  from logging import INFO, WARN
21
- from typing import Optional, cast
21
+ from typing import List, Optional, Tuple, Union, cast
22
22
 
23
23
  import flwr.common.recordset_compat as compat
24
- from flwr.common import ConfigsRecord, Context, GetParametersIns, ParametersRecord, log
24
+ from flwr.common import (
25
+ Code,
26
+ ConfigsRecord,
27
+ Context,
28
+ EvaluateRes,
29
+ FitRes,
30
+ GetParametersIns,
31
+ ParametersRecord,
32
+ log,
33
+ )
25
34
  from flwr.common.constant import MessageType, MessageTypeLegacy
26
35
 
36
+ from ..client_proxy import ClientProxy
27
37
  from ..compat.app_utils import start_update_client_manager_thread
28
38
  from ..compat.legacy_context import LegacyContext
29
39
  from ..driver import Driver
@@ -136,7 +146,14 @@ def default_init_params_workflow(driver: Driver, context: Context) -> None:
136
146
  ]
137
147
  )
138
148
  msg = list(messages)[0]
139
- if msg.has_content():
149
+
150
+ if (
151
+ msg.has_content()
152
+ and compat._extract_status_from_recordset( # pylint: disable=W0212
153
+ "getparametersres", msg.content
154
+ ).code
155
+ == Code.OK
156
+ ):
140
157
  log(INFO, "Received initial parameters from one random client")
141
158
  paramsrecord = next(iter(msg.content.parameters_records.values()))
142
159
  else:
@@ -257,18 +274,20 @@ def default_fit_workflow( # pylint: disable=R0914
257
274
  )
258
275
 
259
276
  # Aggregate training results
260
- results = [
261
- (
262
- node_id_to_proxy[msg.metadata.src_node_id],
263
- compat.recordset_to_fitres(msg.content, False),
264
- )
265
- for msg in messages
266
- if msg.has_content()
267
- ]
268
- failures = [Exception(msg.error) for msg in messages if msg.has_error()]
269
- aggregated_result = context.strategy.aggregate_fit(
270
- current_round, results, failures # type: ignore
271
- )
277
+ results: List[Tuple[ClientProxy, FitRes]] = []
278
+ failures: List[Union[Tuple[ClientProxy, FitRes], BaseException]] = []
279
+ for msg in messages:
280
+ if msg.has_content():
281
+ proxy = node_id_to_proxy[msg.metadata.src_node_id]
282
+ fitres = compat.recordset_to_fitres(msg.content, False)
283
+ if fitres.status.code == Code.OK:
284
+ results.append((proxy, fitres))
285
+ else:
286
+ failures.append((proxy, fitres))
287
+ else:
288
+ failures.append(Exception(msg.error))
289
+
290
+ aggregated_result = context.strategy.aggregate_fit(current_round, results, failures)
272
291
  parameters_aggregated, metrics_aggregated = aggregated_result
273
292
 
274
293
  # Update the parameters and write history
@@ -341,17 +360,21 @@ def default_evaluate_workflow(driver: Driver, context: Context) -> None:
341
360
  )
342
361
 
343
362
  # Aggregate the evaluation results
344
- results = [
345
- (
346
- node_id_to_proxy[msg.metadata.src_node_id],
347
- compat.recordset_to_evaluateres(msg.content),
348
- )
349
- for msg in messages
350
- if msg.has_content()
351
- ]
352
- failures = [Exception(msg.error) for msg in messages if msg.has_error()]
363
+ results: List[Tuple[ClientProxy, EvaluateRes]] = []
364
+ failures: List[Union[Tuple[ClientProxy, EvaluateRes], BaseException]] = []
365
+ for msg in messages:
366
+ if msg.has_content():
367
+ proxy = node_id_to_proxy[msg.metadata.src_node_id]
368
+ evalres = compat.recordset_to_evaluateres(msg.content)
369
+ if evalres.status.code == Code.OK:
370
+ results.append((proxy, evalres))
371
+ else:
372
+ failures.append((proxy, evalres))
373
+ else:
374
+ failures.append(Exception(msg.error))
375
+
353
376
  aggregated_result = context.strategy.aggregate_evaluate(
354
- current_round, results, failures # type: ignore
377
+ current_round, results, failures
355
378
  )
356
379
 
357
380
  loss_aggregated, metrics_aggregated = aggregated_result
@@ -24,16 +24,13 @@ from logging import DEBUG, ERROR, INFO, WARNING
24
24
  from time import sleep
25
25
  from typing import Dict, Optional
26
26
 
27
- import grpc
28
-
29
27
  from flwr.client import ClientApp
30
28
  from flwr.common import EventType, event, log
31
29
  from flwr.common.logger import set_logger_propagation, update_console_handler
32
30
  from flwr.common.typing import ConfigsRecordValues
33
- from flwr.server.driver import Driver, GrpcDriver
31
+ from flwr.server.driver import Driver, InMemoryDriver
34
32
  from flwr.server.run_serverapp import run
35
33
  from flwr.server.server_app import ServerApp
36
- from flwr.server.superlink.driver.driver_grpc import run_driver_api_grpc
37
34
  from flwr.server.superlink.fleet import vce
38
35
  from flwr.server.superlink.state import StateFactory
39
36
  from flwr.simulation.ray_transport.utils import (
@@ -56,7 +53,6 @@ def run_simulation_from_cli() -> None:
56
53
  backend_name=args.backend,
57
54
  backend_config=backend_config_dict,
58
55
  app_dir=args.app_dir,
59
- driver_api_address=args.driver_api_address,
60
56
  enable_tf_gpu_growth=args.enable_tf_gpu_growth,
61
57
  verbose_logging=args.verbose,
62
58
  )
@@ -177,7 +173,6 @@ def _main_loop(
177
173
  num_supernodes: int,
178
174
  backend_name: str,
179
175
  backend_config_stream: str,
180
- driver_api_address: str,
181
176
  app_dir: str,
182
177
  enable_tf_gpu_growth: bool,
183
178
  client_app: Optional[ClientApp] = None,
@@ -194,21 +189,11 @@ def _main_loop(
194
189
  # Initialize StateFactory
195
190
  state_factory = StateFactory(":flwr-in-memory-state:")
196
191
 
197
- # Start Driver API
198
- driver_server: grpc.Server = run_driver_api_grpc(
199
- address=driver_api_address,
200
- state_factory=state_factory,
201
- certificates=None,
202
- )
203
-
204
192
  f_stop = asyncio.Event()
205
193
  serverapp_th = None
206
194
  try:
207
195
  # Initialize Driver
208
- driver = GrpcDriver(
209
- driver_service_address=driver_api_address,
210
- root_certificates=None,
211
- )
196
+ driver = InMemoryDriver(state_factory)
212
197
 
213
198
  # Get and run ServerApp thread
214
199
  serverapp_th = run_serverapp_th(
@@ -239,9 +224,6 @@ def _main_loop(
239
224
  raise RuntimeError("An error was encountered. Ending simulation.") from ex
240
225
 
241
226
  finally:
242
- # Stop Driver
243
- driver_server.stop(grace=0)
244
- driver.close()
245
227
  # Trigger stop event
246
228
  f_stop.set()
247
229
 
@@ -262,7 +244,6 @@ def _run_simulation(
262
244
  client_app_attr: Optional[str] = None,
263
245
  server_app_attr: Optional[str] = None,
264
246
  app_dir: str = "",
265
- driver_api_address: str = "0.0.0.0:9091",
266
247
  enable_tf_gpu_growth: bool = False,
267
248
  verbose_logging: bool = False,
268
249
  ) -> None:
@@ -302,9 +283,6 @@ def _run_simulation(
302
283
  Add specified directory to the PYTHONPATH and load `ClientApp` from there.
303
284
  (Default: current working directory.)
304
285
 
305
- driver_api_address : str (default: "0.0.0.0:9091")
306
- Driver API (gRPC) server address (IPv4, IPv6, or a domain name)
307
-
308
286
  enable_tf_gpu_growth : bool (default: False)
309
287
  A boolean to indicate whether to enable GPU growth on the main thread. This is
310
288
  desirable if you make use of a TensorFlow model on your `ServerApp` while
@@ -342,7 +320,6 @@ def _run_simulation(
342
320
  num_supernodes,
343
321
  backend_name,
344
322
  backend_config_stream,
345
- driver_api_address,
346
323
  app_dir,
347
324
  enable_tf_gpu_growth,
348
325
  client_app,
@@ -399,12 +376,6 @@ def _parse_args_run_simulation() -> argparse.ArgumentParser:
399
376
  required=True,
400
377
  help="Number of simulated SuperNodes.",
401
378
  )
402
- parser.add_argument(
403
- "--driver-api-address",
404
- default="0.0.0.0:9091",
405
- type=str,
406
- help="For example: `server:app` or `project.package.module:wrapper.app`",
407
- )
408
379
  parser.add_argument(
409
380
  "--backend",
410
381
  default="ray",