flwr-nightly 1.9.0.dev20240429__tar.gz → 1.9.0.dev20240430__tar.gz

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

Potentially problematic release.


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

Files changed (216) hide show
  1. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/PKG-INFO +1 -1
  2. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/pyproject.toml +1 -1
  3. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/client/grpc_rere_client/client_interceptor.py +9 -1
  4. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/common/logger.py +26 -0
  5. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/common/message.py +72 -82
  6. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/common/record/recordset.py +5 -4
  7. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +5 -0
  8. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/simulation/app.py +16 -1
  9. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/simulation/run_simulation.py +3 -0
  10. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/LICENSE +0 -0
  11. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/README.md +0 -0
  12. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/__init__.py +0 -0
  13. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/cli/__init__.py +0 -0
  14. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/cli/app.py +0 -0
  15. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/cli/config_utils.py +0 -0
  16. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/cli/example.py +0 -0
  17. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/cli/new/__init__.py +0 -0
  18. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/cli/new/new.py +0 -0
  19. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/cli/new/templates/__init__.py +0 -0
  20. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/cli/new/templates/app/.gitignore.tpl +0 -0
  21. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/cli/new/templates/app/README.md.tpl +0 -0
  22. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/cli/new/templates/app/__init__.py +0 -0
  23. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
  24. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
  25. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/cli/new/templates/app/code/client.numpy.py.tpl +0 -0
  26. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -0
  27. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl +0 -0
  28. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -0
  29. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -0
  30. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -0
  31. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/cli/new/templates/app/code/server.sklearn.py.tpl +0 -0
  32. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -0
  33. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +0 -0
  34. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +0 -0
  35. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +0 -0
  36. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +0 -0
  37. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +0 -0
  38. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/cli/run/__init__.py +0 -0
  39. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/cli/run/run.py +0 -0
  40. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/cli/utils.py +0 -0
  41. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/client/__init__.py +0 -0
  42. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/client/app.py +0 -0
  43. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/client/client.py +0 -0
  44. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/client/client_app.py +0 -0
  45. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/client/dpfedavg_numpy_client.py +0 -0
  46. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/client/grpc_client/__init__.py +0 -0
  47. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/client/grpc_client/connection.py +0 -0
  48. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/client/grpc_rere_client/__init__.py +0 -0
  49. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/client/grpc_rere_client/connection.py +0 -0
  50. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/client/heartbeat.py +0 -0
  51. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/client/message_handler/__init__.py +0 -0
  52. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/client/message_handler/message_handler.py +0 -0
  53. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/client/message_handler/task_handler.py +0 -0
  54. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/client/mod/__init__.py +0 -0
  55. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/client/mod/centraldp_mods.py +0 -0
  56. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/client/mod/comms_mods.py +0 -0
  57. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/client/mod/localdp_mod.py +0 -0
  58. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
  59. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
  60. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
  61. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/client/mod/utils.py +0 -0
  62. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/client/node_state.py +0 -0
  63. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/client/node_state_tests.py +0 -0
  64. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/client/numpy_client.py +0 -0
  65. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/client/rest_client/__init__.py +0 -0
  66. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/client/rest_client/connection.py +0 -0
  67. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/client/supernode/__init__.py +0 -0
  68. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/client/supernode/app.py +0 -0
  69. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/client/typing.py +0 -0
  70. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/common/__init__.py +0 -0
  71. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/common/address.py +0 -0
  72. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/common/constant.py +0 -0
  73. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/common/context.py +0 -0
  74. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/common/date.py +0 -0
  75. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/common/differential_privacy.py +0 -0
  76. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/common/differential_privacy_constants.py +0 -0
  77. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/common/dp.py +0 -0
  78. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/common/exit_handlers.py +0 -0
  79. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/common/grpc.py +0 -0
  80. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/common/object_ref.py +0 -0
  81. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/common/parameter.py +0 -0
  82. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/common/pyproject.py +0 -0
  83. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/common/record/__init__.py +0 -0
  84. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/common/record/configsrecord.py +0 -0
  85. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/common/record/conversion_utils.py +0 -0
  86. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/common/record/metricsrecord.py +0 -0
  87. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/common/record/parametersrecord.py +0 -0
  88. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/common/record/typeddict.py +0 -0
  89. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/common/recordset_compat.py +0 -0
  90. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/common/retry_invoker.py +0 -0
  91. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/common/secure_aggregation/__init__.py +0 -0
  92. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
  93. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
  94. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -0
  95. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
  96. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/common/secure_aggregation/quantization.py +0 -0
  97. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
  98. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
  99. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/common/serde.py +0 -0
  100. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/common/telemetry.py +0 -0
  101. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/common/typing.py +0 -0
  102. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/common/version.py +0 -0
  103. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/proto/__init__.py +0 -0
  104. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/proto/driver_pb2.py +0 -0
  105. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/proto/driver_pb2.pyi +0 -0
  106. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/proto/driver_pb2_grpc.py +0 -0
  107. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/proto/driver_pb2_grpc.pyi +0 -0
  108. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/proto/error_pb2.py +0 -0
  109. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/proto/error_pb2.pyi +0 -0
  110. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/proto/error_pb2_grpc.py +0 -0
  111. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/proto/error_pb2_grpc.pyi +0 -0
  112. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/proto/fleet_pb2.py +0 -0
  113. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/proto/fleet_pb2.pyi +0 -0
  114. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/proto/fleet_pb2_grpc.py +0 -0
  115. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
  116. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/proto/node_pb2.py +0 -0
  117. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/proto/node_pb2.pyi +0 -0
  118. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/proto/node_pb2_grpc.py +0 -0
  119. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/proto/node_pb2_grpc.pyi +0 -0
  120. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/proto/recordset_pb2.py +0 -0
  121. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/proto/recordset_pb2.pyi +0 -0
  122. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/proto/recordset_pb2_grpc.py +0 -0
  123. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/proto/recordset_pb2_grpc.pyi +0 -0
  124. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/proto/task_pb2.py +0 -0
  125. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/proto/task_pb2.pyi +0 -0
  126. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/proto/task_pb2_grpc.py +0 -0
  127. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/proto/task_pb2_grpc.pyi +0 -0
  128. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/proto/transport_pb2.py +0 -0
  129. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/proto/transport_pb2.pyi +0 -0
  130. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/proto/transport_pb2_grpc.py +0 -0
  131. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
  132. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/py.typed +0 -0
  133. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/server/__init__.py +0 -0
  134. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/server/app.py +0 -0
  135. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/server/client_manager.py +0 -0
  136. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/server/client_proxy.py +0 -0
  137. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/server/compat/__init__.py +0 -0
  138. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/server/compat/app.py +0 -0
  139. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/server/compat/app_utils.py +0 -0
  140. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/server/compat/driver_client_proxy.py +0 -0
  141. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/server/compat/legacy_context.py +0 -0
  142. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/server/criterion.py +0 -0
  143. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/server/driver/__init__.py +0 -0
  144. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/server/driver/driver.py +0 -0
  145. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/server/driver/grpc_driver.py +0 -0
  146. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/server/history.py +0 -0
  147. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/server/run_serverapp.py +0 -0
  148. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/server/server.py +0 -0
  149. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/server/server_app.py +0 -0
  150. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/server/server_config.py +0 -0
  151. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/server/strategy/__init__.py +0 -0
  152. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/server/strategy/aggregate.py +0 -0
  153. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/server/strategy/bulyan.py +0 -0
  154. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
  155. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
  156. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
  157. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
  158. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
  159. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/server/strategy/fedadagrad.py +0 -0
  160. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/server/strategy/fedadam.py +0 -0
  161. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/server/strategy/fedavg.py +0 -0
  162. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/server/strategy/fedavg_android.py +0 -0
  163. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/server/strategy/fedavgm.py +0 -0
  164. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/server/strategy/fedmedian.py +0 -0
  165. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/server/strategy/fedopt.py +0 -0
  166. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/server/strategy/fedprox.py +0 -0
  167. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
  168. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
  169. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
  170. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
  171. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/server/strategy/fedyogi.py +0 -0
  172. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/server/strategy/krum.py +0 -0
  173. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/server/strategy/qfedavg.py +0 -0
  174. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/server/strategy/strategy.py +0 -0
  175. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/server/superlink/__init__.py +0 -0
  176. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/server/superlink/driver/__init__.py +0 -0
  177. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/server/superlink/driver/driver_grpc.py +0 -0
  178. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/server/superlink/driver/driver_servicer.py +0 -0
  179. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/server/superlink/fleet/__init__.py +0 -0
  180. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
  181. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
  182. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
  183. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
  184. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +0 -0
  185. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
  186. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +0 -0
  187. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
  188. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/server/superlink/fleet/message_handler/message_handler.py +0 -0
  189. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
  190. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +0 -0
  191. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
  192. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
  193. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
  194. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +0 -0
  195. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/server/superlink/fleet/vce/vce_api.py +0 -0
  196. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/server/superlink/state/__init__.py +0 -0
  197. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/server/superlink/state/in_memory_state.py +0 -0
  198. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/server/superlink/state/sqlite_state.py +0 -0
  199. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/server/superlink/state/state.py +0 -0
  200. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/server/superlink/state/state_factory.py +0 -0
  201. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/server/superlink/state/utils.py +0 -0
  202. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/server/typing.py +0 -0
  203. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/server/utils/__init__.py +0 -0
  204. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/server/utils/tensorboard.py +0 -0
  205. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/server/utils/validator.py +0 -0
  206. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/server/workflow/__init__.py +0 -0
  207. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/server/workflow/constant.py +0 -0
  208. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/server/workflow/default_workflows.py +0 -0
  209. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
  210. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
  211. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +0 -0
  212. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/simulation/__init__.py +0 -0
  213. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/simulation/ray_transport/__init__.py +0 -0
  214. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
  215. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
  216. {flwr_nightly-1.9.0.dev20240429 → flwr_nightly-1.9.0.dev20240430}/src/py/flwr/simulation/ray_transport/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: flwr-nightly
