flwr-nightly 1.14.0.dev20241216__tar.gz → 1.15.0.dev20250112__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/PKG-INFO +5 -5
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/README.md +2 -2
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/pyproject.toml +13 -11
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/cli_user_auth_interceptor.py +6 -2
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/log.py +8 -6
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/login/login.py +11 -4
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/ls.py +7 -4
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/.gitignore.tpl +3 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/pyproject.baseline.toml.tpl +1 -1
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +1 -1
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl +1 -1
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/pyproject.jax.toml.tpl +1 -1
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +1 -1
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +1 -1
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +3 -3
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +1 -1
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +1 -1
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/run/run.py +7 -2
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/stop.py +3 -2
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/utils.py +83 -14
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/app.py +17 -9
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/client.py +0 -32
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/grpc_rere_client/client_interceptor.py +6 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/grpc_rere_client/grpc_adapter.py +16 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/message_handler/message_handler.py +0 -2
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/numpy_client.py +0 -44
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/supernode/app.py +1 -2
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/auth_plugin/auth_plugin.py +33 -23
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/constant.py +2 -0
- flwr_nightly-1.14.0.dev20241216/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py → flwr_nightly-1.15.0.dev20250112/src/py/flwr/common/grpc.py +51 -121
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/record/recordset.py +1 -1
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +45 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/telemetry.py +13 -3
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/typing.py +20 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/exec_pb2.py +12 -24
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/exec_pb2.pyi +27 -54
- flwr_nightly-1.15.0.dev20250112/src/py/flwr/proto/fleet_pb2.py +69 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/fleet_pb2.pyi +84 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/fleet_pb2_grpc.py +66 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/fleet_pb2_grpc.pyi +20 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/app.py +54 -33
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/run_serverapp.py +8 -9
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/serverapp/app.py +17 -2
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/driver/serverappio_grpc.py +1 -1
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/driver/serverappio_servicer.py +29 -6
- flwr_nightly-1.15.0.dev20250112/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +126 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +16 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +2 -1
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/fleet/vce/vce_api.py +2 -2
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/linkstate/in_memory_linkstate.py +36 -24
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/linkstate/linkstate.py +14 -4
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/linkstate/sqlite_linkstate.py +56 -31
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/simulation/simulationio_grpc.py +1 -1
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/simulation/simulationio_servicer.py +13 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/simulation/app.py +15 -4
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/simulation/run_simulation.py +35 -7
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/superexec/exec_grpc.py +1 -1
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/superexec/exec_servicer.py +23 -2
- flwr_nightly-1.14.0.dev20241216/src/py/flwr/common/grpc.py +0 -68
- flwr_nightly-1.14.0.dev20241216/src/py/flwr/proto/fleet_pb2.py +0 -56
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/LICENSE +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/app.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/build.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/config_utils.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/example.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/install.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/login/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/new.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/LICENSE.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/README.baseline.md.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/README.flowertune.md.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/README.md.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/__init__.baseline.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/client.baseline.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/client.huggingface.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/client.jax.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/client.mlx.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/client.numpy.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/dataset.baseline.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/flwr_tune/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/flwr_tune/client_app.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/flwr_tune/dataset.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/flwr_tune/models.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/flwr_tune/server_app.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/flwr_tune/strategy.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/model.baseline.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/server.baseline.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/server.huggingface.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/server.jax.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/server.mlx.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/server.sklearn.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/strategy.baseline.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/task.huggingface.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/task.jax.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/task.mlx.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/task.numpy.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/task.sklearn.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/task.tensorflow.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/utils.baseline.py.tpl +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/run/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/client_app.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/clientapp/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/clientapp/app.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/clientapp/clientappio_servicer.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/clientapp/utils.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/dpfedavg_numpy_client.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/grpc_adapter_client/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/grpc_adapter_client/connection.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/grpc_client/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/grpc_client/connection.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/grpc_rere_client/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/grpc_rere_client/connection.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/heartbeat.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/message_handler/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/message_handler/task_handler.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/mod/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/mod/centraldp_mods.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/mod/comms_mods.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/mod/localdp_mod.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/mod/utils.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/nodestate/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/nodestate/in_memory_nodestate.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/nodestate/nodestate.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/nodestate/nodestate_factory.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/rest_client/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/rest_client/connection.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/run_info_store.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/supernode/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/typing.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/address.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/args.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/auth_plugin/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/config.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/context.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/date.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/differential_privacy.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/differential_privacy_constants.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/dp.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/exit_handlers.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/logger.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/message.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/object_ref.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/parameter.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/pyproject.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/record/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/record/configsrecord.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/record/conversion_utils.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/record/metricsrecord.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/record/parametersrecord.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/record/typeddict.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/recordset_compat.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/retry_invoker.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/secure_aggregation/quantization.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/serde.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/version.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/clientappio_pb2.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/clientappio_pb2.pyi +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/clientappio_pb2_grpc.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/clientappio_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/error_pb2.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/error_pb2.pyi +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/error_pb2_grpc.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/error_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/exec_pb2_grpc.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/exec_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/fab_pb2.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/fab_pb2.pyi +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/fab_pb2_grpc.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/fab_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/grpcadapter_pb2.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/grpcadapter_pb2.pyi +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/grpcadapter_pb2_grpc.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/grpcadapter_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/log_pb2.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/log_pb2.pyi +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/log_pb2_grpc.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/log_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/message_pb2.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/message_pb2.pyi +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/message_pb2_grpc.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/message_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/node_pb2.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/node_pb2.pyi +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/node_pb2_grpc.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/node_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/recordset_pb2.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/recordset_pb2.pyi +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/recordset_pb2_grpc.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/recordset_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/run_pb2.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/run_pb2.pyi +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/run_pb2_grpc.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/run_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/serverappio_pb2.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/serverappio_pb2.pyi +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/serverappio_pb2_grpc.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/serverappio_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/simulationio_pb2.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/simulationio_pb2.pyi +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/simulationio_pb2_grpc.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/simulationio_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/task_pb2.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/task_pb2.pyi +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/task_pb2_grpc.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/task_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/transport_pb2.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/transport_pb2.pyi +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/transport_pb2_grpc.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/py.typed +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/client_manager.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/client_proxy.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/compat/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/compat/app.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/compat/app_utils.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/compat/driver_client_proxy.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/compat/legacy_context.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/criterion.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/driver/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/driver/driver.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/driver/grpc_driver.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/driver/inmemory_driver.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/history.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/server.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/server_app.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/server_config.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/serverapp/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/serverapp_components.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/strategy/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/strategy/aggregate.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/strategy/bulyan.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/strategy/fedadagrad.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/strategy/fedadam.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/strategy/fedavg.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/strategy/fedavg_android.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/strategy/fedavgm.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/strategy/fedmedian.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/strategy/fedopt.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/strategy/fedprox.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/strategy/fedyogi.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/strategy/krum.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/strategy/qfedavg.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/strategy/strategy.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/driver/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/ffs/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/ffs/disk_ffs.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/ffs/ffs.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/ffs/ffs_factory.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/fleet/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/fleet/grpc_adapter/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/fleet/message_handler/message_handler.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/linkstate/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/linkstate/linkstate_factory.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/linkstate/utils.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/simulation/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/utils.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/typing.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/utils/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/utils/tensorboard.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/utils/validator.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/workflow/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/workflow/constant.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/workflow/default_workflows.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/simulation/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/simulation/legacy_app.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/simulation/ray_transport/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/simulation/ray_transport/utils.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/simulation/simulationio_connection.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/superexec/__init__.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/superexec/app.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/superexec/deployment.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/superexec/exec_user_auth_interceptor.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/superexec/executor.py +0 -0
- {flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/superexec/simulation.py +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: flwr-nightly
|
3
|
-
Version: 1.
|
3
|
+
Version: 1.15.0.dev20250112
|
4
4
|
Summary: Flower: A Friendly Federated AI Framework
|
5
5
|
Home-page: https://flower.ai
|
6
6
|
License: Apache-2.0
|
@@ -43,11 +43,11 @@ Requires-Dist: pyyaml (>=6.0.2,<7.0.0)
|
|
43
43
|
Requires-Dist: ray (==2.10.0) ; (python_version >= "3.9" and python_version < "3.12") and (extra == "simulation")
|
44
44
|
Requires-Dist: requests (>=2.31.0,<3.0.0)
|
45
45
|
Requires-Dist: rich (>=13.5.0,<14.0.0)
|
46
|
-
Requires-Dist: starlette (>=0.
|
46
|
+
Requires-Dist: starlette (>=0.45.2,<0.46.0) ; extra == "rest"
|
47
47
|
Requires-Dist: tomli (>=2.0.1,<3.0.0)
|
48
48
|
Requires-Dist: tomli-w (>=1.0.0,<2.0.0)
|
49
49
|
Requires-Dist: typer (>=0.12.5,<0.13.0)
|
50
|
-
Requires-Dist: uvicorn[standard] (>=0.
|
50
|
+
Requires-Dist: uvicorn[standard] (>=0.34.0,<0.35.0) ; extra == "rest"
|
51
51
|
Project-URL: Documentation, https://flower.ai
|
52
52
|
Project-URL: Repository, https://github.com/adap/flower
|
53
53
|
Description-Content-Type: text/markdown
|
@@ -88,7 +88,7 @@ design of Flower is based on a few guiding principles:
|
|
88
88
|
|
89
89
|
- **Framework-agnostic**: Different machine learning frameworks have different
|
90
90
|
strengths. Flower can be used with any machine learning framework, for
|
91
|
-
example, [PyTorch](https://pytorch.org), [TensorFlow](https://tensorflow.org), [Hugging Face Transformers](https://huggingface.co/), [PyTorch Lightning](https://pytorchlightning.ai/), [scikit-learn](https://scikit-learn.org/), [JAX](https://jax.readthedocs.io/), [TFLite](https://tensorflow.org/lite/), [MONAI](https://docs.monai.io/en/latest/index.html), [fastai](https://www.fast.ai/), [MLX](https://ml-explore.github.io/mlx/build/html/index.html), [XGBoost](https://xgboost.readthedocs.io/en/stable/), [Pandas](https://pandas.pydata.org/) for federated analytics, or even raw [NumPy](https://numpy.org/)
|
91
|
+
example, [PyTorch](https://pytorch.org), [TensorFlow](https://tensorflow.org), [Hugging Face Transformers](https://huggingface.co/), [PyTorch Lightning](https://pytorchlightning.ai/), [scikit-learn](https://scikit-learn.org/), [JAX](https://jax.readthedocs.io/), [TFLite](https://tensorflow.org/lite/), [MONAI](https://docs.monai.io/en/latest/index.html), [fastai](https://www.fast.ai/), [MLX](https://ml-explore.github.io/mlx/build/html/index.html), [XGBoost](https://xgboost.readthedocs.io/en/stable/), [LeRobot](https://github.com/huggingface/lerobot) for federated robots, [Pandas](https://pandas.pydata.org/) for federated analytics, or even raw [NumPy](https://numpy.org/)
|
92
92
|
for users who enjoy computing gradients by hand.
|
93
93
|
|
94
94
|
- **Understandable**: Flower is written with maintainability in mind. The
|
@@ -118,7 +118,7 @@ Flower's goal is to make federated learning accessible to everyone. This series
|
|
118
118
|
|
119
119
|
4. **Custom Clients for Federated Learning**
|
120
120
|
|
121
|
-
[](https://colab.research.google.com/github/adap/flower/blob/main/
|
121
|
+
[](https://colab.research.google.com/github/adap/flower/blob/main/framework/docs/source/tutorial-series-customize-the-client-pytorch.ipynb) (or open the [Jupyter Notebook](https://github.com/adap/flower/blob/main/framework/docs/source/tutorial-series-customize-the-client-pytorch.ipynb))
|
122
122
|
|
123
123
|
Stay tuned, more tutorials are coming soon. Topics include **Privacy and Security in Federated Learning**, and **Scaling Federated Learning**.
|
124
124
|
|
@@ -34,7 +34,7 @@ design of Flower is based on a few guiding principles:
|
|
34
34
|
|
35
35
|
- **Framework-agnostic**: Different machine learning frameworks have different
|
36
36
|
strengths. Flower can be used with any machine learning framework, for
|
37
|
-
example, [PyTorch](https://pytorch.org), [TensorFlow](https://tensorflow.org), [Hugging Face Transformers](https://huggingface.co/), [PyTorch Lightning](https://pytorchlightning.ai/), [scikit-learn](https://scikit-learn.org/), [JAX](https://jax.readthedocs.io/), [TFLite](https://tensorflow.org/lite/), [MONAI](https://docs.monai.io/en/latest/index.html), [fastai](https://www.fast.ai/), [MLX](https://ml-explore.github.io/mlx/build/html/index.html), [XGBoost](https://xgboost.readthedocs.io/en/stable/), [Pandas](https://pandas.pydata.org/) for federated analytics, or even raw [NumPy](https://numpy.org/)
|
37
|
+
example, [PyTorch](https://pytorch.org), [TensorFlow](https://tensorflow.org), [Hugging Face Transformers](https://huggingface.co/), [PyTorch Lightning](https://pytorchlightning.ai/), [scikit-learn](https://scikit-learn.org/), [JAX](https://jax.readthedocs.io/), [TFLite](https://tensorflow.org/lite/), [MONAI](https://docs.monai.io/en/latest/index.html), [fastai](https://www.fast.ai/), [MLX](https://ml-explore.github.io/mlx/build/html/index.html), [XGBoost](https://xgboost.readthedocs.io/en/stable/), [LeRobot](https://github.com/huggingface/lerobot) for federated robots, [Pandas](https://pandas.pydata.org/) for federated analytics, or even raw [NumPy](https://numpy.org/)
|
38
38
|
for users who enjoy computing gradients by hand.
|
39
39
|
|
40
40
|
- **Understandable**: Flower is written with maintainability in mind. The
|
@@ -64,7 +64,7 @@ Flower's goal is to make federated learning accessible to everyone. This series
|
|
64
64
|
|
65
65
|
4. **Custom Clients for Federated Learning**
|
66
66
|
|
67
|
-
[](https://colab.research.google.com/github/adap/flower/blob/main/
|
67
|
+
[](https://colab.research.google.com/github/adap/flower/blob/main/framework/docs/source/tutorial-series-customize-the-client-pytorch.ipynb) (or open the [Jupyter Notebook](https://github.com/adap/flower/blob/main/framework/docs/source/tutorial-series-customize-the-client-pytorch.ipynb))
|
68
68
|
|
69
69
|
Stay tuned, more tutorials are coming soon. Topics include **Privacy and Security in Federated Learning**, and **Scaling Federated Learning**.
|
70
70
|
|
@@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api"
|
|
4
4
|
|
5
5
|
[tool.poetry]
|
6
6
|
name = "flwr-nightly"
|
7
|
-
version = "1.
|
7
|
+
version = "1.15.0.dev20250112"
|
8
8
|
description = "Flower: A Friendly Federated AI Framework"
|
9
9
|
license = "Apache-2.0"
|
10
10
|
authors = ["The Flower Authors <hello@flower.ai>"]
|
@@ -83,8 +83,8 @@ requests = "^2.31.0"
|
|
83
83
|
# Optional dependencies (Simulation Engine)
|
84
84
|
ray = { version = "==2.10.0", optional = true, python = ">=3.9,<3.12" }
|
85
85
|
# Optional dependencies (REST transport layer)
|
86
|
-
starlette = { version = "^0.
|
87
|
-
uvicorn = { version = "^0.
|
86
|
+
starlette = { version = "^0.45.2", optional = true }
|
87
|
+
uvicorn = { version = "^0.34.0", extras = ["standard"], optional = true }
|
88
88
|
|
89
89
|
[tool.poetry.extras]
|
90
90
|
simulation = ["ray"]
|
@@ -106,11 +106,11 @@ flake8 = "==5.0.4"
|
|
106
106
|
parameterized = "==0.9.0"
|
107
107
|
pytest = "==7.4.4"
|
108
108
|
pytest-cov = "==4.1.0"
|
109
|
-
pytest-watcher = "==0.4.
|
109
|
+
pytest-watcher = "==0.4.3"
|
110
110
|
grpcio-tools = "==1.60.0"
|
111
111
|
mypy-protobuf = "==3.2.0"
|
112
112
|
jupyterlab = "==4.0.12"
|
113
|
-
rope = "==1.
|
113
|
+
rope = "==1.13.0"
|
114
114
|
semver = "==3.0.2"
|
115
115
|
sphinx = "==7.4.7"
|
116
116
|
sphinx-intl = "==2.2.0"
|
@@ -124,7 +124,7 @@ furo = "==2024.8.6"
|
|
124
124
|
sphinx-reredirects = "==0.1.5"
|
125
125
|
nbsphinx = "==0.9.5"
|
126
126
|
nbstripout = "==0.6.1"
|
127
|
-
ruff = "==0.
|
127
|
+
ruff = "==0.4.5"
|
128
128
|
sphinx-argparse = "==0.4.0"
|
129
129
|
pipreqs = "==0.4.13"
|
130
130
|
mdformat = "==0.7.18"
|
@@ -201,9 +201,6 @@ wrap-descriptions = 88
|
|
201
201
|
[tool.ruff]
|
202
202
|
target-version = "py39"
|
203
203
|
line-length = 88
|
204
|
-
select = ["D", "E", "F", "W", "B", "ISC", "C4", "UP"]
|
205
|
-
fixable = ["D", "E", "F", "W", "B", "ISC", "C4", "UP"]
|
206
|
-
ignore = ["B024", "B027", "D205", "D209"]
|
207
204
|
exclude = [
|
208
205
|
".bzr",
|
209
206
|
".direnv",
|
@@ -228,10 +225,15 @@ exclude = [
|
|
228
225
|
"proto",
|
229
226
|
]
|
230
227
|
|
231
|
-
[tool.ruff.
|
228
|
+
[tool.ruff.lint]
|
229
|
+
select = ["D", "E", "F", "W", "B", "ISC", "C4", "UP"]
|
230
|
+
fixable = ["D", "E", "F", "W", "B", "ISC", "C4", "UP"]
|
231
|
+
ignore = ["B024", "B027", "D205", "D209"]
|
232
|
+
|
233
|
+
[tool.ruff.lint.pydocstyle]
|
232
234
|
convention = "numpy"
|
233
235
|
|
234
|
-
[tool.ruff.per-file-ignores]
|
236
|
+
[tool.ruff.lint.per-file-ignores]
|
235
237
|
"src/py/flwr/server/strategy/*.py" = ["E501"]
|
236
238
|
|
237
239
|
[tool.docsig]
|
@@ -54,8 +54,12 @@ class CliUserAuthInterceptor(
|
|
54
54
|
|
55
55
|
response = continuation(details, request)
|
56
56
|
if response.initial_metadata():
|
57
|
-
|
58
|
-
|
57
|
+
credentials = self.auth_plugin.read_tokens_from_metadata(
|
58
|
+
response.initial_metadata()
|
59
|
+
)
|
60
|
+
# The metadata contains tokens only if they have been refreshed
|
61
|
+
if credentials is not None:
|
62
|
+
self.auth_plugin.store_tokens(credentials)
|
59
63
|
|
60
64
|
return response
|
61
65
|
|
@@ -34,7 +34,7 @@ from flwr.common.logger import log as logger
|
|
34
34
|
from flwr.proto.exec_pb2 import StreamLogsRequest # pylint: disable=E0611
|
35
35
|
from flwr.proto.exec_pb2_grpc import ExecStub
|
36
36
|
|
37
|
-
from .utils import init_channel, try_obtain_cli_auth_plugin
|
37
|
+
from .utils import init_channel, try_obtain_cli_auth_plugin, unauthenticated_exc_handler
|
38
38
|
|
39
39
|
|
40
40
|
def start_stream(
|
@@ -88,8 +88,9 @@ def stream_logs(
|
|
88
88
|
latest_timestamp = 0.0
|
89
89
|
res = None
|
90
90
|
try:
|
91
|
-
|
92
|
-
|
91
|
+
with unauthenticated_exc_handler():
|
92
|
+
for res in stub.StreamLogs(req, timeout=duration):
|
93
|
+
print(res.log_output, end="")
|
93
94
|
except grpc.RpcError as e:
|
94
95
|
# pylint: disable=E1101
|
95
96
|
if e.code() != grpc.StatusCode.DEADLINE_EXCEEDED:
|
@@ -109,9 +110,10 @@ def print_logs(run_id: int, channel: grpc.Channel, timeout: int) -> None:
|
|
109
110
|
try:
|
110
111
|
while True:
|
111
112
|
try:
|
112
|
-
|
113
|
-
|
114
|
-
|
113
|
+
with unauthenticated_exc_handler():
|
114
|
+
# Enforce timeout for graceful exit
|
115
|
+
for res in stub.StreamLogs(req, timeout=timeout):
|
116
|
+
print(res.log_output)
|
115
117
|
except grpc.RpcError as e:
|
116
118
|
# pylint: disable=E1101
|
117
119
|
if e.code() == grpc.StatusCode.DEADLINE_EXCEEDED:
|
{flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/login/login.py
RENAMED
@@ -26,7 +26,7 @@ from flwr.cli.config_utils import (
|
|
26
26
|
process_loaded_project_config,
|
27
27
|
validate_federation_in_project_config,
|
28
28
|
)
|
29
|
-
from flwr.common.
|
29
|
+
from flwr.common.typing import UserAuthLoginDetails
|
30
30
|
from flwr.proto.exec_pb2 import ( # pylint: disable=E0611
|
31
31
|
GetLoginDetailsRequest,
|
32
32
|
GetLoginDetailsResponse,
|
@@ -64,7 +64,7 @@ def login( # pylint: disable=R0914
|
|
64
64
|
login_response: GetLoginDetailsResponse = stub.GetLoginDetails(login_request)
|
65
65
|
|
66
66
|
# Get the auth plugin
|
67
|
-
auth_type = login_response.
|
67
|
+
auth_type = login_response.auth_type
|
68
68
|
auth_plugin = try_obtain_cli_auth_plugin(app, federation, auth_type)
|
69
69
|
if auth_plugin is None:
|
70
70
|
typer.secho(
|
@@ -75,7 +75,14 @@ def login( # pylint: disable=R0914
|
|
75
75
|
raise typer.Exit(code=1)
|
76
76
|
|
77
77
|
# Login
|
78
|
-
|
78
|
+
details = UserAuthLoginDetails(
|
79
|
+
auth_type=login_response.auth_type,
|
80
|
+
device_code=login_response.device_code,
|
81
|
+
verification_uri_complete=login_response.verification_uri_complete,
|
82
|
+
expires_in=login_response.expires_in,
|
83
|
+
interval=login_response.interval,
|
84
|
+
)
|
85
|
+
credentials = auth_plugin.login(details, stub)
|
79
86
|
|
80
87
|
# Store the tokens
|
81
|
-
auth_plugin.store_tokens(
|
88
|
+
auth_plugin.store_tokens(credentials)
|
@@ -43,7 +43,7 @@ from flwr.proto.exec_pb2 import ( # pylint: disable=E0611
|
|
43
43
|
)
|
44
44
|
from flwr.proto.exec_pb2_grpc import ExecStub
|
45
45
|
|
46
|
-
from .utils import init_channel, try_obtain_cli_auth_plugin
|
46
|
+
from .utils import init_channel, try_obtain_cli_auth_plugin, unauthenticated_exc_handler
|
47
47
|
|
48
48
|
_RunListType = tuple[int, str, str, str, str, str, str, str, str]
|
49
49
|
|
@@ -99,7 +99,6 @@ def ls( # pylint: disable=too-many-locals, too-many-branches
|
|
99
99
|
try:
|
100
100
|
if suppress_output:
|
101
101
|
redirect_output(captured_output)
|
102
|
-
|
103
102
|
# Load and validate federation config
|
104
103
|
typer.secho("Loading project configuration... ", fg=typer.colors.BLUE)
|
105
104
|
|
@@ -132,6 +131,8 @@ def ls( # pylint: disable=too-many-locals, too-many-branches
|
|
132
131
|
_list_runs(stub, output_format)
|
133
132
|
|
134
133
|
except ValueError as err:
|
134
|
+
if suppress_output:
|
135
|
+
redirect_output(captured_output)
|
135
136
|
typer.secho(
|
136
137
|
f"❌ {err}",
|
137
138
|
fg=typer.colors.RED,
|
@@ -295,7 +296,8 @@ def _list_runs(
|
|
295
296
|
output_format: str = CliOutputFormat.DEFAULT,
|
296
297
|
) -> None:
|
297
298
|
"""List all runs."""
|
298
|
-
|
299
|
+
with unauthenticated_exc_handler():
|
300
|
+
res: ListRunsResponse = stub.ListRuns(ListRunsRequest())
|
299
301
|
run_dict = {run_id: run_from_proto(proto) for run_id, proto in res.run_dict.items()}
|
300
302
|
|
301
303
|
formatted_runs = _format_runs(run_dict, res.now)
|
@@ -311,7 +313,8 @@ def _display_one_run(
|
|
311
313
|
output_format: str = CliOutputFormat.DEFAULT,
|
312
314
|
) -> None:
|
313
315
|
"""Display information about a specific run."""
|
314
|
-
|
316
|
+
with unauthenticated_exc_handler():
|
317
|
+
res: ListRunsResponse = stub.ListRuns(ListRunsRequest(run_id=run_id))
|
315
318
|
if not res.run_dict:
|
316
319
|
raise ValueError(f"Run ID {run_id} not found")
|
317
320
|
|
@@ -8,10 +8,10 @@ version = "1.0.0"
|
|
8
8
|
description = ""
|
9
9
|
license = "Apache-2.0"
|
10
10
|
dependencies = [
|
11
|
-
"flwr[simulation]>=1.
|
11
|
+
"flwr[simulation]>=1.14.0",
|
12
12
|
"flwr-datasets[vision]>=0.3.0",
|
13
|
-
"torch==2.
|
14
|
-
"torchvision==0.
|
13
|
+
"torch==2.5.1",
|
14
|
+
"torchvision==0.20.1",
|
15
15
|
]
|
16
16
|
|
17
17
|
[tool.hatch.build.targets.wheel]
|
{flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/run/run.py
RENAMED
@@ -48,7 +48,11 @@ from flwr.proto.exec_pb2 import StartRunRequest # pylint: disable=E0611
|
|
48
48
|
from flwr.proto.exec_pb2_grpc import ExecStub
|
49
49
|
|
50
50
|
from ..log import start_stream
|
51
|
-
from ..utils import
|
51
|
+
from ..utils import (
|
52
|
+
init_channel,
|
53
|
+
try_obtain_cli_auth_plugin,
|
54
|
+
unauthenticated_exc_handler,
|
55
|
+
)
|
52
56
|
|
53
57
|
CONN_REFRESH_PERIOD = 60 # Connection refresh period for log streaming (seconds)
|
54
58
|
|
@@ -166,7 +170,8 @@ def _run_with_exec_api(
|
|
166
170
|
override_config=user_config_to_proto(parse_config_args(config_overrides)),
|
167
171
|
federation_options=configs_record_to_proto(c_record),
|
168
172
|
)
|
169
|
-
|
173
|
+
with unauthenticated_exc_handler():
|
174
|
+
res = stub.StartRun(req)
|
170
175
|
|
171
176
|
if res.HasField("run_id"):
|
172
177
|
typer.secho(f"🎊 Successfully started run {res.run_id}", fg=typer.colors.GREEN)
|
@@ -34,7 +34,7 @@ from flwr.common.logger import print_json_error, redirect_output, restore_output
|
|
34
34
|
from flwr.proto.exec_pb2 import StopRunRequest, StopRunResponse # pylint: disable=E0611
|
35
35
|
from flwr.proto.exec_pb2_grpc import ExecStub
|
36
36
|
|
37
|
-
from .utils import init_channel, try_obtain_cli_auth_plugin
|
37
|
+
from .utils import init_channel, try_obtain_cli_auth_plugin, unauthenticated_exc_handler
|
38
38
|
|
39
39
|
|
40
40
|
def stop( # pylint: disable=R0914
|
@@ -113,7 +113,8 @@ def stop( # pylint: disable=R0914
|
|
113
113
|
|
114
114
|
def _stop_run(stub: ExecStub, run_id: int, output_format: str) -> None:
|
115
115
|
"""Stop a run."""
|
116
|
-
|
116
|
+
with unauthenticated_exc_handler():
|
117
|
+
response: StopRunResponse = stub.StopRun(request=StopRunRequest(run_id=run_id))
|
117
118
|
if response.success:
|
118
119
|
typer.secho(f"✅ Run {run_id} successfully stopped.", fg=typer.colors.GREEN)
|
119
120
|
if output_format == CliOutputFormat.JSON:
|
{flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/utils.py
RENAMED
@@ -18,9 +18,11 @@
|
|
18
18
|
import hashlib
|
19
19
|
import json
|
20
20
|
import re
|
21
|
+
from collections.abc import Iterator
|
22
|
+
from contextlib import contextmanager
|
21
23
|
from logging import DEBUG
|
22
24
|
from pathlib import Path
|
23
|
-
from typing import Any, Callable, Optional, cast
|
25
|
+
from typing import Any, Callable, Optional, Union, cast
|
24
26
|
|
25
27
|
import grpc
|
26
28
|
import typer
|
@@ -146,23 +148,69 @@ def sanitize_project_name(name: str) -> str:
|
|
146
148
|
return sanitized_name
|
147
149
|
|
148
150
|
|
149
|
-
def get_sha256_hash(
|
151
|
+
def get_sha256_hash(file_path_or_int: Union[Path, int]) -> str:
|
150
152
|
"""Calculate the SHA-256 hash of a file."""
|
151
153
|
sha256 = hashlib.sha256()
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
154
|
+
if isinstance(file_path_or_int, Path):
|
155
|
+
with open(file_path_or_int, "rb") as f:
|
156
|
+
while True:
|
157
|
+
data = f.read(65536) # Read in 64kB blocks
|
158
|
+
if not data:
|
159
|
+
break
|
160
|
+
sha256.update(data)
|
161
|
+
elif isinstance(file_path_or_int, int):
|
162
|
+
sha256.update(str(file_path_or_int).encode())
|
158
163
|
return sha256.hexdigest()
|
159
164
|
|
160
165
|
|
161
166
|
def get_user_auth_config_path(root_dir: Path, federation: str) -> Path:
|
162
|
-
"""Return the path to the user auth config file.
|
167
|
+
"""Return the path to the user auth config file.
|
168
|
+
|
169
|
+
Additionally, a `.gitignore` file will be created in the Flower directory to
|
170
|
+
include the `.credentials` folder to be excluded from git. If the `.gitignore`
|
171
|
+
file already exists, a warning will be displayed if the `.credentials` entry is
|
172
|
+
not found.
|
173
|
+
"""
|
163
174
|
# Locate the credentials directory
|
164
|
-
|
175
|
+
abs_flwr_dir = root_dir.absolute() / FLWR_DIR
|
176
|
+
credentials_dir = abs_flwr_dir / CREDENTIALS_DIR
|
165
177
|
credentials_dir.mkdir(parents=True, exist_ok=True)
|
178
|
+
|
179
|
+
# Determine the absolute path of the Flower directory for .gitignore
|
180
|
+
gitignore_path = abs_flwr_dir / ".gitignore"
|
181
|
+
credential_entry = CREDENTIALS_DIR
|
182
|
+
|
183
|
+
try:
|
184
|
+
if gitignore_path.exists():
|
185
|
+
with open(gitignore_path, encoding="utf-8") as gitignore_file:
|
186
|
+
lines = gitignore_file.read().splitlines()
|
187
|
+
|
188
|
+
# Warn if .credentials is not already in .gitignore
|
189
|
+
if credential_entry not in lines:
|
190
|
+
typer.secho(
|
191
|
+
f"`.gitignore` exists, but `{credential_entry}` entry not found. "
|
192
|
+
"Consider adding it to your `.gitignore` to exclude Flower "
|
193
|
+
"credentials from git.",
|
194
|
+
fg=typer.colors.YELLOW,
|
195
|
+
bold=True,
|
196
|
+
)
|
197
|
+
else:
|
198
|
+
typer.secho(
|
199
|
+
f"Creating a new `.gitignore` with `{credential_entry}` entry...",
|
200
|
+
fg=typer.colors.BLUE,
|
201
|
+
)
|
202
|
+
# Create a new .gitignore with .credentials
|
203
|
+
with open(gitignore_path, "w", encoding="utf-8") as gitignore_file:
|
204
|
+
gitignore_file.write(f"{credential_entry}\n")
|
205
|
+
except Exception as err:
|
206
|
+
typer.secho(
|
207
|
+
"❌ An error occurred while handling `.gitignore.` "
|
208
|
+
f"Please check the permissions of `{gitignore_path}` and try again.",
|
209
|
+
fg=typer.colors.RED,
|
210
|
+
bold=True,
|
211
|
+
)
|
212
|
+
raise typer.Exit(code=1) from err
|
213
|
+
|
166
214
|
return credentials_dir / f"{federation}.json"
|
167
215
|
|
168
216
|
|
@@ -175,19 +223,19 @@ def try_obtain_cli_auth_plugin(
|
|
175
223
|
config_path = get_user_auth_config_path(root_dir, federation)
|
176
224
|
|
177
225
|
# Load the config file if it exists
|
178
|
-
|
226
|
+
json_file: dict[str, Any] = {}
|
179
227
|
if config_path.exists():
|
180
228
|
with config_path.open("r", encoding="utf-8") as file:
|
181
|
-
|
229
|
+
json_file = json.load(file)
|
182
230
|
# This is the case when the user auth is not enabled
|
183
231
|
elif auth_type is None:
|
184
232
|
return None
|
185
233
|
|
186
234
|
# Get the auth type from the config if not provided
|
187
235
|
if auth_type is None:
|
188
|
-
if AUTH_TYPE not in
|
236
|
+
if AUTH_TYPE not in json_file:
|
189
237
|
return None
|
190
|
-
auth_type =
|
238
|
+
auth_type = json_file[AUTH_TYPE]
|
191
239
|
|
192
240
|
# Retrieve auth plugin class and instantiate it
|
193
241
|
try:
|
@@ -231,3 +279,24 @@ def init_channel(
|
|
231
279
|
)
|
232
280
|
channel.subscribe(on_channel_state_change)
|
233
281
|
return channel
|
282
|
+
|
283
|
+
|
284
|
+
@contextmanager
|
285
|
+
def unauthenticated_exc_handler() -> Iterator[None]:
|
286
|
+
"""Context manager to handle gRPC UNAUTHENTICATED errors.
|
287
|
+
|
288
|
+
It catches grpc.RpcError exceptions with UNAUTHENTICATED status, informs the user,
|
289
|
+
and exits the application. All other exceptions will be allowed to escape.
|
290
|
+
"""
|
291
|
+
try:
|
292
|
+
yield
|
293
|
+
except grpc.RpcError as e:
|
294
|
+
if e.code() != grpc.StatusCode.UNAUTHENTICATED:
|
295
|
+
raise
|
296
|
+
typer.secho(
|
297
|
+
"❌ Authentication failed. Please run `flwr login`"
|
298
|
+
" to authenticate and try again.",
|
299
|
+
fg=typer.colors.RED,
|
300
|
+
bold=True,
|
301
|
+
)
|
302
|
+
raise typer.Exit(code=1) from None
|
{flwr_nightly-1.14.0.dev20241216 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/app.py
RENAMED
@@ -15,13 +15,14 @@
|
|
15
15
|
"""Flower client app."""
|
16
16
|
|
17
17
|
|
18
|
+
import multiprocessing
|
18
19
|
import signal
|
19
|
-
import subprocess
|
20
20
|
import sys
|
21
21
|
import time
|
22
22
|
from contextlib import AbstractContextManager
|
23
23
|
from dataclasses import dataclass
|
24
24
|
from logging import ERROR, INFO, WARN
|
25
|
+
from os import urandom
|
25
26
|
from pathlib import Path
|
26
27
|
from typing import Callable, Optional, Union, cast
|
27
28
|
|
@@ -33,6 +34,7 @@ from flwr.cli.config_utils import get_fab_metadata
|
|
33
34
|
from flwr.cli.install import install_from_fab
|
34
35
|
from flwr.client.client import Client
|
35
36
|
from flwr.client.client_app import ClientApp, LoadClientAppError
|
37
|
+
from flwr.client.clientapp.app import flwr_clientapp
|
36
38
|
from flwr.client.nodestate.nodestate_factory import NodeStateFactory
|
37
39
|
from flwr.client.typing import ClientFnExt
|
38
40
|
from flwr.common import GRPC_MAX_MESSAGE_LENGTH, Context, EventType, Message, event
|
@@ -53,13 +55,12 @@ from flwr.common.constant import (
|
|
53
55
|
TRANSPORT_TYPES,
|
54
56
|
ErrorCode,
|
55
57
|
)
|
58
|
+
from flwr.common.grpc import generic_create_grpc_server
|
56
59
|
from flwr.common.logger import log, warn_deprecated_feature
|
57
60
|
from flwr.common.message import Error
|
58
61
|
from flwr.common.retry_invoker import RetryInvoker, RetryState, exponential
|
59
62
|
from flwr.common.typing import Fab, Run, RunNotRunningException, UserConfig
|
60
63
|
from flwr.proto.clientappio_pb2_grpc import add_ClientAppIoServicer_to_server
|
61
|
-
from flwr.server.superlink.fleet.grpc_bidi.grpc_server import generic_create_grpc_server
|
62
|
-
from flwr.server.superlink.linkstate.utils import generate_rand_int_from_bytes
|
63
64
|
|
64
65
|
from .clientapp.clientappio_servicer import ClientAppInputs, ClientAppIoServicer
|
65
66
|
from .grpc_adapter_client.connection import grpc_adapter
|
@@ -391,6 +392,7 @@ def start_client_internal(
|
|
391
392
|
run_info_store: Optional[DeprecatedRunInfoStore] = None
|
392
393
|
state_factory = NodeStateFactory()
|
393
394
|
state = state_factory.state()
|
395
|
+
mp_spawn_context = multiprocessing.get_context("spawn")
|
394
396
|
|
395
397
|
runs: dict[int, Run] = {}
|
396
398
|
|
@@ -513,7 +515,7 @@ def start_client_internal(
|
|
513
515
|
# Docker container.
|
514
516
|
|
515
517
|
# Generate SuperNode token
|
516
|
-
token
|
518
|
+
token = int.from_bytes(urandom(RUN_ID_NUM_BYTES), "little")
|
517
519
|
|
518
520
|
# Mode 1: SuperNode starts ClientApp as subprocess
|
519
521
|
start_subprocess = isolation == ISOLATION_MODE_SUBPROCESS
|
@@ -549,12 +551,13 @@ def start_client_internal(
|
|
549
551
|
]
|
550
552
|
command.append("--insecure")
|
551
553
|
|
552
|
-
|
553
|
-
|
554
|
-
|
555
|
-
|
556
|
-
check=True,
|
554
|
+
proc = mp_spawn_context.Process(
|
555
|
+
target=_run_flwr_clientapp,
|
556
|
+
args=(command,),
|
557
|
+
daemon=True,
|
557
558
|
)
|
559
|
+
proc.start()
|
560
|
+
proc.join()
|
558
561
|
else:
|
559
562
|
# Wait for output to become available
|
560
563
|
while not clientappio_servicer.has_outputs():
|
@@ -826,6 +829,11 @@ class _AppStateTracker:
|
|
826
829
|
signal.signal(signal.SIGTERM, signal_handler)
|
827
830
|
|
828
831
|
|
832
|
+
def _run_flwr_clientapp(args: list[str]) -> None:
|
833
|
+
sys.argv = args
|
834
|
+
flwr_clientapp()
|
835
|
+
|
836
|
+
|
829
837
|
def run_clientappio_api_grpc(
|
830
838
|
address: str,
|
831
839
|
certificates: Optional[tuple[bytes, bytes, bytes]],
|