flwr-nightly 1.14.0.dev20241211__tar.gz → 1.14.0.dev20241212__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.
Files changed (327) hide show
  1. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/PKG-INFO +1 -1
  2. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/pyproject.toml +1 -1
  3. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/cli/new/new.py +1 -1
  4. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +1 -2
  5. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/client/mod/localdp_mod.py +1 -1
  6. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/common/object_ref.py +57 -54
  7. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/common/retry_invoker.py +75 -0
  8. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/common/typing.py +4 -0
  9. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/proto/fab_pb2.py +4 -4
  10. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/proto/fab_pb2.pyi +4 -1
  11. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/compat/app_utils.py +7 -1
  12. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/driver/grpc_driver.py +4 -61
  13. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/serverapp/app.py +8 -2
  14. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/superlink/driver/serverappio_servicer.py +50 -6
  15. flwr_nightly-1.14.0.dev20241212/src/py/flwr/server/superlink/utils.py +65 -0
  16. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/LICENSE +0 -0
  17. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/README.md +0 -0
  18. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/__init__.py +0 -0
  19. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/cli/__init__.py +0 -0
  20. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/cli/app.py +0 -0
  21. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/cli/build.py +0 -0
  22. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/cli/cli_user_auth_interceptor.py +0 -0
  23. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/cli/config_utils.py +0 -0
  24. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/cli/example.py +0 -0
  25. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/cli/install.py +0 -0
  26. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/cli/log.py +0 -0
  27. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/cli/login/__init__.py +0 -0
  28. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/cli/login/login.py +0 -0
  29. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/cli/ls.py +0 -0
  30. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/cli/new/__init__.py +0 -0
  31. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/cli/new/templates/__init__.py +0 -0
  32. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/cli/new/templates/app/.gitignore.tpl +0 -0
  33. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/cli/new/templates/app/LICENSE.tpl +0 -0
  34. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/cli/new/templates/app/README.baseline.md.tpl +0 -0
  35. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/cli/new/templates/app/README.flowertune.md.tpl +0 -0
  36. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/cli/new/templates/app/README.md.tpl +0 -0
  37. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/cli/new/templates/app/__init__.py +0 -0
  38. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/cli/new/templates/app/code/__init__.baseline.py.tpl +0 -0
  39. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
  40. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
  41. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/cli/new/templates/app/code/client.baseline.py.tpl +0 -0
  42. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/cli/new/templates/app/code/client.huggingface.py.tpl +0 -0
  43. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/cli/new/templates/app/code/client.jax.py.tpl +0 -0
  44. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/cli/new/templates/app/code/client.mlx.py.tpl +0 -0
  45. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/cli/new/templates/app/code/client.numpy.py.tpl +0 -0
  46. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -0
  47. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl +0 -0
  48. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -0
  49. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/cli/new/templates/app/code/dataset.baseline.py.tpl +0 -0
  50. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/cli/new/templates/app/code/flwr_tune/__init__.py +0 -0
  51. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/cli/new/templates/app/code/flwr_tune/client_app.py.tpl +0 -0
  52. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/cli/new/templates/app/code/flwr_tune/dataset.py.tpl +0 -0
  53. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/cli/new/templates/app/code/flwr_tune/models.py.tpl +0 -0
  54. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/cli/new/templates/app/code/flwr_tune/server_app.py.tpl +0 -0
  55. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/cli/new/templates/app/code/flwr_tune/strategy.py.tpl +0 -0
  56. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/cli/new/templates/app/code/model.baseline.py.tpl +0 -0
  57. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/cli/new/templates/app/code/server.baseline.py.tpl +0 -0
  58. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/cli/new/templates/app/code/server.huggingface.py.tpl +0 -0
  59. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/cli/new/templates/app/code/server.jax.py.tpl +0 -0
  60. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/cli/new/templates/app/code/server.mlx.py.tpl +0 -0
  61. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -0
  62. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -0
  63. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/cli/new/templates/app/code/server.sklearn.py.tpl +0 -0
  64. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -0
  65. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/cli/new/templates/app/code/strategy.baseline.py.tpl +0 -0
  66. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/cli/new/templates/app/code/task.huggingface.py.tpl +0 -0
  67. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/cli/new/templates/app/code/task.jax.py.tpl +0 -0
  68. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/cli/new/templates/app/code/task.mlx.py.tpl +0 -0
  69. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/cli/new/templates/app/code/task.numpy.py.tpl +0 -0
  70. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +0 -0
  71. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/cli/new/templates/app/code/task.sklearn.py.tpl +0 -0
  72. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/cli/new/templates/app/code/task.tensorflow.py.tpl +0 -0
  73. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/cli/new/templates/app/code/utils.baseline.py.tpl +0 -0
  74. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/cli/new/templates/app/pyproject.baseline.toml.tpl +0 -0
  75. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +0 -0
  76. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl +0 -0
  77. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/cli/new/templates/app/pyproject.jax.toml.tpl +0 -0
  78. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +0 -0
  79. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +0 -0
  80. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +0 -0
  81. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +0 -0
  82. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/cli/run/__init__.py +0 -0
  83. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/cli/run/run.py +0 -0
  84. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/cli/stop.py +0 -0
  85. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/cli/utils.py +0 -0
  86. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/client/__init__.py +0 -0
  87. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/client/app.py +0 -0
  88. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/client/client.py +0 -0
  89. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/client/client_app.py +0 -0
  90. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/client/clientapp/__init__.py +0 -0
  91. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/client/clientapp/app.py +0 -0
  92. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/client/clientapp/clientappio_servicer.py +0 -0
  93. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/client/clientapp/utils.py +0 -0
  94. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/client/dpfedavg_numpy_client.py +0 -0
  95. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/client/grpc_adapter_client/__init__.py +0 -0
  96. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/client/grpc_adapter_client/connection.py +0 -0
  97. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/client/grpc_client/__init__.py +0 -0
  98. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/client/grpc_client/connection.py +0 -0
  99. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/client/grpc_rere_client/__init__.py +0 -0
  100. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/client/grpc_rere_client/client_interceptor.py +0 -0
  101. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/client/grpc_rere_client/connection.py +0 -0
  102. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/client/grpc_rere_client/grpc_adapter.py +0 -0
  103. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/client/heartbeat.py +0 -0
  104. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/client/message_handler/__init__.py +0 -0
  105. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/client/message_handler/message_handler.py +0 -0
  106. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/client/message_handler/task_handler.py +0 -0
  107. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/client/mod/__init__.py +0 -0
  108. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/client/mod/centraldp_mods.py +0 -0
  109. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/client/mod/comms_mods.py +0 -0
  110. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
  111. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
  112. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
  113. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/client/mod/utils.py +0 -0
  114. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/client/nodestate/__init__.py +0 -0
  115. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/client/nodestate/in_memory_nodestate.py +0 -0
  116. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/client/nodestate/nodestate.py +0 -0
  117. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/client/nodestate/nodestate_factory.py +0 -0
  118. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/client/numpy_client.py +0 -0
  119. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/client/rest_client/__init__.py +0 -0
  120. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/client/rest_client/connection.py +0 -0
  121. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/client/run_info_store.py +0 -0
  122. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/client/supernode/__init__.py +0 -0
  123. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/client/supernode/app.py +0 -0
  124. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/client/typing.py +0 -0
  125. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/common/__init__.py +0 -0
  126. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/common/address.py +0 -0
  127. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/common/args.py +0 -0
  128. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/common/auth_plugin/__init__.py +0 -0
  129. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/common/auth_plugin/auth_plugin.py +0 -0
  130. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/common/config.py +0 -0
  131. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/common/constant.py +0 -0
  132. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/common/context.py +0 -0
  133. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/common/date.py +0 -0
  134. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/common/differential_privacy.py +0 -0
  135. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/common/differential_privacy_constants.py +0 -0
  136. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/common/dp.py +0 -0
  137. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/common/exit_handlers.py +0 -0
  138. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/common/grpc.py +0 -0
  139. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/common/logger.py +0 -0
  140. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/common/message.py +0 -0
  141. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/common/parameter.py +0 -0
  142. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/common/pyproject.py +0 -0
  143. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/common/record/__init__.py +0 -0
  144. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/common/record/configsrecord.py +0 -0
  145. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/common/record/conversion_utils.py +0 -0
  146. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/common/record/metricsrecord.py +0 -0
  147. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/common/record/parametersrecord.py +0 -0
  148. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/common/record/recordset.py +0 -0
  149. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/common/record/typeddict.py +0 -0
  150. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/common/recordset_compat.py +0 -0
  151. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/common/secure_aggregation/__init__.py +0 -0
  152. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
  153. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
  154. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -0
  155. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
  156. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/common/secure_aggregation/quantization.py +0 -0
  157. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
  158. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
  159. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/common/serde.py +0 -0
  160. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/common/telemetry.py +0 -0
  161. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/common/version.py +0 -0
  162. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/proto/__init__.py +0 -0
  163. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/proto/clientappio_pb2.py +0 -0
  164. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/proto/clientappio_pb2.pyi +0 -0
  165. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/proto/clientappio_pb2_grpc.py +0 -0
  166. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/proto/clientappio_pb2_grpc.pyi +0 -0
  167. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/proto/error_pb2.py +0 -0
  168. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/proto/error_pb2.pyi +0 -0
  169. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/proto/error_pb2_grpc.py +0 -0
  170. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/proto/error_pb2_grpc.pyi +0 -0
  171. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/proto/exec_pb2.py +0 -0
  172. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/proto/exec_pb2.pyi +0 -0
  173. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/proto/exec_pb2_grpc.py +0 -0
  174. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/proto/exec_pb2_grpc.pyi +0 -0
  175. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/proto/fab_pb2_grpc.py +0 -0
  176. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/proto/fab_pb2_grpc.pyi +0 -0
  177. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/proto/fleet_pb2.py +0 -0
  178. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/proto/fleet_pb2.pyi +0 -0
  179. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/proto/fleet_pb2_grpc.py +0 -0
  180. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
  181. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/proto/grpcadapter_pb2.py +0 -0
  182. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/proto/grpcadapter_pb2.pyi +0 -0
  183. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/proto/grpcadapter_pb2_grpc.py +0 -0
  184. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/proto/grpcadapter_pb2_grpc.pyi +0 -0
  185. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/proto/log_pb2.py +0 -0
  186. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/proto/log_pb2.pyi +0 -0
  187. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/proto/log_pb2_grpc.py +0 -0
  188. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/proto/log_pb2_grpc.pyi +0 -0
  189. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/proto/message_pb2.py +0 -0
  190. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/proto/message_pb2.pyi +0 -0
  191. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/proto/message_pb2_grpc.py +0 -0
  192. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/proto/message_pb2_grpc.pyi +0 -0
  193. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/proto/node_pb2.py +0 -0
  194. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/proto/node_pb2.pyi +0 -0
  195. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/proto/node_pb2_grpc.py +0 -0
  196. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/proto/node_pb2_grpc.pyi +0 -0
  197. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/proto/recordset_pb2.py +0 -0
  198. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/proto/recordset_pb2.pyi +0 -0
  199. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/proto/recordset_pb2_grpc.py +0 -0
  200. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/proto/recordset_pb2_grpc.pyi +0 -0
  201. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/proto/run_pb2.py +0 -0
  202. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/proto/run_pb2.pyi +0 -0
  203. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/proto/run_pb2_grpc.py +0 -0
  204. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/proto/run_pb2_grpc.pyi +0 -0
  205. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/proto/serverappio_pb2.py +0 -0
  206. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/proto/serverappio_pb2.pyi +0 -0
  207. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/proto/serverappio_pb2_grpc.py +0 -0
  208. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/proto/serverappio_pb2_grpc.pyi +0 -0
  209. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/proto/simulationio_pb2.py +0 -0
  210. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/proto/simulationio_pb2.pyi +0 -0
  211. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/proto/simulationio_pb2_grpc.py +0 -0
  212. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/proto/simulationio_pb2_grpc.pyi +0 -0
  213. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/proto/task_pb2.py +0 -0
  214. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/proto/task_pb2.pyi +0 -0
  215. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/proto/task_pb2_grpc.py +0 -0
  216. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/proto/task_pb2_grpc.pyi +0 -0
  217. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/proto/transport_pb2.py +0 -0
  218. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/proto/transport_pb2.pyi +0 -0
  219. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/proto/transport_pb2_grpc.py +0 -0
  220. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
  221. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/py.typed +0 -0
  222. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/__init__.py +0 -0
  223. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/app.py +0 -0
  224. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/client_manager.py +0 -0
  225. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/client_proxy.py +0 -0
  226. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/compat/__init__.py +0 -0
  227. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/compat/app.py +0 -0
  228. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/compat/driver_client_proxy.py +0 -0
  229. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/compat/legacy_context.py +0 -0
  230. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/criterion.py +0 -0
  231. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/driver/__init__.py +0 -0
  232. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/driver/driver.py +0 -0
  233. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/driver/inmemory_driver.py +0 -0
  234. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/history.py +0 -0
  235. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/run_serverapp.py +0 -0
  236. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/server.py +0 -0
  237. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/server_app.py +0 -0
  238. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/server_config.py +0 -0
  239. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/serverapp/__init__.py +0 -0
  240. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/serverapp_components.py +0 -0
  241. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/strategy/__init__.py +0 -0
  242. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/strategy/aggregate.py +0 -0
  243. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/strategy/bulyan.py +0 -0
  244. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
  245. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
  246. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
  247. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
  248. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
  249. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/strategy/fedadagrad.py +0 -0
  250. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/strategy/fedadam.py +0 -0
  251. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/strategy/fedavg.py +0 -0
  252. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/strategy/fedavg_android.py +0 -0
  253. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/strategy/fedavgm.py +0 -0
  254. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/strategy/fedmedian.py +0 -0
  255. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/strategy/fedopt.py +0 -0
  256. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/strategy/fedprox.py +0 -0
  257. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
  258. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
  259. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
  260. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
  261. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/strategy/fedyogi.py +0 -0
  262. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/strategy/krum.py +0 -0
  263. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/strategy/qfedavg.py +0 -0
  264. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/strategy/strategy.py +0 -0
  265. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/superlink/__init__.py +0 -0
  266. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/superlink/driver/__init__.py +0 -0
  267. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/superlink/driver/serverappio_grpc.py +0 -0
  268. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/superlink/ffs/__init__.py +0 -0
  269. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/superlink/ffs/disk_ffs.py +0 -0
  270. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/superlink/ffs/ffs.py +0 -0
  271. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/superlink/ffs/ffs_factory.py +0 -0
  272. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/superlink/fleet/__init__.py +0 -0
  273. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/superlink/fleet/grpc_adapter/__init__.py +0 -0
  274. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +0 -0
  275. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
  276. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
  277. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
  278. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
  279. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +0 -0
  280. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
  281. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +0 -0
  282. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +0 -0
  283. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
  284. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/superlink/fleet/message_handler/message_handler.py +0 -0
  285. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
  286. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +0 -0
  287. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
  288. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
  289. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
  290. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +0 -0
  291. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/superlink/fleet/vce/vce_api.py +0 -0
  292. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/superlink/linkstate/__init__.py +0 -0
  293. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/superlink/linkstate/in_memory_linkstate.py +0 -0
  294. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/superlink/linkstate/linkstate.py +0 -0
  295. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/superlink/linkstate/linkstate_factory.py +0 -0
  296. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/superlink/linkstate/sqlite_linkstate.py +0 -0
  297. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/superlink/linkstate/utils.py +0 -0
  298. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/superlink/simulation/__init__.py +0 -0
  299. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/superlink/simulation/simulationio_grpc.py +0 -0
  300. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/superlink/simulation/simulationio_servicer.py +0 -0
  301. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/typing.py +0 -0
  302. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/utils/__init__.py +0 -0
  303. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/utils/tensorboard.py +0 -0
  304. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/utils/validator.py +0 -0
  305. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/workflow/__init__.py +0 -0
  306. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/workflow/constant.py +0 -0
  307. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/workflow/default_workflows.py +0 -0
  308. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
  309. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
  310. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +0 -0
  311. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/simulation/__init__.py +0 -0
  312. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/simulation/app.py +0 -0
  313. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/simulation/legacy_app.py +0 -0
  314. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/simulation/ray_transport/__init__.py +0 -0
  315. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
  316. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
  317. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/simulation/ray_transport/utils.py +0 -0
  318. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/simulation/run_simulation.py +0 -0
  319. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/simulation/simulationio_connection.py +0 -0
  320. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/superexec/__init__.py +0 -0
  321. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/superexec/app.py +0 -0
  322. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/superexec/deployment.py +0 -0
  323. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/superexec/exec_grpc.py +0 -0
  324. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/superexec/exec_servicer.py +0 -0
  325. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/superexec/exec_user_auth_interceptor.py +0 -0
  326. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/src/py/flwr/superexec/executor.py +0 -0
  327. {flwr_nightly-1.14.0.dev20241211 → flwr_nightly-1.14.0.dev20241212}/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.dev20241211
