flwr-nightly 1.17.0.dev20250317__tar.gz → 1.17.0.dev20250319__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (333) hide show
  1. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/PKG-INFO +1 -1
  2. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/pyproject.toml +1 -1
  3. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/common/constant.py +5 -0
  4. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/common/logger.py +2 -2
  5. flwr_nightly-1.17.0.dev20250319/src/py/flwr/common/record/parametersrecord.py +583 -0
  6. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/__init__.py +3 -1
  7. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/app.py +1 -1
  8. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/compat/__init__.py +2 -2
  9. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/compat/app.py +11 -11
  10. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/compat/app_utils.py +16 -16
  11. flwr_nightly-1.17.0.dev20250317/src/py/flwr/server/compat/driver_client_proxy.py → flwr_nightly-1.17.0.dev20250319/src/py/flwr/server/compat/grid_client_proxy.py +9 -9
  12. {flwr_nightly-1.17.0.dev20250317/src/py/flwr/server/driver → flwr_nightly-1.17.0.dev20250319/src/py/flwr/server/grid}/__init__.py +8 -7
  13. flwr_nightly-1.17.0.dev20250317/src/py/flwr/server/driver/driver.py → flwr_nightly-1.17.0.dev20250319/src/py/flwr/server/grid/grid.py +44 -15
  14. flwr_nightly-1.17.0.dev20250317/src/py/flwr/server/driver/grpc_driver.py → flwr_nightly-1.17.0.dev20250319/src/py/flwr/server/grid/grpc_grid.py +12 -20
  15. flwr_nightly-1.17.0.dev20250317/src/py/flwr/server/driver/inmemory_driver.py → flwr_nightly-1.17.0.dev20250319/src/py/flwr/server/grid/inmemory_grid.py +6 -14
  16. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/run_serverapp.py +4 -4
  17. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/server_app.py +38 -12
  18. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/serverapp/app.py +10 -10
  19. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/superlink/linkstate/in_memory_linkstate.py +28 -3
  20. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/superlink/linkstate/sqlite_linkstate.py +40 -2
  21. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/superlink/linkstate/utils.py +67 -10
  22. {flwr_nightly-1.17.0.dev20250317/src/py/flwr/server/superlink/driver → flwr_nightly-1.17.0.dev20250319/src/py/flwr/server/superlink/serverappio}/__init__.py +1 -1
  23. {flwr_nightly-1.17.0.dev20250317/src/py/flwr/server/superlink/driver → flwr_nightly-1.17.0.dev20250319/src/py/flwr/server/superlink/serverappio}/serverappio_grpc.py +1 -1
  24. {flwr_nightly-1.17.0.dev20250317/src/py/flwr/server/superlink/driver → flwr_nightly-1.17.0.dev20250319/src/py/flwr/server/superlink/serverappio}/serverappio_servicer.py +1 -1
  25. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/typing.py +3 -3
  26. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/workflow/default_workflows.py +17 -19
  27. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +15 -15
  28. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/simulation/run_simulation.py +10 -10
  29. flwr_nightly-1.17.0.dev20250317/src/py/flwr/common/record/parametersrecord.py +0 -339
  30. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/LICENSE +0 -0
  31. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/README.md +0 -0
  32. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/__init__.py +0 -0
  33. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/__init__.py +0 -0
  34. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/app.py +0 -0
  35. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/auth_plugin/__init__.py +0 -0
  36. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/auth_plugin/oidc_cli_plugin.py +0 -0
  37. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/build.py +0 -0
  38. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/cli_user_auth_interceptor.py +0 -0
  39. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/config_utils.py +0 -0
  40. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/constant.py +0 -0
  41. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/example.py +0 -0
  42. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/install.py +0 -0
  43. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/log.py +0 -0
  44. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/login/__init__.py +0 -0
  45. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/login/login.py +0 -0
  46. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/ls.py +0 -0
  47. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/__init__.py +0 -0
  48. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/new.py +0 -0
  49. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/__init__.py +0 -0
  50. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/.gitignore.tpl +0 -0
  51. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/LICENSE.tpl +0 -0
  52. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/README.baseline.md.tpl +0 -0
  53. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/README.flowertune.md.tpl +0 -0
  54. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/README.md.tpl +0 -0
  55. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/__init__.py +0 -0
  56. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/code/__init__.baseline.py.tpl +0 -0
  57. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
  58. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
  59. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/code/client.baseline.py.tpl +0 -0
  60. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/code/client.huggingface.py.tpl +0 -0
  61. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/code/client.jax.py.tpl +0 -0
  62. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/code/client.mlx.py.tpl +0 -0
  63. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/code/client.numpy.py.tpl +0 -0
  64. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -0
  65. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl +0 -0
  66. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -0
  67. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/code/dataset.baseline.py.tpl +0 -0
  68. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/code/flwr_tune/__init__.py +0 -0
  69. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/code/flwr_tune/client_app.py.tpl +0 -0
  70. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/code/flwr_tune/dataset.py.tpl +0 -0
  71. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/code/flwr_tune/models.py.tpl +0 -0
  72. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/code/flwr_tune/server_app.py.tpl +0 -0
  73. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/code/flwr_tune/strategy.py.tpl +0 -0
  74. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/code/model.baseline.py.tpl +0 -0
  75. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/code/server.baseline.py.tpl +0 -0
  76. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/code/server.huggingface.py.tpl +0 -0
  77. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/code/server.jax.py.tpl +0 -0
  78. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/code/server.mlx.py.tpl +0 -0
  79. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -0
  80. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -0
  81. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/code/server.sklearn.py.tpl +0 -0
  82. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -0
  83. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/code/strategy.baseline.py.tpl +0 -0
  84. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/code/task.huggingface.py.tpl +0 -0
  85. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/code/task.jax.py.tpl +0 -0
  86. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/code/task.mlx.py.tpl +0 -0
  87. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/code/task.numpy.py.tpl +0 -0
  88. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +0 -0
  89. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/code/task.sklearn.py.tpl +0 -0
  90. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/code/task.tensorflow.py.tpl +0 -0
  91. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/code/utils.baseline.py.tpl +0 -0
  92. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/pyproject.baseline.toml.tpl +0 -0
  93. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +0 -0
  94. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl +0 -0
  95. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/pyproject.jax.toml.tpl +0 -0
  96. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +0 -0
  97. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +0 -0
  98. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +0 -0
  99. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +0 -0
  100. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +0 -0
  101. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/run/__init__.py +0 -0
  102. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/run/run.py +0 -0
  103. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/stop.py +0 -0
  104. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/utils.py +0 -0
  105. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/client/__init__.py +0 -0
  106. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/client/app.py +0 -0
  107. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/client/client.py +0 -0
  108. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/client/client_app.py +0 -0
  109. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/client/clientapp/__init__.py +0 -0
  110. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/client/clientapp/app.py +0 -0
  111. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/client/clientapp/clientappio_servicer.py +0 -0
  112. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/client/clientapp/utils.py +0 -0
  113. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/client/dpfedavg_numpy_client.py +0 -0
  114. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/client/grpc_adapter_client/__init__.py +0 -0
  115. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/client/grpc_adapter_client/connection.py +0 -0
  116. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/client/grpc_client/__init__.py +0 -0
  117. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/client/grpc_client/connection.py +0 -0
  118. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/client/grpc_rere_client/__init__.py +0 -0
  119. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/client/grpc_rere_client/client_interceptor.py +0 -0
  120. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/client/grpc_rere_client/connection.py +0 -0
  121. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/client/grpc_rere_client/grpc_adapter.py +0 -0
  122. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/client/heartbeat.py +0 -0
  123. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/client/message_handler/__init__.py +0 -0
  124. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/client/message_handler/message_handler.py +0 -0
  125. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/client/mod/__init__.py +0 -0
  126. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/client/mod/centraldp_mods.py +0 -0
  127. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/client/mod/comms_mods.py +0 -0
  128. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/client/mod/localdp_mod.py +0 -0
  129. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
  130. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
  131. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
  132. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/client/mod/utils.py +0 -0
  133. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/client/nodestate/__init__.py +0 -0
  134. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/client/nodestate/in_memory_nodestate.py +0 -0
  135. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/client/nodestate/nodestate.py +0 -0
  136. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/client/nodestate/nodestate_factory.py +0 -0
  137. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/client/numpy_client.py +0 -0
  138. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/client/rest_client/__init__.py +0 -0
  139. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/client/rest_client/connection.py +0 -0
  140. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/client/run_info_store.py +0 -0
  141. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/client/supernode/__init__.py +0 -0
  142. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/client/supernode/app.py +0 -0
  143. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/client/typing.py +0 -0
  144. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/common/__init__.py +0 -0
  145. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/common/address.py +0 -0
  146. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/common/args.py +0 -0
  147. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/common/auth_plugin/__init__.py +0 -0
  148. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/common/auth_plugin/auth_plugin.py +0 -0
  149. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/common/config.py +0 -0
  150. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/common/context.py +0 -0
  151. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/common/date.py +0 -0
  152. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/common/differential_privacy.py +0 -0
  153. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/common/differential_privacy_constants.py +0 -0
  154. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/common/dp.py +0 -0
  155. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/common/event_log_plugin/__init__.py +0 -0
  156. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/common/event_log_plugin/event_log_plugin.py +0 -0
  157. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/common/exit/__init__.py +0 -0
  158. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/common/exit/exit.py +0 -0
  159. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/common/exit/exit_code.py +0 -0
  160. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/common/exit_handlers.py +0 -0
  161. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/common/grpc.py +0 -0
  162. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/common/message.py +0 -0
  163. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/common/object_ref.py +0 -0
  164. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/common/parameter.py +0 -0
  165. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/common/pyproject.py +0 -0
  166. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/common/record/__init__.py +0 -0
  167. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/common/record/configsrecord.py +0 -0
  168. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/common/record/conversion_utils.py +0 -0
  169. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/common/record/metricsrecord.py +0 -0
  170. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/common/record/recordset.py +0 -0
  171. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/common/record/typeddict.py +0 -0
  172. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/common/recordset_compat.py +0 -0
  173. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/common/retry_invoker.py +0 -0
  174. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/common/secure_aggregation/__init__.py +0 -0
  175. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
  176. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
  177. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -0
  178. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
  179. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/common/secure_aggregation/quantization.py +0 -0
  180. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
  181. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
  182. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/common/serde.py +0 -0
  183. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/common/telemetry.py +0 -0
  184. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/common/typing.py +0 -0
  185. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/common/version.py +0 -0
  186. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/__init__.py +0 -0
  187. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/clientappio_pb2.py +0 -0
  188. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/clientappio_pb2.pyi +0 -0
  189. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/clientappio_pb2_grpc.py +0 -0
  190. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/clientappio_pb2_grpc.pyi +0 -0
  191. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/error_pb2.py +0 -0
  192. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/error_pb2.pyi +0 -0
  193. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/error_pb2_grpc.py +0 -0
  194. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/error_pb2_grpc.pyi +0 -0
  195. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/exec_pb2.py +0 -0
  196. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/exec_pb2.pyi +0 -0
  197. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/exec_pb2_grpc.py +0 -0
  198. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/exec_pb2_grpc.pyi +0 -0
  199. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/fab_pb2.py +0 -0
  200. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/fab_pb2.pyi +0 -0
  201. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/fab_pb2_grpc.py +0 -0
  202. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/fab_pb2_grpc.pyi +0 -0
  203. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/fleet_pb2.py +0 -0
  204. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/fleet_pb2.pyi +0 -0
  205. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/fleet_pb2_grpc.py +0 -0
  206. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
  207. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/grpcadapter_pb2.py +0 -0
  208. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/grpcadapter_pb2.pyi +0 -0
  209. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/grpcadapter_pb2_grpc.py +0 -0
  210. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/grpcadapter_pb2_grpc.pyi +0 -0
  211. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/log_pb2.py +0 -0
  212. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/log_pb2.pyi +0 -0
  213. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/log_pb2_grpc.py +0 -0
  214. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/log_pb2_grpc.pyi +0 -0
  215. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/message_pb2.py +0 -0
  216. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/message_pb2.pyi +0 -0
  217. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/message_pb2_grpc.py +0 -0
  218. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/message_pb2_grpc.pyi +0 -0
  219. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/node_pb2.py +0 -0
  220. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/node_pb2.pyi +0 -0
  221. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/node_pb2_grpc.py +0 -0
  222. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/node_pb2_grpc.pyi +0 -0
  223. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/recordset_pb2.py +0 -0
  224. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/recordset_pb2.pyi +0 -0
  225. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/recordset_pb2_grpc.py +0 -0
  226. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/recordset_pb2_grpc.pyi +0 -0
  227. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/run_pb2.py +0 -0
  228. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/run_pb2.pyi +0 -0
  229. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/run_pb2_grpc.py +0 -0
  230. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/run_pb2_grpc.pyi +0 -0
  231. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/serverappio_pb2.py +0 -0
  232. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/serverappio_pb2.pyi +0 -0
  233. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/serverappio_pb2_grpc.py +0 -0
  234. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/serverappio_pb2_grpc.pyi +0 -0
  235. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/simulationio_pb2.py +0 -0
  236. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/simulationio_pb2.pyi +0 -0
  237. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/simulationio_pb2_grpc.py +0 -0
  238. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/simulationio_pb2_grpc.pyi +0 -0
  239. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/transport_pb2.py +0 -0
  240. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/transport_pb2.pyi +0 -0
  241. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/transport_pb2_grpc.py +0 -0
  242. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
  243. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/py.typed +0 -0
  244. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/client_manager.py +0 -0
  245. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/client_proxy.py +0 -0
  246. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/compat/legacy_context.py +0 -0
  247. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/criterion.py +0 -0
  248. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/fleet_event_log_interceptor.py +0 -0
  249. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/history.py +0 -0
  250. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/server.py +0 -0
  251. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/server_config.py +0 -0
  252. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/serverapp/__init__.py +0 -0
  253. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/serverapp_components.py +0 -0
  254. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/strategy/__init__.py +0 -0
  255. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/strategy/aggregate.py +0 -0
  256. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/strategy/bulyan.py +0 -0
  257. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
  258. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
  259. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
  260. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
  261. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
  262. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/strategy/fedadagrad.py +0 -0
  263. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/strategy/fedadam.py +0 -0
  264. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/strategy/fedavg.py +0 -0
  265. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/strategy/fedavg_android.py +0 -0
  266. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/strategy/fedavgm.py +0 -0
  267. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/strategy/fedmedian.py +0 -0
  268. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/strategy/fedopt.py +0 -0
  269. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/strategy/fedprox.py +0 -0
  270. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
  271. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
  272. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
  273. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
  274. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/strategy/fedyogi.py +0 -0
  275. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/strategy/krum.py +0 -0
  276. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/strategy/qfedavg.py +0 -0
  277. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/strategy/strategy.py +0 -0
  278. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/superlink/__init__.py +0 -0
  279. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/superlink/ffs/__init__.py +0 -0
  280. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/superlink/ffs/disk_ffs.py +0 -0
  281. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/superlink/ffs/ffs.py +0 -0
  282. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/superlink/ffs/ffs_factory.py +0 -0
  283. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/superlink/fleet/__init__.py +0 -0
  284. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/superlink/fleet/grpc_adapter/__init__.py +0 -0
  285. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +0 -0
  286. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
  287. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
  288. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
  289. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
  290. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +0 -0
  291. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
  292. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +0 -0
  293. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +0 -0
  294. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
  295. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/superlink/fleet/message_handler/message_handler.py +0 -0
  296. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
  297. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +0 -0
  298. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
  299. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
  300. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
  301. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +0 -0
  302. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/superlink/fleet/vce/vce_api.py +0 -0
  303. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/superlink/linkstate/__init__.py +0 -0
  304. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/superlink/linkstate/linkstate.py +0 -0
  305. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/superlink/linkstate/linkstate_factory.py +0 -0
  306. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/superlink/simulation/__init__.py +0 -0
  307. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/superlink/simulation/simulationio_grpc.py +0 -0
  308. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/superlink/simulation/simulationio_servicer.py +0 -0
  309. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/superlink/utils.py +0 -0
  310. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/utils/__init__.py +0 -0
  311. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/utils/tensorboard.py +0 -0
  312. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/utils/validator.py +0 -0
  313. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/workflow/__init__.py +0 -0
  314. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/workflow/constant.py +0 -0
  315. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
  316. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
  317. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/simulation/__init__.py +0 -0
  318. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/simulation/app.py +0 -0
  319. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/simulation/legacy_app.py +0 -0
  320. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/simulation/ray_transport/__init__.py +0 -0
  321. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
  322. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
  323. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/simulation/ray_transport/utils.py +0 -0
  324. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/simulation/simulationio_connection.py +0 -0
  325. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/superexec/__init__.py +0 -0
  326. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/superexec/app.py +0 -0
  327. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/superexec/deployment.py +0 -0
  328. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/superexec/exec_event_log_interceptor.py +0 -0
  329. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/superexec/exec_grpc.py +0 -0
  330. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/superexec/exec_servicer.py +0 -0
  331. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/superexec/exec_user_auth_interceptor.py +0 -0
  332. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/superexec/executor.py +0 -0
  333. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/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.17.0.dev20250317
