flwr-nightly 1.15.0.dev20250114__tar.gz → 1.15.0.dev20250115__tar.gz

Sign up to get free protection for your applications and to get access to all the features.
Files changed (327) hide show
  1. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/PKG-INFO +1 -1
  2. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/pyproject.toml +1 -1
  3. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/common/constant.py +3 -0
  4. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/common/logger.py +1 -1
  5. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/common/serde.py +6 -4
  6. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/proto/node_pb2.py +2 -2
  7. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/proto/node_pb2.pyi +1 -4
  8. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/compat/app_utils.py +0 -1
  9. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/compat/driver_client_proxy.py +1 -2
  10. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/driver/grpc_driver.py +5 -2
  11. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/driver/inmemory_driver.py +2 -1
  12. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/superlink/driver/serverappio_servicer.py +1 -3
  13. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +2 -2
  14. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/superlink/fleet/message_handler/message_handler.py +4 -5
  15. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/superlink/linkstate/in_memory_linkstate.py +14 -26
  16. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/superlink/linkstate/linkstate.py +5 -18
  17. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/superlink/linkstate/sqlite_linkstate.py +30 -70
  18. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/superlink/linkstate/utils.py +18 -8
  19. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/utils/validator.py +9 -34
  20. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/simulation/legacy_app.py +4 -2
  21. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/LICENSE +0 -0
  22. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/README.md +0 -0
  23. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/__init__.py +0 -0
  24. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/cli/__init__.py +0 -0
  25. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/cli/app.py +0 -0
  26. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/cli/build.py +0 -0
  27. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/cli/cli_user_auth_interceptor.py +0 -0
  28. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/cli/config_utils.py +0 -0
  29. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/cli/example.py +0 -0
  30. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/cli/install.py +0 -0
  31. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/cli/log.py +0 -0
  32. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/cli/login/__init__.py +0 -0
  33. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/cli/login/login.py +0 -0
  34. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/cli/ls.py +0 -0
  35. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/cli/new/__init__.py +0 -0
  36. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/cli/new/new.py +0 -0
  37. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/cli/new/templates/__init__.py +0 -0
  38. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/cli/new/templates/app/.gitignore.tpl +0 -0
  39. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/cli/new/templates/app/LICENSE.tpl +0 -0
  40. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/cli/new/templates/app/README.baseline.md.tpl +0 -0
  41. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/cli/new/templates/app/README.flowertune.md.tpl +0 -0
  42. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/cli/new/templates/app/README.md.tpl +0 -0
  43. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/cli/new/templates/app/__init__.py +0 -0
  44. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/cli/new/templates/app/code/__init__.baseline.py.tpl +0 -0
  45. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
  46. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
  47. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/cli/new/templates/app/code/client.baseline.py.tpl +0 -0
  48. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/cli/new/templates/app/code/client.huggingface.py.tpl +0 -0
  49. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/cli/new/templates/app/code/client.jax.py.tpl +0 -0
  50. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/cli/new/templates/app/code/client.mlx.py.tpl +0 -0
  51. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/cli/new/templates/app/code/client.numpy.py.tpl +0 -0
  52. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -0
  53. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl +0 -0
  54. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -0
  55. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/cli/new/templates/app/code/dataset.baseline.py.tpl +0 -0
  56. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/cli/new/templates/app/code/flwr_tune/__init__.py +0 -0
  57. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/cli/new/templates/app/code/flwr_tune/client_app.py.tpl +0 -0
  58. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/cli/new/templates/app/code/flwr_tune/dataset.py.tpl +0 -0
  59. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/cli/new/templates/app/code/flwr_tune/models.py.tpl +0 -0
  60. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/cli/new/templates/app/code/flwr_tune/server_app.py.tpl +0 -0
  61. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/cli/new/templates/app/code/flwr_tune/strategy.py.tpl +0 -0
  62. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/cli/new/templates/app/code/model.baseline.py.tpl +0 -0
  63. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/cli/new/templates/app/code/server.baseline.py.tpl +0 -0
  64. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/cli/new/templates/app/code/server.huggingface.py.tpl +0 -0
  65. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/cli/new/templates/app/code/server.jax.py.tpl +0 -0
  66. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/cli/new/templates/app/code/server.mlx.py.tpl +0 -0
  67. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -0
  68. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -0
  69. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/cli/new/templates/app/code/server.sklearn.py.tpl +0 -0
  70. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -0
  71. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/cli/new/templates/app/code/strategy.baseline.py.tpl +0 -0
  72. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/cli/new/templates/app/code/task.huggingface.py.tpl +0 -0
  73. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/cli/new/templates/app/code/task.jax.py.tpl +0 -0
  74. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/cli/new/templates/app/code/task.mlx.py.tpl +0 -0
  75. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/cli/new/templates/app/code/task.numpy.py.tpl +0 -0
  76. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +0 -0
  77. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/cli/new/templates/app/code/task.sklearn.py.tpl +0 -0
  78. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/cli/new/templates/app/code/task.tensorflow.py.tpl +0 -0
  79. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/cli/new/templates/app/code/utils.baseline.py.tpl +0 -0
  80. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/cli/new/templates/app/pyproject.baseline.toml.tpl +0 -0
  81. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +0 -0
  82. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl +0 -0
  83. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/cli/new/templates/app/pyproject.jax.toml.tpl +0 -0
  84. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +0 -0
  85. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +0 -0
  86. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +0 -0
  87. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +0 -0
  88. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +0 -0
  89. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/cli/run/__init__.py +0 -0
  90. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/cli/run/run.py +0 -0
  91. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/cli/stop.py +0 -0
  92. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/cli/utils.py +0 -0
  93. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/client/__init__.py +0 -0
  94. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/client/app.py +0 -0
  95. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/client/client.py +0 -0
  96. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/client/client_app.py +0 -0
  97. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/client/clientapp/__init__.py +0 -0
  98. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/client/clientapp/app.py +0 -0
  99. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/client/clientapp/clientappio_servicer.py +0 -0
  100. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/client/clientapp/utils.py +0 -0
  101. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/client/dpfedavg_numpy_client.py +0 -0
  102. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/client/grpc_adapter_client/__init__.py +0 -0
  103. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/client/grpc_adapter_client/connection.py +0 -0
  104. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/client/grpc_client/__init__.py +0 -0
  105. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/client/grpc_client/connection.py +0 -0
  106. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/client/grpc_rere_client/__init__.py +0 -0
  107. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/client/grpc_rere_client/client_interceptor.py +0 -0
  108. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/client/grpc_rere_client/connection.py +0 -0
  109. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/client/grpc_rere_client/grpc_adapter.py +0 -0
  110. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/client/heartbeat.py +0 -0
  111. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/client/message_handler/__init__.py +0 -0
  112. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/client/message_handler/message_handler.py +0 -0
  113. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/client/message_handler/task_handler.py +0 -0
  114. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/client/mod/__init__.py +0 -0
  115. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/client/mod/centraldp_mods.py +0 -0
  116. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/client/mod/comms_mods.py +0 -0
  117. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/client/mod/localdp_mod.py +0 -0
  118. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
  119. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
  120. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
  121. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/client/mod/utils.py +0 -0
  122. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/client/nodestate/__init__.py +0 -0
  123. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/client/nodestate/in_memory_nodestate.py +0 -0
  124. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/client/nodestate/nodestate.py +0 -0
  125. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/client/nodestate/nodestate_factory.py +0 -0
  126. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/client/numpy_client.py +0 -0
  127. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/client/rest_client/__init__.py +0 -0
  128. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/client/rest_client/connection.py +0 -0
  129. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/client/run_info_store.py +0 -0
  130. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/client/supernode/__init__.py +0 -0
  131. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/client/supernode/app.py +0 -0
  132. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/client/typing.py +0 -0
  133. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/common/__init__.py +0 -0
  134. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/common/address.py +0 -0
  135. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/common/args.py +0 -0
  136. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/common/auth_plugin/__init__.py +0 -0
  137. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/common/auth_plugin/auth_plugin.py +0 -0
  138. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/common/config.py +0 -0
  139. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/common/context.py +0 -0
  140. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/common/date.py +0 -0
  141. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/common/differential_privacy.py +0 -0
  142. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/common/differential_privacy_constants.py +0 -0
  143. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/common/dp.py +0 -0
  144. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/common/exit_handlers.py +0 -0
  145. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/common/grpc.py +0 -0
  146. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/common/message.py +0 -0
  147. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/common/object_ref.py +0 -0
  148. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/common/parameter.py +0 -0
  149. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/common/pyproject.py +0 -0
  150. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/common/record/__init__.py +0 -0
  151. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/common/record/configsrecord.py +0 -0
  152. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/common/record/conversion_utils.py +0 -0
  153. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/common/record/metricsrecord.py +0 -0
  154. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/common/record/parametersrecord.py +0 -0
  155. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/common/record/recordset.py +0 -0
  156. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/common/record/typeddict.py +0 -0
  157. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/common/recordset_compat.py +0 -0
  158. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/common/retry_invoker.py +0 -0
  159. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/common/secure_aggregation/__init__.py +0 -0
  160. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
  161. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
  162. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -0
  163. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
  164. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/common/secure_aggregation/quantization.py +0 -0
  165. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
  166. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
  167. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/common/telemetry.py +0 -0
  168. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/common/typing.py +0 -0
  169. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/common/version.py +0 -0
  170. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/proto/__init__.py +0 -0
  171. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/proto/clientappio_pb2.py +0 -0
  172. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/proto/clientappio_pb2.pyi +0 -0
  173. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/proto/clientappio_pb2_grpc.py +0 -0
  174. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/proto/clientappio_pb2_grpc.pyi +0 -0
  175. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/proto/error_pb2.py +0 -0
  176. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/proto/error_pb2.pyi +0 -0
  177. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/proto/error_pb2_grpc.py +0 -0
  178. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/proto/error_pb2_grpc.pyi +0 -0
  179. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/proto/exec_pb2.py +0 -0
  180. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/proto/exec_pb2.pyi +0 -0
  181. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/proto/exec_pb2_grpc.py +0 -0
  182. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/proto/exec_pb2_grpc.pyi +0 -0
  183. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/proto/fab_pb2.py +0 -0
  184. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/proto/fab_pb2.pyi +0 -0
  185. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/proto/fab_pb2_grpc.py +0 -0
  186. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/proto/fab_pb2_grpc.pyi +0 -0
  187. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/proto/fleet_pb2.py +0 -0
  188. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/proto/fleet_pb2.pyi +0 -0
  189. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/proto/fleet_pb2_grpc.py +0 -0
  190. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
  191. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/proto/grpcadapter_pb2.py +0 -0
  192. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/proto/grpcadapter_pb2.pyi +0 -0
  193. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/proto/grpcadapter_pb2_grpc.py +0 -0
  194. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/proto/grpcadapter_pb2_grpc.pyi +0 -0
  195. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/proto/log_pb2.py +0 -0
  196. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/proto/log_pb2.pyi +0 -0
  197. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/proto/log_pb2_grpc.py +0 -0
  198. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/proto/log_pb2_grpc.pyi +0 -0
  199. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/proto/message_pb2.py +0 -0
  200. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/proto/message_pb2.pyi +0 -0
  201. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/proto/message_pb2_grpc.py +0 -0
  202. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/proto/message_pb2_grpc.pyi +0 -0
  203. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/proto/node_pb2_grpc.py +0 -0
  204. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/proto/node_pb2_grpc.pyi +0 -0
  205. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/proto/recordset_pb2.py +0 -0
  206. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/proto/recordset_pb2.pyi +0 -0
  207. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/proto/recordset_pb2_grpc.py +0 -0
  208. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/proto/recordset_pb2_grpc.pyi +0 -0
  209. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/proto/run_pb2.py +0 -0
  210. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/proto/run_pb2.pyi +0 -0
  211. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/proto/run_pb2_grpc.py +0 -0
  212. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/proto/run_pb2_grpc.pyi +0 -0
  213. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/proto/serverappio_pb2.py +0 -0
  214. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/proto/serverappio_pb2.pyi +0 -0
  215. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/proto/serverappio_pb2_grpc.py +0 -0
  216. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/proto/serverappio_pb2_grpc.pyi +0 -0
  217. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/proto/simulationio_pb2.py +0 -0
  218. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/proto/simulationio_pb2.pyi +0 -0
  219. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/proto/simulationio_pb2_grpc.py +0 -0
  220. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/proto/simulationio_pb2_grpc.pyi +0 -0
  221. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/proto/task_pb2.py +0 -0
  222. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/proto/task_pb2.pyi +0 -0
  223. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/proto/task_pb2_grpc.py +0 -0
  224. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/proto/task_pb2_grpc.pyi +0 -0
  225. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/proto/transport_pb2.py +0 -0
  226. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/proto/transport_pb2.pyi +0 -0
  227. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/proto/transport_pb2_grpc.py +0 -0
  228. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
  229. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/py.typed +0 -0
  230. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/__init__.py +0 -0
  231. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/app.py +0 -0
  232. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/client_manager.py +0 -0
  233. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/client_proxy.py +0 -0
  234. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/compat/__init__.py +0 -0
  235. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/compat/app.py +0 -0
  236. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/compat/legacy_context.py +0 -0
  237. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/criterion.py +0 -0
  238. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/driver/__init__.py +0 -0
  239. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/driver/driver.py +0 -0
  240. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/history.py +0 -0
  241. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/run_serverapp.py +0 -0
  242. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/server.py +0 -0
  243. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/server_app.py +0 -0
  244. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/server_config.py +0 -0
  245. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/serverapp/__init__.py +0 -0
  246. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/serverapp/app.py +0 -0
  247. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/serverapp_components.py +0 -0
  248. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/strategy/__init__.py +0 -0
  249. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/strategy/aggregate.py +0 -0
  250. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/strategy/bulyan.py +0 -0
  251. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
  252. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
  253. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
  254. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
  255. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
  256. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/strategy/fedadagrad.py +0 -0
  257. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/strategy/fedadam.py +0 -0
  258. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/strategy/fedavg.py +0 -0
  259. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/strategy/fedavg_android.py +0 -0
  260. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/strategy/fedavgm.py +0 -0
  261. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/strategy/fedmedian.py +0 -0
  262. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/strategy/fedopt.py +0 -0
  263. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/strategy/fedprox.py +0 -0
  264. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
  265. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
  266. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
  267. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
  268. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/strategy/fedyogi.py +0 -0
  269. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/strategy/krum.py +0 -0
  270. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/strategy/qfedavg.py +0 -0
  271. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/strategy/strategy.py +0 -0
  272. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/superlink/__init__.py +0 -0
  273. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/superlink/driver/__init__.py +0 -0
  274. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/superlink/driver/serverappio_grpc.py +0 -0
  275. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/superlink/ffs/__init__.py +0 -0
  276. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/superlink/ffs/disk_ffs.py +0 -0
  277. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/superlink/ffs/ffs.py +0 -0
  278. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/superlink/ffs/ffs_factory.py +0 -0
  279. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/superlink/fleet/__init__.py +0 -0
  280. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/superlink/fleet/grpc_adapter/__init__.py +0 -0
  281. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +0 -0
  282. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
  283. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
  284. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
  285. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
  286. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +0 -0
  287. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
  288. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +0 -0
  289. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
  290. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
  291. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +0 -0
  292. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
  293. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
  294. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
  295. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +0 -0
  296. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/superlink/fleet/vce/vce_api.py +0 -0
  297. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/superlink/linkstate/__init__.py +0 -0
  298. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/superlink/linkstate/linkstate_factory.py +0 -0
  299. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/superlink/simulation/__init__.py +0 -0
  300. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/superlink/simulation/simulationio_grpc.py +0 -0
  301. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/superlink/simulation/simulationio_servicer.py +0 -0
  302. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/superlink/utils.py +0 -0
  303. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/typing.py +0 -0
  304. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/utils/__init__.py +0 -0
  305. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/utils/tensorboard.py +0 -0
  306. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/workflow/__init__.py +0 -0
  307. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/workflow/constant.py +0 -0
  308. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/workflow/default_workflows.py +0 -0
  309. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
  310. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
  311. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +0 -0
  312. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/simulation/__init__.py +0 -0
  313. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/simulation/app.py +0 -0
  314. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/simulation/ray_transport/__init__.py +0 -0
  315. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
  316. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
  317. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/simulation/ray_transport/utils.py +0 -0
  318. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/simulation/run_simulation.py +0 -0
  319. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/simulation/simulationio_connection.py +0 -0
  320. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/superexec/__init__.py +0 -0
  321. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/superexec/app.py +0 -0
  322. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/superexec/deployment.py +0 -0
  323. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/superexec/exec_grpc.py +0 -0
  324. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/superexec/exec_servicer.py +0 -0
  325. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/superexec/exec_user_auth_interceptor.py +0 -0
  326. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/src/py/flwr/superexec/executor.py +0 -0
  327. {flwr_nightly-1.15.0.dev20250114 → flwr_nightly-1.15.0.dev20250115}/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.15.0.dev20250114
