flwr-nightly 1.21.0.dev20250809__tar.gz → 1.21.0.dev20250812__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 (395) hide show
  1. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/PKG-INFO +1 -1
  2. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/common/constant.py +2 -0
  3. flwr_nightly-1.21.0.dev20250812/py/flwr/proto/simulationio_pb2.py +32 -0
  4. flwr_nightly-1.21.0.dev20250812/py/flwr/proto/simulationio_pb2.pyi +7 -0
  5. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/proto/simulationio_pb2_grpc.py +95 -27
  6. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/proto/simulationio_pb2_grpc.pyi +39 -13
  7. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/superlink/simulation/simulationio_servicer.py +56 -16
  8. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/simulation/app.py +9 -11
  9. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/supercore/app_utils.py +28 -2
  10. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/supercore/cli/flower_superexec.py +20 -1
  11. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/supercore/superexec/plugin/__init__.py +2 -0
  12. flwr_nightly-1.21.0.dev20250812/py/flwr/supercore/superexec/plugin/simulation_exec_plugin.py +28 -0
  13. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/supercore/superexec/run_superexec.py +9 -0
  14. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/pyproject.toml +1 -1
  15. flwr_nightly-1.21.0.dev20250809/py/flwr/proto/simulationio_pb2.py +0 -39
  16. flwr_nightly-1.21.0.dev20250809/py/flwr/proto/simulationio_pb2.pyi +0 -65
  17. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/README.md +0 -0
  18. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/__init__.py +0 -0
  19. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/app/__init__.py +0 -0
  20. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/app/error.py +0 -0
  21. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/app/metadata.py +0 -0
  22. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/cli/__init__.py +0 -0
  23. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/cli/app.py +0 -0
  24. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/cli/auth_plugin/__init__.py +0 -0
  25. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/cli/auth_plugin/oidc_cli_plugin.py +0 -0
  26. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/cli/build.py +0 -0
  27. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/cli/cli_user_auth_interceptor.py +0 -0
  28. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/cli/config_utils.py +0 -0
  29. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/cli/constant.py +0 -0
  30. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/cli/example.py +0 -0
  31. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/cli/install.py +0 -0
  32. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/cli/log.py +0 -0
  33. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/cli/login/__init__.py +0 -0
  34. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/cli/login/login.py +0 -0
  35. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/cli/ls.py +0 -0
  36. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/cli/new/__init__.py +0 -0
  37. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/cli/new/new.py +0 -0
  38. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/cli/new/templates/__init__.py +0 -0
  39. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/cli/new/templates/app/.gitignore.tpl +0 -0
  40. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/cli/new/templates/app/LICENSE.tpl +0 -0
  41. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/cli/new/templates/app/README.baseline.md.tpl +0 -0
  42. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/cli/new/templates/app/README.flowertune.md.tpl +0 -0
  43. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/cli/new/templates/app/README.md.tpl +0 -0
  44. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/cli/new/templates/app/__init__.py +0 -0
  45. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/cli/new/templates/app/code/__init__.baseline.py.tpl +0 -0
  46. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
  47. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
  48. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/cli/new/templates/app/code/client.baseline.py.tpl +0 -0
  49. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/cli/new/templates/app/code/client.huggingface.py.tpl +0 -0
  50. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/cli/new/templates/app/code/client.jax.py.tpl +0 -0
  51. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/cli/new/templates/app/code/client.mlx.py.tpl +0 -0
  52. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/cli/new/templates/app/code/client.numpy.py.tpl +0 -0
  53. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -0
  54. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl +0 -0
  55. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -0
  56. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/cli/new/templates/app/code/dataset.baseline.py.tpl +0 -0
  57. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/cli/new/templates/app/code/flwr_tune/__init__.py +0 -0
  58. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/cli/new/templates/app/code/flwr_tune/client_app.py.tpl +0 -0
  59. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/cli/new/templates/app/code/flwr_tune/dataset.py.tpl +0 -0
  60. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/cli/new/templates/app/code/flwr_tune/models.py.tpl +0 -0
  61. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/cli/new/templates/app/code/flwr_tune/server_app.py.tpl +0 -0
  62. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/cli/new/templates/app/code/flwr_tune/strategy.py.tpl +0 -0
  63. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/cli/new/templates/app/code/model.baseline.py.tpl +0 -0
  64. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/cli/new/templates/app/code/server.baseline.py.tpl +0 -0
  65. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/cli/new/templates/app/code/server.huggingface.py.tpl +0 -0
  66. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/cli/new/templates/app/code/server.jax.py.tpl +0 -0
  67. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/cli/new/templates/app/code/server.mlx.py.tpl +0 -0
  68. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -0
  69. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -0
  70. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/cli/new/templates/app/code/server.sklearn.py.tpl +0 -0
  71. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -0
  72. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/cli/new/templates/app/code/strategy.baseline.py.tpl +0 -0
  73. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/cli/new/templates/app/code/task.huggingface.py.tpl +0 -0
  74. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/cli/new/templates/app/code/task.jax.py.tpl +0 -0
  75. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/cli/new/templates/app/code/task.mlx.py.tpl +0 -0
  76. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/cli/new/templates/app/code/task.numpy.py.tpl +0 -0
  77. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +0 -0
  78. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/cli/new/templates/app/code/task.sklearn.py.tpl +0 -0
  79. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/cli/new/templates/app/code/task.tensorflow.py.tpl +0 -0
  80. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/cli/new/templates/app/code/utils.baseline.py.tpl +0 -0
  81. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/cli/new/templates/app/pyproject.baseline.toml.tpl +0 -0
  82. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +0 -0
  83. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl +0 -0
  84. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/cli/new/templates/app/pyproject.jax.toml.tpl +0 -0
  85. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +0 -0
  86. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +0 -0
  87. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +0 -0
  88. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +0 -0
  89. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +0 -0
  90. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/cli/run/__init__.py +0 -0
  91. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/cli/run/run.py +0 -0
  92. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/cli/stop.py +0 -0
  93. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/cli/utils.py +0 -0
  94. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/client/__init__.py +0 -0
  95. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/client/client.py +0 -0
  96. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/client/client_app.py +0 -0
  97. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/client/clientapp/__init__.py +0 -0
  98. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/client/clientapp/utils.py +0 -0
  99. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/client/dpfedavg_numpy_client.py +0 -0
  100. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/client/grpc_adapter_client/__init__.py +0 -0
  101. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/client/grpc_adapter_client/connection.py +0 -0
  102. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/client/grpc_rere_client/__init__.py +0 -0
  103. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/client/grpc_rere_client/client_interceptor.py +0 -0
  104. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/client/grpc_rere_client/connection.py +0 -0
  105. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/client/grpc_rere_client/grpc_adapter.py +0 -0
  106. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/client/message_handler/__init__.py +0 -0
  107. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/client/message_handler/message_handler.py +0 -0
  108. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/client/mod/__init__.py +0 -0
  109. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/client/mod/centraldp_mods.py +0 -0
  110. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/client/mod/comms_mods.py +0 -0
  111. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/client/mod/localdp_mod.py +0 -0
  112. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
  113. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
  114. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
  115. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/client/mod/utils.py +0 -0
  116. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/client/numpy_client.py +0 -0
  117. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/client/rest_client/__init__.py +0 -0
  118. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/client/rest_client/connection.py +0 -0
  119. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/client/run_info_store.py +0 -0
  120. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/client/typing.py +0 -0
  121. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/clientapp/__init__.py +0 -0
  122. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/common/__init__.py +0 -0
  123. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/common/address.py +0 -0
  124. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/common/args.py +0 -0
  125. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/common/auth_plugin/__init__.py +0 -0
  126. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/common/auth_plugin/auth_plugin.py +0 -0
  127. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/common/config.py +0 -0
  128. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/common/context.py +0 -0
  129. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/common/date.py +0 -0
  130. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/common/differential_privacy.py +0 -0
  131. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/common/differential_privacy_constants.py +0 -0
  132. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/common/dp.py +0 -0
  133. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/common/event_log_plugin/__init__.py +0 -0
  134. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/common/event_log_plugin/event_log_plugin.py +0 -0
  135. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/common/exit/__init__.py +0 -0
  136. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/common/exit/exit.py +0 -0
  137. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/common/exit/exit_code.py +0 -0
  138. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/common/exit_handlers.py +0 -0
  139. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/common/grpc.py +0 -0
  140. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/common/heartbeat.py +0 -0
  141. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/common/inflatable.py +0 -0
  142. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/common/inflatable_protobuf_utils.py +0 -0
  143. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/common/inflatable_utils.py +0 -0
  144. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/common/logger.py +0 -0
  145. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/common/message.py +0 -0
  146. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/common/object_ref.py +0 -0
  147. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/common/parameter.py +0 -0
  148. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/common/pyproject.py +0 -0
  149. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/common/record/__init__.py +0 -0
  150. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/common/record/array.py +0 -0
  151. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/common/record/arraychunk.py +0 -0
  152. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/common/record/arrayrecord.py +0 -0
  153. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/common/record/configrecord.py +0 -0
  154. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/common/record/conversion_utils.py +0 -0
  155. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/common/record/metricrecord.py +0 -0
  156. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/common/record/recorddict.py +0 -0
  157. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/common/record/typeddict.py +0 -0
  158. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/common/recorddict_compat.py +0 -0
  159. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/common/retry_invoker.py +0 -0
  160. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/common/secure_aggregation/__init__.py +0 -0
  161. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
  162. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
  163. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -0
  164. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
  165. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/common/secure_aggregation/quantization.py +0 -0
  166. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
  167. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
  168. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/common/serde.py +0 -0
  169. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/common/serde_utils.py +0 -0
  170. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/common/telemetry.py +0 -0
  171. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/common/typing.py +0 -0
  172. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/common/version.py +0 -0
  173. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/compat/__init__.py +0 -0
  174. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/compat/client/__init__.py +0 -0
  175. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/compat/client/app.py +0 -0
  176. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/compat/client/grpc_client/__init__.py +0 -0
  177. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/compat/client/grpc_client/connection.py +0 -0
  178. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/compat/common/__init__.py +0 -0
  179. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/compat/server/__init__.py +0 -0
  180. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/compat/server/app.py +0 -0
  181. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/compat/simulation/__init__.py +0 -0
  182. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/proto/__init__.py +0 -0
  183. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/proto/appio_pb2.py +0 -0
  184. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/proto/appio_pb2.pyi +0 -0
  185. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/proto/appio_pb2_grpc.py +0 -0
  186. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/proto/appio_pb2_grpc.pyi +0 -0
  187. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/proto/clientappio_pb2.py +0 -0
  188. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/proto/clientappio_pb2.pyi +0 -0
  189. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/proto/clientappio_pb2_grpc.py +0 -0
  190. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/proto/clientappio_pb2_grpc.pyi +0 -0
  191. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/proto/control_pb2.py +0 -0
  192. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/proto/control_pb2.pyi +0 -0
  193. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/proto/control_pb2_grpc.py +0 -0
  194. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/proto/control_pb2_grpc.pyi +0 -0
  195. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/proto/error_pb2.py +0 -0
  196. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/proto/error_pb2.pyi +0 -0
  197. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/proto/error_pb2_grpc.py +0 -0
  198. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/proto/error_pb2_grpc.pyi +0 -0
  199. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/proto/fab_pb2.py +0 -0
  200. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/proto/fab_pb2.pyi +0 -0
  201. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/proto/fab_pb2_grpc.py +0 -0
  202. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/proto/fab_pb2_grpc.pyi +0 -0
  203. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/proto/fleet_pb2.py +0 -0
  204. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/proto/fleet_pb2.pyi +0 -0
  205. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/proto/fleet_pb2_grpc.py +0 -0
  206. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
  207. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/proto/grpcadapter_pb2.py +0 -0
  208. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/proto/grpcadapter_pb2.pyi +0 -0
  209. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/proto/grpcadapter_pb2_grpc.py +0 -0
  210. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/proto/grpcadapter_pb2_grpc.pyi +0 -0
  211. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/proto/heartbeat_pb2.py +0 -0
  212. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/proto/heartbeat_pb2.pyi +0 -0
  213. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/proto/heartbeat_pb2_grpc.py +0 -0
  214. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/proto/heartbeat_pb2_grpc.pyi +0 -0
  215. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/proto/log_pb2.py +0 -0
  216. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/proto/log_pb2.pyi +0 -0
  217. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/proto/log_pb2_grpc.py +0 -0
  218. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/proto/log_pb2_grpc.pyi +0 -0
  219. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/proto/message_pb2.py +0 -0
  220. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/proto/message_pb2.pyi +0 -0
  221. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/proto/message_pb2_grpc.py +0 -0
  222. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/proto/message_pb2_grpc.pyi +0 -0
  223. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/proto/node_pb2.py +0 -0
  224. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/proto/node_pb2.pyi +0 -0
  225. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/proto/node_pb2_grpc.py +0 -0
  226. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/proto/node_pb2_grpc.pyi +0 -0
  227. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/proto/recorddict_pb2.py +0 -0
  228. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/proto/recorddict_pb2.pyi +0 -0
  229. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/proto/recorddict_pb2_grpc.py +0 -0
  230. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/proto/recorddict_pb2_grpc.pyi +0 -0
  231. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/proto/run_pb2.py +0 -0
  232. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/proto/run_pb2.pyi +0 -0
  233. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/proto/run_pb2_grpc.py +0 -0
  234. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/proto/run_pb2_grpc.pyi +0 -0
  235. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/proto/serverappio_pb2.py +0 -0
  236. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/proto/serverappio_pb2.pyi +0 -0
  237. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/proto/serverappio_pb2_grpc.py +0 -0
  238. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/proto/serverappio_pb2_grpc.pyi +0 -0
  239. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/proto/transport_pb2.py +0 -0
  240. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/proto/transport_pb2.pyi +0 -0
  241. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/proto/transport_pb2_grpc.py +0 -0
  242. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
  243. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/py.typed +0 -0
  244. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/__init__.py +0 -0
  245. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/app.py +0 -0
  246. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/client_manager.py +0 -0
  247. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/client_proxy.py +0 -0
  248. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/compat/__init__.py +0 -0
  249. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/compat/app.py +0 -0
  250. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/compat/app_utils.py +0 -0
  251. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/compat/grid_client_proxy.py +0 -0
  252. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/compat/legacy_context.py +0 -0
  253. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/criterion.py +0 -0
  254. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/fleet_event_log_interceptor.py +0 -0
  255. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/grid/__init__.py +0 -0
  256. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/grid/grid.py +0 -0
  257. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/grid/grpc_grid.py +0 -0
  258. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/grid/inmemory_grid.py +0 -0
  259. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/history.py +0 -0
  260. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/run_serverapp.py +0 -0
  261. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/server.py +0 -0
  262. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/server_app.py +0 -0
  263. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/server_config.py +0 -0
  264. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/serverapp/__init__.py +0 -0
  265. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/serverapp/app.py +0 -0
  266. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/serverapp_components.py +0 -0
  267. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/strategy/__init__.py +0 -0
  268. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/strategy/aggregate.py +0 -0
  269. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/strategy/bulyan.py +0 -0
  270. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
  271. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
  272. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
  273. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
  274. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
  275. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/strategy/fedadagrad.py +0 -0
  276. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/strategy/fedadam.py +0 -0
  277. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/strategy/fedavg.py +0 -0
  278. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/strategy/fedavg_android.py +0 -0
  279. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/strategy/fedavgm.py +0 -0
  280. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/strategy/fedmedian.py +0 -0
  281. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/strategy/fedopt.py +0 -0
  282. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/strategy/fedprox.py +0 -0
  283. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
  284. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
  285. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
  286. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
  287. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/strategy/fedyogi.py +0 -0
  288. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/strategy/krum.py +0 -0
  289. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/strategy/qfedavg.py +0 -0
  290. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/strategy/strategy.py +0 -0
  291. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/superlink/__init__.py +0 -0
  292. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/superlink/fleet/__init__.py +0 -0
  293. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/superlink/fleet/grpc_adapter/__init__.py +0 -0
  294. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +0 -0
  295. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
  296. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
  297. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
  298. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
  299. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +0 -0
  300. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
  301. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +0 -0
  302. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +0 -0
  303. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
  304. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/superlink/fleet/message_handler/message_handler.py +0 -0
  305. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
  306. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +0 -0
  307. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
  308. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
  309. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
  310. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +0 -0
  311. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/superlink/fleet/vce/vce_api.py +0 -0
  312. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/superlink/linkstate/__init__.py +0 -0
  313. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/superlink/linkstate/in_memory_linkstate.py +0 -0
  314. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/superlink/linkstate/linkstate.py +0 -0
  315. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/superlink/linkstate/linkstate_factory.py +0 -0
  316. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/superlink/linkstate/sqlite_linkstate.py +0 -0
  317. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/superlink/linkstate/utils.py +0 -0
  318. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/superlink/serverappio/__init__.py +0 -0
  319. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/superlink/serverappio/serverappio_grpc.py +0 -0
  320. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/superlink/serverappio/serverappio_servicer.py +0 -0
  321. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/superlink/simulation/__init__.py +0 -0
  322. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/superlink/simulation/simulationio_grpc.py +0 -0
  323. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/superlink/utils.py +0 -0
  324. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/typing.py +0 -0
  325. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/utils/__init__.py +0 -0
  326. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/utils/tensorboard.py +0 -0
  327. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/utils/validator.py +0 -0
  328. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/workflow/__init__.py +0 -0
  329. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/workflow/constant.py +0 -0
  330. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/workflow/default_workflows.py +0 -0
  331. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
  332. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
  333. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +0 -0
  334. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/serverapp/__init__.py +0 -0
  335. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/simulation/__init__.py +0 -0
  336. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/simulation/legacy_app.py +0 -0
  337. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/simulation/ray_transport/__init__.py +0 -0
  338. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
  339. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
  340. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/simulation/ray_transport/utils.py +0 -0
  341. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/simulation/run_simulation.py +0 -0
  342. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/simulation/simulationio_connection.py +0 -0
  343. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/supercore/__init__.py +0 -0
  344. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/supercore/cli/__init__.py +0 -0
  345. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/supercore/corestate/__init__.py +0 -0
  346. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/supercore/corestate/corestate.py +0 -0
  347. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/supercore/ffs/__init__.py +0 -0
  348. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/supercore/ffs/disk_ffs.py +0 -0
  349. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/supercore/ffs/ffs.py +0 -0
  350. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/supercore/ffs/ffs_factory.py +0 -0
  351. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/supercore/grpc_health/__init__.py +0 -0
  352. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/supercore/grpc_health/simple_health_servicer.py +0 -0
  353. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/supercore/license_plugin/__init__.py +0 -0
  354. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/supercore/license_plugin/license_plugin.py +0 -0
  355. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/supercore/object_store/__init__.py +0 -0
  356. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/supercore/object_store/in_memory_object_store.py +0 -0
  357. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/supercore/object_store/object_store.py +0 -0
  358. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/supercore/object_store/object_store_factory.py +0 -0
  359. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/supercore/object_store/utils.py +0 -0
  360. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/supercore/superexec/__init__.py +0 -0
  361. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/supercore/superexec/plugin/base_exec_plugin.py +0 -0
  362. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/supercore/superexec/plugin/clientapp_exec_plugin.py +0 -0
  363. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/supercore/superexec/plugin/exec_plugin.py +0 -0
  364. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/supercore/superexec/plugin/serverapp_exec_plugin.py +0 -0
  365. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/supercore/utils.py +0 -0
  366. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/superexec/__init__.py +0 -0
  367. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/superexec/deployment.py +0 -0
  368. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/superexec/simulation.py +0 -0
  369. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/superlink/__init__.py +0 -0
  370. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/superlink/executor/__init__.py +0 -0
  371. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/superlink/executor/app.py +0 -0
  372. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/superlink/executor/deployment.py +0 -0
  373. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/superlink/executor/executor.py +0 -0
  374. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/superlink/executor/simulation.py +0 -0
  375. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/superlink/servicer/__init__.py +0 -0
  376. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/superlink/servicer/control/__init__.py +0 -0
  377. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/superlink/servicer/control/control_event_log_interceptor.py +0 -0
  378. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/superlink/servicer/control/control_grpc.py +0 -0
  379. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/superlink/servicer/control/control_license_interceptor.py +0 -0
  380. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/superlink/servicer/control/control_servicer.py +0 -0
  381. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/superlink/servicer/control/control_user_auth_interceptor.py +0 -0
  382. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/supernode/__init__.py +0 -0
  383. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/supernode/cli/__init__.py +0 -0
  384. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/supernode/cli/flower_supernode.py +0 -0
  385. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/supernode/cli/flwr_clientapp.py +0 -0
  386. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/supernode/nodestate/__init__.py +0 -0
  387. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/supernode/nodestate/in_memory_nodestate.py +0 -0
  388. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/supernode/nodestate/nodestate.py +0 -0
  389. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/supernode/nodestate/nodestate_factory.py +0 -0
  390. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/supernode/runtime/__init__.py +0 -0
  391. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/supernode/runtime/run_clientapp.py +0 -0
  392. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/supernode/servicer/__init__.py +0 -0
  393. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/supernode/servicer/clientappio/__init__.py +0 -0
  394. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/supernode/servicer/clientappio/clientappio_servicer.py +0 -0
  395. {flwr_nightly-1.21.0.dev20250809 → flwr_nightly-1.21.0.dev20250812}/py/flwr/supernode/start_client_internal.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: flwr-nightly
