flwr-nightly 1.22.0.dev20250917__tar.gz → 1.22.0.dev20250918__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.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/PKG-INFO +1 -1
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/new.py +2 -0
- flwr_nightly-1.22.0.dev20250918/py/flwr/cli/new/templates/app/code/client.xgboost.py.tpl +110 -0
- flwr_nightly-1.22.0.dev20250918/py/flwr/cli/new/templates/app/code/server.xgboost.py.tpl +56 -0
- flwr_nightly-1.22.0.dev20250918/py/flwr/cli/new/templates/app/code/task.xgboost.py.tpl +67 -0
- flwr_nightly-1.22.0.dev20250918/py/flwr/cli/new/templates/app/pyproject.xgboost.toml.tpl +61 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/exit/exit_code.py +4 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/serverapp/strategy/__init__.py +2 -0
- flwr_nightly-1.22.0.dev20250918/py/flwr/serverapp/strategy/fedxgb_cyclic.py +220 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/supercore/cli/flower_superexec.py +26 -1
- flwr_nightly-1.22.0.dev20250918/py/flwr/supercore/constant.py +19 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/supercore/superexec/plugin/exec_plugin.py +11 -1
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/supercore/superexec/run_superexec.py +16 -2
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/pyproject.toml +1 -1
- flwr_nightly-1.22.0.dev20250917/py/flwr/serverapp/strategy/strategy_utils_tests.py +0 -323
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/README.md +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/__init__.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/app/__init__.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/app/error.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/app/exception.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/app/metadata.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/__init__.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/app.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/auth_plugin/__init__.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/auth_plugin/oidc_cli_plugin.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/build.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/cli_user_auth_interceptor.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/config_utils.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/constant.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/example.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/install.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/log.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/login/__init__.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/login/login.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/ls.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/__init__.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/__init__.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/.gitignore.tpl +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/LICENSE.tpl +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/README.baseline.md.tpl +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/README.flowertune.md.tpl +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/README.md.tpl +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/__init__.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/code/__init__.baseline.py.tpl +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/code/__init__.pytorch_legacy_api.py.tpl +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/code/client.baseline.py.tpl +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/code/client.huggingface.py.tpl +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/code/client.jax.py.tpl +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/code/client.mlx.py.tpl +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/code/client.numpy.py.tpl +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/code/client.pytorch_legacy_api.py.tpl +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/code/dataset.baseline.py.tpl +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/code/flwr_tune/__init__.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/code/flwr_tune/client_app.py.tpl +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/code/flwr_tune/dataset.py.tpl +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/code/flwr_tune/models.py.tpl +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/code/flwr_tune/server_app.py.tpl +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/code/flwr_tune/strategy.py.tpl +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/code/model.baseline.py.tpl +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/code/server.baseline.py.tpl +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/code/server.huggingface.py.tpl +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/code/server.jax.py.tpl +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/code/server.mlx.py.tpl +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/code/server.pytorch_legacy_api.py.tpl +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/code/server.sklearn.py.tpl +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/code/strategy.baseline.py.tpl +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/code/task.huggingface.py.tpl +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/code/task.jax.py.tpl +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/code/task.mlx.py.tpl +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/code/task.numpy.py.tpl +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/code/task.pytorch_legacy_api.py.tpl +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/code/task.sklearn.py.tpl +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/code/task.tensorflow.py.tpl +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/code/utils.baseline.py.tpl +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/pyproject.baseline.toml.tpl +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/pyproject.jax.toml.tpl +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/pyproject.pytorch_legacy_api.toml.tpl +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/pull.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/run/__init__.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/run/run.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/stop.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/cli/utils.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/client/__init__.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/client/client.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/client/client_app.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/client/clientapp/__init__.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/client/clientapp/utils.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/client/dpfedavg_numpy_client.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/client/grpc_adapter_client/__init__.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/client/grpc_adapter_client/connection.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/client/grpc_rere_client/__init__.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/client/grpc_rere_client/client_interceptor.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/client/grpc_rere_client/connection.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/client/grpc_rere_client/grpc_adapter.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/client/message_handler/__init__.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/client/message_handler/message_handler.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/client/mod/__init__.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/client/mod/centraldp_mods.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/client/mod/comms_mods.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/client/mod/localdp_mod.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/client/mod/utils.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/client/numpy_client.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/client/rest_client/__init__.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/client/rest_client/connection.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/client/run_info_store.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/client/typing.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/clientapp/__init__.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/clientapp/mod/__init__.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/clientapp/mod/centraldp_mods.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/__init__.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/address.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/args.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/auth_plugin/__init__.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/auth_plugin/auth_plugin.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/config.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/constant.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/context.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/date.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/differential_privacy.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/differential_privacy_constants.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/dp.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/event_log_plugin/__init__.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/event_log_plugin/event_log_plugin.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/exit/__init__.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/exit/exit.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/exit/exit_handler.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/exit/signal_handler.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/grpc.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/heartbeat.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/inflatable.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/inflatable_protobuf_utils.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/inflatable_utils.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/logger.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/message.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/object_ref.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/parameter.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/pyproject.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/record/__init__.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/record/array.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/record/arraychunk.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/record/arrayrecord.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/record/configrecord.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/record/conversion_utils.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/record/metricrecord.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/record/recorddict.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/record/typeddict.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/recorddict_compat.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/retry_invoker.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/secure_aggregation/quantization.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/serde.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/serde_utils.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/telemetry.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/typing.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/version.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/compat/__init__.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/compat/client/__init__.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/compat/client/app.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/compat/client/grpc_client/__init__.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/compat/client/grpc_client/connection.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/compat/common/__init__.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/compat/server/__init__.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/compat/server/app.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/compat/simulation/__init__.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/__init__.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/appio_pb2.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/appio_pb2.pyi +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/appio_pb2_grpc.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/appio_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/clientappio_pb2.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/clientappio_pb2.pyi +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/clientappio_pb2_grpc.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/clientappio_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/control_pb2.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/control_pb2.pyi +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/control_pb2_grpc.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/control_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/error_pb2.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/error_pb2.pyi +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/error_pb2_grpc.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/error_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/fab_pb2.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/fab_pb2.pyi +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/fab_pb2_grpc.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/fab_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/fleet_pb2.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/fleet_pb2.pyi +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/fleet_pb2_grpc.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/grpcadapter_pb2.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/grpcadapter_pb2.pyi +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/grpcadapter_pb2_grpc.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/grpcadapter_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/heartbeat_pb2.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/heartbeat_pb2.pyi +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/heartbeat_pb2_grpc.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/heartbeat_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/log_pb2.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/log_pb2.pyi +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/log_pb2_grpc.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/log_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/message_pb2.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/message_pb2.pyi +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/message_pb2_grpc.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/message_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/node_pb2.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/node_pb2.pyi +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/node_pb2_grpc.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/node_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/recorddict_pb2.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/recorddict_pb2.pyi +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/recorddict_pb2_grpc.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/recorddict_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/run_pb2.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/run_pb2.pyi +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/run_pb2_grpc.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/run_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/serverappio_pb2.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/serverappio_pb2.pyi +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/serverappio_pb2_grpc.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/serverappio_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/simulationio_pb2.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/simulationio_pb2.pyi +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/simulationio_pb2_grpc.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/simulationio_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/transport_pb2.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/transport_pb2.pyi +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/transport_pb2_grpc.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/py.typed +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/__init__.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/app.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/client_manager.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/client_proxy.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/compat/__init__.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/compat/app.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/compat/app_utils.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/compat/grid_client_proxy.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/compat/legacy_context.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/criterion.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/fleet_event_log_interceptor.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/grid/__init__.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/grid/grid.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/grid/grpc_grid.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/grid/inmemory_grid.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/history.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/run_serverapp.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/server.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/server_app.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/server_config.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/serverapp/__init__.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/serverapp/app.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/serverapp_components.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/strategy/__init__.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/strategy/aggregate.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/strategy/bulyan.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/strategy/fedadagrad.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/strategy/fedadam.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/strategy/fedavg.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/strategy/fedavg_android.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/strategy/fedavgm.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/strategy/fedmedian.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/strategy/fedopt.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/strategy/fedprox.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/strategy/fedyogi.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/strategy/krum.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/strategy/qfedavg.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/strategy/strategy.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/superlink/__init__.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/superlink/fleet/__init__.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/superlink/fleet/grpc_adapter/__init__.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/superlink/fleet/message_handler/message_handler.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/superlink/fleet/vce/vce_api.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/superlink/linkstate/__init__.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/superlink/linkstate/in_memory_linkstate.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/superlink/linkstate/linkstate.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/superlink/linkstate/linkstate_factory.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/superlink/linkstate/sqlite_linkstate.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/superlink/linkstate/utils.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/superlink/serverappio/__init__.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/superlink/serverappio/serverappio_grpc.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/superlink/serverappio/serverappio_servicer.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/superlink/simulation/__init__.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/superlink/simulation/simulationio_grpc.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/superlink/simulation/simulationio_servicer.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/superlink/utils.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/typing.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/utils/__init__.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/utils/tensorboard.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/utils/validator.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/workflow/__init__.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/workflow/constant.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/workflow/default_workflows.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/serverapp/__init__.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/serverapp/dp_fixed_clipping.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/serverapp/exception.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/serverapp/strategy/dp_fixed_clipping.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/serverapp/strategy/fedadagrad.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/serverapp/strategy/fedadam.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/serverapp/strategy/fedavg.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/serverapp/strategy/fedavgm.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/serverapp/strategy/fedmedian.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/serverapp/strategy/fedopt.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/serverapp/strategy/fedprox.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/serverapp/strategy/fedtrimmedavg.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/serverapp/strategy/fedxgb_bagging.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/serverapp/strategy/fedyogi.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/serverapp/strategy/result.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/serverapp/strategy/strategy.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/serverapp/strategy/strategy_utils.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/simulation/__init__.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/simulation/app.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/simulation/legacy_app.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/simulation/ray_transport/__init__.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/simulation/ray_transport/utils.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/simulation/run_simulation.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/simulation/simulationio_connection.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/supercore/__init__.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/supercore/app_utils.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/supercore/cli/__init__.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/supercore/corestate/__init__.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/supercore/corestate/corestate.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/supercore/ffs/__init__.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/supercore/ffs/disk_ffs.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/supercore/ffs/ffs.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/supercore/ffs/ffs_factory.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/supercore/grpc_health/__init__.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/supercore/grpc_health/health_server.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/supercore/grpc_health/simple_health_servicer.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/supercore/license_plugin/__init__.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/supercore/license_plugin/license_plugin.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/supercore/object_store/__init__.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/supercore/object_store/in_memory_object_store.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/supercore/object_store/object_store.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/supercore/object_store/object_store_factory.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/supercore/object_store/utils.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/supercore/superexec/__init__.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/supercore/superexec/plugin/__init__.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/supercore/superexec/plugin/base_exec_plugin.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/supercore/superexec/plugin/clientapp_exec_plugin.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/supercore/superexec/plugin/serverapp_exec_plugin.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/supercore/superexec/plugin/simulation_exec_plugin.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/supercore/utils.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/superlink/__init__.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/superlink/artifact_provider/__init__.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/superlink/artifact_provider/artifact_provider.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/superlink/servicer/__init__.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/superlink/servicer/control/__init__.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/superlink/servicer/control/control_event_log_interceptor.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/superlink/servicer/control/control_grpc.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/superlink/servicer/control/control_license_interceptor.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/superlink/servicer/control/control_servicer.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/superlink/servicer/control/control_user_auth_interceptor.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/supernode/__init__.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/supernode/cli/__init__.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/supernode/cli/flower_supernode.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/supernode/cli/flwr_clientapp.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/supernode/nodestate/__init__.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/supernode/nodestate/in_memory_nodestate.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/supernode/nodestate/nodestate.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/supernode/nodestate/nodestate_factory.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/supernode/runtime/__init__.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/supernode/runtime/run_clientapp.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/supernode/servicer/__init__.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/supernode/servicer/clientappio/__init__.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/supernode/servicer/clientappio/clientappio_servicer.py +0 -0
- {flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/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.22.0.
|
3
|
+
Version: 1.22.0.dev20250918
|
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
|
@@ -41,6 +41,7 @@ class MlFramework(str, Enum):
|
|
41
41
|
JAX = "JAX"
|
42
42
|
MLX = "MLX"
|
43
43
|
NUMPY = "NumPy"
|
44
|
+
XGBOOST = "XGBoost"
|
44
45
|
FLOWERTUNE = "FlowerTune"
|
45
46
|
BASELINE = "Flower Baseline"
|
46
47
|
PYTORCH_LEGACY_API = "PyTorch (Legacy API, deprecated)"
|
@@ -247,6 +248,7 @@ def new(
|
|
247
248
|
MlFramework.TENSORFLOW.value,
|
248
249
|
MlFramework.SKLEARN.value,
|
249
250
|
MlFramework.NUMPY.value,
|
251
|
+
MlFramework.XGBOOST.value,
|
250
252
|
"pytorch_legacy_api",
|
251
253
|
]
|
252
254
|
if framework_str in frameworks_with_tasks:
|
@@ -0,0 +1,110 @@
|
|
1
|
+
"""$project_name: A Flower / $framework_str app."""
|
2
|
+
|
3
|
+
import warnings
|
4
|
+
|
5
|
+
import numpy as np
|
6
|
+
import xgboost as xgb
|
7
|
+
from flwr.app import ArrayRecord, Context, Message, MetricRecord, RecordDict
|
8
|
+
from flwr.clientapp import ClientApp
|
9
|
+
from flwr.common.config import unflatten_dict
|
10
|
+
|
11
|
+
from $import_name.task import load_data, replace_keys
|
12
|
+
|
13
|
+
warnings.filterwarnings("ignore", category=UserWarning)
|
14
|
+
|
15
|
+
|
16
|
+
# Flower ClientApp
|
17
|
+
app = ClientApp()
|
18
|
+
|
19
|
+
|
20
|
+
def _local_boost(bst_input, num_local_round, train_dmatrix):
|
21
|
+
# Update trees based on local training data.
|
22
|
+
for i in range(num_local_round):
|
23
|
+
bst_input.update(train_dmatrix, bst_input.num_boosted_rounds())
|
24
|
+
|
25
|
+
# Bagging: extract the last N=num_local_round trees for sever aggregation
|
26
|
+
bst = bst_input[
|
27
|
+
bst_input.num_boosted_rounds()
|
28
|
+
- num_local_round : bst_input.num_boosted_rounds()
|
29
|
+
]
|
30
|
+
return bst
|
31
|
+
|
32
|
+
|
33
|
+
@app.train()
|
34
|
+
def train(msg: Message, context: Context) -> Message:
|
35
|
+
# Load model and data
|
36
|
+
partition_id = context.node_config["partition-id"]
|
37
|
+
num_partitions = context.node_config["num-partitions"]
|
38
|
+
train_dmatrix, _, num_train, _ = load_data(partition_id, num_partitions)
|
39
|
+
|
40
|
+
# Read from run config
|
41
|
+
num_local_round = context.run_config["local-epochs"]
|
42
|
+
# Flatted config dict and replace "-" with "_"
|
43
|
+
cfg = replace_keys(unflatten_dict(context.run_config))
|
44
|
+
params = cfg["params"]
|
45
|
+
|
46
|
+
global_round = msg.content["config"]["server-round"]
|
47
|
+
if global_round == 1:
|
48
|
+
# First round local training
|
49
|
+
bst = xgb.train(
|
50
|
+
params,
|
51
|
+
train_dmatrix,
|
52
|
+
num_boost_round=num_local_round,
|
53
|
+
)
|
54
|
+
else:
|
55
|
+
bst = xgb.Booster(params=params)
|
56
|
+
global_model = bytearray(msg.content["arrays"]["0"].numpy().tobytes())
|
57
|
+
|
58
|
+
# Load global model into booster
|
59
|
+
bst.load_model(global_model)
|
60
|
+
|
61
|
+
# Local training
|
62
|
+
bst = _local_boost(bst, num_local_round, train_dmatrix)
|
63
|
+
|
64
|
+
# Save model
|
65
|
+
local_model = bst.save_raw("json")
|
66
|
+
model_np = np.frombuffer(local_model, dtype=np.uint8)
|
67
|
+
|
68
|
+
# Construct reply message
|
69
|
+
# Note: we store the model as the first item in a list into ArrayRecord,
|
70
|
+
# which can be accessed using index ["0"].
|
71
|
+
model_record = ArrayRecord([model_np])
|
72
|
+
metrics = {
|
73
|
+
"num-examples": num_train,
|
74
|
+
}
|
75
|
+
metric_record = MetricRecord(metrics)
|
76
|
+
content = RecordDict({"arrays": model_record, "metrics": metric_record})
|
77
|
+
return Message(content=content, reply_to=msg)
|
78
|
+
|
79
|
+
|
80
|
+
@app.evaluate()
|
81
|
+
def evaluate(msg: Message, context: Context) -> Message:
|
82
|
+
# Load model and data
|
83
|
+
partition_id = context.node_config["partition-id"]
|
84
|
+
num_partitions = context.node_config["num-partitions"]
|
85
|
+
_, valid_dmatrix, _, num_val = load_data(partition_id, num_partitions)
|
86
|
+
|
87
|
+
# Load config
|
88
|
+
cfg = replace_keys(unflatten_dict(context.run_config))
|
89
|
+
params = cfg["params"]
|
90
|
+
|
91
|
+
# Load global model
|
92
|
+
bst = xgb.Booster(params=params)
|
93
|
+
global_model = bytearray(msg.content["arrays"]["0"].numpy().tobytes())
|
94
|
+
bst.load_model(global_model)
|
95
|
+
|
96
|
+
# Run evaluation
|
97
|
+
eval_results = bst.eval_set(
|
98
|
+
evals=[(valid_dmatrix, "valid")],
|
99
|
+
iteration=bst.num_boosted_rounds() - 1,
|
100
|
+
)
|
101
|
+
auc = float(eval_results.split("\t")[1].split(":")[1])
|
102
|
+
|
103
|
+
# Construct and return reply Message
|
104
|
+
metrics = {
|
105
|
+
"auc": auc,
|
106
|
+
"num-examples": num_val,
|
107
|
+
}
|
108
|
+
metric_record = MetricRecord(metrics)
|
109
|
+
content = RecordDict({"metrics": metric_record})
|
110
|
+
return Message(content=content, reply_to=msg)
|
@@ -0,0 +1,56 @@
|
|
1
|
+
"""$project_name: A Flower / $framework_str app."""
|
2
|
+
|
3
|
+
import numpy as np
|
4
|
+
import xgboost as xgb
|
5
|
+
from flwr.app import ArrayRecord, Context
|
6
|
+
from flwr.common.config import unflatten_dict
|
7
|
+
from flwr.serverapp import Grid, ServerApp
|
8
|
+
from flwr.serverapp.strategy import FedXgbBagging
|
9
|
+
|
10
|
+
from $import_name.task import replace_keys
|
11
|
+
|
12
|
+
# Create ServerApp
|
13
|
+
app = ServerApp()
|
14
|
+
|
15
|
+
|
16
|
+
@app.main()
|
17
|
+
def main(grid: Grid, context: Context) -> None:
|
18
|
+
# Read run config
|
19
|
+
num_rounds = context.run_config["num-server-rounds"]
|
20
|
+
fraction_train = context.run_config["fraction-train"]
|
21
|
+
fraction_evaluate = context.run_config["fraction-evaluate"]
|
22
|
+
# Flatted config dict and replace "-" with "_"
|
23
|
+
cfg = replace_keys(unflatten_dict(context.run_config))
|
24
|
+
params = cfg["params"]
|
25
|
+
|
26
|
+
# Init global model
|
27
|
+
# Init with an empty object; the XGBooster will be created
|
28
|
+
# and trained on the client side.
|
29
|
+
global_model = b""
|
30
|
+
# Note: we store the model as the first item in a list into ArrayRecord,
|
31
|
+
# which can be accessed using index ["0"].
|
32
|
+
arrays = ArrayRecord([np.frombuffer(global_model, dtype=np.uint8)])
|
33
|
+
|
34
|
+
# Initialize FedXgbBagging strategy
|
35
|
+
strategy = FedXgbBagging(
|
36
|
+
fraction_train=fraction_train,
|
37
|
+
fraction_evaluate=fraction_evaluate,
|
38
|
+
)
|
39
|
+
|
40
|
+
# Start strategy, run FedXgbBagging for `num_rounds`
|
41
|
+
result = strategy.start(
|
42
|
+
grid=grid,
|
43
|
+
initial_arrays=arrays,
|
44
|
+
num_rounds=num_rounds,
|
45
|
+
)
|
46
|
+
|
47
|
+
# Save final model to disk
|
48
|
+
bst = xgb.Booster(params=params)
|
49
|
+
global_model = bytearray(result.arrays["0"].numpy().tobytes())
|
50
|
+
|
51
|
+
# Load global model into booster
|
52
|
+
bst.load_model(global_model)
|
53
|
+
|
54
|
+
# Save model
|
55
|
+
print("\nSaving final model to disk...")
|
56
|
+
bst.save_model("final_model.json")
|
@@ -0,0 +1,67 @@
|
|
1
|
+
"""$project_name: A Flower / $framework_str app."""
|
2
|
+
|
3
|
+
import xgboost as xgb
|
4
|
+
from flwr_datasets import FederatedDataset
|
5
|
+
from flwr_datasets.partitioner import IidPartitioner
|
6
|
+
|
7
|
+
|
8
|
+
def train_test_split(partition, test_fraction, seed):
|
9
|
+
"""Split the data into train and validation set given split rate."""
|
10
|
+
train_test = partition.train_test_split(test_size=test_fraction, seed=seed)
|
11
|
+
partition_train = train_test["train"]
|
12
|
+
partition_test = train_test["test"]
|
13
|
+
|
14
|
+
num_train = len(partition_train)
|
15
|
+
num_test = len(partition_test)
|
16
|
+
|
17
|
+
return partition_train, partition_test, num_train, num_test
|
18
|
+
|
19
|
+
|
20
|
+
def transform_dataset_to_dmatrix(data):
|
21
|
+
"""Transform dataset to DMatrix format for xgboost."""
|
22
|
+
x = data["inputs"]
|
23
|
+
y = data["label"]
|
24
|
+
new_data = xgb.DMatrix(x, label=y)
|
25
|
+
return new_data
|
26
|
+
|
27
|
+
|
28
|
+
fds = None # Cache FederatedDataset
|
29
|
+
|
30
|
+
|
31
|
+
def load_data(partition_id, num_clients):
|
32
|
+
"""Load partition HIGGS data."""
|
33
|
+
# Only initialize `FederatedDataset` once
|
34
|
+
global fds
|
35
|
+
if fds is None:
|
36
|
+
partitioner = IidPartitioner(num_partitions=num_clients)
|
37
|
+
fds = FederatedDataset(
|
38
|
+
dataset="jxie/higgs",
|
39
|
+
partitioners={"train": partitioner},
|
40
|
+
)
|
41
|
+
|
42
|
+
# Load the partition for this `partition_id`
|
43
|
+
partition = fds.load_partition(partition_id, split="train")
|
44
|
+
partition.set_format("numpy")
|
45
|
+
|
46
|
+
# Train/test splitting
|
47
|
+
train_data, valid_data, num_train, num_val = train_test_split(
|
48
|
+
partition, test_fraction=0.2, seed=42
|
49
|
+
)
|
50
|
+
|
51
|
+
# Reformat data to DMatrix for xgboost
|
52
|
+
train_dmatrix = transform_dataset_to_dmatrix(train_data)
|
53
|
+
valid_dmatrix = transform_dataset_to_dmatrix(valid_data)
|
54
|
+
|
55
|
+
return train_dmatrix, valid_dmatrix, num_train, num_val
|
56
|
+
|
57
|
+
|
58
|
+
def replace_keys(input_dict, match="-", target="_"):
|
59
|
+
"""Recursively replace match string with target string in dictionary keys."""
|
60
|
+
new_dict = {}
|
61
|
+
for key, value in input_dict.items():
|
62
|
+
new_key = key.replace(match, target)
|
63
|
+
if isinstance(value, dict):
|
64
|
+
new_dict[new_key] = replace_keys(value, match, target)
|
65
|
+
else:
|
66
|
+
new_dict[new_key] = value
|
67
|
+
return new_dict
|
@@ -0,0 +1,61 @@
|
|
1
|
+
# =====================================================================
|
2
|
+
# For a full TOML configuration guide, check the Flower docs:
|
3
|
+
# https://flower.ai/docs/framework/how-to-configure-pyproject-toml.html
|
4
|
+
# =====================================================================
|
5
|
+
|
6
|
+
[build-system]
|
7
|
+
requires = ["hatchling"]
|
8
|
+
build-backend = "hatchling.build"
|
9
|
+
|
10
|
+
[project]
|
11
|
+
name = "$package_name"
|
12
|
+
version = "1.0.0"
|
13
|
+
description = ""
|
14
|
+
license = "Apache-2.0"
|
15
|
+
# Dependencies for your Flower App
|
16
|
+
dependencies = [
|
17
|
+
"flwr[simulation]>=1.22.0",
|
18
|
+
"flwr-datasets>=0.5.0",
|
19
|
+
"xgboost>=2.0.0",
|
20
|
+
]
|
21
|
+
|
22
|
+
[tool.hatch.build.targets.wheel]
|
23
|
+
packages = ["."]
|
24
|
+
|
25
|
+
[tool.flwr.app]
|
26
|
+
publisher = "$username"
|
27
|
+
|
28
|
+
[tool.flwr.app.components]
|
29
|
+
serverapp = "$import_name.server_app:app"
|
30
|
+
clientapp = "$import_name.client_app:app"
|
31
|
+
|
32
|
+
# Custom config values accessible via `context.run_config`
|
33
|
+
[tool.flwr.app.config]
|
34
|
+
num-server-rounds = 3
|
35
|
+
fraction-train = 0.1
|
36
|
+
fraction-evaluate = 0.1
|
37
|
+
local-epochs = 1
|
38
|
+
|
39
|
+
# XGBoost parameters
|
40
|
+
params.objective = "binary:logistic"
|
41
|
+
params.eta = 0.1 # Learning rate
|
42
|
+
params.max-depth = 8
|
43
|
+
params.eval-metric = "auc"
|
44
|
+
params.nthread = 16
|
45
|
+
params.num-parallel-tree = 1
|
46
|
+
params.subsample = 1
|
47
|
+
params.tree-method = "hist"
|
48
|
+
|
49
|
+
# Default federation to use when running the app
|
50
|
+
[tool.flwr.federations]
|
51
|
+
default = "local-simulation"
|
52
|
+
|
53
|
+
# Local simulation federation with 10 virtual SuperNodes
|
54
|
+
[tool.flwr.federations.local-simulation]
|
55
|
+
options.num-supernodes = 10
|
56
|
+
|
57
|
+
# Remote federation example for use with SuperLink
|
58
|
+
[tool.flwr.federations.remote-federation]
|
59
|
+
address = "<SUPERLINK-ADDRESS>:<PORT>"
|
60
|
+
insecure = true # Remove this line to enable TLS
|
61
|
+
# root-certificates = "<PATH/TO/ca.crt>" # For TLS setup
|
{flwr_nightly-1.22.0.dev20250917 → flwr_nightly-1.22.0.dev20250918}/py/flwr/common/exit/exit_code.py
RENAMED
@@ -45,6 +45,7 @@ class ExitCode:
|
|
45
45
|
SUPERNODE_NODE_AUTH_KEYS_INVALID = 302
|
46
46
|
|
47
47
|
# SuperExec-specific exit codes (400-499)
|
48
|
+
SUPEREXEC_INVALID_PLUGIN_CONFIG = 400
|
48
49
|
|
49
50
|
# Common exit codes (600-699)
|
50
51
|
COMMON_ADDRESS_INVALID = 600
|
@@ -112,6 +113,9 @@ EXIT_CODE_HELP = {
|
|
112
113
|
"file and try again."
|
113
114
|
),
|
114
115
|
# SuperExec-specific exit codes (400-499)
|
116
|
+
ExitCode.SUPEREXEC_INVALID_PLUGIN_CONFIG: (
|
117
|
+
"The YAML configuration for the SuperExec plugin is invalid."
|
118
|
+
),
|
115
119
|
# Common exit codes (600-699)
|
116
120
|
ExitCode.COMMON_ADDRESS_INVALID: (
|
117
121
|
"Please provide a valid URL, IPv4 or IPv6 address."
|
@@ -27,6 +27,7 @@ from .fedmedian import FedMedian
|
|
27
27
|
from .fedprox import FedProx
|
28
28
|
from .fedtrimmedavg import FedTrimmedAvg
|
29
29
|
from .fedxgb_bagging import FedXgbBagging
|
30
|
+
from .fedxgb_cyclic import FedXgbCyclic
|
30
31
|
from .fedyogi import FedYogi
|
31
32
|
from .result import Result
|
32
33
|
from .strategy import Strategy
|
@@ -42,6 +43,7 @@ __all__ = [
|
|
42
43
|
"FedProx",
|
43
44
|
"FedTrimmedAvg",
|
44
45
|
"FedXgbBagging",
|
46
|
+
"FedXgbCyclic",
|
45
47
|
"FedYogi",
|
46
48
|
"Result",
|
47
49
|
"Strategy",
|
@@ -0,0 +1,220 @@
|
|
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
|
+
"""Flower message-based FedXgbCyclic strategy."""
|
16
|
+
|
17
|
+
|
18
|
+
from collections.abc import Iterable
|
19
|
+
from logging import INFO
|
20
|
+
from typing import Callable, Optional, cast
|
21
|
+
|
22
|
+
from flwr.common import (
|
23
|
+
ArrayRecord,
|
24
|
+
ConfigRecord,
|
25
|
+
Message,
|
26
|
+
MessageType,
|
27
|
+
MetricRecord,
|
28
|
+
RecordDict,
|
29
|
+
log,
|
30
|
+
)
|
31
|
+
from flwr.server import Grid
|
32
|
+
|
33
|
+
from .fedavg import FedAvg
|
34
|
+
from .strategy_utils import sample_nodes
|
35
|
+
|
36
|
+
|
37
|
+
# pylint: disable=line-too-long
|
38
|
+
class FedXgbCyclic(FedAvg):
|
39
|
+
"""Configurable FedXgbCyclic strategy implementation.
|
40
|
+
|
41
|
+
Parameters
|
42
|
+
----------
|
43
|
+
fraction_train : float (default: 1.0)
|
44
|
+
Fraction of nodes used during training. In case `min_train_nodes`
|
45
|
+
is larger than `fraction_train * total_connected_nodes`, `min_train_nodes`
|
46
|
+
will still be sampled.
|
47
|
+
fraction_evaluate : float (default: 1.0)
|
48
|
+
Fraction of nodes used during validation. In case `min_evaluate_nodes`
|
49
|
+
is larger than `fraction_evaluate * total_connected_nodes`,
|
50
|
+
`min_evaluate_nodes` will still be sampled.
|
51
|
+
min_available_nodes : int (default: 2)
|
52
|
+
Minimum number of total nodes in the system.
|
53
|
+
weighted_by_key : str (default: "num-examples")
|
54
|
+
The key within each MetricRecord whose value is used as the weight when
|
55
|
+
computing weighted averages for both ArrayRecords and MetricRecords.
|
56
|
+
arrayrecord_key : str (default: "arrays")
|
57
|
+
Key used to store the ArrayRecord when constructing Messages.
|
58
|
+
configrecord_key : str (default: "config")
|
59
|
+
Key used to store the ConfigRecord when constructing Messages.
|
60
|
+
train_metrics_aggr_fn : Optional[callable] (default: None)
|
61
|
+
Function with signature (list[RecordDict], str) -> MetricRecord,
|
62
|
+
used to aggregate MetricRecords from training round replies.
|
63
|
+
If `None`, defaults to `aggregate_metricrecords`, which performs a weighted
|
64
|
+
average using the provided weight factor key.
|
65
|
+
evaluate_metrics_aggr_fn : Optional[callable] (default: None)
|
66
|
+
Function with signature (list[RecordDict], str) -> MetricRecord,
|
67
|
+
used to aggregate MetricRecords from training round replies.
|
68
|
+
If `None`, defaults to `aggregate_metricrecords`, which performs a weighted
|
69
|
+
average using the provided weight factor key.
|
70
|
+
"""
|
71
|
+
|
72
|
+
# pylint: disable=too-many-arguments,too-many-positional-arguments
|
73
|
+
def __init__(
|
74
|
+
self,
|
75
|
+
fraction_train: float = 1.0,
|
76
|
+
fraction_evaluate: float = 1.0,
|
77
|
+
min_available_nodes: int = 2,
|
78
|
+
weighted_by_key: str = "num-examples",
|
79
|
+
arrayrecord_key: str = "arrays",
|
80
|
+
configrecord_key: str = "config",
|
81
|
+
train_metrics_aggr_fn: Optional[
|
82
|
+
Callable[[list[RecordDict], str], MetricRecord]
|
83
|
+
] = None,
|
84
|
+
evaluate_metrics_aggr_fn: Optional[
|
85
|
+
Callable[[list[RecordDict], str], MetricRecord]
|
86
|
+
] = None,
|
87
|
+
) -> None:
|
88
|
+
super().__init__(
|
89
|
+
fraction_train=fraction_train,
|
90
|
+
fraction_evaluate=fraction_evaluate,
|
91
|
+
min_train_nodes=2,
|
92
|
+
min_evaluate_nodes=2,
|
93
|
+
min_available_nodes=min_available_nodes,
|
94
|
+
weighted_by_key=weighted_by_key,
|
95
|
+
arrayrecord_key=arrayrecord_key,
|
96
|
+
configrecord_key=configrecord_key,
|
97
|
+
train_metrics_aggr_fn=train_metrics_aggr_fn,
|
98
|
+
evaluate_metrics_aggr_fn=evaluate_metrics_aggr_fn,
|
99
|
+
)
|
100
|
+
|
101
|
+
self.registered_nodes: dict[int, int] = {}
|
102
|
+
|
103
|
+
if fraction_train not in (0.0, 1.0):
|
104
|
+
raise ValueError(
|
105
|
+
"fraction_train can only be set to 1.0 or 0.0 for FedXgbCyclic."
|
106
|
+
)
|
107
|
+
if fraction_evaluate not in (0.0, 1.0):
|
108
|
+
raise ValueError(
|
109
|
+
"fraction_evaluate can only be set to 1.0 or 0.0 for FedXgbCyclic."
|
110
|
+
)
|
111
|
+
|
112
|
+
def _reorder_nodes(self, node_ids: list[int]) -> list[int]:
|
113
|
+
"""Re-order node ids based on registered nodes.
|
114
|
+
|
115
|
+
Each node ID is assigned a persistent index in `self.registered_nodes`
|
116
|
+
the first time it appears. The input list is then reordered according
|
117
|
+
to these stored indices, and the result is compacted into ascending
|
118
|
+
order (1..N) for the current call.
|
119
|
+
"""
|
120
|
+
# Assign new indices to unknown nodes
|
121
|
+
next_index = max(self.registered_nodes.values(), default=0) + 1
|
122
|
+
for nid in node_ids:
|
123
|
+
if nid not in self.registered_nodes:
|
124
|
+
self.registered_nodes[nid] = next_index
|
125
|
+
next_index += 1
|
126
|
+
|
127
|
+
# Sort node_ids by their stored indices
|
128
|
+
sorted_by_index = sorted(node_ids, key=lambda x: self.registered_nodes[x])
|
129
|
+
|
130
|
+
# Compact re-map of indices just for this output list
|
131
|
+
unique_indices = sorted(self.registered_nodes[nid] for nid in sorted_by_index)
|
132
|
+
remap = {old: new for new, old in enumerate(unique_indices, start=1)}
|
133
|
+
|
134
|
+
# Build the result list ordered by compact indices
|
135
|
+
result_list = [
|
136
|
+
nid
|
137
|
+
for _, nid in sorted(
|
138
|
+
(remap[self.registered_nodes[nid]], nid) for nid in sorted_by_index
|
139
|
+
)
|
140
|
+
]
|
141
|
+
return result_list
|
142
|
+
|
143
|
+
def _make_sampling(
|
144
|
+
self, grid: Grid, server_round: int, configure_type: str
|
145
|
+
) -> list[int]:
|
146
|
+
"""Sample nodes using the Grid."""
|
147
|
+
# Sample nodes
|
148
|
+
num_nodes = int(len(list(grid.get_node_ids())) * self.fraction_train)
|
149
|
+
sample_size = max(num_nodes, self.min_train_nodes)
|
150
|
+
node_ids, _ = sample_nodes(grid, self.min_available_nodes, sample_size)
|
151
|
+
|
152
|
+
# Re-order node_ids
|
153
|
+
node_ids = self._reorder_nodes(node_ids)
|
154
|
+
|
155
|
+
# Sample the clients sequentially given server_round
|
156
|
+
sampled_idx = (server_round - 1) % len(node_ids)
|
157
|
+
sampled_node_id = [node_ids[sampled_idx]]
|
158
|
+
|
159
|
+
log(
|
160
|
+
INFO,
|
161
|
+
f"{configure_type}: Sampled %s nodes (out of %s)",
|
162
|
+
len(sampled_node_id),
|
163
|
+
len(node_ids),
|
164
|
+
)
|
165
|
+
return sampled_node_id
|
166
|
+
|
167
|
+
def configure_train(
|
168
|
+
self, server_round: int, arrays: ArrayRecord, config: ConfigRecord, grid: Grid
|
169
|
+
) -> Iterable[Message]:
|
170
|
+
"""Configure the next round of federated training."""
|
171
|
+
# Sample one node
|
172
|
+
sampled_node_id = self._make_sampling(grid, server_round, "configure_train")
|
173
|
+
|
174
|
+
# Always inject current server round
|
175
|
+
config["server-round"] = server_round
|
176
|
+
|
177
|
+
# Construct messages
|
178
|
+
record = RecordDict(
|
179
|
+
{self.arrayrecord_key: arrays, self.configrecord_key: config}
|
180
|
+
)
|
181
|
+
return self._construct_messages(record, sampled_node_id, MessageType.TRAIN)
|
182
|
+
|
183
|
+
def aggregate_train(
|
184
|
+
self,
|
185
|
+
server_round: int,
|
186
|
+
replies: Iterable[Message],
|
187
|
+
) -> tuple[Optional[ArrayRecord], Optional[MetricRecord]]:
|
188
|
+
"""Aggregate ArrayRecords and MetricRecords in the received Messages."""
|
189
|
+
valid_replies, _ = self._check_and_log_replies(replies, is_train=True)
|
190
|
+
|
191
|
+
arrays, metrics = None, None
|
192
|
+
if valid_replies:
|
193
|
+
reply_contents = [msg.content for msg in valid_replies]
|
194
|
+
array_record_key = next(iter(reply_contents[0].array_records.keys()))
|
195
|
+
|
196
|
+
# Fetch the client model from current round as global model
|
197
|
+
arrays = cast(ArrayRecord, reply_contents[0][array_record_key])
|
198
|
+
|
199
|
+
# Aggregate MetricRecords
|
200
|
+
metrics = self.train_metrics_aggr_fn(
|
201
|
+
reply_contents,
|
202
|
+
self.weighted_by_key,
|
203
|
+
)
|
204
|
+
return arrays, metrics
|
205
|
+
|
206
|
+
def configure_evaluate(
|
207
|
+
self, server_round: int, arrays: ArrayRecord, config: ConfigRecord, grid: Grid
|
208
|
+
) -> Iterable[Message]:
|
209
|
+
"""Configure the next round of federated evaluation."""
|
210
|
+
# Sample one node
|
211
|
+
sampled_node_id = self._make_sampling(grid, server_round, "configure_evaluate")
|
212
|
+
|
213
|
+
# Always inject current server round
|
214
|
+
config["server-round"] = server_round
|
215
|
+
|
216
|
+
# Construct messages
|
217
|
+
record = RecordDict(
|
218
|
+
{self.arrayrecord_key: arrays, self.configrecord_key: config}
|
219
|
+
)
|
220
|
+
return self._construct_messages(record, sampled_node_id, MessageType.EVALUATE)
|
@@ -17,7 +17,9 @@
|
|
17
17
|
|
18
18
|
import argparse
|
19
19
|
from logging import INFO
|
20
|
-
from typing import Optional
|
20
|
+
from typing import Any, Optional
|
21
|
+
|
22
|
+
import yaml
|
21
23
|
|
22
24
|
from flwr.common import EventType, event
|
23
25
|
from flwr.common.constant import ExecPluginType
|
@@ -26,6 +28,7 @@ from flwr.common.logger import log
|
|
26
28
|
from flwr.proto.clientappio_pb2_grpc import ClientAppIoStub
|
27
29
|
from flwr.proto.serverappio_pb2_grpc import ServerAppIoStub
|
28
30
|
from flwr.proto.simulationio_pb2_grpc import SimulationIoStub
|
31
|
+
from flwr.supercore.constant import EXEC_PLUGIN_SECTION
|
29
32
|
from flwr.supercore.grpc_health import add_args_health
|
30
33
|
from flwr.supercore.superexec.plugin import (
|
31
34
|
ClientAppExecPlugin,
|
@@ -36,6 +39,7 @@ from flwr.supercore.superexec.plugin import (
|
|
36
39
|
from flwr.supercore.superexec.run_superexec import run_superexec
|
37
40
|
|
38
41
|
try:
|
42
|
+
from flwr.ee import add_ee_args_superexec
|
39
43
|
from flwr.ee.constant import ExecEePluginType
|
40
44
|
from flwr.ee.exec_plugin import get_ee_plugin_and_stub_class
|
41
45
|
except ImportError:
|
@@ -54,6 +58,10 @@ except ImportError:
|
|
54
58
|
"""Get the EE plugin class and stub class based on the plugin type."""
|
55
59
|
return None
|
56
60
|
|
61
|
+
# pylint: disable-next=unused-argument
|
62
|
+
def add_ee_args_superexec(parser: argparse.ArgumentParser) -> None:
|
63
|
+
"""Add EE-specific arguments to the parser."""
|
64
|
+
|
57
65
|
|
58
66
|
def flower_superexec() -> None:
|
59
67
|
"""Run `flower-superexec` command."""
|
@@ -70,12 +78,28 @@ def flower_superexec() -> None:
|
|
70
78
|
# Trigger telemetry event
|
71
79
|
event(EventType.RUN_SUPEREXEC_ENTER, {"plugin_type": args.plugin_type})
|
72
80
|
|
81
|
+
# Load plugin config from YAML file if provided
|
82
|
+
plugin_config = None
|
83
|
+
if plugin_config_path := getattr(args, "plugin_config", None):
|
84
|
+
try:
|
85
|
+
with open(plugin_config_path, encoding="utf-8") as file:
|
86
|
+
yaml_config: Optional[dict[str, Any]] = yaml.safe_load(file)
|
87
|
+
if yaml_config is None or EXEC_PLUGIN_SECTION not in yaml_config:
|
88
|
+
raise ValueError(f"Missing '{EXEC_PLUGIN_SECTION}' section.")
|
89
|
+
plugin_config = yaml_config[EXEC_PLUGIN_SECTION]
|
90
|
+
except (FileNotFoundError, yaml.YAMLError, ValueError) as e:
|
91
|
+
flwr_exit(
|
92
|
+
ExitCode.SUPEREXEC_INVALID_PLUGIN_CONFIG,
|
93
|
+
f"Failed to load plugin config from '{plugin_config_path}': {e!r}",
|
94
|
+
)
|
95
|
+
|
73
96
|
# Get the plugin class and stub class based on the plugin type
|
74
97
|
plugin_class, stub_class = _get_plugin_and_stub_class(args.plugin_type)
|
75
98
|
run_superexec(
|
76
99
|
plugin_class=plugin_class,
|
77
100
|
stub_class=stub_class, # type: ignore
|
78
101
|
appio_api_address=args.appio_api_address,
|
102
|
+
plugin_config=plugin_config,
|
79
103
|
flwr_dir=args.flwr_dir,
|
80
104
|
parent_pid=args.parent_pid,
|
81
105
|
health_server_address=args.health_server_address,
|
@@ -122,6 +146,7 @@ def _parse_args() -> argparse.ArgumentParser:
|
|
122
146
|
help="The PID of the parent process. When set, the process will terminate "
|
123
147
|
"when the parent process exits.",
|
124
148
|
)
|
149
|
+
add_ee_args_superexec(parser)
|
125
150
|
add_args_health(parser)
|
126
151
|
return parser
|
127
152
|
|
@@ -0,0 +1,19 @@
|
|
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
|
+
"""Constants for Flower infrastructure."""
|
16
|
+
|
17
|
+
|
18
|
+
# Top-level key in YAML config for exec plugin settings
|
19
|
+
EXEC_PLUGIN_SECTION = "exec_plugin"
|