3
+ Version: 1.15.0.dev20250115
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.15.0.dev20250114"
7
+ version = "1.15.0.dev20250115"
8
8
  description = "Flower: A Friendly Federated AI Framework"
9
9
  license = "Apache-2.0"
10
10
  authors = ["The Flower Authors <hello@flower.ai>"]
@@ -83,6 +83,9 @@ FAB_HASH_TRUNCATION = 8
83
83
  FLWR_DIR = ".flwr" # The default Flower directory: ~/.flwr/
84
84
  FLWR_HOME = "FLWR_HOME" # If set, override the default Flower directory
85
85
 
86
+ # Constant for SuperLink
87
+ SUPERLINK_NODE_ID = 1
88
+
86
89
  # Constants entries in Node config for Simulation
87
90
  PARTITION_ID_KEY = "partition-id"
88
91
  NUM_PARTITIONS_KEY = "num-partitions"
@@ -320,7 +320,7 @@ def _log_uploader(
320
320
  ) -> None:
321
321
  """Upload logs to the SuperLink."""
322
322
  exit_flag = False
323
- node = Node(node_id=node_id, anonymous=False)
323
+ node = Node(node_id=node_id)
324
324
  msgs: list[str] = []
325
325
  while True:
326
326
  # Fetch all messages from the queue