3
+ Version: 1.14.0.dev20241212
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.dev20241211"
7
+ version = "1.14.0.dev20241212"
8
8
  description = "Flower: A Friendly Federated AI Framework"
9
9
  license = "Apache-2.0"
10
10
  authors = ["The Flower Authors <hello@flower.ai>"]
@@ -81,7 +81,7 @@ def render_template(template: str, data: dict[str, str]) -> str:
81
81
  def create_file(file_path: Path, content: str) -> None:
82
82
  """Create file including all nessecary directories and write content into file."""
83
83
  file_path.parent.mkdir(exist_ok=True)
84
- file_path.write_text(content)
84
+ file_path.write_text(content, encoding="utf-8")
85
85
 
86
86
 
87
87
  def render_and_create(file_path: Path, template: str, context: dict[str, str]) -> None:
@@ -10,8 +10,7 @@ license = "Apache-2.0"
10
10
  dependencies = [
11
11
  "flwr[simulation]>=1.13.1",
12
12
  "flwr-datasets[vision]>=0.3.0",
13
- "mlx==0.16.1",
14
- "numpy==1.24.4",
13
+ "mlx==0.21.1",
15
14
  ]
16
15
 
17
16
  [tool.hatch.build.targets.wheel]
@@ -136,7 +136,7 @@ class LocalDpMod:
136
136
  fit_res.parameters = ndarrays_to_parameters(client_to_server_params)
