flwr-nightly 1.13.0.dev20241113__tar.gz → 1.13.0.dev20241114__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 (329) hide show
  1. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/PKG-INFO +1 -1
  2. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/pyproject.toml +1 -1
  3. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/cli/app.py +2 -0
  4. flwr_nightly-1.13.0.dev20241114/src/py/flwr/cli/ls.py +228 -0
  5. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/client/app.py +20 -3
  6. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/client/clientapp/app.py +6 -2
  7. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/client/grpc_rere_client/connection.py +2 -12
  8. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/client/rest_client/connection.py +4 -14
  9. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/client/supernode/app.py +27 -1
  10. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/common/serde.py +10 -0
  11. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/common/typing.py +31 -10
  12. flwr_nightly-1.13.0.dev20241114/src/py/flwr/proto/exec_pb2.py +50 -0
  13. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/proto/exec_pb2.pyi +44 -0
  14. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/proto/exec_pb2_grpc.py +34 -0
  15. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/proto/exec_pb2_grpc.pyi +13 -0
  16. flwr_nightly-1.13.0.dev20241114/src/py/flwr/proto/run_pb2.py +64 -0
  17. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/proto/run_pb2.pyi +18 -1
  18. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/driver/grpc_driver.py +2 -12
  19. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +10 -9
  20. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/superlink/linkstate/in_memory_linkstate.py +16 -18
  21. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/superlink/linkstate/sqlite_linkstate.py +9 -0
  22. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/simulation/run_simulation.py +7 -18
  23. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/superexec/exec_servicer.py +31 -2
  24. flwr_nightly-1.13.0.dev20241113/src/py/flwr/proto/exec_pb2.py +0 -41
  25. flwr_nightly-1.13.0.dev20241113/src/py/flwr/proto/run_pb2.py +0 -64
  26. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/LICENSE +0 -0
  27. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/README.md +0 -0
  28. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/__init__.py +0 -0
  29. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/cli/__init__.py +0 -0
  30. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/cli/build.py +0 -0
  31. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/cli/config_utils.py +0 -0
  32. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/cli/example.py +0 -0
  33. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/cli/install.py +0 -0
  34. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/cli/log.py +0 -0
  35. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/cli/new/__init__.py +0 -0
  36. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/cli/new/new.py +0 -0
  37. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/cli/new/templates/__init__.py +0 -0
  38. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/cli/new/templates/app/.gitignore.tpl +0 -0
  39. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/cli/new/templates/app/LICENSE.tpl +0 -0
  40. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/cli/new/templates/app/README.baseline.md.tpl +0 -0
  41. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/cli/new/templates/app/README.flowertune.md.tpl +0 -0
  42. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/cli/new/templates/app/README.md.tpl +0 -0
  43. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/cli/new/templates/app/__init__.py +0 -0
  44. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/cli/new/templates/app/code/__init__.baseline.py.tpl +0 -0
  45. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
  46. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
  47. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/cli/new/templates/app/code/client.baseline.py.tpl +0 -0
  48. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/cli/new/templates/app/code/client.huggingface.py.tpl +0 -0
  49. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/cli/new/templates/app/code/client.jax.py.tpl +0 -0
  50. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/cli/new/templates/app/code/client.mlx.py.tpl +0 -0
  51. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/cli/new/templates/app/code/client.numpy.py.tpl +0 -0
  52. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -0
  53. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl +0 -0
  54. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -0
  55. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/cli/new/templates/app/code/dataset.baseline.py.tpl +0 -0
  56. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/cli/new/templates/app/code/flwr_tune/__init__.py +0 -0
  57. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/cli/new/templates/app/code/flwr_tune/client_app.py.tpl +0 -0
  58. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/cli/new/templates/app/code/flwr_tune/dataset.py.tpl +0 -0
  59. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/cli/new/templates/app/code/flwr_tune/models.py.tpl +0 -0
  60. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/cli/new/templates/app/code/flwr_tune/server_app.py.tpl +0 -0
  61. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/cli/new/templates/app/code/flwr_tune/strategy.py.tpl +0 -0
  62. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/cli/new/templates/app/code/model.baseline.py.tpl +0 -0
  63. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/cli/new/templates/app/code/server.baseline.py.tpl +0 -0
  64. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/cli/new/templates/app/code/server.huggingface.py.tpl +0 -0
  65. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/cli/new/templates/app/code/server.jax.py.tpl +0 -0
  66. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/cli/new/templates/app/code/server.mlx.py.tpl +0 -0
  67. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -0
  68. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -0
  69. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/cli/new/templates/app/code/server.sklearn.py.tpl +0 -0
  70. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -0
  71. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/cli/new/templates/app/code/strategy.baseline.py.tpl +0 -0
  72. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/cli/new/templates/app/code/task.huggingface.py.tpl +0 -0
  73. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/cli/new/templates/app/code/task.jax.py.tpl +0 -0
  74. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/cli/new/templates/app/code/task.mlx.py.tpl +0 -0
  75. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/cli/new/templates/app/code/task.numpy.py.tpl +0 -0
  76. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +0 -0
  77. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/cli/new/templates/app/code/task.sklearn.py.tpl +0 -0
  78. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/cli/new/templates/app/code/task.tensorflow.py.tpl +0 -0
  79. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/cli/new/templates/app/code/utils.baseline.py.tpl +0 -0
  80. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/cli/new/templates/app/pyproject.baseline.toml.tpl +0 -0
  81. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +0 -0
  82. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl +0 -0
  83. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/cli/new/templates/app/pyproject.jax.toml.tpl +0 -0
  84. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +0 -0
  85. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +0 -0
  86. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +0 -0
  87. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +0 -0
  88. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +0 -0
  89. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/cli/run/__init__.py +0 -0
  90. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/cli/run/run.py +0 -0
  91. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/cli/utils.py +0 -0
  92. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/client/__init__.py +0 -0
  93. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/client/client.py +0 -0
  94. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/client/client_app.py +0 -0
  95. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/client/clientapp/__init__.py +0 -0
  96. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/client/clientapp/clientappio_servicer.py +0 -0
  97. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/client/clientapp/utils.py +0 -0
  98. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/client/dpfedavg_numpy_client.py +0 -0
  99. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/client/grpc_adapter_client/__init__.py +0 -0
  100. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/client/grpc_adapter_client/connection.py +0 -0
  101. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/client/grpc_client/__init__.py +0 -0
  102. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/client/grpc_client/connection.py +0 -0
  103. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/client/grpc_rere_client/__init__.py +0 -0
  104. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/client/grpc_rere_client/client_interceptor.py +0 -0
  105. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/client/grpc_rere_client/grpc_adapter.py +0 -0
  106. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/client/heartbeat.py +0 -0
  107. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/client/message_handler/__init__.py +0 -0
  108. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/client/message_handler/message_handler.py +0 -0
  109. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/client/message_handler/task_handler.py +0 -0
  110. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/client/mod/__init__.py +0 -0
  111. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/client/mod/centraldp_mods.py +0 -0
  112. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/client/mod/comms_mods.py +0 -0
  113. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/client/mod/localdp_mod.py +0 -0
  114. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
  115. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
  116. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
  117. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/client/mod/utils.py +0 -0
  118. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/client/nodestate/__init__.py +0 -0
  119. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/client/nodestate/in_memory_nodestate.py +0 -0
  120. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/client/nodestate/nodestate.py +0 -0
  121. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/client/nodestate/nodestate_factory.py +0 -0
  122. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/client/numpy_client.py +0 -0
  123. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/client/rest_client/__init__.py +0 -0
  124. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/client/run_info_store.py +0 -0
  125. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/client/supernode/__init__.py +0 -0
  126. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/client/typing.py +0 -0
  127. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/common/__init__.py +0 -0
  128. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/common/address.py +0 -0
  129. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/common/args.py +0 -0
  130. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/common/config.py +0 -0
  131. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/common/constant.py +0 -0
  132. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/common/context.py +0 -0
  133. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/common/date.py +0 -0
  134. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/common/differential_privacy.py +0 -0
  135. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/common/differential_privacy_constants.py +0 -0
  136. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/common/dp.py +0 -0
  137. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/common/exit_handlers.py +0 -0
  138. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/common/grpc.py +0 -0
  139. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/common/logger.py +0 -0
  140. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/common/message.py +0 -0
  141. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/common/object_ref.py +0 -0
  142. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/common/parameter.py +0 -0
  143. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/common/pyproject.py +0 -0
  144. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/common/record/__init__.py +0 -0
  145. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/common/record/configsrecord.py +0 -0
  146. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/common/record/conversion_utils.py +0 -0
  147. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/common/record/metricsrecord.py +0 -0
  148. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/common/record/parametersrecord.py +0 -0
  149. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/common/record/recordset.py +0 -0
  150. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/common/record/typeddict.py +0 -0
  151. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/common/recordset_compat.py +0 -0
  152. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/common/retry_invoker.py +0 -0
  153. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/common/secure_aggregation/__init__.py +0 -0
  154. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
  155. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
  156. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -0
  157. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
  158. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/common/secure_aggregation/quantization.py +0 -0
  159. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
  160. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
  161. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/common/telemetry.py +0 -0
  162. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/common/version.py +0 -0
  163. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/proto/__init__.py +0 -0
  164. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/proto/clientappio_pb2.py +0 -0
  165. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/proto/clientappio_pb2.pyi +0 -0
  166. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/proto/clientappio_pb2_grpc.py +0 -0
  167. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/proto/clientappio_pb2_grpc.pyi +0 -0
  168. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/proto/common_pb2.py +0 -0
  169. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/proto/common_pb2.pyi +0 -0
  170. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/proto/common_pb2_grpc.py +0 -0
  171. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/proto/common_pb2_grpc.pyi +0 -0
  172. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/proto/control_pb2.py +0 -0
  173. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/proto/control_pb2.pyi +0 -0
  174. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/proto/control_pb2_grpc.py +0 -0
  175. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/proto/control_pb2_grpc.pyi +0 -0
  176. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/proto/error_pb2.py +0 -0
  177. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/proto/error_pb2.pyi +0 -0
  178. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/proto/error_pb2_grpc.py +0 -0
  179. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/proto/error_pb2_grpc.pyi +0 -0
  180. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/proto/fab_pb2.py +0 -0
  181. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/proto/fab_pb2.pyi +0 -0
  182. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/proto/fab_pb2_grpc.py +0 -0
  183. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/proto/fab_pb2_grpc.pyi +0 -0
  184. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/proto/fleet_pb2.py +0 -0
  185. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/proto/fleet_pb2.pyi +0 -0
  186. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/proto/fleet_pb2_grpc.py +0 -0
  187. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
  188. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/proto/grpcadapter_pb2.py +0 -0
  189. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/proto/grpcadapter_pb2.pyi +0 -0
  190. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/proto/grpcadapter_pb2_grpc.py +0 -0
  191. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/proto/grpcadapter_pb2_grpc.pyi +0 -0
  192. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/proto/log_pb2.py +0 -0
  193. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/proto/log_pb2.pyi +0 -0
  194. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/proto/log_pb2_grpc.py +0 -0
  195. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/proto/log_pb2_grpc.pyi +0 -0
  196. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/proto/message_pb2.py +0 -0
  197. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/proto/message_pb2.pyi +0 -0
  198. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/proto/message_pb2_grpc.py +0 -0
  199. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/proto/message_pb2_grpc.pyi +0 -0
  200. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/proto/node_pb2.py +0 -0
  201. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/proto/node_pb2.pyi +0 -0
  202. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/proto/node_pb2_grpc.py +0 -0
  203. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/proto/node_pb2_grpc.pyi +0 -0
  204. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/proto/recordset_pb2.py +0 -0
  205. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/proto/recordset_pb2.pyi +0 -0
  206. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/proto/recordset_pb2_grpc.py +0 -0
  207. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/proto/recordset_pb2_grpc.pyi +0 -0
  208. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/proto/run_pb2_grpc.py +0 -0
  209. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/proto/run_pb2_grpc.pyi +0 -0
  210. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/proto/serverappio_pb2.py +0 -0
  211. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/proto/serverappio_pb2.pyi +0 -0
  212. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/proto/serverappio_pb2_grpc.py +0 -0
  213. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/proto/serverappio_pb2_grpc.pyi +0 -0
  214. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/proto/simulationio_pb2.py +0 -0
  215. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/proto/simulationio_pb2.pyi +0 -0
  216. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/proto/simulationio_pb2_grpc.py +0 -0
  217. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/proto/simulationio_pb2_grpc.pyi +0 -0
  218. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/proto/task_pb2.py +0 -0
  219. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/proto/task_pb2.pyi +0 -0
  220. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/proto/task_pb2_grpc.py +0 -0
  221. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/proto/task_pb2_grpc.pyi +0 -0
  222. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/proto/transport_pb2.py +0 -0
  223. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/proto/transport_pb2.pyi +0 -0
  224. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/proto/transport_pb2_grpc.py +0 -0
  225. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
  226. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/py.typed +0 -0
  227. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/__init__.py +0 -0
  228. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/app.py +0 -0
  229. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/client_manager.py +0 -0
  230. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/client_proxy.py +0 -0
  231. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/compat/__init__.py +0 -0
  232. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/compat/app.py +0 -0
  233. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/compat/app_utils.py +0 -0
  234. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/compat/driver_client_proxy.py +0 -0
  235. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/compat/legacy_context.py +0 -0
  236. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/criterion.py +0 -0
  237. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/driver/__init__.py +0 -0
  238. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/driver/driver.py +0 -0
  239. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/driver/inmemory_driver.py +0 -0
  240. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/history.py +0 -0
  241. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/run_serverapp.py +0 -0
  242. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/server.py +0 -0
  243. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/server_app.py +0 -0
  244. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/server_config.py +0 -0
  245. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/serverapp/__init__.py +0 -0
  246. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/serverapp/app.py +0 -0
  247. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/serverapp_components.py +0 -0
  248. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/strategy/__init__.py +0 -0
  249. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/strategy/aggregate.py +0 -0
  250. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/strategy/bulyan.py +0 -0
  251. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
  252. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
  253. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
  254. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
  255. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
  256. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/strategy/fedadagrad.py +0 -0
  257. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/strategy/fedadam.py +0 -0
  258. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/strategy/fedavg.py +0 -0
  259. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/strategy/fedavg_android.py +0 -0
  260. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/strategy/fedavgm.py +0 -0
  261. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/strategy/fedmedian.py +0 -0
  262. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/strategy/fedopt.py +0 -0
  263. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/strategy/fedprox.py +0 -0
  264. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
  265. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
  266. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
  267. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
  268. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/strategy/fedyogi.py +0 -0
  269. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/strategy/krum.py +0 -0
  270. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/strategy/qfedavg.py +0 -0
  271. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/strategy/strategy.py +0 -0
  272. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/superlink/__init__.py +0 -0
  273. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/superlink/driver/__init__.py +0 -0
  274. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/superlink/driver/serverappio_grpc.py +0 -0
  275. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/superlink/driver/serverappio_servicer.py +0 -0
  276. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/superlink/ffs/__init__.py +0 -0
  277. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/superlink/ffs/disk_ffs.py +0 -0
  278. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/superlink/ffs/ffs.py +0 -0
  279. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/superlink/ffs/ffs_factory.py +0 -0
  280. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/superlink/fleet/__init__.py +0 -0
  281. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/superlink/fleet/grpc_adapter/__init__.py +0 -0
  282. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +0 -0
  283. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
  284. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
  285. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
  286. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
  287. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +0 -0
  288. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
  289. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +0 -0
  290. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +0 -0
  291. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
  292. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/superlink/fleet/message_handler/message_handler.py +0 -0
  293. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
  294. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
  295. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
  296. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
  297. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +0 -0
  298. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/superlink/fleet/vce/vce_api.py +0 -0
  299. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/superlink/linkstate/__init__.py +0 -0
  300. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/superlink/linkstate/linkstate.py +0 -0
  301. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/superlink/linkstate/linkstate_factory.py +0 -0
  302. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/superlink/linkstate/utils.py +0 -0
  303. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/superlink/simulation/__init__.py +0 -0
  304. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/superlink/simulation/simulationio_grpc.py +0 -0
  305. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/superlink/simulation/simulationio_servicer.py +0 -0
  306. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/typing.py +0 -0
  307. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/utils/__init__.py +0 -0
  308. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/utils/tensorboard.py +0 -0
  309. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/utils/validator.py +0 -0
  310. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/workflow/__init__.py +0 -0
  311. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/workflow/constant.py +0 -0
  312. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/workflow/default_workflows.py +0 -0
  313. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
  314. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
  315. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +0 -0
  316. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/simulation/__init__.py +0 -0
  317. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/simulation/app.py +0 -0
  318. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/simulation/legacy_app.py +0 -0
  319. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/simulation/ray_transport/__init__.py +0 -0
  320. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
  321. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
  322. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/simulation/ray_transport/utils.py +0 -0
  323. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/simulation/simulationio_connection.py +0 -0
  324. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/superexec/__init__.py +0 -0
  325. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/superexec/app.py +0 -0
  326. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/superexec/deployment.py +0 -0
  327. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/superexec/exec_grpc.py +0 -0
  328. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/superexec/executor.py +0 -0
  329. {flwr_nightly-1.13.0.dev20241113 → flwr_nightly-1.13.0.dev20241114}/src/py/flwr/superexec/simulation.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: flwr-nightly