3
- Version: 1.9.0.dev20240429
3
+ Version: 1.9.0.dev20240430
4
4
  Summary: Flower: A Friendly Federated Learning Framework
5
5
  Home-page: https://flower.ai
6
6
  License: Apache-2.0
@@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api"
4
4
 
5
5
  [tool.poetry]
6
6
  name = "flwr-nightly"
7
- version = "1.9.0.dev20240429"
7
+ version = "1.9.0.dev20240430"
8
8
  description = "Flower: A Friendly Federated Learning Framework"
9
9
  license = "Apache-2.0"
10
10
  authors = ["The Flower Authors <hello@flower.ai>"]
@@ -32,6 +32,7 @@ from flwr.proto.fleet_pb2 import ( # pylint: disable=E0611
32
32
  CreateNodeRequest,
33
33
  DeleteNodeRequest,
34
34
  GetRunRequest,
35
+ PingRequest,
35
36
  PullTaskInsRequest,
36
37
  PushTaskResRequest,
37
38
  )
@@ -45,6 +46,7 @@ Request = Union[
45
46
  PullTaskInsRequest,
46
47
  PushTaskResRequest,
47
48
  GetRunRequest,
49
+ PingRequest,
48
50
  ]
49
51
 
50
52
 
@@ -115,7 +117,13 @@ class AuthenticateClientInterceptor(grpc.UnaryUnaryClientInterceptor): # type:
115
117
  postprocess = True
