flwr-nightly 1.19.0.dev20250607__tar.gz → 1.19.0.dev20250610__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.dev20250607 → flwr_nightly-1.19.0.dev20250610}/PKG-INFO +1 -1
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/client/grpc_rere_client/connection.py +3 -1
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/inflatable.py +0 -12
- flwr_nightly-1.19.0.dev20250610/py/flwr/common/inflatable_grpc_utils.py +99 -0
- flwr_nightly-1.19.0.dev20250607/py/flwr/common/inflatable_grpc_utils.py → flwr_nightly-1.19.0.dev20250610/py/flwr/common/inflatable_utils.py +61 -82
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/grid/grpc_grid.py +3 -1
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +25 -63
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/fleet/message_handler/message_handler.py +57 -1
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/serverappio/serverappio_servicer.py +7 -7
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/supercore/object_store/in_memory_object_store.py +5 -1
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/supernode/start_client_internal.py +101 -59
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/pyproject.toml +1 -1
- flwr_nightly-1.19.0.dev20250607/py/flwr/common/inflatable_utils.py +0 -75
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/README.md +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/app/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/app/error.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/app/metadata.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/app.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/auth_plugin/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/auth_plugin/oidc_cli_plugin.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/build.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/cli_user_auth_interceptor.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/config_utils.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/constant.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/example.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/install.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/log.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/login/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/login/login.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/ls.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/new.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/.gitignore.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/LICENSE.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/README.baseline.md.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/README.flowertune.md.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/README.md.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/__init__.baseline.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/client.baseline.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/client.huggingface.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/client.jax.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/client.mlx.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/client.numpy.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/dataset.baseline.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/flwr_tune/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/flwr_tune/client_app.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/flwr_tune/dataset.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/flwr_tune/models.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/flwr_tune/server_app.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/flwr_tune/strategy.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/model.baseline.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/server.baseline.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/server.huggingface.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/server.jax.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/server.mlx.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/server.sklearn.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/strategy.baseline.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/task.huggingface.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/task.jax.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/task.mlx.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/task.numpy.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/task.sklearn.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/task.tensorflow.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/utils.baseline.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/pyproject.baseline.toml.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/pyproject.jax.toml.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/run/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/run/run.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/stop.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/utils.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/client/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/client/client.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/client/client_app.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/client/clientapp/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/client/clientapp/utils.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/client/dpfedavg_numpy_client.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/client/grpc_adapter_client/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/client/grpc_adapter_client/connection.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/client/grpc_rere_client/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/client/grpc_rere_client/client_interceptor.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/client/grpc_rere_client/grpc_adapter.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/client/message_handler/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/client/message_handler/message_handler.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/client/mod/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/client/mod/centraldp_mods.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/client/mod/comms_mods.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/client/mod/localdp_mod.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/client/mod/utils.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/client/numpy_client.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/client/rest_client/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/client/rest_client/connection.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/client/run_info_store.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/client/typing.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/clientapp/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/address.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/args.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/auth_plugin/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/auth_plugin/auth_plugin.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/config.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/constant.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/context.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/date.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/differential_privacy.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/differential_privacy_constants.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/dp.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/event_log_plugin/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/event_log_plugin/event_log_plugin.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/exit/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/exit/exit.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/exit/exit_code.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/exit_handlers.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/grpc.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/heartbeat.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/logger.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/message.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/object_ref.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/parameter.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/pyproject.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/record/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/record/array.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/record/arrayrecord.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/record/configrecord.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/record/conversion_utils.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/record/metricrecord.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/record/recorddict.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/record/typeddict.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/recorddict_compat.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/retry_invoker.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/secure_aggregation/quantization.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/serde.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/serde_utils.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/telemetry.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/typing.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/version.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/compat/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/compat/client/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/compat/client/app.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/compat/client/grpc_client/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/compat/client/grpc_client/connection.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/compat/common/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/compat/server/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/compat/server/app.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/compat/simulation/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/clientappio_pb2.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/clientappio_pb2.pyi +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/clientappio_pb2_grpc.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/clientappio_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/error_pb2.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/error_pb2.pyi +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/error_pb2_grpc.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/error_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/exec_pb2.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/exec_pb2.pyi +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/exec_pb2_grpc.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/exec_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/fab_pb2.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/fab_pb2.pyi +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/fab_pb2_grpc.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/fab_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/fleet_pb2.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/fleet_pb2.pyi +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/fleet_pb2_grpc.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/grpcadapter_pb2.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/grpcadapter_pb2.pyi +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/grpcadapter_pb2_grpc.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/grpcadapter_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/heartbeat_pb2.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/heartbeat_pb2.pyi +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/heartbeat_pb2_grpc.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/heartbeat_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/log_pb2.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/log_pb2.pyi +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/log_pb2_grpc.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/log_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/message_pb2.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/message_pb2.pyi +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/message_pb2_grpc.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/message_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/node_pb2.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/node_pb2.pyi +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/node_pb2_grpc.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/node_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/recorddict_pb2.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/recorddict_pb2.pyi +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/recorddict_pb2_grpc.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/recorddict_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/run_pb2.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/run_pb2.pyi +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/run_pb2_grpc.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/run_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/serverappio_pb2.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/serverappio_pb2.pyi +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/serverappio_pb2_grpc.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/serverappio_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/simulationio_pb2.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/simulationio_pb2.pyi +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/simulationio_pb2_grpc.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/simulationio_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/transport_pb2.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/transport_pb2.pyi +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/transport_pb2_grpc.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/py.typed +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/app.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/client_manager.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/client_proxy.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/compat/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/compat/app.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/compat/app_utils.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/compat/grid_client_proxy.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/compat/legacy_context.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/criterion.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/fleet_event_log_interceptor.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/grid/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/grid/grid.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/grid/inmemory_grid.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/history.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/run_serverapp.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/server.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/server_app.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/server_config.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/serverapp/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/serverapp/app.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/serverapp_components.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/strategy/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/strategy/aggregate.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/strategy/bulyan.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/strategy/fedadagrad.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/strategy/fedadam.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/strategy/fedavg.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/strategy/fedavg_android.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/strategy/fedavgm.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/strategy/fedmedian.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/strategy/fedopt.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/strategy/fedprox.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/strategy/fedyogi.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/strategy/krum.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/strategy/qfedavg.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/strategy/strategy.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/ffs/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/ffs/disk_ffs.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/ffs/ffs.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/ffs/ffs_factory.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/fleet/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/fleet/grpc_adapter/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/fleet/vce/vce_api.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/linkstate/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/linkstate/in_memory_linkstate.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/linkstate/linkstate.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/linkstate/linkstate_factory.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/linkstate/sqlite_linkstate.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/linkstate/utils.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/serverappio/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/serverappio/serverappio_grpc.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/simulation/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/simulation/simulationio_grpc.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/simulation/simulationio_servicer.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/utils.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/typing.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/utils/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/utils/tensorboard.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/utils/validator.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/workflow/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/workflow/constant.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/workflow/default_workflows.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/serverapp/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/simulation/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/simulation/app.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/simulation/legacy_app.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/simulation/ray_transport/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/simulation/ray_transport/utils.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/simulation/run_simulation.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/simulation/simulationio_connection.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/supercore/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/supercore/object_store/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/supercore/object_store/object_store.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/supercore/object_store/object_store_factory.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/superexec/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/superexec/app.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/superexec/deployment.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/superexec/exec_event_log_interceptor.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/superexec/exec_grpc.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/superexec/exec_servicer.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/superexec/exec_user_auth_interceptor.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/superexec/executor.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/superexec/simulation.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/superlink/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/supernode/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/supernode/cli/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/supernode/cli/flower_supernode.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/supernode/cli/flwr_clientapp.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/supernode/nodestate/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/supernode/nodestate/in_memory_nodestate.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/supernode/nodestate/nodestate.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/supernode/nodestate/nodestate_factory.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/supernode/runtime/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/supernode/runtime/run_clientapp.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/supernode/servicer/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/supernode/servicer/clientappio/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/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.dev20250610
|
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
|
@@ -32,9 +32,11 @@ from flwr.common.grpc import create_channel, on_channel_state_change
|
|
32
32
|
from flwr.common.heartbeat import HeartbeatSender
|
33
33
|
from flwr.common.inflatable import get_all_nested_objects
|
34
34
|
from flwr.common.inflatable_grpc_utils import (
|
35
|
-
inflate_object_from_contents,
|
36
35
|
make_pull_object_fn_grpc,
|
37
36
|
make_push_object_fn_grpc,
|
37
|
+
)
|
38
|
+
from flwr.common.inflatable_utils import (
|
39
|
+
inflate_object_from_contents,
|
38
40
|
pull_objects,
|
39
41
|
push_objects,
|
40
42
|
)
|
{flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/inflatable.py
RENAMED
@@ -18,11 +18,9 @@
|
|
18
18
|
from __future__ import annotations
|
19
19
|
|
20
20
|
import hashlib
|
21
|
-
from logging import ERROR
|
22
21
|
from typing import TypeVar, cast
|
23
22
|
|
24
23
|
from .constant import HEAD_BODY_DIVIDER, HEAD_VALUE_DIVIDER
|
25
|
-
from .logger import log
|
26
24
|
|
27
25
|
|
28
26
|
class UnexpectedObjectContentError(Exception):
|
@@ -175,16 +173,6 @@ def get_object_body_len_from_object_content(object_content: bytes) -> int:
|
|
175
173
|
return get_object_head_values_from_object_content(object_content)[2]
|
176
174
|
|
177
175
|
|
178
|
-
def check_body_len_consistency(object_content: bytes) -> bool:
|
179
|
-
"""Check that the object body is of length as specified in the head."""
|
180
|
-
try:
|
181
|
-
body_len = get_object_body_len_from_object_content(object_content)
|
182
|
-
return body_len == len(_get_object_body(object_content))
|
183
|
-
except ValueError:
|
184
|
-
log(ERROR, "Object content does match the expected format.")
|
185
|
-
return False
|
186
|
-
|
187
|
-
|
188
176
|
def get_object_head_values_from_object_content(
|
189
177
|
object_content: bytes,
|
190
178
|
) -> tuple[str, list[str], int]:
|
@@ -0,0 +1,99 @@
|
|
1
|
+
# Copyright 2025 Flower Labs GmbH. All Rights Reserved.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
# ==============================================================================
|
15
|
+
"""InflatableObject utils."""
|
16
|
+
|
17
|
+
|
18
|
+
from typing import Callable
|
19
|
+
|
20
|
+
from flwr.proto.message_pb2 import ( # pylint: disable=E0611
|
21
|
+
PullObjectRequest,
|
22
|
+
PullObjectResponse,
|
23
|
+
PushObjectRequest,
|
24
|
+
PushObjectResponse,
|
25
|
+
)
|
26
|
+
from flwr.proto.node_pb2 import Node # pylint: disable=E0611
|
27
|
+
|
28
|
+
from .inflatable_utils import ObjectIdNotPreregisteredError, ObjectUnavailableError
|
29
|
+
|
30
|
+
|
31
|
+
def make_pull_object_fn_grpc(
|
32
|
+
pull_object_grpc: Callable[[PullObjectRequest], PullObjectResponse],
|
33
|
+
node: Node,
|
34
|
+
run_id: int,
|
35
|
+
) -> Callable[[str], bytes]:
|
36
|
+
"""Create a pull object function that uses gRPC to pull objects.
|
37
|
+
|
38
|
+
Parameters
|
39
|
+
----------
|
40
|
+
pull_object_grpc : Callable[[PullObjectRequest], PullObjectResponse]
|
41
|
+
The gRPC function to pull objects, e.g., `FleetStub.PullObject`.
|
42
|
+
node : Node
|
43
|
+
The node making the request.
|
44
|
+
run_id : int
|
45
|
+
The run ID for the current operation.
|
46
|
+
|
47
|
+
Returns
|
48
|
+
-------
|
49
|
+
Callable[[str], bytes]
|
50
|
+
A function that takes an object ID and returns the object content as bytes.
|
51
|
+
The function raises `ObjectIdNotPreregisteredError` if the object ID is not
|
52
|
+
pre-registered, or `ObjectUnavailableError` if the object is not yet available.
|
53
|
+
"""
|
54
|
+
|
55
|
+
def pull_object_fn(object_id: str) -> bytes:
|
56
|
+
request = PullObjectRequest(node=node, run_id=run_id, object_id=object_id)
|
57
|
+
response: PullObjectResponse = pull_object_grpc(request)
|
58
|
+
if not response.object_found:
|
59
|
+
raise ObjectIdNotPreregisteredError(object_id)
|
60
|
+
if not response.object_available:
|
61
|
+
raise ObjectUnavailableError(object_id)
|
62
|
+
return response.object_content
|
63
|
+
|
64
|
+
return pull_object_fn
|
65
|
+
|
66
|
+
|
67
|
+
def make_push_object_fn_grpc(
|
68
|
+
push_object_grpc: Callable[[PushObjectRequest], PushObjectResponse],
|
69
|
+
node: Node,
|
70
|
+
run_id: int,
|
71
|
+
) -> Callable[[str, bytes], None]:
|
72
|
+
"""Create a push object function that uses gRPC to push objects.
|
73
|
+
|
74
|
+
Parameters
|
75
|
+
----------
|
76
|
+
push_object_grpc : Callable[[PushObjectRequest], PushObjectResponse]
|
77
|
+
The gRPC function to push objects, e.g., `FleetStub.PushObject`.
|
78
|
+
node : Node
|
79
|
+
The node making the request.
|
80
|
+
run_id : int
|
81
|
+
The run ID for the current operation.
|
82
|
+
|
83
|
+
Returns
|
84
|
+
-------
|
85
|
+
Callable[[str, bytes], None]
|
86
|
+
A function that takes an object ID and its content as bytes, and pushes it
|
87
|
+
to the servicer. The function raises `ObjectIdNotPreregisteredError` if
|
88
|
+
the object ID is not pre-registered.
|
89
|
+
"""
|
90
|
+
|
91
|
+
def push_object_fn(object_id: str, object_content: bytes) -> None:
|
92
|
+
request = PushObjectRequest(
|
93
|
+
node=node, run_id=run_id, object_id=object_id, object_content=object_content
|
94
|
+
)
|
95
|
+
response: PushObjectResponse = push_object_grpc(request)
|
96
|
+
if not response.stored:
|
97
|
+
raise ObjectIdNotPreregisteredError(object_id)
|
98
|
+
|
99
|
+
return push_object_fn
|
@@ -12,8 +12,7 @@
|
|
12
12
|
# See the License for the specific language governing permissions and
|
13
13
|
# limitations under the License.
|
14
14
|
# ==============================================================================
|
15
|
-
"""InflatableObject
|
16
|
-
|
15
|
+
"""InflatableObject utilities."""
|
17
16
|
|
18
17
|
import concurrent.futures
|
19
18
|
import random
|
@@ -21,15 +20,9 @@ import threading
|
|
21
20
|
import time
|
22
21
|
from typing import Callable, Optional
|
23
22
|
|
24
|
-
from flwr.proto.message_pb2 import ( # pylint: disable=E0611
|
25
|
-
PullObjectRequest,
|
26
|
-
PullObjectResponse,
|
27
|
-
PushObjectRequest,
|
28
|
-
PushObjectResponse,
|
29
|
-
)
|
30
|
-
from flwr.proto.node_pb2 import Node # pylint: disable=E0611
|
31
|
-
|
32
23
|
from .constant import (
|
24
|
+
HEAD_BODY_DIVIDER,
|
25
|
+
HEAD_VALUE_DIVIDER,
|
33
26
|
MAX_CONCURRENT_PULLS,
|
34
27
|
MAX_CONCURRENT_PUSHES,
|
35
28
|
PULL_BACKOFF_CAP,
|
@@ -37,7 +30,14 @@ from .constant import (
|
|
37
30
|
PULL_MAX_TIME,
|
38
31
|
PULL_MAX_TRIES_PER_OBJECT,
|
39
32
|
)
|
40
|
-
from .inflatable import
|
33
|
+
from .inflatable import (
|
34
|
+
InflatableObject,
|
35
|
+
UnexpectedObjectContentError,
|
36
|
+
_get_object_head,
|
37
|
+
get_object_head_values_from_object_content,
|
38
|
+
get_object_id,
|
39
|
+
is_valid_sha256_hash,
|
40
|
+
)
|
41
41
|
from .message import Message
|
42
42
|
from .record import Array, ArrayRecord, ConfigRecord, MetricRecord, RecordDict
|
43
43
|
|
@@ -67,77 +67,6 @@ class ObjectIdNotPreregisteredError(Exception):
|
|
67
67
|
super().__init__(f"Object with ID '{object_id}' could not be found.")
|
68
68
|
|
69
69
|
|
70
|
-
def make_pull_object_fn_grpc(
|
71
|
-
pull_object_grpc: Callable[[PullObjectRequest], PullObjectResponse],
|
72
|
-
node: Node,
|
73
|
-
run_id: int,
|
74
|
-
) -> Callable[[str], bytes]:
|
75
|
-
"""Create a pull object function that uses gRPC to pull objects.
|
76
|
-
|
77
|
-
Parameters
|
78
|
-
----------
|
79
|
-
pull_object_grpc : Callable[[PullObjectRequest], PullObjectResponse]
|
80
|
-
The gRPC function to pull objects, e.g., `FleetStub.PullObject`.
|
81
|
-
node : Node
|
82
|
-
The node making the request.
|
83
|
-
run_id : int
|
84
|
-
The run ID for the current operation.
|
85
|
-
|
86
|
-
Returns
|
87
|
-
-------
|
88
|
-
Callable[[str], bytes]
|
89
|
-
A function that takes an object ID and returns the object content as bytes.
|
90
|
-
The function raises `ObjectIdNotPreregisteredError` if the object ID is not
|
91
|
-
pre-registered, or `ObjectUnavailableError` if the object is not yet available.
|
92
|
-
"""
|
93
|
-
|
94
|
-
def pull_object_fn(object_id: str) -> bytes:
|
95
|
-
request = PullObjectRequest(node=node, run_id=run_id, object_id=object_id)
|
96
|
-
response: PullObjectResponse = pull_object_grpc(request)
|
97
|
-
if not response.object_found:
|
98
|
-
raise ObjectIdNotPreregisteredError(object_id)
|
99
|
-
if not response.object_available:
|
100
|
-
raise ObjectUnavailableError(object_id)
|
101
|
-
return response.object_content
|
102
|
-
|
103
|
-
return pull_object_fn
|
104
|
-
|
105
|
-
|
106
|
-
def make_push_object_fn_grpc(
|
107
|
-
push_object_grpc: Callable[[PushObjectRequest], PushObjectResponse],
|
108
|
-
node: Node,
|
109
|
-
run_id: int,
|
110
|
-
) -> Callable[[str, bytes], None]:
|
111
|
-
"""Create a push object function that uses gRPC to push objects.
|
112
|
-
|
113
|
-
Parameters
|
114
|
-
----------
|
115
|
-
push_object_grpc : Callable[[PushObjectRequest], PushObjectResponse]
|
116
|
-
The gRPC function to push objects, e.g., `FleetStub.PushObject`.
|
117
|
-
node : Node
|
118
|
-
The node making the request.
|
119
|
-
run_id : int
|
120
|
-
The run ID for the current operation.
|
121
|
-
|
122
|
-
Returns
|
123
|
-
-------
|
124
|
-
Callable[[str, bytes], None]
|
125
|
-
A function that takes an object ID and its content as bytes, and pushes it
|
126
|
-
to the servicer. The function raises `ObjectIdNotPreregisteredError` if
|
127
|
-
the object ID is not pre-registered.
|
128
|
-
"""
|
129
|
-
|
130
|
-
def push_object_fn(object_id: str, object_content: bytes) -> None:
|
131
|
-
request = PushObjectRequest(
|
132
|
-
node=node, run_id=run_id, object_id=object_id, object_content=object_content
|
133
|
-
)
|
134
|
-
response: PushObjectResponse = push_object_grpc(request)
|
135
|
-
if not response.stored:
|
136
|
-
raise ObjectIdNotPreregisteredError(object_id)
|
137
|
-
|
138
|
-
return push_object_fn
|
139
|
-
|
140
|
-
|
141
70
|
def push_objects(
|
142
71
|
objects: dict[str, InflatableObject],
|
143
72
|
push_object_fn: Callable[[str, bytes], None],
|
@@ -360,3 +289,53 @@ def inflate_object_from_contents(
|
|
360
289
|
del object_content # Free memory after inflation
|
361
290
|
objects[object_id] = obj
|
362
291
|
return obj
|
292
|
+
|
293
|
+
|
294
|
+
def validate_object_content(content: bytes) -> None:
|
295
|
+
"""Validate the deflated content of an InflatableObject."""
|
296
|
+
try:
|
297
|
+
# Check if there is a head-body divider
|
298
|
+
index = content.find(HEAD_BODY_DIVIDER)
|
299
|
+
if index == -1:
|
300
|
+
raise ValueError(
|
301
|
+
"Unexpected format for object content. Head and body "
|
302
|
+
"could not be split."
|
303
|
+
)
|
304
|
+
|
305
|
+
head = _get_object_head(content)
|
306
|
+
|
307
|
+
# check if the head has three parts:
|
308
|
+
# <object_type> <children_ids> <object_body_len>
|
309
|
+
head_decoded = head.decode(encoding="utf-8")
|
310
|
+
head_parts = head_decoded.split(HEAD_VALUE_DIVIDER)
|
311
|
+
|
312
|
+
if len(head_parts) != 3:
|
313
|
+
raise ValueError("Unexpected format for object head.")
|
314
|
+
|
315
|
+
obj_type, children_str, body_len = head_parts
|
316
|
+
|
317
|
+
# Check that children IDs are valid IDs
|
318
|
+
children = children_str.split(",")
|
319
|
+
for children_id in children:
|
320
|
+
if children_id and not is_valid_sha256_hash(children_id):
|
321
|
+
raise ValueError(
|
322
|
+
f"Detected invalid object ID ({children_id}) in children."
|
323
|
+
)
|
324
|
+
|
325
|
+
# Check that object type is recognized
|
326
|
+
if obj_type not in inflatable_class_registry:
|
327
|
+
if obj_type != "CustomDataClass": # to allow for the class in tests
|
328
|
+
raise ValueError(f"Object of type {obj_type} is not supported.")
|
329
|
+
|
330
|
+
# Check if the body length in the head matches that of the body
|
331
|
+
actual_body_len = len(content) - len(head) - len(HEAD_BODY_DIVIDER)
|
332
|
+
if actual_body_len != int(body_len):
|
333
|
+
raise ValueError(
|
334
|
+
f"Object content length expected {body_len} bytes but got "
|
335
|
+
f"{actual_body_len} bytes."
|
336
|
+
)
|
337
|
+
|
338
|
+
except ValueError as err:
|
339
|
+
raise UnexpectedObjectContentError(
|
340
|
+
object_id=get_object_id(content), reason=str(err)
|
341
|
+
) from err
|
{flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/grid/grpc_grid.py
RENAMED
@@ -30,9 +30,11 @@ from flwr.common.constant import (
|
|
30
30
|
from flwr.common.grpc import create_channel, on_channel_state_change
|
31
31
|
from flwr.common.inflatable import get_all_nested_objects
|
32
32
|
from flwr.common.inflatable_grpc_utils import (
|
33
|
-
inflate_object_from_contents,
|
34
33
|
make_pull_object_fn_grpc,
|
35
34
|
make_push_object_fn_grpc,
|
35
|
+
)
|
36
|
+
from flwr.common.inflatable_utils import (
|
37
|
+
inflate_object_from_contents,
|
36
38
|
pull_objects,
|
37
39
|
push_objects,
|
38
40
|
)
|
@@ -15,13 +15,12 @@
|
|
15
15
|
"""Fleet API gRPC request-response servicer."""
|
16
16
|
|
17
17
|
|
18
|
-
from logging import DEBUG,
|
18
|
+
from logging import DEBUG, INFO
|
19
19
|
|
20
20
|
import grpc
|
21
21
|
from google.protobuf.json_format import MessageToDict
|
22
22
|
|
23
|
-
from flwr.common.
|
24
|
-
from flwr.common.inflatable import check_body_len_consistency
|
23
|
+
from flwr.common.inflatable import UnexpectedObjectContentError
|
25
24
|
from flwr.common.logger import log
|
26
25
|
from flwr.common.typing import InvalidRunStatusException
|
27
26
|
from flwr.proto import fleet_pb2_grpc # pylint: disable=E0611
|
@@ -50,9 +49,8 @@ from flwr.proto.run_pb2 import GetRunRequest, GetRunResponse # pylint: disable=
|
|
50
49
|
from flwr.server.superlink.ffs.ffs_factory import FfsFactory
|
51
50
|
from flwr.server.superlink.fleet.message_handler import message_handler
|
52
51
|
from flwr.server.superlink.linkstate import LinkStateFactory
|
53
|
-
from flwr.server.superlink.utils import abort_grpc_context
|
52
|
+
from flwr.server.superlink.utils import abort_grpc_context
|
54
53
|
from flwr.supercore.object_store import ObjectStoreFactory
|
55
|
-
from flwr.supercore.object_store.object_store import NoObjectInStoreError
|
56
54
|
|
57
55
|
|
58
56
|
class FleetServicer(fleet_pb2_grpc.FleetServicer):
|
@@ -185,39 +183,20 @@ class FleetServicer(fleet_pb2_grpc.FleetServicer):
|
|
185
183
|
request.object_id,
|
186
184
|
)
|
187
185
|
|
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
|
-
|
203
|
-
if not check_body_len_consistency(request.object_content):
|
204
|
-
# Cancel insertion in ObjectStore
|
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
186
|
try:
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
187
|
+
# Insert in Store
|
188
|
+
res = message_handler.push_object(
|
189
|
+
request=request,
|
190
|
+
state=self.state_factory.state(),
|
191
|
+
store=self.objectstore_factory.store(),
|
192
|
+
)
|
193
|
+
except InvalidRunStatusException as e:
|
194
|
+
abort_grpc_context(e.message, context)
|
195
|
+
except UnexpectedObjectContentError as e:
|
196
|
+
# Object content is not valid
|
197
|
+
context.abort(grpc.StatusCode.FAILED_PRECONDITION, str(e))
|
219
198
|
|
220
|
-
return
|
199
|
+
return res
|
221
200
|
|
222
201
|
def PullObject(
|
223
202
|
self, request: PullObjectRequest, context: grpc.ServicerContext
|
@@ -229,31 +208,14 @@ class FleetServicer(fleet_pb2_grpc.FleetServicer):
|
|
229
208
|
request.object_id,
|
230
209
|
)
|
231
210
|
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
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,
|
211
|
+
try:
|
212
|
+
# Fetch from store
|
213
|
+
res = message_handler.pull_object(
|
214
|
+
request=request,
|
215
|
+
state=self.state_factory.state(),
|
216
|
+
store=self.objectstore_factory.store(),
|
258
217
|
)
|
259
|
-
|
218
|
+
except InvalidRunStatusException as e:
|
219
|
+
abort_grpc_context(e.message, context)
|
220
|
+
|
221
|
+
return res
|
@@ -19,6 +19,7 @@ from typing import Optional
|
|
19
19
|
|
20
20
|
from flwr.common import Message, log
|
21
21
|
from flwr.common.constant import Status
|
22
|
+
from flwr.common.inflatable import UnexpectedObjectContentError
|
22
23
|
from flwr.common.serde import (
|
23
24
|
fab_to_proto,
|
24
25
|
message_from_proto,
|
@@ -42,7 +43,13 @@ from flwr.proto.heartbeat_pb2 import ( # pylint: disable=E0611
|
|
42
43
|
SendNodeHeartbeatRequest,
|
43
44
|
SendNodeHeartbeatResponse,
|
44
45
|
)
|
45
|
-
from flwr.proto.message_pb2 import
|
46
|
+
from flwr.proto.message_pb2 import ( # pylint: disable=E0611
|
47
|
+
ObjectIDs,
|
48
|
+
PullObjectRequest,
|
49
|
+
PullObjectResponse,
|
50
|
+
PushObjectRequest,
|
51
|
+
PushObjectResponse,
|
52
|
+
)
|
46
53
|
from flwr.proto.node_pb2 import Node # pylint: disable=E0611
|
47
54
|
from flwr.proto.run_pb2 import ( # pylint: disable=E0611
|
48
55
|
GetRunRequest,
|
@@ -203,3 +210,52 @@ def get_fab(
|
|
203
210
|
return GetFabResponse(fab=fab_to_proto(fab))
|
204
211
|
|
205
212
|
raise ValueError(f"Found no FAB with hash: {request.hash_str}")
|
213
|
+
|
214
|
+
|
215
|
+
def push_object(
|
216
|
+
request: PushObjectRequest, state: LinkState, store: ObjectStore
|
217
|
+
) -> PushObjectResponse:
|
218
|
+
"""Push Object."""
|
219
|
+
abort_msg = check_abort(
|
220
|
+
request.run_id,
|
221
|
+
[Status.PENDING, Status.STARTING, Status.FINISHED],
|
222
|
+
state,
|
223
|
+
)
|
224
|
+
if abort_msg:
|
225
|
+
raise InvalidRunStatusException(abort_msg)
|
226
|
+
|
227
|
+
stored = False
|
228
|
+
try:
|
229
|
+
store.put(request.object_id, request.object_content)
|
230
|
+
stored = True
|
231
|
+
except (NoObjectInStoreError, ValueError) as e:
|
232
|
+
log(ERROR, str(e))
|
233
|
+
except UnexpectedObjectContentError as e:
|
234
|
+
# Object content is not valid
|
235
|
+
log(ERROR, str(e))
|
236
|
+
raise
|
237
|
+
return PushObjectResponse(stored=stored)
|
238
|
+
|
239
|
+
|
240
|
+
def pull_object(
|
241
|
+
request: PullObjectRequest, state: LinkState, store: ObjectStore
|
242
|
+
) -> PullObjectResponse:
|
243
|
+
"""Pull Object."""
|
244
|
+
abort_msg = check_abort(
|
245
|
+
request.run_id,
|
246
|
+
[Status.PENDING, Status.STARTING, Status.FINISHED],
|
247
|
+
state,
|
248
|
+
)
|
249
|
+
if abort_msg:
|
250
|
+
raise InvalidRunStatusException(abort_msg)
|
251
|
+
|
252
|
+
# Fetch from store
|
253
|
+
content = store.get(request.object_id)
|
254
|
+
if content is not None:
|
255
|
+
object_available = content != b""
|
256
|
+
return PullObjectResponse(
|
257
|
+
object_found=True,
|
258
|
+
object_available=object_available,
|
259
|
+
object_content=content,
|
260
|
+
)
|
261
|
+
return PullObjectResponse(object_found=False, object_available=False)
|
@@ -23,7 +23,10 @@ import grpc
|
|
23
23
|
|
24
24
|
from flwr.common import Message
|
25
25
|
from flwr.common.constant import SUPERLINK_NODE_ID, Status
|
26
|
-
from flwr.common.inflatable import
|
26
|
+
from flwr.common.inflatable import (
|
27
|
+
UnexpectedObjectContentError,
|
28
|
+
get_descendant_object_ids,
|
29
|
+
)
|
27
30
|
from flwr.common.logger import log
|
28
31
|
from flwr.common.serde import (
|
29
32
|
context_from_proto,
|
@@ -424,12 +427,6 @@ class ServerAppIoServicer(serverappio_pb2_grpc.ServerAppIoServicer):
|
|
424
427
|
# Cancel insertion in ObjectStore
|
425
428
|
context.abort(grpc.StatusCode.FAILED_PRECONDITION, "Unexpected node ID.")
|
426
429
|
|
427
|
-
if not check_body_len_consistency(request.object_content):
|
428
|
-
# Cancel insertion in ObjectStore
|
429
|
-
context.abort(
|
430
|
-
grpc.StatusCode.FAILED_PRECONDITION, "Unexpected object length."
|
431
|
-
)
|
432
|
-
|
433
430
|
# Init store
|
434
431
|
store = self.objectstore_factory.store()
|
435
432
|
|
@@ -440,6 +437,9 @@ class ServerAppIoServicer(serverappio_pb2_grpc.ServerAppIoServicer):
|
|
440
437
|
stored = True
|
441
438
|
except (NoObjectInStoreError, ValueError) as e:
|
442
439
|
log(ERROR, str(e))
|
440
|
+
except UnexpectedObjectContentError as e:
|
441
|
+
# Object content is not valid
|
442
|
+
context.abort(grpc.StatusCode.FAILED_PRECONDITION, str(e))
|
443
443
|
|
444
444
|
return PushObjectResponse(stored=stored)
|
445
445
|
|
@@ -18,6 +18,7 @@
|
|
18
18
|
from typing import Optional
|
19
19
|
|
20
20
|
from flwr.common.inflatable import get_object_id, is_valid_sha256_hash
|
21
|
+
from flwr.common.inflatable_utils import validate_object_content
|
21
22
|
|
22
23
|
from .object_store import NoObjectInStoreError, ObjectStore
|
23
24
|
|
@@ -52,12 +53,15 @@ class InMemoryObjectStore(ObjectStore):
|
|
52
53
|
f"Object with ID '{object_id}' was not pre-registered."
|
53
54
|
)
|
54
55
|
|
55
|
-
# Verify object_id and object_content match
|
56
56
|
if self.verify:
|
57
|
+
# Verify object_id and object_content match
|
57
58
|
object_id_from_content = get_object_id(object_content)
|
58
59
|
if object_id != object_id_from_content:
|
59
60
|
raise ValueError(f"Object ID {object_id} does not match content hash")
|
60
61
|
|
62
|
+
# Validate object content
|
63
|
+
validate_object_content(content=object_content)
|
64
|
+
|
61
65
|
# Return if object is already present in the store
|
62
66
|
if self.store[object_id] != b"":
|
63
67
|
return
|