flwr-nightly 1.14.0.dev20241214__tar.gz → 1.14.0.dev20241216__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.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/PKG-INFO +1 -1
  2. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/pyproject.toml +1 -1
  3. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/cli/log.py +1 -1
  4. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/cli/login/login.py +1 -3
  5. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/cli/ls.py +18 -18
  6. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/cli/run/run.py +4 -16
  7. flwr_nightly-1.14.0.dev20241216/src/py/flwr/cli/stop.py +129 -0
  8. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/cli/utils.py +3 -16
  9. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/client/app.py +11 -1
  10. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/client/clientapp/app.py +3 -1
  11. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/client/grpc_rere_client/connection.py +10 -4
  12. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/common/logger.py +16 -1
  13. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/common/retry_invoker.py +3 -1
  14. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/app.py +7 -8
  15. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/superlink/fleet/message_handler/message_handler.py +1 -3
  16. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/simulation/run_simulation.py +0 -15
  17. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/simulation/simulationio_connection.py +3 -0
  18. flwr_nightly-1.14.0.dev20241214/src/py/flwr/cli/stop.py +0 -91
  19. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/LICENSE +0 -0
  20. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/README.md +0 -0
  21. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/__init__.py +0 -0
  22. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/cli/__init__.py +0 -0
  23. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/cli/app.py +0 -0
  24. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/cli/build.py +0 -0
  25. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/cli/cli_user_auth_interceptor.py +0 -0
  26. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/cli/config_utils.py +0 -0
  27. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/cli/example.py +0 -0
  28. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/cli/install.py +0 -0
  29. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/cli/login/__init__.py +0 -0
  30. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/cli/new/__init__.py +0 -0
  31. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/cli/new/new.py +0 -0
  32. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/cli/new/templates/__init__.py +0 -0
  33. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/cli/new/templates/app/.gitignore.tpl +0 -0
  34. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/cli/new/templates/app/LICENSE.tpl +0 -0
  35. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/cli/new/templates/app/README.baseline.md.tpl +0 -0
  36. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/cli/new/templates/app/README.flowertune.md.tpl +0 -0
  37. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/cli/new/templates/app/README.md.tpl +0 -0
  38. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/cli/new/templates/app/__init__.py +0 -0
  39. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/cli/new/templates/app/code/__init__.baseline.py.tpl +0 -0
  40. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
  41. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
  42. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/cli/new/templates/app/code/client.baseline.py.tpl +0 -0
  43. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/cli/new/templates/app/code/client.huggingface.py.tpl +0 -0
  44. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/cli/new/templates/app/code/client.jax.py.tpl +0 -0
  45. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/cli/new/templates/app/code/client.mlx.py.tpl +0 -0
  46. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/cli/new/templates/app/code/client.numpy.py.tpl +0 -0
  47. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -0
  48. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl +0 -0
  49. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -0
  50. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/cli/new/templates/app/code/dataset.baseline.py.tpl +0 -0
  51. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/cli/new/templates/app/code/flwr_tune/__init__.py +0 -0
  52. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/cli/new/templates/app/code/flwr_tune/client_app.py.tpl +0 -0
  53. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/cli/new/templates/app/code/flwr_tune/dataset.py.tpl +0 -0
  54. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/cli/new/templates/app/code/flwr_tune/models.py.tpl +0 -0
  55. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/cli/new/templates/app/code/flwr_tune/server_app.py.tpl +0 -0
  56. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/cli/new/templates/app/code/flwr_tune/strategy.py.tpl +0 -0
  57. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/cli/new/templates/app/code/model.baseline.py.tpl +0 -0
  58. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/cli/new/templates/app/code/server.baseline.py.tpl +0 -0
  59. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/cli/new/templates/app/code/server.huggingface.py.tpl +0 -0
  60. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/cli/new/templates/app/code/server.jax.py.tpl +0 -0
  61. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/cli/new/templates/app/code/server.mlx.py.tpl +0 -0
  62. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -0
  63. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -0
  64. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/cli/new/templates/app/code/server.sklearn.py.tpl +0 -0
  65. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -0
  66. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/cli/new/templates/app/code/strategy.baseline.py.tpl +0 -0
  67. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/cli/new/templates/app/code/task.huggingface.py.tpl +0 -0
  68. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/cli/new/templates/app/code/task.jax.py.tpl +0 -0
  69. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/cli/new/templates/app/code/task.mlx.py.tpl +0 -0
  70. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/cli/new/templates/app/code/task.numpy.py.tpl +0 -0
  71. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +0 -0
  72. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/cli/new/templates/app/code/task.sklearn.py.tpl +0 -0
  73. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/cli/new/templates/app/code/task.tensorflow.py.tpl +0 -0
  74. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/cli/new/templates/app/code/utils.baseline.py.tpl +0 -0
  75. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/cli/new/templates/app/pyproject.baseline.toml.tpl +0 -0
  76. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +0 -0
  77. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl +0 -0
  78. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/cli/new/templates/app/pyproject.jax.toml.tpl +0 -0
  79. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +0 -0
  80. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +0 -0
  81. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +0 -0
  82. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +0 -0
  83. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +0 -0
  84. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/cli/run/__init__.py +0 -0
  85. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/client/__init__.py +0 -0
  86. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/client/client.py +0 -0
  87. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/client/client_app.py +0 -0
  88. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/client/clientapp/__init__.py +0 -0
  89. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/client/clientapp/clientappio_servicer.py +0 -0
  90. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/client/clientapp/utils.py +0 -0
  91. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/client/dpfedavg_numpy_client.py +0 -0
  92. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/client/grpc_adapter_client/__init__.py +0 -0
  93. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/client/grpc_adapter_client/connection.py +0 -0
  94. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/client/grpc_client/__init__.py +0 -0
  95. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/client/grpc_client/connection.py +0 -0
  96. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/client/grpc_rere_client/__init__.py +0 -0
  97. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/client/grpc_rere_client/client_interceptor.py +0 -0
  98. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/client/grpc_rere_client/grpc_adapter.py +0 -0
  99. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/client/heartbeat.py +0 -0
  100. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/client/message_handler/__init__.py +0 -0
  101. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/client/message_handler/message_handler.py +0 -0
  102. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/client/message_handler/task_handler.py +0 -0
  103. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/client/mod/__init__.py +0 -0
  104. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/client/mod/centraldp_mods.py +0 -0
  105. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/client/mod/comms_mods.py +0 -0
  106. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/client/mod/localdp_mod.py +0 -0
  107. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
  108. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
  109. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
  110. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/client/mod/utils.py +0 -0
  111. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/client/nodestate/__init__.py +0 -0
  112. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/client/nodestate/in_memory_nodestate.py +0 -0
  113. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/client/nodestate/nodestate.py +0 -0
  114. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/client/nodestate/nodestate_factory.py +0 -0
  115. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/client/numpy_client.py +0 -0
  116. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/client/rest_client/__init__.py +0 -0
  117. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/client/rest_client/connection.py +0 -0
  118. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/client/run_info_store.py +0 -0
  119. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/client/supernode/__init__.py +0 -0
  120. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/client/supernode/app.py +0 -0
  121. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/client/typing.py +0 -0
  122. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/common/__init__.py +0 -0
  123. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/common/address.py +0 -0
  124. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/common/args.py +0 -0
  125. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/common/auth_plugin/__init__.py +0 -0
  126. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/common/auth_plugin/auth_plugin.py +0 -0
  127. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/common/config.py +0 -0
  128. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/common/constant.py +0 -0
  129. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/common/context.py +0 -0
  130. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/common/date.py +0 -0
  131. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/common/differential_privacy.py +0 -0
  132. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/common/differential_privacy_constants.py +0 -0
  133. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/common/dp.py +0 -0
  134. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/common/exit_handlers.py +0 -0
  135. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/common/grpc.py +0 -0
  136. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/common/message.py +0 -0
  137. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/common/object_ref.py +0 -0
  138. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/common/parameter.py +0 -0
  139. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/common/pyproject.py +0 -0
  140. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/common/record/__init__.py +0 -0
  141. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/common/record/configsrecord.py +0 -0
  142. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/common/record/conversion_utils.py +0 -0
  143. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/common/record/metricsrecord.py +0 -0
  144. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/common/record/parametersrecord.py +0 -0
  145. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/common/record/recordset.py +0 -0
  146. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/common/record/typeddict.py +0 -0
  147. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/common/recordset_compat.py +0 -0
  148. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/common/secure_aggregation/__init__.py +0 -0
  149. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
  150. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
  151. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -0
  152. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
  153. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/common/secure_aggregation/quantization.py +0 -0
  154. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
  155. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
  156. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/common/serde.py +0 -0
  157. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/common/telemetry.py +0 -0
  158. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/common/typing.py +0 -0
  159. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/common/version.py +0 -0
  160. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/proto/__init__.py +0 -0
  161. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/proto/clientappio_pb2.py +0 -0
  162. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/proto/clientappio_pb2.pyi +0 -0
  163. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/proto/clientappio_pb2_grpc.py +0 -0
  164. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/proto/clientappio_pb2_grpc.pyi +0 -0
  165. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/proto/error_pb2.py +0 -0
  166. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/proto/error_pb2.pyi +0 -0
  167. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/proto/error_pb2_grpc.py +0 -0
  168. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/proto/error_pb2_grpc.pyi +0 -0
  169. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/proto/exec_pb2.py +0 -0
  170. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/proto/exec_pb2.pyi +0 -0
  171. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/proto/exec_pb2_grpc.py +0 -0
  172. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/proto/exec_pb2_grpc.pyi +0 -0
  173. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/proto/fab_pb2.py +0 -0
  174. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/proto/fab_pb2.pyi +0 -0
  175. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/proto/fab_pb2_grpc.py +0 -0
  176. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/proto/fab_pb2_grpc.pyi +0 -0
  177. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/proto/fleet_pb2.py +0 -0
  178. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/proto/fleet_pb2.pyi +0 -0
  179. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/proto/fleet_pb2_grpc.py +0 -0
  180. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
  181. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/proto/grpcadapter_pb2.py +0 -0
  182. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/proto/grpcadapter_pb2.pyi +0 -0
  183. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/proto/grpcadapter_pb2_grpc.py +0 -0
  184. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/proto/grpcadapter_pb2_grpc.pyi +0 -0
  185. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/proto/log_pb2.py +0 -0
  186. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/proto/log_pb2.pyi +0 -0
  187. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/proto/log_pb2_grpc.py +0 -0
  188. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/proto/log_pb2_grpc.pyi +0 -0
  189. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/proto/message_pb2.py +0 -0
  190. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/proto/message_pb2.pyi +0 -0
  191. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/proto/message_pb2_grpc.py +0 -0
  192. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/proto/message_pb2_grpc.pyi +0 -0
  193. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/proto/node_pb2.py +0 -0
  194. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/proto/node_pb2.pyi +0 -0
  195. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/proto/node_pb2_grpc.py +0 -0
  196. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/proto/node_pb2_grpc.pyi +0 -0
  197. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/proto/recordset_pb2.py +0 -0
  198. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/proto/recordset_pb2.pyi +0 -0
  199. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/proto/recordset_pb2_grpc.py +0 -0
  200. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/proto/recordset_pb2_grpc.pyi +0 -0
  201. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/proto/run_pb2.py +0 -0
  202. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/proto/run_pb2.pyi +0 -0
  203. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/proto/run_pb2_grpc.py +0 -0
  204. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/proto/run_pb2_grpc.pyi +0 -0
  205. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/proto/serverappio_pb2.py +0 -0
  206. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/proto/serverappio_pb2.pyi +0 -0
  207. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/proto/serverappio_pb2_grpc.py +0 -0
  208. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/proto/serverappio_pb2_grpc.pyi +0 -0
  209. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/proto/simulationio_pb2.py +0 -0
  210. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/proto/simulationio_pb2.pyi +0 -0
  211. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/proto/simulationio_pb2_grpc.py +0 -0
  212. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/proto/simulationio_pb2_grpc.pyi +0 -0
  213. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/proto/task_pb2.py +0 -0
  214. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/proto/task_pb2.pyi +0 -0
  215. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/proto/task_pb2_grpc.py +0 -0
  216. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/proto/task_pb2_grpc.pyi +0 -0
  217. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/proto/transport_pb2.py +0 -0
  218. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/proto/transport_pb2.pyi +0 -0
  219. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/proto/transport_pb2_grpc.py +0 -0
  220. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
  221. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/py.typed +0 -0
  222. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/__init__.py +0 -0
  223. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/client_manager.py +0 -0
  224. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/client_proxy.py +0 -0
  225. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/compat/__init__.py +0 -0
  226. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/compat/app.py +0 -0
  227. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/compat/app_utils.py +0 -0
  228. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/compat/driver_client_proxy.py +0 -0
  229. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/compat/legacy_context.py +0 -0
  230. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/criterion.py +0 -0
  231. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/driver/__init__.py +0 -0
  232. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/driver/driver.py +0 -0
  233. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/driver/grpc_driver.py +0 -0
  234. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/driver/inmemory_driver.py +0 -0
  235. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/history.py +0 -0
  236. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/run_serverapp.py +0 -0
  237. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/server.py +0 -0
  238. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/server_app.py +0 -0
  239. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/server_config.py +0 -0
  240. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/serverapp/__init__.py +0 -0
  241. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/serverapp/app.py +0 -0
  242. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/serverapp_components.py +0 -0
  243. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/strategy/__init__.py +0 -0
  244. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/strategy/aggregate.py +0 -0
  245. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/strategy/bulyan.py +0 -0
  246. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
  247. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
  248. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
  249. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
  250. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
  251. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/strategy/fedadagrad.py +0 -0
  252. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/strategy/fedadam.py +0 -0
  253. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/strategy/fedavg.py +0 -0
  254. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/strategy/fedavg_android.py +0 -0
  255. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/strategy/fedavgm.py +0 -0
  256. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/strategy/fedmedian.py +0 -0
  257. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/strategy/fedopt.py +0 -0
  258. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/strategy/fedprox.py +0 -0
  259. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
  260. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
  261. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
  262. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
  263. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/strategy/fedyogi.py +0 -0
  264. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/strategy/krum.py +0 -0
  265. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/strategy/qfedavg.py +0 -0
  266. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/strategy/strategy.py +0 -0
  267. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/superlink/__init__.py +0 -0
  268. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/superlink/driver/__init__.py +0 -0
  269. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/superlink/driver/serverappio_grpc.py +0 -0
  270. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/superlink/driver/serverappio_servicer.py +0 -0
  271. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/superlink/ffs/__init__.py +0 -0
  272. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/superlink/ffs/disk_ffs.py +0 -0
  273. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/superlink/ffs/ffs.py +0 -0
  274. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/superlink/ffs/ffs_factory.py +0 -0
  275. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/superlink/fleet/__init__.py +0 -0
  276. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/superlink/fleet/grpc_adapter/__init__.py +0 -0
  277. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +0 -0
  278. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
  279. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
  280. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
  281. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
  282. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +0 -0
  283. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
  284. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +0 -0
  285. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +0 -0
  286. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
  287. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
  288. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +0 -0
  289. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
  290. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
  291. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
  292. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +0 -0
  293. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/superlink/fleet/vce/vce_api.py +0 -0
  294. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/superlink/linkstate/__init__.py +0 -0
  295. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/superlink/linkstate/in_memory_linkstate.py +0 -0
  296. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/superlink/linkstate/linkstate.py +0 -0
  297. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/superlink/linkstate/linkstate_factory.py +0 -0
  298. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/superlink/linkstate/sqlite_linkstate.py +0 -0
  299. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/superlink/linkstate/utils.py +0 -0
  300. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/superlink/simulation/__init__.py +0 -0
  301. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/superlink/simulation/simulationio_grpc.py +0 -0
  302. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/superlink/simulation/simulationio_servicer.py +0 -0
  303. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/superlink/utils.py +0 -0
  304. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/typing.py +0 -0
  305. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/utils/__init__.py +0 -0
  306. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/utils/tensorboard.py +0 -0
  307. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/utils/validator.py +0 -0
  308. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/workflow/__init__.py +0 -0
  309. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/workflow/constant.py +0 -0
  310. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/workflow/default_workflows.py +0 -0
  311. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
  312. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
  313. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +0 -0
  314. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/simulation/__init__.py +0 -0
  315. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/simulation/app.py +0 -0
  316. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/simulation/legacy_app.py +0 -0
  317. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/simulation/ray_transport/__init__.py +0 -0
  318. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
  319. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
  320. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/simulation/ray_transport/utils.py +0 -0
  321. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/superexec/__init__.py +0 -0
  322. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/superexec/app.py +0 -0
  323. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/superexec/deployment.py +0 -0
  324. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/superexec/exec_grpc.py +0 -0
  325. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/superexec/exec_servicer.py +0 -0
  326. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/superexec/exec_user_auth_interceptor.py +0 -0
  327. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/src/py/flwr/superexec/executor.py +0 -0
  328. {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.14.0.dev20241216}/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.14.0.dev20241214
