flwr-nightly 1.13.0.dev20241111__tar.gz → 1.13.0.dev20241113__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of flwr-nightly might be problematic. Click here for more details.

Files changed (327) hide show
  1. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/PKG-INFO +2 -1
  2. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/pyproject.toml +2 -1
  3. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/cli/build.py +37 -0
  4. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/cli/install.py +5 -3
  5. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/client/supernode/app.py +2 -36
  6. flwr_nightly-1.13.0.dev20241113/src/py/flwr/common/args.py +148 -0
  7. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/common/date.py +18 -0
  8. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/app.py +2 -56
  9. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/serverapp/app.py +2 -2
  10. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/superlink/linkstate/sqlite_linkstate.py +2 -2
  11. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/superlink/linkstate/utils.py +11 -0
  12. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/simulation/app.py +3 -38
  13. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/superexec/deployment.py +3 -1
  14. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/superexec/simulation.py +11 -46
  15. flwr_nightly-1.13.0.dev20241111/src/py/flwr/common/args.py +0 -83
  16. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/LICENSE +0 -0
  17. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/README.md +0 -0
  18. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/__init__.py +0 -0
  19. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/cli/__init__.py +0 -0
  20. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/cli/app.py +0 -0
  21. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/cli/config_utils.py +0 -0
  22. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/cli/example.py +0 -0
  23. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/cli/log.py +0 -0
  24. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/cli/new/__init__.py +0 -0
  25. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/cli/new/new.py +0 -0
  26. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/cli/new/templates/__init__.py +0 -0
  27. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/cli/new/templates/app/.gitignore.tpl +0 -0
  28. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/cli/new/templates/app/LICENSE.tpl +0 -0
  29. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/cli/new/templates/app/README.baseline.md.tpl +0 -0
  30. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/cli/new/templates/app/README.flowertune.md.tpl +0 -0
  31. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/cli/new/templates/app/README.md.tpl +0 -0
  32. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/cli/new/templates/app/__init__.py +0 -0
  33. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/cli/new/templates/app/code/__init__.baseline.py.tpl +0 -0
  34. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
  35. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
  36. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/cli/new/templates/app/code/client.baseline.py.tpl +0 -0
  37. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/cli/new/templates/app/code/client.huggingface.py.tpl +0 -0
  38. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/cli/new/templates/app/code/client.jax.py.tpl +0 -0
  39. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/cli/new/templates/app/code/client.mlx.py.tpl +0 -0
  40. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/cli/new/templates/app/code/client.numpy.py.tpl +0 -0
  41. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -0
  42. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl +0 -0
  43. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -0
  44. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/cli/new/templates/app/code/dataset.baseline.py.tpl +0 -0
  45. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/cli/new/templates/app/code/flwr_tune/__init__.py +0 -0
  46. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/cli/new/templates/app/code/flwr_tune/client_app.py.tpl +0 -0
  47. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/cli/new/templates/app/code/flwr_tune/dataset.py.tpl +0 -0
  48. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/cli/new/templates/app/code/flwr_tune/models.py.tpl +0 -0
  49. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/cli/new/templates/app/code/flwr_tune/server_app.py.tpl +0 -0
  50. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/cli/new/templates/app/code/flwr_tune/strategy.py.tpl +0 -0
  51. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/cli/new/templates/app/code/model.baseline.py.tpl +0 -0
  52. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/cli/new/templates/app/code/server.baseline.py.tpl +0 -0
  53. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/cli/new/templates/app/code/server.huggingface.py.tpl +0 -0
  54. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/cli/new/templates/app/code/server.jax.py.tpl +0 -0
  55. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/cli/new/templates/app/code/server.mlx.py.tpl +0 -0
  56. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -0
  57. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -0
  58. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/cli/new/templates/app/code/server.sklearn.py.tpl +0 -0
  59. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -0
  60. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/cli/new/templates/app/code/strategy.baseline.py.tpl +0 -0
  61. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/cli/new/templates/app/code/task.huggingface.py.tpl +0 -0
  62. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/cli/new/templates/app/code/task.jax.py.tpl +0 -0
  63. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/cli/new/templates/app/code/task.mlx.py.tpl +0 -0
  64. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/cli/new/templates/app/code/task.numpy.py.tpl +0 -0
  65. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +0 -0
  66. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/cli/new/templates/app/code/task.sklearn.py.tpl +0 -0
  67. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/cli/new/templates/app/code/task.tensorflow.py.tpl +0 -0
  68. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/cli/new/templates/app/code/utils.baseline.py.tpl +0 -0
  69. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/cli/new/templates/app/pyproject.baseline.toml.tpl +0 -0
  70. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +0 -0
  71. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl +0 -0
  72. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/cli/new/templates/app/pyproject.jax.toml.tpl +0 -0
  73. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +0 -0
  74. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +0 -0
  75. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +0 -0
  76. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +0 -0
  77. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +0 -0
  78. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/cli/run/__init__.py +0 -0
  79. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/cli/run/run.py +0 -0
  80. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/cli/utils.py +0 -0
  81. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/client/__init__.py +0 -0
  82. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/client/app.py +0 -0
  83. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/client/client.py +0 -0
  84. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/client/client_app.py +0 -0
  85. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/client/clientapp/__init__.py +0 -0
  86. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/client/clientapp/app.py +0 -0
  87. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/client/clientapp/clientappio_servicer.py +0 -0
  88. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/client/clientapp/utils.py +0 -0
  89. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/client/dpfedavg_numpy_client.py +0 -0
  90. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/client/grpc_adapter_client/__init__.py +0 -0
  91. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/client/grpc_adapter_client/connection.py +0 -0
  92. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/client/grpc_client/__init__.py +0 -0
  93. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/client/grpc_client/connection.py +0 -0
  94. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/client/grpc_rere_client/__init__.py +0 -0
  95. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/client/grpc_rere_client/client_interceptor.py +0 -0
  96. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/client/grpc_rere_client/connection.py +0 -0
  97. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/client/grpc_rere_client/grpc_adapter.py +0 -0
  98. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/client/heartbeat.py +0 -0
  99. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/client/message_handler/__init__.py +0 -0
  100. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/client/message_handler/message_handler.py +0 -0
  101. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/client/message_handler/task_handler.py +0 -0
  102. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/client/mod/__init__.py +0 -0
  103. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/client/mod/centraldp_mods.py +0 -0
  104. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/client/mod/comms_mods.py +0 -0
  105. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/client/mod/localdp_mod.py +0 -0
  106. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
  107. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
  108. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
  109. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/client/mod/utils.py +0 -0
  110. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/client/nodestate/__init__.py +0 -0
  111. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/client/nodestate/in_memory_nodestate.py +0 -0
  112. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/client/nodestate/nodestate.py +0 -0
  113. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/client/nodestate/nodestate_factory.py +0 -0
  114. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/client/numpy_client.py +0 -0
  115. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/client/rest_client/__init__.py +0 -0
  116. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/client/rest_client/connection.py +0 -0
  117. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/client/run_info_store.py +0 -0
  118. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/client/supernode/__init__.py +0 -0
  119. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/client/typing.py +0 -0
  120. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/common/__init__.py +0 -0
  121. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/common/address.py +0 -0
  122. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/common/config.py +0 -0
  123. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/common/constant.py +0 -0
  124. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/common/context.py +0 -0
  125. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/common/differential_privacy.py +0 -0
  126. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/common/differential_privacy_constants.py +0 -0
  127. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/common/dp.py +0 -0
  128. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/common/exit_handlers.py +0 -0
  129. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/common/grpc.py +0 -0
  130. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/common/logger.py +0 -0
  131. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/common/message.py +0 -0
  132. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/common/object_ref.py +0 -0
  133. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/common/parameter.py +0 -0
  134. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/common/pyproject.py +0 -0
  135. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/common/record/__init__.py +0 -0
  136. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/common/record/configsrecord.py +0 -0
  137. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/common/record/conversion_utils.py +0 -0
  138. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/common/record/metricsrecord.py +0 -0
  139. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/common/record/parametersrecord.py +0 -0
  140. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/common/record/recordset.py +0 -0
  141. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/common/record/typeddict.py +0 -0
  142. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/common/recordset_compat.py +0 -0
  143. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/common/retry_invoker.py +0 -0
  144. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/common/secure_aggregation/__init__.py +0 -0
  145. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
  146. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
  147. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -0
  148. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
  149. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/common/secure_aggregation/quantization.py +0 -0
  150. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
  151. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
  152. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/common/serde.py +0 -0
  153. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/common/telemetry.py +0 -0
  154. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/common/typing.py +0 -0
  155. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/common/version.py +0 -0
  156. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/proto/__init__.py +0 -0
  157. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/proto/clientappio_pb2.py +0 -0
  158. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/proto/clientappio_pb2.pyi +0 -0
  159. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/proto/clientappio_pb2_grpc.py +0 -0
  160. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/proto/clientappio_pb2_grpc.pyi +0 -0
  161. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/proto/common_pb2.py +0 -0
  162. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/proto/common_pb2.pyi +0 -0
  163. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/proto/common_pb2_grpc.py +0 -0
  164. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/proto/common_pb2_grpc.pyi +0 -0
  165. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/proto/control_pb2.py +0 -0
  166. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/proto/control_pb2.pyi +0 -0
  167. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/proto/control_pb2_grpc.py +0 -0
  168. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/proto/control_pb2_grpc.pyi +0 -0
  169. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/proto/error_pb2.py +0 -0
  170. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/proto/error_pb2.pyi +0 -0
  171. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/proto/error_pb2_grpc.py +0 -0
  172. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/proto/error_pb2_grpc.pyi +0 -0
  173. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/proto/exec_pb2.py +0 -0
  174. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/proto/exec_pb2.pyi +0 -0
  175. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/proto/exec_pb2_grpc.py +0 -0
  176. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/proto/exec_pb2_grpc.pyi +0 -0
  177. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/proto/fab_pb2.py +0 -0
  178. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/proto/fab_pb2.pyi +0 -0
  179. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/proto/fab_pb2_grpc.py +0 -0
  180. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/proto/fab_pb2_grpc.pyi +0 -0
  181. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/proto/fleet_pb2.py +0 -0
  182. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/proto/fleet_pb2.pyi +0 -0
  183. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/proto/fleet_pb2_grpc.py +0 -0
  184. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
  185. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/proto/grpcadapter_pb2.py +0 -0
  186. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/proto/grpcadapter_pb2.pyi +0 -0
  187. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/proto/grpcadapter_pb2_grpc.py +0 -0
  188. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/proto/grpcadapter_pb2_grpc.pyi +0 -0
  189. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/proto/log_pb2.py +0 -0
  190. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/proto/log_pb2.pyi +0 -0
  191. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/proto/log_pb2_grpc.py +0 -0
  192. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/proto/log_pb2_grpc.pyi +0 -0
  193. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/proto/message_pb2.py +0 -0
  194. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/proto/message_pb2.pyi +0 -0
  195. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/proto/message_pb2_grpc.py +0 -0
  196. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/proto/message_pb2_grpc.pyi +0 -0
  197. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/proto/node_pb2.py +0 -0
  198. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/proto/node_pb2.pyi +0 -0
  199. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/proto/node_pb2_grpc.py +0 -0
  200. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/proto/node_pb2_grpc.pyi +0 -0
  201. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/proto/recordset_pb2.py +0 -0
  202. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/proto/recordset_pb2.pyi +0 -0
  203. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/proto/recordset_pb2_grpc.py +0 -0
  204. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/proto/recordset_pb2_grpc.pyi +0 -0
  205. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/proto/run_pb2.py +0 -0
  206. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/proto/run_pb2.pyi +0 -0
  207. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/proto/run_pb2_grpc.py +0 -0
  208. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/proto/run_pb2_grpc.pyi +0 -0
  209. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/proto/serverappio_pb2.py +0 -0
  210. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/proto/serverappio_pb2.pyi +0 -0
  211. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/proto/serverappio_pb2_grpc.py +0 -0
  212. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/proto/serverappio_pb2_grpc.pyi +0 -0
  213. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/proto/simulationio_pb2.py +0 -0
  214. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/proto/simulationio_pb2.pyi +0 -0
  215. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/proto/simulationio_pb2_grpc.py +0 -0
  216. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/proto/simulationio_pb2_grpc.pyi +0 -0
  217. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/proto/task_pb2.py +0 -0
  218. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/proto/task_pb2.pyi +0 -0
  219. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/proto/task_pb2_grpc.py +0 -0
  220. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/proto/task_pb2_grpc.pyi +0 -0
  221. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/proto/transport_pb2.py +0 -0
  222. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/proto/transport_pb2.pyi +0 -0
  223. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/proto/transport_pb2_grpc.py +0 -0
  224. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
  225. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/py.typed +0 -0
  226. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/__init__.py +0 -0
  227. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/client_manager.py +0 -0
  228. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/client_proxy.py +0 -0
  229. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/compat/__init__.py +0 -0
  230. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/compat/app.py +0 -0
  231. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/compat/app_utils.py +0 -0
  232. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/compat/driver_client_proxy.py +0 -0
  233. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/compat/legacy_context.py +0 -0
  234. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/criterion.py +0 -0
  235. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/driver/__init__.py +0 -0
  236. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/driver/driver.py +0 -0
  237. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/driver/grpc_driver.py +0 -0
  238. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/driver/inmemory_driver.py +0 -0
  239. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/history.py +0 -0
  240. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/run_serverapp.py +0 -0
  241. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/server.py +0 -0
  242. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/server_app.py +0 -0
  243. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/server_config.py +0 -0
  244. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/serverapp/__init__.py +0 -0
  245. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/serverapp_components.py +0 -0
  246. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/strategy/__init__.py +0 -0
  247. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/strategy/aggregate.py +0 -0
  248. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/strategy/bulyan.py +0 -0
  249. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
  250. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
  251. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
  252. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
  253. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
  254. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/strategy/fedadagrad.py +0 -0
  255. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/strategy/fedadam.py +0 -0
  256. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/strategy/fedavg.py +0 -0
  257. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/strategy/fedavg_android.py +0 -0
  258. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/strategy/fedavgm.py +0 -0
  259. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/strategy/fedmedian.py +0 -0
  260. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/strategy/fedopt.py +0 -0
  261. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/strategy/fedprox.py +0 -0
  262. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
  263. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
  264. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
  265. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
  266. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/strategy/fedyogi.py +0 -0
  267. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/strategy/krum.py +0 -0
  268. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/strategy/qfedavg.py +0 -0
  269. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/strategy/strategy.py +0 -0
  270. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/superlink/__init__.py +0 -0
  271. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/superlink/driver/__init__.py +0 -0
  272. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/superlink/driver/serverappio_grpc.py +0 -0
  273. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/superlink/driver/serverappio_servicer.py +0 -0
  274. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/superlink/ffs/__init__.py +0 -0
  275. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/superlink/ffs/disk_ffs.py +0 -0
  276. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/superlink/ffs/ffs.py +0 -0
  277. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/superlink/ffs/ffs_factory.py +0 -0
  278. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/superlink/fleet/__init__.py +0 -0
  279. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/superlink/fleet/grpc_adapter/__init__.py +0 -0
  280. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +0 -0
  281. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
  282. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
  283. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
  284. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
  285. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +0 -0
  286. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
  287. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +0 -0
  288. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +0 -0
  289. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
  290. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/superlink/fleet/message_handler/message_handler.py +0 -0
  291. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
  292. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +0 -0
  293. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
  294. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
  295. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
  296. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +0 -0
  297. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/superlink/fleet/vce/vce_api.py +0 -0
  298. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/superlink/linkstate/__init__.py +0 -0
  299. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/superlink/linkstate/in_memory_linkstate.py +0 -0
  300. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/superlink/linkstate/linkstate.py +0 -0
  301. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/superlink/linkstate/linkstate_factory.py +0 -0
  302. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/superlink/simulation/__init__.py +0 -0
  303. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/superlink/simulation/simulationio_grpc.py +0 -0
  304. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/superlink/simulation/simulationio_servicer.py +0 -0
  305. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/typing.py +0 -0
  306. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/utils/__init__.py +0 -0
  307. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/utils/tensorboard.py +0 -0
  308. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/utils/validator.py +0 -0
  309. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/workflow/__init__.py +0 -0
  310. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/workflow/constant.py +0 -0
  311. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/workflow/default_workflows.py +0 -0
  312. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
  313. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
  314. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +0 -0
  315. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/simulation/__init__.py +0 -0
  316. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/simulation/legacy_app.py +0 -0
  317. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/simulation/ray_transport/__init__.py +0 -0
  318. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
  319. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
  320. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/simulation/ray_transport/utils.py +0 -0
  321. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/simulation/run_simulation.py +0 -0
  322. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/simulation/simulationio_connection.py +0 -0
  323. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/superexec/__init__.py +0 -0
  324. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/superexec/app.py +0 -0
  325. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/superexec/exec_grpc.py +0 -0
  326. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/superexec/exec_servicer.py +0 -0
  327. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241113}/src/py/flwr/superexec/executor.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: flwr-nightly
3
- Version: 1.13.0.dev20241111
3
+ Version: 1.13.0.dev20241113
4
4
  Summary: Flower: A Friendly Federated Learning Framework
5
5
  Home-page: https://flower.ai
6
6
  License: Apache-2.0
@@ -34,6 +34,7 @@ Provides-Extra: rest
34
34
  Provides-Extra: simulation
35
35
  Requires-Dist: cryptography (>=42.0.4,<43.0.0)
36
36
  Requires-Dist: grpcio (>=1.60.0,<2.0.0,!=1.64.2,<=1.64.3)
37
+ Requires-Dist: hatchling (>=1.25.0,<2.0.0)
37
38
  Requires-Dist: iterators (>=0.0.2,<0.0.3)
38
39
  Requires-Dist: numpy (>=1.26.0,<3.0.0)
39
40
  Requires-Dist: pathspec (>=0.12.1,<0.13.0)
@@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api"
4
4
 
5
5
  [tool.poetry]
6
6
  name = "flwr-nightly"
7
- version = "1.13.0.dev20241111"
7
+ version = "1.13.0.dev20241113"
8
8
  description = "Flower: A Friendly Federated Learning Framework"
9
9
  license = "Apache-2.0"
10
10
  authors = ["The Flower Authors <hello@flower.ai>"]
@@ -77,6 +77,7 @@ typer = "^0.12.5"
77
77
  tomli = "^2.0.1"
78
78
  tomli-w = "^1.0.0"
79
79
  pathspec = "^0.12.1"
80
+ hatchling = "^1.25.0"
80
81
  # Optional dependencies (Simulation Engine)
81
82
  ray = { version = "==2.10.0", optional = true, python = ">=3.9,<3.12" }
82
83
  # Optional dependencies (REST transport layer)
@@ -19,14 +19,18 @@ import os
19
19
  import shutil
20
20
  import tempfile
21
21
  import zipfile
22
+ from logging import DEBUG, ERROR
22
23
  from pathlib import Path
23
24
  from typing import Annotated, Any, Optional, Union
24
25
 
25
26
  import pathspec
26
27
  import tomli_w
27
28
  import typer
29
+ from hatchling.builders.wheel import WheelBuilder
30
+ from hatchling.metadata.core import ProjectMetadata
28
31
 
29
32
  from flwr.common.constant import FAB_ALLOWED_EXTENSIONS, FAB_DATE, FAB_HASH_TRUNCATION
33
+ from flwr.common.logger import log
30
34
 
31
35
  from .config_utils import load_and_validate
32
36
  from .utils import is_valid_project_name
@@ -51,6 +55,27 @@ def get_fab_filename(conf: dict[str, Any], fab_hash: str) -> str:
51
55
  return f"{publisher}.{name}.{version}.{fab_hash_truncated}.fab"