3
- Version: 1.21.0.dev20250809
3
+ Version: 1.21.0.dev20250812
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
@@ -265,6 +265,8 @@ class ExecPluginType:
265
265
  """SuperExec plugin types."""
266
266
 
267
267
  CLIENT_APP = "clientapp"
268
+ SERVER_APP = "serverapp"
269
+ SIMULATION = "simulation"
268
270
 
269
271
  def __new__(cls) -> ExecPluginType:
270
272
  """Prevent instantiation."""
@@ -0,0 +1,32 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Generated by the protocol buffer compiler. DO NOT EDIT!
3
+ # source: flwr/proto/simulationio.proto
4
+ # Protobuf Python Version: 4.25.1
5
+ """Generated protocol buffer code."""
6
+ from google.protobuf import descriptor as _descriptor
7
+ from google.protobuf import descriptor_pool as _descriptor_pool
8
+ from google.protobuf import symbol_database as _symbol_database
9
+ from google.protobuf.internal import builder as _builder
10
+ # @@protoc_insertion_point(imports)
11
+
12
+ _sym_db = _symbol_database.Default()
13
+
14
+
15
+ from flwr.proto import heartbeat_pb2 as flwr_dot_proto_dot_heartbeat__pb2
16
+ from flwr.proto import log_pb2 as flwr_dot_proto_dot_log__pb2
17
+ from flwr.proto import message_pb2 as flwr_dot_proto_dot_message__pb2
18
+ from flwr.proto import run_pb2 as flwr_dot_proto_dot_run__pb2
19
+ from flwr.proto import fab_pb2 as flwr_dot_proto_dot_fab__pb2
20
+ from flwr.proto import appio_pb2 as flwr_dot_proto_dot_appio__pb2
21
+
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')
24
+
25
+ _globals = globals()
26
+ _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
27
+ _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'flwr.proto.simulationio_pb2', _globals)
28
+ if _descriptor._USE_C_DESCRIPTORS == False:
29
+ DESCRIPTOR._options = None
30
+ _globals['_SIMULATIONIO']._serialized_start=190
31
+ _globals['_SIMULATIONIO']._serialized_end=1023
32
+ # @@protoc_insertion_point(module_scope)
@@ -0,0 +1,7 @@
1
+ """
2
+ @generated by mypy-protobuf. Do not edit manually!
3
+ isort:skip_file
4
+ """
5
+ import google.protobuf.descriptor
6
+
7
+ DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
@@ -2,10 +2,10 @@
2
2
  """Client and server classes corresponding to protobuf-defined services."""
