flwr-nightly 1.10.0.dev20240711__tar.gz → 1.10.0.dev20240713__tar.gz

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

Potentially problematic release.


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

Files changed (275) hide show
  1. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/PKG-INFO +1 -1
  2. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/pyproject.toml +1 -1
  3. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/cli/new/templates/app/code/client.hf.py.tpl +6 -2
  4. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/cli/new/templates/app/code/client.jax.py.tpl +2 -1
  5. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/cli/new/templates/app/code/client.mlx.py.tpl +5 -2
  6. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/cli/new/templates/app/code/client.numpy.py.tpl +2 -1
  7. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +5 -2
  8. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl +4 -2
  9. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +5 -2
  10. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/cli/new/templates/app/code/task.hf.py.tpl +2 -2
  11. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/cli/new/templates/app/code/task.mlx.py.tpl +2 -2
  12. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +1 -1
  13. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/client/app.py +39 -16
  14. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/client/client_app.py +28 -8
  15. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/client/grpc_adapter_client/connection.py +1 -1
  16. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/client/grpc_client/connection.py +1 -1
  17. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/client/grpc_rere_client/connection.py +3 -2
  18. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/client/message_handler/message_handler.py +1 -1
  19. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/client/node_state.py +10 -5
  20. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/client/node_state_tests.py +1 -1
  21. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/client/rest_client/connection.py +4 -3
  22. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/client/supernode/app.py +13 -7
  23. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/client/typing.py +2 -2
  24. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/common/config.py +3 -3
  25. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/common/constant.py +3 -0
  26. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/common/context.py +13 -9
  27. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/server/compat/legacy_context.py +1 -1
  28. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/server/run_serverapp.py +3 -1
  29. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +2 -1
  30. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/server/superlink/fleet/vce/vce_api.py +16 -3
  31. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/simulation/app.py +4 -3
  32. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/simulation/ray_transport/ray_client_proxy.py +22 -9
  33. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/superexec/app.py +3 -3
  34. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/LICENSE +0 -0
  35. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/README.md +0 -0
  36. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/__init__.py +0 -0
  37. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/cli/__init__.py +0 -0
  38. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/cli/app.py +0 -0
  39. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/cli/build.py +0 -0
  40. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/cli/config_utils.py +0 -0
  41. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/cli/example.py +0 -0
  42. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/cli/install.py +0 -0
  43. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/cli/new/__init__.py +0 -0
  44. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/cli/new/new.py +0 -0
  45. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/cli/new/templates/__init__.py +0 -0
  46. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/cli/new/templates/app/.gitignore.tpl +0 -0
  47. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/cli/new/templates/app/README.flowertune.md.tpl +0 -0
  48. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/cli/new/templates/app/README.md.tpl +0 -0
  49. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/cli/new/templates/app/__init__.py +0 -0
  50. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
  51. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
  52. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/cli/new/templates/app/code/flwr_tune/__init__.py +0 -0
  53. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/cli/new/templates/app/code/flwr_tune/app.py.tpl +0 -0
  54. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/cli/new/templates/app/code/flwr_tune/client.py.tpl +0 -0
  55. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/cli/new/templates/app/code/flwr_tune/config.yaml.tpl +0 -0
  56. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/cli/new/templates/app/code/flwr_tune/dataset.py.tpl +0 -0
  57. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/cli/new/templates/app/code/flwr_tune/models.py.tpl +0 -0
  58. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/cli/new/templates/app/code/flwr_tune/server.py.tpl +0 -0
  59. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/cli/new/templates/app/code/flwr_tune/static_config.yaml.tpl +0 -0
  60. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/cli/new/templates/app/code/server.hf.py.tpl +0 -0
  61. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/cli/new/templates/app/code/server.jax.py.tpl +0 -0
  62. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/cli/new/templates/app/code/server.mlx.py.tpl +0 -0
  63. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -0
  64. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -0
  65. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/cli/new/templates/app/code/server.sklearn.py.tpl +0 -0
  66. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -0
  67. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/cli/new/templates/app/code/task.jax.py.tpl +0 -0
  68. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/cli/new/templates/app/code/task.tensorflow.py.tpl +0 -0
  69. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +0 -0
  70. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/cli/new/templates/app/pyproject.hf.toml.tpl +0 -0
  71. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/cli/new/templates/app/pyproject.jax.toml.tpl +0 -0
  72. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +0 -0
  73. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +0 -0
  74. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +0 -0
  75. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +0 -0
  76. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +0 -0
  77. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/cli/run/__init__.py +0 -0
  78. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/cli/run/run.py +0 -0
  79. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/cli/utils.py +0 -0
  80. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/client/__init__.py +0 -0
  81. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/client/client.py +0 -0
  82. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/client/dpfedavg_numpy_client.py +0 -0
  83. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/client/grpc_adapter_client/__init__.py +0 -0
  84. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/client/grpc_client/__init__.py +0 -0
  85. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/client/grpc_rere_client/__init__.py +0 -0
  86. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/client/grpc_rere_client/client_interceptor.py +0 -0
  87. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/client/grpc_rere_client/grpc_adapter.py +0 -0
  88. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/client/heartbeat.py +0 -0
  89. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/client/message_handler/__init__.py +0 -0
  90. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/client/message_handler/task_handler.py +0 -0
  91. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/client/mod/__init__.py +0 -0
  92. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/client/mod/centraldp_mods.py +0 -0
  93. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/client/mod/comms_mods.py +0 -0
  94. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/client/mod/localdp_mod.py +0 -0
  95. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
  96. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
  97. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
  98. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/client/mod/utils.py +0 -0
  99. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/client/numpy_client.py +0 -0
  100. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/client/rest_client/__init__.py +0 -0
  101. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/client/supernode/__init__.py +0 -0
  102. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/common/__init__.py +0 -0
  103. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/common/address.py +0 -0
  104. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/common/date.py +0 -0
  105. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/common/differential_privacy.py +0 -0
  106. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/common/differential_privacy_constants.py +0 -0
  107. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/common/dp.py +0 -0
  108. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/common/exit_handlers.py +0 -0
  109. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/common/grpc.py +0 -0
  110. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/common/logger.py +0 -0
  111. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/common/message.py +0 -0
  112. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/common/object_ref.py +0 -0
  113. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/common/parameter.py +0 -0
  114. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/common/pyproject.py +0 -0
  115. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/common/record/__init__.py +0 -0
  116. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/common/record/configsrecord.py +0 -0
  117. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/common/record/conversion_utils.py +0 -0
  118. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/common/record/metricsrecord.py +0 -0
  119. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/common/record/parametersrecord.py +0 -0
  120. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/common/record/recordset.py +0 -0
  121. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/common/record/typeddict.py +0 -0
  122. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/common/recordset_compat.py +0 -0
  123. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/common/retry_invoker.py +0 -0
  124. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/common/secure_aggregation/__init__.py +0 -0
  125. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
  126. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
  127. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -0
  128. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
  129. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/common/secure_aggregation/quantization.py +0 -0
  130. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
  131. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
  132. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/common/serde.py +0 -0
  133. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/common/telemetry.py +0 -0
  134. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/common/typing.py +0 -0
  135. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/common/version.py +0 -0
  136. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/proto/__init__.py +0 -0
  137. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/proto/common_pb2.py +0 -0
  138. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/proto/common_pb2.pyi +0 -0
  139. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/proto/common_pb2_grpc.py +0 -0
  140. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/proto/common_pb2_grpc.pyi +0 -0
  141. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/proto/driver_pb2.py +0 -0
  142. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/proto/driver_pb2.pyi +0 -0
  143. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/proto/driver_pb2_grpc.py +0 -0
  144. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/proto/driver_pb2_grpc.pyi +0 -0
  145. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/proto/error_pb2.py +0 -0
  146. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/proto/error_pb2.pyi +0 -0
  147. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/proto/error_pb2_grpc.py +0 -0
  148. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/proto/error_pb2_grpc.pyi +0 -0
  149. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/proto/exec_pb2.py +0 -0
  150. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/proto/exec_pb2.pyi +0 -0
  151. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/proto/exec_pb2_grpc.py +0 -0
  152. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/proto/exec_pb2_grpc.pyi +0 -0
  153. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/proto/fab_pb2.py +0 -0
  154. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/proto/fab_pb2.pyi +0 -0
  155. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/proto/fab_pb2_grpc.py +0 -0
  156. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/proto/fab_pb2_grpc.pyi +0 -0
  157. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/proto/fleet_pb2.py +0 -0
  158. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/proto/fleet_pb2.pyi +0 -0
  159. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/proto/fleet_pb2_grpc.py +0 -0
  160. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
  161. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/proto/grpcadapter_pb2.py +0 -0
  162. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/proto/grpcadapter_pb2.pyi +0 -0
  163. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/proto/grpcadapter_pb2_grpc.py +0 -0
  164. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/proto/grpcadapter_pb2_grpc.pyi +0 -0
  165. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/proto/node_pb2.py +0 -0
  166. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/proto/node_pb2.pyi +0 -0
  167. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/proto/node_pb2_grpc.py +0 -0
  168. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/proto/node_pb2_grpc.pyi +0 -0
  169. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/proto/recordset_pb2.py +0 -0
  170. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/proto/recordset_pb2.pyi +0 -0
  171. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/proto/recordset_pb2_grpc.py +0 -0
  172. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/proto/recordset_pb2_grpc.pyi +0 -0
  173. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/proto/run_pb2.py +0 -0
  174. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/proto/run_pb2.pyi +0 -0
  175. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/proto/run_pb2_grpc.py +0 -0
  176. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/proto/run_pb2_grpc.pyi +0 -0
  177. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/proto/task_pb2.py +0 -0
  178. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/proto/task_pb2.pyi +0 -0
  179. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/proto/task_pb2_grpc.py +0 -0
  180. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/proto/task_pb2_grpc.pyi +0 -0
  181. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/proto/transport_pb2.py +0 -0
  182. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/proto/transport_pb2.pyi +0 -0
  183. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/proto/transport_pb2_grpc.py +0 -0
  184. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
  185. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/py.typed +0 -0
  186. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/server/__init__.py +0 -0
  187. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/server/app.py +0 -0
  188. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/server/client_manager.py +0 -0
  189. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/server/client_proxy.py +0 -0
  190. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/server/compat/__init__.py +0 -0
  191. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/server/compat/app.py +0 -0
  192. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/server/compat/app_utils.py +0 -0
  193. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/server/compat/driver_client_proxy.py +0 -0
  194. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/server/criterion.py +0 -0
  195. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/server/driver/__init__.py +0 -0
  196. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/server/driver/driver.py +0 -0
  197. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/server/driver/grpc_driver.py +0 -0
  198. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/server/driver/inmemory_driver.py +0 -0
  199. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/server/history.py +0 -0
  200. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/server/server.py +0 -0
  201. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/server/server_app.py +0 -0
  202. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/server/server_config.py +0 -0
  203. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/server/serverapp_components.py +0 -0
  204. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/server/strategy/__init__.py +0 -0
  205. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/server/strategy/aggregate.py +0 -0
  206. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/server/strategy/bulyan.py +0 -0
  207. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
  208. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
  209. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
  210. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
  211. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
  212. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/server/strategy/fedadagrad.py +0 -0
  213. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/server/strategy/fedadam.py +0 -0
  214. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/server/strategy/fedavg.py +0 -0
  215. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/server/strategy/fedavg_android.py +0 -0
  216. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/server/strategy/fedavgm.py +0 -0
  217. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/server/strategy/fedmedian.py +0 -0
  218. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/server/strategy/fedopt.py +0 -0
  219. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/server/strategy/fedprox.py +0 -0
  220. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
  221. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
  222. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
  223. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
  224. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/server/strategy/fedyogi.py +0 -0
  225. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/server/strategy/krum.py +0 -0
  226. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/server/strategy/qfedavg.py +0 -0
  227. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/server/strategy/strategy.py +0 -0
  228. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/server/superlink/__init__.py +0 -0
  229. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/server/superlink/driver/__init__.py +0 -0
  230. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/server/superlink/driver/driver_grpc.py +0 -0
  231. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/server/superlink/driver/driver_servicer.py +0 -0
  232. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/server/superlink/fleet/__init__.py +0 -0
  233. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/server/superlink/fleet/grpc_adapter/__init__.py +0 -0
  234. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +0 -0
  235. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
  236. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
  237. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
  238. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
  239. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +0 -0
  240. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
  241. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +0 -0
  242. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +0 -0
  243. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
  244. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/server/superlink/fleet/message_handler/message_handler.py +0 -0
  245. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
  246. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +0 -0
  247. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
  248. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
  249. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
  250. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/server/superlink/state/__init__.py +0 -0
  251. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/server/superlink/state/in_memory_state.py +0 -0
  252. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/server/superlink/state/sqlite_state.py +0 -0
  253. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/server/superlink/state/state.py +0 -0
  254. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/server/superlink/state/state_factory.py +0 -0
  255. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/server/superlink/state/utils.py +0 -0
  256. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/server/typing.py +0 -0
  257. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/server/utils/__init__.py +0 -0
  258. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/server/utils/tensorboard.py +0 -0
  259. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/server/utils/validator.py +0 -0
  260. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/server/workflow/__init__.py +0 -0
  261. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/server/workflow/constant.py +0 -0
  262. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/server/workflow/default_workflows.py +0 -0
  263. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
  264. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
  265. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +0 -0
  266. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/simulation/__init__.py +0 -0
  267. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/simulation/ray_transport/__init__.py +0 -0
  268. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
  269. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/simulation/ray_transport/utils.py +0 -0
  270. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/simulation/run_simulation.py +0 -0
  271. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/superexec/__init__.py +0 -0
  272. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/superexec/deployment.py +0 -0
  273. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/superexec/exec_grpc.py +0 -0
  274. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/superexec/exec_servicer.py +0 -0
  275. {flwr_nightly-1.10.0.dev20240711 → flwr_nightly-1.10.0.dev20240713}/src/py/flwr/superexec/executor.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: flwr-nightly
