flwr-nightly 1.13.0.dev20241109__tar.gz → 1.13.0.dev20241112__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 (327) hide show
  1. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/PKG-INFO +4 -2
  2. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/pyproject.toml +11 -7
  3. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/cli/build.py +37 -0
  4. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/cli/install.py +5 -3
  5. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/client/clientapp/app.py +21 -16
  6. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/client/supernode/app.py +2 -36
  7. flwr_nightly-1.13.0.dev20241112/src/py/flwr/common/args.py +148 -0
  8. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/common/logger.py +6 -2
  9. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/app.py +47 -76
  10. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/serverapp/app.py +15 -71
  11. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/superlink/linkstate/in_memory_linkstate.py +5 -0
  12. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/superlink/linkstate/linkstate.py +5 -4
  13. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/superlink/linkstate/sqlite_linkstate.py +8 -2
  14. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/superlink/linkstate/utils.py +11 -0
  15. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/simulation/__init__.py +3 -1
  16. flwr_nightly-1.13.0.dev20241112/src/py/flwr/simulation/app.py +275 -0
  17. flwr_nightly-1.13.0.dev20241109/src/py/flwr/simulation/app.py → flwr_nightly-1.13.0.dev20241112/src/py/flwr/simulation/legacy_app.py +1 -1
  18. flwr_nightly-1.13.0.dev20241112/src/py/flwr/superexec/simulation.py +159 -0
  19. flwr_nightly-1.13.0.dev20241109/src/py/flwr/superexec/simulation.py +0 -217
  20. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/LICENSE +0 -0
  21. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/README.md +0 -0
  22. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/__init__.py +0 -0
  23. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/cli/__init__.py +0 -0
  24. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/cli/app.py +0 -0
  25. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/cli/config_utils.py +0 -0
  26. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/cli/example.py +0 -0
  27. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/cli/log.py +0 -0
  28. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/cli/new/__init__.py +0 -0
  29. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/cli/new/new.py +0 -0
  30. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/cli/new/templates/__init__.py +0 -0
  31. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/cli/new/templates/app/.gitignore.tpl +0 -0
  32. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/cli/new/templates/app/LICENSE.tpl +0 -0
  33. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/cli/new/templates/app/README.baseline.md.tpl +0 -0
  34. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/cli/new/templates/app/README.flowertune.md.tpl +0 -0
  35. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/cli/new/templates/app/README.md.tpl +0 -0
  36. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/cli/new/templates/app/__init__.py +0 -0
  37. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/cli/new/templates/app/code/__init__.baseline.py.tpl +0 -0
  38. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
  39. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
  40. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/cli/new/templates/app/code/client.baseline.py.tpl +0 -0
  41. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/cli/new/templates/app/code/client.huggingface.py.tpl +0 -0
  42. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/cli/new/templates/app/code/client.jax.py.tpl +0 -0
  43. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/cli/new/templates/app/code/client.mlx.py.tpl +0 -0
  44. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/cli/new/templates/app/code/client.numpy.py.tpl +0 -0
  45. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -0
  46. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl +0 -0
  47. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -0
  48. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/cli/new/templates/app/code/dataset.baseline.py.tpl +0 -0
  49. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/cli/new/templates/app/code/flwr_tune/__init__.py +0 -0
  50. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/cli/new/templates/app/code/flwr_tune/client_app.py.tpl +0 -0
  51. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/cli/new/templates/app/code/flwr_tune/dataset.py.tpl +0 -0
  52. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/cli/new/templates/app/code/flwr_tune/models.py.tpl +0 -0
  53. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/cli/new/templates/app/code/flwr_tune/server_app.py.tpl +0 -0
  54. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/cli/new/templates/app/code/flwr_tune/strategy.py.tpl +0 -0
  55. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/cli/new/templates/app/code/model.baseline.py.tpl +0 -0
  56. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/cli/new/templates/app/code/server.baseline.py.tpl +0 -0
  57. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/cli/new/templates/app/code/server.huggingface.py.tpl +0 -0
  58. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/cli/new/templates/app/code/server.jax.py.tpl +0 -0
  59. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/cli/new/templates/app/code/server.mlx.py.tpl +0 -0
  60. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -0
  61. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -0
  62. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/cli/new/templates/app/code/server.sklearn.py.tpl +0 -0
  63. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -0
  64. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/cli/new/templates/app/code/strategy.baseline.py.tpl +0 -0
  65. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/cli/new/templates/app/code/task.huggingface.py.tpl +0 -0
  66. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/cli/new/templates/app/code/task.jax.py.tpl +0 -0
  67. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/cli/new/templates/app/code/task.mlx.py.tpl +0 -0
  68. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/cli/new/templates/app/code/task.numpy.py.tpl +0 -0
  69. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +0 -0
  70. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/cli/new/templates/app/code/task.sklearn.py.tpl +0 -0
  71. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/cli/new/templates/app/code/task.tensorflow.py.tpl +0 -0
  72. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/cli/new/templates/app/code/utils.baseline.py.tpl +0 -0
  73. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/cli/new/templates/app/pyproject.baseline.toml.tpl +0 -0
  74. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +0 -0
  75. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl +0 -0
  76. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/cli/new/templates/app/pyproject.jax.toml.tpl +0 -0
  77. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +0 -0
  78. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +0 -0
  79. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +0 -0
  80. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +0 -0
  81. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +0 -0
  82. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/cli/run/__init__.py +0 -0
  83. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/cli/run/run.py +0 -0
  84. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/cli/utils.py +0 -0
  85. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/client/__init__.py +0 -0
  86. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/client/app.py +0 -0
  87. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/client/client.py +0 -0
  88. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/client/client_app.py +0 -0
  89. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/client/clientapp/__init__.py +0 -0
  90. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/client/clientapp/clientappio_servicer.py +0 -0
  91. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/client/clientapp/utils.py +0 -0
  92. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/client/dpfedavg_numpy_client.py +0 -0
  93. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/client/grpc_adapter_client/__init__.py +0 -0
  94. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/client/grpc_adapter_client/connection.py +0 -0
  95. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/client/grpc_client/__init__.py +0 -0
  96. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/client/grpc_client/connection.py +0 -0
  97. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/client/grpc_rere_client/__init__.py +0 -0
  98. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/client/grpc_rere_client/client_interceptor.py +0 -0
  99. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/client/grpc_rere_client/connection.py +0 -0
  100. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/client/grpc_rere_client/grpc_adapter.py +0 -0
  101. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/client/heartbeat.py +0 -0
  102. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/client/message_handler/__init__.py +0 -0
  103. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/client/message_handler/message_handler.py +0 -0
  104. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/client/message_handler/task_handler.py +0 -0
  105. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/client/mod/__init__.py +0 -0
  106. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/client/mod/centraldp_mods.py +0 -0
  107. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/client/mod/comms_mods.py +0 -0
  108. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/client/mod/localdp_mod.py +0 -0
  109. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
  110. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
  111. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
  112. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/client/mod/utils.py +0 -0
  113. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/client/nodestate/__init__.py +0 -0
  114. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/client/nodestate/in_memory_nodestate.py +0 -0
  115. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/client/nodestate/nodestate.py +0 -0
  116. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/client/nodestate/nodestate_factory.py +0 -0
  117. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/client/numpy_client.py +0 -0
  118. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/client/rest_client/__init__.py +0 -0
  119. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/client/rest_client/connection.py +0 -0
  120. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/client/run_info_store.py +0 -0
  121. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/client/supernode/__init__.py +0 -0
  122. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/client/typing.py +0 -0
  123. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/common/__init__.py +0 -0
  124. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/common/address.py +0 -0
  125. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/common/config.py +0 -0
  126. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/common/constant.py +0 -0
  127. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/common/context.py +0 -0
  128. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/common/date.py +0 -0
  129. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/common/differential_privacy.py +0 -0
  130. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/common/differential_privacy_constants.py +0 -0
  131. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/common/dp.py +0 -0
  132. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/common/exit_handlers.py +0 -0
  133. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/common/grpc.py +0 -0
  134. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/common/message.py +0 -0
  135. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/common/object_ref.py +0 -0
  136. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/common/parameter.py +0 -0
  137. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/common/pyproject.py +0 -0
  138. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/common/record/__init__.py +0 -0
  139. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/common/record/configsrecord.py +0 -0
  140. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/common/record/conversion_utils.py +0 -0
  141. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/common/record/metricsrecord.py +0 -0
  142. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/common/record/parametersrecord.py +0 -0
  143. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/common/record/recordset.py +0 -0
  144. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/common/record/typeddict.py +0 -0
  145. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/common/recordset_compat.py +0 -0
  146. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/common/retry_invoker.py +0 -0
  147. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/common/secure_aggregation/__init__.py +0 -0
  148. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
  149. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
  150. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -0
  151. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
  152. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/common/secure_aggregation/quantization.py +0 -0
  153. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
  154. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
  155. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/common/serde.py +0 -0
  156. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/common/telemetry.py +0 -0
  157. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/common/typing.py +0 -0
  158. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/common/version.py +0 -0
  159. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/proto/__init__.py +0 -0
  160. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/proto/clientappio_pb2.py +0 -0
  161. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/proto/clientappio_pb2.pyi +0 -0
  162. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/proto/clientappio_pb2_grpc.py +0 -0
  163. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/proto/clientappio_pb2_grpc.pyi +0 -0
  164. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/proto/common_pb2.py +0 -0
  165. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/proto/common_pb2.pyi +0 -0
  166. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/proto/common_pb2_grpc.py +0 -0
  167. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/proto/common_pb2_grpc.pyi +0 -0
  168. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/proto/control_pb2.py +0 -0
  169. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/proto/control_pb2.pyi +0 -0
  170. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/proto/control_pb2_grpc.py +0 -0
  171. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/proto/control_pb2_grpc.pyi +0 -0
  172. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/proto/error_pb2.py +0 -0
  173. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/proto/error_pb2.pyi +0 -0
  174. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/proto/error_pb2_grpc.py +0 -0
  175. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/proto/error_pb2_grpc.pyi +0 -0
  176. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/proto/exec_pb2.py +0 -0
  177. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/proto/exec_pb2.pyi +0 -0
  178. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/proto/exec_pb2_grpc.py +0 -0
  179. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/proto/exec_pb2_grpc.pyi +0 -0
  180. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/proto/fab_pb2.py +0 -0
  181. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/proto/fab_pb2.pyi +0 -0
  182. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/proto/fab_pb2_grpc.py +0 -0
  183. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/proto/fab_pb2_grpc.pyi +0 -0
  184. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/proto/fleet_pb2.py +0 -0
  185. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/proto/fleet_pb2.pyi +0 -0
  186. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/proto/fleet_pb2_grpc.py +0 -0
  187. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
  188. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/proto/grpcadapter_pb2.py +0 -0
  189. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/proto/grpcadapter_pb2.pyi +0 -0
  190. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/proto/grpcadapter_pb2_grpc.py +0 -0
  191. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/proto/grpcadapter_pb2_grpc.pyi +0 -0
  192. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/proto/log_pb2.py +0 -0
  193. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/proto/log_pb2.pyi +0 -0
  194. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/proto/log_pb2_grpc.py +0 -0
  195. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/proto/log_pb2_grpc.pyi +0 -0
  196. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/proto/message_pb2.py +0 -0
  197. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/proto/message_pb2.pyi +0 -0
  198. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/proto/message_pb2_grpc.py +0 -0
  199. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/proto/message_pb2_grpc.pyi +0 -0
  200. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/proto/node_pb2.py +0 -0
  201. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/proto/node_pb2.pyi +0 -0
  202. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/proto/node_pb2_grpc.py +0 -0
  203. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/proto/node_pb2_grpc.pyi +0 -0
  204. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/proto/recordset_pb2.py +0 -0
  205. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/proto/recordset_pb2.pyi +0 -0
  206. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/proto/recordset_pb2_grpc.py +0 -0
  207. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/proto/recordset_pb2_grpc.pyi +0 -0
  208. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/proto/run_pb2.py +0 -0
  209. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/proto/run_pb2.pyi +0 -0
  210. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/proto/run_pb2_grpc.py +0 -0
  211. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/proto/run_pb2_grpc.pyi +0 -0
  212. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/proto/serverappio_pb2.py +0 -0
  213. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/proto/serverappio_pb2.pyi +0 -0
  214. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/proto/serverappio_pb2_grpc.py +0 -0
  215. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/proto/serverappio_pb2_grpc.pyi +0 -0
  216. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/proto/simulationio_pb2.py +0 -0
  217. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/proto/simulationio_pb2.pyi +0 -0
  218. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/proto/simulationio_pb2_grpc.py +0 -0
  219. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/proto/simulationio_pb2_grpc.pyi +0 -0
  220. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/proto/task_pb2.py +0 -0
  221. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/proto/task_pb2.pyi +0 -0
  222. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/proto/task_pb2_grpc.py +0 -0
  223. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/proto/task_pb2_grpc.pyi +0 -0
  224. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/proto/transport_pb2.py +0 -0
  225. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/proto/transport_pb2.pyi +0 -0
  226. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/proto/transport_pb2_grpc.py +0 -0
  227. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
  228. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/py.typed +0 -0
  229. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/__init__.py +0 -0
  230. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/client_manager.py +0 -0
  231. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/client_proxy.py +0 -0
  232. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/compat/__init__.py +0 -0
  233. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/compat/app.py +0 -0
  234. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/compat/app_utils.py +0 -0
  235. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/compat/driver_client_proxy.py +0 -0
  236. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/compat/legacy_context.py +0 -0
  237. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/criterion.py +0 -0
  238. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/driver/__init__.py +0 -0
  239. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/driver/driver.py +0 -0
  240. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/driver/grpc_driver.py +0 -0
  241. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/driver/inmemory_driver.py +0 -0
  242. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/history.py +0 -0
  243. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/run_serverapp.py +0 -0
  244. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/server.py +0 -0
  245. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/server_app.py +0 -0
  246. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/server_config.py +0 -0
  247. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/serverapp/__init__.py +0 -0
  248. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/serverapp_components.py +0 -0
  249. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/strategy/__init__.py +0 -0
  250. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/strategy/aggregate.py +0 -0
  251. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/strategy/bulyan.py +0 -0
  252. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
  253. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
  254. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
  255. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
  256. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
  257. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/strategy/fedadagrad.py +0 -0
  258. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/strategy/fedadam.py +0 -0
  259. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/strategy/fedavg.py +0 -0
  260. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/strategy/fedavg_android.py +0 -0
  261. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/strategy/fedavgm.py +0 -0
  262. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/strategy/fedmedian.py +0 -0
  263. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/strategy/fedopt.py +0 -0
  264. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/strategy/fedprox.py +0 -0
  265. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
  266. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
  267. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
  268. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
  269. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/strategy/fedyogi.py +0 -0
  270. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/strategy/krum.py +0 -0
  271. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/strategy/qfedavg.py +0 -0
  272. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/strategy/strategy.py +0 -0
  273. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/superlink/__init__.py +0 -0
  274. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/superlink/driver/__init__.py +0 -0
  275. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/superlink/driver/serverappio_grpc.py +0 -0
  276. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/superlink/driver/serverappio_servicer.py +0 -0
  277. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/superlink/ffs/__init__.py +0 -0
  278. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/superlink/ffs/disk_ffs.py +0 -0
  279. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/superlink/ffs/ffs.py +0 -0
  280. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/superlink/ffs/ffs_factory.py +0 -0
  281. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/superlink/fleet/__init__.py +0 -0
  282. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/superlink/fleet/grpc_adapter/__init__.py +0 -0
  283. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +0 -0
  284. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
  285. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
  286. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
  287. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
  288. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +0 -0
  289. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
  290. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +0 -0
  291. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +0 -0
  292. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
  293. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/superlink/fleet/message_handler/message_handler.py +0 -0
  294. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
  295. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +0 -0
  296. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
  297. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
  298. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
  299. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +0 -0
  300. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/superlink/fleet/vce/vce_api.py +0 -0
  301. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/superlink/linkstate/__init__.py +0 -0
  302. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/superlink/linkstate/linkstate_factory.py +0 -0
  303. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/superlink/simulation/__init__.py +0 -0
  304. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/superlink/simulation/simulationio_grpc.py +0 -0
  305. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/superlink/simulation/simulationio_servicer.py +0 -0
  306. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/typing.py +0 -0
  307. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/utils/__init__.py +0 -0
  308. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/utils/tensorboard.py +0 -0
  309. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/utils/validator.py +0 -0
  310. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/workflow/__init__.py +0 -0
  311. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/workflow/constant.py +0 -0
  312. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/workflow/default_workflows.py +0 -0
  313. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
  314. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
  315. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +0 -0
  316. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/simulation/ray_transport/__init__.py +0 -0
  317. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
  318. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
  319. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/simulation/ray_transport/utils.py +0 -0
  320. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/simulation/run_simulation.py +0 -0
  321. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/simulation/simulationio_connection.py +0 -0
  322. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/superexec/__init__.py +0 -0
  323. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/superexec/app.py +0 -0
  324. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/superexec/deployment.py +0 -0
  325. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/superexec/exec_grpc.py +0 -0
  326. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/superexec/exec_servicer.py +0 -0
  327. {flwr_nightly-1.13.0.dev20241109 → flwr_nightly-1.13.0.dev20241112}/src/py/flwr/superexec/executor.py +0 -0
