flwr-nightly 1.11.0.dev20240813__tar.gz → 1.11.0.dev20240821__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 (295) hide show
  1. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/PKG-INFO +2 -2
  2. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/README.md +1 -1
  3. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/pyproject.toml +2 -2
  4. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/config_utils.py +2 -2
  5. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/install.py +3 -1
  6. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/run/run.py +15 -11
  7. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/client/app.py +132 -14
  8. flwr_nightly-1.11.0.dev20240821/src/py/flwr/client/clientapp/__init__.py +22 -0
  9. flwr_nightly-1.11.0.dev20240821/src/py/flwr/client/clientapp/app.py +233 -0
  10. flwr_nightly-1.11.0.dev20240821/src/py/flwr/client/clientapp/clientappio_servicer.py +244 -0
  11. flwr_nightly-1.11.0.dev20240821/src/py/flwr/client/clientapp/utils.py +108 -0
  12. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/client/grpc_rere_client/connection.py +9 -1
  13. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/client/node_state.py +17 -4
  14. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/client/rest_client/connection.py +16 -3
  15. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/client/supernode/__init__.py +0 -2
  16. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/client/supernode/app.py +37 -122
  17. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/common/__init__.py +4 -0
  18. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/common/config.py +31 -10
  19. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/common/record/configsrecord.py +49 -15
  20. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/common/record/metricsrecord.py +54 -14
  21. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/common/record/parametersrecord.py +84 -17
  22. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/common/record/recordset.py +80 -8
  23. flwr_nightly-1.11.0.dev20240821/src/py/flwr/common/record/typeddict.py +75 -0
  24. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/common/recordset_compat.py +6 -6
  25. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/common/serde.py +24 -2
  26. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/common/typing.py +1 -0
  27. flwr_nightly-1.11.0.dev20240821/src/py/flwr/proto/clientappio_pb2.py +45 -0
  28. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/clientappio_pb2.pyi +24 -2
  29. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/clientappio_pb2_grpc.py +34 -0
  30. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/clientappio_pb2_grpc.pyi +13 -0
  31. flwr_nightly-1.11.0.dev20240821/src/py/flwr/proto/exec_pb2.py +44 -0
  32. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/exec_pb2.pyi +7 -4
  33. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/message_pb2.py +2 -2
  34. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/message_pb2.pyi +4 -1
  35. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/app.py +15 -0
  36. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/driver/grpc_driver.py +1 -0
  37. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/run_serverapp.py +18 -2
  38. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/server.py +3 -1
  39. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/superlink/driver/driver_grpc.py +3 -0
  40. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/superlink/driver/driver_servicer.py +32 -4
  41. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/superlink/ffs/disk_ffs.py +6 -3
  42. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/superlink/ffs/ffs.py +3 -3
  43. flwr_nightly-1.11.0.dev20240821/src/py/flwr/server/superlink/ffs/ffs_factory.py +47 -0
  44. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +12 -4
  45. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +8 -2
  46. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/superlink/fleet/message_handler/message_handler.py +16 -1
  47. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +5 -2
  48. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/superlink/fleet/vce/vce_api.py +2 -2
  49. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/superlink/state/in_memory_state.py +7 -5
  50. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/superlink/state/sqlite_state.py +17 -7
  51. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/superlink/state/state.py +4 -3
  52. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/workflow/default_workflows.py +3 -1
  53. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/simulation/run_simulation.py +5 -67
  54. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/superexec/app.py +3 -3
  55. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/superexec/deployment.py +8 -9
  56. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/superexec/exec_servicer.py +1 -1
  57. flwr_nightly-1.11.0.dev20240813/src/py/flwr/common/record/typeddict.py +0 -113
  58. flwr_nightly-1.11.0.dev20240813/src/py/flwr/proto/clientappio_pb2.py +0 -41
  59. flwr_nightly-1.11.0.dev20240813/src/py/flwr/proto/exec_pb2.py +0 -43
  60. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/LICENSE +0 -0
  61. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/__init__.py +0 -0
  62. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/__init__.py +0 -0
  63. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/app.py +0 -0
  64. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/build.py +0 -0
  65. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/example.py +0 -0
  66. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/new/__init__.py +0 -0
  67. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/new/new.py +0 -0
  68. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/new/templates/__init__.py +0 -0
  69. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/new/templates/app/.gitignore.tpl +0 -0
  70. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/new/templates/app/README.flowertune.md.tpl +0 -0
  71. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/new/templates/app/README.md.tpl +0 -0
  72. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/new/templates/app/__init__.py +0 -0
  73. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
  74. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
  75. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/new/templates/app/code/client.huggingface.py.tpl +0 -0
  76. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/new/templates/app/code/client.jax.py.tpl +0 -0
  77. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/new/templates/app/code/client.mlx.py.tpl +0 -0
  78. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/new/templates/app/code/client.numpy.py.tpl +0 -0
  79. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -0
  80. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl +0 -0
  81. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -0
  82. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/new/templates/app/code/flwr_tune/__init__.py +0 -0
  83. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/new/templates/app/code/flwr_tune/app.py.tpl +0 -0
  84. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/new/templates/app/code/flwr_tune/client.py.tpl +0 -0
  85. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/new/templates/app/code/flwr_tune/config.yaml.tpl +0 -0
  86. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/new/templates/app/code/flwr_tune/dataset.py.tpl +0 -0
  87. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/new/templates/app/code/flwr_tune/models.py.tpl +0 -0
  88. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/new/templates/app/code/flwr_tune/server.py.tpl +0 -0
  89. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/new/templates/app/code/flwr_tune/static_config.yaml.tpl +0 -0
  90. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/new/templates/app/code/server.huggingface.py.tpl +0 -0
  91. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/new/templates/app/code/server.jax.py.tpl +0 -0
  92. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/new/templates/app/code/server.mlx.py.tpl +0 -0
  93. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -0
  94. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -0
  95. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/new/templates/app/code/server.sklearn.py.tpl +0 -0
  96. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -0
  97. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/new/templates/app/code/task.huggingface.py.tpl +0 -0
  98. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/new/templates/app/code/task.jax.py.tpl +0 -0
  99. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/new/templates/app/code/task.mlx.py.tpl +0 -0
  100. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +0 -0
  101. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/new/templates/app/code/task.tensorflow.py.tpl +0 -0
  102. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +0 -0
  103. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl +0 -0
  104. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/new/templates/app/pyproject.jax.toml.tpl +0 -0
  105. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +0 -0
  106. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +0 -0
  107. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +0 -0
  108. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +0 -0
  109. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +0 -0
  110. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/run/__init__.py +0 -0
  111. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/utils.py +0 -0
  112. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/client/__init__.py +0 -0
  113. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/client/client.py +0 -0
  114. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/client/client_app.py +0 -0
  115. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/client/dpfedavg_numpy_client.py +0 -0
  116. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/client/grpc_adapter_client/__init__.py +0 -0
  117. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/client/grpc_adapter_client/connection.py +0 -0
  118. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/client/grpc_client/__init__.py +0 -0
  119. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/client/grpc_client/connection.py +0 -0
  120. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/client/grpc_rere_client/__init__.py +0 -0
  121. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/client/grpc_rere_client/client_interceptor.py +0 -0
  122. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/client/grpc_rere_client/grpc_adapter.py +0 -0
  123. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/client/heartbeat.py +0 -0
  124. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/client/message_handler/__init__.py +0 -0
  125. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/client/message_handler/message_handler.py +0 -0
  126. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/client/message_handler/task_handler.py +0 -0
  127. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/client/mod/__init__.py +0 -0
  128. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/client/mod/centraldp_mods.py +0 -0
  129. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/client/mod/comms_mods.py +0 -0
  130. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/client/mod/localdp_mod.py +0 -0
  131. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
  132. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
  133. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
  134. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/client/mod/utils.py +0 -0
  135. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/client/node_state_tests.py +0 -0
  136. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/client/numpy_client.py +0 -0
  137. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/client/rest_client/__init__.py +0 -0
  138. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/client/typing.py +0 -0
  139. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/common/address.py +0 -0
  140. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/common/constant.py +0 -0
  141. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/common/context.py +0 -0
  142. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/common/date.py +0 -0
  143. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/common/differential_privacy.py +0 -0
  144. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/common/differential_privacy_constants.py +0 -0
  145. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/common/dp.py +0 -0
  146. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/common/exit_handlers.py +0 -0
  147. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/common/grpc.py +0 -0
  148. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/common/logger.py +0 -0
  149. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/common/message.py +0 -0
  150. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/common/object_ref.py +0 -0
  151. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/common/parameter.py +0 -0
  152. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/common/pyproject.py +0 -0
  153. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/common/record/__init__.py +0 -0
  154. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/common/record/conversion_utils.py +0 -0
  155. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/common/retry_invoker.py +0 -0
  156. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/common/secure_aggregation/__init__.py +0 -0
  157. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
  158. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
  159. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -0
  160. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
  161. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/common/secure_aggregation/quantization.py +0 -0
  162. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
  163. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
  164. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/common/telemetry.py +0 -0
  165. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/common/version.py +0 -0
  166. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/__init__.py +0 -0
  167. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/common_pb2.py +0 -0
  168. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/common_pb2.pyi +0 -0
  169. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/common_pb2_grpc.py +0 -0
  170. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/common_pb2_grpc.pyi +0 -0
  171. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/driver_pb2.py +0 -0
  172. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/driver_pb2.pyi +0 -0
  173. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/driver_pb2_grpc.py +0 -0
  174. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/driver_pb2_grpc.pyi +0 -0
  175. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/error_pb2.py +0 -0
  176. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/error_pb2.pyi +0 -0
  177. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/error_pb2_grpc.py +0 -0
  178. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/error_pb2_grpc.pyi +0 -0
  179. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/exec_pb2_grpc.py +0 -0
  180. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/exec_pb2_grpc.pyi +0 -0
  181. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/fab_pb2.py +0 -0
  182. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/fab_pb2.pyi +0 -0
  183. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/fab_pb2_grpc.py +0 -0
  184. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/fab_pb2_grpc.pyi +0 -0
  185. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/fleet_pb2.py +0 -0
  186. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/fleet_pb2.pyi +0 -0
  187. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/fleet_pb2_grpc.py +0 -0
  188. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
  189. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/grpcadapter_pb2.py +0 -0
  190. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/grpcadapter_pb2.pyi +0 -0
  191. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/grpcadapter_pb2_grpc.py +0 -0
  192. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/grpcadapter_pb2_grpc.pyi +0 -0
  193. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/message_pb2_grpc.py +0 -0
  194. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/message_pb2_grpc.pyi +0 -0
  195. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/node_pb2.py +0 -0
  196. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/node_pb2.pyi +0 -0
  197. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/node_pb2_grpc.py +0 -0
  198. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/node_pb2_grpc.pyi +0 -0
  199. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/recordset_pb2.py +0 -0
  200. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/recordset_pb2.pyi +0 -0
  201. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/recordset_pb2_grpc.py +0 -0
  202. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/recordset_pb2_grpc.pyi +0 -0
  203. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/run_pb2.py +0 -0
  204. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/run_pb2.pyi +0 -0
  205. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/run_pb2_grpc.py +0 -0
  206. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/run_pb2_grpc.pyi +0 -0
  207. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/task_pb2.py +0 -0
  208. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/task_pb2.pyi +0 -0
  209. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/task_pb2_grpc.py +0 -0
  210. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/task_pb2_grpc.pyi +0 -0
  211. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/transport_pb2.py +0 -0
  212. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/transport_pb2.pyi +0 -0
  213. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/transport_pb2_grpc.py +0 -0
  214. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
  215. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/py.typed +0 -0
  216. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/__init__.py +0 -0
  217. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/client_manager.py +0 -0
  218. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/client_proxy.py +0 -0
  219. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/compat/__init__.py +0 -0
  220. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/compat/app.py +0 -0
  221. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/compat/app_utils.py +0 -0
  222. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/compat/driver_client_proxy.py +0 -0
  223. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/compat/legacy_context.py +0 -0
  224. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/criterion.py +0 -0
  225. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/driver/__init__.py +0 -0
  226. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/driver/driver.py +0 -0
  227. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/driver/inmemory_driver.py +0 -0
  228. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/history.py +0 -0
  229. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/server_app.py +0 -0
  230. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/server_config.py +0 -0
  231. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/serverapp_components.py +0 -0
  232. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/strategy/__init__.py +0 -0
  233. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/strategy/aggregate.py +0 -0
  234. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/strategy/bulyan.py +0 -0
  235. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
  236. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
  237. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
  238. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
  239. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
  240. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/strategy/fedadagrad.py +0 -0
  241. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/strategy/fedadam.py +0 -0
  242. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/strategy/fedavg.py +0 -0
  243. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/strategy/fedavg_android.py +0 -0
  244. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/strategy/fedavgm.py +0 -0
  245. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/strategy/fedmedian.py +0 -0
  246. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/strategy/fedopt.py +0 -0
  247. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/strategy/fedprox.py +0 -0
  248. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
  249. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
  250. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
  251. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
  252. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/strategy/fedyogi.py +0 -0
  253. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/strategy/krum.py +0 -0
  254. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/strategy/qfedavg.py +0 -0
  255. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/strategy/strategy.py +0 -0
  256. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/superlink/__init__.py +0 -0
  257. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/superlink/driver/__init__.py +0 -0
  258. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/superlink/ffs/__init__.py +0 -0
  259. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/superlink/fleet/__init__.py +0 -0
  260. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/superlink/fleet/grpc_adapter/__init__.py +0 -0
  261. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +0 -0
  262. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
  263. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
  264. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
  265. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
  266. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +0 -0
  267. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
  268. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
  269. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
  270. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +0 -0
  271. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
  272. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
  273. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
  274. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/superlink/state/__init__.py +0 -0
  275. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/superlink/state/state_factory.py +0 -0
  276. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/superlink/state/utils.py +0 -0
  277. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/typing.py +0 -0
  278. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/utils/__init__.py +0 -0
  279. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/utils/tensorboard.py +0 -0
  280. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/utils/validator.py +0 -0
  281. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/workflow/__init__.py +0 -0
  282. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/workflow/constant.py +0 -0
  283. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
  284. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
  285. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +0 -0
  286. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/simulation/__init__.py +0 -0
  287. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/simulation/app.py +0 -0
  288. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/simulation/ray_transport/__init__.py +0 -0
  289. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
  290. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
  291. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/simulation/ray_transport/utils.py +0 -0
  292. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/superexec/__init__.py +0 -0
  293. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/superexec/exec_grpc.py +0 -0
  294. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/superexec/executor.py +0 -0
  295. {flwr_nightly-1.11.0.dev20240813 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/superexec/simulation.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: flwr-nightly
3
- Version: 1.11.0.dev20240813
3
+ Version: 1.11.0.dev20240821
4
4
  Summary: Flower: A Friendly Federated Learning Framework
5
5
  Home-page: https://flower.ai
6
6
  License: Apache-2.0
@@ -212,7 +212,7 @@ Other [examples](https://github.com/adap/flower/tree/main/examples):
212
212
  Flower is built by a wonderful community of researchers and engineers. [Join Slack](https://flower.ai/join-slack) to meet them, [contributions](#contributing-to-flower) are welcome.
213
213
 
214
214
  <a href="https://github.com/adap/flower/graphs/contributors">
215
- <img src="https://contrib.rocks/image?repo=adap/flower" />
215
+ <img src="https://contrib.rocks/image?repo=adap/flower&columns=10" />
216
216
  </a>
217
217
 
218
218
  ## Citation
@@ -160,7 +160,7 @@ Other [examples](https://github.com/adap/flower/tree/main/examples):
160
160
  Flower is built by a wonderful community of researchers and engineers. [Join Slack](https://flower.ai/join-slack) to meet them, [contributions](#contributing-to-flower) are welcome.
161
161
 
162
162
  <a href="https://github.com/adap/flower/graphs/contributors">
163
- <img src="https://contrib.rocks/image?repo=adap/flower" />
163
+ <img src="https://contrib.rocks/image?repo=adap/flower&columns=10" />
164
164
  </a>
165
165
 
166
166
  ## Citation
@@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api"
4
4
 
5
5
  [tool.poetry]
6
6
  name = "flwr-nightly"
7
- version = "1.11.0.dev20240813"
7
+ version = "1.11.0.dev20240821"
8
8
  description = "Flower: A Friendly Federated Learning Framework"
9
9
  license = "Apache-2.0"
10
10
  authors = ["The Flower Authors <hello@flower.ai>"]
@@ -59,7 +59,7 @@ flower-supernode = "flwr.client:run_supernode"
59
59
  flower-client-app = "flwr.client:run_client_app"
60
60
  flower-server-app = "flwr.server:run_server_app"
61
61
  flower-simulation = "flwr.simulation.run_simulation:run_simulation_from_cli"
62
- flwr-clientapp = "flwr.client.supernode:flwr_clientapp"
62
+ flwr-clientapp = "flwr.client.clientapp:flwr_clientapp"
63
63
 
64
64
  [tool.poetry.dependencies]
65
65
  python = "^3.8"
@@ -74,13 +74,13 @@ def get_fab_metadata(fab_file: Union[Path, bytes]) -> Tuple[str, str]:
74
74
  Returns
75
75
  -------
76
76
  Tuple[str, str]
77
- The `fab_version` and `fab_id` of the given Flower App Bundle.
77
+ The `fab_id` and `fab_version` of the given Flower App Bundle.
78
78
  """
79
79
  conf = get_fab_config(fab_file)
80
80
 
81
81
  return (
82
- conf["project"]["version"],
83
82
  f"{conf['tool']['flwr']['app']['publisher']}/{conf['project']['name']}",
83
+ conf["project"]["version"],
84
84
  )
85
85
 
86
86
 
@@ -173,7 +173,9 @@ def validate_and_install(
173
173
  / project_name
174
174
  / version
175
175
  )
176
- if install_dir.exists() and not skip_prompt:
176
+ if install_dir.exists():
177
+ if skip_prompt:
178
+ return install_dir
177
179
  if not typer.confirm(
178
180
  typer.style(
179
181
  f"\n💬 {project_name} version {version} is already installed, "
@@ -14,6 +14,7 @@
14
14
  # ==============================================================================
15
15
  """Flower command line interface `run` command."""
16
16
 
17
+ import hashlib
17
18
  import subprocess
18
19
  import sys
19
20
  from logging import DEBUG
@@ -28,11 +29,17 @@ from flwr.cli.config_utils import load_and_validate
28
29
  from flwr.common.config import flatten_dict, parse_config_args
29
30
  from flwr.common.grpc import GRPC_MAX_MESSAGE_LENGTH, create_channel
30
31
  from flwr.common.logger import log
31
- from flwr.common.serde import user_config_to_proto
32
+ from flwr.common.serde import fab_to_proto, user_config_to_proto
33
+ from flwr.common.typing import Fab
32
34
  from flwr.proto.exec_pb2 import StartRunRequest # pylint: disable=E0611
33
35
  from flwr.proto.exec_pb2_grpc import ExecStub
34
36
 
35
37
 
38
+ def on_channel_state_change(channel_connectivity: str) -> None:
39
+ """Log channel connectivity."""
40
+ log(DEBUG, channel_connectivity)
41
+
42
+
36
43
  # pylint: disable-next=too-many-locals
37
44
  def run(
38
45
  app: Annotated[
@@ -49,7 +56,8 @@ def run(
49
56
  "--run-config",
50
57
  "-c",
51
58
  help="Override configuration key-value pairs, should be of the format:\n\n"
52
- "`--run-config key1=value1,key2=value2 --run-config key3=value3`\n\n"
59
+ '`--run-config \'key1="value1" key2="value2"\' '
60
+ "--run-config 'key3=\"value3\"'`\n\n"
53
61
  "Note that `key1`, `key2`, and `key3` in this example need to exist "
54
62
  "inside the `pyproject.toml` in order to be properly overriden.",
55
63
  ),
@@ -120,10 +128,6 @@ def _run_with_superexec(
120
128
  config_overrides: Optional[List[str]],
121
129
  ) -> None:
122
130
 
123
- def on_channel_state_change(channel_connectivity: str) -> None:
124
- """Log channel connectivity."""
125
- log(DEBUG, channel_connectivity)
126
-
127
131
  insecure_str = federation_config.get("insecure")
128
132
  if root_certificates := federation_config.get("root-certificates"):
129
133
  root_certificates_bytes = Path(root_certificates).read_bytes()
@@ -163,12 +167,12 @@ def _run_with_superexec(
163
167
  stub = ExecStub(channel)
164
168
 
165
169
  fab_path = Path(build(app))
170
+ content = fab_path.read_bytes()
171
+ fab = Fab(hashlib.sha256(content).hexdigest(), content)
166
172
 
167
173
  req = StartRunRequest(
168
- fab_file=fab_path.read_bytes(),
169
- override_config=user_config_to_proto(
170
- parse_config_args(config_overrides, separator=",")
171
- ),
174
+ fab=fab_to_proto(fab),
175
+ override_config=user_config_to_proto(parse_config_args(config_overrides)),
172
176
  federation_config=user_config_to_proto(
173
177
  flatten_dict(federation_config.get("options"))
174
178
  ),
@@ -209,7 +213,7 @@ def _run_without_superexec(
209
213
  ]
210
214
 
211
215
  if config_overrides:
212
- command.extend(["--run-config", f"{','.join(config_overrides)}"])
216
+ command.extend(["--run-config", f"{' '.join(config_overrides)}"])
213
217
 
214
218
  # Run the simulation
215
219
  subprocess.run(
@@ -15,16 +15,20 @@
15
15
  """Flower client app."""
16
16
 
17
17
  import signal
18
+ import subprocess
18
19
  import sys
19
20
  import time
20
21
  from dataclasses import dataclass
21
22
  from logging import ERROR, INFO, WARN
22
23
  from pathlib import Path
23
- from typing import Callable, ContextManager, Dict, Optional, Tuple, Type, Union
24
+ from typing import Callable, ContextManager, Dict, Optional, Tuple, Type, Union, cast
24
25
 
26
+ import grpc
25
27
  from cryptography.hazmat.primitives.asymmetric import ec
26
28
  from grpc import RpcError
27
29
 
30
+ from flwr.cli.config_utils import get_fab_metadata
31
+ from flwr.cli.install import install_from_fab
28
32
  from flwr.client.client import Client
29
33
  from flwr.client.client_app import ClientApp, LoadClientAppError
30
34
  from flwr.client.typing import ClientFnExt
@@ -32,6 +36,7 @@ from flwr.common import GRPC_MAX_MESSAGE_LENGTH, Context, EventType, Message, ev
32
36
  from flwr.common.address import parse_address
33
37
  from flwr.common.constant import (
34
38
  MISSING_EXTRA_REST,
39
+ RUN_ID_NUM_BYTES,
35
40
  TRANSPORT_TYPE_GRPC_ADAPTER,
36
41
  TRANSPORT_TYPE_GRPC_BIDI,
37
42
  TRANSPORT_TYPE_GRPC_RERE,
@@ -43,7 +48,11 @@ from flwr.common.logger import log, warn_deprecated_feature
43
48
  from flwr.common.message import Error
44
49
  from flwr.common.retry_invoker import RetryInvoker, RetryState, exponential
45
50
  from flwr.common.typing import Fab, Run, UserConfig
51
+ from flwr.proto.clientappio_pb2_grpc import add_ClientAppIoServicer_to_server
52
+ from flwr.server.superlink.fleet.grpc_bidi.grpc_server import generic_create_grpc_server
53
+ from flwr.server.superlink.state.utils import generate_rand_int_from_bytes
46
54
 
55
+ from .clientapp.clientappio_servicer import ClientAppInputs, ClientAppIoServicer
47
56
  from .grpc_adapter_client.connection import grpc_adapter
48
57
  from .grpc_client.connection import grpc_connection
49
58
  from .grpc_rere_client.connection import grpc_request_response
@@ -51,6 +60,11 @@ from .message_handler.message_handler import handle_control_message
51
60
  from .node_state import NodeState
52
61
  from .numpy_client import NumPyClient
53
62
 
63
+ ADDRESS_CLIENTAPPIO_API_GRPC_RERE = "0.0.0.0:9094"
64
+
65
+ ISOLATION_MODE_SUBPROCESS = "subprocess"
66
+ ISOLATION_MODE_PROCESS = "process"
67
+
54
68
 
55
69
  def _check_actionable_client(
56
70
  client: Optional[Client], client_fn: Optional[ClientFnExt]
@@ -158,7 +172,7 @@ def start_client(
158
172
  >>> )
159
173
  """
160
174
  event(EventType.START_CLIENT_ENTER)
161
- _start_client_internal(
175
+ start_client_internal(
162
176
  server_address=server_address,
163
177
  node_config={},
164
178
  load_client_app_fn=None,
@@ -179,7 +193,7 @@ def start_client(
179
193
  # pylint: disable=too-many-branches
180
194
  # pylint: disable=too-many-locals
181
195
  # pylint: disable=too-many-statements
182
- def _start_client_internal(
196
+ def start_client_internal(
183
197
  *,
184
198
  server_address: str,
185
199
  node_config: UserConfig,
@@ -196,6 +210,8 @@ def _start_client_internal(
196
210
  max_retries: Optional[int] = None,
197
211
  max_wait_time: Optional[float] = None,
198
212
  flwr_path: Optional[Path] = None,
213
+ isolation: Optional[str] = None,
214
+ supernode_address: Optional[str] = ADDRESS_CLIENTAPPIO_API_GRPC_RERE,
199
215
  ) -> None:
200
216
  """Start a Flower client node which connects to a Flower server.
201
217
 
@@ -243,6 +259,15 @@ def _start_client_internal(
243
259
  If set to None, there is no limit to the total time.
244
260
  flwr_path: Optional[Path] (default: None)
245
261
  The fully resolved path containing installed Flower Apps.
262
+ isolation : Optional[str] (default: None)
263
+ Isolation mode for `ClientApp`. Possible values are `subprocess` and
264
+ `process`. Defaults to `None`, which runs the `ClientApp` in the same process
265
+ as the SuperNode. If `subprocess`, the `ClientApp` runs in a subprocess started
266
+ by the SueprNode and communicates using gRPC at the address
267
+ `supernode_address`. If `process`, the `ClientApp` runs in a separate isolated
268
+ process and communicates using gRPC at the address `supernode_address`.
269
+ supernode_address : Optional[str] (default: `ADDRESS_CLIENTAPPIO_API_GRPC_RERE`)
270
+ The SuperNode gRPC server address.
246
271
  """
247
272
  if insecure is None:
248
273
  insecure = root_certificates is None
@@ -268,6 +293,17 @@ def _start_client_internal(
268
293
 
269
294
  load_client_app_fn = _load_client_app
270
295
 
296
+ if isolation:
297
+ if supernode_address is None:
298
+ raise ValueError(
299
+ f"`supernode_address` required when `isolation` is "
300
+ f"{ISOLATION_MODE_SUBPROCESS} or {ISOLATION_MODE_PROCESS}",
301
+ )
302
+ _clientappio_grpc_server, clientappio_servicer = run_clientappio_api_grpc(
303
+ address=supernode_address
304
+ )
305
+ supernode_address = cast(str, supernode_address)
306
+
271
307
  # At this point, only `load_client_app_fn` should be used
272
308
  # Both `client` and `client_fn` must not be used directly
273
309
 
@@ -333,7 +369,7 @@ def _start_client_internal(
333
369
  root_certificates,
334
370
  authentication_keys,
335
371
  ) as conn:
336
- receive, send, create_node, delete_node, get_run, _ = conn
372
+ receive, send, create_node, delete_node, get_run, get_fab = conn
337
373
 
338
374
  # Register node when connecting the first time
339
375
  if node_state is None:
@@ -362,6 +398,7 @@ def _start_client_internal(
362
398
  )
363
399
 
364
400
  app_state_tracker.register_signal_handler()
401
+ # pylint: disable=too-many-nested-blocks
365
402
  while not app_state_tracker.interrupt:
366
403
  try:
367
404
  # Receive
@@ -398,16 +435,31 @@ def _start_client_internal(
398
435
  runs[run_id] = get_run(run_id)
399
436
  # If get_run is None, i.e., in grpc-bidi mode
400
437
  else:
401
- runs[run_id] = Run(run_id, "", "", {})
438
+ runs[run_id] = Run(run_id, "", "", "", {})
439
+
440
+ run: Run = runs[run_id]
441
+ if get_fab is not None and run.fab_hash:
442
+ fab = get_fab(run.fab_hash)
443
+ if not isolation:
444
+ # If `ClientApp` runs in the same process, install the FAB
445
+ install_from_fab(fab.content, flwr_path, True)
446
+ fab_id, fab_version = get_fab_metadata(fab.content)
447
+ else:
448
+ fab = None
449
+ fab_id, fab_version = run.fab_id, run.fab_version
450
+
451
+ run.fab_id, run.fab_version = fab_id, fab_version
402
452
 
403
453
  # Register context for this run
404
454
  node_state.register_context(
405
- run_id=run_id, run=runs[run_id], flwr_path=flwr_path
455
+ run_id=run_id,
456
+ run=run,
457
+ flwr_path=flwr_path,
458
+ fab=fab,
406
459
  )
407
460
 
408
461
  # Retrieve context for this run
409
462
  context = node_state.retrieve_context(run_id=run_id)
410
-
411
463
  # Create an error reply message that will never be used to prevent
412
464
  # the used-before-assignment linting error
413
465
  reply_message = message.create_error_reply(
@@ -416,14 +468,62 @@ def _start_client_internal(
416
468
 
417
469
  # Handle app loading and task message
418
470
  try:
419
- # Load ClientApp instance
420
- run: Run = runs[run_id]
421
- client_app: ClientApp = load_client_app_fn(
422
- run.fab_id, run.fab_version
423
- )
471
+ if isolation:
472
+ # Two isolation modes:
473
+ # 1. `subprocess`: SuperNode is starting the ClientApp
474
+ # process as a subprocess.
475
+ # 2. `process`: ClientApp process gets started separately
476
+ # (via `flwr-clientapp`), for example, in a separate
477
+ # Docker container.
478
+
479
+ # Generate SuperNode token
480
+ token: int = generate_rand_int_from_bytes(RUN_ID_NUM_BYTES)
481
+
482
+ # Mode 1: SuperNode starts ClientApp as subprocess
483
+ start_subprocess = isolation == ISOLATION_MODE_SUBPROCESS
484
+
485
+ # Share Message and Context with servicer
486
+ clientappio_servicer.set_inputs(
487
+ clientapp_input=ClientAppInputs(
488
+ message=message,
489
+ context=context,
490
+ run=run,
491
+ fab=fab,
492
+ token=token,
493
+ ),
494
+ token_returned=start_subprocess,
495
+ )
496
+
497
+ if start_subprocess:
498
+ # Start ClientApp subprocess
499
+ command = [
500
+ "flwr-clientapp",
501
+ "--supernode",
502
+ supernode_address,
503
+ "--token",
504
+ str(token),
505
+ ]
506
+ subprocess.run(
507
+ command,
508
+ stdout=None,
509
+ stderr=None,
510
+ check=True,
511
+ )
512
+ else:
513
+ # Wait for output to become available
514
+ while not clientappio_servicer.has_outputs():
515
+ time.sleep(0.1)
516
+
517
+ outputs = clientappio_servicer.get_outputs()
518
+ reply_message, context = outputs.message, outputs.context
519
+ else:
520
+ # Load ClientApp instance
521
+ client_app: ClientApp = load_client_app_fn(
522
+ fab_id, fab_version
523
+ )
424
524
 
425
- # Execute ClientApp
426
- reply_message = client_app(message=message, context=context)
525
+ # Execute ClientApp
526
+ reply_message = client_app(message=message, context=context)
427
527
  except Exception as ex: # pylint: disable=broad-exception-caught
428
528
 
429
529
  # Legacy grpc-bidi
@@ -469,6 +569,7 @@ def _start_client_internal(
469
569
  except StopIteration:
470
570
  sleep_duration = 0
471
571
  break
572
+ # pylint: enable=too-many-nested-blocks
472
573
 
473
574
  # Unregister node
474
575
  if delete_node is not None and app_state_tracker.is_connected:
@@ -667,3 +768,20 @@ class _AppStateTracker:
667
768
 
668
769
  signal.signal(signal.SIGINT, signal_handler)
669
770
  signal.signal(signal.SIGTERM, signal_handler)
771
+
772
+
773
+ def run_clientappio_api_grpc(address: str) -> Tuple[grpc.Server, ClientAppIoServicer]:
774
+ """Run ClientAppIo API gRPC server."""
775
+ clientappio_servicer: grpc.Server = ClientAppIoServicer()
776
+ clientappio_add_servicer_to_server_fn = add_ClientAppIoServicer_to_server
777
+ clientappio_grpc_server = generic_create_grpc_server(
778
+ servicer_and_add_fn=(
779
+ clientappio_servicer,
780
+ clientappio_add_servicer_to_server_fn,
781
+ ),
782
+ server_address=address,
783
+ max_message_length=GRPC_MAX_MESSAGE_LENGTH,
784
+ )
785
+ log(INFO, "Starting Flower ClientAppIo gRPC server on %s", address)
786
+ clientappio_grpc_server.start()
787
+ return clientappio_grpc_server, clientappio_servicer
@@ -0,0 +1,22 @@
1
+ # Copyright 2024 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 AppIO service."""
16
+
17
+
18
+ from .app import flwr_clientapp as flwr_clientapp
19
+
20
+ __all__ = [
21
+ "flwr_clientapp",
22
+ ]
@@ -0,0 +1,233 @@
1
+ # Copyright 2024 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 ClientApp process."""
16
+
17
+ import argparse
18
+ import time
19
+ from logging import DEBUG, ERROR, INFO
20
+ from typing import Optional, Tuple
21
+
22
+ import grpc
23
+
24
+ from flwr.cli.install import install_from_fab
25
+ from flwr.client.client_app import ClientApp, LoadClientAppError
26
+ from flwr.common import Context, Message
27
+ from flwr.common.constant import ErrorCode
28
+ from flwr.common.grpc import create_channel
29
+ from flwr.common.logger import log
30
+ from flwr.common.message import Error
31
+ from flwr.common.serde import (
32
+ context_from_proto,
33
+ context_to_proto,
34
+ fab_from_proto,
35
+ message_from_proto,
36
+ message_to_proto,
37
+ run_from_proto,
38
+ )
39
+ from flwr.common.typing import Fab, Run
40
+
41
+ # pylint: disable=E0611
42
+ from flwr.proto.clientappio_pb2 import (
43
+ GetTokenRequest,
44
+ GetTokenResponse,
45
+ PullClientAppInputsRequest,
46
+ PullClientAppInputsResponse,
47
+ PushClientAppOutputsRequest,
48
+ PushClientAppOutputsResponse,
49
+ )
50
+ from flwr.proto.clientappio_pb2_grpc import ClientAppIoStub
51
+
52
+ from .utils import get_load_client_app_fn
53
+
54
+
55
+ def flwr_clientapp() -> None:
56
+ """Run process-isolated Flower ClientApp."""
57
+ log(INFO, "Starting Flower ClientApp")
58
+
59
+ parser = argparse.ArgumentParser(
60
+ description="Run a Flower ClientApp",
61
+ )
62
+ parser.add_argument(
63
+ "--supernode",
64
+ type=str,
65
+ help="Address of SuperNode ClientAppIo gRPC servicer",
66
+ )
67
+ parser.add_argument(
68
+ "--token",
69
+ type=int,
70
+ required=False,
71
+ help="Unique token generated by SuperNode for each ClientApp execution",
72
+ )
73
+ args = parser.parse_args()
74
+
75
+ log(
76
+ DEBUG,
77
+ "Staring isolated `ClientApp` connected to SuperNode ClientAppIo at %s "
78
+ "with token %s",
79
+ args.supernode,
80
+ args.token,
81
+ )
82
+ run_clientapp(supernode=args.supernode, token=args.token)
83
+
84
+
85
+ def on_channel_state_change(channel_connectivity: str) -> None:
86
+ """Log channel connectivity."""
87
+ log(DEBUG, channel_connectivity)
88
+
89
+
90
+ def run_clientapp( # pylint: disable=R0914
91
+ supernode: str,
92
+ token: Optional[int] = None,
93
+ ) -> None:
94
+ """Run Flower ClientApp process.
95
+
96
+ Parameters
97
+ ----------
98
+ supernode : str
99
+ Address of SuperNode
100
+ token : Optional[int] (default: None)
101
+ Unique SuperNode token for ClientApp-SuperNode authentication
102
+ """
103
+ channel = create_channel(
104
+ server_address=supernode,
105
+ insecure=True,
106
+ )
107
+ channel.subscribe(on_channel_state_change)
108
+
109
+ try:
110
+ stub = ClientAppIoStub(channel)
111
+
112
+ only_once = token is not None
113
+ while True:
114
+ # If token is not set, loop until token is received from SuperNode
115
+ while token is None:
116
+ token = get_token(stub)
117
+ time.sleep(1)
118
+
119
+ # Pull Message, Context, Run and (optional) FAB from SuperNode
120
+ message, context, run, fab = pull_message(stub=stub, token=token)
121
+
122
+ # Install FAB, if provided
123
+ if fab:
124
+ log(DEBUG, "Flower ClientApp starts FAB installation.")
125
+ install_from_fab(fab.content, flwr_dir=None, skip_prompt=True)
126
+
127
+ load_client_app_fn = get_load_client_app_fn(
128
+ default_app_ref="",
129
+ app_path=None,
130
+ multi_app=True,
131
+ flwr_dir=None,
132
+ )
133
+
134
+ try:
135
+ # Load ClientApp
136
+ client_app: ClientApp = load_client_app_fn(run.fab_id, run.fab_version)
137
+
138
+ # Execute ClientApp
139
+ reply_message = client_app(message=message, context=context)
140
+ except Exception as ex: # pylint: disable=broad-exception-caught
141
+ # Don't update/change NodeState
142
+
143
+ e_code = ErrorCode.CLIENT_APP_RAISED_EXCEPTION
144
+ # Ex fmt: "<class 'ZeroDivisionError'>:<'division by zero'>"
145
+ reason = str(type(ex)) + ":<'" + str(ex) + "'>"
146
+ exc_entity = "ClientApp"
147
+ if isinstance(ex, LoadClientAppError):
148
+ reason = (
149
+ "An exception was raised when attempting to load `ClientApp`"
150
+ )
151
+ e_code = ErrorCode.LOAD_CLIENT_APP_EXCEPTION
152
+
153
+ log(ERROR, "%s raised an exception", exc_entity, exc_info=ex)
154
+
155
+ # Create error message
156
+ reply_message = message.create_error_reply(
157
+ error=Error(code=e_code, reason=reason)
158
+ )
159
+
160
+ # Push Message and Context to SuperNode
161
+ _ = push_message(
162
+ stub=stub, token=token, message=reply_message, context=context
163
+ )
164
+
165
+ # Reset token to `None` to prevent flwr-clientapp from trying to pull the
166
+ # same inputs again
167
+ token = None
168
+
169
+ # Stop the loop if `flwr-clientapp` is expected to process only a single
170
+ # message
171
+ if only_once:
172
+ break
173
+
174
+ except KeyboardInterrupt:
175
+ log(INFO, "Closing connection")
176
+ except grpc.RpcError as e:
177
+ log(ERROR, "GRPC error occurred: %s", str(e))
178
+ finally:
179
+ channel.close()
180
+
181
+
182
+ def get_token(stub: grpc.Channel) -> Optional[int]:
183
+ """Get a token from SuperNode."""
184
+ log(DEBUG, "Flower ClientApp process requests token")
185
+ try:
186
+ res: GetTokenResponse = stub.GetToken(GetTokenRequest())
187
+ log(DEBUG, "[GetToken] Received token: %s", res.token)
188
+ return res.token
189
+ except grpc.RpcError as e:
190
+ if e.code() == grpc.StatusCode.FAILED_PRECONDITION: # pylint: disable=no-member
191
+ log(DEBUG, "[GetToken] No token available yet")
192
+ else:
193
+ log(ERROR, "[GetToken] gRPC error occurred: %s", str(e))
194
+ return None
195
+
196
+
197
+ def pull_message(
198
+ stub: grpc.Channel, token: int
199
+ ) -> Tuple[Message, Context, Run, Optional[Fab]]:
200
+ """Pull message from SuperNode to ClientApp."""
201
+ log(INFO, "Pulling ClientAppInputs for token %s", token)
202
+ try:
203
+ res: PullClientAppInputsResponse = stub.PullClientAppInputs(
204
+ PullClientAppInputsRequest(token=token)
205
+ )
206
+ message = message_from_proto(res.message)
207
+ context = context_from_proto(res.context)
208
+ run = run_from_proto(res.run)
209
+ fab = fab_from_proto(res.fab) if res.fab else None
210
+ return message, context, run, fab
211
+ except grpc.RpcError as e:
212
+ log(ERROR, "[PullClientAppInputs] gRPC error occurred: %s", str(e))
213
+ raise e
214
+
215
+
216
+ def push_message(
217
+ stub: grpc.Channel, token: int, message: Message, context: Context
218
+ ) -> PushClientAppOutputsResponse:
219
+ """Push message to SuperNode from ClientApp."""
220
+ log(INFO, "Pushing ClientAppOutputs for token %s", token)
221
+ proto_message = message_to_proto(message)
222
+ proto_context = context_to_proto(context)
223
+
224
+ try:
225
+ res: PushClientAppOutputsResponse = stub.PushClientAppOutputs(
226
+ PushClientAppOutputsRequest(
227
+ token=token, message=proto_message, context=proto_context
228
+ )
229
+ )
230
+ return res
231
+ except grpc.RpcError as e:
232
+ log(ERROR, "[PushClientAppOutputs] gRPC error occurred: %s", str(e))
233
+ raise e