3
3
  import grpc
4
4
 
5
+ from flwr.proto import appio_pb2 as flwr_dot_proto_dot_appio__pb2
5
6
  from flwr.proto import heartbeat_pb2 as flwr_dot_proto_dot_heartbeat__pb2
6
7
  from flwr.proto import log_pb2 as flwr_dot_proto_dot_log__pb2
7
8
  from flwr.proto import run_pb2 as flwr_dot_proto_dot_run__pb2
8
- from flwr.proto import simulationio_pb2 as flwr_dot_proto_dot_simulationio__pb2
9
9
 
10
10
 
11
11
  class SimulationIoStub(object):
@@ -17,15 +17,25 @@ class SimulationIoStub(object):
17
17
  Args:
18
18
  channel: A grpc.Channel.
19
19
  """
20
- self.PullSimulationInputs = channel.unary_unary(
21
- '/flwr.proto.SimulationIo/PullSimulationInputs',
22
- request_serializer=flwr_dot_proto_dot_simulationio__pb2.PullSimulationInputsRequest.SerializeToString,
23
- response_deserializer=flwr_dot_proto_dot_simulationio__pb2.PullSimulationInputsResponse.FromString,
20
+ self.ListAppsToLaunch = channel.unary_unary(
21
+ '/flwr.proto.SimulationIo/ListAppsToLaunch',
22
+ request_serializer=flwr_dot_proto_dot_appio__pb2.ListAppsToLaunchRequest.SerializeToString,
23
+ response_deserializer=flwr_dot_proto_dot_appio__pb2.ListAppsToLaunchResponse.FromString,
24
24
  )
25
- self.PushSimulationOutputs = channel.unary_unary(
26
- '/flwr.proto.SimulationIo/PushSimulationOutputs',
27
- request_serializer=flwr_dot_proto_dot_simulationio__pb2.PushSimulationOutputsRequest.SerializeToString,
28
- response_deserializer=flwr_dot_proto_dot_simulationio__pb2.PushSimulationOutputsResponse.FromString,
25
+ self.RequestToken = channel.unary_unary(
26
+ '/flwr.proto.SimulationIo/RequestToken',
27
+ request_serializer=flwr_dot_proto_dot_appio__pb2.RequestTokenRequest.SerializeToString,
28
+ response_deserializer=flwr_dot_proto_dot_appio__pb2.RequestTokenResponse.FromString,
29
+ )
30
+ self.PullAppInputs = channel.unary_unary(
31
+ '/flwr.proto.SimulationIo/PullAppInputs',
32
+ request_serializer=flwr_dot_proto_dot_appio__pb2.PullAppInputsRequest.SerializeToString,
33
+ response_deserializer=flwr_dot_proto_dot_appio__pb2.PullAppInputsResponse.FromString,
34
+ )
35
+ self.PushAppOutputs = channel.unary_unary(
36
+ '/flwr.proto.SimulationIo/PushAppOutputs',
37
+ request_serializer=flwr_dot_proto_dot_appio__pb2.PushAppOutputsRequest.SerializeToString,
38
+ response_deserializer=flwr_dot_proto_dot_appio__pb2.PushAppOutputsResponse.FromString,
29
39
  )
30
40
  self.UpdateRunStatus = channel.unary_unary(
31
41
  '/flwr.proto.SimulationIo/UpdateRunStatus',
@@ -57,14 +67,28 @@ class SimulationIoStub(object):
57
67
  class SimulationIoServicer(object):
58
68
  """Missing associated documentation comment in .proto file."""
59
69
 
60
- def PullSimulationInputs(self, request, context):
70
+ def ListAppsToLaunch(self, request, context):
71
+ """List runs to launch
72
+ """
73
+ context.set_code(grpc.StatusCode.UNIMPLEMENTED)
74
+ context.set_details('Method not implemented!')
75
+ raise NotImplementedError('Method not implemented!')
76
+
77
+ def RequestToken(self, request, context):
78
+ """Request token for a run
79
+ """
80
+ context.set_code(grpc.StatusCode.UNIMPLEMENTED)
81
+ context.set_details('Method not implemented!')
82
+ raise NotImplementedError('Method not implemented!')
83
+
84
+ def PullAppInputs(self, request, context):
61
85
  """Pull Simulation inputs