116
118
  elif isinstance(
117
119
  request,
118
- (DeleteNodeRequest, PullTaskInsRequest, PushTaskResRequest, GetRunRequest),
120
+ (
121
+ DeleteNodeRequest,
122
+ PullTaskInsRequest,
123
+ PushTaskResRequest,
124
+ GetRunRequest,
125
+ PingRequest,
126
+ ),
119
127
  ):
120
128
  if self.shared_secret is None:
121
129
  raise RuntimeError("Failure to compute hmac")
@@ -188,3 +188,29 @@ def warn_deprecated_feature(name: str) -> None:
188
188
  """,
189
189
  name,
190
190
  )
191
+
192
+
193
+ def set_logger_propagation(
194
+ child_logger: logging.Logger, value: bool = True
195
+ ) -> logging.Logger:
196
+ """Set the logger propagation attribute.
197
+
198
+ Parameters
199
+ ----------
200
+ child_logger : logging.Logger
201
+ Child logger object
202
+ value : bool
203
+ Boolean setting for propagation. If True, both parent and child logger
204
+ display messages. Otherwise, only the child logger displays a message.
205
+ This False setting prevents duplicate logs in Colab notebooks.
206
+ Reference: https://stackoverflow.com/a/19561320
207
+
208
+ Returns
209
+ -------
210
+ logging.Logger
211
+ Child logger object with updated propagation setting
212
+ """
213
+ child_logger.propagate = value
214
+ if not child_logger.propagate:
215
+ child_logger.log(logging.DEBUG, "Logger propagate set to False")
216
+ return child_logger
@@ -19,6 +19,7 @@ from __future__ import annotations
19
19
  import time
20
20
  import warnings
21
21
  from dataclasses import dataclass
22
+ from typing import Optional, cast
22
23
 
23
24
  from .record import RecordSet
24
25
 
@@ -55,17 +56,6 @@ class Metadata: # pylint: disable=too-many-instance-attributes
55
56
  is more relevant when conducting simulations.
56
57
  """