137
137
 
138
138
  # Add noise to model params
139
- add_localdp_gaussian_noise_to_params(
139
+ fit_res.parameters = add_localdp_gaussian_noise_to_params(
140
140
  fit_res.parameters, self.sensitivity, self.epsilon, self.delta
141
141
  )
142
142
 
@@ -21,6 +21,7 @@ import sys
21
21
  from importlib.util import find_spec
22
22
  from logging import WARN
23
23
  from pathlib import Path
24
+ from threading import Lock
24
25
  from typing import Any, Optional, Union
25
26
 
26
27
  from .logger import log
@@ -34,6 +35,7 @@ attribute.
34
35
 
35
36
 
36
37
  _current_sys_path: Optional[str] = None
38
+ _import_lock = Lock()
37
39
 
38
40
 
39
41
  def validate(
@@ -146,60 +148,61 @@ def load_app( # pylint: disable= too-many-branches
146
148
  - This function will modify `sys.path` by inserting the provided `project_dir`
147
149
  and removing the previously inserted `project_dir`.
148
150
  """
149
- valid, error_msg = validate(module_attribute_str, check_module=False)
150
- if not valid and error_msg:
151
- raise error_type(error_msg) from None
152
-
153
- module_str, _, attributes_str = module_attribute_str.partition(":")
154
-
155
- try:
156
- # Initialize project path
157
- if project_dir is None:
158
- project_dir = Path.cwd()
159
- project_dir = Path(project_dir).absolute()
160
-
161
- # Unload modules if the project directory has changed
162
- if _current_sys_path and _current_sys_path != str(project_dir):
163
- _unload_modules(Path(_current_sys_path))
164
-
165
- # Set the system path
166
- _set_sys_path(project_dir)
167
-
168
- # Import the module
169
- if module_str not in sys.modules:
170
- module = importlib.import_module(module_str)
171
- # Hack: `tabnet` does not work with `importlib.reload`
172
- elif "tabnet" in sys.modules:
173
- log(
174
- WARN,
175
- "Cannot reload module `%s` from disk due to compatibility issues "
176
- "with the `tabnet` library. The module will be loaded from the "
177
- "cache instead. If you experience issues, consider restarting "
178
- "the application.",
179
- module_str,
180
- )
181
- module = sys.modules[module_str]
182
- else:
183
- module = sys.modules[module_str]
184
- _reload_modules(project_dir)
185
-
186
- except ModuleNotFoundError as err:
187
- raise error_type(
188
- f"Unable to load module {module_str}{OBJECT_REF_HELP_STR}",
189
- ) from err
190
-
191
- # Recursively load attribute
192
- attribute = module
193
- try:
194
- for attribute_str in attributes_str.split("."):
195
- attribute = getattr(attribute, attribute_str)
196
- except AttributeError as err:
197
- raise error_type(
198
- f"Unable to load attribute {attributes_str} from module {module_str}"
199
- f"{OBJECT_REF_HELP_STR}",
200
- ) from err
201
-
202
- return attribute
151
+ with _import_lock:
152
+ valid, error_msg = validate(module_attribute_str, check_module=False)
153
+ if not valid and error_msg:
154
+ raise error_type(error_msg) from None
155
+
156
+ module_str, _, attributes_str = module_attribute_str.partition(":")
157
+
158
+ try:
159
+ # Initialize project path
160
+ if project_dir is None:
161
+ project_dir = Path.cwd()
162
+ project_dir = Path(project_dir).absolute()
163
+
164
+ # Unload modules if the project directory has changed
165
+ if _current_sys_path and _current_sys_path != str(project_dir):
166
+ _unload_modules(Path(_current_sys_path))
167
+
168
+ # Set the system path
169
+ _set_sys_path(project_dir)
170
+
171
+ # Import the module
172
+ if module_str not in sys.modules:
173
+ module = importlib.import_module(module_str)
174
+ # Hack: `tabnet` does not work with `importlib.reload`
175
+ elif "tabnet" in sys.modules:
176
+ log(
177
+ WARN,
178
+ "Cannot reload module `%s` from disk due to compatibility issues "
179
+ "with the `tabnet` library. The module will be loaded from the "
180
+ "cache instead. If you experience issues, consider restarting "
181
+ "the application.",
182
+ module_str,
183
+ )
184
+ module = sys.modules[module_str]
185
+ else:
186
+ module = sys.modules[module_str]
187
+ _reload_modules(project_dir)
188
+
189
+ except ModuleNotFoundError as err:
190
+ raise error_type(
191
+ f"Unable to load module {module_str}{OBJECT_REF_HELP_STR}",
192
+ ) from err
193
+
194
+ # Recursively load attribute
195
+ attribute = module
196
+ try:
197
+ for attribute_str in attributes_str.split("."):
198
+ attribute = getattr(attribute, attribute_str)
199
+ except AttributeError as err:
200
+ raise error_type(
201
+ f"Unable to load attribute {attributes_str} from module {module_str}"
202
+ f"{OBJECT_REF_HELP_STR}",
203
+ ) from err
204
+
205
+ return attribute
203
206
 
204
207
 
205
208
  def _unload_modules(project_dir: Path) -> None:
@@ -20,8 +20,17 @@ import random
20
20
  import time
21
21
  from collections.abc import Generator, Iterable
22
22
  from dataclasses import dataclass
23
+ from logging import INFO, WARN
23
24
  from typing import Any, Callable, Optional, Union, cast
24
25
 
26
+ import grpc
27
+
28
+ from flwr.common.constant import MAX_RETRY_DELAY
29
+ from flwr.common.logger import log
30
+ from flwr.common.typing import RunNotRunningException
31
+ from flwr.proto.clientappio_pb2_grpc import ClientAppIoStub
32
+ from flwr.proto.serverappio_pb2_grpc import ServerAppIoStub
33
+
25
34
 
26
35
  def exponential(
27
36
  base_delay: float = 1,
@@ -303,3 +312,69 @@ class RetryInvoker:
303
312
  # Trigger success event
304
313
  try_call_event_handler(self.on_success)
305
314
  return ret
315
+
316
+
317
+ def _make_simple_grpc_retry_invoker() -> RetryInvoker:
318
+ """Create a simple gRPC retry invoker."""
319
+
320
+ def _on_sucess(retry_state: RetryState) -> None:
321
+ if retry_state.tries > 1:
322
+ log(
323
+ INFO,
324
+ "Connection successful after %.2f seconds and %s tries.",
325
+ retry_state.elapsed_time,
326
+ retry_state.tries,
327
+ )
328
+
329
+ def _on_backoff(retry_state: RetryState) -> None:
330
+ if retry_state.tries == 1:
331
+ log(WARN, "Connection attempt failed, retrying...")
332
+ else:
333
+ log(
334
+ WARN,
335
+ "Connection attempt failed, retrying in %.2f seconds",
336
+ retry_state.actual_wait,
337
+ )
338
+
339
+ def _on_giveup(retry_state: RetryState) -> None:
340
+ if retry_state.tries > 1:
341
+ log(
342
+ WARN,
343
+ "Giving up reconnection after %.2f seconds and %s tries.",
344
+ retry_state.elapsed_time,
345
+ retry_state.tries,
346
+ )
347
+
348
+ def _should_giveup_fn(e: Exception) -> bool:
349
+ if e.code() == grpc.StatusCode.PERMISSION_DENIED: # type: ignore
350
+ raise RunNotRunningException
351
+ if e.code() == grpc.StatusCode.UNAVAILABLE: # type: ignore
352
+ return False
353
+ return True
354
+
355
+ return RetryInvoker(
356
+ wait_gen_factory=lambda: exponential(max_delay=MAX_RETRY_DELAY),
357
+ recoverable_exceptions=grpc.RpcError,
358
+ max_tries=None,
359
+ max_time=None,
360
+ on_success=_on_sucess,
361
+ on_backoff=_on_backoff,
362
+ on_giveup=_on_giveup,
363
+ should_giveup=_should_giveup_fn,
364
+ )
365
+
366
+
367
+ def _wrap_stub(
368
+ stub: Union[ServerAppIoStub, ClientAppIoStub], retry_invoker: RetryInvoker
369
+ ) -> None:
370
+ """Wrap a gRPC stub with a retry invoker."""
371
+
372
+ def make_lambda(original_method: Any) -> Any:
373
+ return lambda *args, **kwargs: retry_invoker.invoke(
374
+ original_method, *args, **kwargs
375
+ )
376
+
377
+ for method_name in vars(stub):
378
+ method = getattr(stub, method_name)
379
+ if callable(method):
380
+ setattr(stub, method_name, make_lambda(method))
@@ -254,3 +254,7 @@ class Fab:
254
254
 
255
255
  hash_str: str
256
256
  content: bytes
257
+
258
+
259
+ class RunNotRunningException(BaseException):
260
+ """Raised when a run is not running."""
@@ -15,7 +15,7 @@ _sym_db = _symbol_database.Default()
15
15
  from flwr.proto import node_pb2 as flwr_dot_proto_dot_node__pb2
16
16
 
17
17
 
18
- DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x14\x66lwr/proto/fab.proto\x12\nflwr.proto\x1a\x15\x66lwr/proto/node.proto\"(\n\x03\x46\x61\x62\x12\x10\n\x08hash_str\x18\x01 \x01(\t\x12\x0f\n\x07\x63ontent\x18\x02 \x01(\x0c\"A\n\rGetFabRequest\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\x12\x10\n\x08hash_str\x18\x02 \x01(\t\".\n\x0eGetFabResponse\x12\x1c\n\x03\x66\x61\x62\x18\x01 \x01(\x0b\x32\x0f.flwr.proto.Fabb\x06proto3')
18
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x14\x66lwr/proto/fab.proto\x12\nflwr.proto\x1a\x15\x66lwr/proto/node.proto\"(\n\x03\x46\x61\x62\x12\x10\n\x08hash_str\x18\x01 \x01(\t\x12\x0f\n\x07\x63ontent\x18\x02 \x01(\x0c\"Q\n\rGetFabRequest\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\x12\x10\n\x08hash_str\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\x04\".\n\x0eGetFabResponse\x12\x1c\n\x03\x66\x61\x62\x18\x01 \x01(\x0b\x32\x0f.flwr.proto.Fabb\x06proto3')
19
19
 
20
20
  _globals = globals()
21
21
  _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
@@ -25,7 +25,7 @@ if _descriptor._USE_C_DESCRIPTORS == False:
25
25
  _globals['_FAB']._serialized_start=59
26
26
  _globals['_FAB']._serialized_end=99
27
27
  _globals['_GETFABREQUEST']._serialized_start=101
28
- _globals['_GETFABREQUEST']._serialized_end=166
29
- _globals['_GETFABRESPONSE']._serialized_start=168
30
- _globals['_GETFABRESPONSE']._serialized_end=214
28
+ _globals['_GETFABREQUEST']._serialized_end=182
29
+ _globals['_GETFABRESPONSE']._serialized_start=184
30
+ _globals['_GETFABRESPONSE']._serialized_end=230
31
31
  # @@protoc_insertion_point(module_scope)
@@ -36,16 +36,19 @@ class GetFabRequest(google.protobuf.message.Message):
36
36
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
37
37
  NODE_FIELD_NUMBER: builtins.int
38
38
  HASH_STR_FIELD_NUMBER: builtins.int
39
+ RUN_ID_FIELD_NUMBER: builtins.int
39
40
  @property
40
41
  def node(self) -> flwr.proto.node_pb2.Node: ...
41
42
  hash_str: typing.Text
43
+ run_id: builtins.int
42
44
  def __init__(self,
43
45
  *,
44
46
  node: typing.Optional[flwr.proto.node_pb2.Node] = ...,
45
47
  hash_str: typing.Text = ...,
48
+ run_id: builtins.int = ...,
46
49
  ) -> None: ...
47
50
  def HasField(self, field_name: typing_extensions.Literal["node",b"node"]) -> builtins.bool: ...
48
- def ClearField(self, field_name: typing_extensions.Literal["hash_str",b"hash_str","node",b"node"]) -> None: ...
51
+ def ClearField(self, field_name: typing_extensions.Literal["hash_str",b"hash_str","node",b"node","run_id",b"run_id"]) -> None: ...
49
52
  global___GetFabRequest = GetFabRequest
50
53
 
51
54
  class GetFabResponse(google.protobuf.message.Message):
@@ -17,6 +17,8 @@
17
17
 
18
18
  import threading
19
19
 
20
+ from flwr.common.typing import RunNotRunningException
21
+
20
22
  from ..client_manager import ClientManager
21
23
  from ..compat.driver_client_proxy import DriverClientProxy
22
24
  from ..driver import Driver
@@ -74,7 +76,11 @@ def _update_client_manager(
74
76
  # Loop until the driver is disconnected
75
77
  registered_nodes: dict[int, DriverClientProxy] = {}
76
78
  while not f_stop.is_set():
77
- all_node_ids = set(driver.get_node_ids())
79
+ try:
80
+ all_node_ids = set(driver.get_node_ids())
81
+ except RunNotRunningException:
82
+ f_stop.set()
83
+ break
78
84
  dead_nodes = set(registered_nodes).difference(all_node_ids)
79
85
  new_nodes = all_node_ids.difference(registered_nodes)
80
86
 
@@ -17,16 +17,16 @@
17
17
  import time
18
18
  import warnings
19
19
  from collections.abc import Iterable
20
- from logging import DEBUG, INFO, WARN, WARNING
21
- from typing import Any, Optional, cast
20
+ from logging import DEBUG, WARNING
21
+ from typing import 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 MAX_RETRY_DELAY, SERVERAPPIO_API_DEFAULT_CLIENT_ADDRESS
26
+ from flwr.common.constant import 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
+ from flwr.common.retry_invoker import _make_simple_grpc_retry_invoker, _wrap_stub
30
30
  from flwr.common.serde import message_from_taskres, message_to_taskins, run_from_proto
31
31
  from flwr.common.typing import Run
32
32
  from flwr.proto.node_pb2 import Node # pylint: disable=E0611
@@ -262,60 +262,3 @@ class GrpcDriver(Driver):
262
262
  return
263
263
  # Disconnect
264
264
  self._disconnect()
265
-
266
-
267
- def _make_simple_grpc_retry_invoker() -> RetryInvoker:
268
- """Create a simple gRPC retry invoker."""
269
-
270
- def _on_sucess(retry_state: RetryState) -> None:
271
- if retry_state.tries > 1:
272
- log(
273
- INFO,
274
- "Connection successful after %.2f seconds and %s tries.",
275
- retry_state.elapsed_time,
276
- retry_state.tries,
277
- )
278
-
279
- def _on_backoff(retry_state: RetryState) -> None:
280
- if retry_state.tries == 1:
281
- log(WARN, "Connection attempt failed, retrying...")
282
- else:
283
- log(
284
- WARN,
285
- "Connection attempt failed, retrying in %.2f seconds",
286
- retry_state.actual_wait,
287
- )
288
-
289
- def _on_giveup(retry_state: RetryState) -> None:
290
- if retry_state.tries > 1:
291
- log(
292
- WARN,
293
- "Giving up reconnection after %.2f seconds and %s tries.",
294
- retry_state.elapsed_time,
295
- retry_state.tries,
296
- )
297
-
298
- return RetryInvoker(
299
- wait_gen_factory=lambda: exponential(max_delay=MAX_RETRY_DELAY),
300
- recoverable_exceptions=grpc.RpcError,
301
- max_tries=None,
302
- max_time=None,
303
- on_success=_on_sucess,
304
- on_backoff=_on_backoff,
305
- on_giveup=_on_giveup,
306
- should_giveup=lambda e: e.code() != grpc.StatusCode.UNAVAILABLE, # type: ignore
307
- )
308
-
309
-
310
- def _wrap_stub(stub: ServerAppIoStub, retry_invoker: RetryInvoker) -> None:
311
- """Wrap the gRPC stub with a retry invoker."""
312
-
313
- def make_lambda(original_method: Any) -> Any:
314
- return lambda *args, **kwargs: retry_invoker.invoke(
315
- original_method, *args, **kwargs
316
- )
317
-
318
- for method_name in vars(stub):
319
- method = getattr(stub, method_name)
320
- if callable(method):
321
- setattr(stub, method_name, make_lambda(method))
@@ -50,7 +50,7 @@ from flwr.common.serde import (
50
50
  run_from_proto,
51
51
  run_status_to_proto,
52
52
  )
53
- from flwr.common.typing import RunStatus
53
+ from flwr.common.typing import RunNotRunningException, RunStatus
54
54
  from flwr.proto.run_pb2 import UpdateRunStatusRequest # pylint: disable=E0611
55
55
  from flwr.proto.serverappio_pb2 import ( # pylint: disable=E0611
56
56
  PullServerAppInputsRequest,
@@ -96,7 +96,7 @@ def flwr_serverapp() -> None:
96
96
  restore_output()
97
97
 
98
98
 
99
- def run_serverapp( # pylint: disable=R0914, disable=W0212
99
+ def run_serverapp( # pylint: disable=R0914, disable=W0212, disable=R0915
100
100
  serverappio_api_address: str,
101
101
  log_queue: Queue[Optional[str]],
102
102
  run_once: bool,
@@ -187,6 +187,12 @@ def run_serverapp( # pylint: disable=R0914, disable=W0212
187
187
 
188
188
  run_status = RunStatus(Status.FINISHED, SubStatus.COMPLETED, "")
189
189
 
190
+ except RunNotRunningException:
191
+ log(INFO, "")
192
+ log(INFO, "Run ID %s stopped.", run.run_id)
193
+ log(INFO, "")
194
+ run_status = None
195
+
190
196
  except Exception as ex: # pylint: disable=broad-exception-caught
191
197
  exc_entity = "ServerApp"
192
198
  log(ERROR, "%s raised an exception", exc_entity, exc_info=ex)
@@ -70,6 +70,7 @@ from flwr.proto.task_pb2 import TaskRes # pylint: disable=E0611
70
70
  from flwr.server.superlink.ffs.ffs import Ffs
71
71
  from flwr.server.superlink.ffs.ffs_factory import FfsFactory
72
72
  from flwr.server.superlink.linkstate import LinkState, LinkStateFactory
73
+ from flwr.server.superlink.utils import abort_if
73
74
  from flwr.server.utils.validator import validate_task_ins_or_res
74
75
 
75
76
 
@@ -88,7 +89,18 @@ class ServerAppIoServicer(serverappio_pb2_grpc.ServerAppIoServicer):
88
89
  ) -> GetNodesResponse:
89
90
  """Get available nodes."""
90
91
  log(DEBUG, "ServerAppIoServicer.GetNodes")
92
+
93
+ # Init state
91
94
  state: LinkState = self.state_factory.state()
95
+
96
+ # Abort if the run is not running
97
+ abort_if(
98
+ request.run_id,
99
+ [Status.PENDING, Status.STARTING, Status.FINISHED],
100
+ state,
101
+ context,
102
+ )
103
+
92
104
  all_ids: set[int] = state.get_nodes(request.run_id)
93
105
  nodes: list[Node] = [
94
106
  Node(node_id=node_id, anonymous=False) for node_id in all_ids
@@ -126,6 +138,17 @@ class ServerAppIoServicer(serverappio_pb2_grpc.ServerAppIoServicer):
126
138
  """Push a set of TaskIns."""
127
139
  log(DEBUG, "ServerAppIoServicer.PushTaskIns")
128
140
 
141
+ # Init state
142
+ state: LinkState = self.state_factory.state()
143
+
144
+ # Abort if the run is not running
145
+ abort_if(
146
+ request.run_id,
147
+ [Status.PENDING, Status.STARTING, Status.FINISHED],
148
+ state,
149
+ context,
150
+ )
151
+
129
152
  # Set pushed_at (timestamp in seconds)
130
153
  pushed_at = time.time()
131
154
  for task_ins in request.task_ins_list:
@@ -137,9 +160,6 @@ class ServerAppIoServicer(serverappio_pb2_grpc.ServerAppIoServicer):
137
160
  validation_errors = validate_task_ins_or_res(task_ins)
138
161
  _raise_if(bool(validation_errors), ", ".join(validation_errors))
139
162
 
140
- # Init state
141
- state: LinkState = self.state_factory.state()
142
-
143
163
  # Store each TaskIns
144
164
  task_ids: list[Optional[UUID]] = []
145
165
  for task_ins in request.task_ins_list:
@@ -156,12 +176,20 @@ class ServerAppIoServicer(serverappio_pb2_grpc.ServerAppIoServicer):
156
176
  """Pull a set of TaskRes."""
157
177
  log(DEBUG, "ServerAppIoServicer.PullTaskRes")
158
178
 
159
- # Convert each task_id str to UUID
160
- task_ids: set[UUID] = {UUID(task_id) for task_id in request.task_ids}
161
-
162
179
  # Init state
163
180
  state: LinkState = self.state_factory.state()
164
181
 
182
+ # Abort if the run is not running
183
+ abort_if(
184
+ request.run_id,
185
+ [Status.PENDING, Status.STARTING, Status.FINISHED],
186
+ state,
187
+ context,
188
+ )
189
+
190
+ # Convert each task_id str to UUID
191
+ task_ids: set[UUID] = {UUID(task_id) for task_id in request.task_ids}
192
+
165
193
  # Register callback
166
194
  def on_rpc_done() -> None:
167
195
  log(
@@ -258,7 +286,18 @@ class ServerAppIoServicer(serverappio_pb2_grpc.ServerAppIoServicer):
258
286
  ) -> PushServerAppOutputsResponse:
259
287
  """Push ServerApp process outputs."""
260
288
  log(DEBUG, "ServerAppIoServicer.PushServerAppOutputs")
289
+
290
+ # Init state
261
291
  state = self.state_factory.state()
292
+
293
+ # Abort if the run is not running
294
+ abort_if(
295
+ request.run_id,
296
+ [Status.PENDING, Status.STARTING, Status.FINISHED],
297
+ state,
298
+ context,
299
+ )
300
+
262
301
  state.set_serverapp_context(request.run_id, context_from_proto(request.context))
263
302
  return PushServerAppOutputsResponse()
264
303
 
@@ -267,8 +306,13 @@ class ServerAppIoServicer(serverappio_pb2_grpc.ServerAppIoServicer):
267
306
  ) -> UpdateRunStatusResponse:
268
307
  """Update the status of a run."""
269
308
  log(DEBUG, "ServerAppIoServicer.UpdateRunStatus")
309
+
310
+ # Init state
270
311
  state = self.state_factory.state()
271
312
 
313
+ # Abort if the run is finished
314
+ abort_if(request.run_id, [Status.FINISHED], state, context)
315
+
272
316
  # Update the run status
273
317
  state.update_run_status(
274
318
  run_id=request.run_id, new_status=run_status_from_proto(request.run_status)
@@ -0,0 +1,65 @@
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
+ """SuperLink utilities."""
16
+
17
+
18
+ from typing import Union
19
+
20
+ import grpc
21
+
22
+ from flwr.common.constant import Status, SubStatus
23
+ from flwr.common.typing import RunStatus
24
+ from flwr.server.superlink.linkstate import LinkState
25
+
26
+ _STATUS_TO_MSG = {
27
+ Status.PENDING: "Run is pending.",
28
+ Status.STARTING: "Run is starting.",
29
+ Status.RUNNING: "Run is running.",
30
+ Status.FINISHED: "Run is finished.",
31
+ }
32
+
33
+
34
+ def check_abort(
35
+ run_id: int,
36
+ abort_status_list: list[str],
37
+ state: LinkState,
38
+ ) -> Union[str, None]:
39
+ """Check if the status of the provided `run_id` is in `abort_status_list`."""
40
+ run_status: RunStatus = state.get_run_status({run_id})[run_id]
41
+
42
+ if run_status.status in abort_status_list:
43
+ msg = _STATUS_TO_MSG[run_status.status]
44
+ if run_status.sub_status == SubStatus.STOPPED:
45
+ msg += " Stopped by user."
46
+ return msg
47
+
48
+ return None
49
+
50
+
51
+ def abort_grpc_context(msg: Union[str, None], context: grpc.ServicerContext) -> None:
52
+ """Abort context with statuscode PERMISSION_DENIED if `msg` is not None."""
53
+ if msg is not None:
54
+ context.abort(grpc.StatusCode.PERMISSION_DENIED, msg)
55
+
56
+
57
+ def abort_if(
58
+ run_id: int,
59
+ abort_status_list: list[str],
60
+ state: LinkState,
61
+ context: grpc.ServicerContext,
62
+ ) -> None:
63
+ """Abort context if status of the provided `run_id` is in `abort_status_list`."""
64
+ msg = check_abort(run_id, abort_status_list, state)
65
+ abort_grpc_context(msg, context)