62
86
  """
63
87
  context.set_code(grpc.StatusCode.UNIMPLEMENTED)
64
88
  context.set_details('Method not implemented!')
65
89
  raise NotImplementedError('Method not implemented!')
66
90
 
67
- def PushSimulationOutputs(self, request, context):
91
+ def PushAppOutputs(self, request, context):
68
92
  """Push Simulation outputs
69
93
  """
70
94
  context.set_code(grpc.StatusCode.UNIMPLEMENTED)
@@ -109,15 +133,25 @@ class SimulationIoServicer(object):
109
133
 
110
134
  def add_SimulationIoServicer_to_server(servicer, server):
111
135
  rpc_method_handlers = {
112
- 'PullSimulationInputs': grpc.unary_unary_rpc_method_handler(
113
- servicer.PullSimulationInputs,
114
- request_deserializer=flwr_dot_proto_dot_simulationio__pb2.PullSimulationInputsRequest.FromString,
115
- response_serializer=flwr_dot_proto_dot_simulationio__pb2.PullSimulationInputsResponse.SerializeToString,
136
+ 'ListAppsToLaunch': grpc.unary_unary_rpc_method_handler(
137
+ servicer.ListAppsToLaunch,
138
+ request_deserializer=flwr_dot_proto_dot_appio__pb2.ListAppsToLaunchRequest.FromString,
139
+ response_serializer=flwr_dot_proto_dot_appio__pb2.ListAppsToLaunchResponse.SerializeToString,
140
+ ),
141
+ 'RequestToken': grpc.unary_unary_rpc_method_handler(
142
+ servicer.RequestToken,
143
+ request_deserializer=flwr_dot_proto_dot_appio__pb2.RequestTokenRequest.FromString,
144
+ response_serializer=flwr_dot_proto_dot_appio__pb2.RequestTokenResponse.SerializeToString,
116
145
  ),
117
- 'PushSimulationOutputs': grpc.unary_unary_rpc_method_handler(
118
- servicer.PushSimulationOutputs,
119
- request_deserializer=flwr_dot_proto_dot_simulationio__pb2.PushSimulationOutputsRequest.FromString,
120
- response_serializer=flwr_dot_proto_dot_simulationio__pb2.PushSimulationOutputsResponse.SerializeToString,
146
+ 'PullAppInputs': grpc.unary_unary_rpc_method_handler(
147
+ servicer.PullAppInputs,
148
+ request_deserializer=flwr_dot_proto_dot_appio__pb2.PullAppInputsRequest.FromString,
149
+ response_serializer=flwr_dot_proto_dot_appio__pb2.PullAppInputsResponse.SerializeToString,
150
+ ),
151
+ 'PushAppOutputs': grpc.unary_unary_rpc_method_handler(
152
+ servicer.PushAppOutputs,
153
+ request_deserializer=flwr_dot_proto_dot_appio__pb2.PushAppOutputsRequest.FromString,
154
+ response_serializer=flwr_dot_proto_dot_appio__pb2.PushAppOutputsResponse.SerializeToString,
121
155
  ),
122
156
  'UpdateRunStatus': grpc.unary_unary_rpc_method_handler(
123
157
  servicer.UpdateRunStatus,
@@ -155,7 +189,41 @@ class SimulationIo(object):
155
189
  """Missing associated documentation comment in .proto file."""
156
190
 
157
191
  @staticmethod
158
- def PullSimulationInputs(request,
192
+ def ListAppsToLaunch(request,
193
+ target,
194
+ options=(),
195
+ channel_credentials=None,
196
+ call_credentials=None,
197
+ insecure=False,
198
+ compression=None,
199
+ wait_for_ready=None,
200
+ timeout=None,
201
+ metadata=None):
202
+ return grpc.experimental.unary_unary(request, target, '/flwr.proto.SimulationIo/ListAppsToLaunch',
203
+ flwr_dot_proto_dot_appio__pb2.ListAppsToLaunchRequest.SerializeToString,
204
+ flwr_dot_proto_dot_appio__pb2.ListAppsToLaunchResponse.FromString,
205
+ options, channel_credentials,
206
+ insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
207
+
208
+ @staticmethod
209
+ def RequestToken(request,
210
+ target,
211
+ options=(),
212
+ channel_credentials=None,
213
+ call_credentials=None,
214
+ insecure=False,
215
+ compression=None,
216
+ wait_for_ready=None,
217
+ timeout=None,
218
+ metadata=None):
219
+ return grpc.experimental.unary_unary(request, target, '/flwr.proto.SimulationIo/RequestToken',
220
+ flwr_dot_proto_dot_appio__pb2.RequestTokenRequest.SerializeToString,
221
+ flwr_dot_proto_dot_appio__pb2.RequestTokenResponse.FromString,
222
+ options, channel_credentials,
223
+ insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
224
+
225
+ @staticmethod
226
+ def PullAppInputs(request,
159
227
  target,
160
228
  options=(),
161
229
  channel_credentials=None,
@@ -165,14 +233,14 @@ class SimulationIo(object):
165
233
  wait_for_ready=None,
166
234
  timeout=None,
167
235
  metadata=None):
168
- return grpc.experimental.unary_unary(request, target, '/flwr.proto.SimulationIo/PullSimulationInputs',
169
- flwr_dot_proto_dot_simulationio__pb2.PullSimulationInputsRequest.SerializeToString,
170
- flwr_dot_proto_dot_simulationio__pb2.PullSimulationInputsResponse.FromString,
236
+ return grpc.experimental.unary_unary(request, target, '/flwr.proto.SimulationIo/PullAppInputs',
237
+ flwr_dot_proto_dot_appio__pb2.PullAppInputsRequest.SerializeToString,
238
+ flwr_dot_proto_dot_appio__pb2.PullAppInputsResponse.FromString,
171
239
  options, channel_credentials,
172
240
  insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
173
241
 
174
242
  @staticmethod
175
- def PushSimulationOutputs(request,
243
+ def PushAppOutputs(request,
176
244
  target,
177
245
  options=(),
178
246
  channel_credentials=None,
@@ -182,9 +250,9 @@ class SimulationIo(object):
182
250
  wait_for_ready=None,
183
251
  timeout=None,
184
252
  metadata=None):
185
- return grpc.experimental.unary_unary(request, target, '/flwr.proto.SimulationIo/PushSimulationOutputs',
186
- flwr_dot_proto_dot_simulationio__pb2.PushSimulationOutputsRequest.SerializeToString,
187
- flwr_dot_proto_dot_simulationio__pb2.PushSimulationOutputsResponse.FromString,
253
+ return grpc.experimental.unary_unary(request, target, '/flwr.proto.SimulationIo/PushAppOutputs',
254
+ flwr_dot_proto_dot_appio__pb2.PushAppOutputsRequest.SerializeToString,
255
+ flwr_dot_proto_dot_appio__pb2.PushAppOutputsResponse.FromString,
188
256
  options, channel_credentials,
189
257
  insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
190
258
 
@@ -3,22 +3,32 @@
3
3
  isort:skip_file
4
4
  """
5
5
  import abc
6
+ import flwr.proto.appio_pb2
6
7
  import flwr.proto.heartbeat_pb2
7
8
  import flwr.proto.log_pb2
8
9
  import flwr.proto.run_pb2
9
- import flwr.proto.simulationio_pb2
10
10
  import grpc
11
11
 
12
12
  class SimulationIoStub:
13
13
  def __init__(self, channel: grpc.Channel) -> None: ...
14
- PullSimulationInputs: grpc.UnaryUnaryMultiCallable[
15
- flwr.proto.simulationio_pb2.PullSimulationInputsRequest,
16
- flwr.proto.simulationio_pb2.PullSimulationInputsResponse]
14
+ ListAppsToLaunch: grpc.UnaryUnaryMultiCallable[
15
+ flwr.proto.appio_pb2.ListAppsToLaunchRequest,
16
+ flwr.proto.appio_pb2.ListAppsToLaunchResponse]
17
+ """List runs to launch"""
18
+
19
+ RequestToken: grpc.UnaryUnaryMultiCallable[
20
+ flwr.proto.appio_pb2.RequestTokenRequest,
21
+ flwr.proto.appio_pb2.RequestTokenResponse]
22
+ """Request token for a run"""
23
+
24
+ PullAppInputs: grpc.UnaryUnaryMultiCallable[
25
+ flwr.proto.appio_pb2.PullAppInputsRequest,
26
+ flwr.proto.appio_pb2.PullAppInputsResponse]
17
27
  """Pull Simulation inputs"""
