flwr-nightly 1.19.0.dev20250527__tar.gz → 1.19.0.dev20250528__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (358) hide show
  1. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/PKG-INFO +1 -1
  2. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/cli/log.py +3 -3
  3. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/cli/login/login.py +3 -7
  4. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/cli/ls.py +3 -3
  5. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/cli/run/run.py +2 -6
  6. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/cli/stop.py +2 -2
  7. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/cli/utils.py +5 -4
  8. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/client/grpc_rere_client/connection.py +2 -0
  9. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/client/message_handler/message_handler.py +1 -1
  10. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/common/inflatable.py +33 -2
  11. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/common/record/array.py +38 -1
  12. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/common/record/arrayrecord.py +34 -0
  13. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/common/serde.py +6 -1
  14. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/grid/grpc_grid.py +2 -1
  15. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/grid/inmemory_grid.py +5 -4
  16. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/superlink/fleet/message_handler/message_handler.py +1 -2
  17. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/superlink/fleet/vce/vce_api.py +3 -0
  18. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/superlink/linkstate/in_memory_linkstate.py +14 -25
  19. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/superlink/linkstate/linkstate.py +9 -10
  20. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/superlink/linkstate/sqlite_linkstate.py +11 -21
  21. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/superlink/linkstate/utils.py +23 -23
  22. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/superlink/serverappio/serverappio_servicer.py +6 -10
  23. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/utils/validator.py +2 -2
  24. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/supercore/object_store/in_memory_object_store.py +30 -4
  25. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/supercore/object_store/object_store.py +48 -1
  26. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/superexec/exec_servicer.py +1 -2
  27. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/pyproject.toml +1 -1
  28. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/README.md +0 -0
  29. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/__init__.py +0 -0
  30. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/app/__init__.py +0 -0
  31. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/app/error.py +0 -0
  32. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/app/metadata.py +0 -0
  33. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/cli/__init__.py +0 -0
  34. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/cli/app.py +0 -0
  35. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/cli/auth_plugin/__init__.py +0 -0
  36. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/cli/auth_plugin/oidc_cli_plugin.py +0 -0
  37. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/cli/build.py +0 -0
  38. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/cli/cli_user_auth_interceptor.py +0 -0
  39. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/cli/config_utils.py +0 -0
  40. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/cli/constant.py +0 -0
  41. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/cli/example.py +0 -0
  42. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/cli/install.py +0 -0
  43. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/cli/login/__init__.py +0 -0
  44. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/cli/new/__init__.py +0 -0
  45. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/cli/new/new.py +0 -0
  46. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/cli/new/templates/__init__.py +0 -0
  47. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/cli/new/templates/app/.gitignore.tpl +0 -0
  48. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/cli/new/templates/app/LICENSE.tpl +0 -0
  49. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/cli/new/templates/app/README.baseline.md.tpl +0 -0
  50. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/cli/new/templates/app/README.flowertune.md.tpl +0 -0
  51. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/cli/new/templates/app/README.md.tpl +0 -0
  52. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/cli/new/templates/app/__init__.py +0 -0
  53. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/cli/new/templates/app/code/__init__.baseline.py.tpl +0 -0
  54. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
  55. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
  56. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/cli/new/templates/app/code/client.baseline.py.tpl +0 -0
  57. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/cli/new/templates/app/code/client.huggingface.py.tpl +0 -0
  58. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/cli/new/templates/app/code/client.jax.py.tpl +0 -0
  59. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/cli/new/templates/app/code/client.mlx.py.tpl +0 -0
  60. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/cli/new/templates/app/code/client.numpy.py.tpl +0 -0
  61. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -0
  62. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl +0 -0
  63. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -0
  64. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/cli/new/templates/app/code/dataset.baseline.py.tpl +0 -0
  65. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/cli/new/templates/app/code/flwr_tune/__init__.py +0 -0
  66. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/cli/new/templates/app/code/flwr_tune/client_app.py.tpl +0 -0
  67. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/cli/new/templates/app/code/flwr_tune/dataset.py.tpl +0 -0
  68. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/cli/new/templates/app/code/flwr_tune/models.py.tpl +0 -0
  69. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/cli/new/templates/app/code/flwr_tune/server_app.py.tpl +0 -0
  70. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/cli/new/templates/app/code/flwr_tune/strategy.py.tpl +0 -0
  71. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/cli/new/templates/app/code/model.baseline.py.tpl +0 -0
  72. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/cli/new/templates/app/code/server.baseline.py.tpl +0 -0
  73. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/cli/new/templates/app/code/server.huggingface.py.tpl +0 -0
  74. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/cli/new/templates/app/code/server.jax.py.tpl +0 -0
  75. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/cli/new/templates/app/code/server.mlx.py.tpl +0 -0
  76. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -0
  77. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -0
  78. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/cli/new/templates/app/code/server.sklearn.py.tpl +0 -0
  79. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -0
  80. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/cli/new/templates/app/code/strategy.baseline.py.tpl +0 -0
  81. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/cli/new/templates/app/code/task.huggingface.py.tpl +0 -0
  82. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/cli/new/templates/app/code/task.jax.py.tpl +0 -0
  83. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/cli/new/templates/app/code/task.mlx.py.tpl +0 -0
  84. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/cli/new/templates/app/code/task.numpy.py.tpl +0 -0
  85. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +0 -0
  86. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/cli/new/templates/app/code/task.sklearn.py.tpl +0 -0
  87. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/cli/new/templates/app/code/task.tensorflow.py.tpl +0 -0
  88. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/cli/new/templates/app/code/utils.baseline.py.tpl +0 -0
  89. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/cli/new/templates/app/pyproject.baseline.toml.tpl +0 -0
  90. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +0 -0
  91. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl +0 -0
  92. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/cli/new/templates/app/pyproject.jax.toml.tpl +0 -0
  93. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +0 -0
  94. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +0 -0
  95. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +0 -0
  96. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +0 -0
  97. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +0 -0
  98. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/cli/run/__init__.py +0 -0
  99. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/client/__init__.py +0 -0
  100. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/client/client.py +0 -0
  101. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/client/client_app.py +0 -0
  102. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/client/clientapp/__init__.py +0 -0
  103. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/client/clientapp/app.py +0 -0
  104. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/client/clientapp/clientappio_servicer.py +0 -0
  105. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/client/clientapp/utils.py +0 -0
  106. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/client/dpfedavg_numpy_client.py +0 -0
  107. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/client/grpc_adapter_client/__init__.py +0 -0
  108. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/client/grpc_adapter_client/connection.py +0 -0
  109. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/client/grpc_rere_client/__init__.py +0 -0
  110. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/client/grpc_rere_client/client_interceptor.py +0 -0
  111. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/client/grpc_rere_client/grpc_adapter.py +0 -0
  112. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/client/message_handler/__init__.py +0 -0
  113. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/client/mod/__init__.py +0 -0
  114. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/client/mod/centraldp_mods.py +0 -0
  115. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/client/mod/comms_mods.py +0 -0
  116. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/client/mod/localdp_mod.py +0 -0
  117. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
  118. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
  119. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
  120. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/client/mod/utils.py +0 -0
  121. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/client/numpy_client.py +0 -0
  122. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/client/rest_client/__init__.py +0 -0
  123. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/client/rest_client/connection.py +0 -0
  124. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/client/run_info_store.py +0 -0
  125. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/client/typing.py +0 -0
  126. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/clientapp/__init__.py +0 -0
  127. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/common/__init__.py +0 -0
  128. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/common/address.py +0 -0
  129. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/common/args.py +0 -0
  130. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/common/auth_plugin/__init__.py +0 -0
  131. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/common/auth_plugin/auth_plugin.py +0 -0
  132. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/common/config.py +0 -0
  133. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/common/constant.py +0 -0
  134. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/common/context.py +0 -0
  135. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/common/date.py +0 -0
  136. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/common/differential_privacy.py +0 -0
  137. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/common/differential_privacy_constants.py +0 -0
  138. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/common/dp.py +0 -0
  139. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/common/event_log_plugin/__init__.py +0 -0
  140. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/common/event_log_plugin/event_log_plugin.py +0 -0
  141. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/common/exit/__init__.py +0 -0
  142. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/common/exit/exit.py +0 -0
  143. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/common/exit/exit_code.py +0 -0
  144. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/common/exit_handlers.py +0 -0
  145. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/common/grpc.py +0 -0
  146. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/common/heartbeat.py +0 -0
  147. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/common/inflatable_grpc_utils.py +0 -0
  148. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/common/logger.py +0 -0
  149. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/common/message.py +0 -0
  150. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/common/object_ref.py +0 -0
  151. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/common/parameter.py +0 -0
  152. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/common/pyproject.py +0 -0
  153. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/common/record/__init__.py +0 -0
  154. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/common/record/configrecord.py +0 -0
  155. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/common/record/conversion_utils.py +0 -0
  156. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/common/record/metricrecord.py +0 -0
  157. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/common/record/recorddict.py +0 -0
  158. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/common/record/typeddict.py +0 -0
  159. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/common/recorddict_compat.py +0 -0
  160. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/common/retry_invoker.py +0 -0
  161. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/common/secure_aggregation/__init__.py +0 -0
  162. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
  163. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
  164. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -0
  165. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
  166. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/common/secure_aggregation/quantization.py +0 -0
  167. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
  168. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
  169. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/common/serde_utils.py +0 -0
  170. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/common/telemetry.py +0 -0
  171. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/common/typing.py +0 -0
  172. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/common/version.py +0 -0
  173. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/compat/__init__.py +0 -0
  174. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/compat/client/__init__.py +0 -0
  175. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/compat/client/app.py +0 -0
  176. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/compat/client/grpc_client/__init__.py +0 -0
  177. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/compat/client/grpc_client/connection.py +0 -0
  178. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/compat/common/__init__.py +0 -0
  179. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/compat/server/__init__.py +0 -0
  180. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/compat/server/app.py +0 -0
  181. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/compat/simulation/__init__.py +0 -0
  182. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/proto/__init__.py +0 -0
  183. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/proto/clientappio_pb2.py +0 -0
  184. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/proto/clientappio_pb2.pyi +0 -0
  185. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/proto/clientappio_pb2_grpc.py +0 -0
  186. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/proto/clientappio_pb2_grpc.pyi +0 -0
  187. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/proto/error_pb2.py +0 -0
  188. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/proto/error_pb2.pyi +0 -0
  189. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/proto/error_pb2_grpc.py +0 -0
  190. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/proto/error_pb2_grpc.pyi +0 -0
  191. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/proto/exec_pb2.py +0 -0
  192. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/proto/exec_pb2.pyi +0 -0
  193. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/proto/exec_pb2_grpc.py +0 -0
  194. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/proto/exec_pb2_grpc.pyi +0 -0
  195. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/proto/fab_pb2.py +0 -0
  196. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/proto/fab_pb2.pyi +0 -0
  197. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/proto/fab_pb2_grpc.py +0 -0
  198. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/proto/fab_pb2_grpc.pyi +0 -0
  199. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/proto/fleet_pb2.py +0 -0
  200. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/proto/fleet_pb2.pyi +0 -0
  201. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/proto/fleet_pb2_grpc.py +0 -0
  202. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
  203. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/proto/grpcadapter_pb2.py +0 -0
  204. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/proto/grpcadapter_pb2.pyi +0 -0
  205. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/proto/grpcadapter_pb2_grpc.py +0 -0
  206. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/proto/grpcadapter_pb2_grpc.pyi +0 -0
  207. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/proto/heartbeat_pb2.py +0 -0
  208. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/proto/heartbeat_pb2.pyi +0 -0
  209. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/proto/heartbeat_pb2_grpc.py +0 -0
  210. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/proto/heartbeat_pb2_grpc.pyi +0 -0
  211. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/proto/log_pb2.py +0 -0
  212. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/proto/log_pb2.pyi +0 -0
  213. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/proto/log_pb2_grpc.py +0 -0
  214. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/proto/log_pb2_grpc.pyi +0 -0
  215. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/proto/message_pb2.py +0 -0
  216. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/proto/message_pb2.pyi +0 -0
  217. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/proto/message_pb2_grpc.py +0 -0
  218. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/proto/message_pb2_grpc.pyi +0 -0
  219. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/proto/node_pb2.py +0 -0
  220. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/proto/node_pb2.pyi +0 -0
  221. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/proto/node_pb2_grpc.py +0 -0
  222. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/proto/node_pb2_grpc.pyi +0 -0
  223. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/proto/recorddict_pb2.py +0 -0
  224. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/proto/recorddict_pb2.pyi +0 -0
  225. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/proto/recorddict_pb2_grpc.py +0 -0
  226. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/proto/recorddict_pb2_grpc.pyi +0 -0
  227. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/proto/run_pb2.py +0 -0
  228. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/proto/run_pb2.pyi +0 -0
  229. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/proto/run_pb2_grpc.py +0 -0
  230. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/proto/run_pb2_grpc.pyi +0 -0
  231. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/proto/serverappio_pb2.py +0 -0
  232. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/proto/serverappio_pb2.pyi +0 -0
  233. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/proto/serverappio_pb2_grpc.py +0 -0
  234. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/proto/serverappio_pb2_grpc.pyi +0 -0
  235. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/proto/simulationio_pb2.py +0 -0
  236. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/proto/simulationio_pb2.pyi +0 -0
  237. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/proto/simulationio_pb2_grpc.py +0 -0
  238. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/proto/simulationio_pb2_grpc.pyi +0 -0
  239. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/proto/transport_pb2.py +0 -0
  240. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/proto/transport_pb2.pyi +0 -0
  241. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/proto/transport_pb2_grpc.py +0 -0
  242. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
  243. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/py.typed +0 -0
  244. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/__init__.py +0 -0
  245. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/app.py +0 -0
  246. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/client_manager.py +0 -0
  247. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/client_proxy.py +0 -0
  248. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/compat/__init__.py +0 -0
  249. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/compat/app.py +0 -0
  250. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/compat/app_utils.py +0 -0
  251. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/compat/grid_client_proxy.py +0 -0
  252. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/compat/legacy_context.py +0 -0
  253. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/criterion.py +0 -0
  254. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/fleet_event_log_interceptor.py +0 -0
  255. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/grid/__init__.py +0 -0
  256. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/grid/grid.py +0 -0
  257. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/history.py +0 -0
  258. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/run_serverapp.py +0 -0
  259. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/server.py +0 -0
  260. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/server_app.py +0 -0
  261. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/server_config.py +0 -0
  262. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/serverapp/__init__.py +0 -0
  263. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/serverapp/app.py +0 -0
  264. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/serverapp_components.py +0 -0
  265. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/strategy/__init__.py +0 -0
  266. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/strategy/aggregate.py +0 -0
  267. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/strategy/bulyan.py +0 -0
  268. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
  269. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
  270. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
  271. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
  272. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
  273. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/strategy/fedadagrad.py +0 -0
  274. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/strategy/fedadam.py +0 -0
  275. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/strategy/fedavg.py +0 -0
  276. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/strategy/fedavg_android.py +0 -0
  277. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/strategy/fedavgm.py +0 -0
  278. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/strategy/fedmedian.py +0 -0
  279. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/strategy/fedopt.py +0 -0
  280. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/strategy/fedprox.py +0 -0
  281. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
  282. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
  283. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
  284. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
  285. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/strategy/fedyogi.py +0 -0
  286. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/strategy/krum.py +0 -0
  287. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/strategy/qfedavg.py +0 -0
  288. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/strategy/strategy.py +0 -0
  289. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/superlink/__init__.py +0 -0
  290. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/superlink/ffs/__init__.py +0 -0
  291. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/superlink/ffs/disk_ffs.py +0 -0
  292. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/superlink/ffs/ffs.py +0 -0
  293. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/superlink/ffs/ffs_factory.py +0 -0
  294. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/superlink/fleet/__init__.py +0 -0
  295. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/superlink/fleet/grpc_adapter/__init__.py +0 -0
  296. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +0 -0
  297. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
  298. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
  299. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
  300. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
  301. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +0 -0
  302. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
  303. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +0 -0
  304. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +0 -0
  305. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
  306. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
  307. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +0 -0
  308. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
  309. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
  310. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
  311. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +0 -0
  312. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/superlink/linkstate/__init__.py +0 -0
  313. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/superlink/linkstate/linkstate_factory.py +0 -0
  314. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/superlink/serverappio/__init__.py +0 -0
  315. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/superlink/serverappio/serverappio_grpc.py +0 -0
  316. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/superlink/simulation/__init__.py +0 -0
  317. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/superlink/simulation/simulationio_grpc.py +0 -0
  318. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/superlink/simulation/simulationio_servicer.py +0 -0
  319. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/superlink/utils.py +0 -0
  320. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/typing.py +0 -0
  321. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/utils/__init__.py +0 -0
  322. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/utils/tensorboard.py +0 -0
  323. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/workflow/__init__.py +0 -0
  324. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/workflow/constant.py +0 -0
  325. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/workflow/default_workflows.py +0 -0
  326. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
  327. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
  328. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +0 -0
  329. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/serverapp/__init__.py +0 -0
  330. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/simulation/__init__.py +0 -0
  331. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/simulation/app.py +0 -0
  332. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/simulation/legacy_app.py +0 -0
  333. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/simulation/ray_transport/__init__.py +0 -0
  334. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
  335. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
  336. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/simulation/ray_transport/utils.py +0 -0
  337. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/simulation/run_simulation.py +0 -0
  338. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/simulation/simulationio_connection.py +0 -0
  339. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/supercore/__init__.py +0 -0
  340. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/supercore/object_store/__init__.py +0 -0
  341. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/supercore/object_store/object_store_factory.py +0 -0
  342. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/superexec/__init__.py +0 -0
  343. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/superexec/app.py +0 -0
  344. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/superexec/deployment.py +0 -0
  345. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/superexec/exec_event_log_interceptor.py +0 -0
  346. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/superexec/exec_grpc.py +0 -0
  347. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/superexec/exec_user_auth_interceptor.py +0 -0
  348. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/superexec/executor.py +0 -0
  349. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/superexec/simulation.py +0 -0
  350. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/superlink/__init__.py +0 -0
  351. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/supernode/__init__.py +0 -0
  352. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/supernode/cli/__init__.py +0 -0
  353. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/supernode/cli/flower_supernode.py +0 -0
  354. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/supernode/nodestate/__init__.py +0 -0
  355. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/supernode/nodestate/in_memory_nodestate.py +0 -0
  356. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/supernode/nodestate/nodestate.py +0 -0
  357. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/supernode/nodestate/nodestate_factory.py +0 -0
  358. {flwr_nightly-1.19.0.dev20250527 → flwr_nightly-1.19.0.dev20250528}/py/flwr/supernode/start_client_internal.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: flwr-nightly
