flwr-nightly 1.13.0.dev20241111__tar.gz → 1.13.0.dev20241117__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.dev20241111 → flwr_nightly-1.13.0.dev20241117}/PKG-INFO +6 -4
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/README.md +2 -2
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/pyproject.toml +4 -2
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/app.py +2 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/build.py +37 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/install.py +5 -3
- flwr_nightly-1.13.0.dev20241117/src/py/flwr/cli/ls.py +228 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/client/app.py +58 -13
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/client/clientapp/app.py +34 -23
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/client/grpc_rere_client/connection.py +2 -12
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/client/rest_client/connection.py +4 -14
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/client/supernode/app.py +57 -53
- flwr_nightly-1.13.0.dev20241117/src/py/flwr/common/args.py +148 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/common/constant.py +21 -6
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/common/date.py +18 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/common/serde.py +10 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/common/typing.py +31 -10
- flwr_nightly-1.13.0.dev20241117/src/py/flwr/proto/exec_pb2.py +50 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/exec_pb2.pyi +44 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/exec_pb2_grpc.py +34 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/exec_pb2_grpc.pyi +13 -0
- flwr_nightly-1.13.0.dev20241117/src/py/flwr/proto/run_pb2.py +64 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/run_pb2.pyi +18 -1
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/app.py +39 -68
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/driver/grpc_driver.py +4 -14
- flwr_nightly-1.13.0.dev20241117/src/py/flwr/server/run_serverapp.py +77 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/serverapp/app.py +34 -23
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +10 -9
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/superlink/linkstate/in_memory_linkstate.py +71 -46
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/superlink/linkstate/linkstate.py +19 -5
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/superlink/linkstate/sqlite_linkstate.py +81 -113
- flwr_nightly-1.13.0.dev20241117/src/py/flwr/server/superlink/linkstate/utils.py +389 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/simulation/app.py +6 -41
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/simulation/legacy_app.py +21 -1
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/simulation/run_simulation.py +7 -18
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/simulation/simulationio_connection.py +2 -2
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/superexec/deployment.py +12 -6
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/superexec/exec_servicer.py +31 -2
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/superexec/simulation.py +11 -46
- flwr_nightly-1.13.0.dev20241111/src/py/flwr/common/args.py +0 -83
- flwr_nightly-1.13.0.dev20241111/src/py/flwr/proto/exec_pb2.py +0 -41
- flwr_nightly-1.13.0.dev20241111/src/py/flwr/proto/run_pb2.py +0 -64
- flwr_nightly-1.13.0.dev20241111/src/py/flwr/server/run_serverapp.py +0 -307
- flwr_nightly-1.13.0.dev20241111/src/py/flwr/server/superlink/linkstate/utils.py +0 -199
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/LICENSE +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/config_utils.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/example.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/log.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/new.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/.gitignore.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/LICENSE.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/README.baseline.md.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/README.flowertune.md.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/README.md.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/code/__init__.baseline.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/code/client.baseline.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/code/client.huggingface.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/code/client.jax.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/code/client.mlx.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/code/client.numpy.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/code/dataset.baseline.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/code/flwr_tune/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/code/flwr_tune/client_app.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/code/flwr_tune/dataset.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/code/flwr_tune/models.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/code/flwr_tune/server_app.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/code/flwr_tune/strategy.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/code/model.baseline.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/code/server.baseline.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/code/server.huggingface.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/code/server.jax.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/code/server.mlx.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/code/server.sklearn.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/code/strategy.baseline.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/code/task.huggingface.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/code/task.jax.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/code/task.mlx.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/code/task.numpy.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/code/task.sklearn.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/code/task.tensorflow.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/code/utils.baseline.py.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/pyproject.baseline.toml.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/pyproject.jax.toml.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/run/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/run/run.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/utils.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/client/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/client/client.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/client/client_app.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/client/clientapp/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/client/clientapp/clientappio_servicer.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/client/clientapp/utils.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/client/dpfedavg_numpy_client.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/client/grpc_adapter_client/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/client/grpc_adapter_client/connection.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/client/grpc_client/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/client/grpc_client/connection.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/client/grpc_rere_client/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/client/grpc_rere_client/client_interceptor.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/client/grpc_rere_client/grpc_adapter.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/client/heartbeat.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/client/message_handler/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/client/message_handler/message_handler.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/client/message_handler/task_handler.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/client/mod/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/client/mod/centraldp_mods.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/client/mod/comms_mods.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/client/mod/localdp_mod.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/client/mod/utils.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/client/nodestate/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/client/nodestate/in_memory_nodestate.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/client/nodestate/nodestate.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/client/nodestate/nodestate_factory.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/client/numpy_client.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/client/rest_client/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/client/run_info_store.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/client/supernode/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/client/typing.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/common/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/common/address.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/common/config.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/common/context.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/common/differential_privacy.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/common/differential_privacy_constants.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/common/dp.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/common/exit_handlers.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/common/grpc.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/common/logger.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/common/message.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/common/object_ref.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/common/parameter.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/common/pyproject.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/common/record/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/common/record/configsrecord.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/common/record/conversion_utils.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/common/record/metricsrecord.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/common/record/parametersrecord.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/common/record/recordset.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/common/record/typeddict.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/common/recordset_compat.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/common/retry_invoker.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/common/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/common/secure_aggregation/quantization.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/common/telemetry.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/common/version.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/clientappio_pb2.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/clientappio_pb2.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/clientappio_pb2_grpc.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/clientappio_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/common_pb2.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/common_pb2.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/common_pb2_grpc.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/common_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/control_pb2.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/control_pb2.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/control_pb2_grpc.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/control_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/error_pb2.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/error_pb2.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/error_pb2_grpc.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/error_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/fab_pb2.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/fab_pb2.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/fab_pb2_grpc.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/fab_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/fleet_pb2.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/fleet_pb2.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/fleet_pb2_grpc.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/grpcadapter_pb2.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/grpcadapter_pb2.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/grpcadapter_pb2_grpc.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/grpcadapter_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/log_pb2.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/log_pb2.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/log_pb2_grpc.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/log_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/message_pb2.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/message_pb2.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/message_pb2_grpc.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/message_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/node_pb2.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/node_pb2.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/node_pb2_grpc.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/node_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/recordset_pb2.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/recordset_pb2.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/recordset_pb2_grpc.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/recordset_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/run_pb2_grpc.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/run_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/serverappio_pb2.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/serverappio_pb2.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/serverappio_pb2_grpc.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/serverappio_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/simulationio_pb2.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/simulationio_pb2.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/simulationio_pb2_grpc.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/simulationio_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/task_pb2.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/task_pb2.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/task_pb2_grpc.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/task_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/transport_pb2.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/transport_pb2.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/transport_pb2_grpc.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/py.typed +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/client_manager.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/client_proxy.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/compat/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/compat/app.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/compat/app_utils.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/compat/driver_client_proxy.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/compat/legacy_context.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/criterion.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/driver/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/driver/driver.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/driver/inmemory_driver.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/history.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/server.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/server_app.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/server_config.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/serverapp/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/serverapp_components.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/strategy/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/strategy/aggregate.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/strategy/bulyan.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/strategy/fedadagrad.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/strategy/fedadam.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/strategy/fedavg.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/strategy/fedavg_android.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/strategy/fedavgm.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/strategy/fedmedian.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/strategy/fedopt.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/strategy/fedprox.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/strategy/fedyogi.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/strategy/krum.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/strategy/qfedavg.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/strategy/strategy.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/superlink/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/superlink/driver/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/superlink/driver/serverappio_grpc.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/superlink/driver/serverappio_servicer.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/superlink/ffs/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/superlink/ffs/disk_ffs.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/superlink/ffs/ffs.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/superlink/ffs/ffs_factory.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/superlink/fleet/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/superlink/fleet/grpc_adapter/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/superlink/fleet/message_handler/message_handler.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/superlink/fleet/vce/vce_api.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/superlink/linkstate/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/superlink/linkstate/linkstate_factory.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/superlink/simulation/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/superlink/simulation/simulationio_grpc.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/superlink/simulation/simulationio_servicer.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/typing.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/utils/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/utils/tensorboard.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/utils/validator.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/workflow/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/workflow/constant.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/workflow/default_workflows.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/simulation/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/simulation/ray_transport/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/simulation/ray_transport/utils.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/superexec/__init__.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/superexec/app.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/superexec/exec_grpc.py +0 -0
- {flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/superexec/executor.py +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: flwr-nightly
|
|
3
|
-
Version: 1.13.0.
|
|
4
|
-
Summary: Flower: A Friendly Federated
|
|
3
|
+
Version: 1.13.0.dev20241117
|
|
4
|
+
Summary: Flower: A Friendly Federated AI Framework
|
|
5
5
|
Home-page: https://flower.ai
|
|
6
6
|
License: Apache-2.0
|
|
7
7
|
Keywords: Artificial Intelligence,Federated AI,Federated Analytics,Federated Evaluation,Federated Learning,Flower,Machine Learning
|
|
@@ -34,6 +34,7 @@ Provides-Extra: rest
|
|
|
34
34
|
Provides-Extra: simulation
|
|
35
35
|
Requires-Dist: cryptography (>=42.0.4,<43.0.0)
|
|
36
36
|
Requires-Dist: grpcio (>=1.60.0,<2.0.0,!=1.64.2,<=1.64.3)
|
|
37
|
+
Requires-Dist: hatchling (>=1.25.0,<2.0.0)
|
|
37
38
|
Requires-Dist: iterators (>=0.0.2,<0.0.3)
|
|
38
39
|
Requires-Dist: numpy (>=1.26.0,<3.0.0)
|
|
39
40
|
Requires-Dist: pathspec (>=0.12.1,<0.13.0)
|
|
@@ -41,6 +42,7 @@ Requires-Dist: protobuf (>=4.25.2,<5.0.0)
|
|
|
41
42
|
Requires-Dist: pycryptodome (>=3.18.0,<4.0.0)
|
|
42
43
|
Requires-Dist: ray (==2.10.0) ; (python_version >= "3.9" and python_version < "3.12") and (extra == "simulation")
|
|
43
44
|
Requires-Dist: requests (>=2.31.0,<3.0.0) ; extra == "rest"
|
|
45
|
+
Requires-Dist: rich (>=13.5.0,<14.0.0)
|
|
44
46
|
Requires-Dist: starlette (>=0.31.0,<0.32.0) ; extra == "rest"
|
|
45
47
|
Requires-Dist: tomli (>=2.0.1,<3.0.0)
|
|
46
48
|
Requires-Dist: tomli-w (>=1.0.0,<2.0.0)
|
|
@@ -50,7 +52,7 @@ Project-URL: Documentation, https://flower.ai
|
|
|
50
52
|
Project-URL: Repository, https://github.com/adap/flower
|
|
51
53
|
Description-Content-Type: text/markdown
|
|
52
54
|
|
|
53
|
-
# Flower: A Friendly Federated
|
|
55
|
+
# Flower: A Friendly Federated AI Framework
|
|
54
56
|
|
|
55
57
|
<p align="center">
|
|
56
58
|
<a href="https://flower.ai/">
|
|
@@ -73,7 +75,7 @@ Description-Content-Type: text/markdown
|
|
|
73
75
|
[](https://hub.docker.com/u/flwr)
|
|
74
76
|
[](https://flower.ai/join-slack)
|
|
75
77
|
|
|
76
|
-
Flower (`flwr`) is a framework for building federated
|
|
78
|
+
Flower (`flwr`) is a framework for building federated AI systems. The
|
|
77
79
|
design of Flower is based on a few guiding principles:
|
|
78
80
|
|
|
79
81
|
- **Customizable**: Federated learning systems vary wildly from one use case to
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Flower: A Friendly Federated
|
|
1
|
+
# Flower: A Friendly Federated AI Framework
|
|
2
2
|
|
|
3
3
|
<p align="center">
|
|
4
4
|
<a href="https://flower.ai/">
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
[](https://hub.docker.com/u/flwr)
|
|
22
22
|
[](https://flower.ai/join-slack)
|
|
23
23
|
|
|
24
|
-
Flower (`flwr`) is a framework for building federated
|
|
24
|
+
Flower (`flwr`) is a framework for building federated AI systems. The
|
|
25
25
|
design of Flower is based on a few guiding principles:
|
|
26
26
|
|
|
27
27
|
- **Customizable**: Federated learning systems vary wildly from one use case to
|
|
@@ -4,8 +4,8 @@ build-backend = "poetry.core.masonry.api"
|
|
|
4
4
|
|
|
5
5
|
[tool.poetry]
|
|
6
6
|
name = "flwr-nightly"
|
|
7
|
-
version = "1.13.0.
|
|
8
|
-
description = "Flower: A Friendly Federated
|
|
7
|
+
version = "1.13.0.dev20241117"
|
|
8
|
+
description = "Flower: A Friendly Federated AI Framework"
|
|
9
9
|
license = "Apache-2.0"
|
|
10
10
|
authors = ["The Flower Authors <hello@flower.ai>"]
|
|
11
11
|
readme = "README.md"
|
|
@@ -77,6 +77,8 @@ typer = "^0.12.5"
|
|
|
77
77
|
tomli = "^2.0.1"
|
|
78
78
|
tomli-w = "^1.0.0"
|
|
79
79
|
pathspec = "^0.12.1"
|
|
80
|
+
hatchling = "^1.25.0"
|
|
81
|
+
rich = "^13.5.0"
|
|
80
82
|
# Optional dependencies (Simulation Engine)
|
|
81
83
|
ray = { version = "==2.10.0", optional = true, python = ">=3.9,<3.12" }
|
|
82
84
|
# Optional dependencies (REST transport layer)
|
|
@@ -20,6 +20,7 @@ from typer.main import get_command
|
|
|
20
20
|
from .build import build
|
|
21
21
|
from .install import install
|
|
22
22
|
from .log import log
|
|
23
|
+
from .ls import ls
|
|
23
24
|
from .new import new
|
|
24
25
|
from .run import run
|
|
25
26
|
|
|
@@ -37,6 +38,7 @@ app.command()(run)
|
|
|
37
38
|
app.command()(build)
|
|
38
39
|
app.command()(install)
|
|
39
40
|
app.command()(log)
|
|
41
|
+
app.command()(ls)
|
|
40
42
|
|
|
41
43
|
typer_click_object = get_command(app)
|
|
42
44
|
|
{flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/build.py
RENAMED
|
@@ -19,14 +19,18 @@ import os
|
|
|
19
19
|
import shutil
|
|
20
20
|
import tempfile
|
|
21
21
|
import zipfile
|
|
22
|
+
from logging import DEBUG, ERROR
|
|
22
23
|
from pathlib import Path
|
|
23
24
|
from typing import Annotated, Any, Optional, Union
|
|
24
25
|
|
|
25
26
|
import pathspec
|
|
26
27
|
import tomli_w
|
|
27
28
|
import typer
|
|
29
|
+
from hatchling.builders.wheel import WheelBuilder
|
|
30
|
+
from hatchling.metadata.core import ProjectMetadata
|
|
28
31
|
|
|
29
32
|
from flwr.common.constant import FAB_ALLOWED_EXTENSIONS, FAB_DATE, FAB_HASH_TRUNCATION
|
|
33
|
+
from flwr.common.logger import log
|
|
30
34
|
|
|
31
35
|
from .config_utils import load_and_validate
|
|
32
36
|
from .utils import is_valid_project_name
|
|
@@ -51,6 +55,27 @@ def get_fab_filename(conf: dict[str, Any], fab_hash: str) -> str:
|
|
|
51
55
|
return f"{publisher}.{name}.{version}.{fab_hash_truncated}.fab"
|
|
52
56
|
|
|
53
57
|
|
|
58
|
+
def _build_app_wheel(app: Path) -> Path:
|
|
59
|
+
"""Build app as a wheel and return its path."""
|
|
60
|
+
# Path to your project directory
|
|
61
|
+
app_dir = str(app.resolve())
|
|
62
|
+
try:
|
|
63
|
+
|
|
64
|
+
# Initialize the WheelBuilder
|
|
65
|
+
builder = WheelBuilder(
|
|
66
|
+
app_dir, metadata=ProjectMetadata(root=app_dir, plugin_manager=None)
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
# Build
|
|
70
|
+
whl_path = Path(next(builder.build(directory=app_dir)))
|
|
71
|
+
log(DEBUG, "Wheel succesfully built: %s", str(whl_path))
|
|
72
|
+
except Exception as ex:
|
|
73
|
+
log(ERROR, "Exception encountered when building wheel.", exc_info=ex)
|
|
74
|
+
raise typer.Exit(code=1) from ex
|
|
75
|
+
|
|
76
|
+
return whl_path
|
|
77
|
+
|
|
78
|
+
|
|
54
79
|
# pylint: disable=too-many-locals, too-many-statements
|
|
55
80
|
def build(
|
|
56
81
|
app: Annotated[
|
|
@@ -106,6 +131,12 @@ def build(
|
|
|
106
131
|
bold=True,
|
|
107
132
|
)
|
|
108
133
|
|
|
134
|
+
# Build wheel
|
|
135
|
+
whl_path = _build_app_wheel(app)
|
|
136
|
+
|
|
137
|
+
# Add path to .whl to `[tool.flwr.app]`
|
|
138
|
+
conf["tool"]["flwr"]["app"]["whl"] = str(whl_path.name)
|
|
139
|
+
|
|
109
140
|
# Load .gitignore rules if present
|
|
110
141
|
ignore_spec = _load_gitignore(app)
|
|
111
142
|
|
|
@@ -137,6 +168,9 @@ def build(
|
|
|
137
168
|
and f.name != "pyproject.toml" # Exclude the original pyproject.toml
|
|
138
169
|
]
|
|
139
170
|
|
|
171
|
+
# Include FAB .whl
|
|
172
|
+
all_files.append(whl_path)
|
|
173
|
+
|
|
140
174
|
for file_path in all_files:
|
|
141
175
|
# Read the file content manually
|
|
142
176
|
with open(file_path, "rb") as f:
|
|
@@ -153,6 +187,9 @@ def build(
|
|
|
153
187
|
# Add CONTENT and CONTENT.jwt to the zip file
|
|
154
188
|
write_to_zip(fab_file, ".info/CONTENT", list_file_content)
|
|
155
189
|
|
|
190
|
+
# Erase FAB .whl in app directory
|
|
191
|
+
whl_path.unlink()
|
|
192
|
+
|
|
156
193
|
# Get hash of FAB file
|
|
157
194
|
content = Path(temp_filename).read_bytes()
|
|
158
195
|
fab_hash = hashlib.sha256(content).hexdigest()
|
{flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/cli/install.py
RENAMED
|
@@ -188,23 +188,25 @@ def validate_and_install(
|
|
|
188
188
|
else:
|
|
189
189
|
shutil.copy2(item, install_dir / item.name)
|
|
190
190
|
|
|
191
|
+
whl_file = config["tool"]["flwr"]["app"]["whl"]
|
|
192
|
+
install_whl = install_dir / whl_file
|
|
191
193
|
try:
|
|
192
194
|
subprocess.run(
|
|
193
|
-
["pip", "install", "
|
|
195
|
+
["pip", "install", "--no-deps", install_whl],
|
|
194
196
|
capture_output=True,
|
|
195
197
|
text=True,
|
|
196
198
|
check=True,
|
|
197
199
|
)
|
|
198
200
|
except subprocess.CalledProcessError as e:
|
|
199
201
|
typer.secho(
|
|
200
|
-
f"❌ Failed to
|
|
202
|
+
f"❌ Failed to install {project_name}:\n{e.stderr}",
|
|
201
203
|
fg=typer.colors.RED,
|
|
202
204
|
bold=True,
|
|
203
205
|
)
|
|
204
206
|
raise typer.Exit(code=1) from e
|
|
205
207
|
|
|
206
208
|
typer.secho(
|
|
207
|
-
f"🎊 Successfully installed {project_name}
|
|
209
|
+
f"🎊 Successfully installed {project_name}.",
|
|
208
210
|
fg=typer.colors.GREEN,
|
|
209
211
|
bold=True,
|
|
210
212
|
)
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
# Copyright 2024 Flower Labs GmbH. All Rights Reserved.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
# ==============================================================================
|
|
15
|
+
"""Flower command line interface `ls` command."""
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
from datetime import datetime, timedelta
|
|
19
|
+
from logging import DEBUG
|
|
20
|
+
from pathlib import Path
|
|
21
|
+
from typing import Annotated, Any, Optional
|
|
22
|
+
|
|
23
|
+
import grpc
|
|
24
|
+
import typer
|
|
25
|
+
from rich.console import Console
|
|
26
|
+
from rich.table import Table
|
|
27
|
+
from rich.text import Text
|
|
28
|
+
|
|
29
|
+
from flwr.cli.config_utils import (
|
|
30
|
+
load_and_validate,
|
|
31
|
+
validate_certificate_in_federation_config,
|
|
32
|
+
validate_federation_in_project_config,
|
|
33
|
+
validate_project_config,
|
|
34
|
+
)
|
|
35
|
+
from flwr.common.constant import FAB_CONFIG_FILE, SubStatus
|
|
36
|
+
from flwr.common.date import format_timedelta, isoformat8601_utc
|
|
37
|
+
from flwr.common.grpc import GRPC_MAX_MESSAGE_LENGTH, create_channel
|
|
38
|
+
from flwr.common.logger import log
|
|
39
|
+
from flwr.common.serde import run_from_proto
|
|
40
|
+
from flwr.common.typing import Run
|
|
41
|
+
from flwr.proto.exec_pb2 import ( # pylint: disable=E0611
|
|
42
|
+
ListRunsRequest,
|
|
43
|
+
ListRunsResponse,
|
|
44
|
+
)
|
|
45
|
+
from flwr.proto.exec_pb2_grpc import ExecStub
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def ls(
|
|
49
|
+
app: Annotated[
|
|
50
|
+
Path,
|
|
51
|
+
typer.Argument(help="Path of the Flower project"),
|
|
52
|
+
] = Path("."),
|
|
53
|
+
federation: Annotated[
|
|
54
|
+
Optional[str],
|
|
55
|
+
typer.Argument(help="Name of the federation"),
|
|
56
|
+
] = None,
|
|
57
|
+
runs: Annotated[
|
|
58
|
+
bool,
|
|
59
|
+
typer.Option(
|
|
60
|
+
"--runs",
|
|
61
|
+
help="List all runs",
|
|
62
|
+
),
|
|
63
|
+
] = False,
|
|
64
|
+
run_id: Annotated[
|
|
65
|
+
Optional[int],
|
|
66
|
+
typer.Option(
|
|
67
|
+
"--run-id",
|
|
68
|
+
help="Specific run ID to display",
|
|
69
|
+
),
|
|
70
|
+
] = None,
|
|
71
|
+
) -> None:
|
|
72
|
+
"""List runs."""
|
|
73
|
+
# Load and validate federation config
|
|
74
|
+
typer.secho("Loading project configuration... ", fg=typer.colors.BLUE)
|
|
75
|
+
|
|
76
|
+
pyproject_path = app / FAB_CONFIG_FILE if app else None
|
|
77
|
+
config, errors, warnings = load_and_validate(path=pyproject_path)
|
|
78
|
+
config = validate_project_config(config, errors, warnings)
|
|
79
|
+
federation, federation_config = validate_federation_in_project_config(
|
|
80
|
+
federation, config
|
|
81
|
+
)
|
|
82
|
+
|
|
83
|
+
if "address" not in federation_config:
|
|
84
|
+
typer.secho(
|
|
85
|
+
"❌ `flwr log` currently works with Exec API. Ensure that the correct"
|
|
86
|
+
"Exec API address is provided in the `pyproject.toml`.",
|
|
87
|
+
fg=typer.colors.RED,
|
|
88
|
+
bold=True,
|
|
89
|
+
)
|
|
90
|
+
raise typer.Exit(code=1)
|
|
91
|
+
|
|
92
|
+
try:
|
|
93
|
+
if runs and run_id is not None:
|
|
94
|
+
raise ValueError(
|
|
95
|
+
"The options '--runs' and '--run-id' are mutually exclusive."
|
|
96
|
+
)
|
|
97
|
+
|
|
98
|
+
channel = _init_channel(app, federation_config)
|
|
99
|
+
stub = ExecStub(channel)
|
|
100
|
+
|
|
101
|
+
# Display information about a specific run ID
|
|
102
|
+
if run_id is not None:
|
|
103
|
+
typer.echo(f"🔍 Displaying information for run ID {run_id}...")
|
|
104
|
+
_display_one_run(stub, run_id)
|
|
105
|
+
# By default, list all runs
|
|
106
|
+
else:
|
|
107
|
+
typer.echo("📄 Listing all runs...")
|
|
108
|
+
_list_runs(stub)
|
|
109
|
+
|
|
110
|
+
except ValueError as err:
|
|
111
|
+
typer.secho(
|
|
112
|
+
f"❌ {err}",
|
|
113
|
+
fg=typer.colors.RED,
|
|
114
|
+
bold=True,
|
|
115
|
+
)
|
|
116
|
+
raise typer.Exit(code=1) from err
|
|
117
|
+
finally:
|
|
118
|
+
channel.close()
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
def on_channel_state_change(channel_connectivity: str) -> None:
|
|
122
|
+
"""Log channel connectivity."""
|
|
123
|
+
log(DEBUG, channel_connectivity)
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
def _init_channel(app: Path, federation_config: dict[str, Any]) -> grpc.Channel:
|
|
127
|
+
"""Initialize gRPC channel to the Exec API."""
|
|
128
|
+
insecure, root_certificates_bytes = validate_certificate_in_federation_config(
|
|
129
|
+
app, federation_config
|
|
130
|
+
)
|
|
131
|
+
channel = create_channel(
|
|
132
|
+
server_address=federation_config["address"],
|
|
133
|
+
insecure=insecure,
|
|
134
|
+
root_certificates=root_certificates_bytes,
|
|
135
|
+
max_message_length=GRPC_MAX_MESSAGE_LENGTH,
|
|
136
|
+
interceptors=None,
|
|
137
|
+
)
|
|
138
|
+
channel.subscribe(on_channel_state_change)
|
|
139
|
+
return channel
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
def _format_run_table(run_dict: dict[int, Run], now_isoformat: str) -> Table:
|
|
143
|
+
"""Format run status as a rich Table."""
|
|
144
|
+
table = Table(header_style="bold cyan", show_lines=True)
|
|
145
|
+
|
|
146
|
+
def _format_datetime(dt: Optional[datetime]) -> str:
|
|
147
|
+
return isoformat8601_utc(dt).replace("T", " ") if dt else "N/A"
|
|
148
|
+
|
|
149
|
+
# Add columns
|
|
150
|
+
table.add_column(
|
|
151
|
+
Text("Run ID", justify="center"), style="bright_white", overflow="fold"
|
|
152
|
+
)
|
|
153
|
+
table.add_column(Text("FAB", justify="center"), style="dim white")
|
|
154
|
+
table.add_column(Text("Status", justify="center"))
|
|
155
|
+
table.add_column(Text("Elapsed", justify="center"), style="blue")
|
|
156
|
+
table.add_column(Text("Created At", justify="center"), style="dim white")
|
|
157
|
+
table.add_column(Text("Running At", justify="center"), style="dim white")
|
|
158
|
+
table.add_column(Text("Finished At", justify="center"), style="dim white")
|
|
159
|
+
|
|
160
|
+
# Add rows
|
|
161
|
+
for run in sorted(
|
|
162
|
+
run_dict.values(), key=lambda x: datetime.fromisoformat(x.pending_at)
|
|
163
|
+
):
|
|
164
|
+
# Combine status and sub-status into a single string
|
|
165
|
+
if run.status.sub_status == "":
|
|
166
|
+
status_text = run.status.status
|
|
167
|
+
else:
|
|
168
|
+
status_text = f"{run.status.status}:{run.status.sub_status}"
|
|
169
|
+
|
|
170
|
+
# Style the status based on its value
|
|
171
|
+
sub_status = run.status.sub_status
|
|
172
|
+
if sub_status == SubStatus.COMPLETED:
|
|
173
|
+
status_style = "green"
|
|
174
|
+
elif sub_status == SubStatus.FAILED:
|
|
175
|
+
status_style = "red"
|
|
176
|
+
else:
|
|
177
|
+
status_style = "yellow"
|
|
178
|
+
|
|
179
|
+
# Convert isoformat to datetime
|
|
180
|
+
pending_at = datetime.fromisoformat(run.pending_at) if run.pending_at else None
|
|
181
|
+
running_at = datetime.fromisoformat(run.running_at) if run.running_at else None
|
|
182
|
+
finished_at = (
|
|
183
|
+
datetime.fromisoformat(run.finished_at) if run.finished_at else None
|
|
184
|
+
)
|
|
185
|
+
|
|
186
|
+
# Calculate elapsed time
|
|
187
|
+
elapsed_time = timedelta()
|
|
188
|
+
if running_at:
|
|
189
|
+
if finished_at:
|
|
190
|
+
end_time = finished_at
|
|
191
|
+
else:
|
|
192
|
+
end_time = datetime.fromisoformat(now_isoformat)
|
|
193
|
+
elapsed_time = end_time - running_at
|
|
194
|
+
|
|
195
|
+
table.add_row(
|
|
196
|
+
f"[bold]{run.run_id}[/bold]",
|
|
197
|
+
f"{run.fab_id} (v{run.fab_version})",
|
|
198
|
+
f"[{status_style}]{status_text}[/{status_style}]",
|
|
199
|
+
format_timedelta(elapsed_time),
|
|
200
|
+
_format_datetime(pending_at),
|
|
201
|
+
_format_datetime(running_at),
|
|
202
|
+
_format_datetime(finished_at),
|
|
203
|
+
)
|
|
204
|
+
return table
|
|
205
|
+
|
|
206
|
+
|
|
207
|
+
def _list_runs(
|
|
208
|
+
stub: ExecStub,
|
|
209
|
+
) -> None:
|
|
210
|
+
"""List all runs."""
|
|
211
|
+
res: ListRunsResponse = stub.ListRuns(ListRunsRequest())
|
|
212
|
+
run_dict = {run_id: run_from_proto(proto) for run_id, proto in res.run_dict.items()}
|
|
213
|
+
|
|
214
|
+
Console().print(_format_run_table(run_dict, res.now))
|
|
215
|
+
|
|
216
|
+
|
|
217
|
+
def _display_one_run(
|
|
218
|
+
stub: ExecStub,
|
|
219
|
+
run_id: int,
|
|
220
|
+
) -> None:
|
|
221
|
+
"""Display information about a specific run."""
|
|
222
|
+
res: ListRunsResponse = stub.ListRuns(ListRunsRequest(run_id=run_id))
|
|
223
|
+
if not res.run_dict:
|
|
224
|
+
raise ValueError(f"Run ID {run_id} not found")
|
|
225
|
+
|
|
226
|
+
run_dict = {run_id: run_from_proto(proto) for run_id, proto in res.run_dict.items()}
|
|
227
|
+
|
|
228
|
+
Console().print(_format_run_table(run_dict, res.now))
|
{flwr_nightly-1.13.0.dev20241111 → flwr_nightly-1.13.0.dev20241117}/src/py/flwr/client/app.py
RENAMED
|
@@ -37,11 +37,13 @@ from flwr.client.typing import ClientFnExt
|
|
|
37
37
|
from flwr.common import GRPC_MAX_MESSAGE_LENGTH, Context, EventType, Message, event
|
|
38
38
|
from flwr.common.address import parse_address
|
|
39
39
|
from flwr.common.constant import (
|
|
40
|
-
|
|
40
|
+
CLIENT_OCTET,
|
|
41
|
+
CLIENTAPPIO_API_DEFAULT_SERVER_ADDRESS,
|
|
41
42
|
ISOLATION_MODE_PROCESS,
|
|
42
43
|
ISOLATION_MODE_SUBPROCESS,
|
|
43
44
|
MISSING_EXTRA_REST,
|
|
44
45
|
RUN_ID_NUM_BYTES,
|
|
46
|
+
SERVER_OCTET,
|
|
45
47
|
TRANSPORT_TYPE_GRPC_ADAPTER,
|
|
46
48
|
TRANSPORT_TYPE_GRPC_BIDI,
|
|
47
49
|
TRANSPORT_TYPE_GRPC_RERE,
|
|
@@ -102,6 +104,11 @@ def start_client(
|
|
|
102
104
|
) -> None:
|
|
103
105
|
"""Start a Flower client node which connects to a Flower server.
|
|
104
106
|
|
|
107
|
+
Warning
|
|
108
|
+
-------
|
|
109
|
+
This function is deprecated since 1.13.0. Use :code:`flower-supernode` command
|
|
110
|
+
instead to start a SuperNode.
|
|
111
|
+
|
|
105
112
|
Parameters
|
|
106
113
|
----------
|
|
107
114
|
server_address : str
|
|
@@ -176,6 +183,17 @@ def start_client(
|
|
|
176
183
|
>>> root_certificates=Path("/crts/root.pem").read_bytes(),
|
|
177
184
|
>>> )
|
|
178
185
|
"""
|
|
186
|
+
msg = (
|
|
187
|
+
"flwr.client.start_client() is deprecated."
|
|
188
|
+
"\n\tInstead, use the `flower-supernode` CLI command to start a SuperNode "
|
|
189
|
+
"as shown below:"
|
|
190
|
+
"\n\n\t\t$ flower-supernode --insecure --superlink='<IP>:<PORT>'"
|
|
191
|
+
"\n\n\tTo view all available options, run:"
|
|
192
|
+
"\n\n\t\t$ flower-supernode --help"
|
|
193
|
+
"\n\n\tUsing `start_client()` is deprecated."
|
|
194
|
+
)
|
|
195
|
+
warn_deprecated_feature(name=msg)
|
|
196
|
+
|
|
179
197
|
event(EventType.START_CLIENT_ENTER)
|
|
180
198
|
start_client_internal(
|
|
181
199
|
server_address=server_address,
|
|
@@ -216,7 +234,9 @@ def start_client_internal(
|
|
|
216
234
|
max_wait_time: Optional[float] = None,
|
|
217
235
|
flwr_path: Optional[Path] = None,
|
|
218
236
|
isolation: Optional[str] = None,
|
|
219
|
-
|
|
237
|
+
clientappio_api_address: Optional[str] = CLIENTAPPIO_API_DEFAULT_SERVER_ADDRESS,
|
|
238
|
+
certificates: Optional[tuple[bytes, bytes, bytes]] = None,
|
|
239
|
+
ssl_ca_certfile: Optional[str] = None,
|
|
220
240
|
) -> None:
|
|
221
241
|
"""Start a Flower client node which connects to a Flower server.
|
|
222
242
|
|
|
@@ -274,10 +294,16 @@ def start_client_internal(
|
|
|
274
294
|
`process`. Defaults to `None`, which runs the `ClientApp` in the same process
|
|
275
295
|
as the SuperNode. If `subprocess`, the `ClientApp` runs in a subprocess started
|
|
276
296
|
by the SueprNode and communicates using gRPC at the address
|
|
277
|
-
`
|
|
278
|
-
process and communicates using gRPC at the address
|
|
279
|
-
|
|
297
|
+
`clientappio_api_address`. If `process`, the `ClientApp` runs in a separate
|
|
298
|
+
isolated process and communicates using gRPC at the address
|
|
299
|
+
`clientappio_api_address`.
|
|
300
|
+
clientappio_api_address : Optional[str]
|
|
301
|
+
(default: `CLIENTAPPIO_API_DEFAULT_SERVER_ADDRESS`)
|
|
280
302
|
The SuperNode gRPC server address.
|
|
303
|
+
certificates : Optional[Tuple[bytes, bytes, bytes]] (default: None)
|
|
304
|
+
Tuple containing the CA certificate, server certificate, and server private key.
|
|
305
|
+
ssl_ca_certfile : Optional[str] (default: None)
|
|
306
|
+
The path to the CA certificate file used by `flwr-clientapp` in subprocess mode.
|
|
281
307
|
"""
|
|
282
308
|
if insecure is None:
|
|
283
309
|
insecure = root_certificates is None
|
|
@@ -304,15 +330,16 @@ def start_client_internal(
|
|
|
304
330
|
load_client_app_fn = _load_client_app
|
|
305
331
|
|
|
306
332
|
if isolation:
|
|
307
|
-
if
|
|
333
|
+
if clientappio_api_address is None:
|
|
308
334
|
raise ValueError(
|
|
309
|
-
f"`
|
|
335
|
+
f"`clientappio_api_address` required when `isolation` is "
|
|
310
336
|
f"{ISOLATION_MODE_SUBPROCESS} or {ISOLATION_MODE_PROCESS}",
|
|
311
337
|
)
|
|
312
338
|
_clientappio_grpc_server, clientappio_servicer = run_clientappio_api_grpc(
|
|
313
|
-
address=
|
|
339
|
+
address=clientappio_api_address,
|
|
340
|
+
certificates=certificates,
|
|
314
341
|
)
|
|
315
|
-
|
|
342
|
+
clientappio_api_address = cast(str, clientappio_api_address)
|
|
316
343
|
|
|
317
344
|
# At this point, only `load_client_app_fn` should be used
|
|
318
345
|
# Both `client` and `client_fn` must not be used directly
|
|
@@ -448,7 +475,7 @@ def start_client_internal(
|
|
|
448
475
|
runs[run_id] = get_run(run_id)
|
|
449
476
|
# If get_run is None, i.e., in grpc-bidi mode
|
|
450
477
|
else:
|
|
451
|
-
runs[run_id] = Run(run_id
|
|
478
|
+
runs[run_id] = Run.create_empty(run_id=run_id)
|
|
452
479
|
|
|
453
480
|
run: Run = runs[run_id]
|
|
454
481
|
if get_fab is not None and run.fab_hash:
|
|
@@ -508,14 +535,28 @@ def start_client_internal(
|
|
|
508
535
|
)
|
|
509
536
|
|
|
510
537
|
if start_subprocess:
|
|
538
|
+
_octet, _colon, _port = (
|
|
539
|
+
clientappio_api_address.rpartition(":")
|
|
540
|
+
)
|
|
541
|
+
io_address = (
|
|
542
|
+
f"{CLIENT_OCTET}:{_port}"
|
|
543
|
+
if _octet == SERVER_OCTET
|
|
544
|
+
else clientappio_api_address
|
|
545
|
+
)
|
|
511
546
|
# Start ClientApp subprocess
|
|
512
547
|
command = [
|
|
513
548
|
"flwr-clientapp",
|
|
514
|
-
"--
|
|
515
|
-
|
|
549
|
+
"--clientappio-api-address",
|
|
550
|
+
io_address,
|
|
516
551
|
"--token",
|
|
517
552
|
str(token),
|
|
518
553
|
]
|
|
554
|
+
if ssl_ca_certfile:
|
|
555
|
+
command.append("--root-certificates")
|
|
556
|
+
command.append(ssl_ca_certfile)
|
|
557
|
+
else:
|
|
558
|
+
command.append("--insecure")
|
|
559
|
+
|
|
519
560
|
subprocess.run(
|
|
520
561
|
command,
|
|
521
562
|
stdout=None,
|
|
@@ -783,7 +824,10 @@ class _AppStateTracker:
|
|
|
783
824
|
signal.signal(signal.SIGTERM, signal_handler)
|
|
784
825
|
|
|
785
826
|
|
|
786
|
-
def run_clientappio_api_grpc(
|
|
827
|
+
def run_clientappio_api_grpc(
|
|
828
|
+
address: str,
|
|
829
|
+
certificates: Optional[tuple[bytes, bytes, bytes]],
|
|
830
|
+
) -> tuple[grpc.Server, ClientAppIoServicer]:
|
|
787
831
|
"""Run ClientAppIo API gRPC server."""
|
|
788
832
|
clientappio_servicer: grpc.Server = ClientAppIoServicer()
|
|
789
833
|
clientappio_add_servicer_to_server_fn = add_ClientAppIoServicer_to_server
|
|
@@ -794,6 +838,7 @@ def run_clientappio_api_grpc(address: str) -> tuple[grpc.Server, ClientAppIoServ
|
|
|
794
838
|
),
|
|
795
839
|
server_address=address,
|
|
796
840
|
max_message_length=GRPC_MAX_MESSAGE_LENGTH,
|
|
841
|
+
certificates=certificates,
|
|
797
842
|
)
|
|
798
843
|
log(INFO, "Starting Flower ClientAppIo gRPC server on %s", address)
|
|
799
844
|
clientappio_grpc_server.start()
|
|
@@ -24,9 +24,9 @@ import grpc
|
|
|
24
24
|
from flwr.cli.install import install_from_fab
|
|
25
25
|
from flwr.client.client_app import ClientApp, LoadClientAppError
|
|
26
26
|
from flwr.common import Context, Message
|
|
27
|
-
from flwr.common.args import add_args_flwr_app_common
|
|
27
|
+
from flwr.common.args import add_args_flwr_app_common, try_obtain_root_certificates
|
|
28
28
|
from flwr.common.config import get_flwr_dir
|
|
29
|
-
from flwr.common.constant import ErrorCode
|
|
29
|
+
from flwr.common.constant import CLIENTAPPIO_API_DEFAULT_CLIENT_ADDRESS, ErrorCode
|
|
30
30
|
from flwr.common.grpc import create_channel
|
|
31
31
|
from flwr.common.logger import log
|
|
32
32
|
from flwr.common.message import Error
|
|
@@ -56,37 +56,24 @@ from .utils import get_load_client_app_fn
|
|
|
56
56
|
|
|
57
57
|
def flwr_clientapp() -> None:
|
|
58
58
|
"""Run process-isolated Flower ClientApp."""
|
|
59
|
-
|
|
60
|
-
description="Run a Flower ClientApp",
|
|
61
|
-
)
|
|
62
|
-
parser.add_argument(
|
|
63
|
-
"--supernode",
|
|
64
|
-
type=str,
|
|
65
|
-
help="Address of SuperNode's ClientAppIo API",
|
|
66
|
-
)
|
|
67
|
-
parser.add_argument(
|
|
68
|
-
"--token",
|
|
69
|
-
type=int,
|
|
70
|
-
required=False,
|
|
71
|
-
help="Unique token generated by SuperNode for each ClientApp execution",
|
|
72
|
-
)
|
|
73
|
-
add_args_flwr_app_common(parser=parser)
|
|
74
|
-
args = parser.parse_args()
|
|
59
|
+
args = _parse_args_run_flwr_clientapp().parse_args()
|
|
75
60
|
|
|
76
61
|
log(INFO, "Starting Flower ClientApp")
|
|
62
|
+
certificates = try_obtain_root_certificates(args, args.clientappio_api_address)
|
|
77
63
|
|
|
78
64
|
log(
|
|
79
65
|
DEBUG,
|
|
80
66
|
"Starting isolated `ClientApp` connected to SuperNode's ClientAppIo API at %s "
|
|
81
67
|
"with token %s",
|
|
82
|
-
args.
|
|
68
|
+
args.clientappio_api_address,
|
|
83
69
|
args.token,
|
|
84
70
|
)
|
|
85
71
|
run_clientapp(
|
|
86
|
-
|
|
72
|
+
clientappio_api_address=args.clientappio_api_address,
|
|
87
73
|
run_once=(args.token is not None),
|
|
88
74
|
token=args.token,
|
|
89
75
|
flwr_dir=args.flwr_dir,
|
|
76
|
+
certificates=certificates,
|
|
90
77
|
)
|
|
91
78
|
|
|
92
79
|
|
|
@@ -96,15 +83,17 @@ def on_channel_state_change(channel_connectivity: str) -> None:
|
|
|
96
83
|
|
|
97
84
|
|
|
98
85
|
def run_clientapp( # pylint: disable=R0914
|
|
99
|
-
|
|
86
|
+
clientappio_api_address: str,
|
|
100
87
|
run_once: bool,
|
|
101
88
|
token: Optional[int] = None,
|
|
102
89
|
flwr_dir: Optional[str] = None,
|
|
90
|
+
certificates: Optional[bytes] = None,
|
|
103
91
|
) -> None:
|
|
104
92
|
"""Run Flower ClientApp process."""
|
|
105
93
|
channel = create_channel(
|
|
106
|
-
server_address=
|
|
107
|
-
insecure=
|
|
94
|
+
server_address=clientappio_api_address,
|
|
95
|
+
insecure=(certificates is None),
|
|
96
|
+
root_certificates=certificates,
|
|
108
97
|
)
|
|
109
98
|
channel.subscribe(on_channel_state_change)
|
|
110
99
|
|
|
@@ -237,3 +226,25 @@ def push_message(
|
|
|
237
226
|
except grpc.RpcError as e:
|
|
238
227
|
log(ERROR, "[PushClientAppOutputs] gRPC error occurred: %s", str(e))
|
|
239
228
|
raise e
|
|
229
|
+
|
|
230
|
+
|
|
231
|
+
def _parse_args_run_flwr_clientapp() -> argparse.ArgumentParser:
|
|
232
|
+
"""Parse flwr-clientapp command line arguments."""
|
|
233
|
+
parser = argparse.ArgumentParser(
|
|
234
|
+
description="Run a Flower ClientApp",
|
|
235
|
+
)
|
|
236
|
+
parser.add_argument(
|
|
237
|
+
"--clientappio-api-address",
|
|
238
|
+
default=CLIENTAPPIO_API_DEFAULT_CLIENT_ADDRESS,
|
|
239
|
+
type=str,
|
|
240
|
+
help="Address of SuperNode's ClientAppIo API (IPv4, IPv6, or a domain name)."
|
|
241
|
+
f"By default, it is set to {CLIENTAPPIO_API_DEFAULT_CLIENT_ADDRESS}.",
|
|
242
|
+
)
|
|
243
|
+
parser.add_argument(
|
|
244
|
+
"--token",
|
|
245
|
+
type=int,
|
|
246
|
+
required=False,
|
|
247
|
+
help="Unique token generated by SuperNode for each ClientApp execution",
|
|
248
|
+
)
|
|
249
|
+
add_args_flwr_app_common(parser=parser)
|
|
250
|
+
return parser
|