57
58
 
58
- _run_id: int
59
- _message_id: str
60
- _src_node_id: int
61
- _dst_node_id: int
62
- _reply_to_message: str
63
- _group_id: str
64
- _ttl: float
65
- _message_type: str
66
- _partition_id: int | None
67
- _created_at: float # Unix timestamp (in seconds) to be set upon message creation
68
-
69
59
  def __init__( # pylint: disable=too-many-arguments
70
60
  self,
71
61
  run_id: int,
@@ -78,95 +68,98 @@ class Metadata: # pylint: disable=too-many-instance-attributes
78
68
  message_type: str,
79
69
  partition_id: int | None = None,
80
70
  ) -> None:
81
- self._run_id = run_id
82
- self._message_id = message_id
83
- self._src_node_id = src_node_id
84
- self._dst_node_id = dst_node_id
85
- self._reply_to_message = reply_to_message
86
- self._group_id = group_id
87
- self._ttl = ttl
88
- self._message_type = message_type
89
- self._partition_id = partition_id
71
+ var_dict = {
72
+ "_run_id": run_id,
73
+ "_message_id": message_id,
74
+ "_src_node_id": src_node_id,
75
+ "_dst_node_id": dst_node_id,
76
+ "_reply_to_message": reply_to_message,
77
+ "_group_id": group_id,
78
+ "_ttl": ttl,
79
+ "_message_type": message_type,
80
+ "_partition_id": partition_id,
81
+ }
82
+ self.__dict__.update(var_dict)
90
83
 
91
84
  @property
92
85
  def run_id(self) -> int:
93
86
  """An identifier for the current run."""
94
- return self._run_id
87
+ return cast(int, self.__dict__["_run_id"])
95
88
 
96
89
  @property
97
90
  def message_id(self) -> str:
98
91
  """An identifier for the current message."""
