flwr-nightly 1.17.0.dev20250317__tar.gz → 1.17.0.dev20250318__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.dev20250318}/PKG-INFO +1 -1
  2. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/pyproject.toml +1 -1
  3. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/common/constant.py +3 -0
  4. flwr_nightly-1.17.0.dev20250318/src/py/flwr/common/record/parametersrecord.py +583 -0
  5. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/server/__init__.py +1 -1
  6. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/server/app.py +1 -1
  7. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/server/compat/app.py +1 -1
  8. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/server/compat/app_utils.py +2 -2
  9. flwr_nightly-1.17.0.dev20250317/src/py/flwr/server/compat/driver_client_proxy.py → flwr_nightly-1.17.0.dev20250318/src/py/flwr/server/compat/grid_client_proxy.py +2 -2
  10. {flwr_nightly-1.17.0.dev20250317/src/py/flwr/server/driver → flwr_nightly-1.17.0.dev20250318/src/py/flwr/server/grid}/__init__.py +4 -4
  11. flwr_nightly-1.17.0.dev20250317/src/py/flwr/server/driver/driver.py → flwr_nightly-1.17.0.dev20250318/src/py/flwr/server/grid/grid.py +1 -1
  12. flwr_nightly-1.17.0.dev20250317/src/py/flwr/server/driver/grpc_driver.py → flwr_nightly-1.17.0.dev20250318/src/py/flwr/server/grid/grpc_grid.py +2 -11
  13. flwr_nightly-1.17.0.dev20250317/src/py/flwr/server/driver/inmemory_driver.py → flwr_nightly-1.17.0.dev20250318/src/py/flwr/server/grid/inmemory_grid.py +2 -10
  14. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/server/run_serverapp.py +1 -1
  15. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/server/server_app.py +2 -2
  16. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/server/serverapp/app.py +1 -1
  17. {flwr_nightly-1.17.0.dev20250317/src/py/flwr/server/superlink/driver → flwr_nightly-1.17.0.dev20250318/src/py/flwr/server/superlink/serverappio}/__init__.py +1 -1
  18. {flwr_nightly-1.17.0.dev20250317/src/py/flwr/server/superlink/driver → flwr_nightly-1.17.0.dev20250318/src/py/flwr/server/superlink/serverappio}/serverappio_grpc.py +1 -1
  19. {flwr_nightly-1.17.0.dev20250317/src/py/flwr/server/superlink/driver → flwr_nightly-1.17.0.dev20250318/src/py/flwr/server/superlink/serverappio}/serverappio_servicer.py +1 -1
  20. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/server/typing.py +1 -1
  21. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/server/workflow/default_workflows.py +1 -1
  22. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +1 -1
  23. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/simulation/run_simulation.py +1 -1
  24. flwr_nightly-1.17.0.dev20250317/src/py/flwr/common/record/parametersrecord.py +0 -339
  25. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/LICENSE +0 -0
  26. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/README.md +0 -0
  27. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/__init__.py +0 -0
  28. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/cli/__init__.py +0 -0
  29. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/cli/app.py +0 -0
  30. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/cli/auth_plugin/__init__.py +0 -0
  31. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/cli/auth_plugin/oidc_cli_plugin.py +0 -0
  32. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/cli/build.py +0 -0
  33. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/cli/cli_user_auth_interceptor.py +0 -0
  34. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/cli/config_utils.py +0 -0
  35. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/cli/constant.py +0 -0
  36. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/cli/example.py +0 -0
  37. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/cli/install.py +0 -0
  38. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/cli/log.py +0 -0
  39. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/cli/login/__init__.py +0 -0
  40. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/cli/login/login.py +0 -0
  41. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/cli/ls.py +0 -0
  42. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/cli/new/__init__.py +0 -0
  43. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/cli/new/new.py +0 -0
  44. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/cli/new/templates/__init__.py +0 -0
  45. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/cli/new/templates/app/.gitignore.tpl +0 -0
  46. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/cli/new/templates/app/LICENSE.tpl +0 -0
  47. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/cli/new/templates/app/README.baseline.md.tpl +0 -0
  48. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/cli/new/templates/app/README.flowertune.md.tpl +0 -0
  49. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/cli/new/templates/app/README.md.tpl +0 -0
  50. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/cli/new/templates/app/__init__.py +0 -0
  51. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/cli/new/templates/app/code/__init__.baseline.py.tpl +0 -0
  52. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
  53. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
  54. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/cli/new/templates/app/code/client.baseline.py.tpl +0 -0
  55. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/cli/new/templates/app/code/client.huggingface.py.tpl +0 -0
  56. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/cli/new/templates/app/code/client.jax.py.tpl +0 -0
  57. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/cli/new/templates/app/code/client.mlx.py.tpl +0 -0
  58. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/cli/new/templates/app/code/client.numpy.py.tpl +0 -0
  59. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -0
  60. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl +0 -0
  61. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -0
  62. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/cli/new/templates/app/code/dataset.baseline.py.tpl +0 -0
  63. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/cli/new/templates/app/code/flwr_tune/__init__.py +0 -0
  64. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/cli/new/templates/app/code/flwr_tune/client_app.py.tpl +0 -0
  65. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/cli/new/templates/app/code/flwr_tune/dataset.py.tpl +0 -0
  66. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/cli/new/templates/app/code/flwr_tune/models.py.tpl +0 -0
  67. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/cli/new/templates/app/code/flwr_tune/server_app.py.tpl +0 -0
  68. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/cli/new/templates/app/code/flwr_tune/strategy.py.tpl +0 -0
  69. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/cli/new/templates/app/code/model.baseline.py.tpl +0 -0
  70. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/cli/new/templates/app/code/server.baseline.py.tpl +0 -0
  71. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/cli/new/templates/app/code/server.huggingface.py.tpl +0 -0
  72. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/cli/new/templates/app/code/server.jax.py.tpl +0 -0
  73. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/cli/new/templates/app/code/server.mlx.py.tpl +0 -0
  74. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -0
  75. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -0
  76. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/cli/new/templates/app/code/server.sklearn.py.tpl +0 -0
  77. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -0
  78. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/cli/new/templates/app/code/strategy.baseline.py.tpl +0 -0
  79. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/cli/new/templates/app/code/task.huggingface.py.tpl +0 -0
  80. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/cli/new/templates/app/code/task.jax.py.tpl +0 -0
  81. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/cli/new/templates/app/code/task.mlx.py.tpl +0 -0
  82. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/cli/new/templates/app/code/task.numpy.py.tpl +0 -0
  83. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +0 -0
  84. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/cli/new/templates/app/code/task.sklearn.py.tpl +0 -0
  85. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/cli/new/templates/app/code/task.tensorflow.py.tpl +0 -0
  86. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/cli/new/templates/app/code/utils.baseline.py.tpl +0 -0
  87. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/cli/new/templates/app/pyproject.baseline.toml.tpl +0 -0
  88. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +0 -0
  89. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl +0 -0
  90. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/cli/new/templates/app/pyproject.jax.toml.tpl +0 -0
  91. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +0 -0
  92. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +0 -0
  93. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +0 -0
  94. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +0 -0
  95. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +0 -0
  96. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/cli/run/__init__.py +0 -0
  97. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/cli/run/run.py +0 -0
  98. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/cli/stop.py +0 -0
  99. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/cli/utils.py +0 -0
  100. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/client/__init__.py +0 -0
  101. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/client/app.py +0 -0
  102. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/client/client.py +0 -0
  103. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/client/client_app.py +0 -0
  104. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/client/clientapp/__init__.py +0 -0
  105. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/client/clientapp/app.py +0 -0
  106. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/client/clientapp/clientappio_servicer.py +0 -0
  107. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/client/clientapp/utils.py +0 -0
  108. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/client/dpfedavg_numpy_client.py +0 -0
  109. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/client/grpc_adapter_client/__init__.py +0 -0
  110. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/client/grpc_adapter_client/connection.py +0 -0
  111. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/client/grpc_client/__init__.py +0 -0
  112. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/client/grpc_client/connection.py +0 -0
  113. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/client/grpc_rere_client/__init__.py +0 -0
  114. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/client/grpc_rere_client/client_interceptor.py +0 -0
  115. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/client/grpc_rere_client/connection.py +0 -0
  116. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/client/grpc_rere_client/grpc_adapter.py +0 -0
  117. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/client/heartbeat.py +0 -0
  118. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/client/message_handler/__init__.py +0 -0
  119. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/client/message_handler/message_handler.py +0 -0
  120. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/client/mod/__init__.py +0 -0
  121. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/client/mod/centraldp_mods.py +0 -0
  122. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/client/mod/comms_mods.py +0 -0
  123. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/client/mod/localdp_mod.py +0 -0
  124. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
  125. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
  126. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
  127. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/client/mod/utils.py +0 -0
  128. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/client/nodestate/__init__.py +0 -0
  129. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/client/nodestate/in_memory_nodestate.py +0 -0
  130. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/client/nodestate/nodestate.py +0 -0
  131. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/client/nodestate/nodestate_factory.py +0 -0
  132. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/client/numpy_client.py +0 -0
  133. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/client/rest_client/__init__.py +0 -0
  134. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/client/rest_client/connection.py +0 -0
  135. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/client/run_info_store.py +0 -0
  136. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/client/supernode/__init__.py +0 -0
  137. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/client/supernode/app.py +0 -0
  138. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/client/typing.py +0 -0
  139. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/common/__init__.py +0 -0
  140. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/common/address.py +0 -0
  141. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/common/args.py +0 -0
  142. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/common/auth_plugin/__init__.py +0 -0
  143. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/common/auth_plugin/auth_plugin.py +0 -0
  144. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/common/config.py +0 -0
  145. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/common/context.py +0 -0
  146. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/common/date.py +0 -0
  147. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/common/differential_privacy.py +0 -0
  148. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/common/differential_privacy_constants.py +0 -0
  149. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/common/dp.py +0 -0
  150. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/common/event_log_plugin/__init__.py +0 -0
  151. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/common/event_log_plugin/event_log_plugin.py +0 -0
  152. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/common/exit/__init__.py +0 -0
  153. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/common/exit/exit.py +0 -0
  154. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/common/exit/exit_code.py +0 -0
  155. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/common/exit_handlers.py +0 -0
  156. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/common/grpc.py +0 -0
  157. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/common/logger.py +0 -0
  158. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/common/message.py +0 -0
  159. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/common/object_ref.py +0 -0
  160. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/common/parameter.py +0 -0
  161. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/common/pyproject.py +0 -0
  162. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/common/record/__init__.py +0 -0
  163. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/common/record/configsrecord.py +0 -0
  164. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/common/record/conversion_utils.py +0 -0
  165. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/common/record/metricsrecord.py +0 -0
  166. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/common/record/recordset.py +0 -0
  167. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/common/record/typeddict.py +0 -0
  168. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/common/recordset_compat.py +0 -0
  169. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/common/retry_invoker.py +0 -0
  170. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/common/secure_aggregation/__init__.py +0 -0
  171. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
  172. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
  173. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -0
  174. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
  175. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/common/secure_aggregation/quantization.py +0 -0
  176. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
  177. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
  178. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/common/serde.py +0 -0
  179. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/common/telemetry.py +0 -0
  180. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/common/typing.py +0 -0
  181. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/common/version.py +0 -0
  182. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/proto/__init__.py +0 -0
  183. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/proto/clientappio_pb2.py +0 -0
  184. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/proto/clientappio_pb2.pyi +0 -0
  185. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/proto/clientappio_pb2_grpc.py +0 -0
  186. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/proto/clientappio_pb2_grpc.pyi +0 -0
  187. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/proto/error_pb2.py +0 -0
  188. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/proto/error_pb2.pyi +0 -0
  189. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/proto/error_pb2_grpc.py +0 -0
  190. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/proto/error_pb2_grpc.pyi +0 -0
  191. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/proto/exec_pb2.py +0 -0
  192. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/proto/exec_pb2.pyi +0 -0
  193. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/proto/exec_pb2_grpc.py +0 -0
  194. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/proto/exec_pb2_grpc.pyi +0 -0
  195. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/proto/fab_pb2.py +0 -0
  196. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/proto/fab_pb2.pyi +0 -0
  197. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/proto/fab_pb2_grpc.py +0 -0
  198. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/proto/fab_pb2_grpc.pyi +0 -0
  199. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/proto/fleet_pb2.py +0 -0
  200. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/proto/fleet_pb2.pyi +0 -0
  201. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/proto/fleet_pb2_grpc.py +0 -0
  202. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
  203. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/proto/grpcadapter_pb2.py +0 -0
  204. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/proto/grpcadapter_pb2.pyi +0 -0
  205. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/proto/grpcadapter_pb2_grpc.py +0 -0
  206. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/proto/grpcadapter_pb2_grpc.pyi +0 -0
  207. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/proto/log_pb2.py +0 -0
  208. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/proto/log_pb2.pyi +0 -0
  209. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/proto/log_pb2_grpc.py +0 -0
  210. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/proto/log_pb2_grpc.pyi +0 -0
  211. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/proto/message_pb2.py +0 -0
  212. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/proto/message_pb2.pyi +0 -0
  213. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/proto/message_pb2_grpc.py +0 -0
  214. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/proto/message_pb2_grpc.pyi +0 -0
  215. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/proto/node_pb2.py +0 -0
  216. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/proto/node_pb2.pyi +0 -0
  217. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/proto/node_pb2_grpc.py +0 -0
  218. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/proto/node_pb2_grpc.pyi +0 -0
  219. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/proto/recordset_pb2.py +0 -0
  220. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/proto/recordset_pb2.pyi +0 -0
  221. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/proto/recordset_pb2_grpc.py +0 -0
  222. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/proto/recordset_pb2_grpc.pyi +0 -0
  223. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/proto/run_pb2.py +0 -0
  224. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/proto/run_pb2.pyi +0 -0
  225. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/proto/run_pb2_grpc.py +0 -0
  226. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/proto/run_pb2_grpc.pyi +0 -0
  227. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/proto/serverappio_pb2.py +0 -0
  228. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/proto/serverappio_pb2.pyi +0 -0
  229. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/proto/serverappio_pb2_grpc.py +0 -0
  230. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/proto/serverappio_pb2_grpc.pyi +0 -0
  231. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/proto/simulationio_pb2.py +0 -0
  232. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/proto/simulationio_pb2.pyi +0 -0
  233. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/proto/simulationio_pb2_grpc.py +0 -0
  234. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/proto/simulationio_pb2_grpc.pyi +0 -0
  235. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/proto/transport_pb2.py +0 -0
  236. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/proto/transport_pb2.pyi +0 -0
  237. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/proto/transport_pb2_grpc.py +0 -0
  238. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
  239. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/py.typed +0 -0
  240. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/server/client_manager.py +0 -0
  241. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/server/client_proxy.py +0 -0
  242. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/server/compat/__init__.py +0 -0
  243. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/server/compat/legacy_context.py +0 -0
  244. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/server/criterion.py +0 -0
  245. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/server/fleet_event_log_interceptor.py +0 -0
  246. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/server/history.py +0 -0
  247. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/server/server.py +0 -0
  248. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/server/server_config.py +0 -0
  249. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/server/serverapp/__init__.py +0 -0
  250. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/server/serverapp_components.py +0 -0
  251. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/server/strategy/__init__.py +0 -0
  252. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/server/strategy/aggregate.py +0 -0
  253. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/server/strategy/bulyan.py +0 -0
  254. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
  255. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
  256. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
  257. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
  258. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
  259. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/server/strategy/fedadagrad.py +0 -0
  260. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/server/strategy/fedadam.py +0 -0
  261. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/server/strategy/fedavg.py +0 -0
  262. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/server/strategy/fedavg_android.py +0 -0
  263. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/server/strategy/fedavgm.py +0 -0
  264. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/server/strategy/fedmedian.py +0 -0
  265. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/server/strategy/fedopt.py +0 -0
  266. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/server/strategy/fedprox.py +0 -0
  267. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
  268. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
  269. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
  270. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
  271. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/server/strategy/fedyogi.py +0 -0
  272. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/server/strategy/krum.py +0 -0
  273. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/server/strategy/qfedavg.py +0 -0
  274. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/server/strategy/strategy.py +0 -0
  275. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/server/superlink/__init__.py +0 -0
  276. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/server/superlink/ffs/__init__.py +0 -0
  277. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/server/superlink/ffs/disk_ffs.py +0 -0
  278. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/server/superlink/ffs/ffs.py +0 -0
  279. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/server/superlink/ffs/ffs_factory.py +0 -0
  280. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/server/superlink/fleet/__init__.py +0 -0
  281. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/server/superlink/fleet/grpc_adapter/__init__.py +0 -0
  282. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +0 -0
  283. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
  284. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
  285. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
  286. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
  287. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +0 -0
  288. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
  289. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +0 -0
  290. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +0 -0
  291. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
  292. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/server/superlink/fleet/message_handler/message_handler.py +0 -0
  293. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
  294. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +0 -0
  295. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
  296. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
  297. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
  298. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +0 -0
  299. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/server/superlink/fleet/vce/vce_api.py +0 -0
  300. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/server/superlink/linkstate/__init__.py +0 -0
  301. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/server/superlink/linkstate/in_memory_linkstate.py +0 -0
  302. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/server/superlink/linkstate/linkstate.py +0 -0
  303. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/server/superlink/linkstate/linkstate_factory.py +0 -0
  304. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/server/superlink/linkstate/sqlite_linkstate.py +0 -0
  305. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/server/superlink/linkstate/utils.py +0 -0
  306. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/server/superlink/simulation/__init__.py +0 -0
  307. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/server/superlink/simulation/simulationio_grpc.py +0 -0
  308. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/server/superlink/simulation/simulationio_servicer.py +0 -0
  309. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/server/superlink/utils.py +0 -0
  310. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/server/utils/__init__.py +0 -0
  311. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/server/utils/tensorboard.py +0 -0
  312. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/server/utils/validator.py +0 -0
  313. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/server/workflow/__init__.py +0 -0
  314. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/server/workflow/constant.py +0 -0
  315. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
  316. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
  317. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/simulation/__init__.py +0 -0
  318. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/simulation/app.py +0 -0
  319. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/simulation/legacy_app.py +0 -0
  320. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/simulation/ray_transport/__init__.py +0 -0
  321. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
  322. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
  323. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/simulation/ray_transport/utils.py +0 -0
  324. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/simulation/simulationio_connection.py +0 -0
  325. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/superexec/__init__.py +0 -0
  326. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/superexec/app.py +0 -0
  327. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/superexec/deployment.py +0 -0
  328. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/superexec/exec_event_log_interceptor.py +0 -0
  329. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/superexec/exec_grpc.py +0 -0
  330. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/superexec/exec_servicer.py +0 -0
  331. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/superexec/exec_user_auth_interceptor.py +0 -0
  332. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/src/py/flwr/superexec/executor.py +0 -0
  333. {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250318}/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.dev20250318
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.dev20250318"
8
8
  description = "Flower: A Friendly Federated AI Framework"
