flwr-nightly 1.21.0.dev20250807__tar.gz → 1.21.0.dev20250809__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.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/PKG-INFO +1 -1
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/constant.py +16 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/telemetry.py +4 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/serverapp/app.py +34 -10
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/superlink/linkstate/in_memory_linkstate.py +2 -2
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/superlink/linkstate/sqlite_linkstate.py +2 -2
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/superlink/serverappio/serverappio_servicer.py +43 -14
- flwr_nightly-1.21.0.dev20250809/py/flwr/supercore/app_utils.py +62 -0
- flwr_nightly-1.21.0.dev20250809/py/flwr/supercore/cli/__init__.py +22 -0
- flwr_nightly-1.21.0.dev20250809/py/flwr/supercore/cli/flower_superexec.py +91 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/supercore/corestate/corestate.py +3 -2
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/supercore/superexec/plugin/__init__.py +2 -0
- flwr_nightly-1.21.0.dev20250807/py/flwr/supercore/superexec/plugin/clientapp_exec_plugin.py → flwr_nightly-1.21.0.dev20250809/py/flwr/supercore/superexec/plugin/base_exec_plugin.py +9 -5
- flwr_nightly-1.21.0.dev20250809/py/flwr/supercore/superexec/plugin/clientapp_exec_plugin.py +28 -0
- flwr_nightly-1.21.0.dev20250809/py/flwr/supercore/superexec/plugin/serverapp_exec_plugin.py +28 -0
- flwr_nightly-1.21.0.dev20250809/py/flwr/supercore/superexec/run_superexec.py +113 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/supernode/nodestate/in_memory_nodestate.py +2 -2
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/supernode/runtime/run_clientapp.py +3 -38
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/supernode/servicer/clientappio/clientappio_servicer.py +2 -7
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/pyproject.toml +2 -1
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/README.md +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/__init__.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/app/__init__.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/app/error.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/app/metadata.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/__init__.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/app.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/auth_plugin/__init__.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/auth_plugin/oidc_cli_plugin.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/build.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/cli_user_auth_interceptor.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/config_utils.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/constant.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/example.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/install.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/log.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/login/__init__.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/login/login.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/ls.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/__init__.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/new.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/__init__.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/.gitignore.tpl +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/LICENSE.tpl +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/README.baseline.md.tpl +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/README.flowertune.md.tpl +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/README.md.tpl +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/__init__.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/code/__init__.baseline.py.tpl +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/code/client.baseline.py.tpl +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/code/client.huggingface.py.tpl +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/code/client.jax.py.tpl +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/code/client.mlx.py.tpl +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/code/client.numpy.py.tpl +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/code/dataset.baseline.py.tpl +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/code/flwr_tune/__init__.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/code/flwr_tune/client_app.py.tpl +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/code/flwr_tune/dataset.py.tpl +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/code/flwr_tune/models.py.tpl +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/code/flwr_tune/server_app.py.tpl +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/code/flwr_tune/strategy.py.tpl +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/code/model.baseline.py.tpl +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/code/server.baseline.py.tpl +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/code/server.huggingface.py.tpl +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/code/server.jax.py.tpl +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/code/server.mlx.py.tpl +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/code/server.sklearn.py.tpl +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/code/strategy.baseline.py.tpl +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/code/task.huggingface.py.tpl +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/code/task.jax.py.tpl +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/code/task.mlx.py.tpl +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/code/task.numpy.py.tpl +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/code/task.sklearn.py.tpl +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/code/task.tensorflow.py.tpl +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/code/utils.baseline.py.tpl +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/pyproject.baseline.toml.tpl +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/pyproject.jax.toml.tpl +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/run/__init__.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/run/run.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/stop.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/utils.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/client/__init__.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/client/client.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/client/client_app.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/client/clientapp/__init__.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/client/clientapp/utils.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/client/dpfedavg_numpy_client.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/client/grpc_adapter_client/__init__.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/client/grpc_adapter_client/connection.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/client/grpc_rere_client/__init__.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/client/grpc_rere_client/client_interceptor.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/client/grpc_rere_client/connection.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/client/grpc_rere_client/grpc_adapter.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/client/message_handler/__init__.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/client/message_handler/message_handler.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/client/mod/__init__.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/client/mod/centraldp_mods.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/client/mod/comms_mods.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/client/mod/localdp_mod.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/client/mod/utils.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/client/numpy_client.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/client/rest_client/__init__.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/client/rest_client/connection.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/client/run_info_store.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/client/typing.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/clientapp/__init__.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/__init__.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/address.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/args.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/auth_plugin/__init__.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/auth_plugin/auth_plugin.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/config.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/context.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/date.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/differential_privacy.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/differential_privacy_constants.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/dp.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/event_log_plugin/__init__.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/event_log_plugin/event_log_plugin.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/exit/__init__.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/exit/exit.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/exit/exit_code.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/exit_handlers.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/grpc.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/heartbeat.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/inflatable.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/inflatable_protobuf_utils.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/inflatable_utils.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/logger.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/message.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/object_ref.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/parameter.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/pyproject.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/record/__init__.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/record/array.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/record/arraychunk.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/record/arrayrecord.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/record/configrecord.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/record/conversion_utils.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/record/metricrecord.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/record/recorddict.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/record/typeddict.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/recorddict_compat.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/retry_invoker.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/secure_aggregation/quantization.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/serde.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/serde_utils.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/typing.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/version.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/compat/__init__.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/compat/client/__init__.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/compat/client/app.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/compat/client/grpc_client/__init__.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/compat/client/grpc_client/connection.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/compat/common/__init__.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/compat/server/__init__.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/compat/server/app.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/compat/simulation/__init__.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/__init__.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/appio_pb2.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/appio_pb2.pyi +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/appio_pb2_grpc.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/appio_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/clientappio_pb2.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/clientappio_pb2.pyi +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/clientappio_pb2_grpc.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/clientappio_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/control_pb2.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/control_pb2.pyi +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/control_pb2_grpc.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/control_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/error_pb2.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/error_pb2.pyi +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/error_pb2_grpc.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/error_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/fab_pb2.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/fab_pb2.pyi +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/fab_pb2_grpc.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/fab_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/fleet_pb2.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/fleet_pb2.pyi +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/fleet_pb2_grpc.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/grpcadapter_pb2.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/grpcadapter_pb2.pyi +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/grpcadapter_pb2_grpc.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/grpcadapter_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/heartbeat_pb2.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/heartbeat_pb2.pyi +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/heartbeat_pb2_grpc.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/heartbeat_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/log_pb2.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/log_pb2.pyi +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/log_pb2_grpc.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/log_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/message_pb2.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/message_pb2.pyi +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/message_pb2_grpc.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/message_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/node_pb2.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/node_pb2.pyi +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/node_pb2_grpc.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/node_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/recorddict_pb2.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/recorddict_pb2.pyi +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/recorddict_pb2_grpc.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/recorddict_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/run_pb2.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/run_pb2.pyi +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/run_pb2_grpc.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/run_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/serverappio_pb2.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/serverappio_pb2.pyi +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/serverappio_pb2_grpc.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/serverappio_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/simulationio_pb2.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/simulationio_pb2.pyi +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/simulationio_pb2_grpc.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/simulationio_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/transport_pb2.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/transport_pb2.pyi +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/transport_pb2_grpc.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/py.typed +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/__init__.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/app.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/client_manager.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/client_proxy.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/compat/__init__.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/compat/app.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/compat/app_utils.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/compat/grid_client_proxy.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/compat/legacy_context.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/criterion.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/fleet_event_log_interceptor.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/grid/__init__.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/grid/grid.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/grid/grpc_grid.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/grid/inmemory_grid.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/history.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/run_serverapp.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/server.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/server_app.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/server_config.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/serverapp/__init__.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/serverapp_components.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/strategy/__init__.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/strategy/aggregate.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/strategy/bulyan.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/strategy/fedadagrad.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/strategy/fedadam.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/strategy/fedavg.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/strategy/fedavg_android.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/strategy/fedavgm.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/strategy/fedmedian.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/strategy/fedopt.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/strategy/fedprox.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/strategy/fedyogi.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/strategy/krum.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/strategy/qfedavg.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/strategy/strategy.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/superlink/__init__.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/superlink/fleet/__init__.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/superlink/fleet/grpc_adapter/__init__.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/superlink/fleet/message_handler/message_handler.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/superlink/fleet/vce/vce_api.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/superlink/linkstate/__init__.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/superlink/linkstate/linkstate.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/superlink/linkstate/linkstate_factory.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/superlink/linkstate/utils.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/superlink/serverappio/__init__.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/superlink/serverappio/serverappio_grpc.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/superlink/simulation/__init__.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/superlink/simulation/simulationio_grpc.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/superlink/simulation/simulationio_servicer.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/superlink/utils.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/typing.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/utils/__init__.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/utils/tensorboard.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/utils/validator.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/workflow/__init__.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/workflow/constant.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/workflow/default_workflows.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/serverapp/__init__.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/simulation/__init__.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/simulation/app.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/simulation/legacy_app.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/simulation/ray_transport/__init__.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/simulation/ray_transport/utils.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/simulation/run_simulation.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/simulation/simulationio_connection.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/supercore/__init__.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/supercore/corestate/__init__.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/supercore/ffs/__init__.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/supercore/ffs/disk_ffs.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/supercore/ffs/ffs.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/supercore/ffs/ffs_factory.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/supercore/grpc_health/__init__.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/supercore/grpc_health/simple_health_servicer.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/supercore/license_plugin/__init__.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/supercore/license_plugin/license_plugin.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/supercore/object_store/__init__.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/supercore/object_store/in_memory_object_store.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/supercore/object_store/object_store.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/supercore/object_store/object_store_factory.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/supercore/object_store/utils.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/supercore/superexec/__init__.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/supercore/superexec/plugin/exec_plugin.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/supercore/utils.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/superexec/__init__.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/superexec/deployment.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/superexec/simulation.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/superlink/__init__.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/superlink/executor/__init__.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/superlink/executor/app.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/superlink/executor/deployment.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/superlink/executor/executor.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/superlink/executor/simulation.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/superlink/servicer/__init__.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/superlink/servicer/control/__init__.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/superlink/servicer/control/control_event_log_interceptor.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/superlink/servicer/control/control_grpc.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/superlink/servicer/control/control_license_interceptor.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/superlink/servicer/control/control_servicer.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/superlink/servicer/control/control_user_auth_interceptor.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/supernode/__init__.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/supernode/cli/__init__.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/supernode/cli/flower_supernode.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/supernode/cli/flwr_clientapp.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/supernode/nodestate/__init__.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/supernode/nodestate/nodestate.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/supernode/nodestate/nodestate_factory.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/supernode/runtime/__init__.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/supernode/servicer/__init__.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/supernode/servicer/clientappio/__init__.py +0 -0
- {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/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.21.0.
|
3
|
+
Version: 1.21.0.dev20250809
|
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
|
{flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/constant.py
RENAMED
@@ -259,3 +259,19 @@ class EventLogWriterType:
|
|
259
259
|
def __new__(cls) -> EventLogWriterType:
|
260
260
|
"""Prevent instantiation."""
|
261
261
|
raise TypeError(f"{cls.__name__} cannot be instantiated.")
|
262
|
+
|
263
|
+
|
264
|
+
class ExecPluginType:
|
265
|
+
"""SuperExec plugin types."""
|
266
|
+
|
267
|
+
CLIENT_APP = "clientapp"
|
268
|
+
|
269
|
+
def __new__(cls) -> ExecPluginType:
|
270
|
+
"""Prevent instantiation."""
|
271
|
+
raise TypeError(f"{cls.__name__} cannot be instantiated.")
|
272
|
+
|
273
|
+
@staticmethod
|
274
|
+
def all() -> list[str]:
|
275
|
+
"""Return all SuperExec plugin types."""
|
276
|
+
# Filter all constants (uppercase) of the class
|
277
|
+
return [v for k, v in vars(ExecPluginType).items() if k.isupper()]
|
{flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/telemetry.py
RENAMED
@@ -181,6 +181,10 @@ class EventType(str, Enum):
|
|
181
181
|
RUN_SUPERNODE_ENTER = auto()
|
182
182
|
RUN_SUPERNODE_LEAVE = auto()
|
183
183
|
|
184
|
+
# CLI: `flower-superexec`
|
185
|
+
RUN_SUPEREXEC_ENTER = auto()
|
186
|
+
RUN_SUPEREXEC_LEAVE = auto()
|
187
|
+
|
184
188
|
|
185
189
|
# Use the ThreadPoolExecutor with max_workers=1 to have a queue
|
186
190
|
# and also ensure that telemetry calls are not blocking.
|
{flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/serverapp/app.py
RENAMED
@@ -20,7 +20,6 @@ import gc
|
|
20
20
|
from logging import DEBUG, ERROR, INFO
|
21
21
|
from pathlib import Path
|
22
22
|
from queue import Queue
|
23
|
-
from time import sleep
|
24
23
|
from typing import Optional
|
25
24
|
|
26
25
|
from flwr.cli.config_utils import get_fab_metadata
|
@@ -64,6 +63,7 @@ from flwr.proto.appio_pb2 import ( # pylint: disable=E0611
|
|
64
63
|
from flwr.proto.run_pb2 import UpdateRunStatusRequest # pylint: disable=E0611
|
65
64
|
from flwr.server.grid.grpc_grid import GrpcGrid
|
66
65
|
from flwr.server.run_serverapp import run as run_
|
66
|
+
from flwr.supercore.app_utils import simple_get_token, start_parent_process_monitor
|
67
67
|
|
68
68
|
|
69
69
|
def flwr_serverapp() -> None:
|
@@ -91,23 +91,31 @@ def flwr_serverapp() -> None:
|
|
91
91
|
run_serverapp(
|
92
92
|
serverappio_api_address=args.serverappio_api_address,
|
93
93
|
log_queue=log_queue,
|
94
|
+
token=args.token,
|
94
95
|
run_once=args.run_once,
|
95
96
|
flwr_dir=args.flwr_dir,
|
96
97
|
certificates=None,
|
98
|
+
parent_pid=args.parent_pid,
|
97
99
|
)
|
98
100
|
|
99
101
|
# Restore stdout/stderr
|
100
102
|
restore_output()
|
101
103
|
|
102
104
|
|
103
|
-
def run_serverapp( # pylint: disable=R0914,
|
105
|
+
def run_serverapp( # pylint: disable=R0913, R0914, R0915, R0917, W0212
|
104
106
|
serverappio_api_address: str,
|
105
107
|
log_queue: Queue[Optional[str]],
|
106
108
|
run_once: bool,
|
109
|
+
token: Optional[str] = None,
|
107
110
|
flwr_dir: Optional[str] = None,
|
108
111
|
certificates: Optional[bytes] = None,
|
112
|
+
parent_pid: Optional[int] = None,
|
109
113
|
) -> None:
|
110
114
|
"""Run Flower ServerApp process."""
|
115
|
+
# Monitor the main process in case of SIGKILL
|
116
|
+
if parent_pid is not None:
|
117
|
+
start_parent_process_monitor(parent_pid)
|
118
|
+
|
111
119
|
# Resolve directory where FABs are installed
|
112
120
|
flwr_dir_ = get_flwr_dir(flwr_dir)
|
113
121
|
log_uploader = None
|
@@ -126,15 +134,15 @@ def run_serverapp( # pylint: disable=R0914, disable=W0212, disable=R0915
|
|
126
134
|
root_certificates=certificates,
|
127
135
|
)
|
128
136
|
|
137
|
+
# If token is not set, loop until token is received from SuperLink
|
138
|
+
if token is None:
|
139
|
+
log(DEBUG, "[flwr-serverapp] Request token")
|
140
|
+
token = simple_get_token(grid._stub)
|
141
|
+
|
129
142
|
# Pull ServerAppInputs from LinkState
|
130
|
-
req = PullAppInputsRequest()
|
143
|
+
req = PullAppInputsRequest(token=token)
|
131
144
|
log(DEBUG, "[flwr-serverapp] Pull ServerAppInputs")
|
132
145
|
res: PullAppInputsResponse = grid._stub.PullAppInputs(req)
|
133
|
-
if not res.HasField("run"):
|
134
|
-
sleep(3)
|
135
|
-
run_status = None
|
136
|
-
continue
|
137
|
-
|
138
146
|
context = context_from_proto(res.context)
|
139
147
|
run = run_from_proto(res.run)
|
140
148
|
fab = fab_from_proto(res.fab)
|
@@ -209,7 +217,9 @@ def run_serverapp( # pylint: disable=R0914, disable=W0212, disable=R0915
|
|
209
217
|
# Send resulting context
|
210
218
|
context_proto = context_to_proto(updated_context)
|
211
219
|
log(DEBUG, "[flwr-serverapp] Will push ServerAppOutputs")
|
212
|
-
out_req = PushAppOutputsRequest(
|
220
|
+
out_req = PushAppOutputsRequest(
|
221
|
+
token=token, run_id=run.run_id, context=context_proto
|
222
|
+
)
|
213
223
|
_ = grid._stub.PushAppOutputs(out_req)
|
214
224
|
|
215
225
|
run_status = RunStatus(Status.FINISHED, SubStatus.COMPLETED, "")
|
@@ -250,8 +260,9 @@ def run_serverapp( # pylint: disable=R0914, disable=W0212, disable=R0915
|
|
250
260
|
if grid:
|
251
261
|
grid.close()
|
252
262
|
|
253
|
-
# Clean up the Context
|
263
|
+
# Clean up the Context and the token
|
254
264
|
context = None
|
265
|
+
token = None
|
255
266
|
gc.collect()
|
256
267
|
|
257
268
|
event(
|
@@ -276,6 +287,19 @@ def _parse_args_run_flwr_serverapp() -> argparse.ArgumentParser:
|
|
276
287
|
help="Address of SuperLink's ServerAppIo API (IPv4, IPv6, or a domain name)."
|
277
288
|
f"By default, it is set to {SERVERAPPIO_API_DEFAULT_CLIENT_ADDRESS}.",
|
278
289
|
)
|
290
|
+
parser.add_argument(
|
291
|
+
"--token",
|
292
|
+
type=str,
|
293
|
+
required=False,
|
294
|
+
help="Unique token generated by SuperNode for each ServerApp execution",
|
295
|
+
)
|
296
|
+
parser.add_argument(
|
297
|
+
"--parent-pid",
|
298
|
+
type=int,
|
299
|
+
default=None,
|
300
|
+
help="The PID of the parent process. When set, the process will terminate "
|
301
|
+
"when the parent process exits.",
|
302
|
+
)
|
279
303
|
parser.add_argument(
|
280
304
|
"--run-once",
|
281
305
|
action="store_true",
|
@@ -686,12 +686,12 @@ class InMemoryLinkState(LinkState): # pylint: disable=R0902,R0904
|
|
686
686
|
latest_timestamp = run.logs[-1][0] if index < len(run.logs) else 0.0
|
687
687
|
return "".join(log for _, log in run.logs[index:]), latest_timestamp
|
688
688
|
|
689
|
-
def create_token(self, run_id: int) -> str:
|
689
|
+
def create_token(self, run_id: int) -> Optional[str]:
|
690
690
|
"""Create a token for the given run ID."""
|
691
691
|
token = secrets.token_hex(FLWR_APP_TOKEN_LENGTH) # Generate a random token
|
692
692
|
with self.lock_token_store:
|
693
693
|
if run_id in self.token_store:
|
694
|
-
|
694
|
+
return None # Token already created for this run ID
|
695
695
|
self.token_store[run_id] = token
|
696
696
|
self.token_to_run_id[token] = run_id
|
697
697
|
return token
|
@@ -1148,7 +1148,7 @@ class SqliteLinkState(LinkState): # pylint: disable=R0904
|
|
1148
1148
|
|
1149
1149
|
return message_ins
|
1150
1150
|
|
1151
|
-
def create_token(self, run_id: int) -> str:
|
1151
|
+
def create_token(self, run_id: int) -> Optional[str]:
|
1152
1152
|
"""Create a token for the given run ID."""
|
1153
1153
|
token = secrets.token_hex(FLWR_APP_TOKEN_LENGTH) # Generate a random token
|
1154
1154
|
query = "INSERT INTO token_store (run_id, token) VALUES (:run_id, :token);"
|
@@ -1156,7 +1156,7 @@ class SqliteLinkState(LinkState): # pylint: disable=R0904
|
|
1156
1156
|
try:
|
1157
1157
|
self.query(query, data)
|
1158
1158
|
except sqlite3.IntegrityError:
|
1159
|
-
|
1159
|
+
return None # Token already created for this run ID
|
1160
1160
|
return token
|
1161
1161
|
|
1162
1162
|
def verify_token(self, run_id: int, token: str) -> bool:
|
@@ -114,21 +114,35 @@ class ServerAppIoServicer(serverappio_pb2_grpc.ServerAppIoServicer):
|
|
114
114
|
context: grpc.ServicerContext,
|
115
115
|
) -> ListAppsToLaunchResponse:
|
116
116
|
"""Get run IDs with pending messages."""
|
117
|
-
log(DEBUG, "
|
117
|
+
log(DEBUG, "ServerAppIoServicer.ListAppsToLaunch")
|
118
118
|
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
119
|
+
# Initialize state connection
|
120
|
+
state = self.state_factory.state()
|
121
|
+
|
122
|
+
# Get IDs of runs in pending status
|
123
|
+
run_ids = state.get_run_ids(flwr_aid=None)
|
124
|
+
pending_run_ids = []
|
125
|
+
for run_id, status in state.get_run_status(run_ids).items():
|
126
|
+
if status.status == Status.PENDING:
|
127
|
+
pending_run_ids.append(run_id)
|
128
|
+
|
129
|
+
# Return run IDs
|
130
|
+
return ListAppsToLaunchResponse(run_ids=pending_run_ids)
|
123
131
|
|
124
132
|
def RequestToken(
|
125
133
|
self, request: RequestTokenRequest, context: grpc.ServicerContext
|
126
134
|
) -> RequestTokenResponse:
|
127
135
|
"""Request token."""
|
128
|
-
log(DEBUG, "
|
136
|
+
log(DEBUG, "ServerAppIoServicer.RequestToken")
|
137
|
+
|
138
|
+
# Initialize state connection
|
139
|
+
state = self.state_factory.state()
|
140
|
+
|
141
|
+
# Attempt to create a token for the provided run ID
|
142
|
+
token = state.create_token(request.run_id)
|
129
143
|
|
130
|
-
|
131
|
-
|
144
|
+
# Return the token
|
145
|
+
return RequestTokenResponse(token=token or "")
|
132
146
|
|
133
147
|
def GetNodes(
|
134
148
|
self, request: GetNodesRequest, context: grpc.ServicerContext
|
@@ -315,14 +329,11 @@ class ServerAppIoServicer(serverappio_pb2_grpc.ServerAppIoServicer):
|
|
315
329
|
# Init access to LinkState
|
316
330
|
state = self.state_factory.state()
|
317
331
|
|
332
|
+
# Validate the token
|
333
|
+
run_id = self._verify_token(request.token, context)
|
334
|
+
|
318
335
|
# Lock access to LinkState, preventing obtaining the same pending run_id
|
319
336
|
with self.lock:
|
320
|
-
# Attempt getting the run_id of a pending run
|
321
|
-
run_id = state.get_pending_run_id()
|
322
|
-
# If there's no pending run, return an empty response
|
323
|
-
if run_id is None:
|
324
|
-
return PullAppInputsResponse()
|
325
|
-
|
326
337
|
# Init access to Ffs
|
327
338
|
ffs = self.ffs_factory.ffs()
|
328
339
|
|
@@ -353,6 +364,9 @@ class ServerAppIoServicer(serverappio_pb2_grpc.ServerAppIoServicer):
|
|
353
364
|
"""Push ServerApp process outputs."""
|
354
365
|
log(DEBUG, "ServerAppIoServicer.PushAppOutputs")
|
355
366
|
|
367
|
+
# Validate the token
|
368
|
+
run_id = self._verify_token(request.token, context)
|
369
|
+
|
356
370
|
# Init state and store
|
357
371
|
state = self.state_factory.state()
|
358
372
|
store = self.objectstore_factory.store()
|
@@ -367,6 +381,9 @@ class ServerAppIoServicer(serverappio_pb2_grpc.ServerAppIoServicer):
|
|
367
381
|
)
|
368
382
|
|
369
383
|
state.set_serverapp_context(request.run_id, context_from_proto(request.context))
|
384
|
+
|
385
|
+
# Remove the token
|
386
|
+
state.delete_token(run_id)
|
370
387
|
return PushAppOutputsResponse()
|
371
388
|
|
372
389
|
def UpdateRunStatus(
|
@@ -534,6 +551,18 @@ class ServerAppIoServicer(serverappio_pb2_grpc.ServerAppIoServicer):
|
|
534
551
|
|
535
552
|
return ConfirmMessageReceivedResponse()
|
536
553
|
|
554
|
+
def _verify_token(self, token: str, context: grpc.ServicerContext) -> int:
|
555
|
+
"""Verify the token and return the associated run ID."""
|
556
|
+
state = self.state_factory.state()
|
557
|
+
run_id = state.get_run_id_by_token(token)
|
558
|
+
if run_id is None or not state.verify_token(run_id, token):
|
559
|
+
context.abort(
|
560
|
+
grpc.StatusCode.PERMISSION_DENIED,
|
561
|
+
"Invalid token.",
|
562
|
+
)
|
563
|
+
raise RuntimeError("This line should never be reached.")
|
564
|
+
return run_id
|
565
|
+
|
537
566
|
|
538
567
|
def _raise_if(validation_error: bool, request_name: str, detail: str) -> None:
|
539
568
|
"""Raise a `ValueError` with a detailed message if a validation error occurs."""
|
@@ -0,0 +1,62 @@
|
|
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
|
+
"""Utility functions for app processes."""
|
16
|
+
|
17
|
+
|
18
|
+
import os
|
19
|
+
import threading
|
20
|
+
import time
|
21
|
+
from typing import Union
|
22
|
+
|
23
|
+
from flwr.proto.appio_pb2 import ( # pylint: disable=E0611
|
24
|
+
ListAppsToLaunchRequest,
|
25
|
+
ListAppsToLaunchResponse,
|
26
|
+
RequestTokenRequest,
|
27
|
+
RequestTokenResponse,
|
28
|
+
)
|
29
|
+
from flwr.proto.clientappio_pb2_grpc import ClientAppIoStub
|
30
|
+
from flwr.proto.serverappio_pb2_grpc import ServerAppIoStub
|
31
|
+
|
32
|
+
|
33
|
+
def start_parent_process_monitor(
|
34
|
+
parent_pid: int,
|
35
|
+
) -> None:
|
36
|
+
"""Monitor the parent process and exit if it terminates."""
|
37
|
+
|
38
|
+
def monitor() -> None:
|
39
|
+
while True:
|
40
|
+
time.sleep(0.2)
|
41
|
+
if os.getppid() != parent_pid:
|
42
|
+
os.kill(os.getpid(), 9)
|
43
|
+
|
44
|
+
threading.Thread(target=monitor, daemon=True).start()
|
45
|
+
|
46
|
+
|
47
|
+
def simple_get_token(stub: Union[ClientAppIoStub, ServerAppIoStub]) -> str:
|
48
|
+
"""Get a token from SuperLink/SuperNode.
|
49
|
+
|
50
|
+
This shall be removed once the SuperExec is fully implemented.
|
51
|
+
"""
|
52
|
+
while True:
|
53
|
+
res: ListAppsToLaunchResponse = stub.ListAppsToLaunch(ListAppsToLaunchRequest())
|
54
|
+
|
55
|
+
for run_id in res.run_ids:
|
56
|
+
tk_res: RequestTokenResponse = stub.RequestToken(
|
57
|
+
RequestTokenRequest(run_id=run_id)
|
58
|
+
)
|
59
|
+
if tk_res.token:
|
60
|
+
return tk_res.token
|
61
|
+
|
62
|
+
time.sleep(1) # Wait before retrying to get run IDs
|
@@ -0,0 +1,22 @@
|
|
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 command line interface for shared infrastructure components."""
|
16
|
+
|
17
|
+
|
18
|
+
from .flower_superexec import flower_superexec
|
19
|
+
|
20
|
+
__all__ = [
|
21
|
+
"flower_superexec",
|
22
|
+
]
|
@@ -0,0 +1,91 @@
|
|
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-superexec` command."""
|
16
|
+
|
17
|
+
|
18
|
+
import argparse
|
19
|
+
from logging import INFO
|
20
|
+
|
21
|
+
from flwr.common import EventType, event
|
22
|
+
from flwr.common.constant import ExecPluginType
|
23
|
+
from flwr.common.logger import log
|
24
|
+
from flwr.proto.clientappio_pb2_grpc import ClientAppIoStub
|
25
|
+
from flwr.supercore.superexec.plugin import ClientAppExecPlugin, ExecPlugin
|
26
|
+
from flwr.supercore.superexec.run_superexec import run_superexec
|
27
|
+
|
28
|
+
|
29
|
+
def flower_superexec() -> None:
|
30
|
+
"""Run `flower-superexec` command."""
|
31
|
+
args = _parse_args().parse_args()
|
32
|
+
|
33
|
+
# Log the first message after parsing arguments in case of `--help`
|
34
|
+
log(INFO, "Starting Flower SuperExec")
|
35
|
+
|
36
|
+
# Trigger telemetry event
|
37
|
+
event(EventType.RUN_SUPEREXEC_ENTER, {"plugin_type": args.plugin_type})
|
38
|
+
|
39
|
+
# Get the plugin class and stub class based on the plugin type
|
40
|
+
plugin_class, stub_class = _get_plugin_and_stub_class(args.plugin_type)
|
41
|
+
run_superexec(
|
42
|
+
plugin_class=plugin_class,
|
43
|
+
stub_class=stub_class, # type: ignore
|
44
|
+
appio_api_address=args.appio_api_address,
|
45
|
+
flwr_dir=args.flwr_dir,
|
46
|
+
)
|
47
|
+
|
48
|
+
|
49
|
+
def _parse_args() -> argparse.ArgumentParser:
|
50
|
+
"""Parse `flower-superexec` command line arguments."""
|
51
|
+
parser = argparse.ArgumentParser(
|
52
|
+
description="Run Flower SuperExec.",
|
53
|
+
)
|
54
|
+
parser.add_argument(
|
55
|
+
"--appio-api-address", type=str, required=True, help="Address of the AppIO API"
|
56
|
+
)
|
57
|
+
parser.add_argument(
|
58
|
+
"--plugin-type",
|
59
|
+
type=str,
|
60
|
+
choices=ExecPluginType.all(),
|
61
|
+
required=True,
|
62
|
+
help="The type of plugin to use.",
|
63
|
+
)
|
64
|
+
parser.add_argument(
|
65
|
+
"--insecure",
|
66
|
+
action="store_true",
|
67
|
+
help="Connect to the AppIO API without TLS. "
|
68
|
+
"Data transmitted between the client and server is not encrypted. "
|
69
|
+
"Use this flag only if you understand the risks.",
|
70
|
+
)
|
71
|
+
parser.add_argument(
|
72
|
+
"--flwr-dir",
|
73
|
+
default=None,
|
74
|
+
help="""The path containing installed Flower Apps.
|
75
|
+
By default, this value is equal to:
|
76
|
+
|
77
|
+
- `$FLWR_HOME/` if `$FLWR_HOME` is defined
|
78
|
+
- `$XDG_DATA_HOME/.flwr/` if `$XDG_DATA_HOME` is defined
|
79
|
+
- `$HOME/.flwr/` in all other cases
|
80
|
+
""",
|
81
|
+
)
|
82
|
+
return parser
|
83
|
+
|
84
|
+
|
85
|
+
def _get_plugin_and_stub_class(
|
86
|
+
plugin_type: str,
|
87
|
+
) -> tuple[type[ExecPlugin], type[object]]:
|
88
|
+
"""Get the plugin class and stub class based on the plugin type."""
|
89
|
+
if plugin_type == ExecPluginType.CLIENT_APP:
|
90
|
+
return ClientAppExecPlugin, ClientAppIoStub
|
91
|
+
raise ValueError(f"Unknown plugin type: {plugin_type}")
|
@@ -23,7 +23,7 @@ class CoreState(ABC):
|
|
23
23
|
"""Abstract base class for core state."""
|
24
24
|
|
25
25
|
@abstractmethod
|
26
|
-
def create_token(self, run_id: int) -> str:
|
26
|
+
def create_token(self, run_id: int) -> Optional[str]:
|
27
27
|
"""Create a token for the given run ID.
|
28
28
|
|
29
29
|
Parameters
|
@@ -34,7 +34,8 @@ class CoreState(ABC):
|
|
34
34
|
Returns
|
35
35
|
-------
|
36
36
|
str
|
37
|
-
|
37
|
+
The newly generated token if one does not already exist
|
38
|
+
for the given run ID, otherwise None.
|
38
39
|
"""
|
39
40
|
|
40
41
|
@abstractmethod
|
@@ -12,7 +12,7 @@
|
|
12
12
|
# See the License for the specific language governing permissions and
|
13
13
|
# limitations under the License.
|
14
14
|
# ==============================================================================
|
15
|
-
"""Simple Flower SuperExec plugin for
|
15
|
+
"""Simple base Flower SuperExec plugin for app processes."""
|
16
16
|
|
17
17
|
|
18
18
|
import os
|
@@ -23,12 +23,16 @@ from typing import Optional
|
|
23
23
|
from .exec_plugin import ExecPlugin
|
24
24
|
|
25
25
|
|
26
|
-
class
|
27
|
-
"""Simple Flower SuperExec plugin for
|
26
|
+
class BaseExecPlugin(ExecPlugin):
|
27
|
+
"""Simple Flower SuperExec plugin for app processes.
|
28
28
|
|
29
29
|
The plugin always selects the first candidate run ID.
|
30
30
|
"""
|
31
31
|
|
32
|
+
# Placeholders to be defined in subclasses
|
33
|
+
command = ""
|
34
|
+
appio_api_address_arg = ""
|
35
|
+
|
32
36
|
def select_run_id(self, candidate_run_ids: Sequence[int]) -> Optional[int]:
|
33
37
|
"""Select a run ID to execute from a sequence of candidates."""
|
34
38
|
if not candidate_run_ids:
|
@@ -37,8 +41,8 @@ class ClientAppExecPlugin(ExecPlugin):
|
|
37
41
|
|
38
42
|
def launch_app(self, token: str, run_id: int) -> None:
|
39
43
|
"""Launch the application associated with a given run ID and token."""
|
40
|
-
cmds = [
|
41
|
-
cmds += [
|
44
|
+
cmds = [self.command, "--insecure"]
|
45
|
+
cmds += [self.appio_api_address_arg, self.appio_api_address]
|
42
46
|
cmds += ["--token", token]
|
43
47
|
cmds += ["--parent-pid", str(os.getpid())]
|
44
48
|
cmds += ["--flwr-dir", self.flwr_dir]
|
@@ -0,0 +1,28 @@
|
|
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
|
+
"""Simple Flower SuperExec plugin for ClientApp."""
|
16
|
+
|
17
|
+
|
18
|
+
from .base_exec_plugin import BaseExecPlugin
|
19
|
+
|
20
|
+
|
21
|
+
class ClientAppExecPlugin(BaseExecPlugin):
|
22
|
+
"""Simple Flower SuperExec plugin for ClientApp.
|
23
|
+
|
24
|
+
The plugin always selects the first candidate run ID.
|
25
|
+
"""
|
26
|
+
|
27
|
+
command = "flwr-clientapp"
|
28
|
+
appio_api_address_arg = "--clientappio-api-address"
|
@@ -0,0 +1,28 @@
|
|
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
|
+
"""Simple Flower SuperExec plugin for ServerApp."""
|
16
|
+
|
17
|
+
|
18
|
+
from .base_exec_plugin import BaseExecPlugin
|
19
|
+
|
20
|
+
|
21
|
+
class ServerAppExecPlugin(BaseExecPlugin):
|
22
|
+
"""Simple Flower SuperExec plugin for ServerApp.
|
23
|
+
|
24
|
+
The plugin always selects the first candidate run ID.
|
25
|
+
"""
|
26
|
+
|
27
|
+
command = "flwr-serverapp"
|
28
|
+
appio_api_address_arg = "--serverappio-api-address"
|