52
56
 
53
57
 
58
+ def _build_app_wheel(app: Path) -> Path:
59
+ """Build app as a wheel and return its path."""
60
+ # Path to your project directory
61
+ app_dir = str(app.resolve())
62
+ try:
63
+
64
+ # Initialize the WheelBuilder
65
+ builder = WheelBuilder(
66
+ app_dir, metadata=ProjectMetadata(root=app_dir, plugin_manager=None)
67
+ )
68
+
69
+ # Build
70
+ whl_path = Path(next(builder.build(directory=app_dir)))
71
+ log(DEBUG, "Wheel succesfully built: %s", str(whl_path))
72
+ except Exception as ex:
73
+ log(ERROR, "Exception encountered when building wheel.", exc_info=ex)
74
+ raise typer.Exit(code=1) from ex
75
+
76
+ return whl_path
77
+
78
+
54
79
  # pylint: disable=too-many-locals, too-many-statements
55
80
  def build(
56
81
  app: Annotated[
@@ -106,6 +131,12 @@ def build(
106
131
  bold=True,
107
132
  )
108
133
 
134
+ # Build wheel
135
+ whl_path = _build_app_wheel(app)
136
+
137
+ # Add path to .whl to `[tool.flwr.app]`
138
+ conf["tool"]["flwr"]["app"]["whl"] = str(whl_path.name)
139
+
109
140
  # Load .gitignore rules if present
110
141
  ignore_spec = _load_gitignore(app)
111
142
 
@@ -137,6 +168,9 @@ def build(
137
168
  and f.name != "pyproject.toml" # Exclude the original pyproject.toml
138
169
  ]
139
170
 
171
+ # Include FAB .whl
172
+ all_files.append(whl_path)
173
+
140
174
  for file_path in all_files:
141
175
  # Read the file content manually
142
176
  with open(file_path, "rb") as f:
@@ -153,6 +187,9 @@ def build(
153
187
  # Add CONTENT and CONTENT.jwt to the zip file
154
188
  write_to_zip(fab_file, ".info/CONTENT", list_file_content)
155
189
 
190
+ # Erase FAB .whl in app directory
191
+ whl_path.unlink()
192
+
156
193
  # Get hash of FAB file
157
194
  content = Path(temp_filename).read_bytes()
158
195
  fab_hash = hashlib.sha256(content).hexdigest()
@@ -188,23 +188,25 @@ def validate_and_install(
188
188
  else:
189
189
  shutil.copy2(item, install_dir / item.name)
190
190
 
191
+ whl_file = config["tool"]["flwr"]["app"]["whl"]
192
+ install_whl = install_dir / whl_file
191
193
  try:
192
194
  subprocess.run(
193
- ["pip", "install", "-e", install_dir, "--no-deps"],
195
+ ["pip", "install", "--no-deps", install_whl],
194
196
  capture_output=True,
195
197
  text=True,
196
198
  check=True,
197
199
  )
198
200
  except subprocess.CalledProcessError as e:
199
201
  typer.secho(
200
- f"❌ Failed to `pip install` package(s) from {install_dir}:\n{e.stderr}",
202
+ f"❌ Failed to install {project_name}:\n{e.stderr}",
201
203
  fg=typer.colors.RED,
202
204
  bold=True,
203
205
  )
204
206
  raise typer.Exit(code=1) from e
205
207
 
206
208
  typer.secho(
207
- f"🎊 Successfully installed {project_name} to {install_dir}.",
209
+ f"🎊 Successfully installed {project_name}.",
208
210
  fg=typer.colors.GREEN,
209
211
  bold=True,
210
212
  )
@@ -28,6 +28,7 @@ from cryptography.hazmat.primitives.serialization import (
28
28
  )
29
29
 
30
30
  from flwr.common import EventType, event
31
+ from flwr.common.args import try_obtain_root_certificates
31
32
  from flwr.common.config import parse_config_args
32
33
  from flwr.common.constant import (
33
34
  FLEET_API_GRPC_RERE_DEFAULT_ADDRESS,
@@ -61,7 +62,7 @@ def run_supernode() -> None:
61
62
  "Ignoring `--flwr-dir`.",
62
63
  )
63
64
 
64
- root_certificates = _get_certificates(args)
65
+ root_certificates = try_obtain_root_certificates(args, args.superlink)
65
66
  load_fn = get_load_client_app_fn(
66
67
  default_app_ref="",
67
68
  app_path=args.app,
@@ -126,41 +127,6 @@ def _warn_deprecated_server_arg(args: argparse.Namespace) -> None:
126
127
  args.superlink = args.server
127
128
 
128
129
 
129
- def _get_certificates(args: argparse.Namespace) -> Optional[bytes]:
130
- """Load certificates if specified in args."""
131
- # Obtain certificates
132
- if args.insecure:
133
- if args.root_certificates is not None:
134
- sys.exit(
135
- "Conflicting options: The '--insecure' flag disables HTTPS, "
136
- "but '--root-certificates' was also specified. Please remove "
137
- "the '--root-certificates' option when running in insecure mode, "
138
- "or omit '--insecure' to use HTTPS."
139
- )
140
- log(
141
- WARN,
142
- "Option `--insecure` was set. "
143
- "Starting insecure HTTP client connected to %s.",
144
- args.superlink,
145
- )
146
- root_certificates = None
147
- else:
148
- # Load the certificates if provided, or load the system certificates
149
- cert_path = args.root_certificates
150
- if cert_path is None:
151
- root_certificates = None
152
- else:
153
- root_certificates = Path(cert_path).read_bytes()
154
- log(
155
- DEBUG,
156
- "Starting secure HTTPS client connected to %s "
157
- "with the following certificates: %s.",
158
- args.superlink,
159
- cert_path,
160
- )
161
- return root_certificates
162
-
163
-
164
130
  def _parse_args_run_supernode() -> argparse.ArgumentParser:
165
131
  """Parse flower-supernode command line arguments."""
166
132
  parser = argparse.ArgumentParser(
@@ -0,0 +1,148 @@
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
+ """Common Flower arguments."""
16
+
17
+ import argparse
18
+ import sys
19
+ from logging import DEBUG, WARN
20
+ from os.path import isfile
21
+ from pathlib import Path
22
+ from typing import Optional
23
+
24
+ from flwr.common.constant import (
25
+ TRANSPORT_TYPE_GRPC_ADAPTER,
26
+ TRANSPORT_TYPE_GRPC_RERE,
27
+ TRANSPORT_TYPE_REST,
28
+ )
29
+ from flwr.common.logger import log
30
+
31
+
32
+ def add_args_flwr_app_common(parser: argparse.ArgumentParser) -> None:
33
+ """Add common Flower arguments for flwr-*app to the provided parser."""
34
+ parser.add_argument(
35
+ "--flwr-dir",
36
+ default=None,
37
+ help="""The path containing installed Flower Apps.
38
+ By default, this value is equal to:
39
+
40
+ - `$FLWR_HOME/` if `$FLWR_HOME` is defined
41
+ - `$XDG_DATA_HOME/.flwr/` if `$XDG_DATA_HOME` is defined
42
+ - `$HOME/.flwr/` in all other cases
43
+ """,
44
+ )
45
+ parser.add_argument(
46
+ "--insecure",
47
+ action="store_true",
48
+ help="Run the server without HTTPS, regardless of whether certificate "
49
+ "paths are provided. By default, the server runs with HTTPS enabled. "
50
+ "Use this flag only if you understand the risks.",
51
+ )
52
+ parser.add_argument(
53
+ "--root-certificates",
54
+ metavar="ROOT_CERT",
55
+ type=str,
56
+ help="Specifies the path to the PEM-encoded root certificate file for "
57
+ "establishing secure HTTPS connections.",
58
+ )
59
+
60
+
61
+ def try_obtain_root_certificates(
62
+ args: argparse.Namespace,
63
+ grpc_server_address: str,
64
+ ) -> Optional[bytes]:
65
+ """Validate and return the root certificates."""
66
+ root_cert_path = args.root_certificates
67
+ if args.insecure:
68
+ if root_cert_path is not None:
69
+ sys.exit(
70
+ "Conflicting options: The '--insecure' flag disables HTTPS, "
71
+ "but '--root-certificates' was also specified. Please remove "
72
+ "the '--root-certificates' option when running in insecure mode, "
73
+ "or omit '--insecure' to use HTTPS."
74
+ )
75
+ log(
76
+ WARN,
77
+ "Option `--insecure` was set. Starting insecure HTTP channel to %s.",
78
+ grpc_server_address,
79
+ )
80
+ root_certificates = None
81
+ else:
82
+ # Load the certificates if provided, or load the system certificates
83
+ if not isfile(root_cert_path):
84
+ sys.exit("Path argument `--root-certificates` does not point to a file.")
85
+ root_certificates = Path(root_cert_path).read_bytes()
86
+ log(
87
+ DEBUG,
88
+ "Starting secure HTTPS channel to %s "
89
+ "with the following certificates: %s.",
90
+ grpc_server_address,
91
+ root_cert_path,
92
+ )
93
+ return root_certificates
94
+
95
+
96
+ def try_obtain_server_certificates(
97
+ args: argparse.Namespace,
98
+ transport_type: str,
99
+ ) -> Optional[tuple[bytes, bytes, bytes]]:
100
+ """Validate and return the CA cert, server cert, and server private key."""
101
+ if args.insecure:
102
+ log(WARN, "Option `--insecure` was set. Starting insecure HTTP server.")
103
+ return None
104
+ # Check if certificates are provided
105
+ if transport_type in [TRANSPORT_TYPE_GRPC_RERE, TRANSPORT_TYPE_GRPC_ADAPTER]:
106
+ if args.ssl_certfile and args.ssl_keyfile and args.ssl_ca_certfile:
107
+ if not isfile(args.ssl_ca_certfile):
108
+ sys.exit("Path argument `--ssl-ca-certfile` does not point to a file.")
109
+ if not isfile(args.ssl_certfile):
110
+ sys.exit("Path argument `--ssl-certfile` does not point to a file.")
111
+ if not isfile(args.ssl_keyfile):
112
+ sys.exit("Path argument `--ssl-keyfile` does not point to a file.")
113
+ certificates = (
114
+ Path(args.ssl_ca_certfile).read_bytes(), # CA certificate
115
+ Path(args.ssl_certfile).read_bytes(), # server certificate
116
+ Path(args.ssl_keyfile).read_bytes(), # server private key
117
+ )
118
+ return certificates
119
+ if args.ssl_certfile or args.ssl_keyfile or args.ssl_ca_certfile:
120
+ sys.exit(
121
+ "You need to provide valid file paths to `--ssl-certfile`, "
122
+ "`--ssl-keyfile`, and `—-ssl-ca-certfile` to create a secure "
123
+ "connection in Fleet API server (gRPC-rere)."
124
+ )
125
+ if transport_type == TRANSPORT_TYPE_REST:
126
+ if args.ssl_certfile and args.ssl_keyfile:
127
+ if not isfile(args.ssl_certfile):
128
+ sys.exit("Path argument `--ssl-certfile` does not point to a file.")
129
+ if not isfile(args.ssl_keyfile):
130
+ sys.exit("Path argument `--ssl-keyfile` does not point to a file.")
131
+ certificates = (
132
+ b"",
133
+ Path(args.ssl_certfile).read_bytes(), # server certificate
134
+ Path(args.ssl_keyfile).read_bytes(), # server private key
135
+ )
136
+ return certificates
137
+ if args.ssl_certfile or args.ssl_keyfile:
138
+ sys.exit(
139
+ "You need to provide valid file paths to `--ssl-certfile` "
140
+ "and `--ssl-keyfile` to create a secure connection "
141
+ "in Fleet API server (REST, experimental)."
142
+ )
143
+ sys.exit(
144
+ "Certificates are required unless running in insecure mode. "
145
+ "Please provide certificate paths to `--ssl-certfile`, "
146
+ "`--ssl-keyfile`, and `—-ssl-ca-certfile` or run the server "
147
+ "in insecure mode using '--insecure' if you understand the risks."
148
+ )
@@ -21,3 +21,21 @@ import datetime
21
21
  def now() -> datetime.datetime:
22
22
  """Construct a datetime from time.time() with time zone set to UTC."""
23
23
  return datetime.datetime.now(tz=datetime.timezone.utc)
24
+
25
+
26
+ def format_timedelta(td: datetime.timedelta) -> str:
27
+ """Format a timedelta as a string."""
28
+ days = td.days
29
+ hours, remainder = divmod(td.seconds, 3600)
30
+ minutes, seconds = divmod(remainder, 60)
31
+
32
+ if days > 0:
33
+ return f"{days}d {hours:02}:{minutes:02}:{seconds:02}"
34
+ return f"{hours:02}:{minutes:02}:{seconds:02}"
35
+
36
+
37
+ def isoformat8601_utc(dt: datetime.datetime) -> str:
38
+ """Return the datetime formatted as an ISO 8601 string with a trailing 'Z'."""
39
+ if dt.tzinfo != datetime.timezone.utc:
40
+ raise ValueError("Expected datetime with timezone set to UTC")
41
+ return dt.isoformat(timespec="seconds").replace("+00:00", "Z")
@@ -22,7 +22,6 @@ import sys
22
22
  import threading
23
23
  from collections.abc import Sequence
24
24
  from logging import DEBUG, INFO, WARN
25
- from os.path import isfile
26
25
  from pathlib import Path
27
26
  from time import sleep
28
27
  from typing import Optional
@@ -37,6 +36,7 @@ from cryptography.hazmat.primitives.serialization import (
37
36
 
38
37
  from flwr.common import GRPC_MAX_MESSAGE_LENGTH, EventType, event
39
38
  from flwr.common.address import parse_address
39
+ from flwr.common.args import try_obtain_server_certificates
40
40
  from flwr.common.config import get_flwr_dir, parse_config_args
41
41
  from flwr.common.constant import (
42
42
  EXEC_API_DEFAULT_ADDRESS,
@@ -227,7 +227,7 @@ def run_superlink() -> None:
227
227
  simulationio_address, _, _ = _format_address(args.simulationio_api_address)
228
228
 
229
229
  # Obtain certificates
230
- certificates = _try_obtain_certificates(args)
230
+ certificates = try_obtain_server_certificates(args, args.fleet_api_type)
231
231
 
232
232
  # Initialize StateFactory
233
233
  state_factory = LinkStateFactory(args.database)
@@ -540,60 +540,6 @@ def _try_setup_node_authentication(
540
540
  )
541
541
 
542
542
 
543
- def _try_obtain_certificates(
544
- args: argparse.Namespace,
545
- ) -> Optional[tuple[bytes, bytes, bytes]]:
546
- # Obtain certificates
547
- if args.insecure:
548
- log(WARN, "Option `--insecure` was set. Starting insecure HTTP server.")
549
- return None
550
- # Check if certificates are provided
551
- if args.fleet_api_type in [TRANSPORT_TYPE_GRPC_RERE, TRANSPORT_TYPE_GRPC_ADAPTER]:
552
- if args.ssl_certfile and args.ssl_keyfile and args.ssl_ca_certfile:
553
- if not isfile(args.ssl_ca_certfile):
554
- sys.exit("Path argument `--ssl-ca-certfile` does not point to a file.")
555
- if not isfile(args.ssl_certfile):
556
- sys.exit("Path argument `--ssl-certfile` does not point to a file.")
557
- if not isfile(args.ssl_keyfile):
558
- sys.exit("Path argument `--ssl-keyfile` does not point to a file.")
559
- certificates = (
560
- Path(args.ssl_ca_certfile).read_bytes(), # CA certificate
561
- Path(args.ssl_certfile).read_bytes(), # server certificate
562
- Path(args.ssl_keyfile).read_bytes(), # server private key
563
- )
564
- return certificates
565
- if args.ssl_certfile or args.ssl_keyfile or args.ssl_ca_certfile:
566
- sys.exit(
567
- "You need to provide valid file paths to `--ssl-certfile`, "
568
- "`--ssl-keyfile`, and `—-ssl-ca-certfile` to create a secure "
569
- "connection in Fleet API server (gRPC-rere)."
570
- )
571
- if args.fleet_api_type == TRANSPORT_TYPE_REST:
572
- if args.ssl_certfile and args.ssl_keyfile:
573
- if not isfile(args.ssl_certfile):
574
- sys.exit("Path argument `--ssl-certfile` does not point to a file.")
575
- if not isfile(args.ssl_keyfile):
576
- sys.exit("Path argument `--ssl-keyfile` does not point to a file.")
577
- certificates = (
578
- b"",
579
- Path(args.ssl_certfile).read_bytes(), # server certificate
580
- Path(args.ssl_keyfile).read_bytes(), # server private key
581
- )
582
- return certificates
583
- if args.ssl_certfile or args.ssl_keyfile:
584
- sys.exit(
585
- "You need to provide valid file paths to `--ssl-certfile` "
586
- "and `--ssl-keyfile` to create a secure connection "
587
- "in Fleet API server (REST, experimental)."
588
- )
589
- sys.exit(
590
- "Certificates are required unless running in insecure mode. "
591
- "Please provide certificate paths to `--ssl-certfile`, "
592
- "`--ssl-keyfile`, and `—-ssl-ca-certfile` or run the server "
593
- "in insecure mode using '--insecure' if you understand the risks."
594
- )
595
-
596
-
597
543
  def _run_fleet_api_grpc_rere(
598
544
  address: str,
599
545
  state_factory: LinkStateFactory,
@@ -23,7 +23,7 @@ from typing import Optional
23
23
 
24
24
  from flwr.cli.config_utils import get_fab_metadata
25
25
  from flwr.cli.install import install_from_fab
26
- from flwr.common.args import add_args_flwr_app_common, try_obtain_certificates
26
+ from flwr.common.args import add_args_flwr_app_common, try_obtain_root_certificates
27
27
  from flwr.common.config import (
28
28
  get_flwr_dir,
29
29
  get_fused_config_from_dir,
@@ -80,7 +80,7 @@ def flwr_serverapp() -> None:
80
80
  args = parser.parse_args()
81
81
 
82
82
  log(INFO, "Starting Flower ServerApp")
83
- certificates = try_obtain_certificates(args)
83
+ certificates = try_obtain_root_certificates(args, args.superlink)
84
84
 
85
85
  log(
86
86
  DEBUG,
@@ -1255,10 +1255,10 @@ def dict_to_task_res(task_dict: dict[str, Any]) -> TaskRes:
1255
1255
  def determine_run_status(row: dict[str, Any]) -> str:
1256
1256
  """Determine the status of the run based on timestamp fields."""
1257
1257
  if row["pending_at"]:
1258
+ if row["finished_at"]:
1259
+ return Status.FINISHED
1258
1260
  if row["starting_at"]:
1259
1261
  if row["running_at"]:
1260
- if row["finished_at"]:
1261
- return Status.FINISHED
1262
1262
  return Status.RUNNING
1263
1263
  return Status.STARTING
1264
1264
  return Status.PENDING
@@ -34,6 +34,9 @@ VALID_RUN_STATUS_TRANSITIONS = {
34
34
  (Status.PENDING, Status.STARTING),
35
35
  (Status.STARTING, Status.RUNNING),
36
36
  (Status.RUNNING, Status.FINISHED),
37
+ # Any non-FINISHED status can transition to FINISHED
38
+ (Status.PENDING, Status.FINISHED),
39
+ (Status.STARTING, Status.FINISHED),
37
40
  }
38
41
  VALID_RUN_SUB_STATUSES = {
39
42
  SubStatus.COMPLETED,
@@ -170,6 +173,14 @@ def is_valid_transition(current_status: RunStatus, new_status: RunStatus) -> boo
170
173
  bool
171
174
  True if the transition is valid, False otherwise.
172
175
  """
176
+ # Transition to FINISHED from a non-RUNNING status is only allowed
177
+ # if the sub-status is not COMPLETED
178
+ if (
179
+ current_status.status in [Status.PENDING, Status.STARTING]
180
+ and new_status.status == Status.FINISHED
181
+ ):
182
+ return new_status.sub_status != SubStatus.COMPLETED
183
+
173
184
  return (
174
185
  current_status.status,
175
186
  new_status.status,
@@ -16,10 +16,7 @@
16
16
 
17
17
 
18
18
  import argparse
19
- import sys
20
- from logging import DEBUG, ERROR, INFO, WARN
21
- from os.path import isfile
22
- from pathlib import Path
19
+ from logging import DEBUG, ERROR, INFO
23
20
  from queue import Queue
24
21
  from time import sleep
25
22
  from typing import Optional
@@ -27,6 +24,7 @@ from typing import Optional
27
24
  from flwr.cli.config_utils import get_fab_metadata
28
25
  from flwr.cli.install import install_from_fab
29
26
  from flwr.common import EventType
27
+ from flwr.common.args import try_obtain_root_certificates
30
28
  from flwr.common.config import (
31
29
  get_flwr_dir,
32
30
  get_fused_config_from_dir,
@@ -113,7 +111,7 @@ def flwr_simulation() -> None:
113
111
  args = parser.parse_args()
114
112
 
115
113
  log(INFO, "Starting Flower Simulation")
116
- certificates = _try_obtain_certificates(args)
114
+ certificates = try_obtain_root_certificates(args, args.superlink)
117
115
 
118
116
  log(
119
117
  DEBUG,
@@ -132,39 +130,6 @@ def flwr_simulation() -> None:
132
130
  restore_output()
133
131
 
134
132
 
135
- def _try_obtain_certificates(
136
- args: argparse.Namespace,
137
- ) -> Optional[bytes]:
138
-
139
- if args.insecure:
140
- if args.root_certificates is not None:
141
- sys.exit(
142
- "Conflicting options: The '--insecure' flag disables HTTPS, "
143
- "but '--root-certificates' was also specified. Please remove "
144
- "the '--root-certificates' option when running in insecure mode, "
145
- "or omit '--insecure' to use HTTPS."
146
- )
147
- log(
148
- WARN,
149
- "Option `--insecure` was set. Starting insecure HTTP channel to %s.",
150
- args.superlink,
151
- )
152
- root_certificates = None
153
- else:
154
- # Load the certificates if provided, or load the system certificates
155
- if not isfile(args.root_certificates):
156
- sys.exit("Path argument `--root-certificates` does not point to a file.")
157
- root_certificates = Path(args.root_certificates).read_bytes()
158
- log(
159
- DEBUG,
160
- "Starting secure HTTPS channel to %s "
161
- "with the following certificates: %s.",
162
- args.superlink,
163
- args.root_certificates,
164
- )
165
- return root_certificates
166
-
167
-
168
133
  def run_simulation_process( # pylint: disable=R0914, disable=W0212, disable=R0915
169
134
  superlink: str,
170
135
  log_queue: Queue[Optional[str]],
@@ -21,6 +21,7 @@ from typing import Optional
21
21
 
22
22
  from typing_extensions import override
23
23
 
24
+ from flwr.cli.config_utils import get_fab_metadata
24
25
  from flwr.common import ConfigsRecord, Context, RecordSet
25
26
  from flwr.common.constant import SERVERAPPIO_API_DEFAULT_ADDRESS, Status, SubStatus
26
27
  from flwr.common.logger import log
@@ -132,9 +133,10 @@ class DeploymentEngine(Executor):
132
133
  raise RuntimeError(
133
134
  f"FAB ({fab.hash_str}) hash from request doesn't match contents"
134
135
  )
136
+ fab_id, fab_version = get_fab_metadata(fab.content)
135
137
 
136
138
  run_id = self.linkstate.create_run(
137
- None, None, fab_hash, override_config, ConfigsRecord()
139
+ fab_id, fab_version, fab_hash, override_config, ConfigsRecord()
138
140
  )
139
141
  return run_id
140
142