9
9
  license = "Apache-2.0"
10
10
  authors = ["The Flower Authors <hello@flower.ai>"]
@@ -120,6 +120,9 @@ TIMESTAMP_HEADER = "flwr-timestamp"
120
120
  TIMESTAMP_TOLERANCE = 10 # General tolerance for timestamp verification
121
121
  SYSTEM_TIME_TOLERANCE = 5 # Allowance for system time drift
122
122
 
123
+ # Constants for ParametersRecord
124
+ GC_THRESHOLD = 200_000_000 # 200 MB
125
+
123
126
 
124
127
  class MessageType:
125
128
  """Message type."""
@@ -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,7 @@ 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
25
  from .history import History as History
26
26
  from .server import Server as Server
27
27
  from .server_app import ServerApp as ServerApp
@@ -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:"
@@ -25,7 +25,7 @@ from flwr.server.server import Server, init_defaults, run_fl
25
25
  from flwr.server.server_config import ServerConfig
26
26
  from flwr.server.strategy import Strategy
27
27
 
28
- from ..driver import Driver
28
+ from ..grid import Driver
29
29
  from .app_utils import start_update_client_manager_thread
30
30
 
31
31
 
@@ -20,8 +20,8 @@ import threading
20
20
  from flwr.common.typing import RunNotRunningException
21
21
 
22
22
  from ..client_manager import ClientManager
23
- from ..compat.driver_client_proxy import DriverClientProxy
24
- from ..driver import Driver
23
+ from ..grid import Driver
24
+ from .grid_client_proxy import DriverClientProxy
25
25
 
26
26
 
27
27
  def start_update_client_manager_thread(
@@ -1,4 +1,4 @@
1
- # Copyright 2024 Flower Labs GmbH. All Rights Reserved.
1
+ # Copyright 2025 Flower Labs GmbH. All Rights Reserved.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -22,7 +22,7 @@ from flwr.common import Message, MessageType, MessageTypeLegacy, RecordSet
22
22
  from flwr.common import recordset_compat as compat
23
23
  from flwr.server.client_proxy import ClientProxy
24
24
 
25
- from ..driver.driver import Driver
25
+ from ..grid.grid import Driver
26
26
 
27
27
 
28
28
  class DriverClientProxy(ClientProxy):