3
+ Version: 1.14.0.dev20241216
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.14.0.dev20241214"
7
+ version = "1.14.0.dev20241216"
8
8
  description = "Flower: A Friendly Federated AI Framework"
9
9
  license = "Apache-2.0"
10
10
  authors = ["The Flower Authors <hello@flower.ai>"]
@@ -170,7 +170,7 @@ def _log_with_exec_api(
170
170
  run_id: int,
171
171
  stream: bool,
172
172
  ) -> None:
173
- auth_plugin = try_obtain_cli_auth_plugin(app, federation, federation_config)
173
+ auth_plugin = try_obtain_cli_auth_plugin(app, federation)
174
174
  channel = init_channel(app, federation_config, auth_plugin)
175
175
 
176
176
  if stream:
@@ -65,9 +65,7 @@ def login( # pylint: disable=R0914
65
65
 
66
66
  # Get the auth plugin
67
67
  auth_type = login_response.login_details.get(AUTH_TYPE)
68
- auth_plugin = try_obtain_cli_auth_plugin(
69
- app, federation, federation_config, auth_type
70
- )
68
+ auth_plugin = try_obtain_cli_auth_plugin(app, federation, auth_type)
71
69
  if auth_plugin is None:
72
70
  typer.secho(
73
71
  f'❌ Authentication type "{auth_type}" not found',
@@ -19,13 +19,12 @@ import io
19
19
  import json
20
20
  from datetime import datetime, timedelta
21
21
  from pathlib import Path
22
- from typing import Annotated, Optional, Union
22
+ from typing import Annotated, Optional
23
23
 
24
24
  import typer
25
25
  from rich.console import Console
26
26
  from rich.table import Table
27
27
  from rich.text import Text
28
- from typer import Exit
29
28
 
30
29
  from flwr.cli.config_utils import (
31
30
  exit_if_no_address,
@@ -35,7 +34,7 @@ from flwr.cli.config_utils import (
35
34
  )
36
35
  from flwr.common.constant import FAB_CONFIG_FILE, CliOutputFormat, SubStatus
37
36
  from flwr.common.date import format_timedelta, isoformat8601_utc
38
- from flwr.common.logger import redirect_output, remove_emojis, restore_output
37
+ from flwr.common.logger import print_json_error, redirect_output, restore_output
39
38
  from flwr.common.serde import run_from_proto
40
39
  from flwr.common.typing import Run
41
40
  from flwr.proto.exec_pb2 import ( # pylint: disable=E0611
@@ -81,7 +80,20 @@ def ls( # pylint: disable=too-many-locals, too-many-branches
81
80
  ),
82
81
  ] = CliOutputFormat.DEFAULT,
83
82
  ) -> None:
84
- """List runs."""
83
+ """List the details of one provided run ID or all runs in a Flower federation.
84
+
85
+ The following details are displayed:
86
+
87
+ - **Run ID:** Unique identifier for the run.
88
+ - **FAB:** Name of the FAB associated with the run (``{FAB_ID} (v{FAB_VERSION})``).
89
+ - **Status:** Current status of the run (pending, starting, running, finished).
90
+ - **Elapsed:** Time elapsed since the run started (``HH:MM:SS``).
91
+ - **Created At:** Timestamp when the run was created.
92
+ - **Running At:** Timestamp when the run started running.
93
+ - **Finished At:** Timestamp when the run finished.
94
+
95
+ All timestamps follow ISO 8601, UTC and are formatted as ``YYYY-MM-DD HH:MM:SSZ``.
96
+ """
85
97
  suppress_output = output_format == CliOutputFormat.JSON
86
98
  captured_output = io.StringIO()
87
99
  try:
@@ -104,7 +116,7 @@ def ls( # pylint: disable=too-many-locals, too-many-branches
104
116
  raise ValueError(
105
117
  "The options '--runs' and '--run-id' are mutually exclusive."
106
118
  )
107
- auth_plugin = try_obtain_cli_auth_plugin(app, federation, federation_config)
119
+ auth_plugin = try_obtain_cli_auth_plugin(app, federation)
108
120
  channel = init_channel(app, federation_config, auth_plugin)
109
121
  stub = ExecStub(channel)
110
122
 
@@ -132,7 +144,7 @@ def ls( # pylint: disable=too-many-locals, too-many-branches
132
144
  if suppress_output:
133
145
  restore_output()
134
146
  e_message = captured_output.getvalue()
135
- _print_json_error(e_message, err)
147
+ print_json_error(e_message, err)
136
148
  else:
137
149
  typer.secho(
138
150
  f"{err}",
@@ -310,15 +322,3 @@ def _display_one_run(
310
322
  Console().print_json(_to_json(formatted_runs))
311
323
  else:
312
324
  Console().print(_to_table(formatted_runs))
313
-
314
-
315
- def _print_json_error(msg: str, e: Union[Exit, Exception]) -> None:
316
- """Print error message as JSON."""
317
- Console().print_json(
318
- json.dumps(
319
- {
320
- "success": False,
321
- "error-message": remove_emojis(str(msg) + "\n" + str(e)),
322
- }
323
- )
324
- )
@@ -19,7 +19,7 @@ import io
19
19
  import json
20
20
  import subprocess
21
21
  from pathlib import Path
22
- from typing import Annotated, Any, Optional, Union
22
+ from typing import Annotated, Any, Optional
23
23
 
24
24
  import typer
25
25
  from rich.console import Console
@@ -37,7 +37,7 @@ from flwr.common.config import (
37
37
  user_config_to_configsrecord,
38
38
  )
39
39
  from flwr.common.constant import CliOutputFormat
40
- from flwr.common.logger import redirect_output, remove_emojis, restore_output
40
+ from flwr.common.logger import print_json_error, redirect_output, restore_output
41
41
  from flwr.common.serde import (
42
42
  configs_record_to_proto,
43
43
  fab_to_proto,
@@ -122,7 +122,7 @@ def run(
122
122
  if suppress_output:
123
123
  restore_output()
124
124
  e_message = captured_output.getvalue()
125
- _print_json_error(e_message, err)
125
+ print_json_error(e_message, err)
126
126
  else:
127
127
  typer.secho(
128
128
  f"{err}",
@@ -144,7 +144,7 @@ def _run_with_exec_api(
144
144
  stream: bool,
145
145
  output_format: str,
146
146
  ) -> None:
147
- auth_plugin = try_obtain_cli_auth_plugin(app, federation, federation_config)
147
+ auth_plugin = try_obtain_cli_auth_plugin(app, federation)
148
148
  channel = init_channel(app, federation_config, auth_plugin)
149
149
  stub = ExecStub(channel)
150
150
 
@@ -239,15 +239,3 @@ def _run_without_exec_api(
239
239
  check=True,
240
240
  text=True,
241
241
  )
242
-
243
-
244
- def _print_json_error(msg: str, e: Union[typer.Exit, Exception]) -> None:
245
- """Print error message as JSON."""
246
- Console().print_json(
247
- json.dumps(
248
- {
249
- "success": False,
250
- "error-message": remove_emojis(str(msg) + "\n" + str(e)),
251
- }
252
- )
253
- )
@@ -0,0 +1,129 @@
1
+ # Copyright 2024 Flower Labs GmbH. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ # ==============================================================================
15
+ """Flower command line interface `stop` command."""
16
+
17
+
18
+ import io
19
+ import json
20
+ from pathlib import Path
21
+ from typing import Annotated, Optional
22
+
23
+ import typer
24
+ from rich.console import Console
25
+
26
+ from flwr.cli.config_utils import (
27
+ exit_if_no_address,
28
+ load_and_validate,
29
+ process_loaded_project_config,
30
+ validate_federation_in_project_config,
31
+ )
32
+ from flwr.common.constant import FAB_CONFIG_FILE, CliOutputFormat
33
+ from flwr.common.logger import print_json_error, redirect_output, restore_output
34
+ from flwr.proto.exec_pb2 import StopRunRequest, StopRunResponse # pylint: disable=E0611
35
+ from flwr.proto.exec_pb2_grpc import ExecStub
36
+
37
+ from .utils import init_channel, try_obtain_cli_auth_plugin
38
+
39
+
40
+ def stop( # pylint: disable=R0914
41
+ run_id: Annotated[ # pylint: disable=unused-argument
42
+ int,
43
+ typer.Argument(help="The Flower run ID to stop"),
44
+ ],
45
+ app: Annotated[
46
+ Path,
47
+ typer.Argument(help="Path of the Flower project"),
48
+ ] = Path("."),
49
+ federation: Annotated[
50
+ Optional[str],
51
+ typer.Argument(help="Name of the federation"),
52
+ ] = None,
53
+ output_format: Annotated[
54
+ str,
55
+ typer.Option(
56
+ "--format",
57
+ case_sensitive=False,
58
+ help="Format output using 'default' view or 'json'",
59
+ ),
60
+ ] = CliOutputFormat.DEFAULT,
61
+ ) -> None:
62
+ """Stop a run."""
63
+ suppress_output = output_format == CliOutputFormat.JSON
64
+ captured_output = io.StringIO()
65
+ try:
66
+ if suppress_output:
67
+ redirect_output(captured_output)
68
+
69
+ # Load and validate federation config
70
+ typer.secho("Loading project configuration... ", fg=typer.colors.BLUE)
71
+
72
+ pyproject_path = app / FAB_CONFIG_FILE if app else None
73
+ config, errors, warnings = load_and_validate(path=pyproject_path)
74
+ config = process_loaded_project_config(config, errors, warnings)
75
+ federation, federation_config = validate_federation_in_project_config(
76
+ federation, config
77
+ )
78
+ exit_if_no_address(federation_config, "stop")
79
+
80
+ try:
81
+ auth_plugin = try_obtain_cli_auth_plugin(app, federation)
82
+ channel = init_channel(app, federation_config, auth_plugin)
83
+ stub = ExecStub(channel) # pylint: disable=unused-variable # noqa: F841
84
+
85
+ typer.secho(f"✋ Stopping run ID {run_id}...", fg=typer.colors.GREEN)
86
+ _stop_run(stub=stub, run_id=run_id, output_format=output_format)
87
+
88
+ except ValueError as err:
89
+ typer.secho(
90
+ f"❌ {err}",
91
+ fg=typer.colors.RED,
92
+ bold=True,
93
+ )
94
+ raise typer.Exit(code=1) from err
95
+ finally:
96
+ channel.close()
97
+ except (typer.Exit, Exception) as err: # pylint: disable=broad-except
98
+ if suppress_output:
99
+ restore_output()
100
+ e_message = captured_output.getvalue()
101
+ print_json_error(e_message, err)
102
+ else:
103
+ typer.secho(
104
+ f"{err}",
105
+ fg=typer.colors.RED,
106
+ bold=True,
107
+ )
108
+ finally:
109
+ if suppress_output:
110
+ restore_output()
111
+ captured_output.close()
112
+
113
+
114
+ def _stop_run(stub: ExecStub, run_id: int, output_format: str) -> None:
115
+ """Stop a run."""
116
+ response: StopRunResponse = stub.StopRun(request=StopRunRequest(run_id=run_id))
117
+ if response.success:
118
+ typer.secho(f"✅ Run {run_id} successfully stopped.", fg=typer.colors.GREEN)
119
+ if output_format == CliOutputFormat.JSON:
120
+ run_output = json.dumps(
121
+ {
122
+ "success": True,
123
+ "run-id": run_id,
124
+ }
125
+ )
126
+ restore_output()
127
+ Console().print_json(run_output)
128
+ else:
129
+ typer.secho(f"❌ Run {run_id} couldn't be stopped.", fg=typer.colors.RED)
@@ -26,7 +26,6 @@ import grpc
26
26
  import typer
27
27
 
28
28
  from flwr.cli.cli_user_auth_interceptor import CliUserAuthInterceptor
29
- from flwr.common.address import parse_address
30
29
  from flwr.common.auth_plugin import CliAuthPlugin
31
30
  from flwr.common.constant import AUTH_TYPE, CREDENTIALS_DIR, FLWR_DIR
32
31
  from flwr.common.grpc import GRPC_MAX_MESSAGE_LENGTH, create_channel
@@ -159,33 +158,21 @@ def get_sha256_hash(file_path: Path) -> str:
159
158
  return sha256.hexdigest()
160
159
 
161
160
 
162
- def get_user_auth_config_path(
163
- root_dir: Path, federation: str, server_address: str
164
- ) -> Path:
161
+ def get_user_auth_config_path(root_dir: Path, federation: str) -> Path:
165
162
  """Return the path to the user auth config file."""
166
- # Parse the server address
167
- parsed_addr = parse_address(server_address)
168
- if parsed_addr is None:
169
- raise ValueError(f"Invalid server address: {server_address}")
170
- host, port, is_v6 = parsed_addr
171
- formatted_addr = f"[{host}]_{port}" if is_v6 else f"{host}_{port}"
172
-
173
163
  # Locate the credentials directory
174
164
  credentials_dir = root_dir.absolute() / FLWR_DIR / CREDENTIALS_DIR
175
165
  credentials_dir.mkdir(parents=True, exist_ok=True)
176
- return credentials_dir / f"{federation}_{formatted_addr}.json"
166
+ return credentials_dir / f"{federation}.json"
177
167
 
178
168
 
179
169
  def try_obtain_cli_auth_plugin(
180
170
  root_dir: Path,
181
171
  federation: str,
182
- federation_config: dict[str, Any],
183
172
  auth_type: Optional[str] = None,
184
173
  ) -> Optional[CliAuthPlugin]:
185
174
  """Load the CLI-side user auth plugin for the given auth type."""
186
- config_path = get_user_auth_config_path(
187
- root_dir, federation, federation_config["address"]
188
- )
175
+ config_path = get_user_auth_config_path(root_dir, federation)
189
176
 
190
177
  # Load the config file if it exists
191
178
  config: dict[str, Any] = {}
@@ -56,7 +56,7 @@ from flwr.common.constant import (
56
56
  from flwr.common.logger import log, warn_deprecated_feature
57
57
  from flwr.common.message import Error
58
58
  from flwr.common.retry_invoker import RetryInvoker, RetryState, exponential
59
- from flwr.common.typing import Fab, Run, UserConfig
59
+ from flwr.common.typing import Fab, Run, RunNotRunningException, UserConfig
60
60
  from flwr.proto.clientappio_pb2_grpc import add_ClientAppIoServicer_to_server
61
61
  from flwr.server.superlink.fleet.grpc_bidi.grpc_server import generic_create_grpc_server
62
62
  from flwr.server.superlink.linkstate.utils import generate_rand_int_from_bytes
@@ -612,6 +612,16 @@ def start_client_internal(
612
612
  send(reply_message)
613
613
  log(INFO, "Sent reply")
614
614
 
615
+ except RunNotRunningException:
616
+ log(INFO, "")
617
+ log(
618
+ INFO,
619
+ "SuperNode aborted sending the reply message. "
620
+ "Run ID %s is not in `RUNNING` status.",
621
+ run_id,
622
+ )
623
+ log(INFO, "")
624
+
615
625
  except StopIteration:
616
626
  sleep_duration = 0
617
627
  break
@@ -32,6 +32,7 @@ from flwr.common.constant import CLIENTAPPIO_API_DEFAULT_CLIENT_ADDRESS, ErrorCo
32
32
  from flwr.common.grpc import create_channel
33
33
  from flwr.common.logger import log
34
34
  from flwr.common.message import Error
35
+ from flwr.common.retry_invoker import _make_simple_grpc_retry_invoker, _wrap_stub
35
36
  from flwr.common.serde import (
36
37
  context_from_proto,
37
38
  context_to_proto,
@@ -106,9 +107,9 @@ def run_clientapp( # pylint: disable=R0914
106
107
 
107
108
  # Resolve directory where FABs are installed
108
109
  flwr_dir_ = get_flwr_dir(flwr_dir)
109
-
110
110
  try:
111
111
  stub = ClientAppIoStub(channel)
112
+ _wrap_stub(stub, _make_simple_grpc_retry_invoker())
112
113
 
113
114
  while True:
114
115
  # If token is not set, loop until token is received from SuperNode
@@ -139,6 +140,7 @@ def run_clientapp( # pylint: disable=R0914
139
140
 
140
141
  # Execute ClientApp
141
142
  reply_message = client_app(message=message, context=context)
143
+
142
144
  except Exception as ex: # pylint: disable=broad-exception-caught
143
145
  # Don't update/change NodeState
144
146
 
@@ -42,7 +42,7 @@ from flwr.common.logger import log
42
42
  from flwr.common.message import Message, Metadata
43
43
  from flwr.common.retry_invoker import RetryInvoker
44
44
  from flwr.common.serde import message_from_taskins, message_to_taskres, run_from_proto
45
- from flwr.common.typing import Fab, Run
45
+ from flwr.common.typing import Fab, Run, RunNotRunningException
46
46
  from flwr.proto.fab_pb2 import GetFabRequest, GetFabResponse # pylint: disable=E0611
47
47
  from flwr.proto.fleet_pb2 import ( # pylint: disable=E0611
48
48
  CreateNodeRequest,
@@ -155,10 +155,16 @@ 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
+ def _should_giveup_fn(e: Exception) -> bool:
159
+ if e.code() == grpc.StatusCode.PERMISSION_DENIED: # type: ignore
160
+ raise RunNotRunningException
161
+ if e.code() == grpc.StatusCode.UNAVAILABLE: # type: ignore
162
+ return False
163
+ return True
164
+
158
165
  # 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
- )
166
+ # If the status code is PERMISSION_DENIED, additionally raise RunNotRunningException
167
+ retry_invoker.should_giveup = _should_giveup_fn
162
168
 
163
169
  ###########################################################################
164
170
  # ping/create_node/delete_node/receive/send/get_run functions
@@ -15,6 +15,7 @@
15
15
  """Flower Logger."""
16
16
 
17
17
 
18
+ import json as _json
18
19
  import logging
19
20
  import re
20
21
  import sys
@@ -27,6 +28,8 @@ from queue import Empty, Queue
27
28
  from typing import TYPE_CHECKING, Any, Optional, TextIO, Union
28
29
 
29
30
  import grpc
31
+ import typer
32
+ from rich.console import Console
30
33
 
31
34
  from flwr.proto.log_pb2 import PushLogsRequest # pylint: disable=E0611
32
35
  from flwr.proto.node_pb2 import Node # pylint: disable=E0611
@@ -377,7 +380,7 @@ def stop_log_uploader(
377
380
  log_uploader.join()
378
381
 
379
382
 
380
- def remove_emojis(text: str) -> str:
383
+ def _remove_emojis(text: str) -> str:
381
384
  """Remove emojis from the provided text."""
382
385
  emoji_pattern = re.compile(
383
386
  "["
@@ -391,3 +394,15 @@ def remove_emojis(text: str) -> str:
391
394
  flags=re.UNICODE,
392
395
  )
393
396
  return emoji_pattern.sub(r"", text)
397
+
398
+
399
+ def print_json_error(msg: str, e: Union[typer.Exit, Exception]) -> None:
400
+ """Print error message as JSON."""
401
+ Console().print_json(
402
+ _json.dumps(
403
+ {
404
+ "success": False,
405
+ "error-message": _remove_emojis(str(msg) + "\n" + str(e)),
406
+ }
407
+ )
408
+ )
@@ -30,6 +30,7 @@ from flwr.common.logger import log
30
30
  from flwr.common.typing import RunNotRunningException
31
31
  from flwr.proto.clientappio_pb2_grpc import ClientAppIoStub
32
32
  from flwr.proto.serverappio_pb2_grpc import ServerAppIoStub
33
+ from flwr.proto.simulationio_pb2_grpc import SimulationIoStub
33
34
 
34
35
 
35
36
  def exponential(
@@ -365,7 +366,8 @@ def _make_simple_grpc_retry_invoker() -> RetryInvoker:
365
366
 
366
367
 
367
368
  def _wrap_stub(
368
- stub: Union[ServerAppIoStub, ClientAppIoStub], retry_invoker: RetryInvoker
369
+ stub: Union[ServerAppIoStub, ClientAppIoStub, SimulationIoStub],
370
+ retry_invoker: RetryInvoker,
369
371
  ) -> None:
370
372
  """Wrap a gRPC stub with a retry invoker."""
371
373
 
@@ -93,9 +93,13 @@ BASE_DIR = get_flwr_dir() / "superlink" / "ffs"
93
93
 
94
94
 
95
95
  try:
96
- from flwr.ee import get_exec_auth_plugins
96
+ from flwr.ee import add_ee_args_superlink, get_exec_auth_plugins
97
97
  except ImportError:
98
98
 
99
+ # pylint: disable-next=unused-argument
100
+ def add_ee_args_superlink(parser: argparse.ArgumentParser) -> None:
101
+ """Add EE-specific arguments to the parser."""
102
+
99
103
  def get_exec_auth_plugins() -> dict[str, type[ExecAuthPlugin]]:
100
104
  """Return all Exec API authentication plugins."""
101
105
  raise NotImplementedError("No authentication plugins are currently supported.")
@@ -580,7 +584,7 @@ def _try_setup_node_authentication(
580
584
 
581
585
 
582
586
  def _try_obtain_user_auth_config(args: argparse.Namespace) -> Optional[dict[str, Any]]:
583
- if args.user_auth_config is not None:
587
+ if getattr(args, "user_auth_config", None) is not None:
584
588
  with open(args.user_auth_config, encoding="utf-8") as file:
585
589
  config: dict[str, Any] = yaml.safe_load(file)
586
590
  return config
@@ -703,6 +707,7 @@ def _parse_args_run_superlink() -> argparse.ArgumentParser:
703
707
  )
704
708
 
705
709
  _add_args_common(parser=parser)
710
+ add_ee_args_superlink(parser=parser)
706
711
  _add_args_serverappio_api(parser=parser)
707
712
  _add_args_fleet_api(parser=parser)
708
713
  _add_args_exec_api(parser=parser)
@@ -792,12 +797,6 @@ def _add_args_common(parser: argparse.ArgumentParser) -> None:
792
797
  type=str,
793
798
  help="The SuperLink's public key (as a path str) to enable authentication.",
794
799
  )
795
- parser.add_argument(
796
- "--user-auth-config",
797
- help="The path to the user authentication configuration YAML file.",
798
- type=str,
799
- default=None,
800
- )
801
800
 
802
801
 
803
802
  def _add_args_serverappio_api(parser: argparse.ArgumentParser) -> None:
@@ -123,9 +123,7 @@ def push_task_res(request: PushTaskResRequest, state: LinkState) -> PushTaskResR
123
123
  return response
124
124
 
125
125
 
126
- def get_run(
127
- request: GetRunRequest, state: LinkState # pylint: disable=W0613
128
- ) -> GetRunResponse:
126
+ def get_run(request: GetRunRequest, state: LinkState) -> GetRunResponse:
129
127
  """Get run information."""
130
128
  run = state.get_run(request.run_id)
131
129
 
@@ -24,7 +24,6 @@ import threading
24
24
  import traceback
25
25
  from logging import DEBUG, ERROR, INFO, WARNING
26
26
  from pathlib import Path
27
- from time import sleep
28
27
  from typing import Any, Optional
29
28
 
30
29
  from flwr.cli.config_utils import load_and_validate
@@ -136,7 +135,6 @@ def run_simulation_from_cli() -> None:
136
135
  app_dir=args.app,
137
136
  run=run,
138
137
  enable_tf_gpu_growth=args.enable_tf_gpu_growth,
139
- delay_start=args.delay_start,
140
138
  verbose_logging=args.verbose,
141
139
  server_app_run_config=fused_config,
142
140
  is_app=True,
@@ -309,7 +307,6 @@ def _main_loop(
309
307
  enable_tf_gpu_growth: bool,
310
308
  run: Run,
311
309
  exit_event: EventType,
312
- delay_start: int,
313
310
  flwr_dir: Optional[str] = None,
314
311
  client_app: Optional[ClientApp] = None,
315
312
  client_app_attr: Optional[str] = None,
@@ -354,9 +351,6 @@ def _main_loop(
354
351
  run_id=run.run_id,
355
352
  )
356
353
 
357
- # Buffer time so the `ServerApp` in separate thread is ready
358
- log(DEBUG, "Buffer time delay: %ds", delay_start)
359
- sleep(delay_start)
360
354
  # Start Simulation Engine
361
355
  vce.start_vce(
362
356
  num_supernodes=num_supernodes,
@@ -405,7 +399,6 @@ def _run_simulation(
405
399
  flwr_dir: Optional[str] = None,
406
400
  run: Optional[Run] = None,
407
401
  enable_tf_gpu_growth: bool = False,
408
- delay_start: int = 5,
409
402
  verbose_logging: bool = False,
410
403
  is_app: bool = False,
411
404
  ) -> None:
@@ -460,7 +453,6 @@ def _run_simulation(
460
453
  enable_tf_gpu_growth,
461
454
  run,
462
455
  exit_event,
463
- delay_start,
464
456
  flwr_dir,
465
457
  client_app,
466
458
  client_app_attr,
@@ -538,13 +530,6 @@ def _parse_args_run_simulation() -> argparse.ArgumentParser:
538
530
  "Read more about how `tf.config.experimental.set_memory_growth()` works in "
539
531
  "the TensorFlow documentation: https://www.tensorflow.org/api/stable.",
540
532
  )
541
- parser.add_argument(
542
- "--delay-start",
543
- type=int,
544
- default=3,
545
- help="Buffer time (in seconds) to delay the start the simulation engine after "
546
- "the `ServerApp`, which runs in a separate thread, has been launched.",
547
- )
548
533
  parser.add_argument(
549
534
  "--verbose",
550
535
  action="store_true",
@@ -23,6 +23,7 @@ import grpc
23
23
  from flwr.common.constant import SIMULATIONIO_API_DEFAULT_CLIENT_ADDRESS
24
24
  from flwr.common.grpc import create_channel
25
25
  from flwr.common.logger import log
26
+ from flwr.common.retry_invoker import _make_simple_grpc_retry_invoker, _wrap_stub
26
27
  from flwr.proto.simulationio_pb2_grpc import SimulationIoStub # pylint: disable=E0611
27
28
 
28
29
 
@@ -48,6 +49,7 @@ class SimulationIoConnection:
48
49
  self._cert = root_certificates
49
50
  self._grpc_stub: Optional[SimulationIoStub] = None
50
51
  self._channel: Optional[grpc.Channel] = None
52
+ self._retry_invoker = _make_simple_grpc_retry_invoker()
51
53
 
52
54
  @property
53
55
  def _is_connected(self) -> bool:
@@ -72,6 +74,7 @@ class SimulationIoConnection:
72
74
  root_certificates=self._cert,
73
75
  )
74
76
  self._grpc_stub = SimulationIoStub(self._channel)
77
+ _wrap_stub(self._grpc_stub, self._retry_invoker)
75
78
  log(DEBUG, "[SimulationIO] Connected to %s", self._addr)
76
79
 
77
80
  def _disconnect(self) -> None: