flwr-nightly 1.15.0.dev20250109__tar.gz → 1.15.0.dev20250110__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 (328) hide show
  1. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/PKG-INFO +1 -1
  2. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/pyproject.toml +1 -1
  3. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/client/app.py +17 -9
  4. flwr_nightly-1.15.0.dev20250109/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py → flwr_nightly-1.15.0.dev20250110/src/py/flwr/common/grpc.py +51 -121
  5. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/app.py +42 -20
  6. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/superlink/driver/serverappio_grpc.py +1 -1
  7. flwr_nightly-1.15.0.dev20250110/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +126 -0
  8. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/superlink/simulation/simulationio_grpc.py +1 -1
  9. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/superexec/exec_grpc.py +1 -1
  10. flwr_nightly-1.15.0.dev20250109/src/py/flwr/common/grpc.py +0 -68
  11. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/LICENSE +0 -0
  12. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/README.md +0 -0
  13. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/__init__.py +0 -0
  14. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/__init__.py +0 -0
  15. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/app.py +0 -0
  16. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/build.py +0 -0
  17. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/cli_user_auth_interceptor.py +0 -0
  18. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/config_utils.py +0 -0
  19. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/example.py +0 -0
  20. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/install.py +0 -0
  21. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/log.py +0 -0
  22. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/login/__init__.py +0 -0
  23. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/login/login.py +0 -0
  24. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/ls.py +0 -0
  25. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/__init__.py +0 -0
  26. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/new.py +0 -0
  27. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/__init__.py +0 -0
  28. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/.gitignore.tpl +0 -0
  29. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/LICENSE.tpl +0 -0
  30. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/README.baseline.md.tpl +0 -0
  31. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/README.flowertune.md.tpl +0 -0
  32. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/README.md.tpl +0 -0
  33. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/__init__.py +0 -0
  34. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/code/__init__.baseline.py.tpl +0 -0
  35. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
  36. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
  37. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/code/client.baseline.py.tpl +0 -0
  38. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/code/client.huggingface.py.tpl +0 -0
  39. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/code/client.jax.py.tpl +0 -0
  40. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/code/client.mlx.py.tpl +0 -0
  41. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/code/client.numpy.py.tpl +0 -0
  42. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -0
  43. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl +0 -0
  44. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -0
  45. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/code/dataset.baseline.py.tpl +0 -0
  46. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/code/flwr_tune/__init__.py +0 -0
  47. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/code/flwr_tune/client_app.py.tpl +0 -0
  48. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/code/flwr_tune/dataset.py.tpl +0 -0
  49. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/code/flwr_tune/models.py.tpl +0 -0
  50. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/code/flwr_tune/server_app.py.tpl +0 -0
  51. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/code/flwr_tune/strategy.py.tpl +0 -0
  52. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/code/model.baseline.py.tpl +0 -0
  53. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/code/server.baseline.py.tpl +0 -0
  54. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/code/server.huggingface.py.tpl +0 -0
  55. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/code/server.jax.py.tpl +0 -0
  56. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/code/server.mlx.py.tpl +0 -0
  57. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -0
  58. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -0
  59. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/code/server.sklearn.py.tpl +0 -0
  60. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -0
  61. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/code/strategy.baseline.py.tpl +0 -0
  62. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/code/task.huggingface.py.tpl +0 -0
  63. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/code/task.jax.py.tpl +0 -0
  64. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/code/task.mlx.py.tpl +0 -0
  65. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/code/task.numpy.py.tpl +0 -0
  66. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +0 -0
  67. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/code/task.sklearn.py.tpl +0 -0
  68. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/code/task.tensorflow.py.tpl +0 -0
  69. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/code/utils.baseline.py.tpl +0 -0
  70. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/pyproject.baseline.toml.tpl +0 -0
  71. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +0 -0
  72. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl +0 -0
  73. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/pyproject.jax.toml.tpl +0 -0
  74. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +0 -0
  75. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +0 -0
  76. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +0 -0
  77. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +0 -0
  78. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +0 -0
  79. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/run/__init__.py +0 -0
  80. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/run/run.py +0 -0
  81. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/stop.py +0 -0
  82. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/utils.py +0 -0
  83. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/client/__init__.py +0 -0
  84. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/client/client.py +0 -0
  85. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/client/client_app.py +0 -0
  86. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/client/clientapp/__init__.py +0 -0
  87. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/client/clientapp/app.py +0 -0
  88. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/client/clientapp/clientappio_servicer.py +0 -0
  89. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/client/clientapp/utils.py +0 -0
  90. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/client/dpfedavg_numpy_client.py +0 -0
  91. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/client/grpc_adapter_client/__init__.py +0 -0
  92. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/client/grpc_adapter_client/connection.py +0 -0
  93. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/client/grpc_client/__init__.py +0 -0
  94. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/client/grpc_client/connection.py +0 -0
  95. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/client/grpc_rere_client/__init__.py +0 -0
  96. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/client/grpc_rere_client/client_interceptor.py +0 -0
  97. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/client/grpc_rere_client/connection.py +0 -0
  98. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/client/grpc_rere_client/grpc_adapter.py +0 -0
  99. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/client/heartbeat.py +0 -0
  100. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/client/message_handler/__init__.py +0 -0
  101. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/client/message_handler/message_handler.py +0 -0
  102. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/client/message_handler/task_handler.py +0 -0
  103. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/client/mod/__init__.py +0 -0
  104. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/client/mod/centraldp_mods.py +0 -0
  105. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/client/mod/comms_mods.py +0 -0
  106. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/client/mod/localdp_mod.py +0 -0
  107. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
  108. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
  109. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
  110. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/client/mod/utils.py +0 -0
  111. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/client/nodestate/__init__.py +0 -0
  112. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/client/nodestate/in_memory_nodestate.py +0 -0
  113. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/client/nodestate/nodestate.py +0 -0
  114. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/client/nodestate/nodestate_factory.py +0 -0
  115. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/client/numpy_client.py +0 -0
  116. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/client/rest_client/__init__.py +0 -0
  117. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/client/rest_client/connection.py +0 -0
  118. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/client/run_info_store.py +0 -0
  119. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/client/supernode/__init__.py +0 -0
  120. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/client/supernode/app.py +0 -0
  121. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/client/typing.py +0 -0
  122. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/common/__init__.py +0 -0
  123. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/common/address.py +0 -0
  124. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/common/args.py +0 -0
  125. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/common/auth_plugin/__init__.py +0 -0
  126. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/common/auth_plugin/auth_plugin.py +0 -0
  127. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/common/config.py +0 -0
  128. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/common/constant.py +0 -0
  129. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/common/context.py +0 -0
  130. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/common/date.py +0 -0
  131. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/common/differential_privacy.py +0 -0
  132. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/common/differential_privacy_constants.py +0 -0
  133. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/common/dp.py +0 -0
  134. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/common/exit_handlers.py +0 -0
  135. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/common/logger.py +0 -0
  136. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/common/message.py +0 -0
  137. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/common/object_ref.py +0 -0
  138. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/common/parameter.py +0 -0
  139. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/common/pyproject.py +0 -0
  140. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/common/record/__init__.py +0 -0
  141. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/common/record/configsrecord.py +0 -0
  142. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/common/record/conversion_utils.py +0 -0
  143. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/common/record/metricsrecord.py +0 -0
  144. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/common/record/parametersrecord.py +0 -0
  145. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/common/record/recordset.py +0 -0
  146. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/common/record/typeddict.py +0 -0
  147. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/common/recordset_compat.py +0 -0
  148. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/common/retry_invoker.py +0 -0
  149. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/common/secure_aggregation/__init__.py +0 -0
  150. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
  151. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
  152. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -0
  153. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
  154. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/common/secure_aggregation/quantization.py +0 -0
  155. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
  156. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
  157. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/common/serde.py +0 -0
  158. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/common/telemetry.py +0 -0
  159. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/common/typing.py +0 -0
  160. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/common/version.py +0 -0
  161. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/__init__.py +0 -0
  162. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/clientappio_pb2.py +0 -0
  163. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/clientappio_pb2.pyi +0 -0
  164. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/clientappio_pb2_grpc.py +0 -0
  165. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/clientappio_pb2_grpc.pyi +0 -0
  166. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/error_pb2.py +0 -0
  167. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/error_pb2.pyi +0 -0
  168. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/error_pb2_grpc.py +0 -0
  169. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/error_pb2_grpc.pyi +0 -0
  170. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/exec_pb2.py +0 -0
  171. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/exec_pb2.pyi +0 -0
  172. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/exec_pb2_grpc.py +0 -0
  173. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/exec_pb2_grpc.pyi +0 -0
  174. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/fab_pb2.py +0 -0
  175. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/fab_pb2.pyi +0 -0
  176. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/fab_pb2_grpc.py +0 -0
  177. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/fab_pb2_grpc.pyi +0 -0
  178. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/fleet_pb2.py +0 -0
  179. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/fleet_pb2.pyi +0 -0
  180. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/fleet_pb2_grpc.py +0 -0
  181. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
  182. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/grpcadapter_pb2.py +0 -0
  183. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/grpcadapter_pb2.pyi +0 -0
  184. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/grpcadapter_pb2_grpc.py +0 -0
  185. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/grpcadapter_pb2_grpc.pyi +0 -0
  186. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/log_pb2.py +0 -0
  187. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/log_pb2.pyi +0 -0
  188. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/log_pb2_grpc.py +0 -0
  189. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/log_pb2_grpc.pyi +0 -0
  190. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/message_pb2.py +0 -0
  191. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/message_pb2.pyi +0 -0
  192. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/message_pb2_grpc.py +0 -0
  193. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/message_pb2_grpc.pyi +0 -0
  194. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/node_pb2.py +0 -0
  195. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/node_pb2.pyi +0 -0
  196. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/node_pb2_grpc.py +0 -0
  197. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/node_pb2_grpc.pyi +0 -0
  198. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/recordset_pb2.py +0 -0
  199. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/recordset_pb2.pyi +0 -0
  200. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/recordset_pb2_grpc.py +0 -0
  201. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/recordset_pb2_grpc.pyi +0 -0
  202. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/run_pb2.py +0 -0
  203. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/run_pb2.pyi +0 -0
  204. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/run_pb2_grpc.py +0 -0
  205. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/run_pb2_grpc.pyi +0 -0
  206. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/serverappio_pb2.py +0 -0
  207. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/serverappio_pb2.pyi +0 -0
  208. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/serverappio_pb2_grpc.py +0 -0
  209. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/serverappio_pb2_grpc.pyi +0 -0
  210. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/simulationio_pb2.py +0 -0
  211. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/simulationio_pb2.pyi +0 -0
  212. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/simulationio_pb2_grpc.py +0 -0
  213. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/simulationio_pb2_grpc.pyi +0 -0
  214. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/task_pb2.py +0 -0
  215. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/task_pb2.pyi +0 -0
  216. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/task_pb2_grpc.py +0 -0
  217. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/task_pb2_grpc.pyi +0 -0
  218. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/transport_pb2.py +0 -0
  219. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/transport_pb2.pyi +0 -0
  220. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/transport_pb2_grpc.py +0 -0
  221. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
  222. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/py.typed +0 -0
  223. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/__init__.py +0 -0
  224. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/client_manager.py +0 -0
  225. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/client_proxy.py +0 -0
  226. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/compat/__init__.py +0 -0
  227. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/compat/app.py +0 -0
  228. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/compat/app_utils.py +0 -0
  229. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/compat/driver_client_proxy.py +0 -0
  230. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/compat/legacy_context.py +0 -0
  231. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/criterion.py +0 -0
  232. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/driver/__init__.py +0 -0
  233. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/driver/driver.py +0 -0
  234. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/driver/grpc_driver.py +0 -0
  235. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/driver/inmemory_driver.py +0 -0
  236. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/history.py +0 -0
  237. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/run_serverapp.py +0 -0
  238. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/server.py +0 -0
  239. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/server_app.py +0 -0
  240. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/server_config.py +0 -0
  241. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/serverapp/__init__.py +0 -0
  242. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/serverapp/app.py +0 -0
  243. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/serverapp_components.py +0 -0
  244. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/strategy/__init__.py +0 -0
  245. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/strategy/aggregate.py +0 -0
  246. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/strategy/bulyan.py +0 -0
  247. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
  248. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
  249. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
  250. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
  251. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
  252. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/strategy/fedadagrad.py +0 -0
  253. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/strategy/fedadam.py +0 -0
  254. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/strategy/fedavg.py +0 -0
  255. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/strategy/fedavg_android.py +0 -0
  256. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/strategy/fedavgm.py +0 -0
  257. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/strategy/fedmedian.py +0 -0
  258. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/strategy/fedopt.py +0 -0
  259. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/strategy/fedprox.py +0 -0
  260. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
  261. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
  262. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
  263. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
  264. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/strategy/fedyogi.py +0 -0
  265. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/strategy/krum.py +0 -0
  266. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/strategy/qfedavg.py +0 -0
  267. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/strategy/strategy.py +0 -0
  268. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/superlink/__init__.py +0 -0
  269. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/superlink/driver/__init__.py +0 -0
  270. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/superlink/driver/serverappio_servicer.py +0 -0
  271. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/superlink/ffs/__init__.py +0 -0
  272. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/superlink/ffs/disk_ffs.py +0 -0
  273. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/superlink/ffs/ffs.py +0 -0
  274. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/superlink/ffs/ffs_factory.py +0 -0
  275. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/superlink/fleet/__init__.py +0 -0
  276. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/superlink/fleet/grpc_adapter/__init__.py +0 -0
  277. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +0 -0
  278. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
  279. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
  280. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
  281. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
  282. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
  283. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +0 -0
  284. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +0 -0
  285. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
  286. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/superlink/fleet/message_handler/message_handler.py +0 -0
  287. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
  288. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +0 -0
  289. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
  290. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
  291. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
  292. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +0 -0
  293. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/superlink/fleet/vce/vce_api.py +0 -0
  294. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/superlink/linkstate/__init__.py +0 -0
  295. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/superlink/linkstate/in_memory_linkstate.py +0 -0
  296. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/superlink/linkstate/linkstate.py +0 -0
  297. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/superlink/linkstate/linkstate_factory.py +0 -0
  298. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/superlink/linkstate/sqlite_linkstate.py +0 -0
  299. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/superlink/linkstate/utils.py +0 -0
  300. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/superlink/simulation/__init__.py +0 -0
  301. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/superlink/simulation/simulationio_servicer.py +0 -0
  302. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/superlink/utils.py +0 -0
  303. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/typing.py +0 -0
  304. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/utils/__init__.py +0 -0
  305. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/utils/tensorboard.py +0 -0
  306. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/utils/validator.py +0 -0
  307. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/workflow/__init__.py +0 -0
  308. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/workflow/constant.py +0 -0
  309. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/workflow/default_workflows.py +0 -0
  310. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
  311. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
  312. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +0 -0
  313. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/simulation/__init__.py +0 -0
  314. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/simulation/app.py +0 -0
  315. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/simulation/legacy_app.py +0 -0
  316. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/simulation/ray_transport/__init__.py +0 -0
  317. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
  318. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
  319. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/simulation/ray_transport/utils.py +0 -0
  320. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/simulation/run_simulation.py +0 -0
  321. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/simulation/simulationio_connection.py +0 -0
  322. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/superexec/__init__.py +0 -0
  323. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/superexec/app.py +0 -0
  324. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/superexec/deployment.py +0 -0
  325. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/superexec/exec_servicer.py +0 -0
  326. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/superexec/exec_user_auth_interceptor.py +0 -0
  327. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/superexec/executor.py +0 -0
  328. {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/superexec/simulation.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: flwr-nightly
3
- Version: 1.15.0.dev20250109
3
+ Version: 1.15.0.dev20250110
4
4
  Summary: Flower: A Friendly Federated AI Framework
5
5
  Home-page: https://flower.ai
6
6
  License: Apache-2.0
@@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api"
4
4
 
5
5
  [tool.poetry]
6
6
  name = "flwr-nightly"
7
- version = "1.15.0.dev20250109"
7
+ version = "1.15.0.dev20250110"
8
8
  description = "Flower: A Friendly Federated AI Framework"
9
9
  license = "Apache-2.0"
10
10
  authors = ["The Flower Authors <hello@flower.ai>"]
@@ -15,13 +15,14 @@
15
15
  """Flower client app."""
16
16
 
17
17
 
18
+ import multiprocessing
18
19
  import signal
19
- import subprocess
20
20
  import sys
21
21
  import time
22
22
  from contextlib import AbstractContextManager
23
23
  from dataclasses import dataclass
24
24
  from logging import ERROR, INFO, WARN
25
+ from os import urandom
25
26
  from pathlib import Path
26
27
  from typing import Callable, Optional, Union, cast
27
28
 
@@ -33,6 +34,7 @@ from flwr.cli.config_utils import get_fab_metadata
33
34
  from flwr.cli.install import install_from_fab
34
35
  from flwr.client.client import Client
35
36
  from flwr.client.client_app import ClientApp, LoadClientAppError
37
+ from flwr.client.clientapp.app import flwr_clientapp
36
38
  from flwr.client.nodestate.nodestate_factory import NodeStateFactory
37
39
  from flwr.client.typing import ClientFnExt
38
40
  from flwr.common import GRPC_MAX_MESSAGE_LENGTH, Context, EventType, Message, event
@@ -53,13 +55,12 @@ from flwr.common.constant import (
53
55
  TRANSPORT_TYPES,
54
56
  ErrorCode,
55
57
  )
58
+ from flwr.common.grpc import generic_create_grpc_server
56
59
  from flwr.common.logger import log, warn_deprecated_feature
57
60
  from flwr.common.message import Error
58
61
  from flwr.common.retry_invoker import RetryInvoker, RetryState, exponential
59
62
  from flwr.common.typing import Fab, Run, RunNotRunningException, UserConfig
60
63
  from flwr.proto.clientappio_pb2_grpc import add_ClientAppIoServicer_to_server
61
- from flwr.server.superlink.fleet.grpc_bidi.grpc_server import generic_create_grpc_server
62
- from flwr.server.superlink.linkstate.utils import generate_rand_int_from_bytes
63
64
 
64
65
  from .clientapp.clientappio_servicer import ClientAppInputs, ClientAppIoServicer
65
66
  from .grpc_adapter_client.connection import grpc_adapter
@@ -391,6 +392,7 @@ def start_client_internal(
391
392
  run_info_store: Optional[DeprecatedRunInfoStore] = None
392
393
  state_factory = NodeStateFactory()
393
394
  state = state_factory.state()
395
+ mp_spawn_context = multiprocessing.get_context("spawn")
394
396
 
395
397
  runs: dict[int, Run] = {}
396
398
 
@@ -513,7 +515,7 @@ def start_client_internal(
513
515
  # Docker container.
514
516
 
515
517
  # Generate SuperNode token
516
- token: int = generate_rand_int_from_bytes(RUN_ID_NUM_BYTES)
518
+ token = int.from_bytes(urandom(RUN_ID_NUM_BYTES), "little")
517
519
 
518
520
  # Mode 1: SuperNode starts ClientApp as subprocess
519
521
  start_subprocess = isolation == ISOLATION_MODE_SUBPROCESS
@@ -549,12 +551,13 @@ def start_client_internal(
549
551
  ]
550
552
  command.append("--insecure")
551
553
 
552
- subprocess.run(
553
- command,
554
- stdout=None,
555
- stderr=None,
556
- check=True,
554
+ proc = mp_spawn_context.Process(
555
+ target=_run_flwr_clientapp,
556
+ args=(command,),
557
+ daemon=True,
557
558
  )
559
+ proc.start()
560
+ proc.join()
558
561
  else:
559
562
  # Wait for output to become available
560
563
  while not clientappio_servicer.has_outputs():
@@ -826,6 +829,11 @@ class _AppStateTracker:
826
829
  signal.signal(signal.SIGTERM, signal_handler)
827
830
 
828
831
 
832
+ def _run_flwr_clientapp(args: list[str]) -> None:
833
+ sys.argv = args
834
+ flwr_clientapp()
835
+
836
+
829
837
  def run_clientappio_api_grpc(
830
838
  address: str,
831
839
  certificates: Optional[tuple[bytes, bytes, bytes]],
@@ -1,4 +1,4 @@
1
- # Copyright 2024 Flower Labs GmbH. All Rights Reserved.
1
+ # Copyright 2022 Flower Labs GmbH. All Rights Reserved.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -12,32 +12,21 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
  # ==============================================================================
15
- """Implements utility function to create a gRPC server."""
15
+ """Utility functions for gRPC."""
16
16
 
17
17
 
18
18
  import concurrent.futures
19
19
  import sys
20
20
  from collections.abc import Sequence
21
- from logging import ERROR
22
- from typing import Any, Callable, Optional, Union
21
+ from logging import DEBUG, ERROR
22
+ from typing import Any, Callable, Optional
23
23
 
24
24
  import grpc
25
25
 
26
- from flwr.common import GRPC_MAX_MESSAGE_LENGTH
27
- from flwr.common.address import is_port_in_use
28
- from flwr.common.logger import log
29
- from flwr.proto.transport_pb2_grpc import ( # pylint: disable=E0611
30
- add_FlowerServiceServicer_to_server,
31
- )
32
- from flwr.server.client_manager import ClientManager
33
- from flwr.server.superlink.driver.serverappio_servicer import ServerAppIoServicer
34
- from flwr.server.superlink.fleet.grpc_adapter.grpc_adapter_servicer import (
35
- GrpcAdapterServicer,
36
- )
37
- from flwr.server.superlink.fleet.grpc_bidi.flower_service_servicer import (
38
- FlowerServiceServicer,
39
- )
40
- from flwr.server.superlink.fleet.grpc_rere.fleet_servicer import FleetServicer
26
+ from .address import is_port_in_use
27
+ from .logger import log
28
+
29
+ GRPC_MAX_MESSAGE_LENGTH: int = 536_870_912 # == 512 * 1024 * 1024
41
30
 
42
31
  INVALID_CERTIFICATES_ERR_MSG = """
43
32
  When setting any of root_certificate, certificate, or private_key,
@@ -47,122 +36,63 @@ INVALID_CERTIFICATES_ERR_MSG = """
47
36
  AddServicerToServerFn = Callable[..., Any]
48
37
 
49
38
 
50
- def valid_certificates(certificates: tuple[bytes, bytes, bytes]) -> bool:
51
- """Validate certificates tuple."""
52
- is_valid = (
53
- all(isinstance(certificate, bytes) for certificate in certificates)
54
- and len(certificates) == 3
55
- )
56
-
57
- if not is_valid:
58
- log(ERROR, INVALID_CERTIFICATES_ERR_MSG)
59
-
60
- return is_valid
61
-
62
-
63
- def start_grpc_server( # pylint: disable=too-many-arguments,R0917
64
- client_manager: ClientManager,
39
+ def create_channel(
65
40
  server_address: str,
66
- max_concurrent_workers: int = 1000,
41
+ insecure: bool,
42
+ root_certificates: Optional[bytes] = None,
67
43
  max_message_length: int = GRPC_MAX_MESSAGE_LENGTH,
68
- keepalive_time_ms: int = 210000,
69
- certificates: Optional[tuple[bytes, bytes, bytes]] = None,
70
- ) -> grpc.Server:
71
- """Create and start a gRPC server running FlowerServiceServicer.
72
-
73
- If used in a main function server.wait_for_termination(timeout=None)
74
- should be called as otherwise the server will immediately stop.
75
-
76
- **SSL**
77
- To enable SSL you have to pass all of root_certificate, certificate,
78
- and private_key. Setting only some will make the process exit with code 1.
79
-
80
- Parameters
81
- ----------
82
- client_manager : ClientManager
83
- Instance of ClientManager
84
- server_address : str
85
- Server address in the form of HOST:PORT e.g. "[::]:8080"
86
- max_concurrent_workers : int
87
- Maximum number of clients the server can process before returning
88
- RESOURCE_EXHAUSTED status (default: 1000)
89
- max_message_length : int
90
- Maximum message length that the server can send or receive.
91
- Int valued in bytes. -1 means unlimited. (default: GRPC_MAX_MESSAGE_LENGTH)
92
- keepalive_time_ms : int
93
- Flower uses a default gRPC keepalive time of 210000ms (3 minutes 30 seconds)
94
- because some cloud providers (for example, Azure) agressively clean up idle
95
- TCP connections by terminating them after some time (4 minutes in the case
96
- of Azure). Flower does not use application-level keepalive signals and relies
97
- on the assumption that the transport layer will fail in cases where the
98
- connection is no longer active. `keepalive_time_ms` can be used to customize
99
- the keepalive interval for specific environments. The default Flower gRPC
100
- keepalive of 210000 ms (3 minutes 30 seconds) ensures that Flower can keep
101
- the long running streaming connection alive in most environments. The actual
102
- gRPC default of this setting is 7200000 (2 hours), which results in dropped
103
- connections in some cloud environments.
104
-
105
- These settings are related to the issue described here:
106
- - https://github.com/grpc/proposal/blob/master/A8-client-side-keepalive.md
107
- - https://github.com/grpc/grpc/blob/master/doc/keepalive.md
108
- - https://grpc.io/docs/guides/performance/
44
+ interceptors: Optional[Sequence[grpc.UnaryUnaryClientInterceptor]] = None,
45
+ ) -> grpc.Channel:
46
+ """Create a gRPC channel, either secure or insecure."""
47
+ # Check for conflicting parameters
48
+ if insecure and root_certificates is not None:
49
+ raise ValueError(
50
+ "Invalid configuration: 'root_certificates' should not be provided "
51
+ "when 'insecure' is set to True. For an insecure connection, omit "
52
+ "'root_certificates', or set 'insecure' to False for a secure connection."
53
+ )
109
54
 
110
- Mobile Flower clients may choose to increase this value if their server
111
- environment allows long-running idle TCP connections.
112
- (default: 210000)
113
- certificates : Tuple[bytes, bytes, bytes] (default: None)
114
- Tuple containing root certificate, server certificate, and private key to
115
- start a secure SSL-enabled server. The tuple is expected to have three bytes
116
- elements in the following order:
55
+ # Possible options:
56
+ # https://github.com/grpc/grpc/blob/v1.43.x/include/grpc/impl/codegen/grpc_types.h
57
+ channel_options = [
58
+ ("grpc.max_send_message_length", max_message_length),
59
+ ("grpc.max_receive_message_length", max_message_length),
60
+ ]
117
61
 
118
- * CA certificate.
119
- * server certificate.
120
- * server private key.
62
+ if insecure:
63
+ channel = grpc.insecure_channel(server_address, options=channel_options)
64
+ log(DEBUG, "Opened insecure gRPC connection (no certificates were passed)")
65
+ else:
66
+ try:
67
+ ssl_channel_credentials = grpc.ssl_channel_credentials(root_certificates)
68
+ except Exception as e:
69
+ raise ValueError(f"Failed to create SSL channel credentials: {e}") from e
70
+ channel = grpc.secure_channel(
71
+ server_address, ssl_channel_credentials, options=channel_options
72
+ )
73
+ log(DEBUG, "Opened secure gRPC connection using certificates")
121
74
 
122
- Returns
123
- -------
124
- server : grpc.Server
125
- An instance of a gRPC server which is already started
75
+ if interceptors is not None:
76
+ channel = grpc.intercept_channel(channel, interceptors)
126
77
 
127
- Examples
128
- --------
129
- Starting a SSL-enabled server.
78
+ return channel
130
79
 
131
- >>> from pathlib import Path
132
- >>> start_grpc_server(
133
- >>> client_manager=ClientManager(),
134
- >>> server_address="localhost:8080",
135
- >>> certificates=(
136
- >>> Path("/crts/root.pem").read_bytes(),
137
- >>> Path("/crts/localhost.crt").read_bytes(),
138
- >>> Path("/crts/localhost.key").read_bytes(),
139
- >>> ),
140
- >>> )
141
- """
142
- servicer = FlowerServiceServicer(client_manager)
143
- add_servicer_to_server_fn = add_FlowerServiceServicer_to_server
144
80
 
145
- server = generic_create_grpc_server(
146
- servicer_and_add_fn=(servicer, add_servicer_to_server_fn),
147
- server_address=server_address,
148
- max_concurrent_workers=max_concurrent_workers,
149
- max_message_length=max_message_length,
150
- keepalive_time_ms=keepalive_time_ms,
151
- certificates=certificates,
81
+ def valid_certificates(certificates: tuple[bytes, bytes, bytes]) -> bool:
82
+ """Validate certificates tuple."""
83
+ is_valid = (
84
+ all(isinstance(certificate, bytes) for certificate in certificates)
85
+ and len(certificates) == 3
152
86
  )
153
87
 
154
- server.start()
88
+ if not is_valid:
89
+ log(ERROR, INVALID_CERTIFICATES_ERR_MSG)
155
90
 
156
- return server
91
+ return is_valid
157
92
 
158
93
 
159
94
  def generic_create_grpc_server( # pylint: disable=too-many-arguments,R0917
160
- servicer_and_add_fn: Union[
161
- tuple[FleetServicer, AddServicerToServerFn],
162
- tuple[GrpcAdapterServicer, AddServicerToServerFn],
163
- tuple[FlowerServiceServicer, AddServicerToServerFn],
164
- tuple[ServerAppIoServicer, AddServicerToServerFn],
165
- ],
95
+ servicer_and_add_fn: tuple[Any, AddServicerToServerFn],
166
96
  server_address: str,
167
97
  max_concurrent_workers: int = 1000,
168
98
  max_message_length: int = GRPC_MAX_MESSAGE_LENGTH,
@@ -18,7 +18,8 @@
18
18
  import argparse
19
19
  import csv
20
20
  import importlib.util
21
- import subprocess
21
+ import multiprocessing
22
+ import multiprocessing.context
22
23
  import sys
23
24
  import threading
24
25
  from collections.abc import Sequence
@@ -59,6 +60,7 @@ from flwr.common.constant import (
59
60
  TRANSPORT_TYPE_REST,
60
61
  )
61
62
  from flwr.common.exit_handlers import register_exit_handlers
63
+ from flwr.common.grpc import generic_create_grpc_server
62
64
  from flwr.common.logger import log, warn_deprecated_feature
63
65
  from flwr.common.secure_aggregation.crypto.symmetric_encryption import (
64
66
  private_key_to_bytes,
@@ -68,6 +70,8 @@ from flwr.proto.fleet_pb2_grpc import ( # pylint: disable=E0611
68
70
  add_FleetServicer_to_server,
69
71
  )
70
72
  from flwr.proto.grpcadapter_pb2_grpc import add_GrpcAdapterServicer_to_server
73
+ from flwr.server.serverapp.app import flwr_serverapp
74
+ from flwr.simulation.app import flwr_simulation
71
75
  from flwr.superexec.app import load_executor
72
76
  from flwr.superexec.exec_grpc import run_exec_api_grpc
73
77
 
@@ -79,10 +83,7 @@ from .strategy import Strategy
79
83
  from .superlink.driver.serverappio_grpc import run_serverappio_api_grpc
80
84
  from .superlink.ffs.ffs_factory import FfsFactory
81
85
  from .superlink.fleet.grpc_adapter.grpc_adapter_servicer import GrpcAdapterServicer
82
- from .superlink.fleet.grpc_bidi.grpc_server import (
83
- generic_create_grpc_server,
84
- start_grpc_server,
85
- )
86
+ from .superlink.fleet.grpc_bidi.grpc_server import start_grpc_server
86
87
  from .superlink.fleet.grpc_rere.fleet_servicer import FleetServicer
87
88
  from .superlink.fleet.grpc_rere.server_interceptor import AuthenticateServerInterceptor
88
89
  from .superlink.linkstate import LinkStateFactory
@@ -292,7 +293,7 @@ def run_superlink() -> None:
292
293
  # Determine Exec plugin
293
294
  # If simulation is used, don't start ServerAppIo and Fleet APIs
294
295
  sim_exec = executor.__class__.__qualname__ == "SimulationEngine"
295
- bckg_threads = []
296
+ bckg_threads: list[threading.Thread] = []
296
297
 
297
298
  if sim_exec:
298
299
  simulationio_server: grpc.Server = run_simulationio_api_grpc(
@@ -360,6 +361,7 @@ def run_superlink() -> None:
360
361
  ffs_factory,
361
362
  num_workers,
362
363
  ),
364
+ daemon=True,
363
365
  )
364
366
  fleet_thread.start()
365
367
  bckg_threads.append(fleet_thread)
@@ -426,6 +428,7 @@ def run_superlink() -> None:
426
428
  address,
427
429
  cmd,
428
430
  ),
431
+ daemon=True,
429
432
  )
430
433
  scheduler_th.start()
431
434
  bckg_threads.append(scheduler_th)
@@ -434,16 +437,24 @@ def run_superlink() -> None:
434
437
  register_exit_handlers(
435
438
  event_type=EventType.RUN_SUPERLINK_LEAVE,
436
439
  grpc_servers=grpc_servers,
437
- bckg_threads=bckg_threads,
438
440
  )
439
441
 
440
- # Block
441
- while True:
442
- if bckg_threads:
443
- for thread in bckg_threads:
444
- if not thread.is_alive():
445
- sys.exit(1)
446
- exec_server.wait_for_termination(timeout=1)
442
+ # Block until a thread exits prematurely
443
+ while all(thread.is_alive() for thread in bckg_threads):
444
+ sleep(0.1)
445
+
446
+ # Exit if any thread has exited prematurely
447
+ sys.exit(1)
448
+
449
+
450
+ def _run_flwr_command(args: list[str]) -> None:
451
+ sys.argv = args
452
+ if args[0] == "flwr-serverapp":
453
+ flwr_serverapp()
454
+ elif args[0] == "flwr-simulation":
455
+ flwr_simulation()
456
+ else:
457
+ raise ValueError(f"Unknown command: {args[0]}")
447
458
 
448
459
 
449
460
  def _flwr_scheduler(
@@ -453,15 +464,18 @@ def _flwr_scheduler(
453
464
  cmd: str,
454
465
  ) -> None:
455
466
  log(DEBUG, "Started %s scheduler thread.", cmd)
456
-
457
467
  state = state_factory.state()
468
+ run_id_to_proc: dict[int, multiprocessing.context.SpawnProcess] = {}
469
+
470
+ # Use the "spawn" start method for multiprocessing.
471
+ mp_spawn_context = multiprocessing.get_context("spawn")
458
472
 
459
473
  # Periodically check for a pending run in the LinkState
460
474
  while True:
461
- sleep(3)
475
+ sleep(0.1)
462
476
  pending_run_id = state.get_pending_run_id()
463
477
 
464
- if pending_run_id:
478
+ if pending_run_id and pending_run_id not in run_id_to_proc:
465
479
 
466
480
  log(
467
481
  INFO,
@@ -478,10 +492,18 @@ def _flwr_scheduler(
478
492
  "--insecure",
479
493
  ]
480
494
 
481
- subprocess.Popen( # pylint: disable=consider-using-with
482
- command,
483
- text=True,
495
+ proc = mp_spawn_context.Process(
496
+ target=_run_flwr_command, args=(command,), daemon=True
484
497
  )
498
+ proc.start()
499
+
500
+ # Store the process
501
+ run_id_to_proc[pending_run_id] = proc
502
+
503
+ # Clean up finished processes
504
+ for run_id, proc in list(run_id_to_proc.items()):
505
+ if not proc.is_alive():
506
+ del run_id_to_proc[run_id]
485
507
 
486
508
 
487
509
  def _format_address(address: str) -> tuple[str, str, int]:
@@ -21,6 +21,7 @@ from typing import Optional
21
21
  import grpc
22
22
 
23
23
  from flwr.common import GRPC_MAX_MESSAGE_LENGTH
24
+ from flwr.common.grpc import generic_create_grpc_server
24
25
  from flwr.common.logger import log
25
26
  from flwr.proto.serverappio_pb2_grpc import ( # pylint: disable=E0611
26
27
  add_ServerAppIoServicer_to_server,
@@ -28,7 +29,6 @@ from flwr.proto.serverappio_pb2_grpc import ( # pylint: disable=E0611
28
29
  from flwr.server.superlink.ffs.ffs_factory import FfsFactory
29
30
  from flwr.server.superlink.linkstate import LinkStateFactory
30
31
 
31
- from ..fleet.grpc_bidi.grpc_server import generic_create_grpc_server
32
32
  from .serverappio_servicer import ServerAppIoServicer
33
33
 
34
34
 
@@ -0,0 +1,126 @@
1
+ # Copyright 2024 Flower Labs GmbH. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ # ==============================================================================
15
+ """Implements utility function to create a gRPC server."""
16
+
17
+
18
+ from typing import Optional
19
+
20
+ import grpc
21
+
22
+ from flwr.common import GRPC_MAX_MESSAGE_LENGTH
23
+ from flwr.common.grpc import generic_create_grpc_server
24
+ from flwr.proto.transport_pb2_grpc import ( # pylint: disable=E0611
25
+ add_FlowerServiceServicer_to_server,
26
+ )
27
+ from flwr.server.client_manager import ClientManager
28
+ from flwr.server.superlink.fleet.grpc_bidi.flower_service_servicer import (
29
+ FlowerServiceServicer,
30
+ )
31
+
32
+
33
+ def start_grpc_server( # pylint: disable=too-many-arguments,R0917
34
+ client_manager: ClientManager,
35
+ server_address: str,
36
+ max_concurrent_workers: int = 1000,
37
+ max_message_length: int = GRPC_MAX_MESSAGE_LENGTH,
38
+ keepalive_time_ms: int = 210000,
39
+ certificates: Optional[tuple[bytes, bytes, bytes]] = None,
40
+ ) -> grpc.Server:
41
+ """Create and start a gRPC server running FlowerServiceServicer.
42
+
43
+ If used in a main function server.wait_for_termination(timeout=None)
44
+ should be called as otherwise the server will immediately stop.
45
+
46
+ **SSL**
47
+ To enable SSL you have to pass all of root_certificate, certificate,
48
+ and private_key. Setting only some will make the process exit with code 1.
49
+
50
+ Parameters
51
+ ----------
52
+ client_manager : ClientManager
53
+ Instance of ClientManager
54
+ server_address : str
55
+ Server address in the form of HOST:PORT e.g. "[::]:8080"
56
+ max_concurrent_workers : int
57
+ Maximum number of clients the server can process before returning
58
+ RESOURCE_EXHAUSTED status (default: 1000)
59
+ max_message_length : int
60
+ Maximum message length that the server can send or receive.
61
+ Int valued in bytes. -1 means unlimited. (default: GRPC_MAX_MESSAGE_LENGTH)
62
+ keepalive_time_ms : int
63
+ Flower uses a default gRPC keepalive time of 210000ms (3 minutes 30 seconds)
64
+ because some cloud providers (for example, Azure) agressively clean up idle
65
+ TCP connections by terminating them after some time (4 minutes in the case
66
+ of Azure). Flower does not use application-level keepalive signals and relies
67
+ on the assumption that the transport layer will fail in cases where the
68
+ connection is no longer active. `keepalive_time_ms` can be used to customize
69
+ the keepalive interval for specific environments. The default Flower gRPC
70
+ keepalive of 210000 ms (3 minutes 30 seconds) ensures that Flower can keep
71
+ the long running streaming connection alive in most environments. The actual
72
+ gRPC default of this setting is 7200000 (2 hours), which results in dropped
73
+ connections in some cloud environments.
74
+
75
+ These settings are related to the issue described here:
76
+ - https://github.com/grpc/proposal/blob/master/A8-client-side-keepalive.md
77
+ - https://github.com/grpc/grpc/blob/master/doc/keepalive.md
78
+ - https://grpc.io/docs/guides/performance/
79
+
80
+ Mobile Flower clients may choose to increase this value if their server
81
+ environment allows long-running idle TCP connections.
82
+ (default: 210000)
83
+ certificates : Tuple[bytes, bytes, bytes] (default: None)
84
+ Tuple containing root certificate, server certificate, and private key to
85
+ start a secure SSL-enabled server. The tuple is expected to have three bytes
86
+ elements in the following order:
87
+
88
+ * CA certificate.
89
+ * server certificate.
90
+ * server private key.
91
+
92
+ Returns
93
+ -------
94
+ server : grpc.Server
95
+ An instance of a gRPC server which is already started
96
+
97
+ Examples
98
+ --------
99
+ Starting a SSL-enabled server.
100
+
101
+ >>> from pathlib import Path
102
+ >>> start_grpc_server(
103
+ >>> client_manager=ClientManager(),
104
+ >>> server_address="localhost:8080",
105
+ >>> certificates=(
106
+ >>> Path("/crts/root.pem").read_bytes(),
107
+ >>> Path("/crts/localhost.crt").read_bytes(),
108
+ >>> Path("/crts/localhost.key").read_bytes(),
109
+ >>> ),
110
+ >>> )
111
+ """
112
+ servicer = FlowerServiceServicer(client_manager)
113
+ add_servicer_to_server_fn = add_FlowerServiceServicer_to_server
114
+
115
+ server = generic_create_grpc_server(
116
+ servicer_and_add_fn=(servicer, add_servicer_to_server_fn),
117
+ server_address=server_address,
118
+ max_concurrent_workers=max_concurrent_workers,
119
+ max_message_length=max_message_length,
120
+ keepalive_time_ms=keepalive_time_ms,
121
+ certificates=certificates,
122
+ )
123
+
124
+ server.start()
125
+
126
+ return server
@@ -21,6 +21,7 @@ from typing import Optional
21
21
  import grpc
22
22
 
23
23
  from flwr.common import GRPC_MAX_MESSAGE_LENGTH
24
+ from flwr.common.grpc import generic_create_grpc_server
24
25
  from flwr.common.logger import log
25
26
  from flwr.proto.simulationio_pb2_grpc import ( # pylint: disable=E0611
26
27
  add_SimulationIoServicer_to_server,
@@ -28,7 +29,6 @@ from flwr.proto.simulationio_pb2_grpc import ( # pylint: disable=E0611
28
29
  from flwr.server.superlink.ffs.ffs_factory import FfsFactory
29
30
  from flwr.server.superlink.linkstate import LinkStateFactory
30
31
 
31
- from ..fleet.grpc_bidi.grpc_server import generic_create_grpc_server
32
32
  from .simulationio_servicer import SimulationIoServicer
33
33
 
34
34
 
@@ -23,11 +23,11 @@ import grpc
23
23
 
24
24
  from flwr.common import GRPC_MAX_MESSAGE_LENGTH
25
25
  from flwr.common.auth_plugin import ExecAuthPlugin
26
+ from flwr.common.grpc import generic_create_grpc_server
26
27
  from flwr.common.logger import log
27
28
  from flwr.common.typing import UserConfig
28
29
  from flwr.proto.exec_pb2_grpc import add_ExecServicer_to_server
29
30
  from flwr.server.superlink.ffs.ffs_factory import FfsFactory
30
- from flwr.server.superlink.fleet.grpc_bidi.grpc_server import generic_create_grpc_server
31
31
  from flwr.server.superlink.linkstate import LinkStateFactory
32
32
  from flwr.superexec.exec_user_auth_interceptor import ExecUserAuthInterceptor
33
33