flwr-nightly 1.13.0.dev20241022__tar.gz → 1.13.0.dev20241023__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 (310) hide show
  1. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/PKG-INFO +1 -1
  2. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/pyproject.toml +1 -1
  3. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/client/app.py +2 -3
  4. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/client/supernode/app.py +6 -8
  5. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/common/constant.py +29 -0
  6. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/common/typing.py +9 -0
  7. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/app.py +70 -1
  8. flwr_nightly-1.13.0.dev20241023/src/py/flwr/server/serverapp/app.py +78 -0
  9. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/superlink/linkstate/in_memory_linkstate.py +101 -11
  10. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/superlink/linkstate/linkstate.py +49 -1
  11. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/superlink/linkstate/sqlite_linkstate.py +122 -21
  12. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/superlink/linkstate/utils.py +57 -1
  13. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/simulation/run_simulation.py +12 -4
  14. flwr_nightly-1.13.0.dev20241022/src/py/flwr/server/serverapp/app.py +0 -20
  15. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/LICENSE +0 -0
  16. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/README.md +0 -0
  17. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/__init__.py +0 -0
  18. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/__init__.py +0 -0
  19. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/app.py +0 -0
  20. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/build.py +0 -0
  21. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/config_utils.py +0 -0
  22. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/example.py +0 -0
  23. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/install.py +0 -0
  24. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/log.py +0 -0
  25. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/__init__.py +0 -0
  26. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/new.py +0 -0
  27. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/__init__.py +0 -0
  28. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/.gitignore.tpl +0 -0
  29. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/LICENSE.tpl +0 -0
  30. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/README.baseline.md.tpl +0 -0
  31. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/README.flowertune.md.tpl +0 -0
  32. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/README.md.tpl +0 -0
  33. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/__init__.py +0 -0
  34. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/code/__init__.baseline.py.tpl +0 -0
  35. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
  36. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
  37. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/code/client.baseline.py.tpl +0 -0
  38. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/code/client.huggingface.py.tpl +0 -0
  39. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/code/client.jax.py.tpl +0 -0
  40. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/code/client.mlx.py.tpl +0 -0
  41. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/code/client.numpy.py.tpl +0 -0
  42. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -0
  43. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl +0 -0
  44. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -0
  45. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/code/dataset.baseline.py.tpl +0 -0
  46. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/code/flwr_tune/__init__.py +0 -0
  47. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/code/flwr_tune/client_app.py.tpl +0 -0
  48. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/code/flwr_tune/dataset.py.tpl +0 -0
  49. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/code/flwr_tune/models.py.tpl +0 -0
  50. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/code/flwr_tune/server_app.py.tpl +0 -0
  51. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/code/flwr_tune/strategy.py.tpl +0 -0
  52. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/code/model.baseline.py.tpl +0 -0
  53. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/code/server.baseline.py.tpl +0 -0
  54. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/code/server.huggingface.py.tpl +0 -0
  55. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/code/server.jax.py.tpl +0 -0
  56. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/code/server.mlx.py.tpl +0 -0
  57. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -0
  58. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -0
  59. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/code/server.sklearn.py.tpl +0 -0
  60. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -0
  61. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/code/strategy.baseline.py.tpl +0 -0
  62. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/code/task.huggingface.py.tpl +0 -0
  63. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/code/task.jax.py.tpl +0 -0
  64. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/code/task.mlx.py.tpl +0 -0
  65. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/code/task.numpy.py.tpl +0 -0
  66. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +0 -0
  67. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/code/task.sklearn.py.tpl +0 -0
  68. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/code/task.tensorflow.py.tpl +0 -0
  69. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/code/utils.baseline.py.tpl +0 -0
  70. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/pyproject.baseline.toml.tpl +0 -0
  71. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +0 -0
  72. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl +0 -0
  73. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/pyproject.jax.toml.tpl +0 -0
  74. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +0 -0
  75. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +0 -0
  76. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +0 -0
  77. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +0 -0
  78. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +0 -0
  79. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/run/__init__.py +0 -0
  80. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/run/run.py +0 -0
  81. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/utils.py +0 -0
  82. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/client/__init__.py +0 -0
  83. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/client/client.py +0 -0
  84. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/client/client_app.py +0 -0
  85. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/client/clientapp/__init__.py +0 -0
  86. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/client/clientapp/app.py +0 -0
  87. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/client/clientapp/clientappio_servicer.py +0 -0
  88. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/client/clientapp/utils.py +0 -0
  89. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/client/dpfedavg_numpy_client.py +0 -0
  90. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/client/grpc_adapter_client/__init__.py +0 -0
  91. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/client/grpc_adapter_client/connection.py +0 -0
  92. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/client/grpc_client/__init__.py +0 -0
  93. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/client/grpc_client/connection.py +0 -0
  94. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/client/grpc_rere_client/__init__.py +0 -0
  95. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/client/grpc_rere_client/client_interceptor.py +0 -0
  96. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/client/grpc_rere_client/connection.py +0 -0
  97. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/client/grpc_rere_client/grpc_adapter.py +0 -0
  98. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/client/heartbeat.py +0 -0
  99. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/client/message_handler/__init__.py +0 -0
  100. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/client/message_handler/message_handler.py +0 -0
  101. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/client/message_handler/task_handler.py +0 -0
  102. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/client/mod/__init__.py +0 -0
  103. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/client/mod/centraldp_mods.py +0 -0
  104. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/client/mod/comms_mods.py +0 -0
  105. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/client/mod/localdp_mod.py +0 -0
  106. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
  107. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
  108. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
  109. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/client/mod/utils.py +0 -0
  110. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/client/node_state_tests.py +0 -0
  111. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/client/numpy_client.py +0 -0
  112. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/client/rest_client/__init__.py +0 -0
  113. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/client/rest_client/connection.py +0 -0
  114. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/client/run_info_store.py +0 -0
  115. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/client/supernode/__init__.py +0 -0
  116. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/client/typing.py +0 -0
  117. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/common/__init__.py +0 -0
  118. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/common/address.py +0 -0
  119. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/common/config.py +0 -0
  120. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/common/context.py +0 -0
  121. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/common/date.py +0 -0
  122. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/common/differential_privacy.py +0 -0
  123. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/common/differential_privacy_constants.py +0 -0
  124. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/common/dp.py +0 -0
  125. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/common/exit_handlers.py +0 -0
  126. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/common/grpc.py +0 -0
  127. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/common/logger.py +0 -0
  128. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/common/message.py +0 -0
  129. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/common/object_ref.py +0 -0
  130. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/common/parameter.py +0 -0
  131. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/common/pyproject.py +0 -0
  132. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/common/record/__init__.py +0 -0
  133. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/common/record/configsrecord.py +0 -0
  134. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/common/record/conversion_utils.py +0 -0
  135. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/common/record/metricsrecord.py +0 -0
  136. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/common/record/parametersrecord.py +0 -0
  137. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/common/record/recordset.py +0 -0
  138. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/common/record/typeddict.py +0 -0
  139. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/common/recordset_compat.py +0 -0
  140. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/common/retry_invoker.py +0 -0
  141. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/common/secure_aggregation/__init__.py +0 -0
  142. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
  143. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
  144. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -0
  145. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
  146. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/common/secure_aggregation/quantization.py +0 -0
  147. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
  148. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
  149. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/common/serde.py +0 -0
  150. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/common/telemetry.py +0 -0
  151. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/common/version.py +0 -0
  152. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/__init__.py +0 -0
  153. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/clientappio_pb2.py +0 -0
  154. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/clientappio_pb2.pyi +0 -0
  155. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/clientappio_pb2_grpc.py +0 -0
  156. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/clientappio_pb2_grpc.pyi +0 -0
  157. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/common_pb2.py +0 -0
  158. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/common_pb2.pyi +0 -0
  159. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/common_pb2_grpc.py +0 -0
  160. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/common_pb2_grpc.pyi +0 -0
  161. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/control_pb2.py +0 -0
  162. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/control_pb2.pyi +0 -0
  163. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/control_pb2_grpc.py +0 -0
  164. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/control_pb2_grpc.pyi +0 -0
  165. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/driver_pb2.py +0 -0
  166. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/driver_pb2.pyi +0 -0
  167. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/driver_pb2_grpc.py +0 -0
  168. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/driver_pb2_grpc.pyi +0 -0
  169. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/error_pb2.py +0 -0
  170. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/error_pb2.pyi +0 -0
  171. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/error_pb2_grpc.py +0 -0
  172. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/error_pb2_grpc.pyi +0 -0
  173. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/exec_pb2.py +0 -0
  174. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/exec_pb2.pyi +0 -0
  175. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/exec_pb2_grpc.py +0 -0
  176. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/exec_pb2_grpc.pyi +0 -0
  177. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/fab_pb2.py +0 -0
  178. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/fab_pb2.pyi +0 -0
  179. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/fab_pb2_grpc.py +0 -0
  180. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/fab_pb2_grpc.pyi +0 -0
  181. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/fleet_pb2.py +0 -0
  182. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/fleet_pb2.pyi +0 -0
  183. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/fleet_pb2_grpc.py +0 -0
  184. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
  185. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/grpcadapter_pb2.py +0 -0
  186. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/grpcadapter_pb2.pyi +0 -0
  187. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/grpcadapter_pb2_grpc.py +0 -0
  188. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/grpcadapter_pb2_grpc.pyi +0 -0
  189. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/message_pb2.py +0 -0
  190. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/message_pb2.pyi +0 -0
  191. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/message_pb2_grpc.py +0 -0
  192. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/message_pb2_grpc.pyi +0 -0
  193. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/node_pb2.py +0 -0
  194. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/node_pb2.pyi +0 -0
  195. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/node_pb2_grpc.py +0 -0
  196. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/node_pb2_grpc.pyi +0 -0
  197. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/recordset_pb2.py +0 -0
  198. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/recordset_pb2.pyi +0 -0
  199. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/recordset_pb2_grpc.py +0 -0
  200. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/recordset_pb2_grpc.pyi +0 -0
  201. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/run_pb2.py +0 -0
  202. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/run_pb2.pyi +0 -0
  203. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/run_pb2_grpc.py +0 -0
  204. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/run_pb2_grpc.pyi +0 -0
  205. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/task_pb2.py +0 -0
  206. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/task_pb2.pyi +0 -0
  207. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/task_pb2_grpc.py +0 -0
  208. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/task_pb2_grpc.pyi +0 -0
  209. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/transport_pb2.py +0 -0
  210. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/transport_pb2.pyi +0 -0
  211. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/transport_pb2_grpc.py +0 -0
  212. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
  213. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/py.typed +0 -0
  214. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/__init__.py +0 -0
  215. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/client_manager.py +0 -0
  216. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/client_proxy.py +0 -0
  217. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/compat/__init__.py +0 -0
  218. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/compat/app.py +0 -0
  219. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/compat/app_utils.py +0 -0
  220. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/compat/driver_client_proxy.py +0 -0
  221. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/compat/legacy_context.py +0 -0
  222. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/criterion.py +0 -0
  223. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/driver/__init__.py +0 -0
  224. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/driver/driver.py +0 -0
  225. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/driver/grpc_driver.py +0 -0
  226. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/driver/inmemory_driver.py +0 -0
  227. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/history.py +0 -0
  228. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/run_serverapp.py +0 -0
  229. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/server.py +0 -0
  230. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/server_app.py +0 -0
  231. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/server_config.py +0 -0
  232. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/serverapp/__init__.py +0 -0
  233. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/serverapp_components.py +0 -0
  234. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/strategy/__init__.py +0 -0
  235. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/strategy/aggregate.py +0 -0
  236. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/strategy/bulyan.py +0 -0
  237. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
  238. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
  239. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
  240. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
  241. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
  242. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/strategy/fedadagrad.py +0 -0
  243. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/strategy/fedadam.py +0 -0
  244. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/strategy/fedavg.py +0 -0
  245. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/strategy/fedavg_android.py +0 -0
  246. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/strategy/fedavgm.py +0 -0
  247. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/strategy/fedmedian.py +0 -0
  248. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/strategy/fedopt.py +0 -0
  249. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/strategy/fedprox.py +0 -0
  250. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
  251. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
  252. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
  253. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
  254. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/strategy/fedyogi.py +0 -0
  255. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/strategy/krum.py +0 -0
  256. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/strategy/qfedavg.py +0 -0
  257. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/strategy/strategy.py +0 -0
  258. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/superlink/__init__.py +0 -0
  259. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/superlink/driver/__init__.py +0 -0
  260. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/superlink/driver/driver_grpc.py +0 -0
  261. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/superlink/driver/driver_servicer.py +0 -0
  262. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/superlink/ffs/__init__.py +0 -0
  263. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/superlink/ffs/disk_ffs.py +0 -0
  264. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/superlink/ffs/ffs.py +0 -0
  265. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/superlink/ffs/ffs_factory.py +0 -0
  266. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/superlink/fleet/__init__.py +0 -0
  267. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/superlink/fleet/grpc_adapter/__init__.py +0 -0
  268. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +0 -0
  269. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
  270. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
  271. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
  272. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
  273. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +0 -0
  274. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
  275. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +0 -0
  276. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +0 -0
  277. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
  278. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/superlink/fleet/message_handler/message_handler.py +0 -0
  279. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
  280. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +0 -0
  281. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
  282. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
  283. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
  284. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +0 -0
  285. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/superlink/fleet/vce/vce_api.py +0 -0
  286. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/superlink/linkstate/__init__.py +0 -0
  287. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/superlink/linkstate/linkstate_factory.py +0 -0
  288. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/typing.py +0 -0
  289. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/utils/__init__.py +0 -0
  290. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/utils/tensorboard.py +0 -0
  291. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/utils/validator.py +0 -0
  292. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/workflow/__init__.py +0 -0
  293. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/workflow/constant.py +0 -0
  294. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/workflow/default_workflows.py +0 -0
  295. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
  296. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
  297. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +0 -0
  298. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/simulation/__init__.py +0 -0
  299. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/simulation/app.py +0 -0
  300. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/simulation/ray_transport/__init__.py +0 -0
  301. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
  302. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
  303. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/simulation/ray_transport/utils.py +0 -0
  304. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/superexec/__init__.py +0 -0
  305. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/superexec/app.py +0 -0
  306. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/superexec/deployment.py +0 -0
  307. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/superexec/exec_grpc.py +0 -0
  308. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/superexec/exec_servicer.py +0 -0
  309. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/superexec/executor.py +0 -0
  310. {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/superexec/simulation.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: flwr-nightly
3
- Version: 1.13.0.dev20241022
3
+ Version: 1.13.0.dev20241023
4
4
  Summary: Flower: A Friendly Federated Learning Framework
5
5
  Home-page: https://flower.ai
6
6
  License: Apache-2.0
@@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api"
4
4
 
5
5
  [tool.poetry]
6
6
  name = "flwr-nightly"
7
- version = "1.13.0.dev20241022"
7
+ version = "1.13.0.dev20241023"
8
8
  description = "Flower: A Friendly Federated Learning Framework"
9
9
  license = "Apache-2.0"
10
10
  authors = ["The Flower Authors <hello@flower.ai>"]
@@ -37,6 +37,8 @@ from flwr.common import GRPC_MAX_MESSAGE_LENGTH, Context, EventType, Message, ev
37
37
  from flwr.common.address import parse_address
38
38
  from flwr.common.constant import (
39
39
  CLIENTAPPIO_API_DEFAULT_ADDRESS,
40
+ ISOLATION_MODE_PROCESS,
41
+ ISOLATION_MODE_SUBPROCESS,
40
42
  MISSING_EXTRA_REST,
41
43
  RUN_ID_NUM_BYTES,
42
44
  TRANSPORT_TYPE_GRPC_ADAPTER,
@@ -62,9 +64,6 @@ from .message_handler.message_handler import handle_control_message
62
64
  from .numpy_client import NumPyClient
63
65
  from .run_info_store import DeprecatedRunInfoStore
64
66
 
65
- ISOLATION_MODE_SUBPROCESS = "subprocess"
66
- ISOLATION_MODE_PROCESS = "process"
67
-
68
67
 
69
68
  def _check_actionable_client(
70
69
  client: Optional[Client], client_fn: Optional[ClientFnExt]
@@ -31,6 +31,8 @@ from flwr.common import EventType, event
31
31
  from flwr.common.config import parse_config_args
32
32
  from flwr.common.constant import (
33
33
  FLEET_API_GRPC_RERE_DEFAULT_ADDRESS,
34
+ ISOLATION_MODE_PROCESS,
35
+ ISOLATION_MODE_SUBPROCESS,
34
36
  TRANSPORT_TYPE_GRPC_ADAPTER,
35
37
  TRANSPORT_TYPE_GRPC_RERE,
36
38
  TRANSPORT_TYPE_REST,
@@ -38,11 +40,7 @@ from flwr.common.constant import (
38
40
  from flwr.common.exit_handlers import register_exit_handlers
39
41
  from flwr.common.logger import log, warn_deprecated_feature
40
42
 
41
- from ..app import (
42
- ISOLATION_MODE_PROCESS,
43
- ISOLATION_MODE_SUBPROCESS,
44
- start_client_internal,
45
- )
43
+ from ..app import start_client_internal
46
44
  from ..clientapp.utils import get_load_client_app_fn
47
45
 
48
46
 
@@ -200,10 +198,10 @@ def _parse_args_run_supernode() -> argparse.ArgumentParser:
200
198
  ISOLATION_MODE_SUBPROCESS,
201
199
  ISOLATION_MODE_PROCESS,
202
200
  ],
203
- help="Isolation mode when running `ClientApp` (optional, possible values: "
204
- "`subprocess`, `process`). By default, `ClientApp` runs in the same process "
201
+ help="Isolation mode when running a `ClientApp` (optional, possible values: "
202
+ "`subprocess`, `process`). By default, a `ClientApp` runs in the same process "
205
203
  "that executes the SuperNode. Use `subprocess` to configure SuperNode to run "
206
- "`ClientApp` in a subprocess. Use `process` to indicate that a separate "
204
+ "a `ClientApp` in a subprocess. Use `process` to indicate that a separate "
207
205
  "independent process gets created outside of SuperNode.",
208
206
  )
209
207
  parser.add_argument(
@@ -83,6 +83,10 @@ GRPC_ADAPTER_METADATA_MESSAGE_QUALNAME_KEY = "grpc-message-qualname"
83
83
  # Message TTL
84
84
  MESSAGE_TTL_TOLERANCE = 1e-1
85
85
 
86
+ # Isolation modes
87
+ ISOLATION_MODE_SUBPROCESS = "subprocess"
88
+ ISOLATION_MODE_PROCESS = "process"
89
+
86
90
 
87
91
  class MessageType:
88
92
  """Message type."""
@@ -128,3 +132,28 @@ class ErrorCode:
128
132
  def __new__(cls) -> ErrorCode:
129
133
  """Prevent instantiation."""
130
134
  raise TypeError(f"{cls.__name__} cannot be instantiated.")
135
+
136
+
137
+ class Status:
138
+ """Run status."""
139
+
140
+ PENDING = "pending"
141
+ STARTING = "starting"
142
+ RUNNING = "running"
143
+ FINISHED = "finished"
144
+
145
+ def __new__(cls) -> Status:
146
+ """Prevent instantiation."""
147
+ raise TypeError(f"{cls.__name__} cannot be instantiated.")
148
+
149
+
150
+ class SubStatus:
151
+ """Run sub-status."""
152
+
153
+ COMPLETED = "completed"
154
+ FAILED = "failed"
155
+ STOPPED = "stopped"
156
+
157
+ def __new__(cls) -> SubStatus:
158
+ """Prevent instantiation."""
159
+ raise TypeError(f"{cls.__name__} cannot be instantiated.")
@@ -218,6 +218,15 @@ class Run:
218
218
  override_config: UserConfig
219
219
 
220
220
 
221
+ @dataclass
222
+ class RunStatus:
223
+ """Run status information."""
224
+
225
+ status: str
226
+ sub_status: str
227
+ details: str
228
+
229
+
221
230
  @dataclass
222
231
  class Fab:
223
232
  """Fab file representation."""
@@ -17,12 +17,14 @@
17
17
  import argparse
18
18
  import csv
19
19
  import importlib.util
20
+ import subprocess
20
21
  import sys
21
22
  import threading
22
23
  from collections.abc import Sequence
23
- from logging import INFO, WARN
24
+ from logging import DEBUG, INFO, WARN
24
25
  from os.path import isfile
25
26
  from pathlib import Path
27
+ from time import sleep
26
28
  from typing import Optional
27
29
 
28
30
  import grpc
@@ -42,10 +44,13 @@ from flwr.common.constant import (
42
44
  FLEET_API_GRPC_BIDI_DEFAULT_ADDRESS,
43
45
  FLEET_API_GRPC_RERE_DEFAULT_ADDRESS,
44
46
  FLEET_API_REST_DEFAULT_ADDRESS,
47
+ ISOLATION_MODE_PROCESS,
48
+ ISOLATION_MODE_SUBPROCESS,
45
49
  MISSING_EXTRA_REST,
46
50
  TRANSPORT_TYPE_GRPC_ADAPTER,
47
51
  TRANSPORT_TYPE_GRPC_RERE,
48
52
  TRANSPORT_TYPE_REST,
53
+ Status,
49
54
  )
50
55
  from flwr.common.exit_handlers import register_exit_handlers
51
56
  from flwr.common.logger import log
@@ -53,6 +58,7 @@ from flwr.common.secure_aggregation.crypto.symmetric_encryption import (
53
58
  private_key_to_bytes,
54
59
  public_key_to_bytes,
55
60
  )
61
+ from flwr.common.typing import RunStatus
56
62
  from flwr.proto.fleet_pb2_grpc import ( # pylint: disable=E0611
57
63
  add_FleetServicer_to_server,
58
64
  )
@@ -333,6 +339,15 @@ def run_superlink() -> None:
333
339
  )
334
340
  grpc_servers.append(exec_server)
335
341
 
342
+ if args.isolation == ISOLATION_MODE_SUBPROCESS:
343
+ # Scheduler thread
344
+ scheduler_th = threading.Thread(
345
+ target=_flwr_serverapp_scheduler,
346
+ args=(state_factory, args.driver_api_address),
347
+ )
348
+ scheduler_th.start()
349
+ bckg_threads.append(scheduler_th)
350
+
336
351
  # Graceful shutdown
337
352
  register_exit_handlers(
338
353
  event_type=EventType.RUN_SUPERLINK_LEAVE,
@@ -349,6 +364,47 @@ def run_superlink() -> None:
349
364
  driver_server.wait_for_termination(timeout=1)
350
365
 
351
366
 
367
+ def _flwr_serverapp_scheduler(
368
+ state_factory: LinkStateFactory, driver_api_address: str
369
+ ) -> None:
370
+ log(DEBUG, "Started flwr-serverapp scheduler thread.")
371
+
372
+ state = state_factory.state()
373
+
374
+ # Periodically check for a pending run in the LinkState
375
+ while True:
376
+ sleep(3)
377
+ pending_run_id = state.get_pending_run_id()
378
+
379
+ if pending_run_id:
380
+
381
+ # Set run as starting
382
+ state.update_run_status(
383
+ run_id=pending_run_id, new_status=RunStatus(Status.STARTING, "", "")
384
+ )
385
+ log(
386
+ INFO,
387
+ "Launching `flwr-serverapp` subprocess with run-id %d. "
388
+ "Connects to SuperLink on %s",
389
+ pending_run_id,
390
+ driver_api_address,
391
+ )
392
+ # Start ServerApp subprocess
393
+ command = [
394
+ "flwr-serverapp",
395
+ "--superlink",
396
+ driver_api_address,
397
+ "--run-id",
398
+ str(pending_run_id),
399
+ ]
400
+ subprocess.run(
401
+ command,
402
+ stdout=None,
403
+ stderr=None,
404
+ check=True,
405
+ )
406
+
407
+
352
408
  def _format_address(address: str) -> tuple[str, str, int]:
353
409
  parsed_address = parse_address(address)
354
410
  if not parsed_address:
@@ -634,6 +690,19 @@ def _add_args_common(parser: argparse.ArgumentParser) -> None:
634
690
  "to create a secure connection.",
635
691
  type=str,
636
692
  )
693
+ parser.add_argument(
694
+ "--isolation",
695
+ default=ISOLATION_MODE_SUBPROCESS,
696
+ required=False,
697
+ choices=[
698
+ ISOLATION_MODE_SUBPROCESS,
699
+ ISOLATION_MODE_PROCESS,
700
+ ],
701
+ help="Isolation mode when running a `ServerApp` (`subprocess` by default, "
702
+ "possible values: `subprocess`, `process`). Use `subprocess` to configure "
703
+ "SuperLink to run a `ServerApp` in a subprocess. Use `process` to indicate "
704
+ "that a separate independent process gets created outside of SuperLink.",
705
+ )
637
706
  parser.add_argument(
638
707
  "--database",
639
708
  help="A string representing the path to the database "
@@ -0,0 +1,78 @@
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 ServerApp process."""
16
+
17
+ import argparse
18
+ from logging import DEBUG, INFO
19
+ from typing import Optional
20
+
21
+ from flwr.common.logger import log
22
+ from flwr.server.driver.grpc_driver import GrpcDriver
23
+
24
+
25
+ def flwr_serverapp() -> None:
26
+ """Run process-isolated Flower ServerApp."""
27
+ log(INFO, "Starting Flower ServerApp")
28
+
29
+ parser = argparse.ArgumentParser(
30
+ description="Run a Flower ServerApp",
31
+ )
32
+ parser.add_argument(
33
+ "--superlink",
34
+ type=str,
35
+ help="Address of SuperLink's DriverAPI",
36
+ )
37
+ parser.add_argument(
38
+ "--run-id",
39
+ type=int,
40
+ required=False,
41
+ help="Id of the Run this process should start. If not supplied, this "
42
+ "function will request a pending run to the LinkState.",
43
+ )
44
+ args = parser.parse_args()
45
+
46
+ log(
47
+ DEBUG,
48
+ "Staring isolated `ServerApp` connected to SuperLink DriverAPI at %s "
49
+ "for run-id %s",
50
+ args.superlink,
51
+ args.run_id,
52
+ )
53
+ run_serverapp(superlink=args.superlink, run_id=args.run_id)
54
+
55
+
56
+ def run_serverapp( # pylint: disable=R0914
57
+ superlink: str,
58
+ run_id: Optional[int] = None,
59
+ ) -> None:
60
+ """Run Flower ServerApp process.
61
+
62
+ Parameters
63
+ ----------
64
+ superlink : str
65
+ Address of SuperLink
66
+ run_id : Optional[int] (default: None)
67
+ Unique identifier of a Run registered at the LinkState. If not supplied,
68
+ this function will request a pending run to the LinkState.
69
+ """
70
+ _ = GrpcDriver(
71
+ run_id=run_id if run_id else 0,
72
+ driver_service_address=superlink,
73
+ root_certificates=None,
74
+ )
75
+
76
+ # Then, GetServerInputs
77
+
78
+ # Then, run ServerApp
@@ -17,6 +17,7 @@
17
17
 
18
18
  import threading
19
19
  import time
20
+ from dataclasses import dataclass
20
21
  from logging import ERROR, WARNING
21
22
  from typing import Optional
22
23
  from uuid import UUID, uuid4
@@ -26,13 +27,31 @@ from flwr.common.constant import (
26
27
  MESSAGE_TTL_TOLERANCE,
27
28
  NODE_ID_NUM_BYTES,
28
29
  RUN_ID_NUM_BYTES,
30
+ Status,
29
31
  )
30
- from flwr.common.typing import Run, UserConfig
32
+ from flwr.common.typing import Run, RunStatus, UserConfig
31
33
  from flwr.proto.task_pb2 import TaskIns, TaskRes # pylint: disable=E0611
32
34
  from flwr.server.superlink.linkstate.linkstate import LinkState
33
35
  from flwr.server.utils import validate_task_ins_or_res
34
36
 
35
- from .utils import generate_rand_int_from_bytes, make_node_unavailable_taskres
37
+ from .utils import (
38
+ generate_rand_int_from_bytes,
39
+ has_valid_sub_status,
40
+ is_valid_transition,
41
+ make_node_unavailable_taskres,
42
+ )
43
+
44
+
45
+ @dataclass
46
+ class RunRecord:
47
+ """The record of a specific run, including its status and timestamps."""
48
+
49
+ run: Run
50
+ status: RunStatus
51
+ pending_at: str = ""
52
+ starting_at: str = ""
53
+ running_at: str = ""
54
+ finished_at: str = ""
36
55
 
37
56
 
38
57
  class InMemoryLinkState(LinkState): # pylint: disable=R0902,R0904
@@ -44,8 +63,8 @@ class InMemoryLinkState(LinkState): # pylint: disable=R0902,R0904
44
63
  self.node_ids: dict[int, tuple[float, float]] = {}
45
64
  self.public_key_to_node_id: dict[bytes, int] = {}
46
65
 
47
- # Map run_id to (fab_id, fab_version)
48
- self.run_ids: dict[int, Run] = {}
66
+ # Map run_id to RunRecord
67
+ self.run_ids: dict[int, RunRecord] = {}
49
68
  self.task_ins_store: dict[UUID, TaskIns] = {}
50
69
  self.task_res_store: dict[UUID, TaskRes] = {}
51
70
 
@@ -351,13 +370,22 @@ class InMemoryLinkState(LinkState): # pylint: disable=R0902,R0904
351
370
  run_id = generate_rand_int_from_bytes(RUN_ID_NUM_BYTES)
352
371
 
353
372
  if run_id not in self.run_ids:
354
- self.run_ids[run_id] = Run(
355
- run_id=run_id,
356
- fab_id=fab_id if fab_id else "",
357
- fab_version=fab_version if fab_version else "",
358
- fab_hash=fab_hash if fab_hash else "",
359
- override_config=override_config,
373
+ run_record = RunRecord(
374
+ run=Run(
375
+ run_id=run_id,
376
+ fab_id=fab_id if fab_id else "",
377
+ fab_version=fab_version if fab_version else "",
378
+ fab_hash=fab_hash if fab_hash else "",
379
+ override_config=override_config,
380
+ ),
381
+ status=RunStatus(
382
+ status=Status.PENDING,
383
+ sub_status="",
384
+ details="",
385
+ ),
386
+ pending_at=now().isoformat(),
360
387
  )
388
+ self.run_ids[run_id] = run_record
361
389
  return run_id
362
390
  log(ERROR, "Unexpected run creation failure.")
363
391
  return 0
@@ -401,7 +429,69 @@ class InMemoryLinkState(LinkState): # pylint: disable=R0902,R0904
401
429
  if run_id not in self.run_ids:
402
430
  log(ERROR, "`run_id` is invalid")
403
431
  return None
404
- return self.run_ids[run_id]
432
+ return self.run_ids[run_id].run
433
+
434
+ def get_run_status(self, run_ids: set[int]) -> dict[int, RunStatus]:
435
+ """Retrieve the statuses for the specified runs."""
436
+ with self.lock:
437
+ return {
438
+ run_id: self.run_ids[run_id].status
439
+ for run_id in set(run_ids)
440
+ if run_id in self.run_ids
441
+ }
442
+
443
+ def update_run_status(self, run_id: int, new_status: RunStatus) -> bool:
444
+ """Update the status of the run with the specified `run_id`."""
445
+ with self.lock:
446
+ # Check if the run_id exists
447
+ if run_id not in self.run_ids:
448
+ log(ERROR, "`run_id` is invalid")
449
+ return False
450
+
451
+ # Check if the status transition is valid
452
+ current_status = self.run_ids[run_id].status
453
+ if not is_valid_transition(current_status, new_status):
454
+ log(
455
+ ERROR,
456
+ 'Invalid status transition: from "%s" to "%s"',
457
+ current_status.status,
458
+ new_status.status,
459
+ )
460
+ return False
461
+
462
+ # Check if the sub-status is valid
463
+ if not has_valid_sub_status(current_status):
464
+ log(
465
+ ERROR,
466
+ 'Invalid sub-status "%s" for status "%s"',
467
+ current_status.sub_status,
468
+ current_status.status,
469
+ )
470
+ return False
471
+
472
+ # Update the status
473
+ run_record = self.run_ids[run_id]
474
+ if new_status.status == Status.STARTING:
475
+ run_record.starting_at = now().isoformat()
476
+ elif new_status.status == Status.RUNNING:
477
+ run_record.running_at = now().isoformat()
478
+ elif new_status.status == Status.FINISHED:
479
+ run_record.finished_at = now().isoformat()
480
+ run_record.status = new_status
481
+ return True
482
+
483
+ def get_pending_run_id(self) -> Optional[int]:
484
+ """Get the `run_id` of a run with `Status.PENDING` status, if any."""
485
+ pending_run_id = None
486
+
487
+ # Loop through all registered runs
488
+ for run_id, run_rec in self.run_ids.items():
489
+ # Break once a pending run is found
490
+ if run_rec.status.status == Status.PENDING:
491
+ pending_run_id = run_id
492
+ break
493
+
494
+ return pending_run_id
405
495
 
406
496
  def acknowledge_ping(self, node_id: int, ping_interval: float) -> bool:
407
497
  """Acknowledge a ping received from a node, serving as a heartbeat."""
@@ -19,7 +19,7 @@ import abc
19
19
  from typing import Optional
20
20
  from uuid import UUID
21
21
 
22
- from flwr.common.typing import Run, UserConfig
22
+ from flwr.common.typing import Run, RunStatus, UserConfig
23
23
  from flwr.proto.task_pb2 import TaskIns, TaskRes # pylint: disable=E0611
24
24
 
25
25
 
@@ -178,6 +178,54 @@ class LinkState(abc.ABC): # pylint: disable=R0904
178
178
  - `fab_version`: The version of the FAB used in the specified run.
179
179
  """
180
180
 
181
+ @abc.abstractmethod
182
+ def get_run_status(self, run_ids: set[int]) -> dict[int, RunStatus]:
183
+ """Retrieve the statuses for the specified runs.
184
+
185
+ Parameters
186
+ ----------
187
+ run_ids : set[int]
188
+ A set of run identifiers for which to retrieve statuses.
189
+
190
+ Returns
191
+ -------
192
+ dict[int, RunStatus]
193
+ A dictionary mapping each valid run ID to its corresponding status.
194
+
195
+ Notes
196
+ -----
197
+ Only valid run IDs that exist in the State will be included in the returned
198
+ dictionary. If a run ID is not found, it will be omitted from the result.
199
+ """
200
+
201
+ @abc.abstractmethod
202
+ def update_run_status(self, run_id: int, new_status: RunStatus) -> bool:
203
+ """Update the status of the run with the specified `run_id`.
204
+
205
+ Parameters
206
+ ----------
207
+ run_id : int
208
+ The identifier of the run.
209
+ new_status : RunStatus
210
+ The new status to be assigned to the run.
211
+
212
+ Returns
213
+ -------
214
+ bool
215
+ True if the status update is successful; False otherwise.
216
+ """
217
+
218
+ @abc.abstractmethod
219
+ def get_pending_run_id(self) -> Optional[int]:
220
+ """Get the `run_id` of a run with `Status.PENDING` status.
221
+
222
+ Returns
223
+ -------
224
+ Optional[int]
225
+ The `run_id` of a `Run` that is pending to be started; None if
226
+ there is no Run pending.
227
+ """
228
+
181
229
  @abc.abstractmethod
182
230
  def store_server_private_public_key(
183
231
  self, private_key: bytes, public_key: bytes