3
- Version: 1.10.0.dev20240711
3
+ Version: 1.10.0.dev20240713
4
4
  Summary: Flower: A Friendly Federated Learning Framework
5
5
  Home-page: https://flower.ai
6
6
  License: Apache-2.0
@@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api"
4
4
 
5
5
  [tool.poetry]
6
6
  name = "flwr-nightly"
7
- version = "1.10.0.dev20240711"
7
+ version = "1.10.0.dev20240713"
8
8
  description = "Flower: A Friendly Federated Learning Framework"
9
9
  license = "Apache-2.0"
10
10
  authors = ["The Flower Authors <hello@flower.ai>"]
@@ -1,6 +1,7 @@
1
1
  """$project_name: A Flower / HuggingFace Transformers app."""
2
2
 
3
3
  from flwr.client import ClientApp, NumPyClient
4
+ from flwr.common import Context
4
5
  from transformers import AutoModelForSequenceClassification
5
6
 
6
7
  from $import_name.task import (
@@ -38,12 +39,15 @@ class FlowerClient(NumPyClient):
38
39
  return float(loss), len(self.testloader), {"accuracy": accuracy}
39
40
 
40
41
 
41
- def client_fn(cid):
42
+ def client_fn(context: Context):
42
43
  # Load model and data
43
44
  net = AutoModelForSequenceClassification.from_pretrained(
44
45
  CHECKPOINT, num_labels=2
45
46
  ).to(DEVICE)
46
- trainloader, valloader = load_data(int(cid), 2)
47
+
48
+ partition_id = int(context.node_config['partition-id'])
49
+ num_partitions = int(context.node_config['num-partitions])
50
+ trainloader, valloader = load_data(partition_id, num_partitions)
47
51
 
48
52
  # Return Client instance
49
53
  return FlowerClient(net, trainloader, valloader).to_client()
@@ -2,6 +2,7 @@
2
2
 
3
3
  import jax
4
4
  from flwr.client import NumPyClient, ClientApp
5
+ from flwr.common import Context
5
6
 
6
7
  from $import_name.task import (
7
8
  evaluation,
@@ -44,7 +45,7 @@ class FlowerClient(NumPyClient):
44
45
  )
45
46
  return float(loss), num_examples, {"loss": float(loss)}
46
47
 
47
- def client_fn(cid):
48
+ def client_fn(context: Context):
48
49
  # Return Client instance
49
50
  return FlowerClient().to_client()
50
51
 
@@ -4,6 +4,7 @@ import mlx.core as mx
4
4
  import mlx.nn as nn
5
5
  import mlx.optimizers as optim
6
6
  from flwr.client import NumPyClient, ClientApp
7
+ from flwr.common import Context
7
8
 
8
9
  from $import_name.task import (
9
10
  batch_iterate,
@@ -57,8 +58,10 @@ class FlowerClient(NumPyClient):
57
58
  return loss.item(), len(self.test_images), {"accuracy": accuracy.item()}
58
59
 
59
60
 
60
- def client_fn(cid):
61
- data = load_data(int(cid), 2)
61
+ def client_fn(context: Context):
62
+ partition_id = int(context.node_config["partition-id"])
63
+ num_partitions = int(context.node_config["num-partitions"])
64
+ data = load_data(partition_id, num_partitions)
62
65
 
63
66
  # Return Client instance
64
67
  return FlowerClient(data).to_client()
@@ -1,6 +1,7 @@
1
1
  """$project_name: A Flower / NumPy app."""
2
2
 
3
3
  from flwr.client import NumPyClient, ClientApp
4
+ from flwr.common import Context
4
5
  import numpy as np
5
6
 
6
7
 
@@ -15,7 +16,7 @@ class FlowerClient(NumPyClient):
15
16
  return float(0.0), 1, {"accuracy": float(1.0)}
16
17
 
17
18
 
18
- def client_fn(cid: str):
19
+ def client_fn(context: Context):
19
20
  return FlowerClient().to_client()
20
21
 
21
22
 
@@ -1,6 +1,7 @@
1
1
  """$project_name: A Flower / PyTorch app."""
2
2
 
3
3
  from flwr.client import NumPyClient, ClientApp
4
+ from flwr.common import Context
4
5
 
5
6
  from $import_name.task import (
6
7
  Net,
@@ -31,10 +32,12 @@ class FlowerClient(NumPyClient):
31
32
  return loss, len(self.valloader.dataset), {"accuracy": accuracy}
32
33
 
33
34
 
34
- def client_fn(cid):
35
+ def client_fn(context: Context):
35
36
  # Load model and data
36
37
  net = Net().to(DEVICE)
37
- trainloader, valloader = load_data(int(cid), 2)
38
+ partition_id = int(context.node_config["partition-id"])
39
+ num_partitions = int(context.node_config["num-partitions"])
40
+ trainloader, valloader = load_data(partition_id, num_partitions)
38
41
 
39
42
  # Return Client instance
40
43
  return FlowerClient(net, trainloader, valloader).to_client()
@@ -4,6 +4,7 @@ import warnings
4
4
 
5
5
  import numpy as np
6
6
  from flwr.client import NumPyClient, ClientApp
7
+ from flwr.common import Context
7
8
  from flwr_datasets import FederatedDataset
8
9
  from sklearn.linear_model import LogisticRegression
9
10
  from sklearn.metrics import log_loss
@@ -68,8 +69,9 @@ class FlowerClient(NumPyClient):
68
69
 
69
70
  fds = FederatedDataset(dataset="mnist", partitioners={"train": 2})
70
71
 
71
- def client_fn(cid: str):
72
- dataset = fds.load_partition(int(cid), "train").with_format("numpy")
72
+ def client_fn(context: Context):
73
+ partition_id = int(context.node_config["partition-id"])
74
+ dataset = fds.load_partition(partition_id, "train").with_format("numpy")
73
75
 
74
76
  X, y = dataset["image"].reshape((len(dataset), -1)), dataset["label"]
75
77
 
@@ -1,6 +1,7 @@
1
1
  """$project_name: A Flower / TensorFlow app."""
2
2
 
3
3
  from flwr.client import NumPyClient, ClientApp
4
+ from flwr.common import Context
4
5
 
5
6
  from $import_name.task import load_data, load_model
6
7
 
@@ -28,10 +29,12 @@ class FlowerClient(NumPyClient):
28
29
  return loss, len(self.x_test), {"accuracy": accuracy}
29
30
 
30
31
 
31
- def client_fn(cid):
32
+ def client_fn(context: Context):
32
33
  # Load model and data
33
34
  net = load_model()
34
- x_train, y_train, x_test, y_test = load_data(int(cid), 2)
35
+
36
+ partition_id = int(context.node_config["partition-id"])
37
+ x_train, y_train, x_test, y_test = load_data(partition_id, 2)
35
38
 
36
39
  # Return Client instance
37
40
  return FlowerClient(net, x_train, y_train, x_test, y_test).to_client()
@@ -16,9 +16,9 @@ DEVICE = torch.device("cpu")
16
16
  CHECKPOINT = "distilbert-base-uncased" # transformer model checkpoint
17
17
 
18
18
 
19
- def load_data(partition_id, num_clients):
19
+ def load_data(partition_id: int, num_partitions: int):
20
20
  """Load IMDB data (training and eval)"""
21
- fds = FederatedDataset(dataset="imdb", partitioners={"train": num_clients})
21
+ fds = FederatedDataset(dataset="imdb", partitioners={"train": num_partitions})
22
22
  partition = fds.load_partition(partition_id)
23
23
  # Divide data: 80% train, 20% test
24
24
  partition_train_test = partition.train_test_split(test_size=0.2, seed=42)
@@ -43,8 +43,8 @@ def batch_iterate(batch_size, X, y):
43
43
  yield X[ids], y[ids]
44
44
 
45
45
 
46
- def load_data(partition_id, num_clients):
47
- fds = FederatedDataset(dataset="mnist", partitioners={"train": num_clients})
46
+ def load_data(partition_id: int, num_partitions: int):
47
+ fds = FederatedDataset(dataset="mnist", partitioners={"train": num_partitions})
48
48
  partition = fds.load_partition(partition_id)
49
49
  partition_splits = partition.train_test_split(test_size=0.2, seed=42)
50
50
 
@@ -34,7 +34,7 @@ class Net(nn.Module):
34
34
  return self.fc3(x)
35
35
 
36
36
 
37
- def load_data(partition_id, num_partitions):
37
+ def load_data(partition_id: int, num_partitions: int):
38
38
  """Load partition CIFAR10 data."""
39
39
  fds = FederatedDataset(dataset="cifar10", partitioners={"train": num_partitions})
40
40
  partition = fds.load_partition(partition_id)
@@ -18,7 +18,7 @@ import signal
18
18
  import sys
19
19
  import time
20
20
  from dataclasses import dataclass
21
- from logging import DEBUG, ERROR, INFO, WARN
21
+ from logging import ERROR, INFO, WARN
22
22
  from pathlib import Path
23
23
  from typing import Callable, ContextManager, Dict, Optional, Tuple, Type, Union
24
24
 
@@ -28,7 +28,7 @@ from grpc import RpcError
28
28
  from flwr.client.client import Client
29
29
  from flwr.client.client_app import ClientApp, LoadClientAppError
30
30
  from flwr.client.typing import ClientFnExt
31
- from flwr.common import GRPC_MAX_MESSAGE_LENGTH, EventType, Message, event
31
+ from flwr.common import GRPC_MAX_MESSAGE_LENGTH, Context, EventType, Message, event
32
32
  from flwr.common.address import parse_address
33
33
  from flwr.common.constant import (
34
34
  MISSING_EXTRA_REST,
@@ -138,8 +138,8 @@ def start_client(
138
138
 
139
139
  Starting an SSL-enabled gRPC client using system certificates:
140
140
 
141
- >>> def client_fn(node_id: int, partition_id: Optional[int]):
142
- >>> return FlowerClient()
141
+ >>> def client_fn(context: Context):
142
+ >>> return FlowerClient().to_client()
143
143
  >>>
144
144
  >>> start_client(
145
145
  >>> server_address=localhost:8080,
@@ -160,6 +160,7 @@ def start_client(
160
160
  event(EventType.START_CLIENT_ENTER)
161
161
  _start_client_internal(
162
162
  server_address=server_address,
163
+ node_config={},
163
164
  load_client_app_fn=None,
164
165
  client_fn=client_fn,
165
166
  client=client,
@@ -181,6 +182,7 @@ def start_client(
181
182
  def _start_client_internal(
182
183
  *,
183
184
  server_address: str,
185
+ node_config: Dict[str, str],
184
186
  load_client_app_fn: Optional[Callable[[str, str], ClientApp]] = None,
185
187
  client_fn: Optional[ClientFnExt] = None,
186
188
  client: Optional[Client] = None,
@@ -193,7 +195,6 @@ def _start_client_internal(
193
195
  ] = None,
194
196
  max_retries: Optional[int] = None,
195
197
  max_wait_time: Optional[float] = None,
196
- partition_id: Optional[int] = None,
197
198
  flwr_dir: Optional[Path] = None,
198
199
  ) -> None:
199
200
  """Start a Flower client node which connects to a Flower server.
@@ -204,6 +205,8 @@ def _start_client_internal(
204
205
  The IPv4 or IPv6 address of the server. If the Flower
205
206
  server runs on the same machine on port 8080, then `server_address`
206
207
  would be `"[::]:8080"`.
208
+ node_config: Dict[str, str]
209
+ The configuration of the node.
207
210
  load_client_app_fn : Optional[Callable[[], ClientApp]] (default: None)
208
211
  A function that can be used to load a `ClientApp` instance.
209
212
  client_fn : Optional[ClientFnExt]
@@ -238,9 +241,6 @@ def _start_client_internal(
238
241
  The maximum duration before the client stops trying to
239
242
  connect to the server in case of connection error.
240
243
  If set to None, there is no limit to the total time.
241
- partition_id: Optional[int] (default: None)
242
- The data partition index associated with this node. Better suited for
243
- prototyping purposes.
244
244
  flwr_dir: Optional[Path] (default: None)
245
245
  The fully resolved path containing installed Flower Apps.
246
246
  """
@@ -253,8 +253,7 @@ def _start_client_internal(
253
253
  if client_fn is None:
254
254
  # Wrap `Client` instance in `client_fn`
255
255
  def single_client_factory(
256
- node_id: int, # pylint: disable=unused-argument
257
- partition_id: Optional[int], # pylint: disable=unused-argument
256
+ context: Context, # pylint: disable=unused-argument
258
257
  ) -> Client:
259
258
  if client is None: # Added this to keep mypy happy
260
259
  raise ValueError(
@@ -295,7 +294,7 @@ def _start_client_internal(
295
294
  log(WARN, "Connection attempt failed, retrying...")
296
295
  else:
297
296
  log(
298
- DEBUG,
297
+ WARN,
299
298
  "Connection attempt failed, retrying in %.2f seconds",
300
299
  retry_state.actual_wait,
301
300
  )
@@ -319,7 +318,9 @@ def _start_client_internal(
319
318
  on_backoff=_on_backoff,
320
319
  )
321
320
 
322
- node_state = NodeState(partition_id=partition_id)
321
+ # NodeState gets initialized when the first connection is established
322
+ node_state: Optional[NodeState] = None
323
+
323
324
  runs: Dict[int, Run] = {}
324
325
 
325
326
  while not app_state_tracker.interrupt:
@@ -334,9 +335,31 @@ def _start_client_internal(
334
335
  ) as conn:
335
336
  receive, send, create_node, delete_node, get_run = conn
336
337
 
337
- # Register node
338
- if create_node is not None:
339
- create_node() # pylint: disable=not-callable
338
+ # Register node when connecting the first time
339
+ if node_state is None:
340
+ if create_node is None:
341
+ if transport not in ["grpc-bidi", None]:
342
+ raise NotImplementedError(
343
+ "All transports except `grpc-bidi` require "
344
+ "an implementation for `create_node()`.'"
345
+ )
346
+ # gRPC-bidi doesn't have the concept of node_id,
347
+ # so we set it to -1
348
+ node_state = NodeState(
349
+ node_id=-1,
350
+ node_config={},
351
+ )
352
+ else:
353
+ # Call create_node fn to register node
354
+ node_id: Optional[int] = ( # pylint: disable=assignment-from-none
355
+ create_node()
356
+ ) # pylint: disable=not-callable
357
+ if node_id is None:
358
+ raise ValueError("Node registration failed")
359
+ node_state = NodeState(
360
+ node_id=node_id,
361
+ node_config=node_config,
362
+ )
340
363
 
341
364
  app_state_tracker.register_signal_handler()
342
365
  while not app_state_tracker.interrupt:
@@ -580,7 +603,7 @@ def _init_connection(transport: Optional[str], server_address: str) -> Tuple[
580
603
  Tuple[
581
604
  Callable[[], Optional[Message]],
582
605
  Callable[[Message], None],
583
- Optional[Callable[[], None]],
606
+ Optional[Callable[[], Optional[int]]],
584
607
  Optional[Callable[[], None]],
585
608
  Optional[Callable[[int], Run]],
586
609
  ]
@@ -30,21 +30,41 @@ from flwr.common.logger import warn_deprecated_feature, warn_preview_feature
30
30
  from .typing import ClientAppCallable
31
31
 
32
32
 
33
+ def _alert_erroneous_client_fn() -> None:
34
+ raise ValueError(
35
+ "A `ClientApp` cannot make use of a `client_fn` that does "
36
+ "not have a signature in the form: `def client_fn(context: "
37
+ "Context)`. You can import the `Context` like this: "
38
+ "`from flwr.common import Context`"
39
+ )
40
+
41
+
33
42
  def _inspect_maybe_adapt_client_fn_signature(client_fn: ClientFnExt) -> ClientFnExt:
34
43
  client_fn_args = inspect.signature(client_fn).parameters
44
+ first_arg = list(client_fn_args.keys())[0]
45
+
46
+ if len(client_fn_args) != 1:
47
+ _alert_erroneous_client_fn()
48
+
49
+ first_arg_type = client_fn_args[first_arg].annotation
35
50
 
36
- if not all(key in client_fn_args for key in ["node_id", "partition_id"]):
51
+ if first_arg_type is str or first_arg == "cid":
52
+ # Warn previous signature for `client_fn` seems to be used
37
53
  warn_deprecated_feature(
38
- "`client_fn` now expects a signature `def client_fn(node_id: int, "
39
- "partition_id: Optional[int])`.\nYou provided `client_fn` with signature: "
40
- f"{dict(client_fn_args.items())}"
54
+ "`client_fn` now expects a signature `def client_fn(context: Context)`."
55
+ "The provided `client_fn` has signature: "
56
+ f"{dict(client_fn_args.items())}. You can import the `Context` like this:"
57
+ " `from flwr.common import Context`"
41
58
  )
42
59
 
43
60
  # Wrap depcreated client_fn inside a function with the expected signature
44
61
  def adaptor_fn(
45
- node_id: int, partition_id: Optional[int] # pylint: disable=unused-argument
46
- ) -> Client:
47
- return client_fn(str(partition_id)) # type: ignore
62
+ context: Context,
63
+ ) -> Client: # pylint: disable=unused-argument
64
+ # if patition-id is defined, pass it. Else pass node_id that should
65
+ # always be defined during Context init.
66
+ cid = context.node_config.get("partition-id", context.node_id)
67
+ return client_fn(str(cid)) # type: ignore
48
68
 
49
69
  return adaptor_fn
50
70
 
@@ -71,7 +91,7 @@ class ClientApp:
71
91
  >>> class FlowerClient(NumPyClient):
72
92
  >>> # ...
73
93
  >>>
74
- >>> def client_fn(node_id: int, partition_id: Optional[int]):
94
+ >>> def client_fn(context: Context):
75
95
  >>> return FlowerClient().to_client()
76
96
  >>>
77
97
  >>> app = ClientApp(client_fn)
@@ -44,7 +44,7 @@ def grpc_adapter( # pylint: disable=R0913
44
44
  Tuple[
45
45
  Callable[[], Optional[Message]],
46
46
  Callable[[Message], None],
47
- Optional[Callable[[], None]],
47
+ Optional[Callable[[], Optional[int]]],
48
48
  Optional[Callable[[], None]],
49
49
  Optional[Callable[[int], Run]],
50
50
  ]
@@ -72,7 +72,7 @@ def grpc_connection( # pylint: disable=R0913, R0915
72
72
  Tuple[
73
73
  Callable[[], Optional[Message]],
74
74
  Callable[[Message], None],
75
- Optional[Callable[[], None]],
75
+ Optional[Callable[[], Optional[int]]],
76
76
  Optional[Callable[[], None]],
77
77
  Optional[Callable[[int], Run]],
78
78
  ]
@@ -79,7 +79,7 @@ def grpc_request_response( # pylint: disable=R0913, R0914, R0915
79
79
  Tuple[
80
80
  Callable[[], Optional[Message]],
81
81
  Callable[[Message], None],
82
- Optional[Callable[[], None]],
82
+ Optional[Callable[[], Optional[int]]],
83
83
  Optional[Callable[[], None]],
84
84
  Optional[Callable[[int], Run]],
85
85
  ]
@@ -176,7 +176,7 @@ def grpc_request_response( # pylint: disable=R0913, R0914, R0915
176
176
  if not ping_stop_event.is_set():
177
177
  ping_stop_event.wait(next_interval)
178
178
 
179
- def create_node() -> None:
179
+ def create_node() -> Optional[int]:
180
180
  """Set create_node."""
181
181
  # Call FleetAPI
182
182
  create_node_request = CreateNodeRequest(ping_interval=PING_DEFAULT_INTERVAL)
@@ -189,6 +189,7 @@ def grpc_request_response( # pylint: disable=R0913, R0914, R0915
189
189
  nonlocal node, ping_thread
190
190
  node = cast(Node, create_node_response.node)
191
191
  ping_thread = start_ping_loop(ping, ping_stop_event)
192
+ return node.node_id
192
193
 
193
194
  def delete_node() -> None:
194
195
  """Set delete_node."""
@@ -92,7 +92,7 @@ def handle_legacy_message_from_msgtype(
92
92
  client_fn: ClientFnExt, message: Message, context: Context
93
93
  ) -> Message:
94
94
  """Handle legacy message in the inner most mod."""
95
- client = client_fn(message.metadata.dst_node_id, context.partition_id)
95
+ client = client_fn(context)
96
96
 
97
97
  # Check if NumPyClient is returend
98
98
  if isinstance(client, NumPyClient):
@@ -17,7 +17,7 @@
17
17
 
18
18
  from dataclasses import dataclass
19
19
  from pathlib import Path
20
- from typing import Any, Dict, Optional
20
+ from typing import Dict, Optional
21
21
 
22
22
  from flwr.common import Context, RecordSet
23
23
  from flwr.common.config import get_fused_config
@@ -35,10 +35,14 @@ class RunInfo:
35
35
  class NodeState:
36
36
  """State of a node where client nodes execute runs."""
37
37
 
38
- def __init__(self, partition_id: Optional[int]) -> None:
39
- self._meta: Dict[str, Any] = {} # holds metadata about the node
38
+ def __init__(
39
+ self,
40
+ node_id: int,
41
+ node_config: Dict[str, str],
42
+ ) -> None:
43
+ self.node_id = node_id
44
+ self.node_config = node_config
40
45
  self.run_infos: Dict[int, RunInfo] = {}
41
- self._partition_id = partition_id
42
46
 
43
47
  def register_context(
44
48
  self,
@@ -52,9 +56,10 @@ class NodeState:
52
56
  self.run_infos[run_id] = RunInfo(
53
57
  initial_run_config=initial_run_config,
54
58
  context=Context(
59
+ node_id=self.node_id,
60
+ node_config=self.node_config,
55
61
  state=RecordSet(),
56
62
  run_config=initial_run_config.copy(),
57
- partition_id=self._partition_id,
58
63
  ),
59
64
  )
60
65
 
@@ -41,7 +41,7 @@ def test_multirun_in_node_state() -> None:
41
41
  expected_values = {0: "1", 1: "1" * 3, 2: "1" * 2, 3: "1", 5: "1"}
42
42
 
43
43
  # NodeState
44
- node_state = NodeState(partition_id=None)
44
+ node_state = NodeState(node_id=0, node_config={})
45
45
 
46
46
  for task in tasks:
47
47
  run_id = task.run_id
@@ -90,7 +90,7 @@ def http_request_response( # pylint: disable=,R0913, R0914, R0915
90
90
  Tuple[
91
91
  Callable[[], Optional[Message]],
92
92
  Callable[[Message], None],
93
- Optional[Callable[[], None]],
93
+ Optional[Callable[[], Optional[int]]],
94
94
  Optional[Callable[[], None]],
95
95
  Optional[Callable[[int], Run]],
96
96
  ]
@@ -237,19 +237,20 @@ def http_request_response( # pylint: disable=,R0913, R0914, R0915
237
237
  if not ping_stop_event.is_set():
238
238
  ping_stop_event.wait(next_interval)
239
239
 
240
- def create_node() -> None:
240
+ def create_node() -> Optional[int]:
241
241
  """Set create_node."""
242
242
  req = CreateNodeRequest(ping_interval=PING_DEFAULT_INTERVAL)
243
243
 
244
244
  # Send the request
245
245
  res = _request(req, CreateNodeResponse, PATH_CREATE_NODE)
246
246
  if res is None:
247
- return
247
+ return None
248
248
 
249
249
  # Remember the node and the ping-loop thread
250
250
  nonlocal node, ping_thread
251
251
  node = res.node
252
252
  ping_thread = start_ping_loop(ping, ping_stop_event)
253
+ return node.node_id
253
254
 
254
255
  def delete_node() -> None:
255
256
  """Set delete_node."""
@@ -29,7 +29,12 @@ from cryptography.hazmat.primitives.serialization import (
29
29
 
30
30
  from flwr.client.client_app import ClientApp, LoadClientAppError
31
31
  from flwr.common import EventType, event
32
- from flwr.common.config import get_flwr_dir, get_project_config, get_project_dir
32
+ from flwr.common.config import (
33
+ get_flwr_dir,
34
+ get_project_config,
35
+ get_project_dir,
36
+ parse_config_args,
37
+ )
33
38
  from flwr.common.constant import (
34
39
  TRANSPORT_TYPE_GRPC_ADAPTER,
35
40
  TRANSPORT_TYPE_GRPC_RERE,
@@ -67,7 +72,7 @@ def run_supernode() -> None:
67
72
  authentication_keys=authentication_keys,
68
73
  max_retries=args.max_retries,
69
74
  max_wait_time=args.max_wait_time,
70
- partition_id=args.partition_id,
75
+ node_config=parse_config_args(args.node_config),
71
76
  flwr_dir=get_flwr_dir(args.flwr_dir),
72
77
  )
73
78
 
@@ -93,6 +98,7 @@ def run_client_app() -> None:
93
98
 
94
99
  _start_client_internal(
95
100
  server_address=args.superlink,
101
+ node_config=parse_config_args(args.node_config),
96
102
  load_client_app_fn=load_fn,
97
103
  transport=args.transport,
98
104
  root_certificates=root_certificates,
@@ -389,11 +395,11 @@ def _parse_args_common(parser: argparse.ArgumentParser) -> None:
389
395
  help="The SuperNode's public key (as a path str) to enable authentication.",
390
396
  )
391
397
  parser.add_argument(
392
- "--partition-id",
393
- type=int,
394
- help="The data partition index associated with this SuperNode. Better suited "
395
- "for prototyping purposes where a SuperNode might only load a fraction of an "
396
- "artificially partitioned dataset (e.g. using `flwr-datasets`)",
398
+ "--node-config",
399
+ type=str,
400
+ help="A comma separated list of key/value pairs (separated by `=`) to "
401
+ "configure the SuperNode. "
402
+ "E.g. --node-config 'key1=\"value1\",partition-id=0,num-partitions=100'",
397
403
  )
398
404
 
399
405
 
@@ -15,7 +15,7 @@
15
15
  """Custom types for Flower clients."""
16
16
 
17
17
 
18
- from typing import Callable, Optional
18
+ from typing import Callable
19
19
 
20
20
  from flwr.common import Context, Message
21
21
 
@@ -23,7 +23,7 @@ from .client import Client as Client
23
23
 
24
24
  # Compatibility
25
25
  ClientFn = Callable[[str], Client]
26
- ClientFnExt = Callable[[int, Optional[int]], Client]
26
+ ClientFnExt = Callable[[Context], Client]
27
27
 
28
28
  ClientAppCallable = Callable[[Message, Context], Message]
29
29
  Mod = Callable[[Message, Context, ClientAppCallable], Message]
@@ -121,16 +121,16 @@ def flatten_dict(raw_dict: Dict[str, Any], parent_key: str = "") -> Dict[str, st
121
121
 
122
122
 
123
123
  def parse_config_args(
124
- config_overrides: Optional[str],
124
+ config: Optional[str],
125
125
  separator: str = ",",
126
126
  ) -> Dict[str, str]:
127
127
  """Parse separator separated list of key-value pairs separated by '='."""
128
128
  overrides: Dict[str, str] = {}
129
129
 
130
- if config_overrides is None:
130
+ if config is None:
131
131
  return overrides
132
132
 
133
- overrides_list = config_overrides.split(separator)
133
+ overrides_list = config.split(separator)
134
134
  if (
135
135
  len(overrides_list) == 1
136
136
  and "=" not in overrides_list
@@ -57,6 +57,9 @@ APP_DIR = "apps"
57
57
  FAB_CONFIG_FILE = "pyproject.toml"
58
58
  FLWR_HOME = "FLWR_HOME"
59
59
 
60
+ # Constants entries in Node config for Simulation
61
+ PARTITION_ID_KEY = "partition-id"
62
+ NUM_PARTITIONS_KEY = "num-partitions"
60
63
 
61
64
  GRPC_ADAPTER_METADATA_FLOWER_VERSION_KEY = "flower-version"
62
65
  GRPC_ADAPTER_METADATA_SHOULD_EXIT_KEY = "should-exit"