3
- Version: 1.13.0.dev20241113
3
+ Version: 1.13.0.dev20241114
4
4
  Summary: Flower: A Friendly Federated Learning Framework
5
5
  Home-page: https://flower.ai
6
6
  License: Apache-2.0
@@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api"
4
4
 
5
5
  [tool.poetry]
6
6
  name = "flwr-nightly"
7
- version = "1.13.0.dev20241113"
7
+ version = "1.13.0.dev20241114"
8
8
  description = "Flower: A Friendly Federated Learning Framework"
9
9
  license = "Apache-2.0"
10
10
  authors = ["The Flower Authors <hello@flower.ai>"]
@@ -20,6 +20,7 @@ from typer.main import get_command
20
20
  from .build import build
21
21
  from .install import install
22
22
  from .log import log
23
+ from .ls import ls
23
24
  from .new import new
24
25
  from .run import run
25
26
 
@@ -37,6 +38,7 @@ app.command()(run)
37
38
  app.command()(build)
38
39
  app.command()(install)
39
40
  app.command()(log)
41
+ app.command()(ls)
40
42
 
41
43
  typer_click_object = get_command(app)
42
44
 
@@ -0,0 +1,228 @@
1
+ # Copyright 2024 Flower Labs GmbH. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ # ==============================================================================
15
+ """Flower command line interface `ls` command."""
16
+
17
+
18
+ from datetime import datetime, timedelta
19
+ from logging import DEBUG
20
+ from pathlib import Path
21
+ from typing import Annotated, Any, Optional
22
+
23
+ import grpc
24
+ import typer
25
+ from rich.console import Console
26
+ from rich.table import Table
27
+ from rich.text import Text
28
+
29
+ from flwr.cli.config_utils import (
30
+ load_and_validate,
31
+ validate_certificate_in_federation_config,
32
+ validate_federation_in_project_config,
33
+ validate_project_config,
34
+ )
35
+ from flwr.common.constant import FAB_CONFIG_FILE, SubStatus
36
+ from flwr.common.date import format_timedelta, isoformat8601_utc
37
+ from flwr.common.grpc import GRPC_MAX_MESSAGE_LENGTH, create_channel
38
+ from flwr.common.logger import log
39
+ from flwr.common.serde import run_from_proto
40
+ from flwr.common.typing import Run
41
+ from flwr.proto.exec_pb2 import ( # pylint: disable=E0611
42
+ ListRunsRequest,
43
+ ListRunsResponse,
44
+ )
45
+ from flwr.proto.exec_pb2_grpc import ExecStub
46
+
47
+
48
+ def ls(
49
+ app: Annotated[
50
+ Path,
51
+ typer.Argument(help="Path of the Flower project"),
52
+ ] = Path("."),
53
+ federation: Annotated[
54
+ Optional[str],
55
+ typer.Argument(help="Name of the federation"),
56
+ ] = None,
57
+ runs: Annotated[
58
+ bool,
59
+ typer.Option(
60
+ "--runs",
61
+ help="List all runs",
62
+ ),
63
+ ] = False,
64
+ run_id: Annotated[
65
+ Optional[int],
66
+ typer.Option(
67
+ "--run-id",
68
+ help="Specific run ID to display",
69
+ ),
70
+ ] = None,
71
+ ) -> None:
72
+ """List runs."""
73
+ # Load and validate federation config
74
+ typer.secho("Loading project configuration... ", fg=typer.colors.BLUE)
75
+
76
+ pyproject_path = app / FAB_CONFIG_FILE if app else None
77
+ config, errors, warnings = load_and_validate(path=pyproject_path)
78
+ config = validate_project_config(config, errors, warnings)
79
+ federation, federation_config = validate_federation_in_project_config(
80
+ federation, config
81
+ )
82
+
83
+ if "address" not in federation_config:
84
+ typer.secho(
85
+ "❌ `flwr log` currently works with Exec API. Ensure that the correct"
86
+ "Exec API address is provided in the `pyproject.toml`.",
87
+ fg=typer.colors.RED,
88
+ bold=True,
89
+ )
90
+ raise typer.Exit(code=1)
91
+
92
+ try:
93
+ if runs and run_id is not None:
94
+ raise ValueError(
95
+ "The options '--runs' and '--run-id' are mutually exclusive."
96
+ )
97
+
98
+ channel = _init_channel(app, federation_config)
99
+ stub = ExecStub(channel)
100
+
101
+ # Display information about a specific run ID
102
+ if run_id is not None:
103
+ typer.echo(f"🔍 Displaying information for run ID {run_id}...")
104
+ _display_one_run(stub, run_id)
105
+ # By default, list all runs
106
+ else:
107
+ typer.echo("📄 Listing all runs...")
108
+ _list_runs(stub)
109
+
110
+ except ValueError as err:
111
+ typer.secho(
112
+ f"❌ {err}",
113
+ fg=typer.colors.RED,
114
+ bold=True,
115
+ )
116
+ raise typer.Exit(code=1) from err
117
+ finally:
118
+ channel.close()
119
+
120
+
121
+ def on_channel_state_change(channel_connectivity: str) -> None:
122
+ """Log channel connectivity."""
123
+ log(DEBUG, channel_connectivity)
124
+
125
+
126
+ def _init_channel(app: Path, federation_config: dict[str, Any]) -> grpc.Channel:
127
+ """Initialize gRPC channel to the Exec API."""
128
+ insecure, root_certificates_bytes = validate_certificate_in_federation_config(
129
+ app, federation_config
130
+ )
131
+ channel = create_channel(
132
+ server_address=federation_config["address"],
133
+ insecure=insecure,
134
+ root_certificates=root_certificates_bytes,
135
+ max_message_length=GRPC_MAX_MESSAGE_LENGTH,
136
+ interceptors=None,
137
+ )
138
+ channel.subscribe(on_channel_state_change)
139
+ return channel
140
+
141
+
142
+ def _format_run_table(run_dict: dict[int, Run], now_isoformat: str) -> Table:
143
+ """Format run status as a rich Table."""
144
+ table = Table(header_style="bold cyan", show_lines=True)
145
+
146
+ def _format_datetime(dt: Optional[datetime]) -> str:
147
+ return isoformat8601_utc(dt).replace("T", " ") if dt else "N/A"
148
+
149
+ # Add columns
150
+ table.add_column(
151
+ Text("Run ID", justify="center"), style="bright_white", overflow="fold"
152
+ )
153
+ table.add_column(Text("FAB", justify="center"), style="dim white")
154
+ table.add_column(Text("Status", justify="center"))
155
+ table.add_column(Text("Elapsed", justify="center"), style="blue")
156
+ table.add_column(Text("Created At", justify="center"), style="dim white")
157
+ table.add_column(Text("Running At", justify="center"), style="dim white")
158
+ table.add_column(Text("Finished At", justify="center"), style="dim white")
159
+
160
+ # Add rows
161
+ for run in sorted(
162
+ run_dict.values(), key=lambda x: datetime.fromisoformat(x.pending_at)
163
+ ):
164
+ # Combine status and sub-status into a single string
165
+ if run.status.sub_status == "":
166
+ status_text = run.status.status
167
+ else:
168
+ status_text = f"{run.status.status}:{run.status.sub_status}"
169
+
170
+ # Style the status based on its value
171
+ sub_status = run.status.sub_status
172
+ if sub_status == SubStatus.COMPLETED:
173
+ status_style = "green"
174
+ elif sub_status == SubStatus.FAILED:
175
+ status_style = "red"
176
+ else:
177
+ status_style = "yellow"
178
+
179
+ # Convert isoformat to datetime
180
+ pending_at = datetime.fromisoformat(run.pending_at) if run.pending_at else None
181
+ running_at = datetime.fromisoformat(run.running_at) if run.running_at else None
182
+ finished_at = (
183
+ datetime.fromisoformat(run.finished_at) if run.finished_at else None
184
+ )
185
+
186
+ # Calculate elapsed time
187
+ elapsed_time = timedelta()
188
+ if running_at:
189
+ if finished_at:
190
+ end_time = finished_at
191
+ else:
192
+ end_time = datetime.fromisoformat(now_isoformat)
193
+ elapsed_time = end_time - running_at
194
+
195
+ table.add_row(
196
+ f"[bold]{run.run_id}[/bold]",
197
+ f"{run.fab_id} (v{run.fab_version})",
198
+ f"[{status_style}]{status_text}[/{status_style}]",
199
+ format_timedelta(elapsed_time),
200
+ _format_datetime(pending_at),
201
+ _format_datetime(running_at),
202
+ _format_datetime(finished_at),
203
+ )
204
+ return table
205
+
206
+
207
+ def _list_runs(
208
+ stub: ExecStub,
209
+ ) -> None:
210
+ """List all runs."""
211
+ res: ListRunsResponse = stub.ListRuns(ListRunsRequest())
212
+ run_dict = {run_id: run_from_proto(proto) for run_id, proto in res.run_dict.items()}
213
+
214
+ Console().print(_format_run_table(run_dict, res.now))
215
+
216
+
217
+ def _display_one_run(
218
+ stub: ExecStub,
219
+ run_id: int,
220
+ ) -> None:
221
+ """Display information about a specific run."""
222
+ res: ListRunsResponse = stub.ListRuns(ListRunsRequest(run_id=run_id))
223
+ if not res.run_dict:
224
+ raise ValueError(f"Run ID {run_id} not found")
225
+
226
+ run_dict = {run_id: run_from_proto(proto) for run_id, proto in res.run_dict.items()}
227
+
228
+ Console().print(_format_run_table(run_dict, res.now))
@@ -217,6 +217,8 @@ def start_client_internal(
217
217
  flwr_path: Optional[Path] = None,
218
218
  isolation: Optional[str] = None,
219
219
  supernode_address: Optional[str] = CLIENTAPPIO_API_DEFAULT_ADDRESS,
220
+ certificates: Optional[tuple[bytes, bytes, bytes]] = None,
221
+ ssl_ca_certfile: Optional[str] = None,
220
222
  ) -> None:
