flwr-nightly 1.8.0.dev20240315__tar.gz → 1.11.0.dev20240813__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 (320) hide show
  1. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/PKG-INFO +10 -6
  2. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/README.md +5 -2
  3. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/pyproject.toml +19 -26
  4. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/cli/app.py +7 -0
  5. flwr_nightly-1.11.0.dev20240813/src/py/flwr/cli/build.py +150 -0
  6. flwr_nightly-1.11.0.dev20240813/src/py/flwr/cli/config_utils.py +219 -0
  7. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/cli/example.py +3 -1
  8. flwr_nightly-1.11.0.dev20240813/src/py/flwr/cli/install.py +227 -0
  9. flwr_nightly-1.11.0.dev20240813/src/py/flwr/cli/new/new.py +285 -0
  10. flwr_nightly-1.11.0.dev20240813/src/py/flwr/cli/new/templates/app/.gitignore.tpl +160 -0
  11. flwr_nightly-1.11.0.dev20240813/src/py/flwr/cli/new/templates/app/README.flowertune.md.tpl +56 -0
  12. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/cli/new/templates/app/README.md.tpl +1 -5
  13. flwr_nightly-1.11.0.dev20240813/src/py/flwr/cli/new/templates/app/code/__init__.py.tpl +1 -0
  14. flwr_nightly-1.11.0.dev20240813/src/py/flwr/cli/new/templates/app/code/client.huggingface.py.tpl +65 -0
  15. flwr_nightly-1.11.0.dev20240813/src/py/flwr/cli/new/templates/app/code/client.jax.py.tpl +56 -0
  16. flwr_nightly-1.11.0.dev20240813/src/py/flwr/cli/new/templates/app/code/client.mlx.py.tpl +93 -0
  17. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/cli/new/templates/app/code/client.numpy.py.tpl +3 -2
  18. flwr_nightly-1.11.0.dev20240813/src/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +58 -0
  19. flwr_nightly-1.11.0.dev20240813/src/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl +97 -0
  20. flwr_nightly-1.11.0.dev20240813/src/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +60 -0
  21. flwr_nightly-1.11.0.dev20240813/src/py/flwr/cli/new/templates/app/code/flwr_tune/__init__.py +15 -0
  22. flwr_nightly-1.11.0.dev20240813/src/py/flwr/cli/new/templates/app/code/flwr_tune/app.py.tpl +89 -0
  23. flwr_nightly-1.11.0.dev20240813/src/py/flwr/cli/new/templates/app/code/flwr_tune/client.py.tpl +126 -0
  24. flwr_nightly-1.11.0.dev20240813/src/py/flwr/cli/new/templates/app/code/flwr_tune/config.yaml.tpl +34 -0
  25. flwr_nightly-1.11.0.dev20240813/src/py/flwr/cli/new/templates/app/code/flwr_tune/dataset.py.tpl +57 -0
  26. flwr_nightly-1.11.0.dev20240813/src/py/flwr/cli/new/templates/app/code/flwr_tune/models.py.tpl +59 -0
  27. flwr_nightly-1.11.0.dev20240813/src/py/flwr/cli/new/templates/app/code/flwr_tune/server.py.tpl +48 -0
  28. flwr_nightly-1.11.0.dev20240813/src/py/flwr/cli/new/templates/app/code/flwr_tune/static_config.yaml.tpl +11 -0
  29. flwr_nightly-1.11.0.dev20240813/src/py/flwr/cli/new/templates/app/code/server.huggingface.py.tpl +23 -0
  30. flwr_nightly-1.11.0.dev20240813/src/py/flwr/cli/new/templates/app/code/server.jax.py.tpl +20 -0
  31. flwr_nightly-1.11.0.dev20240813/src/py/flwr/cli/new/templates/app/code/server.mlx.py.tpl +20 -0
  32. flwr_nightly-1.11.0.dev20240813/src/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +20 -0
  33. flwr_nightly-1.11.0.dev20240813/src/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +31 -0
  34. flwr_nightly-1.11.0.dev20240813/src/py/flwr/cli/new/templates/app/code/server.sklearn.py.tpl +24 -0
  35. flwr_nightly-1.11.0.dev20240813/src/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +29 -0
  36. flwr_nightly-1.11.0.dev20240813/src/py/flwr/cli/new/templates/app/code/task.huggingface.py.tpl +99 -0
  37. flwr_nightly-1.11.0.dev20240813/src/py/flwr/cli/new/templates/app/code/task.jax.py.tpl +57 -0
  38. flwr_nightly-1.11.0.dev20240813/src/py/flwr/cli/new/templates/app/code/task.mlx.py.tpl +102 -0
  39. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +28 -23
  40. flwr_nightly-1.11.0.dev20240813/src/py/flwr/cli/new/templates/app/code/task.tensorflow.py.tpl +53 -0
  41. flwr_nightly-1.11.0.dev20240813/src/py/flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +39 -0
  42. flwr_nightly-1.11.0.dev20240813/src/py/flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl +38 -0
  43. flwr_nightly-1.11.0.dev20240813/src/py/flwr/cli/new/templates/app/pyproject.jax.toml.tpl +34 -0
  44. flwr_nightly-1.11.0.dev20240813/src/py/flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +39 -0
  45. flwr_nightly-1.11.0.dev20240813/src/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +32 -0
  46. flwr_nightly-1.11.0.dev20240813/src/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +36 -0
  47. flwr_nightly-1.11.0.dev20240813/src/py/flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +33 -0
  48. flwr_nightly-1.11.0.dev20240813/src/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +36 -0
  49. flwr_nightly-1.11.0.dev20240813/src/py/flwr/cli/run/run.py +219 -0
  50. flwr_nightly-1.11.0.dev20240813/src/py/flwr/cli/utils.py +138 -0
  51. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/client/__init__.py +6 -1
  52. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/client/app.py +239 -248
  53. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/client/client_app.py +70 -9
  54. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/client/dpfedavg_numpy_client.py +1 -1
  55. flwr_nightly-1.11.0.dev20240813/src/py/flwr/client/grpc_adapter_client/__init__.py +15 -0
  56. flwr_nightly-1.11.0.dev20240813/src/py/flwr/client/grpc_adapter_client/connection.py +97 -0
  57. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/client/grpc_client/connection.py +18 -5
  58. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/client/grpc_rere_client/__init__.py +1 -1
  59. flwr_nightly-1.11.0.dev20240813/src/py/flwr/client/grpc_rere_client/client_interceptor.py +158 -0
  60. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/client/grpc_rere_client/connection.py +127 -33
  61. flwr_nightly-1.11.0.dev20240813/src/py/flwr/client/grpc_rere_client/grpc_adapter.py +140 -0
  62. flwr_nightly-1.11.0.dev20240813/src/py/flwr/client/heartbeat.py +74 -0
  63. {flwr_nightly-1.8.0.dev20240315/src/py/flwr/server/superlink/fleet → flwr_nightly-1.11.0.dev20240813/src/py/flwr/client/message_handler}/__init__.py +1 -1
  64. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/client/message_handler/message_handler.py +7 -7
  65. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/client/mod/__init__.py +5 -5
  66. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/client/mod/centraldp_mods.py +4 -2
  67. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/client/mod/comms_mods.py +4 -4
  68. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/client/mod/localdp_mod.py +9 -4
  69. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/client/mod/secure_aggregation/__init__.py +1 -1
  70. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +1 -1
  71. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/client/mod/utils.py +1 -1
  72. flwr_nightly-1.11.0.dev20240813/src/py/flwr/client/node_state.py +98 -0
  73. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/client/node_state_tests.py +4 -3
  74. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/client/rest_client/__init__.py +1 -1
  75. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/client/rest_client/connection.py +177 -157
  76. flwr_nightly-1.11.0.dev20240813/src/py/flwr/client/supernode/__init__.py +26 -0
  77. flwr_nightly-1.11.0.dev20240813/src/py/flwr/client/supernode/app.py +464 -0
  78. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/client/typing.py +1 -0
  79. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/common/__init__.py +13 -11
  80. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/common/address.py +1 -1
  81. flwr_nightly-1.11.0.dev20240813/src/py/flwr/common/config.py +193 -0
  82. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/common/constant.py +42 -1
  83. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/common/context.py +26 -1
  84. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/common/date.py +1 -1
  85. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/common/dp.py +1 -1
  86. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/common/grpc.py +6 -2
  87. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/common/logger.py +79 -8
  88. flwr_nightly-1.11.0.dev20240813/src/py/flwr/common/message.py +385 -0
  89. flwr_nightly-1.11.0.dev20240813/src/py/flwr/common/object_ref.py +241 -0
  90. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/common/record/parametersrecord.py +0 -1
  91. flwr_nightly-1.11.0.dev20240813/src/py/flwr/common/record/recordset.py +130 -0
  92. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/common/recordset_compat.py +8 -1
  93. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/common/retry_invoker.py +25 -13
  94. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/common/secure_aggregation/__init__.py +1 -1
  95. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/common/secure_aggregation/crypto/__init__.py +1 -1
  96. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/common/secure_aggregation/crypto/shamir.py +1 -1
  97. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +21 -2
  98. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +1 -1
  99. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/common/secure_aggregation/quantization.py +1 -1
  100. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/common/secure_aggregation/secaggplus_constants.py +1 -1
  101. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/common/secure_aggregation/secaggplus_utils.py +1 -1
  102. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/common/serde.py +209 -3
  103. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/common/telemetry.py +25 -0
  104. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/common/typing.py +38 -0
  105. flwr_nightly-1.11.0.dev20240813/src/py/flwr/common/version.py +42 -0
  106. flwr_nightly-1.11.0.dev20240813/src/py/flwr/proto/clientappio_pb2.py +41 -0
  107. flwr_nightly-1.11.0.dev20240813/src/py/flwr/proto/clientappio_pb2.pyi +110 -0
  108. flwr_nightly-1.11.0.dev20240813/src/py/flwr/proto/clientappio_pb2_grpc.py +101 -0
  109. flwr_nightly-1.11.0.dev20240813/src/py/flwr/proto/clientappio_pb2_grpc.pyi +40 -0
  110. flwr_nightly-1.11.0.dev20240813/src/py/flwr/proto/common_pb2.py +36 -0
  111. flwr_nightly-1.11.0.dev20240813/src/py/flwr/proto/common_pb2.pyi +121 -0
  112. flwr_nightly-1.11.0.dev20240813/src/py/flwr/proto/driver_pb2.py +51 -0
  113. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/proto/driver_pb2.pyi +34 -0
  114. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/proto/driver_pb2_grpc.py +70 -0
  115. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/proto/driver_pb2_grpc.pyi +28 -0
  116. flwr_nightly-1.11.0.dev20240813/src/py/flwr/proto/exec_pb2.py +43 -0
  117. flwr_nightly-1.11.0.dev20240813/src/py/flwr/proto/exec_pb2.pyi +95 -0
  118. flwr_nightly-1.11.0.dev20240813/src/py/flwr/proto/exec_pb2_grpc.py +101 -0
  119. flwr_nightly-1.11.0.dev20240813/src/py/flwr/proto/exec_pb2_grpc.pyi +41 -0
  120. flwr_nightly-1.11.0.dev20240813/src/py/flwr/proto/fab_pb2.py +30 -0
  121. flwr_nightly-1.11.0.dev20240813/src/py/flwr/proto/fab_pb2.pyi +56 -0
  122. flwr_nightly-1.11.0.dev20240813/src/py/flwr/proto/fleet_pb2.py +56 -0
  123. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/proto/fleet_pb2.pyi +33 -0
  124. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/proto/fleet_pb2_grpc.py +102 -0
  125. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/proto/fleet_pb2_grpc.pyi +35 -0
  126. flwr_nightly-1.11.0.dev20240813/src/py/flwr/proto/grpcadapter_pb2.py +32 -0
  127. flwr_nightly-1.11.0.dev20240813/src/py/flwr/proto/grpcadapter_pb2.pyi +43 -0
  128. flwr_nightly-1.11.0.dev20240813/src/py/flwr/proto/grpcadapter_pb2_grpc.py +66 -0
  129. flwr_nightly-1.11.0.dev20240813/src/py/flwr/proto/grpcadapter_pb2_grpc.pyi +24 -0
  130. flwr_nightly-1.11.0.dev20240813/src/py/flwr/proto/message_pb2.py +41 -0
  131. flwr_nightly-1.11.0.dev20240813/src/py/flwr/proto/message_pb2.pyi +122 -0
  132. flwr_nightly-1.11.0.dev20240813/src/py/flwr/proto/node_pb2_grpc.py +4 -0
  133. flwr_nightly-1.11.0.dev20240813/src/py/flwr/proto/node_pb2_grpc.pyi +4 -0
  134. flwr_nightly-1.11.0.dev20240813/src/py/flwr/proto/recordset_pb2_grpc.py +4 -0
  135. flwr_nightly-1.11.0.dev20240813/src/py/flwr/proto/recordset_pb2_grpc.pyi +4 -0
  136. flwr_nightly-1.11.0.dev20240813/src/py/flwr/proto/run_pb2.py +35 -0
  137. flwr_nightly-1.11.0.dev20240813/src/py/flwr/proto/run_pb2.pyi +76 -0
  138. flwr_nightly-1.11.0.dev20240813/src/py/flwr/proto/run_pb2_grpc.py +4 -0
  139. flwr_nightly-1.11.0.dev20240813/src/py/flwr/proto/run_pb2_grpc.pyi +4 -0
  140. flwr_nightly-1.11.0.dev20240813/src/py/flwr/proto/task_pb2.py +33 -0
  141. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/proto/task_pb2.pyi +8 -5
  142. flwr_nightly-1.11.0.dev20240813/src/py/flwr/proto/task_pb2_grpc.py +4 -0
  143. flwr_nightly-1.11.0.dev20240813/src/py/flwr/proto/task_pb2_grpc.pyi +4 -0
  144. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/__init__.py +4 -8
  145. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/app.py +298 -350
  146. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/compat/app.py +6 -57
  147. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/compat/app_utils.py +5 -4
  148. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/compat/driver_client_proxy.py +29 -48
  149. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/compat/legacy_context.py +5 -4
  150. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/driver/__init__.py +2 -0
  151. flwr_nightly-1.11.0.dev20240813/src/py/flwr/server/driver/driver.py +146 -0
  152. flwr_nightly-1.11.0.dev20240813/src/py/flwr/server/driver/grpc_driver.py +279 -0
  153. flwr_nightly-1.11.0.dev20240813/src/py/flwr/server/driver/inmemory_driver.py +183 -0
  154. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/history.py +20 -20
  155. flwr_nightly-1.11.0.dev20240813/src/py/flwr/server/run_serverapp.py +274 -0
  156. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/server.py +11 -7
  157. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/server_app.py +59 -10
  158. flwr_nightly-1.11.0.dev20240813/src/py/flwr/server/serverapp_components.py +52 -0
  159. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/strategy/bulyan.py +1 -1
  160. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/strategy/dp_adaptive_clipping.py +3 -3
  161. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/strategy/dp_fixed_clipping.py +4 -3
  162. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/strategy/dpfedavg_adaptive.py +1 -1
  163. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/strategy/dpfedavg_fixed.py +1 -1
  164. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/strategy/fedadagrad.py +1 -1
  165. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/strategy/fedadam.py +1 -1
  166. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/strategy/fedavg_android.py +1 -1
  167. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/strategy/fedavgm.py +1 -1
  168. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/strategy/fedmedian.py +1 -1
  169. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/strategy/fedopt.py +1 -1
  170. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/strategy/fedprox.py +1 -1
  171. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/strategy/fedxgb_bagging.py +1 -1
  172. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/strategy/fedxgb_cyclic.py +1 -1
  173. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/strategy/fedxgb_nn_avg.py +1 -1
  174. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/strategy/fedyogi.py +1 -1
  175. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/strategy/krum.py +1 -1
  176. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/strategy/qfedavg.py +1 -1
  177. flwr_nightly-1.11.0.dev20240813/src/py/flwr/server/superlink/driver/__init__.py +15 -0
  178. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/superlink/driver/driver_grpc.py +1 -1
  179. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/superlink/driver/driver_servicer.py +51 -4
  180. flwr_nightly-1.11.0.dev20240813/src/py/flwr/server/superlink/ffs/__init__.py +24 -0
  181. flwr_nightly-1.11.0.dev20240813/src/py/flwr/server/superlink/ffs/disk_ffs.py +104 -0
  182. flwr_nightly-1.11.0.dev20240813/src/py/flwr/server/superlink/ffs/ffs.py +79 -0
  183. flwr_nightly-1.11.0.dev20240813/src/py/flwr/server/superlink/fleet/__init__.py +15 -0
  184. flwr_nightly-1.11.0.dev20240813/src/py/flwr/server/superlink/fleet/grpc_adapter/__init__.py +15 -0
  185. flwr_nightly-1.11.0.dev20240813/src/py/flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +131 -0
  186. flwr_nightly-1.11.0.dev20240813/src/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +15 -0
  187. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +1 -1
  188. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +1 -1
  189. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +1 -1
  190. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +8 -2
  191. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +1 -1
  192. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +30 -2
  193. flwr_nightly-1.11.0.dev20240813/src/py/flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +214 -0
  194. flwr_nightly-1.11.0.dev20240813/src/py/flwr/server/superlink/fleet/message_handler/__init__.py +15 -0
  195. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/superlink/fleet/message_handler/message_handler.py +42 -2
  196. flwr_nightly-1.11.0.dev20240813/src/py/flwr/server/superlink/fleet/rest_rere/__init__.py +15 -0
  197. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +59 -1
  198. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/superlink/fleet/vce/backend/__init__.py +1 -1
  199. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/superlink/fleet/vce/backend/backend.py +5 -5
  200. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +53 -56
  201. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/superlink/fleet/vce/vce_api.py +190 -127
  202. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/superlink/state/__init__.py +1 -1
  203. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/superlink/state/in_memory_state.py +159 -42
  204. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/superlink/state/sqlite_state.py +243 -39
  205. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/superlink/state/state.py +81 -6
  206. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/superlink/state/state_factory.py +11 -2
  207. flwr_nightly-1.11.0.dev20240813/src/py/flwr/server/superlink/state/utils.py +62 -0
  208. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/typing.py +2 -0
  209. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/utils/__init__.py +1 -1
  210. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/utils/tensorboard.py +1 -1
  211. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/utils/validator.py +23 -9
  212. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/workflow/default_workflows.py +67 -25
  213. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +18 -6
  214. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/simulation/__init__.py +7 -4
  215. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/simulation/app.py +67 -36
  216. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/simulation/ray_transport/__init__.py +1 -1
  217. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/simulation/ray_transport/ray_actor.py +20 -46
  218. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/simulation/ray_transport/ray_client_proxy.py +36 -16
  219. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/simulation/run_simulation.py +308 -92
  220. flwr_nightly-1.11.0.dev20240813/src/py/flwr/superexec/__init__.py +21 -0
  221. flwr_nightly-1.11.0.dev20240813/src/py/flwr/superexec/app.py +184 -0
  222. flwr_nightly-1.11.0.dev20240813/src/py/flwr/superexec/deployment.py +185 -0
  223. flwr_nightly-1.11.0.dev20240813/src/py/flwr/superexec/exec_grpc.py +55 -0
  224. flwr_nightly-1.11.0.dev20240813/src/py/flwr/superexec/exec_servicer.py +70 -0
  225. flwr_nightly-1.11.0.dev20240813/src/py/flwr/superexec/executor.py +75 -0
  226. flwr_nightly-1.11.0.dev20240813/src/py/flwr/superexec/simulation.py +193 -0
  227. flwr_nightly-1.8.0.dev20240315/src/py/flwr/cli/flower_toml.py +0 -140
  228. flwr_nightly-1.8.0.dev20240315/src/py/flwr/cli/new/new.py +0 -154
  229. flwr_nightly-1.8.0.dev20240315/src/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -1
  230. flwr_nightly-1.8.0.dev20240315/src/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -46
  231. flwr_nightly-1.8.0.dev20240315/src/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -1
  232. flwr_nightly-1.8.0.dev20240315/src/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -12
  233. flwr_nightly-1.8.0.dev20240315/src/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -28
  234. flwr_nightly-1.8.0.dev20240315/src/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -1
  235. flwr_nightly-1.8.0.dev20240315/src/py/flwr/cli/new/templates/app/flower.toml.tpl +0 -13
  236. flwr_nightly-1.8.0.dev20240315/src/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +0 -19
  237. flwr_nightly-1.8.0.dev20240315/src/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +0 -21
  238. flwr_nightly-1.8.0.dev20240315/src/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +0 -21
  239. flwr_nightly-1.8.0.dev20240315/src/py/flwr/cli/new/templates/app/requirements.numpy.txt.tpl +0 -2
  240. flwr_nightly-1.8.0.dev20240315/src/py/flwr/cli/new/templates/app/requirements.pytorch.txt.tpl +0 -4
  241. flwr_nightly-1.8.0.dev20240315/src/py/flwr/cli/new/templates/app/requirements.tensorflow.txt.tpl +0 -4
  242. flwr_nightly-1.8.0.dev20240315/src/py/flwr/cli/run/run.py +0 -68
  243. flwr_nightly-1.8.0.dev20240315/src/py/flwr/cli/utils.py +0 -67
  244. flwr_nightly-1.8.0.dev20240315/src/py/flwr/client/message_handler/__init__.py +0 -15
  245. flwr_nightly-1.8.0.dev20240315/src/py/flwr/client/node_state.py +0 -48
  246. flwr_nightly-1.8.0.dev20240315/src/py/flwr/common/message.py +0 -323
  247. flwr_nightly-1.8.0.dev20240315/src/py/flwr/common/object_ref.py +0 -140
  248. flwr_nightly-1.8.0.dev20240315/src/py/flwr/common/record/recordset.py +0 -79
  249. flwr_nightly-1.8.0.dev20240315/src/py/flwr/common/version.py +0 -28
  250. flwr_nightly-1.8.0.dev20240315/src/py/flwr/proto/driver_pb2.py +0 -44
  251. flwr_nightly-1.8.0.dev20240315/src/py/flwr/proto/fleet_pb2.py +0 -50
  252. flwr_nightly-1.8.0.dev20240315/src/py/flwr/proto/task_pb2.py +0 -34
  253. flwr_nightly-1.8.0.dev20240315/src/py/flwr/server/driver/driver.py +0 -256
  254. flwr_nightly-1.8.0.dev20240315/src/py/flwr/server/driver/grpc_driver.py +0 -129
  255. flwr_nightly-1.8.0.dev20240315/src/py/flwr/server/run_serverapp.py +0 -187
  256. flwr_nightly-1.8.0.dev20240315/src/py/flwr/server/superlink/driver/__init__.py +0 -15
  257. flwr_nightly-1.8.0.dev20240315/src/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -15
  258. flwr_nightly-1.8.0.dev20240315/src/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -15
  259. flwr_nightly-1.8.0.dev20240315/src/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -15
  260. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/LICENSE +0 -0
  261. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/__init__.py +0 -0
  262. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/cli/__init__.py +0 -0
  263. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/cli/new/__init__.py +0 -0
  264. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/cli/new/templates/__init__.py +0 -0
  265. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/cli/new/templates/app/__init__.py +0 -0
  266. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
  267. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/cli/run/__init__.py +0 -0
  268. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/client/client.py +0 -0
  269. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/client/grpc_client/__init__.py +0 -0
  270. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/client/message_handler/task_handler.py +0 -0
  271. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
  272. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/client/numpy_client.py +0 -0
  273. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/common/differential_privacy.py +0 -0
  274. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/common/differential_privacy_constants.py +0 -0
  275. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/common/exit_handlers.py +0 -0
  276. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/common/parameter.py +0 -0
  277. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/common/pyproject.py +0 -0
  278. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/common/record/__init__.py +1 -1
  279. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/common/record/configsrecord.py +0 -0
  280. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/common/record/conversion_utils.py +0 -0
  281. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/common/record/metricsrecord.py +0 -0
  282. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/common/record/typeddict.py +0 -0
  283. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/proto/__init__.py +0 -0
  284. flwr_nightly-1.8.0.dev20240315/src/py/flwr/proto/error_pb2_grpc.py → flwr_nightly-1.11.0.dev20240813/src/py/flwr/proto/common_pb2_grpc.py +0 -0
  285. flwr_nightly-1.8.0.dev20240315/src/py/flwr/proto/error_pb2_grpc.pyi → flwr_nightly-1.11.0.dev20240813/src/py/flwr/proto/common_pb2_grpc.pyi +0 -0
  286. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/proto/error_pb2.py +0 -0
  287. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/proto/error_pb2.pyi +0 -0
  288. flwr_nightly-1.8.0.dev20240315/src/py/flwr/proto/node_pb2_grpc.py → flwr_nightly-1.11.0.dev20240813/src/py/flwr/proto/error_pb2_grpc.py +0 -0
  289. flwr_nightly-1.8.0.dev20240315/src/py/flwr/proto/node_pb2_grpc.pyi → flwr_nightly-1.11.0.dev20240813/src/py/flwr/proto/error_pb2_grpc.pyi +0 -0
  290. flwr_nightly-1.8.0.dev20240315/src/py/flwr/proto/recordset_pb2_grpc.py → flwr_nightly-1.11.0.dev20240813/src/py/flwr/proto/fab_pb2_grpc.py +0 -0
  291. flwr_nightly-1.8.0.dev20240315/src/py/flwr/proto/recordset_pb2_grpc.pyi → flwr_nightly-1.11.0.dev20240813/src/py/flwr/proto/fab_pb2_grpc.pyi +0 -0
  292. flwr_nightly-1.8.0.dev20240315/src/py/flwr/proto/task_pb2_grpc.py → flwr_nightly-1.11.0.dev20240813/src/py/flwr/proto/message_pb2_grpc.py +0 -0
  293. flwr_nightly-1.8.0.dev20240315/src/py/flwr/proto/task_pb2_grpc.pyi → flwr_nightly-1.11.0.dev20240813/src/py/flwr/proto/message_pb2_grpc.pyi +0 -0
  294. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/proto/node_pb2.py +0 -0
  295. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/proto/node_pb2.pyi +0 -0
  296. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/proto/recordset_pb2.py +0 -0
  297. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/proto/recordset_pb2.pyi +0 -0
  298. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/proto/transport_pb2.py +0 -0
  299. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/proto/transport_pb2.pyi +0 -0
  300. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/proto/transport_pb2_grpc.py +0 -0
  301. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
  302. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/py.typed +0 -0
  303. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/client_manager.py +0 -0
  304. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/client_proxy.py +0 -0
  305. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/compat/__init__.py +0 -0
  306. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/criterion.py +0 -0
  307. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/server_config.py +0 -0
  308. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/strategy/__init__.py +2 -2
  309. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/strategy/aggregate.py +0 -0
  310. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
  311. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/strategy/fedavg.py +0 -0
  312. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
  313. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/strategy/strategy.py +0 -0
  314. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/superlink/__init__.py +0 -0
  315. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
  316. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/workflow/__init__.py +0 -0
  317. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/workflow/constant.py +0 -0
  318. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
  319. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
  320. {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/simulation/ray_transport/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: flwr-nightly
3
- Version: 1.8.0.dev20240315
3
+ Version: 1.11.0.dev20240813
4
4
  Summary: Flower: A Friendly Federated Learning Framework
5
5
  Home-page: https://flower.ai
6
6
  License: Apache-2.0
@@ -33,16 +33,17 @@ Classifier: Typing :: Typed
33
33
  Provides-Extra: rest
34
34
  Provides-Extra: simulation
35
35
  Requires-Dist: cryptography (>=42.0.4,<43.0.0)
36
- Requires-Dist: grpcio (>=1.60.0,<2.0.0)
36
+ Requires-Dist: grpcio (>=1.60.0,<2.0.0,!=1.64.2,!=1.65.1,!=1.65.2,!=1.65.4)
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
- Requires-Dist: pydantic (<2.0.0) ; extra == "simulation"
42
- Requires-Dist: ray (==2.6.3) ; 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)
46
+ Requires-Dist: tomli-w (>=1.0.0,<2.0.0)
46
47
  Requires-Dist: typer[all] (>=0.9.0,<0.10.0)