99
- return self._message_id
92
+ return cast(str, self.__dict__["_message_id"])
100
93
 
101
94
  @property
102
95
  def src_node_id(self) -> int:
103
96
  """An identifier for the node sending this message."""
104
- return self._src_node_id
97
+ return cast(int, self.__dict__["_src_node_id"])
105
98
 
106
99
  @property
107
100
  def reply_to_message(self) -> str:
108
101
  """An identifier for the message this message replies to."""
109
- return self._reply_to_message
102
+ return cast(str, self.__dict__["_reply_to_message"])
110
103
 
111
104
  @property
112
105
  def dst_node_id(self) -> int:
113
106
  """An identifier for the node receiving this message."""
114
- return self._dst_node_id
107
+ return cast(int, self.__dict__["_dst_node_id"])
115
108
 
116
109
  @dst_node_id.setter
117
110
  def dst_node_id(self, value: int) -> None:
118
111
  """Set dst_node_id."""
119
- self._dst_node_id = value
112
+ self.__dict__["_dst_node_id"] = value
120
113
 
121
114
  @property
122
115
  def group_id(self) -> str:
123
116
  """An identifier for grouping messages."""
124
- return self._group_id
117
+ return cast(str, self.__dict__["_group_id"])
125
118
 
126
119
  @group_id.setter
127
120
  def group_id(self, value: str) -> None:
128
121
  """Set group_id."""
129
- self._group_id = value
122
+ self.__dict__["_group_id"] = value
130
123
 
131
124
  @property
132
125
  def created_at(self) -> float:
133
126
  """Unix timestamp when the message was created."""
134
- return self._created_at
127
+ return cast(float, self.__dict__["_created_at"])
135
128
 
136
129
  @created_at.setter
137
130
  def created_at(self, value: float) -> None:
138
- """Set creation timestamp for this messages."""
139
- self._created_at = value
131
+ """Set creation timestamp for this message."""
132
+ self.__dict__["_created_at"] = value
140
133
 
141
134
  @property
142
135
  def ttl(self) -> float:
143
136
  """Time-to-live for this message."""
144
- return self._ttl
137
+ return cast(float, self.__dict__["_ttl"])
145
138
 
146
139
  @ttl.setter
147
140
  def ttl(self, value: float) -> None:
148
141
  """Set ttl."""
149
- self._ttl = value
142
+ self.__dict__["_ttl"] = value
150
143
 
151
144
  @property
152
145
  def message_type(self) -> str:
153
146
  """A string that encodes the action to be executed on the receiving end."""
154
- return self._message_type
147
+ return cast(str, self.__dict__["_message_type"])
155
148
 
156
149
  @message_type.setter
157
150
  def message_type(self, value: str) -> None:
158
151
  """Set message_type."""
159
- self._message_type = value
152
+ self.__dict__["_message_type"] = value
160
153
 
161
154
  @property
162
155
  def partition_id(self) -> int | None:
163
156
  """An identifier telling which data partition a ClientApp should use."""
164
- return self._partition_id
157
+ return cast(int, self.__dict__["_partition_id"])
165
158
 
166
159
  @partition_id.setter
167
160
  def partition_id(self, value: int) -> None:
168
- """Set patition_id."""
169
- self._partition_id = value
161
+ """Set partition_id."""
162
+ self.__dict__["_partition_id"] = value
170
163
 
171
164
 
172
165
  @dataclass
@@ -181,22 +174,22 @@ class Error:
181
174
  A reason for why the error arose (e.g. an exception stack-trace)