221
223
  """Start a Flower client node which connects to a Flower server.
222
224
 
@@ -278,6 +280,10 @@ def start_client_internal(
278
280
  process and communicates using gRPC at the address `supernode_address`.
279
281
  supernode_address : Optional[str] (default: `CLIENTAPPIO_API_DEFAULT_ADDRESS`)
280
282
  The SuperNode gRPC server address.
283
+ certificates : Optional[Tuple[bytes, bytes, bytes]] (default: None)
284
+ Tuple containing the CA certificate, server certificate, and server private key.
285
+ ssl_ca_certfile : Optional[str] (default: None)
286
+ The path to the CA certificate file used by `flwr-clientapp` in subprocess mode.
281
287
  """
282
288
  if insecure is None:
283
289
  insecure = root_certificates is None
@@ -310,7 +316,8 @@ def start_client_internal(
310
316
  f"{ISOLATION_MODE_SUBPROCESS} or {ISOLATION_MODE_PROCESS}",
311
317
  )
312
318
  _clientappio_grpc_server, clientappio_servicer = run_clientappio_api_grpc(
313
- address=supernode_address
319
+ address=supernode_address,
320
+ certificates=certificates,
314
321
  )
315
322
  supernode_address = cast(str, supernode_address)
316
323
 
@@ -448,7 +455,7 @@ def start_client_internal(
448
455
  runs[run_id] = get_run(run_id)
449
456
  # If get_run is None, i.e., in grpc-bidi mode
450
457
  else:
451
- runs[run_id] = Run(run_id, "", "", "", {})
458
+ runs[run_id] = Run.create_empty(run_id=run_id)
452
459
 
453
460
  run: Run = runs[run_id]
454
461
  if get_fab is not None and run.fab_hash:
@@ -516,6 +523,12 @@ def start_client_internal(
516
523
  "--token",
517
524
  str(token),
518
525
  ]
526
+ if ssl_ca_certfile:
527
+ command.append("--root-certificates")
528
+ command.append(ssl_ca_certfile)
529
+ else:
530
+ command.append("--insecure")
531
+
519
532
  subprocess.run(
520
533
  command,
521
534
  stdout=None,
@@ -783,7 +796,10 @@ class _AppStateTracker:
783
796
  signal.signal(signal.SIGTERM, signal_handler)
784
797
 
785
798
 
786
- def run_clientappio_api_grpc(address: str) -> tuple[grpc.Server, ClientAppIoServicer]:
799
+ def run_clientappio_api_grpc(
800
+ address: str,
801
+ certificates: Optional[tuple[bytes, bytes, bytes]],
802
+ ) -> tuple[grpc.Server, ClientAppIoServicer]:
787
803
  """Run ClientAppIo API gRPC server."""
788
804
  clientappio_servicer: grpc.Server = ClientAppIoServicer()
789
805
  clientappio_add_servicer_to_server_fn = add_ClientAppIoServicer_to_server
@@ -794,6 +810,7 @@ def run_clientappio_api_grpc(address: str) -> tuple[grpc.Server, ClientAppIoServ
794
810
  ),
795
811
  server_address=address,
796
812
  max_message_length=GRPC_MAX_MESSAGE_LENGTH,
813
+ certificates=certificates,
797
814
  )
798
815
  log(INFO, "Starting Flower ClientAppIo gRPC server on %s", address)
799
816
  clientappio_grpc_server.start()
@@ -24,7 +24,7 @@ import grpc
24
24
  from flwr.cli.install import install_from_fab
25
25
  from flwr.client.client_app import ClientApp, LoadClientAppError
26
26
  from flwr.common import Context, Message
27
- from flwr.common.args import add_args_flwr_app_common
27
+ from flwr.common.args import add_args_flwr_app_common, try_obtain_root_certificates
28
28
  from flwr.common.config import get_flwr_dir
29
29
  from flwr.common.constant import ErrorCode
30
30
  from flwr.common.grpc import create_channel
@@ -74,6 +74,7 @@ def flwr_clientapp() -> None:
74
74
  args = parser.parse_args()
75
75
 
76
76
  log(INFO, "Starting Flower ClientApp")
77
+ certificates = try_obtain_root_certificates(args, args.supernode)
77
78
 
78
79
  log(
79
80
  DEBUG,
@@ -87,6 +88,7 @@ def flwr_clientapp() -> None:
87
88
  run_once=(args.token is not None),
88
89
  token=args.token,
89
90
  flwr_dir=args.flwr_dir,
91
+ certificates=certificates,
90
92
  )
91
93
 
92
94
 
@@ -100,11 +102,13 @@ def run_clientapp( # pylint: disable=R0914
100
102
  run_once: bool,
101
103
  token: Optional[int] = None,
102
104
  flwr_dir: Optional[str] = None,
105
+ certificates: Optional[bytes] = None,
103
106
  ) -> None:
104
107
  """Run Flower ClientApp process."""
105
108
  channel = create_channel(
106
109
  server_address=supernode,
107
- insecure=True,
110
+ insecure=(certificates is None),
111
+ root_certificates=certificates,
108
112
  )
109
113
  channel.subscribe(on_channel_state_change)
110
114
 
@@ -41,11 +41,7 @@ from flwr.common.grpc import create_channel
41
41
  from flwr.common.logger import log
42
42
  from flwr.common.message import Message, Metadata
43
43
  from flwr.common.retry_invoker import RetryInvoker
44
- from flwr.common.serde import (
45
- message_from_taskins,
46
- message_to_taskres,
47
- user_config_from_proto,
48
- )
44
+ from flwr.common.serde import message_from_taskins, message_to_taskres, run_from_proto
49
45
  from flwr.common.typing import Fab, Run
50
46
  from flwr.proto.fab_pb2 import GetFabRequest, GetFabResponse # pylint: disable=E0611
51
47
  from flwr.proto.fleet_pb2 import ( # pylint: disable=E0611
@@ -287,13 +283,7 @@ def grpc_request_response( # pylint: disable=R0913,R0914,R0915,R0917
287
283
  )
288
284
 
289
285
  # Return fab_id and fab_version
290
- return Run(
291
- run_id,
292
- get_run_response.run.fab_id,
293
- get_run_response.run.fab_version,
294
- get_run_response.run.fab_hash,
295
- user_config_from_proto(get_run_response.run.override_config),
296
- )
286
+ return run_from_proto(get_run_response.run)
297
287
 
298
288
  def get_fab(fab_hash: str) -> Fab:
299
289
  # Call FleetAPI
@@ -41,11 +41,7 @@ from flwr.common.constant import (
41
41
  from flwr.common.logger import log
42
42
  from flwr.common.message import Message, Metadata
43
43
  from flwr.common.retry_invoker import RetryInvoker
44
- from flwr.common.serde import (
45
- message_from_taskins,
46
- message_to_taskres,
47
- user_config_from_proto,
48
- )
44
+ from flwr.common.serde import message_from_taskins, message_to_taskres, run_from_proto
49
45
  from flwr.common.typing import Fab, Run
50
46
  from flwr.proto.fab_pb2 import GetFabRequest, GetFabResponse # pylint: disable=E0611
51
47
  from flwr.proto.fleet_pb2 import ( # pylint: disable=E0611
@@ -361,15 +357,9 @@ def http_request_response( # pylint: disable=R0913,R0914,R0915,R0917
361
357
  # Send the request
362
358
  res = _request(req, GetRunResponse, PATH_GET_RUN)
363
359
  if res is None:
364
- return Run(run_id, "", "", "", {})
365
-
366
- return Run(
367
- run_id,
368
- res.run.fab_id,
369
- res.run.fab_version,
370
- res.run.fab_hash,
371
- user_config_from_proto(res.run.override_config),
372
- )
360
+ return Run.create_empty(run_id)
361
+
362
+ return run_from_proto(res.run)
373
363
 
374
364
  def get_fab(fab_hash: str) -> Fab:
375
365
  # Construct the request
@@ -28,7 +28,10 @@ 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
+ from flwr.common.args import (
32
+ try_obtain_root_certificates,
33
+ try_obtain_server_certificates,
34
+ )
32
35
  from flwr.common.config import parse_config_args
33
36
  from flwr.common.constant import (
34
37
  FLEET_API_GRPC_RERE_DEFAULT_ADDRESS,
@@ -63,6 +66,8 @@ def run_supernode() -> None:
63
66
  )
64
67
 
65
68
  root_certificates = try_obtain_root_certificates(args, args.superlink)
69
+ # Obtain certificates for ClientAppIo API server
70
+ server_certificates = try_obtain_server_certificates(args, TRANSPORT_TYPE_GRPC_RERE)
66
71
  load_fn = get_load_client_app_fn(
67
72
  default_app_ref="",
68
73
  app_path=args.app,
@@ -88,6 +93,8 @@ def run_supernode() -> None:
88
93
  flwr_path=args.flwr_dir,
89
94
  isolation=args.isolation,
90
95
  supernode_address=args.supernode_address,
96
+ certificates=server_certificates,
97
+ ssl_ca_certfile=args.ssl_ca_certfile,
91
98
  )
92
99
 
93
100
  # Graceful shutdown
@@ -216,6 +223,25 @@ def _parse_args_common(parser: argparse.ArgumentParser) -> None:
216
223
  help="Specifies the path to the PEM-encoded root certificate file for "
217
224
  "establishing secure HTTPS connections.",
218
225
  )
226
+ parser.add_argument(
227
+ "--ssl-certfile",
228
+ help="ClientAppIo API server SSL certificate file (as a path str) "
229
+ "to create a secure connection.",
230
+ type=str,
231
+ default=None,
232
+ )
233
+ parser.add_argument(
234
+ "--ssl-keyfile",
235
+ help="ClientAppIo API server SSL private key file (as a path str) "
236
+ "to create a secure connection.",
237
+ type=str,
238
+ )
239
+ parser.add_argument(
240
+ "--ssl-ca-certfile",
241
+ help="ClientAppIo API server SSL CA certificate file (as a path str) "
242
+ "to create a secure connection.",
243
+ type=str,
244
+ )
219
245
  parser.add_argument(
220
246
  "--server",
221
247
  default=FLEET_API_GRPC_RERE_DEFAULT_ADDRESS,
@@ -872,6 +872,11 @@ def run_to_proto(run: typing.Run) -> ProtoRun:
872
872
  fab_version=run.fab_version,
873
873
  fab_hash=run.fab_hash,
874
874
  override_config=user_config_to_proto(run.override_config),
875
+ pending_at=run.pending_at,
876
+ starting_at=run.starting_at,
877
+ running_at=run.running_at,
878
+ finished_at=run.finished_at,
879
+ status=run_status_to_proto(run.status),
875
880
  )
876
881
  return proto
877
882
 
@@ -884,6 +889,11 @@ def run_from_proto(run_proto: ProtoRun) -> typing.Run:
884
889
  fab_version=run_proto.fab_version,
885
890
  fab_hash=run_proto.fab_hash,
886
891
  override_config=user_config_from_proto(run_proto.override_config),
892
+ pending_at=run_proto.pending_at,
893
+ starting_at=run_proto.starting_at,
894
+ running_at=run_proto.running_at,
895
+ finished_at=run_proto.finished_at,
896
+ status=run_status_from_proto(run_proto.status),
887
897
  )
888
898
  return run
889
899
 
@@ -208,7 +208,16 @@ class ClientMessage:
208
208
 
209
209
 
210
210
  @dataclass
211
- class Run:
211
+ class RunStatus:
212
+ """Run status information."""
213
+
214
+ status: str
215
+ sub_status: str
216
+ details: str
217
+
218
+
219
+ @dataclass
220
+ class Run: # pylint: disable=too-many-instance-attributes
212
221
  """Run details."""
213
222
 
214
223
  run_id: int
@@ -216,15 +225,27 @@ class Run:
216
225
  fab_version: str
217
226
  fab_hash: str
218
227
  override_config: UserConfig
219
-
220
-
221
- @dataclass
222
- class RunStatus:
223
- """Run status information."""
224
-
225
- status: str
226
- sub_status: str
227
- details: str
228
+ pending_at: str
229
+ starting_at: str
230
+ running_at: str
231
+ finished_at: str
232
+ status: RunStatus
233
+
234
+ @classmethod
235
+ def create_empty(cls, run_id: int) -> "Run":
236
+ """Return an empty Run instance."""
237
+ return cls(
238
+ run_id=run_id,
239
+ fab_id="",
240
+ fab_version="",
241
+ fab_hash="",
242
+ override_config={},
243
+ pending_at="",
244
+ starting_at="",
245
+ running_at="",
246
+ finished_at="",
247
+ status=RunStatus(status="", sub_status="", details=""),
248
+ )
228
249
 
229
250
 
230
251
  @dataclass
@@ -0,0 +1,50 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Generated by the protocol buffer compiler. DO NOT EDIT!
3
+ # source: flwr/proto/exec.proto
4
+ # Protobuf Python Version: 4.25.0
5
+ """Generated protocol buffer code."""
6
+ from google.protobuf import descriptor as _descriptor
7
+ from google.protobuf import descriptor_pool as _descriptor_pool
8
+ from google.protobuf import symbol_database as _symbol_database
9
+ from google.protobuf.internal import builder as _builder
10
+ # @@protoc_insertion_point(imports)
11
+
12
+ _sym_db = _symbol_database.Default()
13
+
14
+
15
+ from flwr.proto import fab_pb2 as flwr_dot_proto_dot_fab__pb2
16
+ from flwr.proto import transport_pb2 as flwr_dot_proto_dot_transport__pb2
17
+ from flwr.proto import recordset_pb2 as flwr_dot_proto_dot_recordset__pb2
18
+ from flwr.proto import run_pb2 as flwr_dot_proto_dot_run__pb2
19
+
20
+
21
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x15\x66lwr/proto/exec.proto\x12\nflwr.proto\x1a\x14\x66lwr/proto/fab.proto\x1a\x1a\x66lwr/proto/transport.proto\x1a\x1a\x66lwr/proto/recordset.proto\x1a\x14\x66lwr/proto/run.proto\"\xfb\x01\n\x0fStartRunRequest\x12\x1c\n\x03\x66\x61\x62\x18\x01 \x01(\x0b\x32\x0f.flwr.proto.Fab\x12H\n\x0foverride_config\x18\x02 \x03(\x0b\x32/.flwr.proto.StartRunRequest.OverrideConfigEntry\x12\x35\n\x12\x66\x65\x64\x65ration_options\x18\x03 \x01(\x0b\x32\x19.flwr.proto.ConfigsRecord\x1aI\n\x13OverrideConfigEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12!\n\x05value\x18\x02 \x01(\x0b\x32\x12.flwr.proto.Scalar:\x02\x38\x01\"\"\n\x10StartRunResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\"<\n\x11StreamLogsRequest\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\x12\x17\n\x0f\x61\x66ter_timestamp\x18\x02 \x01(\x01\"B\n\x12StreamLogsResponse\x12\x12\n\nlog_output\x18\x01 \x01(\t\x12\x18\n\x10latest_timestamp\x18\x02 \x01(\x01\"1\n\x0fListRunsRequest\x12\x13\n\x06run_id\x18\x01 \x01(\x04H\x00\x88\x01\x01\x42\t\n\x07_run_id\"\x9d\x01\n\x10ListRunsResponse\x12;\n\x08run_dict\x18\x01 \x03(\x0b\x32).flwr.proto.ListRunsResponse.RunDictEntry\x12\x0b\n\x03now\x18\x02 \x01(\t\x1a?\n\x0cRunDictEntry\x12\x0b\n\x03key\x18\x01 \x01(\x04\x12\x1e\n\x05value\x18\x02 \x01(\x0b\x32\x0f.flwr.proto.Run:\x02\x38\x01\x32\xe9\x01\n\x04\x45xec\x12G\n\x08StartRun\x12\x1b.flwr.proto.StartRunRequest\x1a\x1c.flwr.proto.StartRunResponse\"\x00\x12O\n\nStreamLogs\x12\x1d.flwr.proto.StreamLogsRequest\x1a\x1e.flwr.proto.StreamLogsResponse\"\x00\x30\x01\x12G\n\x08ListRuns\x12\x1b.flwr.proto.ListRunsRequest\x1a\x1c.flwr.proto.ListRunsResponse\"\x00\x62\x06proto3')
22
+
23
+ _globals = globals()
24
+ _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
25
+ _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'flwr.proto.exec_pb2', _globals)
26
+ if _descriptor._USE_C_DESCRIPTORS == False:
27
+ DESCRIPTOR._options = None
28
+ _globals['_STARTRUNREQUEST_OVERRIDECONFIGENTRY']._options = None
29
+ _globals['_STARTRUNREQUEST_OVERRIDECONFIGENTRY']._serialized_options = b'8\001'
30
+ _globals['_LISTRUNSRESPONSE_RUNDICTENTRY']._options = None
31
+ _globals['_LISTRUNSRESPONSE_RUNDICTENTRY']._serialized_options = b'8\001'
32
+ _globals['_STARTRUNREQUEST']._serialized_start=138
33
+ _globals['_STARTRUNREQUEST']._serialized_end=389
34
+ _globals['_STARTRUNREQUEST_OVERRIDECONFIGENTRY']._serialized_start=316
35
+ _globals['_STARTRUNREQUEST_OVERRIDECONFIGENTRY']._serialized_end=389
36
+ _globals['_STARTRUNRESPONSE']._serialized_start=391
37
+ _globals['_STARTRUNRESPONSE']._serialized_end=425
38
+ _globals['_STREAMLOGSREQUEST']._serialized_start=427
39
+ _globals['_STREAMLOGSREQUEST']._serialized_end=487
40
+ _globals['_STREAMLOGSRESPONSE']._serialized_start=489
41
+ _globals['_STREAMLOGSRESPONSE']._serialized_end=555
42
+ _globals['_LISTRUNSREQUEST']._serialized_start=557
43
+ _globals['_LISTRUNSREQUEST']._serialized_end=606
44
+ _globals['_LISTRUNSRESPONSE']._serialized_start=609
45
+ _globals['_LISTRUNSRESPONSE']._serialized_end=766
46
+ _globals['_LISTRUNSRESPONSE_RUNDICTENTRY']._serialized_start=703
47
+ _globals['_LISTRUNSRESPONSE_RUNDICTENTRY']._serialized_end=766
48
+ _globals['_EXEC']._serialized_start=769
49
+ _globals['_EXEC']._serialized_end=1002
50
+ # @@protoc_insertion_point(module_scope)
@@ -5,6 +5,7 @@ isort:skip_file
5
5
  import builtins
6
6
  import flwr.proto.fab_pb2
7
7
  import flwr.proto.recordset_pb2
8
+ import flwr.proto.run_pb2
8
9
  import flwr.proto.transport_pb2
9
10
  import google.protobuf.descriptor
10
11
  import google.protobuf.internal.containers
@@ -88,3 +89,46 @@ class StreamLogsResponse(google.protobuf.message.Message):
88
89
  ) -> None: ...
89
90
  def ClearField(self, field_name: typing_extensions.Literal["latest_timestamp",b"latest_timestamp","log_output",b"log_output"]) -> None: ...
90
91
  global___StreamLogsResponse = StreamLogsResponse
92
+
93
+ class ListRunsRequest(google.protobuf.message.Message):
94
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
95
+ RUN_ID_FIELD_NUMBER: builtins.int
96
+ run_id: builtins.int
97
+ def __init__(self,
98
+ *,
99
+ run_id: typing.Optional[builtins.int] = ...,
100
+ ) -> None: ...
101
+ def HasField(self, field_name: typing_extensions.Literal["_run_id",b"_run_id","run_id",b"run_id"]) -> builtins.bool: ...
102
+ def ClearField(self, field_name: typing_extensions.Literal["_run_id",b"_run_id","run_id",b"run_id"]) -> None: ...
103
+ def WhichOneof(self, oneof_group: typing_extensions.Literal["_run_id",b"_run_id"]) -> typing.Optional[typing_extensions.Literal["run_id"]]: ...
104
+ global___ListRunsRequest = ListRunsRequest
105
+
106
+ class ListRunsResponse(google.protobuf.message.Message):
107
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
108
+ class RunDictEntry(google.protobuf.message.Message):
109
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
110
+ KEY_FIELD_NUMBER: builtins.int
111
+ VALUE_FIELD_NUMBER: builtins.int
112
+ key: builtins.int
113
+ @property
114
+ def value(self) -> flwr.proto.run_pb2.Run: ...
115
+ def __init__(self,
116
+ *,
117
+ key: builtins.int = ...,
118
+ value: typing.Optional[flwr.proto.run_pb2.Run] = ...,
119
+ ) -> None: ...
120
+ def HasField(self, field_name: typing_extensions.Literal["value",b"value"]) -> builtins.bool: ...
121
+ def ClearField(self, field_name: typing_extensions.Literal["key",b"key","value",b"value"]) -> None: ...
122
+
123
+ RUN_DICT_FIELD_NUMBER: builtins.int
124
+ NOW_FIELD_NUMBER: builtins.int
125
+ @property
126
+ def run_dict(self) -> google.protobuf.internal.containers.MessageMap[builtins.int, flwr.proto.run_pb2.Run]: ...
127
+ now: typing.Text
128
+ def __init__(self,
129
+ *,
130
+ run_dict: typing.Optional[typing.Mapping[builtins.int, flwr.proto.run_pb2.Run]] = ...,
131
+ now: typing.Text = ...,
132
+ ) -> None: ...
133
+ def ClearField(self, field_name: typing_extensions.Literal["now",b"now","run_dict",b"run_dict"]) -> None: ...
134
+ global___ListRunsResponse = ListRunsResponse