flwr-nightly 1.11.0.dev20240818__tar.gz → 1.11.0.dev20240819__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 (293) hide show
  1. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/PKG-INFO +2 -2
  2. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/README.md +1 -1
  3. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/pyproject.toml +1 -1
  4. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/install.py +3 -1
  5. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/client/app.py +55 -31
  6. flwr_nightly-1.11.0.dev20240819/src/py/flwr/client/clientapp/app.py +233 -0
  7. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/client/clientapp/clientappio_servicer.py +23 -19
  8. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/client/supernode/app.py +20 -6
  9. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/clientappio_pb2.py +10 -10
  10. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/clientappio_pb2.pyi +7 -2
  11. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +3 -1
  12. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +8 -2
  13. flwr_nightly-1.11.0.dev20240818/src/py/flwr/client/clientapp/app.py +0 -186
  14. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/LICENSE +0 -0
  15. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/__init__.py +0 -0
  16. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/__init__.py +0 -0
  17. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/app.py +0 -0
  18. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/build.py +0 -0
  19. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/config_utils.py +0 -0
  20. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/example.py +0 -0
  21. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/new/__init__.py +0 -0
  22. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/new/new.py +0 -0
  23. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/new/templates/__init__.py +0 -0
  24. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/new/templates/app/.gitignore.tpl +0 -0
  25. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/new/templates/app/README.flowertune.md.tpl +0 -0
  26. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/new/templates/app/README.md.tpl +0 -0
  27. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/new/templates/app/__init__.py +0 -0
  28. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
  29. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
  30. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/new/templates/app/code/client.huggingface.py.tpl +0 -0
  31. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/new/templates/app/code/client.jax.py.tpl +0 -0
  32. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/new/templates/app/code/client.mlx.py.tpl +0 -0
  33. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/new/templates/app/code/client.numpy.py.tpl +0 -0
  34. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -0
  35. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl +0 -0
  36. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -0
  37. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/new/templates/app/code/flwr_tune/__init__.py +0 -0
  38. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/new/templates/app/code/flwr_tune/app.py.tpl +0 -0
  39. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/new/templates/app/code/flwr_tune/client.py.tpl +0 -0
  40. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/new/templates/app/code/flwr_tune/config.yaml.tpl +0 -0
  41. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/new/templates/app/code/flwr_tune/dataset.py.tpl +0 -0
  42. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/new/templates/app/code/flwr_tune/models.py.tpl +0 -0
  43. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/new/templates/app/code/flwr_tune/server.py.tpl +0 -0
  44. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/new/templates/app/code/flwr_tune/static_config.yaml.tpl +0 -0
  45. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/new/templates/app/code/server.huggingface.py.tpl +0 -0
  46. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/new/templates/app/code/server.jax.py.tpl +0 -0
  47. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/new/templates/app/code/server.mlx.py.tpl +0 -0
  48. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -0
  49. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -0
  50. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/new/templates/app/code/server.sklearn.py.tpl +0 -0
  51. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -0
  52. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/new/templates/app/code/task.huggingface.py.tpl +0 -0
  53. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/new/templates/app/code/task.jax.py.tpl +0 -0
  54. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/new/templates/app/code/task.mlx.py.tpl +0 -0
  55. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +0 -0
  56. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/new/templates/app/code/task.tensorflow.py.tpl +0 -0
  57. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +0 -0
  58. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl +0 -0
  59. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/new/templates/app/pyproject.jax.toml.tpl +0 -0
  60. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +0 -0
  61. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +0 -0
  62. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +0 -0
  63. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +0 -0
  64. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +0 -0
  65. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/run/__init__.py +0 -0
  66. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/run/run.py +0 -0
  67. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/utils.py +0 -0
  68. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/client/__init__.py +0 -0
  69. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/client/client.py +0 -0
  70. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/client/client_app.py +0 -0
  71. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/client/clientapp/__init__.py +0 -0
  72. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/client/clientapp/utils.py +0 -0
  73. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/client/dpfedavg_numpy_client.py +0 -0
  74. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/client/grpc_adapter_client/__init__.py +0 -0
  75. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/client/grpc_adapter_client/connection.py +0 -0
  76. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/client/grpc_client/__init__.py +0 -0
  77. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/client/grpc_client/connection.py +0 -0
  78. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/client/grpc_rere_client/__init__.py +0 -0
  79. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/client/grpc_rere_client/client_interceptor.py +0 -0
  80. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/client/grpc_rere_client/connection.py +0 -0
  81. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/client/grpc_rere_client/grpc_adapter.py +0 -0
  82. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/client/heartbeat.py +0 -0
  83. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/client/message_handler/__init__.py +0 -0
  84. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/client/message_handler/message_handler.py +0 -0
  85. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/client/message_handler/task_handler.py +0 -0
  86. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/client/mod/__init__.py +0 -0
  87. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/client/mod/centraldp_mods.py +0 -0
  88. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/client/mod/comms_mods.py +0 -0
  89. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/client/mod/localdp_mod.py +0 -0
  90. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
  91. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
  92. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
  93. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/client/mod/utils.py +0 -0
  94. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/client/node_state.py +0 -0
  95. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/client/node_state_tests.py +0 -0
  96. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/client/numpy_client.py +0 -0
  97. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/client/rest_client/__init__.py +0 -0
  98. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/client/rest_client/connection.py +0 -0
  99. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/client/supernode/__init__.py +0 -0
  100. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/client/typing.py +0 -0
  101. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/common/__init__.py +0 -0
  102. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/common/address.py +0 -0
  103. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/common/config.py +0 -0
  104. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/common/constant.py +0 -0
  105. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/common/context.py +0 -0
  106. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/common/date.py +0 -0
  107. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/common/differential_privacy.py +0 -0
  108. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/common/differential_privacy_constants.py +0 -0
  109. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/common/dp.py +0 -0
  110. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/common/exit_handlers.py +0 -0
  111. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/common/grpc.py +0 -0
  112. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/common/logger.py +0 -0
  113. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/common/message.py +0 -0
  114. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/common/object_ref.py +0 -0
  115. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/common/parameter.py +0 -0
  116. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/common/pyproject.py +0 -0
  117. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/common/record/__init__.py +0 -0
  118. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/common/record/configsrecord.py +0 -0
  119. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/common/record/conversion_utils.py +0 -0
  120. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/common/record/metricsrecord.py +0 -0
  121. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/common/record/parametersrecord.py +0 -0
  122. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/common/record/recordset.py +0 -0
  123. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/common/record/typeddict.py +0 -0
  124. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/common/recordset_compat.py +0 -0
  125. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/common/retry_invoker.py +0 -0
  126. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/common/secure_aggregation/__init__.py +0 -0
  127. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
  128. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
  129. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -0
  130. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
  131. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/common/secure_aggregation/quantization.py +0 -0
  132. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
  133. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
  134. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/common/serde.py +0 -0
  135. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/common/telemetry.py +0 -0
  136. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/common/typing.py +0 -0
  137. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/common/version.py +0 -0
  138. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/__init__.py +0 -0
  139. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/clientappio_pb2_grpc.py +0 -0
  140. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/clientappio_pb2_grpc.pyi +0 -0
  141. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/common_pb2.py +0 -0
  142. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/common_pb2.pyi +0 -0
  143. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/common_pb2_grpc.py +0 -0
  144. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/common_pb2_grpc.pyi +0 -0
  145. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/driver_pb2.py +0 -0
  146. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/driver_pb2.pyi +0 -0
  147. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/driver_pb2_grpc.py +0 -0
  148. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/driver_pb2_grpc.pyi +0 -0
  149. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/error_pb2.py +0 -0
  150. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/error_pb2.pyi +0 -0
  151. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/error_pb2_grpc.py +0 -0
  152. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/error_pb2_grpc.pyi +0 -0
  153. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/exec_pb2.py +0 -0
  154. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/exec_pb2.pyi +0 -0
  155. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/exec_pb2_grpc.py +0 -0
  156. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/exec_pb2_grpc.pyi +0 -0
  157. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/fab_pb2.py +0 -0
  158. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/fab_pb2.pyi +0 -0
  159. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/fab_pb2_grpc.py +0 -0
  160. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/fab_pb2_grpc.pyi +0 -0
  161. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/fleet_pb2.py +0 -0
  162. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/fleet_pb2.pyi +0 -0
  163. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/fleet_pb2_grpc.py +0 -0
  164. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
  165. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/grpcadapter_pb2.py +0 -0
  166. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/grpcadapter_pb2.pyi +0 -0
  167. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/grpcadapter_pb2_grpc.py +0 -0
  168. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/grpcadapter_pb2_grpc.pyi +0 -0
  169. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/message_pb2.py +0 -0
  170. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/message_pb2.pyi +0 -0
  171. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/message_pb2_grpc.py +0 -0
  172. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/message_pb2_grpc.pyi +0 -0
  173. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/node_pb2.py +0 -0
  174. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/node_pb2.pyi +0 -0
  175. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/node_pb2_grpc.py +0 -0
  176. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/node_pb2_grpc.pyi +0 -0
  177. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/recordset_pb2.py +0 -0
  178. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/recordset_pb2.pyi +0 -0
  179. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/recordset_pb2_grpc.py +0 -0
  180. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/recordset_pb2_grpc.pyi +0 -0
  181. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/run_pb2.py +0 -0
  182. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/run_pb2.pyi +0 -0
  183. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/run_pb2_grpc.py +0 -0
  184. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/run_pb2_grpc.pyi +0 -0
  185. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/task_pb2.py +0 -0
  186. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/task_pb2.pyi +0 -0
  187. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/task_pb2_grpc.py +0 -0
  188. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/task_pb2_grpc.pyi +0 -0
  189. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/transport_pb2.py +0 -0
  190. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/transport_pb2.pyi +0 -0
  191. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/transport_pb2_grpc.py +0 -0
  192. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
  193. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/py.typed +0 -0
  194. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/__init__.py +0 -0
  195. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/app.py +0 -0
  196. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/client_manager.py +0 -0
  197. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/client_proxy.py +0 -0
  198. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/compat/__init__.py +0 -0
  199. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/compat/app.py +0 -0
  200. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/compat/app_utils.py +0 -0
  201. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/compat/driver_client_proxy.py +0 -0
  202. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/compat/legacy_context.py +0 -0
  203. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/criterion.py +0 -0
  204. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/driver/__init__.py +0 -0
  205. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/driver/driver.py +0 -0
  206. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/driver/grpc_driver.py +0 -0
  207. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/driver/inmemory_driver.py +0 -0
  208. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/history.py +0 -0
  209. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/run_serverapp.py +0 -0
  210. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/server.py +0 -0
  211. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/server_app.py +0 -0
  212. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/server_config.py +0 -0
  213. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/serverapp_components.py +0 -0
  214. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/strategy/__init__.py +0 -0
  215. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/strategy/aggregate.py +0 -0
  216. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/strategy/bulyan.py +0 -0
  217. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
  218. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
  219. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
  220. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
  221. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
  222. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/strategy/fedadagrad.py +0 -0
  223. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/strategy/fedadam.py +0 -0
  224. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/strategy/fedavg.py +0 -0
  225. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/strategy/fedavg_android.py +0 -0
  226. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/strategy/fedavgm.py +0 -0
  227. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/strategy/fedmedian.py +0 -0
  228. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/strategy/fedopt.py +0 -0
  229. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/strategy/fedprox.py +0 -0
  230. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
  231. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
  232. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
  233. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
  234. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/strategy/fedyogi.py +0 -0
  235. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/strategy/krum.py +0 -0
  236. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/strategy/qfedavg.py +0 -0
  237. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/strategy/strategy.py +0 -0
  238. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/superlink/__init__.py +0 -0
  239. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/superlink/driver/__init__.py +0 -0
  240. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/superlink/driver/driver_grpc.py +0 -0
  241. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/superlink/driver/driver_servicer.py +0 -0
  242. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/superlink/ffs/__init__.py +0 -0
  243. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/superlink/ffs/disk_ffs.py +0 -0
  244. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/superlink/ffs/ffs.py +0 -0
  245. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/superlink/ffs/ffs_factory.py +0 -0
  246. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/superlink/fleet/__init__.py +0 -0
  247. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/superlink/fleet/grpc_adapter/__init__.py +0 -0
  248. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +0 -0
  249. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
  250. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
  251. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
  252. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
  253. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +0 -0
  254. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
  255. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
  256. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/superlink/fleet/message_handler/message_handler.py +0 -0
  257. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
  258. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +0 -0
  259. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
  260. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
  261. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
  262. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +0 -0
  263. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/superlink/fleet/vce/vce_api.py +0 -0
  264. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/superlink/state/__init__.py +0 -0
  265. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/superlink/state/in_memory_state.py +0 -0
  266. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/superlink/state/sqlite_state.py +0 -0
  267. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/superlink/state/state.py +0 -0
  268. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/superlink/state/state_factory.py +0 -0
  269. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/superlink/state/utils.py +0 -0
  270. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/typing.py +0 -0
  271. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/utils/__init__.py +0 -0
  272. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/utils/tensorboard.py +0 -0
  273. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/utils/validator.py +0 -0
  274. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/workflow/__init__.py +0 -0
  275. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/workflow/constant.py +0 -0
  276. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/workflow/default_workflows.py +0 -0
  277. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
  278. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
  279. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +0 -0
  280. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/simulation/__init__.py +0 -0
  281. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/simulation/app.py +0 -0
  282. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/simulation/ray_transport/__init__.py +0 -0
  283. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
  284. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
  285. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/simulation/ray_transport/utils.py +0 -0
  286. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/simulation/run_simulation.py +0 -0
  287. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/superexec/__init__.py +0 -0
  288. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/superexec/app.py +0 -0
  289. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/superexec/deployment.py +0 -0
  290. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/superexec/exec_grpc.py +0 -0
  291. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/superexec/exec_servicer.py +0 -0
  292. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/superexec/executor.py +0 -0
  293. {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/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.dev20240818
3
+ Version: 1.11.0.dev20240819
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.dev20240818"
7
+ version = "1.11.0.dev20240819"
8
8
  description = "Flower: A Friendly Federated Learning Framework"
9
9
  license = "Apache-2.0"
10
10
  authors = ["The Flower Authors <hello@flower.ai>"]
@@ -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, "
@@ -52,7 +52,7 @@ from flwr.proto.clientappio_pb2_grpc import add_ClientAppIoServicer_to_server
52
52
  from flwr.server.superlink.fleet.grpc_bidi.grpc_server import generic_create_grpc_server
53
53
  from flwr.server.superlink.state.utils import generate_rand_int_from_bytes
54
54
 
55
- from .clientapp.clientappio_servicer import ClientAppIoInputs, ClientAppIoServicer
55
+ from .clientapp.clientappio_servicer import ClientAppInputs, ClientAppIoServicer
56
56
  from .grpc_adapter_client.connection import grpc_adapter
57
57
  from .grpc_client.connection import grpc_connection
58
58
  from .grpc_rere_client.connection import grpc_request_response
@@ -62,6 +62,9 @@ from .numpy_client import NumPyClient
62
62
 
63
63
  ADDRESS_CLIENTAPPIO_API_GRPC_RERE = "0.0.0.0:9094"
64
64
 
65
+ ISOLATION_MODE_SUBPROCESS = "subprocess"
66
+ ISOLATION_MODE_PROCESS = "process"
67
+
65
68
 
66
69
  def _check_actionable_client(
67
70
  client: Optional[Client], client_fn: Optional[ClientFnExt]
@@ -207,7 +210,7 @@ def start_client_internal(
207
210
  max_retries: Optional[int] = None,
208
211
  max_wait_time: Optional[float] = None,
209
212
  flwr_path: Optional[Path] = None,
210
- isolate: Optional[bool] = False,
213
+ isolation: Optional[str] = None,
211
214
  supernode_address: Optional[str] = ADDRESS_CLIENTAPPIO_API_GRPC_RERE,
212
215
  ) -> None:
213
216
  """Start a Flower client node which connects to a Flower server.
@@ -256,11 +259,13 @@ def start_client_internal(
256
259
  If set to None, there is no limit to the total time.
257
260
  flwr_path: Optional[Path] (default: None)
258
261
  The fully resolved path containing installed Flower Apps.
259
- isolate : Optional[bool] (default: False)
260
- Whether to run `ClientApp` in a separate process. By default, this value is
261
- `False`, and the `ClientApp` runs in the same process as the SuperNode. If
262
- `True`, the `ClientApp` runs in an isolated process and communicates using
263
- gRPC at the address `supernode_address`.
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`.
264
269
  supernode_address : Optional[str] (default: `ADDRESS_CLIENTAPPIO_API_GRPC_RERE`)
265
270
  The SuperNode gRPC server address.
266
271
  """
@@ -288,9 +293,12 @@ def start_client_internal(
288
293
 
289
294
  load_client_app_fn = _load_client_app
290
295
 
291
- if isolate:
296
+ if isolation:
292
297
  if supernode_address is None:
293
- raise ValueError("`supernode_address` required when `isolate` is set")
298
+ raise ValueError(
299
+ f"`supernode_address` required when `isolation` is "
300
+ f"{ISOLATION_MODE_SUBPROCESS} or {ISOLATION_MODE_PROCESS}",
301
+ )
294
302
  _clientappio_grpc_server, clientappio_servicer = run_clientappio_api_grpc(
295
303
  address=supernode_address
296
304
  )
@@ -390,6 +398,7 @@ def start_client_internal(
390
398
  )
391
399
 
392
400
  app_state_tracker.register_signal_handler()
401
+ # pylint: disable=too-many-nested-blocks
393
402
  while not app_state_tracker.interrupt:
394
403
  try:
395
404
  # Receive
@@ -431,7 +440,9 @@ def start_client_internal(
431
440
  run: Run = runs[run_id]
432
441
  if get_fab is not None and run.fab_hash:
433
442
  fab = get_fab(run.fab_hash)
434
- install_from_fab(fab.content, flwr_path, True)
443
+ if not isolation:
444
+ # If `ClientApp` runs in the same process, install the FAB
445
+ install_from_fab(fab.content, flwr_path, True)
435
446
  fab_id, fab_version = get_fab_metadata(fab.content)
436
447
  else:
437
448
  fab = None
@@ -455,39 +466,51 @@ def start_client_internal(
455
466
 
456
467
  # Handle app loading and task message
457
468
  try:
458
- if isolate:
469
+ if isolation:
470
+ # Two isolation modes:
471
+ # 1. `subprocess`: SuperNode is starting the ClientApp
472
+ # process as a subprocess.
473
+ # 2. `process`: ClientApp process gets started separately
474
+ # (via `flwr-clientapp`), for example, in a separate
475
+ # Docker container.
476
+
459
477
  # Generate SuperNode token
460
478
  token: int = generate_rand_int_from_bytes(RUN_ID_NUM_BYTES)
461
479
 
480
+ # Mode 1: SuperNode starts ClientApp as subprocess
481
+ start_subprocess = isolation == ISOLATION_MODE_SUBPROCESS
482
+
462
483
  # Share Message and Context with servicer
463
484
  clientappio_servicer.set_inputs(
464
- clientapp_input=ClientAppIoInputs(
485
+ clientapp_input=ClientAppInputs(
465
486
  message=message,
466
487
  context=context,
467
488
  run=run,
489
+ fab=fab,
468
490
  token=token,
469
491
  ),
470
- token_returned=True,
471
- )
472
-
473
- # Run `ClientApp` in subprocess
474
- command = [
475
- "flwr-clientapp",
476
- "--supernode",
477
- supernode_address,
478
- "--token",
479
- str(token),
480
- ]
481
- subprocess.run(
482
- command,
483
- stdout=None,
484
- stderr=None,
485
- check=True,
492
+ token_returned=start_subprocess,
486
493
  )
487
494
 
488
- # Wait for output to become available
489
- while not clientappio_servicer.has_outputs():
490
- time.sleep(0.1)
495
+ if start_subprocess:
496
+ # Start ClientApp subprocess
497
+ command = [
498
+ "flwr-clientapp",
499
+ "--supernode",
500
+ supernode_address,
501
+ "--token",
502
+ str(token),
503
+ ]
504
+ subprocess.run(
505
+ command,
506
+ stdout=None,
507
+ stderr=None,
508
+ check=True,
509
+ )
510
+ else:
511
+ # Wait for output to become available
512
+ while not clientappio_servicer.has_outputs():
513
+ time.sleep(0.1)
491
514
 
492
515
  outputs = clientappio_servicer.get_outputs()
493
516
  reply_message, context = outputs.message, outputs.context
@@ -544,6 +567,7 @@ def start_client_internal(
544
567
  except StopIteration:
545
568
  sleep_duration = 0
546
569
  break
570
+ # pylint: enable=too-many-nested-blocks
547
571
 
548
572
  # Unregister node
549
573
  if delete_node is not None and app_state_tracker.is_connected:
@@ -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
@@ -27,11 +27,12 @@ from flwr.common.serde import (
27
27
  clientappstatus_to_proto,
28
28
  context_from_proto,
29
29
  context_to_proto,
30
+ fab_to_proto,
30
31
  message_from_proto,
31
32
  message_to_proto,
32
33
  run_to_proto,
33
34
  )
34
- from flwr.common.typing import Run
35
+ from flwr.common.typing import Fab, Run
35
36
 
36
37
  # pylint: disable=E0611
37
38
  from flwr.proto import clientappio_pb2_grpc
@@ -46,17 +47,18 @@ from flwr.proto.clientappio_pb2 import ( # pylint: disable=E0401
46
47
 
47
48
 
48
49
  @dataclass
49
- class ClientAppIoInputs:
50
+ class ClientAppInputs:
50
51
  """Specify the inputs to the ClientApp."""
51
52
 
52
53
  message: Message
53
54
  context: Context
54
55
  run: Run
56
+ fab: Optional[Fab]
55
57
  token: int
56
58
 
57
59
 
58
60
  @dataclass
59
- class ClientAppIoOutputs:
61
+ class ClientAppOutputs:
60
62
  """Specify the outputs from the ClientApp."""
61
63
 
62
64
  message: Message
@@ -68,8 +70,8 @@ class ClientAppIoServicer(clientappio_pb2_grpc.ClientAppIoServicer):
68
70
  """ClientAppIo API servicer."""
69
71
 
70
72
  def __init__(self) -> None:
71
- self.clientapp_input: Optional[ClientAppIoInputs] = None
72
- self.clientapp_output: Optional[ClientAppIoOutputs] = None
73
+ self.clientapp_input: Optional[ClientAppInputs] = None
74
+ self.clientapp_output: Optional[ClientAppOutputs] = None
73
75
  self.token_returned: bool = False
74
76
  self.inputs_returned: bool = False
75
77
 
@@ -79,13 +81,13 @@ class ClientAppIoServicer(clientappio_pb2_grpc.ClientAppIoServicer):
79
81
  """Get token."""
80
82
  log(DEBUG, "ClientAppIo.GetToken")
81
83
 
82
- # Fail if no ClientAppIoInputs are available
84
+ # Fail if no ClientAppInputs are available
83
85
  if self.clientapp_input is None:
84
86
  context.abort(
85
87
  grpc.StatusCode.FAILED_PRECONDITION,
86
88
  "No inputs available.",
87
89
  )
88
- clientapp_input = cast(ClientAppIoInputs, self.clientapp_input)
90
+ clientapp_input = cast(ClientAppInputs, self.clientapp_input)
89
91
 
90
92
  # Fail if token was already returned in a previous call
91
93
  if self.token_returned:
@@ -95,7 +97,7 @@ class ClientAppIoServicer(clientappio_pb2_grpc.ClientAppIoServicer):
95
97
  )
96
98
 
97
99
  # If
98
- # - ClientAppIoInputs is set, and
100
+ # - ClientAppInputs is set, and
99
101
  # - token hasn't been returned before,
100
102
  # return token
101
103
  self.token_returned = True
@@ -107,13 +109,13 @@ class ClientAppIoServicer(clientappio_pb2_grpc.ClientAppIoServicer):
107
109
  """Pull Message, Context, and Run."""
108
110
  log(DEBUG, "ClientAppIo.PullClientAppInputs")
109
111
 
110
- # Fail if no ClientAppIoInputs are available
112
+ # Fail if no ClientAppInputs are available
111
113
  if self.clientapp_input is None:
112
114
  context.abort(
113
115
  grpc.StatusCode.FAILED_PRECONDITION,
114
116
  "No inputs available.",
115
117
  )
116
- clientapp_input = cast(ClientAppIoInputs, self.clientapp_input)
118
+ clientapp_input = cast(ClientAppInputs, self.clientapp_input)
117
119
 
118
120
  # Fail if token wasn't returned in a previous call
119
121
  if not self.token_returned:
@@ -136,6 +138,7 @@ class ClientAppIoServicer(clientappio_pb2_grpc.ClientAppIoServicer):
136
138
  message=message_to_proto(clientapp_input.message),
137
139
  context=context_to_proto(clientapp_input.context),
138
140
  run=run_to_proto(clientapp_input.run),
141
+ fab=fab_to_proto(clientapp_input.fab) if clientapp_input.fab else None,
139
142
  )
140
143
 
141
144
  def PushClientAppOutputs(
@@ -144,13 +147,13 @@ class ClientAppIoServicer(clientappio_pb2_grpc.ClientAppIoServicer):
144
147
  """Push Message and Context."""
145
148
  log(DEBUG, "ClientAppIo.PushClientAppOutputs")
146
149
 
147
- # Fail if no ClientAppIoInputs are available
150
+ # Fail if no ClientAppInputs are available
148
151
  if not self.clientapp_input:
149
152
  context.abort(
150
153
  grpc.StatusCode.FAILED_PRECONDITION,
151
154
  "No inputs available.",
152
155
  )
153
- clientapp_input = cast(ClientAppIoInputs, self.clientapp_input)
156
+ clientapp_input = cast(ClientAppInputs, self.clientapp_input)
154
157
 
155
158
  # Fail if token wasn't returned in a previous call
156
159
  if not self.token_returned:
@@ -178,7 +181,7 @@ class ClientAppIoServicer(clientappio_pb2_grpc.ClientAppIoServicer):
178
181
  # Preconditions met
179
182
  try:
180
183
  # Update Message and Context
181
- self.clientapp_output = ClientAppIoOutputs(
184
+ self.clientapp_output = ClientAppOutputs(
182
185
  message=message_from_proto(request.message),
183
186
  context=context_from_proto(request.context),
184
187
  )
@@ -196,13 +199,13 @@ class ClientAppIoServicer(clientappio_pb2_grpc.ClientAppIoServicer):
196
199
  return PushClientAppOutputsResponse(status=proto_status)
197
200
 
198
201
  def set_inputs(
199
- self, clientapp_input: ClientAppIoInputs, token_returned: bool
202
+ self, clientapp_input: ClientAppInputs, token_returned: bool
200
203
  ) -> None:
201
204
  """Set ClientApp inputs.
202
205
 
203
206
  Parameters
204
207
  ----------
205
- clientapp_input : ClientAppIoInputs
208
+ clientapp_input : ClientAppInputs
206
209
  The inputs to the ClientApp.
207
210
  token_returned : bool
208
211
  A boolean indicating if the token has been returned.
@@ -215,9 +218,10 @@ class ClientAppIoServicer(clientappio_pb2_grpc.ClientAppIoServicer):
215
218
  or self.token_returned
216
219
  ):
217
220
  raise ValueError(
218
- "ClientAppIoInputs and ClientAppIoOutputs must not be set before "
221
+ "ClientAppInputs and ClientAppOutputs must not be set before "
219
222
  "calling `set_inputs`."
220
223
  )
224
+ log(DEBUG, "ClientAppInputs set (token: %s)", clientapp_input.token)
221
225
  self.clientapp_input = clientapp_input
222
226
  self.token_returned = token_returned
223
227
 
@@ -225,13 +229,13 @@ class ClientAppIoServicer(clientappio_pb2_grpc.ClientAppIoServicer):
225
229
  """Check if ClientAppOutputs are available."""
226
230
  return self.clientapp_output is not None
227
231
 
228
- def get_outputs(self) -> ClientAppIoOutputs:
232
+ def get_outputs(self) -> ClientAppOutputs:
229
233
  """Get ClientApp outputs."""
230
234
  if self.clientapp_output is None:
231
- raise ValueError("ClientAppIoOutputs not set before calling `get_outputs`.")
235
+ raise ValueError("ClientAppOutputs not set before calling `get_outputs`.")
232
236
 
233
237
  # Set outputs to a local variable and clear state
234
- output: ClientAppIoOutputs = self.clientapp_output
238
+ output: ClientAppOutputs = self.clientapp_output
235
239
  self.clientapp_input = None
236
240
  self.clientapp_output = None
237
241
  self.token_returned = False
@@ -37,7 +37,11 @@ from flwr.common.constant import (
37
37
  from flwr.common.exit_handlers import register_exit_handlers
38
38
  from flwr.common.logger import log, warn_deprecated_feature
39
39
 
40
- from ..app import start_client_internal
40
+ from ..app import (
41
+ ISOLATION_MODE_PROCESS,
42
+ ISOLATION_MODE_SUBPROCESS,
43
+ start_client_internal,
44
+ )
41
45
  from ..clientapp.utils import get_load_client_app_fn
42
46
 
43
47
  ADDRESS_FLEET_API_GRPC_RERE = "0.0.0.0:9092"
@@ -62,6 +66,8 @@ def run_supernode() -> None:
62
66
  )
63
67
  authentication_keys = _try_setup_client_authentication(args)
64
68
 
69
+ log(DEBUG, "Isolation mode: %s", args.isolation)
70
+
65
71
  start_client_internal(
66
72
  server_address=args.superlink,
67
73
  load_client_app_fn=load_fn,
@@ -72,7 +78,7 @@ def run_supernode() -> None:
72
78
  max_retries=args.max_retries,
73
79
  max_wait_time=args.max_wait_time,
74
80
  node_config=parse_config_args([args.node_config]),
75
- isolate=args.isolate,
81
+ isolation=args.isolation,
76
82
  supernode_address=args.supernode_address,
77
83
  )
78
84
 
@@ -199,10 +205,18 @@ def _parse_args_run_supernode() -> argparse.ArgumentParser:
199
205
  """,
200
206
  )
201
207
  parser.add_argument(
202
- "--isolate",
203
- action="store_true",
204
- help="Run `ClientApp` in an isolated subprocess. By default, `ClientApp` "
205
- "runs in the same process that executes the SuperNode.",
208
+ "--isolation",
209
+ default=None,
210
+ required=False,
211
+ choices=[
212
+ ISOLATION_MODE_SUBPROCESS,
213
+ ISOLATION_MODE_PROCESS,
214
+ ],
215
+ help="Isolation mode when running `ClientApp` (optional, possible values: "
216
+ "`subprocess`, `process`). By default, `ClientApp` runs in the same process "
217
+ "that executes the SuperNode. Use `subprocess` to configure SuperNode to run "
218
+ "`ClientApp` in a subprocess. Use `process` to indicate that a separate "
219
+ "independent process gets created outside of SuperNode.",
206
220
  )
207
221
  parser.add_argument(
208
222
  "--supernode-address",