182
175
  """
183
176
 
184
- _code: int
185
- _reason: str | None = None
186
-
187
177
  def __init__(self, code: int, reason: str | None = None) -> None:
188
- self._code = code
189
- self._reason = reason
178
+ var_dict = {
179
+ "_code": code,
180
+ "_reason": reason,
181
+ }
182
+ self.__dict__.update(var_dict)
190
183
 
191
184
  @property
192
185
  def code(self) -> int:
193
186
  """Error code."""
194
- return self._code
187
+ return cast(int, self.__dict__["_code"])
195
188
 
196
189
  @property
197
190
  def reason(self) -> str | None:
198
191
  """Reason reported about the error."""
199
- return self._reason
192
+ return cast(Optional[str], self.__dict__["_reason"])
200
193
 
201
194
 
202
195
  @dataclass
@@ -215,88 +208,70 @@ class Message:
215
208
  when processing another message.
216
209
  """
217
210
 
218
- _metadata: Metadata
219
- _content: RecordSet | None = None
220
- _error: Error | None = None
221
-
222
211
  def __init__(
223
212
  self,
224
213
  metadata: Metadata,
225
214
  content: RecordSet | None = None,
226
215
  error: Error | None = None,
227
216
  ) -> None:
228
- self._metadata = metadata
229
-
230
- # Set message creation timestamp
231
- self._metadata.created_at = time.time()
232
-
233
217
  if not (content is None) ^ (error is None):
234
218
  raise ValueError("Either `content` or `error` must be set, but not both.")
235
219
 
236
- self._content = content
237
- self._error = error
220
+ metadata.created_at = time.time() # Set the message creation timestamp
221
+ var_dict = {
222
+ "_metadata": metadata,
223
+ "_content": content,
224
+ "_error": error,
225
+ }
226
+ self.__dict__.update(var_dict)
238
227
 
239
228
  @property
240
229
  def metadata(self) -> Metadata:
241
230
  """A dataclass including information about the message to be executed."""
242
- return self._metadata
231
+ return cast(Metadata, self.__dict__["_metadata"])
243
232
 
244
233
  @property
245
234
  def content(self) -> RecordSet:
246
235
  """The content of this message."""
247
- if self._content is None:
236
+ if self.__dict__["_content"] is None:
248
237
  raise ValueError(
249
238
  "Message content is None. Use <message>.has_content() "
250
239
  "to check if a message has content."
251
240
  )
252
- return self._content
241
+ return cast(RecordSet, self.__dict__["_content"])
253
242
 
254
243
  @content.setter
255
244
  def content(self, value: RecordSet) -> None:
256
245
  """Set content."""
257
- if self._error is None:
258
- self._content = value
246
+ if self.__dict__["_error"] is None:
247
+ self.__dict__["_content"] = value
259
248
  else:
260
249
  raise ValueError("A message with an error set cannot have content.")
261
250
 
262
251
  @property
263
252
  def error(self) -> Error:
264
253
  """Error captured by this message."""
265
- if self._error is None:
254
+ if self.__dict__["_error"] is None:
266
255
  raise ValueError(
267
256
  "Message error is None. Use <message>.has_error() "
268
257
  "to check first if a message carries an error."
269
258
  )
270
- return self._error
259
+ return cast(Error, self.__dict__["_error"])
271
260
 
272
261
  @error.setter
273
262
  def error(self, value: Error) -> None:
274
263
  """Set error."""
275
264
  if self.has_content():
276
265
  raise ValueError("A message with content set cannot carry an error.")
277
- self._error = value
266
+ self.__dict__["_error"] = value
278
267
 
279
268
  def has_content(self) -> bool:
280
269
  """Return True if message has content, else False."""
281
- return self._content is not None
270
+ return self.__dict__["_content"] is not None
282
271
 
283
272
  def has_error(self) -> bool:
284
273
  """Return True if message has an error, else False."""
285
- return self._error is not None
286
-
287
- def _create_reply_metadata(self, ttl: float) -> Metadata:
288
- """Construct metadata for a reply message."""
289
- return Metadata(
290
- run_id=self.metadata.run_id,
291
- message_id="",
292
- src_node_id=self.metadata.dst_node_id,
293
- dst_node_id=self.metadata.src_node_id,
294
- reply_to_message=self.metadata.message_id,
295
- group_id=self.metadata.group_id,
296
- ttl=ttl,
297
- message_type=self.metadata.message_type,
298
- partition_id=self.metadata.partition_id,
299
- )
274
+ return self.__dict__["_error"] is not None
300
275
 
