flwr-nightly 1.13.0.dev20241022__tar.gz → 1.13.0.dev20241023__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.dev20241022 → flwr_nightly-1.13.0.dev20241023}/PKG-INFO +1 -1
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/pyproject.toml +1 -1
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/client/app.py +2 -3
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/client/supernode/app.py +6 -8
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/common/constant.py +29 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/common/typing.py +9 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/app.py +70 -1
- flwr_nightly-1.13.0.dev20241023/src/py/flwr/server/serverapp/app.py +78 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/superlink/linkstate/in_memory_linkstate.py +101 -11
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/superlink/linkstate/linkstate.py +49 -1
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/superlink/linkstate/sqlite_linkstate.py +122 -21
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/superlink/linkstate/utils.py +57 -1
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/simulation/run_simulation.py +12 -4
- flwr_nightly-1.13.0.dev20241022/src/py/flwr/server/serverapp/app.py +0 -20
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/LICENSE +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/README.md +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/app.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/build.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/config_utils.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/example.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/install.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/log.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/new.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/.gitignore.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/LICENSE.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/README.baseline.md.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/README.flowertune.md.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/README.md.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/code/__init__.baseline.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/code/client.baseline.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/code/client.huggingface.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/code/client.jax.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/code/client.mlx.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/code/client.numpy.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/code/dataset.baseline.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/code/flwr_tune/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/code/flwr_tune/client_app.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/code/flwr_tune/dataset.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/code/flwr_tune/models.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/code/flwr_tune/server_app.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/code/flwr_tune/strategy.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/code/model.baseline.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/code/server.baseline.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/code/server.huggingface.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/code/server.jax.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/code/server.mlx.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/code/server.sklearn.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/code/strategy.baseline.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/code/task.huggingface.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/code/task.jax.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/code/task.mlx.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/code/task.numpy.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/code/task.sklearn.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/code/task.tensorflow.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/code/utils.baseline.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/pyproject.baseline.toml.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/pyproject.jax.toml.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/run/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/run/run.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/cli/utils.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/client/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/client/client.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/client/client_app.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/client/clientapp/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/client/clientapp/app.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/client/clientapp/clientappio_servicer.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/client/clientapp/utils.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/client/dpfedavg_numpy_client.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/client/grpc_adapter_client/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/client/grpc_adapter_client/connection.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/client/grpc_client/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/client/grpc_client/connection.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/client/grpc_rere_client/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/client/grpc_rere_client/client_interceptor.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/client/grpc_rere_client/connection.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/client/grpc_rere_client/grpc_adapter.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/client/heartbeat.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/client/message_handler/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/client/message_handler/message_handler.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/client/message_handler/task_handler.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/client/mod/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/client/mod/centraldp_mods.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/client/mod/comms_mods.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/client/mod/localdp_mod.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/client/mod/utils.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/client/node_state_tests.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/client/numpy_client.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/client/rest_client/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/client/rest_client/connection.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/client/run_info_store.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/client/supernode/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/client/typing.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/common/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/common/address.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/common/config.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/common/context.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/common/date.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/common/differential_privacy.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/common/differential_privacy_constants.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/common/dp.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/common/exit_handlers.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/common/grpc.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/common/logger.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/common/message.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/common/object_ref.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/common/parameter.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/common/pyproject.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/common/record/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/common/record/configsrecord.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/common/record/conversion_utils.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/common/record/metricsrecord.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/common/record/parametersrecord.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/common/record/recordset.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/common/record/typeddict.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/common/recordset_compat.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/common/retry_invoker.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/common/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/common/secure_aggregation/quantization.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/common/serde.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/common/telemetry.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/common/version.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/clientappio_pb2.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/clientappio_pb2.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/clientappio_pb2_grpc.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/clientappio_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/common_pb2.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/common_pb2.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/common_pb2_grpc.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/common_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/control_pb2.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/control_pb2.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/control_pb2_grpc.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/control_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/driver_pb2.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/driver_pb2.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/driver_pb2_grpc.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/driver_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/error_pb2.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/error_pb2.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/error_pb2_grpc.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/error_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/exec_pb2.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/exec_pb2.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/exec_pb2_grpc.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/exec_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/fab_pb2.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/fab_pb2.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/fab_pb2_grpc.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/fab_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/fleet_pb2.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/fleet_pb2.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/fleet_pb2_grpc.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/grpcadapter_pb2.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/grpcadapter_pb2.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/grpcadapter_pb2_grpc.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/grpcadapter_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/message_pb2.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/message_pb2.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/message_pb2_grpc.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/message_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/node_pb2.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/node_pb2.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/node_pb2_grpc.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/node_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/recordset_pb2.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/recordset_pb2.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/recordset_pb2_grpc.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/recordset_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/run_pb2.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/run_pb2.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/run_pb2_grpc.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/run_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/task_pb2.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/task_pb2.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/task_pb2_grpc.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/task_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/transport_pb2.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/transport_pb2.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/transport_pb2_grpc.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/py.typed +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/client_manager.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/client_proxy.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/compat/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/compat/app.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/compat/app_utils.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/compat/driver_client_proxy.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/compat/legacy_context.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/criterion.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/driver/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/driver/driver.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/driver/grpc_driver.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/driver/inmemory_driver.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/history.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/run_serverapp.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/server.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/server_app.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/server_config.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/serverapp/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/serverapp_components.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/strategy/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/strategy/aggregate.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/strategy/bulyan.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/strategy/fedadagrad.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/strategy/fedadam.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/strategy/fedavg.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/strategy/fedavg_android.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/strategy/fedavgm.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/strategy/fedmedian.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/strategy/fedopt.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/strategy/fedprox.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/strategy/fedyogi.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/strategy/krum.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/strategy/qfedavg.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/strategy/strategy.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/superlink/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/superlink/driver/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/superlink/driver/driver_grpc.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/superlink/driver/driver_servicer.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/superlink/ffs/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/superlink/ffs/disk_ffs.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/superlink/ffs/ffs.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/superlink/ffs/ffs_factory.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/superlink/fleet/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/superlink/fleet/grpc_adapter/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/superlink/fleet/message_handler/message_handler.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/superlink/fleet/vce/vce_api.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/superlink/linkstate/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/superlink/linkstate/linkstate_factory.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/typing.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/utils/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/utils/tensorboard.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/utils/validator.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/workflow/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/workflow/constant.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/workflow/default_workflows.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/simulation/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/simulation/app.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/simulation/ray_transport/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/simulation/ray_transport/utils.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/superexec/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/superexec/app.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/superexec/deployment.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/superexec/exec_grpc.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/superexec/exec_servicer.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/superexec/executor.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/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.dev20241023"
|
|
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.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/client/app.py
RENAMED
|
@@ -37,6 +37,8 @@ from flwr.common import GRPC_MAX_MESSAGE_LENGTH, Context, EventType, Message, ev
|
|
|
37
37
|
from flwr.common.address import parse_address
|
|
38
38
|
from flwr.common.constant import (
|
|
39
39
|
CLIENTAPPIO_API_DEFAULT_ADDRESS,
|
|
40
|
+
ISOLATION_MODE_PROCESS,
|
|
41
|
+
ISOLATION_MODE_SUBPROCESS,
|
|
40
42
|
MISSING_EXTRA_REST,
|
|
41
43
|
RUN_ID_NUM_BYTES,
|
|
42
44
|
TRANSPORT_TYPE_GRPC_ADAPTER,
|
|
@@ -62,9 +64,6 @@ from .message_handler.message_handler import handle_control_message
|
|
|
62
64
|
from .numpy_client import NumPyClient
|
|
63
65
|
from .run_info_store import DeprecatedRunInfoStore
|
|
64
66
|
|
|
65
|
-
ISOLATION_MODE_SUBPROCESS = "subprocess"
|
|
66
|
-
ISOLATION_MODE_PROCESS = "process"
|
|
67
|
-
|
|
68
67
|
|
|
69
68
|
def _check_actionable_client(
|
|
70
69
|
client: Optional[Client], client_fn: Optional[ClientFnExt]
|
|
@@ -31,6 +31,8 @@ from flwr.common import EventType, event
|
|
|
31
31
|
from flwr.common.config import parse_config_args
|
|
32
32
|
from flwr.common.constant import (
|
|
33
33
|
FLEET_API_GRPC_RERE_DEFAULT_ADDRESS,
|
|
34
|
+
ISOLATION_MODE_PROCESS,
|
|
35
|
+
ISOLATION_MODE_SUBPROCESS,
|
|
34
36
|
TRANSPORT_TYPE_GRPC_ADAPTER,
|
|
35
37
|
TRANSPORT_TYPE_GRPC_RERE,
|
|
36
38
|
TRANSPORT_TYPE_REST,
|
|
@@ -38,11 +40,7 @@ from flwr.common.constant import (
|
|
|
38
40
|
from flwr.common.exit_handlers import register_exit_handlers
|
|
39
41
|
from flwr.common.logger import log, warn_deprecated_feature
|
|
40
42
|
|
|
41
|
-
from ..app import
|
|
42
|
-
ISOLATION_MODE_PROCESS,
|
|
43
|
-
ISOLATION_MODE_SUBPROCESS,
|
|
44
|
-
start_client_internal,
|
|
45
|
-
)
|
|
43
|
+
from ..app import start_client_internal
|
|
46
44
|
from ..clientapp.utils import get_load_client_app_fn
|
|
47
45
|
|
|
48
46
|
|
|
@@ -200,10 +198,10 @@ def _parse_args_run_supernode() -> argparse.ArgumentParser:
|
|
|
200
198
|
ISOLATION_MODE_SUBPROCESS,
|
|
201
199
|
ISOLATION_MODE_PROCESS,
|
|
202
200
|
],
|
|
203
|
-
help="Isolation mode when running `ClientApp` (optional, possible values: "
|
|
204
|
-
"`subprocess`, `process`). By default, `ClientApp` runs in the same process "
|
|
201
|
+
help="Isolation mode when running a `ClientApp` (optional, possible values: "
|
|
202
|
+
"`subprocess`, `process`). By default, a `ClientApp` runs in the same process "
|
|
205
203
|
"that executes the SuperNode. Use `subprocess` to configure SuperNode to run "
|
|
206
|
-
"`ClientApp` in a subprocess. Use `process` to indicate that a separate "
|
|
204
|
+
"a `ClientApp` in a subprocess. Use `process` to indicate that a separate "
|
|
207
205
|
"independent process gets created outside of SuperNode.",
|
|
208
206
|
)
|
|
209
207
|
parser.add_argument(
|
{flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/common/constant.py
RENAMED
|
@@ -83,6 +83,10 @@ GRPC_ADAPTER_METADATA_MESSAGE_QUALNAME_KEY = "grpc-message-qualname"
|
|
|
83
83
|
# Message TTL
|
|
84
84
|
MESSAGE_TTL_TOLERANCE = 1e-1
|
|
85
85
|
|
|
86
|
+
# Isolation modes
|
|
87
|
+
ISOLATION_MODE_SUBPROCESS = "subprocess"
|
|
88
|
+
ISOLATION_MODE_PROCESS = "process"
|
|
89
|
+
|
|
86
90
|
|
|
87
91
|
class MessageType:
|
|
88
92
|
"""Message type."""
|
|
@@ -128,3 +132,28 @@ class ErrorCode:
|
|
|
128
132
|
def __new__(cls) -> ErrorCode:
|
|
129
133
|
"""Prevent instantiation."""
|
|
130
134
|
raise TypeError(f"{cls.__name__} cannot be instantiated.")
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
class Status:
|
|
138
|
+
"""Run status."""
|
|
139
|
+
|
|
140
|
+
PENDING = "pending"
|
|
141
|
+
STARTING = "starting"
|
|
142
|
+
RUNNING = "running"
|
|
143
|
+
FINISHED = "finished"
|
|
144
|
+
|
|
145
|
+
def __new__(cls) -> Status:
|
|
146
|
+
"""Prevent instantiation."""
|
|
147
|
+
raise TypeError(f"{cls.__name__} cannot be instantiated.")
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
class SubStatus:
|
|
151
|
+
"""Run sub-status."""
|
|
152
|
+
|
|
153
|
+
COMPLETED = "completed"
|
|
154
|
+
FAILED = "failed"
|
|
155
|
+
STOPPED = "stopped"
|
|
156
|
+
|
|
157
|
+
def __new__(cls) -> SubStatus:
|
|
158
|
+
"""Prevent instantiation."""
|
|
159
|
+
raise TypeError(f"{cls.__name__} cannot be instantiated.")
|
{flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/common/typing.py
RENAMED
|
@@ -218,6 +218,15 @@ class Run:
|
|
|
218
218
|
override_config: UserConfig
|
|
219
219
|
|
|
220
220
|
|
|
221
|
+
@dataclass
|
|
222
|
+
class RunStatus:
|
|
223
|
+
"""Run status information."""
|
|
224
|
+
|
|
225
|
+
status: str
|
|
226
|
+
sub_status: str
|
|
227
|
+
details: str
|
|
228
|
+
|
|
229
|
+
|
|
221
230
|
@dataclass
|
|
222
231
|
class Fab:
|
|
223
232
|
"""Fab file representation."""
|
{flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241023}/src/py/flwr/server/app.py
RENAMED
|
@@ -17,12 +17,14 @@
|
|
|
17
17
|
import argparse
|
|
18
18
|
import csv
|
|
19
19
|
import importlib.util
|
|
20
|
+
import subprocess
|
|
20
21
|
import sys
|
|
21
22
|
import threading
|
|
22
23
|
from collections.abc import Sequence
|
|
23
|
-
from logging import INFO, WARN
|
|
24
|
+
from logging import DEBUG, INFO, WARN
|
|
24
25
|
from os.path import isfile
|
|
25
26
|
from pathlib import Path
|
|
27
|
+
from time import sleep
|
|
26
28
|
from typing import Optional
|
|
27
29
|
|
|
28
30
|
import grpc
|
|
@@ -42,10 +44,13 @@ from flwr.common.constant import (
|
|
|
42
44
|
FLEET_API_GRPC_BIDI_DEFAULT_ADDRESS,
|
|
43
45
|
FLEET_API_GRPC_RERE_DEFAULT_ADDRESS,
|
|
44
46
|
FLEET_API_REST_DEFAULT_ADDRESS,
|
|
47
|
+
ISOLATION_MODE_PROCESS,
|
|
48
|
+
ISOLATION_MODE_SUBPROCESS,
|
|
45
49
|
MISSING_EXTRA_REST,
|
|
46
50
|
TRANSPORT_TYPE_GRPC_ADAPTER,
|
|
47
51
|
TRANSPORT_TYPE_GRPC_RERE,
|
|
48
52
|
TRANSPORT_TYPE_REST,
|
|
53
|
+
Status,
|
|
49
54
|
)
|
|
50
55
|
from flwr.common.exit_handlers import register_exit_handlers
|
|
51
56
|
from flwr.common.logger import log
|
|
@@ -53,6 +58,7 @@ from flwr.common.secure_aggregation.crypto.symmetric_encryption import (
|
|
|
53
58
|
private_key_to_bytes,
|
|
54
59
|
public_key_to_bytes,
|
|
55
60
|
)
|
|
61
|
+
from flwr.common.typing import RunStatus
|
|
56
62
|
from flwr.proto.fleet_pb2_grpc import ( # pylint: disable=E0611
|
|
57
63
|
add_FleetServicer_to_server,
|
|
58
64
|
)
|
|
@@ -333,6 +339,15 @@ def run_superlink() -> None:
|
|
|
333
339
|
)
|
|
334
340
|
grpc_servers.append(exec_server)
|
|
335
341
|
|
|
342
|
+
if args.isolation == ISOLATION_MODE_SUBPROCESS:
|
|
343
|
+
# Scheduler thread
|
|
344
|
+
scheduler_th = threading.Thread(
|
|
345
|
+
target=_flwr_serverapp_scheduler,
|
|
346
|
+
args=(state_factory, args.driver_api_address),
|
|
347
|
+
)
|
|
348
|
+
scheduler_th.start()
|
|
349
|
+
bckg_threads.append(scheduler_th)
|
|
350
|
+
|
|
336
351
|
# Graceful shutdown
|
|
337
352
|
register_exit_handlers(
|
|
338
353
|
event_type=EventType.RUN_SUPERLINK_LEAVE,
|
|
@@ -349,6 +364,47 @@ def run_superlink() -> None:
|
|
|
349
364
|
driver_server.wait_for_termination(timeout=1)
|
|
350
365
|
|
|
351
366
|
|
|
367
|
+
def _flwr_serverapp_scheduler(
|
|
368
|
+
state_factory: LinkStateFactory, driver_api_address: str
|
|
369
|
+
) -> None:
|
|
370
|
+
log(DEBUG, "Started flwr-serverapp scheduler thread.")
|
|
371
|
+
|
|
372
|
+
state = state_factory.state()
|
|
373
|
+
|
|
374
|
+
# Periodically check for a pending run in the LinkState
|
|
375
|
+
while True:
|
|
376
|
+
sleep(3)
|
|
377
|
+
pending_run_id = state.get_pending_run_id()
|
|
378
|
+
|
|
379
|
+
if pending_run_id:
|
|
380
|
+
|
|
381
|
+
# Set run as starting
|
|
382
|
+
state.update_run_status(
|
|
383
|
+
run_id=pending_run_id, new_status=RunStatus(Status.STARTING, "", "")
|
|
384
|
+
)
|
|
385
|
+
log(
|
|
386
|
+
INFO,
|
|
387
|
+
"Launching `flwr-serverapp` subprocess with run-id %d. "
|
|
388
|
+
"Connects to SuperLink on %s",
|
|
389
|
+
pending_run_id,
|
|
390
|
+
driver_api_address,
|
|
391
|
+
)
|
|
392
|
+
# Start ServerApp subprocess
|
|
393
|
+
command = [
|
|
394
|
+
"flwr-serverapp",
|
|
395
|
+
"--superlink",
|
|
396
|
+
driver_api_address,
|
|
397
|
+
"--run-id",
|
|
398
|
+
str(pending_run_id),
|
|
399
|
+
]
|
|
400
|
+
subprocess.run(
|
|
401
|
+
command,
|
|
402
|
+
stdout=None,
|
|
403
|
+
stderr=None,
|
|
404
|
+
check=True,
|
|
405
|
+
)
|
|
406
|
+
|
|
407
|
+
|
|
352
408
|
def _format_address(address: str) -> tuple[str, str, int]:
|
|
353
409
|
parsed_address = parse_address(address)
|
|
354
410
|
if not parsed_address:
|
|
@@ -634,6 +690,19 @@ def _add_args_common(parser: argparse.ArgumentParser) -> None:
|
|
|
634
690
|
"to create a secure connection.",
|
|
635
691
|
type=str,
|
|
636
692
|
)
|
|
693
|
+
parser.add_argument(
|
|
694
|
+
"--isolation",
|
|
695
|
+
default=ISOLATION_MODE_SUBPROCESS,
|
|
696
|
+
required=False,
|
|
697
|
+
choices=[
|
|
698
|
+
ISOLATION_MODE_SUBPROCESS,
|
|
699
|
+
ISOLATION_MODE_PROCESS,
|
|
700
|
+
],
|
|
701
|
+
help="Isolation mode when running a `ServerApp` (`subprocess` by default, "
|
|
702
|
+
"possible values: `subprocess`, `process`). Use `subprocess` to configure "
|
|
703
|
+
"SuperLink to run a `ServerApp` in a subprocess. Use `process` to indicate "
|
|
704
|
+
"that a separate independent process gets created outside of SuperLink.",
|
|
705
|
+
)
|
|
637
706
|
parser.add_argument(
|
|
638
707
|
"--database",
|
|
639
708
|
help="A string representing the path to the database "
|
|
@@ -0,0 +1,78 @@
|
|
|
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 ServerApp process."""
|
|
16
|
+
|
|
17
|
+
import argparse
|
|
18
|
+
from logging import DEBUG, INFO
|
|
19
|
+
from typing import Optional
|
|
20
|
+
|
|
21
|
+
from flwr.common.logger import log
|
|
22
|
+
from flwr.server.driver.grpc_driver import GrpcDriver
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def flwr_serverapp() -> None:
|
|
26
|
+
"""Run process-isolated Flower ServerApp."""
|
|
27
|
+
log(INFO, "Starting Flower ServerApp")
|
|
28
|
+
|
|
29
|
+
parser = argparse.ArgumentParser(
|
|
30
|
+
description="Run a Flower ServerApp",
|
|
31
|
+
)
|
|
32
|
+
parser.add_argument(
|
|
33
|
+
"--superlink",
|
|
34
|
+
type=str,
|
|
35
|
+
help="Address of SuperLink's DriverAPI",
|
|
36
|
+
)
|
|
37
|
+
parser.add_argument(
|
|
38
|
+
"--run-id",
|
|
39
|
+
type=int,
|
|
40
|
+
required=False,
|
|
41
|
+
help="Id of the Run this process should start. If not supplied, this "
|
|
42
|
+
"function will request a pending run to the LinkState.",
|
|
43
|
+
)
|
|
44
|
+
args = parser.parse_args()
|
|
45
|
+
|
|
46
|
+
log(
|
|
47
|
+
DEBUG,
|
|
48
|
+
"Staring isolated `ServerApp` connected to SuperLink DriverAPI at %s "
|
|
49
|
+
"for run-id %s",
|
|
50
|
+
args.superlink,
|
|
51
|
+
args.run_id,
|
|
52
|
+
)
|
|
53
|
+
run_serverapp(superlink=args.superlink, run_id=args.run_id)
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def run_serverapp( # pylint: disable=R0914
|
|
57
|
+
superlink: str,
|
|
58
|
+
run_id: Optional[int] = None,
|
|
59
|
+
) -> None:
|
|
60
|
+
"""Run Flower ServerApp process.
|
|
61
|
+
|
|
62
|
+
Parameters
|
|
63
|
+
----------
|
|
64
|
+
superlink : str
|
|
65
|
+
Address of SuperLink
|
|
66
|
+
run_id : Optional[int] (default: None)
|
|
67
|
+
Unique identifier of a Run registered at the LinkState. If not supplied,
|
|
68
|
+
this function will request a pending run to the LinkState.
|
|
69
|
+
"""
|
|
70
|
+
_ = GrpcDriver(
|
|
71
|
+
run_id=run_id if run_id else 0,
|
|
72
|
+
driver_service_address=superlink,
|
|
73
|
+
root_certificates=None,
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
# Then, GetServerInputs
|
|
77
|
+
|
|
78
|
+
# Then, run ServerApp
|
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
|
|
18
18
|
import threading
|
|
19
19
|
import time
|
|
20
|
+
from dataclasses import dataclass
|
|
20
21
|
from logging import ERROR, WARNING
|
|
21
22
|
from typing import Optional
|
|
22
23
|
from uuid import UUID, uuid4
|
|
@@ -26,13 +27,31 @@ from flwr.common.constant import (
|
|
|
26
27
|
MESSAGE_TTL_TOLERANCE,
|
|
27
28
|
NODE_ID_NUM_BYTES,
|
|
28
29
|
RUN_ID_NUM_BYTES,
|
|
30
|
+
Status,
|
|
29
31
|
)
|
|
30
|
-
from flwr.common.typing import Run, UserConfig
|
|
32
|
+
from flwr.common.typing import Run, RunStatus, UserConfig
|
|
31
33
|
from flwr.proto.task_pb2 import TaskIns, TaskRes # pylint: disable=E0611
|
|
32
34
|
from flwr.server.superlink.linkstate.linkstate import LinkState
|
|
33
35
|
from flwr.server.utils import validate_task_ins_or_res
|
|
34
36
|
|
|
35
|
-
from .utils import
|
|
37
|
+
from .utils import (
|
|
38
|
+
generate_rand_int_from_bytes,
|
|
39
|
+
has_valid_sub_status,
|
|
40
|
+
is_valid_transition,
|
|
41
|
+
make_node_unavailable_taskres,
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
@dataclass
|
|
46
|
+
class RunRecord:
|
|
47
|
+
"""The record of a specific run, including its status and timestamps."""
|
|
48
|
+
|
|
49
|
+
run: Run
|
|
50
|
+
status: RunStatus
|
|
51
|
+
pending_at: str = ""
|
|
52
|
+
starting_at: str = ""
|
|
53
|
+
running_at: str = ""
|
|
54
|
+
finished_at: str = ""
|
|
36
55
|
|
|
37
56
|
|
|
38
57
|
class InMemoryLinkState(LinkState): # pylint: disable=R0902,R0904
|
|
@@ -44,8 +63,8 @@ class InMemoryLinkState(LinkState): # pylint: disable=R0902,R0904
|
|
|
44
63
|
self.node_ids: dict[int, tuple[float, float]] = {}
|
|
45
64
|
self.public_key_to_node_id: dict[bytes, int] = {}
|
|
46
65
|
|
|
47
|
-
# Map run_id to
|
|
48
|
-
self.run_ids: dict[int,
|
|
66
|
+
# Map run_id to RunRecord
|
|
67
|
+
self.run_ids: dict[int, RunRecord] = {}
|
|
49
68
|
self.task_ins_store: dict[UUID, TaskIns] = {}
|
|
50
69
|
self.task_res_store: dict[UUID, TaskRes] = {}
|
|
51
70
|
|
|
@@ -351,13 +370,22 @@ class InMemoryLinkState(LinkState): # pylint: disable=R0902,R0904
|
|
|
351
370
|
run_id = generate_rand_int_from_bytes(RUN_ID_NUM_BYTES)
|
|
352
371
|
|
|
353
372
|
if run_id not in self.run_ids:
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
373
|
+
run_record = RunRecord(
|
|
374
|
+
run=Run(
|
|
375
|
+
run_id=run_id,
|
|
376
|
+
fab_id=fab_id if fab_id else "",
|
|
377
|
+
fab_version=fab_version if fab_version else "",
|
|
378
|
+
fab_hash=fab_hash if fab_hash else "",
|
|
379
|
+
override_config=override_config,
|
|
380
|
+
),
|
|
381
|
+
status=RunStatus(
|
|
382
|
+
status=Status.PENDING,
|
|
383
|
+
sub_status="",
|
|
384
|
+
details="",
|
|
385
|
+
),
|
|
386
|
+
pending_at=now().isoformat(),
|
|
360
387
|
)
|
|
388
|
+
self.run_ids[run_id] = run_record
|
|
361
389
|
return run_id
|
|
362
390
|
log(ERROR, "Unexpected run creation failure.")
|
|
363
391
|
return 0
|
|
@@ -401,7 +429,69 @@ class InMemoryLinkState(LinkState): # pylint: disable=R0902,R0904
|
|
|
401
429
|
if run_id not in self.run_ids:
|
|
402
430
|
log(ERROR, "`run_id` is invalid")
|
|
403
431
|
return None
|
|
404
|
-
return self.run_ids[run_id]
|
|
432
|
+
return self.run_ids[run_id].run
|
|
433
|
+
|
|
434
|
+
def get_run_status(self, run_ids: set[int]) -> dict[int, RunStatus]:
|
|
435
|
+
"""Retrieve the statuses for the specified runs."""
|
|
436
|
+
with self.lock:
|
|
437
|
+
return {
|
|
438
|
+
run_id: self.run_ids[run_id].status
|
|
439
|
+
for run_id in set(run_ids)
|
|
440
|
+
if run_id in self.run_ids
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
def update_run_status(self, run_id: int, new_status: RunStatus) -> bool:
|
|
444
|
+
"""Update the status of the run with the specified `run_id`."""
|
|
445
|
+
with self.lock:
|
|
446
|
+
# Check if the run_id exists
|
|
447
|
+
if run_id not in self.run_ids:
|
|
448
|
+
log(ERROR, "`run_id` is invalid")
|
|
449
|
+
return False
|
|
450
|
+
|
|
451
|
+
# Check if the status transition is valid
|
|
452
|
+
current_status = self.run_ids[run_id].status
|
|
453
|
+
if not is_valid_transition(current_status, new_status):
|
|
454
|
+
log(
|
|
455
|
+
ERROR,
|
|
456
|
+
'Invalid status transition: from "%s" to "%s"',
|
|
457
|
+
current_status.status,
|
|
458
|
+
new_status.status,
|
|
459
|
+
)
|
|
460
|
+
return False
|
|
461
|
+
|
|
462
|
+
# Check if the sub-status is valid
|
|
463
|
+
if not has_valid_sub_status(current_status):
|
|
464
|
+
log(
|
|
465
|
+
ERROR,
|
|
466
|
+
'Invalid sub-status "%s" for status "%s"',
|
|
467
|
+
current_status.sub_status,
|
|
468
|
+
current_status.status,
|
|
469
|
+
)
|
|
470
|
+
return False
|
|
471
|
+
|
|
472
|
+
# Update the status
|
|
473
|
+
run_record = self.run_ids[run_id]
|
|
474
|
+
if new_status.status == Status.STARTING:
|
|
475
|
+
run_record.starting_at = now().isoformat()
|
|
476
|
+
elif new_status.status == Status.RUNNING:
|
|
477
|
+
run_record.running_at = now().isoformat()
|
|
478
|
+
elif new_status.status == Status.FINISHED:
|
|
479
|
+
run_record.finished_at = now().isoformat()
|
|
480
|
+
run_record.status = new_status
|
|
481
|
+
return True
|
|
482
|
+
|
|
483
|
+
def get_pending_run_id(self) -> Optional[int]:
|
|
484
|
+
"""Get the `run_id` of a run with `Status.PENDING` status, if any."""
|
|
485
|
+
pending_run_id = None
|
|
486
|
+
|
|
487
|
+
# Loop through all registered runs
|
|
488
|
+
for run_id, run_rec in self.run_ids.items():
|
|
489
|
+
# Break once a pending run is found
|
|
490
|
+
if run_rec.status.status == Status.PENDING:
|
|
491
|
+
pending_run_id = run_id
|
|
492
|
+
break
|
|
493
|
+
|
|
494
|
+
return pending_run_id
|
|
405
495
|
|
|
406
496
|
def acknowledge_ping(self, node_id: int, ping_interval: float) -> bool:
|
|
407
497
|
"""Acknowledge a ping received from a node, serving as a heartbeat."""
|
|
@@ -19,7 +19,7 @@ import abc
|
|
|
19
19
|
from typing import Optional
|
|
20
20
|
from uuid import UUID
|
|
21
21
|
|
|
22
|
-
from flwr.common.typing import Run, UserConfig
|
|
22
|
+
from flwr.common.typing import Run, RunStatus, UserConfig
|
|
23
23
|
from flwr.proto.task_pb2 import TaskIns, TaskRes # pylint: disable=E0611
|
|
24
24
|
|
|
25
25
|
|
|
@@ -178,6 +178,54 @@ class LinkState(abc.ABC): # pylint: disable=R0904
|
|
|
178
178
|
- `fab_version`: The version of the FAB used in the specified run.
|
|
179
179
|
"""
|
|
180
180
|
|
|
181
|
+
@abc.abstractmethod
|
|
182
|
+
def get_run_status(self, run_ids: set[int]) -> dict[int, RunStatus]:
|
|
183
|
+
"""Retrieve the statuses for the specified runs.
|
|
184
|
+
|
|
185
|
+
Parameters
|
|
186
|
+
----------
|
|
187
|
+
run_ids : set[int]
|
|
188
|
+
A set of run identifiers for which to retrieve statuses.
|
|
189
|
+
|
|
190
|
+
Returns
|
|
191
|
+
-------
|
|
192
|
+
dict[int, RunStatus]
|
|
193
|
+
A dictionary mapping each valid run ID to its corresponding status.
|
|
194
|
+
|
|
195
|
+
Notes
|
|
196
|
+
-----
|
|
197
|
+
Only valid run IDs that exist in the State will be included in the returned
|
|
198
|
+
dictionary. If a run ID is not found, it will be omitted from the result.
|
|
199
|
+
"""
|
|
200
|
+
|
|
201
|
+
@abc.abstractmethod
|
|
202
|
+
def update_run_status(self, run_id: int, new_status: RunStatus) -> bool:
|
|
203
|
+
"""Update the status of the run with the specified `run_id`.
|
|
204
|
+
|
|
205
|
+
Parameters
|
|
206
|
+
----------
|
|
207
|
+
run_id : int
|
|
208
|
+
The identifier of the run.
|
|
209
|
+
new_status : RunStatus
|
|
210
|
+
The new status to be assigned to the run.
|
|
211
|
+
|
|
212
|
+
Returns
|
|
213
|
+
-------
|
|
214
|
+
bool
|
|
215
|
+
True if the status update is successful; False otherwise.
|
|
216
|
+
"""
|
|
217
|
+
|
|
218
|
+
@abc.abstractmethod
|
|
219
|
+
def get_pending_run_id(self) -> Optional[int]:
|
|
220
|
+
"""Get the `run_id` of a run with `Status.PENDING` status.
|
|
221
|
+
|
|
222
|
+
Returns
|
|
223
|
+
-------
|
|
224
|
+
Optional[int]
|
|
225
|
+
The `run_id` of a `Run` that is pending to be started; None if
|
|
226
|
+
there is no Run pending.
|
|
227
|
+
"""
|
|
228
|
+
|
|
181
229
|
@abc.abstractmethod
|
|
182
230
|
def store_server_private_public_key(
|
|
183
231
|
self, private_key: bytes, public_key: bytes
|