flwr-nightly 1.21.0.dev20250812__tar.gz → 1.21.0.dev20250814__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 (393) hide show
  1. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/PKG-INFO +4 -3
  2. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/README.md +3 -2
  3. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/common/args.py +13 -0
  4. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/proto/simulationio_pb2.py +2 -2
  5. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/proto/simulationio_pb2_grpc.py +34 -0
  6. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/proto/simulationio_pb2_grpc.pyi +13 -0
  7. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/app.py +16 -94
  8. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/serverapp/app.py +1 -14
  9. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +3 -1
  10. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/superlink/fleet/vce/vce_api.py +6 -6
  11. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/superlink/simulation/simulationio_servicer.py +42 -6
  12. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/simulation/app.py +25 -10
  13. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/supercore/app_utils.py +4 -1
  14. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/supernode/cli/flwr_clientapp.py +0 -13
  15. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/supernode/start_client_internal.py +10 -31
  16. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/pyproject.toml +2 -2
  17. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/__init__.py +0 -0
  18. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/app/__init__.py +0 -0
  19. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/app/error.py +0 -0
  20. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/app/metadata.py +0 -0
  21. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/cli/__init__.py +0 -0
  22. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/cli/app.py +0 -0
  23. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/cli/auth_plugin/__init__.py +0 -0
  24. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/cli/auth_plugin/oidc_cli_plugin.py +0 -0
  25. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/cli/build.py +0 -0
  26. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/cli/cli_user_auth_interceptor.py +0 -0
  27. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/cli/config_utils.py +0 -0
  28. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/cli/constant.py +0 -0
  29. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/cli/example.py +0 -0
  30. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/cli/install.py +0 -0
  31. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/cli/log.py +0 -0
  32. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/cli/login/__init__.py +0 -0
  33. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/cli/login/login.py +0 -0
  34. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/cli/ls.py +0 -0
  35. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/cli/new/__init__.py +0 -0
  36. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/cli/new/new.py +0 -0
  37. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/cli/new/templates/__init__.py +0 -0
  38. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/cli/new/templates/app/.gitignore.tpl +0 -0
  39. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/cli/new/templates/app/LICENSE.tpl +0 -0
  40. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/cli/new/templates/app/README.baseline.md.tpl +0 -0
  41. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/cli/new/templates/app/README.flowertune.md.tpl +0 -0
  42. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/cli/new/templates/app/README.md.tpl +0 -0
  43. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/cli/new/templates/app/__init__.py +0 -0
  44. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/cli/new/templates/app/code/__init__.baseline.py.tpl +0 -0
  45. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
  46. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
  47. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/cli/new/templates/app/code/client.baseline.py.tpl +0 -0
  48. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/cli/new/templates/app/code/client.huggingface.py.tpl +0 -0
  49. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/cli/new/templates/app/code/client.jax.py.tpl +0 -0
  50. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/cli/new/templates/app/code/client.mlx.py.tpl +0 -0
  51. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/cli/new/templates/app/code/client.numpy.py.tpl +0 -0
  52. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -0
  53. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl +0 -0
  54. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -0
  55. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/cli/new/templates/app/code/dataset.baseline.py.tpl +0 -0
  56. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/cli/new/templates/app/code/flwr_tune/__init__.py +0 -0
  57. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/cli/new/templates/app/code/flwr_tune/client_app.py.tpl +0 -0
  58. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/cli/new/templates/app/code/flwr_tune/dataset.py.tpl +0 -0
  59. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/cli/new/templates/app/code/flwr_tune/models.py.tpl +0 -0
  60. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/cli/new/templates/app/code/flwr_tune/server_app.py.tpl +0 -0
  61. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/cli/new/templates/app/code/flwr_tune/strategy.py.tpl +0 -0
  62. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/cli/new/templates/app/code/model.baseline.py.tpl +0 -0
  63. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/cli/new/templates/app/code/server.baseline.py.tpl +0 -0
  64. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/cli/new/templates/app/code/server.huggingface.py.tpl +0 -0
  65. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/cli/new/templates/app/code/server.jax.py.tpl +0 -0
  66. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/cli/new/templates/app/code/server.mlx.py.tpl +0 -0
  67. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -0
  68. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -0
  69. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/cli/new/templates/app/code/server.sklearn.py.tpl +0 -0
  70. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -0
  71. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/cli/new/templates/app/code/strategy.baseline.py.tpl +0 -0
  72. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/cli/new/templates/app/code/task.huggingface.py.tpl +0 -0
  73. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/cli/new/templates/app/code/task.jax.py.tpl +0 -0
  74. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/cli/new/templates/app/code/task.mlx.py.tpl +0 -0
  75. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/cli/new/templates/app/code/task.numpy.py.tpl +0 -0
  76. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +0 -0
  77. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/cli/new/templates/app/code/task.sklearn.py.tpl +0 -0
  78. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/cli/new/templates/app/code/task.tensorflow.py.tpl +0 -0
  79. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/cli/new/templates/app/code/utils.baseline.py.tpl +0 -0
  80. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/cli/new/templates/app/pyproject.baseline.toml.tpl +0 -0
  81. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +0 -0
  82. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl +0 -0
  83. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/cli/new/templates/app/pyproject.jax.toml.tpl +0 -0
  84. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +0 -0
  85. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +0 -0
  86. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +0 -0
  87. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +0 -0
  88. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +0 -0
  89. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/cli/run/__init__.py +0 -0
  90. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/cli/run/run.py +0 -0
  91. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/cli/stop.py +0 -0
  92. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/cli/utils.py +0 -0
  93. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/client/__init__.py +0 -0
  94. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/client/client.py +0 -0
  95. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/client/client_app.py +0 -0
  96. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/client/clientapp/__init__.py +0 -0
  97. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/client/clientapp/utils.py +0 -0
  98. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/client/dpfedavg_numpy_client.py +0 -0
  99. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/client/grpc_adapter_client/__init__.py +0 -0
  100. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/client/grpc_adapter_client/connection.py +0 -0
  101. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/client/grpc_rere_client/__init__.py +0 -0
  102. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/client/grpc_rere_client/client_interceptor.py +0 -0
  103. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/client/grpc_rere_client/connection.py +0 -0
  104. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/client/grpc_rere_client/grpc_adapter.py +0 -0
  105. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/client/message_handler/__init__.py +0 -0
  106. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/client/message_handler/message_handler.py +0 -0
  107. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/client/mod/__init__.py +0 -0
  108. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/client/mod/centraldp_mods.py +0 -0
  109. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/client/mod/comms_mods.py +0 -0
  110. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/client/mod/localdp_mod.py +0 -0
  111. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
  112. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
  113. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
  114. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/client/mod/utils.py +0 -0
  115. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/client/numpy_client.py +0 -0
  116. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/client/rest_client/__init__.py +0 -0
  117. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/client/rest_client/connection.py +0 -0
  118. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/client/run_info_store.py +0 -0
  119. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/client/typing.py +0 -0
  120. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/clientapp/__init__.py +0 -0
  121. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/common/__init__.py +0 -0
  122. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/common/address.py +0 -0
  123. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/common/auth_plugin/__init__.py +0 -0
  124. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/common/auth_plugin/auth_plugin.py +0 -0
  125. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/common/config.py +0 -0
  126. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/common/constant.py +0 -0
  127. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/common/context.py +0 -0
  128. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/common/date.py +0 -0
  129. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/common/differential_privacy.py +0 -0
  130. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/common/differential_privacy_constants.py +0 -0
  131. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/common/dp.py +0 -0
  132. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/common/event_log_plugin/__init__.py +0 -0
  133. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/common/event_log_plugin/event_log_plugin.py +0 -0
  134. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/common/exit/__init__.py +0 -0
  135. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/common/exit/exit.py +0 -0
  136. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/common/exit/exit_code.py +0 -0
  137. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/common/exit_handlers.py +0 -0
  138. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/common/grpc.py +0 -0
  139. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/common/heartbeat.py +0 -0
  140. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/common/inflatable.py +0 -0
  141. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/common/inflatable_protobuf_utils.py +0 -0
  142. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/common/inflatable_utils.py +0 -0
  143. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/common/logger.py +0 -0
  144. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/common/message.py +0 -0
  145. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/common/object_ref.py +0 -0
  146. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/common/parameter.py +0 -0
  147. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/common/pyproject.py +0 -0
  148. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/common/record/__init__.py +0 -0
  149. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/common/record/array.py +0 -0
  150. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/common/record/arraychunk.py +0 -0
  151. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/common/record/arrayrecord.py +0 -0
  152. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/common/record/configrecord.py +0 -0
  153. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/common/record/conversion_utils.py +0 -0
  154. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/common/record/metricrecord.py +0 -0
  155. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/common/record/recorddict.py +0 -0
  156. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/common/record/typeddict.py +0 -0
  157. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/common/recorddict_compat.py +0 -0
  158. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/common/retry_invoker.py +0 -0
  159. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/common/secure_aggregation/__init__.py +0 -0
  160. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
  161. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
  162. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -0
  163. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
  164. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/common/secure_aggregation/quantization.py +0 -0
  165. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
  166. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
  167. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/common/serde.py +0 -0
  168. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/common/serde_utils.py +0 -0
  169. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/common/telemetry.py +0 -0
  170. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/common/typing.py +0 -0
  171. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/common/version.py +0 -0
  172. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/compat/__init__.py +0 -0
  173. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/compat/client/__init__.py +0 -0
  174. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/compat/client/app.py +0 -0
  175. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/compat/client/grpc_client/__init__.py +0 -0
  176. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/compat/client/grpc_client/connection.py +0 -0
  177. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/compat/common/__init__.py +0 -0
  178. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/compat/server/__init__.py +0 -0
  179. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/compat/server/app.py +0 -0
  180. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/compat/simulation/__init__.py +0 -0
  181. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/proto/__init__.py +0 -0
  182. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/proto/appio_pb2.py +0 -0
  183. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/proto/appio_pb2.pyi +0 -0
  184. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/proto/appio_pb2_grpc.py +0 -0
  185. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/proto/appio_pb2_grpc.pyi +0 -0
  186. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/proto/clientappio_pb2.py +0 -0
  187. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/proto/clientappio_pb2.pyi +0 -0
  188. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/proto/clientappio_pb2_grpc.py +0 -0
  189. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/proto/clientappio_pb2_grpc.pyi +0 -0
  190. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/proto/control_pb2.py +0 -0
  191. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/proto/control_pb2.pyi +0 -0
  192. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/proto/control_pb2_grpc.py +0 -0
  193. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/proto/control_pb2_grpc.pyi +0 -0
  194. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/proto/error_pb2.py +0 -0
  195. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/proto/error_pb2.pyi +0 -0
  196. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/proto/error_pb2_grpc.py +0 -0
  197. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/proto/error_pb2_grpc.pyi +0 -0
  198. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/proto/fab_pb2.py +0 -0
  199. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/proto/fab_pb2.pyi +0 -0
  200. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/proto/fab_pb2_grpc.py +0 -0
  201. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/proto/fab_pb2_grpc.pyi +0 -0
  202. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/proto/fleet_pb2.py +0 -0
  203. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/proto/fleet_pb2.pyi +0 -0
  204. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/proto/fleet_pb2_grpc.py +0 -0
  205. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
  206. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/proto/grpcadapter_pb2.py +0 -0
  207. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/proto/grpcadapter_pb2.pyi +0 -0
  208. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/proto/grpcadapter_pb2_grpc.py +0 -0
  209. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/proto/grpcadapter_pb2_grpc.pyi +0 -0
  210. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/proto/heartbeat_pb2.py +0 -0
  211. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/proto/heartbeat_pb2.pyi +0 -0
  212. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/proto/heartbeat_pb2_grpc.py +0 -0
  213. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/proto/heartbeat_pb2_grpc.pyi +0 -0
  214. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/proto/log_pb2.py +0 -0
  215. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/proto/log_pb2.pyi +0 -0
  216. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/proto/log_pb2_grpc.py +0 -0
  217. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/proto/log_pb2_grpc.pyi +0 -0
  218. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/proto/message_pb2.py +0 -0
  219. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/proto/message_pb2.pyi +0 -0
  220. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/proto/message_pb2_grpc.py +0 -0
  221. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/proto/message_pb2_grpc.pyi +0 -0
  222. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/proto/node_pb2.py +0 -0
  223. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/proto/node_pb2.pyi +0 -0
  224. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/proto/node_pb2_grpc.py +0 -0
  225. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/proto/node_pb2_grpc.pyi +0 -0
  226. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/proto/recorddict_pb2.py +0 -0
  227. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/proto/recorddict_pb2.pyi +0 -0
  228. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/proto/recorddict_pb2_grpc.py +0 -0
  229. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/proto/recorddict_pb2_grpc.pyi +0 -0
  230. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/proto/run_pb2.py +0 -0
  231. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/proto/run_pb2.pyi +0 -0
  232. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/proto/run_pb2_grpc.py +0 -0
  233. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/proto/run_pb2_grpc.pyi +0 -0
  234. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/proto/serverappio_pb2.py +0 -0
  235. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/proto/serverappio_pb2.pyi +0 -0
  236. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/proto/serverappio_pb2_grpc.py +0 -0
  237. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/proto/serverappio_pb2_grpc.pyi +0 -0
  238. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/proto/simulationio_pb2.pyi +0 -0
  239. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/proto/transport_pb2.py +0 -0
  240. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/proto/transport_pb2.pyi +0 -0
  241. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/proto/transport_pb2_grpc.py +0 -0
  242. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
  243. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/py.typed +0 -0
  244. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/__init__.py +0 -0
  245. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/client_manager.py +0 -0
  246. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/client_proxy.py +0 -0
  247. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/compat/__init__.py +0 -0
  248. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/compat/app.py +0 -0
  249. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/compat/app_utils.py +0 -0
  250. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/compat/grid_client_proxy.py +0 -0
  251. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/compat/legacy_context.py +0 -0
  252. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/criterion.py +0 -0
  253. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/fleet_event_log_interceptor.py +0 -0
  254. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/grid/__init__.py +0 -0
  255. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/grid/grid.py +0 -0
  256. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/grid/grpc_grid.py +0 -0
  257. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/grid/inmemory_grid.py +0 -0
  258. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/history.py +0 -0
  259. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/run_serverapp.py +0 -0
  260. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/server.py +0 -0
  261. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/server_app.py +0 -0
  262. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/server_config.py +0 -0
  263. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/serverapp/__init__.py +0 -0
  264. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/serverapp_components.py +0 -0
  265. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/strategy/__init__.py +0 -0
  266. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/strategy/aggregate.py +0 -0
  267. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/strategy/bulyan.py +0 -0
  268. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
  269. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
  270. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
  271. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
  272. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
  273. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/strategy/fedadagrad.py +0 -0
  274. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/strategy/fedadam.py +0 -0
  275. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/strategy/fedavg.py +0 -0
  276. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/strategy/fedavg_android.py +0 -0
  277. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/strategy/fedavgm.py +0 -0
  278. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/strategy/fedmedian.py +0 -0
  279. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/strategy/fedopt.py +0 -0
  280. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/strategy/fedprox.py +0 -0
  281. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
  282. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
  283. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
  284. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
  285. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/strategy/fedyogi.py +0 -0
  286. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/strategy/krum.py +0 -0
  287. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/strategy/qfedavg.py +0 -0
  288. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/strategy/strategy.py +0 -0
  289. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/superlink/__init__.py +0 -0
  290. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/superlink/fleet/__init__.py +0 -0
  291. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/superlink/fleet/grpc_adapter/__init__.py +0 -0
  292. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +0 -0
  293. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
  294. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
  295. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
  296. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
  297. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +0 -0
  298. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
  299. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +0 -0
  300. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +0 -0
  301. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
  302. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/superlink/fleet/message_handler/message_handler.py +0 -0
  303. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
  304. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +0 -0
  305. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
  306. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
  307. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
  308. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/superlink/linkstate/__init__.py +0 -0
  309. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/superlink/linkstate/in_memory_linkstate.py +0 -0
  310. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/superlink/linkstate/linkstate.py +0 -0
  311. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/superlink/linkstate/linkstate_factory.py +0 -0
  312. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/superlink/linkstate/sqlite_linkstate.py +0 -0
  313. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/superlink/linkstate/utils.py +0 -0
  314. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/superlink/serverappio/__init__.py +0 -0
  315. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/superlink/serverappio/serverappio_grpc.py +0 -0
  316. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/superlink/serverappio/serverappio_servicer.py +0 -0
  317. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/superlink/simulation/__init__.py +0 -0
  318. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/superlink/simulation/simulationio_grpc.py +0 -0
  319. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/superlink/utils.py +0 -0
  320. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/typing.py +0 -0
  321. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/utils/__init__.py +0 -0
  322. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/utils/tensorboard.py +0 -0
  323. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/utils/validator.py +0 -0
  324. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/workflow/__init__.py +0 -0
  325. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/workflow/constant.py +0 -0
  326. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/workflow/default_workflows.py +0 -0
  327. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
  328. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
  329. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +0 -0
  330. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/serverapp/__init__.py +0 -0
  331. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/simulation/__init__.py +0 -0
  332. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/simulation/legacy_app.py +0 -0
  333. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/simulation/ray_transport/__init__.py +0 -0
  334. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
  335. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
  336. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/simulation/ray_transport/utils.py +0 -0
  337. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/simulation/run_simulation.py +0 -0
  338. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/simulation/simulationio_connection.py +0 -0
  339. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/supercore/__init__.py +0 -0
  340. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/supercore/cli/__init__.py +0 -0
  341. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/supercore/cli/flower_superexec.py +0 -0
  342. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/supercore/corestate/__init__.py +0 -0
  343. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/supercore/corestate/corestate.py +0 -0
  344. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/supercore/ffs/__init__.py +0 -0
  345. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/supercore/ffs/disk_ffs.py +0 -0
  346. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/supercore/ffs/ffs.py +0 -0
  347. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/supercore/ffs/ffs_factory.py +0 -0
  348. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/supercore/grpc_health/__init__.py +0 -0
  349. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/supercore/grpc_health/simple_health_servicer.py +0 -0
  350. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/supercore/license_plugin/__init__.py +0 -0
  351. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/supercore/license_plugin/license_plugin.py +0 -0
  352. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/supercore/object_store/__init__.py +0 -0
  353. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/supercore/object_store/in_memory_object_store.py +0 -0
  354. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/supercore/object_store/object_store.py +0 -0
  355. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/supercore/object_store/object_store_factory.py +0 -0
  356. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/supercore/object_store/utils.py +0 -0
  357. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/supercore/superexec/__init__.py +0 -0
  358. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/supercore/superexec/plugin/__init__.py +0 -0
  359. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/supercore/superexec/plugin/base_exec_plugin.py +0 -0
  360. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/supercore/superexec/plugin/clientapp_exec_plugin.py +0 -0
  361. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/supercore/superexec/plugin/exec_plugin.py +0 -0
  362. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/supercore/superexec/plugin/serverapp_exec_plugin.py +0 -0
  363. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/supercore/superexec/plugin/simulation_exec_plugin.py +0 -0
  364. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/supercore/superexec/run_superexec.py +0 -0
  365. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/supercore/utils.py +0 -0
  366. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/superexec/__init__.py +0 -0
  367. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/superexec/deployment.py +0 -0
  368. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/superexec/simulation.py +0 -0
  369. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/superlink/__init__.py +0 -0
  370. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/superlink/executor/__init__.py +0 -0
  371. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/superlink/executor/app.py +0 -0
  372. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/superlink/executor/deployment.py +0 -0
  373. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/superlink/executor/executor.py +0 -0
  374. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/superlink/executor/simulation.py +0 -0
  375. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/superlink/servicer/__init__.py +0 -0
  376. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/superlink/servicer/control/__init__.py +0 -0
  377. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/superlink/servicer/control/control_event_log_interceptor.py +0 -0
  378. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/superlink/servicer/control/control_grpc.py +0 -0
  379. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/superlink/servicer/control/control_license_interceptor.py +0 -0
  380. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/superlink/servicer/control/control_servicer.py +0 -0
  381. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/superlink/servicer/control/control_user_auth_interceptor.py +0 -0
  382. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/supernode/__init__.py +0 -0
  383. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/supernode/cli/__init__.py +0 -0
  384. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/supernode/cli/flower_supernode.py +0 -0
  385. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/supernode/nodestate/__init__.py +0 -0
  386. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/supernode/nodestate/in_memory_nodestate.py +0 -0
  387. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/supernode/nodestate/nodestate.py +0 -0
  388. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/supernode/nodestate/nodestate_factory.py +0 -0
  389. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/supernode/runtime/__init__.py +0 -0
  390. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/supernode/runtime/run_clientapp.py +0 -0
  391. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/supernode/servicer/__init__.py +0 -0
  392. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/supernode/servicer/clientappio/__init__.py +0 -0
  393. {flwr_nightly-1.21.0.dev20250812 → flwr_nightly-1.21.0.dev20250814}/py/flwr/supernode/servicer/clientappio/clientappio_servicer.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: flwr-nightly
