flwr-nightly 1.13.0.dev20241117__tar.gz → 1.14.0.dev20241120__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 (328) hide show
  1. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/PKG-INFO +1 -1
  2. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/pyproject.toml +2 -1
  3. flwr_nightly-1.14.0.dev20241120/src/py/flwr/cli/new/templates/app/README.md.tpl +31 -0
  4. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/cli/new/templates/app/pyproject.baseline.toml.tpl +1 -1
  5. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +1 -1
  6. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl +1 -1
  7. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/cli/new/templates/app/pyproject.jax.toml.tpl +1 -1
  8. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +1 -1
  9. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +1 -1
  10. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +1 -1
  11. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +1 -1
  12. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +1 -1
  13. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/cli/run/run.py +4 -2
  14. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/client/app.py +4 -13
  15. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/client/clientapp/app.py +17 -4
  16. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/client/grpc_rere_client/connection.py +5 -0
  17. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/client/supernode/app.py +1 -27
  18. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/common/args.py +17 -13
  19. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/common/constant.py +3 -0
  20. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/common/grpc.py +4 -1
  21. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/app.py +2 -8
  22. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/driver/grpc_driver.py +63 -3
  23. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/serverapp/app.py +24 -8
  24. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/simulation/app.py +6 -5
  25. flwr_nightly-1.13.0.dev20241117/src/py/flwr/cli/new/templates/app/README.md.tpl +0 -20
  26. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/LICENSE +0 -0
  27. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/README.md +0 -0
  28. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/__init__.py +0 -0
  29. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/cli/__init__.py +0 -0
  30. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/cli/app.py +0 -0
  31. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/cli/build.py +0 -0
  32. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/cli/config_utils.py +0 -0
  33. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/cli/example.py +0 -0
  34. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/cli/install.py +0 -0
  35. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/cli/log.py +0 -0
  36. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/cli/ls.py +0 -0
  37. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/cli/new/__init__.py +0 -0
  38. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/cli/new/new.py +0 -0
  39. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/cli/new/templates/__init__.py +0 -0
  40. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/cli/new/templates/app/.gitignore.tpl +0 -0
  41. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/cli/new/templates/app/LICENSE.tpl +0 -0
  42. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/cli/new/templates/app/README.baseline.md.tpl +0 -0
  43. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/cli/new/templates/app/README.flowertune.md.tpl +0 -0
  44. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/cli/new/templates/app/__init__.py +0 -0
  45. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/cli/new/templates/app/code/__init__.baseline.py.tpl +0 -0
  46. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
  47. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
  48. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/cli/new/templates/app/code/client.baseline.py.tpl +0 -0
  49. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/cli/new/templates/app/code/client.huggingface.py.tpl +0 -0
  50. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/cli/new/templates/app/code/client.jax.py.tpl +0 -0
  51. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/cli/new/templates/app/code/client.mlx.py.tpl +0 -0
  52. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/cli/new/templates/app/code/client.numpy.py.tpl +0 -0
  53. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -0
  54. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl +0 -0
  55. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -0
  56. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/cli/new/templates/app/code/dataset.baseline.py.tpl +0 -0
  57. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/cli/new/templates/app/code/flwr_tune/__init__.py +0 -0
  58. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/cli/new/templates/app/code/flwr_tune/client_app.py.tpl +0 -0
  59. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/cli/new/templates/app/code/flwr_tune/dataset.py.tpl +0 -0
  60. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/cli/new/templates/app/code/flwr_tune/models.py.tpl +0 -0
  61. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/cli/new/templates/app/code/flwr_tune/server_app.py.tpl +0 -0
  62. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/cli/new/templates/app/code/flwr_tune/strategy.py.tpl +0 -0
  63. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/cli/new/templates/app/code/model.baseline.py.tpl +0 -0
  64. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/cli/new/templates/app/code/server.baseline.py.tpl +0 -0
  65. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/cli/new/templates/app/code/server.huggingface.py.tpl +0 -0
  66. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/cli/new/templates/app/code/server.jax.py.tpl +0 -0
  67. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/cli/new/templates/app/code/server.mlx.py.tpl +0 -0
  68. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -0
  69. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -0
  70. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/cli/new/templates/app/code/server.sklearn.py.tpl +0 -0
  71. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -0
  72. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/cli/new/templates/app/code/strategy.baseline.py.tpl +0 -0
  73. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/cli/new/templates/app/code/task.huggingface.py.tpl +0 -0
  74. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/cli/new/templates/app/code/task.jax.py.tpl +0 -0
  75. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/cli/new/templates/app/code/task.mlx.py.tpl +0 -0
  76. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/cli/new/templates/app/code/task.numpy.py.tpl +0 -0
  77. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +0 -0
  78. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/cli/new/templates/app/code/task.sklearn.py.tpl +0 -0
  79. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/cli/new/templates/app/code/task.tensorflow.py.tpl +0 -0
  80. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/cli/new/templates/app/code/utils.baseline.py.tpl +0 -0
  81. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/cli/run/__init__.py +0 -0
  82. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/cli/utils.py +0 -0
  83. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/client/__init__.py +0 -0
  84. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/client/client.py +0 -0
  85. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/client/client_app.py +0 -0
  86. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/client/clientapp/__init__.py +0 -0
  87. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/client/clientapp/clientappio_servicer.py +0 -0
  88. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/client/clientapp/utils.py +0 -0
  89. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/client/dpfedavg_numpy_client.py +0 -0
  90. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/client/grpc_adapter_client/__init__.py +0 -0
  91. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/client/grpc_adapter_client/connection.py +0 -0
  92. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/client/grpc_client/__init__.py +0 -0
  93. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/client/grpc_client/connection.py +0 -0
  94. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/client/grpc_rere_client/__init__.py +0 -0
  95. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/client/grpc_rere_client/client_interceptor.py +0 -0
  96. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/client/grpc_rere_client/grpc_adapter.py +0 -0
  97. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/client/heartbeat.py +0 -0
  98. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/client/message_handler/__init__.py +0 -0
  99. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/client/message_handler/message_handler.py +0 -0
  100. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/client/message_handler/task_handler.py +0 -0
  101. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/client/mod/__init__.py +0 -0
  102. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/client/mod/centraldp_mods.py +0 -0
  103. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/client/mod/comms_mods.py +0 -0
  104. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/client/mod/localdp_mod.py +0 -0
  105. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
  106. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
  107. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
  108. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/client/mod/utils.py +0 -0
  109. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/client/nodestate/__init__.py +0 -0
  110. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/client/nodestate/in_memory_nodestate.py +0 -0
  111. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/client/nodestate/nodestate.py +0 -0
  112. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/client/nodestate/nodestate_factory.py +0 -0
  113. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/client/numpy_client.py +0 -0
  114. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/client/rest_client/__init__.py +0 -0
  115. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/client/rest_client/connection.py +0 -0
  116. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/client/run_info_store.py +0 -0
  117. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/client/supernode/__init__.py +0 -0
  118. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/client/typing.py +0 -0
  119. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/common/__init__.py +0 -0
  120. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/common/address.py +0 -0
  121. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/common/config.py +0 -0
  122. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/common/context.py +0 -0
  123. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/common/date.py +0 -0
  124. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/common/differential_privacy.py +0 -0
  125. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/common/differential_privacy_constants.py +0 -0
  126. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/common/dp.py +0 -0
  127. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/common/exit_handlers.py +0 -0
  128. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/common/logger.py +0 -0
  129. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/common/message.py +0 -0
  130. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/common/object_ref.py +0 -0
  131. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/common/parameter.py +0 -0
  132. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/common/pyproject.py +0 -0
  133. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/common/record/__init__.py +0 -0
  134. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/common/record/configsrecord.py +0 -0
  135. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/common/record/conversion_utils.py +0 -0
  136. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/common/record/metricsrecord.py +0 -0
  137. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/common/record/parametersrecord.py +0 -0
  138. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/common/record/recordset.py +0 -0
  139. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/common/record/typeddict.py +0 -0
  140. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/common/recordset_compat.py +0 -0
  141. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/common/retry_invoker.py +0 -0
  142. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/common/secure_aggregation/__init__.py +0 -0
  143. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
  144. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
  145. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -0
  146. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
  147. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/common/secure_aggregation/quantization.py +0 -0
  148. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
  149. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
  150. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/common/serde.py +0 -0
  151. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/common/telemetry.py +0 -0
  152. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/common/typing.py +0 -0
  153. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/common/version.py +0 -0
  154. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/proto/__init__.py +0 -0
  155. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/proto/clientappio_pb2.py +0 -0
  156. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/proto/clientappio_pb2.pyi +0 -0
  157. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/proto/clientappio_pb2_grpc.py +0 -0
  158. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/proto/clientappio_pb2_grpc.pyi +0 -0
  159. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/proto/common_pb2.py +0 -0
  160. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/proto/common_pb2.pyi +0 -0
  161. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/proto/common_pb2_grpc.py +0 -0
  162. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/proto/common_pb2_grpc.pyi +0 -0
  163. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/proto/control_pb2.py +0 -0
  164. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/proto/control_pb2.pyi +0 -0
  165. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/proto/control_pb2_grpc.py +0 -0
  166. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/proto/control_pb2_grpc.pyi +0 -0
  167. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/proto/error_pb2.py +0 -0
  168. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/proto/error_pb2.pyi +0 -0
  169. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/proto/error_pb2_grpc.py +0 -0
  170. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/proto/error_pb2_grpc.pyi +0 -0
  171. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/proto/exec_pb2.py +0 -0
  172. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/proto/exec_pb2.pyi +0 -0
  173. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/proto/exec_pb2_grpc.py +0 -0
  174. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/proto/exec_pb2_grpc.pyi +0 -0
  175. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/proto/fab_pb2.py +0 -0
  176. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/proto/fab_pb2.pyi +0 -0
  177. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/proto/fab_pb2_grpc.py +0 -0
  178. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/proto/fab_pb2_grpc.pyi +0 -0
  179. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/proto/fleet_pb2.py +0 -0
  180. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/proto/fleet_pb2.pyi +0 -0
  181. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/proto/fleet_pb2_grpc.py +0 -0
  182. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
  183. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/proto/grpcadapter_pb2.py +0 -0
  184. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/proto/grpcadapter_pb2.pyi +0 -0
  185. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/proto/grpcadapter_pb2_grpc.py +0 -0
  186. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/proto/grpcadapter_pb2_grpc.pyi +0 -0
  187. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/proto/log_pb2.py +0 -0
  188. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/proto/log_pb2.pyi +0 -0
  189. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/proto/log_pb2_grpc.py +0 -0
  190. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/proto/log_pb2_grpc.pyi +0 -0
  191. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/proto/message_pb2.py +0 -0
  192. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/proto/message_pb2.pyi +0 -0
  193. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/proto/message_pb2_grpc.py +0 -0
  194. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/proto/message_pb2_grpc.pyi +0 -0
  195. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/proto/node_pb2.py +0 -0
  196. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/proto/node_pb2.pyi +0 -0
  197. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/proto/node_pb2_grpc.py +0 -0
  198. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/proto/node_pb2_grpc.pyi +0 -0
  199. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/proto/recordset_pb2.py +0 -0
  200. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/proto/recordset_pb2.pyi +0 -0
  201. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/proto/recordset_pb2_grpc.py +0 -0
  202. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/proto/recordset_pb2_grpc.pyi +0 -0
  203. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/proto/run_pb2.py +0 -0
  204. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/proto/run_pb2.pyi +0 -0
  205. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/proto/run_pb2_grpc.py +0 -0
  206. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/proto/run_pb2_grpc.pyi +0 -0
  207. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/proto/serverappio_pb2.py +0 -0
  208. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/proto/serverappio_pb2.pyi +0 -0
  209. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/proto/serverappio_pb2_grpc.py +0 -0
  210. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/proto/serverappio_pb2_grpc.pyi +0 -0
  211. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/proto/simulationio_pb2.py +0 -0
  212. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/proto/simulationio_pb2.pyi +0 -0
  213. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/proto/simulationio_pb2_grpc.py +0 -0
  214. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/proto/simulationio_pb2_grpc.pyi +0 -0
  215. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/proto/task_pb2.py +0 -0
  216. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/proto/task_pb2.pyi +0 -0
  217. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/proto/task_pb2_grpc.py +0 -0
  218. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/proto/task_pb2_grpc.pyi +0 -0
  219. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/proto/transport_pb2.py +0 -0
  220. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/proto/transport_pb2.pyi +0 -0
  221. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/proto/transport_pb2_grpc.py +0 -0
  222. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
  223. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/py.typed +0 -0
  224. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/__init__.py +0 -0
  225. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/client_manager.py +0 -0
  226. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/client_proxy.py +0 -0
  227. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/compat/__init__.py +0 -0
  228. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/compat/app.py +0 -0
  229. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/compat/app_utils.py +0 -0
  230. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/compat/driver_client_proxy.py +0 -0
  231. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/compat/legacy_context.py +0 -0
  232. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/criterion.py +0 -0
  233. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/driver/__init__.py +0 -0
  234. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/driver/driver.py +0 -0
  235. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/driver/inmemory_driver.py +0 -0
  236. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/history.py +0 -0
  237. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/run_serverapp.py +0 -0
  238. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/server.py +0 -0
  239. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/server_app.py +0 -0
  240. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/server_config.py +0 -0
  241. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/serverapp/__init__.py +0 -0
  242. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/serverapp_components.py +0 -0
  243. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/strategy/__init__.py +0 -0
  244. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/strategy/aggregate.py +0 -0
  245. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/strategy/bulyan.py +0 -0
  246. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
  247. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
  248. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
  249. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
  250. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
  251. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/strategy/fedadagrad.py +0 -0
  252. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/strategy/fedadam.py +0 -0
  253. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/strategy/fedavg.py +0 -0
  254. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/strategy/fedavg_android.py +0 -0
  255. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/strategy/fedavgm.py +0 -0
  256. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/strategy/fedmedian.py +0 -0
  257. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/strategy/fedopt.py +0 -0
  258. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/strategy/fedprox.py +0 -0
  259. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
  260. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
  261. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
  262. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
  263. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/strategy/fedyogi.py +0 -0
  264. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/strategy/krum.py +0 -0
  265. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/strategy/qfedavg.py +0 -0
  266. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/strategy/strategy.py +0 -0
  267. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/superlink/__init__.py +0 -0
  268. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/superlink/driver/__init__.py +0 -0
  269. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/superlink/driver/serverappio_grpc.py +0 -0
  270. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/superlink/driver/serverappio_servicer.py +0 -0
  271. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/superlink/ffs/__init__.py +0 -0
  272. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/superlink/ffs/disk_ffs.py +0 -0
  273. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/superlink/ffs/ffs.py +0 -0
  274. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/superlink/ffs/ffs_factory.py +0 -0
  275. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/superlink/fleet/__init__.py +0 -0
  276. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/superlink/fleet/grpc_adapter/__init__.py +0 -0
  277. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +0 -0
  278. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
  279. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
  280. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
  281. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
  282. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +0 -0
  283. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
  284. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +0 -0
  285. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +0 -0
  286. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
  287. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/superlink/fleet/message_handler/message_handler.py +0 -0
  288. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
  289. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +0 -0
  290. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
  291. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
  292. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
  293. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +0 -0
  294. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/superlink/fleet/vce/vce_api.py +0 -0
  295. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/superlink/linkstate/__init__.py +0 -0
  296. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/superlink/linkstate/in_memory_linkstate.py +0 -0
  297. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/superlink/linkstate/linkstate.py +0 -0
  298. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/superlink/linkstate/linkstate_factory.py +0 -0
  299. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/superlink/linkstate/sqlite_linkstate.py +0 -0
  300. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/superlink/linkstate/utils.py +0 -0
  301. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/superlink/simulation/__init__.py +0 -0
  302. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/superlink/simulation/simulationio_grpc.py +0 -0
  303. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/superlink/simulation/simulationio_servicer.py +0 -0
  304. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/typing.py +0 -0
  305. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/utils/__init__.py +0 -0
  306. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/utils/tensorboard.py +0 -0
  307. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/utils/validator.py +0 -0
  308. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/workflow/__init__.py +0 -0
  309. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/workflow/constant.py +0 -0
  310. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/workflow/default_workflows.py +0 -0
  311. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
  312. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
  313. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +0 -0
  314. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/simulation/__init__.py +0 -0
  315. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/simulation/legacy_app.py +0 -0
  316. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/simulation/ray_transport/__init__.py +0 -0
  317. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
  318. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
  319. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/simulation/ray_transport/utils.py +0 -0
  320. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/simulation/run_simulation.py +0 -0
  321. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/simulation/simulationio_connection.py +0 -0
  322. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/superexec/__init__.py +0 -0
  323. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/superexec/app.py +0 -0
  324. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/superexec/deployment.py +0 -0
  325. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/superexec/exec_grpc.py +0 -0
  326. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/superexec/exec_servicer.py +0 -0
  327. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/superexec/executor.py +0 -0
  328. {flwr_nightly-1.13.0.dev20241117 → flwr_nightly-1.14.0.dev20241120}/src/py/flwr/superexec/simulation.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: flwr-nightly
