flwr-nightly 1.19.0.dev20250604__tar.gz → 1.19.0.dev20250606__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.dev20250604 → flwr_nightly-1.19.0.dev20250606}/PKG-INFO +1 -1
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/client/grpc_rere_client/connection.py +18 -8
- flwr_nightly-1.19.0.dev20250606/py/flwr/common/inflatable_grpc_utils.py +227 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/message.py +11 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/compat/app_utils.py +50 -28
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/grid/grpc_grid.py +17 -8
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/pyproject.toml +1 -1
- flwr_nightly-1.19.0.dev20250604/py/flwr/common/inflatable_grpc_utils.py +0 -122
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/README.md +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/app/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/app/error.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/app/metadata.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/app.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/auth_plugin/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/auth_plugin/oidc_cli_plugin.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/build.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/cli_user_auth_interceptor.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/config_utils.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/constant.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/example.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/install.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/log.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/login/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/login/login.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/ls.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/new.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/.gitignore.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/LICENSE.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/README.baseline.md.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/README.flowertune.md.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/README.md.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/code/__init__.baseline.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/code/client.baseline.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/code/client.huggingface.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/code/client.jax.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/code/client.mlx.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/code/client.numpy.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/code/dataset.baseline.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/code/flwr_tune/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/code/flwr_tune/client_app.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/code/flwr_tune/dataset.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/code/flwr_tune/models.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/code/flwr_tune/server_app.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/code/flwr_tune/strategy.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/code/model.baseline.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/code/server.baseline.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/code/server.huggingface.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/code/server.jax.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/code/server.mlx.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/code/server.sklearn.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/code/strategy.baseline.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/code/task.huggingface.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/code/task.jax.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/code/task.mlx.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/code/task.numpy.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/code/task.sklearn.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/code/task.tensorflow.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/code/utils.baseline.py.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/pyproject.baseline.toml.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/pyproject.jax.toml.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/run/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/run/run.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/stop.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/utils.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/client/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/client/client.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/client/client_app.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/client/clientapp/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/client/clientapp/utils.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/client/dpfedavg_numpy_client.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/client/grpc_adapter_client/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/client/grpc_adapter_client/connection.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/client/grpc_rere_client/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/client/grpc_rere_client/client_interceptor.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/client/grpc_rere_client/grpc_adapter.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/client/message_handler/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/client/message_handler/message_handler.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/client/mod/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/client/mod/centraldp_mods.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/client/mod/comms_mods.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/client/mod/localdp_mod.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/client/mod/utils.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/client/numpy_client.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/client/rest_client/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/client/rest_client/connection.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/client/run_info_store.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/client/typing.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/clientapp/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/address.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/args.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/auth_plugin/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/auth_plugin/auth_plugin.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/config.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/constant.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/context.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/date.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/differential_privacy.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/differential_privacy_constants.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/dp.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/event_log_plugin/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/event_log_plugin/event_log_plugin.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/exit/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/exit/exit.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/exit/exit_code.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/exit_handlers.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/grpc.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/heartbeat.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/inflatable.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/logger.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/object_ref.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/parameter.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/pyproject.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/record/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/record/array.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/record/arrayrecord.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/record/configrecord.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/record/conversion_utils.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/record/metricrecord.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/record/recorddict.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/record/typeddict.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/recorddict_compat.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/retry_invoker.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/secure_aggregation/quantization.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/serde.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/serde_utils.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/telemetry.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/typing.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/version.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/compat/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/compat/client/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/compat/client/app.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/compat/client/grpc_client/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/compat/client/grpc_client/connection.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/compat/common/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/compat/server/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/compat/server/app.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/compat/simulation/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/clientappio_pb2.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/clientappio_pb2.pyi +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/clientappio_pb2_grpc.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/clientappio_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/error_pb2.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/error_pb2.pyi +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/error_pb2_grpc.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/error_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/exec_pb2.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/exec_pb2.pyi +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/exec_pb2_grpc.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/exec_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/fab_pb2.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/fab_pb2.pyi +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/fab_pb2_grpc.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/fab_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/fleet_pb2.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/fleet_pb2.pyi +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/fleet_pb2_grpc.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/grpcadapter_pb2.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/grpcadapter_pb2.pyi +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/grpcadapter_pb2_grpc.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/grpcadapter_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/heartbeat_pb2.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/heartbeat_pb2.pyi +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/heartbeat_pb2_grpc.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/heartbeat_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/log_pb2.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/log_pb2.pyi +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/log_pb2_grpc.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/log_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/message_pb2.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/message_pb2.pyi +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/message_pb2_grpc.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/message_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/node_pb2.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/node_pb2.pyi +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/node_pb2_grpc.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/node_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/recorddict_pb2.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/recorddict_pb2.pyi +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/recorddict_pb2_grpc.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/recorddict_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/run_pb2.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/run_pb2.pyi +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/run_pb2_grpc.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/run_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/serverappio_pb2.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/serverappio_pb2.pyi +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/serverappio_pb2_grpc.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/serverappio_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/simulationio_pb2.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/simulationio_pb2.pyi +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/simulationio_pb2_grpc.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/simulationio_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/transport_pb2.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/transport_pb2.pyi +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/transport_pb2_grpc.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/py.typed +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/app.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/client_manager.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/client_proxy.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/compat/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/compat/app.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/compat/grid_client_proxy.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/compat/legacy_context.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/criterion.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/fleet_event_log_interceptor.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/grid/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/grid/grid.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/grid/inmemory_grid.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/history.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/run_serverapp.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/server.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/server_app.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/server_config.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/serverapp/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/serverapp/app.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/serverapp_components.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/strategy/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/strategy/aggregate.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/strategy/bulyan.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/strategy/fedadagrad.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/strategy/fedadam.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/strategy/fedavg.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/strategy/fedavg_android.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/strategy/fedavgm.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/strategy/fedmedian.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/strategy/fedopt.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/strategy/fedprox.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/strategy/fedyogi.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/strategy/krum.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/strategy/qfedavg.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/strategy/strategy.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/superlink/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/superlink/ffs/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/superlink/ffs/disk_ffs.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/superlink/ffs/ffs.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/superlink/ffs/ffs_factory.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/superlink/fleet/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/superlink/fleet/grpc_adapter/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/superlink/fleet/message_handler/message_handler.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/superlink/fleet/vce/vce_api.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/superlink/linkstate/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/superlink/linkstate/in_memory_linkstate.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/superlink/linkstate/linkstate.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/superlink/linkstate/linkstate_factory.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/superlink/linkstate/sqlite_linkstate.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/superlink/linkstate/utils.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/superlink/serverappio/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/superlink/serverappio/serverappio_grpc.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/superlink/serverappio/serverappio_servicer.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/superlink/simulation/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/superlink/simulation/simulationio_grpc.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/superlink/simulation/simulationio_servicer.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/superlink/utils.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/typing.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/utils/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/utils/tensorboard.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/utils/validator.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/workflow/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/workflow/constant.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/workflow/default_workflows.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/serverapp/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/simulation/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/simulation/app.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/simulation/legacy_app.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/simulation/ray_transport/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/simulation/ray_transport/utils.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/simulation/run_simulation.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/simulation/simulationio_connection.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/supercore/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/supercore/object_store/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/supercore/object_store/in_memory_object_store.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/supercore/object_store/object_store.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/supercore/object_store/object_store_factory.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/superexec/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/superexec/app.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/superexec/deployment.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/superexec/exec_event_log_interceptor.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/superexec/exec_grpc.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/superexec/exec_servicer.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/superexec/exec_user_auth_interceptor.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/superexec/executor.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/superexec/simulation.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/superlink/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/supernode/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/supernode/cli/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/supernode/cli/flower_supernode.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/supernode/cli/flwr_clientapp.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/supernode/nodestate/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/supernode/nodestate/in_memory_nodestate.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/supernode/nodestate/nodestate.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/supernode/nodestate/nodestate_factory.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/supernode/runtime/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/supernode/runtime/run_clientapp.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/supernode/servicer/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/supernode/servicer/clientappio/__init__.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/supernode/servicer/clientappio/clientappio_servicer.py +0 -0
- {flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/supernode/start_client_internal.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.dev20250606
|
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
|
@@ -31,11 +31,17 @@ from flwr.common.constant import HEARTBEAT_CALL_TIMEOUT, HEARTBEAT_DEFAULT_INTER
|
|
31
31
|
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_grpc_utils import (
|
34
|
+
make_pull_object_fn_grpc,
|
35
|
+
make_push_object_fn_grpc,
|
34
36
|
pull_object_from_servicer,
|
35
37
|
push_object_to_servicer,
|
36
38
|
)
|
37
39
|
from flwr.common.logger import log
|
38
|
-
from flwr.common.message import
|
40
|
+
from flwr.common.message import (
|
41
|
+
Message,
|
42
|
+
get_message_to_descendant_id_mapping,
|
43
|
+
remove_content_from_message,
|
44
|
+
)
|
39
45
|
from flwr.common.retry_invoker import RetryInvoker, _wrap_stub
|
40
46
|
from flwr.common.secure_aggregation.crypto.symmetric_encryption import (
|
41
47
|
generate_key_pairs,
|
@@ -265,9 +271,11 @@ def grpc_request_response( # pylint: disable=R0913,R0914,R0915,R0917
|
|
265
271
|
Message,
|
266
272
|
pull_object_from_servicer(
|
267
273
|
object_id=message_proto.metadata.message_id,
|
268
|
-
|
269
|
-
|
270
|
-
|
274
|
+
pull_object_fn=make_pull_object_fn_grpc(
|
275
|
+
pull_object_grpc=stub.PullObject,
|
276
|
+
node=node,
|
277
|
+
run_id=message_proto.metadata.run_id,
|
278
|
+
),
|
271
279
|
),
|
272
280
|
)
|
273
281
|
|
@@ -305,7 +313,7 @@ def grpc_request_response( # pylint: disable=R0913,R0914,R0915,R0917
|
|
305
313
|
return
|
306
314
|
|
307
315
|
# Serialize Message
|
308
|
-
message_proto = message_to_proto(message=message)
|
316
|
+
message_proto = message_to_proto(message=remove_content_from_message(message))
|
309
317
|
descendants_mapping = get_message_to_descendant_id_mapping(message)
|
310
318
|
request = PushMessagesRequest(
|
311
319
|
node=node,
|
@@ -318,9 +326,11 @@ def grpc_request_response( # pylint: disable=R0913,R0914,R0915,R0917
|
|
318
326
|
objs_to_push = set(response.objects_to_push[message.object_id].object_ids)
|
319
327
|
push_object_to_servicer(
|
320
328
|
message,
|
321
|
-
|
322
|
-
|
323
|
-
|
329
|
+
push_object_fn=make_push_object_fn_grpc(
|
330
|
+
push_object_grpc=stub.PushObject,
|
331
|
+
node=node,
|
332
|
+
run_id=message.metadata.run_id,
|
333
|
+
),
|
324
334
|
object_ids_to_push=objs_to_push,
|
325
335
|
)
|
326
336
|
log(DEBUG, "Pushed %s objects to servicer.", len(objs_to_push))
|
@@ -0,0 +1,227 @@
|
|
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 time import sleep
|
19
|
+
from typing import Callable, Optional
|
20
|
+
|
21
|
+
from flwr.proto.message_pb2 import ( # pylint: disable=E0611
|
22
|
+
PullObjectRequest,
|
23
|
+
PullObjectResponse,
|
24
|
+
PushObjectRequest,
|
25
|
+
PushObjectResponse,
|
26
|
+
)
|
27
|
+
from flwr.proto.node_pb2 import Node # pylint: disable=E0611
|
28
|
+
|
29
|
+
from .inflatable import (
|
30
|
+
InflatableObject,
|
31
|
+
get_object_head_values_from_object_content,
|
32
|
+
get_object_id,
|
33
|
+
)
|
34
|
+
from .message import Message
|
35
|
+
from .record import Array, ArrayRecord, ConfigRecord, MetricRecord, RecordDict
|
36
|
+
|
37
|
+
# Helper registry that maps names of classes to their type
|
38
|
+
inflatable_class_registry: dict[str, type[InflatableObject]] = {
|
39
|
+
Array.__qualname__: Array,
|
40
|
+
ArrayRecord.__qualname__: ArrayRecord,
|
41
|
+
ConfigRecord.__qualname__: ConfigRecord,
|
42
|
+
Message.__qualname__: Message,
|
43
|
+
MetricRecord.__qualname__: MetricRecord,
|
44
|
+
RecordDict.__qualname__: RecordDict,
|
45
|
+
}
|
46
|
+
|
47
|
+
|
48
|
+
class ObjectUnavailableError(Exception):
|
49
|
+
"""Exception raised when an object has been pre-registered but is not yet
|
50
|
+
available."""
|
51
|
+
|
52
|
+
def __init__(self, object_id: str):
|
53
|
+
super().__init__(f"Object with ID '{object_id}' is not yet available.")
|
54
|
+
|
55
|
+
|
56
|
+
class ObjectIdNotPreregisteredError(Exception):
|
57
|
+
"""Exception raised when an object ID is not pre-registered."""
|
58
|
+
|
59
|
+
def __init__(self, object_id: str):
|
60
|
+
super().__init__(f"Object with ID '{object_id}' could not be found.")
|
61
|
+
|
62
|
+
|
63
|
+
def push_object_to_servicer(
|
64
|
+
obj: InflatableObject,
|
65
|
+
push_object_fn: Callable[[str, bytes], None],
|
66
|
+
object_ids_to_push: Optional[set[str]] = None,
|
67
|
+
) -> set[str]:
|
68
|
+
"""Recursively deflate an object and push it to the servicer.
|
69
|
+
|
70
|
+
Objects with the same ID are not pushed twice. If `object_ids_to_push` is set,
|
71
|
+
only objects with those IDs are pushed. It returns the set of pushed object
|
72
|
+
IDs.
|
73
|
+
|
74
|
+
Parameters
|
75
|
+
----------
|
76
|
+
obj : InflatableObject
|
77
|
+
The object to push.
|
78
|
+
push_object_fn : Callable[[str, bytes], None]
|
79
|
+
A function that takes an object ID and its content as bytes, and pushes
|
80
|
+
it to the servicer. This function should raise `ObjectIdNotPreregisteredError`
|
81
|
+
if the object ID is not pre-registered.
|
82
|
+
object_ids_to_push : Optional[set[str]] (default: None)
|
83
|
+
A set of object IDs to push. If object ID of the given object is not in this
|
84
|
+
set, the object will not be pushed.
|
85
|
+
|
86
|
+
Returns
|
87
|
+
-------
|
88
|
+
set[str]
|
89
|
+
A set of object IDs that were pushed to the servicer.
|
90
|
+
"""
|
91
|
+
pushed_object_ids: set[str] = set()
|
92
|
+
# Push children if it has any
|
93
|
+
if children := obj.children:
|
94
|
+
for child in children.values():
|
95
|
+
pushed_object_ids |= push_object_to_servicer(
|
96
|
+
child, push_object_fn, object_ids_to_push
|
97
|
+
)
|
98
|
+
|
99
|
+
# Deflate object and push
|
100
|
+
object_content = obj.deflate()
|
101
|
+
object_id = get_object_id(object_content)
|
102
|
+
# Push always if no object set is specified, or if the object is in the set
|
103
|
+
if object_ids_to_push is None or object_id in object_ids_to_push:
|
104
|
+
# The function may raise an error if the object ID is not pre-registered
|
105
|
+
push_object_fn(object_id, object_content)
|
106
|
+
pushed_object_ids.add(object_id)
|
107
|
+
|
108
|
+
return pushed_object_ids
|
109
|
+
|
110
|
+
|
111
|
+
def pull_object_from_servicer(
|
112
|
+
object_id: str,
|
113
|
+
pull_object_fn: Callable[[str], bytes],
|
114
|
+
) -> InflatableObject:
|
115
|
+
"""Recursively inflate an object by pulling it from the servicer.
|
116
|
+
|
117
|
+
Parameters
|
118
|
+
----------
|
119
|
+
object_id : str
|
120
|
+
The ID of the object to pull.
|
121
|
+
pull_object_fn : Callable[[str], bytes]
|
122
|
+
A function that takes an object ID and returns the object content as bytes.
|
123
|
+
The function should raise `ObjectUnavailableError` if the object is not yet
|
124
|
+
available, or `ObjectIdNotPreregisteredError` if the object ID is not
|
125
|
+
pre-registered.
|
126
|
+
|
127
|
+
Returns
|
128
|
+
-------
|
129
|
+
InflatableObject
|
130
|
+
The pulled object.
|
131
|
+
"""
|
132
|
+
# Pull object
|
133
|
+
while True:
|
134
|
+
try:
|
135
|
+
# The function may raise an error if the object ID is not pre-registered
|
136
|
+
object_content: bytes = pull_object_fn(object_id)
|
137
|
+
break # Exit loop if object is successfully pulled
|
138
|
+
except ObjectUnavailableError:
|
139
|
+
sleep(0.1) # Retry after a short delay
|
140
|
+
|
141
|
+
# Extract object class and object_ids of children
|
142
|
+
obj_type, children_obj_ids, _ = get_object_head_values_from_object_content(
|
143
|
+
object_content=object_content
|
144
|
+
)
|
145
|
+
# Resolve object class
|
146
|
+
cls_type = inflatable_class_registry[obj_type]
|
147
|
+
|
148
|
+
# Pull all children objects
|
149
|
+
children: dict[str, InflatableObject] = {}
|
150
|
+
for child_object_id in children_obj_ids:
|
151
|
+
children[child_object_id] = pull_object_from_servicer(
|
152
|
+
child_object_id, pull_object_fn
|
153
|
+
)
|
154
|
+
|
155
|
+
# Inflate object passing its children
|
156
|
+
return cls_type.inflate(object_content, children=children)
|
157
|
+
|
158
|
+
|
159
|
+
def make_pull_object_fn_grpc(
|
160
|
+
pull_object_grpc: Callable[[PullObjectRequest], PullObjectResponse],
|
161
|
+
node: Node,
|
162
|
+
run_id: int,
|
163
|
+
) -> Callable[[str], bytes]:
|
164
|
+
"""Create a pull object function that uses gRPC to pull objects.
|
165
|
+
|
166
|
+
Parameters
|
167
|
+
----------
|
168
|
+
pull_object_grpc : Callable[[PullObjectRequest], PullObjectResponse]
|
169
|
+
The gRPC function to pull objects, e.g., `FleetStub.PullObject`.
|
170
|
+
node : Node
|
171
|
+
The node making the request.
|
172
|
+
run_id : int
|
173
|
+
The run ID for the current operation.
|
174
|
+
|
175
|
+
Returns
|
176
|
+
-------
|
177
|
+
Callable[[str], bytes]
|
178
|
+
A function that takes an object ID and returns the object content as bytes.
|
179
|
+
The function raises `ObjectIdNotPreregisteredError` if the object ID is not
|
180
|
+
pre-registered, or `ObjectUnavailableError` if the object is not yet available.
|
181
|
+
"""
|
182
|
+
|
183
|
+
def pull_object_fn(object_id: str) -> bytes:
|
184
|
+
request = PullObjectRequest(node=node, run_id=run_id, object_id=object_id)
|
185
|
+
response: PullObjectResponse = pull_object_grpc(request)
|
186
|
+
if not response.object_found:
|
187
|
+
raise ObjectIdNotPreregisteredError(object_id)
|
188
|
+
if not response.object_available:
|
189
|
+
raise ObjectUnavailableError(object_id)
|
190
|
+
return response.object_content
|
191
|
+
|
192
|
+
return pull_object_fn
|
193
|
+
|
194
|
+
|
195
|
+
def make_push_object_fn_grpc(
|
196
|
+
push_object_grpc: Callable[[PushObjectRequest], PushObjectResponse],
|
197
|
+
node: Node,
|
198
|
+
run_id: int,
|
199
|
+
) -> Callable[[str, bytes], None]:
|
200
|
+
"""Create a push object function that uses gRPC to push objects.
|
201
|
+
|
202
|
+
Parameters
|
203
|
+
----------
|
204
|
+
push_object_grpc : Callable[[PushObjectRequest], PushObjectResponse]
|
205
|
+
The gRPC function to push objects, e.g., `FleetStub.PushObject`.
|
206
|
+
node : Node
|
207
|
+
The node making the request.
|
208
|
+
run_id : int
|
209
|
+
The run ID for the current operation.
|
210
|
+
|
211
|
+
Returns
|
212
|
+
-------
|
213
|
+
Callable[[str, bytes], None]
|
214
|
+
A function that takes an object ID and its content as bytes, and pushes it
|
215
|
+
to the servicer. The function raises `ObjectIdNotPreregisteredError` if
|
216
|
+
the object ID is not pre-registered.
|
217
|
+
"""
|
218
|
+
|
219
|
+
def push_object_fn(object_id: str, object_content: bytes) -> None:
|
220
|
+
request = PushObjectRequest(
|
221
|
+
node=node, run_id=run_id, object_id=object_id, object_content=object_content
|
222
|
+
)
|
223
|
+
response: PushObjectResponse = push_object_grpc(request)
|
224
|
+
if not response.stored:
|
225
|
+
raise ObjectIdNotPreregisteredError(object_id)
|
226
|
+
|
227
|
+
return push_object_fn
|
{flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/common/message.py
RENAMED
@@ -426,6 +426,17 @@ def make_message(
|
|
426
426
|
return Message(metadata=metadata, content=content, error=error) # type: ignore
|
427
427
|
|
428
428
|
|
429
|
+
def remove_content_from_message(message: Message) -> Message:
|
430
|
+
"""Return a copy of the Message but with an empty RecordDict as content.
|
431
|
+
|
432
|
+
If message has no content, it returns itself.
|
433
|
+
"""
|
434
|
+
if message.has_error():
|
435
|
+
return message
|
436
|
+
|
437
|
+
return make_message(metadata=message.metadata, content=RecordDict())
|
438
|
+
|
439
|
+
|
429
440
|
def _limit_reply_ttl(
|
430
441
|
current: float, reply_ttl: float | None, reply_to: Message
|
431
442
|
) -> float:
|
@@ -16,6 +16,7 @@
|
|
16
16
|
|
17
17
|
|
18
18
|
import threading
|
19
|
+
from typing import Any, Callable
|
19
20
|
|
20
21
|
from flwr.common.typing import RunNotRunningException
|
21
22
|
|
@@ -80,36 +81,57 @@ def _update_client_manager(
|
|
80
81
|
"""Update the nodes list in the client manager."""
|
81
82
|
# Loop until the grid is disconnected
|
82
83
|
registered_nodes: dict[int, GridClientProxy] = {}
|
84
|
+
lock = threading.RLock()
|
85
|
+
|
86
|
+
def update_registered_nodes() -> None:
|
87
|
+
with lock:
|
88
|
+
all_node_ids = set(grid.get_node_ids())
|
89
|
+
dead_nodes = set(registered_nodes).difference(all_node_ids)
|
90
|
+
new_nodes = all_node_ids.difference(registered_nodes)
|
91
|
+
|
92
|
+
# Unregister dead nodes
|
93
|
+
for node_id in dead_nodes:
|
94
|
+
client_proxy = registered_nodes[node_id]
|
95
|
+
client_manager.unregister(client_proxy)
|
96
|
+
del registered_nodes[node_id]
|
97
|
+
|
98
|
+
# Register new nodes
|
99
|
+
for node_id in new_nodes:
|
100
|
+
client_proxy = GridClientProxy(
|
101
|
+
node_id=node_id,
|
102
|
+
grid=grid,
|
103
|
+
run_id=grid.run.run_id,
|
104
|
+
)
|
105
|
+
if client_manager.register(client_proxy):
|
106
|
+
registered_nodes[node_id] = client_proxy
|
107
|
+
else:
|
108
|
+
raise RuntimeError("Could not register node.")
|
109
|
+
|
110
|
+
# Get the wrapped method of ClientManager instance
|
111
|
+
def get_wrapped_method(method_name: str) -> Callable[..., Any]:
|
112
|
+
original_method = getattr(client_manager, method_name)
|
113
|
+
|
114
|
+
def wrapped_method(*args: Any, **kwargs: Any) -> Any:
|
115
|
+
# Update registered nodes before calling the original method
|
116
|
+
update_registered_nodes()
|
117
|
+
return original_method(*args, **kwargs)
|
118
|
+
|
119
|
+
return wrapped_method
|
120
|
+
|
121
|
+
# Wrap the ClientManager
|
122
|
+
for method_name in ["num_available", "all", "sample"]:
|
123
|
+
setattr(client_manager, method_name, get_wrapped_method(method_name))
|
124
|
+
|
125
|
+
c_done.set()
|
126
|
+
|
83
127
|
while not f_stop.is_set():
|
128
|
+
# Sleep for 5 seconds
|
129
|
+
if not f_stop.is_set():
|
130
|
+
f_stop.wait(5)
|
131
|
+
|
84
132
|
try:
|
85
|
-
|
133
|
+
# Update registered nodes
|
134
|
+
update_registered_nodes()
|
86
135
|
except RunNotRunningException:
|
87
136
|
f_stop.set()
|
88
137
|
break
|
89
|
-
dead_nodes = set(registered_nodes).difference(all_node_ids)
|
90
|
-
new_nodes = all_node_ids.difference(registered_nodes)
|
91
|
-
|
92
|
-
# Unregister dead nodes
|
93
|
-
for node_id in dead_nodes:
|
94
|
-
client_proxy = registered_nodes[node_id]
|
95
|
-
client_manager.unregister(client_proxy)
|
96
|
-
del registered_nodes[node_id]
|
97
|
-
|
98
|
-
# Register new nodes
|
99
|
-
for node_id in new_nodes:
|
100
|
-
client_proxy = GridClientProxy(
|
101
|
-
node_id=node_id,
|
102
|
-
grid=grid,
|
103
|
-
run_id=grid.run.run_id,
|
104
|
-
)
|
105
|
-
if client_manager.register(client_proxy):
|
106
|
-
registered_nodes[node_id] = client_proxy
|
107
|
-
else:
|
108
|
-
raise RuntimeError("Could not register node.")
|
109
|
-
|
110
|
-
# Flag first pass for nodes registration is completed
|
111
|
-
c_done.set()
|
112
|
-
|
113
|
-
# Sleep for 3 seconds
|
114
|
-
if not f_stop.is_set():
|
115
|
-
f_stop.wait(3)
|
{flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/server/grid/grpc_grid.py
RENAMED
@@ -29,11 +29,16 @@ from flwr.common.constant import (
|
|
29
29
|
)
|
30
30
|
from flwr.common.grpc import create_channel, on_channel_state_change
|
31
31
|
from flwr.common.inflatable_grpc_utils import (
|
32
|
+
make_pull_object_fn_grpc,
|
33
|
+
make_push_object_fn_grpc,
|
32
34
|
pull_object_from_servicer,
|
33
35
|
push_object_to_servicer,
|
34
36
|
)
|
35
37
|
from flwr.common.logger import log, warn_deprecated_feature
|
36
|
-
from flwr.common.message import
|
38
|
+
from flwr.common.message import (
|
39
|
+
get_message_to_descendant_id_mapping,
|
40
|
+
remove_content_from_message,
|
41
|
+
)
|
37
42
|
from flwr.common.retry_invoker import _make_simple_grpc_retry_invoker, _wrap_stub
|
38
43
|
from flwr.common.serde import message_to_proto, run_from_proto
|
39
44
|
from flwr.common.typing import Run
|
@@ -210,7 +215,7 @@ class GrpcGrid(Grid):
|
|
210
215
|
# Call GrpcServerAppIoStub method
|
211
216
|
res: PushInsMessagesResponse = self._stub.PushMessages(
|
212
217
|
PushInsMessagesRequest(
|
213
|
-
messages_list=[message_to_proto(message)],
|
218
|
+
messages_list=[message_to_proto(remove_content_from_message(message))],
|
214
219
|
run_id=run_id,
|
215
220
|
msg_to_descendant_mapping=descendants_mapping,
|
216
221
|
)
|
@@ -224,9 +229,11 @@ class GrpcGrid(Grid):
|
|
224
229
|
# Push only object that are not in the store
|
225
230
|
push_object_to_servicer(
|
226
231
|
message,
|
227
|
-
|
228
|
-
|
229
|
-
|
232
|
+
push_object_fn=make_push_object_fn_grpc(
|
233
|
+
push_object_grpc=self._stub.PushObject,
|
234
|
+
node=self.node,
|
235
|
+
run_id=run_id,
|
236
|
+
),
|
230
237
|
object_ids_to_push=obj_ids_to_push,
|
231
238
|
)
|
232
239
|
return msg_id
|
@@ -289,9 +296,11 @@ class GrpcGrid(Grid):
|
|
289
296
|
|
290
297
|
message = pull_object_from_servicer(
|
291
298
|
msg_proto.metadata.message_id,
|
292
|
-
|
293
|
-
|
294
|
-
|
299
|
+
pull_object_fn=make_pull_object_fn_grpc(
|
300
|
+
pull_object_grpc=self._stub.PullObject,
|
301
|
+
node=self.node,
|
302
|
+
run_id=run_id,
|
303
|
+
),
|
295
304
|
)
|
296
305
|
inflated_msgs.append(cast(Message, message))
|
297
306
|
|
@@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api"
|
|
4
4
|
|
5
5
|
[tool.poetry]
|
6
6
|
name = "flwr-nightly"
|
7
|
-
version = "1.19.0.
|
7
|
+
version = "1.19.0.dev20250606"
|
8
8
|
description = "Flower: A Friendly Federated AI Framework"
|
9
9
|
license = "Apache-2.0"
|
10
10
|
authors = ["The Flower Authors <hello@flower.ai>"]
|
@@ -1,122 +0,0 @@
|
|
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 time import sleep
|
19
|
-
from typing import Optional, Union
|
20
|
-
|
21
|
-
from flwr.client.grpc_rere_client.grpc_adapter import GrpcAdapter
|
22
|
-
from flwr.proto.fleet_pb2_grpc import FleetStub # pylint: disable=E0611
|
23
|
-
from flwr.proto.message_pb2 import ( # pylint: disable=E0611
|
24
|
-
PullObjectRequest,
|
25
|
-
PullObjectResponse,
|
26
|
-
PushObjectRequest,
|
27
|
-
PushObjectResponse,
|
28
|
-
)
|
29
|
-
from flwr.proto.node_pb2 import Node # pylint: disable=E0611
|
30
|
-
from flwr.proto.serverappio_pb2_grpc import ServerAppIoStub # pylint: disable=E0611
|
31
|
-
|
32
|
-
from .inflatable import (
|
33
|
-
InflatableObject,
|
34
|
-
get_object_head_values_from_object_content,
|
35
|
-
get_object_id,
|
36
|
-
)
|
37
|
-
from .message import Message
|
38
|
-
from .record import Array, ArrayRecord, ConfigRecord, MetricRecord, RecordDict
|
39
|
-
|
40
|
-
# Helper registry that maps names of classes to their type
|
41
|
-
inflatable_class_registry: dict[str, type[InflatableObject]] = {
|
42
|
-
Array.__qualname__: Array,
|
43
|
-
ArrayRecord.__qualname__: ArrayRecord,
|
44
|
-
ConfigRecord.__qualname__: ConfigRecord,
|
45
|
-
Message.__qualname__: Message,
|
46
|
-
MetricRecord.__qualname__: MetricRecord,
|
47
|
-
RecordDict.__qualname__: RecordDict,
|
48
|
-
}
|
49
|
-
|
50
|
-
|
51
|
-
def push_object_to_servicer(
|
52
|
-
obj: InflatableObject,
|
53
|
-
stub: Union[FleetStub, ServerAppIoStub, GrpcAdapter],
|
54
|
-
node: Node,
|
55
|
-
run_id: int,
|
56
|
-
object_ids_to_push: Optional[set[str]] = None,
|
57
|
-
) -> set[str]:
|
58
|
-
"""Recursively deflate an object and push it to the servicer.
|
59
|
-
|
60
|
-
Objects with the same ID are not pushed twice. If `object_ids_to_push` is set,
|
61
|
-
only objects with those IDs are pushed. It returns the set of pushed object
|
62
|
-
IDs.
|
63
|
-
"""
|
64
|
-
pushed_object_ids: set[str] = set()
|
65
|
-
# Push children if it has any
|
66
|
-
if children := obj.children:
|
67
|
-
for child in children.values():
|
68
|
-
pushed_object_ids |= push_object_to_servicer(
|
69
|
-
child, stub, node, run_id, object_ids_to_push
|
70
|
-
)
|
71
|
-
|
72
|
-
# Deflate object and push
|
73
|
-
object_content = obj.deflate()
|
74
|
-
object_id = get_object_id(object_content)
|
75
|
-
# Push always if no object set is specified, or if the object is in the set
|
76
|
-
if object_ids_to_push is None or object_id in object_ids_to_push:
|
77
|
-
_: PushObjectResponse = stub.PushObject(
|
78
|
-
PushObjectRequest(
|
79
|
-
node=node,
|
80
|
-
run_id=run_id,
|
81
|
-
object_id=object_id,
|
82
|
-
object_content=object_content,
|
83
|
-
)
|
84
|
-
)
|
85
|
-
pushed_object_ids.add(object_id)
|
86
|
-
|
87
|
-
return pushed_object_ids
|
88
|
-
|
89
|
-
|
90
|
-
def pull_object_from_servicer(
|
91
|
-
object_id: str,
|
92
|
-
stub: Union[FleetStub, ServerAppIoStub, GrpcAdapter],
|
93
|
-
node: Node,
|
94
|
-
run_id: int,
|
95
|
-
) -> InflatableObject:
|
96
|
-
"""Recursively inflate an object by pulling it from the servicer."""
|
97
|
-
# Pull object
|
98
|
-
object_available = False
|
99
|
-
while not object_available:
|
100
|
-
object_proto: PullObjectResponse = stub.PullObject(
|
101
|
-
PullObjectRequest(node=node, run_id=run_id, object_id=object_id)
|
102
|
-
)
|
103
|
-
object_available = object_proto.object_available
|
104
|
-
object_content = object_proto.object_content
|
105
|
-
sleep(0.1)
|
106
|
-
|
107
|
-
# Extract object class and object_ids of children
|
108
|
-
obj_type, children_obj_ids, _ = get_object_head_values_from_object_content(
|
109
|
-
object_content=object_content
|
110
|
-
)
|
111
|
-
# Resolve object class
|
112
|
-
cls_type = inflatable_class_registry[obj_type]
|
113
|
-
|
114
|
-
# Pull all children objects
|
115
|
-
children: dict[str, InflatableObject] = {}
|
116
|
-
for child_object_id in children_obj_ids:
|
117
|
-
children[child_object_id] = pull_object_from_servicer(
|
118
|
-
child_object_id, stub, node, run_id
|
119
|
-
)
|
120
|
-
|
121
|
-
# Inflate object passing its children
|
122
|
-
return cls_type.inflate(object_content, children=children)
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/config_utils.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/login/__init__.py
RENAMED
File without changes
|
{flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/login/login.py
RENAMED
File without changes
|
File without changes
|
{flwr_nightly-1.19.0.dev20250604 → flwr_nightly-1.19.0.dev20250606}/py/flwr/cli/new/__init__.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|