3
- Version: 1.21.0.dev20250812
3
+ Version: 1.21.0.dev20250814
4
4
  Summary: Flower: A Friendly Federated AI Framework
5
5
  License: Apache-2.0
6
6
  Keywords: Artificial Intelligence,Federated AI,Federated Analytics,Federated Evaluation,Federated Learning,Flower,Machine Learning
@@ -172,8 +172,9 @@ Flower Baselines is a collection of community-contributed projects that reproduc
172
172
  - [FedOpt](https://github.com/adap/flower/tree/main/baselines/flwr_baselines/flwr_baselines/publications/adaptive_federated_optimization)
173
173
 
174
174
  Please refer to the [Flower Baselines Documentation](https://flower.ai/docs/baselines/) for a detailed categorization of baselines and for additional info including:
175
- * [How to use Flower Baselines](https://flower.ai/docs/baselines/how-to-use-baselines.html)
176
- * [How to contribute a new Flower Baseline](https://flower.ai/docs/baselines/how-to-contribute-baselines.html)
175
+
176
+ - [How to use Flower Baselines](https://flower.ai/docs/baselines/how-to-use-baselines.html)
177
+ - [How to contribute a new Flower Baseline](https://flower.ai/docs/baselines/how-to-contribute-baselines.html)
177
178
 
178
179
  ## Flower Usage Examples
179
180
 
@@ -116,8 +116,9 @@ Flower Baselines is a collection of community-contributed projects that reproduc
116
116
  - [FedOpt](https://github.com/adap/flower/tree/main/baselines/flwr_baselines/flwr_baselines/publications/adaptive_federated_optimization)
117
117
 
118
118
  Please refer to the [Flower Baselines Documentation](https://flower.ai/docs/baselines/) for a detailed categorization of baselines and for additional info including:
119
- * [How to use Flower Baselines](https://flower.ai/docs/baselines/how-to-use-baselines.html)
120
- * [How to contribute a new Flower Baseline](https://flower.ai/docs/baselines/how-to-contribute-baselines.html)
119
+
120
+ - [How to use Flower Baselines](https://flower.ai/docs/baselines/how-to-use-baselines.html)
121
+ - [How to contribute a new Flower Baseline](https://flower.ai/docs/baselines/how-to-contribute-baselines.html)
121
122
 
122
123
  ## Flower Usage Examples
123
124
 
@@ -28,6 +28,12 @@ from flwr.common.logger import log
28
28
 
29
29
  def add_args_flwr_app_common(parser: argparse.ArgumentParser) -> None:
30
30
  """Add common Flower arguments for flwr-*app to the provided parser."""
31
+ parser.add_argument(
32
+ "--token",
33
+ type=str,
34
+ required=False,
35
+ help="Unique token generated by AppIo API for each app execution",
36
+ )
31
37
  parser.add_argument(
32
38
  "--flwr-dir",
33
39
  default=None,
@@ -47,6 +53,13 @@ def add_args_flwr_app_common(parser: argparse.ArgumentParser) -> None:
47
53
  "is not encrypted. By default, the server runs with HTTPS enabled. "
48
54
  "Use this flag only if you understand the risks.",
49
55
  )
56
+ parser.add_argument(
57
+ "--parent-pid",
58
+ type=int,
59
+ default=None,
60
+ help="The PID of the parent process. When set, the process will terminate "
61
+ "when the parent process exits.",
62
+ )
50
63
 
51
64
 
52
65
  def try_obtain_root_certificates(
@@ -20,7 +20,7 @@ from flwr.proto import fab_pb2 as flwr_dot_proto_dot_fab__pb2
20
20
  from flwr.proto import appio_pb2 as flwr_dot_proto_dot_appio__pb2
21
21
 
22
22
 
23
- DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1d\x66lwr/proto/simulationio.proto\x12\nflwr.proto\x1a\x1a\x66lwr/proto/heartbeat.proto\x1a\x14\x66lwr/proto/log.proto\x1a\x18\x66lwr/proto/message.proto\x1a\x14\x66lwr/proto/run.proto\x1a\x14\x66lwr/proto/fab.proto\x1a\x16\x66lwr/proto/appio.proto2\xc1\x06\n\x0cSimulationIo\x12_\n\x10ListAppsToLaunch\x12#.flwr.proto.ListAppsToLaunchRequest\x1a$.flwr.proto.ListAppsToLaunchResponse\"\x00\x12S\n\x0cRequestToken\x12\x1f.flwr.proto.RequestTokenRequest\x1a .flwr.proto.RequestTokenResponse\"\x00\x12V\n\rPullAppInputs\x12 .flwr.proto.PullAppInputsRequest\x1a!.flwr.proto.PullAppInputsResponse\"\x00\x12Y\n\x0ePushAppOutputs\x12!.flwr.proto.PushAppOutputsRequest\x1a\".flwr.proto.PushAppOutputsResponse\"\x00\x12\\\n\x0fUpdateRunStatus\x12\".flwr.proto.UpdateRunStatusRequest\x1a#.flwr.proto.UpdateRunStatusResponse\"\x00\x12G\n\x08PushLogs\x12\x1b.flwr.proto.PushLogsRequest\x1a\x1c.flwr.proto.PushLogsResponse\"\x00\x12k\n\x14GetFederationOptions\x12\'.flwr.proto.GetFederationOptionsRequest\x1a(.flwr.proto.GetFederationOptionsResponse\"\x00\x12S\n\x0cGetRunStatus\x12\x1f.flwr.proto.GetRunStatusRequest\x1a .flwr.proto.GetRunStatusResponse\"\x00\x12_\n\x10SendAppHeartbeat\x12#.flwr.proto.SendAppHeartbeatRequest\x1a$.flwr.proto.SendAppHeartbeatResponse\"\x00\x62\x06proto3')
23
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1d\x66lwr/proto/simulationio.proto\x12\nflwr.proto\x1a\x1a\x66lwr/proto/heartbeat.proto\x1a\x14\x66lwr/proto/log.proto\x1a\x18\x66lwr/proto/message.proto\x1a\x14\x66lwr/proto/run.proto\x1a\x14\x66lwr/proto/fab.proto\x1a\x16\x66lwr/proto/appio.proto2\x84\x07\n\x0cSimulationIo\x12_\n\x10ListAppsToLaunch\x12#.flwr.proto.ListAppsToLaunchRequest\x1a$.flwr.proto.ListAppsToLaunchResponse\"\x00\x12S\n\x0cRequestToken\x12\x1f.flwr.proto.RequestTokenRequest\x1a .flwr.proto.RequestTokenResponse\"\x00\x12\x41\n\x06GetRun\x12\x19.flwr.proto.GetRunRequest\x1a\x1a.flwr.proto.GetRunResponse\"\x00\x12V\n\rPullAppInputs\x12 .flwr.proto.PullAppInputsRequest\x1a!.flwr.proto.PullAppInputsResponse\"\x00\x12Y\n\x0ePushAppOutputs\x12!.flwr.proto.PushAppOutputsRequest\x1a\".flwr.proto.PushAppOutputsResponse\"\x00\x12\\\n\x0fUpdateRunStatus\x12\".flwr.proto.UpdateRunStatusRequest\x1a#.flwr.proto.UpdateRunStatusResponse\"\x00\x12G\n\x08PushLogs\x12\x1b.flwr.proto.PushLogsRequest\x1a\x1c.flwr.proto.PushLogsResponse\"\x00\x12k\n\x14GetFederationOptions\x12\'.flwr.proto.GetFederationOptionsRequest\x1a(.flwr.proto.GetFederationOptionsResponse\"\x00\x12S\n\x0cGetRunStatus\x12\x1f.flwr.proto.GetRunStatusRequest\x1a .flwr.proto.GetRunStatusResponse\"\x00\x12_\n\x10SendAppHeartbeat\x12#.flwr.proto.SendAppHeartbeatRequest\x1a$.flwr.proto.SendAppHeartbeatResponse\"\x00\x62\x06proto3')
24
24
 
25
25
  _globals = globals()
26
26
  _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
@@ -28,5 +28,5 @@ _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'flwr.proto.simulationio_pb2
28
28
  if _descriptor._USE_C_DESCRIPTORS == False:
29
29
  DESCRIPTOR._options = None
30
30
  _globals['_SIMULATIONIO']._serialized_start=190
31
- _globals['_SIMULATIONIO']._serialized_end=1023
31
+ _globals['_SIMULATIONIO']._serialized_end=1090
32
32
  # @@protoc_insertion_point(module_scope)
@@ -27,6 +27,11 @@ class SimulationIoStub(object):
27
27
  request_serializer=flwr_dot_proto_dot_appio__pb2.RequestTokenRequest.SerializeToString,
28
28
  response_deserializer=flwr_dot_proto_dot_appio__pb2.RequestTokenResponse.FromString,
29
29
  )
30
+ self.GetRun = channel.unary_unary(
31
+ '/flwr.proto.SimulationIo/GetRun',
32
+ request_serializer=flwr_dot_proto_dot_run__pb2.GetRunRequest.SerializeToString,
33
+ response_deserializer=flwr_dot_proto_dot_run__pb2.GetRunResponse.FromString,
34
+ )
30
35
  self.PullAppInputs = channel.unary_unary(
31
36
  '/flwr.proto.SimulationIo/PullAppInputs',
32
37
  request_serializer=flwr_dot_proto_dot_appio__pb2.PullAppInputsRequest.SerializeToString,
@@ -81,6 +86,13 @@ class SimulationIoServicer(object):
81
86
  context.set_details('Method not implemented!')
82
87
  raise NotImplementedError('Method not implemented!')
83
88
 
89
+ def GetRun(self, request, context):
90
+ """Get run details
91
+ """
92
+ context.set_code(grpc.StatusCode.UNIMPLEMENTED)
93
+ context.set_details('Method not implemented!')
94
+ raise NotImplementedError('Method not implemented!')
95
+
84
96
  def PullAppInputs(self, request, context):
85
97
  """Pull Simulation inputs
86
98
  """
@@ -143,6 +155,11 @@ def add_SimulationIoServicer_to_server(servicer, server):
143
155
  request_deserializer=flwr_dot_proto_dot_appio__pb2.RequestTokenRequest.FromString,
144
156
  response_serializer=flwr_dot_proto_dot_appio__pb2.RequestTokenResponse.SerializeToString,
145
157
  ),
158
+ 'GetRun': grpc.unary_unary_rpc_method_handler(
159
+ servicer.GetRun,
160
+ request_deserializer=flwr_dot_proto_dot_run__pb2.GetRunRequest.FromString,
161
+ response_serializer=flwr_dot_proto_dot_run__pb2.GetRunResponse.SerializeToString,
162
+ ),
146
163
  'PullAppInputs': grpc.unary_unary_rpc_method_handler(
147
164
  servicer.PullAppInputs,
148
165
  request_deserializer=flwr_dot_proto_dot_appio__pb2.PullAppInputsRequest.FromString,
@@ -222,6 +239,23 @@ class SimulationIo(object):
222
239
  options, channel_credentials,
223
240
  insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
224
241
 
242
+ @staticmethod
243
+ def GetRun(request,
244
+ target,
245
+ options=(),
246
+ channel_credentials=None,
247
+ call_credentials=None,
248
+ insecure=False,
249
+ compression=None,
250
+ wait_for_ready=None,
251
+ timeout=None,
252
+ metadata=None):
253
+ return grpc.experimental.unary_unary(request, target, '/flwr.proto.SimulationIo/GetRun',
254
+ flwr_dot_proto_dot_run__pb2.GetRunRequest.SerializeToString,
255
+ flwr_dot_proto_dot_run__pb2.GetRunResponse.FromString,
256
+ options, channel_credentials,
257
+ insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
258
+
225
259
  @staticmethod
226
260
  def PullAppInputs(request,
227
261
  target,
@@ -21,6 +21,11 @@ class SimulationIoStub:
21
21
  flwr.proto.appio_pb2.RequestTokenResponse]
22
22
  """Request token for a run"""
23
23
 
24
+ GetRun: grpc.UnaryUnaryMultiCallable[
25
+ flwr.proto.run_pb2.GetRunRequest,
26
+ flwr.proto.run_pb2.GetRunResponse]
27
+ """Get run details"""
28
+
24
29
  PullAppInputs: grpc.UnaryUnaryMultiCallable[
25
30
  flwr.proto.appio_pb2.PullAppInputsRequest,
26
31
  flwr.proto.appio_pb2.PullAppInputsResponse]
@@ -74,6 +79,14 @@ class SimulationIoServicer(metaclass=abc.ABCMeta):
74
79
  """Request token for a run"""
75
80
  pass
76
81
 
82
+ @abc.abstractmethod
83
+ def GetRun(self,
84
+ request: flwr.proto.run_pb2.GetRunRequest,
85
+ context: grpc.ServicerContext,
86
+ ) -> flwr.proto.run_pb2.GetRunResponse:
87
+ """Get run details"""
88
+ pass
89
+
77
90
  @abc.abstractmethod
78
91
  def PullAppInputs(self,
79
92
  request: flwr.proto.appio_pb2.PullAppInputsRequest,
@@ -18,9 +18,8 @@
18
18
  import argparse
19
19
  import csv
20
20
  import importlib.util
21
- import multiprocessing
22
- import multiprocessing.context
23
21
  import os
22
+ import subprocess
24
23
  import sys
25
24
  import threading
26
25
  from collections.abc import Sequence
@@ -55,6 +54,7 @@ from flwr.common.constant import (
55
54
  TRANSPORT_TYPE_GRPC_RERE,
56
55
  TRANSPORT_TYPE_REST,
57
56
  EventLogWriterType,
57
+ ExecPluginType,
58
58
  )
59
59
  from flwr.common.event_log_plugin import EventLogWriterPlugin
60
60
  from flwr.common.exit import ExitCode, flwr_exit
@@ -69,8 +69,6 @@ from flwr.proto.fleet_pb2_grpc import ( # pylint: disable=E0611
69
69
  )
70
70
  from flwr.proto.grpcadapter_pb2_grpc import add_GrpcAdapterServicer_to_server
71
71
  from flwr.server.fleet_event_log_interceptor import FleetEventLogInterceptor
72
- from flwr.server.serverapp.app import flwr_serverapp
73
- from flwr.simulation.app import flwr_simulation
74
72
  from flwr.supercore.ffs import FfsFactory
75
73
  from flwr.supercore.object_store import ObjectStoreFactory
76
74
  from flwr.superlink.executor import load_executor
@@ -219,10 +217,10 @@ def run_superlink() -> None:
219
217
 
220
218
  # Determine Exec plugin
221
219
  # If simulation is used, don't start ServerAppIo and Fleet APIs
222
- sim_exec = executor.__class__.__qualname__ == "SimulationEngine"
220
+ is_simulation = executor.__class__.__qualname__ == "SimulationEngine"
223
221
  bckg_threads: list[threading.Thread] = []
224
222
 
225
- if sim_exec:
223
+ if is_simulation:
226
224
  simulationio_server: grpc.Server = run_simulationio_api_grpc(
227
225
  address=simulationio_address,
228
226
  state_factory=state_factory,
@@ -340,25 +338,18 @@ def run_superlink() -> None:
340
338
  io_address = (
341
339
  f"{CLIENT_OCTET}:{_port}" if _octet == SERVER_OCTET else serverappio_address
342
340
  )
343
- address_arg = (
344
- "--simulationio-api-address" if sim_exec else "--serverappio-api-address"
345
- )
346
- address = simulationio_address if sim_exec else io_address
347
- cmd = "flwr-simulation" if sim_exec else "flwr-serverapp"
348
-
349
- # Scheduler thread
350
- scheduler_th = threading.Thread(
351
- target=_flwr_scheduler,
352
- args=(
353
- state_factory,
354
- address_arg,
355
- address,
356
- cmd,
357
- ),
358
- daemon=True,
359
- )
360
- scheduler_th.start()
361
- bckg_threads.append(scheduler_th)
341
+ command = ["flower-superexec", "--insecure"]
342
+ command += [
343
+ "--appio-api-address",
344
+ simulationio_address if is_simulation else io_address,
345
+ ]
346
+ command += [
347
+ "--plugin-type",
348
+ ExecPluginType.SIMULATION if is_simulation else ExecPluginType.SERVER_APP,
349
+ ]
350
+ command += ["--parent-pid", str(os.getpid())]
351
+ # pylint: disable-next=consider-using-with
352
+ subprocess.Popen(command)
362
353
 
363
354
  # Graceful shutdown
364
355
  register_exit_handlers(
@@ -376,75 +367,6 @@ def run_superlink() -> None:
376
367
  flwr_exit(ExitCode.SUPERLINK_THREAD_CRASH)
377
368
 
378
369
 
379
- def _run_flwr_command(args: list[str], main_pid: int) -> None:
380
- # Monitor the main process in case of SIGKILL
381
- def main_process_monitor() -> None:
382
- while True:
383
- sleep(1)
384
- if os.getppid() != main_pid:
385
- os.kill(os.getpid(), 9)
386
-
387
- threading.Thread(target=main_process_monitor, daemon=True).start()
388
-
389
- # Run the command
390
- sys.argv = args
391
- if args[0] == "flwr-serverapp":
392
- flwr_serverapp()
393
- elif args[0] == "flwr-simulation":
394
- flwr_simulation()
395
- else:
396
- raise ValueError(f"Unknown command: {args[0]}")
397
-
398
-
399
- def _flwr_scheduler(
400
- state_factory: LinkStateFactory,
401
- io_api_arg: str,
402
- io_api_address: str,
403
- cmd: str,
404
- ) -> None:
405
- log(DEBUG, "Started %s scheduler thread.", cmd)
406
- state = state_factory.state()
407
- run_id_to_proc: dict[int, multiprocessing.context.SpawnProcess] = {}
408
-
409
- # Use the "spawn" start method for multiprocessing.
410
- mp_spawn_context = multiprocessing.get_context("spawn")
411
-
412
- # Periodically check for a pending run in the LinkState
413
- while True:
414
- sleep(0.1)
415
- pending_run_id = state.get_pending_run_id()
416
-
417
- if pending_run_id and pending_run_id not in run_id_to_proc:
418
-
419
- log(
420
- INFO,
421
- "Launching %s subprocess. Connects to SuperLink on %s",
422
- cmd,
423
- io_api_address,
424
- )
425
- # Start subprocess
426
- command = [
427
- cmd,
428
- "--run-once",
429
- io_api_arg,
430
- io_api_address,
431
- "--insecure",
432
- ]
433
-
434
- proc = mp_spawn_context.Process(
435
- target=_run_flwr_command, args=(command, os.getpid()), daemon=True
436
- )
437
- proc.start()
438
-
439
- # Store the process
440
- run_id_to_proc[pending_run_id] = proc
441
-
442
- # Clean up finished processes
443
- for run_id, proc in list(run_id_to_proc.items()):
444
- if not proc.is_alive():
445
- del run_id_to_proc[run_id]
446
-
447
-
448
370
  def _format_address(address: str) -> tuple[str, str, int]:
449
371
  parsed_address = parse_address(address)
450
372
  if not parsed_address:
@@ -92,7 +92,7 @@ def flwr_serverapp() -> None:
92
92
  serverappio_api_address=args.serverappio_api_address,
93
93
  log_queue=log_queue,
94
94
  token=args.token,
95
- run_once=args.run_once,
95
+ run_once=(args.token is not None) or args.run_once,
96
96
  flwr_dir=args.flwr_dir,
97
97
  certificates=None,
98
98
  parent_pid=args.parent_pid,
@@ -287,19 +287,6 @@ def _parse_args_run_flwr_serverapp() -> argparse.ArgumentParser:
287
287
  help="Address of SuperLink's ServerAppIo API (IPv4, IPv6, or a domain name)."
288
288
  f"By default, it is set to {SERVERAPPIO_API_DEFAULT_CLIENT_ADDRESS}.",
289
289
  )
290
- parser.add_argument(
291
- "--token",
292
- type=str,
293
- required=False,
294
- help="Unique token generated by SuperNode for each ServerApp execution",
295
- )
296
- parser.add_argument(
297
- "--parent-pid",
298
- type=int,
299
- default=None,
300
- help="The PID of the parent process. When set, the process will terminate "
301
- "when the parent process exits.",
302
- )
303
290
  parser.add_argument(
304
291
  "--run-once",
305
292
  action="store_true",
@@ -161,6 +161,7 @@ class RayBackend(Backend):
161
161
  "Call the backend's `build()` method before processing messages."
162
162
  )
163
163
 
164
+ future = None
164
165
  try:
165
166
  # Submit a task to the pool
166
167
  future = self.pool.submit(
@@ -183,7 +184,8 @@ class RayBackend(Backend):
183
184
  self.__class__.__name__,
184
185
  )
185
186
  # add actor back into pool
186
- self.pool.add_actor_back_to_pool(future)
187
+ if future is not None:
188
+ self.pool.add_actor_back_to_pool(future)
187
189
  raise ex
188
190
 
189
191
  def terminate(self) -> None:
@@ -23,7 +23,6 @@ from concurrent.futures import ThreadPoolExecutor
23
23
  from logging import DEBUG, ERROR, INFO, WARN
24
24
  from pathlib import Path
25
25
  from queue import Empty, Queue
26
- from time import sleep
27
26
  from typing import Callable, Optional
28
27
  from uuid import uuid4
29
28
 
@@ -153,7 +152,7 @@ def add_messages_to_queue(
153
152
  message_ins_list = state.get_message_ins(node_id=node_id, limit=1)
154
153
  for msg in message_ins_list:
155
154
  queue.put(msg)
156
- sleep(0.1)
155
+ f_stop.wait(0.1)
157
156
 
158
157
 
159
158
  def put_message_into_state(
@@ -182,6 +181,7 @@ def run_api(
182
181
  messageins_queue: Queue[Message] = Queue()
183
182
  messageres_queue: Queue[Message] = Queue()
184
183
 
184
+ backend = None
185
185
  try:
186
186
 
187
187
  # Instantiate backend
@@ -236,16 +236,16 @@ def run_api(
236
236
  log(ERROR, traceback.format_exc())
237
237
  log(WARN, "Stopping Simulation Engine.")
238
238
 
239
- # Manually trigger stopping event
240
- f_stop.set()
241
-
242
239
  # Raise exception
243
240
  raise RuntimeError("Simulation Engine crashed.") from ex
244
241
 
245
242
  finally:
243
+ # Manually trigger stopping event
244
+ f_stop.set()
246
245
 
247
246
  # Terminate backend
248
- backend.terminate()
247
+ if backend is not None:
248
+ backend.terminate()
249
249
 
250
250
 
251
251
  # pylint: disable=too-many-arguments,unused-argument,too-many-locals,too-many-branches
@@ -55,6 +55,8 @@ from flwr.proto.log_pb2 import ( # pylint: disable=E0611
55
55
  from flwr.proto.run_pb2 import ( # pylint: disable=E0611
56
56
  GetFederationOptionsRequest,
57
57
  GetFederationOptionsResponse,
58
+ GetRunRequest,
59
+ GetRunResponse,
58
60
  GetRunStatusRequest,
59
61
  GetRunStatusResponse,
60
62
  UpdateRunStatusRequest,
@@ -111,6 +113,23 @@ class SimulationIoServicer(simulationio_pb2_grpc.SimulationIoServicer):
111
113
  # Return the token
112
114
  return RequestTokenResponse(token=token or "")
113
115
 
116
+ def GetRun(
117
+ self, request: GetRunRequest, context: grpc.ServicerContext
118
+ ) -> GetRunResponse:
119
+ """Get run information."""
120
+ log(DEBUG, "SimulationIoServicer.GetRun")
121
+
122
+ # Init state
123
+ state = self.state_factory.state()
124
+
125
+ # Retrieve run information
126
+ run = state.get_run(request.run_id)
127
+
128
+ if run is None:
129
+ return GetRunResponse()
130
+
131
+ return GetRunResponse(run=run_to_proto(run))
132
+
114
133
  def PullAppInputs(
115
134
  self, request: PullAppInputsRequest, context: ServicerContext
116
135
  ) -> PullAppInputsResponse:
@@ -120,14 +139,11 @@ class SimulationIoServicer(simulationio_pb2_grpc.SimulationIoServicer):
120
139
  state = self.state_factory.state()
121
140
  ffs = self.ffs_factory.ffs()
122
141
 
142
+ # Validate the token
143
+ run_id = self._verify_token(request.token, context)
144
+
123
145
  # Lock access to LinkState, preventing obtaining the same pending run_id
124
146
  with self.lock:
125
- # Attempt getting the run_id of a pending run
126
- run_id = state.get_pending_run_id()
127
- # If there's no pending run, return an empty response
128
- if run_id is None:
129
- return PullAppInputsResponse()
130
-
131
147
  # Retrieve Context, Run and Fab for the run_id
132
148
  serverapp_ctxt = state.get_serverapp_context(run_id)
133
149
  run = state.get_run(run_id)
@@ -154,6 +170,11 @@ class SimulationIoServicer(simulationio_pb2_grpc.SimulationIoServicer):
154
170
  ) -> PushAppOutputsResponse:
155
171
  """Push Simulation process outputs."""
156
172
  log(DEBUG, "SimultionIoServicer.PushAppOutputs")
173
+
174
+ # Validate the token
175
+ run_id = self._verify_token(request.token, context)
176
+
177
+ # Init access to LinkState
157
178
  state = self.state_factory.state()
158
179
 
159
180
  # Abort if the run is not running
@@ -166,6 +187,9 @@ class SimulationIoServicer(simulationio_pb2_grpc.SimulationIoServicer):
166
187
  )
167
188
 
168
189
  state.set_serverapp_context(request.run_id, context_from_proto(request.context))
190
+
191
+ # Remove the token
192
+ state.delete_token(run_id)
169
193
  return PushAppOutputsResponse()
170
194
 
171
195
  def UpdateRunStatus(
@@ -248,3 +272,15 @@ class SimulationIoServicer(simulationio_pb2_grpc.SimulationIoServicer):
248
272
  )
249
273
 
250
274
  return SendAppHeartbeatResponse(success=success)
275
+
276
+ def _verify_token(self, token: str, context: grpc.ServicerContext) -> int:
277
+ """Verify the token and return the associated run ID."""
278
+ state = self.state_factory.state()
279
+ run_id = state.get_run_id_by_token(token)
280
+ if run_id is None or not state.verify_token(run_id, token):
281
+ context.abort(
282
+ grpc.StatusCode.PERMISSION_DENIED,
283
+ "Invalid token.",
284
+ )
285
+ raise RuntimeError("This line should never be reached.")
286
+ return run_id
@@ -19,7 +19,6 @@ import argparse
19
19
  import gc
20
20
  from logging import DEBUG, ERROR, INFO
21
21
  from queue import Queue
22
- from time import sleep
23
22
  from typing import Optional
24
23
 
25
24
  from flwr.cli.config_utils import get_fab_metadata
@@ -70,6 +69,7 @@ from flwr.proto.run_pb2 import ( # pylint: disable=E0611
70
69
  from flwr.server.superlink.fleet.vce.backend.backend import BackendConfig
71
70
  from flwr.simulation.run_simulation import _run_simulation
72
71
  from flwr.simulation.simulationio_connection import SimulationIoConnection
72
+ from flwr.supercore.app_utils import simple_get_token, start_parent_process_monitor
73
73
 
74
74
 
75
75
  def flwr_simulation() -> None:
@@ -97,23 +97,31 @@ def flwr_simulation() -> None:
97
97
  run_simulation_process(
98
98
  simulationio_api_address=args.simulationio_api_address,
99
99
  log_queue=log_queue,
100
- run_once=args.run_once,
100
+ run_once=(args.token is not None) or args.run_once,
101
+ token=args.token,
101
102
  flwr_dir_=args.flwr_dir,
102
103
  certificates=None,
104
+ parent_pid=args.parent_pid,
103
105
  )
104
106
 
105
107
  # Restore stdout/stderr
106
108
  restore_output()
107
109
 
108
110
 
109
- def run_simulation_process( # pylint: disable=R0914, disable=W0212, disable=R0915
111
+ def run_simulation_process( # pylint: disable=R0913, R0914, R0915, R0917, W0212
110
112
  simulationio_api_address: str,
111
113
  log_queue: Queue[Optional[str]],
112
114
  run_once: bool,
115
+ token: Optional[str] = None,
113
116
  flwr_dir_: Optional[str] = None,
114
117
  certificates: Optional[bytes] = None,
118
+ parent_pid: Optional[int] = None,
115
119
  ) -> None:
116
120
  """Run Flower Simulation process."""
121
+ # Start monitoring the parent process if a PID is provided
122
+ if parent_pid is not None:
123
+ start_parent_process_monitor(parent_pid)
124
+
117
125
  conn = SimulationIoConnection(
118
126
  simulationio_service_address=simulationio_api_address,
119
127
  root_certificates=certificates,
@@ -123,18 +131,19 @@ def run_simulation_process( # pylint: disable=R0914, disable=W0212, disable=R09
123
131
  flwr_dir = get_flwr_dir(flwr_dir_)
124
132
  log_uploader = None
125
133
  heartbeat_sender = None
134
+ run_status = None
126
135
 
127
136
  while True:
128
137
 
129
138
  try:
139
+ # If token is not set, loop until token is received from SuperNode
140
+ if token is None:
141
+ log(DEBUG, "[flwr-simulation] Request token")
142
+ token = simple_get_token(conn._stub)
143
+
130
144
  # Pull SimulationInputs from LinkState
131
- req = PullAppInputsRequest()
145
+ req = PullAppInputsRequest(token=token)
132
146
  res: PullAppInputsResponse = conn._stub.PullAppInputs(req)
133
- if not res.HasField("run"):
134
- sleep(3)
135
- run_status = None
136
- continue
137
-
138
147
  context = context_from_proto(res.context)
139
148
  run = run_from_proto(res.run)
140
149
  fab = fab_from_proto(res.fab)
@@ -240,7 +249,9 @@ def run_simulation_process( # pylint: disable=R0914, disable=W0212, disable=R09
240
249
 
241
250
  # Send resulting context
242
251
  context_proto = context_to_proto(updated_context)
243
- out_req = PushAppOutputsRequest(run_id=run.run_id, context=context_proto)
252
+ out_req = PushAppOutputsRequest(
253
+ token=token, run_id=run.run_id, context=context_proto
254
+ )
244
255
  _ = conn._stub.PushAppOutputs(out_req)
245
256
 
246
257
  run_status = RunStatus(Status.FINISHED, SubStatus.COMPLETED, "")
@@ -269,12 +280,16 @@ def run_simulation_process( # pylint: disable=R0914, disable=W0212, disable=R09
269
280
  run_id=run.run_id, run_status=run_status_proto
270
281
  )
271
282
  )
283
+ run_status = None
272
284
 
273
285
  # Clean up the Context if it exists
274
286
  try:
275
287
  del updated_context
276
288
  except NameError:
277
289
  pass
290
+
291
+ # Remove the token
292
+ token = None
278
293
  gc.collect()
279
294
 
280
295
  # Stop the loop if `flwr-simulation` is expected to process a single run
@@ -29,6 +29,7 @@ from flwr.proto.appio_pb2 import ( # pylint: disable=E0611
29
29
  )
30
30
  from flwr.proto.clientappio_pb2_grpc import ClientAppIoStub
31
31
  from flwr.proto.serverappio_pb2_grpc import ServerAppIoStub
32
+ from flwr.proto.simulationio_pb2_grpc import SimulationIoStub
32
33
 
33
34
  if os.name == "nt":
34
35
  from ctypes import windll # type: ignore
@@ -70,7 +71,9 @@ def start_parent_process_monitor(
70
71
  threading.Thread(target=monitor, daemon=True).start()
71
72
 
72
73
 
73
- def simple_get_token(stub: Union[ClientAppIoStub, ServerAppIoStub]) -> str:
74
+ def simple_get_token(
75
+ stub: Union[ClientAppIoStub, ServerAppIoStub, SimulationIoStub]
76
+ ) -> str:
74
77
  """Get a token from SuperLink/SuperNode.
75
78
 
76
79
  This shall be removed once the SuperExec is fully implemented.
@@ -65,19 +65,6 @@ def _parse_args_run_flwr_clientapp() -> argparse.ArgumentParser:
65
65
  help="Address of SuperNode's ClientAppIo API (IPv4, IPv6, or a domain name)."
66
66
  f"By default, it is set to {CLIENTAPPIO_API_DEFAULT_CLIENT_ADDRESS}.",
67
67
  )
68
- parser.add_argument(
69
- "--token",
70
- type=str,
71
- required=False,
72
- help="Unique token generated by SuperNode for each ClientApp execution",
73
- )
74
- parser.add_argument(
75
- "--parent-pid",
76
- type=int,
77
- default=None,
78
- help="The PID of the parent process. When set, the process will terminate "
79
- "when the parent process exits.",
80
- )
81
68
  parser.add_argument(
82
69
  "--run-once",
83
70
  action="store_true",