3
+ Version: 1.17.0.dev20250319
4
4
  Summary: Flower: A Friendly Federated AI Framework
5
5
  Home-page: https://flower.ai
6
6
  License: Apache-2.0
@@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api"
4
4
 
5
5
  [tool.poetry]
6
6
  name = "flwr-nightly"
7
- version = "1.17.0.dev20250317"
7
+ version = "1.17.0.dev20250319"
8
8
  description = "Flower: A Friendly Federated AI Framework"
9
9
  license = "Apache-2.0"
10
10
  authors = ["The Flower Authors <hello@flower.ai>"]
@@ -61,6 +61,7 @@ PING_CALL_TIMEOUT = 5
61
61
  PING_BASE_MULTIPLIER = 0.8
62
62
  PING_RANDOM_RANGE = (-0.1, 0.1)
63
63
  PING_MAX_INTERVAL = 1e300
64
+ PING_PATIENCE = 2
64
65
 
65
66
  # IDs
66
67
  RUN_ID_NUM_BYTES = 8
@@ -120,6 +121,9 @@ TIMESTAMP_HEADER = "flwr-timestamp"
120
121
  TIMESTAMP_TOLERANCE = 10 # General tolerance for timestamp verification
121
122
  SYSTEM_TIME_TOLERANCE = 5 # Allowance for system time drift
122
123
 
124
+ # Constants for ParametersRecord
125
+ GC_THRESHOLD = 200_000_000 # 200 MB
126
+
123
127
 
124
128
  class MessageType:
125
129
  """Message type."""
@@ -163,6 +167,7 @@ class ErrorCode:
163
167
  CLIENT_APP_RAISED_EXCEPTION = 2
164
168
  MESSAGE_UNAVAILABLE = 3
165
169
  REPLY_MESSAGE_UNAVAILABLE = 4
170
+ NODE_UNAVAILABLE = 5
166
171
 
167
172
  def __new__(cls) -> ErrorCode:
168
173
  """Prevent instantiation."""
@@ -250,9 +250,9 @@ def warn_deprecated_feature_with_example(
250
250
  log(
251
251
  WARN,
252
252
  """FEATURE UPDATE: %s
253
- ------------------------------------------------------------
253
+ ------------------------------------------------------------
254
254
  %s
255
- ------------------------------------------------------------
255
+ ------------------------------------------------------------
256
256
  """,
257
257
  example_message,
258
258
  code_example,
@@ -0,0 +1,583 @@
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
+ """ParametersRecord and Array."""
16
+
17
+
18
+ from __future__ import annotations
19
+
20
+ import gc
21
+ import sys
22
+ from collections import OrderedDict
23
+ from dataclasses import dataclass
24
+ from io import BytesIO
25
+ from typing import TYPE_CHECKING, Any, cast, overload
26
+
27
+ import numpy as np
28
+
29
+ from ..constant import GC_THRESHOLD, SType
30
+ from ..typing import NDArray
31
+ from .typeddict import TypedDict
32
+
33
+ if TYPE_CHECKING:
34
+ import torch
35
+
36
+
37
+ def _raise_array_init_error() -> None:
38
+ raise TypeError(
39
+ f"Invalid arguments for {Array.__qualname__}. Expected either a "
40
+ "PyTorch tensor, a NumPy ndarray, or explicit"
41
+ " dtype/shape/stype/data values."
42
+ )
43
+
44
+
45
+ def _raise_parameters_record_init_error() -> None:
46
+ raise TypeError(
47
+ f"Invalid arguments for {ParametersRecord.__qualname__}. Expected either "
48
+ "a list of NumPy ndarrays, a PyTorch state_dict, or a dictionary of Arrays. "
49
+ "The `keep_input` argument is keyword-only."
50
+ )
51
+
52
+
53
+ @dataclass
54
+ class Array:
55
+ """Array type.
56
+
57
+ A dataclass containing serialized data from an array-like or tensor-like object
58
+ along with metadata about it. The class can be initialized in one of three ways:
59
+
60
+ 1. By specifying explicit values for `dtype`, `shape`, `stype`, and `data`.
61
+ 2. By providing a NumPy ndarray (via the `ndarray` argument).
62
+ 3. By providing a PyTorch tensor (via the `torch_tensor` argument).
63
+
64
+ In scenarios (2)-(3), the `dtype`, `shape`, `stype`, and `data` are automatically
65
+ derived from the input. In scenario (1), these fields must be specified manually.
66
+
67
+ Parameters
68
+ ----------
69
+ dtype : Optional[str] (default: None)
70
+ A string representing the data type of the serialized object (e.g. `"float32"`).
71
+ Only required if you are not passing in a ndarray or a tensor.
72
+
73
+ shape : Optional[list[int]] (default: None)
74
+ A list representing the shape of the unserialized array-like object. Only
75
+ required if you are not passing in a ndarray or a tensor.
76
+
77
+ stype : Optional[str] (default: None)
78
+ A string indicating the serialization mechanism used to generate the bytes in
79
+ `data` from an array-like or tensor-like object. Only required if you are not
80
+ passing in a ndarray or a tensor.
81
+
82
+ data : Optional[bytes] (default: None)
83
+ A buffer of bytes containing the data. Only required if you are not passing in
84
+ a ndarray or a tensor.
85
+
86
+ ndarray : Optional[NDArray] (default: None)
87
+ A NumPy ndarray. If provided, the `dtype`, `shape`, `stype`, and `data`
88
+ fields are derived automatically from it.
89
+
90
+ torch_tensor : Optional[torch.Tensor] (default: None)
91
+ A PyTorch tensor. If provided, it will be **detached and moved to CPU**
92
+ before conversion, and the `dtype`, `shape`, `stype`, and `data` fields
93
+ will be derived automatically from it.
94
+
95
+ Examples
96
+ --------
97
+ Initializing by specifying all fields directly:
98
+
99
+ >>> arr1 = Array(
100
+ >>> dtype="float32",
101
+ >>> shape=[3, 3],
102
+ >>> stype="numpy.ndarray",
103
+ >>> data=b"serialized_data...",
104
+ >>> )
105
+
106
+ Initializing with a NumPy ndarray:
107
+
108
+ >>> import numpy as np
109
+ >>> arr2 = Array(np.random.randn(3, 3))
110
+
111
+ Initializing with a PyTorch tensor:
112
+
113
+ >>> import torch
114
+ >>> arr3 = Array(torch.randn(3, 3))
115
+ """
116
+
117
+ dtype: str
118
+ shape: list[int]
119
+ stype: str
120
+ data: bytes
121
+
122
+ @overload
123
+ def __init__( # noqa: E704
124
+ self, dtype: str, shape: list[int], stype: str, data: bytes
125
+ ) -> None: ...
126
+
127
+ @overload
128
+ def __init__(self, ndarray: NDArray) -> None: ... # noqa: E704
129
+
130
+ @overload
131
+ def __init__(self, torch_tensor: torch.Tensor) -> None: ... # noqa: E704
132
+
133
+ def __init__( # pylint: disable=too-many-arguments, too-many-locals
134
+ self,
135
+ *args: Any,
136
+ dtype: str | None = None,
137
+ shape: list[int] | None = None,
138
+ stype: str | None = None,
139
+ data: bytes | None = None,
140
+ ndarray: NDArray | None = None,
141
+ torch_tensor: torch.Tensor | None = None,
142
+ ) -> None:
143
+ # Determine the initialization method and validate input arguments.
144
+ # Support three initialization formats:
145
+ # 1. Array(dtype: str, shape: list[int], stype: str, data: bytes)
146
+ # 2. Array(ndarray: NDArray)
147
+ # 3. Array(torch_tensor: torch.Tensor)
148
+
149
+ # Initialize all arguments
150
+ # If more than 4 positional arguments are provided, raise an error.
151
+ if len(args) > 4:
152
+ _raise_array_init_error()
153
+ all_args = [None] * 4
154
+ for i, arg in enumerate(args):
155
+ all_args[i] = arg
156
+ init_method: str | None = None # Track which init method is being used
157
+
158
+ # Try to assign a value to all_args[index] if it's not already set.
159
+ # If an initialization method is provided, update init_method.
160
+ def _try_set_arg(index: int, arg: Any, method: str) -> None:
161
+ # Skip if arg is None
162
+ if arg is None:
163
+ return
164
+ # Raise an error if all_args[index] is already set
165
+ if all_args[index] is not None:
166
+ _raise_array_init_error()
167
+ # Raise an error if a different initialization method is already set
168
+ nonlocal init_method
169
+ if init_method is not None and init_method != method:
170
+ _raise_array_init_error()
171
+ # Set init_method and all_args[index]
172
+ if init_method is None:
173
+ init_method = method
174
+ all_args[index] = arg
175
+
176
+ # Try to set keyword arguments in all_args
177
+ _try_set_arg(0, dtype, "direct")
178
+ _try_set_arg(1, shape, "direct")
179
+ _try_set_arg(2, stype, "direct")
180
+ _try_set_arg(3, data, "direct")
181
+ _try_set_arg(0, ndarray, "ndarray")
182
+ _try_set_arg(0, torch_tensor, "torch_tensor")
183
+
184
+ # Check if all arguments are correctly set
185
+ all_args = [arg for arg in all_args if arg is not None]
186
+
187
+ # Handle direct field initialization
188
+ if not init_method or init_method == "direct":
189
+ if (
190
+ len(all_args) == 4 # pylint: disable=too-many-boolean-expressions
191
+ and isinstance(all_args[0], str)
192
+ and isinstance(all_args[1], list)
193
+ and all(isinstance(i, int) for i in all_args[1])
194
+ and isinstance(all_args[2], str)
195
+ and isinstance(all_args[3], bytes)
196
+ ):
197
+ self.dtype, self.shape, self.stype, self.data = all_args
198
+ return
199
+
200
+ # Handle NumPy array
201
+ if not init_method or init_method == "ndarray":
202
+ if len(all_args) == 1 and isinstance(all_args[0], np.ndarray):
203
+ self.__dict__.update(self.from_numpy_ndarray(all_args[0]).__dict__)
204
+ return
205
+
206
+ # Handle PyTorch tensor
207
+ if not init_method or init_method == "torch_tensor":
208
+ if (
209
+ len(all_args) == 1
210
+ and "torch" in sys.modules
211
+ and isinstance(all_args[0], sys.modules["torch"].Tensor)
212
+ ):
213
+ self.__dict__.update(self.from_torch_tensor(all_args[0]).__dict__)
214
+ return
215
+
216
+ _raise_array_init_error()
217
+
218
+ @classmethod
219
+ def from_numpy_ndarray(cls, ndarray: NDArray) -> Array:
220
+ """Create Array from NumPy ndarray."""
221
+ assert isinstance(
222
+ ndarray, np.ndarray
223
+ ), f"Expected NumPy ndarray, got {type(ndarray)}"
224
+ buffer = BytesIO()
225
+ # WARNING: NEVER set allow_pickle to true.
226
+ # Reason: loading pickled data can execute arbitrary code
227
+ # Source: https://numpy.org/doc/stable/reference/generated/numpy.save.html
228
+ np.save(buffer, ndarray, allow_pickle=False)
229
+ data = buffer.getvalue()
230
+ return Array(
231
+ dtype=str(ndarray.dtype),
232
+ shape=list(ndarray.shape),
233
+ stype=SType.NUMPY,
234
+ data=data,
235
+ )
236
+
237
+ @classmethod
238
+ def from_torch_tensor(cls, tensor: torch.Tensor) -> Array:
239
+ """Create Array from PyTorch tensor."""
240
+ if not (torch := sys.modules.get("torch")):
241
+ raise RuntimeError(
242
+ f"PyTorch is required to use {cls.from_torch_tensor.__name__}"
243
+ )
244
+
245
+ assert isinstance(
246
+ tensor, torch.Tensor
247
+ ), f"Expected PyTorch Tensor, got {type(tensor)}"
248
+ return cls.from_numpy_ndarray(tensor.detach().cpu().numpy())
249
+
250
+ def numpy(self) -> NDArray:
251
+ """Return the array as a NumPy array."""
252
+ if self.stype != SType.NUMPY:
253
+ raise TypeError(
254
+ f"Unsupported serialization type for numpy conversion: '{self.stype}'"
255
+ )
256
+ bytes_io = BytesIO(self.data)
257
+ # WARNING: NEVER set allow_pickle to true.
258
+ # Reason: loading pickled data can execute arbitrary code
259
+ # Source: https://numpy.org/doc/stable/reference/generated/numpy.load.html
260
+ ndarray_deserialized = np.load(bytes_io, allow_pickle=False)
261
+ return cast(NDArray, ndarray_deserialized)
262
+
263
+
264
+ def _check_key(key: str) -> None:
265
+ """Check if key is of expected type."""
266
+ if not isinstance(key, str):
267
+ raise TypeError(f"Key must be of type `str` but `{type(key)}` was passed.")
268
+
269
+
270
+ def _check_value(value: Array) -> None:
271
+ if not isinstance(value, Array):
272
+ raise TypeError(
273
+ f"Value must be of type `{Array}` but `{type(value)}` was passed."
274
+ )
275
+
276
+
277
+ class ParametersRecord(TypedDict[str, Array]):
278
+ r"""Parameters record.
279
+
280
+ A typed dictionary (``str`` to :class:`Array`) that can store named parameters
281
+ as serialized tensors. Internally, this behaves similarly to an
282
+ ``OrderedDict[str, Array]``. A ``ParametersRecord`` can be viewed as an
283
+ equivalent to PyTorch's ``state_dict``, but it holds arrays in serialized form.
284
+
285
+ This object is one of the record types supported by :class:`RecordSet` and can
286
+ therefore be stored in the ``content`` of a :class:`Message` or the ``state``
287
+ of a :class:`Context`.
288
+
289
+ This class can be instantiated in multiple ways:
290
+
291
+ 1. By providing nothing (empty container).
292
+ 2. By providing a dictionary of :class:`Array` (via the ``array_dict`` argument).
293
+ 3. By providing a list of NumPy ``ndarray`` (via the ``numpy_ndarrays`` argument).
294
+ 4. By providing a PyTorch ``state_dict`` (via the ``torch_state_dict`` argument).
295
+
296
+ Parameters
297
+ ----------
298
+ array_dict : Optional[OrderedDict[str, Array]] (default: None)
299
+ An existing dictionary containing named :class:`Array` instances. If
300
+ provided, these entries will be used directly to populate the record.
301
+ numpy_ndarrays : Optional[list[NDArray]] (default: None)
302
+ A list of NumPy arrays. Each array will be automatically converted
303
+ into an :class:`Array` and stored in this record with generated keys.
304
+ torch_state_dict : Optional[OrderedDict[str, torch.Tensor]] (default: None)
305
+ A PyTorch ``state_dict`` (``str`` keys to ``torch.Tensor`` values). Each
306
+ tensor will be converted into an :class:`Array` and stored in this record.
307
+ keep_input : bool (default: True)
308
+ If ``False``, entries from the input are removed after being added to
309
+ this record to free up memory. If ``True``, the input remains unchanged.
310
+ Regardless of this value, no duplicate memory is used if the input is a
311
+ dictionary of :class:`Array`, i.e., ``array_dict``.
312
+
313
+ Examples
314
+ --------
315
+ Initializing an empty ParametersRecord:
316
+
317
+ >>> p_record = ParametersRecord()
318
+
319
+ Initializing with a dictionary of :class:`Array`:
320
+
321
+ >>> arr = Array("float32", [5, 5], "numpy.ndarray", b"serialized_data...")
322
+ >>> p_record = ParametersRecord({"weight": arr})
323
+
324
+ Initializing with a list of NumPy arrays:
325
+
326
+ >>> import numpy as np
327
+ >>> arr1 = np.random.randn(3, 3)
328
+ >>> arr2 = np.random.randn(2, 2)
329
+ >>> p_record = ParametersRecord([arr1, arr2])
330
+
331
+ Initializing with a PyTorch model state_dict:
332
+
333
+ >>> import torch.nn as nn
334
+ >>> model = nn.Linear(10, 5)
335
+ >>> p_record = ParametersRecord(model.state_dict())
336
+
337
+ Initializing with a TensorFlow model weights (a list of NumPy arrays):
338
+
339
+ >>> import tensorflow as tf
340
+ >>> model = tf.keras.Sequential([tf.keras.layers.Dense(5, input_shape=(10,))])
341
+ >>> p_record = ParametersRecord(model.get_weights())
342
+ """
343
+
344
+ @overload
345
+ def __init__(self) -> None: ... # noqa: E704
346
+
347
+ @overload
348
+ def __init__( # noqa: E704
349
+ self, array_dict: OrderedDict[str, Array], *, keep_input: bool = True
350
+ ) -> None: ...
351
+
352
+ @overload
353
+ def __init__( # noqa: E704
354
+ self, numpy_ndarrays: list[NDArray], *, keep_input: bool = True
355
+ ) -> None: ...
356
+
357
+ @overload
358
+ def __init__( # noqa: E704
359
+ self,
360
+ torch_state_dict: OrderedDict[str, torch.Tensor],
361
+ *,
362
+ keep_input: bool = True,
363
+ ) -> None: ...
364
+
365
+ def __init__( # pylint: disable=too-many-arguments
366
+ self,
367
+ *args: Any,
368
+ numpy_ndarrays: list[NDArray] | None = None,
369
+ torch_state_dict: OrderedDict[str, torch.Tensor] | None = None,
370
+ array_dict: OrderedDict[str, Array] | None = None,
371
+ keep_input: bool = True,
372
+ ) -> None:
373
+ super().__init__(_check_key, _check_value)
374
+
375
+ # Determine the initialization method and validates input arguments.
376
+ # Support the following initialization formats:
377
+ # 1. cls(array_dict: OrderedDict[str, Array], keep_input: bool)
378
+ # 2. cls(numpy_ndarrays: list[NDArray], keep_input: bool)
379
+ # 3. cls(torch_state_dict: dict[str, torch.Tensor], keep_input: bool)
380
+
381
+ # Init the argument
382
+ if len(args) > 1:
383
+ _raise_parameters_record_init_error()
384
+ arg = args[0] if args else None
385
+ init_method: str | None = None # Track which init method is being used
386
+
387
+ # Try to assign a value to arg if it's not already set.
388
+ # If an initialization method is provided, update init_method.
389
+ def _try_set_arg(_arg: Any, method: str) -> None:
390
+ # Skip if _arg is None
391
+ if _arg is None:
392
+ return
393
+ nonlocal arg, init_method
394
+ # Raise an error if arg is already set
395
+ if arg is not None:
396
+ _raise_parameters_record_init_error()
397
+ # Raise an error if a different initialization method is already set
398
+ if init_method is not None:
399
+ _raise_parameters_record_init_error()
400
+ # Set init_method and arg
401
+ if init_method is None:
402
+ init_method = method
403
+ arg = _arg
404
+
405
+ # Try to set keyword arguments
406
+ _try_set_arg(array_dict, "array_dict")
407
+ _try_set_arg(numpy_ndarrays, "numpy_ndarrays")
408
+ _try_set_arg(torch_state_dict, "state_dict")
409
+
410
+ # If no arguments are provided, return and keep self empty
411
+ if arg is None:
412
+ return
413
+
414
+ # Handle dictionary of Arrays
415
+ if not init_method or init_method == "array_dict":
416
+ # Type check the input
417
+ if (
418
+ isinstance(arg, dict)
419
+ and all(isinstance(k, str) for k in arg.keys())
420
+ and all(isinstance(v, Array) for v in arg.values())
421
+ ):
422
+ array_dict = cast(OrderedDict[str, Array], arg)
423
+ converted = self.from_array_dict(array_dict, keep_input=keep_input)
424
+ self.__dict__.update(converted.__dict__)
425
+ return
426
+
427
+ # Handle NumPy ndarrays
428
+ if not init_method or init_method == "numpy_ndarrays":
429
+ # Type check the input
430
+ # pylint: disable-next=not-an-iterable
431
+ if isinstance(arg, list) and all(isinstance(v, np.ndarray) for v in arg):
432
+ numpy_ndarrays = cast(list[NDArray], arg)
433
+ converted = self.from_numpy_ndarrays(
434
+ numpy_ndarrays, keep_input=keep_input
435
+ )
436
+ self.__dict__.update(converted.__dict__)
437
+ return
438
+
439
+ # Handle PyTorch state_dict
440
+ if not init_method or init_method == "state_dict":
441
+ # Type check the input
442
+ if (
443
+ (torch := sys.modules.get("torch")) is not None
444
+ and isinstance(arg, dict)
445
+ and all(isinstance(k, str) for k in arg.keys())
446
+ and all(isinstance(v, torch.Tensor) for v in arg.values())
447
+ ):
448
+ torch_state_dict = cast(
449
+ OrderedDict[str, torch.Tensor], arg # type: ignore
450
+ )
451
+ converted = self.from_torch_state_dict(
452
+ torch_state_dict, keep_input=keep_input
453
+ )
454
+ self.__dict__.update(converted.__dict__)
455
+ return
456
+
457
+ _raise_parameters_record_init_error()
458
+
459
+ @classmethod
460
+ def from_array_dict(
461
+ cls,
462
+ array_dict: OrderedDict[str, Array],
463
+ *,
464
+ keep_input: bool = True,
465
+ ) -> ParametersRecord:
466
+ """Create ParametersRecord from a dictionary of :class:`Array`."""
467
+ record = ParametersRecord()
468
+ for k, v in array_dict.items():
469
+ record[k] = Array(
470
+ dtype=v.dtype, shape=list(v.shape), stype=v.stype, data=v.data
471
+ )
472
+ if not keep_input:
473
+ array_dict.clear()
474
+ return record
475
+
476
+ @classmethod
477
+ def from_numpy_ndarrays(
478
+ cls,
479
+ ndarrays: list[NDArray],
480
+ *,
481
+ keep_input: bool = True,
482
+ ) -> ParametersRecord:
483
+ """Create ParametersRecord from a list of NumPy ``ndarray``."""
484
+ record = ParametersRecord()
485
+ total_serialized_bytes = 0
486
+
487
+ for i in range(len(ndarrays)): # pylint: disable=C0200
488
+ record[str(i)] = Array.from_numpy_ndarray(ndarrays[i])
489
+
490
+ if not keep_input:
491
+ # Remove the reference
492
+ ndarrays[i] = None # type: ignore
493
+ total_serialized_bytes += len(record[str(i)].data)
494
+
495
+ # If total serialized data exceeds the threshold, trigger GC
496
+ if total_serialized_bytes > GC_THRESHOLD:
497
+ total_serialized_bytes = 0
498
+ gc.collect()
499
+
500
+ if not keep_input:
501
+ # Clear the entire list to remove all references and force GC
502
+ ndarrays.clear()
503
+ gc.collect()
504
+ return record
505
+
506
+ @classmethod
507
+ def from_torch_state_dict(
508
+ cls,
509
+ state_dict: OrderedDict[str, torch.Tensor],
510
+ *,
511
+ keep_input: bool = True,
512
+ ) -> ParametersRecord:
513
+ """Create ParametersRecord from PyTorch ``state_dict``."""
514
+ if "torch" not in sys.modules:
515
+ raise RuntimeError(
516
+ f"PyTorch is required to use {cls.from_torch_state_dict.__name__}"
517
+ )
518
+
519
+ record = ParametersRecord()
520
+
521
+ for k in list(state_dict.keys()):
522
+ v = state_dict[k] if keep_input else state_dict.pop(k)
523
+ record[k] = Array.from_numpy_ndarray(v.detach().cpu().numpy())
524
+
525
+ return record
526
+
527
+ def to_numpy_ndarrays(self, *, keep_input: bool = True) -> list[NDArray]:
528
+ """Return the ParametersRecord as a list of NumPy ``ndarray``."""
529
+ if keep_input:
530
+ return [v.numpy() for v in self.values()]
531
+
532
+ # Clear the record and return the list of NumPy arrays
533
+ ret: list[NDArray] = []
534
+ total_serialized_bytes = 0
535
+ for k in list(self.keys()):
536
+ arr = self.pop(k)
537
+ ret.append(arr.numpy())
538
+ total_serialized_bytes += len(arr.data)
539
+ del arr
540
+
541
+ # If total serialized data exceeds the threshold, trigger GC
542
+ if total_serialized_bytes > GC_THRESHOLD:
543
+ total_serialized_bytes = 0
544
+ gc.collect()
545
+
546
+ if not keep_input:
547
+ # Force GC
548
+ gc.collect()
549
+ return ret
550
+
551
+ def to_torch_state_dict(
552
+ self, *, keep_input: bool = True
553
+ ) -> OrderedDict[str, torch.Tensor]:
554
+ """Return the ParametersRecord as a PyTorch ``state_dict``."""
555
+ if not (torch := sys.modules.get("torch")):
556
+ raise RuntimeError(
557
+ f"PyTorch is required to use {self.to_torch_state_dict.__name__}"
558
+ )
559
+
560
+ state_dict = OrderedDict()
561
+
562
+ for k in list(self.keys()):
563
+ arr = self[k] if keep_input else self.pop(k)
564
+ state_dict[k] = torch.from_numpy(arr.numpy())
565
+
566
+ return state_dict
567
+
568
+ def count_bytes(self) -> int:
569
+ """Return number of Bytes stored in this object.
570
+
571
+ Note that a small amount of Bytes might also be included in this counting that
572
+ correspond to metadata of the serialized object (e.g. of NumPy array) needed for
573
+ deseralization.
574
+ """
575
+ num_bytes = 0
576
+
577
+ for k, v in self.items():
578
+ num_bytes += len(v.data)
579
+
580
+ # We also count the bytes footprint of the keys
581
+ num_bytes += len(k)
582
+
583
+ return num_bytes
@@ -21,7 +21,8 @@ from .app import start_server as start_server
21
21
  from .client_manager import ClientManager as ClientManager
22
22
  from .client_manager import SimpleClientManager as SimpleClientManager
23
23
  from .compat import LegacyContext as LegacyContext
24
- from .driver import Driver as Driver
24
+ from .grid import Driver as Driver
25
+ from .grid import Grid as Grid
25
26
  from .history import History as History
26
27
  from .server import Server as Server
27
28
  from .server_app import ServerApp as ServerApp
@@ -31,6 +32,7 @@ from .serverapp_components import ServerAppComponents as ServerAppComponents
31
32
  __all__ = [
32
33
  "ClientManager",
33
34
  "Driver",
35
+ "Grid",
34
36
  "History",
35
37
  "LegacyContext",
36
38
  "Server",
@@ -79,13 +79,13 @@ from .history import History
79
79
  from .server import Server, init_defaults, run_fl
80
80
  from .server_config import ServerConfig
81
81
  from .strategy import Strategy
82
- from .superlink.driver.serverappio_grpc import run_serverappio_api_grpc
83
82
  from .superlink.ffs.ffs_factory import FfsFactory
84
83
  from .superlink.fleet.grpc_adapter.grpc_adapter_servicer import GrpcAdapterServicer
85
84
  from .superlink.fleet.grpc_bidi.grpc_server import start_grpc_server
86
85
  from .superlink.fleet.grpc_rere.fleet_servicer import FleetServicer
87
86
  from .superlink.fleet.grpc_rere.server_interceptor import AuthenticateServerInterceptor
88
87
  from .superlink.linkstate import LinkStateFactory
88
+ from .superlink.serverappio.serverappio_grpc import run_serverappio_api_grpc
89
89
  from .superlink.simulation.simulationio_grpc import run_simulationio_api_grpc
90
90
 
91
91
  DATABASE = ":flwr-in-memory-state:"
@@ -15,10 +15,10 @@
15
15
  """Flower ServerApp compatibility package."""
16
16
 
17
17
 
18
- from .app import start_driver as start_driver
18
+ from .app import start_grid as start_grid
19
19
  from .legacy_context import LegacyContext as LegacyContext
20
20
 
21
21
  __all__ = [
22
22
  "LegacyContext",
23
- "start_driver",
23
+ "start_grid",
24
24
  ]