flwr-nightly 1.9.0.dev20240430__tar.gz → 1.9.0.dev20240501__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 (219) hide show
  1. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/PKG-INFO +2 -1
  2. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/pyproject.toml +3 -2
  3. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/cli/app.py +2 -0
  4. flwr_nightly-1.9.0.dev20240501/src/py/flwr/cli/build.py +151 -0
  5. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/cli/new/new.py +1 -0
  6. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/cli/new/templates/app/README.md.tpl +1 -1
  7. flwr_nightly-1.9.0.dev20240501/src/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +43 -0
  8. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +9 -1
  9. flwr_nightly-1.9.0.dev20240501/src/py/flwr/cli/new/templates/app/code/task.tensorflow.py.tpl +29 -0
  10. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +1 -1
  11. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +1 -1
  12. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +1 -1
  13. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +1 -1
  14. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/client/mod/centraldp_mods.py +4 -2
  15. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/client/mod/localdp_mod.py +9 -3
  16. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/strategy/dp_adaptive_clipping.py +5 -3
  17. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/strategy/dp_fixed_clipping.py +6 -3
  18. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/simulation/__init__.py +2 -2
  19. flwr_nightly-1.9.0.dev20240430/src/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -57
  20. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/LICENSE +0 -0
  21. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/README.md +0 -0
  22. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/__init__.py +0 -0
  23. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/cli/__init__.py +0 -0
  24. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/cli/config_utils.py +0 -0
  25. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/cli/example.py +0 -0
  26. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/cli/new/__init__.py +0 -0
  27. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/cli/new/templates/__init__.py +0 -0
  28. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/cli/new/templates/app/.gitignore.tpl +0 -0
  29. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/cli/new/templates/app/__init__.py +0 -0
  30. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
  31. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
  32. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/cli/new/templates/app/code/client.numpy.py.tpl +0 -0
  33. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -0
  34. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl +0 -0
  35. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -0
  36. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -0
  37. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/cli/new/templates/app/code/server.sklearn.py.tpl +0 -0
  38. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +0 -0
  39. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/cli/run/__init__.py +0 -0
  40. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/cli/run/run.py +0 -0
  41. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/cli/utils.py +0 -0
  42. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/client/__init__.py +0 -0
  43. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/client/app.py +0 -0
  44. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/client/client.py +0 -0
  45. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/client/client_app.py +0 -0
  46. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/client/dpfedavg_numpy_client.py +0 -0
  47. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/client/grpc_client/__init__.py +0 -0
  48. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/client/grpc_client/connection.py +0 -0
  49. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/client/grpc_rere_client/__init__.py +0 -0
  50. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/client/grpc_rere_client/client_interceptor.py +0 -0
  51. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/client/grpc_rere_client/connection.py +0 -0
  52. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/client/heartbeat.py +0 -0
  53. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/client/message_handler/__init__.py +0 -0
  54. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/client/message_handler/message_handler.py +0 -0
  55. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/client/message_handler/task_handler.py +0 -0
  56. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/client/mod/__init__.py +0 -0
  57. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/client/mod/comms_mods.py +0 -0
  58. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
  59. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
  60. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
  61. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/client/mod/utils.py +0 -0
  62. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/client/node_state.py +0 -0
  63. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/client/node_state_tests.py +0 -0
  64. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/client/numpy_client.py +0 -0
  65. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/client/rest_client/__init__.py +0 -0
  66. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/client/rest_client/connection.py +0 -0
  67. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/client/supernode/__init__.py +0 -0
  68. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/client/supernode/app.py +0 -0
  69. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/client/typing.py +0 -0
  70. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/common/__init__.py +0 -0
  71. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/common/address.py +0 -0
  72. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/common/constant.py +0 -0
  73. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/common/context.py +0 -0
  74. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/common/date.py +0 -0
  75. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/common/differential_privacy.py +0 -0
  76. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/common/differential_privacy_constants.py +0 -0
  77. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/common/dp.py +0 -0
  78. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/common/exit_handlers.py +0 -0
  79. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/common/grpc.py +0 -0
  80. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/common/logger.py +0 -0
  81. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/common/message.py +0 -0
  82. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/common/object_ref.py +0 -0
  83. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/common/parameter.py +0 -0
  84. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/common/pyproject.py +0 -0
  85. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/common/record/__init__.py +0 -0
  86. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/common/record/configsrecord.py +0 -0
  87. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/common/record/conversion_utils.py +0 -0
  88. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/common/record/metricsrecord.py +0 -0
  89. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/common/record/parametersrecord.py +0 -0
  90. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/common/record/recordset.py +0 -0
  91. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/common/record/typeddict.py +0 -0
  92. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/common/recordset_compat.py +0 -0
  93. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/common/retry_invoker.py +0 -0
  94. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/common/secure_aggregation/__init__.py +0 -0
  95. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
  96. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
  97. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -0
  98. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
  99. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/common/secure_aggregation/quantization.py +0 -0
  100. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
  101. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
  102. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/common/serde.py +0 -0
  103. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/common/telemetry.py +0 -0
  104. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/common/typing.py +0 -0
  105. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/common/version.py +0 -0
  106. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/proto/__init__.py +0 -0
  107. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/proto/driver_pb2.py +0 -0
  108. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/proto/driver_pb2.pyi +0 -0
  109. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/proto/driver_pb2_grpc.py +0 -0
  110. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/proto/driver_pb2_grpc.pyi +0 -0
  111. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/proto/error_pb2.py +0 -0
  112. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/proto/error_pb2.pyi +0 -0
  113. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/proto/error_pb2_grpc.py +0 -0
  114. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/proto/error_pb2_grpc.pyi +0 -0
  115. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/proto/fleet_pb2.py +0 -0
  116. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/proto/fleet_pb2.pyi +0 -0
  117. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/proto/fleet_pb2_grpc.py +0 -0
  118. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
  119. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/proto/node_pb2.py +0 -0
  120. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/proto/node_pb2.pyi +0 -0
  121. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/proto/node_pb2_grpc.py +0 -0
  122. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/proto/node_pb2_grpc.pyi +0 -0
  123. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/proto/recordset_pb2.py +0 -0
  124. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/proto/recordset_pb2.pyi +0 -0
  125. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/proto/recordset_pb2_grpc.py +0 -0
  126. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/proto/recordset_pb2_grpc.pyi +0 -0
  127. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/proto/task_pb2.py +0 -0
  128. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/proto/task_pb2.pyi +0 -0
  129. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/proto/task_pb2_grpc.py +0 -0
  130. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/proto/task_pb2_grpc.pyi +0 -0
  131. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/proto/transport_pb2.py +0 -0
  132. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/proto/transport_pb2.pyi +0 -0
  133. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/proto/transport_pb2_grpc.py +0 -0
  134. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
  135. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/py.typed +0 -0
  136. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/__init__.py +0 -0
  137. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/app.py +0 -0
  138. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/client_manager.py +0 -0
  139. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/client_proxy.py +0 -0
  140. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/compat/__init__.py +0 -0
  141. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/compat/app.py +0 -0
  142. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/compat/app_utils.py +0 -0
  143. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/compat/driver_client_proxy.py +0 -0
  144. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/compat/legacy_context.py +0 -0
  145. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/criterion.py +0 -0
  146. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/driver/__init__.py +0 -0
  147. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/driver/driver.py +0 -0
  148. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/driver/grpc_driver.py +0 -0
  149. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/history.py +0 -0
  150. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/run_serverapp.py +0 -0
  151. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/server.py +0 -0
  152. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/server_app.py +0 -0
  153. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/server_config.py +0 -0
  154. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/strategy/__init__.py +0 -0
  155. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/strategy/aggregate.py +0 -0
  156. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/strategy/bulyan.py +0 -0
  157. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
  158. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
  159. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
  160. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/strategy/fedadagrad.py +0 -0
  161. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/strategy/fedadam.py +0 -0
  162. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/strategy/fedavg.py +0 -0
  163. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/strategy/fedavg_android.py +0 -0
  164. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/strategy/fedavgm.py +0 -0
  165. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/strategy/fedmedian.py +0 -0
  166. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/strategy/fedopt.py +0 -0
  167. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/strategy/fedprox.py +0 -0
  168. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
  169. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
  170. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
  171. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
  172. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/strategy/fedyogi.py +0 -0
  173. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/strategy/krum.py +0 -0
  174. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/strategy/qfedavg.py +0 -0
  175. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/strategy/strategy.py +0 -0
  176. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/superlink/__init__.py +0 -0
  177. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/superlink/driver/__init__.py +0 -0
  178. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/superlink/driver/driver_grpc.py +0 -0
  179. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/superlink/driver/driver_servicer.py +0 -0
  180. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/superlink/fleet/__init__.py +0 -0
  181. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
  182. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
  183. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
  184. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
  185. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +0 -0
  186. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
  187. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +0 -0
  188. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +0 -0
  189. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
  190. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/superlink/fleet/message_handler/message_handler.py +0 -0
  191. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
  192. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +0 -0
  193. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
  194. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
  195. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
  196. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +0 -0
  197. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/superlink/fleet/vce/vce_api.py +0 -0
  198. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/superlink/state/__init__.py +0 -0
  199. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/superlink/state/in_memory_state.py +0 -0
  200. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/superlink/state/sqlite_state.py +0 -0
  201. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/superlink/state/state.py +0 -0
  202. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/superlink/state/state_factory.py +0 -0
  203. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/superlink/state/utils.py +0 -0
  204. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/typing.py +0 -0
  205. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/utils/__init__.py +0 -0
  206. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/utils/tensorboard.py +0 -0
  207. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/utils/validator.py +0 -0
  208. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/workflow/__init__.py +0 -0
  209. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/workflow/constant.py +0 -0
  210. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/workflow/default_workflows.py +0 -0
  211. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
  212. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
  213. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +0 -0
  214. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/simulation/app.py +0 -0
  215. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/simulation/ray_transport/__init__.py +0 -0
  216. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
  217. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
  218. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/simulation/ray_transport/utils.py +0 -0
  219. {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/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.dev20240430
3
+ Version: 1.9.0.dev20240501
4
4
  Summary: Flower: A Friendly Federated Learning Framework
5
5
  Home-page: https://flower.ai
6
6
  License: Apache-2.0
@@ -36,6 +36,7 @@ Requires-Dist: cryptography (>=42.0.4,<43.0.0)
36
36
  Requires-Dist: grpcio (>=1.60.0,<2.0.0)
37
37
  Requires-Dist: iterators (>=0.0.2,<0.0.3)
38
38
  Requires-Dist: numpy (>=1.21.0,<2.0.0)
39
+ Requires-Dist: pathspec (>=0.12.1,<0.13.0)
39
40
  Requires-Dist: protobuf (>=4.25.2,<5.0.0)
40
41
  Requires-Dist: pycryptodome (>=3.18.0,<4.0.0)
41
42
  Requires-Dist: ray (==2.6.3) ; (python_version >= "3.8" and python_version < "3.12") and (extra == "simulation")
@@ -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.dev20240430"
7
+ version = "1.9.0.dev20240501"
8
8
  description = "Flower: A Friendly Federated Learning Framework"
9
9
  license = "Apache-2.0"
10
10
  authors = ["The Flower Authors <hello@flower.ai>"]
@@ -59,7 +59,7 @@ flower-superlink = "flwr.server:run_superlink"
59
59
  flower-supernode = "flwr.client:run_supernode"
60
60
  flower-client-app = "flwr.client:run_client_app"
61
61
  flower-server-app = "flwr.server:run_server_app"
62
- flower-simulation = "flwr.simulation:run_simulation_from_cli"
62
+ flower-simulation = "flwr.simulation.run_simulation:run_simulation_from_cli"
63
63
 
64
64
  [tool.poetry.dependencies]
65
65
  python = "^3.8"
@@ -72,6 +72,7 @@ pycryptodome = "^3.18.0"
72
72
  iterators = "^0.0.2"
73
73
  typer = { version = "^0.9.0", extras=["all"] }
74
74
  tomli = "^2.0.1"
75
+ pathspec = "^0.12.1"
75
76
  # Optional dependencies (Simulation Engine)
76
77
  ray = { version = "==2.6.3", optional = true, python = ">=3.8,<3.12" }
77
78
  # Optional dependencies (REST transport layer)
@@ -16,6 +16,7 @@
16
16
 
17
17
  import typer
18
18
 
19
+ from .build import build
19
20
  from .example import example
20
21
  from .new import new
21
22
  from .run import run
@@ -32,6 +33,7 @@ app = typer.Typer(
32
33
  app.command()(new)
33
34
  app.command()(example)
34
35
  app.command()(run)
36
+ app.command()(build)
35
37
 
36
38
  if __name__ == "__main__":
37
39
  app()
@@ -0,0 +1,151 @@
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 `build` command."""
16
+
17
+ import hashlib
18
+ import os
19
+ import zipfile
20
+ from pathlib import Path
21
+ from typing import Optional
22
+
23
+ import pathspec
24
+ import typer
25
+ from typing_extensions import Annotated
26
+
27
+ from .config_utils import load_and_validate_with_defaults
28
+ from .utils import is_valid_project_name
29
+
30
+
31
+ # pylint: disable=too-many-locals
32
+ def build(
33
+ directory: Annotated[
34
+ Optional[Path],
35
+ typer.Option(help="The Flower project directory to bundle into a FAB"),
36
+ ] = None,
37
+ ) -> None:
38
+ """Build a Flower project into a Flower App Bundle (FAB).
39
+
40
+ You can run `flwr build` without any argument to bundle the current directory:
41
+
42
+ `flwr build`
43
+
44
+ You can also build a specific directory:
45
+
46
+ `flwr build --directory ./projects/flower-hello-world`
47
+ """
48
+ if directory is None:
49
+ directory = Path.cwd()
50
+
51
+ directory = directory.resolve()
52
+ if not directory.is_dir():
53
+ typer.secho(
54
+ f"❌ The path {directory} is not a valid directory.",
55
+ fg=typer.colors.RED,
56
+ bold=True,
57
+ )
58
+ raise typer.Exit(code=1)
59
+
60
+ if not is_valid_project_name(directory.name):
61
+ typer.secho(
62
+ f"❌ The project name {directory.name} is invalid, "
63
+ "a valid project name must start with a letter or an underscore, "
64
+ "and can only contain letters, digits, and underscores.",
65
+ fg=typer.colors.RED,
66
+ bold=True,
67
+ )
68
+ raise typer.Exit(code=1)
69
+
70
+ conf, errors, warnings = load_and_validate_with_defaults(
71
+ directory / "pyproject.toml"
72
+ )
73
+ if conf is None:
74
+ typer.secho(
75
+ "Project configuration could not be loaded.\npyproject.toml is invalid:\n"
76
+ + "\n".join([f"- {line}" for line in errors]),
77
+ fg=typer.colors.RED,
78
+ bold=True,
79
+ )
80
+ raise typer.Exit(code=1)
81
+
82
+ if warnings:
83
+ typer.secho(
84
+ "Project configuration is missing the following "
85
+ "recommended properties:\n" + "\n".join([f"- {line}" for line in warnings]),
86
+ fg=typer.colors.RED,
87
+ bold=True,
88
+ )
89
+
90
+ # Load .gitignore rules if present
91
+ ignore_spec = _load_gitignore(directory)
92
+
93
+ # Set the name of the zip file
94
+ fab_filename = (
95
+ f"{conf['flower']['publisher']}"
96
+ f".{directory.name}"
97
+ f".{conf['project']['version'].replace('.', '-')}.fab"
98
+ )
99
+ list_file_content = ""
100
+
101
+ allowed_extensions = {".py", ".toml", ".md"}
102
+
103
+ with zipfile.ZipFile(fab_filename, "w", zipfile.ZIP_DEFLATED) as fab_file:
104
+ for root, _, files in os.walk(directory, topdown=True):
105
+ # Filter directories and files based on .gitignore
106
+ files = [
107
+ f
108
+ for f in files
109
+ if not ignore_spec.match_file(Path(root) / f)
110
+ and f != fab_filename
111
+ and Path(f).suffix in allowed_extensions
112
+ ]
113
+
114
+ for file in files:
115
+ file_path = Path(root) / file
116
+ archive_path = file_path.relative_to(directory)
117
+ fab_file.write(file_path, archive_path)
118
+
119
+ # Calculate file info
120
+ sha256_hash = _get_sha256_hash(file_path)
121
+ file_size_bits = os.path.getsize(file_path) * 8 # size in bits
122
+ list_file_content += f"{archive_path},{sha256_hash},{file_size_bits}\n"
123
+
124
+ # Add CONTENT and CONTENT.jwt to the zip file
125
+ fab_file.writestr(".info/CONTENT", list_file_content)
126
+
127
+ typer.secho(
128
+ f"🎊 Successfully built {fab_filename}.", fg=typer.colors.GREEN, bold=True
129
+ )
130
+
131
+
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
+ def _load_gitignore(directory: Path) -> pathspec.PathSpec:
145
+ """Load and parse .gitignore file, returning a pathspec."""
146
+ gitignore_path = directory / ".gitignore"
147
+ patterns = ["__pycache__/"] # Default pattern
148
+ if gitignore_path.exists():
149
+ with open(gitignore_path, encoding="UTF-8") as file:
150
+ patterns.extend(file.readlines())
151
+ return pathspec.PathSpec.from_lines("gitwildmatch", patterns)
@@ -153,6 +153,7 @@ def new(
153
153
  # Depending on the framework, generate task.py file
154
154
  frameworks_with_tasks = [
155
155
  MlFramework.PYTORCH.value.lower(),
156
+ MlFramework.TENSORFLOW.value.lower(),
156
157
  ]
157
158
  if framework_str in frameworks_with_tasks:
158
159
  files[f"{import_name}/task.py"] = {
@@ -8,7 +8,7 @@ pip install .
8
8
 
9
9
  ## Run (Simulation Engine)
10
10
 
11
- In the `$import_name` directory, use `flwr run` to run a local simulation:
11
+ In the `$project_name` directory, use `flwr run` to run a local simulation:
12
12
 
13
13
  ```bash
14
14
  flwr run
@@ -0,0 +1,43 @@
1
+ """$project_name: A Flower / TensorFlow app."""
2
+
3
+ from flwr.client import NumPyClient, ClientApp
4
+
5
+ from $import_name.task import load_data, load_model
6
+
7
+
8
+ # Define Flower Client and client_fn
9
+ class FlowerClient(NumPyClient):
10
+ def __init__(self, model, x_train, y_train, x_test, y_test):
11
+ self.model = model
12
+ self.x_train = x_train
13
+ self.y_train = y_train
14
+ self.x_test = x_test
15
+ self.y_test = y_test
16
+
17
+ def get_parameters(self, config):
18
+ return self.model.get_weights()
19
+
20
+ def fit(self, parameters, config):
21
+ self.model.set_weights(parameters)
22
+ self.model.fit(self.x_train, self.y_train, epochs=1, batch_size=32, verbose=0)
23
+ return self.model.get_weights(), len(self.x_train), {}
24
+
25
+ def evaluate(self, parameters, config):
26
+ self.model.set_weights(parameters)
27
+ loss, accuracy = self.model.evaluate(self.x_test, self.y_test, verbose=0)
28
+ return loss, len(self.x_test), {"accuracy": accuracy}
29
+
30
+
31
+ def client_fn(cid):
32
+ # Load model and data
33
+ net = load_model()
34
+ x_train, y_train, x_test, y_test = load_data(int(cid), 2)
35
+
36
+ # Return Client instance
37
+ return FlowerClient(net, x_train, y_train, x_test, y_test).to_client()
38
+
39
+
40
+ # Flower ClientApp
41
+ app = ClientApp(
42
+ client_fn=client_fn,
43
+ )
@@ -1,18 +1,26 @@
1
1
  """$project_name: A Flower / TensorFlow app."""
2
2
 
3
+ from flwr.common import ndarrays_to_parameters
3
4
  from flwr.server import ServerApp, ServerConfig
4
5
  from flwr.server.strategy import FedAvg
5
6
 
7
+ from $import_name.task import load_model
8
+
6
9
  # Define config
7
10
  config = ServerConfig(num_rounds=3)
8
11
 
12
+ parameters = ndarrays_to_parameters(load_model().get_weights())
13
+
14
+ # Define strategy
9
15
  strategy = FedAvg(
10
16
  fraction_fit=1.0,
11
17
  fraction_evaluate=1.0,
12
18
  min_available_clients=2,
19
+ initial_parameters=parameters,
13
20
  )
14
21
 
15
- # Flower ServerApp
22
+
23
+ # Create ServerApp
16
24
  app = ServerApp(
17
25
  config=config,
18
26
  strategy=strategy,
@@ -0,0 +1,29 @@
1
+ """$project_name: A Flower / TensorFlow app."""
2
+
3
+ import os
4
+
5
+ import tensorflow as tf
6
+ from flwr_datasets import FederatedDataset
7
+
8
+
9
+ # Make TensorFlow log less verbose
10
+ os.environ["TF_CPP_MIN_LOG_LEVEL"] = "3"
11
+
12
+ def load_model():
13
+ # Load model and data (MobileNetV2, CIFAR-10)
14
+ model = tf.keras.applications.MobileNetV2((32, 32, 3), classes=10, weights=None)
15
+ model.compile("adam", "sparse_categorical_crossentropy", metrics=["accuracy"])
16
+ return model
17
+
18
+
19
+ def load_data(partition_id, num_partitions):
20
+ # Download and partition dataset
21
+ fds = FederatedDataset(dataset="cifar10", partitioners={"train": num_partitions})
22
+ partition = fds.load_partition(partition_id, "train")
23
+ partition.set_format("numpy")
24
+
25
+ # Divide data on each node: 80% train, 20% test
26
+ partition = partition.train_test_split(test_size=0.2)
27
+ x_train, y_train = partition["train"]["img"] / 255.0, partition["train"]["label"]
28
+ x_test, y_test = partition["test"]["img"] / 255.0, partition["test"]["label"]
29
+ return x_train, y_train, x_test, y_test
@@ -9,7 +9,7 @@ description = ""
9
9
  authors = [
10
10
  { name = "The Flower Authors", email = "hello@flower.ai" },
11
11
  ]
12
- license = {text = "Apache License (2.0)"}
12
+ license = { text = "Apache License (2.0)" }
13
13
  dependencies = [
14
14
  "flwr[simulation]>=1.8.0,<2.0",
15
15
  "numpy>=1.21.0",
@@ -9,7 +9,7 @@ description = ""
9
9
  authors = [
10
10
  { name = "The Flower Authors", email = "hello@flower.ai" },
11
11
  ]
12
- license = {text = "Apache License (2.0)"}
12
+ license = { text = "Apache License (2.0)" }
13
13
  dependencies = [
14
14
  "flwr[simulation]>=1.8.0,<2.0",
15
15
  "flwr-datasets[vision]>=0.0.2,<1.0.0",
@@ -9,7 +9,7 @@ description = ""
9
9
  authors = [
10
10
  { name = "The Flower Authors", email = "hello@flower.ai" },
11
11
  ]
12
- license = {text = "Apache License (2.0)"}
12
+ license = { text = "Apache License (2.0)" }
13
13
  dependencies = [
14
14
  "flwr[simulation]>=1.8.0,<2.0",
15
15
  "flwr-datasets[vision]>=0.0.2,<1.0.0",
@@ -9,7 +9,7 @@ description = ""
9
9
  authors = [
10
10
  { name = "The Flower Authors", email = "hello@flower.ai" },
11
11
  ]
12
- license = {text = "Apache License (2.0)"}
12
+ license = { text = "Apache License (2.0)" }
13
13
  dependencies = [
14
14
  "flwr[simulation]>=1.8.0,<2.0",
15
15
  "flwr-datasets[vision]>=0.0.2,<1.0.0",
@@ -82,7 +82,9 @@ def fixedclipping_mod(
82
82
  clipping_norm,
83
83
  )
84
84
 
85
- log(INFO, "fixedclipping_mod: parameters are clipped by value: %s.", clipping_norm)
85
+ log(
86
+ INFO, "fixedclipping_mod: parameters are clipped by value: %.4f.", clipping_norm
87
+ )
86
88
 
87
89
  fit_res.parameters = ndarrays_to_parameters(client_to_server_params)
88
90
  out_msg.content = compat.fitres_to_recordset(fit_res, keep_input=True)
@@ -146,7 +148,7 @@ def adaptiveclipping_mod(
146
148
  )
147
149
  log(
148
150
  INFO,
149
- "adaptiveclipping_mod: parameters are clipped by value: %s.",
151
+ "adaptiveclipping_mod: parameters are clipped by value: %.4f.",
150
152
  clipping_norm,
151
153
  )
152
154
 
@@ -128,7 +128,9 @@ class LocalDpMod:
128
128
  self.clipping_norm,
129
129
  )
130
130
  log(
131
- INFO, "LocalDpMod: parameters are clipped by value: %s.", self.clipping_norm
131
+ INFO,
132
+ "LocalDpMod: parameters are clipped by value: %.4f.",
133
+ self.clipping_norm,
132
134
  )
133
135
 
134
136
  fit_res.parameters = ndarrays_to_parameters(client_to_server_params)
@@ -137,11 +139,15 @@ class LocalDpMod:
137
139
  add_localdp_gaussian_noise_to_params(
138
140
  fit_res.parameters, self.sensitivity, self.epsilon, self.delta
139
141
  )
142
+
143
+ noise_value_sd = (
144
+ self.sensitivity * np.sqrt(2 * np.log(1.25 / self.delta)) / self.epsilon
145
+ )
140
146
  log(
141
147
  INFO,
142
148
  "LocalDpMod: local DP noise with "
143
- "standard deviation: %s added to parameters.",
144
- self.sensitivity * np.sqrt(2 * np.log(1.25 / self.delta)) / self.epsilon,
149
+ "standard deviation: %.4f added to parameters.",
150
+ noise_value_sd,
145
151
  )
146
152
 
147
153
  out_msg.content = compat.fitres_to_recordset(fit_res, keep_input=True)
@@ -200,7 +200,7 @@ class DifferentialPrivacyServerSideAdaptiveClipping(Strategy):
200
200
 
201
201
  log(
202
202
  INFO,
203
- "aggregate_fit: parameters are clipped by value: %s.",
203
+ "aggregate_fit: parameters are clipped by value: %.4f.",
204
204
  self.clipping_norm,
205
205
  )
206
206
 
@@ -234,7 +234,8 @@ class DifferentialPrivacyServerSideAdaptiveClipping(Strategy):
234
234
  )
235
235
  log(
236
236
  INFO,
237
- "aggregate_fit: central DP noise with standard deviation: %s added to parameters.",
237
+ "aggregate_fit: central DP noise with "
238
+ "standard deviation: %.4f added to parameters.",
238
239
  compute_stdv(
239
240
  self.noise_multiplier, self.clipping_norm, self.num_sampled_clients
240
241
  ),
@@ -424,7 +425,8 @@ class DifferentialPrivacyClientSideAdaptiveClipping(Strategy):
424
425
  )
425
426
  log(
426
427
  INFO,
427
- "aggregate_fit: central DP noise with standard deviation: %s added to parameters.",
428
+ "aggregate_fit: central DP noise with "
429
+ "standard deviation: %.4f added to parameters.",
428
430
  compute_stdv(
429
431
  self.noise_multiplier, self.clipping_norm, self.num_sampled_clients
430
432
  ),
@@ -158,7 +158,7 @@ class DifferentialPrivacyServerSideFixedClipping(Strategy):
158
158
  )
159
159
  log(
160
160
  INFO,
161
- "aggregate_fit: parameters are clipped by value: %s.",
161
+ "aggregate_fit: parameters are clipped by value: %.4f.",
162
162
  self.clipping_norm,
163
163
  )
164
164
  # Convert back to parameters
@@ -180,7 +180,8 @@ class DifferentialPrivacyServerSideFixedClipping(Strategy):
180
180
 
181
181
  log(
182
182
  INFO,
183
- "aggregate_fit: central DP noise with standard deviation: %s added to parameters.",
183
+ "aggregate_fit: central DP noise with "
184
+ "standard deviation: %.4f added to parameters.",
184
185
  compute_stdv(
185
186
  self.noise_multiplier, self.clipping_norm, self.num_sampled_clients
186
187
  ),
@@ -337,11 +338,13 @@ class DifferentialPrivacyClientSideFixedClipping(Strategy):
337
338
  )
338
339
  log(
339
340
  INFO,
340
- "aggregate_fit: central DP noise with standard deviation: %s added to parameters.",
341
+ "aggregate_fit: central DP noise with "
342
+ "standard deviation: %.4f added to parameters.",
341
343
  compute_stdv(
342
344
  self.noise_multiplier, self.clipping_norm, self.num_sampled_clients
343
345
  ),
344
346
  )
347
+
345
348
  return aggregated_params, metrics
346
349
 
347
350
  def aggregate_evaluate(
@@ -17,7 +17,7 @@
17
17
 
18
18
  import importlib
19
19
 
20
- from flwr.simulation.run_simulation import run_simulation, run_simulation_from_cli
20
+ from flwr.simulation.run_simulation import run_simulation
21
21
 
22
22
  is_ray_installed = importlib.util.find_spec("ray") is not None
23
23
 
@@ -36,4 +36,4 @@ To install the necessary dependencies, install `flwr` with the `simulation` extr
36
36
  raise ImportError(RAY_IMPORT_ERROR)
37
37
 
38
38
 
39
- __all__ = ["start_simulation", "run_simulation_from_cli", "run_simulation"]
39
+ __all__ = ["start_simulation", "run_simulation"]
@@ -1,57 +0,0 @@
1
- """$project_name: A Flower / TensorFlow app."""
2
-
3
- import os
4
-
5
- import tensorflow as tf
6
- from flwr.client import ClientApp, NumPyClient
7
- from flwr_datasets import FederatedDataset
8
-
9
-
10
- os.environ["TF_CPP_MIN_LOG_LEVEL"] = "3"
11
-
12
- # Define Flower client
13
- class FlowerClient(NumPyClient):
14
- def __init__(self, model, train_data, test_data):
15
- self.model = model
16
- self.x_train, self.y_train = train_data
17
- self.x_test, self.y_test = test_data
18
-
19
- def get_parameters(self, config):
20
- return self.model.get_weights()
21
-
22
- def fit(self, parameters, config):
23
- self.model.set_weights(parameters)
24
- self.model.fit(self.x_train, self.y_train, epochs=1, batch_size=32, verbose=0)
25
- return self.model.get_weights(), len(self.x_train), {}
26
-
27
- def evaluate(self, parameters, config):
28
- self.model.set_weights(parameters)
29
- loss, accuracy = self.model.evaluate(self.x_test, self.y_test, verbose=0)
30
- return loss, len(self.x_test), {"accuracy": accuracy}
31
-
32
-
33
- fds = FederatedDataset(dataset="cifar10", partitioners={"train": 2})
34
-
35
- def client_fn(cid: str):
36
- """Create and return an instance of Flower `Client`."""
37
-
38
- # Load model and data (MobileNetV2, CIFAR-10)
39
- model = tf.keras.applications.MobileNetV2((32, 32, 3), classes=10, weights=None)
40
- model.compile("adam", "sparse_categorical_crossentropy", metrics=["accuracy"])
41
-
42
- # Download and partition dataset
43
- partition = fds.load_partition(int(cid), "train")
44
- partition.set_format("numpy")
45
-
46
- # Divide data on each node: 80% train, 20% test
47
- partition = partition.train_test_split(test_size=0.2, seed=42)
48
- train_data = partition["train"]["img"] / 255.0, partition["train"]["label"]
49
- test_data = partition["test"]["img"] / 255.0, partition["test"]["label"]
50
-
51
- return FlowerClient(model, train_data, test_data).to_client()
52
-
53
-
54
- # Flower ClientApp
55
- app = ClientApp(
56
- client_fn=client_fn,
57
- )