flwr-nightly 1.13.0.dev20241111__tar.gz → 1.13.0.dev20241117__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 (332) hide show
  1. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/PKG-INFO +6 -4
  2. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/README.md +2 -2
  3. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/pyproject.toml +4 -2
  4. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/app.py +2 -0
  5. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/build.py +37 -0
  6. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/install.py +5 -3
  7. flwr_nightly-1.13.0.dev20241117/src/py/flwr/cli/ls.py +228 -0
  8. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/client/app.py +58 -13
  9. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/client/clientapp/app.py +34 -23
  10. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/client/grpc_rere_client/connection.py +2 -12
  11. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/client/rest_client/connection.py +4 -14
  12. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/client/supernode/app.py +57 -53
  13. flwr_nightly-1.13.0.dev20241117/src/py/flwr/common/args.py +148 -0
  14. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/common/constant.py +21 -6
  15. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/common/date.py +18 -0
  16. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/common/serde.py +10 -0
  17. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/common/typing.py +31 -10
  18. flwr_nightly-1.13.0.dev20241117/src/py/flwr/proto/exec_pb2.py +50 -0
  19. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/exec_pb2.pyi +44 -0
  20. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/exec_pb2_grpc.py +34 -0
  21. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/exec_pb2_grpc.pyi +13 -0
  22. flwr_nightly-1.13.0.dev20241117/src/py/flwr/proto/run_pb2.py +64 -0
  23. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/run_pb2.pyi +18 -1
  24. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/app.py +39 -68
  25. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/driver/grpc_driver.py +4 -14
  26. flwr_nightly-1.13.0.dev20241117/src/py/flwr/server/run_serverapp.py +77 -0
  27. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/serverapp/app.py +34 -23
  28. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +10 -9
  29. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/superlink/linkstate/in_memory_linkstate.py +71 -46
  30. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/superlink/linkstate/linkstate.py +19 -5
  31. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/superlink/linkstate/sqlite_linkstate.py +81 -113
  32. flwr_nightly-1.13.0.dev20241117/src/py/flwr/server/superlink/linkstate/utils.py +389 -0
  33. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/simulation/app.py +6 -41
  34. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/simulation/legacy_app.py +21 -1
  35. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/simulation/run_simulation.py +7 -18
  36. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/simulation/simulationio_connection.py +2 -2
  37. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/superexec/deployment.py +12 -6
  38. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/superexec/exec_servicer.py +31 -2
  39. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/superexec/simulation.py +11 -46
  40. flwr_nightly-1.13.0.dev20241111/src/py/flwr/common/args.py +0 -83
  41. flwr_nightly-1.13.0.dev20241111/src/py/flwr/proto/exec_pb2.py +0 -41
  42. flwr_nightly-1.13.0.dev20241111/src/py/flwr/proto/run_pb2.py +0 -64
  43. flwr_nightly-1.13.0.dev20241111/src/py/flwr/server/run_serverapp.py +0 -307
  44. flwr_nightly-1.13.0.dev20241111/src/py/flwr/server/superlink/linkstate/utils.py +0 -199
  45. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/LICENSE +0 -0
  46. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/__init__.py +0 -0
  47. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/__init__.py +0 -0
  48. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/config_utils.py +0 -0
  49. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/example.py +0 -0
  50. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/log.py +0 -0
  51. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/__init__.py +0 -0
  52. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/new.py +0 -0
  53. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/__init__.py +0 -0
  54. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/.gitignore.tpl +0 -0
  55. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/LICENSE.tpl +0 -0
  56. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/README.baseline.md.tpl +0 -0
  57. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/README.flowertune.md.tpl +0 -0
  58. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/README.md.tpl +0 -0
  59. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/__init__.py +0 -0
  60. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/code/__init__.baseline.py.tpl +0 -0
  61. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
  62. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
  63. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/code/client.baseline.py.tpl +0 -0
  64. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/code/client.huggingface.py.tpl +0 -0
  65. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/code/client.jax.py.tpl +0 -0
  66. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/code/client.mlx.py.tpl +0 -0
  67. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/code/client.numpy.py.tpl +0 -0
  68. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -0
  69. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl +0 -0
  70. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -0
  71. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/code/dataset.baseline.py.tpl +0 -0
  72. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/code/flwr_tune/__init__.py +0 -0
  73. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/code/flwr_tune/client_app.py.tpl +0 -0
  74. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/code/flwr_tune/dataset.py.tpl +0 -0
  75. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/code/flwr_tune/models.py.tpl +0 -0
  76. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/code/flwr_tune/server_app.py.tpl +0 -0
  77. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/code/flwr_tune/strategy.py.tpl +0 -0
  78. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/code/model.baseline.py.tpl +0 -0
  79. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/code/server.baseline.py.tpl +0 -0
  80. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/code/server.huggingface.py.tpl +0 -0
  81. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/code/server.jax.py.tpl +0 -0
  82. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/code/server.mlx.py.tpl +0 -0
  83. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -0
  84. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -0
  85. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/code/server.sklearn.py.tpl +0 -0
  86. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -0
  87. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/code/strategy.baseline.py.tpl +0 -0
  88. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/code/task.huggingface.py.tpl +0 -0
  89. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/code/task.jax.py.tpl +0 -0
  90. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/code/task.mlx.py.tpl +0 -0
  91. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/code/task.numpy.py.tpl +0 -0
  92. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +0 -0
  93. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/code/task.sklearn.py.tpl +0 -0
  94. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/code/task.tensorflow.py.tpl +0 -0
  95. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/code/utils.baseline.py.tpl +0 -0
  96. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/pyproject.baseline.toml.tpl +0 -0
  97. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +0 -0
  98. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl +0 -0
  99. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/pyproject.jax.toml.tpl +0 -0
  100. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +0 -0
  101. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +0 -0
  102. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +0 -0
  103. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +0 -0
  104. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +0 -0
  105. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/run/__init__.py +0 -0
  106. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/run/run.py +0 -0
  107. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/utils.py +0 -0
  108. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/client/__init__.py +0 -0
  109. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/client/client.py +0 -0
  110. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/client/client_app.py +0 -0
  111. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/client/clientapp/__init__.py +0 -0
  112. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/client/clientapp/clientappio_servicer.py +0 -0
  113. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/client/clientapp/utils.py +0 -0
  114. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/client/dpfedavg_numpy_client.py +0 -0
  115. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/client/grpc_adapter_client/__init__.py +0 -0
  116. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/client/grpc_adapter_client/connection.py +0 -0
  117. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/client/grpc_client/__init__.py +0 -0
  118. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/client/grpc_client/connection.py +0 -0
  119. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/client/grpc_rere_client/__init__.py +0 -0
  120. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/client/grpc_rere_client/client_interceptor.py +0 -0
  121. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/client/grpc_rere_client/grpc_adapter.py +0 -0
  122. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/client/heartbeat.py +0 -0
  123. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/client/message_handler/__init__.py +0 -0
  124. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/client/message_handler/message_handler.py +0 -0
  125. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/client/message_handler/task_handler.py +0 -0
  126. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/client/mod/__init__.py +0 -0
  127. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/client/mod/centraldp_mods.py +0 -0
  128. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/client/mod/comms_mods.py +0 -0
  129. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/client/mod/localdp_mod.py +0 -0
  130. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
  131. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
  132. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
  133. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/client/mod/utils.py +0 -0
  134. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/client/nodestate/__init__.py +0 -0
  135. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/client/nodestate/in_memory_nodestate.py +0 -0
  136. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/client/nodestate/nodestate.py +0 -0
  137. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/client/nodestate/nodestate_factory.py +0 -0
  138. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/client/numpy_client.py +0 -0
  139. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/client/rest_client/__init__.py +0 -0
  140. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/client/run_info_store.py +0 -0
  141. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/client/supernode/__init__.py +0 -0
  142. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/client/typing.py +0 -0
  143. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/common/__init__.py +0 -0
  144. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/common/address.py +0 -0
  145. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/common/config.py +0 -0
  146. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/common/context.py +0 -0
  147. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/common/differential_privacy.py +0 -0
  148. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/common/differential_privacy_constants.py +0 -0
  149. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/common/dp.py +0 -0
  150. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/common/exit_handlers.py +0 -0
  151. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/common/grpc.py +0 -0
  152. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/common/logger.py +0 -0
  153. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/common/message.py +0 -0
  154. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/common/object_ref.py +0 -0
  155. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/common/parameter.py +0 -0
  156. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/common/pyproject.py +0 -0
  157. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/common/record/__init__.py +0 -0
  158. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/common/record/configsrecord.py +0 -0
  159. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/common/record/conversion_utils.py +0 -0
  160. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/common/record/metricsrecord.py +0 -0
  161. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/common/record/parametersrecord.py +0 -0
  162. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/common/record/recordset.py +0 -0
  163. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/common/record/typeddict.py +0 -0
  164. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/common/recordset_compat.py +0 -0
  165. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/common/retry_invoker.py +0 -0
  166. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/common/secure_aggregation/__init__.py +0 -0
  167. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
  168. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
  169. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -0
  170. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
  171. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/common/secure_aggregation/quantization.py +0 -0
  172. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
  173. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
  174. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/common/telemetry.py +0 -0
  175. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/common/version.py +0 -0
  176. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/__init__.py +0 -0
  177. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/clientappio_pb2.py +0 -0
  178. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/clientappio_pb2.pyi +0 -0
  179. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/clientappio_pb2_grpc.py +0 -0
  180. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/clientappio_pb2_grpc.pyi +0 -0
  181. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/common_pb2.py +0 -0
  182. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/common_pb2.pyi +0 -0
  183. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/common_pb2_grpc.py +0 -0
  184. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/common_pb2_grpc.pyi +0 -0
  185. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/control_pb2.py +0 -0
  186. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/control_pb2.pyi +0 -0
  187. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/control_pb2_grpc.py +0 -0
  188. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/control_pb2_grpc.pyi +0 -0
  189. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/error_pb2.py +0 -0
  190. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/error_pb2.pyi +0 -0
  191. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/error_pb2_grpc.py +0 -0
  192. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/error_pb2_grpc.pyi +0 -0
  193. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/fab_pb2.py +0 -0
  194. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/fab_pb2.pyi +0 -0
  195. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/fab_pb2_grpc.py +0 -0
  196. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/fab_pb2_grpc.pyi +0 -0
  197. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/fleet_pb2.py +0 -0
  198. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/fleet_pb2.pyi +0 -0
  199. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/fleet_pb2_grpc.py +0 -0
  200. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
  201. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/grpcadapter_pb2.py +0 -0
  202. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/grpcadapter_pb2.pyi +0 -0
  203. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/grpcadapter_pb2_grpc.py +0 -0
  204. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/grpcadapter_pb2_grpc.pyi +0 -0
  205. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/log_pb2.py +0 -0
  206. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/log_pb2.pyi +0 -0
  207. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/log_pb2_grpc.py +0 -0
  208. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/log_pb2_grpc.pyi +0 -0
  209. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/message_pb2.py +0 -0
  210. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/message_pb2.pyi +0 -0
  211. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/message_pb2_grpc.py +0 -0
  212. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/message_pb2_grpc.pyi +0 -0
  213. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/node_pb2.py +0 -0
  214. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/node_pb2.pyi +0 -0
  215. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/node_pb2_grpc.py +0 -0
  216. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/node_pb2_grpc.pyi +0 -0
  217. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/recordset_pb2.py +0 -0
  218. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/recordset_pb2.pyi +0 -0
  219. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/recordset_pb2_grpc.py +0 -0
  220. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/recordset_pb2_grpc.pyi +0 -0
  221. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/run_pb2_grpc.py +0 -0
  222. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/run_pb2_grpc.pyi +0 -0
  223. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/serverappio_pb2.py +0 -0
  224. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/serverappio_pb2.pyi +0 -0
  225. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/serverappio_pb2_grpc.py +0 -0
  226. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/serverappio_pb2_grpc.pyi +0 -0
  227. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/simulationio_pb2.py +0 -0
  228. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/simulationio_pb2.pyi +0 -0
  229. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/simulationio_pb2_grpc.py +0 -0
  230. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/simulationio_pb2_grpc.pyi +0 -0
  231. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/task_pb2.py +0 -0
  232. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/task_pb2.pyi +0 -0
  233. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/task_pb2_grpc.py +0 -0
  234. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/task_pb2_grpc.pyi +0 -0
  235. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/transport_pb2.py +0 -0
  236. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/transport_pb2.pyi +0 -0
  237. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/transport_pb2_grpc.py +0 -0
  238. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
  239. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/py.typed +0 -0
  240. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/__init__.py +0 -0
  241. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/client_manager.py +0 -0
  242. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/client_proxy.py +0 -0
  243. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/compat/__init__.py +0 -0
  244. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/compat/app.py +0 -0
  245. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/compat/app_utils.py +0 -0
  246. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/compat/driver_client_proxy.py +0 -0
  247. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/compat/legacy_context.py +0 -0
  248. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/criterion.py +0 -0
  249. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/driver/__init__.py +0 -0
  250. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/driver/driver.py +0 -0
  251. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/driver/inmemory_driver.py +0 -0
  252. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/history.py +0 -0
  253. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/server.py +0 -0
  254. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/server_app.py +0 -0
  255. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/server_config.py +0 -0
  256. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/serverapp/__init__.py +0 -0
  257. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/serverapp_components.py +0 -0
  258. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/strategy/__init__.py +0 -0
  259. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/strategy/aggregate.py +0 -0
  260. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/strategy/bulyan.py +0 -0
  261. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
  262. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
  263. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
  264. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
  265. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
  266. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/strategy/fedadagrad.py +0 -0
  267. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/strategy/fedadam.py +0 -0
  268. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/strategy/fedavg.py +0 -0
  269. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/strategy/fedavg_android.py +0 -0
  270. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/strategy/fedavgm.py +0 -0
  271. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/strategy/fedmedian.py +0 -0
  272. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/strategy/fedopt.py +0 -0
  273. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/strategy/fedprox.py +0 -0
  274. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
  275. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
  276. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
  277. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
  278. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/strategy/fedyogi.py +0 -0
  279. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/strategy/krum.py +0 -0
  280. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/strategy/qfedavg.py +0 -0
  281. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/strategy/strategy.py +0 -0
  282. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/superlink/__init__.py +0 -0
  283. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/superlink/driver/__init__.py +0 -0
  284. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/superlink/driver/serverappio_grpc.py +0 -0
  285. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/superlink/driver/serverappio_servicer.py +0 -0
  286. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/superlink/ffs/__init__.py +0 -0
  287. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/superlink/ffs/disk_ffs.py +0 -0
  288. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/superlink/ffs/ffs.py +0 -0
  289. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/superlink/ffs/ffs_factory.py +0 -0
  290. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/superlink/fleet/__init__.py +0 -0
  291. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/superlink/fleet/grpc_adapter/__init__.py +0 -0
  292. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +0 -0
  293. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
  294. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
  295. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
  296. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
  297. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +0 -0
  298. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
  299. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +0 -0
  300. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +0 -0
  301. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
  302. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/superlink/fleet/message_handler/message_handler.py +0 -0
  303. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
  304. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
  305. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
  306. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
  307. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +0 -0
  308. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/superlink/fleet/vce/vce_api.py +0 -0
  309. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/superlink/linkstate/__init__.py +0 -0
  310. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/superlink/linkstate/linkstate_factory.py +0 -0
  311. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/superlink/simulation/__init__.py +0 -0
  312. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/superlink/simulation/simulationio_grpc.py +0 -0
  313. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/superlink/simulation/simulationio_servicer.py +0 -0
  314. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/typing.py +0 -0
  315. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/utils/__init__.py +0 -0
  316. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/utils/tensorboard.py +0 -0
  317. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/utils/validator.py +0 -0
  318. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/workflow/__init__.py +0 -0
  319. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/workflow/constant.py +0 -0
  320. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/workflow/default_workflows.py +0 -0
  321. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
  322. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
  323. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +0 -0
  324. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/simulation/__init__.py +0 -0
  325. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/simulation/ray_transport/__init__.py +0 -0
  326. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
  327. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
  328. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/simulation/ray_transport/utils.py +0 -0
  329. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/superexec/__init__.py +0 -0
  330. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/superexec/app.py +0 -0
  331. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/superexec/exec_grpc.py +0 -0
  332. {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/superexec/executor.py +0 -0
@@ -1,7 +1,7 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: flwr-nightly
3
- Version: 1.13.0.dev20241111
4
- Summary: Flower: A Friendly Federated Learning Framework
3
+ Version: 1.13.0.dev20241117
4
+ Summary: Flower: A Friendly Federated AI Framework
5
5
  Home-page: https://flower.ai
6
6
  License: Apache-2.0
7
7
  Keywords: Artificial Intelligence,Federated AI,Federated Analytics,Federated Evaluation,Federated Learning,Flower,Machine Learning
@@ -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)
@@ -41,6 +42,7 @@ Requires-Dist: protobuf (>=4.25.2,<5.0.0)
41
42
  Requires-Dist: pycryptodome (>=3.18.0,<4.0.0)