3
- Version: 1.13.0.dev20241117
3
+ Version: 1.14.0.dev20241120
4
4
  Summary: Flower: A Friendly Federated AI Framework
5
5
  Home-page: https://flower.ai
6
6
  License: Apache-2.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.dev20241117"
7
+ version = "1.14.0.dev20241120"
8
8
  description = "Flower: A Friendly Federated AI Framework"
9
9
  license = "Apache-2.0"
10
10
  authors = ["The Flower Authors <hello@flower.ai>"]
@@ -127,6 +127,7 @@ nbstripout = "==0.6.1"
127
127
  ruff = "==0.1.9"
128
128
  sphinx-argparse = "==0.4.0"
129
129
  pipreqs = "==0.4.13"
130
+ mdformat = "==0.7.18"
130
131
  mdformat-gfm = "==0.3.6"
131
132
  mdformat-frontmatter = "==2.0.1"
132
133
  mdformat-beautysh = "==0.1.1"
@@ -0,0 +1,31 @@
1
+ # $project_name: A Flower / $framework_str app
2
+
3
+ ## Install dependencies and project
4
+
5
+ ```bash
6
+ pip install -e .
7
+ ```
8
+
9
+ ## Run with the Simulation Engine
10
+
11
+ In the `$project_name` directory, use `flwr run` to run a local simulation:
12
+
13
+ ```bash
14
+ flwr run .
15
+ ```
16
+
17
+ Refer to the [How to Run Simulations](https://flower.ai/docs/framework/how-to-run-simulations.html) guide in the documentation for advice on how to optimize your simulations.
18
+
19
+ ## Run with the Deployment Engine
20
+
21
+ > \[!NOTE\]
22
+ > An update to this example will show how to run this Flower application with the Deployment Engine and TLS certificates, or with Docker.
23
+
24
+ ## Resources
25
+
26
+ - Flower website: [flower.ai](https://flower.ai/)
27
+ - Check the documentation: [flower.ai/docs](https://flower.ai/docs/)
28
+ - Give Flower a ⭐️ on GitHub: [GitHub](https://github.com/adap/flower)
29
+ - Join the Flower community!
30
+ - [Flower Slack](https://flower.ai/join-slack/)
31
+ - [Flower Discuss](https://discuss.flower.ai/)
@@ -8,7 +8,7 @@ version = "1.0.0"
8
8
  description = ""
9
9
  license = "Apache-2.0"
10
10
  dependencies = [
11
- "flwr[simulation]>=1.12.0",
11
+ "flwr[simulation]>=1.13.0",
12
12
  "flwr-datasets[vision]>=0.3.0",
13
13
  "torch==2.2.1",
14
14
  "torchvision==0.17.1",
@@ -8,7 +8,7 @@ version = "1.0.0"
8
8
  description = ""
9
9
  license = "Apache-2.0"
10
10
  dependencies = [
11
- "flwr[simulation]>=1.12.0",
11
+ "flwr[simulation]>=1.13.0",
12
12
  "flwr-datasets>=0.3.0",
13
13
  "torch==2.3.1",
14
14
  "trl==0.8.1",
@@ -8,7 +8,7 @@ version = "1.0.0"
8
8
  description = ""
9
9
  license = "Apache-2.0"
10
10
  dependencies = [
11
- "flwr[simulation]>=1.12.0",
11
+ "flwr[simulation]>=1.13.0",
12
12
  "flwr-datasets>=0.3.0",
13
13
  "torch==2.2.1",
14
14
  "transformers>=4.30.0,<5.0",
@@ -8,7 +8,7 @@ version = "1.0.0"
8
8
  description = ""
9
9
  license = "Apache-2.0"
10
10
  dependencies = [
11
- "flwr[simulation]>=1.12.0",
11
+ "flwr[simulation]>=1.13.0",
12
12
  "jax==0.4.30",
13
13
  "jaxlib==0.4.30",
14
14
  "scikit-learn==1.3.2",
@@ -8,7 +8,7 @@ version = "1.0.0"
8
8
  description = ""
9
9
  license = "Apache-2.0"
10
10
  dependencies = [
11
- "flwr[simulation]>=1.12.0",
11
+ "flwr[simulation]>=1.13.0",
12
12
  "flwr-datasets[vision]>=0.3.0",
13
13
  "mlx==0.16.1",
14
14
  "numpy==1.24.4",
@@ -8,7 +8,7 @@ version = "1.0.0"
8
8
  description = ""
9
9
  license = "Apache-2.0"
10
10
  dependencies = [
11
- "flwr[simulation]>=1.12.0",
11
+ "flwr[simulation]>=1.13.0",
12
12
  "numpy>=1.21.0",
13
13
  ]
14
14
 
@@ -8,7 +8,7 @@ version = "1.0.0"
8
8
  description = ""
9
9
  license = "Apache-2.0"
10
10
  dependencies = [
11
- "flwr[simulation]>=1.12.0",
11
+ "flwr[simulation]>=1.13.0",
12
12
  "flwr-datasets[vision]>=0.3.0",
13
13
  "torch==2.2.1",
14
14
  "torchvision==0.17.1",
@@ -8,7 +8,7 @@ version = "1.0.0"
8
8
  description = ""
9
9
  license = "Apache-2.0"
10
10
  dependencies = [
11
- "flwr[simulation]>=1.12.0",
11
+ "flwr[simulation]>=1.13.0",
12
12
  "flwr-datasets[vision]>=0.3.0",
13
13
  "scikit-learn>=1.1.1",
14
14
  ]
@@ -8,7 +8,7 @@ version = "1.0.0"
8
8
  description = ""
9
9
  license = "Apache-2.0"
10
10
  dependencies = [
11
- "flwr[simulation]>=1.12.0",
11
+ "flwr[simulation]>=1.13.0",
12
12
  "flwr-datasets[vision]>=0.3.0",
13
13
  "tensorflow>=2.11.1,<2.18.0",
14
14
  ]
@@ -125,6 +125,10 @@ def _run_with_exec_api(
125
125
 
126
126
  fab_path, fab_hash = build(app)
127
127
  content = Path(fab_path).read_bytes()
128
+
129
+ # Delete FAB file once the bytes is computed
130
+ Path(fab_path).unlink()
131
+
128
132
  fab = Fab(fab_hash, content)
129
133
 
130
134
  # Construct a `ConfigsRecord` out of a flattened `UserConfig`
@@ -138,8 +142,6 @@ def _run_with_exec_api(
138
142
  )
139
143
  res = stub.StartRun(req)
140
144
 
141
- # Delete FAB file once it has been sent to the Exec API
142
- Path(fab_path).unlink()
143
145
  typer.secho(f"🎊 Successfully started run {res.run_id}", fg=typer.colors.GREEN)
144
146
 
145
147
  if stream:
@@ -41,6 +41,7 @@ from flwr.common.constant import (
41
41
  CLIENTAPPIO_API_DEFAULT_SERVER_ADDRESS,
42
42
  ISOLATION_MODE_PROCESS,
43
43
  ISOLATION_MODE_SUBPROCESS,
44
+ MAX_RETRY_DELAY,
44
45
  MISSING_EXTRA_REST,
45
46
  RUN_ID_NUM_BYTES,
46
47
  SERVER_OCTET,
@@ -235,8 +236,6 @@ def start_client_internal(
235
236
  flwr_path: Optional[Path] = None,
236
237
  isolation: Optional[str] = None,
237
238
  clientappio_api_address: Optional[str] = CLIENTAPPIO_API_DEFAULT_SERVER_ADDRESS,
238
- certificates: Optional[tuple[bytes, bytes, bytes]] = None,
239
- ssl_ca_certfile: Optional[str] = None,
240
239
  ) -> None:
241
240
  """Start a Flower client node which connects to a Flower server.
242
241
 
@@ -300,10 +299,6 @@ def start_client_internal(
300
299
  clientappio_api_address : Optional[str]
301
300
  (default: `CLIENTAPPIO_API_DEFAULT_SERVER_ADDRESS`)
302
301
  The SuperNode gRPC server address.
303
- certificates : Optional[Tuple[bytes, bytes, bytes]] (default: None)
304
- Tuple containing the CA certificate, server certificate, and server private key.
305
- ssl_ca_certfile : Optional[str] (default: None)
306
- The path to the CA certificate file used by `flwr-clientapp` in subprocess mode.
307
302
  """
308
303
  if insecure is None:
309
304
  insecure = root_certificates is None
@@ -337,7 +332,7 @@ def start_client_internal(
337
332
  )
338
333
  _clientappio_grpc_server, clientappio_servicer = run_clientappio_api_grpc(
339
334
  address=clientappio_api_address,
340
- certificates=certificates,
335
+ certificates=None,
341
336
  )
342
337
  clientappio_api_address = cast(str, clientappio_api_address)
343
338
 
@@ -373,7 +368,7 @@ def start_client_internal(
373
368
  )
374
369
 
375
370
  retry_invoker = RetryInvoker(
376
- wait_gen_factory=exponential,
371
+ wait_gen_factory=lambda: exponential(max_delay=MAX_RETRY_DELAY),
377
372
  recoverable_exceptions=connection_error_type,
378
373
  max_tries=max_retries + 1 if max_retries is not None else None,
379
374
  max_time=max_wait_time,
@@ -551,11 +546,7 @@ def start_client_internal(
551
546
  "--token",
552
547
  str(token),
553
548
  ]
554
- if ssl_ca_certfile:
555
- command.append("--root-certificates")
556
- command.append(ssl_ca_certfile)
557
- else:
558
- command.append("--insecure")
549
+ command.append("--insecure")
559
550
 
560
551
  subprocess.run(
561
552
  command,
@@ -15,6 +15,7 @@
15
15
  """Flower ClientApp process."""
16
16
 
17
17
  import argparse
18
+ import sys
18
19
  import time
19
20
  from logging import DEBUG, ERROR, INFO
20
21
  from typing import Optional
@@ -24,7 +25,7 @@ import grpc
24
25
  from flwr.cli.install import install_from_fab
25
26
  from flwr.client.client_app import ClientApp, LoadClientAppError
26
27
  from flwr.common import Context, Message
27
- from flwr.common.args import add_args_flwr_app_common, try_obtain_root_certificates
28
+ from flwr.common.args import add_args_flwr_app_common
28
29
  from flwr.common.config import get_flwr_dir
29
30
  from flwr.common.constant import CLIENTAPPIO_API_DEFAULT_CLIENT_ADDRESS, ErrorCode
30
31
  from flwr.common.grpc import create_channel
@@ -57,10 +58,15 @@ from .utils import get_load_client_app_fn
57
58
  def flwr_clientapp() -> None:
58
59
  """Run process-isolated Flower ClientApp."""
59
60
  args = _parse_args_run_flwr_clientapp().parse_args()
61
+ if not args.insecure:
62
+ log(
63
+ ERROR,
64
+ "flwr-clientapp does not support TLS yet. "
65
+ "Please use the '--insecure' flag.",
66
+ )
67
+ sys.exit(1)
60
68
 
61
69
  log(INFO, "Starting Flower ClientApp")
62
- certificates = try_obtain_root_certificates(args, args.clientappio_api_address)
63
-
64
70
  log(
65
71
  DEBUG,
66
72
  "Starting isolated `ClientApp` connected to SuperNode's ClientAppIo API at %s "
@@ -73,7 +79,7 @@ def flwr_clientapp() -> None:
73
79
  run_once=(args.token is not None),
74
80
  token=args.token,
75
81
  flwr_dir=args.flwr_dir,
76
- certificates=certificates,
82
+ certificates=None,
77
83
  )
78
84
 
79
85
 
@@ -246,5 +252,12 @@ def _parse_args_run_flwr_clientapp() -> argparse.ArgumentParser:
246
252
  required=False,
247
253
  help="Unique token generated by SuperNode for each ClientApp execution",
248
254
  )
255
+ parser.add_argument(
256
+ "--root-certificates",
257
+ metavar="ROOT_CERT",
258
+ type=str,
259
+ help="Specifies the path to the PEM-encoded root certificate file for "
260
+ "establishing secure HTTPS connections.",
261
+ )
249
262
  add_args_flwr_app_common(parser=parser)
250
263
  return parser
@@ -155,6 +155,11 @@ def grpc_request_response( # pylint: disable=R0913,R0914,R0915,R0917
155
155
  ping_thread: Optional[threading.Thread] = None
156
156
  ping_stop_event = threading.Event()
157
157
 
158
+ # Restrict retries to cases where the status code is UNAVAILABLE
159
+ retry_invoker.should_giveup = (
160
+ lambda e: e.code() != grpc.StatusCode.UNAVAILABLE # type: ignore
161
+ )
162
+
158
163
  ###########################################################################
159
164
  # ping/create_node/delete_node/receive/send/get_run functions
160
165
  ###########################################################################
@@ -28,10 +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 (
32
- try_obtain_root_certificates,
33
- try_obtain_server_certificates,
34
- )
31
+ from flwr.common.args import try_obtain_root_certificates
35
32
  from flwr.common.config import parse_config_args
36
33
  from flwr.common.constant import (
37
34
  CLIENTAPPIO_API_DEFAULT_SERVER_ADDRESS,
@@ -78,8 +75,6 @@ def run_supernode() -> None:
78
75
  sys.exit(1)
79
76
 
80
77
  root_certificates = try_obtain_root_certificates(args, args.superlink)
81
- # Obtain certificates for ClientAppIo API server
82
- server_certificates = try_obtain_server_certificates(args, TRANSPORT_TYPE_GRPC_RERE)
83
78
  load_fn = get_load_client_app_fn(
84
79
  default_app_ref="",
85
80
  app_path=None,
@@ -105,8 +100,6 @@ def run_supernode() -> None:
105
100
  flwr_path=args.flwr_dir,
106
101
  isolation=args.isolation,
107
102
  clientappio_api_address=args.clientappio_api_address,
108
- certificates=server_certificates,
109
- ssl_ca_certfile=args.ssl_ca_certfile,
110
103
  )
111
104
 
112
105
  # Graceful shutdown
@@ -235,25 +228,6 @@ def _parse_args_common(parser: argparse.ArgumentParser) -> None:
235
228
  help="Specifies the path to the PEM-encoded root certificate file for "
236
229
  "establishing secure HTTPS connections.",
237
230
  )
238
- parser.add_argument(
239
- "--ssl-certfile",
240
- help="ClientAppIo API server SSL certificate file (as a path str) "
241
- "to create a secure connection.",
242
- type=str,
243
- default=None,
244
- )
245
- parser.add_argument(
246
- "--ssl-keyfile",
247
- help="ClientAppIo API server SSL private key file (as a path str) "
248
- "to create a secure connection.",
249
- type=str,
250
- )
251
- parser.add_argument(
252
- "--ssl-ca-certfile",
253
- help="ClientAppIo API server SSL CA certificate file (as a path str) "
254
- "to create a secure connection.",
255
- type=str,
256
- )
257
231
  parser.add_argument(
258
232
  "--server",
259
233
  default=FLEET_API_GRPC_RERE_DEFAULT_ADDRESS,
@@ -16,7 +16,7 @@
16
16
 
17
17
  import argparse
18
18
  import sys
19
- from logging import DEBUG, WARN
19
+ from logging import DEBUG, ERROR, WARN
20
20
  from os.path import isfile
21
21
  from pathlib import Path
22
22
  from typing import Optional
@@ -49,13 +49,6 @@ def add_args_flwr_app_common(parser: argparse.ArgumentParser) -> None:
49
49
  "paths are provided. By default, the server runs with HTTPS enabled. "
50
50
  "Use this flag only if you understand the risks.",
51
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
52
 
60
53
 
61
54
  def try_obtain_root_certificates(
@@ -80,9 +73,18 @@ def try_obtain_root_certificates(
80
73
  root_certificates = None
81
74
  else:
82
75
  # 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()
76
+ if root_cert_path is None:
77
+ log(
78
+ WARN,
79
+ "Both `--insecure` and `--root-certificates` were not set. "
80
+ "Using system certificates.",
81
+ )
82
+ root_certificates = None
83
+ elif not isfile(root_cert_path):
84
+ log(ERROR, "Path argument `--root-certificates` does not point to a file.")
85
+ sys.exit(1)
86
+ else:
87
+ root_certificates = Path(root_cert_path).read_bytes()
86
88
  log(
87
89
  DEBUG,
88
90
  "Starting secure HTTPS channel to %s "
@@ -140,9 +142,11 @@ def try_obtain_server_certificates(
140
142
  "and `--ssl-keyfile` to create a secure connection "
141
143
  "in Fleet API server (REST, experimental)."
142
144
  )
143
- sys.exit(
145
+ log(
146
+ ERROR,
144
147
  "Certificates are required unless running in insecure mode. "
145
148
  "Please provide certificate paths to `--ssl-certfile`, "
146
149
  "`--ssl-keyfile`, and `—-ssl-ca-certfile` or run the server "
147
- "in insecure mode using '--insecure' if you understand the risks."
150
+ "in insecure mode using '--insecure' if you understand the risks.",
148
151
  )
152
+ sys.exit(1)
@@ -107,6 +107,9 @@ CONN_RECONNECT_INTERVAL = 0.5 # Reconnect interval between two stream connectio
107
107
  LOG_STREAM_INTERVAL = 0.5 # Log stream interval for `ExecServicer.StreamLogs`
108
108
  LOG_UPLOAD_INTERVAL = 0.2 # Minimum interval between two log uploads
109
109
 
110
+ # Retry configurations
111
+ MAX_RETRY_DELAY = 20 # Maximum delay duration between two consecutive retries.
112
+
110
113
 
111
114
  class MessageType:
112
115
  """Message type."""
@@ -53,7 +53,10 @@ def create_channel(
53
53
  channel = grpc.insecure_channel(server_address, options=channel_options)
54
54
  log(DEBUG, "Opened insecure gRPC connection (no certificates were passed)")
55
55
  else:
56
- ssl_channel_credentials = grpc.ssl_channel_credentials(root_certificates)
56
+ try:
57
+ ssl_channel_credentials = grpc.ssl_channel_credentials(root_certificates)
58
+ except Exception as e:
59
+ raise ValueError(f"Failed to create SSL channel credentials: {e}") from e
57
60
  channel = grpc.secure_channel(
58
61
  server_address, ssl_channel_credentials, options=channel_options
59
62
  )
@@ -288,7 +288,7 @@ def run_superlink() -> None:
288
288
  address=serverappio_address,
289
289
  state_factory=state_factory,
290
290
  ffs_factory=ffs_factory,
291
- certificates=certificates,
291
+ certificates=None, # ServerAppIo API doesn't support SSL yet
292
292
  )
293
293
  grpc_servers.append(serverappio_server)
294
294
 
@@ -398,7 +398,6 @@ def run_superlink() -> None:
398
398
  args=(
399
399
  state_factory,
400
400
  address,
401
- args.ssl_ca_certfile,
402
401
  cmd,
403
402
  ),
404
403
  )
@@ -424,7 +423,6 @@ def run_superlink() -> None:
424
423
  def _flwr_scheduler(
425
424
  state_factory: LinkStateFactory,
426
425
  io_api_address: str,
427
- ssl_ca_certfile: Optional[str],
428
426
  cmd: str,
429
427
  ) -> None:
430
428
  log(DEBUG, "Started %s scheduler thread.", cmd)
@@ -450,12 +448,8 @@ def _flwr_scheduler(
450
448
  "--run-once",
451
449
  "--serverappio-api-address",
452
450
  io_api_address,
451
+ "--insecure",
453
452
  ]
454
- if ssl_ca_certfile:
455
- command.append("--root-certificates")
456
- command.append(ssl_ca_certfile)
457
- else:
458
- command.append("--insecure")
459
453
 
460
454
  subprocess.Popen( # pylint: disable=consider-using-with
461
455
  command,
@@ -17,15 +17,16 @@
17
17
  import time
18
18
  import warnings
19
19
  from collections.abc import Iterable
20
- from logging import DEBUG, WARNING
21
- from typing import Optional, cast
20
+ from logging import DEBUG, INFO, WARN, WARNING
21
+ from typing import Any, Optional, cast
22
22
 
23
23
  import grpc
24
24
 
25
25
  from flwr.common import DEFAULT_TTL, Message, Metadata, RecordSet
26
- from flwr.common.constant import SERVERAPPIO_API_DEFAULT_CLIENT_ADDRESS
26
+ from flwr.common.constant import MAX_RETRY_DELAY, SERVERAPPIO_API_DEFAULT_CLIENT_ADDRESS
27
27
  from flwr.common.grpc import create_channel
28
28
  from flwr.common.logger import log
29
+ from flwr.common.retry_invoker import RetryInvoker, RetryState, exponential
29
30
  from flwr.common.serde import message_from_taskres, message_to_taskins, run_from_proto
30
31
  from flwr.common.typing import Run
31
32
  from flwr.proto.node_pb2 import Node # pylint: disable=E0611
@@ -75,6 +76,7 @@ class GrpcDriver(Driver):
75
76
  self._grpc_stub: Optional[ServerAppIoStub] = None
76
77
  self._channel: Optional[grpc.Channel] = None
77
78
  self.node = Node(node_id=0, anonymous=True)
79
+ self._retry_invoker = _make_simple_grpc_retry_invoker()
78
80
 
79
81
  @property
80
82
  def _is_connected(self) -> bool:
@@ -95,6 +97,7 @@ class GrpcDriver(Driver):
95
97
  root_certificates=self._cert,
96
98
  )
97
99
  self._grpc_stub = ServerAppIoStub(self._channel)
100
+ _wrap_stub(self._grpc_stub, self._retry_invoker)
98
101
  log(DEBUG, "[Driver] Connected to %s", self._addr)
99
102
 
100
103
  def _disconnect(self) -> None:
@@ -255,3 +258,60 @@ class GrpcDriver(Driver):
255
258
  return
256
259
  # Disconnect
257
260
  self._disconnect()
261
+
262
+
263
+ def _make_simple_grpc_retry_invoker() -> RetryInvoker:
264
+ """Create a simple gRPC retry invoker."""
265
+
266
+ def _on_sucess(retry_state: RetryState) -> None:
267
+ if retry_state.tries > 1:
268
+ log(
269
+ INFO,
270
+ "Connection successful after %.2f seconds and %s tries.",
271
+ retry_state.elapsed_time,
272
+ retry_state.tries,
273
+ )
274
+
275
+ def _on_backoff(retry_state: RetryState) -> None:
276
+ if retry_state.tries == 1:
277
+ log(WARN, "Connection attempt failed, retrying...")
278
+ else:
279
+ log(
280
+ WARN,
281
+ "Connection attempt failed, retrying in %.2f seconds",
282
+ retry_state.actual_wait,
283
+ )
284
+
285
+ def _on_giveup(retry_state: RetryState) -> None:
286
+ if retry_state.tries > 1:
287
+ log(
288
+ WARN,
289
+ "Giving up reconnection after %.2f seconds and %s tries.",
290
+ retry_state.elapsed_time,
291
+ retry_state.tries,
292
+ )
293
+
294
+ return RetryInvoker(
295
+ wait_gen_factory=lambda: exponential(max_delay=MAX_RETRY_DELAY),
296
+ recoverable_exceptions=grpc.RpcError,
297
+ max_tries=None,
298
+ max_time=None,
299
+ on_success=_on_sucess,
300
+ on_backoff=_on_backoff,
301
+ on_giveup=_on_giveup,
302
+ should_giveup=lambda e: e.code() != grpc.StatusCode.UNAVAILABLE, # type: ignore
303
+ )
304
+
305
+
306
+ def _wrap_stub(stub: ServerAppIoStub, retry_invoker: RetryInvoker) -> None:
307
+ """Wrap the gRPC stub with a retry invoker."""
308
+
309
+ def make_lambda(original_method: Any) -> Any:
310
+ return lambda *args, **kwargs: retry_invoker.invoke(
311
+ original_method, *args, **kwargs
312
+ )
313
+
314
+ for method_name in vars(stub):
315
+ method = getattr(stub, method_name)
316
+ if callable(method):
317
+ setattr(stub, method_name, make_lambda(method))
@@ -15,6 +15,7 @@
15
15
  """Flower ServerApp process."""
16
16
 
17
17
  import argparse
18
+ import sys
18
19
  from logging import DEBUG, ERROR, INFO
19
20
  from pathlib import Path
20
21
  from queue import Queue
@@ -23,7 +24,7 @@ from typing import Optional
23
24
 
24
25
  from flwr.cli.config_utils import get_fab_metadata
25
26
  from flwr.cli.install import install_from_fab
26
- from flwr.common.args import add_args_flwr_app_common, try_obtain_root_certificates
27
+ from flwr.common.args import add_args_flwr_app_common
27
28
  from flwr.common.config import (
28
29
  get_flwr_dir,
29
30
  get_fused_config_from_dir,
@@ -69,7 +70,14 @@ def flwr_serverapp() -> None:
69
70
  args = _parse_args_run_flwr_serverapp().parse_args()
70
71
 
71
72
  log(INFO, "Starting Flower ServerApp")
72
- certificates = try_obtain_root_certificates(args, args.serverappio_api_address)
73
+
74
+ if not args.insecure:
75
+ log(
76
+ ERROR,
77
+ "`flwr-serverapp` does not support TLS yet. "
78
+ "Please use the '--insecure' flag.",
79
+ )
80
+ sys.exit(1)
73
81
 
74
82
  log(
75
83
  DEBUG,
@@ -81,7 +89,7 @@ def flwr_serverapp() -> None:
81
89
  log_queue=log_queue,
82
90
  run_once=args.run_once,
83
91
  flwr_dir=args.flwr_dir,
84
- certificates=certificates,
92
+ certificates=None,
85
93
  )
86
94
 
87
95
  # Restore stdout/stderr
@@ -185,6 +193,12 @@ def run_serverapp( # pylint: disable=R0914, disable=W0212
185
193
  run_status = RunStatus(Status.FINISHED, SubStatus.FAILED, str(ex))
186
194
 
187
195
  finally:
196
+ # Stop log uploader for this run and upload final logs
197
+ if log_uploader:
198
+ stop_log_uploader(log_queue, log_uploader)
199
+ log_uploader = None
200
+
201
+ # Update run status
188
202
  if run_status:
189
203
  run_status_proto = run_status_to_proto(run_status)
190
204
  driver._stub.UpdateRunStatus(
@@ -193,11 +207,6 @@ def run_serverapp( # pylint: disable=R0914, disable=W0212
193
207
  )
194
208
  )
195
209
 
196
- # Stop log uploader for this run
197
- if log_uploader:
198
- stop_log_uploader(log_queue, log_uploader)
199
- log_uploader = None
200
-
201
210
  # Stop the loop if `flwr-serverapp` is expected to process a single run
202
211
  if run_once:
203
212
  break
@@ -221,5 +230,12 @@ def _parse_args_run_flwr_serverapp() -> argparse.ArgumentParser:
221
230
  help="When set, this process will start a single ServerApp for a pending Run. "
222
231
  "If there is no pending Run, the process will exit.",
223
232
  )
233
+ parser.add_argument(
234
+ "--root-certificates",
235
+ metavar="ROOT_CERT",
236
+ type=str,
237
+ help="Specifies the path to the PEM-encoded root certificate file for "
238
+ "establishing secure HTTPS connections.",
239
+ )
224
240
  add_args_flwr_app_common(parser=parser)
225
241
  return parser