flwr-nightly 1.19.0.dev20250602__tar.gz → 1.19.0.dev20250604__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.
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/PKG-INFO +1 -1
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/client/grpc_rere_client/connection.py +52 -24
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/common/inflatable.py +8 -2
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/common/inflatable_grpc_utils.py +12 -6
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/common/record/metricrecord.py +1 -1
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/common/retry_invoker.py +5 -1
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/proto/message_pb2.py +2 -2
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/proto/message_pb2.pyi +7 -1
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/grid/grpc_grid.py +73 -34
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/superlink/ffs/__init__.py +2 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +62 -5
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/superlink/serverappio/serverappio_servicer.py +58 -3
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/supernode/cli/flower_supernode.py +1 -2
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/supernode/cli/flwr_clientapp.py +8 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/supernode/runtime/run_clientapp.py +22 -1
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/supernode/start_client_internal.py +83 -100
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/pyproject.toml +1 -1
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/README.md +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/app/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/app/error.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/app/metadata.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/cli/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/cli/app.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/cli/auth_plugin/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/cli/auth_plugin/oidc_cli_plugin.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/cli/build.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/cli/cli_user_auth_interceptor.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/cli/config_utils.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/cli/constant.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/cli/example.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/cli/install.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/cli/log.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/cli/login/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/cli/login/login.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/cli/ls.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/cli/new/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/cli/new/new.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/cli/new/templates/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/cli/new/templates/app/.gitignore.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/cli/new/templates/app/LICENSE.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/cli/new/templates/app/README.baseline.md.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/cli/new/templates/app/README.flowertune.md.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/cli/new/templates/app/README.md.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/cli/new/templates/app/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/cli/new/templates/app/code/__init__.baseline.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/cli/new/templates/app/code/client.baseline.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/cli/new/templates/app/code/client.huggingface.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/cli/new/templates/app/code/client.jax.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/cli/new/templates/app/code/client.mlx.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/cli/new/templates/app/code/client.numpy.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/cli/new/templates/app/code/dataset.baseline.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/cli/new/templates/app/code/flwr_tune/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/cli/new/templates/app/code/flwr_tune/client_app.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/cli/new/templates/app/code/flwr_tune/dataset.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/cli/new/templates/app/code/flwr_tune/models.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/cli/new/templates/app/code/flwr_tune/server_app.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/cli/new/templates/app/code/flwr_tune/strategy.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/cli/new/templates/app/code/model.baseline.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/cli/new/templates/app/code/server.baseline.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/cli/new/templates/app/code/server.huggingface.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/cli/new/templates/app/code/server.jax.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/cli/new/templates/app/code/server.mlx.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/cli/new/templates/app/code/server.sklearn.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/cli/new/templates/app/code/strategy.baseline.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/cli/new/templates/app/code/task.huggingface.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/cli/new/templates/app/code/task.jax.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/cli/new/templates/app/code/task.mlx.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/cli/new/templates/app/code/task.numpy.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/cli/new/templates/app/code/task.sklearn.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/cli/new/templates/app/code/task.tensorflow.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/cli/new/templates/app/code/utils.baseline.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/cli/new/templates/app/pyproject.baseline.toml.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/cli/new/templates/app/pyproject.jax.toml.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/cli/run/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/cli/run/run.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/cli/stop.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/cli/utils.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/client/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/client/client.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/client/client_app.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/client/clientapp/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/client/clientapp/utils.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/client/dpfedavg_numpy_client.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/client/grpc_adapter_client/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/client/grpc_adapter_client/connection.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/client/grpc_rere_client/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/client/grpc_rere_client/client_interceptor.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/client/grpc_rere_client/grpc_adapter.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/client/message_handler/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/client/message_handler/message_handler.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/client/mod/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/client/mod/centraldp_mods.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/client/mod/comms_mods.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/client/mod/localdp_mod.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/client/mod/utils.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/client/numpy_client.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/client/rest_client/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/client/rest_client/connection.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/client/run_info_store.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/client/typing.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/clientapp/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/common/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/common/address.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/common/args.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/common/auth_plugin/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/common/auth_plugin/auth_plugin.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/common/config.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/common/constant.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/common/context.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/common/date.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/common/differential_privacy.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/common/differential_privacy_constants.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/common/dp.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/common/event_log_plugin/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/common/event_log_plugin/event_log_plugin.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/common/exit/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/common/exit/exit.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/common/exit/exit_code.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/common/exit_handlers.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/common/grpc.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/common/heartbeat.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/common/logger.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/common/message.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/common/object_ref.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/common/parameter.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/common/pyproject.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/common/record/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/common/record/array.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/common/record/arrayrecord.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/common/record/configrecord.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/common/record/conversion_utils.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/common/record/recorddict.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/common/record/typeddict.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/common/recorddict_compat.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/common/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/common/secure_aggregation/quantization.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/common/serde.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/common/serde_utils.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/common/telemetry.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/common/typing.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/common/version.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/compat/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/compat/client/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/compat/client/app.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/compat/client/grpc_client/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/compat/client/grpc_client/connection.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/compat/common/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/compat/server/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/compat/server/app.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/compat/simulation/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/proto/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/proto/clientappio_pb2.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/proto/clientappio_pb2.pyi +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/proto/clientappio_pb2_grpc.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/proto/clientappio_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/proto/error_pb2.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/proto/error_pb2.pyi +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/proto/error_pb2_grpc.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/proto/error_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/proto/exec_pb2.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/proto/exec_pb2.pyi +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/proto/exec_pb2_grpc.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/proto/exec_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/proto/fab_pb2.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/proto/fab_pb2.pyi +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/proto/fab_pb2_grpc.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/proto/fab_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/proto/fleet_pb2.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/proto/fleet_pb2.pyi +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/proto/fleet_pb2_grpc.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/proto/grpcadapter_pb2.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/proto/grpcadapter_pb2.pyi +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/proto/grpcadapter_pb2_grpc.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/proto/grpcadapter_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/proto/heartbeat_pb2.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/proto/heartbeat_pb2.pyi +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/proto/heartbeat_pb2_grpc.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/proto/heartbeat_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/proto/log_pb2.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/proto/log_pb2.pyi +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/proto/log_pb2_grpc.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/proto/log_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/proto/message_pb2_grpc.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/proto/message_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/proto/node_pb2.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/proto/node_pb2.pyi +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/proto/node_pb2_grpc.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/proto/node_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/proto/recorddict_pb2.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/proto/recorddict_pb2.pyi +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/proto/recorddict_pb2_grpc.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/proto/recorddict_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/proto/run_pb2.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/proto/run_pb2.pyi +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/proto/run_pb2_grpc.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/proto/run_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/proto/serverappio_pb2.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/proto/serverappio_pb2.pyi +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/proto/serverappio_pb2_grpc.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/proto/serverappio_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/proto/simulationio_pb2.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/proto/simulationio_pb2.pyi +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/proto/simulationio_pb2_grpc.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/proto/simulationio_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/proto/transport_pb2.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/proto/transport_pb2.pyi +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/proto/transport_pb2_grpc.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/py.typed +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/app.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/client_manager.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/client_proxy.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/compat/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/compat/app.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/compat/app_utils.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/compat/grid_client_proxy.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/compat/legacy_context.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/criterion.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/fleet_event_log_interceptor.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/grid/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/grid/grid.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/grid/inmemory_grid.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/history.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/run_serverapp.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/server.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/server_app.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/server_config.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/serverapp/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/serverapp/app.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/serverapp_components.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/strategy/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/strategy/aggregate.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/strategy/bulyan.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/strategy/fedadagrad.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/strategy/fedadam.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/strategy/fedavg.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/strategy/fedavg_android.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/strategy/fedavgm.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/strategy/fedmedian.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/strategy/fedopt.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/strategy/fedprox.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/strategy/fedyogi.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/strategy/krum.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/strategy/qfedavg.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/strategy/strategy.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/superlink/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/superlink/ffs/disk_ffs.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/superlink/ffs/ffs.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/superlink/ffs/ffs_factory.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/superlink/fleet/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/superlink/fleet/grpc_adapter/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/superlink/fleet/message_handler/message_handler.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/superlink/fleet/vce/vce_api.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/superlink/linkstate/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/superlink/linkstate/in_memory_linkstate.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/superlink/linkstate/linkstate.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/superlink/linkstate/linkstate_factory.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/superlink/linkstate/sqlite_linkstate.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/superlink/linkstate/utils.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/superlink/serverappio/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/superlink/serverappio/serverappio_grpc.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/superlink/simulation/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/superlink/simulation/simulationio_grpc.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/superlink/simulation/simulationio_servicer.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/superlink/utils.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/typing.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/utils/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/utils/tensorboard.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/utils/validator.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/workflow/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/workflow/constant.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/workflow/default_workflows.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/serverapp/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/simulation/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/simulation/app.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/simulation/legacy_app.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/simulation/ray_transport/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/simulation/ray_transport/utils.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/simulation/run_simulation.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/simulation/simulationio_connection.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/supercore/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/supercore/object_store/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/supercore/object_store/in_memory_object_store.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/supercore/object_store/object_store.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/supercore/object_store/object_store_factory.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/superexec/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/superexec/app.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/superexec/deployment.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/superexec/exec_event_log_interceptor.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/superexec/exec_grpc.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/superexec/exec_servicer.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/superexec/exec_user_auth_interceptor.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/superexec/executor.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/superexec/simulation.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/superlink/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/supernode/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/supernode/cli/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/supernode/nodestate/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/supernode/nodestate/in_memory_nodestate.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/supernode/nodestate/nodestate.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/supernode/nodestate/nodestate_factory.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/supernode/runtime/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/supernode/servicer/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/supernode/servicer/clientappio/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/supernode/servicer/clientappio/clientappio_servicer.py +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.3
|
2
2
|
Name: flwr-nightly
|
3
|
-
Version: 1.19.0.
|
3
|
+
Version: 1.19.0.dev20250604
|
4
4
|
Summary: Flower: A Friendly Federated AI Framework
|
5
5
|
License: Apache-2.0
|
6
6
|
Keywords: Artificial Intelligence,Federated AI,Federated Analytics,Federated Evaluation,Federated Learning,Flower,Machine Learning
|
@@ -14,11 +14,10 @@
|
|
14
14
|
# ==============================================================================
|
15
15
|
"""Contextmanager for a gRPC request-response channel to the Flower server."""
|
16
16
|
|
17
|
-
|
18
17
|
from collections.abc import Iterator, Sequence
|
19
18
|
from contextlib import contextmanager
|
20
19
|
from copy import copy
|
21
|
-
from logging import ERROR
|
20
|
+
from logging import DEBUG, ERROR
|
22
21
|
from pathlib import Path
|
23
22
|
from typing import Callable, Optional, Union, cast
|
24
23
|
|
@@ -31,13 +30,17 @@ from flwr.common import GRPC_MAX_MESSAGE_LENGTH
|
|
31
30
|
from flwr.common.constant import HEARTBEAT_CALL_TIMEOUT, HEARTBEAT_DEFAULT_INTERVAL
|
32
31
|
from flwr.common.grpc import create_channel, on_channel_state_change
|
33
32
|
from flwr.common.heartbeat import HeartbeatSender
|
33
|
+
from flwr.common.inflatable_grpc_utils import (
|
34
|
+
pull_object_from_servicer,
|
35
|
+
push_object_to_servicer,
|
36
|
+
)
|
34
37
|
from flwr.common.logger import log
|
35
|
-
from flwr.common.message import Message
|
36
|
-
from flwr.common.retry_invoker import RetryInvoker
|
38
|
+
from flwr.common.message import Message, get_message_to_descendant_id_mapping
|
39
|
+
from flwr.common.retry_invoker import RetryInvoker, _wrap_stub
|
37
40
|
from flwr.common.secure_aggregation.crypto.symmetric_encryption import (
|
38
41
|
generate_key_pairs,
|
39
42
|
)
|
40
|
-
from flwr.common.serde import
|
43
|
+
from flwr.common.serde import message_to_proto, run_from_proto
|
41
44
|
from flwr.common.typing import Fab, Run, RunNotRunningException
|
42
45
|
from flwr.proto.fab_pb2 import GetFabRequest, GetFabResponse # pylint: disable=E0611
|
43
46
|
from flwr.proto.fleet_pb2 import ( # pylint: disable=E0611
|
@@ -46,6 +49,7 @@ from flwr.proto.fleet_pb2 import ( # pylint: disable=E0611
|
|
46
49
|
PullMessagesRequest,
|
47
50
|
PullMessagesResponse,
|
48
51
|
PushMessagesRequest,
|
52
|
+
PushMessagesResponse,
|
49
53
|
)
|
50
54
|
from flwr.proto.fleet_pb2_grpc import FleetStub # pylint: disable=E0611
|
51
55
|
from flwr.proto.heartbeat_pb2 import ( # pylint: disable=E0611
|
@@ -159,6 +163,8 @@ def grpc_request_response( # pylint: disable=R0913,R0914,R0915,R0917
|
|
159
163
|
# If the status code is PERMISSION_DENIED, additionally raise RunNotRunningException
|
160
164
|
retry_invoker.should_giveup = _should_giveup_fn
|
161
165
|
|
166
|
+
# Wrap stub
|
167
|
+
_wrap_stub(stub, retry_invoker)
|
162
168
|
###########################################################################
|
163
169
|
# send_node_heartbeat/create_node/delete_node/receive/send/get_run functions
|
164
170
|
###########################################################################
|
@@ -203,10 +209,7 @@ def grpc_request_response( # pylint: disable=R0913,R0914,R0915,R0917
|
|
203
209
|
create_node_request = CreateNodeRequest(
|
204
210
|
heartbeat_interval=HEARTBEAT_DEFAULT_INTERVAL
|
205
211
|
)
|
206
|
-
create_node_response =
|
207
|
-
stub.CreateNode,
|
208
|
-
request=create_node_request,
|
209
|
-
)
|
212
|
+
create_node_response = stub.CreateNode(request=create_node_request)
|
210
213
|
|
211
214
|
# Remember the node and start the heartbeat sender
|
212
215
|
nonlocal node
|
@@ -227,7 +230,7 @@ def grpc_request_response( # pylint: disable=R0913,R0914,R0915,R0917
|
|
227
230
|
|
228
231
|
# Call FleetAPI
|
229
232
|
delete_node_request = DeleteNodeRequest(node=node)
|
230
|
-
|
233
|
+
stub.DeleteNode(request=delete_node_request)
|
231
234
|
|
232
235
|
# Cleanup
|
233
236
|
node = None
|
@@ -241,9 +244,7 @@ def grpc_request_response( # pylint: disable=R0913,R0914,R0915,R0917
|
|
241
244
|
|
242
245
|
# Request instructions (message) from server
|
243
246
|
request = PullMessagesRequest(node=node)
|
244
|
-
response: PullMessagesResponse =
|
245
|
-
stub.PullMessages, request=request
|
246
|
-
)
|
247
|
+
response: PullMessagesResponse = stub.PullMessages(request=request)
|
247
248
|
|
248
249
|
# Get the current Messages
|
249
250
|
message_proto = (
|
@@ -257,7 +258,24 @@ def grpc_request_response( # pylint: disable=R0913,R0914,R0915,R0917
|
|
257
258
|
message_proto = None
|
258
259
|
|
259
260
|
# Construct the Message
|
260
|
-
in_message =
|
261
|
+
in_message: Optional[Message] = None
|
262
|
+
|
263
|
+
if message_proto:
|
264
|
+
in_message = cast(
|
265
|
+
Message,
|
266
|
+
pull_object_from_servicer(
|
267
|
+
object_id=message_proto.metadata.message_id,
|
268
|
+
stub=stub,
|
269
|
+
node=node,
|
270
|
+
run_id=message_proto.metadata.run_id,
|
271
|
+
),
|
272
|
+
)
|
273
|
+
|
274
|
+
if in_message:
|
275
|
+
# The deflated message doesn't contain the message_id (its own object_id)
|
276
|
+
# Inject
|
277
|
+
# pylint: disable-next=W0212
|
278
|
+
in_message.metadata._message_id = message_proto.metadata.message_id # type: ignore
|
261
279
|
|
262
280
|
# Remember `metadata` of the in message
|
263
281
|
nonlocal metadata
|
@@ -288,8 +306,24 @@ def grpc_request_response( # pylint: disable=R0913,R0914,R0915,R0917
|
|
288
306
|
|
289
307
|
# Serialize Message
|
290
308
|
message_proto = message_to_proto(message=message)
|
291
|
-
|
292
|
-
|
309
|
+
descendants_mapping = get_message_to_descendant_id_mapping(message)
|
310
|
+
request = PushMessagesRequest(
|
311
|
+
node=node,
|
312
|
+
messages_list=[message_proto],
|
313
|
+
msg_to_descendant_mapping=descendants_mapping,
|
314
|
+
)
|
315
|
+
response: PushMessagesResponse = stub.PushMessages(request=request)
|
316
|
+
|
317
|
+
if response.objects_to_push:
|
318
|
+
objs_to_push = set(response.objects_to_push[message.object_id].object_ids)
|
319
|
+
push_object_to_servicer(
|
320
|
+
message,
|
321
|
+
stub,
|
322
|
+
node,
|
323
|
+
run_id=message.metadata.run_id,
|
324
|
+
object_ids_to_push=objs_to_push,
|
325
|
+
)
|
326
|
+
log(DEBUG, "Pushed %s objects to servicer.", len(objs_to_push))
|
293
327
|
|
294
328
|
# Cleanup
|
295
329
|
metadata = None
|
@@ -297,10 +331,7 @@ def grpc_request_response( # pylint: disable=R0913,R0914,R0915,R0917
|
|
297
331
|
def get_run(run_id: int) -> Run:
|
298
332
|
# Call FleetAPI
|
299
333
|
get_run_request = GetRunRequest(node=node, run_id=run_id)
|
300
|
-
get_run_response: GetRunResponse =
|
301
|
-
stub.GetRun,
|
302
|
-
request=get_run_request,
|
303
|
-
)
|
334
|
+
get_run_response: GetRunResponse = stub.GetRun(request=get_run_request)
|
304
335
|
|
305
336
|
# Return fab_id and fab_version
|
306
337
|
return run_from_proto(get_run_response.run)
|
@@ -308,10 +339,7 @@ def grpc_request_response( # pylint: disable=R0913,R0914,R0915,R0917
|
|
308
339
|
def get_fab(fab_hash: str, run_id: int) -> Fab:
|
309
340
|
# Call FleetAPI
|
310
341
|
get_fab_request = GetFabRequest(node=node, hash_str=fab_hash, run_id=run_id)
|
311
|
-
get_fab_response: GetFabResponse =
|
312
|
-
stub.GetFab,
|
313
|
-
request=get_fab_request,
|
314
|
-
)
|
342
|
+
get_fab_response: GetFabResponse = stub.GetFab(request=get_fab_request)
|
315
343
|
|
316
344
|
return Fab(get_fab_response.fab.hash_str, get_fab_response.fab.content)
|
317
345
|
|
{flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/common/inflatable.py
RENAMED
@@ -18,9 +18,11 @@
|
|
18
18
|
from __future__ import annotations
|
19
19
|
|
20
20
|
import hashlib
|
21
|
+
from logging import ERROR
|
21
22
|
from typing import TypeVar, cast
|
22
23
|
|
23
24
|
from .constant import HEAD_BODY_DIVIDER, HEAD_VALUE_DIVIDER
|
25
|
+
from .logger import log
|
24
26
|
|
25
27
|
|
26
28
|
class InflatableObject:
|
@@ -163,8 +165,12 @@ def get_object_body_len_from_object_content(object_content: bytes) -> int:
|
|
163
165
|
|
164
166
|
def check_body_len_consistency(object_content: bytes) -> bool:
|
165
167
|
"""Check that the object body is of length as specified in the head."""
|
166
|
-
|
167
|
-
|
168
|
+
try:
|
169
|
+
body_len = get_object_body_len_from_object_content(object_content)
|
170
|
+
return body_len == len(_get_object_body(object_content))
|
171
|
+
except ValueError:
|
172
|
+
log(ERROR, "Object content does match the expected format.")
|
173
|
+
return False
|
168
174
|
|
169
175
|
|
170
176
|
def get_object_head_values_from_object_content(
|
@@ -15,8 +15,10 @@
|
|
15
15
|
"""InflatableObject utils."""
|
16
16
|
|
17
17
|
|
18
|
+
from time import sleep
|
18
19
|
from typing import Optional, Union
|
19
20
|
|
21
|
+
from flwr.client.grpc_rere_client.grpc_adapter import GrpcAdapter
|
20
22
|
from flwr.proto.fleet_pb2_grpc import FleetStub # pylint: disable=E0611
|
21
23
|
from flwr.proto.message_pb2 import ( # pylint: disable=E0611
|
22
24
|
PullObjectRequest,
|
@@ -48,7 +50,7 @@ inflatable_class_registry: dict[str, type[InflatableObject]] = {
|
|
48
50
|
|
49
51
|
def push_object_to_servicer(
|
50
52
|
obj: InflatableObject,
|
51
|
-
stub: Union[FleetStub, ServerAppIoStub],
|
53
|
+
stub: Union[FleetStub, ServerAppIoStub, GrpcAdapter],
|
52
54
|
node: Node,
|
53
55
|
run_id: int,
|
54
56
|
object_ids_to_push: Optional[set[str]] = None,
|
@@ -87,16 +89,20 @@ def push_object_to_servicer(
|
|
87
89
|
|
88
90
|
def pull_object_from_servicer(
|
89
91
|
object_id: str,
|
90
|
-
stub: Union[FleetStub, ServerAppIoStub],
|
92
|
+
stub: Union[FleetStub, ServerAppIoStub, GrpcAdapter],
|
91
93
|
node: Node,
|
92
94
|
run_id: int,
|
93
95
|
) -> InflatableObject:
|
94
96
|
"""Recursively inflate an object by pulling it from the servicer."""
|
95
97
|
# Pull object
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
98
|
+
object_available = False
|
99
|
+
while not object_available:
|
100
|
+
object_proto: PullObjectResponse = stub.PullObject(
|
101
|
+
PullObjectRequest(node=node, run_id=run_id, object_id=object_id)
|
102
|
+
)
|
103
|
+
object_available = object_proto.object_available
|
104
|
+
object_content = object_proto.object_content
|
105
|
+
sleep(0.1)
|
100
106
|
|
101
107
|
# Extract object class and object_ids of children
|
102
108
|
obj_type, children_obj_ids, _ = get_object_head_values_from_object_content(
|
@@ -180,7 +180,7 @@ class MetricRecord(TypedDict[str, MetricRecordValues], InflatableObject):
|
|
180
180
|
MetricRecord
|
181
181
|
The inflated MetricRecord.
|
182
182
|
"""
|
183
|
-
if children
|
183
|
+
if children:
|
184
184
|
raise ValueError("`MetricRecord` objects do not have children.")
|
185
185
|
|
186
186
|
obj_body = get_object_body(object_content, cls)
|
{flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/common/retry_invoker.py
RENAMED
@@ -25,10 +25,12 @@ from typing import Any, Callable, Optional, Union, cast
|
|
25
25
|
|
26
26
|
import grpc
|
27
27
|
|
28
|
+
from flwr.client.grpc_rere_client.grpc_adapter import GrpcAdapter
|
28
29
|
from flwr.common.constant import MAX_RETRY_DELAY
|
29
30
|
from flwr.common.logger import log
|
30
31
|
from flwr.common.typing import RunNotRunningException
|
31
32
|
from flwr.proto.clientappio_pb2_grpc import ClientAppIoStub
|
33
|
+
from flwr.proto.fleet_pb2_grpc import FleetStub
|
32
34
|
from flwr.proto.serverappio_pb2_grpc import ServerAppIoStub
|
33
35
|
from flwr.proto.simulationio_pb2_grpc import SimulationIoStub
|
34
36
|
|
@@ -366,7 +368,9 @@ def _make_simple_grpc_retry_invoker() -> RetryInvoker:
|
|
366
368
|
|
367
369
|
|
368
370
|
def _wrap_stub(
|
369
|
-
stub: Union[
|
371
|
+
stub: Union[
|
372
|
+
ServerAppIoStub, ClientAppIoStub, SimulationIoStub, FleetStub, GrpcAdapter
|
373
|
+
],
|
370
374
|
retry_invoker: RetryInvoker,
|
371
375
|
) -> None:
|
372
376
|
"""Wrap a gRPC stub with a retry invoker."""
|
{flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/proto/message_pb2.py
RENAMED
@@ -18,7 +18,7 @@ from flwr.proto import transport_pb2 as flwr_dot_proto_dot_transport__pb2
|
|
18
18
|
from flwr.proto import node_pb2 as flwr_dot_proto_dot_node__pb2
|
19
19
|
|
20
20
|
|
21
|
-
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x18\x66lwr/proto/message.proto\x12\nflwr.proto\x1a\x16\x66lwr/proto/error.proto\x1a\x1b\x66lwr/proto/recorddict.proto\x1a\x1a\x66lwr/proto/transport.proto\x1a\x15\x66lwr/proto/node.proto\"|\n\x07Message\x12&\n\x08metadata\x18\x01 \x01(\x0b\x32\x14.flwr.proto.Metadata\x12\'\n\x07\x63ontent\x18\x02 \x01(\x0b\x32\x16.flwr.proto.RecordDict\x12 \n\x05\x65rror\x18\x03 \x01(\x0b\x32\x11.flwr.proto.Error\"\xd0\x02\n\x07\x43ontext\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\x12\x0f\n\x07node_id\x18\x02 \x01(\x04\x12\x38\n\x0bnode_config\x18\x03 \x03(\x0b\x32#.flwr.proto.Context.NodeConfigEntry\x12%\n\x05state\x18\x04 \x01(\x0b\x32\x16.flwr.proto.RecordDict\x12\x36\n\nrun_config\x18\x05 \x03(\x0b\x32\".flwr.proto.Context.RunConfigEntry\x1a\x45\n\x0fNodeConfigEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12!\n\x05value\x18\x02 \x01(\x0b\x32\x12.flwr.proto.Scalar:\x02\x38\x01\x1a\x44\n\x0eRunConfigEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12!\n\x05value\x18\x02 \x01(\x0b\x32\x12.flwr.proto.Scalar:\x02\x38\x01\"\xbe\x01\n\x08Metadata\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\x12\x12\n\nmessage_id\x18\x02 \x01(\t\x12\x13\n\x0bsrc_node_id\x18\x03 \x01(\x04\x12\x13\n\x0b\x64st_node_id\x18\x04 \x01(\x04\x12\x1b\n\x13reply_to_message_id\x18\x05 \x01(\t\x12\x10\n\x08group_id\x18\x06 \x01(\t\x12\x0b\n\x03ttl\x18\x07 \x01(\x01\x12\x14\n\x0cmessage_type\x18\x08 \x01(\t\x12\x12\n\ncreated_at\x18\t \x01(\x01\"\x1f\n\tObjectIDs\x12\x12\n\nobject_ids\x18\x01 \x03(\t\"n\n\x11PushObjectRequest\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\x12\x0e\n\x06run_id\x18\x02 \x01(\x04\x12\x11\n\tobject_id\x18\x03 \x01(\t\x12\x16\n\x0eobject_content\x18\x04 \x01(\x0c\"$\n\x12PushObjectResponse\x12\x0e\n\x06stored\x18\x01 \x01(\x08\"V\n\x11PullObjectRequest\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\x12\x0e\n\x06run_id\x18\x02 \x01(\x04\x12\x11\n\tobject_id\x18\x03 \x01(\t\"
|
21
|
+
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x18\x66lwr/proto/message.proto\x12\nflwr.proto\x1a\x16\x66lwr/proto/error.proto\x1a\x1b\x66lwr/proto/recorddict.proto\x1a\x1a\x66lwr/proto/transport.proto\x1a\x15\x66lwr/proto/node.proto\"|\n\x07Message\x12&\n\x08metadata\x18\x01 \x01(\x0b\x32\x14.flwr.proto.Metadata\x12\'\n\x07\x63ontent\x18\x02 \x01(\x0b\x32\x16.flwr.proto.RecordDict\x12 \n\x05\x65rror\x18\x03 \x01(\x0b\x32\x11.flwr.proto.Error\"\xd0\x02\n\x07\x43ontext\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\x12\x0f\n\x07node_id\x18\x02 \x01(\x04\x12\x38\n\x0bnode_config\x18\x03 \x03(\x0b\x32#.flwr.proto.Context.NodeConfigEntry\x12%\n\x05state\x18\x04 \x01(\x0b\x32\x16.flwr.proto.RecordDict\x12\x36\n\nrun_config\x18\x05 \x03(\x0b\x32\".flwr.proto.Context.RunConfigEntry\x1a\x45\n\x0fNodeConfigEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12!\n\x05value\x18\x02 \x01(\x0b\x32\x12.flwr.proto.Scalar:\x02\x38\x01\x1a\x44\n\x0eRunConfigEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12!\n\x05value\x18\x02 \x01(\x0b\x32\x12.flwr.proto.Scalar:\x02\x38\x01\"\xbe\x01\n\x08Metadata\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\x12\x12\n\nmessage_id\x18\x02 \x01(\t\x12\x13\n\x0bsrc_node_id\x18\x03 \x01(\x04\x12\x13\n\x0b\x64st_node_id\x18\x04 \x01(\x04\x12\x1b\n\x13reply_to_message_id\x18\x05 \x01(\t\x12\x10\n\x08group_id\x18\x06 \x01(\t\x12\x0b\n\x03ttl\x18\x07 \x01(\x01\x12\x14\n\x0cmessage_type\x18\x08 \x01(\t\x12\x12\n\ncreated_at\x18\t \x01(\x01\"\x1f\n\tObjectIDs\x12\x12\n\nobject_ids\x18\x01 \x03(\t\"n\n\x11PushObjectRequest\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\x12\x0e\n\x06run_id\x18\x02 \x01(\x04\x12\x11\n\tobject_id\x18\x03 \x01(\t\x12\x16\n\x0eobject_content\x18\x04 \x01(\x0c\"$\n\x12PushObjectResponse\x12\x0e\n\x06stored\x18\x01 \x01(\x08\"V\n\x11PullObjectRequest\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\x12\x0e\n\x06run_id\x18\x02 \x01(\x04\x12\x11\n\tobject_id\x18\x03 \x01(\t\"\\\n\x12PullObjectResponse\x12\x14\n\x0cobject_found\x18\x01 \x01(\x08\x12\x18\n\x10object_available\x18\x02 \x01(\x08\x12\x16\n\x0eobject_content\x18\x03 \x01(\x0c\x62\x06proto3')
|
22
22
|
|
23
23
|
_globals = globals()
|
24
24
|
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
|
@@ -48,5 +48,5 @@ if _descriptor._USE_C_DESCRIPTORS == False:
|
|
48
48
|
_globals['_PULLOBJECTREQUEST']._serialized_start=985
|
49
49
|
_globals['_PULLOBJECTREQUEST']._serialized_end=1071
|
50
50
|
_globals['_PULLOBJECTRESPONSE']._serialized_start=1073
|
51
|
-
_globals['_PULLOBJECTRESPONSE']._serialized_end=
|
51
|
+
_globals['_PULLOBJECTRESPONSE']._serialized_end=1165
|
52
52
|
# @@protoc_insertion_point(module_scope)
|
{flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/proto/message_pb2.pyi
RENAMED
@@ -196,11 +196,17 @@ global___PullObjectRequest = PullObjectRequest
|
|
196
196
|
|
197
197
|
class PullObjectResponse(google.protobuf.message.Message):
|
198
198
|
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
199
|
+
OBJECT_FOUND_FIELD_NUMBER: builtins.int
|
200
|
+
OBJECT_AVAILABLE_FIELD_NUMBER: builtins.int
|
199
201
|
OBJECT_CONTENT_FIELD_NUMBER: builtins.int
|
202
|
+
object_found: builtins.bool
|
203
|
+
object_available: builtins.bool
|
200
204
|
object_content: builtins.bytes
|
201
205
|
def __init__(self,
|
202
206
|
*,
|
207
|
+
object_found: builtins.bool = ...,
|
208
|
+
object_available: builtins.bool = ...,
|
203
209
|
object_content: builtins.bytes = ...,
|
204
210
|
) -> None: ...
|
205
|
-
def ClearField(self, field_name: typing_extensions.Literal["object_content",b"object_content"]) -> None: ...
|
211
|
+
def ClearField(self, field_name: typing_extensions.Literal["object_available",b"object_available","object_content",b"object_content","object_found",b"object_found"]) -> None: ...
|
206
212
|
global___PullObjectResponse = PullObjectResponse
|
{flwr_nightly-1.19.0.dev20250602 → flwr_nightly-1.19.0.dev20250604}/py/flwr/server/grid/grpc_grid.py
RENAMED
@@ -28,11 +28,15 @@ from flwr.common.constant import (
|
|
28
28
|
SUPERLINK_NODE_ID,
|
29
29
|
)
|
30
30
|
from flwr.common.grpc import create_channel, on_channel_state_change
|
31
|
+
from flwr.common.inflatable_grpc_utils import (
|
32
|
+
pull_object_from_servicer,
|
33
|
+
push_object_to_servicer,
|
34
|
+
)
|
31
35
|
from flwr.common.logger import log, warn_deprecated_feature
|
36
|
+
from flwr.common.message import get_message_to_descendant_id_mapping
|
32
37
|
from flwr.common.retry_invoker import _make_simple_grpc_retry_invoker, _wrap_stub
|
33
|
-
from flwr.common.serde import
|
38
|
+
from flwr.common.serde import message_to_proto, run_from_proto
|
34
39
|
from flwr.common.typing import Run
|
35
|
-
from flwr.proto.message_pb2 import Message as ProtoMessage # pylint: disable=E0611
|
36
40
|
from flwr.proto.node_pb2 import Node # pylint: disable=E0611
|
37
41
|
from flwr.proto.run_pb2 import GetRunRequest, GetRunResponse # pylint: disable=E0611
|
38
42
|
from flwr.proto.serverappio_pb2 import ( # pylint: disable=E0611
|
@@ -198,6 +202,35 @@ class GrpcGrid(Grid):
|
|
198
202
|
)
|
199
203
|
return [node.node_id for node in res.nodes]
|
200
204
|
|
205
|
+
def _try_push_message(self, run_id: int, message: Message) -> str:
|
206
|
+
"""Push one message and its associated objects."""
|
207
|
+
# Compute mapping of message descendants
|
208
|
+
descendants_mapping = get_message_to_descendant_id_mapping(message)
|
209
|
+
|
210
|
+
# Call GrpcServerAppIoStub method
|
211
|
+
res: PushInsMessagesResponse = self._stub.PushMessages(
|
212
|
+
PushInsMessagesRequest(
|
213
|
+
messages_list=[message_to_proto(message)],
|
214
|
+
run_id=run_id,
|
215
|
+
msg_to_descendant_mapping=descendants_mapping,
|
216
|
+
)
|
217
|
+
)
|
218
|
+
|
219
|
+
# Push objects
|
220
|
+
msg_id = res.message_ids[0]
|
221
|
+
# If Message was added to the LinkState correctly
|
222
|
+
if msg_id is not None:
|
223
|
+
obj_ids_to_push = set(res.objects_to_push[msg_id].object_ids)
|
224
|
+
# Push only object that are not in the store
|
225
|
+
push_object_to_servicer(
|
226
|
+
message,
|
227
|
+
self._stub,
|
228
|
+
node=self.node,
|
229
|
+
run_id=run_id,
|
230
|
+
object_ids_to_push=obj_ids_to_push,
|
231
|
+
)
|
232
|
+
return msg_id
|
233
|
+
|
201
234
|
def push_messages(self, messages: Iterable[Message]) -> Iterable[str]:
|
202
235
|
"""Push messages to specified node IDs.
|
203
236
|
|
@@ -206,58 +239,64 @@ class GrpcGrid(Grid):
|
|
206
239
|
"""
|
207
240
|
# Construct Messages
|
208
241
|
run_id = cast(Run, self._run).run_id
|
209
|
-
|
210
|
-
for msg in messages:
|
211
|
-
# Populate metadata
|
212
|
-
msg.metadata.__dict__["_run_id"] = run_id
|
213
|
-
msg.metadata.__dict__["_src_node_id"] = self.node.node_id
|
214
|
-
msg.metadata.__dict__["_message_id"] = msg.object_id
|
215
|
-
# Check message
|
216
|
-
self._check_message(msg)
|
217
|
-
# Convert to proto
|
218
|
-
msg_proto = message_to_proto(msg)
|
219
|
-
# Add to list
|
220
|
-
message_proto_list.append(msg_proto)
|
221
|
-
|
242
|
+
message_ids: list[str] = []
|
222
243
|
try:
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
"list has `None` for those messages (the order is preserved as "
|
234
|
-
"passed to `push_messages`). This could be due to a malformed "
|
235
|
-
"message.",
|
236
|
-
)
|
237
|
-
return list(res.message_ids)
|
244
|
+
for msg in messages:
|
245
|
+
# Populate metadata
|
246
|
+
msg.metadata.__dict__["_run_id"] = run_id
|
247
|
+
msg.metadata.__dict__["_src_node_id"] = self.node.node_id
|
248
|
+
msg.metadata.__dict__["_message_id"] = msg.object_id
|
249
|
+
# Check message
|
250
|
+
self._check_message(msg)
|
251
|
+
# Try pushing message and its objects
|
252
|
+
message_ids.append(self._try_push_message(run_id, msg))
|
253
|
+
|
238
254
|
except grpc.RpcError as e:
|
239
255
|
if e.code() == grpc.StatusCode.RESOURCE_EXHAUSTED: # pylint: disable=E1101
|
240
256
|
log(ERROR, ERROR_MESSAGE_PUSH_MESSAGES_RESOURCE_EXHAUSTED)
|
241
257
|
return []
|
242
258
|
raise
|
243
259
|
|
260
|
+
if None in message_ids:
|
261
|
+
log(
|
262
|
+
WARNING,
|
263
|
+
"Not all messages could be pushed to the SuperLink. The returned "
|
264
|
+
"list has `None` for those messages (the order is preserved as "
|
265
|
+
"passed to `push_messages`). This could be due to a malformed "
|
266
|
+
"message.",
|
267
|
+
)
|
268
|
+
|
269
|
+
return message_ids
|
270
|
+
|
244
271
|
def pull_messages(self, message_ids: Iterable[str]) -> Iterable[Message]:
|
245
272
|
"""Pull messages based on message IDs.
|
246
273
|
|
247
274
|
This method is used to collect messages from the SuperLink that correspond to a
|
248
275
|
set of given message IDs.
|
249
276
|
"""
|
277
|
+
run_id = cast(Run, self._run).run_id
|
250
278
|
try:
|
251
279
|
# Pull Messages
|
252
280
|
res: PullResMessagesResponse = self._stub.PullMessages(
|
253
281
|
PullResMessagesRequest(
|
254
282
|
message_ids=message_ids,
|
255
|
-
run_id=
|
283
|
+
run_id=run_id,
|
256
284
|
)
|
257
285
|
)
|
258
|
-
#
|
259
|
-
|
260
|
-
|
286
|
+
# Pull Messages from store
|
287
|
+
inflated_msgs: list[Message] = []
|
288
|
+
for msg_proto in res.messages_list:
|
289
|
+
|
290
|
+
message = pull_object_from_servicer(
|
291
|
+
msg_proto.metadata.message_id,
|
292
|
+
self._stub,
|
293
|
+
node=self.node,
|
294
|
+
run_id=run_id,
|
295
|
+
)
|
296
|
+
inflated_msgs.append(cast(Message, message))
|
297
|
+
|
298
|
+
return inflated_msgs
|
299
|
+
|
261
300
|
except grpc.RpcError as e:
|
262
301
|
if e.code() == grpc.StatusCode.RESOURCE_EXHAUSTED: # pylint: disable=E1101
|
263
302
|
log(ERROR, ERROR_MESSAGE_PULL_MESSAGES_RESOURCE_EXHAUSTED)
|
@@ -15,11 +15,12 @@
|
|
15
15
|
"""Fleet API gRPC request-response servicer."""
|
16
16
|
|
17
17
|
|
18
|
-
from logging import DEBUG, INFO
|
18
|
+
from logging import DEBUG, ERROR, INFO
|
19
19
|
|
20
20
|
import grpc
|
21
21
|
from google.protobuf.json_format import MessageToDict
|
22
22
|
|
23
|
+
from flwr.common.constant import Status
|
23
24
|
from flwr.common.inflatable import check_body_len_consistency
|
24
25
|
from flwr.common.logger import log
|
25
26
|
from flwr.common.typing import InvalidRunStatusException
|
@@ -49,8 +50,9 @@ from flwr.proto.run_pb2 import GetRunRequest, GetRunResponse # pylint: disable=
|
|
49
50
|
from flwr.server.superlink.ffs.ffs_factory import FfsFactory
|
50
51
|
from flwr.server.superlink.fleet.message_handler import message_handler
|
51
52
|
from flwr.server.superlink.linkstate import LinkStateFactory
|
52
|
-
from flwr.server.superlink.utils import abort_grpc_context
|
53
|
+
from flwr.server.superlink.utils import abort_grpc_context, check_abort
|
53
54
|
from flwr.supercore.object_store import ObjectStoreFactory
|
55
|
+
from flwr.supercore.object_store.object_store import NoObjectInStoreError
|
54
56
|
|
55
57
|
|
56
58
|
class FleetServicer(fleet_pb2_grpc.FleetServicer):
|
@@ -183,11 +185,39 @@ class FleetServicer(fleet_pb2_grpc.FleetServicer):
|
|
183
185
|
request.object_id,
|
184
186
|
)
|
185
187
|
|
188
|
+
state = self.state_factory.state()
|
189
|
+
|
190
|
+
# Abort if the run is not running
|
191
|
+
abort_msg = check_abort(
|
192
|
+
request.run_id,
|
193
|
+
[Status.PENDING, Status.STARTING, Status.FINISHED],
|
194
|
+
state,
|
195
|
+
)
|
196
|
+
if abort_msg:
|
197
|
+
abort_grpc_context(abort_msg, context)
|
198
|
+
|
199
|
+
if request.node.node_id not in state.get_nodes(run_id=request.run_id):
|
200
|
+
# Cancel insertion in ObjectStore
|
201
|
+
context.abort(grpc.StatusCode.FAILED_PRECONDITION, "Unexpected node ID.")
|
202
|
+
|
186
203
|
if not check_body_len_consistency(request.object_content):
|
187
204
|
# Cancel insertion in ObjectStore
|
188
|
-
context.abort(
|
205
|
+
context.abort(
|
206
|
+
grpc.StatusCode.FAILED_PRECONDITION, "Unexpected object length"
|
207
|
+
)
|
208
|
+
|
209
|
+
# Init store
|
210
|
+
store = self.objectstore_factory.store()
|
211
|
+
|
212
|
+
# Insert in store
|
213
|
+
stored = False
|
214
|
+
try:
|
215
|
+
store.put(request.object_id, request.object_content)
|
216
|
+
stored = True
|
217
|
+
except (NoObjectInStoreError, ValueError) as e:
|
218
|
+
log(ERROR, str(e))
|
189
219
|
|
190
|
-
return PushObjectResponse()
|
220
|
+
return PushObjectResponse(stored=stored)
|
191
221
|
|
192
222
|
def PullObject(
|
193
223
|
self, request: PullObjectRequest, context: grpc.ServicerContext
|
@@ -199,4 +229,31 @@ class FleetServicer(fleet_pb2_grpc.FleetServicer):
|
|
199
229
|
request.object_id,
|
200
230
|
)
|
201
231
|
|
202
|
-
|
232
|
+
state = self.state_factory.state()
|
233
|
+
|
234
|
+
# Abort if the run is not running
|
235
|
+
abort_msg = check_abort(
|
236
|
+
request.run_id,
|
237
|
+
[Status.PENDING, Status.STARTING, Status.FINISHED],
|
238
|
+
state,
|
239
|
+
)
|
240
|
+
if abort_msg:
|
241
|
+
abort_grpc_context(abort_msg, context)
|
242
|
+
|
243
|
+
if request.node.node_id not in state.get_nodes(run_id=request.run_id):
|
244
|
+
# Cancel insertion in ObjectStore
|
245
|
+
context.abort(grpc.StatusCode.FAILED_PRECONDITION, "Unexpected node ID.")
|
246
|
+
|
247
|
+
# Init store
|
248
|
+
store = self.objectstore_factory.store()
|
249
|
+
|
250
|
+
# Fetch from store
|
251
|
+
content = store.get(request.object_id)
|
252
|
+
if content is not None:
|
253
|
+
object_available = content != b""
|
254
|
+
return PullObjectResponse(
|
255
|
+
object_found=True,
|
256
|
+
object_available=object_available,
|
257
|
+
object_content=content,
|
258
|
+
)
|
259
|
+
return PullObjectResponse(object_found=False, object_available=False)
|
@@ -409,11 +409,39 @@ class ServerAppIoServicer(serverappio_pb2_grpc.ServerAppIoServicer):
|
|
409
409
|
"""Push an object to the ObjectStore."""
|
410
410
|
log(DEBUG, "ServerAppIoServicer.PushObject")
|
411
411
|
|
412
|
+
# Init state
|
413
|
+
state: LinkState = self.state_factory.state()
|
414
|
+
|
415
|
+
# Abort if the run is not running
|
416
|
+
abort_if(
|
417
|
+
request.run_id,
|
418
|
+
[Status.PENDING, Status.STARTING, Status.FINISHED],
|
419
|
+
state,
|
420
|
+
context,
|
421
|
+
)
|
422
|
+
|
423
|
+
if request.node.node_id != SUPERLINK_NODE_ID:
|
424
|
+
# Cancel insertion in ObjectStore
|
425
|
+
context.abort(grpc.StatusCode.FAILED_PRECONDITION, "Unexpected node ID.")
|
426
|
+
|
412
427
|
if not check_body_len_consistency(request.object_content):
|
413
428
|
# Cancel insertion in ObjectStore
|
414
|
-
context.abort(
|
429
|
+
context.abort(
|
430
|
+
grpc.StatusCode.FAILED_PRECONDITION, "Unexpected object length."
|
431
|
+
)
|
432
|
+
|
433
|
+
# Init store
|
434
|
+
store = self.objectstore_factory.store()
|
435
|
+
|
436
|
+
# Insert in store
|
437
|
+
stored = False
|
438
|
+
try:
|
439
|
+
store.put(request.object_id, request.object_content)
|
440
|
+
stored = True
|
441
|
+
except (NoObjectInStoreError, ValueError) as e:
|
442
|
+
log(ERROR, str(e))
|
415
443
|
|
416
|
-
return PushObjectResponse()
|
444
|
+
return PushObjectResponse(stored=stored)
|
417
445
|
|
418
446
|
def PullObject(
|
419
447
|
self, request: PullObjectRequest, context: grpc.ServicerContext
|
@@ -421,7 +449,34 @@ class ServerAppIoServicer(serverappio_pb2_grpc.ServerAppIoServicer):
|
|
421
449
|
"""Pull an object from the ObjectStore."""
|
422
450
|
log(DEBUG, "ServerAppIoServicer.PullObject")
|
423
451
|
|
424
|
-
|
452
|
+
# Init state
|
453
|
+
state: LinkState = self.state_factory.state()
|
454
|
+
|
455
|
+
# Abort if the run is not running
|
456
|
+
abort_if(
|
457
|
+
request.run_id,
|
458
|
+
[Status.PENDING, Status.STARTING, Status.FINISHED],
|
459
|
+
state,
|
460
|
+
context,
|
461
|
+
)
|
462
|
+
|
463
|
+
if request.node.node_id != SUPERLINK_NODE_ID:
|
464
|
+
# Cancel insertion in ObjectStore
|
465
|
+
context.abort(grpc.StatusCode.FAILED_PRECONDITION, "Unexpected node ID.")
|
466
|
+
|
467
|
+
# Init store
|
468
|
+
store = self.objectstore_factory.store()
|
469
|
+
|
470
|
+
# Fetch from store
|
471
|
+
content = store.get(request.object_id)
|
472
|
+
if content is not None:
|
473
|
+
object_available = content != b""
|
474
|
+
return PullObjectResponse(
|
475
|
+
object_found=True,
|
476
|
+
object_available=object_available,
|
477
|
+
object_content=content,
|
478
|
+
)
|
479
|
+
return PullObjectResponse(object_found=False, object_available=False)
|
425
480
|
|
426
481
|
|
427
482
|
def _raise_if(validation_error: bool, request_name: str, detail: str) -> None:
|
@@ -42,8 +42,7 @@ from flwr.common.constant import (
|
|
42
42
|
from flwr.common.exit import ExitCode, flwr_exit
|
43
43
|
from flwr.common.exit_handlers import register_exit_handlers
|
44
44
|
from flwr.common.logger import log
|
45
|
-
|
46
|
-
from ..start_client_internal import start_client_internal
|
45
|
+
from flwr.supernode.start_client_internal import start_client_internal
|
47
46
|
|
48
47
|
|
49
48
|
def flower_supernode() -> None:
|