flwr-nightly 1.9.0.dev20240520__tar.gz → 1.9.0.dev20240531__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.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/PKG-INFO +4 -3
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/README.md +2 -1
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/pyproject.toml +3 -3
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/build.py +2 -4
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/config_utils.py +1 -23
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/new/templates/app/pyproject.hf.toml.tpl +6 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +6 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +6 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +6 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +6 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +6 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/run/run.py +20 -4
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/client/grpc_rere_client/connection.py +5 -2
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/client/supernode/app.py +41 -23
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/recordset_compat.py +8 -1
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -15
- flwr_nightly-1.9.0.dev20240531/src/py/flwr/proto/grpcadapter_pb2.py +32 -0
- flwr_nightly-1.9.0.dev20240531/src/py/flwr/proto/grpcadapter_pb2.pyi +43 -0
- flwr_nightly-1.9.0.dev20240531/src/py/flwr/proto/grpcadapter_pb2_grpc.py +66 -0
- flwr_nightly-1.9.0.dev20240531/src/py/flwr/proto/grpcadapter_pb2_grpc.pyi +24 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/app.py +134 -182
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/LICENSE +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/app.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/example.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/new/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/new/new.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/new/templates/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/new/templates/app/.gitignore.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/new/templates/app/README.md.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/new/templates/app/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/new/templates/app/code/client.hf.py.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/new/templates/app/code/client.jax.py.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/new/templates/app/code/client.mlx.py.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/new/templates/app/code/client.numpy.py.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/new/templates/app/code/server.hf.py.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/new/templates/app/code/server.jax.py.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/new/templates/app/code/server.mlx.py.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/new/templates/app/code/server.sklearn.py.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/new/templates/app/code/task.hf.py.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/new/templates/app/code/task.jax.py.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/new/templates/app/code/task.mlx.py.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/new/templates/app/code/task.tensorflow.py.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/new/templates/app/pyproject.jax.toml.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/run/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/utils.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/client/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/client/app.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/client/client.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/client/client_app.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/client/dpfedavg_numpy_client.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/client/grpc_client/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/client/grpc_client/connection.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/client/grpc_rere_client/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/client/grpc_rere_client/client_interceptor.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/client/heartbeat.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/client/message_handler/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/client/message_handler/message_handler.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/client/message_handler/task_handler.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/client/mod/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/client/mod/centraldp_mods.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/client/mod/comms_mods.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/client/mod/localdp_mod.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/client/mod/utils.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/client/node_state.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/client/node_state_tests.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/client/numpy_client.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/client/rest_client/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/client/rest_client/connection.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/client/supernode/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/client/typing.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/address.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/constant.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/context.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/date.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/differential_privacy.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/differential_privacy_constants.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/dp.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/exit_handlers.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/grpc.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/logger.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/message.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/object_ref.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/parameter.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/pyproject.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/record/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/record/configsrecord.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/record/conversion_utils.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/record/metricsrecord.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/record/parametersrecord.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/record/recordset.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/record/typeddict.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/retry_invoker.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/secure_aggregation/quantization.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/serde.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/telemetry.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/typing.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/version.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/proto/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/proto/driver_pb2.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/proto/driver_pb2.pyi +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/proto/driver_pb2_grpc.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/proto/driver_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/proto/error_pb2.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/proto/error_pb2.pyi +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/proto/error_pb2_grpc.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/proto/error_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/proto/fleet_pb2.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/proto/fleet_pb2.pyi +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/proto/fleet_pb2_grpc.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/proto/node_pb2.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/proto/node_pb2.pyi +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/proto/node_pb2_grpc.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/proto/node_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/proto/recordset_pb2.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/proto/recordset_pb2.pyi +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/proto/recordset_pb2_grpc.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/proto/recordset_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/proto/task_pb2.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/proto/task_pb2.pyi +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/proto/task_pb2_grpc.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/proto/task_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/proto/transport_pb2.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/proto/transport_pb2.pyi +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/proto/transport_pb2_grpc.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/py.typed +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/client_manager.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/client_proxy.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/compat/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/compat/app.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/compat/app_utils.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/compat/driver_client_proxy.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/compat/legacy_context.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/criterion.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/driver/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/driver/driver.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/driver/grpc_driver.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/driver/inmemory_driver.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/history.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/run_serverapp.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/server.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/server_app.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/server_config.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/strategy/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/strategy/aggregate.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/strategy/bulyan.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/strategy/fedadagrad.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/strategy/fedadam.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/strategy/fedavg.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/strategy/fedavg_android.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/strategy/fedavgm.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/strategy/fedmedian.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/strategy/fedopt.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/strategy/fedprox.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/strategy/fedyogi.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/strategy/krum.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/strategy/qfedavg.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/strategy/strategy.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/superlink/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/superlink/driver/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/superlink/driver/driver_grpc.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/superlink/driver/driver_servicer.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/superlink/fleet/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/superlink/fleet/message_handler/message_handler.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/superlink/fleet/vce/vce_api.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/superlink/state/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/superlink/state/in_memory_state.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/superlink/state/sqlite_state.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/superlink/state/state.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/superlink/state/state_factory.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/superlink/state/utils.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/typing.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/utils/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/utils/tensorboard.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/utils/validator.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/workflow/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/workflow/constant.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/workflow/default_workflows.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/simulation/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/simulation/app.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/simulation/ray_transport/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/simulation/ray_transport/utils.py +0 -0
- {flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/simulation/run_simulation.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: flwr-nightly
|
|
3
|
-
Version: 1.9.0.
|
|
3
|
+
Version: 1.9.0.dev20240531
|
|
4
4
|
Summary: Flower: A Friendly Federated Learning Framework
|
|
5
5
|
Home-page: https://flower.ai
|
|
6
6
|
License: Apache-2.0
|
|
@@ -39,7 +39,7 @@ Requires-Dist: numpy (>=1.21.0,<2.0.0)
|
|
|
39
39
|
Requires-Dist: pathspec (>=0.12.1,<0.13.0)
|
|
40
40
|
Requires-Dist: protobuf (>=4.25.2,<5.0.0)
|
|
41
41
|
Requires-Dist: pycryptodome (>=3.18.0,<4.0.0)
|
|
42
|
-
Requires-Dist: ray (==2.
|
|
42
|
+
Requires-Dist: ray (==2.10.0) ; (python_version >= "3.8" and python_version < "3.12") and (extra == "simulation")
|
|
43
43
|
Requires-Dist: requests (>=2.31.0,<3.0.0) ; extra == "rest"
|
|
44
44
|
Requires-Dist: starlette (>=0.31.0,<0.32.0) ; extra == "rest"
|
|
45
45
|
Requires-Dist: tomli (>=2.0.1,<3.0.0)
|
|
@@ -201,8 +201,9 @@ Other [examples](https://github.com/adap/flower/tree/main/examples):
|
|
|
201
201
|
- Single-Machine Simulation of Federated Learning Systems ([PyTorch](https://github.com/adap/flower/tree/main/examples/simulation-pytorch)) ([Tensorflow](https://github.com/adap/flower/tree/main/examples/simulation-tensorflow))
|
|
202
202
|
- [Comprehensive Flower+XGBoost](https://github.com/adap/flower/tree/main/examples/xgboost-comprehensive)
|
|
203
203
|
- [Flower through Docker Compose and with Grafana dashboard](https://github.com/adap/flower/tree/main/examples/flower-via-docker-compose)
|
|
204
|
-
- [Flower with KaplanMeierFitter from the lifelines library](https://github.com/adap/flower/tree/main/examples/federated-
|
|
204
|
+
- [Flower with KaplanMeierFitter from the lifelines library](https://github.com/adap/flower/tree/main/examples/federated-kaplan-meier-fitter)
|
|
205
205
|
- [Sample Level Privacy with Opacus](https://github.com/adap/flower/tree/main/examples/opacus)
|
|
206
|
+
- [Sample Level Privacy with TensorFlow-Privacy](https://github.com/adap/flower/tree/main/examples/tensorflow-privacy)
|
|
206
207
|
|
|
207
208
|
## Community
|
|
208
209
|
|
|
@@ -150,8 +150,9 @@ Other [examples](https://github.com/adap/flower/tree/main/examples):
|
|
|
150
150
|
- Single-Machine Simulation of Federated Learning Systems ([PyTorch](https://github.com/adap/flower/tree/main/examples/simulation-pytorch)) ([Tensorflow](https://github.com/adap/flower/tree/main/examples/simulation-tensorflow))
|
|
151
151
|
- [Comprehensive Flower+XGBoost](https://github.com/adap/flower/tree/main/examples/xgboost-comprehensive)
|
|
152
152
|
- [Flower through Docker Compose and with Grafana dashboard](https://github.com/adap/flower/tree/main/examples/flower-via-docker-compose)
|
|
153
|
-
- [Flower with KaplanMeierFitter from the lifelines library](https://github.com/adap/flower/tree/main/examples/federated-
|
|
153
|
+
- [Flower with KaplanMeierFitter from the lifelines library](https://github.com/adap/flower/tree/main/examples/federated-kaplan-meier-fitter)
|
|
154
154
|
- [Sample Level Privacy with Opacus](https://github.com/adap/flower/tree/main/examples/opacus)
|
|
155
|
+
- [Sample Level Privacy with TensorFlow-Privacy](https://github.com/adap/flower/tree/main/examples/tensorflow-privacy)
|
|
155
156
|
|
|
156
157
|
## Community
|
|
157
158
|
|
|
@@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api"
|
|
|
4
4
|
|
|
5
5
|
[tool.poetry]
|
|
6
6
|
name = "flwr-nightly"
|
|
7
|
-
version = "1.9.0.
|
|
7
|
+
version = "1.9.0.dev20240531"
|
|
8
8
|
description = "Flower: A Friendly Federated Learning Framework"
|
|
9
9
|
license = "Apache-2.0"
|
|
10
10
|
authors = ["The Flower Authors <hello@flower.ai>"]
|
|
@@ -74,14 +74,14 @@ typer = { version = "^0.9.0", extras=["all"] }
|
|
|
74
74
|
tomli = "^2.0.1"
|
|
75
75
|
pathspec = "^0.12.1"
|
|
76
76
|
# Optional dependencies (Simulation Engine)
|
|
77
|
-
ray = { version = "==2.
|
|
77
|
+
ray = { version = "==2.10.0", optional = true, python = ">=3.8,<3.12" }
|
|
78
78
|
# Optional dependencies (REST transport layer)
|
|
79
79
|
requests = { version = "^2.31.0", optional = true }
|
|
80
80
|
starlette = { version = "^0.31.0", optional = true }
|
|
81
81
|
uvicorn = { version = "^0.23.0", extras = ["standard"], optional = true }
|
|
82
82
|
|
|
83
83
|
[tool.poetry.extras]
|
|
84
|
-
simulation = ["ray"
|
|
84
|
+
simulation = ["ray"]
|
|
85
85
|
rest = ["requests", "starlette", "uvicorn"]
|
|
86
86
|
|
|
87
87
|
[tool.poetry.group.dev.dependencies]
|
|
@@ -24,7 +24,7 @@ import pathspec
|
|
|
24
24
|
import typer
|
|
25
25
|
from typing_extensions import Annotated
|
|
26
26
|
|
|
27
|
-
from .config_utils import
|
|
27
|
+
from .config_utils import load_and_validate
|
|
28
28
|
from .utils import is_valid_project_name
|
|
29
29
|
|
|
30
30
|
|
|
@@ -67,9 +67,7 @@ def build(
|
|
|
67
67
|
)
|
|
68
68
|
raise typer.Exit(code=1)
|
|
69
69
|
|
|
70
|
-
conf, errors, warnings =
|
|
71
|
-
directory / "pyproject.toml"
|
|
72
|
-
)
|
|
70
|
+
conf, errors, warnings = load_and_validate(directory / "pyproject.toml")
|
|
73
71
|
if conf is None:
|
|
74
72
|
typer.secho(
|
|
75
73
|
"Project configuration could not be loaded.\npyproject.toml is invalid:\n"
|
{flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/config_utils.py
RENAMED
|
@@ -22,7 +22,7 @@ import tomli
|
|
|
22
22
|
from flwr.common import object_ref
|
|
23
23
|
|
|
24
24
|
|
|
25
|
-
def
|
|
25
|
+
def load_and_validate(
|
|
26
26
|
path: Optional[Path] = None,
|
|
27
27
|
) -> Tuple[Optional[Dict[str, Any]], List[str], List[str]]:
|
|
28
28
|
"""Load and validate pyproject.toml as dict.
|
|
@@ -47,14 +47,6 @@ def load_and_validate_with_defaults(
|
|
|
47
47
|
if not is_valid:
|
|
48
48
|
return (None, errors, warnings)
|
|
49
49
|
|
|
50
|
-
# Apply defaults
|
|
51
|
-
defaults = {
|
|
52
|
-
"flower": {
|
|
53
|
-
"engine": {"name": "simulation", "simulation": {"supernode": {"num": 2}}}
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
config = apply_defaults(config, defaults)
|
|
57
|
-
|
|
58
50
|
return (config, errors, warnings)
|
|
59
51
|
|
|
60
52
|
|
|
@@ -129,17 +121,3 @@ def validate(config: Dict[str, Any]) -> Tuple[bool, List[str], List[str]]:
|
|
|
129
121
|
return False, [reason], []
|
|
130
122
|
|
|
131
123
|
return True, [], []
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
def apply_defaults(
|
|
135
|
-
config: Dict[str, Any],
|
|
136
|
-
defaults: Dict[str, Any],
|
|
137
|
-
) -> Dict[str, Any]:
|
|
138
|
-
"""Apply defaults to config."""
|
|
139
|
-
for key in defaults:
|
|
140
|
-
if key in config:
|
|
141
|
-
if isinstance(config[key], dict) and isinstance(defaults[key], dict):
|
|
142
|
-
apply_defaults(config[key], defaults[key])
|
|
143
|
-
else:
|
|
144
|
-
config[key] = defaults[key]
|
|
145
|
-
return config
|
{flwr_nightly-1.9.0.dev20240520 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/run/run.py
RENAMED
|
@@ -15,18 +15,32 @@
|
|
|
15
15
|
"""Flower command line interface `run` command."""
|
|
16
16
|
|
|
17
17
|
import sys
|
|
18
|
+
from enum import Enum
|
|
19
|
+
from typing import Optional
|
|
18
20
|
|
|
19
21
|
import typer
|
|
22
|
+
from typing_extensions import Annotated
|
|
20
23
|
|
|
21
24
|
from flwr.cli import config_utils
|
|
22
25
|
from flwr.simulation.run_simulation import _run_simulation
|
|
23
26
|
|
|
24
27
|
|
|
25
|
-
|
|
28
|
+
class Engine(str, Enum):
|
|
29
|
+
"""Enum defining the engine to run on."""
|
|
30
|
+
|
|
31
|
+
SIMULATION = "simulation"
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def run(
|
|
35
|
+
engine: Annotated[
|
|
36
|
+
Optional[Engine],
|
|
37
|
+
typer.Option(case_sensitive=False, help="The ML framework to use"),
|
|
38
|
+
] = None,
|
|
39
|
+
) -> None:
|
|
26
40
|
"""Run Flower project."""
|
|
27
41
|
typer.secho("Loading project configuration... ", fg=typer.colors.BLUE)
|
|
28
42
|
|
|
29
|
-
config, errors, warnings = config_utils.
|
|
43
|
+
config, errors, warnings = config_utils.load_and_validate()
|
|
30
44
|
|
|
31
45
|
if config is None:
|
|
32
46
|
typer.secho(
|
|
@@ -49,9 +63,11 @@ def run() -> None:
|
|
|
49
63
|
|
|
50
64
|
server_app_ref = config["flower"]["components"]["serverapp"]
|
|
51
65
|
client_app_ref = config["flower"]["components"]["clientapp"]
|
|
52
|
-
engine = config["flower"]["engine"]["name"]
|
|
53
66
|
|
|
54
|
-
if engine
|
|
67
|
+
if engine is None:
|
|
68
|
+
engine = config["flower"]["engine"]["name"]
|
|
69
|
+
|
|
70
|
+
if engine == Engine.SIMULATION:
|
|
55
71
|
num_supernodes = config["flower"]["engine"]["simulation"]["supernode"]["num"]
|
|
56
72
|
|
|
57
73
|
typer.secho("Starting run... ", fg=typer.colors.BLUE)
|
|
@@ -21,7 +21,7 @@ from contextlib import contextmanager
|
|
|
21
21
|
from copy import copy
|
|
22
22
|
from logging import DEBUG, ERROR
|
|
23
23
|
from pathlib import Path
|
|
24
|
-
from typing import Callable, Iterator, Optional, Sequence, Tuple, Union, cast
|
|
24
|
+
from typing import Callable, Iterator, Optional, Sequence, Tuple, Type, Union, cast
|
|
25
25
|
|
|
26
26
|
import grpc
|
|
27
27
|
from cryptography.hazmat.primitives.asymmetric import ec
|
|
@@ -73,6 +73,7 @@ def grpc_request_response( # pylint: disable=R0913, R0914, R0915
|
|
|
73
73
|
authentication_keys: Optional[
|
|
74
74
|
Tuple[ec.EllipticCurvePrivateKey, ec.EllipticCurvePublicKey]
|
|
75
75
|
] = None,
|
|
76
|
+
adapter_cls: Optional[Type[FleetStub]] = None,
|
|
76
77
|
) -> Iterator[
|
|
77
78
|
Tuple[
|
|
78
79
|
Callable[[], Optional[Message]],
|
|
@@ -133,7 +134,9 @@ def grpc_request_response( # pylint: disable=R0913, R0914, R0915
|
|
|
133
134
|
channel.subscribe(on_channel_state_change)
|
|
134
135
|
|
|
135
136
|
# Shared variables for inner functions
|
|
136
|
-
|
|
137
|
+
if adapter_cls is None:
|
|
138
|
+
adapter_cls = FleetStub
|
|
139
|
+
stub = adapter_cls(channel)
|
|
137
140
|
metadata: Optional[Metadata] = None
|
|
138
141
|
node: Optional[Node] = None
|
|
139
142
|
ping_thread: Optional[threading.Thread] = None
|
|
@@ -20,6 +20,7 @@ from logging import DEBUG, INFO, WARN
|
|
|
20
20
|
from pathlib import Path
|
|
21
21
|
from typing import Callable, Optional, Tuple
|
|
22
22
|
|
|
23
|
+
from cryptography.exceptions import UnsupportedAlgorithm
|
|
23
24
|
from cryptography.hazmat.primitives.asymmetric import ec
|
|
24
25
|
from cryptography.hazmat.primitives.serialization import (
|
|
25
26
|
load_ssh_private_key,
|
|
@@ -31,9 +32,6 @@ from flwr.common import EventType, event
|
|
|
31
32
|
from flwr.common.exit_handlers import register_exit_handlers
|
|
32
33
|
from flwr.common.logger import log
|
|
33
34
|
from flwr.common.object_ref import load_app, validate
|
|
34
|
-
from flwr.common.secure_aggregation.crypto.symmetric_encryption import (
|
|
35
|
-
ssh_types_to_elliptic_curve,
|
|
36
|
-
)
|
|
37
35
|
|
|
38
36
|
from ..app import _start_client_internal
|
|
39
37
|
|
|
@@ -242,40 +240,60 @@ def _parse_args_common(parser: argparse.ArgumentParser) -> None:
|
|
|
242
240
|
" Default: current working directory.",
|
|
243
241
|
)
|
|
244
242
|
parser.add_argument(
|
|
245
|
-
"--
|
|
246
|
-
|
|
247
|
-
|
|
243
|
+
"--auth-supernode-private-key",
|
|
244
|
+
type=str,
|
|
245
|
+
help="The SuperNode's private key (as a path str) to enable authentication.",
|
|
246
|
+
)
|
|
247
|
+
parser.add_argument(
|
|
248
|
+
"--auth-supernode-public-key",
|
|
248
249
|
type=str,
|
|
249
|
-
help="
|
|
250
|
-
"key file, and (2) the client's public key file.",
|
|
250
|
+
help="The SuperNode's public key (as a path str) to enable authentication.",
|
|
251
251
|
)
|
|
252
252
|
|
|
253
253
|
|
|
254
254
|
def _try_setup_client_authentication(
|
|
255
255
|
args: argparse.Namespace,
|
|
256
256
|
) -> Optional[Tuple[ec.EllipticCurvePrivateKey, ec.EllipticCurvePublicKey]]:
|
|
257
|
-
if not args.
|
|
257
|
+
if not args.auth_supernode_private_key and not args.auth_supernode_public_key:
|
|
258
258
|
return None
|
|
259
259
|
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
260
|
+
if not args.auth_supernode_private_key or not args.auth_supernode_public_key:
|
|
261
|
+
sys.exit(
|
|
262
|
+
"Authentication requires file paths to both "
|
|
263
|
+
"'--auth-supernode-private-key' and '--auth-supernode-public-key'"
|
|
264
|
+
"to be provided (providing only one of them is not sufficient)."
|
|
265
|
+
)
|
|
266
|
+
|
|
267
|
+
try:
|
|
268
|
+
ssh_private_key = load_ssh_private_key(
|
|
269
|
+
Path(args.auth_supernode_private_key).read_bytes(),
|
|
270
|
+
None,
|
|
271
|
+
)
|
|
272
|
+
if not isinstance(ssh_private_key, ec.EllipticCurvePrivateKey):
|
|
273
|
+
raise ValueError()
|
|
274
|
+
except (ValueError, UnsupportedAlgorithm):
|
|
275
|
+
sys.exit(
|
|
276
|
+
"Error: Unable to parse the private key file in "
|
|
277
|
+
"'--auth-supernode-private-key'. Authentication requires elliptic "
|
|
278
|
+
"curve private and public key pair. Please ensure that the file "
|
|
279
|
+
"path points to a valid private key file and try again."
|
|
280
|
+
)
|
|
265
281
|
|
|
266
282
|
try:
|
|
267
|
-
|
|
268
|
-
|
|
283
|
+
ssh_public_key = load_ssh_public_key(
|
|
284
|
+
Path(args.auth_supernode_public_key).read_bytes()
|
|
269
285
|
)
|
|
270
|
-
|
|
286
|
+
if not isinstance(ssh_public_key, ec.EllipticCurvePublicKey):
|
|
287
|
+
raise ValueError()
|
|
288
|
+
except (ValueError, UnsupportedAlgorithm):
|
|
271
289
|
sys.exit(
|
|
272
|
-
"
|
|
273
|
-
"key
|
|
274
|
-
"private key pair. Please
|
|
275
|
-
"
|
|
290
|
+
"Error: Unable to parse the public key file in "
|
|
291
|
+
"'--auth-supernode-public-key'. Authentication requires elliptic "
|
|
292
|
+
"curve private and public key pair. Please ensure that the file "
|
|
293
|
+
"path points to a valid public key file and try again."
|
|
276
294
|
)
|
|
277
295
|
|
|
278
296
|
return (
|
|
279
|
-
|
|
280
|
-
|
|
297
|
+
ssh_private_key,
|
|
298
|
+
ssh_public_key,
|
|
281
299
|
)
|
|
@@ -35,6 +35,8 @@ from .typing import (
|
|
|
35
35
|
Status,
|
|
36
36
|
)
|
|
37
37
|
|
|
38
|
+
EMPTY_TENSOR_KEY = "_empty"
|
|
39
|
+
|
|
38
40
|
|
|
39
41
|
def parametersrecord_to_parameters(
|
|
40
42
|
record: ParametersRecord, keep_input: bool
|
|
@@ -59,7 +61,8 @@ def parametersrecord_to_parameters(
|
|
|
59
61
|
parameters = Parameters(tensors=[], tensor_type="")
|
|
60
62
|
|
|
61
63
|
for key in list(record.keys()):
|
|
62
|
-
|
|
64
|
+
if key != EMPTY_TENSOR_KEY:
|
|
65
|
+
parameters.tensors.append(record[key].data)
|
|
63
66
|
|
|
64
67
|
if not parameters.tensor_type:
|
|
65
68
|
# Setting from first array in record. Recall the warning in the docstrings
|
|
@@ -103,6 +106,10 @@ def parameters_to_parametersrecord(
|
|
|
103
106
|
data=tensor, dtype="", stype=tensor_type, shape=[]
|
|
104
107
|
)
|
|
105
108
|
|
|
109
|
+
if num_arrays == 0:
|
|
110
|
+
ordered_dict[EMPTY_TENSOR_KEY] = Array(
|
|
111
|
+
data=b"", dtype="", stype=tensor_type, shape=[]
|
|
112
|
+
)
|
|
106
113
|
return ParametersRecord(ordered_dict, keep_input=keep_input)
|
|
107
114
|
|
|
108
115
|
|
|
@@ -117,18 +117,3 @@ def verify_hmac(key: bytes, message: bytes, hmac_value: bytes) -> bool:
|
|
|
117
117
|
return True
|
|
118
118
|
except InvalidSignature:
|
|
119
119
|
return False
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
def ssh_types_to_elliptic_curve(
|
|
123
|
-
private_key: serialization.SSHPrivateKeyTypes,
|
|
124
|
-
public_key: serialization.SSHPublicKeyTypes,
|
|
125
|
-
) -> Tuple[ec.EllipticCurvePrivateKey, ec.EllipticCurvePublicKey]:
|
|
126
|
-
"""Cast SSH key types to elliptic curve."""
|
|
127
|
-
if isinstance(private_key, ec.EllipticCurvePrivateKey) and isinstance(
|
|
128
|
-
public_key, ec.EllipticCurvePublicKey
|
|
129
|
-
):
|
|
130
|
-
return (private_key, public_key)
|
|
131
|
-
|
|
132
|
-
raise TypeError(
|
|
133
|
-
"The provided key is not an EllipticCurvePrivateKey or EllipticCurvePublicKey"
|
|
134
|
-
)
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
|
3
|
+
# source: flwr/proto/grpcadapter.proto
|
|
4
|
+
# Protobuf Python Version: 4.25.0
|
|
5
|
+
"""Generated protocol buffer code."""
|
|
6
|
+
from google.protobuf import descriptor as _descriptor
|
|
7
|
+
from google.protobuf import descriptor_pool as _descriptor_pool
|
|
8
|
+
from google.protobuf import symbol_database as _symbol_database
|
|
9
|
+
from google.protobuf.internal import builder as _builder
|
|
10
|
+
# @@protoc_insertion_point(imports)
|
|
11
|
+
|
|
12
|
+
_sym_db = _symbol_database.Default()
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1c\x66lwr/proto/grpcadapter.proto\x12\nflwr.proto\"\xba\x01\n\x10MessageContainer\x12<\n\x08metadata\x18\x01 \x03(\x0b\x32*.flwr.proto.MessageContainer.MetadataEntry\x12\x19\n\x11grpc_message_name\x18\x02 \x01(\t\x12\x1c\n\x14grpc_message_content\x18\x03 \x01(\x0c\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x32Z\n\x0bGrpcAdapter\x12K\n\x0bSendReceive\x12\x1c.flwr.proto.MessageContainer\x1a\x1c.flwr.proto.MessageContainer\"\x00\x62\x06proto3')
|
|
18
|
+
|
|
19
|
+
_globals = globals()
|
|
20
|
+
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
|
|
21
|
+
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'flwr.proto.grpcadapter_pb2', _globals)
|
|
22
|
+
if _descriptor._USE_C_DESCRIPTORS == False:
|
|
23
|
+
DESCRIPTOR._options = None
|
|
24
|
+
_globals['_MESSAGECONTAINER_METADATAENTRY']._options = None
|
|
25
|
+
_globals['_MESSAGECONTAINER_METADATAENTRY']._serialized_options = b'8\001'
|
|
26
|
+
_globals['_MESSAGECONTAINER']._serialized_start=45
|
|
27
|
+
_globals['_MESSAGECONTAINER']._serialized_end=231
|
|
28
|
+
_globals['_MESSAGECONTAINER_METADATAENTRY']._serialized_start=184
|
|
29
|
+
_globals['_MESSAGECONTAINER_METADATAENTRY']._serialized_end=231
|
|
30
|
+
_globals['_GRPCADAPTER']._serialized_start=233
|
|
31
|
+
_globals['_GRPCADAPTER']._serialized_end=323
|
|
32
|
+
# @@protoc_insertion_point(module_scope)
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"""
|
|
2
|
+
@generated by mypy-protobuf. Do not edit manually!
|
|
3
|
+
isort:skip_file
|
|
4
|
+
"""
|
|
5
|
+
import builtins
|
|
6
|
+
import google.protobuf.descriptor
|
|
7
|
+
import google.protobuf.internal.containers
|
|
8
|
+
import google.protobuf.message
|
|
9
|
+
import typing
|
|
10
|
+
import typing_extensions
|
|
11
|
+
|
|
12
|
+
DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
|
|
13
|
+
|
|
14
|
+
class MessageContainer(google.protobuf.message.Message):
|
|
15
|
+
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
|
16
|
+
class MetadataEntry(google.protobuf.message.Message):
|
|
17
|
+
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
|
18
|
+
KEY_FIELD_NUMBER: builtins.int
|
|
19
|
+
VALUE_FIELD_NUMBER: builtins.int
|
|
20
|
+
key: typing.Text
|
|
21
|
+
value: typing.Text
|
|
22
|
+
def __init__(self,
|
|
23
|
+
*,
|
|
24
|
+
key: typing.Text = ...,
|
|
25
|
+
value: typing.Text = ...,
|
|
26
|
+
) -> None: ...
|
|
27
|
+
def ClearField(self, field_name: typing_extensions.Literal["key",b"key","value",b"value"]) -> None: ...
|
|
28
|
+
|
|
29
|
+
METADATA_FIELD_NUMBER: builtins.int
|
|
30
|
+
GRPC_MESSAGE_NAME_FIELD_NUMBER: builtins.int
|
|
31
|
+
GRPC_MESSAGE_CONTENT_FIELD_NUMBER: builtins.int
|
|
32
|
+
@property
|
|
33
|
+
def metadata(self) -> google.protobuf.internal.containers.ScalarMap[typing.Text, typing.Text]: ...
|
|
34
|
+
grpc_message_name: typing.Text
|
|
35
|
+
grpc_message_content: builtins.bytes
|
|
36
|
+
def __init__(self,
|
|
37
|
+
*,
|
|
38
|
+
metadata: typing.Optional[typing.Mapping[typing.Text, typing.Text]] = ...,
|
|
39
|
+
grpc_message_name: typing.Text = ...,
|
|
40
|
+
grpc_message_content: builtins.bytes = ...,
|
|
41
|
+
) -> None: ...
|
|
42
|
+
def ClearField(self, field_name: typing_extensions.Literal["grpc_message_content",b"grpc_message_content","grpc_message_name",b"grpc_message_name","metadata",b"metadata"]) -> None: ...
|
|
43
|
+
global___MessageContainer = MessageContainer
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
|
|
2
|
+
"""Client and server classes corresponding to protobuf-defined services."""
|
|
3
|
+
import grpc
|
|
4
|
+
|
|
5
|
+
from flwr.proto import grpcadapter_pb2 as flwr_dot_proto_dot_grpcadapter__pb2
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class GrpcAdapterStub(object):
|
|
9
|
+
"""Missing associated documentation comment in .proto file."""
|
|
10
|
+
|
|
11
|
+
def __init__(self, channel):
|
|
12
|
+
"""Constructor.
|
|
13
|
+
|
|
14
|
+
Args:
|
|
15
|
+
channel: A grpc.Channel.
|
|
16
|
+
"""
|
|
17
|
+
self.SendReceive = channel.unary_unary(
|
|
18
|
+
'/flwr.proto.GrpcAdapter/SendReceive',
|
|
19
|
+
request_serializer=flwr_dot_proto_dot_grpcadapter__pb2.MessageContainer.SerializeToString,
|
|
20
|
+
response_deserializer=flwr_dot_proto_dot_grpcadapter__pb2.MessageContainer.FromString,
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class GrpcAdapterServicer(object):
|
|
25
|
+
"""Missing associated documentation comment in .proto file."""
|
|
26
|
+
|
|
27
|
+
def SendReceive(self, request, context):
|
|
28
|
+
"""Missing associated documentation comment in .proto file."""
|
|
29
|
+
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
|
|
30
|
+
context.set_details('Method not implemented!')
|
|
31
|
+
raise NotImplementedError('Method not implemented!')
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def add_GrpcAdapterServicer_to_server(servicer, server):
|
|
35
|
+
rpc_method_handlers = {
|
|
36
|
+
'SendReceive': grpc.unary_unary_rpc_method_handler(
|
|
37
|
+
servicer.SendReceive,
|
|
38
|
+
request_deserializer=flwr_dot_proto_dot_grpcadapter__pb2.MessageContainer.FromString,
|
|
39
|
+
response_serializer=flwr_dot_proto_dot_grpcadapter__pb2.MessageContainer.SerializeToString,
|
|
40
|
+
),
|
|
41
|
+
}
|
|
42
|
+
generic_handler = grpc.method_handlers_generic_handler(
|
|
43
|
+
'flwr.proto.GrpcAdapter', rpc_method_handlers)
|
|
44
|
+
server.add_generic_rpc_handlers((generic_handler,))
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
# This class is part of an EXPERIMENTAL API.
|
|
48
|
+
class GrpcAdapter(object):
|
|
49
|
+
"""Missing associated documentation comment in .proto file."""
|
|
50
|
+
|
|
51
|
+
@staticmethod
|
|
52
|
+
def SendReceive(request,
|
|
53
|
+
target,
|
|
54
|
+
options=(),
|
|
55
|
+
channel_credentials=None,
|
|
56
|
+
call_credentials=None,
|
|
57
|
+
insecure=False,
|
|
58
|
+
compression=None,
|
|
59
|
+
wait_for_ready=None,
|
|
60
|
+
timeout=None,
|
|
61
|
+
metadata=None):
|
|
62
|
+
return grpc.experimental.unary_unary(request, target, '/flwr.proto.GrpcAdapter/SendReceive',
|
|
63
|
+
flwr_dot_proto_dot_grpcadapter__pb2.MessageContainer.SerializeToString,
|
|
64
|
+
flwr_dot_proto_dot_grpcadapter__pb2.MessageContainer.FromString,
|
|
65
|
+
options, channel_credentials,
|
|
66
|
+
insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"""
|
|
2
|
+
@generated by mypy-protobuf. Do not edit manually!
|
|
3
|
+
isort:skip_file
|
|
4
|
+
"""
|
|
5
|
+
import abc
|
|
6
|
+
import flwr.proto.grpcadapter_pb2
|
|
7
|
+
import grpc
|
|
8
|
+
|
|
9
|
+
class GrpcAdapterStub:
|
|
10
|
+
def __init__(self, channel: grpc.Channel) -> None: ...
|
|
11
|
+
SendReceive: grpc.UnaryUnaryMultiCallable[
|
|
12
|
+
flwr.proto.grpcadapter_pb2.MessageContainer,
|
|
13
|
+
flwr.proto.grpcadapter_pb2.MessageContainer]
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class GrpcAdapterServicer(metaclass=abc.ABCMeta):
|
|
17
|
+
@abc.abstractmethod
|
|
18
|
+
def SendReceive(self,
|
|
19
|
+
request: flwr.proto.grpcadapter_pb2.MessageContainer,
|
|
20
|
+
context: grpc.ServicerContext,
|
|
21
|
+
) -> flwr.proto.grpcadapter_pb2.MessageContainer: ...
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def add_GrpcAdapterServicer_to_server(servicer: GrpcAdapterServicer, server: grpc.Server) -> None: ...
|