42
43
  Requires-Dist: ray (==2.10.0) ; (python_version >= "3.9" and python_version < "3.12") and (extra == "simulation")
43
44
  Requires-Dist: requests (>=2.31.0,<3.0.0) ; extra == "rest"
45
+ Requires-Dist: rich (>=13.5.0,<14.0.0)
44
46
  Requires-Dist: starlette (>=0.31.0,<0.32.0) ; extra == "rest"
45
47
  Requires-Dist: tomli (>=2.0.1,<3.0.0)
46
48
  Requires-Dist: tomli-w (>=1.0.0,<2.0.0)
@@ -50,7 +52,7 @@ Project-URL: Documentation, https://flower.ai
50
52
  Project-URL: Repository, https://github.com/adap/flower
51
53
  Description-Content-Type: text/markdown
52
54
 
53
- # Flower: A Friendly Federated Learning Framework
55
+ # Flower: A Friendly Federated AI Framework
54
56
 
55
57
  <p align="center">
56
58
  <a href="https://flower.ai/">
@@ -73,7 +75,7 @@ Description-Content-Type: text/markdown
73
75
  [![Docker Hub](https://img.shields.io/badge/Docker%20Hub-flwr-blue)](https://hub.docker.com/u/flwr)
74
76
  [![Slack](https://img.shields.io/badge/Chat-Slack-red)](https://flower.ai/join-slack)
75
77
 
76
- Flower (`flwr`) is a framework for building federated learning systems. The
78
+ Flower (`flwr`) is a framework for building federated AI systems. The
77
79
  design of Flower is based on a few guiding principles:
78
80
 
79
81
  - **Customizable**: Federated learning systems vary wildly from one use case to
@@ -1,4 +1,4 @@
1
- # Flower: A Friendly Federated Learning Framework
1
+ # Flower: A Friendly Federated AI Framework
2
2
 
3
3
  <p align="center">
4
4
  <a href="https://flower.ai/">
@@ -21,7 +21,7 @@
21
21
  [![Docker Hub](https://img.shields.io/badge/Docker%20Hub-flwr-blue)](https://hub.docker.com/u/flwr)
22
22
  [![Slack](https://img.shields.io/badge/Chat-Slack-red)](https://flower.ai/join-slack)
23
23
 
24
- Flower (`flwr`) is a framework for building federated learning systems. The
24
+ Flower (`flwr`) is a framework for building federated AI systems. The
25
25
  design of Flower is based on a few guiding principles:
26
26
 
27
27
  - **Customizable**: Federated learning systems vary wildly from one use case to
@@ -4,8 +4,8 @@ build-backend = "poetry.core.masonry.api"
4
4
 
5
5
  [tool.poetry]
6
6
  name = "flwr-nightly"
7
- version = "1.13.0.dev20241111"
8
- description = "Flower: A Friendly Federated Learning Framework"
7
+ version = "1.13.0.dev20241117"
8
+ description = "Flower: A Friendly Federated AI Framework"
9
9
  license = "Apache-2.0"
10
10
  authors = ["The Flower Authors <hello@flower.ai>"]
11
11
  readme = "README.md"
@@ -77,6 +77,8 @@ 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"
81
+ rich = "^13.5.0"
80
82
  # Optional dependencies (Simulation Engine)
81
83
  ray = { version = "==2.10.0", optional = true, python = ">=3.9,<3.12" }
82
84
  # Optional dependencies (REST transport layer)
@@ -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
 
@@ -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
  )
@@ -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))
@@ -37,11 +37,13 @@ from flwr.client.typing import ClientFnExt
37
37
  from flwr.common import GRPC_MAX_MESSAGE_LENGTH, Context, EventType, Message, event
38
38
  from flwr.common.address import parse_address
39
39
  from flwr.common.constant import (
40
- CLIENTAPPIO_API_DEFAULT_ADDRESS,
40
+ CLIENT_OCTET,
41
+ CLIENTAPPIO_API_DEFAULT_SERVER_ADDRESS,
41
42
  ISOLATION_MODE_PROCESS,
42
43
  ISOLATION_MODE_SUBPROCESS,
43
44
  MISSING_EXTRA_REST,
44
45
  RUN_ID_NUM_BYTES,
46
+ SERVER_OCTET,
45
47
  TRANSPORT_TYPE_GRPC_ADAPTER,
46
48
  TRANSPORT_TYPE_GRPC_BIDI,
47
49
  TRANSPORT_TYPE_GRPC_RERE,
@@ -102,6 +104,11 @@ def start_client(
102
104
  ) -> None:
103
105
  """Start a Flower client node which connects to a Flower server.
104
106
 
107
+ Warning
108
+ -------
109
+ This function is deprecated since 1.13.0. Use :code:`flower-supernode` command
110
+ instead to start a SuperNode.
111
+
105
112
  Parameters
106
113
  ----------
107
114
  server_address : str
@@ -176,6 +183,17 @@ def start_client(
176
183
  >>> root_certificates=Path("/crts/root.pem").read_bytes(),
177
184
  >>> )
178
185
  """
186
+ msg = (
187
+ "flwr.client.start_client() is deprecated."
188
+ "\n\tInstead, use the `flower-supernode` CLI command to start a SuperNode "
189
+ "as shown below:"
190
+ "\n\n\t\t$ flower-supernode --insecure --superlink='<IP>:<PORT>'"
191
+ "\n\n\tTo view all available options, run:"
192
+ "\n\n\t\t$ flower-supernode --help"
193
+ "\n\n\tUsing `start_client()` is deprecated."
194
+ )
195
+ warn_deprecated_feature(name=msg)
196
+
179
197
  event(EventType.START_CLIENT_ENTER)
180
198
  start_client_internal(
181
199
  server_address=server_address,
@@ -216,7 +234,9 @@ def start_client_internal(
216
234
  max_wait_time: Optional[float] = None,
217
235
  flwr_path: Optional[Path] = None,
218
236
  isolation: Optional[str] = None,
219
- supernode_address: Optional[str] = CLIENTAPPIO_API_DEFAULT_ADDRESS,
237
+ clientappio_api_address: Optional[str] = CLIENTAPPIO_API_DEFAULT_SERVER_ADDRESS,
238
+ certificates: Optional[tuple[bytes, bytes, bytes]] = None,
239
+ ssl_ca_certfile: Optional[str] = None,
220
240
  ) -> None:
221
241
  """Start a Flower client node which connects to a Flower server.
222
242
 
@@ -274,10 +294,16 @@ def start_client_internal(
274
294
  `process`. Defaults to `None`, which runs the `ClientApp` in the same process
275
295
  as the SuperNode. If `subprocess`, the `ClientApp` runs in a subprocess started
276
296
  by the SueprNode and communicates using gRPC at the address
277
- `supernode_address`. If `process`, the `ClientApp` runs in a separate isolated
278
- process and communicates using gRPC at the address `supernode_address`.
279
- supernode_address : Optional[str] (default: `CLIENTAPPIO_API_DEFAULT_ADDRESS`)
297
+ `clientappio_api_address`. If `process`, the `ClientApp` runs in a separate
298
+ isolated process and communicates using gRPC at the address
299
+ `clientappio_api_address`.
300
+ clientappio_api_address : Optional[str]
301
+ (default: `CLIENTAPPIO_API_DEFAULT_SERVER_ADDRESS`)
280
302
  The SuperNode gRPC server address.
303
+ certificates : Optional[Tuple[bytes, bytes, bytes]] (default: None)
304
+ Tuple containing the CA certificate, server certificate, and server private key.
305
+ ssl_ca_certfile : Optional[str] (default: None)
306
+ The path to the CA certificate file used by `flwr-clientapp` in subprocess mode.
281
307
  """
282
308
  if insecure is None:
283
309
  insecure = root_certificates is None
@@ -304,15 +330,16 @@ def start_client_internal(
304
330
  load_client_app_fn = _load_client_app
305
331
 
306
332
  if isolation:
307
- if supernode_address is None:
333
+ if clientappio_api_address is None:
308
334
  raise ValueError(
309
- f"`supernode_address` required when `isolation` is "
335
+ f"`clientappio_api_address` required when `isolation` is "
310
336
  f"{ISOLATION_MODE_SUBPROCESS} or {ISOLATION_MODE_PROCESS}",
311
337
  )
312
338
  _clientappio_grpc_server, clientappio_servicer = run_clientappio_api_grpc(
313
- address=supernode_address
339
+ address=clientappio_api_address,
340
+ certificates=certificates,
314
341
  )
315
- supernode_address = cast(str, supernode_address)
342
+ clientappio_api_address = cast(str, clientappio_api_address)
316
343
 
317
344
  # At this point, only `load_client_app_fn` should be used
318
345
  # Both `client` and `client_fn` must not be used directly
@@ -448,7 +475,7 @@ def start_client_internal(
448
475
  runs[run_id] = get_run(run_id)
449
476
  # If get_run is None, i.e., in grpc-bidi mode
450
477
  else:
451
- runs[run_id] = Run(run_id, "", "", "", {})
478
+ runs[run_id] = Run.create_empty(run_id=run_id)
452
479
 
453
480
  run: Run = runs[run_id]
454
481
  if get_fab is not None and run.fab_hash:
@@ -508,14 +535,28 @@ def start_client_internal(
508
535
  )
509
536
 
510
537
  if start_subprocess:
538
+ _octet, _colon, _port = (
539
+ clientappio_api_address.rpartition(":")
540
+ )
541
+ io_address = (
542
+ f"{CLIENT_OCTET}:{_port}"
543
+ if _octet == SERVER_OCTET
544
+ else clientappio_api_address
545
+ )
511
546
  # Start ClientApp subprocess
512
547
  command = [
513
548
  "flwr-clientapp",
514
- "--supernode",
515
- supernode_address,
549
+ "--clientappio-api-address",
550
+ io_address,
516
551
  "--token",
517
552
  str(token),
518
553
  ]
554
+ if ssl_ca_certfile:
555
+ command.append("--root-certificates")
556
+ command.append(ssl_ca_certfile)
557
+ else:
558
+ command.append("--insecure")
559
+
519
560
  subprocess.run(
520
561
  command,
521
562
  stdout=None,
@@ -783,7 +824,10 @@ class _AppStateTracker:
783
824
  signal.signal(signal.SIGTERM, signal_handler)
784
825
 
785
826
 
786
- def run_clientappio_api_grpc(address: str) -> tuple[grpc.Server, ClientAppIoServicer]:
827
+ def run_clientappio_api_grpc(
828
+ address: str,
829
+ certificates: Optional[tuple[bytes, bytes, bytes]],
830
+ ) -> tuple[grpc.Server, ClientAppIoServicer]:
787
831
  """Run ClientAppIo API gRPC server."""
788
832
  clientappio_servicer: grpc.Server = ClientAppIoServicer()
789
833
  clientappio_add_servicer_to_server_fn = add_ClientAppIoServicer_to_server
@@ -794,6 +838,7 @@ def run_clientappio_api_grpc(address: str) -> tuple[grpc.Server, ClientAppIoServ
794
838
  ),
795
839
  server_address=address,
796
840
  max_message_length=GRPC_MAX_MESSAGE_LENGTH,
841
+ certificates=certificates,
797
842
  )
798
843
  log(INFO, "Starting Flower ClientAppIo gRPC server on %s", address)
799
844
  clientappio_grpc_server.start()
@@ -24,9 +24,9 @@ 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
- from flwr.common.constant import ErrorCode
29
+ from flwr.common.constant import CLIENTAPPIO_API_DEFAULT_CLIENT_ADDRESS, ErrorCode
30
30
  from flwr.common.grpc import create_channel
31
31
  from flwr.common.logger import log
32
32
  from flwr.common.message import Error
@@ -56,37 +56,24 @@ from .utils import get_load_client_app_fn
56
56
 
57
57
  def flwr_clientapp() -> None:
58
58
  """Run process-isolated Flower ClientApp."""
59
- parser = argparse.ArgumentParser(
60
- description="Run a Flower ClientApp",
61
- )
62
- parser.add_argument(
63
- "--supernode",
64
- type=str,
65
- help="Address of SuperNode's ClientAppIo API",
66
- )
67
- parser.add_argument(
68
- "--token",
69
- type=int,
70
- required=False,
71
- help="Unique token generated by SuperNode for each ClientApp execution",
72
- )
73
- add_args_flwr_app_common(parser=parser)
74
- args = parser.parse_args()
59
+ args = _parse_args_run_flwr_clientapp().parse_args()
75
60
 
76
61
  log(INFO, "Starting Flower ClientApp")
62
+ certificates = try_obtain_root_certificates(args, args.clientappio_api_address)
77
63
 
78
64
  log(
79
65
  DEBUG,
80
66
  "Starting isolated `ClientApp` connected to SuperNode's ClientAppIo API at %s "
81
67
  "with token %s",
82
- args.supernode,
68
+ args.clientappio_api_address,
83
69
  args.token,
84
70
  )
85
71
  run_clientapp(
86
- supernode=args.supernode,
72
+ clientappio_api_address=args.clientappio_api_address,
87
73
  run_once=(args.token is not None),
88
74
  token=args.token,
89
75
  flwr_dir=args.flwr_dir,
76
+ certificates=certificates,
90
77
  )
91
78
 
92
79
 
@@ -96,15 +83,17 @@ def on_channel_state_change(channel_connectivity: str) -> None:
96
83
 
97
84
 
98
85
  def run_clientapp( # pylint: disable=R0914
99
- supernode: str,
86
+ clientappio_api_address: str,
100
87
  run_once: bool,
101
88
  token: Optional[int] = None,
102
89
  flwr_dir: Optional[str] = None,
90
+ certificates: Optional[bytes] = None,
103
91
  ) -> None:
104
92
  """Run Flower ClientApp process."""
105
93
  channel = create_channel(
106
- server_address=supernode,
107
- insecure=True,
94
+ server_address=clientappio_api_address,
95
+ insecure=(certificates is None),
96
+ root_certificates=certificates,
108
97
  )
109
98
  channel.subscribe(on_channel_state_change)
110
99
 
@@ -237,3 +226,25 @@ def push_message(
237
226
  except grpc.RpcError as e:
238
227
  log(ERROR, "[PushClientAppOutputs] gRPC error occurred: %s", str(e))
239
228
  raise e
229
+
230
+
231
+ def _parse_args_run_flwr_clientapp() -> argparse.ArgumentParser:
232
+ """Parse flwr-clientapp command line arguments."""
233
+ parser = argparse.ArgumentParser(
234
+ description="Run a Flower ClientApp",
235
+ )
236
+ parser.add_argument(
237
+ "--clientappio-api-address",
238
+ default=CLIENTAPPIO_API_DEFAULT_CLIENT_ADDRESS,
239
+ type=str,
240
+ help="Address of SuperNode's ClientAppIo API (IPv4, IPv6, or a domain name)."
241
+ f"By default, it is set to {CLIENTAPPIO_API_DEFAULT_CLIENT_ADDRESS}.",
242
+ )
243
+ parser.add_argument(
244
+ "--token",
245
+ type=int,
246
+ required=False,
247
+ help="Unique token generated by SuperNode for each ClientApp execution",
248
+ )
249
+ add_args_flwr_app_common(parser=parser)
250
+ return parser