@@ -21,6 +21,8 @@ from typing import Any, TypeVar, cast
21
21
 
22
22
  from google.protobuf.message import Message as GrpcMessage
23
23
 
24
+ from flwr.common.constant import SUPERLINK_NODE_ID
25
+
24
26
  # pylint: disable=E0611
25
27
  from flwr.proto.clientappio_pb2 import ClientAppOutputCode, ClientAppOutputStatus
26
28
  from flwr.proto.error_pb2 import Error as ProtoError
@@ -605,8 +607,8 @@ def message_to_taskins(message: Message) -> TaskIns:
605
607
  group_id=md.group_id,
606
608
  run_id=md.run_id,
607
609
  task=Task(
608
- producer=Node(node_id=0, anonymous=True), # Assume driver node
609
- consumer=Node(node_id=md.dst_node_id, anonymous=False),
610
+ producer=Node(node_id=SUPERLINK_NODE_ID), # Assume driver node
611
+ consumer=Node(node_id=md.dst_node_id),
610
612
  created_at=md.created_at,
611
613
  ttl=md.ttl,
612
614
  ancestry=[md.reply_to_message] if md.reply_to_message != "" else [],
@@ -659,8 +661,8 @@ def message_to_taskres(message: Message) -> TaskRes:
659
661
  group_id=md.group_id,
660
662
  run_id=md.run_id,
661
663
  task=Task(
662
- producer=Node(node_id=md.src_node_id, anonymous=False),
663
- consumer=Node(node_id=0, anonymous=True), # Assume driver node
664
+ producer=Node(node_id=md.src_node_id),
665
+ consumer=Node(node_id=SUPERLINK_NODE_ID), # Assume driver node
664
666
  created_at=md.created_at,
665
667
  ttl=md.ttl,
666
668
  ancestry=[md.reply_to_message] if md.reply_to_message != "" else [],
@@ -14,7 +14,7 @@ _sym_db = _symbol_database.Default()
14
14
 
15
15
 
16
16
 
17
- DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x15\x66lwr/proto/node.proto\x12\nflwr.proto\"*\n\x04Node\x12\x0f\n\x07node_id\x18\x01 \x01(\x04\x12\x11\n\tanonymous\x18\x02 \x01(\x08\x62\x06proto3')
17
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x15\x66lwr/proto/node.proto\x12\nflwr.proto\"\x17\n\x04Node\x12\x0f\n\x07node_id\x18\x01 \x01(\x04\x62\x06proto3')
18
18
 
19
19
  _globals = globals()
20
20
  _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
@@ -22,5 +22,5 @@ _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'flwr.proto.node_pb2', _glob
22
22
  if _descriptor._USE_C_DESCRIPTORS == False:
23
23
  DESCRIPTOR._options = None
24
24
  _globals['_NODE']._serialized_start=37
25
- _globals['_NODE']._serialized_end=79
25
+ _globals['_NODE']._serialized_end=60
26
26
  # @@protoc_insertion_point(module_scope)
@@ -12,13 +12,10 @@ DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
12
12
  class Node(google.protobuf.message.Message):
13
13
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
14
14
  NODE_ID_FIELD_NUMBER: builtins.int
15
- ANONYMOUS_FIELD_NUMBER: builtins.int
16
15
  node_id: builtins.int
17
- anonymous: builtins.bool
18
16
  def __init__(self,
19
17
  *,
20
18
  node_id: builtins.int = ...,
21
- anonymous: builtins.bool = ...,
22
19
  ) -> None: ...
23
- def ClearField(self, field_name: typing_extensions.Literal["anonymous",b"anonymous","node_id",b"node_id"]) -> None: ...
20
+ def ClearField(self, field_name: typing_extensions.Literal["node_id",b"node_id"]) -> None: ...
24
21
  global___Node = Node
@@ -95,7 +95,6 @@ def _update_client_manager(
95
95
  client_proxy = DriverClientProxy(
96
96
  node_id=node_id,
97
97
  driver=driver,
98
- anonymous=False,
99
98
  run_id=driver.run.run_id,
100
99
  )
101
100
  if client_manager.register(client_proxy):
@@ -28,12 +28,11 @@ from ..driver.driver import Driver
28
28
  class DriverClientProxy(ClientProxy):
29
29
  """Flower client proxy which delegates work using the Driver API."""
30
30
 
31
- def __init__(self, node_id: int, driver: Driver, anonymous: bool, run_id: int):
31
+ def __init__(self, node_id: int, driver: Driver, run_id: int):
32
32
  super().__init__(str(node_id))
33
33
  self.node_id = node_id
34
34
  self.driver = driver
35
35
  self.run_id = run_id
36
- self.anonymous = anonymous
37
36
 
38
37
  def get_properties(
39
38
  self,
@@ -24,7 +24,10 @@ from typing import Optional, cast
24
24
  import grpc
25
25
 
26
26
  from flwr.common import DEFAULT_TTL, Message, Metadata, RecordSet
27
- from flwr.common.constant import SERVERAPPIO_API_DEFAULT_CLIENT_ADDRESS
27
+ from flwr.common.constant import (
28
+ SERVERAPPIO_API_DEFAULT_CLIENT_ADDRESS,
29
+ SUPERLINK_NODE_ID,
30
+ )
28
31
  from flwr.common.grpc import create_channel
29
32
  from flwr.common.logger import log
30
33
  from flwr.common.retry_invoker import _make_simple_grpc_retry_invoker, _wrap_stub
@@ -76,7 +79,7 @@ class GrpcDriver(Driver):
76
79
  self._run: Optional[Run] = None
77
80
  self._grpc_stub: Optional[ServerAppIoStub] = None
78
81
  self._channel: Optional[grpc.Channel] = None
79
- self.node = Node(node_id=0, anonymous=True)
82
+ self.node = Node(node_id=SUPERLINK_NODE_ID)
80
83
  self._retry_invoker = _make_simple_grpc_retry_invoker()
81
84
 
82
85
  @property
@@ -22,6 +22,7 @@ from typing import Optional, cast
22
22
  from uuid import UUID
23
23
 
24
24
  from flwr.common import DEFAULT_TTL, Message, Metadata, RecordSet
25
+ from flwr.common.constant import SUPERLINK_NODE_ID
25
26
  from flwr.common.serde import message_from_taskres, message_to_taskins
26
27
  from flwr.common.typing import Run
27
28
  from flwr.proto.node_pb2 import Node # pylint: disable=E0611
@@ -49,7 +50,7 @@ class InMemoryDriver(Driver):
49
50
  self._run: Optional[Run] = None
50
51
  self.state = state_factory.state()
51
52
  self.pull_interval = pull_interval
52
- self.node = Node(node_id=0, anonymous=True)
53
+ self.node = Node(node_id=SUPERLINK_NODE_ID)
53
54
 
54
55
  def _check_message(self, message: Message) -> None:
55
56
  # Check if the message is valid
@@ -102,9 +102,7 @@ class ServerAppIoServicer(serverappio_pb2_grpc.ServerAppIoServicer):
102
102
  )
103
103
 
104
104
  all_ids: set[int] = state.get_nodes(request.run_id)
105
- nodes: list[Node] = [
106
- Node(node_id=node_id, anonymous=False) for node_id in all_ids
107
- ]
105
+ nodes: list[Node] = [Node(node_id=node_id) for node_id in all_ids]
108
106
  return GetNodesResponse(nodes=nodes)
109
107
 
110
108
  def CreateRun(
@@ -218,11 +218,11 @@ class AuthenticateServerInterceptor(grpc.ServerInterceptor): # type: ignore
218
218
  # Return previously assigned `node_id` for the provided `public_key`
219
219
  if node_id is not None:
220
220
  state.acknowledge_ping(node_id, request.ping_interval)
221
- return CreateNodeResponse(node=Node(node_id=node_id, anonymous=False))
221
+ return CreateNodeResponse(node=Node(node_id=node_id))
222
222
 
223
223
  # No `node_id` exists for the provided `public_key`
224
224
  # Handle `CreateNode` here instead of calling the default method handler
225
225
  # Note: the innermost `CreateNode` method will never be called
226
226
  node_id = state.create_node(request.ping_interval)
227
227
  state.set_node_public_key(node_id, public_key_bytes)
228
- return CreateNodeResponse(node=Node(node_id=node_id, anonymous=False))
228
+ return CreateNodeResponse(node=Node(node_id=node_id))
@@ -66,13 +66,13 @@ def create_node(
66
66
  """."""
67
67
  # Create node
68
68
  node_id = state.create_node(ping_interval=request.ping_interval)
69
- return CreateNodeResponse(node=Node(node_id=node_id, anonymous=False))
69
+ return CreateNodeResponse(node=Node(node_id=node_id))
70
70
 
71
71
 
72
72
  def delete_node(request: DeleteNodeRequest, state: LinkState) -> DeleteNodeResponse:
73
73
  """."""
74
74
  # Validate node_id
75
- if request.node.anonymous or request.node.node_id == 0:
75
+ if request.node.node_id == 0: # i.e. unset `node_id`
76
76
  return DeleteNodeResponse()
77
77
 
78
78
  # Update state
@@ -91,9 +91,8 @@ def ping(
91
91
 
92
92
  def pull_task_ins(request: PullTaskInsRequest, state: LinkState) -> PullTaskInsResponse:
93
93
  """Pull TaskIns handler."""
94
- # Get node_id if client node is not anonymous
95
94
  node = request.node # pylint: disable=no-member
96
- node_id: Optional[int] = None if node.anonymous else node.node_id
95
+ node_id: int = node.node_id
97
96
 
98
97
  # Retrieve TaskIns from State
99
98
  task_ins_list: list[TaskIns] = state.get_task_ins(node_id=node_id, limit=1)
@@ -111,7 +110,7 @@ def pull_messages(
111
110
  """Pull Messages handler."""
112
111
  # Get node_id if client node is not anonymous
113
112
  node = request.node # pylint: disable=no-member
114
- node_id: Optional[int] = None if node.anonymous else node.node_id
113
+ node_id: int = node.node_id
115
114
 
116
115
  # Retrieve TaskIns from State
117
116
  task_ins_list: list[TaskIns] = state.get_task_ins(node_id=node_id, limit=1)
@@ -28,6 +28,7 @@ from flwr.common.constant import (
28
28
  MESSAGE_TTL_TOLERANCE,
29
29
  NODE_ID_NUM_BYTES,
30
30
  RUN_ID_NUM_BYTES,
31
+ SUPERLINK_NODE_ID,
31
32
  Status,
32
33
  )
33
34
  from flwr.common.record import ConfigsRecord
@@ -90,7 +91,7 @@ class InMemoryLinkState(LinkState): # pylint: disable=R0902,R0904
90
91
  log(ERROR, "Invalid run ID for TaskIns: %s", task_ins.run_id)
91
92
  return None
92
93
  # Validate source node ID
93
- if task_ins.task.producer.node_id != 0:
94
+ if task_ins.task.producer.node_id != SUPERLINK_NODE_ID:
94
95
  log(
95
96
  ERROR,
96
97
  "Invalid source node ID for TaskIns: %s",
@@ -98,14 +99,13 @@ class InMemoryLinkState(LinkState): # pylint: disable=R0902,R0904
98
99
  )
99
100
  return None
100
101
  # Validate destination node ID
101
- if not task_ins.task.consumer.anonymous:
102
- if task_ins.task.consumer.node_id not in self.node_ids:
103
- log(
104
- ERROR,
105
- "Invalid destination node ID for TaskIns: %s",
106
- task_ins.task.consumer.node_id,
107
- )
108
- return None
102
+ if task_ins.task.consumer.node_id not in self.node_ids:
103
+ log(
104
+ ERROR,
105
+ "Invalid destination node ID for TaskIns: %s",
106
+ task_ins.task.consumer.node_id,
107
+ )
108
+ return None
109
109
 
110
110
  # Create task_id
111
111
  task_id = uuid4()
@@ -118,9 +118,7 @@ class InMemoryLinkState(LinkState): # pylint: disable=R0902,R0904
118
118
  # Return the new task_id
119
119
  return task_id
120
120
 
121
- def get_task_ins(
122
- self, node_id: Optional[int], limit: Optional[int]
123
- ) -> list[TaskIns]:
121
+ def get_task_ins(self, node_id: int, limit: Optional[int]) -> list[TaskIns]:
124
122
  """Get all TaskIns that have not been delivered yet."""
125
123
  if limit is not None and limit < 1:
126
124
  raise AssertionError("`limit` must be >= 1")
@@ -130,17 +128,8 @@ class InMemoryLinkState(LinkState): # pylint: disable=R0902,R0904
130
128
  current_time = time.time()
131
129
  with self.lock:
132
130
  for _, task_ins in self.task_ins_store.items():
133
- # pylint: disable=too-many-boolean-expressions
134
131
  if (
135
- node_id is not None # Not anonymous
136
- and task_ins.task.consumer.anonymous is False
137
- and task_ins.task.consumer.node_id == node_id
138
- and task_ins.task.delivered_at == ""
139
- and task_ins.task.created_at + task_ins.task.ttl > current_time
140
- ) or (
141
- node_id is None # Anonymous
142
- and task_ins.task.consumer.anonymous is True
143
- and task_ins.task.consumer.node_id == 0
132
+ task_ins.task.consumer.node_id == node_id
144
133
  and task_ins.task.delivered_at == ""
145
134
  and task_ins.task.created_at + task_ins.task.ttl > current_time
146
135
  ):
@@ -174,9 +163,6 @@ class InMemoryLinkState(LinkState): # pylint: disable=R0902,R0904
174
163
  if (
175
164
  task_ins
176
165
  and task_res
177
- and not (
178
- task_ins.task.consumer.anonymous or task_res.task.producer.anonymous
179
- )
180
166
  and task_ins.task.consumer.node_id != task_res.task.producer.node_id
181
167
  ):
182
168
  return None
@@ -310,7 +296,9 @@ class InMemoryLinkState(LinkState): # pylint: disable=R0902,R0904
310
296
  def create_node(self, ping_interval: float) -> int:
311
297
  """Create, store in the link state, and return `node_id`."""
312
298
  # Sample a random int64 as node_id
313
- node_id = generate_rand_int_from_bytes(NODE_ID_NUM_BYTES)
299
+ node_id = generate_rand_int_from_bytes(
300
+ NODE_ID_NUM_BYTES, exclude=[SUPERLINK_NODE_ID, 0]
301
+ )
314
302
 
315
303
  with self.lock:
316
304
  if node_id in self.node_ids:
@@ -40,20 +40,14 @@ class LinkState(abc.ABC): # pylint: disable=R0904
40
40
 
41
41
  Constraints
42
42
  -----------
43
- If `task_ins.task.consumer.anonymous` is `True`, then
44
- `task_ins.task.consumer.node_id` MUST NOT be set (equal 0).
45
-
46
- If `task_ins.task.consumer.anonymous` is `False`, then
47
- `task_ins.task.consumer.node_id` MUST be set (not 0)
43
+ `task_ins.task.consumer.node_id` MUST be set (not constant.DRIVER_NODE_ID)
48
44
 
49
45
  If `task_ins.run_id` is invalid, then
50
46
  storing the `task_ins` MUST fail.
51
47
  """
52
48
 
53
49
  @abc.abstractmethod
54
- def get_task_ins(
55
- self, node_id: Optional[int], limit: Optional[int]
56
- ) -> list[TaskIns]:
50
+ def get_task_ins(self, node_id: int, limit: Optional[int]) -> list[TaskIns]:
57
51
  """Get TaskIns optionally filtered by node_id.
58
52
 
59
53
  Usually, the Fleet API calls this for Nodes planning to work on one or more
@@ -61,15 +55,11 @@ class LinkState(abc.ABC): # pylint: disable=R0904
61
55
 
62
56
  Constraints
63
57
  -----------
64
- If `node_id` is not `None`, retrieve all TaskIns where
58
+ Retrieve all TaskIns where
65
59
 
66
60
  1. the `task_ins.task.consumer.node_id` equals `node_id` AND
67
- 2. the `task_ins.task.consumer.anonymous` equals `False` AND
68
- 3. the `task_ins.task.delivered_at` equals `""`.
61
+ 2. the `task_ins.task.delivered_at` equals `""`.
69
62
 
70
- If `node_id` is `None`, retrieve all TaskIns where the
71
- `task_ins.task.consumer.node_id` equals `0` and
72
- `task_ins.task.consumer.anonymous` is set to `True`.
73
63
 
74
64
  If `delivered_at` MUST BE set (not `""`) otherwise the TaskIns MUST not be in
75
65
  the result.
@@ -89,11 +79,8 @@ class LinkState(abc.ABC): # pylint: disable=R0904
89
79
 
90
80
  Constraints
91
81
  -----------
92
- If `task_res.task.consumer.anonymous` is `True`, then
93
- `task_res.task.consumer.node_id` MUST NOT be set (equal 0).
94
82
 
95
- If `task_res.task.consumer.anonymous` is `False`, then
96
- `task_res.task.consumer.node_id` MUST be set (not 0)
83
+ `task_res.task.consumer.node_id` MUST be set (not constant.DRIVER_NODE_ID)
97
84
 
98
85
  If `task_res.run_id` is invalid, then
99
86
  storing the `task_res` MUST fail.
@@ -31,6 +31,7 @@ from flwr.common.constant import (
31
31
  MESSAGE_TTL_TOLERANCE,
32
32
  NODE_ID_NUM_BYTES,
33
33
  RUN_ID_NUM_BYTES,
34
+ SUPERLINK_NODE_ID,
34
35
  Status,
35
36
  )
36
37
  from flwr.common.record import ConfigsRecord
@@ -128,9 +129,7 @@ CREATE TABLE IF NOT EXISTS task_ins(
128
129
  task_id TEXT UNIQUE,
129
130
  group_id TEXT,
130
131
  run_id INTEGER,
131
- producer_anonymous BOOLEAN,
132
132
  producer_node_id INTEGER,
133
- consumer_anonymous BOOLEAN,
134
133
  consumer_node_id INTEGER,
135
134
  created_at REAL,
136
135
  delivered_at TEXT,
@@ -148,9 +147,7 @@ CREATE TABLE IF NOT EXISTS task_res(
148
147
  task_id TEXT UNIQUE,
149
148
  group_id TEXT,
150
149
  run_id INTEGER,
151
- producer_anonymous BOOLEAN,
152
150
  producer_node_id INTEGER,
153
- consumer_anonymous BOOLEAN,
154
151
  consumer_node_id INTEGER,
155
152
  created_at REAL,
156
153
  delivered_at TEXT,
@@ -263,11 +260,8 @@ class SqliteLinkState(LinkState): # pylint: disable=R0904
263
260
 
264
261
  Constraints
265
262
  -----------
266
- If `task_ins.task.consumer.anonymous` is `True`, then
267
- `task_ins.task.consumer.node_id` MUST NOT be set (equal 0).
268
263
 
269
- If `task_ins.task.consumer.anonymous` is `False`, then
270
- `task_ins.task.consumer.node_id` MUST be set (not 0)
264
+ `task_ins.task.consumer.node_id` MUST be set (not constant.DRIVER_NODE_ID)
271
265
  """
272
266
  # Validate task
273
267
  errors = validate_task_ins_or_res(task_ins)
@@ -292,7 +286,7 @@ class SqliteLinkState(LinkState): # pylint: disable=R0904
292
286
  log(ERROR, "Invalid run ID for TaskIns: %s", task_ins.run_id)
293
287
  return None
294
288
  # Validate source node ID
295
- if task_ins.task.producer.node_id != 0:
289
+ if task_ins.task.producer.node_id != SUPERLINK_NODE_ID:
296
290
  log(
297
291
  ERROR,
298
292
  "Invalid source node ID for TaskIns: %s",
@@ -301,14 +295,13 @@ class SqliteLinkState(LinkState): # pylint: disable=R0904
301
295
  return None
302
296
  # Validate destination node ID
303
297
  query = "SELECT node_id FROM node WHERE node_id = ?;"
304
- if not task_ins.task.consumer.anonymous:
305
- if not self.query(query, (data[0]["consumer_node_id"],)):
306
- log(
307
- ERROR,
308
- "Invalid destination node ID for TaskIns: %s",
309
- task_ins.task.consumer.node_id,
310
- )
311
- return None
298
+ if not self.query(query, (data[0]["consumer_node_id"],)):
299
+ log(
300
+ ERROR,
301
+ "Invalid destination node ID for TaskIns: %s",
302
+ task_ins.task.consumer.node_id,
303
+ )
304
+ return None
312
305
 
313
306
  columns = ", ".join([f":{key}" for key in data[0]])
314
307
  query = f"INSERT INTO task_ins VALUES({columns});"
@@ -319,25 +312,18 @@ class SqliteLinkState(LinkState): # pylint: disable=R0904
319
312
 
320
313
  return task_id
321
314
 
322
- def get_task_ins(
323
- self, node_id: Optional[int], limit: Optional[int]
324
- ) -> list[TaskIns]:
325
- """Get undelivered TaskIns for one node (either anonymous or with ID).
315
+ def get_task_ins(self, node_id: int, limit: Optional[int]) -> list[TaskIns]:
316
+ """Get undelivered TaskIns for one node.
326
317
 
327
318
  Usually, the Fleet API calls this for Nodes planning to work on one or more
328
319
  TaskIns.
329
320
 
330
321
  Constraints
331
322
  -----------
332
- If `node_id` is not `None`, retrieve all TaskIns where
323
+ Retrieve all TaskIns where
333
324
 
334
325
  1. the `task_ins.task.consumer.node_id` equals `node_id` AND
335
- 2. the `task_ins.task.consumer.anonymous` equals `False` AND
336
- 3. the `task_ins.task.delivered_at` equals `""`.
337
-
338
- If `node_id` is `None`, retrieve all TaskIns where the
339
- `task_ins.task.consumer.node_id` equals `0` and
340
- `task_ins.task.consumer.anonymous` is set to `True`.
326
+ 2. the `task_ins.task.delivered_at` equals `""`.
341
327
 
342
328
  `delivered_at` MUST BE set (i.e., not `""`) otherwise the TaskIns MUST not be in
343
329
  the result.
@@ -348,38 +334,23 @@ class SqliteLinkState(LinkState): # pylint: disable=R0904
348
334
  if limit is not None and limit < 1:
349
335
  raise AssertionError("`limit` must be >= 1")
350
336
 
351
- if node_id == 0:
352
- msg = (
353
- "`node_id` must be >= 1"
354
- "\n\n For requesting anonymous tasks use `node_id` equal `None`"
355
- )
337
+ if node_id == SUPERLINK_NODE_ID:
338
+ msg = f"`node_id` must be != {SUPERLINK_NODE_ID}"
356
339
  raise AssertionError(msg)
357
340
 
358
341
  data: dict[str, Union[str, int]] = {}
359
342
 
360
- if node_id is None:
361
- # Retrieve all anonymous Tasks
362
- query = """
363
- SELECT task_id
364
- FROM task_ins
365
- WHERE consumer_anonymous == 1
366
- AND consumer_node_id == 0
367
- AND delivered_at = ""
368
- AND (created_at + ttl) > CAST(strftime('%s', 'now') AS REAL)
369
- """
370
- else:
371
- # Convert the uint64 value to sint64 for SQLite
372
- data["node_id"] = convert_uint64_to_sint64(node_id)
343
+ # Convert the uint64 value to sint64 for SQLite
344
+ data["node_id"] = convert_uint64_to_sint64(node_id)
373
345
 
374
- # Retrieve all TaskIns for node_id
375
- query = """
376
- SELECT task_id
377
- FROM task_ins
378
- WHERE consumer_anonymous == 0
379
- AND consumer_node_id == :node_id
380
- AND delivered_at = ""
381
- AND (created_at + ttl) > CAST(strftime('%s', 'now') AS REAL)
382
- """
346
+ # Retrieve all TaskIns for node_id
347
+ query = """
348
+ SELECT task_id
349
+ FROM task_ins
350
+ WHERE consumer_node_id == :node_id
351
+ AND delivered_at = ""
352
+ AND (created_at + ttl) > CAST(strftime('%s', 'now') AS REAL)
353
+ """
383
354
 
384
355
  if limit is not None:
385
356
  query += " LIMIT :limit"
@@ -429,11 +400,7 @@ class SqliteLinkState(LinkState): # pylint: disable=R0904
429
400
 
430
401
  Constraints
431
402
  -----------
432
- If `task_res.task.consumer.anonymous` is `True`, then
433
- `task_res.task.consumer.node_id` MUST NOT be set (equal 0).
434
-
435
- If `task_res.task.consumer.anonymous` is `False`, then
436
- `task_res.task.consumer.node_id` MUST be set (not 0)
403
+ `task_res.task.consumer.node_id` MUST be set (not constant.DRIVER_NODE_ID)
437
404
  """
438
405
  # Validate task
439
406
  errors = validate_task_ins_or_res(task_res)
@@ -459,7 +426,6 @@ class SqliteLinkState(LinkState): # pylint: disable=R0904
459
426
  if (
460
427
  task_ins
461
428
  and task_res
462
- and not (task_ins["consumer_anonymous"] or task_res.task.producer.anonymous)
463
429
  and convert_sint64_to_uint64(task_ins["consumer_node_id"])
464
430
  != task_res.task.producer.node_id
465
431
  ):
@@ -638,7 +604,9 @@ class SqliteLinkState(LinkState): # pylint: disable=R0904
638
604
  def create_node(self, ping_interval: float) -> int:
639
605
  """Create, store in the link state, and return `node_id`."""
640
606
  # Sample a random uint64 as node_id
641
- uint64_node_id = generate_rand_int_from_bytes(NODE_ID_NUM_BYTES)
607
+ uint64_node_id = generate_rand_int_from_bytes(
608
+ NODE_ID_NUM_BYTES, exclude=[SUPERLINK_NODE_ID, 0]
609
+ )
642
610
 
643
611
  # Convert the uint64 value to sint64 for SQLite
644
612
  sint64_node_id = convert_uint64_to_sint64(uint64_node_id)
@@ -1126,9 +1094,7 @@ def task_ins_to_dict(task_msg: TaskIns) -> dict[str, Any]:
1126
1094
  "task_id": task_msg.task_id,
1127
1095
  "group_id": task_msg.group_id,
1128
1096
  "run_id": task_msg.run_id,
1129
- "producer_anonymous": task_msg.task.producer.anonymous,
1130
1097
  "producer_node_id": task_msg.task.producer.node_id,
1131
- "consumer_anonymous": task_msg.task.consumer.anonymous,
1132
1098
  "consumer_node_id": task_msg.task.consumer.node_id,
1133
1099
  "created_at": task_msg.task.created_at,
1134
1100
  "delivered_at": task_msg.task.delivered_at,
@@ -1147,9 +1113,7 @@ def task_res_to_dict(task_msg: TaskRes) -> dict[str, Any]:
1147
1113
  "task_id": task_msg.task_id,
1148
1114
  "group_id": task_msg.group_id,
1149
1115
  "run_id": task_msg.run_id,
1150
- "producer_anonymous": task_msg.task.producer.anonymous,
1151
1116
  "producer_node_id": task_msg.task.producer.node_id,
1152
- "consumer_anonymous": task_msg.task.consumer.anonymous,
1153
1117
  "consumer_node_id": task_msg.task.consumer.node_id,
1154
1118
  "created_at": task_msg.task.created_at,
1155
1119
  "delivered_at": task_msg.task.delivered_at,
@@ -1174,11 +1138,9 @@ def dict_to_task_ins(task_dict: dict[str, Any]) -> TaskIns:
1174
1138
  task=Task(
1175
1139
  producer=Node(
1176
1140
  node_id=task_dict["producer_node_id"],
1177
- anonymous=task_dict["producer_anonymous"],
1178
1141
  ),
1179
1142
  consumer=Node(
1180
1143
  node_id=task_dict["consumer_node_id"],
1181
- anonymous=task_dict["consumer_anonymous"],
1182
1144
  ),
1183
1145
  created_at=task_dict["created_at"],
1184
1146
  delivered_at=task_dict["delivered_at"],
@@ -1204,11 +1166,9 @@ def dict_to_task_res(task_dict: dict[str, Any]) -> TaskRes:
1204
1166
  task=Task(
1205
1167
  producer=Node(
1206
1168
  node_id=task_dict["producer_node_id"],
1207
- anonymous=task_dict["producer_anonymous"],
1208
1169
  ),
1209
1170
  consumer=Node(
1210
1171
  node_id=task_dict["consumer_node_id"],
1211
- anonymous=task_dict["consumer_anonymous"],
1212
1172
  ),
1213
1173
  created_at=task_dict["created_at"],
1214
1174
  delivered_at=task_dict["delivered_at"],
@@ -21,7 +21,7 @@ from typing import Optional, Union
21
21
  from uuid import UUID, uuid4
22
22
 
23
23
  from flwr.common import ConfigsRecord, Context, log, now, serde
24
- from flwr.common.constant import ErrorCode, Status, SubStatus
24
+ from flwr.common.constant import SUPERLINK_NODE_ID, ErrorCode, Status, SubStatus
25
25
  from flwr.common.typing import RunStatus
26
26
 
27
27
  # pylint: disable=E0611
@@ -60,9 +60,19 @@ REPLY_MESSAGE_UNAVAILABLE_ERROR_REASON = (
60
60
  )
61
61
 
62
62
 
63
- def generate_rand_int_from_bytes(num_bytes: int) -> int:
64
- """Generate a random unsigned integer from `num_bytes` bytes."""
65
- return int.from_bytes(urandom(num_bytes), "little", signed=False)
63
+ def generate_rand_int_from_bytes(
64
+ num_bytes: int, exclude: Optional[list[int]] = None
65
+ ) -> int:
66
+ """Generate a random unsigned integer from `num_bytes` bytes.
67
+
68
+ If `exclude` is set, this function guarantees such number is not returned.
69
+ """
70
+ num = int.from_bytes(urandom(num_bytes), "little", signed=False)
71
+
72
+ if exclude:
73
+ while num in exclude:
74
+ num = int.from_bytes(urandom(num_bytes), "little", signed=False)
75
+ return num
66
76
 
67
77
 
68
78
  def convert_uint64_to_sint64(u: int) -> int:
@@ -246,8 +256,8 @@ def create_taskres_for_unavailable_taskins(taskins_id: Union[str, UUID]) -> Task
246
256
  run_id=0, # Unknown run ID
247
257
  task=Task(
248
258
  # This function is only called by SuperLink, and thus it's the producer.
249
- producer=Node(node_id=0, anonymous=False),
250
- consumer=Node(node_id=0, anonymous=False),
259
+ producer=Node(node_id=SUPERLINK_NODE_ID),
260
+ consumer=Node(node_id=SUPERLINK_NODE_ID),
251
261
  created_at=current_time,
252
262
  ttl=0,
253
263
  ancestry=[str(taskins_id)],
@@ -285,8 +295,8 @@ def create_taskres_for_unavailable_taskres(ref_taskins: TaskIns) -> TaskRes:
285
295
  run_id=ref_taskins.run_id,
286
296
  task=Task(
287
297
  # This function is only called by SuperLink, and thus it's the producer.
288
- producer=Node(node_id=0, anonymous=False),
289
- consumer=Node(node_id=0, anonymous=False),
298
+ producer=Node(node_id=SUPERLINK_NODE_ID),
299
+ consumer=Node(node_id=SUPERLINK_NODE_ID),
290
300
  created_at=current_time,
291
301
  ttl=ttl,
292
302
  ancestry=[ref_taskins.task_id],