flwr-nightly 1.9.0.dev20240520__tar.gz → 1.10.0.dev20240612__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 (242) hide show
  1. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/PKG-INFO +4 -3
  2. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/README.md +2 -1
  3. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/pyproject.toml +5 -7
  4. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/cli/app.py +2 -0
  5. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/cli/build.py +4 -19
  6. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/cli/config_utils.py +12 -27
  7. flwr_nightly-1.10.0.dev20240612/src/py/flwr/cli/install.py +196 -0
  8. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/cli/new/templates/app/pyproject.hf.toml.tpl +7 -1
  9. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/cli/new/templates/app/pyproject.jax.toml.tpl +1 -1
  10. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +7 -1
  11. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +7 -1
  12. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +7 -1
  13. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +7 -1
  14. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +7 -1
  15. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/cli/run/run.py +20 -4
  16. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/cli/utils.py +14 -0
  17. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/client/__init__.py +1 -0
  18. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/client/app.py +135 -97
  19. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/client/client_app.py +1 -1
  20. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/client/grpc_rere_client/client_interceptor.py +1 -1
  21. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/client/grpc_rere_client/connection.py +6 -6
  22. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/client/mod/__init__.py +1 -1
  23. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/client/rest_client/connection.py +1 -2
  24. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/client/supernode/app.py +70 -28
  25. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/common/object_ref.py +13 -9
  26. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/common/recordset_compat.py +8 -1
  27. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -15
  28. flwr_nightly-1.10.0.dev20240612/src/py/flwr/proto/driver_pb2.py +45 -0
  29. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/proto/driver_pb2_grpc.py +35 -0
  30. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/proto/driver_pb2_grpc.pyi +14 -0
  31. flwr_nightly-1.10.0.dev20240612/src/py/flwr/proto/fleet_pb2.py +55 -0
  32. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/proto/fleet_pb2.pyi +0 -42
  33. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/proto/fleet_pb2_grpc.py +7 -6
  34. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/proto/fleet_pb2_grpc.pyi +5 -4
  35. flwr_nightly-1.10.0.dev20240612/src/py/flwr/proto/grpcadapter_pb2.py +32 -0
  36. flwr_nightly-1.10.0.dev20240612/src/py/flwr/proto/grpcadapter_pb2.pyi +43 -0
  37. flwr_nightly-1.10.0.dev20240612/src/py/flwr/proto/grpcadapter_pb2_grpc.py +66 -0
  38. flwr_nightly-1.10.0.dev20240612/src/py/flwr/proto/grpcadapter_pb2_grpc.pyi +24 -0
  39. flwr_nightly-1.10.0.dev20240612/src/py/flwr/proto/run_pb2.py +30 -0
  40. flwr_nightly-1.10.0.dev20240612/src/py/flwr/proto/run_pb2.pyi +52 -0
  41. flwr_nightly-1.10.0.dev20240612/src/py/flwr/proto/task_pb2_grpc.py +4 -0
  42. flwr_nightly-1.10.0.dev20240612/src/py/flwr/proto/task_pb2_grpc.pyi +4 -0
  43. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/__init__.py +0 -4
  44. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/app.py +190 -395
  45. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/run_serverapp.py +29 -5
  46. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/server_app.py +2 -2
  47. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/superlink/driver/driver_servicer.py +7 -0
  48. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +1 -2
  49. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +1 -2
  50. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/superlink/fleet/message_handler/message_handler.py +5 -3
  51. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +1 -1
  52. flwr_nightly-1.9.0.dev20240520/src/py/flwr/proto/driver_pb2.py +0 -44
  53. flwr_nightly-1.9.0.dev20240520/src/py/flwr/proto/fleet_pb2.py +0 -60
  54. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/LICENSE +0 -0
  55. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/__init__.py +0 -0
  56. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/cli/__init__.py +0 -0
  57. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/cli/example.py +0 -0
  58. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/cli/new/__init__.py +0 -0
  59. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/cli/new/new.py +0 -0
  60. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/cli/new/templates/__init__.py +0 -0
  61. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/cli/new/templates/app/.gitignore.tpl +0 -0
  62. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/cli/new/templates/app/README.md.tpl +0 -0
  63. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/cli/new/templates/app/__init__.py +0 -0
  64. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
  65. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
  66. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/cli/new/templates/app/code/client.hf.py.tpl +0 -0
  67. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/cli/new/templates/app/code/client.jax.py.tpl +0 -0
  68. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/cli/new/templates/app/code/client.mlx.py.tpl +0 -0
  69. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/cli/new/templates/app/code/client.numpy.py.tpl +0 -0
  70. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -0
  71. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl +0 -0
  72. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -0
  73. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/cli/new/templates/app/code/server.hf.py.tpl +0 -0
  74. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/cli/new/templates/app/code/server.jax.py.tpl +0 -0
  75. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/cli/new/templates/app/code/server.mlx.py.tpl +0 -0
  76. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -0
  77. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -0
  78. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/cli/new/templates/app/code/server.sklearn.py.tpl +0 -0
  79. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -0
  80. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/cli/new/templates/app/code/task.hf.py.tpl +0 -0
  81. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/cli/new/templates/app/code/task.jax.py.tpl +0 -0
  82. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/cli/new/templates/app/code/task.mlx.py.tpl +0 -0
  83. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +0 -0
  84. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/cli/new/templates/app/code/task.tensorflow.py.tpl +0 -0
  85. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/cli/run/__init__.py +0 -0
  86. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/client/client.py +0 -0
  87. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/client/dpfedavg_numpy_client.py +0 -0
  88. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/client/grpc_client/__init__.py +0 -0
  89. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/client/grpc_client/connection.py +0 -0
  90. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/client/grpc_rere_client/__init__.py +0 -0
  91. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/client/heartbeat.py +0 -0
  92. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/client/message_handler/__init__.py +0 -0
  93. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/client/message_handler/message_handler.py +0 -0
  94. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/client/message_handler/task_handler.py +0 -0
  95. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/client/mod/centraldp_mods.py +0 -0
  96. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/client/mod/comms_mods.py +0 -0
  97. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/client/mod/localdp_mod.py +0 -0
  98. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
  99. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
  100. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
  101. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/client/mod/utils.py +0 -0
  102. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/client/node_state.py +0 -0
  103. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/client/node_state_tests.py +0 -0
  104. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/client/numpy_client.py +0 -0
  105. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/client/rest_client/__init__.py +0 -0
  106. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/client/supernode/__init__.py +0 -0
  107. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/client/typing.py +0 -0
  108. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/common/__init__.py +0 -0
  109. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/common/address.py +0 -0
  110. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/common/constant.py +0 -0
  111. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/common/context.py +0 -0
  112. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/common/date.py +0 -0
  113. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/common/differential_privacy.py +0 -0
  114. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/common/differential_privacy_constants.py +0 -0
  115. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/common/dp.py +0 -0
  116. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/common/exit_handlers.py +0 -0
  117. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/common/grpc.py +0 -0
  118. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/common/logger.py +0 -0
  119. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/common/message.py +0 -0
  120. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/common/parameter.py +0 -0
  121. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/common/pyproject.py +0 -0
  122. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/common/record/__init__.py +0 -0
  123. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/common/record/configsrecord.py +0 -0
  124. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/common/record/conversion_utils.py +0 -0
  125. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/common/record/metricsrecord.py +0 -0
  126. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/common/record/parametersrecord.py +0 -0
  127. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/common/record/recordset.py +0 -0
  128. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/common/record/typeddict.py +0 -0
  129. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/common/retry_invoker.py +0 -0
  130. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/common/secure_aggregation/__init__.py +0 -0
  131. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
  132. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
  133. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
  134. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/common/secure_aggregation/quantization.py +0 -0
  135. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
  136. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
  137. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/common/serde.py +0 -0
  138. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/common/telemetry.py +0 -0
  139. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/common/typing.py +0 -0
  140. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/common/version.py +0 -0
  141. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/proto/__init__.py +0 -0
  142. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/proto/driver_pb2.pyi +0 -0
  143. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/proto/error_pb2.py +0 -0
  144. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/proto/error_pb2.pyi +0 -0
  145. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/proto/error_pb2_grpc.py +0 -0
  146. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/proto/error_pb2_grpc.pyi +0 -0
  147. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/proto/node_pb2.py +0 -0
  148. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/proto/node_pb2.pyi +0 -0
  149. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/proto/node_pb2_grpc.py +0 -0
  150. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/proto/node_pb2_grpc.pyi +0 -0
  151. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/proto/recordset_pb2.py +0 -0
  152. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/proto/recordset_pb2.pyi +0 -0
  153. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/proto/recordset_pb2_grpc.py +0 -0
  154. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/proto/recordset_pb2_grpc.pyi +0 -0
  155. /flwr_nightly-1.9.0.dev20240520/src/py/flwr/proto/task_pb2_grpc.py → /flwr_nightly-1.10.0.dev20240612/src/py/flwr/proto/run_pb2_grpc.py +0 -0
  156. /flwr_nightly-1.9.0.dev20240520/src/py/flwr/proto/task_pb2_grpc.pyi → /flwr_nightly-1.10.0.dev20240612/src/py/flwr/proto/run_pb2_grpc.pyi +0 -0
  157. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/proto/task_pb2.py +0 -0
  158. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/proto/task_pb2.pyi +0 -0
  159. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/proto/transport_pb2.py +0 -0
  160. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/proto/transport_pb2.pyi +0 -0
  161. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/proto/transport_pb2_grpc.py +0 -0
  162. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
  163. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/py.typed +0 -0
  164. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/client_manager.py +0 -0
  165. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/client_proxy.py +0 -0
  166. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/compat/__init__.py +0 -0
  167. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/compat/app.py +0 -0
  168. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/compat/app_utils.py +0 -0
  169. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/compat/driver_client_proxy.py +0 -0
  170. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/compat/legacy_context.py +0 -0
  171. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/criterion.py +0 -0
  172. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/driver/__init__.py +0 -0
  173. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/driver/driver.py +0 -0
  174. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/driver/grpc_driver.py +0 -0
  175. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/driver/inmemory_driver.py +0 -0
  176. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/history.py +0 -0
  177. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/server.py +0 -0
  178. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/server_config.py +0 -0
  179. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/strategy/__init__.py +0 -0
  180. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/strategy/aggregate.py +0 -0
  181. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/strategy/bulyan.py +0 -0
  182. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
  183. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
  184. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
  185. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
  186. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
  187. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/strategy/fedadagrad.py +0 -0
  188. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/strategy/fedadam.py +0 -0
  189. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/strategy/fedavg.py +0 -0
  190. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/strategy/fedavg_android.py +0 -0
  191. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/strategy/fedavgm.py +0 -0
  192. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/strategy/fedmedian.py +0 -0
  193. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/strategy/fedopt.py +0 -0
  194. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/strategy/fedprox.py +0 -0
  195. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
  196. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
  197. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
  198. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
  199. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/strategy/fedyogi.py +0 -0
  200. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/strategy/krum.py +0 -0
  201. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/strategy/qfedavg.py +0 -0
  202. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/strategy/strategy.py +0 -0
  203. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/superlink/__init__.py +0 -0
  204. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/superlink/driver/__init__.py +0 -0
  205. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/superlink/driver/driver_grpc.py +0 -0
  206. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/superlink/fleet/__init__.py +0 -0
  207. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
  208. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
  209. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
  210. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
  211. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +0 -0
  212. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
  213. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
  214. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
  215. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
  216. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
  217. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
  218. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +0 -0
  219. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/superlink/fleet/vce/vce_api.py +0 -0
  220. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/superlink/state/__init__.py +0 -0
  221. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/superlink/state/in_memory_state.py +0 -0
  222. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/superlink/state/sqlite_state.py +0 -0
  223. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/superlink/state/state.py +0 -0
  224. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/superlink/state/state_factory.py +0 -0
  225. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/superlink/state/utils.py +0 -0
  226. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/typing.py +0 -0
  227. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/utils/__init__.py +0 -0
  228. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/utils/tensorboard.py +0 -0
  229. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/utils/validator.py +0 -0
  230. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/workflow/__init__.py +0 -0
  231. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/workflow/constant.py +0 -0
  232. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/workflow/default_workflows.py +0 -0
  233. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
  234. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
  235. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +0 -0
  236. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/simulation/__init__.py +0 -0
  237. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/simulation/app.py +0 -0
  238. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/simulation/ray_transport/__init__.py +0 -0
  239. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
  240. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
  241. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/simulation/ray_transport/utils.py +0 -0
  242. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/simulation/run_simulation.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: flwr-nightly
