flwr-nightly 1.14.0.dev20241215__tar.gz → 1.14.0.dev20241217__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.
Potentially problematic release.
This version of flwr-nightly might be problematic. Click here for more details.
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/PKG-INFO +1 -1
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/pyproject.toml +1 -1
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/log.py +9 -7
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/login/login.py +1 -3
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/ls.py +25 -22
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/run/run.py +11 -18
- flwr_nightly-1.14.0.dev20241217/src/py/flwr/cli/stop.py +130 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/utils.py +26 -16
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/client/app.py +11 -1
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/client/client.py +0 -32
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/client/clientapp/app.py +3 -1
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/client/grpc_rere_client/connection.py +10 -4
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/client/message_handler/message_handler.py +0 -2
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/client/numpy_client.py +0 -44
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/common/logger.py +16 -1
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/common/retry_invoker.py +3 -1
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/app.py +7 -8
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/superlink/driver/serverappio_servicer.py +9 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/superlink/fleet/message_handler/message_handler.py +1 -3
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/superlink/linkstate/sqlite_linkstate.py +0 -2
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/superlink/simulation/simulationio_servicer.py +13 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/simulation/app.py +3 -2
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/simulation/run_simulation.py +27 -21
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/simulation/simulationio_connection.py +3 -0
- flwr_nightly-1.14.0.dev20241215/src/py/flwr/cli/stop.py +0 -91
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/LICENSE +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/README.md +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/app.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/build.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/cli_user_auth_interceptor.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/config_utils.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/example.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/install.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/login/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/new.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/.gitignore.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/LICENSE.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/README.baseline.md.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/README.flowertune.md.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/README.md.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/code/__init__.baseline.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/code/client.baseline.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/code/client.huggingface.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/code/client.jax.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/code/client.mlx.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/code/client.numpy.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/code/dataset.baseline.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/code/flwr_tune/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/code/flwr_tune/client_app.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/code/flwr_tune/dataset.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/code/flwr_tune/models.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/code/flwr_tune/server_app.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/code/flwr_tune/strategy.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/code/model.baseline.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/code/server.baseline.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/code/server.huggingface.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/code/server.jax.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/code/server.mlx.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/code/server.sklearn.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/code/strategy.baseline.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/code/task.huggingface.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/code/task.jax.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/code/task.mlx.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/code/task.numpy.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/code/task.sklearn.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/code/task.tensorflow.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/code/utils.baseline.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/pyproject.baseline.toml.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/pyproject.jax.toml.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/run/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/client/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/client/client_app.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/client/clientapp/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/client/clientapp/clientappio_servicer.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/client/clientapp/utils.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/client/dpfedavg_numpy_client.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/client/grpc_adapter_client/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/client/grpc_adapter_client/connection.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/client/grpc_client/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/client/grpc_client/connection.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/client/grpc_rere_client/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/client/grpc_rere_client/client_interceptor.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/client/grpc_rere_client/grpc_adapter.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/client/heartbeat.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/client/message_handler/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/client/message_handler/task_handler.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/client/mod/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/client/mod/centraldp_mods.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/client/mod/comms_mods.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/client/mod/localdp_mod.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/client/mod/utils.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/client/nodestate/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/client/nodestate/in_memory_nodestate.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/client/nodestate/nodestate.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/client/nodestate/nodestate_factory.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/client/rest_client/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/client/rest_client/connection.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/client/run_info_store.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/client/supernode/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/client/supernode/app.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/client/typing.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/common/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/common/address.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/common/args.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/common/auth_plugin/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/common/auth_plugin/auth_plugin.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/common/config.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/common/constant.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/common/context.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/common/date.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/common/differential_privacy.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/common/differential_privacy_constants.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/common/dp.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/common/exit_handlers.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/common/grpc.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/common/message.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/common/object_ref.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/common/parameter.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/common/pyproject.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/common/record/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/common/record/configsrecord.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/common/record/conversion_utils.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/common/record/metricsrecord.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/common/record/parametersrecord.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/common/record/recordset.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/common/record/typeddict.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/common/recordset_compat.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/common/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/common/secure_aggregation/quantization.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/common/serde.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/common/telemetry.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/common/typing.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/common/version.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/clientappio_pb2.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/clientappio_pb2.pyi +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/clientappio_pb2_grpc.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/clientappio_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/error_pb2.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/error_pb2.pyi +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/error_pb2_grpc.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/error_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/exec_pb2.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/exec_pb2.pyi +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/exec_pb2_grpc.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/exec_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/fab_pb2.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/fab_pb2.pyi +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/fab_pb2_grpc.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/fab_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/fleet_pb2.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/fleet_pb2.pyi +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/fleet_pb2_grpc.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/grpcadapter_pb2.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/grpcadapter_pb2.pyi +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/grpcadapter_pb2_grpc.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/grpcadapter_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/log_pb2.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/log_pb2.pyi +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/log_pb2_grpc.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/log_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/message_pb2.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/message_pb2.pyi +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/message_pb2_grpc.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/message_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/node_pb2.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/node_pb2.pyi +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/node_pb2_grpc.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/node_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/recordset_pb2.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/recordset_pb2.pyi +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/recordset_pb2_grpc.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/recordset_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/run_pb2.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/run_pb2.pyi +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/run_pb2_grpc.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/run_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/serverappio_pb2.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/serverappio_pb2.pyi +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/serverappio_pb2_grpc.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/serverappio_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/simulationio_pb2.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/simulationio_pb2.pyi +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/simulationio_pb2_grpc.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/simulationio_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/task_pb2.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/task_pb2.pyi +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/task_pb2_grpc.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/task_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/transport_pb2.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/transport_pb2.pyi +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/transport_pb2_grpc.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/py.typed +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/client_manager.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/client_proxy.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/compat/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/compat/app.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/compat/app_utils.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/compat/driver_client_proxy.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/compat/legacy_context.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/criterion.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/driver/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/driver/driver.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/driver/grpc_driver.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/driver/inmemory_driver.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/history.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/run_serverapp.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/server.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/server_app.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/server_config.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/serverapp/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/serverapp/app.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/serverapp_components.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/strategy/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/strategy/aggregate.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/strategy/bulyan.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/strategy/fedadagrad.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/strategy/fedadam.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/strategy/fedavg.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/strategy/fedavg_android.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/strategy/fedavgm.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/strategy/fedmedian.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/strategy/fedopt.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/strategy/fedprox.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/strategy/fedyogi.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/strategy/krum.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/strategy/qfedavg.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/strategy/strategy.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/superlink/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/superlink/driver/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/superlink/driver/serverappio_grpc.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/superlink/ffs/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/superlink/ffs/disk_ffs.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/superlink/ffs/ffs.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/superlink/ffs/ffs_factory.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/superlink/fleet/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/superlink/fleet/grpc_adapter/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/superlink/fleet/vce/vce_api.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/superlink/linkstate/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/superlink/linkstate/in_memory_linkstate.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/superlink/linkstate/linkstate.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/superlink/linkstate/linkstate_factory.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/superlink/linkstate/utils.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/superlink/simulation/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/superlink/simulation/simulationio_grpc.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/superlink/utils.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/typing.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/utils/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/utils/tensorboard.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/utils/validator.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/workflow/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/workflow/constant.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/workflow/default_workflows.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/simulation/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/simulation/legacy_app.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/simulation/ray_transport/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/simulation/ray_transport/utils.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/superexec/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/superexec/app.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/superexec/deployment.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/superexec/exec_grpc.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/superexec/exec_servicer.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/superexec/exec_user_auth_interceptor.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/superexec/executor.py +0 -0
- {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/superexec/simulation.py +0 -0
|
@@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api"
|
|
|
4
4
|
|
|
5
5
|
[tool.poetry]
|
|
6
6
|
name = "flwr-nightly"
|
|
7
|
-
version = "1.14.0.
|
|
7
|
+
version = "1.14.0.dev20241217"
|
|
8
8
|
description = "Flower: A Friendly Federated AI Framework"
|
|
9
9
|
license = "Apache-2.0"
|
|
10
10
|
authors = ["The Flower Authors <hello@flower.ai>"]
|
|
@@ -34,7 +34,7 @@ from flwr.common.logger import log as logger
|
|
|
34
34
|
from flwr.proto.exec_pb2 import StreamLogsRequest # pylint: disable=E0611
|
|
35
35
|
from flwr.proto.exec_pb2_grpc import ExecStub
|
|
36
36
|
|
|
37
|
-
from .utils import init_channel, try_obtain_cli_auth_plugin
|
|
37
|
+
from .utils import init_channel, try_obtain_cli_auth_plugin, unauthenticated_exc_handler
|
|
38
38
|
|
|
39
39
|
|
|
40
40
|
def start_stream(
|
|
@@ -88,8 +88,9 @@ def stream_logs(
|
|
|
88
88
|
latest_timestamp = 0.0
|
|
89
89
|
res = None
|
|
90
90
|
try:
|
|
91
|
-
|
|
92
|
-
|
|
91
|
+
with unauthenticated_exc_handler():
|
|
92
|
+
for res in stub.StreamLogs(req, timeout=duration):
|
|
93
|
+
print(res.log_output, end="")
|
|
93
94
|
except grpc.RpcError as e:
|
|
94
95
|
# pylint: disable=E1101
|
|
95
96
|
if e.code() != grpc.StatusCode.DEADLINE_EXCEEDED:
|
|
@@ -109,9 +110,10 @@ def print_logs(run_id: int, channel: grpc.Channel, timeout: int) -> None:
|
|
|
109
110
|
try:
|
|
110
111
|
while True:
|
|
111
112
|
try:
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
113
|
+
with unauthenticated_exc_handler():
|
|
114
|
+
# Enforce timeout for graceful exit
|
|
115
|
+
for res in stub.StreamLogs(req, timeout=timeout):
|
|
116
|
+
print(res.log_output)
|
|
115
117
|
except grpc.RpcError as e:
|
|
116
118
|
# pylint: disable=E1101
|
|
117
119
|
if e.code() == grpc.StatusCode.DEADLINE_EXCEEDED:
|
|
@@ -170,7 +172,7 @@ def _log_with_exec_api(
|
|
|
170
172
|
run_id: int,
|
|
171
173
|
stream: bool,
|
|
172
174
|
) -> None:
|
|
173
|
-
auth_plugin = try_obtain_cli_auth_plugin(app, federation
|
|
175
|
+
auth_plugin = try_obtain_cli_auth_plugin(app, federation)
|
|
174
176
|
channel = init_channel(app, federation_config, auth_plugin)
|
|
175
177
|
|
|
176
178
|
if stream:
|
{flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/login/login.py
RENAMED
|
@@ -65,9 +65,7 @@ def login( # pylint: disable=R0914
|
|
|
65
65
|
|
|
66
66
|
# Get the auth plugin
|
|
67
67
|
auth_type = login_response.login_details.get(AUTH_TYPE)
|
|
68
|
-
auth_plugin = try_obtain_cli_auth_plugin(
|
|
69
|
-
app, federation, federation_config, auth_type
|
|
70
|
-
)
|
|
68
|
+
auth_plugin = try_obtain_cli_auth_plugin(app, federation, auth_type)
|
|
71
69
|
if auth_plugin is None:
|
|
72
70
|
typer.secho(
|
|
73
71
|
f'❌ Authentication type "{auth_type}" not found',
|
|
@@ -19,13 +19,12 @@ import io
|
|
|
19
19
|
import json
|
|
20
20
|
from datetime import datetime, timedelta
|
|
21
21
|
from pathlib import Path
|
|
22
|
-
from typing import Annotated, Optional
|
|
22
|
+
from typing import Annotated, Optional
|
|
23
23
|
|
|
24
24
|
import typer
|
|
25
25
|
from rich.console import Console
|
|
26
26
|
from rich.table import Table
|
|
27
27
|
from rich.text import Text
|
|
28
|
-
from typer import Exit
|
|
29
28
|
|
|
30
29
|
from flwr.cli.config_utils import (
|
|
31
30
|
exit_if_no_address,
|
|
@@ -35,7 +34,7 @@ from flwr.cli.config_utils import (
|
|
|
35
34
|
)
|
|
36
35
|
from flwr.common.constant import FAB_CONFIG_FILE, CliOutputFormat, SubStatus
|
|
37
36
|
from flwr.common.date import format_timedelta, isoformat8601_utc
|
|
38
|
-
from flwr.common.logger import
|
|
37
|
+
from flwr.common.logger import print_json_error, redirect_output, restore_output
|
|
39
38
|
from flwr.common.serde import run_from_proto
|
|
40
39
|
from flwr.common.typing import Run
|
|
41
40
|
from flwr.proto.exec_pb2 import ( # pylint: disable=E0611
|
|
@@ -44,7 +43,7 @@ from flwr.proto.exec_pb2 import ( # pylint: disable=E0611
|
|
|
44
43
|
)
|
|
45
44
|
from flwr.proto.exec_pb2_grpc import ExecStub
|
|
46
45
|
|
|
47
|
-
from .utils import init_channel, try_obtain_cli_auth_plugin
|
|
46
|
+
from .utils import init_channel, try_obtain_cli_auth_plugin, unauthenticated_exc_handler
|
|
48
47
|
|
|
49
48
|
_RunListType = tuple[int, str, str, str, str, str, str, str, str]
|
|
50
49
|
|
|
@@ -81,13 +80,25 @@ def ls( # pylint: disable=too-many-locals, too-many-branches
|
|
|
81
80
|
),
|
|
82
81
|
] = CliOutputFormat.DEFAULT,
|
|
83
82
|
) -> None:
|
|
84
|
-
"""List runs.
|
|
83
|
+
"""List the details of one provided run ID or all runs in a Flower federation.
|
|
84
|
+
|
|
85
|
+
The following details are displayed:
|
|
86
|
+
|
|
87
|
+
- **Run ID:** Unique identifier for the run.
|
|
88
|
+
- **FAB:** Name of the FAB associated with the run (``{FAB_ID} (v{FAB_VERSION})``).
|
|
89
|
+
- **Status:** Current status of the run (pending, starting, running, finished).
|
|
90
|
+
- **Elapsed:** Time elapsed since the run started (``HH:MM:SS``).
|
|
91
|
+
- **Created At:** Timestamp when the run was created.
|
|
92
|
+
- **Running At:** Timestamp when the run started running.
|
|
93
|
+
- **Finished At:** Timestamp when the run finished.
|
|
94
|
+
|
|
95
|
+
All timestamps follow ISO 8601, UTC and are formatted as ``YYYY-MM-DD HH:MM:SSZ``.
|
|
96
|
+
"""
|
|
85
97
|
suppress_output = output_format == CliOutputFormat.JSON
|
|
86
98
|
captured_output = io.StringIO()
|
|
87
99
|
try:
|
|
88
100
|
if suppress_output:
|
|
89
101
|
redirect_output(captured_output)
|
|
90
|
-
|
|
91
102
|
# Load and validate federation config
|
|
92
103
|
typer.secho("Loading project configuration... ", fg=typer.colors.BLUE)
|
|
93
104
|
|
|
@@ -104,7 +115,7 @@ def ls( # pylint: disable=too-many-locals, too-many-branches
|
|
|
104
115
|
raise ValueError(
|
|
105
116
|
"The options '--runs' and '--run-id' are mutually exclusive."
|
|
106
117
|
)
|
|
107
|
-
auth_plugin = try_obtain_cli_auth_plugin(app, federation
|
|
118
|
+
auth_plugin = try_obtain_cli_auth_plugin(app, federation)
|
|
108
119
|
channel = init_channel(app, federation_config, auth_plugin)
|
|
109
120
|
stub = ExecStub(channel)
|
|
110
121
|
|
|
@@ -120,6 +131,8 @@ def ls( # pylint: disable=too-many-locals, too-many-branches
|
|
|
120
131
|
_list_runs(stub, output_format)
|
|
121
132
|
|
|
122
133
|
except ValueError as err:
|
|
134
|
+
if suppress_output:
|
|
135
|
+
redirect_output(captured_output)
|
|
123
136
|
typer.secho(
|
|
124
137
|
f"❌ {err}",
|
|
125
138
|
fg=typer.colors.RED,
|
|
@@ -132,7 +145,7 @@ def ls( # pylint: disable=too-many-locals, too-many-branches
|
|
|
132
145
|
if suppress_output:
|
|
133
146
|
restore_output()
|
|
134
147
|
e_message = captured_output.getvalue()
|
|
135
|
-
|
|
148
|
+
print_json_error(e_message, err)
|
|
136
149
|
else:
|
|
137
150
|
typer.secho(
|
|
138
151
|
f"{err}",
|
|
@@ -283,7 +296,8 @@ def _list_runs(
|
|
|
283
296
|
output_format: str = CliOutputFormat.DEFAULT,
|
|
284
297
|
) -> None:
|
|
285
298
|
"""List all runs."""
|
|
286
|
-
|
|
299
|
+
with unauthenticated_exc_handler():
|
|
300
|
+
res: ListRunsResponse = stub.ListRuns(ListRunsRequest())
|
|
287
301
|
run_dict = {run_id: run_from_proto(proto) for run_id, proto in res.run_dict.items()}
|
|
288
302
|
|
|
289
303
|
formatted_runs = _format_runs(run_dict, res.now)
|
|
@@ -299,7 +313,8 @@ def _display_one_run(
|
|
|
299
313
|
output_format: str = CliOutputFormat.DEFAULT,
|
|
300
314
|
) -> None:
|
|
301
315
|
"""Display information about a specific run."""
|
|
302
|
-
|
|
316
|
+
with unauthenticated_exc_handler():
|
|
317
|
+
res: ListRunsResponse = stub.ListRuns(ListRunsRequest(run_id=run_id))
|
|
303
318
|
if not res.run_dict:
|
|
304
319
|
raise ValueError(f"Run ID {run_id} not found")
|
|
305
320
|
|
|
@@ -310,15 +325,3 @@ def _display_one_run(
|
|
|
310
325
|
Console().print_json(_to_json(formatted_runs))
|
|
311
326
|
else:
|
|
312
327
|
Console().print(_to_table(formatted_runs))
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
def _print_json_error(msg: str, e: Union[Exit, Exception]) -> None:
|
|
316
|
-
"""Print error message as JSON."""
|
|
317
|
-
Console().print_json(
|
|
318
|
-
json.dumps(
|
|
319
|
-
{
|
|
320
|
-
"success": False,
|
|
321
|
-
"error-message": remove_emojis(str(msg) + "\n" + str(e)),
|
|
322
|
-
}
|
|
323
|
-
)
|
|
324
|
-
)
|
{flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/run/run.py
RENAMED
|
@@ -19,7 +19,7 @@ import io
|
|
|
19
19
|
import json
|
|
20
20
|
import subprocess
|
|
21
21
|
from pathlib import Path
|
|
22
|
-
from typing import Annotated, Any, Optional
|
|
22
|
+
from typing import Annotated, Any, Optional
|
|
23
23
|
|
|
24
24
|
import typer
|
|
25
25
|
from rich.console import Console
|
|
@@ -37,7 +37,7 @@ from flwr.common.config import (
|
|
|
37
37
|
user_config_to_configsrecord,
|
|
38
38
|
)
|
|
39
39
|
from flwr.common.constant import CliOutputFormat
|
|
40
|
-
from flwr.common.logger import
|
|
40
|
+
from flwr.common.logger import print_json_error, redirect_output, restore_output
|
|
41
41
|
from flwr.common.serde import (
|
|
42
42
|
configs_record_to_proto,
|
|
43
43
|
fab_to_proto,
|
|
@@ -48,7 +48,11 @@ from flwr.proto.exec_pb2 import StartRunRequest # pylint: disable=E0611
|
|
|
48
48
|
from flwr.proto.exec_pb2_grpc import ExecStub
|
|
49
49
|
|
|
50
50
|
from ..log import start_stream
|
|
51
|
-
from ..utils import
|
|
51
|
+
from ..utils import (
|
|
52
|
+
init_channel,
|
|
53
|
+
try_obtain_cli_auth_plugin,
|
|
54
|
+
unauthenticated_exc_handler,
|
|
55
|
+
)
|
|
52
56
|
|
|
53
57
|
CONN_REFRESH_PERIOD = 60 # Connection refresh period for log streaming (seconds)
|
|
54
58
|
|
|
@@ -122,7 +126,7 @@ def run(
|
|
|
122
126
|
if suppress_output:
|
|
123
127
|
restore_output()
|
|
124
128
|
e_message = captured_output.getvalue()
|
|
125
|
-
|
|
129
|
+
print_json_error(e_message, err)
|
|
126
130
|
else:
|
|
127
131
|
typer.secho(
|
|
128
132
|
f"{err}",
|
|
@@ -144,7 +148,7 @@ def _run_with_exec_api(
|
|
|
144
148
|
stream: bool,
|
|
145
149
|
output_format: str,
|
|
146
150
|
) -> None:
|
|
147
|
-
auth_plugin = try_obtain_cli_auth_plugin(app, federation
|
|
151
|
+
auth_plugin = try_obtain_cli_auth_plugin(app, federation)
|
|
148
152
|
channel = init_channel(app, federation_config, auth_plugin)
|
|
149
153
|
stub = ExecStub(channel)
|
|
150
154
|
|
|
@@ -166,7 +170,8 @@ def _run_with_exec_api(
|
|
|
166
170
|
override_config=user_config_to_proto(parse_config_args(config_overrides)),
|
|
167
171
|
federation_options=configs_record_to_proto(c_record),
|
|
168
172
|
)
|
|
169
|
-
|
|
173
|
+
with unauthenticated_exc_handler():
|
|
174
|
+
res = stub.StartRun(req)
|
|
170
175
|
|
|
171
176
|
if res.HasField("run_id"):
|
|
172
177
|
typer.secho(f"🎊 Successfully started run {res.run_id}", fg=typer.colors.GREEN)
|
|
@@ -239,15 +244,3 @@ def _run_without_exec_api(
|
|
|
239
244
|
check=True,
|
|
240
245
|
text=True,
|
|
241
246
|
)
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
def _print_json_error(msg: str, e: Union[typer.Exit, Exception]) -> None:
|
|
245
|
-
"""Print error message as JSON."""
|
|
246
|
-
Console().print_json(
|
|
247
|
-
json.dumps(
|
|
248
|
-
{
|
|
249
|
-
"success": False,
|
|
250
|
-
"error-message": remove_emojis(str(msg) + "\n" + str(e)),
|
|
251
|
-
}
|
|
252
|
-
)
|
|
253
|
-
)
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
# Copyright 2024 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 `stop` command."""
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
import io
|
|
19
|
+
import json
|
|
20
|
+
from pathlib import Path
|
|
21
|
+
from typing import Annotated, Optional
|
|
22
|
+
|
|
23
|
+
import typer
|
|
24
|
+
from rich.console import Console
|
|
25
|
+
|
|
26
|
+
from flwr.cli.config_utils import (
|
|
27
|
+
exit_if_no_address,
|
|
28
|
+
load_and_validate,
|
|
29
|
+
process_loaded_project_config,
|
|
30
|
+
validate_federation_in_project_config,
|
|
31
|
+
)
|
|
32
|
+
from flwr.common.constant import FAB_CONFIG_FILE, CliOutputFormat
|
|
33
|
+
from flwr.common.logger import print_json_error, redirect_output, restore_output
|
|
34
|
+
from flwr.proto.exec_pb2 import StopRunRequest, StopRunResponse # pylint: disable=E0611
|
|
35
|
+
from flwr.proto.exec_pb2_grpc import ExecStub
|
|
36
|
+
|
|
37
|
+
from .utils import init_channel, try_obtain_cli_auth_plugin, unauthenticated_exc_handler
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def stop( # pylint: disable=R0914
|
|
41
|
+
run_id: Annotated[ # pylint: disable=unused-argument
|
|
42
|
+
int,
|
|
43
|
+
typer.Argument(help="The Flower run ID to stop"),
|
|
44
|
+
],
|
|
45
|
+
app: Annotated[
|
|
46
|
+
Path,
|
|
47
|
+
typer.Argument(help="Path of the Flower project"),
|
|
48
|
+
] = Path("."),
|
|
49
|
+
federation: Annotated[
|
|
50
|
+
Optional[str],
|
|
51
|
+
typer.Argument(help="Name of the federation"),
|
|
52
|
+
] = None,
|
|
53
|
+
output_format: Annotated[
|
|
54
|
+
str,
|
|
55
|
+
typer.Option(
|
|
56
|
+
"--format",
|
|
57
|
+
case_sensitive=False,
|
|
58
|
+
help="Format output using 'default' view or 'json'",
|
|
59
|
+
),
|
|
60
|
+
] = CliOutputFormat.DEFAULT,
|
|
61
|
+
) -> None:
|
|
62
|
+
"""Stop a run."""
|
|
63
|
+
suppress_output = output_format == CliOutputFormat.JSON
|
|
64
|
+
captured_output = io.StringIO()
|
|
65
|
+
try:
|
|
66
|
+
if suppress_output:
|
|
67
|
+
redirect_output(captured_output)
|
|
68
|
+
|
|
69
|
+
# Load and validate federation config
|
|
70
|
+
typer.secho("Loading project configuration... ", fg=typer.colors.BLUE)
|
|
71
|
+
|
|
72
|
+
pyproject_path = app / FAB_CONFIG_FILE if app else None
|
|
73
|
+
config, errors, warnings = load_and_validate(path=pyproject_path)
|
|
74
|
+
config = process_loaded_project_config(config, errors, warnings)
|
|
75
|
+
federation, federation_config = validate_federation_in_project_config(
|
|
76
|
+
federation, config
|
|
77
|
+
)
|
|
78
|
+
exit_if_no_address(federation_config, "stop")
|
|
79
|
+
|
|
80
|
+
try:
|
|
81
|
+
auth_plugin = try_obtain_cli_auth_plugin(app, federation)
|
|
82
|
+
channel = init_channel(app, federation_config, auth_plugin)
|
|
83
|
+
stub = ExecStub(channel) # pylint: disable=unused-variable # noqa: F841
|
|
84
|
+
|
|
85
|
+
typer.secho(f"✋ Stopping run ID {run_id}...", fg=typer.colors.GREEN)
|
|
86
|
+
_stop_run(stub=stub, run_id=run_id, output_format=output_format)
|
|
87
|
+
|
|
88
|
+
except ValueError as err:
|
|
89
|
+
typer.secho(
|
|
90
|
+
f"❌ {err}",
|
|
91
|
+
fg=typer.colors.RED,
|
|
92
|
+
bold=True,
|
|
93
|
+
)
|
|
94
|
+
raise typer.Exit(code=1) from err
|
|
95
|
+
finally:
|
|
96
|
+
channel.close()
|
|
97
|
+
except (typer.Exit, Exception) as err: # pylint: disable=broad-except
|
|
98
|
+
if suppress_output:
|
|
99
|
+
restore_output()
|
|
100
|
+
e_message = captured_output.getvalue()
|
|
101
|
+
print_json_error(e_message, err)
|
|
102
|
+
else:
|
|
103
|
+
typer.secho(
|
|
104
|
+
f"{err}",
|
|
105
|
+
fg=typer.colors.RED,
|
|
106
|
+
bold=True,
|
|
107
|
+
)
|
|
108
|
+
finally:
|
|
109
|
+
if suppress_output:
|
|
110
|
+
restore_output()
|
|
111
|
+
captured_output.close()
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
def _stop_run(stub: ExecStub, run_id: int, output_format: str) -> None:
|
|
115
|
+
"""Stop a run."""
|
|
116
|
+
with unauthenticated_exc_handler():
|
|
117
|
+
response: StopRunResponse = stub.StopRun(request=StopRunRequest(run_id=run_id))
|
|
118
|
+
if response.success:
|
|
119
|
+
typer.secho(f"✅ Run {run_id} successfully stopped.", fg=typer.colors.GREEN)
|
|
120
|
+
if output_format == CliOutputFormat.JSON:
|
|
121
|
+
run_output = json.dumps(
|
|
122
|
+
{
|
|
123
|
+
"success": True,
|
|
124
|
+
"run-id": run_id,
|
|
125
|
+
}
|
|
126
|
+
)
|
|
127
|
+
restore_output()
|
|
128
|
+
Console().print_json(run_output)
|
|
129
|
+
else:
|
|
130
|
+
typer.secho(f"❌ Run {run_id} couldn't be stopped.", fg=typer.colors.RED)
|
{flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/utils.py
RENAMED
|
@@ -18,6 +18,8 @@
|
|
|
18
18
|
import hashlib
|
|
19
19
|
import json
|
|
20
20
|
import re
|
|
21
|
+
from collections.abc import Iterator
|
|
22
|
+
from contextlib import contextmanager
|
|
21
23
|
from logging import DEBUG
|
|
22
24
|
from pathlib import Path
|
|
23
25
|
from typing import Any, Callable, Optional, cast
|
|
@@ -26,7 +28,6 @@ import grpc
|
|
|
26
28
|
import typer
|
|
27
29
|
|
|
28
30
|
from flwr.cli.cli_user_auth_interceptor import CliUserAuthInterceptor
|
|
29
|
-
from flwr.common.address import parse_address
|
|
30
31
|
from flwr.common.auth_plugin import CliAuthPlugin
|
|
31
32
|
from flwr.common.constant import AUTH_TYPE, CREDENTIALS_DIR, FLWR_DIR
|
|
32
33
|
from flwr.common.grpc import GRPC_MAX_MESSAGE_LENGTH, create_channel
|
|
@@ -159,33 +160,21 @@ def get_sha256_hash(file_path: Path) -> str:
|
|
|
159
160
|
return sha256.hexdigest()
|
|
160
161
|
|
|
161
162
|
|
|
162
|
-
def get_user_auth_config_path(
|
|
163
|
-
root_dir: Path, federation: str, server_address: str
|
|
164
|
-
) -> Path:
|
|
163
|
+
def get_user_auth_config_path(root_dir: Path, federation: str) -> Path:
|
|
165
164
|
"""Return the path to the user auth config file."""
|
|
166
|
-
# Parse the server address
|
|
167
|
-
parsed_addr = parse_address(server_address)
|
|
168
|
-
if parsed_addr is None:
|
|
169
|
-
raise ValueError(f"Invalid server address: {server_address}")
|
|
170
|
-
host, port, is_v6 = parsed_addr
|
|
171
|
-
formatted_addr = f"[{host}]_{port}" if is_v6 else f"{host}_{port}"
|
|
172
|
-
|
|
173
165
|
# Locate the credentials directory
|
|
174
166
|
credentials_dir = root_dir.absolute() / FLWR_DIR / CREDENTIALS_DIR
|
|
175
167
|
credentials_dir.mkdir(parents=True, exist_ok=True)
|
|
176
|
-
return credentials_dir / f"{federation}
|
|
168
|
+
return credentials_dir / f"{federation}.json"
|
|
177
169
|
|
|
178
170
|
|
|
179
171
|
def try_obtain_cli_auth_plugin(
|
|
180
172
|
root_dir: Path,
|
|
181
173
|
federation: str,
|
|
182
|
-
federation_config: dict[str, Any],
|
|
183
174
|
auth_type: Optional[str] = None,
|
|
184
175
|
) -> Optional[CliAuthPlugin]:
|
|
185
176
|
"""Load the CLI-side user auth plugin for the given auth type."""
|
|
186
|
-
config_path = get_user_auth_config_path(
|
|
187
|
-
root_dir, federation, federation_config["address"]
|
|
188
|
-
)
|
|
177
|
+
config_path = get_user_auth_config_path(root_dir, federation)
|
|
189
178
|
|
|
190
179
|
# Load the config file if it exists
|
|
191
180
|
config: dict[str, Any] = {}
|
|
@@ -244,3 +233,24 @@ def init_channel(
|
|
|
244
233
|
)
|
|
245
234
|
channel.subscribe(on_channel_state_change)
|
|
246
235
|
return channel
|
|
236
|
+
|
|
237
|
+
|
|
238
|
+
@contextmanager
|
|
239
|
+
def unauthenticated_exc_handler() -> Iterator[None]:
|
|
240
|
+
"""Context manager to handle gRPC UNAUTHENTICATED errors.
|
|
241
|
+
|
|
242
|
+
It catches grpc.RpcError exceptions with UNAUTHENTICATED status, informs the user,
|
|
243
|
+
and exits the application. All other exceptions will be allowed to escape.
|
|
244
|
+
"""
|
|
245
|
+
try:
|
|
246
|
+
yield
|
|
247
|
+
except grpc.RpcError as e:
|
|
248
|
+
if e.code() != grpc.StatusCode.UNAUTHENTICATED:
|
|
249
|
+
raise
|
|
250
|
+
typer.secho(
|
|
251
|
+
"❌ Authentication failed. Please run `flwr login`"
|
|
252
|
+
" to authenticate and try again.",
|
|
253
|
+
fg=typer.colors.RED,
|
|
254
|
+
bold=True,
|
|
255
|
+
)
|
|
256
|
+
raise typer.Exit(code=1) from None
|
{flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/client/app.py
RENAMED
|
@@ -56,7 +56,7 @@ from flwr.common.constant import (
|
|
|
56
56
|
from flwr.common.logger import log, warn_deprecated_feature
|
|
57
57
|
from flwr.common.message import Error
|
|
58
58
|
from flwr.common.retry_invoker import RetryInvoker, RetryState, exponential
|
|
59
|
-
from flwr.common.typing import Fab, Run, UserConfig
|
|
59
|
+
from flwr.common.typing import Fab, Run, RunNotRunningException, UserConfig
|
|
60
60
|
from flwr.proto.clientappio_pb2_grpc import add_ClientAppIoServicer_to_server
|
|
61
61
|
from flwr.server.superlink.fleet.grpc_bidi.grpc_server import generic_create_grpc_server
|
|
62
62
|
from flwr.server.superlink.linkstate.utils import generate_rand_int_from_bytes
|
|
@@ -612,6 +612,16 @@ def start_client_internal(
|
|
|
612
612
|
send(reply_message)
|
|
613
613
|
log(INFO, "Sent reply")
|
|
614
614
|
|
|
615
|
+
except RunNotRunningException:
|
|
616
|
+
log(INFO, "")
|
|
617
|
+
log(
|
|
618
|
+
INFO,
|
|
619
|
+
"SuperNode aborted sending the reply message. "
|
|
620
|
+
"Run ID %s is not in `RUNNING` status.",
|
|
621
|
+
run_id,
|
|
622
|
+
)
|
|
623
|
+
log(INFO, "")
|
|
624
|
+
|
|
615
625
|
except StopIteration:
|
|
616
626
|
sleep_duration = 0
|
|
617
627
|
break
|
{flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/client/client.py
RENAMED
|
@@ -22,7 +22,6 @@ from abc import ABC
|
|
|
22
22
|
|
|
23
23
|
from flwr.common import (
|
|
24
24
|
Code,
|
|
25
|
-
Context,
|
|
26
25
|
EvaluateIns,
|
|
27
26
|
EvaluateRes,
|
|
28
27
|
FitIns,
|
|
@@ -34,14 +33,11 @@ from flwr.common import (
|
|
|
34
33
|
Parameters,
|
|
35
34
|
Status,
|
|
36
35
|
)
|
|
37
|
-
from flwr.common.logger import warn_deprecated_feature_with_example
|
|
38
36
|
|
|
39
37
|
|
|
40
38
|
class Client(ABC):
|
|
41
39
|
"""Abstract base class for Flower clients."""
|
|
42
40
|
|
|
43
|
-
_context: Context
|
|
44
|
-
|
|
45
41
|
def get_properties(self, ins: GetPropertiesIns) -> GetPropertiesRes:
|
|
46
42
|
"""Return set of client's properties.
|
|
47
43
|
|
|
@@ -143,34 +139,6 @@ class Client(ABC):
|
|
|
143
139
|
metrics={},
|
|
144
140
|
)
|
|
145
141
|
|
|
146
|
-
@property
|
|
147
|
-
def context(self) -> Context:
|
|
148
|
-
"""Getter for `Context` client attribute."""
|
|
149
|
-
warn_deprecated_feature_with_example(
|
|
150
|
-
"Accessing the context via the client's attribute is deprecated.",
|
|
151
|
-
example_message="Instead, pass it to the client's "
|
|
152
|
-
"constructor in your `client_fn()` which already "
|
|
153
|
-
"receives a context object.",
|
|
154
|
-
code_example="def client_fn(context: Context) -> Client:\n\n"
|
|
155
|
-
"\t\t# Your existing client_fn\n\n"
|
|
156
|
-
"\t\t# Pass `context` to the constructor\n"
|
|
157
|
-
"\t\treturn FlowerClient(context).to_client()",
|
|
158
|
-
)
|
|
159
|
-
return self._context
|
|
160
|
-
|
|
161
|
-
@context.setter
|
|
162
|
-
def context(self, context: Context) -> None:
|
|
163
|
-
"""Setter for `Context` client attribute."""
|
|
164
|
-
self._context = context
|
|
165
|
-
|
|
166
|
-
def get_context(self) -> Context:
|
|
167
|
-
"""Get the run context from this client."""
|
|
168
|
-
return self.context
|
|
169
|
-
|
|
170
|
-
def set_context(self, context: Context) -> None:
|
|
171
|
-
"""Apply a run context to this client."""
|
|
172
|
-
self.context = context
|
|
173
|
-
|
|
174
142
|
def to_client(self) -> Client:
|
|
175
143
|
"""Return client (itself)."""
|
|
176
144
|
return self
|
|
@@ -32,6 +32,7 @@ from flwr.common.constant import CLIENTAPPIO_API_DEFAULT_CLIENT_ADDRESS, ErrorCo
|
|
|
32
32
|
from flwr.common.grpc import create_channel
|
|
33
33
|
from flwr.common.logger import log
|
|
34
34
|
from flwr.common.message import Error
|
|
35
|
+
from flwr.common.retry_invoker import _make_simple_grpc_retry_invoker, _wrap_stub
|
|
35
36
|
from flwr.common.serde import (
|
|
36
37
|
context_from_proto,
|
|
37
38
|
context_to_proto,
|
|
@@ -106,9 +107,9 @@ def run_clientapp( # pylint: disable=R0914
|
|
|
106
107
|
|
|
107
108
|
# Resolve directory where FABs are installed
|
|
108
109
|
flwr_dir_ = get_flwr_dir(flwr_dir)
|
|
109
|
-
|
|
110
110
|
try:
|
|
111
111
|
stub = ClientAppIoStub(channel)
|
|
112
|
+
_wrap_stub(stub, _make_simple_grpc_retry_invoker())
|
|
112
113
|
|
|
113
114
|
while True:
|
|
114
115
|
# If token is not set, loop until token is received from SuperNode
|
|
@@ -139,6 +140,7 @@ def run_clientapp( # pylint: disable=R0914
|
|
|
139
140
|
|
|
140
141
|
# Execute ClientApp
|
|
141
142
|
reply_message = client_app(message=message, context=context)
|
|
143
|
+
|
|
142
144
|
except Exception as ex: # pylint: disable=broad-exception-caught
|
|
143
145
|
# Don't update/change NodeState
|
|
144
146
|
|
|
@@ -42,7 +42,7 @@ from flwr.common.logger import log
|
|
|
42
42
|
from flwr.common.message import Message, Metadata
|
|
43
43
|
from flwr.common.retry_invoker import RetryInvoker
|
|
44
44
|
from flwr.common.serde import message_from_taskins, message_to_taskres, run_from_proto
|
|
45
|
-
from flwr.common.typing import Fab, Run
|
|
45
|
+
from flwr.common.typing import Fab, Run, RunNotRunningException
|
|
46
46
|
from flwr.proto.fab_pb2 import GetFabRequest, GetFabResponse # pylint: disable=E0611
|
|
47
47
|
from flwr.proto.fleet_pb2 import ( # pylint: disable=E0611
|
|
48
48
|
CreateNodeRequest,
|
|
@@ -155,10 +155,16 @@ def grpc_request_response( # pylint: disable=R0913,R0914,R0915,R0917
|
|
|
155
155
|
ping_thread: Optional[threading.Thread] = None
|
|
156
156
|
ping_stop_event = threading.Event()
|
|
157
157
|
|
|
158
|
+
def _should_giveup_fn(e: Exception) -> bool:
|
|
159
|
+
if e.code() == grpc.StatusCode.PERMISSION_DENIED: # type: ignore
|
|
160
|
+
raise RunNotRunningException
|
|
161
|
+
if e.code() == grpc.StatusCode.UNAVAILABLE: # type: ignore
|
|
162
|
+
return False
|
|
163
|
+
return True
|
|
164
|
+
|
|
158
165
|
# Restrict retries to cases where the status code is UNAVAILABLE
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
)
|
|
166
|
+
# If the status code is PERMISSION_DENIED, additionally raise RunNotRunningException
|
|
167
|
+
retry_invoker.should_giveup = _should_giveup_fn
|
|
162
168
|
|
|
163
169
|
###########################################################################
|
|
164
170
|
# ping/create_node/delete_node/receive/send/get_run functions
|