47
48
  Requires-Dist: uvicorn[standard] (>=0.23.0,<0.24.0) ; extra == "rest"
48
49
  Project-URL: Documentation, https://flower.ai
@@ -194,14 +195,17 @@ Other [examples](https://github.com/adap/flower/tree/main/examples):
194
195
  - [PyTorch: From Centralized to Federated](https://github.com/adap/flower/tree/main/examples/pytorch-from-centralized-to-federated)
195
196
  - [Vertical FL](https://github.com/adap/flower/tree/main/examples/vertical-fl)
196
197
  - [Federated Finetuning of OpenAI's Whisper](https://github.com/adap/flower/tree/main/examples/whisper-federated-finetuning)
197
- - [Federated Finetuning of Large Language Model](https://github.com/adap/flower/tree/main/examples/fedllm-finetune)
198
+ - [Federated Finetuning of Large Language Model](https://github.com/adap/flower/tree/main/examples/llm-flowertune)
198
199
  - [Federated Finetuning of a Vision Transformer](https://github.com/adap/flower/tree/main/examples/vit-finetune)
199
200
  - [Advanced Flower with TensorFlow/Keras](https://github.com/adap/flower/tree/main/examples/advanced-tensorflow)
200
201
  - [Advanced Flower with PyTorch](https://github.com/adap/flower/tree/main/examples/advanced-pytorch)
201
202
  - 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
203
  - [Comprehensive Flower+XGBoost](https://github.com/adap/flower/tree/main/examples/xgboost-comprehensive)
203
204
  - [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)
205
+ - [Flower with KaplanMeierFitter from the lifelines library](https://github.com/adap/flower/tree/main/examples/federated-kaplan-meier-fitter)
206
+ - [Sample Level Privacy with Opacus](https://github.com/adap/flower/tree/main/examples/opacus)
207
+ - [Sample Level Privacy with TensorFlow-Privacy](https://github.com/adap/flower/tree/main/examples/tensorflow-privacy)
208
+ - [Flower with a Tabular Dataset](https://github.com/adap/flower/tree/main/examples/fl-tabular)
205
209
 
206
210
  ## Community
207
211
 
@@ -143,14 +143,17 @@ Other [examples](https://github.com/adap/flower/tree/main/examples):
143
143
  - [PyTorch: From Centralized to Federated](https://github.com/adap/flower/tree/main/examples/pytorch-from-centralized-to-federated)
144
144
  - [Vertical FL](https://github.com/adap/flower/tree/main/examples/vertical-fl)
145
145
  - [Federated Finetuning of OpenAI's Whisper](https://github.com/adap/flower/tree/main/examples/whisper-federated-finetuning)
146
- - [Federated Finetuning of Large Language Model](https://github.com/adap/flower/tree/main/examples/fedllm-finetune)
146
+ - [Federated Finetuning of Large Language Model](https://github.com/adap/flower/tree/main/examples/llm-flowertune)
147
147
  - [Federated Finetuning of a Vision Transformer](https://github.com/adap/flower/tree/main/examples/vit-finetune)
148
148
  - [Advanced Flower with TensorFlow/Keras](https://github.com/adap/flower/tree/main/examples/advanced-tensorflow)
149
149
  - [Advanced Flower with PyTorch](https://github.com/adap/flower/tree/main/examples/advanced-pytorch)
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
+ - [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)
156
+ - [Flower with a Tabular Dataset](https://github.com/adap/flower/tree/main/examples/fl-tabular)
154
157
 
155
158
  ## Community
156
159
 
@@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api"
4
4
 
5
5
  [tool.poetry]
6
6
  name = "flwr-nightly"
7
- version = "1.8.0-dev20240315"
7
+ version = "1.11.0.dev20240813"
8
8
  description = "Flower: A Friendly Federated Learning Framework"
9
9
  license = "Apache-2.0"
10
10
  authors = ["The Flower Authors <hello@flower.ai>"]
@@ -53,34 +53,36 @@ exclude = [
53
53
 
54
54
  [tool.poetry.scripts]
55
55
  flwr = "flwr.cli.app:app"
56
- flower-driver-api = "flwr.server:run_driver_api"
57
- flower-fleet-api = "flwr.server:run_fleet_api"
58
56
  flower-superlink = "flwr.server:run_superlink"
57
+ flower-superexec = "flwr.superexec:run_superexec"
58
+ flower-supernode = "flwr.client:run_supernode"
59
59
  flower-client-app = "flwr.client:run_client_app"
60
60
  flower-server-app = "flwr.server:run_server_app"
61
- flower-simulation = "flwr.simulation:run_simulation_from_cli"
61
+ flower-simulation = "flwr.simulation.run_simulation:run_simulation_from_cli"
62
+ flwr-clientapp = "flwr.client.supernode:flwr_clientapp"
62
63
 
63
64
  [tool.poetry.dependencies]
64
65
  python = "^3.8"
65
66
  # Mandatory dependencies
66
67
  numpy = "^1.21.0"
67
- grpcio = "^1.60.0"
68
+ grpcio = "^1.60.0,!=1.64.2,!=1.65.1,!=1.65.2,!=1.65.4"
68
69
  protobuf = "^4.25.2"
69
70
  cryptography = "^42.0.4"
70
71
  pycryptodome = "^3.18.0"
71
72
  iterators = "^0.0.2"
72
- typer = { version = "^0.9.0", extras=["all"] }
73
+ typer = { version = "^0.9.0", extras = ["all"] }
73
74
  tomli = "^2.0.1"
75
+ tomli-w = "^1.0.0"
76
+ pathspec = "^0.12.1"
74
77
  # Optional dependencies (Simulation Engine)
75
- ray = { version = "==2.6.3", optional = true }
76
- pydantic = { version = "<2.0.0", optional = true }
78
+ ray = { version = "==2.10.0", optional = true, python = ">=3.8,<3.12" }
77
79
  # Optional dependencies (REST transport layer)
78
80
  requests = { version = "^2.31.0", optional = true }
79
81
  starlette = { version = "^0.31.0", optional = true }
80
82
  uvicorn = { version = "^0.23.0", extras = ["standard"], optional = true }
81
83
 
82
84
  [tool.poetry.extras]
83
- simulation = ["ray", "pydantic"]
85
+ simulation = ["ray"]
84
86
  rest = ["requests", "starlette", "uvicorn"]
85
87
 
86
88
  [tool.poetry.group.dev.dependencies]
@@ -104,7 +106,8 @@ jupyterlab = "==4.0.12"
104
106
  rope = "==1.11.0"
105
107
  semver = "==3.0.2"
106
108
  sphinx = "==6.2.1"
107
- sphinx-intl = "==2.1.0"
109
+ sphinx-intl = "==2.2.0"
110
+ sphinx-click = "==5.1.0"
108
111
  myst-parser = "==1.0.0"
109
112
  sphinx-design = "==0.5.0"
110
113
  sphinx-copybutton = "==0.5.2"
@@ -112,7 +115,7 @@ sphinxcontrib-mermaid = "==0.9.2"
112
115
  sphinxcontrib-youtube = "==1.4.1"
113
116
  furo = "==2023.9.10"
114
117
  sphinx-reredirects = "==0.1.3"
115
- nbsphinx = "==0.9.3"
118
+ nbsphinx = "==0.9.4"
116
119
  nbstripout = "==0.6.1"
117
120
  ruff = "==0.1.9"
118
121
  sphinx-argparse = "==0.4.0"
@@ -121,21 +124,18 @@ mdformat-gfm = "==0.3.5"
121
124
  mdformat-frontmatter = "==2.0.1"
122
125
  mdformat-beautysh = "==0.1.1"
123
126
  mdformat-myst = "==0.1.5"
124
- twine = "==4.0.2"
127
+ twine = "==5.1.1"
125
128
  pyroma = "==4.2"
126
129
  check-wheel-contents = "==0.4.0"
127
130
  GitPython = "==3.1.32"
128
131
  PyGithub = "==2.1.1"
129
132
  licensecheck = "==2024"
133
+ pre-commit = "==3.5.0"
134
+ sphinx-substitution-extensions = "2022.02.16"
130
135
 
131
136
  [tool.isort]
132
- line_length = 88
133
- indent = " "
134
- multi_line_output = 3
135
- include_trailing_comma = true
136
- force_grid_wrap = 0
137
- use_parentheses = true
138
- known_first_party = ["flwr", "flwr_experimental", "flwr_tool"]
137
+ profile = "black"
138
+ known_first_party = ["flwr", "flwr_tool"]
139
139
 
140
140
  [tool.black]
141
141
  line-length = 88
@@ -169,13 +169,6 @@ plugins = [
169
169
  ignore_missing_imports = true
170
170
  strict = true
171
171
 
172
- [[tool.mypy.overrides]]
173
- module = [
174
- "flwr_example.*",
175
- "flwr_experimental.*",
176
- ]
177
- ignore_errors = true
178
-
179
172
  [[tool.mypy.overrides]]
180
173
  module = [
181
174
  "importlib.metadata.*",
@@ -15,8 +15,11 @@
15
15
  """Flower command line interface."""
16
16
 
17
17
  import typer
18
+ from typer.main import get_command
18
19
 
20
+ from .build import build
19
21
  from .example import example
22
+ from .install import install
20
23
  from .new import new
21
24
  from .run import run
22
25
 
@@ -32,6 +35,10 @@ app = typer.Typer(
32
35
  app.command()(new)
33
36
  app.command()(example)
34
37
  app.command()(run)
38
+ app.command()(build)
39
+ app.command()(install)
40
+
41
+ typer_click_object = get_command(app)
35
42
 
36
43
  if __name__ == "__main__":
37
44
  app()
@@ -0,0 +1,150 @@
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 os
18
+ import zipfile
19
+ from pathlib import Path
20
+ from typing import Optional
21
+
22
+ import pathspec
23
+ import tomli_w
24
+ import typer
25
+ from typing_extensions import Annotated
26
+
27
+ from .config_utils import load_and_validate
28
+ from .utils import get_sha256_hash, is_valid_project_name
29
+
30
+
31
+ # pylint: disable=too-many-locals
32
+ def build(
33
+ app: Annotated[
34
+ Optional[Path],
35
+ typer.Option(help="Path of the Flower App to bundle into a FAB"),
36
+ ] = None,
37
+ ) -> str:
38
+ """Build a Flower App into a Flower App Bundle (FAB).
39
+
40
+ You can run ``flwr build`` without any arguments to bundle the app located in the
41
+ current directory. Alternatively, you can you can specify a path using the ``--app``
42
+ option to bundle an app located at the provided path. For example:
43
+
44
+ ``flwr build --app ./apps/flower-hello-world``.
45
+ """
46
+ if app is None:
47
+ app = Path.cwd()
48
+
49
+ app = app.resolve()
50
+ if not app.is_dir():
51
+ typer.secho(
52
+ f"❌ The path {app} is not a valid path to a Flower app.",
53
+ fg=typer.colors.RED,
54
+ bold=True,
55
+ )
56
+ raise typer.Exit(code=1)
57
+
58
+ if not is_valid_project_name(app.name):
59
+ typer.secho(
60
+ f"❌ The project name {app.name} is invalid, "
61
+ "a valid project name must start with a letter or an underscore, "
62
+ "and can only contain letters, digits, and underscores.",
63
+ fg=typer.colors.RED,
64
+ bold=True,
65
+ )
66
+ raise typer.Exit(code=1)
67
+
68
+ conf, errors, warnings = load_and_validate(app / "pyproject.toml")
69
+ if conf is None:
70
+ typer.secho(
71
+ "Project configuration could not be loaded.\npyproject.toml is invalid:\n"
72
+ + "\n".join([f"- {line}" for line in errors]),
73
+ fg=typer.colors.RED,
74
+ bold=True,
75
+ )
76
+ raise typer.Exit(code=1)
77
+
78
+ if warnings:
79
+ typer.secho(
80
+ "Project configuration is missing the following "
81
+ "recommended properties:\n" + "\n".join([f"- {line}" for line in warnings]),
82
+ fg=typer.colors.RED,
83
+ bold=True,
84
+ )
85
+
86
+ # Load .gitignore rules if present
87
+ ignore_spec = _load_gitignore(app)
88
+
89
+ # Set the name of the zip file
90
+ fab_filename = (
91
+ f"{conf['tool']['flwr']['app']['publisher']}"
92
+ f".{app.name}"
93
+ f".{conf['project']['version'].replace('.', '-')}.fab"
94
+ )
95
+ list_file_content = ""
96
+
97
+ allowed_extensions = {".py", ".toml", ".md"}
98
+
99
+ # Remove the 'federations' field from 'tool.flwr' if it exists
100
+ if (
101
+ "tool" in conf
102
+ and "flwr" in conf["tool"]
103
+ and "federations" in conf["tool"]["flwr"]
104
+ ):
105
+ del conf["tool"]["flwr"]["federations"]
106
+
107
+ toml_contents = tomli_w.dumps(conf)
108
+
109
+ with zipfile.ZipFile(fab_filename, "w", zipfile.ZIP_DEFLATED) as fab_file:
110
+ fab_file.writestr("pyproject.toml", toml_contents)
111
+
112
+ # Continue with adding other files
113
+ for root, _, files in os.walk(app, topdown=True):
114
+ files = [
115
+ f
116
+ for f in files
117
+ if not ignore_spec.match_file(Path(root) / f)
118
+ and f != fab_filename
119
+ and Path(f).suffix in allowed_extensions
120
+ and f != "pyproject.toml" # Exclude the original pyproject.toml
121
+ ]
122
+
123
+ for file in files:
124
+ file_path = Path(root) / file
125
+ archive_path = file_path.relative_to(app)
126
+ fab_file.write(file_path, archive_path)
127
+
128
+ # Calculate file info
129
+ sha256_hash = get_sha256_hash(file_path)
130
+ file_size_bits = os.path.getsize(file_path) * 8 # size in bits
131
+ list_file_content += f"{archive_path},{sha256_hash},{file_size_bits}\n"
132
+
133
+ # Add CONTENT and CONTENT.jwt to the zip file
134
+ fab_file.writestr(".info/CONTENT", list_file_content)
135
+
136
+ typer.secho(
137
+ f"🎊 Successfully built {fab_filename}", fg=typer.colors.GREEN, bold=True
138
+ )
139
+
140
+ return fab_filename
141
+
142
+
143
+ def _load_gitignore(app: Path) -> pathspec.PathSpec:
144
+ """Load and parse .gitignore file, returning a pathspec."""
145
+ gitignore_path = app / ".gitignore"
146
+ patterns = ["__pycache__/"] # Default pattern
147
+ if gitignore_path.exists():
148
+ with open(gitignore_path, encoding="UTF-8") as file:
149
+ patterns.extend(file.readlines())
150
+ return pathspec.PathSpec.from_lines("gitwildmatch", patterns)
@@ -0,0 +1,219 @@
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
+ """Utility to validate the `pyproject.toml` file."""
16
+
17
+ import zipfile
18
+ from io import BytesIO
19
+ from pathlib import Path
20
+ from typing import IO, Any, Dict, List, Optional, Tuple, Union, get_args
21
+
22
+ import tomli
23
+
24
+ from flwr.common import object_ref
25
+ from flwr.common.typing import UserConfigValue
26
+
27
+
28
+ def get_fab_config(fab_file: Union[Path, bytes]) -> Dict[str, Any]:
29
+ """Extract the config from a FAB file or path.
30
+
31
+ Parameters
32
+ ----------
33
+ fab_file : Union[Path, bytes]
34
+ The Flower App Bundle file to validate and extract the metadata from.
35
+ It can either be a path to the file or the file itself as bytes.
36
+
37
+ Returns
38
+ -------
39
+ Dict[str, Any]
40
+ The `config` of the given Flower App Bundle.
41
+ """
42
+ fab_file_archive: Union[Path, IO[bytes]]
43
+ if isinstance(fab_file, bytes):
44
+ fab_file_archive = BytesIO(fab_file)
45
+ elif isinstance(fab_file, Path):
46
+ fab_file_archive = fab_file
47
+ else:
48
+ raise ValueError("fab_file must be either a Path or bytes")
49
+
50
+ with zipfile.ZipFile(fab_file_archive, "r") as zipf:
51
+ with zipf.open("pyproject.toml") as file:
52
+ toml_content = file.read().decode("utf-8")
53
+
54
+ conf = load_from_string(toml_content)
55
+ if conf is None:
56
+ raise ValueError("Invalid TOML content in pyproject.toml")
57
+
58
+ is_valid, errors, _ = validate(conf, check_module=False)
59
+ if not is_valid:
60
+ raise ValueError(errors)
61
+
62
+ return conf
63
+
64
+
65
+ def get_fab_metadata(fab_file: Union[Path, bytes]) -> Tuple[str, str]:
66
+ """Extract the fab_id and the fab_version from a FAB file or path.
67
+
68
+ Parameters
69
+ ----------
70
+ fab_file : Union[Path, bytes]
71
+ The Flower App Bundle file to validate and extract the metadata from.
72
+ It can either be a path to the file or the file itself as bytes.
73
+
74
+ Returns
75
+ -------
76
+ Tuple[str, str]
77
+ The `fab_version` and `fab_id` of the given Flower App Bundle.
78
+ """
79
+ conf = get_fab_config(fab_file)
80
+
81
+ return (
82
+ conf["project"]["version"],
83
+ f"{conf['tool']['flwr']['app']['publisher']}/{conf['project']['name']}",
84
+ )
85
+
86
+
87
+ def load_and_validate(
88
+ path: Optional[Path] = None,
89
+ check_module: bool = True,
90
+ ) -> Tuple[Optional[Dict[str, Any]], List[str], List[str]]:
91
+ """Load and validate pyproject.toml as dict.
92
+
93
+ Returns
94
+ -------
95
+ Tuple[Optional[config], List[str], List[str]]
96
+ A tuple with the optional config in case it exists and is valid
97
+ and associated errors and warnings.
98
+ """
99
+ if path is None:
100
+ path = Path.cwd() / "pyproject.toml"
101
+
102
+ config = load(path)
103
+
104
+ if config is None:
105
+ errors = [
106
+ "Project configuration could not be loaded. "
107
+ "`pyproject.toml` does not exist."
108
+ ]
109
+ return (None, errors, [])
110
+
111
+ is_valid, errors, warnings = validate(config, check_module, path.parent)
112
+
113
+ if not is_valid:
114
+ return (None, errors, warnings)
115
+
116
+ return (config, errors, warnings)
117
+
118
+
119
+ def load(toml_path: Path) -> Optional[Dict[str, Any]]:
120
+ """Load pyproject.toml and return as dict."""
121
+ if not toml_path.is_file():
122
+ return None
123
+
124
+ with toml_path.open(encoding="utf-8") as toml_file:
125
+ return load_from_string(toml_file.read())
126
+
127
+
128
+ def _validate_run_config(config_dict: Dict[str, Any], errors: List[str]) -> None:
129
+ for key, value in config_dict.items():
130
+ if isinstance(value, dict):
131
+ _validate_run_config(config_dict[key], errors)
132
+ elif not isinstance(value, get_args(UserConfigValue)):
133
+ raise ValueError(
134
+ f"The value for key {key} needs to be of type `int`, `float`, "
135
+ "`bool, `str`, or a `dict` of those.",
136
+ )
137
+
138
+
139
+ # pylint: disable=too-many-branches
140
+ def validate_fields(config: Dict[str, Any]) -> Tuple[bool, List[str], List[str]]:
141
+ """Validate pyproject.toml fields."""
142
+ errors = []
143
+ warnings = []
144
+
145
+ if "project" not in config:
146
+ errors.append("Missing [project] section")
147
+ else:
148
+ if "name" not in config["project"]:
149
+ errors.append('Property "name" missing in [project]')
150
+ if "version" not in config["project"]:
151
+ errors.append('Property "version" missing in [project]')
152
+ if "description" not in config["project"]:
153
+ warnings.append('Recommended property "description" missing in [project]')
154
+ if "license" not in config["project"]:
155
+ warnings.append('Recommended property "license" missing in [project]')
156
+ if "authors" not in config["project"]:
157
+ warnings.append('Recommended property "authors" missing in [project]')
158
+
159
+ if (
160
+ "tool" not in config
161
+ or "flwr" not in config["tool"]
162
+ or "app" not in config["tool"]["flwr"]
163
+ ):
164
+ errors.append("Missing [tool.flwr.app] section")
165
+ else:
166
+ if "publisher" not in config["tool"]["flwr"]["app"]:
167
+ errors.append('Property "publisher" missing in [tool.flwr.app]')
168
+ if "config" in config["tool"]["flwr"]["app"]:
169
+ _validate_run_config(config["tool"]["flwr"]["app"]["config"], errors)
170
+ if "components" not in config["tool"]["flwr"]["app"]:
171
+ errors.append("Missing [tool.flwr.app.components] section")
172
+ else:
173
+ if "serverapp" not in config["tool"]["flwr"]["app"]["components"]:
174
+ errors.append(
175
+ 'Property "serverapp" missing in [tool.flwr.app.components]'
176
+ )
177
+ if "clientapp" not in config["tool"]["flwr"]["app"]["components"]:
178
+ errors.append(
179
+ 'Property "clientapp" missing in [tool.flwr.app.components]'
180
+ )
181
+
182
+ return len(errors) == 0, errors, warnings
183
+
184
+
185
+ def validate(
186
+ config: Dict[str, Any],
187
+ check_module: bool = True,
188
+ project_dir: Optional[Union[str, Path]] = None,
189
+ ) -> Tuple[bool, List[str], List[str]]:
190
+ """Validate pyproject.toml."""
191
+ is_valid, errors, warnings = validate_fields(config)
192
+
193
+ if not is_valid:
194
+ return False, errors, warnings
195
+
196
+ # Validate serverapp
197
+ serverapp_ref = config["tool"]["flwr"]["app"]["components"]["serverapp"]
198
+ is_valid, reason = object_ref.validate(serverapp_ref, check_module, project_dir)
199
+
200
+ if not is_valid and isinstance(reason, str):
201
+ return False, [reason], []
202
+
203
+ # Validate clientapp
204
+ clientapp_ref = config["tool"]["flwr"]["app"]["components"]["clientapp"]
205
+ is_valid, reason = object_ref.validate(clientapp_ref, check_module, project_dir)
206
+
207
+ if not is_valid and isinstance(reason, str):
208
+ return False, [reason], []
209
+
210
+ return True, [], []
211
+
212
+
213
+ def load_from_string(toml_content: str) -> Optional[Dict[str, Any]]:
214
+ """Load TOML content from a string and return as dict."""
215
+ try:
216
+ data = tomli.loads(toml_content)
217
+ return data
218
+ except tomli.TOMLDecodeError:
219
+ return None
@@ -39,7 +39,9 @@ def example() -> None:
39
39
  with urllib.request.urlopen(examples_directory_url) as res:
40
40
  data = json.load(res)
41
41
  example_names = [
42
- item["path"] for item in data["tree"] if item["path"] not in [".gitignore"]
42
+ item["path"]
43
+ for item in data["tree"]
44
+ if item["path"] not in [".gitignore", "doc"]
43
45
  ]
44
46
 
45
47
  example_name = prompt_options(