3
- Version: 1.9.0.dev20240520
3
+ Version: 1.10.0.dev20240612
4
4
  Summary: Flower: A Friendly Federated Learning Framework
5
5
  Home-page: https://flower.ai
6
6
  License: Apache-2.0
@@ -39,7 +39,7 @@ Requires-Dist: numpy (>=1.21.0,<2.0.0)
39
39
  Requires-Dist: pathspec (>=0.12.1,<0.13.0)
40
40
  Requires-Dist: protobuf (>=4.25.2,<5.0.0)
41
41
  Requires-Dist: pycryptodome (>=3.18.0,<4.0.0)
42
- Requires-Dist: ray (==2.6.3) ; (python_version >= "3.8" and python_version < "3.12") and (extra == "simulation")
42
+ Requires-Dist: ray (==2.10.0) ; (python_version >= "3.8" and python_version < "3.12") and (extra == "simulation")
43
43
  Requires-Dist: requests (>=2.31.0,<3.0.0) ; extra == "rest"
44
44
  Requires-Dist: starlette (>=0.31.0,<0.32.0) ; extra == "rest"
45
45
  Requires-Dist: tomli (>=2.0.1,<3.0.0)
@@ -201,8 +201,9 @@ Other [examples](https://github.com/adap/flower/tree/main/examples):
201
201
  - Single-Machine Simulation of Federated Learning Systems ([PyTorch](https://github.com/adap/flower/tree/main/examples/simulation-pytorch)) ([Tensorflow](https://github.com/adap/flower/tree/main/examples/simulation-tensorflow))
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
- - [Flower with KaplanMeierFitter from the lifelines library](https://github.com/adap/flower/tree/main/examples/federated-kaplna-meier-fitter)
204
+ - [Flower with KaplanMeierFitter from the lifelines library](https://github.com/adap/flower/tree/main/examples/federated-kaplan-meier-fitter)
205
205
  - [Sample Level Privacy with Opacus](https://github.com/adap/flower/tree/main/examples/opacus)
206
+ - [Sample Level Privacy with TensorFlow-Privacy](https://github.com/adap/flower/tree/main/examples/tensorflow-privacy)
206
207
 
207
208
  ## Community
208
209
 
@@ -150,8 +150,9 @@ Other [examples](https://github.com/adap/flower/tree/main/examples):
150
150
  - Single-Machine Simulation of Federated Learning Systems ([PyTorch](https://github.com/adap/flower/tree/main/examples/simulation-pytorch)) ([Tensorflow](https://github.com/adap/flower/tree/main/examples/simulation-tensorflow))
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
- - [Flower with KaplanMeierFitter from the lifelines library](https://github.com/adap/flower/tree/main/examples/federated-kaplna-meier-fitter)
153
+ - [Flower with KaplanMeierFitter from the lifelines library](https://github.com/adap/flower/tree/main/examples/federated-kaplan-meier-fitter)
154
154
  - [Sample Level Privacy with Opacus](https://github.com/adap/flower/tree/main/examples/opacus)
155
+ - [Sample Level Privacy with TensorFlow-Privacy](https://github.com/adap/flower/tree/main/examples/tensorflow-privacy)
155
156
 
156
157
  ## Community
157
158
 
@@ -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.dev20240520"
7
+ version = "1.10.0.dev20240612"
8
8
  description = "Flower: A Friendly Federated Learning Framework"
9
9
  license = "Apache-2.0"
10
10
  authors = ["The Flower Authors <hello@flower.ai>"]
@@ -53,8 +53,6 @@ exclude = [
53
53
 
54
54
  [tool.poetry.scripts]
55
55
  flwr = "flwr.cli.app:app"
56
- flower-driver-api = "flwr.server:run_driver_api"
57
- flower-fleet-api = "flwr.server:run_fleet_api"
58
56
  flower-superlink = "flwr.server:run_superlink"
59
57
  flower-supernode = "flwr.client:run_supernode"
60
58
  flower-client-app = "flwr.client:run_client_app"
@@ -74,14 +72,14 @@ typer = { version = "^0.9.0", extras=["all"] }
74
72
  tomli = "^2.0.1"
75
73
  pathspec = "^0.12.1"
76
74
  # Optional dependencies (Simulation Engine)
77
- ray = { version = "==2.6.3", optional = true, python = ">=3.8,<3.12" }
75
+ ray = { version = "==2.10.0", optional = true, python = ">=3.8,<3.12" }
78
76
  # Optional dependencies (REST transport layer)
79
77
  requests = { version = "^2.31.0", optional = true }
80
78
  starlette = { version = "^0.31.0", optional = true }
81
79
  uvicorn = { version = "^0.23.0", extras = ["standard"], optional = true }
82
80
 
83
81
  [tool.poetry.extras]
84
- simulation = ["ray", "pydantic"]
82
+ simulation = ["ray"]
85
83
  rest = ["requests", "starlette", "uvicorn"]
86
84
 
87
85
  [tool.poetry.group.dev.dependencies]
@@ -105,7 +103,7 @@ jupyterlab = "==4.0.12"
105
103
  rope = "==1.11.0"
106
104
  semver = "==3.0.2"
107
105
  sphinx = "==6.2.1"
108
- sphinx-intl = "==2.1.0"
106
+ sphinx-intl = "==2.2.0"
109
107
  myst-parser = "==1.0.0"
110
108
  sphinx-design = "==0.5.0"
111
109
  sphinx-copybutton = "==0.5.2"
@@ -113,7 +111,7 @@ sphinxcontrib-mermaid = "==0.9.2"
113
111
  sphinxcontrib-youtube = "==1.4.1"
114
112
  furo = "==2023.9.10"
115
113
  sphinx-reredirects = "==0.1.3"
116
- nbsphinx = "==0.9.3"
114
+ nbsphinx = "==0.9.4"
117
115
  nbstripout = "==0.6.1"
118
116
  ruff = "==0.1.9"
119
117
  sphinx-argparse = "==0.4.0"
@@ -18,6 +18,7 @@ import typer
18
18
 
19
19
  from .build import build
20
20
  from .example import example
21
+ from .install import install
21
22
  from .new import new
22
23
  from .run import run
23
24
 
@@ -34,6 +35,7 @@ app.command()(new)
34
35
  app.command()(example)
35
36
  app.command()(run)
36
37
  app.command()(build)
38
+ app.command()(install)
37
39
 
38
40
  if __name__ == "__main__":
39
41
  app()
@@ -14,7 +14,6 @@
14
14
  # ==============================================================================
15
15
  """Flower command line interface `build` command."""
16
16
 
17
- import hashlib
18
17
  import os
19
18
  import zipfile
20
19
  from pathlib import Path
@@ -24,8 +23,8 @@ import pathspec
24
23
  import typer
25
24
  from typing_extensions import Annotated
26
25
 
27
- from .config_utils import load_and_validate_with_defaults
28
- from .utils import is_valid_project_name
26
+ from .config_utils import load_and_validate
27
+ from .utils import get_sha256_hash, is_valid_project_name
29
28
 
30
29
 
31
30
  # pylint: disable=too-many-locals
@@ -67,9 +66,7 @@ def build(
67
66
  )
68
67
  raise typer.Exit(code=1)
69
68
 
70
- conf, errors, warnings = load_and_validate_with_defaults(
71
- directory / "pyproject.toml"
72
- )
69
+ conf, errors, warnings = load_and_validate(directory / "pyproject.toml")
73
70
  if conf is None:
74
71
  typer.secho(
75
72
  "Project configuration could not be loaded.\npyproject.toml is invalid:\n"
@@ -117,7 +114,7 @@ def build(
117
114
  fab_file.write(file_path, archive_path)
118
115
 
119
116
  # Calculate file info
120
- sha256_hash = _get_sha256_hash(file_path)
117
+ sha256_hash = get_sha256_hash(file_path)
121
118
  file_size_bits = os.path.getsize(file_path) * 8 # size in bits
122
119
  list_file_content += f"{archive_path},{sha256_hash},{file_size_bits}\n"
123
120
 
@@ -129,18 +126,6 @@ def build(
129
126
  )
130
127
 
131
128
 
132
- def _get_sha256_hash(file_path: Path) -> str:
133
- """Calculate the SHA-256 hash of a file."""
134
- sha256 = hashlib.sha256()
135
- with open(file_path, "rb") as f:
136
- while True:
137
- data = f.read(65536) # Read in 64kB blocks
138
- if not data:
139
- break
140
- sha256.update(data)
141
- return sha256.hexdigest()
142
-
143
-
144
129
  def _load_gitignore(directory: Path) -> pathspec.PathSpec:
145
130
  """Load and parse .gitignore file, returning a pathspec."""
146
131
  gitignore_path = directory / ".gitignore"
@@ -22,8 +22,9 @@ import tomli
22
22
  from flwr.common import object_ref
23
23
 
24
24
 
25
- def load_and_validate_with_defaults(
25
+ def load_and_validate(
26
26
  path: Optional[Path] = None,
27
+ check_module: bool = True,
27
28
  ) -> Tuple[Optional[Dict[str, Any]], List[str], List[str]]:
28
29
  """Load and validate pyproject.toml as dict.
29
30
 
@@ -42,19 +43,11 @@ def load_and_validate_with_defaults(
42
43
  ]
43
44
  return (None, errors, [])
44
45
 
45
- is_valid, errors, warnings = validate(config)
46
+ is_valid, errors, warnings = validate(config, check_module)
46
47
 
47
48
  if not is_valid:
48
49
  return (None, errors, warnings)
49
50
 
50
- # Apply defaults
51
- defaults = {
52
- "flower": {
53
- "engine": {"name": "simulation", "simulation": {"supernode": {"num": 2}}}
54
- }
55
- }
56
- config = apply_defaults(config, defaults)
57
-
58
51
  return (config, errors, warnings)
59
52
 
60
53
 
@@ -110,7 +103,9 @@ def validate_fields(config: Dict[str, Any]) -> Tuple[bool, List[str], List[str]]
110
103
  return len(errors) == 0, errors, warnings
111
104
 
112
105
 
113
- def validate(config: Dict[str, Any]) -> Tuple[bool, List[str], List[str]]:
106
+ def validate(
107
+ config: Dict[str, Any], check_module: bool = True
108
+ ) -> Tuple[bool, List[str], List[str]]:
114
109
  """Validate pyproject.toml."""
115
110
  is_valid, errors, warnings = validate_fields(config)
116
111
 
@@ -118,28 +113,18 @@ def validate(config: Dict[str, Any]) -> Tuple[bool, List[str], List[str]]:
118
113
  return False, errors, warnings
119
114
 
120
115
  # Validate serverapp
121
- is_valid, reason = object_ref.validate(config["flower"]["components"]["serverapp"])
116
+ is_valid, reason = object_ref.validate(
117
+ config["flower"]["components"]["serverapp"], check_module
118
+ )
122
119
  if not is_valid and isinstance(reason, str):
123
120
  return False, [reason], []
124
121
 
125
122
  # Validate clientapp
126
- is_valid, reason = object_ref.validate(config["flower"]["components"]["clientapp"])
123
+ is_valid, reason = object_ref.validate(
124
+ config["flower"]["components"]["clientapp"], check_module
125
+ )
127
126
 
128
127
  if not is_valid and isinstance(reason, str):
129
128
  return False, [reason], []
130
129
 
131
130
  return True, [], []
132
-
133
-
134
- def apply_defaults(
135
- config: Dict[str, Any],
136
- defaults: Dict[str, Any],
137
- ) -> Dict[str, Any]:
138
- """Apply defaults to config."""
139
- for key in defaults:
140
- if key in config:
141
- if isinstance(config[key], dict) and isinstance(defaults[key], dict):
142
- apply_defaults(config[key], defaults[key])
143
- else:
144
- config[key] = defaults[key]
145
- return config
@@ -0,0 +1,196 @@
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 command line interface `install` command."""
16
+
17
+
18
+ import os
19
+ import shutil
20
+ import tempfile
21
+ import zipfile
22
+ from pathlib import Path
23
+ from typing import Optional
24
+
25
+ import typer
26
+ from typing_extensions import Annotated
27
+
28
+ from .config_utils import load_and_validate
29
+ from .utils import get_sha256_hash
30
+
31
+
32
+ def install(
33
+ source: Annotated[
34
+ Optional[Path],
35
+ typer.Argument(metavar="source", help="The source FAB file to install."),
36
+ ] = None,
37
+ flwr_dir: Annotated[
38
+ Optional[Path],
39
+ typer.Option(help="The desired install path."),
40
+ ] = None,
41
+ ) -> None:
42
+ """Install a Flower App Bundle.
43
+
44
+ It can be ran with a single FAB file argument:
45
+
46
+ ``flwr install ./target_project.fab``
47
+
48
+ The target install directory can be specified with ``--flwr-dir``:
49
+
50
+ ``flwr install ./target_project.fab --flwr-dir ./docs/flwr``
51
+
52
+ This will install ``target_project`` to ``./docs/flwr/``. By default,
53
+ ``flwr-dir`` is equal to:
54
+
55
+ - ``$FLWR_HOME/`` if ``$FLWR_HOME`` is defined
56
+ - ``$XDG_DATA_HOME/.flwr/`` if ``$XDG_DATA_HOME`` is defined
57
+ - ``$HOME/.flwr/`` in all other cases
58
+ """
59
+ if source is None:
60
+ source = Path(typer.prompt("Enter the source FAB file"))
61
+
62
+ source = source.resolve()
63
+ if not source.exists() or not source.is_file():
64
+ typer.secho(
65
+ f"❌ The source {source} does not exist or is not a file.",
66
+ fg=typer.colors.RED,
67
+ bold=True,
68
+ )
69
+ raise typer.Exit(code=1)
70
+
71
+ if source.suffix != ".fab":
72
+ typer.secho(
73
+ f"❌ The source {source} is not a `.fab` file.",
74
+ fg=typer.colors.RED,
75
+ bold=True,
76
+ )
77
+ raise typer.Exit(code=1)
78
+
79
+ install_from_fab(source, flwr_dir)
80
+
81
+
82
+ def install_from_fab(
83
+ fab_file: Path, flwr_dir: Optional[Path], skip_prompt: bool = False
84
+ ) -> None:
85
+ """Install from a FAB file after extracting and validating."""
86
+ with tempfile.TemporaryDirectory() as tmpdir:
87
+ with zipfile.ZipFile(fab_file, "r") as zipf:
88
+ zipf.extractall(tmpdir)
89
+ tmpdir_path = Path(tmpdir)
90
+ info_dir = tmpdir_path / ".info"
91
+ if not info_dir.exists():
92
+ typer.secho(
93
+ "❌ FAB file has incorrect format.",
94
+ fg=typer.colors.RED,
95
+ bold=True,
96
+ )
97
+ raise typer.Exit(code=1)
98
+
99
+ content_file = info_dir / "CONTENT"
100
+
101
+ if not content_file.exists() or not _verify_hashes(
102
+ content_file.read_text(), tmpdir_path
103
+ ):
104
+ typer.secho(
105
+ "❌ File hashes couldn't be verified.",
106
+ fg=typer.colors.RED,
107
+ bold=True,
108
+ )
109
+ raise typer.Exit(code=1)
110
+
111
+ shutil.rmtree(info_dir)
112
+
113
+ validate_and_install(tmpdir_path, fab_file.stem, flwr_dir, skip_prompt)
114
+
115
+
116
+ def validate_and_install(
117
+ project_dir: Path,
118
+ fab_name: str,
119
+ flwr_dir: Optional[Path],
120
+ skip_prompt: bool = False,
121
+ ) -> None:
122
+ """Validate TOML files and install the project to the desired directory."""
123
+ config, _, _ = load_and_validate(project_dir / "pyproject.toml", check_module=False)
124
+
125
+ if config is None:
126
+ typer.secho(
127
+ "❌ Invalid config inside FAB file.",
128
+ fg=typer.colors.RED,
129
+ bold=True,
130
+ )
131
+ raise typer.Exit(code=1)
132
+
133
+ publisher = config["flower"]["publisher"]
134
+ project_name = config["project"]["name"]
135
+ version = config["project"]["version"]
136
+
137
+ if fab_name != f"{publisher}.{project_name}.{version.replace('.', '-')}":
138
+ typer.secho(
139
+ "❌ FAB file has incorrect name. The file name must follow the format "
140
+ "`<publisher>.<project_name>.<version>.fab`.",
141
+ fg=typer.colors.RED,
142
+ bold=True,
143
+ )
144
+ raise typer.Exit(code=1)
145
+
146
+ install_dir: Path = (
147
+ (
148
+ Path(
149
+ os.getenv(
150
+ "FLWR_HOME",
151
+ f"{os.getenv('XDG_DATA_HOME', os.getenv('HOME'))}/.flwr",
152
+ )
153
+ )
154
+ if not flwr_dir
155
+ else flwr_dir
156
+ )
157
+ / "apps"
158
+ / publisher
159
+ / project_name
160
+ / version
161
+ )
162
+ if install_dir.exists() and not skip_prompt:
163
+ if not typer.confirm(
164
+ typer.style(
165
+ f"\n💬 {project_name} version {version} is already installed, "
166
+ "do you want to reinstall it?",
167
+ fg=typer.colors.MAGENTA,
168
+ bold=True,
169
+ )
170
+ ):
171
+ return
172
+
173
+ install_dir.mkdir(parents=True, exist_ok=True)
174
+
175
+ # Move contents from source directory
176
+ for item in project_dir.iterdir():
177
+ if item.is_dir():
178
+ shutil.copytree(item, install_dir / item.name, dirs_exist_ok=True)
179
+ else:
180
+ shutil.copy2(item, install_dir / item.name)
181
+
182
+ typer.secho(
183
+ f"🎊 Successfully installed {project_name} to {install_dir}.",
184
+ fg=typer.colors.GREEN,
185
+ bold=True,
186
+ )
187
+
188
+
189
+ def _verify_hashes(list_content: str, tmpdir: Path) -> bool:
190
+ """Verify file hashes based on the LIST content."""
191
+ for line in list_content.strip().split("\n"):
192
+ rel_path, hash_expected, _ = line.split(",")
193
+ file_path = tmpdir / rel_path
194
+ if not file_path.exists() or get_sha256_hash(file_path) != hash_expected:
195
+ return False
196
+ return True
@@ -11,7 +11,7 @@ authors = [
11
11
  ]
12
12
  license = { text = "Apache License (2.0)" }
13
13
  dependencies = [
14
- "flwr[simulation]>=1.8.0,<2.0",
14
+ "flwr[simulation]>=1.9.0,<2.0",
15
15
  "flwr-datasets>=0.0.2,<1.0.0",
16
16
  "torch==2.2.1",
17
17
  "transformers>=4.30.0,<5.0"
@@ -29,3 +29,9 @@ publisher = "$username"
29
29
  [flower.components]
30
30
  serverapp = "$import_name.server:app"
31
31
  clientapp = "$import_name.client:app"
32
+
33
+ [flower.engine]
34
+ name = "simulation"
35
+
36
+ [flower.engine.simulation.supernode]
37
+ num = 2
@@ -11,7 +11,7 @@ authors = [
11
11
  ]
12
12
  license = {text = "Apache License (2.0)"}
13
13
  dependencies = [
14
- "flwr[simulation]>=1.8.0,<2.0",
14
+ "flwr[simulation]>=1.9.0,<2.0",
15
15
  "jax==0.4.26",
16
16
  "jaxlib==0.4.26",
17
17
  "scikit-learn==1.4.2",
@@ -11,7 +11,7 @@ authors = [
11
11
  ]
12
12
  license = { text = "Apache License (2.0)" }
13
13
  dependencies = [
14
- "flwr[simulation]>=1.8.0,<2.0",
14
+ "flwr[simulation]>=1.9.0,<2.0",
15
15
  "flwr-datasets[vision]>=0.0.2,<1.0.0",
16
16
  "mlx==0.10.0",
17
17
  "numpy==1.24.4",
@@ -26,3 +26,9 @@ publisher = "$username"
26
26
  [flower.components]
27
27
  serverapp = "$import_name.server:app"
28
28
  clientapp = "$import_name.client:app"
29
+
30
+ [flower.engine]
31
+ name = "simulation"
32
+
33
+ [flower.engine.simulation.supernode]
34
+ num = 2
@@ -11,7 +11,7 @@ authors = [
11
11
  ]
12
12
  license = { text = "Apache License (2.0)" }
13
13
  dependencies = [
14
- "flwr[simulation]>=1.8.0,<2.0",
14
+ "flwr[simulation]>=1.9.0,<2.0",
15
15
  "numpy>=1.21.0",
16
16
  ]
17
17
 
@@ -24,3 +24,9 @@ publisher = "$username"
24
24
  [flower.components]
25
25
  serverapp = "$import_name.server:app"
26
26
  clientapp = "$import_name.client:app"
27
+
28
+ [flower.engine]
29
+ name = "simulation"
30
+
31
+ [flower.engine.simulation.supernode]
32
+ num = 2
@@ -11,7 +11,7 @@ authors = [
11
11
  ]
12
12
  license = { text = "Apache License (2.0)" }
13
13
  dependencies = [
14
- "flwr[simulation]>=1.8.0,<2.0",
14
+ "flwr[simulation]>=1.9.0,<2.0",
15
15
  "flwr-datasets[vision]>=0.0.2,<1.0.0",
16
16
  "torch==2.2.1",
17
17
  "torchvision==0.17.1",
@@ -26,3 +26,9 @@ publisher = "$username"
26
26
  [flower.components]
27
27
  serverapp = "$import_name.server:app"
28
28
  clientapp = "$import_name.client:app"
29
+
30
+ [flower.engine]
31
+ name = "simulation"
32
+
33
+ [flower.engine.simulation.supernode]
34
+ num = 2
@@ -11,7 +11,7 @@ authors = [
11
11
  ]
12
12
  license = { text = "Apache License (2.0)" }
13
13
  dependencies = [
14
- "flwr[simulation]>=1.8.0,<2.0",
14
+ "flwr[simulation]>=1.9.0,<2.0",
15
15
  "flwr-datasets[vision]>=0.0.2,<1.0.0",
16
16
  "scikit-learn>=1.1.1",
17
17
  ]
@@ -25,3 +25,9 @@ publisher = "$username"
25
25
  [flower.components]
26
26
  serverapp = "$import_name.server:app"
27
27
  clientapp = "$import_name.client:app"
28
+
29
+ [flower.engine]
30
+ name = "simulation"
31
+
32
+ [flower.engine.simulation.supernode]
33
+ num = 2
@@ -11,7 +11,7 @@ authors = [
11
11
  ]
12
12
  license = { text = "Apache License (2.0)" }
13
13
  dependencies = [
14
- "flwr[simulation]>=1.8.0,<2.0",
14
+ "flwr[simulation]>=1.9.0,<2.0",
15
15
  "flwr-datasets[vision]>=0.0.2,<1.0.0",
16
16
  "tensorflow>=2.11.1",
17
17
  ]
@@ -25,3 +25,9 @@ publisher = "$username"
25
25
  [flower.components]
26
26
  serverapp = "$import_name.server:app"
27
27
  clientapp = "$import_name.client:app"
28
+
29
+ [flower.engine]
30
+ name = "simulation"
31
+
32
+ [flower.engine.simulation.supernode]
33
+ num = 2
@@ -15,18 +15,32 @@
15
15
  """Flower command line interface `run` command."""
16
16
 
17
17
  import sys
18
+ from enum import Enum
19
+ from typing import Optional
18
20
 
19
21
  import typer
22
+ from typing_extensions import Annotated
20
23
 
21
24
  from flwr.cli import config_utils
22
25
  from flwr.simulation.run_simulation import _run_simulation
23
26
 
24
27
 
25
- def run() -> None:
28
+ class Engine(str, Enum):
29
+ """Enum defining the engine to run on."""
30
+
31
+ SIMULATION = "simulation"
32
+
33
+
34
+ def run(
35
+ engine: Annotated[
36
+ Optional[Engine],
37
+ typer.Option(case_sensitive=False, help="The ML framework to use"),
38
+ ] = None,
39
+ ) -> None:
26
40
  """Run Flower project."""
27
41
  typer.secho("Loading project configuration... ", fg=typer.colors.BLUE)
28
42
 
29
- config, errors, warnings = config_utils.load_and_validate_with_defaults()
43
+ config, errors, warnings = config_utils.load_and_validate()
30
44
 
31
45
  if config is None:
32
46
  typer.secho(
@@ -49,9 +63,11 @@ def run() -> None:
49
63
 
50
64
  server_app_ref = config["flower"]["components"]["serverapp"]
51
65
  client_app_ref = config["flower"]["components"]["clientapp"]
52
- engine = config["flower"]["engine"]["name"]
53
66
 
54
- if engine == "simulation":
67
+ if engine is None:
68
+ engine = config["flower"]["engine"]["name"]
69
+
70
+ if engine == Engine.SIMULATION:
55
71
  num_supernodes = config["flower"]["engine"]["simulation"]["supernode"]["num"]
56
72
 
57
73
  typer.secho("Starting run... ", fg=typer.colors.BLUE)
@@ -14,7 +14,9 @@
14
14
  # ==============================================================================
15
15
  """Flower command line interface utils."""
16
16
 
17
+ import hashlib
17
18
  import re
19
+ from pathlib import Path
18
20
  from typing import Callable, List, Optional, cast
19
21
 
20
22
  import typer
@@ -122,3 +124,15 @@ def sanitize_project_name(name: str) -> str:
122
124
  sanitized_name = sanitized_name[1:]
123
125
 
124
126
  return sanitized_name
127
+
128
+
129
+ def get_sha256_hash(file_path: Path) -> str:
130
+ """Calculate the SHA-256 hash of a file."""
131
+ sha256 = hashlib.sha256()
132
+ with open(file_path, "rb") as f:
133
+ while True:
134
+ data = f.read(65536) # Read in 64kB blocks
135
+ if not data:
136
+ break
137
+ sha256.update(data)
138
+ return sha256.hexdigest()
@@ -28,6 +28,7 @@ __all__ = [
28
28
  "Client",
29
29
  "ClientApp",
30
30
  "ClientFn",
31
+ "mod",
31
32
  "NumPyClient",
32
33
  "run_client_app",
33
34
  "run_supernode",