flwr-nightly 1.9.0.dev20240509__tar.gz → 1.9.0.dev20240520__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.dev20240509 → flwr_nightly-1.9.0.dev20240520}/PKG-INFO +2 -1
  2. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/README.md +1 -0
  3. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/pyproject.toml +1 -1
  4. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/new/new.py +2 -0
  5. flwr_nightly-1.9.0.dev20240520/src/py/flwr/cli/new/templates/app/code/client.jax.py.tpl +55 -0
  6. flwr_nightly-1.9.0.dev20240520/src/py/flwr/cli/new/templates/app/code/server.jax.py.tpl +12 -0
  7. flwr_nightly-1.9.0.dev20240520/src/py/flwr/cli/new/templates/app/code/task.jax.py.tpl +57 -0
  8. flwr_nightly-1.9.0.dev20240520/src/py/flwr/cli/new/templates/app/pyproject.jax.toml.tpl +28 -0
  9. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/client/mod/comms_mods.py +4 -4
  10. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/client/mod/localdp_mod.py +1 -2
  11. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/driver/__init__.py +3 -2
  12. flwr_nightly-1.9.0.dev20240520/src/py/flwr/server/driver/inmemory_driver.py +181 -0
  13. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/server.py +9 -2
  14. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/strategy/dp_adaptive_clipping.py +2 -4
  15. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/strategy/dp_fixed_clipping.py +2 -4
  16. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/superlink/driver/driver_servicer.py +2 -2
  17. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +8 -3
  18. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/superlink/fleet/vce/vce_api.py +1 -1
  19. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/workflow/default_workflows.py +67 -22
  20. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/simulation/run_simulation.py +2 -31
  21. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/LICENSE +0 -0
  22. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/__init__.py +0 -0
  23. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/__init__.py +0 -0
  24. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/app.py +0 -0
  25. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/build.py +0 -0
  26. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/config_utils.py +0 -0
  27. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/example.py +0 -0
  28. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/new/__init__.py +0 -0
  29. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/new/templates/__init__.py +0 -0
  30. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/new/templates/app/.gitignore.tpl +0 -0
  31. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/new/templates/app/README.md.tpl +0 -0
  32. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/new/templates/app/__init__.py +0 -0
  33. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
  34. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
  35. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/new/templates/app/code/client.hf.py.tpl +0 -0
  36. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/new/templates/app/code/client.mlx.py.tpl +0 -0
  37. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/new/templates/app/code/client.numpy.py.tpl +0 -0
  38. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -0
  39. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl +0 -0
  40. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -0
  41. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/new/templates/app/code/server.hf.py.tpl +0 -0
  42. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/new/templates/app/code/server.mlx.py.tpl +0 -0
  43. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -0
  44. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -0
  45. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/new/templates/app/code/server.sklearn.py.tpl +0 -0
  46. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -0
  47. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/new/templates/app/code/task.hf.py.tpl +0 -0
  48. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/new/templates/app/code/task.mlx.py.tpl +0 -0
  49. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +0 -0
  50. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/new/templates/app/code/task.tensorflow.py.tpl +0 -0
  51. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/new/templates/app/pyproject.hf.toml.tpl +0 -0
  52. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +0 -0
  53. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +0 -0
  54. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +0 -0
  55. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +0 -0
  56. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +0 -0
  57. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/run/__init__.py +0 -0
  58. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/run/run.py +0 -0
  59. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/utils.py +0 -0
  60. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/client/__init__.py +0 -0
  61. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/client/app.py +0 -0
  62. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/client/client.py +0 -0
  63. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/client/client_app.py +0 -0
  64. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/client/dpfedavg_numpy_client.py +0 -0
  65. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/client/grpc_client/__init__.py +0 -0
  66. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/client/grpc_client/connection.py +0 -0
  67. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/client/grpc_rere_client/__init__.py +0 -0
  68. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/client/grpc_rere_client/client_interceptor.py +0 -0
  69. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/client/grpc_rere_client/connection.py +0 -0
  70. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/client/heartbeat.py +0 -0
  71. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/client/message_handler/__init__.py +0 -0
  72. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/client/message_handler/message_handler.py +0 -0
  73. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/client/message_handler/task_handler.py +0 -0
  74. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/client/mod/__init__.py +0 -0
  75. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/client/mod/centraldp_mods.py +0 -0
  76. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
  77. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
  78. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
  79. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/client/mod/utils.py +0 -0
  80. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/client/node_state.py +0 -0
  81. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/client/node_state_tests.py +0 -0
  82. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/client/numpy_client.py +0 -0
  83. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/client/rest_client/__init__.py +0 -0
  84. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/client/rest_client/connection.py +0 -0
  85. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/client/supernode/__init__.py +0 -0
  86. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/client/supernode/app.py +0 -0
  87. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/client/typing.py +0 -0
  88. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/__init__.py +0 -0
  89. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/address.py +0 -0
  90. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/constant.py +0 -0
  91. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/context.py +0 -0
  92. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/date.py +0 -0
  93. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/differential_privacy.py +0 -0
  94. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/differential_privacy_constants.py +0 -0
  95. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/dp.py +0 -0
  96. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/exit_handlers.py +0 -0
  97. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/grpc.py +0 -0
  98. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/logger.py +0 -0
  99. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/message.py +0 -0
  100. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/object_ref.py +0 -0
  101. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/parameter.py +0 -0
  102. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/pyproject.py +0 -0
  103. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/record/__init__.py +0 -0
  104. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/record/configsrecord.py +0 -0
  105. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/record/conversion_utils.py +0 -0
  106. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/record/metricsrecord.py +0 -0
  107. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/record/parametersrecord.py +0 -0
  108. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/record/recordset.py +0 -0
  109. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/record/typeddict.py +0 -0
  110. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/recordset_compat.py +0 -0
  111. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/retry_invoker.py +0 -0
  112. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/secure_aggregation/__init__.py +0 -0
  113. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
  114. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
  115. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -0
  116. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
  117. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/secure_aggregation/quantization.py +0 -0
  118. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
  119. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
  120. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/serde.py +0 -0
  121. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/telemetry.py +0 -0
  122. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/typing.py +0 -0
  123. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/version.py +0 -0
  124. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/proto/__init__.py +0 -0
  125. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/proto/driver_pb2.py +0 -0
  126. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/proto/driver_pb2.pyi +0 -0
  127. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/proto/driver_pb2_grpc.py +0 -0
  128. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/proto/driver_pb2_grpc.pyi +0 -0
  129. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/proto/error_pb2.py +0 -0
  130. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/proto/error_pb2.pyi +0 -0
  131. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/proto/error_pb2_grpc.py +0 -0
  132. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/proto/error_pb2_grpc.pyi +0 -0
  133. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/proto/fleet_pb2.py +0 -0
  134. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/proto/fleet_pb2.pyi +0 -0
  135. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/proto/fleet_pb2_grpc.py +0 -0
  136. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
  137. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/proto/node_pb2.py +0 -0
  138. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/proto/node_pb2.pyi +0 -0
  139. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/proto/node_pb2_grpc.py +0 -0
  140. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/proto/node_pb2_grpc.pyi +0 -0
  141. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/proto/recordset_pb2.py +0 -0
  142. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/proto/recordset_pb2.pyi +0 -0
  143. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/proto/recordset_pb2_grpc.py +0 -0
  144. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/proto/recordset_pb2_grpc.pyi +0 -0
  145. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/proto/task_pb2.py +0 -0
  146. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/proto/task_pb2.pyi +0 -0
  147. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/proto/task_pb2_grpc.py +0 -0
  148. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/proto/task_pb2_grpc.pyi +0 -0
  149. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/proto/transport_pb2.py +0 -0
  150. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/proto/transport_pb2.pyi +0 -0
  151. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/proto/transport_pb2_grpc.py +0 -0
  152. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
  153. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/py.typed +0 -0
  154. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/__init__.py +0 -0
  155. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/app.py +0 -0
  156. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/client_manager.py +0 -0
  157. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/client_proxy.py +0 -0
  158. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/compat/__init__.py +0 -0
  159. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/compat/app.py +0 -0
  160. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/compat/app_utils.py +0 -0
  161. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/compat/driver_client_proxy.py +0 -0
  162. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/compat/legacy_context.py +0 -0
  163. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/criterion.py +0 -0
  164. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/driver/driver.py +0 -0
  165. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/driver/grpc_driver.py +0 -0
  166. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/history.py +0 -0
  167. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/run_serverapp.py +0 -0
  168. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/server_app.py +0 -0
  169. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/server_config.py +0 -0
  170. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/strategy/__init__.py +0 -0
  171. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/strategy/aggregate.py +0 -0
  172. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/strategy/bulyan.py +0 -0
  173. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
  174. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
  175. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
  176. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/strategy/fedadagrad.py +0 -0
  177. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/strategy/fedadam.py +0 -0
  178. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/strategy/fedavg.py +0 -0
  179. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/strategy/fedavg_android.py +0 -0
  180. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/strategy/fedavgm.py +0 -0
  181. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/strategy/fedmedian.py +0 -0
  182. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/strategy/fedopt.py +0 -0
  183. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/strategy/fedprox.py +0 -0
  184. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
  185. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
  186. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
  187. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
  188. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/strategy/fedyogi.py +0 -0
  189. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/strategy/krum.py +0 -0
  190. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/strategy/qfedavg.py +0 -0
  191. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/strategy/strategy.py +0 -0
  192. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/superlink/__init__.py +0 -0
  193. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/superlink/driver/__init__.py +0 -0
  194. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/superlink/driver/driver_grpc.py +0 -0
  195. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/superlink/fleet/__init__.py +0 -0
  196. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
  197. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
  198. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
  199. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
  200. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +0 -0
  201. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
  202. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +0 -0
  203. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +0 -0
  204. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
  205. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/superlink/fleet/message_handler/message_handler.py +0 -0
  206. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
  207. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +0 -0
  208. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
  209. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
  210. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
  211. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/superlink/state/__init__.py +0 -0
  212. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/superlink/state/in_memory_state.py +0 -0
  213. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/superlink/state/sqlite_state.py +0 -0
  214. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/superlink/state/state.py +0 -0
  215. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/superlink/state/state_factory.py +0 -0
  216. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/superlink/state/utils.py +0 -0
  217. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/typing.py +0 -0
  218. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/utils/__init__.py +0 -0
  219. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/utils/tensorboard.py +0 -0
  220. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/utils/validator.py +0 -0
  221. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/workflow/__init__.py +0 -0
  222. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/workflow/constant.py +0 -0
  223. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
  224. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
  225. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +0 -0
  226. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/simulation/__init__.py +0 -0
  227. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/simulation/app.py +0 -0
  228. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/simulation/ray_transport/__init__.py +0 -0
  229. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
  230. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
  231. {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/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.dev20240509
3
+ Version: 1.9.0.dev20240520
4
4
  Summary: Flower: A Friendly Federated Learning Framework
5
5
  Home-page: https://flower.ai
6
6
  License: Apache-2.0
@@ -202,6 +202,7 @@ Other [examples](https://github.com/adap/flower/tree/main/examples):
202
202
  - [Comprehensive Flower+XGBoost](https://github.com/adap/flower/tree/main/examples/xgboost-comprehensive)
203
203
  - [Flower through Docker Compose and with Grafana dashboard](https://github.com/adap/flower/tree/main/examples/flower-via-docker-compose)
204
204
  - [Flower with KaplanMeierFitter from the lifelines library](https://github.com/adap/flower/tree/main/examples/federated-kaplna-meier-fitter)
205
+ - [Sample Level Privacy with Opacus](https://github.com/adap/flower/tree/main/examples/opacus)
205
206
 
206
207
  ## Community
207
208
 
@@ -151,6 +151,7 @@ Other [examples](https://github.com/adap/flower/tree/main/examples):
151
151
  - [Comprehensive Flower+XGBoost](https://github.com/adap/flower/tree/main/examples/xgboost-comprehensive)
152
152
  - [Flower through Docker Compose and with Grafana dashboard](https://github.com/adap/flower/tree/main/examples/flower-via-docker-compose)
153
153
  - [Flower with KaplanMeierFitter from the lifelines library](https://github.com/adap/flower/tree/main/examples/federated-kaplna-meier-fitter)
154
+ - [Sample Level Privacy with Opacus](https://github.com/adap/flower/tree/main/examples/opacus)
154
155
 
155
156
  ## Community
156
157
 
@@ -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.dev20240509"
7
+ version = "1.9.0.dev20240520"
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"
@@ -29,7 +29,7 @@ def message_size_mod(
29
29
  ) -> Message:
30
30
  """Message size mod.
31
31
 
32
- This mod logs the size in Bytes of the message being transmited.
32
+ This mod logs the size in bytes of the message being transmited.
33
33
  """
34
34
  message_size_in_bytes = 0
35
35
 
@@ -42,7 +42,7 @@ def message_size_mod(
42
42
  for m_record in msg.content.metrics_records.values():
43
43
  message_size_in_bytes += m_record.count_bytes()
44
44
 
45
- log(INFO, "Message size: %i Bytes", message_size_in_bytes)
45
+ log(INFO, "Message size: %i bytes", message_size_in_bytes)
46
46
 
47
47
  return call_next(msg, ctxt)
48
48
 
@@ -53,7 +53,7 @@ def parameters_size_mod(
53
53
  """Parameters size mod.
54
54
 
55
55
  This mod logs the number of parameters transmitted in the message as well as their
56
- size in Bytes.
56
+ size in bytes.
57
57
  """
58
58
  model_size_stats = {}
59
59
  parameters_size_in_bytes = 0
@@ -74,6 +74,6 @@ def parameters_size_mod(
74
74
  if model_size_stats:
75
75
  log(INFO, model_size_stats)
76
76
 
77
- log(INFO, "Total parameters transmited: %i Bytes", parameters_size_in_bytes)
77
+ log(INFO, "Total parameters transmitted: %i bytes", parameters_size_in_bytes)
78
78
 
79
79
  return call_next(msg, ctxt)
@@ -145,8 +145,7 @@ class LocalDpMod:
145
145
  )
146
146
  log(
147
147
  INFO,
148
- "LocalDpMod: local DP noise with "
149
- "standard deviation: %.4f added to parameters.",
148
+ "LocalDpMod: local DP noise with %.4f stedv added to parameters",
150
149
  noise_value_sd,
151
150
  )
152
151
 
@@ -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
 
@@ -486,7 +493,7 @@ def run_fl(
486
493
 
487
494
  log(INFO, "")
488
495
  log(INFO, "[SUMMARY]")
489
- log(INFO, "Run finished %s rounds in %.2fs", config.num_rounds, elapsed_time)
496
+ log(INFO, "Run finished %s round(s) in %.2fs", config.num_rounds, elapsed_time)
490
497
  for line in io.StringIO(str(hist)):
491
498
  log(INFO, "\t%s", line.strip("\n"))
492
499
  log(INFO, "")
@@ -234,8 +234,7 @@ class DifferentialPrivacyServerSideAdaptiveClipping(Strategy):
234
234
  )
235
235
  log(
236
236
  INFO,
237
- "aggregate_fit: central DP noise with "
238
- "standard deviation: %.4f added to parameters.",
237
+ "aggregate_fit: central DP noise with %.4f stdev added",
239
238
  compute_stdv(
240
239
  self.noise_multiplier, self.clipping_norm, self.num_sampled_clients
241
240
  ),
@@ -425,8 +424,7 @@ class DifferentialPrivacyClientSideAdaptiveClipping(Strategy):
425
424
  )
426
425
  log(
427
426
  INFO,
428
- "aggregate_fit: central DP noise with "
429
- "standard deviation: %.4f added to parameters.",
427
+ "aggregate_fit: central DP noise with %.4f stdev added",
430
428
  compute_stdv(
431
429
  self.noise_multiplier, self.clipping_norm, self.num_sampled_clients
432
430
  ),
@@ -180,8 +180,7 @@ class DifferentialPrivacyServerSideFixedClipping(Strategy):
180
180
 
181
181
  log(
182
182
  INFO,
183
- "aggregate_fit: central DP noise with "
184
- "standard deviation: %.4f added to parameters.",
183
+ "aggregate_fit: central DP noise with %.4f stdev added",
185
184
  compute_stdv(
186
185
  self.noise_multiplier, self.clipping_norm, self.num_sampled_clients
187
186
  ),
@@ -338,8 +337,7 @@ class DifferentialPrivacyClientSideFixedClipping(Strategy):
338
337
  )
339
338
  log(
340
339
  INFO,
341
- "aggregate_fit: central DP noise with "
342
- "standard deviation: %.4f added to parameters.",
340
+ "aggregate_fit: central DP noise with %.4f stdev added",
343
341
  compute_stdv(
344
342
  self.noise_multiplier, self.clipping_norm, self.num_sampled_clients
345
343
  ),
@@ -16,7 +16,7 @@
16
16
 
17
17
 
18
18
  import time
19
- from logging import DEBUG, INFO
19
+ from logging import DEBUG
20
20
  from typing import List, Optional, Set
21
21
  from uuid import UUID
22
22
 
@@ -62,7 +62,7 @@ class DriverServicer(driver_pb2_grpc.DriverServicer):
62
62
  self, request: CreateRunRequest, context: grpc.ServicerContext
63
63
  ) -> CreateRunResponse:
64
64
  """Create run ID."""
65
- log(INFO, "DriverServicer.CreateRun")
65
+ log(DEBUG, "DriverServicer.CreateRun")
66
66
  state: State = self.state_factory.state()
67
67
  run_id = state.create_run(request.fab_id, request.fab_version)
68
68
  return CreateRunResponse(run_id=run_id)
@@ -15,7 +15,7 @@
15
15
  """Ray backend for the Fleet API using the Simulation Engine."""
16
16
 
17
17
  import pathlib
18
- from logging import DEBUG, ERROR, INFO, WARNING
18
+ from logging import DEBUG, ERROR, WARNING
19
19
  from typing import Callable, Dict, List, Tuple, Union
20
20
 
21
21
  import ray
@@ -45,7 +45,7 @@ class RayBackend(Backend):
45
45
  work_dir: str,
46
46
  ) -> None:
47
47
  """Prepare RayBackend by initialising Ray and creating the ActorPool."""
48
- log(INFO, "Initialising: %s", self.__class__.__name__)
48
+ log(DEBUG, "Initialising: %s", self.__class__.__name__)
49
49
  log(DEBUG, "Backend config: %s", backend_config)
50
50
 
51
51
  if not pathlib.Path(work_dir).exists():
@@ -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)
@@ -46,7 +46,7 @@ def _register_nodes(
46
46
  for i in range(num_nodes):
47
47
  node_id = state.create_node(ping_interval=PING_MAX_INTERVAL)
48
48
  nodes_mapping[node_id] = i
49
- log(INFO, "Registered %i nodes", len(nodes_mapping))
49
+ log(DEBUG, "Registered %i nodes", len(nodes_mapping))
50
50
  return nodes_mapping
51
51
 
52
52