@@ -1,10 +1,10 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: flwr-nightly
3
- Version: 1.13.0.dev20241109
3
+ Version: 1.13.0.dev20241112
4
4
  Summary: Flower: A Friendly Federated Learning Framework
5
5
  Home-page: https://flower.ai
6
6
  License: Apache-2.0
7
- Keywords: flower,fl,federated learning,federated analytics,federated evaluation,machine learning
7
+ Keywords: Artificial Intelligence,Federated AI,Federated Analytics,Federated Evaluation,Federated Learning,Flower,Machine Learning
8
8
  Author: The Flower Authors
9
9
  Author-email: hello@flower.ai
10
10
  Requires-Python: >=3.9,<4.0
@@ -21,6 +21,7 @@ Classifier: Programming Language :: Python :: 3.10
21
21
  Classifier: Programming Language :: Python :: 3.11
22
22
  Classifier: Programming Language :: Python :: 3.12
23
23
  Classifier: Programming Language :: Python :: 3 :: Only
24
+ Classifier: Programming Language :: Python :: 3.13
24
25
  Classifier: Programming Language :: Python :: Implementation :: CPython
25
26
  Classifier: Topic :: Scientific/Engineering
26
27
  Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
@@ -33,6 +34,7 @@ Provides-Extra: rest
33
34
  Provides-Extra: simulation
