flwr-nightly 1.13.0.dev20241029__tar.gz → 1.13.0.dev20241030__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.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/PKG-INFO +1 -1
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/pyproject.toml +1 -1
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/cli/build.py +2 -2
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/cli/log.py +46 -17
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/common/constant.py +6 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/common/logger.py +74 -2
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/proto/driver_pb2.py +10 -10
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/proto/driver_pb2.pyi +0 -5
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/proto/exec_pb2.py +6 -6
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/proto/exec_pb2.pyi +8 -2
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/app.py +1 -5
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/serverapp/app.py +40 -22
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/superlink/driver/driver_servicer.py +10 -10
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/superexec/deployment.py +19 -3
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/superexec/exec_servicer.py +31 -3
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/LICENSE +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/README.md +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/cli/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/cli/app.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/cli/config_utils.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/cli/example.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/cli/install.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/cli/new/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/cli/new/new.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/cli/new/templates/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/cli/new/templates/app/.gitignore.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/cli/new/templates/app/LICENSE.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/cli/new/templates/app/README.baseline.md.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/cli/new/templates/app/README.flowertune.md.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/cli/new/templates/app/README.md.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/cli/new/templates/app/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/cli/new/templates/app/code/__init__.baseline.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/cli/new/templates/app/code/client.baseline.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/cli/new/templates/app/code/client.huggingface.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/cli/new/templates/app/code/client.jax.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/cli/new/templates/app/code/client.mlx.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/cli/new/templates/app/code/client.numpy.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/cli/new/templates/app/code/dataset.baseline.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/cli/new/templates/app/code/flwr_tune/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/cli/new/templates/app/code/flwr_tune/client_app.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/cli/new/templates/app/code/flwr_tune/dataset.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/cli/new/templates/app/code/flwr_tune/models.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/cli/new/templates/app/code/flwr_tune/server_app.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/cli/new/templates/app/code/flwr_tune/strategy.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/cli/new/templates/app/code/model.baseline.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/cli/new/templates/app/code/server.baseline.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/cli/new/templates/app/code/server.huggingface.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/cli/new/templates/app/code/server.jax.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/cli/new/templates/app/code/server.mlx.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/cli/new/templates/app/code/server.sklearn.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/cli/new/templates/app/code/strategy.baseline.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/cli/new/templates/app/code/task.huggingface.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/cli/new/templates/app/code/task.jax.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/cli/new/templates/app/code/task.mlx.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/cli/new/templates/app/code/task.numpy.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/cli/new/templates/app/code/task.sklearn.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/cli/new/templates/app/code/task.tensorflow.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/cli/new/templates/app/code/utils.baseline.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/cli/new/templates/app/pyproject.baseline.toml.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/cli/new/templates/app/pyproject.jax.toml.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/cli/run/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/cli/run/run.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/cli/utils.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/client/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/client/app.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/client/client.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/client/client_app.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/client/clientapp/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/client/clientapp/app.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/client/clientapp/clientappio_servicer.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/client/clientapp/utils.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/client/dpfedavg_numpy_client.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/client/grpc_adapter_client/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/client/grpc_adapter_client/connection.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/client/grpc_client/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/client/grpc_client/connection.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/client/grpc_rere_client/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/client/grpc_rere_client/client_interceptor.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/client/grpc_rere_client/connection.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/client/grpc_rere_client/grpc_adapter.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/client/heartbeat.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/client/message_handler/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/client/message_handler/message_handler.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/client/message_handler/task_handler.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/client/mod/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/client/mod/centraldp_mods.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/client/mod/comms_mods.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/client/mod/localdp_mod.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/client/mod/utils.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/client/numpy_client.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/client/rest_client/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/client/rest_client/connection.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/client/run_info_store.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/client/supernode/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/client/supernode/app.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/client/typing.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/common/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/common/address.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/common/config.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/common/context.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/common/date.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/common/differential_privacy.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/common/differential_privacy_constants.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/common/dp.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/common/exit_handlers.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/common/grpc.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/common/message.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/common/object_ref.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/common/parameter.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/common/pyproject.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/common/record/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/common/record/configsrecord.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/common/record/conversion_utils.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/common/record/metricsrecord.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/common/record/parametersrecord.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/common/record/recordset.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/common/record/typeddict.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/common/recordset_compat.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/common/retry_invoker.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/common/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/common/secure_aggregation/quantization.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/common/serde.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/common/telemetry.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/common/typing.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/common/version.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/proto/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/proto/clientappio_pb2.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/proto/clientappio_pb2.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/proto/clientappio_pb2_grpc.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/proto/clientappio_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/proto/common_pb2.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/proto/common_pb2.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/proto/common_pb2_grpc.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/proto/common_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/proto/control_pb2.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/proto/control_pb2.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/proto/control_pb2_grpc.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/proto/control_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/proto/driver_pb2_grpc.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/proto/driver_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/proto/error_pb2.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/proto/error_pb2.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/proto/error_pb2_grpc.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/proto/error_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/proto/exec_pb2_grpc.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/proto/exec_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/proto/fab_pb2.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/proto/fab_pb2.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/proto/fab_pb2_grpc.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/proto/fab_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/proto/fleet_pb2.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/proto/fleet_pb2.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/proto/fleet_pb2_grpc.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/proto/grpcadapter_pb2.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/proto/grpcadapter_pb2.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/proto/grpcadapter_pb2_grpc.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/proto/grpcadapter_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/proto/log_pb2.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/proto/log_pb2.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/proto/log_pb2_grpc.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/proto/log_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/proto/message_pb2.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/proto/message_pb2.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/proto/message_pb2_grpc.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/proto/message_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/proto/node_pb2.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/proto/node_pb2.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/proto/node_pb2_grpc.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/proto/node_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/proto/recordset_pb2.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/proto/recordset_pb2.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/proto/recordset_pb2_grpc.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/proto/recordset_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/proto/run_pb2.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/proto/run_pb2.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/proto/run_pb2_grpc.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/proto/run_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/proto/task_pb2.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/proto/task_pb2.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/proto/task_pb2_grpc.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/proto/task_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/proto/transport_pb2.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/proto/transport_pb2.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/proto/transport_pb2_grpc.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/py.typed +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/client_manager.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/client_proxy.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/compat/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/compat/app.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/compat/app_utils.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/compat/driver_client_proxy.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/compat/legacy_context.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/criterion.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/driver/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/driver/driver.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/driver/grpc_driver.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/driver/inmemory_driver.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/history.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/run_serverapp.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/server.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/server_app.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/server_config.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/serverapp/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/serverapp_components.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/strategy/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/strategy/aggregate.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/strategy/bulyan.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/strategy/fedadagrad.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/strategy/fedadam.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/strategy/fedavg.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/strategy/fedavg_android.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/strategy/fedavgm.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/strategy/fedmedian.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/strategy/fedopt.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/strategy/fedprox.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/strategy/fedyogi.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/strategy/krum.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/strategy/qfedavg.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/strategy/strategy.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/superlink/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/superlink/driver/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/superlink/driver/driver_grpc.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/superlink/ffs/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/superlink/ffs/disk_ffs.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/superlink/ffs/ffs.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/superlink/ffs/ffs_factory.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/superlink/fleet/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/superlink/fleet/grpc_adapter/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/superlink/fleet/message_handler/message_handler.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/superlink/fleet/vce/vce_api.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/superlink/linkstate/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/superlink/linkstate/in_memory_linkstate.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/superlink/linkstate/linkstate.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/superlink/linkstate/linkstate_factory.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/superlink/linkstate/sqlite_linkstate.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/superlink/linkstate/utils.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/typing.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/utils/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/utils/tensorboard.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/utils/validator.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/workflow/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/workflow/constant.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/workflow/default_workflows.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/simulation/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/simulation/app.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/simulation/ray_transport/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/simulation/ray_transport/utils.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/simulation/run_simulation.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/superexec/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/superexec/app.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/superexec/exec_grpc.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/superexec/executor.py +0 -0
- {flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/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.13.0.
|
|
7
|
+
version = "1.13.0.dev20241030"
|
|
8
8
|
description = "Flower: A Friendly Federated Learning Framework"
|
|
9
9
|
license = "Apache-2.0"
|
|
10
10
|
authors = ["The Flower Authors <hello@flower.ai>"]
|
{flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/cli/build.py
RENAMED
|
@@ -81,8 +81,8 @@ def build(
|
|
|
81
81
|
if not is_valid_project_name(app.name):
|
|
82
82
|
typer.secho(
|
|
83
83
|
f"❌ The project name {app.name} is invalid, "
|
|
84
|
-
"a valid project name must start with a letter
|
|
85
|
-
"and can only contain letters, digits, and
|
|
84
|
+
"a valid project name must start with a letter, "
|
|
85
|
+
"and can only contain letters, digits, and hyphens.",
|
|
86
86
|
fg=typer.colors.RED,
|
|
87
87
|
bold=True,
|
|
88
88
|
)
|
|
@@ -18,29 +18,30 @@ import sys
|
|
|
18
18
|
import time
|
|
19
19
|
from logging import DEBUG, ERROR, INFO
|
|
20
20
|
from pathlib import Path
|
|
21
|
-
from typing import Annotated, Optional
|
|
21
|
+
from typing import Annotated, Optional, cast
|
|
22
22
|
|
|
23
23
|
import grpc
|
|
24
24
|
import typer
|
|
25
25
|
|
|
26
26
|
from flwr.cli.config_utils import load_and_validate
|
|
27
|
+
from flwr.common.constant import CONN_RECONNECT_INTERVAL, CONN_REFRESH_PERIOD
|
|
27
28
|
from flwr.common.grpc import GRPC_MAX_MESSAGE_LENGTH, create_channel
|
|
28
29
|
from flwr.common.logger import log as logger
|
|
29
30
|
from flwr.proto.exec_pb2 import StreamLogsRequest # pylint: disable=E0611
|
|
30
31
|
from flwr.proto.exec_pb2_grpc import ExecStub
|
|
31
32
|
|
|
32
|
-
CONN_REFRESH_PERIOD = 60 # Connection refresh period for log streaming (seconds)
|
|
33
|
-
|
|
34
33
|
|
|
35
34
|
def start_stream(
|
|
36
35
|
run_id: int, channel: grpc.Channel, refresh_period: int = CONN_REFRESH_PERIOD
|
|
37
36
|
) -> None:
|
|
38
37
|
"""Start log streaming for a given run ID."""
|
|
38
|
+
stub = ExecStub(channel)
|
|
39
|
+
after_timestamp = 0.0
|
|
39
40
|
try:
|
|
41
|
+
logger(INFO, "Starting logstream for run_id `%s`", run_id)
|
|
40
42
|
while True:
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
time.sleep(2)
|
|
43
|
+
after_timestamp = stream_logs(run_id, stub, refresh_period, after_timestamp)
|
|
44
|
+
time.sleep(CONN_RECONNECT_INTERVAL)
|
|
44
45
|
logger(DEBUG, "Reconnecting to logstream")
|
|
45
46
|
except KeyboardInterrupt:
|
|
46
47
|
logger(INFO, "Exiting logstream")
|
|
@@ -54,16 +55,44 @@ def start_stream(
|
|
|
54
55
|
channel.close()
|
|
55
56
|
|
|
56
57
|
|
|
57
|
-
def stream_logs(
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
58
|
+
def stream_logs(
|
|
59
|
+
run_id: int, stub: ExecStub, duration: int, after_timestamp: float
|
|
60
|
+
) -> float:
|
|
61
|
+
"""Stream logs from the beginning of a run with connection refresh.
|
|
62
|
+
|
|
63
|
+
Parameters
|
|
64
|
+
----------
|
|
65
|
+
run_id : int
|
|
66
|
+
The identifier of the run.
|
|
67
|
+
stub : ExecStub
|
|
68
|
+
The gRPC stub to interact with the Exec service.
|
|
69
|
+
duration : int
|
|
70
|
+
The timeout duration for each stream connection in seconds.
|
|
71
|
+
after_timestamp : float
|
|
72
|
+
The timestamp to start streaming logs from.
|
|
73
|
+
|
|
74
|
+
Returns
|
|
75
|
+
-------
|
|
76
|
+
float
|
|
77
|
+
The latest timestamp from the streamed logs or the provided `after_timestamp`
|
|
78
|
+
if no logs are returned.
|
|
79
|
+
"""
|
|
80
|
+
req = StreamLogsRequest(run_id=run_id, after_timestamp=after_timestamp)
|
|
81
|
+
|
|
82
|
+
latest_timestamp = 0.0
|
|
83
|
+
res = None
|
|
84
|
+
try:
|
|
85
|
+
for res in stub.StreamLogs(req, timeout=duration):
|
|
86
|
+
print(res.log_output, end="")
|
|
87
|
+
except grpc.RpcError as e:
|
|
88
|
+
# pylint: disable=E1101
|
|
89
|
+
if e.code() != grpc.StatusCode.DEADLINE_EXCEEDED:
|
|
90
|
+
raise e
|
|
91
|
+
finally:
|
|
92
|
+
if res is not None:
|
|
93
|
+
latest_timestamp = cast(float, res.latest_timestamp)
|
|
62
94
|
|
|
63
|
-
|
|
64
|
-
print(res.log_output)
|
|
65
|
-
if time.time() - start_time > duration:
|
|
66
|
-
break
|
|
95
|
+
return max(latest_timestamp, after_timestamp)
|
|
67
96
|
|
|
68
97
|
|
|
69
98
|
def print_logs(run_id: int, channel: grpc.Channel, timeout: int) -> None:
|
|
@@ -181,11 +210,11 @@ def log(
|
|
|
181
210
|
)
|
|
182
211
|
raise typer.Exit(code=1)
|
|
183
212
|
|
|
184
|
-
|
|
213
|
+
_log_with_exec_api(federation_config, run_id, stream)
|
|
185
214
|
|
|
186
215
|
|
|
187
216
|
# pylint: disable-next=too-many-branches
|
|
188
|
-
def
|
|
217
|
+
def _log_with_exec_api(
|
|
189
218
|
federation_config: dict[str, str],
|
|
190
219
|
run_id: int,
|
|
191
220
|
stream: bool,
|
{flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/common/constant.py
RENAMED
|
@@ -87,6 +87,12 @@ MESSAGE_TTL_TOLERANCE = 1e-1
|
|
|
87
87
|
ISOLATION_MODE_SUBPROCESS = "subprocess"
|
|
88
88
|
ISOLATION_MODE_PROCESS = "process"
|
|
89
89
|
|
|
90
|
+
# Log streaming configurations
|
|
91
|
+
CONN_REFRESH_PERIOD = 60 # Stream connection refresh period
|
|
92
|
+
CONN_RECONNECT_INTERVAL = 0.5 # Reconnect interval between two stream connections
|
|
93
|
+
LOG_STREAM_INTERVAL = 0.5 # Log stream interval for `ExecServicer.StreamLogs`
|
|
94
|
+
LOG_UPLOAD_INTERVAL = 0.2 # Minimum interval between two log uploads
|
|
95
|
+
|
|
90
96
|
|
|
91
97
|
class MessageType:
|
|
92
98
|
"""Message type."""
|
{flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/common/logger.py
RENAMED
|
@@ -17,11 +17,21 @@
|
|
|
17
17
|
|
|
18
18
|
import logging
|
|
19
19
|
import sys
|
|
20
|
+
import threading
|
|
21
|
+
import time
|
|
20
22
|
from logging import WARN, LogRecord
|
|
21
23
|
from logging.handlers import HTTPHandler
|
|
22
|
-
from queue import Queue
|
|
24
|
+
from queue import Empty, Queue
|
|
23
25
|
from typing import TYPE_CHECKING, Any, Optional, TextIO
|
|
24
26
|
|
|
27
|
+
import grpc
|
|
28
|
+
|
|
29
|
+
from flwr.proto.driver_pb2_grpc import DriverStub # pylint: disable=E0611
|
|
30
|
+
from flwr.proto.log_pb2 import PushLogsRequest # pylint: disable=E0611
|
|
31
|
+
from flwr.proto.node_pb2 import Node # pylint: disable=E0611
|
|
32
|
+
|
|
33
|
+
from .constant import LOG_UPLOAD_INTERVAL
|
|
34
|
+
|
|
25
35
|
# Create logger
|
|
26
36
|
LOGGER_NAME = "flwr"
|
|
27
37
|
FLOWER_LOGGER = logging.getLogger(LOGGER_NAME)
|
|
@@ -263,7 +273,7 @@ def set_logger_propagation(
|
|
|
263
273
|
return child_logger
|
|
264
274
|
|
|
265
275
|
|
|
266
|
-
def mirror_output_to_queue(log_queue: Queue[str]) -> None:
|
|
276
|
+
def mirror_output_to_queue(log_queue: Queue[Optional[str]]) -> None:
|
|
267
277
|
"""Mirror stdout and stderr output to the provided queue."""
|
|
268
278
|
|
|
269
279
|
def get_write_fn(stream: TextIO) -> Any:
|
|
@@ -290,3 +300,65 @@ def restore_output() -> None:
|
|
|
290
300
|
sys.stdout = sys.__stdout__
|
|
291
301
|
sys.stderr = sys.__stderr__
|
|
292
302
|
console_handler.stream = sys.stdout
|
|
303
|
+
|
|
304
|
+
|
|
305
|
+
def _log_uploader(
|
|
306
|
+
log_queue: Queue[Optional[str]], node_id: int, run_id: int, stub: DriverStub
|
|
307
|
+
) -> None:
|
|
308
|
+
"""Upload logs to the SuperLink."""
|
|
309
|
+
exit_flag = False
|
|
310
|
+
node = Node(node_id=node_id, anonymous=False)
|
|
311
|
+
msgs: list[str] = []
|
|
312
|
+
while True:
|
|
313
|
+
# Fetch all messages from the queue
|
|
314
|
+
try:
|
|
315
|
+
while True:
|
|
316
|
+
msg = log_queue.get_nowait()
|
|
317
|
+
# Quit the loops if the returned message is `None`
|
|
318
|
+
# This is a signal that the run has finished
|
|
319
|
+
if msg is None:
|
|
320
|
+
exit_flag = True
|
|
321
|
+
break
|
|
322
|
+
msgs.append(msg)
|
|
323
|
+
except Empty:
|
|
324
|
+
pass
|
|
325
|
+
|
|
326
|
+
# Upload if any logs
|
|
327
|
+
if msgs:
|
|
328
|
+
req = PushLogsRequest(
|
|
329
|
+
node=node,
|
|
330
|
+
run_id=run_id,
|
|
331
|
+
logs=msgs,
|
|
332
|
+
)
|
|
333
|
+
try:
|
|
334
|
+
stub.PushLogs(req)
|
|
335
|
+
msgs.clear()
|
|
336
|
+
except grpc.RpcError as e:
|
|
337
|
+
# Ignore minor network errors
|
|
338
|
+
# pylint: disable-next=no-member
|
|
339
|
+
if e.code() != grpc.StatusCode.UNAVAILABLE:
|
|
340
|
+
raise e
|
|
341
|
+
|
|
342
|
+
if exit_flag:
|
|
343
|
+
break
|
|
344
|
+
|
|
345
|
+
time.sleep(LOG_UPLOAD_INTERVAL)
|
|
346
|
+
|
|
347
|
+
|
|
348
|
+
def start_log_uploader(
|
|
349
|
+
log_queue: Queue[Optional[str]], node_id: int, run_id: int, stub: DriverStub
|
|
350
|
+
) -> threading.Thread:
|
|
351
|
+
"""Start the log uploader thread and return it."""
|
|
352
|
+
thread = threading.Thread(
|
|
353
|
+
target=_log_uploader, args=(log_queue, node_id, run_id, stub)
|
|
354
|
+
)
|
|
355
|
+
thread.start()
|
|
356
|
+
return thread
|
|
357
|
+
|
|
358
|
+
|
|
359
|
+
def stop_log_uploader(
|
|
360
|
+
log_queue: Queue[Optional[str]], log_uploader: threading.Thread
|
|
361
|
+
) -> None:
|
|
362
|
+
"""Stop the log uploader thread."""
|
|
363
|
+
log_queue.put(None)
|
|
364
|
+
log_uploader.join()
|
{flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/proto/driver_pb2.py
RENAMED
|
@@ -20,7 +20,7 @@ from flwr.proto import run_pb2 as flwr_dot_proto_dot_run__pb2
|
|
|
20
20
|
from flwr.proto import fab_pb2 as flwr_dot_proto_dot_fab__pb2
|
|
21
21
|
|
|
22
22
|
|
|
23
|
-
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x17\x66lwr/proto/driver.proto\x12\nflwr.proto\x1a\x14\x66lwr/proto/log.proto\x1a\x15\x66lwr/proto/node.proto\x1a\x18\x66lwr/proto/message.proto\x1a\x15\x66lwr/proto/task.proto\x1a\x14\x66lwr/proto/run.proto\x1a\x14\x66lwr/proto/fab.proto\"!\n\x0fGetNodesRequest\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\"3\n\x10GetNodesResponse\x12\x1f\n\x05nodes\x18\x01 \x03(\x0b\x32\x10.flwr.proto.Node\"@\n\x12PushTaskInsRequest\x12*\n\rtask_ins_list\x18\x01 \x03(\x0b\x32\x13.flwr.proto.TaskIns\"\'\n\x13PushTaskInsResponse\x12\x10\n\x08task_ids\x18\x02 \x03(\t\"F\n\x12PullTaskResRequest\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\x12\x10\n\x08task_ids\x18\x02 \x03(\t\"A\n\x13PullTaskResResponse\x12*\n\rtask_res_list\x18\x01 \x03(\x0b\x32\x13.flwr.proto.TaskRes\"
|
|
23
|
+
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x17\x66lwr/proto/driver.proto\x12\nflwr.proto\x1a\x14\x66lwr/proto/log.proto\x1a\x15\x66lwr/proto/node.proto\x1a\x18\x66lwr/proto/message.proto\x1a\x15\x66lwr/proto/task.proto\x1a\x14\x66lwr/proto/run.proto\x1a\x14\x66lwr/proto/fab.proto\"!\n\x0fGetNodesRequest\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\"3\n\x10GetNodesResponse\x12\x1f\n\x05nodes\x18\x01 \x03(\x0b\x32\x10.flwr.proto.Node\"@\n\x12PushTaskInsRequest\x12*\n\rtask_ins_list\x18\x01 \x03(\x0b\x32\x13.flwr.proto.TaskIns\"\'\n\x13PushTaskInsResponse\x12\x10\n\x08task_ids\x18\x02 \x03(\t\"F\n\x12PullTaskResRequest\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\x12\x10\n\x08task_ids\x18\x02 \x03(\t\"A\n\x13PullTaskResResponse\x12*\n\rtask_res_list\x18\x01 \x03(\x0b\x32\x13.flwr.proto.TaskRes\"\x1c\n\x1aPullServerAppInputsRequest\"\x7f\n\x1bPullServerAppInputsResponse\x12$\n\x07\x63ontext\x18\x01 \x01(\x0b\x32\x13.flwr.proto.Context\x12\x1c\n\x03run\x18\x02 \x01(\x0b\x32\x0f.flwr.proto.Run\x12\x1c\n\x03\x66\x61\x62\x18\x03 \x01(\x0b\x32\x0f.flwr.proto.Fab\"S\n\x1bPushServerAppOutputsRequest\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\x12$\n\x07\x63ontext\x18\x02 \x01(\x0b\x32\x13.flwr.proto.Context\"\x1e\n\x1cPushServerAppOutputsResponse2\xc5\x06\n\x06\x44river\x12J\n\tCreateRun\x12\x1c.flwr.proto.CreateRunRequest\x1a\x1d.flwr.proto.CreateRunResponse\"\x00\x12G\n\x08GetNodes\x12\x1b.flwr.proto.GetNodesRequest\x1a\x1c.flwr.proto.GetNodesResponse\"\x00\x12P\n\x0bPushTaskIns\x12\x1e.flwr.proto.PushTaskInsRequest\x1a\x1f.flwr.proto.PushTaskInsResponse\"\x00\x12P\n\x0bPullTaskRes\x12\x1e.flwr.proto.PullTaskResRequest\x1a\x1f.flwr.proto.PullTaskResResponse\"\x00\x12\x41\n\x06GetRun\x12\x19.flwr.proto.GetRunRequest\x1a\x1a.flwr.proto.GetRunResponse\"\x00\x12\x41\n\x06GetFab\x12\x19.flwr.proto.GetFabRequest\x1a\x1a.flwr.proto.GetFabResponse\"\x00\x12h\n\x13PullServerAppInputs\x12&.flwr.proto.PullServerAppInputsRequest\x1a\'.flwr.proto.PullServerAppInputsResponse\"\x00\x12k\n\x14PushServerAppOutputs\x12\'.flwr.proto.PushServerAppOutputsRequest\x1a(.flwr.proto.PushServerAppOutputsResponse\"\x00\x12\\\n\x0fUpdateRunStatus\x12\".flwr.proto.UpdateRunStatusRequest\x1a#.flwr.proto.UpdateRunStatusResponse\"\x00\x12G\n\x08PushLogs\x12\x1b.flwr.proto.PushLogsRequest\x1a\x1c.flwr.proto.PushLogsResponse\"\x00\x62\x06proto3')
|
|
24
24
|
|
|
25
25
|
_globals = globals()
|
|
26
26
|
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
|
|
@@ -40,13 +40,13 @@ if _descriptor._USE_C_DESCRIPTORS == False:
|
|
|
40
40
|
_globals['_PULLTASKRESRESPONSE']._serialized_start=444
|
|
41
41
|
_globals['_PULLTASKRESRESPONSE']._serialized_end=509
|
|
42
42
|
_globals['_PULLSERVERAPPINPUTSREQUEST']._serialized_start=511
|
|
43
|
-
_globals['_PULLSERVERAPPINPUTSREQUEST']._serialized_end=
|
|
44
|
-
_globals['_PULLSERVERAPPINPUTSRESPONSE']._serialized_start=
|
|
45
|
-
_globals['_PULLSERVERAPPINPUTSRESPONSE']._serialized_end=
|
|
46
|
-
_globals['_PUSHSERVERAPPOUTPUTSREQUEST']._serialized_start=
|
|
47
|
-
_globals['_PUSHSERVERAPPOUTPUTSREQUEST']._serialized_end=
|
|
48
|
-
_globals['_PUSHSERVERAPPOUTPUTSRESPONSE']._serialized_start=
|
|
49
|
-
_globals['_PUSHSERVERAPPOUTPUTSRESPONSE']._serialized_end=
|
|
50
|
-
_globals['_DRIVER']._serialized_start=
|
|
51
|
-
_globals['_DRIVER']._serialized_end=
|
|
43
|
+
_globals['_PULLSERVERAPPINPUTSREQUEST']._serialized_end=539
|
|
44
|
+
_globals['_PULLSERVERAPPINPUTSRESPONSE']._serialized_start=541
|
|
45
|
+
_globals['_PULLSERVERAPPINPUTSRESPONSE']._serialized_end=668
|
|
46
|
+
_globals['_PUSHSERVERAPPOUTPUTSREQUEST']._serialized_start=670
|
|
47
|
+
_globals['_PUSHSERVERAPPOUTPUTSREQUEST']._serialized_end=753
|
|
48
|
+
_globals['_PUSHSERVERAPPOUTPUTSRESPONSE']._serialized_start=755
|
|
49
|
+
_globals['_PUSHSERVERAPPOUTPUTSRESPONSE']._serialized_end=785
|
|
50
|
+
_globals['_DRIVER']._serialized_start=788
|
|
51
|
+
_globals['_DRIVER']._serialized_end=1625
|
|
52
52
|
# @@protoc_insertion_point(module_scope)
|
{flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/proto/driver_pb2.pyi
RENAMED
|
@@ -98,13 +98,8 @@ global___PullTaskResResponse = PullTaskResResponse
|
|
|
98
98
|
class PullServerAppInputsRequest(google.protobuf.message.Message):
|
|
99
99
|
"""PullServerAppInputs messages"""
|
|
100
100
|
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
|
101
|
-
RUN_ID_FIELD_NUMBER: builtins.int
|
|
102
|
-
run_id: builtins.int
|
|
103
101
|
def __init__(self,
|
|
104
|
-
*,
|
|
105
|
-
run_id: builtins.int = ...,
|
|
106
102
|
) -> None: ...
|
|
107
|
-
def ClearField(self, field_name: typing_extensions.Literal["run_id",b"run_id"]) -> None: ...
|
|
108
103
|
global___PullServerAppInputsRequest = PullServerAppInputsRequest
|
|
109
104
|
|
|
110
105
|
class PullServerAppInputsResponse(google.protobuf.message.Message):
|
{flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/proto/exec_pb2.py
RENAMED
|
@@ -16,7 +16,7 @@ from flwr.proto import fab_pb2 as flwr_dot_proto_dot_fab__pb2
|
|
|
16
16
|
from flwr.proto import transport_pb2 as flwr_dot_proto_dot_transport__pb2
|
|
17
17
|
|
|
18
18
|
|
|
19
|
-
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x15\x66lwr/proto/exec.proto\x12\nflwr.proto\x1a\x14\x66lwr/proto/fab.proto\x1a\x1a\x66lwr/proto/transport.proto\"\xdf\x02\n\x0fStartRunRequest\x12\x1c\n\x03\x66\x61\x62\x18\x01 \x01(\x0b\x32\x0f.flwr.proto.Fab\x12H\n\x0foverride_config\x18\x02 \x03(\x0b\x32/.flwr.proto.StartRunRequest.OverrideConfigEntry\x12L\n\x11\x66\x65\x64\x65ration_config\x18\x03 \x03(\x0b\x32\x31.flwr.proto.StartRunRequest.FederationConfigEntry\x1aI\n\x13OverrideConfigEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12!\n\x05value\x18\x02 \x01(\x0b\x32\x12.flwr.proto.Scalar:\x02\x38\x01\x1aK\n\x15\x46\x65\x64\x65rationConfigEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12!\n\x05value\x18\x02 \x01(\x0b\x32\x12.flwr.proto.Scalar:\x02\x38\x01\"\"\n\x10StartRunResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\"
|
|
19
|
+
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x15\x66lwr/proto/exec.proto\x12\nflwr.proto\x1a\x14\x66lwr/proto/fab.proto\x1a\x1a\x66lwr/proto/transport.proto\"\xdf\x02\n\x0fStartRunRequest\x12\x1c\n\x03\x66\x61\x62\x18\x01 \x01(\x0b\x32\x0f.flwr.proto.Fab\x12H\n\x0foverride_config\x18\x02 \x03(\x0b\x32/.flwr.proto.StartRunRequest.OverrideConfigEntry\x12L\n\x11\x66\x65\x64\x65ration_config\x18\x03 \x03(\x0b\x32\x31.flwr.proto.StartRunRequest.FederationConfigEntry\x1aI\n\x13OverrideConfigEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12!\n\x05value\x18\x02 \x01(\x0b\x32\x12.flwr.proto.Scalar:\x02\x38\x01\x1aK\n\x15\x46\x65\x64\x65rationConfigEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12!\n\x05value\x18\x02 \x01(\x0b\x32\x12.flwr.proto.Scalar:\x02\x38\x01\"\"\n\x10StartRunResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\"<\n\x11StreamLogsRequest\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\x12\x17\n\x0f\x61\x66ter_timestamp\x18\x02 \x01(\x01\"B\n\x12StreamLogsResponse\x12\x12\n\nlog_output\x18\x01 \x01(\t\x12\x18\n\x10latest_timestamp\x18\x02 \x01(\x01\x32\xa0\x01\n\x04\x45xec\x12G\n\x08StartRun\x12\x1b.flwr.proto.StartRunRequest\x1a\x1c.flwr.proto.StartRunResponse\"\x00\x12O\n\nStreamLogs\x12\x1d.flwr.proto.StreamLogsRequest\x1a\x1e.flwr.proto.StreamLogsResponse\"\x00\x30\x01\x62\x06proto3')
|
|
20
20
|
|
|
21
21
|
_globals = globals()
|
|
22
22
|
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
|
|
@@ -36,9 +36,9 @@ if _descriptor._USE_C_DESCRIPTORS == False:
|
|
|
36
36
|
_globals['_STARTRUNRESPONSE']._serialized_start=441
|
|
37
37
|
_globals['_STARTRUNRESPONSE']._serialized_end=475
|
|
38
38
|
_globals['_STREAMLOGSREQUEST']._serialized_start=477
|
|
39
|
-
_globals['_STREAMLOGSREQUEST']._serialized_end=
|
|
40
|
-
_globals['_STREAMLOGSRESPONSE']._serialized_start=
|
|
41
|
-
_globals['_STREAMLOGSRESPONSE']._serialized_end=
|
|
42
|
-
_globals['_EXEC']._serialized_start=
|
|
43
|
-
_globals['_EXEC']._serialized_end=
|
|
39
|
+
_globals['_STREAMLOGSREQUEST']._serialized_end=537
|
|
40
|
+
_globals['_STREAMLOGSRESPONSE']._serialized_start=539
|
|
41
|
+
_globals['_STREAMLOGSRESPONSE']._serialized_end=605
|
|
42
|
+
_globals['_EXEC']._serialized_start=608
|
|
43
|
+
_globals['_EXEC']._serialized_end=768
|
|
44
44
|
# @@protoc_insertion_point(module_scope)
|
{flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/proto/exec_pb2.pyi
RENAMED
|
@@ -78,21 +78,27 @@ global___StartRunResponse = StartRunResponse
|
|
|
78
78
|
class StreamLogsRequest(google.protobuf.message.Message):
|
|
79
79
|
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
|
80
80
|
RUN_ID_FIELD_NUMBER: builtins.int
|
|
81
|
+
AFTER_TIMESTAMP_FIELD_NUMBER: builtins.int
|
|
81
82
|
run_id: builtins.int
|
|
83
|
+
after_timestamp: builtins.float
|
|
82
84
|
def __init__(self,
|
|
83
85
|
*,
|
|
84
86
|
run_id: builtins.int = ...,
|
|
87
|
+
after_timestamp: builtins.float = ...,
|
|
85
88
|
) -> None: ...
|
|
86
|
-
def ClearField(self, field_name: typing_extensions.Literal["run_id",b"run_id"]) -> None: ...
|
|
89
|
+
def ClearField(self, field_name: typing_extensions.Literal["after_timestamp",b"after_timestamp","run_id",b"run_id"]) -> None: ...
|
|
87
90
|
global___StreamLogsRequest = StreamLogsRequest
|
|
88
91
|
|
|
89
92
|
class StreamLogsResponse(google.protobuf.message.Message):
|
|
90
93
|
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
|
91
94
|
LOG_OUTPUT_FIELD_NUMBER: builtins.int
|
|
95
|
+
LATEST_TIMESTAMP_FIELD_NUMBER: builtins.int
|
|
92
96
|
log_output: typing.Text
|
|
97
|
+
latest_timestamp: builtins.float
|
|
93
98
|
def __init__(self,
|
|
94
99
|
*,
|
|
95
100
|
log_output: typing.Text = ...,
|
|
101
|
+
latest_timestamp: builtins.float = ...,
|
|
96
102
|
) -> None: ...
|
|
97
|
-
def ClearField(self, field_name: typing_extensions.Literal["log_output",b"log_output"]) -> None: ...
|
|
103
|
+
def ClearField(self, field_name: typing_extensions.Literal["latest_timestamp",b"latest_timestamp","log_output",b"log_output"]) -> None: ...
|
|
98
104
|
global___StreamLogsResponse = StreamLogsResponse
|
{flwr_nightly-1.13.0.dev20241029 → flwr_nightly-1.13.0.dev20241030}/src/py/flwr/server/app.py
RENAMED
|
@@ -382,9 +382,7 @@ def _flwr_serverapp_scheduler(
|
|
|
382
382
|
|
|
383
383
|
log(
|
|
384
384
|
INFO,
|
|
385
|
-
"Launching `flwr-serverapp` subprocess
|
|
386
|
-
"Connects to SuperLink on %s",
|
|
387
|
-
pending_run_id,
|
|
385
|
+
"Launching `flwr-serverapp` subprocess. Connects to SuperLink on %s",
|
|
388
386
|
driver_api_address,
|
|
389
387
|
)
|
|
390
388
|
# Start ServerApp subprocess
|
|
@@ -392,8 +390,6 @@ def _flwr_serverapp_scheduler(
|
|
|
392
390
|
"flwr-serverapp",
|
|
393
391
|
"--superlink",
|
|
394
392
|
driver_api_address,
|
|
395
|
-
"--run-id",
|
|
396
|
-
str(pending_run_id),
|
|
397
393
|
]
|
|
398
394
|
if ssl_ca_certfile:
|
|
399
395
|
command.append("--root-certificates")
|
|
@@ -19,6 +19,7 @@ import sys
|
|
|
19
19
|
from logging import DEBUG, ERROR, INFO, WARN
|
|
20
20
|
from os.path import isfile
|
|
21
21
|
from pathlib import Path
|
|
22
|
+
from queue import Queue
|
|
22
23
|
from time import sleep
|
|
23
24
|
from typing import Optional
|
|
24
25
|
|
|
@@ -31,7 +32,13 @@ from flwr.common.config import (
|
|
|
31
32
|
get_project_dir,
|
|
32
33
|
)
|
|
33
34
|
from flwr.common.constant import Status, SubStatus
|
|
34
|
-
from flwr.common.logger import
|
|
35
|
+
from flwr.common.logger import (
|
|
36
|
+
log,
|
|
37
|
+
mirror_output_to_queue,
|
|
38
|
+
restore_output,
|
|
39
|
+
start_log_uploader,
|
|
40
|
+
stop_log_uploader,
|
|
41
|
+
)
|
|
35
42
|
from flwr.common.serde import (
|
|
36
43
|
context_from_proto,
|
|
37
44
|
context_to_proto,
|
|
@@ -52,6 +59,10 @@ from flwr.server.run_serverapp import run as run_
|
|
|
52
59
|
|
|
53
60
|
def flwr_serverapp() -> None:
|
|
54
61
|
"""Run process-isolated Flower ServerApp."""
|
|
62
|
+
# Capture stdout/stderr
|
|
63
|
+
log_queue: Queue[Optional[str]] = Queue()
|
|
64
|
+
mirror_output_to_queue(log_queue)
|
|
65
|
+
|
|
55
66
|
log(INFO, "Starting Flower ServerApp")
|
|
56
67
|
|
|
57
68
|
parser = argparse.ArgumentParser(
|
|
@@ -63,11 +74,10 @@ def flwr_serverapp() -> None:
|
|
|
63
74
|
help="Address of SuperLink's DriverAPI",
|
|
64
75
|
)
|
|
65
76
|
parser.add_argument(
|
|
66
|
-
"--run-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
"function will request a pending run to the LinkState.",
|
|
77
|
+
"--run-once",
|
|
78
|
+
action="store_true",
|
|
79
|
+
help="When set, this process will start a single ServerApp "
|
|
80
|
+
"for a pending Run. If no pending run the process will exit. ",
|
|
71
81
|
)
|
|
72
82
|
parser.add_argument(
|
|
73
83
|
"--flwr-dir",
|
|
@@ -100,18 +110,20 @@ def flwr_serverapp() -> None:
|
|
|
100
110
|
|
|
101
111
|
log(
|
|
102
112
|
DEBUG,
|
|
103
|
-
"Staring isolated `ServerApp` connected to SuperLink DriverAPI at %s
|
|
104
|
-
"for run-id %s",
|
|
113
|
+
"Staring isolated `ServerApp` connected to SuperLink DriverAPI at %s",
|
|
105
114
|
args.superlink,
|
|
106
|
-
args.run_id,
|
|
107
115
|
)
|
|
108
116
|
run_serverapp(
|
|
109
117
|
superlink=args.superlink,
|
|
110
|
-
|
|
118
|
+
log_queue=log_queue,
|
|
119
|
+
run_once=args.run_once,
|
|
111
120
|
flwr_dir_=args.flwr_dir,
|
|
112
121
|
certificates=certificates,
|
|
113
122
|
)
|
|
114
123
|
|
|
124
|
+
# Restore stdout/stderr
|
|
125
|
+
restore_output()
|
|
126
|
+
|
|
115
127
|
|
|
116
128
|
def _try_obtain_certificates(
|
|
117
129
|
args: argparse.Namespace,
|
|
@@ -148,7 +160,8 @@ def _try_obtain_certificates(
|
|
|
148
160
|
|
|
149
161
|
def run_serverapp( # pylint: disable=R0914, disable=W0212
|
|
150
162
|
superlink: str,
|
|
151
|
-
|
|
163
|
+
log_queue: Queue[Optional[str]],
|
|
164
|
+
run_once: bool,
|
|
152
165
|
flwr_dir_: Optional[str] = None,
|
|
153
166
|
certificates: Optional[bytes] = None,
|
|
154
167
|
) -> None:
|
|
@@ -160,18 +173,13 @@ def run_serverapp( # pylint: disable=R0914, disable=W0212
|
|
|
160
173
|
|
|
161
174
|
# Resolve directory where FABs are installed
|
|
162
175
|
flwr_dir = get_flwr_dir(flwr_dir_)
|
|
163
|
-
|
|
164
|
-
only_once = run_id is not None
|
|
176
|
+
log_uploader = None
|
|
165
177
|
|
|
166
178
|
while True:
|
|
167
179
|
|
|
168
180
|
try:
|
|
169
181
|
# Pull ServerAppInputs from LinkState
|
|
170
|
-
req = (
|
|
171
|
-
PullServerAppInputsRequest(run_id=run_id)
|
|
172
|
-
if run_id
|
|
173
|
-
else PullServerAppInputsRequest()
|
|
174
|
-
)
|
|
182
|
+
req = PullServerAppInputsRequest()
|
|
175
183
|
res: PullServerAppInputsResponse = driver._stub.PullServerAppInputs(req)
|
|
176
184
|
if not res.HasField("run"):
|
|
177
185
|
sleep(3)
|
|
@@ -184,6 +192,14 @@ def run_serverapp( # pylint: disable=R0914, disable=W0212
|
|
|
184
192
|
|
|
185
193
|
driver.init_run(run.run_id)
|
|
186
194
|
|
|
195
|
+
# Start log uploader for this run
|
|
196
|
+
log_uploader = start_log_uploader(
|
|
197
|
+
log_queue=log_queue,
|
|
198
|
+
node_id=0,
|
|
199
|
+
run_id=run.run_id,
|
|
200
|
+
stub=driver._stub,
|
|
201
|
+
)
|
|
202
|
+
|
|
187
203
|
log(DEBUG, "ServerApp process starts FAB installation.")
|
|
188
204
|
install_from_fab(fab.content, flwr_dir=flwr_dir, skip_prompt=True)
|
|
189
205
|
|
|
@@ -245,9 +261,11 @@ def run_serverapp( # pylint: disable=R0914, disable=W0212
|
|
|
245
261
|
)
|
|
246
262
|
)
|
|
247
263
|
|
|
264
|
+
# Stop log uploader for this run
|
|
265
|
+
if log_uploader:
|
|
266
|
+
stop_log_uploader(log_queue, log_uploader)
|
|
267
|
+
log_uploader = None
|
|
268
|
+
|
|
248
269
|
# Stop the loop if `flwr-serverapp` is expected to process a single run
|
|
249
|
-
if
|
|
270
|
+
if run_once:
|
|
250
271
|
break
|
|
251
|
-
|
|
252
|
-
# Reset the run_id
|
|
253
|
-
run_id = None
|
|
@@ -219,11 +219,8 @@ class DriverServicer(driver_pb2_grpc.DriverServicer):
|
|
|
219
219
|
|
|
220
220
|
# Lock access to LinkState, preventing obtaining the same pending run_id
|
|
221
221
|
with self.lock:
|
|
222
|
-
#
|
|
223
|
-
|
|
224
|
-
run_id: Optional[int] = request.run_id
|
|
225
|
-
else:
|
|
226
|
-
run_id = state.get_pending_run_id()
|
|
222
|
+
# Attempt getting the run_id of a pending run
|
|
223
|
+
run_id = state.get_pending_run_id()
|
|
227
224
|
# If there's no pending run, return an empty response
|
|
228
225
|
if run_id is None:
|
|
229
226
|
return PullServerAppInputsResponse()
|
|
@@ -235,14 +232,12 @@ class DriverServicer(driver_pb2_grpc.DriverServicer):
|
|
|
235
232
|
if run and run.fab_hash:
|
|
236
233
|
if result := ffs.get(run.fab_hash):
|
|
237
234
|
fab = Fab(run.fab_hash, result[0])
|
|
238
|
-
if run and fab:
|
|
235
|
+
if run and fab and serverapp_ctxt:
|
|
239
236
|
# Update run status to STARTING
|
|
240
237
|
if state.update_run_status(run_id, RunStatus(Status.STARTING, "", "")):
|
|
241
238
|
log(INFO, "Starting run %d", run_id)
|
|
242
239
|
return PullServerAppInputsResponse(
|
|
243
|
-
context=(
|
|
244
|
-
context_to_proto(serverapp_ctxt) if serverapp_ctxt else None
|
|
245
|
-
),
|
|
240
|
+
context=context_to_proto(serverapp_ctxt),
|
|
246
241
|
run=run_to_proto(run),
|
|
247
242
|
fab=fab_to_proto(fab),
|
|
248
243
|
)
|
|
@@ -278,7 +273,12 @@ class DriverServicer(driver_pb2_grpc.DriverServicer):
|
|
|
278
273
|
) -> PushLogsResponse:
|
|
279
274
|
"""Push logs."""
|
|
280
275
|
log(DEBUG, "DriverServicer.PushLogs")
|
|
281
|
-
|
|
276
|
+
state = self.state_factory.state()
|
|
277
|
+
|
|
278
|
+
# Add logs to LinkState
|
|
279
|
+
merged_logs = "".join(request.logs)
|
|
280
|
+
state.add_serverapp_log(request.run_id, merged_logs)
|
|
281
|
+
return PushLogsResponse()
|
|
282
282
|
|
|
283
283
|
|
|
284
284
|
def _raise_if(validation_error: bool, detail: str) -> None:
|
|
@@ -21,9 +21,10 @@ from typing import Optional
|
|
|
21
21
|
|
|
22
22
|
from typing_extensions import override
|
|
23
23
|
|
|
24
|
-
from flwr.common
|
|
24
|
+
from flwr.common import Context, RecordSet
|
|
25
|
+
from flwr.common.constant import DRIVER_API_DEFAULT_ADDRESS, Status, SubStatus
|
|
25
26
|
from flwr.common.logger import log
|
|
26
|
-
from flwr.common.typing import Fab, UserConfig
|
|
27
|
+
from flwr.common.typing import Fab, RunStatus, UserConfig
|
|
27
28
|
from flwr.server.superlink.ffs import Ffs
|
|
28
29
|
from flwr.server.superlink.ffs.ffs_factory import FfsFactory
|
|
29
30
|
from flwr.server.superlink.linkstate import LinkState, LinkStateFactory
|
|
@@ -135,6 +136,14 @@ class DeploymentEngine(Executor):
|
|
|
135
136
|
run_id = self.linkstate.create_run(None, None, fab_hash, override_config)
|
|
136
137
|
return run_id
|
|
137
138
|
|
|
139
|
+
def _create_context(self, run_id: int) -> None:
|
|
140
|
+
"""Register a Context for a Run."""
|
|
141
|
+
# Create an empty context for the Run
|
|
142
|
+
context = Context(node_id=0, node_config={}, state=RecordSet(), run_config={})
|
|
143
|
+
|
|
144
|
+
# Register the context at the LinkState
|
|
145
|
+
self.linkstate.set_serverapp_context(run_id=run_id, context=context)
|
|
146
|
+
|
|
138
147
|
@override
|
|
139
148
|
def start_run(
|
|
140
149
|
self,
|
|
@@ -143,18 +152,25 @@ class DeploymentEngine(Executor):
|
|
|
143
152
|
federation_config: UserConfig,
|
|
144
153
|
) -> Optional[int]:
|
|
145
154
|
"""Start run using the Flower Deployment Engine."""
|
|
155
|
+
run_id = None
|
|
146
156
|
try:
|
|
147
157
|
|
|
148
158
|
# Call SuperLink to create run
|
|
149
|
-
run_id
|
|
159
|
+
run_id = self._create_run(
|
|
150
160
|
Fab(hashlib.sha256(fab_file).hexdigest(), fab_file), override_config
|
|
151
161
|
)
|
|
162
|
+
|
|
163
|
+
# Register context for the Run
|
|
164
|
+
self._create_context(run_id=run_id)
|
|
152
165
|
log(INFO, "Created run %s", str(run_id))
|
|
153
166
|
|
|
154
167
|
return run_id
|
|
155
168
|
# pylint: disable-next=broad-except
|
|
156
169
|
except Exception as e:
|
|
157
170
|
log(ERROR, "Could not start run: %s", str(e))
|
|
171
|
+
if run_id:
|
|
172
|
+
run_status = RunStatus(Status.FINISHED, SubStatus.FAILED, str(e))
|
|
173
|
+
self.linkstate.update_run_status(run_id, new_status=run_status)
|
|
158
174
|
return None
|
|
159
175
|
|
|
160
176
|
|