flwr-nightly 1.13.0.dev20241022__tar.gz → 1.13.0.dev20241024__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.dev20241024}/PKG-INFO +1 -1
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/pyproject.toml +1 -1
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/client/app.py +2 -3
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/client/supernode/app.py +6 -8
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/common/constant.py +29 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/common/typing.py +9 -0
- flwr_nightly-1.13.0.dev20241024/src/py/flwr/proto/driver_pb2.py +51 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/proto/driver_pb2.pyi +59 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/proto/driver_pb2_grpc.py +68 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/proto/driver_pb2_grpc.pyi +26 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/server/app.py +74 -3
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/server/run_serverapp.py +13 -9
- flwr_nightly-1.13.0.dev20241024/src/py/flwr/server/serverapp/app.py +78 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/server/superlink/driver/driver_servicer.py +16 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/server/superlink/linkstate/in_memory_linkstate.py +113 -12
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/server/superlink/linkstate/linkstate.py +78 -1
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/server/superlink/linkstate/sqlite_linkstate.py +173 -27
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/server/superlink/linkstate/utils.py +69 -2
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/simulation/run_simulation.py +23 -7
- flwr_nightly-1.13.0.dev20241024/src/py/flwr/superexec/app.py +58 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/superexec/deployment.py +34 -25
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/superexec/exec_grpc.py +15 -8
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/superexec/exec_servicer.py +11 -1
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/superexec/executor.py +19 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/superexec/simulation.py +8 -0
- flwr_nightly-1.13.0.dev20241022/src/py/flwr/client/node_state_tests.py +0 -65
- flwr_nightly-1.13.0.dev20241022/src/py/flwr/proto/driver_pb2.py +0 -42
- flwr_nightly-1.13.0.dev20241022/src/py/flwr/server/serverapp/app.py +0 -20
- flwr_nightly-1.13.0.dev20241022/src/py/flwr/superexec/app.py +0 -193
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/LICENSE +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/README.md +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/cli/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/cli/app.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/cli/build.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/cli/config_utils.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/cli/example.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/cli/install.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/cli/log.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/cli/new/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/cli/new/new.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/cli/new/templates/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/cli/new/templates/app/.gitignore.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/cli/new/templates/app/LICENSE.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/cli/new/templates/app/README.baseline.md.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/cli/new/templates/app/README.flowertune.md.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/cli/new/templates/app/README.md.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/cli/new/templates/app/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/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.dev20241024}/src/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/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.dev20241024}/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.dev20241024}/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.dev20241024}/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.dev20241024}/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.dev20241024}/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.dev20241024}/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.dev20241024}/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.dev20241024}/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.dev20241024}/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.dev20241024}/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.dev20241024}/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.dev20241024}/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.dev20241024}/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.dev20241024}/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.dev20241024}/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.dev20241024}/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.dev20241024}/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.dev20241024}/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.dev20241024}/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.dev20241024}/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.dev20241024}/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.dev20241024}/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.dev20241024}/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.dev20241024}/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.dev20241024}/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.dev20241024}/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.dev20241024}/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.dev20241024}/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.dev20241024}/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.dev20241024}/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.dev20241024}/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.dev20241024}/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.dev20241024}/src/py/flwr/cli/new/templates/app/pyproject.baseline.toml.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/cli/new/templates/app/pyproject.jax.toml.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/cli/run/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/cli/run/run.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/cli/utils.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/client/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/client/client.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/client/client_app.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/client/clientapp/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/client/clientapp/app.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/client/clientapp/clientappio_servicer.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/client/clientapp/utils.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/client/dpfedavg_numpy_client.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/client/grpc_adapter_client/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/client/grpc_adapter_client/connection.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/client/grpc_client/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/client/grpc_client/connection.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/client/grpc_rere_client/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/client/grpc_rere_client/client_interceptor.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/client/grpc_rere_client/connection.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/client/grpc_rere_client/grpc_adapter.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/client/heartbeat.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/client/message_handler/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/client/message_handler/message_handler.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/client/message_handler/task_handler.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/client/mod/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/client/mod/centraldp_mods.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/client/mod/comms_mods.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/client/mod/localdp_mod.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/client/mod/utils.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/client/numpy_client.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/client/rest_client/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/client/rest_client/connection.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/client/run_info_store.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/client/supernode/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/client/typing.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/common/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/common/address.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/common/config.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/common/context.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/common/date.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/common/differential_privacy.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/common/differential_privacy_constants.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/common/dp.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/common/exit_handlers.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/common/grpc.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/common/logger.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/common/message.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/common/object_ref.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/common/parameter.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/common/pyproject.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/common/record/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/common/record/configsrecord.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/common/record/conversion_utils.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/common/record/metricsrecord.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/common/record/parametersrecord.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/common/record/recordset.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/common/record/typeddict.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/common/recordset_compat.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/common/retry_invoker.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/common/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/common/secure_aggregation/quantization.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/common/serde.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/common/telemetry.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/common/version.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/proto/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/proto/clientappio_pb2.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/proto/clientappio_pb2.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/proto/clientappio_pb2_grpc.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/proto/clientappio_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/proto/common_pb2.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/proto/common_pb2.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/proto/common_pb2_grpc.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/proto/common_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/proto/control_pb2.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/proto/control_pb2.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/proto/control_pb2_grpc.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/proto/control_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/proto/error_pb2.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/proto/error_pb2.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/proto/error_pb2_grpc.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/proto/error_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/proto/exec_pb2.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/proto/exec_pb2.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/proto/exec_pb2_grpc.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/proto/exec_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/proto/fab_pb2.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/proto/fab_pb2.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/proto/fab_pb2_grpc.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/proto/fab_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/proto/fleet_pb2.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/proto/fleet_pb2.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/proto/fleet_pb2_grpc.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/proto/grpcadapter_pb2.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/proto/grpcadapter_pb2.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/proto/grpcadapter_pb2_grpc.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/proto/grpcadapter_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/proto/message_pb2.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/proto/message_pb2.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/proto/message_pb2_grpc.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/proto/message_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/proto/node_pb2.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/proto/node_pb2.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/proto/node_pb2_grpc.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/proto/node_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/proto/recordset_pb2.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/proto/recordset_pb2.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/proto/recordset_pb2_grpc.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/proto/recordset_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/proto/run_pb2.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/proto/run_pb2.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/proto/run_pb2_grpc.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/proto/run_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/proto/task_pb2.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/proto/task_pb2.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/proto/task_pb2_grpc.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/proto/task_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/proto/transport_pb2.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/proto/transport_pb2.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/proto/transport_pb2_grpc.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/py.typed +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/server/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/server/client_manager.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/server/client_proxy.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/server/compat/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/server/compat/app.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/server/compat/app_utils.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/server/compat/driver_client_proxy.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/server/compat/legacy_context.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/server/criterion.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/server/driver/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/server/driver/driver.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/server/driver/grpc_driver.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/server/driver/inmemory_driver.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/server/history.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/server/server.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/server/server_app.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/server/server_config.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/server/serverapp/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/server/serverapp_components.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/server/strategy/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/server/strategy/aggregate.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/server/strategy/bulyan.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/server/strategy/fedadagrad.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/server/strategy/fedadam.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/server/strategy/fedavg.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/server/strategy/fedavg_android.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/server/strategy/fedavgm.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/server/strategy/fedmedian.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/server/strategy/fedopt.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/server/strategy/fedprox.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/server/strategy/fedyogi.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/server/strategy/krum.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/server/strategy/qfedavg.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/server/strategy/strategy.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/server/superlink/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/server/superlink/driver/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/server/superlink/driver/driver_grpc.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/server/superlink/ffs/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/server/superlink/ffs/disk_ffs.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/server/superlink/ffs/ffs.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/server/superlink/ffs/ffs_factory.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/server/superlink/fleet/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/server/superlink/fleet/grpc_adapter/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/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.dev20241024}/src/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/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.dev20241024}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/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.dev20241024}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/server/superlink/fleet/message_handler/message_handler.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/server/superlink/fleet/vce/vce_api.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/server/superlink/linkstate/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/server/superlink/linkstate/linkstate_factory.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/server/typing.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/server/utils/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/server/utils/tensorboard.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/server/utils/validator.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/server/workflow/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/server/workflow/constant.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/server/workflow/default_workflows.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/simulation/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/simulation/app.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/simulation/ray_transport/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/simulation/ray_transport/utils.py +0 -0
- {flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/superexec/__init__.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.dev20241024"
|
|
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.dev20241024}/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.dev20241024}/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.dev20241024}/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."""
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
|
3
|
+
# source: flwr/proto/driver.proto
|
|
4
|
+
# Protobuf Python Version: 4.25.0
|
|
5
|
+
"""Generated protocol buffer code."""
|
|
6
|
+
from google.protobuf import descriptor as _descriptor
|
|
7
|
+
from google.protobuf import descriptor_pool as _descriptor_pool
|
|
8
|
+
from google.protobuf import symbol_database as _symbol_database
|
|
9
|
+
from google.protobuf.internal import builder as _builder
|
|
10
|
+
# @@protoc_insertion_point(imports)
|
|
11
|
+
|
|
12
|
+
_sym_db = _symbol_database.Default()
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
from flwr.proto import node_pb2 as flwr_dot_proto_dot_node__pb2
|
|
16
|
+
from flwr.proto import message_pb2 as flwr_dot_proto_dot_message__pb2
|
|
17
|
+
from flwr.proto import task_pb2 as flwr_dot_proto_dot_task__pb2
|
|
18
|
+
from flwr.proto import run_pb2 as flwr_dot_proto_dot_run__pb2
|
|
19
|
+
from flwr.proto import fab_pb2 as flwr_dot_proto_dot_fab__pb2
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x17\x66lwr/proto/driver.proto\x12\nflwr.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\",\n\x1aPullServerAppInputsRequest\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\"\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\x9e\x05\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\x62\x06proto3')
|
|
23
|
+
|
|
24
|
+
_globals = globals()
|
|
25
|
+
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
|
|
26
|
+
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'flwr.proto.driver_pb2', _globals)
|
|
27
|
+
if _descriptor._USE_C_DESCRIPTORS == False:
|
|
28
|
+
DESCRIPTOR._options = None
|
|
29
|
+
_globals['_GETNODESREQUEST']._serialized_start=155
|
|
30
|
+
_globals['_GETNODESREQUEST']._serialized_end=188
|
|
31
|
+
_globals['_GETNODESRESPONSE']._serialized_start=190
|
|
32
|
+
_globals['_GETNODESRESPONSE']._serialized_end=241
|
|
33
|
+
_globals['_PUSHTASKINSREQUEST']._serialized_start=243
|
|
34
|
+
_globals['_PUSHTASKINSREQUEST']._serialized_end=307
|
|
35
|
+
_globals['_PUSHTASKINSRESPONSE']._serialized_start=309
|
|
36
|
+
_globals['_PUSHTASKINSRESPONSE']._serialized_end=348
|
|
37
|
+
_globals['_PULLTASKRESREQUEST']._serialized_start=350
|
|
38
|
+
_globals['_PULLTASKRESREQUEST']._serialized_end=420
|
|
39
|
+
_globals['_PULLTASKRESRESPONSE']._serialized_start=422
|
|
40
|
+
_globals['_PULLTASKRESRESPONSE']._serialized_end=487
|
|
41
|
+
_globals['_PULLSERVERAPPINPUTSREQUEST']._serialized_start=489
|
|
42
|
+
_globals['_PULLSERVERAPPINPUTSREQUEST']._serialized_end=533
|
|
43
|
+
_globals['_PULLSERVERAPPINPUTSRESPONSE']._serialized_start=535
|
|
44
|
+
_globals['_PULLSERVERAPPINPUTSRESPONSE']._serialized_end=662
|
|
45
|
+
_globals['_PUSHSERVERAPPOUTPUTSREQUEST']._serialized_start=664
|
|
46
|
+
_globals['_PUSHSERVERAPPOUTPUTSREQUEST']._serialized_end=747
|
|
47
|
+
_globals['_PUSHSERVERAPPOUTPUTSRESPONSE']._serialized_start=749
|
|
48
|
+
_globals['_PUSHSERVERAPPOUTPUTSRESPONSE']._serialized_end=779
|
|
49
|
+
_globals['_DRIVER']._serialized_start=782
|
|
50
|
+
_globals['_DRIVER']._serialized_end=1452
|
|
51
|
+
# @@protoc_insertion_point(module_scope)
|
{flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/src/py/flwr/proto/driver_pb2.pyi
RENAMED
|
@@ -3,7 +3,10 @@
|
|
|
3
3
|
isort:skip_file
|
|
4
4
|
"""
|
|
5
5
|
import builtins
|
|
6
|
+
import flwr.proto.fab_pb2
|
|
7
|
+
import flwr.proto.message_pb2
|
|
6
8
|
import flwr.proto.node_pb2
|
|
9
|
+
import flwr.proto.run_pb2
|
|
7
10
|
import flwr.proto.task_pb2
|
|
8
11
|
import google.protobuf.descriptor
|
|
9
12
|
import google.protobuf.internal.containers
|
|
@@ -91,3 +94,59 @@ class PullTaskResResponse(google.protobuf.message.Message):
|
|
|
91
94
|
) -> None: ...
|
|
92
95
|
def ClearField(self, field_name: typing_extensions.Literal["task_res_list",b"task_res_list"]) -> None: ...
|
|
93
96
|
global___PullTaskResResponse = PullTaskResResponse
|
|
97
|
+
|
|
98
|
+
class PullServerAppInputsRequest(google.protobuf.message.Message):
|
|
99
|
+
"""PullServerAppInputs messages"""
|
|
100
|
+
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
|
101
|
+
RUN_ID_FIELD_NUMBER: builtins.int
|
|
102
|
+
run_id: builtins.int
|
|
103
|
+
def __init__(self,
|
|
104
|
+
*,
|
|
105
|
+
run_id: builtins.int = ...,
|
|
106
|
+
) -> None: ...
|
|
107
|
+
def ClearField(self, field_name: typing_extensions.Literal["run_id",b"run_id"]) -> None: ...
|
|
108
|
+
global___PullServerAppInputsRequest = PullServerAppInputsRequest
|
|
109
|
+
|
|
110
|
+
class PullServerAppInputsResponse(google.protobuf.message.Message):
|
|
111
|
+
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
|
112
|
+
CONTEXT_FIELD_NUMBER: builtins.int
|
|
113
|
+
RUN_FIELD_NUMBER: builtins.int
|
|
114
|
+
FAB_FIELD_NUMBER: builtins.int
|
|
115
|
+
@property
|
|
116
|
+
def context(self) -> flwr.proto.message_pb2.Context: ...
|
|
117
|
+
@property
|
|
118
|
+
def run(self) -> flwr.proto.run_pb2.Run: ...
|
|
119
|
+
@property
|
|
120
|
+
def fab(self) -> flwr.proto.fab_pb2.Fab: ...
|
|
121
|
+
def __init__(self,
|
|
122
|
+
*,
|
|
123
|
+
context: typing.Optional[flwr.proto.message_pb2.Context] = ...,
|
|
124
|
+
run: typing.Optional[flwr.proto.run_pb2.Run] = ...,
|
|
125
|
+
fab: typing.Optional[flwr.proto.fab_pb2.Fab] = ...,
|
|
126
|
+
) -> None: ...
|
|
127
|
+
def HasField(self, field_name: typing_extensions.Literal["context",b"context","fab",b"fab","run",b"run"]) -> builtins.bool: ...
|
|
128
|
+
def ClearField(self, field_name: typing_extensions.Literal["context",b"context","fab",b"fab","run",b"run"]) -> None: ...
|
|
129
|
+
global___PullServerAppInputsResponse = PullServerAppInputsResponse
|
|
130
|
+
|
|
131
|
+
class PushServerAppOutputsRequest(google.protobuf.message.Message):
|
|
132
|
+
"""PushServerAppOutputs messages"""
|
|
133
|
+
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
|
134
|
+
RUN_ID_FIELD_NUMBER: builtins.int
|
|
135
|
+
CONTEXT_FIELD_NUMBER: builtins.int
|
|
136
|
+
run_id: builtins.int
|
|
137
|
+
@property
|
|
138
|
+
def context(self) -> flwr.proto.message_pb2.Context: ...
|
|
139
|
+
def __init__(self,
|
|
140
|
+
*,
|
|
141
|
+
run_id: builtins.int = ...,
|
|
142
|
+
context: typing.Optional[flwr.proto.message_pb2.Context] = ...,
|
|
143
|
+
) -> None: ...
|
|
144
|
+
def HasField(self, field_name: typing_extensions.Literal["context",b"context"]) -> builtins.bool: ...
|
|
145
|
+
def ClearField(self, field_name: typing_extensions.Literal["context",b"context","run_id",b"run_id"]) -> None: ...
|
|
146
|
+
global___PushServerAppOutputsRequest = PushServerAppOutputsRequest
|
|
147
|
+
|
|
148
|
+
class PushServerAppOutputsResponse(google.protobuf.message.Message):
|
|
149
|
+
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
|
150
|
+
def __init__(self,
|
|
151
|
+
) -> None: ...
|
|
152
|
+
global___PushServerAppOutputsResponse = PushServerAppOutputsResponse
|
|
@@ -46,6 +46,16 @@ class DriverStub(object):
|
|
|
46
46
|
request_serializer=flwr_dot_proto_dot_fab__pb2.GetFabRequest.SerializeToString,
|
|
47
47
|
response_deserializer=flwr_dot_proto_dot_fab__pb2.GetFabResponse.FromString,
|
|
48
48
|
)
|
|
49
|
+
self.PullServerAppInputs = channel.unary_unary(
|
|
50
|
+
'/flwr.proto.Driver/PullServerAppInputs',
|
|
51
|
+
request_serializer=flwr_dot_proto_dot_driver__pb2.PullServerAppInputsRequest.SerializeToString,
|
|
52
|
+
response_deserializer=flwr_dot_proto_dot_driver__pb2.PullServerAppInputsResponse.FromString,
|
|
53
|
+
)
|
|
54
|
+
self.PushServerAppOutputs = channel.unary_unary(
|
|
55
|
+
'/flwr.proto.Driver/PushServerAppOutputs',
|
|
56
|
+
request_serializer=flwr_dot_proto_dot_driver__pb2.PushServerAppOutputsRequest.SerializeToString,
|
|
57
|
+
response_deserializer=flwr_dot_proto_dot_driver__pb2.PushServerAppOutputsResponse.FromString,
|
|
58
|
+
)
|
|
49
59
|
|
|
50
60
|
|
|
51
61
|
class DriverServicer(object):
|
|
@@ -93,6 +103,20 @@ class DriverServicer(object):
|
|
|
93
103
|
context.set_details('Method not implemented!')
|
|
94
104
|
raise NotImplementedError('Method not implemented!')
|
|
95
105
|
|
|
106
|
+
def PullServerAppInputs(self, request, context):
|
|
107
|
+
"""Pull ServerApp inputs
|
|
108
|
+
"""
|
|
109
|
+
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
|
|
110
|
+
context.set_details('Method not implemented!')
|
|
111
|
+
raise NotImplementedError('Method not implemented!')
|
|
112
|
+
|
|
113
|
+
def PushServerAppOutputs(self, request, context):
|
|
114
|
+
"""Push ServerApp outputs
|
|
115
|
+
"""
|
|
116
|
+
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
|
|
117
|
+
context.set_details('Method not implemented!')
|
|
118
|
+
raise NotImplementedError('Method not implemented!')
|
|
119
|
+
|
|
96
120
|
|
|
97
121
|
def add_DriverServicer_to_server(servicer, server):
|
|
98
122
|
rpc_method_handlers = {
|
|
@@ -126,6 +150,16 @@ def add_DriverServicer_to_server(servicer, server):
|
|
|
126
150
|
request_deserializer=flwr_dot_proto_dot_fab__pb2.GetFabRequest.FromString,
|
|
127
151
|
response_serializer=flwr_dot_proto_dot_fab__pb2.GetFabResponse.SerializeToString,
|
|
128
152
|
),
|
|
153
|
+
'PullServerAppInputs': grpc.unary_unary_rpc_method_handler(
|
|
154
|
+
servicer.PullServerAppInputs,
|
|
155
|
+
request_deserializer=flwr_dot_proto_dot_driver__pb2.PullServerAppInputsRequest.FromString,
|
|
156
|
+
response_serializer=flwr_dot_proto_dot_driver__pb2.PullServerAppInputsResponse.SerializeToString,
|
|
157
|
+
),
|
|
158
|
+
'PushServerAppOutputs': grpc.unary_unary_rpc_method_handler(
|
|
159
|
+
servicer.PushServerAppOutputs,
|
|
160
|
+
request_deserializer=flwr_dot_proto_dot_driver__pb2.PushServerAppOutputsRequest.FromString,
|
|
161
|
+
response_serializer=flwr_dot_proto_dot_driver__pb2.PushServerAppOutputsResponse.SerializeToString,
|
|
162
|
+
),
|
|
129
163
|
}
|
|
130
164
|
generic_handler = grpc.method_handlers_generic_handler(
|
|
131
165
|
'flwr.proto.Driver', rpc_method_handlers)
|
|
@@ -237,3 +271,37 @@ class Driver(object):
|
|
|
237
271
|
flwr_dot_proto_dot_fab__pb2.GetFabResponse.FromString,
|
|
238
272
|
options, channel_credentials,
|
|
239
273
|
insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
|
|
274
|
+
|
|
275
|
+
@staticmethod
|
|
276
|
+
def PullServerAppInputs(request,
|
|
277
|
+
target,
|
|
278
|
+
options=(),
|
|
279
|
+
channel_credentials=None,
|
|
280
|
+
call_credentials=None,
|
|
281
|
+
insecure=False,
|
|
282
|
+
compression=None,
|
|
283
|
+
wait_for_ready=None,
|
|
284
|
+
timeout=None,
|
|
285
|
+
metadata=None):
|
|
286
|
+
return grpc.experimental.unary_unary(request, target, '/flwr.proto.Driver/PullServerAppInputs',
|
|
287
|
+
flwr_dot_proto_dot_driver__pb2.PullServerAppInputsRequest.SerializeToString,
|
|
288
|
+
flwr_dot_proto_dot_driver__pb2.PullServerAppInputsResponse.FromString,
|
|
289
|
+
options, channel_credentials,
|
|
290
|
+
insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
|
|
291
|
+
|
|
292
|
+
@staticmethod
|
|
293
|
+
def PushServerAppOutputs(request,
|
|
294
|
+
target,
|
|
295
|
+
options=(),
|
|
296
|
+
channel_credentials=None,
|
|
297
|
+
call_credentials=None,
|
|
298
|
+
insecure=False,
|
|
299
|
+
compression=None,
|
|
300
|
+
wait_for_ready=None,
|
|
301
|
+
timeout=None,
|
|
302
|
+
metadata=None):
|
|
303
|
+
return grpc.experimental.unary_unary(request, target, '/flwr.proto.Driver/PushServerAppOutputs',
|
|
304
|
+
flwr_dot_proto_dot_driver__pb2.PushServerAppOutputsRequest.SerializeToString,
|
|
305
|
+
flwr_dot_proto_dot_driver__pb2.PushServerAppOutputsResponse.FromString,
|
|
306
|
+
options, channel_credentials,
|
|
307
|
+
insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
|
|
@@ -40,6 +40,16 @@ class DriverStub:
|
|
|
40
40
|
flwr.proto.fab_pb2.GetFabResponse]
|
|
41
41
|
"""Get FAB"""
|
|
42
42
|
|
|
43
|
+
PullServerAppInputs: grpc.UnaryUnaryMultiCallable[
|
|
44
|
+
flwr.proto.driver_pb2.PullServerAppInputsRequest,
|
|
45
|
+
flwr.proto.driver_pb2.PullServerAppInputsResponse]
|
|
46
|
+
"""Pull ServerApp inputs"""
|
|
47
|
+
|
|
48
|
+
PushServerAppOutputs: grpc.UnaryUnaryMultiCallable[
|
|
49
|
+
flwr.proto.driver_pb2.PushServerAppOutputsRequest,
|
|
50
|
+
flwr.proto.driver_pb2.PushServerAppOutputsResponse]
|
|
51
|
+
"""Push ServerApp outputs"""
|
|
52
|
+
|
|
43
53
|
|
|
44
54
|
class DriverServicer(metaclass=abc.ABCMeta):
|
|
45
55
|
@abc.abstractmethod
|
|
@@ -90,5 +100,21 @@ class DriverServicer(metaclass=abc.ABCMeta):
|
|
|
90
100
|
"""Get FAB"""
|
|
91
101
|
pass
|
|
92
102
|
|
|
103
|
+
@abc.abstractmethod
|
|
104
|
+
def PullServerAppInputs(self,
|
|
105
|
+
request: flwr.proto.driver_pb2.PullServerAppInputsRequest,
|
|
106
|
+
context: grpc.ServicerContext,
|
|
107
|
+
) -> flwr.proto.driver_pb2.PullServerAppInputsResponse:
|
|
108
|
+
"""Pull ServerApp inputs"""
|
|
109
|
+
pass
|
|
110
|
+
|
|
111
|
+
@abc.abstractmethod
|
|
112
|
+
def PushServerAppOutputs(self,
|
|
113
|
+
request: flwr.proto.driver_pb2.PushServerAppOutputsRequest,
|
|
114
|
+
context: grpc.ServicerContext,
|
|
115
|
+
) -> flwr.proto.driver_pb2.PushServerAppOutputsResponse:
|
|
116
|
+
"""Push ServerApp outputs"""
|
|
117
|
+
pass
|
|
118
|
+
|
|
93
119
|
|
|
94
120
|
def add_DriverServicer_to_server(servicer: DriverServicer, server: grpc.Server) -> None: ...
|
{flwr_nightly-1.13.0.dev20241022 → flwr_nightly-1.13.0.dev20241024}/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,12 +58,13 @@ 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
|
)
|
|
59
65
|
from flwr.proto.grpcadapter_pb2_grpc import add_GrpcAdapterServicer_to_server
|
|
60
66
|
from flwr.superexec.app import load_executor
|
|
61
|
-
from flwr.superexec.exec_grpc import
|
|
67
|
+
from flwr.superexec.exec_grpc import run_exec_api_grpc
|
|
62
68
|
|
|
63
69
|
from .client_manager import ClientManager
|
|
64
70
|
from .history import History
|
|
@@ -323,8 +329,10 @@ def run_superlink() -> None:
|
|
|
323
329
|
raise ValueError(f"Unknown fleet_api_type: {args.fleet_api_type}")
|
|
324
330
|
|
|
325
331
|
# Start Exec API
|
|
326
|
-
exec_server: grpc.Server =
|
|
332
|
+
exec_server: grpc.Server = run_exec_api_grpc(
|
|
327
333
|
address=exec_address,
|
|
334
|
+
state_factory=state_factory,
|
|
335
|
+
ffs_factory=ffs_factory,
|
|
328
336
|
executor=load_executor(args),
|
|
329
337
|
certificates=certificates,
|
|
330
338
|
config=parse_config_args(
|
|
@@ -333,6 +341,15 @@ def run_superlink() -> None:
|
|
|
333
341
|
)
|
|
334
342
|
grpc_servers.append(exec_server)
|
|
335
343
|
|
|
344
|
+
if args.isolation == ISOLATION_MODE_SUBPROCESS:
|
|
345
|
+
# Scheduler thread
|
|
346
|
+
scheduler_th = threading.Thread(
|
|
347
|
+
target=_flwr_serverapp_scheduler,
|
|
348
|
+
args=(state_factory, args.driver_api_address),
|
|
349
|
+
)
|
|
350
|
+
scheduler_th.start()
|
|
351
|
+
bckg_threads.append(scheduler_th)
|
|
352
|
+
|
|
336
353
|
# Graceful shutdown
|
|
337
354
|
register_exit_handlers(
|
|
338
355
|
event_type=EventType.RUN_SUPERLINK_LEAVE,
|
|
@@ -349,6 +366,47 @@ def run_superlink() -> None:
|
|
|
349
366
|
driver_server.wait_for_termination(timeout=1)
|
|
350
367
|
|
|
351
368
|
|
|
369
|
+
def _flwr_serverapp_scheduler(
|
|
370
|
+
state_factory: LinkStateFactory, driver_api_address: str
|
|
371
|
+
) -> None:
|
|
372
|
+
log(DEBUG, "Started flwr-serverapp scheduler thread.")
|
|
373
|
+
|
|
374
|
+
state = state_factory.state()
|
|
375
|
+
|
|
376
|
+
# Periodically check for a pending run in the LinkState
|
|
377
|
+
while True:
|
|
378
|
+
sleep(3)
|
|
379
|
+
pending_run_id = state.get_pending_run_id()
|
|
380
|
+
|
|
381
|
+
if pending_run_id:
|
|
382
|
+
|
|
383
|
+
# Set run as starting
|
|
384
|
+
state.update_run_status(
|
|
385
|
+
run_id=pending_run_id, new_status=RunStatus(Status.STARTING, "", "")
|
|
386
|
+
)
|
|
387
|
+
log(
|
|
388
|
+
INFO,
|
|
389
|
+
"Launching `flwr-serverapp` subprocess with run-id %d. "
|
|
390
|
+
"Connects to SuperLink on %s",
|
|
391
|
+
pending_run_id,
|
|
392
|
+
driver_api_address,
|
|
393
|
+
)
|
|
394
|
+
# Start ServerApp subprocess
|
|
395
|
+
command = [
|
|
396
|
+
"flwr-serverapp",
|
|
397
|
+
"--superlink",
|
|
398
|
+
driver_api_address,
|
|
399
|
+
"--run-id",
|
|
400
|
+
str(pending_run_id),
|
|
401
|
+
]
|
|
402
|
+
subprocess.run(
|
|
403
|
+
command,
|
|
404
|
+
stdout=None,
|
|
405
|
+
stderr=None,
|
|
406
|
+
check=True,
|
|
407
|
+
)
|
|
408
|
+
|
|
409
|
+
|
|
352
410
|
def _format_address(address: str) -> tuple[str, str, int]:
|
|
353
411
|
parsed_address = parse_address(address)
|
|
354
412
|
if not parsed_address:
|
|
@@ -634,6 +692,19 @@ def _add_args_common(parser: argparse.ArgumentParser) -> None:
|
|
|
634
692
|
"to create a secure connection.",
|
|
635
693
|
type=str,
|
|
636
694
|
)
|
|
695
|
+
parser.add_argument(
|
|
696
|
+
"--isolation",
|
|
697
|
+
default=ISOLATION_MODE_SUBPROCESS,
|
|
698
|
+
required=False,
|
|
699
|
+
choices=[
|
|
700
|
+
ISOLATION_MODE_SUBPROCESS,
|
|
701
|
+
ISOLATION_MODE_PROCESS,
|
|
702
|
+
],
|
|
703
|
+
help="Isolation mode when running a `ServerApp` (`subprocess` by default, "
|
|
704
|
+
"possible values: `subprocess`, `process`). Use `subprocess` to configure "
|
|
705
|
+
"SuperLink to run a `ServerApp` in a subprocess. Use `process` to indicate "
|
|
706
|
+
"that a separate independent process gets created outside of SuperLink.",
|
|
707
|
+
)
|
|
637
708
|
parser.add_argument(
|
|
638
709
|
"--database",
|
|
639
710
|
help="A string representing the path to the database "
|
|
@@ -34,7 +34,6 @@ from flwr.common.config import (
|
|
|
34
34
|
from flwr.common.constant import DRIVER_API_DEFAULT_ADDRESS
|
|
35
35
|
from flwr.common.logger import log, update_console_handler, warn_deprecated_feature
|
|
36
36
|
from flwr.common.object_ref import load_app
|
|
37
|
-
from flwr.common.typing import UserConfig
|
|
38
37
|
from flwr.proto.fab_pb2 import GetFabRequest, GetFabResponse # pylint: disable=E0611
|
|
39
38
|
from flwr.proto.run_pb2 import ( # pylint: disable=E0611
|
|
40
39
|
CreateRunRequest,
|
|
@@ -46,13 +45,14 @@ from .driver.grpc_driver import GrpcDriver
|
|
|
46
45
|
from .server_app import LoadServerAppError, ServerApp
|
|
47
46
|
|
|
48
47
|
|
|
48
|
+
# pylint: disable-next=too-many-arguments,too-many-positional-arguments
|
|
49
49
|
def run(
|
|
50
50
|
driver: Driver,
|
|
51
|
+
context: Context,
|
|
51
52
|
server_app_dir: str,
|
|
52
|
-
server_app_run_config: UserConfig,
|
|
53
53
|
server_app_attr: Optional[str] = None,
|
|
54
54
|
loaded_server_app: Optional[ServerApp] = None,
|
|
55
|
-
) ->
|
|
55
|
+
) -> Context:
|
|
56
56
|
"""Run ServerApp with a given Driver."""
|
|
57
57
|
if not (server_app_attr is None) ^ (loaded_server_app is None):
|
|
58
58
|
raise ValueError(
|
|
@@ -78,15 +78,11 @@ def run(
|
|
|
78
78
|
|
|
79
79
|
server_app = _load()
|
|
80
80
|
|
|
81
|
-
# Initialize Context
|
|
82
|
-
context = Context(
|
|
83
|
-
node_id=0, node_config={}, state=RecordSet(), run_config=server_app_run_config
|
|
84
|
-
)
|
|
85
|
-
|
|
86
81
|
# Call ServerApp
|
|
87
82
|
server_app(driver=driver, context=context)
|
|
88
83
|
|
|
89
84
|
log(DEBUG, "ServerApp finished running.")
|
|
85
|
+
return context
|
|
90
86
|
|
|
91
87
|
|
|
92
88
|
# pylint: disable-next=too-many-branches,too-many-statements,too-many-locals
|
|
@@ -225,11 +221,19 @@ def run_server_app() -> None:
|
|
|
225
221
|
root_certificates,
|
|
226
222
|
)
|
|
227
223
|
|
|
224
|
+
# Initialize Context
|
|
225
|
+
context = Context(
|
|
226
|
+
node_id=0,
|
|
227
|
+
node_config={},
|
|
228
|
+
state=RecordSet(),
|
|
229
|
+
run_config=server_app_run_config,
|
|
230
|
+
)
|
|
231
|
+
|
|
228
232
|
# Run the ServerApp with the Driver
|
|
229
233
|
run(
|
|
230
234
|
driver=driver,
|
|
235
|
+
context=context,
|
|
231
236
|
server_app_dir=app_path,
|
|
232
|
-
server_app_run_config=server_app_run_config,
|
|
233
237
|
server_app_attr=server_app_attr,
|
|
234
238
|
)
|
|
235
239
|
|
|
@@ -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
|