flwr-nightly 1.9.0.dev20240520__tar.gz → 1.9.0.dev20240531__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 (235) hide show
  1. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/PKG-INFO +4 -3
  2. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/README.md +2 -1
  3. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/pyproject.toml +3 -3
  4. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/build.py +2 -4
  5. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/config_utils.py +1 -23
  6. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/new/templates/app/pyproject.hf.toml.tpl +6 -0
  7. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +6 -0
  8. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +6 -0
  9. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +6 -0
  10. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +6 -0
  11. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +6 -0
  12. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/run/run.py +20 -4
  13. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/client/grpc_rere_client/connection.py +5 -2
  14. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/client/supernode/app.py +41 -23
  15. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/recordset_compat.py +8 -1
  16. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -15
  17. flwr_nightly-1.9.0.dev20240531/src/py/flwr/proto/grpcadapter_pb2.py +32 -0
  18. flwr_nightly-1.9.0.dev20240531/src/py/flwr/proto/grpcadapter_pb2.pyi +43 -0
  19. flwr_nightly-1.9.0.dev20240531/src/py/flwr/proto/grpcadapter_pb2_grpc.py +66 -0
  20. flwr_nightly-1.9.0.dev20240531/src/py/flwr/proto/grpcadapter_pb2_grpc.pyi +24 -0
  21. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/app.py +134 -182
  22. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/LICENSE +0 -0
  23. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/__init__.py +0 -0
  24. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/__init__.py +0 -0
  25. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/app.py +0 -0
  26. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/example.py +0 -0
  27. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/new/__init__.py +0 -0
  28. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/new/new.py +0 -0
  29. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/new/templates/__init__.py +0 -0
  30. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/new/templates/app/.gitignore.tpl +0 -0
  31. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/new/templates/app/README.md.tpl +0 -0
  32. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/new/templates/app/__init__.py +0 -0
  33. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
  34. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
  35. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/new/templates/app/code/client.hf.py.tpl +0 -0
  36. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/new/templates/app/code/client.jax.py.tpl +0 -0
  37. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/new/templates/app/code/client.mlx.py.tpl +0 -0
  38. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/new/templates/app/code/client.numpy.py.tpl +0 -0
  39. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -0
  40. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl +0 -0
  41. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -0
  42. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/new/templates/app/code/server.hf.py.tpl +0 -0
  43. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/new/templates/app/code/server.jax.py.tpl +0 -0
  44. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/new/templates/app/code/server.mlx.py.tpl +0 -0
  45. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -0
  46. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -0
  47. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/new/templates/app/code/server.sklearn.py.tpl +0 -0
  48. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -0
  49. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/new/templates/app/code/task.hf.py.tpl +0 -0
  50. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/new/templates/app/code/task.jax.py.tpl +0 -0
  51. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/new/templates/app/code/task.mlx.py.tpl +0 -0
  52. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +0 -0
  53. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/new/templates/app/code/task.tensorflow.py.tpl +0 -0
  54. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/new/templates/app/pyproject.jax.toml.tpl +0 -0
  55. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/run/__init__.py +0 -0
  56. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/utils.py +0 -0
  57. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/client/__init__.py +0 -0
  58. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/client/app.py +0 -0
  59. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/client/client.py +0 -0
  60. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/client/client_app.py +0 -0
  61. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/client/dpfedavg_numpy_client.py +0 -0
  62. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/client/grpc_client/__init__.py +0 -0
  63. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/client/grpc_client/connection.py +0 -0
  64. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/client/grpc_rere_client/__init__.py +0 -0
  65. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/client/grpc_rere_client/client_interceptor.py +0 -0
  66. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/client/heartbeat.py +0 -0
  67. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/client/message_handler/__init__.py +0 -0
  68. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/client/message_handler/message_handler.py +0 -0
  69. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/client/message_handler/task_handler.py +0 -0
  70. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/client/mod/__init__.py +0 -0
  71. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/client/mod/centraldp_mods.py +0 -0
  72. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/client/mod/comms_mods.py +0 -0
  73. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/client/mod/localdp_mod.py +0 -0
  74. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
  75. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
  76. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
  77. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/client/mod/utils.py +0 -0
  78. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/client/node_state.py +0 -0
  79. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/client/node_state_tests.py +0 -0
  80. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/client/numpy_client.py +0 -0
  81. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/client/rest_client/__init__.py +0 -0
  82. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/client/rest_client/connection.py +0 -0
  83. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/client/supernode/__init__.py +0 -0
  84. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/client/typing.py +0 -0
  85. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/__init__.py +0 -0
  86. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/address.py +0 -0
  87. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/constant.py +0 -0
  88. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/context.py +0 -0
  89. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/date.py +0 -0
  90. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/differential_privacy.py +0 -0
  91. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/differential_privacy_constants.py +0 -0
  92. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/dp.py +0 -0
  93. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/exit_handlers.py +0 -0
  94. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/grpc.py +0 -0
  95. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/logger.py +0 -0
  96. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/message.py +0 -0
  97. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/object_ref.py +0 -0
  98. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/parameter.py +0 -0
  99. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/pyproject.py +0 -0
  100. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/record/__init__.py +0 -0
  101. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/record/configsrecord.py +0 -0
  102. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/record/conversion_utils.py +0 -0
  103. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/record/metricsrecord.py +0 -0
  104. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/record/parametersrecord.py +0 -0
  105. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/record/recordset.py +0 -0
  106. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/record/typeddict.py +0 -0
  107. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/retry_invoker.py +0 -0
  108. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/secure_aggregation/__init__.py +0 -0
  109. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
  110. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
  111. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
  112. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/secure_aggregation/quantization.py +0 -0
  113. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
  114. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
  115. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/serde.py +0 -0
  116. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/telemetry.py +0 -0
  117. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/typing.py +0 -0
  118. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/version.py +0 -0
  119. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/proto/__init__.py +0 -0
  120. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/proto/driver_pb2.py +0 -0
  121. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/proto/driver_pb2.pyi +0 -0
  122. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/proto/driver_pb2_grpc.py +0 -0
  123. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/proto/driver_pb2_grpc.pyi +0 -0
  124. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/proto/error_pb2.py +0 -0
  125. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/proto/error_pb2.pyi +0 -0
  126. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/proto/error_pb2_grpc.py +0 -0
  127. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/proto/error_pb2_grpc.pyi +0 -0
  128. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/proto/fleet_pb2.py +0 -0
  129. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/proto/fleet_pb2.pyi +0 -0
  130. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/proto/fleet_pb2_grpc.py +0 -0
  131. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
  132. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/proto/node_pb2.py +0 -0
  133. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/proto/node_pb2.pyi +0 -0
  134. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/proto/node_pb2_grpc.py +0 -0
  135. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/proto/node_pb2_grpc.pyi +0 -0
  136. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/proto/recordset_pb2.py +0 -0
  137. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/proto/recordset_pb2.pyi +0 -0
  138. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/proto/recordset_pb2_grpc.py +0 -0
  139. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/proto/recordset_pb2_grpc.pyi +0 -0
  140. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/proto/task_pb2.py +0 -0
  141. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/proto/task_pb2.pyi +0 -0
  142. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/proto/task_pb2_grpc.py +0 -0
  143. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/proto/task_pb2_grpc.pyi +0 -0
  144. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/proto/transport_pb2.py +0 -0
  145. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/proto/transport_pb2.pyi +0 -0
  146. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/proto/transport_pb2_grpc.py +0 -0
  147. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
  148. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/py.typed +0 -0
  149. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/__init__.py +0 -0
  150. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/client_manager.py +0 -0
  151. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/client_proxy.py +0 -0
  152. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/compat/__init__.py +0 -0
  153. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/compat/app.py +0 -0
  154. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/compat/app_utils.py +0 -0
  155. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/compat/driver_client_proxy.py +0 -0
  156. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/compat/legacy_context.py +0 -0
  157. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/criterion.py +0 -0
  158. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/driver/__init__.py +0 -0
  159. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/driver/driver.py +0 -0
  160. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/driver/grpc_driver.py +0 -0
  161. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/driver/inmemory_driver.py +0 -0
  162. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/history.py +0 -0
  163. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/run_serverapp.py +0 -0
  164. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/server.py +0 -0
  165. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/server_app.py +0 -0
  166. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/server_config.py +0 -0
  167. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/strategy/__init__.py +0 -0
  168. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/strategy/aggregate.py +0 -0
  169. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/strategy/bulyan.py +0 -0
  170. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
  171. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
  172. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
  173. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
  174. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
  175. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/strategy/fedadagrad.py +0 -0
  176. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/strategy/fedadam.py +0 -0
  177. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/strategy/fedavg.py +0 -0
  178. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/strategy/fedavg_android.py +0 -0
  179. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/strategy/fedavgm.py +0 -0
  180. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/strategy/fedmedian.py +0 -0
  181. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/strategy/fedopt.py +0 -0
  182. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/strategy/fedprox.py +0 -0
  183. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
  184. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
  185. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
  186. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
  187. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/strategy/fedyogi.py +0 -0
  188. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/strategy/krum.py +0 -0
  189. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/strategy/qfedavg.py +0 -0
  190. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/strategy/strategy.py +0 -0
  191. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/superlink/__init__.py +0 -0
  192. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/superlink/driver/__init__.py +0 -0
  193. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/superlink/driver/driver_grpc.py +0 -0
  194. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/superlink/driver/driver_servicer.py +0 -0
  195. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/superlink/fleet/__init__.py +0 -0
  196. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
  197. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
  198. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
  199. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
  200. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +0 -0
  201. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
  202. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +0 -0
  203. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +0 -0
  204. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
  205. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/superlink/fleet/message_handler/message_handler.py +0 -0
  206. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
  207. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +0 -0
  208. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
  209. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
  210. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
  211. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +0 -0
  212. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/superlink/fleet/vce/vce_api.py +0 -0
  213. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/superlink/state/__init__.py +0 -0
  214. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/superlink/state/in_memory_state.py +0 -0
  215. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/superlink/state/sqlite_state.py +0 -0
  216. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/superlink/state/state.py +0 -0
  217. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/superlink/state/state_factory.py +0 -0
  218. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/superlink/state/utils.py +0 -0
  219. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/typing.py +0 -0
  220. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/utils/__init__.py +0 -0
  221. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/utils/tensorboard.py +0 -0
  222. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/utils/validator.py +0 -0
  223. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/workflow/__init__.py +0 -0
  224. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/workflow/constant.py +0 -0
  225. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/workflow/default_workflows.py +0 -0
  226. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
  227. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
  228. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +0 -0
  229. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/simulation/__init__.py +0 -0
  230. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/simulation/app.py +0 -0
  231. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/simulation/ray_transport/__init__.py +0 -0
  232. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
  233. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
  234. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/simulation/ray_transport/utils.py +0 -0
  235. {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/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.9.0.dev20240531
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.9.0.dev20240531"
8
8
  description = "Flower: A Friendly Federated Learning Framework"
9
9
  license = "Apache-2.0"
10
10
  authors = ["The Flower Authors <hello@flower.ai>"]
@@ -74,14 +74,14 @@ typer = { version = "^0.9.0", extras=["all"] }
74
74
  tomli = "^2.0.1"
75
75
  pathspec = "^0.12.1"
76
76
  # Optional dependencies (Simulation Engine)
77
- ray = { version = "==2.6.3", optional = true, python = ">=3.8,<3.12" }
77
+ ray = { version = "==2.10.0", optional = true, python = ">=3.8,<3.12" }
78
78
  # Optional dependencies (REST transport layer)
79
79
  requests = { version = "^2.31.0", optional = true }
80
80
  starlette = { version = "^0.31.0", optional = true }
81
81
  uvicorn = { version = "^0.23.0", extras = ["standard"], optional = true }
82
82
 
83
83
  [tool.poetry.extras]
84
- simulation = ["ray", "pydantic"]
84
+ simulation = ["ray"]
85
85
  rest = ["requests", "starlette", "uvicorn"]
86
86
 
87
87
  [tool.poetry.group.dev.dependencies]
@@ -24,7 +24,7 @@ import pathspec
24
24
  import typer
25
25
  from typing_extensions import Annotated
26
26
 
27
- from .config_utils import load_and_validate_with_defaults
27
+ from .config_utils import load_and_validate
28
28
  from .utils import is_valid_project_name
29
29
 
30
30
 
@@ -67,9 +67,7 @@ def build(
67
67
  )
68
68
  raise typer.Exit(code=1)
69
69
 
70
- conf, errors, warnings = load_and_validate_with_defaults(
71
- directory / "pyproject.toml"
72
- )
70
+ conf, errors, warnings = load_and_validate(directory / "pyproject.toml")
73
71
  if conf is None:
74
72
  typer.secho(
75
73
  "Project configuration could not be loaded.\npyproject.toml is invalid:\n"
@@ -22,7 +22,7 @@ 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
27
  ) -> Tuple[Optional[Dict[str, Any]], List[str], List[str]]:
28
28
  """Load and validate pyproject.toml as dict.
@@ -47,14 +47,6 @@ def load_and_validate_with_defaults(
47
47
  if not is_valid:
48
48
  return (None, errors, warnings)
49
49
 
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
50
  return (config, errors, warnings)
59
51
 
60
52
 
@@ -129,17 +121,3 @@ def validate(config: Dict[str, Any]) -> Tuple[bool, List[str], List[str]]:
129
121
  return False, [reason], []
130
122
 
131
123
  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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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)
@@ -21,7 +21,7 @@ from contextlib import contextmanager
21
21
  from copy import copy
22
22
  from logging import DEBUG, ERROR
23
23
  from pathlib import Path
24
- from typing import Callable, Iterator, Optional, Sequence, Tuple, Union, cast
24
+ from typing import Callable, Iterator, Optional, Sequence, Tuple, Type, Union, cast
25
25
 
26
26
  import grpc
27
27
  from cryptography.hazmat.primitives.asymmetric import ec
@@ -73,6 +73,7 @@ def grpc_request_response( # pylint: disable=R0913, R0914, R0915
73
73
  authentication_keys: Optional[
74
74
  Tuple[ec.EllipticCurvePrivateKey, ec.EllipticCurvePublicKey]
75
75
  ] = None,
76
+ adapter_cls: Optional[Type[FleetStub]] = None,
76
77
  ) -> Iterator[
77
78
  Tuple[
78
79
  Callable[[], Optional[Message]],
@@ -133,7 +134,9 @@ def grpc_request_response( # pylint: disable=R0913, R0914, R0915
133
134
  channel.subscribe(on_channel_state_change)
134
135
 
135
136
  # Shared variables for inner functions
136
- stub = FleetStub(channel)
137
+ if adapter_cls is None:
138
+ adapter_cls = FleetStub
139
+ stub = adapter_cls(channel)
137
140
  metadata: Optional[Metadata] = None
138
141
  node: Optional[Node] = None
139
142
  ping_thread: Optional[threading.Thread] = None
@@ -20,6 +20,7 @@ from logging import DEBUG, INFO, WARN
20
20
  from pathlib import Path
21
21
  from typing import Callable, Optional, Tuple
22
22
 
23
+ from cryptography.exceptions import UnsupportedAlgorithm
23
24
  from cryptography.hazmat.primitives.asymmetric import ec
24
25
  from cryptography.hazmat.primitives.serialization import (
25
26
  load_ssh_private_key,
@@ -31,9 +32,6 @@ from flwr.common import EventType, event
31
32
  from flwr.common.exit_handlers import register_exit_handlers
32
33
  from flwr.common.logger import log
33
34
  from flwr.common.object_ref import load_app, validate
34
- from flwr.common.secure_aggregation.crypto.symmetric_encryption import (
35
- ssh_types_to_elliptic_curve,
36
- )
37
35
 
38
36
  from ..app import _start_client_internal
39
37
 
@@ -242,40 +240,60 @@ def _parse_args_common(parser: argparse.ArgumentParser) -> None:
242
240
  " Default: current working directory.",
243
241
  )
244
242
  parser.add_argument(
245
- "--authentication-keys",
246
- nargs=2,
247
- metavar=("CLIENT_PRIVATE_KEY", "CLIENT_PUBLIC_KEY"),
243
+ "--auth-supernode-private-key",
244
+ type=str,
245
+ help="The SuperNode's private key (as a path str) to enable authentication.",
246
+ )
247
+ parser.add_argument(
248
+ "--auth-supernode-public-key",
248
249
  type=str,
249
- help="Provide two file paths: (1) the client's private "
250
- "key file, and (2) the client's public key file.",
250
+ help="The SuperNode's public key (as a path str) to enable authentication.",
251
251
  )
252
252
 
253
253
 
254
254
  def _try_setup_client_authentication(
255
255
  args: argparse.Namespace,
256
256
  ) -> Optional[Tuple[ec.EllipticCurvePrivateKey, ec.EllipticCurvePublicKey]]:
257
- if not args.authentication_keys:
257
+ if not args.auth_supernode_private_key and not args.auth_supernode_public_key:
258
258
  return None
259
259
 
260
- ssh_private_key = load_ssh_private_key(
261
- Path(args.authentication_keys[0]).read_bytes(),
262
- None,
263
- )
264
- ssh_public_key = load_ssh_public_key(Path(args.authentication_keys[1]).read_bytes())
260
+ if not args.auth_supernode_private_key or not args.auth_supernode_public_key:
261
+ sys.exit(
262
+ "Authentication requires file paths to both "
263
+ "'--auth-supernode-private-key' and '--auth-supernode-public-key'"
264
+ "to be provided (providing only one of them is not sufficient)."
265
+ )
266
+
267
+ try:
268
+ ssh_private_key = load_ssh_private_key(
269
+ Path(args.auth_supernode_private_key).read_bytes(),
270
+ None,
271
+ )
272
+ if not isinstance(ssh_private_key, ec.EllipticCurvePrivateKey):
273
+ raise ValueError()
274
+ except (ValueError, UnsupportedAlgorithm):
275
+ sys.exit(
276
+ "Error: Unable to parse the private key file in "
277
+ "'--auth-supernode-private-key'. Authentication requires elliptic "
278
+ "curve private and public key pair. Please ensure that the file "
279
+ "path points to a valid private key file and try again."
280
+ )
265
281
 
266
282
  try:
267
- client_private_key, client_public_key = ssh_types_to_elliptic_curve(
268
- ssh_private_key, ssh_public_key
283
+ ssh_public_key = load_ssh_public_key(
284
+ Path(args.auth_supernode_public_key).read_bytes()
269
285
  )
270
- except TypeError:
286
+ if not isinstance(ssh_public_key, ec.EllipticCurvePublicKey):
287
+ raise ValueError()
288
+ except (ValueError, UnsupportedAlgorithm):
271
289
  sys.exit(
272
- "The file paths provided could not be read as a private and public "
273
- "key pair. Client authentication requires an elliptic curve public and "
274
- "private key pair. Please provide the file paths containing elliptic "
275
- "curve private and public keys to '--authentication-keys'."
290
+ "Error: Unable to parse the public key file in "
291
+ "'--auth-supernode-public-key'. Authentication requires elliptic "
292
+ "curve private and public key pair. Please ensure that the file "
293
+ "path points to a valid public key file and try again."
276
294
  )
277
295
 
278
296
  return (
279
- client_private_key,
280
- client_public_key,
297
+ ssh_private_key,
298
+ ssh_public_key,
281
299
  )
@@ -35,6 +35,8 @@ from .typing import (
35
35
  Status,
36
36
  )
37
37
 
38
+ EMPTY_TENSOR_KEY = "_empty"
39
+
38
40
 
39
41
  def parametersrecord_to_parameters(
40
42
  record: ParametersRecord, keep_input: bool
@@ -59,7 +61,8 @@ def parametersrecord_to_parameters(
59
61
  parameters = Parameters(tensors=[], tensor_type="")
60
62
 
61
63
  for key in list(record.keys()):
62
- parameters.tensors.append(record[key].data)
64
+ if key != EMPTY_TENSOR_KEY:
65
+ parameters.tensors.append(record[key].data)
63
66
 
64
67
  if not parameters.tensor_type:
65
68
  # Setting from first array in record. Recall the warning in the docstrings
@@ -103,6 +106,10 @@ def parameters_to_parametersrecord(
103
106
  data=tensor, dtype="", stype=tensor_type, shape=[]
104
107
  )
105
108
 
109
+ if num_arrays == 0:
110
+ ordered_dict[EMPTY_TENSOR_KEY] = Array(
111
+ data=b"", dtype="", stype=tensor_type, shape=[]
112
+ )
106
113
  return ParametersRecord(ordered_dict, keep_input=keep_input)
107
114
 
108
115
 
@@ -117,18 +117,3 @@ def verify_hmac(key: bytes, message: bytes, hmac_value: bytes) -> bool:
117
117
  return True
118
118
  except InvalidSignature:
119
119
  return False
120
-
121
-
122
- def ssh_types_to_elliptic_curve(
123
- private_key: serialization.SSHPrivateKeyTypes,
124
- public_key: serialization.SSHPublicKeyTypes,
125
- ) -> Tuple[ec.EllipticCurvePrivateKey, ec.EllipticCurvePublicKey]:
126
- """Cast SSH key types to elliptic curve."""
127
- if isinstance(private_key, ec.EllipticCurvePrivateKey) and isinstance(
128
- public_key, ec.EllipticCurvePublicKey
129
- ):
130
- return (private_key, public_key)
131
-
132
- raise TypeError(
133
- "The provided key is not an EllipticCurvePrivateKey or EllipticCurvePublicKey"
134
- )
@@ -0,0 +1,32 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Generated by the protocol buffer compiler. DO NOT EDIT!
3
+ # source: flwr/proto/grpcadapter.proto
4
+ # Protobuf Python Version: 4.25.0
5
+ """Generated protocol buffer code."""
6
+ from google.protobuf import descriptor as _descriptor
7
+ from google.protobuf import descriptor_pool as _descriptor_pool
8
+ from google.protobuf import symbol_database as _symbol_database
9
+ from google.protobuf.internal import builder as _builder
10
+ # @@protoc_insertion_point(imports)
11
+
12
+ _sym_db = _symbol_database.Default()
13
+
14
+
15
+
16
+
17
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1c\x66lwr/proto/grpcadapter.proto\x12\nflwr.proto\"\xba\x01\n\x10MessageContainer\x12<\n\x08metadata\x18\x01 \x03(\x0b\x32*.flwr.proto.MessageContainer.MetadataEntry\x12\x19\n\x11grpc_message_name\x18\x02 \x01(\t\x12\x1c\n\x14grpc_message_content\x18\x03 \x01(\x0c\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x32Z\n\x0bGrpcAdapter\x12K\n\x0bSendReceive\x12\x1c.flwr.proto.MessageContainer\x1a\x1c.flwr.proto.MessageContainer\"\x00\x62\x06proto3')
18
+
19
+ _globals = globals()
20
+ _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
21
+ _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'flwr.proto.grpcadapter_pb2', _globals)
22
+ if _descriptor._USE_C_DESCRIPTORS == False:
23
+ DESCRIPTOR._options = None
24
+ _globals['_MESSAGECONTAINER_METADATAENTRY']._options = None
25
+ _globals['_MESSAGECONTAINER_METADATAENTRY']._serialized_options = b'8\001'
26
+ _globals['_MESSAGECONTAINER']._serialized_start=45
27
+ _globals['_MESSAGECONTAINER']._serialized_end=231
28
+ _globals['_MESSAGECONTAINER_METADATAENTRY']._serialized_start=184
29
+ _globals['_MESSAGECONTAINER_METADATAENTRY']._serialized_end=231
30
+ _globals['_GRPCADAPTER']._serialized_start=233
31
+ _globals['_GRPCADAPTER']._serialized_end=323
32
+ # @@protoc_insertion_point(module_scope)
@@ -0,0 +1,43 @@
1
+ """
2
+ @generated by mypy-protobuf. Do not edit manually!
3
+ isort:skip_file
4
+ """
5
+ import builtins
6
+ import google.protobuf.descriptor
7
+ import google.protobuf.internal.containers
8
+ import google.protobuf.message
9
+ import typing
10
+ import typing_extensions
11
+
12
+ DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
13
+
14
+ class MessageContainer(google.protobuf.message.Message):
15
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
16
+ class MetadataEntry(google.protobuf.message.Message):
17
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
18
+ KEY_FIELD_NUMBER: builtins.int
19
+ VALUE_FIELD_NUMBER: builtins.int
20
+ key: typing.Text
21
+ value: typing.Text
22
+ def __init__(self,
23
+ *,
24
+ key: typing.Text = ...,
25
+ value: typing.Text = ...,
26
+ ) -> None: ...
27
+ def ClearField(self, field_name: typing_extensions.Literal["key",b"key","value",b"value"]) -> None: ...
28
+
29
+ METADATA_FIELD_NUMBER: builtins.int
30
+ GRPC_MESSAGE_NAME_FIELD_NUMBER: builtins.int
31
+ GRPC_MESSAGE_CONTENT_FIELD_NUMBER: builtins.int
32
+ @property
33
+ def metadata(self) -> google.protobuf.internal.containers.ScalarMap[typing.Text, typing.Text]: ...
34
+ grpc_message_name: typing.Text
35
+ grpc_message_content: builtins.bytes
36
+ def __init__(self,
37
+ *,
38
+ metadata: typing.Optional[typing.Mapping[typing.Text, typing.Text]] = ...,
39
+ grpc_message_name: typing.Text = ...,
40
+ grpc_message_content: builtins.bytes = ...,
41
+ ) -> None: ...
42
+ def ClearField(self, field_name: typing_extensions.Literal["grpc_message_content",b"grpc_message_content","grpc_message_name",b"grpc_message_name","metadata",b"metadata"]) -> None: ...
43
+ global___MessageContainer = MessageContainer
@@ -0,0 +1,66 @@
1
+ # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
2
+ """Client and server classes corresponding to protobuf-defined services."""
3
+ import grpc
4
+
5
+ from flwr.proto import grpcadapter_pb2 as flwr_dot_proto_dot_grpcadapter__pb2
6
+
7
+
8
+ class GrpcAdapterStub(object):
9
+ """Missing associated documentation comment in .proto file."""
10
+
11
+ def __init__(self, channel):
12
+ """Constructor.
13
+
14
+ Args:
15
+ channel: A grpc.Channel.
16
+ """
17
+ self.SendReceive = channel.unary_unary(
18
+ '/flwr.proto.GrpcAdapter/SendReceive',
19
+ request_serializer=flwr_dot_proto_dot_grpcadapter__pb2.MessageContainer.SerializeToString,
20
+ response_deserializer=flwr_dot_proto_dot_grpcadapter__pb2.MessageContainer.FromString,
21
+ )
22
+
23
+
24
+ class GrpcAdapterServicer(object):
25
+ """Missing associated documentation comment in .proto file."""
26
+
27
+ def SendReceive(self, request, context):
28
+ """Missing associated documentation comment in .proto file."""
29
+ context.set_code(grpc.StatusCode.UNIMPLEMENTED)
30
+ context.set_details('Method not implemented!')
31
+ raise NotImplementedError('Method not implemented!')
32
+
33
+
34
+ def add_GrpcAdapterServicer_to_server(servicer, server):
35
+ rpc_method_handlers = {
36
+ 'SendReceive': grpc.unary_unary_rpc_method_handler(
37
+ servicer.SendReceive,
38
+ request_deserializer=flwr_dot_proto_dot_grpcadapter__pb2.MessageContainer.FromString,
39
+ response_serializer=flwr_dot_proto_dot_grpcadapter__pb2.MessageContainer.SerializeToString,
40
+ ),
41
+ }
42
+ generic_handler = grpc.method_handlers_generic_handler(
43
+ 'flwr.proto.GrpcAdapter', rpc_method_handlers)
44
+ server.add_generic_rpc_handlers((generic_handler,))
45
+
46
+
47
+ # This class is part of an EXPERIMENTAL API.
48
+ class GrpcAdapter(object):
49
+ """Missing associated documentation comment in .proto file."""
50
+
51
+ @staticmethod
52
+ def SendReceive(request,
53
+ target,
54
+ options=(),
55
+ channel_credentials=None,
56
+ call_credentials=None,
57
+ insecure=False,
58
+ compression=None,
59
+ wait_for_ready=None,
60
+ timeout=None,
61
+ metadata=None):
62
+ return grpc.experimental.unary_unary(request, target, '/flwr.proto.GrpcAdapter/SendReceive',
63
+ flwr_dot_proto_dot_grpcadapter__pb2.MessageContainer.SerializeToString,
64
+ flwr_dot_proto_dot_grpcadapter__pb2.MessageContainer.FromString,
65
+ options, channel_credentials,
66
+ insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
@@ -0,0 +1,24 @@
1
+ """
2
+ @generated by mypy-protobuf. Do not edit manually!
3
+ isort:skip_file
4
+ """
5
+ import abc
6
+ import flwr.proto.grpcadapter_pb2
7
+ import grpc
8
+
9
+ class GrpcAdapterStub:
10
+ def __init__(self, channel: grpc.Channel) -> None: ...
11
+ SendReceive: grpc.UnaryUnaryMultiCallable[
12
+ flwr.proto.grpcadapter_pb2.MessageContainer,
13
+ flwr.proto.grpcadapter_pb2.MessageContainer]
14
+
15
+
16
+ class GrpcAdapterServicer(metaclass=abc.ABCMeta):
17
+ @abc.abstractmethod
18
+ def SendReceive(self,
19
+ request: flwr.proto.grpcadapter_pb2.MessageContainer,
20
+ context: grpc.ServicerContext,
21
+ ) -> flwr.proto.grpcadapter_pb2.MessageContainer: ...
22
+
23
+
24
+ def add_GrpcAdapterServicer_to_server(servicer: GrpcAdapterServicer, server: grpc.Server) -> None: ...