34
35
  Requires-Dist: cryptography (>=42.0.4,<43.0.0)
35
36
  Requires-Dist: grpcio (>=1.60.0,<2.0.0,!=1.64.2,<=1.64.3)
37
+ Requires-Dist: hatchling (>=1.25.0,<2.0.0)
36
38
  Requires-Dist: iterators (>=0.0.2,<0.0.3)
37
39
  Requires-Dist: numpy (>=1.26.0,<3.0.0)
38
40
  Requires-Dist: pathspec (>=0.12.1,<0.13.0)
@@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api"
4
4
 
5
5
  [tool.poetry]
6
6
  name = "flwr-nightly"
7
- version = "1.13.0.dev20241109"
7
+ version = "1.13.0.dev20241112"
8
8
  description = "Flower: A Friendly Federated Learning Framework"
9
9
  license = "Apache-2.0"
10
10
  authors = ["The Flower Authors <hello@flower.ai>"]
@@ -13,12 +13,13 @@ homepage = "https://flower.ai"
13
13
  repository = "https://github.com/adap/flower"
14
14
  documentation = "https://flower.ai"
15
15
  keywords = [
16
- "flower",
17
- "fl",
18
- "federated learning",
19
- "federated analytics",
20
- "federated evaluation",
21
- "machine learning",
16
+ "Artificial Intelligence",
17
+ "Federated AI",
18
+ "Federated Analytics",
19
+ "Federated Evaluation",
20
+ "Federated Learning",
21
+ "Flower",
22
+ "Machine Learning",
22
23
  ]