18
28
 
19
- PushSimulationOutputs: grpc.UnaryUnaryMultiCallable[
20
- flwr.proto.simulationio_pb2.PushSimulationOutputsRequest,
21
- flwr.proto.simulationio_pb2.PushSimulationOutputsResponse]
29
+ PushAppOutputs: grpc.UnaryUnaryMultiCallable[
30
+ flwr.proto.appio_pb2.PushAppOutputsRequest,
31
+ flwr.proto.appio_pb2.PushAppOutputsResponse]
22
32
  """Push Simulation outputs"""
23
33
 
24
34
  UpdateRunStatus: grpc.UnaryUnaryMultiCallable[
@@ -49,18 +59,34 @@ class SimulationIoStub:
49
59
 
50
60
  class SimulationIoServicer(metaclass=abc.ABCMeta):
51
61
  @abc.abstractmethod
52
- def PullSimulationInputs(self,
53
- request: flwr.proto.simulationio_pb2.PullSimulationInputsRequest,
62
+ def ListAppsToLaunch(self,
63
+ request: flwr.proto.appio_pb2.ListAppsToLaunchRequest,
54
64
  context: grpc.ServicerContext,
55
- ) -> flwr.proto.simulationio_pb2.PullSimulationInputsResponse:
65
+ ) -> flwr.proto.appio_pb2.ListAppsToLaunchResponse:
66
+ """List runs to launch"""
67
+ pass
68
+
69
+ @abc.abstractmethod
70
+ def RequestToken(self,
71
+ request: flwr.proto.appio_pb2.RequestTokenRequest,
72
+ context: grpc.ServicerContext,
73
+ ) -> flwr.proto.appio_pb2.RequestTokenResponse:
74
+ """Request token for a run"""
75
+ pass
76
+
77
+ @abc.abstractmethod
78
+ def PullAppInputs(self,
79
+ request: flwr.proto.appio_pb2.PullAppInputsRequest,
80
+ context: grpc.ServicerContext,
81
+ ) -> flwr.proto.appio_pb2.PullAppInputsResponse:
56
82
  """Pull Simulation inputs"""
57
83
  pass
58
84
 
59
85
  @abc.abstractmethod
60
- def PushSimulationOutputs(self,
61
- request: flwr.proto.simulationio_pb2.PushSimulationOutputsRequest,
86
+ def PushAppOutputs(self,
87
+ request: flwr.proto.appio_pb2.PushAppOutputsRequest,
62
88
  context: grpc.ServicerContext,
63
- ) -> flwr.proto.simulationio_pb2.PushSimulationOutputsResponse:
89
+ ) -> flwr.proto.appio_pb2.PushAppOutputsResponse:
64
90
  """Push Simulation outputs"""
65
91
  pass
66
92
 
@@ -34,6 +34,16 @@ from flwr.common.serde import (
34
34
  )
35
35
  from flwr.common.typing import Fab, RunStatus
36
36
  from flwr.proto import simulationio_pb2_grpc
37
+ from flwr.proto.appio_pb2 import ( # pylint: disable=E0611
38
+ ListAppsToLaunchRequest,
39
+ ListAppsToLaunchResponse,
40
+ PullAppInputsRequest,
41
+ PullAppInputsResponse,
42
+ PushAppOutputsRequest,
43
+ PushAppOutputsResponse,
44
+ RequestTokenRequest,
45
+ RequestTokenResponse,
46
+ )
37
47
  from flwr.proto.heartbeat_pb2 import ( # pylint: disable=E0611
38
48
  SendAppHeartbeatRequest,
39
49
  SendAppHeartbeatResponse,
@@ -50,12 +60,6 @@ from flwr.proto.run_pb2 import ( # pylint: disable=E0611
50
60
  UpdateRunStatusRequest,
51
61
  UpdateRunStatusResponse,
52
62
  )
53
- from flwr.proto.simulationio_pb2 import ( # pylint: disable=E0611
54
- PullSimulationInputsRequest,
55
- PullSimulationInputsResponse,
56
- PushSimulationOutputsRequest,
57
- PushSimulationOutputsResponse,
58
- )
59
63
  from flwr.server.superlink.linkstate import LinkStateFactory
60
64
  from flwr.server.superlink.utils import abort_if
61
65
  from flwr.supercore.ffs import FfsFactory
@@ -71,9 +75,45 @@ class SimulationIoServicer(simulationio_pb2_grpc.SimulationIoServicer):
71
75
  self.ffs_factory = ffs_factory
72
76
  self.lock = threading.RLock()
73
77
 
74
- def PullSimulationInputs(
75
- self, request: PullSimulationInputsRequest, context: ServicerContext
76
- ) -> PullSimulationInputsResponse:
78
+ def ListAppsToLaunch(
79
+ self,
80
+ request: ListAppsToLaunchRequest,
81
+ context: grpc.ServicerContext,
82
+ ) -> ListAppsToLaunchResponse:
83
+ """Get run IDs with pending messages."""
84
+ log(DEBUG, "SimulationIoServicer.ListAppsToLaunch")
85
+
86
+ # Initialize state connection
87
+ state = self.state_factory.state()
88
+
89
+ # Get IDs of runs in pending status
90
+ run_ids = state.get_run_ids(flwr_aid=None)
91
+ pending_run_ids = []
92
+ for run_id, status in state.get_run_status(run_ids).items():
93
+ if status.status == Status.PENDING:
94
+ pending_run_ids.append(run_id)
95
+
96
+ # Return run IDs
97
+ return ListAppsToLaunchResponse(run_ids=pending_run_ids)
98
+
99
+ def RequestToken(
100
+ self, request: RequestTokenRequest, context: grpc.ServicerContext
101
+ ) -> RequestTokenResponse:
102
+ """Request token."""
103
+ log(DEBUG, "SimulationIoServicer.RequestToken")
104
+
105
+ # Initialize state connection
106
+ state = self.state_factory.state()
107
+
108
+ # Attempt to create a token for the provided run ID
109
+ token = state.create_token(request.run_id)
110
+
111
+ # Return the token
112
+ return RequestTokenResponse(token=token or "")
113
+
114
+ def PullAppInputs(
115
+ self, request: PullAppInputsRequest, context: ServicerContext
116
+ ) -> PullAppInputsResponse:
77
117
  """Pull SimultionIo process inputs."""
78
118
  log(DEBUG, "SimultionIoServicer.SimultionIoInputs")
79
119
  # Init access to LinkState and Ffs
@@ -86,7 +126,7 @@ class SimulationIoServicer(simulationio_pb2_grpc.SimulationIoServicer):
86
126
  run_id = state.get_pending_run_id()
87
127
  # If there's no pending run, return an empty response
88
128
  if run_id is None:
89
- return PullSimulationInputsResponse()
129
+ return PullAppInputsResponse()
90
130
 
91
131
  # Retrieve Context, Run and Fab for the run_id
92
132
  serverapp_ctxt = state.get_serverapp_context(run_id)
@@ -99,7 +139,7 @@ class SimulationIoServicer(simulationio_pb2_grpc.SimulationIoServicer):
99
139
  # Update run status to STARTING
100
140
  if state.update_run_status(run_id, RunStatus(Status.STARTING, "", "")):
101
141
  log(INFO, "Starting run %d", run_id)
102
- return PullSimulationInputsResponse(
142
+ return PullAppInputsResponse(
103
143
  context=context_to_proto(serverapp_ctxt),
104
144
  run=run_to_proto(run),
105
145
  fab=fab_to_proto(fab),
@@ -109,11 +149,11 @@ class SimulationIoServicer(simulationio_pb2_grpc.SimulationIoServicer):
109
149
  # or if the status cannot be updated to STARTING
110
150
  raise RuntimeError(f"Failed to start run {run_id}")
111
151
 
112
- def PushSimulationOutputs(
113
- self, request: PushSimulationOutputsRequest, context: ServicerContext
114
- ) -> PushSimulationOutputsResponse:
152
+ def PushAppOutputs(
153
+ self, request: PushAppOutputsRequest, context: ServicerContext
154
+ ) -> PushAppOutputsResponse:
115
155
  """Push Simulation process outputs."""
116
- log(DEBUG, "SimultionIoServicer.PushSimulationOutputs")
156
+ log(DEBUG, "SimultionIoServicer.PushAppOutputs")
117
157
  state = self.state_factory.state()
118
158
 
119
159
  # Abort if the run is not running
@@ -126,7 +166,7 @@ class SimulationIoServicer(simulationio_pb2_grpc.SimulationIoServicer):
126
166
  )
127
167
 
128
168
  state.set_serverapp_context(request.run_id, context_from_proto(request.context))
129
- return PushSimulationOutputsResponse()
169
+ return PushAppOutputsResponse()
130
170
 
131
171
  def UpdateRunStatus(
132
172
  self, request: UpdateRunStatusRequest, context: grpc.ServicerContext
@@ -57,16 +57,16 @@ from flwr.common.serde import (
57
57
  run_status_to_proto,
58
58
  )
59
59
  from flwr.common.typing import RunStatus
60
+ from flwr.proto.appio_pb2 import ( # pylint: disable=E0611
61
+ PullAppInputsRequest,
62
+ PullAppInputsResponse,
63
+ PushAppOutputsRequest,
64
+ )
60
65
  from flwr.proto.run_pb2 import ( # pylint: disable=E0611
61
66
  GetFederationOptionsRequest,
62
67
  GetFederationOptionsResponse,
63
68
  UpdateRunStatusRequest,
64
69
  )
65
- from flwr.proto.simulationio_pb2 import ( # pylint: disable=E0611
66
- PullSimulationInputsRequest,
67
- PullSimulationInputsResponse,
68
- PushSimulationOutputsRequest,
69
- )
70
70
  from flwr.server.superlink.fleet.vce.backend.backend import BackendConfig
71
71
  from flwr.simulation.run_simulation import _run_simulation
72
72
  from flwr.simulation.simulationio_connection import SimulationIoConnection
@@ -128,8 +128,8 @@ def run_simulation_process( # pylint: disable=R0914, disable=W0212, disable=R09
128
128
 
129
129
  try:
130
130
  # Pull SimulationInputs from LinkState
131
- req = PullSimulationInputsRequest()
132
- res: PullSimulationInputsResponse = conn._stub.PullSimulationInputs(req)
131
+ req = PullAppInputsRequest()
132
+ res: PullAppInputsResponse = conn._stub.PullAppInputs(req)
133
133
  if not res.HasField("run"):
134
134
  sleep(3)
135
135
  run_status = None
@@ -240,10 +240,8 @@ def run_simulation_process( # pylint: disable=R0914, disable=W0212, disable=R09
240
240
 
241
241
  # Send resulting context
242
242
  context_proto = context_to_proto(updated_context)
243
- out_req = PushSimulationOutputsRequest(
244
- run_id=run.run_id, context=context_proto
245
- )
246
- _ = conn._stub.PushSimulationOutputs(out_req)
243
+ out_req = PushAppOutputsRequest(run_id=run.run_id, context=context_proto)
244
+ _ = conn._stub.PushAppOutputs(out_req)
247
245
 
248
246
  run_status = RunStatus(Status.FINISHED, SubStatus.COMPLETED, "")
249
247
 
@@ -16,6 +16,7 @@
16
16
 
17
17
 
18
18
  import os
19
+ import signal
19
20
  import threading
20
21
  import time
21
22
  from typing import Union
@@ -29,6 +30,29 @@ from flwr.proto.appio_pb2 import ( # pylint: disable=E0611
29
30
  from flwr.proto.clientappio_pb2_grpc import ClientAppIoStub
30
31
  from flwr.proto.serverappio_pb2_grpc import ServerAppIoStub
31
32
 
33
+ if os.name == "nt":
34
+ from ctypes import windll # type: ignore
35
+
36
+
37
+ def _pid_exists(pid: int) -> bool:
38
+ """Check if a process with the given PID exists.
39
+
40
+ This works on Unix-like systems and Windows.
41
+ """
42
+ # Use `ctypes` to check if the process exists on Windows
43
+ if os.name == "nt":
44
+ handle = windll.kernel32.OpenProcess(0x1000, False, pid)
45
+ if handle:
46
+ windll.kernel32.CloseHandle(handle)
47
+ return True
48
+ return False
49
+ # Use `os.kill` on Unix-like systems
50
+ try:
51
+ os.kill(pid, 0)
52
+ except OSError:
53
+ return False
54
+ return True
55
+
32
56
 
33
57
  def start_parent_process_monitor(
34
58
  parent_pid: int,
@@ -38,8 +62,10 @@ def start_parent_process_monitor(
38
62
  def monitor() -> None:
39
63
  while True:
40
64
  time.sleep(0.2)
41
- if os.getppid() != parent_pid:
42
- os.kill(os.getpid(), 9)
65
+ if not _pid_exists(parent_pid):
66
+ # This works on Unix-like systems and Windows
67
+ # Avoid `os.kill` on Windows
68
+ signal.raise_signal(signal.SIGTERM)
43
69
 
44
70
  threading.Thread(target=monitor, daemon=True).start()
45
71
 
@@ -22,7 +22,14 @@ from flwr.common import EventType, event
22
22
  from flwr.common.constant import ExecPluginType
23
23
  from flwr.common.logger import log
24
24
  from flwr.proto.clientappio_pb2_grpc import ClientAppIoStub
25
- from flwr.supercore.superexec.plugin import ClientAppExecPlugin, ExecPlugin
25
+ from flwr.proto.serverappio_pb2_grpc import ServerAppIoStub
26
+ from flwr.proto.simulationio_pb2_grpc import SimulationIoStub
27
+ from flwr.supercore.superexec.plugin import (
28
+ ClientAppExecPlugin,
29
+ ExecPlugin,
30
+ ServerAppExecPlugin,
31
+ SimulationExecPlugin,
32
+ )
26
33
  from flwr.supercore.superexec.run_superexec import run_superexec
27
34
 
28
35
 
@@ -43,6 +50,7 @@ def flower_superexec() -> None:
43
50
  stub_class=stub_class, # type: ignore
44
51
  appio_api_address=args.appio_api_address,
45
52
  flwr_dir=args.flwr_dir,
53
+ parent_pid=args.parent_pid,
46
54
  )
47
55
 
48
56
 
@@ -79,6 +87,13 @@ def _parse_args() -> argparse.ArgumentParser:
79
87
  - `$HOME/.flwr/` in all other cases
80
88
  """,
81
89
  )
90
+ parser.add_argument(
91
+ "--parent-pid",
92
+ type=int,
93
+ default=None,
94
+ help="The PID of the parent process. When set, the process will terminate "
95
+ "when the parent process exits.",
96
+ )
82
97
  return parser
83
98
 
84
99
 
@@ -88,4 +103,8 @@ def _get_plugin_and_stub_class(
88
103
  """Get the plugin class and stub class based on the plugin type."""
89
104
  if plugin_type == ExecPluginType.CLIENT_APP:
90
105
  return ClientAppExecPlugin, ClientAppIoStub
106
+ if plugin_type == ExecPluginType.SERVER_APP:
107
+ return ServerAppExecPlugin, ServerAppIoStub
108
+ if plugin_type == ExecPluginType.SIMULATION:
109
+ return SimulationExecPlugin, SimulationIoStub
91
110
  raise ValueError(f"Unknown plugin type: {plugin_type}")
@@ -18,9 +18,11 @@
18
18
  from .clientapp_exec_plugin import ClientAppExecPlugin
19
19
  from .exec_plugin import ExecPlugin
20
20
  from .serverapp_exec_plugin import ServerAppExecPlugin
21
+ from .simulation_exec_plugin import SimulationExecPlugin
21
22
 
22
23
  __all__ = [
23
24
  "ClientAppExecPlugin",
24
25
  "ExecPlugin",
25
26
  "ServerAppExecPlugin",
27
+ "SimulationExecPlugin",
26
28
  ]
@@ -0,0 +1,28 @@
1
+ # Copyright 2025 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
+ """Simple Flower SuperExec plugin for simulation processes."""
16
+
17
+
18
+ from .base_exec_plugin import BaseExecPlugin
19
+
20
+
21
+ class SimulationExecPlugin(BaseExecPlugin):
22
+ """Simple Flower SuperExec plugin for simulation processes.
23
+
24
+ The plugin always selects the first candidate run ID.
25
+ """
26
+
27
+ command = "flwr-simulation"
28
+ appio_api_address_arg = "--simulationio-api-address"
@@ -31,6 +31,7 @@ from flwr.proto.appio_pb2 import ( # pylint: disable=E0611
31
31
  )
32
32
  from flwr.proto.clientappio_pb2_grpc import ClientAppIoStub
33
33
  from flwr.proto.run_pb2 import GetRunRequest # pylint: disable=E0611
34
+ from flwr.supercore.app_utils import start_parent_process_monitor
34
35
 
35
36
  from .plugin import ExecPlugin
36
37
 
@@ -40,6 +41,7 @@ def run_superexec(
40
41
  stub_class: type[ClientAppIoStub],
41
42
  appio_api_address: str,
42
43
  flwr_dir: Optional[str] = None,
44
+ parent_pid: Optional[int] = None,
43
45
  ) -> None:
44
46
  """Run Flower SuperExec.
45
47
 
@@ -53,7 +55,14 @@ def run_superexec(
53
55
  The address of the AppIO API.
54
56
  flwr_dir : Optional[str] (default: None)
55
57
  The Flower directory.
58
+ parent_pid : Optional[int] (default: None)
59
+ The PID of the parent process. If provided, the SuperExec will terminate
60
+ when the parent process exits.
56
61
  """
62
+ # Start monitoring the parent process if a PID is provided
63
+ if parent_pid is not None:
64
+ start_parent_process_monitor(parent_pid)
65
+
57
66
  # Create the channel to the AppIO API
58
67
  # No TLS support for now, so insecure connection
59
68
  channel = create_channel(