flwr-nightly 1.9.0.dev20240430__tar.gz → 1.9.0.dev20240501__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.dev20240430 → flwr_nightly-1.9.0.dev20240501}/PKG-INFO +2 -1
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/pyproject.toml +3 -2
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/cli/app.py +2 -0
- flwr_nightly-1.9.0.dev20240501/src/py/flwr/cli/build.py +151 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/cli/new/new.py +1 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/cli/new/templates/app/README.md.tpl +1 -1
- flwr_nightly-1.9.0.dev20240501/src/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +43 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +9 -1
- flwr_nightly-1.9.0.dev20240501/src/py/flwr/cli/new/templates/app/code/task.tensorflow.py.tpl +29 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +1 -1
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +1 -1
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +1 -1
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +1 -1
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/client/mod/centraldp_mods.py +4 -2
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/client/mod/localdp_mod.py +9 -3
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/strategy/dp_adaptive_clipping.py +5 -3
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/strategy/dp_fixed_clipping.py +6 -3
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/simulation/__init__.py +2 -2
- flwr_nightly-1.9.0.dev20240430/src/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -57
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/LICENSE +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/README.md +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/cli/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/cli/config_utils.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/cli/example.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/cli/new/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/cli/new/templates/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/cli/new/templates/app/.gitignore.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/cli/new/templates/app/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/cli/new/templates/app/code/client.numpy.py.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/cli/new/templates/app/code/server.sklearn.py.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/cli/run/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/cli/run/run.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/cli/utils.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/client/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/client/app.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/client/client.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/client/client_app.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/client/dpfedavg_numpy_client.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/client/grpc_client/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/client/grpc_client/connection.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/client/grpc_rere_client/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/client/grpc_rere_client/client_interceptor.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/client/grpc_rere_client/connection.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/client/heartbeat.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/client/message_handler/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/client/message_handler/message_handler.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/client/message_handler/task_handler.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/client/mod/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/client/mod/comms_mods.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/client/mod/utils.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/client/node_state.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/client/node_state_tests.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/client/numpy_client.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/client/rest_client/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/client/rest_client/connection.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/client/supernode/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/client/supernode/app.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/client/typing.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/common/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/common/address.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/common/constant.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/common/context.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/common/date.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/common/differential_privacy.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/common/differential_privacy_constants.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/common/dp.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/common/exit_handlers.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/common/grpc.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/common/logger.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/common/message.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/common/object_ref.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/common/parameter.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/common/pyproject.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/common/record/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/common/record/configsrecord.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/common/record/conversion_utils.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/common/record/metricsrecord.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/common/record/parametersrecord.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/common/record/recordset.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/common/record/typeddict.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/common/recordset_compat.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/common/retry_invoker.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/common/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/common/secure_aggregation/quantization.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/common/serde.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/common/telemetry.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/common/typing.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/common/version.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/proto/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/proto/driver_pb2.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/proto/driver_pb2.pyi +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/proto/driver_pb2_grpc.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/proto/driver_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/proto/error_pb2.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/proto/error_pb2.pyi +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/proto/error_pb2_grpc.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/proto/error_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/proto/fleet_pb2.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/proto/fleet_pb2.pyi +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/proto/fleet_pb2_grpc.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/proto/node_pb2.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/proto/node_pb2.pyi +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/proto/node_pb2_grpc.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/proto/node_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/proto/recordset_pb2.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/proto/recordset_pb2.pyi +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/proto/recordset_pb2_grpc.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/proto/recordset_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/proto/task_pb2.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/proto/task_pb2.pyi +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/proto/task_pb2_grpc.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/proto/task_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/proto/transport_pb2.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/proto/transport_pb2.pyi +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/proto/transport_pb2_grpc.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/py.typed +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/app.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/client_manager.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/client_proxy.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/compat/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/compat/app.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/compat/app_utils.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/compat/driver_client_proxy.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/compat/legacy_context.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/criterion.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/driver/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/driver/driver.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/driver/grpc_driver.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/history.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/run_serverapp.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/server.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/server_app.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/server_config.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/strategy/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/strategy/aggregate.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/strategy/bulyan.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/strategy/fedadagrad.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/strategy/fedadam.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/strategy/fedavg.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/strategy/fedavg_android.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/strategy/fedavgm.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/strategy/fedmedian.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/strategy/fedopt.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/strategy/fedprox.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/strategy/fedyogi.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/strategy/krum.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/strategy/qfedavg.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/strategy/strategy.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/superlink/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/superlink/driver/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/superlink/driver/driver_grpc.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/superlink/driver/driver_servicer.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/superlink/fleet/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/superlink/fleet/message_handler/message_handler.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/superlink/fleet/vce/vce_api.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/superlink/state/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/superlink/state/in_memory_state.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/superlink/state/sqlite_state.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/superlink/state/state.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/superlink/state/state_factory.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/superlink/state/utils.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/typing.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/utils/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/utils/tensorboard.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/utils/validator.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/workflow/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/workflow/constant.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/workflow/default_workflows.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/simulation/app.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/simulation/ray_transport/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/simulation/ray_transport/utils.py +0 -0
- {flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/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.dev20240501
|
|
4
4
|
Summary: Flower: A Friendly Federated Learning Framework
|
|
5
5
|
Home-page: https://flower.ai
|
|
6
6
|
License: Apache-2.0
|
|
@@ -36,6 +36,7 @@ Requires-Dist: cryptography (>=42.0.4,<43.0.0)
|
|
|
36
36
|
Requires-Dist: grpcio (>=1.60.0,<2.0.0)
|
|
37
37
|
Requires-Dist: iterators (>=0.0.2,<0.0.3)
|
|
38
38
|
Requires-Dist: numpy (>=1.21.0,<2.0.0)
|
|
39
|
+
Requires-Dist: pathspec (>=0.12.1,<0.13.0)
|
|
39
40
|
Requires-Dist: protobuf (>=4.25.2,<5.0.0)
|
|
40
41
|
Requires-Dist: pycryptodome (>=3.18.0,<4.0.0)
|
|
41
42
|
Requires-Dist: ray (==2.6.3) ; (python_version >= "3.8" and python_version < "3.12") and (extra == "simulation")
|
|
@@ -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.dev20240501"
|
|
8
8
|
description = "Flower: A Friendly Federated Learning Framework"
|
|
9
9
|
license = "Apache-2.0"
|
|
10
10
|
authors = ["The Flower Authors <hello@flower.ai>"]
|
|
@@ -59,7 +59,7 @@ flower-superlink = "flwr.server:run_superlink"
|
|
|
59
59
|
flower-supernode = "flwr.client:run_supernode"
|
|
60
60
|
flower-client-app = "flwr.client:run_client_app"
|
|
61
61
|
flower-server-app = "flwr.server:run_server_app"
|
|
62
|
-
flower-simulation = "flwr.simulation:run_simulation_from_cli"
|
|
62
|
+
flower-simulation = "flwr.simulation.run_simulation:run_simulation_from_cli"
|
|
63
63
|
|
|
64
64
|
[tool.poetry.dependencies]
|
|
65
65
|
python = "^3.8"
|
|
@@ -72,6 +72,7 @@ pycryptodome = "^3.18.0"
|
|
|
72
72
|
iterators = "^0.0.2"
|
|
73
73
|
typer = { version = "^0.9.0", extras=["all"] }
|
|
74
74
|
tomli = "^2.0.1"
|
|
75
|
+
pathspec = "^0.12.1"
|
|
75
76
|
# Optional dependencies (Simulation Engine)
|
|
76
77
|
ray = { version = "==2.6.3", optional = true, python = ">=3.8,<3.12" }
|
|
77
78
|
# Optional dependencies (REST transport layer)
|
|
@@ -16,6 +16,7 @@
|
|
|
16
16
|
|
|
17
17
|
import typer
|
|
18
18
|
|
|
19
|
+
from .build import build
|
|
19
20
|
from .example import example
|
|
20
21
|
from .new import new
|
|
21
22
|
from .run import run
|
|
@@ -32,6 +33,7 @@ app = typer.Typer(
|
|
|
32
33
|
app.command()(new)
|
|
33
34
|
app.command()(example)
|
|
34
35
|
app.command()(run)
|
|
36
|
+
app.command()(build)
|
|
35
37
|
|
|
36
38
|
if __name__ == "__main__":
|
|
37
39
|
app()
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
# Copyright 2024 Flower Labs GmbH. All Rights Reserved.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
# ==============================================================================
|
|
15
|
+
"""Flower command line interface `build` command."""
|
|
16
|
+
|
|
17
|
+
import hashlib
|
|
18
|
+
import os
|
|
19
|
+
import zipfile
|
|
20
|
+
from pathlib import Path
|
|
21
|
+
from typing import Optional
|
|
22
|
+
|
|
23
|
+
import pathspec
|
|
24
|
+
import typer
|
|
25
|
+
from typing_extensions import Annotated
|
|
26
|
+
|
|
27
|
+
from .config_utils import load_and_validate_with_defaults
|
|
28
|
+
from .utils import is_valid_project_name
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
# pylint: disable=too-many-locals
|
|
32
|
+
def build(
|
|
33
|
+
directory: Annotated[
|
|
34
|
+
Optional[Path],
|
|
35
|
+
typer.Option(help="The Flower project directory to bundle into a FAB"),
|
|
36
|
+
] = None,
|
|
37
|
+
) -> None:
|
|
38
|
+
"""Build a Flower project into a Flower App Bundle (FAB).
|
|
39
|
+
|
|
40
|
+
You can run `flwr build` without any argument to bundle the current directory:
|
|
41
|
+
|
|
42
|
+
`flwr build`
|
|
43
|
+
|
|
44
|
+
You can also build a specific directory:
|
|
45
|
+
|
|
46
|
+
`flwr build --directory ./projects/flower-hello-world`
|
|
47
|
+
"""
|
|
48
|
+
if directory is None:
|
|
49
|
+
directory = Path.cwd()
|
|
50
|
+
|
|
51
|
+
directory = directory.resolve()
|
|
52
|
+
if not directory.is_dir():
|
|
53
|
+
typer.secho(
|
|
54
|
+
f"❌ The path {directory} is not a valid directory.",
|
|
55
|
+
fg=typer.colors.RED,
|
|
56
|
+
bold=True,
|
|
57
|
+
)
|
|
58
|
+
raise typer.Exit(code=1)
|
|
59
|
+
|
|
60
|
+
if not is_valid_project_name(directory.name):
|
|
61
|
+
typer.secho(
|
|
62
|
+
f"❌ The project name {directory.name} is invalid, "
|
|
63
|
+
"a valid project name must start with a letter or an underscore, "
|
|
64
|
+
"and can only contain letters, digits, and underscores.",
|
|
65
|
+
fg=typer.colors.RED,
|
|
66
|
+
bold=True,
|
|
67
|
+
)
|
|
68
|
+
raise typer.Exit(code=1)
|
|
69
|
+
|
|
70
|
+
conf, errors, warnings = load_and_validate_with_defaults(
|
|
71
|
+
directory / "pyproject.toml"
|
|
72
|
+
)
|
|
73
|
+
if conf is None:
|
|
74
|
+
typer.secho(
|
|
75
|
+
"Project configuration could not be loaded.\npyproject.toml is invalid:\n"
|
|
76
|
+
+ "\n".join([f"- {line}" for line in errors]),
|
|
77
|
+
fg=typer.colors.RED,
|
|
78
|
+
bold=True,
|
|
79
|
+
)
|
|
80
|
+
raise typer.Exit(code=1)
|
|
81
|
+
|
|
82
|
+
if warnings:
|
|
83
|
+
typer.secho(
|
|
84
|
+
"Project configuration is missing the following "
|
|
85
|
+
"recommended properties:\n" + "\n".join([f"- {line}" for line in warnings]),
|
|
86
|
+
fg=typer.colors.RED,
|
|
87
|
+
bold=True,
|
|
88
|
+
)
|
|
89
|
+
|
|
90
|
+
# Load .gitignore rules if present
|
|
91
|
+
ignore_spec = _load_gitignore(directory)
|
|
92
|
+
|
|
93
|
+
# Set the name of the zip file
|
|
94
|
+
fab_filename = (
|
|
95
|
+
f"{conf['flower']['publisher']}"
|
|
96
|
+
f".{directory.name}"
|
|
97
|
+
f".{conf['project']['version'].replace('.', '-')}.fab"
|
|
98
|
+
)
|
|
99
|
+
list_file_content = ""
|
|
100
|
+
|
|
101
|
+
allowed_extensions = {".py", ".toml", ".md"}
|
|
102
|
+
|
|
103
|
+
with zipfile.ZipFile(fab_filename, "w", zipfile.ZIP_DEFLATED) as fab_file:
|
|
104
|
+
for root, _, files in os.walk(directory, topdown=True):
|
|
105
|
+
# Filter directories and files based on .gitignore
|
|
106
|
+
files = [
|
|
107
|
+
f
|
|
108
|
+
for f in files
|
|
109
|
+
if not ignore_spec.match_file(Path(root) / f)
|
|
110
|
+
and f != fab_filename
|
|
111
|
+
and Path(f).suffix in allowed_extensions
|
|
112
|
+
]
|
|
113
|
+
|
|
114
|
+
for file in files:
|
|
115
|
+
file_path = Path(root) / file
|
|
116
|
+
archive_path = file_path.relative_to(directory)
|
|
117
|
+
fab_file.write(file_path, archive_path)
|
|
118
|
+
|
|
119
|
+
# Calculate file info
|
|
120
|
+
sha256_hash = _get_sha256_hash(file_path)
|
|
121
|
+
file_size_bits = os.path.getsize(file_path) * 8 # size in bits
|
|
122
|
+
list_file_content += f"{archive_path},{sha256_hash},{file_size_bits}\n"
|
|
123
|
+
|
|
124
|
+
# Add CONTENT and CONTENT.jwt to the zip file
|
|
125
|
+
fab_file.writestr(".info/CONTENT", list_file_content)
|
|
126
|
+
|
|
127
|
+
typer.secho(
|
|
128
|
+
f"🎊 Successfully built {fab_filename}.", fg=typer.colors.GREEN, bold=True
|
|
129
|
+
)
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
def _get_sha256_hash(file_path: Path) -> str:
|
|
133
|
+
"""Calculate the SHA-256 hash of a file."""
|
|
134
|
+
sha256 = hashlib.sha256()
|
|
135
|
+
with open(file_path, "rb") as f:
|
|
136
|
+
while True:
|
|
137
|
+
data = f.read(65536) # Read in 64kB blocks
|
|
138
|
+
if not data:
|
|
139
|
+
break
|
|
140
|
+
sha256.update(data)
|
|
141
|
+
return sha256.hexdigest()
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
def _load_gitignore(directory: Path) -> pathspec.PathSpec:
|
|
145
|
+
"""Load and parse .gitignore file, returning a pathspec."""
|
|
146
|
+
gitignore_path = directory / ".gitignore"
|
|
147
|
+
patterns = ["__pycache__/"] # Default pattern
|
|
148
|
+
if gitignore_path.exists():
|
|
149
|
+
with open(gitignore_path, encoding="UTF-8") as file:
|
|
150
|
+
patterns.extend(file.readlines())
|
|
151
|
+
return pathspec.PathSpec.from_lines("gitwildmatch", patterns)
|
{flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/cli/new/new.py
RENAMED
|
@@ -153,6 +153,7 @@ def new(
|
|
|
153
153
|
# Depending on the framework, generate task.py file
|
|
154
154
|
frameworks_with_tasks = [
|
|
155
155
|
MlFramework.PYTORCH.value.lower(),
|
|
156
|
+
MlFramework.TENSORFLOW.value.lower(),
|
|
156
157
|
]
|
|
157
158
|
if framework_str in frameworks_with_tasks:
|
|
158
159
|
files[f"{import_name}/task.py"] = {
|
flwr_nightly-1.9.0.dev20240501/src/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"""$project_name: A Flower / TensorFlow app."""
|
|
2
|
+
|
|
3
|
+
from flwr.client import NumPyClient, ClientApp
|
|
4
|
+
|
|
5
|
+
from $import_name.task import load_data, load_model
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
# Define Flower Client and client_fn
|
|
9
|
+
class FlowerClient(NumPyClient):
|
|
10
|
+
def __init__(self, model, x_train, y_train, x_test, y_test):
|
|
11
|
+
self.model = model
|
|
12
|
+
self.x_train = x_train
|
|
13
|
+
self.y_train = y_train
|
|
14
|
+
self.x_test = x_test
|
|
15
|
+
self.y_test = y_test
|
|
16
|
+
|
|
17
|
+
def get_parameters(self, config):
|
|
18
|
+
return self.model.get_weights()
|
|
19
|
+
|
|
20
|
+
def fit(self, parameters, config):
|
|
21
|
+
self.model.set_weights(parameters)
|
|
22
|
+
self.model.fit(self.x_train, self.y_train, epochs=1, batch_size=32, verbose=0)
|
|
23
|
+
return self.model.get_weights(), len(self.x_train), {}
|
|
24
|
+
|
|
25
|
+
def evaluate(self, parameters, config):
|
|
26
|
+
self.model.set_weights(parameters)
|
|
27
|
+
loss, accuracy = self.model.evaluate(self.x_test, self.y_test, verbose=0)
|
|
28
|
+
return loss, len(self.x_test), {"accuracy": accuracy}
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def client_fn(cid):
|
|
32
|
+
# Load model and data
|
|
33
|
+
net = load_model()
|
|
34
|
+
x_train, y_train, x_test, y_test = load_data(int(cid), 2)
|
|
35
|
+
|
|
36
|
+
# Return Client instance
|
|
37
|
+
return FlowerClient(net, x_train, y_train, x_test, y_test).to_client()
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
# Flower ClientApp
|
|
41
|
+
app = ClientApp(
|
|
42
|
+
client_fn=client_fn,
|
|
43
|
+
)
|
|
@@ -1,18 +1,26 @@
|
|
|
1
1
|
"""$project_name: A Flower / TensorFlow app."""
|
|
2
2
|
|
|
3
|
+
from flwr.common import ndarrays_to_parameters
|
|
3
4
|
from flwr.server import ServerApp, ServerConfig
|
|
4
5
|
from flwr.server.strategy import FedAvg
|
|
5
6
|
|
|
7
|
+
from $import_name.task import load_model
|
|
8
|
+
|
|
6
9
|
# Define config
|
|
7
10
|
config = ServerConfig(num_rounds=3)
|
|
8
11
|
|
|
12
|
+
parameters = ndarrays_to_parameters(load_model().get_weights())
|
|
13
|
+
|
|
14
|
+
# Define strategy
|
|
9
15
|
strategy = FedAvg(
|
|
10
16
|
fraction_fit=1.0,
|
|
11
17
|
fraction_evaluate=1.0,
|
|
12
18
|
min_available_clients=2,
|
|
19
|
+
initial_parameters=parameters,
|
|
13
20
|
)
|
|
14
21
|
|
|
15
|
-
|
|
22
|
+
|
|
23
|
+
# Create ServerApp
|
|
16
24
|
app = ServerApp(
|
|
17
25
|
config=config,
|
|
18
26
|
strategy=strategy,
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"""$project_name: A Flower / TensorFlow app."""
|
|
2
|
+
|
|
3
|
+
import os
|
|
4
|
+
|
|
5
|
+
import tensorflow as tf
|
|
6
|
+
from flwr_datasets import FederatedDataset
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
# Make TensorFlow log less verbose
|
|
10
|
+
os.environ["TF_CPP_MIN_LOG_LEVEL"] = "3"
|
|
11
|
+
|
|
12
|
+
def load_model():
|
|
13
|
+
# Load model and data (MobileNetV2, CIFAR-10)
|
|
14
|
+
model = tf.keras.applications.MobileNetV2((32, 32, 3), classes=10, weights=None)
|
|
15
|
+
model.compile("adam", "sparse_categorical_crossentropy", metrics=["accuracy"])
|
|
16
|
+
return model
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def load_data(partition_id, num_partitions):
|
|
20
|
+
# Download and partition dataset
|
|
21
|
+
fds = FederatedDataset(dataset="cifar10", partitioners={"train": num_partitions})
|
|
22
|
+
partition = fds.load_partition(partition_id, "train")
|
|
23
|
+
partition.set_format("numpy")
|
|
24
|
+
|
|
25
|
+
# Divide data on each node: 80% train, 20% test
|
|
26
|
+
partition = partition.train_test_split(test_size=0.2)
|
|
27
|
+
x_train, y_train = partition["train"]["img"] / 255.0, partition["train"]["label"]
|
|
28
|
+
x_test, y_test = partition["test"]["img"] / 255.0, partition["test"]["label"]
|
|
29
|
+
return x_train, y_train, x_test, y_test
|
|
@@ -9,7 +9,7 @@ description = ""
|
|
|
9
9
|
authors = [
|
|
10
10
|
{ name = "The Flower Authors", email = "hello@flower.ai" },
|
|
11
11
|
]
|
|
12
|
-
license = {text = "Apache License (2.0)"}
|
|
12
|
+
license = { text = "Apache License (2.0)" }
|
|
13
13
|
dependencies = [
|
|
14
14
|
"flwr[simulation]>=1.8.0,<2.0",
|
|
15
15
|
"numpy>=1.21.0",
|
|
@@ -9,7 +9,7 @@ description = ""
|
|
|
9
9
|
authors = [
|
|
10
10
|
{ name = "The Flower Authors", email = "hello@flower.ai" },
|
|
11
11
|
]
|
|
12
|
-
license = {text = "Apache License (2.0)"}
|
|
12
|
+
license = { text = "Apache License (2.0)" }
|
|
13
13
|
dependencies = [
|
|
14
14
|
"flwr[simulation]>=1.8.0,<2.0",
|
|
15
15
|
"flwr-datasets[vision]>=0.0.2,<1.0.0",
|
|
@@ -9,7 +9,7 @@ description = ""
|
|
|
9
9
|
authors = [
|
|
10
10
|
{ name = "The Flower Authors", email = "hello@flower.ai" },
|
|
11
11
|
]
|
|
12
|
-
license = {text = "Apache License (2.0)"}
|
|
12
|
+
license = { text = "Apache License (2.0)" }
|
|
13
13
|
dependencies = [
|
|
14
14
|
"flwr[simulation]>=1.8.0,<2.0",
|
|
15
15
|
"flwr-datasets[vision]>=0.0.2,<1.0.0",
|
|
@@ -9,7 +9,7 @@ description = ""
|
|
|
9
9
|
authors = [
|
|
10
10
|
{ name = "The Flower Authors", email = "hello@flower.ai" },
|
|
11
11
|
]
|
|
12
|
-
license = {text = "Apache License (2.0)"}
|
|
12
|
+
license = { text = "Apache License (2.0)" }
|
|
13
13
|
dependencies = [
|
|
14
14
|
"flwr[simulation]>=1.8.0,<2.0",
|
|
15
15
|
"flwr-datasets[vision]>=0.0.2,<1.0.0",
|
|
@@ -82,7 +82,9 @@ def fixedclipping_mod(
|
|
|
82
82
|
clipping_norm,
|
|
83
83
|
)
|
|
84
84
|
|
|
85
|
-
log(
|
|
85
|
+
log(
|
|
86
|
+
INFO, "fixedclipping_mod: parameters are clipped by value: %.4f.", clipping_norm
|
|
87
|
+
)
|
|
86
88
|
|
|
87
89
|
fit_res.parameters = ndarrays_to_parameters(client_to_server_params)
|
|
88
90
|
out_msg.content = compat.fitres_to_recordset(fit_res, keep_input=True)
|
|
@@ -146,7 +148,7 @@ def adaptiveclipping_mod(
|
|
|
146
148
|
)
|
|
147
149
|
log(
|
|
148
150
|
INFO,
|
|
149
|
-
"adaptiveclipping_mod: parameters are clipped by value:
|
|
151
|
+
"adaptiveclipping_mod: parameters are clipped by value: %.4f.",
|
|
150
152
|
clipping_norm,
|
|
151
153
|
)
|
|
152
154
|
|
|
@@ -128,7 +128,9 @@ class LocalDpMod:
|
|
|
128
128
|
self.clipping_norm,
|
|
129
129
|
)
|
|
130
130
|
log(
|
|
131
|
-
INFO,
|
|
131
|
+
INFO,
|
|
132
|
+
"LocalDpMod: parameters are clipped by value: %.4f.",
|
|
133
|
+
self.clipping_norm,
|
|
132
134
|
)
|
|
133
135
|
|
|
134
136
|
fit_res.parameters = ndarrays_to_parameters(client_to_server_params)
|
|
@@ -137,11 +139,15 @@ class LocalDpMod:
|
|
|
137
139
|
add_localdp_gaussian_noise_to_params(
|
|
138
140
|
fit_res.parameters, self.sensitivity, self.epsilon, self.delta
|
|
139
141
|
)
|
|
142
|
+
|
|
143
|
+
noise_value_sd = (
|
|
144
|
+
self.sensitivity * np.sqrt(2 * np.log(1.25 / self.delta)) / self.epsilon
|
|
145
|
+
)
|
|
140
146
|
log(
|
|
141
147
|
INFO,
|
|
142
148
|
"LocalDpMod: local DP noise with "
|
|
143
|
-
"standard deviation:
|
|
144
|
-
|
|
149
|
+
"standard deviation: %.4f added to parameters.",
|
|
150
|
+
noise_value_sd,
|
|
145
151
|
)
|
|
146
152
|
|
|
147
153
|
out_msg.content = compat.fitres_to_recordset(fit_res, keep_input=True)
|
|
@@ -200,7 +200,7 @@ class DifferentialPrivacyServerSideAdaptiveClipping(Strategy):
|
|
|
200
200
|
|
|
201
201
|
log(
|
|
202
202
|
INFO,
|
|
203
|
-
"aggregate_fit: parameters are clipped by value:
|
|
203
|
+
"aggregate_fit: parameters are clipped by value: %.4f.",
|
|
204
204
|
self.clipping_norm,
|
|
205
205
|
)
|
|
206
206
|
|
|
@@ -234,7 +234,8 @@ class DifferentialPrivacyServerSideAdaptiveClipping(Strategy):
|
|
|
234
234
|
)
|
|
235
235
|
log(
|
|
236
236
|
INFO,
|
|
237
|
-
"aggregate_fit: central DP noise with
|
|
237
|
+
"aggregate_fit: central DP noise with "
|
|
238
|
+
"standard deviation: %.4f added to parameters.",
|
|
238
239
|
compute_stdv(
|
|
239
240
|
self.noise_multiplier, self.clipping_norm, self.num_sampled_clients
|
|
240
241
|
),
|
|
@@ -424,7 +425,8 @@ class DifferentialPrivacyClientSideAdaptiveClipping(Strategy):
|
|
|
424
425
|
)
|
|
425
426
|
log(
|
|
426
427
|
INFO,
|
|
427
|
-
"aggregate_fit: central DP noise with
|
|
428
|
+
"aggregate_fit: central DP noise with "
|
|
429
|
+
"standard deviation: %.4f added to parameters.",
|
|
428
430
|
compute_stdv(
|
|
429
431
|
self.noise_multiplier, self.clipping_norm, self.num_sampled_clients
|
|
430
432
|
),
|
|
@@ -158,7 +158,7 @@ class DifferentialPrivacyServerSideFixedClipping(Strategy):
|
|
|
158
158
|
)
|
|
159
159
|
log(
|
|
160
160
|
INFO,
|
|
161
|
-
"aggregate_fit: parameters are clipped by value:
|
|
161
|
+
"aggregate_fit: parameters are clipped by value: %.4f.",
|
|
162
162
|
self.clipping_norm,
|
|
163
163
|
)
|
|
164
164
|
# Convert back to parameters
|
|
@@ -180,7 +180,8 @@ class DifferentialPrivacyServerSideFixedClipping(Strategy):
|
|
|
180
180
|
|
|
181
181
|
log(
|
|
182
182
|
INFO,
|
|
183
|
-
"aggregate_fit: central DP noise with
|
|
183
|
+
"aggregate_fit: central DP noise with "
|
|
184
|
+
"standard deviation: %.4f added to parameters.",
|
|
184
185
|
compute_stdv(
|
|
185
186
|
self.noise_multiplier, self.clipping_norm, self.num_sampled_clients
|
|
186
187
|
),
|
|
@@ -337,11 +338,13 @@ class DifferentialPrivacyClientSideFixedClipping(Strategy):
|
|
|
337
338
|
)
|
|
338
339
|
log(
|
|
339
340
|
INFO,
|
|
340
|
-
"aggregate_fit: central DP noise with
|
|
341
|
+
"aggregate_fit: central DP noise with "
|
|
342
|
+
"standard deviation: %.4f added to parameters.",
|
|
341
343
|
compute_stdv(
|
|
342
344
|
self.noise_multiplier, self.clipping_norm, self.num_sampled_clients
|
|
343
345
|
),
|
|
344
346
|
)
|
|
347
|
+
|
|
345
348
|
return aggregated_params, metrics
|
|
346
349
|
|
|
347
350
|
def aggregate_evaluate(
|
{flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/simulation/__init__.py
RENAMED
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
|
|
18
18
|
import importlib
|
|
19
19
|
|
|
20
|
-
from flwr.simulation.run_simulation import run_simulation
|
|
20
|
+
from flwr.simulation.run_simulation import run_simulation
|
|
21
21
|
|
|
22
22
|
is_ray_installed = importlib.util.find_spec("ray") is not None
|
|
23
23
|
|
|
@@ -36,4 +36,4 @@ To install the necessary dependencies, install `flwr` with the `simulation` extr
|
|
|
36
36
|
raise ImportError(RAY_IMPORT_ERROR)
|
|
37
37
|
|
|
38
38
|
|
|
39
|
-
__all__ = ["start_simulation", "
|
|
39
|
+
__all__ = ["start_simulation", "run_simulation"]
|
flwr_nightly-1.9.0.dev20240430/src/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl
DELETED
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
"""$project_name: A Flower / TensorFlow app."""
|
|
2
|
-
|
|
3
|
-
import os
|
|
4
|
-
|
|
5
|
-
import tensorflow as tf
|
|
6
|
-
from flwr.client import ClientApp, NumPyClient
|
|
7
|
-
from flwr_datasets import FederatedDataset
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
os.environ["TF_CPP_MIN_LOG_LEVEL"] = "3"
|
|
11
|
-
|
|
12
|
-
# Define Flower client
|
|
13
|
-
class FlowerClient(NumPyClient):
|
|
14
|
-
def __init__(self, model, train_data, test_data):
|
|
15
|
-
self.model = model
|
|
16
|
-
self.x_train, self.y_train = train_data
|
|
17
|
-
self.x_test, self.y_test = test_data
|
|
18
|
-
|
|
19
|
-
def get_parameters(self, config):
|
|
20
|
-
return self.model.get_weights()
|
|
21
|
-
|
|
22
|
-
def fit(self, parameters, config):
|
|
23
|
-
self.model.set_weights(parameters)
|
|
24
|
-
self.model.fit(self.x_train, self.y_train, epochs=1, batch_size=32, verbose=0)
|
|
25
|
-
return self.model.get_weights(), len(self.x_train), {}
|
|
26
|
-
|
|
27
|
-
def evaluate(self, parameters, config):
|
|
28
|
-
self.model.set_weights(parameters)
|
|
29
|
-
loss, accuracy = self.model.evaluate(self.x_test, self.y_test, verbose=0)
|
|
30
|
-
return loss, len(self.x_test), {"accuracy": accuracy}
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
fds = FederatedDataset(dataset="cifar10", partitioners={"train": 2})
|
|
34
|
-
|
|
35
|
-
def client_fn(cid: str):
|
|
36
|
-
"""Create and return an instance of Flower `Client`."""
|
|
37
|
-
|
|
38
|
-
# Load model and data (MobileNetV2, CIFAR-10)
|
|
39
|
-
model = tf.keras.applications.MobileNetV2((32, 32, 3), classes=10, weights=None)
|
|
40
|
-
model.compile("adam", "sparse_categorical_crossentropy", metrics=["accuracy"])
|
|
41
|
-
|
|
42
|
-
# Download and partition dataset
|
|
43
|
-
partition = fds.load_partition(int(cid), "train")
|
|
44
|
-
partition.set_format("numpy")
|
|
45
|
-
|
|
46
|
-
# Divide data on each node: 80% train, 20% test
|
|
47
|
-
partition = partition.train_test_split(test_size=0.2, seed=42)
|
|
48
|
-
train_data = partition["train"]["img"] / 255.0, partition["train"]["label"]
|
|
49
|
-
test_data = partition["test"]["img"] / 255.0, partition["test"]["label"]
|
|
50
|
-
|
|
51
|
-
return FlowerClient(model, train_data, test_data).to_client()
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
# Flower ClientApp
|
|
55
|
-
app = ClientApp(
|
|
56
|
-
client_fn=client_fn,
|
|
57
|
-
)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/cli/__init__.py
RENAMED
|
File without changes
|
{flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/cli/config_utils.py
RENAMED
|
File without changes
|
{flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/cli/example.py
RENAMED
|
File without changes
|
{flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/cli/new/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/cli/run/__init__.py
RENAMED
|
File without changes
|
{flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/cli/run/run.py
RENAMED
|
File without changes
|
|
File without changes
|
{flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/client/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/client/client.py
RENAMED
|
File without changes
|
{flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/client/client_app.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{flwr_nightly-1.9.0.dev20240430 → flwr_nightly-1.9.0.dev20240501}/src/py/flwr/client/heartbeat.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|