23
24
  classifiers = [
24
25
  "Development Status :: 5 - Production/Stable",
@@ -34,6 +35,7 @@ classifiers = [
34
35
  "Programming Language :: Python :: 3.10",
35
36
  "Programming Language :: Python :: 3.11",
36
37
  "Programming Language :: Python :: 3.12",
38
+ "Programming Language :: Python :: 3.13",
37
39
  "Programming Language :: Python :: Implementation :: CPython",
38
40
  "Topic :: Scientific/Engineering",
39
41
  "Topic :: Scientific/Engineering :: Artificial Intelligence",
@@ -52,6 +54,7 @@ flwr = "flwr.cli.app:app"
52
54
  # SuperExec (can run with either Deployment Engine or Simulation Engine)
53
55
  flower-superexec = "flwr.superexec.app:run_superexec" # Deprecated
54
56
  # Simulation Engine
57
+ flwr-simulation = "flwr.simulation.app:flwr_simulation"
55
58
  flower-simulation = "flwr.simulation.run_simulation:run_simulation_from_cli"
56
59
  # Deployment Engine
57
60
  flower-superlink = "flwr.server.app:run_superlink"
@@ -74,6 +77,7 @@ typer = "^0.12.5"
74
77
  tomli = "^2.0.1"
75
78
  tomli-w = "^1.0.0"
76
79
  pathspec = "^0.12.1"
80
+ hatchling = "^1.25.0"
77
81
  # Optional dependencies (Simulation Engine)
78
82
  ray = { version = "==2.10.0", optional = true, python = ">=3.9,<3.12" }
79
83
  # Optional dependencies (REST transport layer)
@@ -19,14 +19,18 @@ import os
19
19
  import shutil
20
20
  import tempfile
21
21
  import zipfile
22
+ from logging import DEBUG, ERROR
22
23
  from pathlib import Path
23
24
  from typing import Annotated, Any, Optional, Union
24
25
 
25
26
  import pathspec
26
27
  import tomli_w
27
28
  import typer
29
+ from hatchling.builders.wheel import WheelBuilder
30
+ from hatchling.metadata.core import ProjectMetadata
28
31
 
29
32
  from flwr.common.constant import FAB_ALLOWED_EXTENSIONS, FAB_DATE, FAB_HASH_TRUNCATION
33
+ from flwr.common.logger import log
30
34
 
31
35
  from .config_utils import load_and_validate
32
36
  from .utils import is_valid_project_name
@@ -51,6 +55,27 @@ def get_fab_filename(conf: dict[str, Any], fab_hash: str) -> str:
51
55
  return f"{publisher}.{name}.{version}.{fab_hash_truncated}.fab"
52
56
 
53
57
 
58
+ def _build_app_wheel(app: Path) -> Path:
59
+ """Build app as a wheel and return its path."""
60
+ # Path to your project directory
61
+ app_dir = str(app.resolve())
62
+ try:
63
+
64
+ # Initialize the WheelBuilder
65
+ builder = WheelBuilder(
66
+ app_dir, metadata=ProjectMetadata(root=app_dir, plugin_manager=None)
67
+ )
68
+
69
+ # Build
70
+ whl_path = Path(next(builder.build(directory=app_dir)))
71
+ log(DEBUG, "Wheel succesfully built: %s", str(whl_path))
72
+ except Exception as ex:
73
+ log(ERROR, "Exception encountered when building wheel.", exc_info=ex)
74
+ raise typer.Exit(code=1) from ex
75
+
76
+ return whl_path
77
+
78
+
54
79
  # pylint: disable=too-many-locals, too-many-statements
55
80
  def build(
56
81
  app: Annotated[
@@ -106,6 +131,12 @@ def build(
106
131
  bold=True,
107
132
  )
108
133
 
134
+ # Build wheel
135
+ whl_path = _build_app_wheel(app)
136
+
137
+ # Add path to .whl to `[tool.flwr.app]`
138
+ conf["tool"]["flwr"]["app"]["whl"] = str(whl_path.name)
139
+
109
140
  # Load .gitignore rules if present
110
141
  ignore_spec = _load_gitignore(app)
111
142
 
@@ -137,6 +168,9 @@ def build(
137
168
  and f.name != "pyproject.toml" # Exclude the original pyproject.toml
138
169
  ]
139
170
 
171
+ # Include FAB .whl
172
+ all_files.append(whl_path)
173
+
140
174
  for file_path in all_files:
141
175
  # Read the file content manually
142
176
  with open(file_path, "rb") as f:
@@ -153,6 +187,9 @@ def build(
153
187
  # Add CONTENT and CONTENT.jwt to the zip file
154
188
  write_to_zip(fab_file, ".info/CONTENT", list_file_content)
155
189
 
190
+ # Erase FAB .whl in app directory
191
+ whl_path.unlink()
192
+
156
193
  # Get hash of FAB file
157
194
  content = Path(temp_filename).read_bytes()
158
195
  fab_hash = hashlib.sha256(content).hexdigest()
@@ -188,23 +188,25 @@ def validate_and_install(
188
188
  else:
189
189
  shutil.copy2(item, install_dir / item.name)
190
190
 
191
+ whl_file = config["tool"]["flwr"]["app"]["whl"]
192
+ install_whl = install_dir / whl_file
191
193
  try:
192
194
  subprocess.run(
193
- ["pip", "install", "-e", install_dir, "--no-deps"],
195
+ ["pip", "install", "--no-deps", install_whl],
194
196
  capture_output=True,
195
197
  text=True,
196
198
  check=True,
197
199
  )
198
200
  except subprocess.CalledProcessError as e:
199
201
  typer.secho(
200
- f"❌ Failed to `pip install` package(s) from {install_dir}:\n{e.stderr}",
202
+ f"❌ Failed to install {project_name}:\n{e.stderr}",
201
203
  fg=typer.colors.RED,
202
204
  bold=True,
203
205
  )
204
206
  raise typer.Exit(code=1) from e
205
207
 
206
208
  typer.secho(
207
- f"🎊 Successfully installed {project_name} to {install_dir}.",
209
+ f"🎊 Successfully installed {project_name}.",
208
210
  fg=typer.colors.GREEN,
209
211
  bold=True,
210
212
  )
@@ -24,6 +24,8 @@ import grpc
24
24
  from flwr.cli.install import install_from_fab
25
25
  from flwr.client.client_app import ClientApp, LoadClientAppError
26
26
  from flwr.common import Context, Message
27
+ from flwr.common.args import add_args_flwr_app_common
28
+ from flwr.common.config import get_flwr_dir
27
29
  from flwr.common.constant import ErrorCode
28
30
  from flwr.common.grpc import create_channel
29
31
  from flwr.common.logger import log
@@ -60,7 +62,7 @@ def flwr_clientapp() -> None:
60
62
  parser.add_argument(
61
63
  "--supernode",
62
64
  type=str,
63
- help="Address of SuperNode ClientAppIo gRPC servicer",
65
+ help="Address of SuperNode's ClientAppIo API",
64
66
  )
65
67
  parser.add_argument(
66
68
  "--token",
@@ -68,17 +70,24 @@ def flwr_clientapp() -> None:
68
70
  required=False,
69
71
  help="Unique token generated by SuperNode for each ClientApp execution",
70
72
  )
73
+ add_args_flwr_app_common(parser=parser)
71
74
  args = parser.parse_args()
72
75
 
73
76
  log(INFO, "Starting Flower ClientApp")
77
+
74
78
  log(
75
79
  DEBUG,
76
- "Staring isolated `ClientApp` connected to SuperNode ClientAppIo at %s "
80
+ "Starting isolated `ClientApp` connected to SuperNode's ClientAppIo API at %s "
77
81
  "with token %s",
78
82
  args.supernode,
79
83
  args.token,
80
84
  )
81
- run_clientapp(supernode=args.supernode, token=args.token)
85
+ run_clientapp(
86
+ supernode=args.supernode,
87
+ run_once=(args.token is not None),
88
+ token=args.token,
89
+ flwr_dir=args.flwr_dir,
90
+ )
82
91
 
83
92
 
84
93
  def on_channel_state_change(channel_connectivity: str) -> None:
@@ -88,27 +97,23 @@ def on_channel_state_change(channel_connectivity: str) -> None:
88
97
 
89
98
  def run_clientapp( # pylint: disable=R0914
90
99
  supernode: str,
100
+ run_once: bool,
91
101
  token: Optional[int] = None,
102
+ flwr_dir: Optional[str] = None,
92
103
  ) -> None:
93
- """Run Flower ClientApp process.
94
-
95
- Parameters
96
- ----------
97
- supernode : str
98
- Address of SuperNode
99
- token : Optional[int] (default: None)
100
- Unique SuperNode token for ClientApp-SuperNode authentication
101
- """
104
+ """Run Flower ClientApp process."""
102
105
  channel = create_channel(
103
106
  server_address=supernode,
104
107
  insecure=True,
105
108
  )
106
109
  channel.subscribe(on_channel_state_change)
107
110
 
111
+ # Resolve directory where FABs are installed
112
+ flwr_dir_ = get_flwr_dir(flwr_dir)
113
+
108
114
  try:
109
115
  stub = ClientAppIoStub(channel)
110
116
 
111
- only_once = token is not None
112
117
  while True:
113
118
  # If token is not set, loop until token is received from SuperNode
114
119
  while token is None:
@@ -121,13 +126,13 @@ def run_clientapp( # pylint: disable=R0914
121
126
  # Install FAB, if provided
122
127
  if fab:
123
128
  log(DEBUG, "Flower ClientApp starts FAB installation.")
124
- install_from_fab(fab.content, flwr_dir=None, skip_prompt=True)
129
+ install_from_fab(fab.content, flwr_dir=flwr_dir_, skip_prompt=True)
125
130
 
126
131
  load_client_app_fn = get_load_client_app_fn(
127
132
  default_app_ref="",
128
133
  app_path=None,
129
134
  multi_app=True,
130
- flwr_dir=None,
135
+ flwr_dir=str(flwr_dir_),
131
136
  )
132
137
 
133
138
  try:
@@ -169,7 +174,7 @@ def run_clientapp( # pylint: disable=R0914
169
174
 
170
175
  # Stop the loop if `flwr-clientapp` is expected to process only a single
171
176
  # message
172
- if only_once:
177
+ if run_once:
173
178
  break
174
179
 
175
180
  except KeyboardInterrupt:
@@ -28,6 +28,7 @@ from cryptography.hazmat.primitives.serialization import (
28
28
  )
29
29
 
30
30
  from flwr.common import EventType, event
31
+ from flwr.common.args import try_obtain_root_certificates
31
32
  from flwr.common.config import parse_config_args
32
33
  from flwr.common.constant import (
33
34
  FLEET_API_GRPC_RERE_DEFAULT_ADDRESS,
@@ -61,7 +62,7 @@ def run_supernode() -> None:
61
62
  "Ignoring `--flwr-dir`.",
62
63
  )
63
64
 
64
- root_certificates = _get_certificates(args)
65
+ root_certificates = try_obtain_root_certificates(args, args.superlink)
65
66
  load_fn = get_load_client_app_fn(
66
67
  default_app_ref="",
67
68
  app_path=args.app,
@@ -126,41 +127,6 @@ def _warn_deprecated_server_arg(args: argparse.Namespace) -> None:
126
127
  args.superlink = args.server
127
128
 
128
129
 
129
- def _get_certificates(args: argparse.Namespace) -> Optional[bytes]:
130
- """Load certificates if specified in args."""
131
- # Obtain certificates
132
- if args.insecure:
133
- if args.root_certificates is not None:
134
- sys.exit(
135
- "Conflicting options: The '--insecure' flag disables HTTPS, "
136
- "but '--root-certificates' was also specified. Please remove "
137
- "the '--root-certificates' option when running in insecure mode, "
138
- "or omit '--insecure' to use HTTPS."
139
- )
140
- log(
141
- WARN,
142
- "Option `--insecure` was set. "
143
- "Starting insecure HTTP client connected to %s.",
144
- args.superlink,
145
- )
146
- root_certificates = None
147
- else:
148
- # Load the certificates if provided, or load the system certificates
149
- cert_path = args.root_certificates
150
- if cert_path is None:
151
- root_certificates = None
152
- else:
153
- root_certificates = Path(cert_path).read_bytes()
154
- log(
155
- DEBUG,
156
- "Starting secure HTTPS client connected to %s "
157
- "with the following certificates: %s.",
158
- args.superlink,
159
- cert_path,
160
- )
161
- return root_certificates
162
-
163
-
164
130
  def _parse_args_run_supernode() -> argparse.ArgumentParser:
165
131
  """Parse flower-supernode command line arguments."""
166
132
  parser = argparse.ArgumentParser(
@@ -0,0 +1,148 @@
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
+ """Common Flower arguments."""
16
+
17
+ import argparse
18
+ import sys
19
+ from logging import DEBUG, WARN
20
+ from os.path import isfile
21
+ from pathlib import Path
22
+ from typing import Optional
23
+
24
+ from flwr.common.constant import (
25
+ TRANSPORT_TYPE_GRPC_ADAPTER,
26
+ TRANSPORT_TYPE_GRPC_RERE,
27
+ TRANSPORT_TYPE_REST,
28
+ )
29
+ from flwr.common.logger import log
30
+
31
+
32
+ def add_args_flwr_app_common(parser: argparse.ArgumentParser) -> None:
33
+ """Add common Flower arguments for flwr-*app to the provided parser."""
34
+ parser.add_argument(
35
+ "--flwr-dir",
36
+ default=None,
37
+ help="""The path containing installed Flower Apps.
38
+ By default, this value is equal to:
39
+
40
+ - `$FLWR_HOME/` if `$FLWR_HOME` is defined
41
+ - `$XDG_DATA_HOME/.flwr/` if `$XDG_DATA_HOME` is defined
42
+ - `$HOME/.flwr/` in all other cases
43
+ """,
44
+ )
45
+ parser.add_argument(
46
+ "--insecure",
47
+ action="store_true",
48
+ help="Run the server without HTTPS, regardless of whether certificate "
49
+ "paths are provided. By default, the server runs with HTTPS enabled. "
50
+ "Use this flag only if you understand the risks.",
51
+ )
52
+ parser.add_argument(
53
+ "--root-certificates",
54
+ metavar="ROOT_CERT",
55
+ type=str,
56
+ help="Specifies the path to the PEM-encoded root certificate file for "
57
+ "establishing secure HTTPS connections.",
58
+ )
59
+
60
+
61
+ def try_obtain_root_certificates(
62
+ args: argparse.Namespace,
63
+ grpc_server_address: str,
64
+ ) -> Optional[bytes]:
65
+ """Validate and return the root certificates."""
66
+ root_cert_path = args.root_certificates
67
+ if args.insecure:
68
+ if root_cert_path is not None:
69
+ sys.exit(
70
+ "Conflicting options: The '--insecure' flag disables HTTPS, "
71
+ "but '--root-certificates' was also specified. Please remove "
72
+ "the '--root-certificates' option when running in insecure mode, "
73
+ "or omit '--insecure' to use HTTPS."
74
+ )
75
+ log(
76
+ WARN,
77
+ "Option `--insecure` was set. Starting insecure HTTP channel to %s.",
78
+ grpc_server_address,
79
+ )
80
+ root_certificates = None
81
+ else:
82
+ # Load the certificates if provided, or load the system certificates
83
+ if not isfile(root_cert_path):
84
+ sys.exit("Path argument `--root-certificates` does not point to a file.")
85
+ root_certificates = Path(root_cert_path).read_bytes()
86
+ log(
87
+ DEBUG,
88
+ "Starting secure HTTPS channel to %s "
89
+ "with the following certificates: %s.",
90
+ grpc_server_address,
91
+ root_cert_path,
92
+ )
93
+ return root_certificates
94
+
95
+
96
+ def try_obtain_server_certificates(
97
+ args: argparse.Namespace,
98
+ transport_type: str,
99
+ ) -> Optional[tuple[bytes, bytes, bytes]]:
100
+ """Validate and return the CA cert, server cert, and server private key."""
101
+ if args.insecure:
102
+ log(WARN, "Option `--insecure` was set. Starting insecure HTTP server.")
103
+ return None
104
+ # Check if certificates are provided
105
+ if transport_type in [TRANSPORT_TYPE_GRPC_RERE, TRANSPORT_TYPE_GRPC_ADAPTER]:
106
+ if args.ssl_certfile and args.ssl_keyfile and args.ssl_ca_certfile:
107
+ if not isfile(args.ssl_ca_certfile):
108
+ sys.exit("Path argument `--ssl-ca-certfile` does not point to a file.")
109
+ if not isfile(args.ssl_certfile):
110
+ sys.exit("Path argument `--ssl-certfile` does not point to a file.")
111
+ if not isfile(args.ssl_keyfile):
112
+ sys.exit("Path argument `--ssl-keyfile` does not point to a file.")
113
+ certificates = (
114
+ Path(args.ssl_ca_certfile).read_bytes(), # CA certificate
115
+ Path(args.ssl_certfile).read_bytes(), # server certificate
116
+ Path(args.ssl_keyfile).read_bytes(), # server private key
117
+ )
118
+ return certificates
119
+ if args.ssl_certfile or args.ssl_keyfile or args.ssl_ca_certfile:
120
+ sys.exit(
121
+ "You need to provide valid file paths to `--ssl-certfile`, "
122
+ "`--ssl-keyfile`, and `—-ssl-ca-certfile` to create a secure "
123
+ "connection in Fleet API server (gRPC-rere)."
124
+ )
125
+ if transport_type == TRANSPORT_TYPE_REST:
126
+ if args.ssl_certfile and args.ssl_keyfile:
127
+ if not isfile(args.ssl_certfile):
128
+ sys.exit("Path argument `--ssl-certfile` does not point to a file.")
129
+ if not isfile(args.ssl_keyfile):
130
+ sys.exit("Path argument `--ssl-keyfile` does not point to a file.")
131
+ certificates = (
132
+ b"",
133
+ Path(args.ssl_certfile).read_bytes(), # server certificate
134
+ Path(args.ssl_keyfile).read_bytes(), # server private key
135
+ )
136
+ return certificates
137
+ if args.ssl_certfile or args.ssl_keyfile:
138
+ sys.exit(
139
+ "You need to provide valid file paths to `--ssl-certfile` "
140
+ "and `--ssl-keyfile` to create a secure connection "
141
+ "in Fleet API server (REST, experimental)."
142
+ )
143
+ sys.exit(
144
+ "Certificates are required unless running in insecure mode. "
145
+ "Please provide certificate paths to `--ssl-certfile`, "
146
+ "`--ssl-keyfile`, and `—-ssl-ca-certfile` or run the server "
147
+ "in insecure mode using '--insecure' if you understand the risks."
148
+ )
@@ -22,13 +22,14 @@ import time
22
22
  from logging import WARN, LogRecord
23
23
  from logging.handlers import HTTPHandler
24
24
  from queue import Empty, Queue
25
- from typing import TYPE_CHECKING, Any, Optional, TextIO
25
+ from typing import TYPE_CHECKING, Any, Optional, TextIO, Union
26
26
 
27
27
  import grpc
28
28
 
29
29
  from flwr.proto.log_pb2 import PushLogsRequest # pylint: disable=E0611
30
30
  from flwr.proto.node_pb2 import Node # pylint: disable=E0611
31
31
  from flwr.proto.serverappio_pb2_grpc import ServerAppIoStub # pylint: disable=E0611
32
+ from flwr.proto.simulationio_pb2_grpc import SimulationIoStub # pylint: disable=E0611
32
33
 
33
34
  from .constant import LOG_UPLOAD_INTERVAL
34
35
 
@@ -346,7 +347,10 @@ def _log_uploader(
346
347
 
347
348
 
348
349
  def start_log_uploader(
349
- log_queue: Queue[Optional[str]], node_id: int, run_id: int, stub: ServerAppIoStub
350
+ log_queue: Queue[Optional[str]],
351
+ node_id: int,
352
+ run_id: int,
353
+ stub: Union[ServerAppIoStub, SimulationIoStub],
350
354
  ) -> threading.Thread:
351
355
  """Start the log uploader thread and return it."""
352
356
  thread = threading.Thread(