301
276
  def create_error_reply(self, error: Error, ttl: float | None = None) -> Message:
302
277
  """Construct a reply message indicating an error happened.
@@ -323,7 +298,7 @@ class Message:
323
298
  # message creation)
324
299
  ttl_ = DEFAULT_TTL if ttl is None else ttl
325
300
  # Create reply with error
326
- message = Message(metadata=self._create_reply_metadata(ttl_), error=error)
301
+ message = Message(metadata=_create_reply_metadata(self, ttl_), error=error)
327
302
 
328
303
  if ttl is None:
329
304
  # Set TTL equal to the remaining time for the received message to expire
@@ -369,7 +344,7 @@ class Message:
369
344
  ttl_ = DEFAULT_TTL if ttl is None else ttl
370
345
 
371
346
  message = Message(
372
- metadata=self._create_reply_metadata(ttl_),
347
+ metadata=_create_reply_metadata(self, ttl_),
373
348
  content=content,
374
349
  )
375
350
 
@@ -381,3 +356,18 @@ class Message:
381
356
  message.metadata.ttl = ttl
382
357
 
383
358
  return message
359
+
360
+
361
+ def _create_reply_metadata(msg: Message, ttl: float) -> Metadata:
362
+ """Construct metadata for a reply message."""
363
+ return Metadata(
364
+ run_id=msg.metadata.run_id,
365
+ message_id="",
366
+ src_node_id=msg.metadata.dst_node_id,
367
+ dst_node_id=msg.metadata.src_node_id,
368
+ reply_to_message=msg.metadata.message_id,
369
+ group_id=msg.metadata.group_id,
370
+ ttl=ttl,
371
+ message_type=msg.metadata.message_type,
372
+ partition_id=msg.metadata.partition_id,
373
+ )
@@ -24,6 +24,7 @@ from .parametersrecord import ParametersRecord
24
24
  from .typeddict import TypedDict
25
25
 
26
26
 
27
+ @dataclass
27
28
  class RecordSetData:
28
29
  """Inner data container for the RecordSet class."""
29
30
 
@@ -97,22 +98,22 @@ class RecordSet:
97
98
  metrics_records=metrics_records,
98
99
  configs_records=configs_records,
99
100
  )
100
- setattr(self, "_data", data) # noqa
101
+ self.__dict__["_data"] = data
101
102
 
102
103
  @property
103
104
  def parameters_records(self) -> TypedDict[str, ParametersRecord]:
104
105
  """Dictionary holding ParametersRecord instances."""
105
- data = cast(RecordSetData, getattr(self, "_data")) # noqa
106
+ data = cast(RecordSetData, self.__dict__["_data"])
106
107
  return data.parameters_records
107
108
 
108
109
  @property
109
110
  def metrics_records(self) -> TypedDict[str, MetricsRecord]:
110
111
  """Dictionary holding MetricsRecord instances."""
111
- data = cast(RecordSetData, getattr(self, "_data")) # noqa
112
+ data = cast(RecordSetData, self.__dict__["_data"])
112
113
  return data.metrics_records
113
114
 
114
115
  @property
115
116
  def configs_records(self) -> TypedDict[str, ConfigsRecord]:
116
117
  """Dictionary holding ConfigsRecord instances."""
117
- data = cast(RecordSetData, getattr(self, "_data")) # noqa
118
+ data = cast(RecordSetData, self.__dict__["_data"])
118
119
  return data.configs_records
@@ -36,6 +36,8 @@ from flwr.proto.fleet_pb2 import ( # pylint: disable=E0611
36
36
  DeleteNodeResponse,
37
37
  GetRunRequest,
38
38
  GetRunResponse,
39
+ PingRequest,
40
+ PingResponse,
39
41
  PullTaskInsRequest,
40
42
  PullTaskInsResponse,
41
43
  PushTaskResRequest,
@@ -51,6 +53,7 @@ Request = Union[
51
53
  PullTaskInsRequest,
52
54
  PushTaskResRequest,
53
55
  GetRunRequest,
56
+ PingRequest,
54
57
  ]
55
58
 
56
59
  Response = Union[
@@ -59,6 +62,7 @@ Response = Union[
59
62
  PullTaskInsResponse,
60
63
  PushTaskResResponse,
61
64
  GetRunResponse,
65
+ PingResponse,
62
66
  ]
63
67
 
64
68
 
@@ -140,6 +144,7 @@ class AuthenticateServerInterceptor(grpc.ServerInterceptor): # type: ignore
140
144
  PullTaskInsRequest,
141
145
  PushTaskResRequest,
142
146
  GetRunRequest,
147
+ PingRequest,
143
148
  ),
144
149
  ):
145
150
  hmac_value = base64.urlsafe_b64decode(
@@ -15,6 +15,8 @@
15
15
  """Flower simulation app."""
16
16
 
17
17
 
18
+ import asyncio
19
+ import logging
18
20
  import sys
19
21
  import threading
20
22
  import traceback
@@ -27,7 +29,7 @@ from ray.util.scheduling_strategies import NodeAffinitySchedulingStrategy
27
29
 
28
30
  from flwr.client import ClientFn
29
31
  from flwr.common import EventType, event
30
- from flwr.common.logger import log
32
+ from flwr.common.logger import log, set_logger_propagation
31
33
  from flwr.server.client_manager import ClientManager
32
34
  from flwr.server.history import History
33
35
  from flwr.server.server import Server, init_defaults, run_fl
@@ -156,6 +158,7 @@ def start_simulation(
156
158
  is an advanced feature. For all details, please refer to the Ray documentation:
157
159
  https://docs.ray.io/en/latest/ray-core/scheduling/index.html
158
160
 
161
+
159
162
  Returns
160
163
  -------
161
164
  hist : flwr.server.history.History
@@ -167,6 +170,18 @@ def start_simulation(
167
170
  {"num_clients": len(clients_ids) if clients_ids is not None else num_clients},
168
171
  )
169
172
 
173
+ # Set logger propagation
174
+ loop: Optional[asyncio.AbstractEventLoop] = None
175
+ try:
176
+ loop = asyncio.get_running_loop()
177
+ except RuntimeError:
178
+ loop = None
179
+ finally:
180
+ if loop and loop.is_running():
181
+ # Set logger propagation to False to prevent duplicated log output in Colab.
182
+ logger = logging.getLogger("flwr")
183
+ _ = set_logger_propagation(logger, False)
184
+
170
185
  # Initialize server and server config
171
186
  initialized_server, initialized_config = init_defaults(
172
187
  server=server,
@@ -28,6 +28,7 @@ import grpc
28
28
 
29
29
  from flwr.client import ClientApp
30
30
  from flwr.common import EventType, event, log
31
+ from flwr.common.logger import set_logger_propagation
31
32
  from flwr.common.typing import ConfigsRecordValues
32
33
  from flwr.server.driver import Driver, GrpcDriver
33
34
  from flwr.server.run_serverapp import run
@@ -364,6 +365,8 @@ def _run_simulation(
364
365
 
365
366
  finally:
366
367
  if run_in_thread:
368
+ # Set logger propagation to False to prevent duplicated log output in Colab.
369
+ logger = set_logger_propagation(logger, False)
367
370
  log(DEBUG, "Starting Simulation Engine on a new thread.")
368
371
  simulation_engine_th = threading.Thread(target=_main_loop, args=args)
369
372
  simulation_engine_th.start()