3
- Version: 1.19.0.dev20250527
3
+ Version: 1.19.0.dev20250528
4
4
  Summary: Flower: A Friendly Federated AI Framework
5
5
  License: Apache-2.0
6
6
  Keywords: Artificial Intelligence,Federated AI,Federated Analytics,Federated Evaluation,Federated Learning,Flower,Machine Learning
@@ -35,7 +35,7 @@ from flwr.common.logger import log as logger
35
35
  from flwr.proto.exec_pb2 import StreamLogsRequest # pylint: disable=E0611
36
36
  from flwr.proto.exec_pb2_grpc import ExecStub
37
37
 
38
- from .utils import init_channel, try_obtain_cli_auth_plugin, unauthenticated_exc_handler
38
+ from .utils import flwr_cli_grpc_exc_handler, init_channel, try_obtain_cli_auth_plugin
39
39
 
40
40
 
41
41
  class AllLogsRetrieved(BaseException):
@@ -95,7 +95,7 @@ def stream_logs(
95
95
  latest_timestamp = 0.0
96
96
  res = None
97
97
  try:
98
- with unauthenticated_exc_handler():
98
+ with flwr_cli_grpc_exc_handler():
99
99
  for res in stub.StreamLogs(req, timeout=duration):
100
100
  print(res.log_output, end="")
101
101
  raise AllLogsRetrieved()
@@ -116,7 +116,7 @@ def print_logs(run_id: int, channel: grpc.Channel, timeout: int) -> None:
116
116
  req = StreamLogsRequest(run_id=run_id, after_timestamp=0.0)
117
117
 
118
118
  try:
119
- with unauthenticated_exc_handler():
119
+ with flwr_cli_grpc_exc_handler():
120
120
  # Enforce timeout for graceful exit
121
121
  for res in stub.StreamLogs(req, timeout=timeout):
122
122
  print(res.log_output)
@@ -35,11 +35,7 @@ from flwr.proto.exec_pb2 import ( # pylint: disable=E0611
35
35
  )
36
36
  from flwr.proto.exec_pb2_grpc import ExecStub
37
37
 
38
- from ..utils import (
39
- init_channel,
40
- try_obtain_cli_auth_plugin,
41
- unauthenticated_exc_handler,
42
- )
38
+ from ..utils import flwr_cli_grpc_exc_handler, init_channel, try_obtain_cli_auth_plugin
43
39
 
44
40
 
45
41
  def login( # pylint: disable=R0914
@@ -96,7 +92,7 @@ def login( # pylint: disable=R0914
96
92
  stub = ExecStub(channel)
97
93
 
98
94
  login_request = GetLoginDetailsRequest()
99
- with unauthenticated_exc_handler():
95
+ with flwr_cli_grpc_exc_handler():
100
96
  login_response: GetLoginDetailsResponse = stub.GetLoginDetails(login_request)
101
97
 
102
98
  # Get the auth plugin
@@ -120,7 +116,7 @@ def login( # pylint: disable=R0914
120
116
  expires_in=login_response.expires_in,
121
117
  interval=login_response.interval,
122
118
  )
123
- with unauthenticated_exc_handler():
119
+ with flwr_cli_grpc_exc_handler():
124
120
  credentials = auth_plugin.login(details, stub)
125
121
 
126
122
  # Store the tokens
@@ -44,7 +44,7 @@ from flwr.proto.exec_pb2 import ( # pylint: disable=E0611
44
44
  )
45
45
  from flwr.proto.exec_pb2_grpc import ExecStub
46
46
 
47
- from .utils import init_channel, try_obtain_cli_auth_plugin, unauthenticated_exc_handler
47
+ from .utils import flwr_cli_grpc_exc_handler, init_channel, try_obtain_cli_auth_plugin
48
48
 
49
49
  _RunListType = tuple[int, str, str, str, str, str, str, str, str]
50
50
 
@@ -305,7 +305,7 @@ def _list_runs(
305
305
  output_format: str = CliOutputFormat.DEFAULT,
306
306
  ) -> None:
307
307
  """List all runs."""
308
- with unauthenticated_exc_handler():
308
+ with flwr_cli_grpc_exc_handler():
309
309
  res: ListRunsResponse = stub.ListRuns(ListRunsRequest())
310
310
  run_dict = {run_id: run_from_proto(proto) for run_id, proto in res.run_dict.items()}
311
311
 
@@ -322,7 +322,7 @@ def _display_one_run(
322
322
  output_format: str = CliOutputFormat.DEFAULT,
323
323
  ) -> None:
324
324
  """Display information about a specific run."""
325
- with unauthenticated_exc_handler():
325
+ with flwr_cli_grpc_exc_handler():
326
326
  res: ListRunsResponse = stub.ListRuns(ListRunsRequest(run_id=run_id))
327
327
  if not res.run_dict:
328
328
  raise ValueError(f"Run ID {run_id} not found")
@@ -45,11 +45,7 @@ from flwr.proto.exec_pb2 import StartRunRequest # pylint: disable=E0611
45
45
  from flwr.proto.exec_pb2_grpc import ExecStub
46
46
 
47
47
  from ..log import start_stream
48
- from ..utils import (
49
- init_channel,
50
- try_obtain_cli_auth_plugin,
51
- unauthenticated_exc_handler,
52
- )
48
+ from ..utils import flwr_cli_grpc_exc_handler, init_channel, try_obtain_cli_auth_plugin
53
49
 
54
50
  CONN_REFRESH_PERIOD = 60 # Connection refresh period for log streaming (seconds)
55
51
 
@@ -172,7 +168,7 @@ def _run_with_exec_api(
172
168
  override_config=user_config_to_proto(parse_config_args(config_overrides)),
173
169
  federation_options=config_record_to_proto(c_record),
174
170
  )
175
- with unauthenticated_exc_handler():
171
+ with flwr_cli_grpc_exc_handler():
176
172
  res = stub.StartRun(req)
177
173
 
178
174
  if res.HasField("run_id"):
@@ -35,7 +35,7 @@ from flwr.common.logger import print_json_error, redirect_output, restore_output
35
35
  from flwr.proto.exec_pb2 import StopRunRequest, StopRunResponse # pylint: disable=E0611
36
36
  from flwr.proto.exec_pb2_grpc import ExecStub
37
37
 
38
- from .utils import init_channel, try_obtain_cli_auth_plugin, unauthenticated_exc_handler
38
+ from .utils import flwr_cli_grpc_exc_handler, init_channel, try_obtain_cli_auth_plugin
39
39
 
40
40
 
41
41
  def stop( # pylint: disable=R0914
@@ -122,7 +122,7 @@ def stop( # pylint: disable=R0914
122
122
 
123
123
  def _stop_run(stub: ExecStub, run_id: int, output_format: str) -> None:
124
124
  """Stop a run."""
125
- with unauthenticated_exc_handler():
125
+ with flwr_cli_grpc_exc_handler():
126
126
  response: StopRunResponse = stub.StopRun(request=StopRunRequest(run_id=run_id))
127
127
  if response.success:
128
128
  typer.secho(f"✅ Run {run_id} successfully stopped.", fg=typer.colors.GREEN)
@@ -288,11 +288,12 @@ def init_channel(
288
288
 
289
289
 
290
290
  @contextmanager
291
- def unauthenticated_exc_handler() -> Iterator[None]:
292
- """Context manager to handle gRPC UNAUTHENTICATED errors.
291
+ def flwr_cli_grpc_exc_handler() -> Iterator[None]:
292
+ """Context manager to handle specific gRPC errors.
293
293
 
294
- It catches grpc.RpcError exceptions with UNAUTHENTICATED status, informs the user,
295
- and exits the application. All other exceptions will be allowed to escape.
294
+ It catches grpc.RpcError exceptions with UNAUTHENTICATED and UNIMPLEMENTED statuses,
295
+ informs the user, and exits the application. All other exceptions will be allowed to
296
+ escape.
296
297
  """
297
298
  try:
298
299
  yield
@@ -279,6 +279,8 @@ def grpc_request_response( # pylint: disable=R0913,R0914,R0915,R0917
279
279
  log(ERROR, "No current message")
280
280
  return
281
281
 
282
+ # Set message_id
283
+ message.metadata.__dict__["_message_id"] = message.object_id
282
284
  # Validate out message
283
285
  if not validate_out_message(message, metadata):
284
286
  log(ERROR, "Invalid out message")
@@ -164,7 +164,7 @@ def validate_out_message(out_message: Message, in_message_metadata: Metadata) ->
164
164
  in_meta = in_message_metadata
165
165
  if ( # pylint: disable-next=too-many-boolean-expressions
166
166
  out_meta.run_id == in_meta.run_id
167
- and out_meta.message_id == "" # This will be generated by the server
167
+ and out_meta.message_id == out_message.object_id # Should match the object id
168
168
  and out_meta.src_node_id == in_meta.dst_node_id
169
169
  and out_meta.dst_node_id == in_meta.src_node_id
170
170
  and out_meta.reply_to_message_id == in_meta.message_id
@@ -18,7 +18,7 @@
18
18
  from __future__ import annotations
19
19
 
20
20
  import hashlib
21
- from typing import TypeVar
21
+ from typing import TypeVar, cast
22
22
 
23
23
  from .constant import HEAD_BODY_DIVIDER, HEAD_VALUE_DIVIDER
24
24
 
@@ -55,13 +55,24 @@ class InflatableObject:
55
55
  @property
56
56
  def object_id(self) -> str:
57
57
  """Get object_id."""
58
- return get_object_id(self.deflate())
58
+ if self.is_dirty or "_object_id" not in self.__dict__:
59
+ self.__dict__["_object_id"] = get_object_id(self.deflate())
60
+ return cast(str, self.__dict__["_object_id"])
59
61
 
60
62
  @property
61
63
  def children(self) -> dict[str, InflatableObject] | None:
62
64
  """Get all child objects as a dictionary or None if there are no children."""
63
65
  return None
64
66
 
67
+ @property
68
+ def is_dirty(self) -> bool:
69
+ """Check if the object is dirty after the last deflation.
70
+
71
+ An object is considered dirty if its content has changed since the last its
72
+ object ID was computed.
73
+ """
74
+ return True
75
+
65
76
 
66
77
  T = TypeVar("T", bound=InflatableObject)
67
78
 
@@ -178,3 +189,23 @@ def get_object_head_values_from_object_content(
178
189
  obj_type, children_str, body_len = head.split(HEAD_VALUE_DIVIDER)
179
190
  children_ids = children_str.split(",") if children_str else []
180
191
  return obj_type, children_ids, int(body_len)
192
+
193
+
194
+ def _get_descendants_object_ids_recursively(obj: InflatableObject) -> set[str]:
195
+
196
+ descendants: set[str] = set()
197
+ if children := obj.children:
198
+ for child in children.values():
199
+ descendants |= _get_descendants_object_ids_recursively(child)
200
+
201
+ descendants.add(obj.object_id)
202
+
203
+ return descendants
204
+
205
+
206
+ def get_desdendant_object_ids(obj: InflatableObject) -> set[str]:
207
+ """Get a set of object IDs of all descendants."""
208
+ descendants = _get_descendants_object_ids_recursively(obj)
209
+ # Exclude Object ID of parent object
210
+ descendants.discard(obj.object_id)
211
+ return descendants
@@ -107,10 +107,21 @@ class Array(InflatableObject):
107
107
  """
108
108
 
109
109
  dtype: str
110
- shape: list[int]
111
110
  stype: str
112
111
  data: bytes
113
112
 
113
+ @property
114
+ def shape(self) -> list[int]:
115
+ """Get the shape of the array."""
116
+ self.is_dirty = True # Mark as dirty when shape is accessed
117
+ return cast(list[int], self.__dict__["_shape"])
118
+
119
+ @shape.setter
120
+ def shape(self, value: list[int]) -> None:
121
+ """Set the shape of the array."""
122
+ self.is_dirty = True # Mark as dirty when shape is set
123
+ self.__dict__["_shape"] = value
124
+
114
125
  @overload
115
126
  def __init__( # noqa: E704
116
127
  self, dtype: str, shape: list[int], stype: str, data: bytes
@@ -295,3 +306,29 @@ class Array(InflatableObject):
295
306
  stype=proto_array.stype,
296
307
  data=proto_array.data,
297
308
  )
309
+
310
+ @property
311
+ def object_id(self) -> str:
312
+ """Get object ID."""
313
+ ret = super().object_id
314
+ self.is_dirty = False # Reset dirty flag
315
+ return ret
316
+
317
+ @property
318
+ def is_dirty(self) -> bool:
319
+ """Check if the object is dirty after the last deflation."""
320
+ if "_is_dirty" not in self.__dict__:
321
+ self.__dict__["_is_dirty"] = True
322
+ return cast(bool, self.__dict__["_is_dirty"])
323
+
324
+ @is_dirty.setter
325
+ def is_dirty(self, value: bool) -> None:
326
+ """Set the dirty flag."""
327
+ self.__dict__["_is_dirty"] = value
328
+
329
+ def __setattr__(self, name: str, value: Any) -> None:
330
+ """Set attribute with special handling for dirty state."""
331
+ if name in ("dtype", "stype", "data"):
332
+ # Mark as dirty if any of the main attributes are set
333
+ self.is_dirty = True
334
+ super().__setattr__(name, value)
@@ -429,6 +429,40 @@ class ArrayRecord(TypedDict[str, Array], InflatableObject):
429
429
  )
430
430
  )
431
431
 
432
+ @property
433
+ def object_id(self) -> str:
434
+ """Get object ID."""
435
+ ret = super().object_id
436
+ self.is_dirty = False # Reset dirty flag
437
+ return ret
438
+
439
+ @property
440
+ def is_dirty(self) -> bool:
441
+ """Check if the object is dirty after the last deflation."""
442
+ if "_is_dirty" not in self.__dict__:
443
+ self.__dict__["_is_dirty"] = True
444
+
445
+ if not self.__dict__["_is_dirty"]:
446
+ if any(v.is_dirty for v in self.values()):
447
+ # If any Array is dirty, mark the record as dirty
448
+ self.__dict__["_is_dirty"] = True
449
+ return cast(bool, self.__dict__["_is_dirty"])
450
+
451
+ @is_dirty.setter
452
+ def is_dirty(self, value: bool) -> None:
453
+ """Set the dirty flag."""
454
+ self.__dict__["_is_dirty"] = value
455
+
456
+ def __setitem__(self, key: str, value: Array) -> None:
457
+ """Set item and mark the record as dirty."""
458
+ self.is_dirty = True # Mark as dirty when setting an item
459
+ super().__setitem__(key, value)
460
+
461
+ def __delitem__(self, key: str) -> None:
462
+ """Delete item and mark the record as dirty."""
463
+ self.is_dirty = True # Mark as dirty when deleting an item
464
+ super().__delitem__(key)
465
+
432
466
 
433
467
  class ParametersRecord(ArrayRecord):
434
468
  """Deprecated class ``ParametersRecord``, use ``ArrayRecord`` instead.
@@ -378,7 +378,12 @@ def scalar_from_proto(scalar_msg: Scalar) -> typing.Scalar:
378
378
 
379
379
  def array_to_proto(array: Array) -> ProtoArray:
380
380
  """Serialize Array to ProtoBuf."""
381
- return ProtoArray(**vars(array))
381
+ return ProtoArray(
382
+ dtype=array.dtype,
383
+ shape=array.shape,
384
+ stype=array.stype,
385
+ data=array.data,
386
+ )
382
387
 
383
388
 
384
389
  def array_from_proto(array_proto: ProtoArray) -> Array:
@@ -163,7 +163,7 @@ class GrpcGrid(Grid):
163
163
  def _check_message(self, message: Message) -> None:
164
164
  # Check if the message is valid
165
165
  if not (
166
- message.metadata.message_id == ""
166
+ message.metadata.message_id != ""
167
167
  and message.metadata.reply_to_message_id == ""
168
168
  and message.metadata.ttl > 0
169
169
  ):
@@ -211,6 +211,7 @@ class GrpcGrid(Grid):
211
211
  # Populate metadata
212
212
  msg.metadata.__dict__["_run_id"] = run_id
213
213
  msg.metadata.__dict__["_src_node_id"] = self.node.node_id
214
+ msg.metadata.__dict__["_message_id"] = msg.object_id
214
215
  # Check message
215
216
  self._check_message(msg)
216
217
  # Convert to proto
@@ -18,7 +18,7 @@
18
18
  import time
19
19
  from collections.abc import Iterable
20
20
  from typing import Optional, cast
21
- from uuid import UUID
21
+ from uuid import uuid4
22
22
 
23
23
  from flwr.common import Message, RecordDict
24
24
  from flwr.common.constant import SUPERLINK_NODE_ID
@@ -56,7 +56,7 @@ class InMemoryGrid(Grid):
56
56
  def _check_message(self, message: Message) -> None:
57
57
  # Check if the message is valid
58
58
  if not (
59
- message.metadata.message_id == ""
59
+ message.metadata.message_id != ""
60
60
  and message.metadata.reply_to_message_id == ""
61
61
  and message.metadata.ttl > 0
62
62
  and message.metadata.delivered_at == ""
@@ -111,6 +111,7 @@ class InMemoryGrid(Grid):
111
111
  # Populate metadata
112
112
  msg.metadata.__dict__["_run_id"] = cast(Run, self._run).run_id
113
113
  msg.metadata.__dict__["_src_node_id"] = self.node.node_id
114
+ msg.metadata.__dict__["_message_id"] = str(uuid4())
114
115
  # Check message
115
116
  self._check_message(msg)
116
117
  # Store in state
@@ -126,12 +127,12 @@ class InMemoryGrid(Grid):
126
127
  This method is used to collect messages from the SuperLink that correspond to a
127
128
  set of given message IDs.
128
129
  """
129
- msg_ids = {UUID(msg_id) for msg_id in message_ids}
130
+ msg_ids = set(message_ids)
130
131
  # Pull Messages
131
132
  message_res_list = self.state.get_message_res(message_ids=msg_ids)
132
133
  # Get IDs of Messages these replies are for
133
134
  message_ins_ids_to_delete = {
134
- UUID(msg_res.metadata.reply_to_message_id) for msg_res in message_res_list
135
+ msg_res.metadata.reply_to_message_id for msg_res in message_res_list
135
136
  }
136
137
  # Delete
137
138
  self.state.delete_messages(message_ins_ids=message_ins_ids_to_delete)
@@ -16,7 +16,6 @@
16
16
 
17
17
 
18
18
  from typing import Optional
19
- from uuid import UUID
20
19
 
21
20
  from flwr.common import Message
22
21
  from flwr.common.constant import Status
@@ -122,7 +121,7 @@ def push_messages(
122
121
  raise InvalidRunStatusException(abort_msg)
123
122
 
124
123
  # Store Message in State
125
- message_id: Optional[UUID] = state.store_message_res(message=msg)
124
+ message_id: Optional[str] = state.store_message_res(message=msg)
126
125
 
127
126
  # Build response
128
127
  response = PushMessagesResponse(
@@ -25,6 +25,7 @@ from pathlib import Path
25
25
  from queue import Empty, Queue
26
26
  from time import sleep
27
27
  from typing import Callable, Optional
28
+ from uuid import uuid4
28
29
 
29
30
  from flwr.app.error import Error
30
31
  from flwr.client.client_app import ClientApp, ClientAppException, LoadClientAppError
@@ -134,6 +135,8 @@ def worker(
134
135
 
135
136
  finally:
136
137
  if out_mssg:
138
+ # Assign a message_id
139
+ out_mssg.metadata.__dict__["_message_id"] = str(uuid4())
137
140
  # Store reply Messages in state
138
141
  messageres_queue.put(out_mssg)
139
142
 
@@ -21,7 +21,6 @@ from bisect import bisect_right
21
21
  from dataclasses import dataclass, field
22
22
  from logging import ERROR, WARNING
23
23
  from typing import Optional
24
- from uuid import UUID, uuid4
25
24
 
26
25
  from flwr.common import Context, Message, log, now
27
26
  from flwr.common.constant import (
@@ -76,15 +75,15 @@ class InMemoryLinkState(LinkState): # pylint: disable=R0902,R0904
76
75
  self.run_ids: dict[int, RunRecord] = {}
77
76
  self.contexts: dict[int, Context] = {}
78
77
  self.federation_options: dict[int, ConfigRecord] = {}
79
- self.message_ins_store: dict[UUID, Message] = {}
80
- self.message_res_store: dict[UUID, Message] = {}
81
- self.message_ins_id_to_message_res_id: dict[UUID, UUID] = {}
78
+ self.message_ins_store: dict[str, Message] = {}
79
+ self.message_res_store: dict[str, Message] = {}
80
+ self.message_ins_id_to_message_res_id: dict[str, str] = {}
82
81
 
83
82
  self.node_public_keys: set[bytes] = set()
84
83
 
85
84
  self.lock = threading.RLock()
86
85
 
87
- def store_message_ins(self, message: Message) -> Optional[UUID]:
86
+ def store_message_ins(self, message: Message) -> Optional[str]:
88
87
  """Store one Message."""
89
88
  # Validate message
90
89
  errors = validate_message(message, is_reply_message=False)
@@ -112,12 +111,7 @@ class InMemoryLinkState(LinkState): # pylint: disable=R0902,R0904
112
111
  )
113
112
  return None
114
113
 
115
- # Create message_id
116
- message_id = uuid4()
117
-
118
- # Store Message
119
- # pylint: disable-next=W0212
120
- message.metadata._message_id = str(message_id) # type: ignore
114
+ message_id = message.metadata.message_id
121
115
  with self.lock:
122
116
  self.message_ins_store[message_id] = message
123
117
 
@@ -153,7 +147,7 @@ class InMemoryLinkState(LinkState): # pylint: disable=R0902,R0904
153
147
  return message_ins_list
154
148
 
155
149
  # pylint: disable=R0911
156
- def store_message_res(self, message: Message) -> Optional[UUID]:
150
+ def store_message_res(self, message: Message) -> Optional[str]:
157
151
  """Store one Message."""
158
152
  # Validate message
159
153
  errors = validate_message(message, is_reply_message=True)
@@ -165,7 +159,7 @@ class InMemoryLinkState(LinkState): # pylint: disable=R0902,R0904
165
159
  with self.lock:
166
160
  # Check if the Message it is replying to exists and is valid
167
161
  msg_ins_id = res_metadata.reply_to_message_id
168
- msg_ins = self.message_ins_store.get(UUID(msg_ins_id))
162
+ msg_ins = self.message_ins_store.get(msg_ins_id)
169
163
 
170
164
  # Ensure that dst_node_id of original Message matches the src_node_id of
171
165
  # reply Message.
@@ -220,22 +214,17 @@ class InMemoryLinkState(LinkState): # pylint: disable=R0902,R0904
220
214
  log(ERROR, "`metadata.run_id` is invalid")
221
215
  return None
222
216
 
223
- # Create message_id
224
- message_id = uuid4()
225
-
226
- # Store Message
227
- # pylint: disable-next=W0212
228
- message.metadata._message_id = str(message_id) # type: ignore
217
+ message_id = message.metadata.message_id
229
218
  with self.lock:
230
219
  self.message_res_store[message_id] = message
231
- self.message_ins_id_to_message_res_id[UUID(msg_ins_id)] = message_id
220
+ self.message_ins_id_to_message_res_id[msg_ins_id] = message_id
232
221
 
233
222
  # Return the new message_id
234
223
  return message_id
235
224
 
236
- def get_message_res(self, message_ids: set[UUID]) -> list[Message]:
225
+ def get_message_res(self, message_ids: set[str]) -> list[Message]:
237
226
  """Get reply Messages for the given Message IDs."""
238
- ret: dict[UUID, Message] = {}
227
+ ret: dict[str, Message] = {}
239
228
 
240
229
  with self.lock:
241
230
  current = time.time()
@@ -287,7 +276,7 @@ class InMemoryLinkState(LinkState): # pylint: disable=R0902,R0904
287
276
 
288
277
  return list(ret.values())
289
278
 
290
- def delete_messages(self, message_ins_ids: set[UUID]) -> None:
279
+ def delete_messages(self, message_ins_ids: set[str]) -> None:
291
280
  """Delete a Message and its reply based on provided Message IDs."""
292
281
  if not message_ins_ids:
293
282
  return
@@ -304,9 +293,9 @@ class InMemoryLinkState(LinkState): # pylint: disable=R0902,R0904
304
293
  )
305
294
  del self.message_res_store[message_res_id]
306
295
 
307
- def get_message_ids_from_run_id(self, run_id: int) -> set[UUID]:
296
+ def get_message_ids_from_run_id(self, run_id: int) -> set[str]:
308
297
  """Get all instruction Message IDs for the given run_id."""
309
- message_id_list: set[UUID] = set()
298
+ message_id_list: set[str] = set()
310
299
  with self.lock:
311
300
  for message_id, message in self.message_ins_store.items():
312
301
  if message.metadata.run_id == run_id:
@@ -17,7 +17,6 @@
17
17
 
18
18
  import abc
19
19
  from typing import Optional
20
- from uuid import UUID
21
20
 
22
21
  from flwr.common import Context, Message
23
22
  from flwr.common.record import ConfigRecord
@@ -28,13 +27,13 @@ class LinkState(abc.ABC): # pylint: disable=R0904
28
27
  """Abstract LinkState."""
29
28
 
30
29
  @abc.abstractmethod
31
- def store_message_ins(self, message: Message) -> Optional[UUID]:
30
+ def store_message_ins(self, message: Message) -> Optional[str]:
32
31
  """Store one Message.
33
32
 
34
33
  Usually, the ServerAppIo API calls this to schedule instructions.
35
34
 
36
35
  Stores the value of the `message` in the link state and, if successful,
37
- returns the `message_id` (UUID) of the `message`. If, for any reason,
36
+ returns the `message_id` (str) of the `message`. If, for any reason,
38
37
  storing the `message` fails, `None` is returned.
39
38
 
40
39
  Constraints
@@ -61,12 +60,12 @@ class LinkState(abc.ABC): # pylint: disable=R0904
61
60
  """
62
61
 
63
62
  @abc.abstractmethod
64
- def store_message_res(self, message: Message) -> Optional[UUID]:
63
+ def store_message_res(self, message: Message) -> Optional[str]:
65
64
  """Store one Message.
66
65
 
67
66
  Usually, the Fleet API calls this for Nodes returning results.
68
67
 
69
- Stores the Message and, if successful, returns the `message_id` (UUID) of
68
+ Stores the Message and, if successful, returns the `message_id` (str) of
70
69
  the `message`. If storing the `message` fails, `None` is returned.
71
70
 
72
71
  Constraints
@@ -78,7 +77,7 @@ class LinkState(abc.ABC): # pylint: disable=R0904
78
77
  """
79
78
 
80
79
  @abc.abstractmethod
81
- def get_message_res(self, message_ids: set[UUID]) -> list[Message]:
80
+ def get_message_res(self, message_ids: set[str]) -> list[Message]:
82
81
  """Get reply Messages for the given Message IDs.
83
82
 
84
83
  This method is typically called by the ServerAppIo API to obtain
@@ -94,7 +93,7 @@ class LinkState(abc.ABC): # pylint: disable=R0904
94
93
 
95
94
  Parameters
96
95
  ----------
97
- message_ids : set[UUID]
96
+ message_ids : set[str]
98
97
  A set of Message IDs used to retrieve reply Messages responding to them.
99
98
 
100
99
  Returns
@@ -113,18 +112,18 @@ class LinkState(abc.ABC): # pylint: disable=R0904
113
112
  """Calculate the number of reply Messages in store."""
114
113
 
115
114
  @abc.abstractmethod
116
- def delete_messages(self, message_ins_ids: set[UUID]) -> None:
115
+ def delete_messages(self, message_ins_ids: set[str]) -> None:
117
116
  """Delete a Message and its reply based on provided Message IDs.
118
117
 
119
118
  Parameters
120
119
  ----------
121
- message_ins_ids : set[UUID]
120
+ message_ins_ids : set[str]
122
121
  A set of Message IDs. For each ID in the set, the corresponding
123
122
  Message and its associated reply Message will be deleted.
124
123
  """
125
124
 
126
125
  @abc.abstractmethod
127
- def get_message_ids_from_run_id(self, run_id: int) -> set[UUID]:
126
+ def get_message_ids_from_run_id(self, run_id: int) -> set[str]:
128
127
  """Get all instruction Message IDs for the given run_id."""
129
128
 
130
129
  @abc.abstractmethod