flwr-nightly 1.9.0.dev20240419__tar.gz → 1.9.0.dev20240422__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 (212) hide show
  1. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/PKG-INFO +1 -1
  2. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/pyproject.toml +2 -8
  3. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/client/supernode/app.py +16 -4
  4. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/compat/app.py +2 -2
  5. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/compat/app_utils.py +1 -1
  6. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/compat/driver_client_proxy.py +4 -2
  7. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/driver/__init__.py +2 -1
  8. flwr_nightly-1.9.0.dev20240419/src/py/flwr/server/driver/driver.py → flwr_nightly-1.9.0.dev20240422/src/py/flwr/server/driver/grpc_driver.py +132 -93
  9. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/run_serverapp.py +4 -4
  10. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/simulation/run_simulation.py +2 -2
  11. flwr_nightly-1.9.0.dev20240419/src/py/flwr/server/driver/grpc_driver.py +0 -129
  12. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/LICENSE +0 -0
  13. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/README.md +0 -0
  14. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/__init__.py +0 -0
  15. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/cli/__init__.py +0 -0
  16. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/cli/app.py +0 -0
  17. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/cli/config_utils.py +0 -0
  18. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/cli/example.py +0 -0
  19. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/cli/new/__init__.py +0 -0
  20. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/cli/new/new.py +0 -0
  21. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/cli/new/templates/__init__.py +0 -0
  22. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/cli/new/templates/app/.gitignore.tpl +0 -0
  23. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/cli/new/templates/app/README.md.tpl +0 -0
  24. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/cli/new/templates/app/__init__.py +0 -0
  25. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
  26. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
  27. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/cli/new/templates/app/code/client.numpy.py.tpl +0 -0
  28. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -0
  29. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -0
  30. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -0
  31. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -0
  32. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -0
  33. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +0 -0
  34. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +0 -0
  35. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +0 -0
  36. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +0 -0
  37. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/cli/run/__init__.py +0 -0
  38. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/cli/run/run.py +0 -0
  39. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/cli/utils.py +0 -0
  40. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/client/__init__.py +0 -0
  41. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/client/app.py +0 -0
  42. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/client/client.py +0 -0
  43. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/client/client_app.py +0 -0
  44. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/client/dpfedavg_numpy_client.py +0 -0
  45. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/client/grpc_client/__init__.py +0 -0
  46. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/client/grpc_client/connection.py +0 -0
  47. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/client/grpc_rere_client/__init__.py +0 -0
  48. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/client/grpc_rere_client/connection.py +0 -0
  49. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/client/heartbeat.py +0 -0
  50. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/client/message_handler/__init__.py +0 -0
  51. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/client/message_handler/message_handler.py +0 -0
  52. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/client/message_handler/task_handler.py +0 -0
  53. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/client/mod/__init__.py +0 -0
  54. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/client/mod/centraldp_mods.py +0 -0
  55. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/client/mod/comms_mods.py +0 -0
  56. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/client/mod/localdp_mod.py +0 -0
  57. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
  58. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
  59. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
  60. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/client/mod/utils.py +0 -0
  61. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/client/node_state.py +0 -0
  62. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/client/node_state_tests.py +0 -0
  63. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/client/numpy_client.py +0 -0
  64. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/client/rest_client/__init__.py +0 -0
  65. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/client/rest_client/connection.py +0 -0
  66. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/client/supernode/__init__.py +0 -0
  67. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/client/typing.py +0 -0
  68. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/common/__init__.py +0 -0
  69. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/common/address.py +0 -0
  70. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/common/constant.py +0 -0
  71. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/common/context.py +0 -0
  72. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/common/date.py +0 -0
  73. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/common/differential_privacy.py +0 -0
  74. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/common/differential_privacy_constants.py +0 -0
  75. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/common/dp.py +0 -0
  76. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/common/exit_handlers.py +0 -0
  77. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/common/grpc.py +0 -0
  78. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/common/logger.py +0 -0
  79. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/common/message.py +0 -0
  80. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/common/object_ref.py +0 -0
  81. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/common/parameter.py +0 -0
  82. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/common/pyproject.py +0 -0
  83. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/common/record/__init__.py +0 -0
  84. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/common/record/configsrecord.py +0 -0
  85. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/common/record/conversion_utils.py +0 -0
  86. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/common/record/metricsrecord.py +0 -0
  87. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/common/record/parametersrecord.py +0 -0
  88. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/common/record/recordset.py +0 -0
  89. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/common/record/typeddict.py +0 -0
  90. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/common/recordset_compat.py +0 -0
  91. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/common/retry_invoker.py +0 -0
  92. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/common/secure_aggregation/__init__.py +0 -0
  93. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
  94. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
  95. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -0
  96. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
  97. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/common/secure_aggregation/quantization.py +0 -0
  98. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
  99. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
  100. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/common/serde.py +0 -0
  101. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/common/telemetry.py +0 -0
  102. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/common/typing.py +0 -0
  103. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/common/version.py +0 -0
  104. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/proto/__init__.py +0 -0
  105. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/proto/driver_pb2.py +0 -0
  106. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/proto/driver_pb2.pyi +0 -0
  107. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/proto/driver_pb2_grpc.py +0 -0
  108. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/proto/driver_pb2_grpc.pyi +0 -0
  109. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/proto/error_pb2.py +0 -0
  110. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/proto/error_pb2.pyi +0 -0
  111. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/proto/error_pb2_grpc.py +0 -0
  112. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/proto/error_pb2_grpc.pyi +0 -0
  113. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/proto/fleet_pb2.py +0 -0
  114. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/proto/fleet_pb2.pyi +0 -0
  115. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/proto/fleet_pb2_grpc.py +0 -0
  116. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
  117. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/proto/node_pb2.py +0 -0
  118. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/proto/node_pb2.pyi +0 -0
  119. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/proto/node_pb2_grpc.py +0 -0
  120. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/proto/node_pb2_grpc.pyi +0 -0
  121. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/proto/recordset_pb2.py +0 -0
  122. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/proto/recordset_pb2.pyi +0 -0
  123. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/proto/recordset_pb2_grpc.py +0 -0
  124. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/proto/recordset_pb2_grpc.pyi +0 -0
  125. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/proto/task_pb2.py +0 -0
  126. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/proto/task_pb2.pyi +0 -0
  127. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/proto/task_pb2_grpc.py +0 -0
  128. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/proto/task_pb2_grpc.pyi +0 -0
  129. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/proto/transport_pb2.py +0 -0
  130. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/proto/transport_pb2.pyi +0 -0
  131. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/proto/transport_pb2_grpc.py +0 -0
  132. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
  133. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/py.typed +0 -0
  134. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/__init__.py +0 -0
  135. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/app.py +0 -0
  136. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/client_manager.py +0 -0
  137. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/client_proxy.py +0 -0
  138. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/compat/__init__.py +0 -0
  139. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/compat/legacy_context.py +0 -0
  140. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/criterion.py +0 -0
  141. /flwr_nightly-1.9.0.dev20240419/src/py/flwr/server/driver/abc_driver.py → /flwr_nightly-1.9.0.dev20240422/src/py/flwr/server/driver/driver.py +0 -0
  142. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/history.py +0 -0
  143. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/server.py +0 -0
  144. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/server_app.py +0 -0
  145. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/server_config.py +0 -0
  146. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/strategy/__init__.py +0 -0
  147. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/strategy/aggregate.py +0 -0
  148. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/strategy/bulyan.py +0 -0
  149. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
  150. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
  151. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
  152. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
  153. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
  154. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/strategy/fedadagrad.py +0 -0
  155. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/strategy/fedadam.py +0 -0
  156. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/strategy/fedavg.py +0 -0
  157. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/strategy/fedavg_android.py +0 -0
  158. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/strategy/fedavgm.py +0 -0
  159. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/strategy/fedmedian.py +0 -0
  160. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/strategy/fedopt.py +0 -0
  161. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/strategy/fedprox.py +0 -0
  162. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
  163. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
  164. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
  165. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
  166. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/strategy/fedyogi.py +0 -0
  167. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/strategy/krum.py +0 -0
  168. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/strategy/qfedavg.py +0 -0
  169. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/strategy/strategy.py +0 -0
  170. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/superlink/__init__.py +0 -0
  171. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/superlink/driver/__init__.py +0 -0
  172. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/superlink/driver/driver_grpc.py +0 -0
  173. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/superlink/driver/driver_servicer.py +0 -0
  174. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/superlink/fleet/__init__.py +0 -0
  175. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
  176. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
  177. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
  178. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
  179. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +0 -0
  180. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
  181. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +0 -0
  182. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
  183. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/superlink/fleet/message_handler/message_handler.py +0 -0
  184. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
  185. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +0 -0
  186. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
  187. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
  188. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
  189. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +0 -0
  190. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/superlink/fleet/vce/vce_api.py +0 -0
  191. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/superlink/state/__init__.py +0 -0
  192. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/superlink/state/in_memory_state.py +0 -0
  193. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/superlink/state/sqlite_state.py +0 -0
  194. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/superlink/state/state.py +0 -0
  195. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/superlink/state/state_factory.py +0 -0
  196. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/superlink/state/utils.py +0 -0
  197. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/typing.py +0 -0
  198. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/utils/__init__.py +0 -0
  199. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/utils/tensorboard.py +0 -0
  200. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/utils/validator.py +0 -0
  201. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/workflow/__init__.py +0 -0
  202. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/workflow/constant.py +0 -0
  203. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/workflow/default_workflows.py +0 -0
  204. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
  205. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
  206. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +0 -0
  207. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/simulation/__init__.py +0 -0
  208. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/simulation/app.py +0 -0
  209. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/simulation/ray_transport/__init__.py +0 -0
  210. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
  211. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
  212. {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/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.dev20240419
3
+ Version: 1.9.0.dev20240422
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.dev20240419"
7
+ version = "1.9.0.dev20240422"
8
8
  description = "Flower: A Friendly Federated Learning Framework"
9
9
  license = "Apache-2.0"
10
10
  authors = ["The Flower Authors <hello@flower.ai>"]
@@ -136,7 +136,7 @@ multi_line_output = 3
136
136
  include_trailing_comma = true
137
137
  force_grid_wrap = 0
138
138
  use_parentheses = true
139
- known_first_party = ["flwr", "flwr_experimental", "flwr_tool"]
139
+ known_first_party = ["flwr", "flwr_tool"]
140
140
 
141
141
  [tool.black]
142
142
  line-length = 88
@@ -170,12 +170,6 @@ plugins = [
170
170
  ignore_missing_imports = true
171
171
  strict = true
172
172
 
173
- [[tool.mypy.overrides]]
174
- module = [
175
- "flwr_experimental.*",
176
- ]
177
- ignore_errors = true
178
-
179
173
  [[tool.mypy.overrides]]
180
174
  module = [
181
175
  "importlib.metadata.*",
@@ -28,12 +28,11 @@ def run_supernode() -> None:
28
28
 
29
29
  event(EventType.RUN_SUPERNODE_ENTER)
30
30
 
31
- args = _parse_args_run_supernode().parse_args()
31
+ _ = _parse_args_run_supernode().parse_args()
32
32
 
33
33
  log(
34
34
  DEBUG,
35
- "Flower will load ClientApp `%s`",
36
- getattr(args, "client-app"),
35
+ "Flower SuperNode starting...",
37
36
  )
38
37
 
39
38
  # Graceful shutdown
@@ -48,7 +47,16 @@ def _parse_args_run_supernode() -> argparse.ArgumentParser:
48
47
  description="Start a Flower SuperNode",
49
48
  )
50
49
 
51
- parse_args_run_client_app(parser=parser)
50
+ parser.add_argument(
51
+ "client-app",
52
+ nargs="?",
53
+ default="",
54
+ help="For example: `client:app` or `project.package.module:wrapper.app`. "
55
+ "This is optional and serves as the default ClientApp to be loaded when "
56
+ "the ServerApp does not specify `fab_id` and `fab_version`. "
57
+ "If not provided, defaults to an empty string.",
58
+ )
59
+ _parse_args_common(parser)
52
60
 
53
61
  return parser
54
62
 
@@ -59,6 +67,10 @@ def parse_args_run_client_app(parser: argparse.ArgumentParser) -> None:
59
67
  "client-app",
60
68
  help="For example: `client:app` or `project.package.module:wrapper.app`",
61
69
  )
70
+ _parse_args_common(parser)
71
+
72
+
73
+ def _parse_args_common(parser: argparse.ArgumentParser) -> None:
62
74
  parser.add_argument(
63
75
  "--insecure",
64
76
  action="store_true",
@@ -29,7 +29,7 @@ from flwr.server.server import Server, init_defaults, run_fl
29
29
  from flwr.server.server_config import ServerConfig
30
30
  from flwr.server.strategy import Strategy
31
31
 
32
- from ..driver import Driver
32
+ from ..driver import Driver, GrpcDriver
33
33
  from .app_utils import start_update_client_manager_thread
34
34
 
35
35
  DEFAULT_SERVER_ADDRESS_DRIVER = "[::]:9091"
@@ -114,7 +114,7 @@ def start_driver( # pylint: disable=too-many-arguments, too-many-locals
114
114
  # Create the Driver
115
115
  if isinstance(root_certificates, str):
116
116
  root_certificates = Path(root_certificates).read_bytes()
117
- driver = Driver(
117
+ driver = GrpcDriver(
118
118
  driver_service_address=address, root_certificates=root_certificates
119
119
  )
120
120
 
@@ -89,7 +89,7 @@ def _update_client_manager(
89
89
  for node_id in new_nodes:
90
90
  client_proxy = DriverClientProxy(
91
91
  node_id=node_id,
92
- driver=driver.grpc_driver, # type: ignore
92
+ driver=driver.grpc_driver_helper, # type: ignore
93
93
  anonymous=False,
94
94
  run_id=driver.run_id, # type: ignore
95
95
  )
@@ -25,7 +25,7 @@ from flwr.common import serde
25
25
  from flwr.proto import driver_pb2, node_pb2, task_pb2 # pylint: disable=E0611
26
26
  from flwr.server.client_proxy import ClientProxy
27
27
 
28
- from ..driver.grpc_driver import GrpcDriver
28
+ from ..driver.grpc_driver import GrpcDriverHelper
29
29
 
30
30
  SLEEP_TIME = 1
31
31
 
@@ -33,7 +33,9 @@ SLEEP_TIME = 1
33
33
  class DriverClientProxy(ClientProxy):
34
34
  """Flower client proxy which delegates work using the Driver API."""
35
35
 
36
- def __init__(self, node_id: int, driver: GrpcDriver, anonymous: bool, run_id: int):
36
+ def __init__(
37
+ self, node_id: int, driver: GrpcDriverHelper, anonymous: bool, run_id: int
38
+ ):
37
39
  super().__init__(str(node_id))
38
40
  self.node_id = node_id
39
41
  self.driver = driver
@@ -16,9 +16,10 @@
16
16
 
17
17
 
18
18
  from .driver import Driver
19
- from .grpc_driver import GrpcDriver
19
+ from .grpc_driver import GrpcDriver, GrpcDriverHelper
20
20
 
21
21
  __all__ = [
22
22
  "Driver",
23
23
  "GrpcDriver",
24
+ "GrpcDriverHelper",
24
25
  ]
@@ -12,27 +12,130 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
  # ==============================================================================
15
- """Flower driver service client."""
15
+ """Flower gRPC Driver."""
16
16
 
17
17
  import time
18
18
  import warnings
19
+ from logging import DEBUG, ERROR, WARNING
19
20
  from typing import Iterable, List, Optional, Tuple
20
21
 
21
- from flwr.common import DEFAULT_TTL, Message, Metadata, RecordSet
22
+ import grpc
23
+
24
+ from flwr.common import DEFAULT_TTL, EventType, Message, Metadata, RecordSet, event
25
+ from flwr.common.grpc import create_channel
26
+ from flwr.common.logger import log
22
27
  from flwr.common.serde import message_from_taskres, message_to_taskins
23
28
  from flwr.proto.driver_pb2 import ( # pylint: disable=E0611
24
29
  CreateRunRequest,
30
+ CreateRunResponse,
25
31
  GetNodesRequest,
32
+ GetNodesResponse,
26
33
  PullTaskResRequest,
34
+ PullTaskResResponse,
27
35
  PushTaskInsRequest,
36
+ PushTaskInsResponse,
28
37
  )
38
+ from flwr.proto.driver_pb2_grpc import DriverStub # pylint: disable=E0611
29
39
  from flwr.proto.node_pb2 import Node # pylint: disable=E0611
30
40
  from flwr.proto.task_pb2 import TaskIns # pylint: disable=E0611
31
41
 
32
- from .grpc_driver import DEFAULT_SERVER_ADDRESS_DRIVER, GrpcDriver
42
+ from .driver import Driver
43
+
44
+ DEFAULT_SERVER_ADDRESS_DRIVER = "[::]:9091"
45
+
46
+ ERROR_MESSAGE_DRIVER_NOT_CONNECTED = """
47
+ [Driver] Error: Not connected.
48
+
49
+ Call `connect()` on the `GrpcDriverHelper` instance before calling any of the other
50
+ `GrpcDriverHelper` methods.
51
+ """
52
+
53
+
54
+ class GrpcDriverHelper:
55
+ """`GrpcDriverHelper` provides access to the gRPC Driver API/service."""
56
+
57
+ def __init__(
58
+ self,
59
+ driver_service_address: str = DEFAULT_SERVER_ADDRESS_DRIVER,
60
+ root_certificates: Optional[bytes] = None,
61
+ ) -> None:
62
+ self.driver_service_address = driver_service_address
63
+ self.root_certificates = root_certificates
64
+ self.channel: Optional[grpc.Channel] = None
65
+ self.stub: Optional[DriverStub] = None
66
+
67
+ def connect(self) -> None:
68
+ """Connect to the Driver API."""
69
+ event(EventType.DRIVER_CONNECT)
70
+ if self.channel is not None or self.stub is not None:
71
+ log(WARNING, "Already connected")
72
+ return
73
+ self.channel = create_channel(
74
+ server_address=self.driver_service_address,
75
+ insecure=(self.root_certificates is None),
76
+ root_certificates=self.root_certificates,
77
+ )
78
+ self.stub = DriverStub(self.channel)
79
+ log(DEBUG, "[Driver] Connected to %s", self.driver_service_address)
80
+
81
+ def disconnect(self) -> None:
82
+ """Disconnect from the Driver API."""
83
+ event(EventType.DRIVER_DISCONNECT)
84
+ if self.channel is None or self.stub is None:
85
+ log(DEBUG, "Already disconnected")
86
+ return
87
+ channel = self.channel
88
+ self.channel = None
89
+ self.stub = None
90
+ channel.close()
91
+ log(DEBUG, "[Driver] Disconnected")
92
+
93
+ def create_run(self, req: CreateRunRequest) -> CreateRunResponse:
94
+ """Request for run ID."""
95
+ # Check if channel is open
96
+ if self.stub is None:
97
+ log(ERROR, ERROR_MESSAGE_DRIVER_NOT_CONNECTED)
98
+ raise ConnectionError("`GrpcDriverHelper` instance not connected")
99
+
100
+ # Call Driver API
101
+ res: CreateRunResponse = self.stub.CreateRun(request=req)
102
+ return res
103
+
104
+ def get_nodes(self, req: GetNodesRequest) -> GetNodesResponse:
105
+ """Get client IDs."""
106
+ # Check if channel is open
107
+ if self.stub is None:
108
+ log(ERROR, ERROR_MESSAGE_DRIVER_NOT_CONNECTED)
109
+ raise ConnectionError("`GrpcDriverHelper` instance not connected")
110
+
111
+ # Call gRPC Driver API
112
+ res: GetNodesResponse = self.stub.GetNodes(request=req)
113
+ return res
114
+
115
+ def push_task_ins(self, req: PushTaskInsRequest) -> PushTaskInsResponse:
116
+ """Schedule tasks."""
117
+ # Check if channel is open
118
+ if self.stub is None:
119
+ log(ERROR, ERROR_MESSAGE_DRIVER_NOT_CONNECTED)
120
+ raise ConnectionError("`GrpcDriverHelper` instance not connected")
121
+
122
+ # Call gRPC Driver API
123
+ res: PushTaskInsResponse = self.stub.PushTaskIns(request=req)
124
+ return res
33
125
 
126
+ def pull_task_res(self, req: PullTaskResRequest) -> PullTaskResResponse:
127
+ """Get task results."""
128
+ # Check if channel is open
129
+ if self.stub is None:
130
+ log(ERROR, ERROR_MESSAGE_DRIVER_NOT_CONNECTED)
131
+ raise ConnectionError("`GrpcDriverHelper` instance not connected")
34
132
 
35
- class Driver:
133
+ # Call Driver API
134
+ res: PullTaskResResponse = self.stub.PullTaskRes(request=req)
135
+ return res
136
+
137
+
138
+ class GrpcDriver(Driver):
36
139
  """`Driver` class provides an interface to the Driver API.
37
140
 
38
141
  Parameters
@@ -57,22 +160,22 @@ class Driver:
57
160
  ) -> None:
58
161
  self.addr = driver_service_address
59
162
  self.root_certificates = root_certificates
60
- self.grpc_driver: Optional[GrpcDriver] = None
163
+ self.grpc_driver_helper: Optional[GrpcDriverHelper] = None
61
164
  self.run_id: Optional[int] = None
62
165
  self.node = Node(node_id=0, anonymous=True)
63
166
 
64
- def _get_grpc_driver_and_run_id(self) -> Tuple[GrpcDriver, int]:
65
- # Check if the GrpcDriver is initialized
66
- if self.grpc_driver is None or self.run_id is None:
167
+ def _get_grpc_driver_helper_and_run_id(self) -> Tuple[GrpcDriverHelper, int]:
168
+ # Check if the GrpcDriverHelper is initialized
169
+ if self.grpc_driver_helper is None or self.run_id is None:
67
170
  # Connect and create run
68
- self.grpc_driver = GrpcDriver(
171
+ self.grpc_driver_helper = GrpcDriverHelper(
69
172
  driver_service_address=self.addr,
70
173
  root_certificates=self.root_certificates,
71
174
  )
72
- self.grpc_driver.connect()
73
- res = self.grpc_driver.create_run(CreateRunRequest())
175
+ self.grpc_driver_helper.connect()
176
+ res = self.grpc_driver_helper.create_run(CreateRunRequest())
74
177
  self.run_id = res.run_id
75
- return self.grpc_driver, self.run_id
178
+ return self.grpc_driver_helper, self.run_id
76
179
 
77
180
  def _check_message(self, message: Message) -> None:
78
181
  # Check if the message is valid
@@ -97,32 +200,8 @@ class Driver:
97
200
 
98
201
  This method constructs a new `Message` with given content and metadata.
99
202
  The `run_id` and `src_node_id` will be set automatically.
100
-
101
- Parameters
102
- ----------
103
- content : RecordSet
104
- The content for the new message. This holds records that are to be sent
105
- to the destination node.
106
- message_type : str
107
- The type of the message, defining the action to be executed on
108
- the receiving end.
109
- dst_node_id : int
110
- The ID of the destination node to which the message is being sent.
111
- group_id : str
112
- The ID of the group to which this message is associated. In some settings,
113
- this is used as the FL round.
114
- ttl : Optional[float] (default: None)
115
- Time-to-live for the round trip of this message, i.e., the time from sending
116
- this message to receiving a reply. It specifies in seconds the duration for
117
- which the message and its potential reply are considered valid. If unset,
118
- the default TTL (i.e., `common.DEFAULT_TTL`) will be used.
119
-
120
- Returns
121
- -------
122
- message : Message
123
- A new `Message` instance with the specified content and metadata.
124
203
  """
125
- _, run_id = self._get_grpc_driver_and_run_id()
204
+ _, run_id = self._get_grpc_driver_helper_and_run_id()
126
205
  if ttl:
127
206
  warnings.warn(
128
207
  "A custom TTL was set, but note that the SuperLink does not enforce "
@@ -146,9 +225,9 @@ class Driver:
146
225
 
147
226
  def get_node_ids(self) -> List[int]:
148
227
  """Get node IDs."""
149
- grpc_driver, run_id = self._get_grpc_driver_and_run_id()
150
- # Call GrpcDriver method
151
- res = grpc_driver.get_nodes(GetNodesRequest(run_id=run_id))
228
+ grpc_driver_helper, run_id = self._get_grpc_driver_helper_and_run_id()
229
+ # Call GrpcDriverHelper method
230
+ res = grpc_driver_helper.get_nodes(GetNodesRequest(run_id=run_id))
152
231
  return [node.node_id for node in res.nodes]
153
232
 
154
233
  def push_messages(self, messages: Iterable[Message]) -> Iterable[str]:
@@ -156,19 +235,8 @@ class Driver:
156
235
 
157
236
  This method takes an iterable of messages and sends each message
158
237
  to the node specified in `dst_node_id`.
159
-
160
- Parameters
161
- ----------
162
- messages : Iterable[Message]
163
- An iterable of messages to be sent.
164
-
165
- Returns
166
- -------
167
- message_ids : Iterable[str]
168
- An iterable of IDs for the messages that were sent, which can be used
169
- to pull replies.
170
238
  """
171
- grpc_driver, _ = self._get_grpc_driver_and_run_id()
239
+ grpc_driver_helper, _ = self._get_grpc_driver_helper_and_run_id()
172
240
  # Construct TaskIns
173
241
  task_ins_list: List[TaskIns] = []
174
242
  for msg in messages:
@@ -178,27 +246,19 @@ class Driver:
178
246
  taskins = message_to_taskins(msg)
179
247
  # Add to list
180
248
  task_ins_list.append(taskins)
181
- # Call GrpcDriver method
182
- res = grpc_driver.push_task_ins(PushTaskInsRequest(task_ins_list=task_ins_list))
249
+ # Call GrpcDriverHelper method
250
+ res = grpc_driver_helper.push_task_ins(
251
+ PushTaskInsRequest(task_ins_list=task_ins_list)
252
+ )
183
253
  return list(res.task_ids)
184
254
 
185
255
  def pull_messages(self, message_ids: Iterable[str]) -> Iterable[Message]:
186
256
  """Pull messages based on message IDs.
187
257
 
188
- This method is used to collect messages from the SuperLink
189
- that correspond to a set of given message IDs.
190
-
191
- Parameters
192
- ----------
193
- message_ids : Iterable[str]
194
- An iterable of message IDs for which reply messages are to be retrieved.
195
-
196
- Returns
197
- -------
198
- messages : Iterable[Message]
199
- An iterable of messages received.
258
+ This method is used to collect messages from the SuperLink that correspond to a
259
+ set of given message IDs.
200
260
  """
201
- grpc_driver, _ = self._get_grpc_driver_and_run_id()
261
+ grpc_driver, _ = self._get_grpc_driver_helper_and_run_id()
202
262
  # Pull TaskRes
203
263
  res = grpc_driver.pull_task_res(
204
264
  PullTaskResRequest(node=self.node, task_ids=message_ids)
@@ -216,29 +276,8 @@ class Driver:
216
276
  """Push messages to specified node IDs and pull the reply messages.
217
277
 
218
278
  This method sends a list of messages to their destination node IDs and then
219
- waits for the replies. It continues to pull replies until either all
220
- replies are received or the specified timeout duration is exceeded.
221
-
222
- Parameters
223
- ----------
224
- messages : Iterable[Message]
225
- An iterable of messages to be sent.
226
- timeout : Optional[float] (default: None)
227
- The timeout duration in seconds. If specified, the method will wait for
228
- replies for this duration. If `None`, there is no time limit and the method
229
- will wait until replies for all messages are received.
230
-
231
- Returns
232
- -------
233
- replies : Iterable[Message]
234
- An iterable of reply messages received from the SuperLink.
235
-
236
- Notes
237
- -----
238
- This method uses `push_messages` to send the messages and `pull_messages`
239
- to collect the replies. If `timeout` is set, the method may not return
240
- replies for all sent messages. A message remains valid until its TTL,
241
- which is not affected by `timeout`.
279
+ waits for the replies. It continues to pull replies until either all replies are
280
+ received or the specified timeout duration is exceeded.
242
281
  """
243
282
  # Push messages
244
283
  msg_ids = set(self.push_messages(messages))
@@ -260,8 +299,8 @@ class Driver:
260
299
 
261
300
  def close(self) -> None:
262
301
  """Disconnect from the SuperLink if connected."""
263
- # Check if GrpcDriver is initialized
264
- if self.grpc_driver is None:
302
+ # Check if GrpcDriverHelper is initialized
303
+ if self.grpc_driver_helper is None:
265
304
  return
266
305
  # Disconnect
267
- self.grpc_driver.disconnect()
306
+ self.grpc_driver_helper.disconnect()
@@ -25,7 +25,7 @@ from flwr.common import Context, EventType, RecordSet, event
25
25
  from flwr.common.logger import log, update_console_handler
26
26
  from flwr.common.object_ref import load_app
27
27
 
28
- from .driver.driver import Driver
28
+ from .driver import Driver, GrpcDriver
29
29
  from .server_app import LoadServerAppError, ServerApp
30
30
 
31
31
 
@@ -128,13 +128,13 @@ def run_server_app() -> None:
128
128
  server_app_dir = args.dir
129
129
  server_app_attr = getattr(args, "server-app")
130
130
 
131
- # Initialize Driver
132
- driver = Driver(
131
+ # Initialize GrpcDriver
132
+ driver = GrpcDriver(
133
133
  driver_service_address=args.server,
134
134
  root_certificates=root_certificates,
135
135
  )
136
136
 
137
- # Run the Server App with the Driver
137
+ # Run the ServerApp with the Driver
138
138
  run(driver=driver, server_app_dir=server_app_dir, server_app_attr=server_app_attr)
139
139
 
140
140
  # Clean up
@@ -29,7 +29,7 @@ import grpc
29
29
  from flwr.client import ClientApp
30
30
  from flwr.common import EventType, event, log
31
31
  from flwr.common.typing import ConfigsRecordValues
32
- from flwr.server.driver.driver import Driver
32
+ from flwr.server.driver import Driver, GrpcDriver
33
33
  from flwr.server.run_serverapp import run
34
34
  from flwr.server.server_app import ServerApp
35
35
  from flwr.server.superlink.driver.driver_grpc import run_driver_api_grpc
@@ -204,7 +204,7 @@ def _main_loop(
204
204
  serverapp_th = None
205
205
  try:
206
206
  # Initialize Driver
207
- driver = Driver(
207
+ driver = GrpcDriver(
208
208
  driver_service_address=driver_api_address,
209
209
  root_certificates=None,
210
210
  )
@@ -1,129 +0,0 @@
1
- # Copyright 2023 Flower Labs GmbH. All Rights Reserved.
2
- #
3
- # Licensed under the Apache License, Version 2.0 (the "License");
4
- # you may not use this file except in compliance with the License.
5
- # You may obtain a copy of the License at
6
- #
7
- # http://www.apache.org/licenses/LICENSE-2.0
8
- #
9
- # Unless required by applicable law or agreed to in writing, software
10
- # distributed under the License is distributed on an "AS IS" BASIS,
11
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
- # See the License for the specific language governing permissions and
13
- # limitations under the License.
14
- # ==============================================================================
15
- """Flower driver service client."""
16
-
17
-
18
- from logging import DEBUG, ERROR, WARNING
19
- from typing import Optional
20
-
21
- import grpc
22
-
23
- from flwr.common import EventType, event
24
- from flwr.common.grpc import create_channel
25
- from flwr.common.logger import log
26
- from flwr.proto.driver_pb2 import ( # pylint: disable=E0611
27
- CreateRunRequest,
28
- CreateRunResponse,
29
- GetNodesRequest,
30
- GetNodesResponse,
31
- PullTaskResRequest,
32
- PullTaskResResponse,
33
- PushTaskInsRequest,
34
- PushTaskInsResponse,
35
- )
36
- from flwr.proto.driver_pb2_grpc import DriverStub # pylint: disable=E0611
37
-
38
- DEFAULT_SERVER_ADDRESS_DRIVER = "[::]:9091"
39
-
40
- ERROR_MESSAGE_DRIVER_NOT_CONNECTED = """
41
- [Driver] Error: Not connected.
42
-
43
- Call `connect()` on the `GrpcDriver` instance before calling any of the other
44
- `GrpcDriver` methods.
45
- """
46
-
47
-
48
- class GrpcDriver:
49
- """`GrpcDriver` provides access to the gRPC Driver API/service."""
50
-
51
- def __init__(
52
- self,
53
- driver_service_address: str = DEFAULT_SERVER_ADDRESS_DRIVER,
54
- root_certificates: Optional[bytes] = None,
55
- ) -> None:
56
- self.driver_service_address = driver_service_address
57
- self.root_certificates = root_certificates
58
- self.channel: Optional[grpc.Channel] = None
59
- self.stub: Optional[DriverStub] = None
60
-
61
- def connect(self) -> None:
62
- """Connect to the Driver API."""
63
- event(EventType.DRIVER_CONNECT)
64
- if self.channel is not None or self.stub is not None:
65
- log(WARNING, "Already connected")
66
- return
67
- self.channel = create_channel(
68
- server_address=self.driver_service_address,
69
- insecure=(self.root_certificates is None),
70
- root_certificates=self.root_certificates,
71
- )
72
- self.stub = DriverStub(self.channel)
73
- log(DEBUG, "[Driver] Connected to %s", self.driver_service_address)
74
-
75
- def disconnect(self) -> None:
76
- """Disconnect from the Driver API."""
77
- event(EventType.DRIVER_DISCONNECT)
78
- if self.channel is None or self.stub is None:
79
- log(DEBUG, "Already disconnected")
80
- return
81
- channel = self.channel
82
- self.channel = None
83
- self.stub = None
84
- channel.close()
85
- log(DEBUG, "[Driver] Disconnected")
86
-
87
- def create_run(self, req: CreateRunRequest) -> CreateRunResponse:
88
- """Request for run ID."""
89
- # Check if channel is open
90
- if self.stub is None:
91
- log(ERROR, ERROR_MESSAGE_DRIVER_NOT_CONNECTED)
92
- raise ConnectionError("`GrpcDriver` instance not connected")
93
-
94
- # Call Driver API
95
- res: CreateRunResponse = self.stub.CreateRun(request=req)
96
- return res
97
-
98
- def get_nodes(self, req: GetNodesRequest) -> GetNodesResponse:
99
- """Get client IDs."""
100
- # Check if channel is open
101
- if self.stub is None:
102
- log(ERROR, ERROR_MESSAGE_DRIVER_NOT_CONNECTED)
103
- raise ConnectionError("`GrpcDriver` instance not connected")
104
-
105
- # Call gRPC Driver API
106
- res: GetNodesResponse = self.stub.GetNodes(request=req)
107
- return res
108
-
109
- def push_task_ins(self, req: PushTaskInsRequest) -> PushTaskInsResponse:
110
- """Schedule tasks."""
111
- # Check if channel is open
112
- if self.stub is None:
113
- log(ERROR, ERROR_MESSAGE_DRIVER_NOT_CONNECTED)
114
- raise ConnectionError("`GrpcDriver` instance not connected")
115
-
116
- # Call gRPC Driver API
117
- res: PushTaskInsResponse = self.stub.PushTaskIns(request=req)
118
- return res
119
-
120
- def pull_task_res(self, req: PullTaskResRequest) -> PullTaskResResponse:
121
- """Get task results."""
122
- # Check if channel is open
123
- if self.stub is None:
124
- log(ERROR, ERROR_MESSAGE_DRIVER_NOT_CONNECTED)
125
- raise ConnectionError("`GrpcDriver` instance not connected")
126
-
127
- # Call Driver API
128
- res: PullTaskResResponse = self.stub.PullTaskRes(request=req)
129
- return res