flwr-nightly 1.14.0.dev20241214__tar.gz → 1.15.0.dev20250107__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.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/PKG-INFO +2 -2
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/README.md +1 -1
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/pyproject.toml +11 -9
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/cli/log.py +9 -7
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/cli/login/login.py +1 -3
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/cli/ls.py +25 -22
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/cli/new/templates/app/.gitignore.tpl +3 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/cli/new/templates/app/pyproject.baseline.toml.tpl +1 -1
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +1 -1
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl +1 -1
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/cli/new/templates/app/pyproject.jax.toml.tpl +1 -1
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +1 -1
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +1 -1
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +3 -3
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +1 -1
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +1 -1
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/cli/run/run.py +11 -18
- flwr_nightly-1.15.0.dev20250107/src/py/flwr/cli/stop.py +130 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/cli/utils.py +81 -25
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/client/app.py +11 -1
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/client/client.py +0 -32
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/client/clientapp/app.py +3 -1
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/client/grpc_rere_client/connection.py +10 -4
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/client/message_handler/message_handler.py +0 -2
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/client/numpy_client.py +0 -44
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/client/supernode/app.py +1 -2
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/common/logger.py +16 -1
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/common/record/recordset.py +1 -1
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/common/retry_invoker.py +3 -1
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +45 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/common/telemetry.py +13 -3
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/app.py +8 -8
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/run_serverapp.py +8 -9
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/serverapp/app.py +17 -2
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/superlink/driver/serverappio_servicer.py +9 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/superlink/fleet/message_handler/message_handler.py +1 -3
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/superlink/fleet/vce/vce_api.py +2 -2
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/superlink/linkstate/in_memory_linkstate.py +10 -2
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/superlink/linkstate/linkstate.py +4 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/superlink/linkstate/sqlite_linkstate.py +6 -2
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/superlink/simulation/simulationio_servicer.py +13 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/simulation/app.py +15 -4
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/simulation/run_simulation.py +35 -22
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/simulation/simulationio_connection.py +3 -0
- flwr_nightly-1.14.0.dev20241214/src/py/flwr/cli/stop.py +0 -91
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/LICENSE +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/cli/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/cli/app.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/cli/build.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/cli/cli_user_auth_interceptor.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/cli/config_utils.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/cli/example.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/cli/install.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/cli/login/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/cli/new/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/cli/new/new.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/cli/new/templates/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/cli/new/templates/app/LICENSE.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/cli/new/templates/app/README.baseline.md.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/cli/new/templates/app/README.flowertune.md.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/cli/new/templates/app/README.md.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/cli/new/templates/app/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/cli/new/templates/app/code/__init__.baseline.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/cli/new/templates/app/code/client.baseline.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/cli/new/templates/app/code/client.huggingface.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/cli/new/templates/app/code/client.jax.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/cli/new/templates/app/code/client.mlx.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/cli/new/templates/app/code/client.numpy.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/cli/new/templates/app/code/dataset.baseline.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/cli/new/templates/app/code/flwr_tune/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/cli/new/templates/app/code/flwr_tune/client_app.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/cli/new/templates/app/code/flwr_tune/dataset.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/cli/new/templates/app/code/flwr_tune/models.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/cli/new/templates/app/code/flwr_tune/server_app.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/cli/new/templates/app/code/flwr_tune/strategy.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/cli/new/templates/app/code/model.baseline.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/cli/new/templates/app/code/server.baseline.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/cli/new/templates/app/code/server.huggingface.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/cli/new/templates/app/code/server.jax.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/cli/new/templates/app/code/server.mlx.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/cli/new/templates/app/code/server.sklearn.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/cli/new/templates/app/code/strategy.baseline.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/cli/new/templates/app/code/task.huggingface.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/cli/new/templates/app/code/task.jax.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/cli/new/templates/app/code/task.mlx.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/cli/new/templates/app/code/task.numpy.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/cli/new/templates/app/code/task.sklearn.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/cli/new/templates/app/code/task.tensorflow.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/cli/new/templates/app/code/utils.baseline.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/cli/run/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/client/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/client/client_app.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/client/clientapp/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/client/clientapp/clientappio_servicer.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/client/clientapp/utils.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/client/dpfedavg_numpy_client.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/client/grpc_adapter_client/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/client/grpc_adapter_client/connection.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/client/grpc_client/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/client/grpc_client/connection.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/client/grpc_rere_client/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/client/grpc_rere_client/client_interceptor.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/client/grpc_rere_client/grpc_adapter.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/client/heartbeat.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/client/message_handler/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/client/message_handler/task_handler.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/client/mod/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/client/mod/centraldp_mods.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/client/mod/comms_mods.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/client/mod/localdp_mod.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/client/mod/utils.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/client/nodestate/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/client/nodestate/in_memory_nodestate.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/client/nodestate/nodestate.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/client/nodestate/nodestate_factory.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/client/rest_client/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/client/rest_client/connection.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/client/run_info_store.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/client/supernode/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/client/typing.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/common/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/common/address.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/common/args.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/common/auth_plugin/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/common/auth_plugin/auth_plugin.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/common/config.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/common/constant.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/common/context.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/common/date.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/common/differential_privacy.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/common/differential_privacy_constants.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/common/dp.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/common/exit_handlers.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/common/grpc.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/common/message.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/common/object_ref.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/common/parameter.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/common/pyproject.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/common/record/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/common/record/configsrecord.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/common/record/conversion_utils.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/common/record/metricsrecord.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/common/record/parametersrecord.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/common/record/typeddict.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/common/recordset_compat.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/common/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/common/secure_aggregation/quantization.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/common/serde.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/common/typing.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/common/version.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/proto/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/proto/clientappio_pb2.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/proto/clientappio_pb2.pyi +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/proto/clientappio_pb2_grpc.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/proto/clientappio_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/proto/error_pb2.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/proto/error_pb2.pyi +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/proto/error_pb2_grpc.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/proto/error_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/proto/exec_pb2.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/proto/exec_pb2.pyi +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/proto/exec_pb2_grpc.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/proto/exec_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/proto/fab_pb2.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/proto/fab_pb2.pyi +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/proto/fab_pb2_grpc.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/proto/fab_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/proto/fleet_pb2.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/proto/fleet_pb2.pyi +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/proto/fleet_pb2_grpc.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/proto/grpcadapter_pb2.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/proto/grpcadapter_pb2.pyi +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/proto/grpcadapter_pb2_grpc.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/proto/grpcadapter_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/proto/log_pb2.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/proto/log_pb2.pyi +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/proto/log_pb2_grpc.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/proto/log_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/proto/message_pb2.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/proto/message_pb2.pyi +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/proto/message_pb2_grpc.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/proto/message_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/proto/node_pb2.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/proto/node_pb2.pyi +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/proto/node_pb2_grpc.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/proto/node_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/proto/recordset_pb2.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/proto/recordset_pb2.pyi +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/proto/recordset_pb2_grpc.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/proto/recordset_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/proto/run_pb2.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/proto/run_pb2.pyi +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/proto/run_pb2_grpc.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/proto/run_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/proto/serverappio_pb2.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/proto/serverappio_pb2.pyi +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/proto/serverappio_pb2_grpc.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/proto/serverappio_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/proto/simulationio_pb2.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/proto/simulationio_pb2.pyi +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/proto/simulationio_pb2_grpc.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/proto/simulationio_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/proto/task_pb2.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/proto/task_pb2.pyi +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/proto/task_pb2_grpc.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/proto/task_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/proto/transport_pb2.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/proto/transport_pb2.pyi +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/proto/transport_pb2_grpc.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/py.typed +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/client_manager.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/client_proxy.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/compat/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/compat/app.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/compat/app_utils.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/compat/driver_client_proxy.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/compat/legacy_context.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/criterion.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/driver/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/driver/driver.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/driver/grpc_driver.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/driver/inmemory_driver.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/history.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/server.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/server_app.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/server_config.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/serverapp/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/serverapp_components.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/strategy/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/strategy/aggregate.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/strategy/bulyan.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/strategy/fedadagrad.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/strategy/fedadam.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/strategy/fedavg.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/strategy/fedavg_android.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/strategy/fedavgm.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/strategy/fedmedian.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/strategy/fedopt.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/strategy/fedprox.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/strategy/fedyogi.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/strategy/krum.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/strategy/qfedavg.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/strategy/strategy.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/superlink/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/superlink/driver/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/superlink/driver/serverappio_grpc.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/superlink/ffs/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/superlink/ffs/disk_ffs.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/superlink/ffs/ffs.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/superlink/ffs/ffs_factory.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/superlink/fleet/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/superlink/fleet/grpc_adapter/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/superlink/linkstate/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/superlink/linkstate/linkstate_factory.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/superlink/linkstate/utils.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/superlink/simulation/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/superlink/simulation/simulationio_grpc.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/superlink/utils.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/typing.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/utils/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/utils/tensorboard.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/utils/validator.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/workflow/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/workflow/constant.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/workflow/default_workflows.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/simulation/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/simulation/legacy_app.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/simulation/ray_transport/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/simulation/ray_transport/utils.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/superexec/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/superexec/app.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/superexec/deployment.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/superexec/exec_grpc.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/superexec/exec_servicer.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/superexec/exec_user_auth_interceptor.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/superexec/executor.py +0 -0
- {flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/src/py/flwr/superexec/simulation.py +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: flwr-nightly
|
3
|
-
Version: 1.
|
3
|
+
Version: 1.15.0.dev20250107
|
4
4
|
Summary: Flower: A Friendly Federated AI Framework
|
5
5
|
Home-page: https://flower.ai
|
6
6
|
License: Apache-2.0
|
@@ -118,7 +118,7 @@ Flower's goal is to make federated learning accessible to everyone. This series
|
|
118
118
|
|
119
119
|
4. **Custom Clients for Federated Learning**
|
120
120
|
|
121
|
-
[](https://colab.research.google.com/github/adap/flower/blob/main/
|
121
|
+
[](https://colab.research.google.com/github/adap/flower/blob/main/framework/docs/source/tutorial-series-customize-the-client-pytorch.ipynb) (or open the [Jupyter Notebook](https://github.com/adap/flower/blob/main/framework/docs/source/tutorial-series-customize-the-client-pytorch.ipynb))
|
122
122
|
|
123
123
|
Stay tuned, more tutorials are coming soon. Topics include **Privacy and Security in Federated Learning**, and **Scaling Federated Learning**.
|
124
124
|
|
@@ -64,7 +64,7 @@ Flower's goal is to make federated learning accessible to everyone. This series
|
|
64
64
|
|
65
65
|
4. **Custom Clients for Federated Learning**
|
66
66
|
|
67
|
-
[](https://colab.research.google.com/github/adap/flower/blob/main/
|
67
|
+
[](https://colab.research.google.com/github/adap/flower/blob/main/framework/docs/source/tutorial-series-customize-the-client-pytorch.ipynb) (or open the [Jupyter Notebook](https://github.com/adap/flower/blob/main/framework/docs/source/tutorial-series-customize-the-client-pytorch.ipynb))
|
68
68
|
|
69
69
|
Stay tuned, more tutorials are coming soon. Topics include **Privacy and Security in Federated Learning**, and **Scaling Federated Learning**.
|
70
70
|
|
@@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api"
|
|
4
4
|
|
5
5
|
[tool.poetry]
|
6
6
|
name = "flwr-nightly"
|
7
|
-
version = "1.
|
7
|
+
version = "1.15.0.dev20250107"
|
8
8
|
description = "Flower: A Friendly Federated AI Framework"
|
9
9
|
license = "Apache-2.0"
|
10
10
|
authors = ["The Flower Authors <hello@flower.ai>"]
|
@@ -106,11 +106,11 @@ flake8 = "==5.0.4"
|
|
106
106
|
parameterized = "==0.9.0"
|
107
107
|
pytest = "==7.4.4"
|
108
108
|
pytest-cov = "==4.1.0"
|
109
|
-
pytest-watcher = "==0.4.
|
109
|
+
pytest-watcher = "==0.4.3"
|
110
110
|
grpcio-tools = "==1.60.0"
|
111
111
|
mypy-protobuf = "==3.2.0"
|
112
112
|
jupyterlab = "==4.0.12"
|
113
|
-
rope = "==1.
|
113
|
+
rope = "==1.13.0"
|
114
114
|
semver = "==3.0.2"
|
115
115
|
sphinx = "==7.4.7"
|
116
116
|
sphinx-intl = "==2.2.0"
|
@@ -124,7 +124,7 @@ furo = "==2024.8.6"
|
|
124
124
|
sphinx-reredirects = "==0.1.5"
|
125
125
|
nbsphinx = "==0.9.5"
|
126
126
|
nbstripout = "==0.6.1"
|
127
|
-
ruff = "==0.
|
127
|
+
ruff = "==0.4.5"
|
128
128
|
sphinx-argparse = "==0.4.0"
|
129
129
|
pipreqs = "==0.4.13"
|
130
130
|
mdformat = "==0.7.18"
|
@@ -201,9 +201,6 @@ wrap-descriptions = 88
|
|
201
201
|
[tool.ruff]
|
202
202
|
target-version = "py39"
|
203
203
|
line-length = 88
|
204
|
-
select = ["D", "E", "F", "W", "B", "ISC", "C4", "UP"]
|
205
|
-
fixable = ["D", "E", "F", "W", "B", "ISC", "C4", "UP"]
|
206
|
-
ignore = ["B024", "B027", "D205", "D209"]
|
207
204
|
exclude = [
|
208
205
|
".bzr",
|
209
206
|
".direnv",
|
@@ -228,10 +225,15 @@ exclude = [
|
|
228
225
|
"proto",
|
229
226
|
]
|
230
227
|
|
231
|
-
[tool.ruff.
|
228
|
+
[tool.ruff.lint]
|
229
|
+
select = ["D", "E", "F", "W", "B", "ISC", "C4", "UP"]
|
230
|
+
fixable = ["D", "E", "F", "W", "B", "ISC", "C4", "UP"]
|
231
|
+
ignore = ["B024", "B027", "D205", "D209"]
|
232
|
+
|
233
|
+
[tool.ruff.lint.pydocstyle]
|
232
234
|
convention = "numpy"
|
233
235
|
|
234
|
-
[tool.ruff.per-file-ignores]
|
236
|
+
[tool.ruff.lint.per-file-ignores]
|
235
237
|
"src/py/flwr/server/strategy/*.py" = ["E501"]
|
236
238
|
|
237
239
|
[tool.docsig]
|
@@ -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.dev20241214 → flwr_nightly-1.15.0.dev20250107}/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
|
-
)
|
@@ -8,10 +8,10 @@ version = "1.0.0"
|
|
8
8
|
description = ""
|
9
9
|
license = "Apache-2.0"
|
10
10
|
dependencies = [
|
11
|
-
"flwr[simulation]>=1.
|
11
|
+
"flwr[simulation]>=1.14.0",
|
12
12
|
"flwr-datasets[vision]>=0.3.0",
|
13
|
-
"torch==2.
|
14
|
-
"torchvision==0.
|
13
|
+
"torch==2.5.1",
|
14
|
+
"torchvision==0.20.1",
|
15
15
|
]
|
16
16
|
|
17
17
|
[tool.hatch.build.targets.wheel]
|
{flwr_nightly-1.14.0.dev20241214 → flwr_nightly-1.15.0.dev20250107}/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)
|