flwr-nightly 1.20.0.dev20250718__tar.gz → 1.20.0.dev20250721__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.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/PKG-INFO +1 -1
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/build.py +1 -1
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/client/grpc_adapter_client/connection.py +11 -4
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/client/grpc_rere_client/connection.py +91 -93
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/client/rest_client/connection.py +128 -139
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/inflatable_utils.py +50 -12
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/superlink/fleet/message_handler/message_handler.py +1 -2
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/superlink/serverappio/serverappio_servicer.py +1 -2
- flwr_nightly-1.20.0.dev20250721/py/flwr/supercore/object_store/utils.py +48 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/supernode/runtime/run_clientapp.py +66 -12
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/supernode/servicer/clientappio/clientappio_servicer.py +16 -4
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/supernode/start_client_internal.py +84 -21
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/pyproject.toml +1 -1
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/README.md +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/app/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/app/error.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/app/metadata.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/app.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/auth_plugin/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/auth_plugin/oidc_cli_plugin.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/cli_user_auth_interceptor.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/config_utils.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/constant.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/example.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/install.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/log.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/login/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/login/login.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/ls.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/new.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/.gitignore.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/LICENSE.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/README.baseline.md.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/README.flowertune.md.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/README.md.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/code/__init__.baseline.py.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/code/client.baseline.py.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/code/client.huggingface.py.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/code/client.jax.py.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/code/client.mlx.py.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/code/client.numpy.py.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/code/dataset.baseline.py.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/code/flwr_tune/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/code/flwr_tune/client_app.py.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/code/flwr_tune/dataset.py.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/code/flwr_tune/models.py.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/code/flwr_tune/server_app.py.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/code/flwr_tune/strategy.py.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/code/model.baseline.py.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/code/server.baseline.py.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/code/server.huggingface.py.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/code/server.jax.py.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/code/server.mlx.py.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/code/server.sklearn.py.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/code/strategy.baseline.py.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/code/task.huggingface.py.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/code/task.jax.py.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/code/task.mlx.py.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/code/task.numpy.py.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/code/task.sklearn.py.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/code/task.tensorflow.py.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/code/utils.baseline.py.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/pyproject.baseline.toml.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/pyproject.jax.toml.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/run/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/run/run.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/stop.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/cli/utils.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/client/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/client/client.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/client/client_app.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/client/clientapp/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/client/clientapp/utils.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/client/dpfedavg_numpy_client.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/client/grpc_adapter_client/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/client/grpc_rere_client/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/client/grpc_rere_client/client_interceptor.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/client/grpc_rere_client/grpc_adapter.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/client/message_handler/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/client/message_handler/message_handler.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/client/mod/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/client/mod/centraldp_mods.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/client/mod/comms_mods.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/client/mod/localdp_mod.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/client/mod/utils.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/client/numpy_client.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/client/rest_client/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/client/run_info_store.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/client/typing.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/clientapp/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/address.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/args.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/auth_plugin/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/auth_plugin/auth_plugin.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/config.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/constant.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/context.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/date.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/differential_privacy.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/differential_privacy_constants.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/dp.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/event_log_plugin/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/event_log_plugin/event_log_plugin.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/exit/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/exit/exit.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/exit/exit_code.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/exit_handlers.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/grpc.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/heartbeat.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/inflatable.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/inflatable_protobuf_utils.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/logger.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/message.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/object_ref.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/parameter.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/pyproject.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/record/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/record/array.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/record/arraychunk.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/record/arrayrecord.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/record/configrecord.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/record/conversion_utils.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/record/metricrecord.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/record/recorddict.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/record/typeddict.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/recorddict_compat.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/retry_invoker.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/secure_aggregation/quantization.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/serde.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/serde_utils.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/telemetry.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/typing.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/common/version.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/compat/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/compat/client/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/compat/client/app.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/compat/client/grpc_client/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/compat/client/grpc_client/connection.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/compat/common/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/compat/server/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/compat/server/app.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/compat/simulation/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/appio_pb2.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/appio_pb2.pyi +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/appio_pb2_grpc.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/appio_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/clientappio_pb2.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/clientappio_pb2.pyi +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/clientappio_pb2_grpc.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/clientappio_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/error_pb2.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/error_pb2.pyi +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/error_pb2_grpc.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/error_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/exec_pb2.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/exec_pb2.pyi +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/exec_pb2_grpc.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/exec_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/fab_pb2.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/fab_pb2.pyi +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/fab_pb2_grpc.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/fab_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/fleet_pb2.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/fleet_pb2.pyi +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/fleet_pb2_grpc.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/grpcadapter_pb2.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/grpcadapter_pb2.pyi +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/grpcadapter_pb2_grpc.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/grpcadapter_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/heartbeat_pb2.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/heartbeat_pb2.pyi +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/heartbeat_pb2_grpc.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/heartbeat_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/log_pb2.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/log_pb2.pyi +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/log_pb2_grpc.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/log_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/message_pb2.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/message_pb2.pyi +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/message_pb2_grpc.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/message_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/node_pb2.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/node_pb2.pyi +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/node_pb2_grpc.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/node_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/recorddict_pb2.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/recorddict_pb2.pyi +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/recorddict_pb2_grpc.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/recorddict_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/run_pb2.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/run_pb2.pyi +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/run_pb2_grpc.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/run_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/serverappio_pb2.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/serverappio_pb2.pyi +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/serverappio_pb2_grpc.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/serverappio_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/simulationio_pb2.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/simulationio_pb2.pyi +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/simulationio_pb2_grpc.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/simulationio_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/transport_pb2.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/transport_pb2.pyi +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/transport_pb2_grpc.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/py.typed +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/app.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/client_manager.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/client_proxy.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/compat/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/compat/app.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/compat/app_utils.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/compat/grid_client_proxy.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/compat/legacy_context.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/criterion.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/fleet_event_log_interceptor.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/grid/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/grid/grid.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/grid/grpc_grid.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/grid/inmemory_grid.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/history.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/run_serverapp.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/server.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/server_app.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/server_config.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/serverapp/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/serverapp/app.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/serverapp_components.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/strategy/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/strategy/aggregate.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/strategy/bulyan.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/strategy/fedadagrad.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/strategy/fedadam.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/strategy/fedavg.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/strategy/fedavg_android.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/strategy/fedavgm.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/strategy/fedmedian.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/strategy/fedopt.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/strategy/fedprox.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/strategy/fedyogi.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/strategy/krum.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/strategy/qfedavg.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/strategy/strategy.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/superlink/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/superlink/fleet/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/superlink/fleet/grpc_adapter/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/superlink/fleet/vce/vce_api.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/superlink/linkstate/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/superlink/linkstate/in_memory_linkstate.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/superlink/linkstate/linkstate.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/superlink/linkstate/linkstate_factory.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/superlink/linkstate/sqlite_linkstate.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/superlink/linkstate/utils.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/superlink/serverappio/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/superlink/serverappio/serverappio_grpc.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/superlink/simulation/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/superlink/simulation/simulationio_grpc.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/superlink/simulation/simulationio_servicer.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/superlink/utils.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/typing.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/utils/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/utils/tensorboard.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/utils/validator.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/workflow/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/workflow/constant.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/workflow/default_workflows.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/serverapp/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/simulation/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/simulation/app.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/simulation/legacy_app.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/simulation/ray_transport/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/simulation/ray_transport/utils.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/simulation/run_simulation.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/simulation/simulationio_connection.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/supercore/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/supercore/ffs/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/supercore/ffs/disk_ffs.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/supercore/ffs/ffs.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/supercore/ffs/ffs_factory.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/supercore/grpc_health/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/supercore/grpc_health/simple_health_servicer.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/supercore/license_plugin/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/supercore/license_plugin/license_plugin.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/supercore/object_store/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/supercore/object_store/in_memory_object_store.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/supercore/object_store/object_store.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/supercore/object_store/object_store_factory.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/supercore/utils.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/superexec/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/superexec/app.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/superexec/deployment.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/superexec/exec_event_log_interceptor.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/superexec/exec_grpc.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/superexec/exec_license_interceptor.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/superexec/exec_servicer.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/superexec/exec_user_auth_interceptor.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/superexec/executor.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/superexec/simulation.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/superlink/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/supernode/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/supernode/cli/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/supernode/cli/flower_supernode.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/supernode/cli/flwr_clientapp.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/supernode/nodestate/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/supernode/nodestate/in_memory_nodestate.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/supernode/nodestate/nodestate.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/supernode/nodestate/nodestate_factory.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/supernode/runtime/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/supernode/servicer/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250718 → flwr_nightly-1.20.0.dev20250721}/py/flwr/supernode/servicer/clientappio/__init__.py +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.3
|
2
2
|
Name: flwr-nightly
|
3
|
-
Version: 1.20.0.
|
3
|
+
Version: 1.20.0.dev20250721
|
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
|
@@ -184,7 +184,7 @@ def build_fab(app: Path) -> tuple[bytes, str, dict[str, Any]]:
|
|
184
184
|
# Read the file content manually
|
185
185
|
file_contents = file_path.read_bytes()
|
186
186
|
|
187
|
-
archive_path = str(file_path.relative_to(app))
|
187
|
+
archive_path = str(file_path.relative_to(app)).replace("\\", "/")
|
188
188
|
write_to_zip(fab_file, archive_path, file_contents)
|
189
189
|
|
190
190
|
# Calculate file info
|
@@ -29,6 +29,7 @@ from flwr.common.logger import log
|
|
29
29
|
from flwr.common.message import Message
|
30
30
|
from flwr.common.retry_invoker import RetryInvoker
|
31
31
|
from flwr.common.typing import Fab, Run
|
32
|
+
from flwr.proto.message_pb2 import ObjectTree # pylint: disable=E0611
|
32
33
|
|
33
34
|
|
34
35
|
@contextmanager
|
@@ -43,12 +44,15 @@ def grpc_adapter( # pylint: disable=R0913,too-many-positional-arguments
|
|
43
44
|
] = None,
|
44
45
|
) -> Iterator[
|
45
46
|
tuple[
|
46
|
-
Callable[[], Optional[Message]],
|
47
|
-
Callable[[Message],
|
47
|
+
Callable[[], Optional[tuple[Message, ObjectTree]]],
|
48
|
+
Callable[[Message, ObjectTree], set[str]],
|
48
49
|
Callable[[], Optional[int]],
|
49
50
|
Callable[[], None],
|
50
51
|
Callable[[int], Run],
|
51
52
|
Callable[[str, int], Fab],
|
53
|
+
Callable[[int, str], bytes],
|
54
|
+
Callable[[int, str, bytes], None],
|
55
|
+
Callable[[int, str], None],
|
52
56
|
]
|
53
57
|
]:
|
54
58
|
"""Primitives for request/response-based interaction with a server via GrpcAdapter.
|
@@ -77,12 +81,15 @@ def grpc_adapter( # pylint: disable=R0913,too-many-positional-arguments
|
|
77
81
|
|
78
82
|
Returns
|
79
83
|
-------
|
80
|
-
receive : Callable
|
81
|
-
send : Callable
|
84
|
+
receive : Callable[[], Optional[tuple[Message, ObjectTree]]]
|
85
|
+
send : Callable[[Message, ObjectTree], set[str]]
|
82
86
|
create_node : Optional[Callable]
|
83
87
|
delete_node : Optional[Callable]
|
84
88
|
get_run : Optional[Callable]
|
85
89
|
get_fab : Optional[Callable]
|
90
|
+
pull_object : Callable[[str], bytes]
|
91
|
+
push_object : Callable[[str, bytes], None]
|
92
|
+
confirm_message_received : Callable[[str], None]
|
86
93
|
"""
|
87
94
|
if authentication_keys is not None:
|
88
95
|
log(ERROR, "Client authentication is not supported for this transport type.")
|
@@ -17,7 +17,7 @@
|
|
17
17
|
|
18
18
|
from collections.abc import Iterator, Sequence
|
19
19
|
from contextlib import contextmanager
|
20
|
-
from logging import
|
20
|
+
from logging import ERROR
|
21
21
|
from pathlib import Path
|
22
22
|
from typing import Callable, Optional, Union, cast
|
23
23
|
|
@@ -28,28 +28,18 @@ from flwr.common import GRPC_MAX_MESSAGE_LENGTH
|
|
28
28
|
from flwr.common.constant import HEARTBEAT_CALL_TIMEOUT, HEARTBEAT_DEFAULT_INTERVAL
|
29
29
|
from flwr.common.grpc import create_channel, on_channel_state_change
|
30
30
|
from flwr.common.heartbeat import HeartbeatSender
|
31
|
-
from flwr.common.inflatable import (
|
32
|
-
get_all_nested_objects,
|
33
|
-
get_object_tree,
|
34
|
-
iterate_object_tree,
|
35
|
-
no_object_id_recompute,
|
36
|
-
)
|
37
31
|
from flwr.common.inflatable_protobuf_utils import (
|
32
|
+
make_confirm_message_received_fn_protobuf,
|
38
33
|
make_pull_object_fn_protobuf,
|
39
34
|
make_push_object_fn_protobuf,
|
40
35
|
)
|
41
|
-
from flwr.common.inflatable_utils import (
|
42
|
-
inflate_object_from_contents,
|
43
|
-
pull_objects,
|
44
|
-
push_objects,
|
45
|
-
)
|
46
36
|
from flwr.common.logger import log
|
47
37
|
from flwr.common.message import Message, remove_content_from_message
|
48
38
|
from flwr.common.retry_invoker import RetryInvoker, _wrap_stub
|
49
39
|
from flwr.common.secure_aggregation.crypto.symmetric_encryption import (
|
50
40
|
generate_key_pairs,
|
51
41
|
)
|
52
|
-
from flwr.common.serde import message_to_proto, run_from_proto
|
42
|
+
from flwr.common.serde import message_from_proto, message_to_proto, run_from_proto
|
53
43
|
from flwr.common.typing import Fab, Run, RunNotRunningException
|
54
44
|
from flwr.proto.fab_pb2 import GetFabRequest, GetFabResponse # pylint: disable=E0611
|
55
45
|
from flwr.proto.fleet_pb2 import ( # pylint: disable=E0611
|
@@ -65,9 +55,7 @@ from flwr.proto.heartbeat_pb2 import ( # pylint: disable=E0611
|
|
65
55
|
SendNodeHeartbeatRequest,
|
66
56
|
SendNodeHeartbeatResponse,
|
67
57
|
)
|
68
|
-
from flwr.proto.message_pb2 import
|
69
|
-
ConfirmMessageReceivedRequest,
|
70
|
-
)
|
58
|
+
from flwr.proto.message_pb2 import ObjectTree # pylint: disable=E0611
|
71
59
|
from flwr.proto.node_pb2 import Node # pylint: disable=E0611
|
72
60
|
from flwr.proto.run_pb2 import GetRunRequest, GetRunResponse # pylint: disable=E0611
|
73
61
|
|
@@ -88,12 +76,15 @@ def grpc_request_response( # pylint: disable=R0913,R0914,R0915,R0917
|
|
88
76
|
adapter_cls: Optional[Union[type[FleetStub], type[GrpcAdapter]]] = None,
|
89
77
|
) -> Iterator[
|
90
78
|
tuple[
|
91
|
-
Callable[[], Optional[Message]],
|
92
|
-
Callable[[Message],
|
79
|
+
Callable[[], Optional[tuple[Message, ObjectTree]]],
|
80
|
+
Callable[[Message, ObjectTree], set[str]],
|
93
81
|
Callable[[], Optional[int]],
|
94
82
|
Callable[[], None],
|
95
83
|
Callable[[int], Run],
|
96
84
|
Callable[[str, int], Fab],
|
85
|
+
Callable[[int, str], bytes],
|
86
|
+
Callable[[int, str, bytes], None],
|
87
|
+
Callable[[int, str], None],
|
97
88
|
]
|
98
89
|
]:
|
99
90
|
"""Primitives for request/response-based interaction with a server.
|
@@ -136,6 +127,9 @@ def grpc_request_response( # pylint: disable=R0913,R0914,R0915,R0917
|
|
136
127
|
create_node : Optional[Callable]
|
137
128
|
delete_node : Optional[Callable]
|
138
129
|
get_run : Optional[Callable]
|
130
|
+
pull_object : Callable[[str], bytes]
|
131
|
+
push_object : Callable[[str, bytes], None]
|
132
|
+
confirm_message_received : Callable[[str], None]
|
139
133
|
"""
|
140
134
|
if isinstance(root_certificates, str):
|
141
135
|
root_certificates = Path(root_certificates).read_bytes()
|
@@ -246,98 +240,53 @@ def grpc_request_response( # pylint: disable=R0913,R0914,R0915,R0917
|
|
246
240
|
# Cleanup
|
247
241
|
node = None
|
248
242
|
|
249
|
-
def receive() -> Optional[Message]:
|
250
|
-
"""
|
243
|
+
def receive() -> Optional[tuple[Message, ObjectTree]]:
|
244
|
+
"""Pull a message with its ObjectTree from SuperLink."""
|
251
245
|
# Get Node
|
252
246
|
if node is None:
|
253
247
|
log(ERROR, "Node instance missing")
|
254
248
|
return None
|
255
249
|
|
256
|
-
#
|
250
|
+
# Try to pull a message with its object tree from SuperLink
|
257
251
|
request = PullMessagesRequest(node=node)
|
258
252
|
response: PullMessagesResponse = stub.PullMessages(request=request)
|
259
253
|
|
260
|
-
#
|
261
|
-
|
262
|
-
None
|
263
|
-
)
|
254
|
+
# If no messages are available, return None
|
255
|
+
if len(response.messages_list) == 0:
|
256
|
+
return None
|
264
257
|
|
265
|
-
#
|
266
|
-
|
267
|
-
|
268
|
-
):
|
269
|
-
message_proto = None
|
258
|
+
# Get the current Message and its object tree
|
259
|
+
message_proto = response.messages_list[0]
|
260
|
+
object_tree = response.message_object_trees[0]
|
270
261
|
|
271
262
|
# Construct the Message
|
272
|
-
in_message
|
273
|
-
|
274
|
-
if message_proto:
|
275
|
-
msg_id = message_proto.metadata.message_id
|
276
|
-
run_id = message_proto.metadata.run_id
|
277
|
-
object_tree = response.message_object_trees[0]
|
278
|
-
all_object_contents = pull_objects(
|
279
|
-
[tree.object_id for tree in iterate_object_tree(object_tree)],
|
280
|
-
pull_object_fn=make_pull_object_fn_protobuf(
|
281
|
-
pull_object_protobuf=stub.PullObject,
|
282
|
-
node=node,
|
283
|
-
run_id=run_id,
|
284
|
-
),
|
285
|
-
)
|
286
|
-
|
287
|
-
# Confirm that the message has been received
|
288
|
-
stub.ConfirmMessageReceived(
|
289
|
-
ConfirmMessageReceivedRequest(
|
290
|
-
node=node, run_id=run_id, message_object_id=msg_id
|
291
|
-
)
|
292
|
-
)
|
293
|
-
|
294
|
-
in_message = cast(
|
295
|
-
Message, inflate_object_from_contents(msg_id, all_object_contents)
|
296
|
-
)
|
297
|
-
# The deflated message doesn't contain the message_id (its own object_id)
|
298
|
-
# Inject
|
299
|
-
in_message.metadata.__dict__["_message_id"] = msg_id
|
263
|
+
in_message = message_from_proto(message_proto)
|
300
264
|
|
301
|
-
# Return the
|
302
|
-
return in_message
|
265
|
+
# Return the Message and its object tree
|
266
|
+
return in_message, object_tree
|
303
267
|
|
304
|
-
def send(message: Message) ->
|
305
|
-
"""Send message
|
268
|
+
def send(message: Message, object_tree: ObjectTree) -> set[str]:
|
269
|
+
"""Send the message with its ObjectTree to SuperLink."""
|
306
270
|
# Get Node
|
307
271
|
if node is None:
|
308
272
|
log(ERROR, "Node instance missing")
|
309
|
-
return
|
273
|
+
return set()
|
310
274
|
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
object_tree = get_object_tree(message)
|
275
|
+
# Remove the content from the message if it has
|
276
|
+
if message.has_content():
|
277
|
+
message = remove_content_from_message(message)
|
315
278
|
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
)
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
if response.objects_to_push:
|
328
|
-
objs_to_push = set(
|
329
|
-
response.objects_to_push[message.object_id].object_ids
|
330
|
-
)
|
331
|
-
push_objects(
|
332
|
-
all_objects,
|
333
|
-
push_object_fn=make_push_object_fn_protobuf(
|
334
|
-
push_object_protobuf=stub.PushObject,
|
335
|
-
node=node,
|
336
|
-
run_id=message.metadata.run_id,
|
337
|
-
),
|
338
|
-
object_ids_to_push=objs_to_push,
|
339
|
-
)
|
340
|
-
log(DEBUG, "Pushed %s objects to servicer.", len(objs_to_push))
|
279
|
+
# Send the message with its ObjectTree to SuperLink
|
280
|
+
request = PushMessagesRequest(
|
281
|
+
node=node,
|
282
|
+
messages_list=[message_to_proto(message)],
|
283
|
+
message_object_trees=[object_tree],
|
284
|
+
)
|
285
|
+
response: PushMessagesResponse = stub.PushMessages(request=request)
|
286
|
+
|
287
|
+
# Get and return the object IDs to push
|
288
|
+
object_ids_to_push = response.objects_to_push[object_tree.object_id]
|
289
|
+
return set(object_ids_to_push.object_ids)
|
341
290
|
|
342
291
|
def get_run(run_id: int) -> Run:
|
343
292
|
# Call FleetAPI
|
@@ -354,9 +303,58 @@ def grpc_request_response( # pylint: disable=R0913,R0914,R0915,R0917
|
|
354
303
|
|
355
304
|
return Fab(get_fab_response.fab.hash_str, get_fab_response.fab.content)
|
356
305
|
|
306
|
+
def pull_object(run_id: int, object_id: str) -> bytes:
|
307
|
+
"""Pull the object from the SuperLink."""
|
308
|
+
# Check Node
|
309
|
+
if node is None:
|
310
|
+
raise RuntimeError("Node instance missing")
|
311
|
+
|
312
|
+
fn = make_pull_object_fn_protobuf(
|
313
|
+
pull_object_protobuf=stub.PullObject,
|
314
|
+
node=node,
|
315
|
+
run_id=run_id,
|
316
|
+
)
|
317
|
+
return fn(object_id)
|
318
|
+
|
319
|
+
def push_object(run_id: int, object_id: str, contents: bytes) -> None:
|
320
|
+
"""Push the object to the SuperLink."""
|
321
|
+
# Check Node
|
322
|
+
if node is None:
|
323
|
+
raise RuntimeError("Node instance missing")
|
324
|
+
|
325
|
+
fn = make_push_object_fn_protobuf(
|
326
|
+
push_object_protobuf=stub.PushObject,
|
327
|
+
node=node,
|
328
|
+
run_id=run_id,
|
329
|
+
)
|
330
|
+
fn(object_id, contents)
|
331
|
+
|
332
|
+
def confirm_message_received(run_id: int, object_id: str) -> None:
|
333
|
+
"""Confirm that the message has been received."""
|
334
|
+
# Check Node
|
335
|
+
if node is None:
|
336
|
+
raise RuntimeError("Node instance missing")
|
337
|
+
|
338
|
+
fn = make_confirm_message_received_fn_protobuf(
|
339
|
+
confirm_message_received_protobuf=stub.ConfirmMessageReceived,
|
340
|
+
node=node,
|
341
|
+
run_id=run_id,
|
342
|
+
)
|
343
|
+
fn(object_id)
|
344
|
+
|
357
345
|
try:
|
358
346
|
# Yield methods
|
359
|
-
yield (
|
347
|
+
yield (
|
348
|
+
receive,
|
349
|
+
send,
|
350
|
+
create_node,
|
351
|
+
delete_node,
|
352
|
+
get_run,
|
353
|
+
get_fab,
|
354
|
+
pull_object,
|
355
|
+
push_object,
|
356
|
+
confirm_message_received,
|
357
|
+
)
|
360
358
|
except Exception as exc: # pylint: disable=broad-except
|
361
359
|
log(ERROR, exc)
|
362
360
|
# Cleanup
|
@@ -17,8 +17,8 @@
|
|
17
17
|
|
18
18
|
from collections.abc import Iterator
|
19
19
|
from contextlib import contextmanager
|
20
|
-
from logging import
|
21
|
-
from typing import Callable, Optional, TypeVar, Union
|
20
|
+
from logging import ERROR, WARN
|
21
|
+
from typing import Callable, Optional, TypeVar, Union
|
22
22
|
|
23
23
|
from cryptography.hazmat.primitives.asymmetric import ec
|
24
24
|
from google.protobuf.message import Message as GrpcMessage
|
@@ -28,25 +28,15 @@ from flwr.common import GRPC_MAX_MESSAGE_LENGTH
|
|
28
28
|
from flwr.common.constant import HEARTBEAT_DEFAULT_INTERVAL
|
29
29
|
from flwr.common.exit import ExitCode, flwr_exit
|
30
30
|
from flwr.common.heartbeat import HeartbeatSender
|
31
|
-
from flwr.common.inflatable import (
|
32
|
-
get_all_nested_objects,
|
33
|
-
get_object_tree,
|
34
|
-
iterate_object_tree,
|
35
|
-
no_object_id_recompute,
|
36
|
-
)
|
37
31
|
from flwr.common.inflatable_protobuf_utils import (
|
32
|
+
make_confirm_message_received_fn_protobuf,
|
38
33
|
make_pull_object_fn_protobuf,
|
39
34
|
make_push_object_fn_protobuf,
|
40
35
|
)
|
41
|
-
from flwr.common.inflatable_utils import (
|
42
|
-
inflate_object_from_contents,
|
43
|
-
pull_objects,
|
44
|
-
push_objects,
|
45
|
-
)
|
46
36
|
from flwr.common.logger import log
|
47
37
|
from flwr.common.message import Message, remove_content_from_message
|
48
38
|
from flwr.common.retry_invoker import RetryInvoker
|
49
|
-
from flwr.common.serde import message_to_proto, run_from_proto
|
39
|
+
from flwr.common.serde import message_from_proto, message_to_proto, run_from_proto
|
50
40
|
from flwr.common.typing import Fab, Run
|
51
41
|
from flwr.proto.fab_pb2 import GetFabRequest, GetFabResponse # pylint: disable=E0611
|
52
42
|
from flwr.proto.fleet_pb2 import ( # pylint: disable=E0611
|
@@ -66,6 +56,7 @@ from flwr.proto.heartbeat_pb2 import ( # pylint: disable=E0611
|
|
66
56
|
from flwr.proto.message_pb2 import ( # pylint: disable=E0611
|
67
57
|
ConfirmMessageReceivedRequest,
|
68
58
|
ConfirmMessageReceivedResponse,
|
59
|
+
ObjectTree,
|
69
60
|
PullObjectRequest,
|
70
61
|
PullObjectResponse,
|
71
62
|
PushObjectRequest,
|
@@ -108,12 +99,15 @@ def http_request_response( # pylint: disable=R0913,R0914,R0915,R0917
|
|
108
99
|
] = None,
|
109
100
|
) -> Iterator[
|
110
101
|
tuple[
|
111
|
-
Callable[[], Optional[Message]],
|
112
|
-
Callable[[Message],
|
102
|
+
Callable[[], Optional[tuple[Message, ObjectTree]]],
|
103
|
+
Callable[[Message, ObjectTree], set[str]],
|
113
104
|
Callable[[], Optional[int]],
|
114
105
|
Callable[[], None],
|
115
106
|
Callable[[int], Run],
|
116
107
|
Callable[[str, int], Fab],
|
108
|
+
Callable[[int, str], bytes],
|
109
|
+
Callable[[int, str, bytes], None],
|
110
|
+
Callable[[int, str], None],
|
117
111
|
]
|
118
112
|
]:
|
119
113
|
"""Primitives for request/response-based interaction with a server.
|
@@ -149,6 +143,9 @@ def http_request_response( # pylint: disable=R0913,R0914,R0915,R0917
|
|
149
143
|
create_node : Optional[Callable]
|
150
144
|
delete_node : Optional[Callable]
|
151
145
|
get_run : Optional[Callable]
|
146
|
+
pull_object : Callable[[str], bytes]
|
147
|
+
push_object : Callable[[str, bytes], None]
|
148
|
+
confirm_message_received : Callable[[str], None]
|
152
149
|
"""
|
153
150
|
log(
|
154
151
|
WARN,
|
@@ -230,6 +227,38 @@ def http_request_response( # pylint: disable=R0913,R0914,R0915,R0917
|
|
230
227
|
grpc_res.ParseFromString(res.content)
|
231
228
|
return grpc_res
|
232
229
|
|
230
|
+
def _pull_object_protobuf(request: PullObjectRequest) -> PullObjectResponse:
|
231
|
+
res = _request(
|
232
|
+
req=request,
|
233
|
+
res_type=PullObjectResponse,
|
234
|
+
api_path=PATH_PULL_OBJECT,
|
235
|
+
)
|
236
|
+
if res is None:
|
237
|
+
raise ValueError(f"{PullObjectResponse.__name__} is None.")
|
238
|
+
return res
|
239
|
+
|
240
|
+
def _push_object_protobuf(request: PushObjectRequest) -> PushObjectResponse:
|
241
|
+
res = _request(
|
242
|
+
req=request,
|
243
|
+
res_type=PushObjectResponse,
|
244
|
+
api_path=PATH_PUSH_OBJECT,
|
245
|
+
)
|
246
|
+
if res is None:
|
247
|
+
raise ValueError(f"{PushObjectResponse.__name__} is None.")
|
248
|
+
return res
|
249
|
+
|
250
|
+
def _confirm_message_received_protobuf(
|
251
|
+
request: ConfirmMessageReceivedRequest,
|
252
|
+
) -> ConfirmMessageReceivedResponse:
|
253
|
+
res = _request(
|
254
|
+
req=request,
|
255
|
+
res_type=ConfirmMessageReceivedResponse,
|
256
|
+
api_path=PATH_CONFIRM_MESSAGE_RECEIVED,
|
257
|
+
)
|
258
|
+
if res is None:
|
259
|
+
raise ValueError(f"{ConfirmMessageReceivedResponse.__name__} is None.")
|
260
|
+
return res
|
261
|
+
|
233
262
|
def send_node_heartbeat() -> bool:
|
234
263
|
# Get Node
|
235
264
|
if node is None:
|
@@ -277,8 +306,7 @@ def http_request_response( # pylint: disable=R0913,R0914,R0915,R0917
|
|
277
306
|
"""Set delete_node."""
|
278
307
|
nonlocal node
|
279
308
|
if node is None:
|
280
|
-
|
281
|
-
return
|
309
|
+
raise RuntimeError("Node instance missing")
|
282
310
|
|
283
311
|
# Stop the heartbeat sender
|
284
312
|
heartbeat_sender.stop()
|
@@ -294,143 +322,55 @@ def http_request_response( # pylint: disable=R0913,R0914,R0915,R0917
|
|
294
322
|
# Cleanup
|
295
323
|
node = None
|
296
324
|
|
297
|
-
def receive() -> Optional[Message]:
|
298
|
-
"""
|
325
|
+
def receive() -> Optional[tuple[Message, ObjectTree]]:
|
326
|
+
"""Pull a message with its ObjectTree from SuperLink."""
|
299
327
|
# Get Node
|
300
328
|
if node is None:
|
301
|
-
|
302
|
-
return None
|
329
|
+
raise RuntimeError("Node instance missing")
|
303
330
|
|
304
|
-
#
|
331
|
+
# Try to pull a message with its object tree from SuperLink
|
305
332
|
req = PullMessagesRequest(node=node)
|
306
|
-
|
307
|
-
# Send the request
|
308
333
|
res = _request(req, PullMessagesResponse, PATH_PULL_MESSAGES)
|
309
334
|
if res is None:
|
310
|
-
|
335
|
+
raise ValueError("PushMessagesResponse is None.")
|
311
336
|
|
312
|
-
#
|
313
|
-
|
337
|
+
# If no messages are available, return None
|
338
|
+
if len(res.messages_list) == 0:
|
339
|
+
return None
|
314
340
|
|
315
|
-
#
|
316
|
-
|
317
|
-
|
318
|
-
):
|
319
|
-
message_proto = None
|
341
|
+
# Get the current Message and its object tree
|
342
|
+
message_proto = res.messages_list[0]
|
343
|
+
object_tree = res.message_object_trees[0]
|
320
344
|
|
321
345
|
# Construct the Message
|
322
|
-
in_message
|
323
|
-
|
324
|
-
if message_proto:
|
325
|
-
log(INFO, "[Node] POST /%s: success", PATH_PULL_MESSAGES)
|
326
|
-
msg_id = message_proto.metadata.message_id
|
327
|
-
run_id = message_proto.metadata.run_id
|
328
|
-
|
329
|
-
def fn(request: PullObjectRequest) -> PullObjectResponse:
|
330
|
-
res = _request(
|
331
|
-
req=request, res_type=PullObjectResponse, api_path=PATH_PULL_OBJECT
|
332
|
-
)
|
333
|
-
if res is None:
|
334
|
-
raise ValueError("PushObjectResponse is None.")
|
335
|
-
return res
|
336
|
-
|
337
|
-
try:
|
338
|
-
object_tree = res.message_object_trees[0]
|
339
|
-
all_object_contents = pull_objects(
|
340
|
-
[tree.object_id for tree in iterate_object_tree(object_tree)],
|
341
|
-
pull_object_fn=make_pull_object_fn_protobuf(
|
342
|
-
pull_object_protobuf=fn,
|
343
|
-
node=node,
|
344
|
-
run_id=run_id,
|
345
|
-
),
|
346
|
-
)
|
347
|
-
|
348
|
-
# Confirm that the message has been received
|
349
|
-
_request(
|
350
|
-
req=ConfirmMessageReceivedRequest(
|
351
|
-
node=node, run_id=run_id, message_object_id=msg_id
|
352
|
-
),
|
353
|
-
res_type=ConfirmMessageReceivedResponse,
|
354
|
-
api_path=PATH_CONFIRM_MESSAGE_RECEIVED,
|
355
|
-
)
|
356
|
-
except ValueError as e:
|
357
|
-
log(
|
358
|
-
ERROR,
|
359
|
-
"Pulling objects failed. Potential irrecoverable error: %s",
|
360
|
-
str(e),
|
361
|
-
)
|
362
|
-
in_message = cast(
|
363
|
-
Message, inflate_object_from_contents(msg_id, all_object_contents)
|
364
|
-
)
|
365
|
-
# The deflated message doesn't contain the message_id (its own object_id)
|
366
|
-
# Inject
|
367
|
-
in_message.metadata.__dict__["_message_id"] = msg_id
|
346
|
+
in_message = message_from_proto(message_proto)
|
368
347
|
|
369
|
-
|
348
|
+
# Return the Message and its object tree
|
349
|
+
return in_message, object_tree
|
370
350
|
|
371
|
-
def send(message: Message) ->
|
372
|
-
"""Send
|
351
|
+
def send(message: Message, object_tree: ObjectTree) -> set[str]:
|
352
|
+
"""Send the message with its ObjectTree to SuperLink."""
|
373
353
|
# Get Node
|
374
354
|
if node is None:
|
375
|
-
|
376
|
-
return
|
355
|
+
raise RuntimeError("Node instance missing")
|
377
356
|
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
object_tree = get_object_tree(message)
|
357
|
+
# Remove the content from the message if it has
|
358
|
+
if message.has_content():
|
359
|
+
message = remove_content_from_message(message)
|
382
360
|
|
383
|
-
|
384
|
-
|
385
|
-
|
386
|
-
)
|
387
|
-
|
388
|
-
|
389
|
-
|
390
|
-
|
391
|
-
)
|
361
|
+
# Send the message with its ObjectTree to SuperLink
|
362
|
+
req = PushMessagesRequest(
|
363
|
+
node=node,
|
364
|
+
messages_list=[message_to_proto(message)],
|
365
|
+
message_object_trees=[object_tree],
|
366
|
+
)
|
367
|
+
res = _request(req, PushMessagesResponse, PATH_PUSH_MESSAGES)
|
368
|
+
if res is None:
|
369
|
+
raise ValueError("PushMessagesResponse is None.")
|
392
370
|
|
393
|
-
|
394
|
-
|
395
|
-
|
396
|
-
log(
|
397
|
-
INFO,
|
398
|
-
"[Node] POST /%s: success, created result %s",
|
399
|
-
PATH_PUSH_MESSAGES,
|
400
|
-
res.results, # pylint: disable=no-member
|
401
|
-
)
|
402
|
-
|
403
|
-
if res and res.objects_to_push:
|
404
|
-
objs_to_push = set(res.objects_to_push[message.object_id].object_ids)
|
405
|
-
|
406
|
-
def fn(request: PushObjectRequest) -> PushObjectResponse:
|
407
|
-
res = _request(
|
408
|
-
req=request,
|
409
|
-
res_type=PushObjectResponse,
|
410
|
-
api_path=PATH_PUSH_OBJECT,
|
411
|
-
)
|
412
|
-
if res is None:
|
413
|
-
raise ValueError("PushObjectResponse is None.")
|
414
|
-
return res
|
415
|
-
|
416
|
-
try:
|
417
|
-
push_objects(
|
418
|
-
all_objects,
|
419
|
-
push_object_fn=make_push_object_fn_protobuf(
|
420
|
-
push_object_protobuf=fn,
|
421
|
-
node=node,
|
422
|
-
run_id=message_proto.metadata.run_id,
|
423
|
-
),
|
424
|
-
object_ids_to_push=objs_to_push,
|
425
|
-
)
|
426
|
-
log(DEBUG, "Pushed %s objects to servicer.", len(objs_to_push))
|
427
|
-
except ValueError as e:
|
428
|
-
log(
|
429
|
-
ERROR,
|
430
|
-
"Pushing objects failed. Potential irrecoverable error: %s",
|
431
|
-
str(e),
|
432
|
-
)
|
433
|
-
log(ERROR, str(e))
|
371
|
+
# Get and return the object IDs to push
|
372
|
+
object_ids_to_push = res.objects_to_push[object_tree.object_id]
|
373
|
+
return set(object_ids_to_push.object_ids)
|
434
374
|
|
435
375
|
def get_run(run_id: int) -> Run:
|
436
376
|
# Construct the request
|
@@ -457,9 +397,58 @@ def http_request_response( # pylint: disable=R0913,R0914,R0915,R0917
|
|
457
397
|
res.fab.content,
|
458
398
|
)
|
459
399
|
|
400
|
+
def pull_object(run_id: int, object_id: str) -> bytes:
|
401
|
+
"""Pull the object from the SuperLink."""
|
402
|
+
# Check Node
|
403
|
+
if node is None:
|
404
|
+
raise RuntimeError("Node instance missing")
|
405
|
+
|
406
|
+
fn = make_pull_object_fn_protobuf(
|
407
|
+
pull_object_protobuf=_pull_object_protobuf,
|
408
|
+
node=node,
|
409
|
+
run_id=run_id,
|
410
|
+
)
|
411
|
+
return fn(object_id)
|
412
|
+
|
413
|
+
def push_object(run_id: int, object_id: str, contents: bytes) -> None:
|
414
|
+
"""Push the object to the SuperLink."""
|
415
|
+
# Check Node
|
416
|
+
if node is None:
|
417
|
+
raise RuntimeError("Node instance missing")
|
418
|
+
|
419
|
+
fn = make_push_object_fn_protobuf(
|
420
|
+
push_object_protobuf=_push_object_protobuf,
|
421
|
+
node=node,
|
422
|
+
run_id=run_id,
|
423
|
+
)
|
424
|
+
fn(object_id, contents)
|
425
|
+
|
426
|
+
def confirm_message_received(run_id: int, object_id: str) -> None:
|
427
|
+
"""Confirm that the message has been received."""
|
428
|
+
# Check Node
|
429
|
+
if node is None:
|
430
|
+
raise RuntimeError("Node instance missing")
|
431
|
+
|
432
|
+
fn = make_confirm_message_received_fn_protobuf(
|
433
|
+
confirm_message_received_protobuf=_confirm_message_received_protobuf,
|
434
|
+
node=node,
|
435
|
+
run_id=run_id,
|
436
|
+
)
|
437
|
+
fn(object_id)
|
438
|
+
|
460
439
|
try:
|
461
440
|
# Yield methods
|
462
|
-
yield (
|
441
|
+
yield (
|
442
|
+
receive,
|
443
|
+
send,
|
444
|
+
create_node,
|
445
|
+
delete_node,
|
446
|
+
get_run,
|
447
|
+
get_fab,
|
448
|
+
pull_object,
|
449
|
+
push_object,
|
450
|
+
confirm_message_received,
|
451
|
+
)
|
463
452
|
except Exception as exc: # pylint: disable=broad-except
|
464
453
|
log(ERROR, exc)
|
465
454
|
# Cleanup
|