flwr-nightly 1.26.0.dev20260120__tar.gz → 1.26.0.dev20260121__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/PKG-INFO +1 -1
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/cli/app.py +17 -5
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/cli/config_migration.py +34 -12
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/cli/log.py +21 -35
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/cli/ls.py +23 -34
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/cli/pull.py +15 -26
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/cli/run/run.py +44 -58
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/cli/stop.py +21 -30
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/cli/utils.py +13 -1
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/superlink/linkstate/__init__.py +2 -0
- flwr_nightly-1.26.0.dev20260121/py/flwr/server/superlink/linkstate/sql_linkstate.py +221 -0
- flwr_nightly-1.26.0.dev20260121/py/flwr/supercore/corestate/sql_corestate.py +153 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/supercore/sql_mixin.py +77 -38
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/pyproject.toml +1 -1
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/README.md +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/app/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/app/error.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/app/exception.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/app/message_type.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/app/metadata.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/app/user_config.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/cli/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/cli/app_cmd/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/cli/app_cmd/publish.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/cli/app_cmd/review.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/cli/auth_plugin/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/cli/auth_plugin/auth_plugin.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/cli/auth_plugin/noop_auth_plugin.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/cli/auth_plugin/oidc_cli_plugin.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/cli/build.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/cli/cli_account_auth_interceptor.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/cli/config/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/cli/config/ls.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/cli/config_utils.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/cli/constant.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/cli/example.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/cli/federation/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/cli/federation/ls.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/cli/flower_config.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/cli/install.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/cli/login/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/cli/login/login.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/cli/new/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/cli/new/new.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/cli/run/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/cli/run_utils.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/cli/supernode/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/cli/supernode/ls.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/cli/supernode/register.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/cli/supernode/unregister.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/cli/typing.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/client/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/client/client.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/client/dpfedavg_numpy_client.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/client/grpc_adapter_client/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/client/grpc_adapter_client/connection.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/client/grpc_rere_client/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/client/grpc_rere_client/connection.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/client/grpc_rere_client/grpc_adapter.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/client/grpc_rere_client/node_auth_client_interceptor.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/client/message_handler/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/client/message_handler/message_handler.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/client/mod/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/client/mod/centraldp_mods.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/client/mod/comms_mods.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/client/mod/localdp_mod.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/client/mod/utils.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/client/numpy_client.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/client/rest_client/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/client/rest_client/connection.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/client/run_info_store.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/client/typing.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/clientapp/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/clientapp/client_app.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/clientapp/mod/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/clientapp/mod/centraldp_mods.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/clientapp/mod/localdp_mod.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/clientapp/typing.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/clientapp/utils.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/common/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/common/args.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/common/config.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/common/constant.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/common/context.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/common/differential_privacy.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/common/differential_privacy_constants.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/common/dp.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/common/event_log_plugin/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/common/event_log_plugin/event_log_plugin.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/common/exit/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/common/exit/exit.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/common/exit/exit_code.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/common/exit/exit_handler.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/common/exit/signal_handler.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/common/grpc.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/common/inflatable.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/common/inflatable_protobuf_utils.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/common/inflatable_utils.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/common/logger.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/common/message.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/common/object_ref.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/common/parameter.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/common/record/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/common/record/array.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/common/record/arraychunk.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/common/record/arrayrecord.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/common/record/configrecord.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/common/record/conversion_utils.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/common/record/metricrecord.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/common/record/recorddict.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/common/record/typeddict.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/common/recorddict_compat.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/common/retry_invoker.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/common/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/common/secure_aggregation/quantization.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/common/serde.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/common/serde_utils.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/common/telemetry.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/common/typing.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/compat/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/compat/client/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/compat/client/app.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/compat/client/grpc_client/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/compat/client/grpc_client/connection.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/compat/common/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/compat/common/constant.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/compat/server/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/compat/server/app.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/compat/simulation/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/proto/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/proto/appio_pb2.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/proto/appio_pb2.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/proto/appio_pb2_grpc.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/proto/appio_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/proto/clientappio_pb2.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/proto/clientappio_pb2.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/proto/clientappio_pb2_grpc.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/proto/clientappio_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/proto/control_pb2.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/proto/control_pb2.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/proto/control_pb2_grpc.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/proto/control_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/proto/error_pb2.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/proto/error_pb2.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/proto/error_pb2_grpc.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/proto/error_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/proto/fab_pb2.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/proto/fab_pb2.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/proto/fab_pb2_grpc.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/proto/fab_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/proto/federation_pb2.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/proto/federation_pb2.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/proto/federation_pb2_grpc.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/proto/federation_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/proto/fleet_pb2.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/proto/fleet_pb2.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/proto/fleet_pb2_grpc.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/proto/grpcadapter_pb2.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/proto/grpcadapter_pb2.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/proto/grpcadapter_pb2_grpc.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/proto/grpcadapter_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/proto/heartbeat_pb2.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/proto/heartbeat_pb2.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/proto/heartbeat_pb2_grpc.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/proto/heartbeat_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/proto/log_pb2.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/proto/log_pb2.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/proto/log_pb2_grpc.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/proto/log_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/proto/message_pb2.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/proto/message_pb2.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/proto/message_pb2_grpc.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/proto/message_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/proto/node_pb2.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/proto/node_pb2.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/proto/node_pb2_grpc.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/proto/node_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/proto/recorddict_pb2.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/proto/recorddict_pb2.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/proto/recorddict_pb2_grpc.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/proto/recorddict_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/proto/run_pb2.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/proto/run_pb2.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/proto/run_pb2_grpc.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/proto/run_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/proto/serverappio_pb2.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/proto/serverappio_pb2.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/proto/serverappio_pb2_grpc.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/proto/serverappio_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/proto/simulationio_pb2.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/proto/simulationio_pb2.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/proto/simulationio_pb2_grpc.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/proto/simulationio_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/proto/transport_pb2.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/proto/transport_pb2.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/proto/transport_pb2_grpc.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/py.typed +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/app.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/client_manager.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/client_proxy.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/compat/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/compat/app.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/compat/app_utils.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/compat/grid_client_proxy.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/compat/legacy_context.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/criterion.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/fleet_event_log_interceptor.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/grid/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/grid/grid.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/grid/grpc_grid.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/grid/inmemory_grid.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/history.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/run_serverapp.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/server.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/server_app.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/server_config.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/serverapp/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/serverapp/app.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/serverapp_components.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/strategy/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/strategy/aggregate.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/strategy/bulyan.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/strategy/fedadagrad.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/strategy/fedadam.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/strategy/fedavg.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/strategy/fedavg_android.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/strategy/fedavgm.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/strategy/fedmedian.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/strategy/fedopt.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/strategy/fedprox.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/strategy/fedyogi.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/strategy/krum.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/strategy/qfedavg.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/strategy/strategy.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/superlink/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/superlink/fleet/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/superlink/fleet/grpc_adapter/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/superlink/fleet/grpc_rere/node_auth_server_interceptor.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/superlink/fleet/message_handler/message_handler.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/superlink/fleet/vce/vce_api.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/superlink/linkstate/in_memory_linkstate.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/superlink/linkstate/linkstate.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/superlink/linkstate/linkstate_factory.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/superlink/linkstate/sqlite_linkstate.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/superlink/linkstate/utils.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/superlink/serverappio/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/superlink/serverappio/serverappio_grpc.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/superlink/serverappio/serverappio_servicer.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/superlink/simulation/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/superlink/simulation/simulationio_grpc.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/superlink/simulation/simulationio_servicer.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/superlink/utils.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/typing.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/utils/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/utils/tensorboard.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/utils/validator.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/workflow/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/workflow/constant.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/workflow/default_workflows.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/serverapp/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/serverapp/exception.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/serverapp/strategy/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/serverapp/strategy/bulyan.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/serverapp/strategy/dp_adaptive_clipping.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/serverapp/strategy/dp_fixed_clipping.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/serverapp/strategy/fedadagrad.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/serverapp/strategy/fedadam.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/serverapp/strategy/fedavg.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/serverapp/strategy/fedavgm.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/serverapp/strategy/fedmedian.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/serverapp/strategy/fedopt.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/serverapp/strategy/fedprox.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/serverapp/strategy/fedtrimmedavg.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/serverapp/strategy/fedxgb_bagging.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/serverapp/strategy/fedxgb_cyclic.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/serverapp/strategy/fedyogi.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/serverapp/strategy/krum.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/serverapp/strategy/multikrum.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/serverapp/strategy/qfedavg.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/serverapp/strategy/result.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/serverapp/strategy/strategy.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/serverapp/strategy/strategy_utils.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/simulation/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/simulation/app.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/simulation/legacy_app.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/simulation/ray_transport/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/simulation/ray_transport/utils.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/simulation/run_simulation.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/simulation/simulationio_connection.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/supercore/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/supercore/address.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/supercore/app_utils.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/supercore/cli/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/supercore/cli/flower_superexec.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/supercore/constant.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/supercore/corestate/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/supercore/corestate/corestate.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/supercore/corestate/in_memory_corestate.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/supercore/corestate/sqlite_corestate.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/supercore/credential_store/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/supercore/credential_store/credential_store.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/supercore/credential_store/file_credential_store.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/supercore/date.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/supercore/ffs/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/supercore/ffs/disk_ffs.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/supercore/ffs/ffs.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/supercore/ffs/ffs_factory.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/supercore/grpc_health/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/supercore/grpc_health/health_server.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/supercore/grpc_health/simple_health_servicer.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/supercore/heartbeat.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/supercore/license_plugin/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/supercore/license_plugin/license_plugin.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/supercore/object_store/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/supercore/object_store/in_memory_object_store.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/supercore/object_store/object_store.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/supercore/object_store/object_store_factory.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/supercore/object_store/sqlite_object_store.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/supercore/primitives/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/supercore/primitives/asymmetric.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/supercore/primitives/asymmetric_ed25519.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/supercore/sqlite_mixin.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/supercore/state/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/supercore/state/schema/README.md +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/supercore/state/schema/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/supercore/state/schema/corestate_tables.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/supercore/state/schema/linkstate_tables.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/supercore/state/schema/objectstore_tables.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/supercore/superexec/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/supercore/superexec/plugin/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/supercore/superexec/plugin/base_exec_plugin.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/supercore/superexec/plugin/clientapp_exec_plugin.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/supercore/superexec/plugin/exec_plugin.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/supercore/superexec/plugin/serverapp_exec_plugin.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/supercore/superexec/plugin/simulation_exec_plugin.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/supercore/superexec/run_superexec.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/supercore/utils.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/supercore/version.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/superlink/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/superlink/artifact_provider/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/superlink/artifact_provider/artifact_provider.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/superlink/auth_plugin/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/superlink/auth_plugin/auth_plugin.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/superlink/auth_plugin/noop_auth_plugin.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/superlink/federation/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/superlink/federation/federation_manager.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/superlink/federation/noop_federation_manager.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/superlink/servicer/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/superlink/servicer/control/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/superlink/servicer/control/control_account_auth_interceptor.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/superlink/servicer/control/control_event_log_interceptor.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/superlink/servicer/control/control_grpc.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/superlink/servicer/control/control_license_interceptor.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/superlink/servicer/control/control_servicer.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/supernode/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/supernode/cli/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/supernode/cli/flower_supernode.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/supernode/cli/flwr_clientapp.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/supernode/nodestate/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/supernode/nodestate/in_memory_nodestate.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/supernode/nodestate/nodestate.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/supernode/nodestate/nodestate_factory.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/supernode/runtime/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/supernode/runtime/run_clientapp.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/supernode/servicer/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/supernode/servicer/clientappio/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/supernode/servicer/clientappio/clientappio_servicer.py +0 -0
- {flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/supernode/start_client_internal.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: flwr-nightly
|
|
3
|
-
Version: 1.26.0.
|
|
3
|
+
Version: 1.26.0.dev20260121
|
|
4
4
|
Summary: Flower: A Friendly Federated AI Framework
|
|
5
5
|
License: Apache-2.0
|
|
6
6
|
Keywords: Artificial Intelligence,Federated AI,Federated Analytics,Federated Evaluation,Federated Learning,Flower,Machine Learning
|
|
@@ -14,6 +14,9 @@
|
|
|
14
14
|
# ==============================================================================
|
|
15
15
|
"""Flower command line interface."""
|
|
16
16
|
|
|
17
|
+
|
|
18
|
+
from typing import Any, TypedDict
|
|
19
|
+
|
|
17
20
|
import typer
|
|
18
21
|
from typer.main import get_command
|
|
19
22
|
|
|
@@ -37,6 +40,15 @@ from .supernode import ls as supernode_list
|
|
|
37
40
|
from .supernode import register as supernode_register
|
|
38
41
|
from .supernode import unregister as supernode_unregister
|
|
39
42
|
|
|
43
|
+
|
|
44
|
+
class CommandKwargs(TypedDict):
|
|
45
|
+
"""Keywords for typer command to make mypy happy."""
|
|
46
|
+
|
|
47
|
+
context_settings: dict[str, Any]
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
ALLOW_EXTRAS: CommandKwargs = {"context_settings": {"allow_extra_args": True}}
|
|
51
|
+
|
|
40
52
|
app = typer.Typer(
|
|
41
53
|
help=typer.style(
|
|
42
54
|
"flwr is the Flower command line interface.",
|
|
@@ -51,12 +63,12 @@ app.command()(new)
|
|
|
51
63
|
app.command()(run)
|
|
52
64
|
app.command()(build)
|
|
53
65
|
app.command()(install)
|
|
54
|
-
app.command()(log)
|
|
55
|
-
app.command("list")(ls)
|
|
56
|
-
app.command(hidden=True)(ls)
|
|
57
|
-
app.command()(stop)
|
|
66
|
+
app.command(**ALLOW_EXTRAS)(log)
|
|
67
|
+
app.command("list", **ALLOW_EXTRAS)(ls)
|
|
68
|
+
app.command(hidden=True, **ALLOW_EXTRAS)(ls)
|
|
69
|
+
app.command(**ALLOW_EXTRAS)(stop)
|
|
58
70
|
app.command()(login)
|
|
59
|
-
app.command()(pull)
|
|
71
|
+
app.command(**ALLOW_EXTRAS)(pull)
|
|
60
72
|
|
|
61
73
|
# Create supernode command group
|
|
62
74
|
supernode_app = typer.Typer(help="Manage SuperNodes")
|
{flwr_nightly-1.26.0.dev20260120 → flwr_nightly-1.26.0.dev20260121}/py/flwr/cli/config_migration.py
RENAMED
|
@@ -57,21 +57,21 @@ CLI_NOTICE = (
|
|
|
57
57
|
)
|
|
58
58
|
|
|
59
59
|
|
|
60
|
-
def _is_legacy_usage(
|
|
60
|
+
def _is_legacy_usage(positional_arg_1: str | None, args: list[str]) -> bool:
|
|
61
61
|
"""Check if legacy usage is detected in the given arguments."""
|
|
62
|
-
if
|
|
62
|
+
if positional_arg_1 is None:
|
|
63
63
|
return False
|
|
64
64
|
|
|
65
65
|
# If one and only one extra argument is given, assume legacy usage
|
|
66
66
|
if len(args) == 1:
|
|
67
67
|
return True
|
|
68
68
|
|
|
69
|
-
# If the
|
|
70
|
-
pth = Path(
|
|
71
|
-
if pth.is_absolute() or len(pth.parts) > 1 or
|
|
69
|
+
# If the first positional argument looks like a path, assume legacy usage
|
|
70
|
+
pth = Path(positional_arg_1)
|
|
71
|
+
if pth.is_absolute() or len(pth.parts) > 1 or positional_arg_1 in (".", ".."):
|
|
72
72
|
return True
|
|
73
73
|
|
|
74
|
-
# Lastly, check if a pyproject.toml file exists at the given
|
|
74
|
+
# Lastly, check if a pyproject.toml file exists at the given path
|
|
75
75
|
if (pth / "pyproject.toml").exists():
|
|
76
76
|
return True
|
|
77
77
|
|
|
@@ -172,7 +172,7 @@ def _comment_out_legacy_toml_config(app: Path) -> None:
|
|
|
172
172
|
|
|
173
173
|
|
|
174
174
|
def migrate(
|
|
175
|
-
|
|
175
|
+
positional_arg_1: str | None,
|
|
176
176
|
args: list[str],
|
|
177
177
|
ignore_legacy_usage: bool = False,
|
|
178
178
|
) -> None:
|
|
@@ -182,13 +182,13 @@ def migrate(
|
|
|
182
182
|
pyproject.toml to the new Flower config format when legacy usage is detected
|
|
183
183
|
or the migration is applicable.
|
|
184
184
|
|
|
185
|
-
`flwr run` should call `migrate(
|
|
185
|
+
`flwr run` should call `migrate(app, [], ignore_legacy_usage=True)` to skip
|
|
186
186
|
legacy usage check. Other CLI commands should call `migrate(superlink, ctx.args)`.
|
|
187
187
|
|
|
188
188
|
Parameters
|
|
189
189
|
----------
|
|
190
|
-
|
|
191
|
-
|
|
190
|
+
positional_arg_1 : str | None
|
|
191
|
+
The first positional argument.
|
|
192
192
|
args : list[str]
|
|
193
193
|
Additional arguments. In legacy usage, this is the TOML federation name.
|
|
194
194
|
ignore_legacy_usage : bool (default: False)
|
|
@@ -224,12 +224,13 @@ def migrate(
|
|
|
224
224
|
raise click.UsageError(f"Got unexpected extra arguments ({' '.join(args[1:])})")
|
|
225
225
|
|
|
226
226
|
# Determine app path for migration
|
|
227
|
-
|
|
227
|
+
arg1 = positional_arg_1
|
|
228
|
+
app = Path(arg1) if arg1 else Path(".")
|
|
228
229
|
app = app.resolve()
|
|
229
230
|
|
|
230
231
|
# Check if migration is applicable and if legacy usage is detected
|
|
231
232
|
is_migratable, reason = _is_migratable(app)
|
|
232
|
-
is_legacy = _is_legacy_usage(
|
|
233
|
+
is_legacy = _is_legacy_usage(arg1, args) if not ignore_legacy_usage else False
|
|
233
234
|
|
|
234
235
|
# Print notice once if legacy usage detected or migration is applicable
|
|
235
236
|
if is_legacy or is_migratable:
|
|
@@ -276,3 +277,24 @@ def migrate(
|
|
|
276
277
|
|
|
277
278
|
# Abort if legacy usage is detected to force user to adapt to new usage
|
|
278
279
|
raise typer.Exit(code=1)
|
|
280
|
+
|
|
281
|
+
|
|
282
|
+
def warn_if_federation_config_overrides(
|
|
283
|
+
federation_config_overrides: list[str] | None,
|
|
284
|
+
) -> None:
|
|
285
|
+
"""Warn if federation config overrides are provided.
|
|
286
|
+
|
|
287
|
+
Parameters
|
|
288
|
+
----------
|
|
289
|
+
federation_config_overrides : list[str] | None
|
|
290
|
+
List of federation config override strings.
|
|
291
|
+
"""
|
|
292
|
+
if federation_config_overrides is None:
|
|
293
|
+
return
|
|
294
|
+
|
|
295
|
+
typer.secho(
|
|
296
|
+
"⚠️ Warning: `--federation-config` option is deprecated and will be ignored.\n"
|
|
297
|
+
"Use Flower configuration files to set SuperLink connections.",
|
|
298
|
+
fg=typer.colors.YELLOW,
|
|
299
|
+
bold=True,
|
|
300
|
+
)
|
|
@@ -17,25 +17,21 @@
|
|
|
17
17
|
|
|
18
18
|
import time
|
|
19
19
|
from logging import DEBUG, ERROR, INFO
|
|
20
|
-
from
|
|
21
|
-
from typing import Annotated, Any, cast
|
|
20
|
+
from typing import Annotated, cast
|
|
22
21
|
|
|
23
22
|
import grpc
|
|
24
23
|
import typer
|
|
25
24
|
|
|
26
|
-
from flwr.cli.
|
|
27
|
-
exit_if_no_address,
|
|
28
|
-
load_and_validate,
|
|
29
|
-
process_loaded_project_config,
|
|
30
|
-
validate_federation_in_project_config,
|
|
31
|
-
)
|
|
25
|
+
from flwr.cli.config_migration import migrate, warn_if_federation_config_overrides
|
|
32
26
|
from flwr.cli.constant import FEDERATION_CONFIG_HELP_MESSAGE
|
|
27
|
+
from flwr.cli.flower_config import read_superlink_connection
|
|
28
|
+
from flwr.cli.typing import SuperLinkConnection
|
|
33
29
|
from flwr.common.constant import CONN_RECONNECT_INTERVAL, CONN_REFRESH_PERIOD
|
|
34
30
|
from flwr.common.logger import log as logger
|
|
35
31
|
from flwr.proto.control_pb2 import StreamLogsRequest # pylint: disable=E0611
|
|
36
32
|
from flwr.proto.control_pb2_grpc import ControlStub
|
|
37
33
|
|
|
38
|
-
from .utils import flwr_cli_grpc_exc_handler,
|
|
34
|
+
from .utils import flwr_cli_grpc_exc_handler, init_channel_from_connection
|
|
39
35
|
|
|
40
36
|
|
|
41
37
|
class AllLogsRetrieved(BaseException):
|
|
@@ -158,23 +154,21 @@ def print_logs(run_id: int, channel: grpc.Channel, timeout: int) -> None:
|
|
|
158
154
|
|
|
159
155
|
|
|
160
156
|
def log(
|
|
157
|
+
ctx: typer.Context,
|
|
161
158
|
run_id: Annotated[
|
|
162
159
|
int,
|
|
163
160
|
typer.Argument(help="The Flower run ID to query"),
|
|
164
161
|
],
|
|
165
|
-
|
|
166
|
-
Path,
|
|
167
|
-
typer.Argument(help="Path of the Flower project to run"),
|
|
168
|
-
] = Path("."),
|
|
169
|
-
federation: Annotated[
|
|
162
|
+
superlink: Annotated[
|
|
170
163
|
str | None,
|
|
171
|
-
typer.Argument(help="Name of the
|
|
164
|
+
typer.Argument(help="Name of the SuperLink connection."),
|
|
172
165
|
] = None,
|
|
173
166
|
federation_config_overrides: Annotated[
|
|
174
167
|
list[str] | None,
|
|
175
168
|
typer.Option(
|
|
176
169
|
"--federation-config",
|
|
177
170
|
help=FEDERATION_CONFIG_HELP_MESSAGE,
|
|
171
|
+
hidden=True,
|
|
178
172
|
),
|
|
179
173
|
] = None,
|
|
180
174
|
stream: Annotated[
|
|
@@ -190,27 +184,24 @@ def log(
|
|
|
190
184
|
Retrieve and display logs from a Flower run. Logs can be streamed in real-time (with
|
|
191
185
|
--stream) or printed once (with --show).
|
|
192
186
|
"""
|
|
193
|
-
|
|
187
|
+
# Warn `--federation-config` is ignored
|
|
188
|
+
warn_if_federation_config_overrides(federation_config_overrides)
|
|
194
189
|
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
)
|
|
201
|
-
exit_if_no_address(federation_config, "log")
|
|
190
|
+
# Migrate legacy usage if any
|
|
191
|
+
migrate(superlink, args=ctx.args)
|
|
192
|
+
|
|
193
|
+
# Read superlink connection configuration
|
|
194
|
+
superlink_connection = read_superlink_connection(superlink)
|
|
202
195
|
|
|
203
196
|
try:
|
|
204
|
-
_log_with_control_api(
|
|
197
|
+
_log_with_control_api(superlink_connection, run_id, stream)
|
|
205
198
|
except Exception as err: # pylint: disable=broad-except
|
|
206
199
|
typer.secho(str(err), fg=typer.colors.RED, bold=True, err=True)
|
|
207
200
|
raise typer.Exit(code=1) from None
|
|
208
201
|
|
|
209
202
|
|
|
210
203
|
def _log_with_control_api(
|
|
211
|
-
|
|
212
|
-
federation: str,
|
|
213
|
-
federation_config: dict[str, Any],
|
|
204
|
+
superlink_connection: SuperLinkConnection,
|
|
214
205
|
run_id: int,
|
|
215
206
|
stream: bool,
|
|
216
207
|
) -> None:
|
|
@@ -218,19 +209,14 @@ def _log_with_control_api(
|
|
|
218
209
|
|
|
219
210
|
Parameters
|
|
220
211
|
----------
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
federation : str
|
|
224
|
-
Name of the federation.
|
|
225
|
-
federation_config : dict[str, Any]
|
|
226
|
-
Federation configuration dictionary.
|
|
212
|
+
superlink_connection : SuperLinkConnection
|
|
213
|
+
Superlink connection configuration.
|
|
227
214
|
run_id : int
|
|
228
215
|
The unique identifier of the run to retrieve logs from.
|
|
229
216
|
stream : bool
|
|
230
217
|
If True, stream logs continuously; if False, print once.
|
|
231
218
|
"""
|
|
232
|
-
|
|
233
|
-
channel = init_channel(app, federation_config, auth_plugin)
|
|
219
|
+
channel = init_channel_from_connection(superlink_connection)
|
|
234
220
|
|
|
235
221
|
if stream:
|
|
236
222
|
start_stream(run_id, channel, CONN_REFRESH_PERIOD)
|
|
@@ -17,22 +17,17 @@
|
|
|
17
17
|
|
|
18
18
|
import io
|
|
19
19
|
import json
|
|
20
|
-
from
|
|
21
|
-
from typing import Annotated, cast
|
|
20
|
+
from typing import Annotated
|
|
22
21
|
|
|
23
22
|
import typer
|
|
24
23
|
from rich.console import Console
|
|
25
24
|
from rich.table import Table
|
|
26
25
|
from rich.text import Text
|
|
27
26
|
|
|
28
|
-
from flwr.cli.
|
|
29
|
-
exit_if_no_address,
|
|
30
|
-
load_and_validate,
|
|
31
|
-
process_loaded_project_config,
|
|
32
|
-
validate_federation_in_project_config,
|
|
33
|
-
)
|
|
27
|
+
from flwr.cli.config_migration import migrate, warn_if_federation_config_overrides
|
|
34
28
|
from flwr.cli.constant import FEDERATION_CONFIG_HELP_MESSAGE
|
|
35
|
-
from flwr.
|
|
29
|
+
from flwr.cli.flower_config import read_superlink_connection
|
|
30
|
+
from flwr.common.constant import CliOutputFormat, Status, SubStatus
|
|
36
31
|
from flwr.common.logger import print_json_error, redirect_output, restore_output
|
|
37
32
|
from flwr.common.serde import run_from_proto
|
|
38
33
|
from flwr.proto.control_pb2 import ( # pylint: disable=E0611
|
|
@@ -43,24 +38,21 @@ from flwr.proto.control_pb2_grpc import ControlStub
|
|
|
43
38
|
from flwr.supercore.utils import humanize_bytes, humanize_duration
|
|
44
39
|
|
|
45
40
|
from .run_utils import RunRow, format_runs
|
|
46
|
-
from .utils import flwr_cli_grpc_exc_handler,
|
|
41
|
+
from .utils import flwr_cli_grpc_exc_handler, init_channel_from_connection
|
|
47
42
|
|
|
48
43
|
|
|
49
44
|
def ls( # pylint: disable=too-many-locals, too-many-branches, R0913, R0917
|
|
50
45
|
ctx: typer.Context,
|
|
51
|
-
|
|
52
|
-
Path,
|
|
53
|
-
typer.Argument(help="Path of the Flower project"),
|
|
54
|
-
] = Path("."),
|
|
55
|
-
federation: Annotated[
|
|
46
|
+
superlink: Annotated[
|
|
56
47
|
str | None,
|
|
57
|
-
typer.Argument(help="Name of the
|
|
48
|
+
typer.Argument(help="Name of the SuperLink connection."),
|
|
58
49
|
] = None,
|
|
59
50
|
federation_config_overrides: Annotated[
|
|
60
51
|
list[str] | None,
|
|
61
52
|
typer.Option(
|
|
62
53
|
"--federation-config",
|
|
63
54
|
help=FEDERATION_CONFIG_HELP_MESSAGE,
|
|
55
|
+
hidden=True,
|
|
64
56
|
),
|
|
65
57
|
] = None,
|
|
66
58
|
runs: Annotated[
|
|
@@ -99,32 +91,29 @@ def ls( # pylint: disable=too-many-locals, too-many-branches, R0913, R0917
|
|
|
99
91
|
|
|
100
92
|
All timestamps follow ISO 8601, UTC and are formatted as ``YYYY-MM-DD HH:MM:SSZ``.
|
|
101
93
|
"""
|
|
102
|
-
# Resolve command used (list or ls)
|
|
103
|
-
command_name = cast(str, ctx.command.name) if ctx.command else "list"
|
|
104
|
-
|
|
105
94
|
suppress_output = output_format == CliOutputFormat.JSON
|
|
106
95
|
captured_output = io.StringIO()
|
|
96
|
+
|
|
97
|
+
if suppress_output:
|
|
98
|
+
redirect_output(captured_output)
|
|
99
|
+
|
|
100
|
+
# Warn `--federation-config` is ignored
|
|
101
|
+
warn_if_federation_config_overrides(federation_config_overrides)
|
|
102
|
+
|
|
103
|
+
# Migrate legacy usage if any
|
|
104
|
+
migrate(superlink, args=ctx.args)
|
|
105
|
+
|
|
106
|
+
# Read superlink connection configuration
|
|
107
|
+
superlink_connection = read_superlink_connection(superlink)
|
|
108
|
+
channel = None
|
|
109
|
+
|
|
107
110
|
try:
|
|
108
|
-
if suppress_output:
|
|
109
|
-
redirect_output(captured_output)
|
|
110
|
-
# Load and validate federation config
|
|
111
|
-
typer.secho("Loading project configuration... ", fg=typer.colors.BLUE)
|
|
112
|
-
|
|
113
|
-
pyproject_path = app / FAB_CONFIG_FILE if app else None
|
|
114
|
-
config, errors, warnings = load_and_validate(pyproject_path, check_module=False)
|
|
115
|
-
config = process_loaded_project_config(config, errors, warnings)
|
|
116
|
-
federation, federation_config = validate_federation_in_project_config(
|
|
117
|
-
federation, config, federation_config_overrides
|
|
118
|
-
)
|
|
119
|
-
exit_if_no_address(federation_config, command_name)
|
|
120
|
-
channel = None
|
|
121
111
|
try:
|
|
122
112
|
if runs and run_id is not None:
|
|
123
113
|
raise ValueError(
|
|
124
114
|
"The options '--runs' and '--run-id' are mutually exclusive."
|
|
125
115
|
)
|
|
126
|
-
|
|
127
|
-
channel = init_channel(app, federation_config, auth_plugin)
|
|
116
|
+
channel = init_channel_from_connection(superlink_connection)
|
|
128
117
|
stub = ControlStub(channel)
|
|
129
118
|
|
|
130
119
|
# Display information about a specific run ID
|
|
@@ -15,46 +15,38 @@
|
|
|
15
15
|
"""Flower command line interface `pull` command."""
|
|
16
16
|
|
|
17
17
|
|
|
18
|
-
from pathlib import Path
|
|
19
18
|
from typing import Annotated
|
|
20
19
|
|
|
21
20
|
import typer
|
|
22
21
|
|
|
23
|
-
from flwr.cli.
|
|
24
|
-
exit_if_no_address,
|
|
25
|
-
load_and_validate,
|
|
26
|
-
process_loaded_project_config,
|
|
27
|
-
validate_federation_in_project_config,
|
|
28
|
-
)
|
|
22
|
+
from flwr.cli.config_migration import migrate, warn_if_federation_config_overrides
|
|
29
23
|
from flwr.cli.constant import FEDERATION_CONFIG_HELP_MESSAGE
|
|
30
|
-
from flwr.
|
|
24
|
+
from flwr.cli.flower_config import read_superlink_connection
|
|
31
25
|
from flwr.proto.control_pb2 import ( # pylint: disable=E0611
|
|
32
26
|
PullArtifactsRequest,
|
|
33
27
|
PullArtifactsResponse,
|
|
34
28
|
)
|
|
35
29
|
from flwr.proto.control_pb2_grpc import ControlStub
|
|
36
30
|
|
|
37
|
-
from .utils import flwr_cli_grpc_exc_handler,
|
|
31
|
+
from .utils import flwr_cli_grpc_exc_handler, init_channel_from_connection
|
|
38
32
|
|
|
39
33
|
|
|
40
34
|
def pull( # pylint: disable=R0914
|
|
35
|
+
ctx: typer.Context,
|
|
41
36
|
run_id: Annotated[
|
|
42
37
|
int,
|
|
43
38
|
typer.Argument(help="Run ID to pull artifacts from."),
|
|
44
39
|
],
|
|
45
|
-
|
|
46
|
-
Path,
|
|
47
|
-
typer.Argument(help="Path of the Flower App to run."),
|
|
48
|
-
] = Path("."),
|
|
49
|
-
federation: Annotated[
|
|
40
|
+
superlink: Annotated[
|
|
50
41
|
str | None,
|
|
51
|
-
typer.Argument(help="Name of the
|
|
42
|
+
typer.Argument(help="Name of the SuperLink connection."),
|
|
52
43
|
] = None,
|
|
53
44
|
federation_config_overrides: Annotated[
|
|
54
45
|
list[str] | None,
|
|
55
46
|
typer.Option(
|
|
56
47
|
"--federation-config",
|
|
57
48
|
help=FEDERATION_CONFIG_HELP_MESSAGE,
|
|
49
|
+
hidden=True,
|
|
58
50
|
),
|
|
59
51
|
] = None,
|
|
60
52
|
) -> None:
|
|
@@ -63,20 +55,17 @@ def pull( # pylint: disable=R0914
|
|
|
63
55
|
Retrieve a download URL for artifacts generated during a completed Flower run. The
|
|
64
56
|
artifacts can then be downloaded from the provided URL.
|
|
65
57
|
"""
|
|
66
|
-
|
|
58
|
+
# Warn `--federation-config` is ignored
|
|
59
|
+
warn_if_federation_config_overrides(federation_config_overrides)
|
|
60
|
+
|
|
61
|
+
# Migrate legacy usage if any
|
|
62
|
+
migrate(superlink, args=ctx.args)
|
|
67
63
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
config = process_loaded_project_config(config, errors, warnings)
|
|
71
|
-
federation, federation_config = validate_federation_in_project_config(
|
|
72
|
-
federation, config, federation_config_overrides
|
|
73
|
-
)
|
|
74
|
-
exit_if_no_address(federation_config, "pull")
|
|
64
|
+
# Read superlink connection configuration
|
|
65
|
+
superlink_connection = read_superlink_connection(superlink)
|
|
75
66
|
channel = None
|
|
76
67
|
try:
|
|
77
|
-
|
|
78
|
-
auth_plugin = load_cli_auth_plugin(app, federation, federation_config)
|
|
79
|
-
channel = init_channel(app, federation_config, auth_plugin)
|
|
68
|
+
channel = init_channel_from_connection(superlink_connection)
|
|
80
69
|
stub = ControlStub(channel)
|
|
81
70
|
with flwr_cli_grpc_exc_handler():
|
|
82
71
|
res: PullArtifactsResponse = stub.PullArtifacts(
|
|
@@ -26,15 +26,15 @@ import typer
|
|
|
26
26
|
from rich.console import Console
|
|
27
27
|
|
|
28
28
|
from flwr.cli.build import build_fab_from_disk, get_fab_filename
|
|
29
|
+
from flwr.cli.config_migration import migrate, warn_if_federation_config_overrides
|
|
29
30
|
from flwr.cli.config_utils import load as load_toml
|
|
30
|
-
from flwr.cli.config_utils import (
|
|
31
|
-
load_and_validate,
|
|
32
|
-
process_loaded_project_config,
|
|
33
|
-
validate_federation_in_project_config,
|
|
34
|
-
)
|
|
35
31
|
from flwr.cli.constant import FEDERATION_CONFIG_HELP_MESSAGE, RUN_CONFIG_HELP_MESSAGE
|
|
32
|
+
from flwr.cli.flower_config import (
|
|
33
|
+
_serialize_simulation_options,
|
|
34
|
+
read_superlink_connection,
|
|
35
|
+
)
|
|
36
|
+
from flwr.cli.typing import SuperLinkConnection, SuperLinkSimulationOptions
|
|
36
37
|
from flwr.common.config import (
|
|
37
|
-
flatten_dict,
|
|
38
38
|
get_metadata_from_config,
|
|
39
39
|
parse_config_args,
|
|
40
40
|
user_config_to_configrecord,
|
|
@@ -49,7 +49,7 @@ from flwr.supercore.constant import NOOP_FEDERATION
|
|
|
49
49
|
from flwr.supercore.utils import parse_app_spec
|
|
50
50
|
|
|
51
51
|
from ..log import start_stream
|
|
52
|
-
from ..utils import flwr_cli_grpc_exc_handler,
|
|
52
|
+
from ..utils import flwr_cli_grpc_exc_handler, init_channel_from_connection
|
|
53
53
|
|
|
54
54
|
CONN_REFRESH_PERIOD = 60 # Connection refresh period for log streaming (seconds)
|
|
55
55
|
|
|
@@ -60,9 +60,9 @@ def run(
|
|
|
60
60
|
Path,
|
|
61
61
|
typer.Argument(help="Path of the Flower App to run."),
|
|
62
62
|
] = Path("."),
|
|
63
|
-
|
|
63
|
+
superlink: Annotated[
|
|
64
64
|
str | None,
|
|
65
|
-
typer.Argument(help="Name of the
|
|
65
|
+
typer.Argument(help="Name of the SuperLink connection."),
|
|
66
66
|
] = None,
|
|
67
67
|
run_config_overrides: Annotated[
|
|
68
68
|
list[str] | None,
|
|
@@ -77,6 +77,7 @@ def run(
|
|
|
77
77
|
typer.Option(
|
|
78
78
|
"--federation-config",
|
|
79
79
|
help=FEDERATION_CONFIG_HELP_MESSAGE,
|
|
80
|
+
hidden=True,
|
|
80
81
|
),
|
|
81
82
|
] = None,
|
|
82
83
|
stream: Annotated[
|
|
@@ -99,9 +100,20 @@ def run(
|
|
|
99
100
|
"""Run Flower App."""
|
|
100
101
|
suppress_output = output_format == CliOutputFormat.JSON
|
|
101
102
|
captured_output = io.StringIO()
|
|
103
|
+
|
|
104
|
+
if suppress_output:
|
|
105
|
+
redirect_output(captured_output)
|
|
106
|
+
|
|
107
|
+
# Warn `--federation-config` is ignored
|
|
108
|
+
warn_if_federation_config_overrides(federation_config_overrides)
|
|
109
|
+
|
|
110
|
+
# Migrate legacy usage if any
|
|
111
|
+
migrate(str(app), [], ignore_legacy_usage=True)
|
|
112
|
+
|
|
113
|
+
# Read superlink connection configuration
|
|
114
|
+
superlink_connection = read_superlink_connection(superlink)
|
|
115
|
+
|
|
102
116
|
try:
|
|
103
|
-
if suppress_output:
|
|
104
|
-
redirect_output(captured_output)
|
|
105
117
|
|
|
106
118
|
# Determine if app is remote
|
|
107
119
|
app_spec = None
|
|
@@ -116,27 +128,11 @@ def run(
|
|
|
116
128
|
app_spec = app_str
|
|
117
129
|
# Set `app` to current directory for credential storage
|
|
118
130
|
app = Path(".")
|
|
119
|
-
is_remote_app = app_spec is not None
|
|
120
|
-
|
|
121
|
-
typer.secho("Loading project configuration... ", fg=typer.colors.BLUE)
|
|
122
131
|
|
|
123
|
-
|
|
124
|
-
pyproject_path = app / "pyproject.toml" if not is_remote_app else None
|
|
125
|
-
# `./pyproject.toml` will be loaded when `pyproject_path` is None
|
|
126
|
-
config, errors, warnings = load_and_validate(
|
|
127
|
-
pyproject_path, check_module=not is_remote_app
|
|
128
|
-
)
|
|
129
|
-
config = process_loaded_project_config(config, errors, warnings)
|
|
130
|
-
|
|
131
|
-
federation, federation_config = validate_federation_in_project_config(
|
|
132
|
-
federation, config, federation_config_overrides
|
|
133
|
-
)
|
|
134
|
-
|
|
135
|
-
if "address" in federation_config:
|
|
132
|
+
if superlink_connection.address:
|
|
136
133
|
_run_with_control_api(
|
|
137
134
|
app,
|
|
138
|
-
|
|
139
|
-
federation_config,
|
|
135
|
+
superlink_connection,
|
|
140
136
|
run_config_overrides,
|
|
141
137
|
stream,
|
|
142
138
|
output_format,
|
|
@@ -144,7 +140,9 @@ def run(
|
|
|
144
140
|
)
|
|
145
141
|
else:
|
|
146
142
|
_run_without_control_api(
|
|
147
|
-
app,
|
|
143
|
+
app=app,
|
|
144
|
+
simulation_options=superlink_connection.options, # type: ignore
|
|
145
|
+
config_overrides=run_config_overrides,
|
|
148
146
|
)
|
|
149
147
|
except (typer.Exit, Exception) as err: # pylint: disable=broad-except
|
|
150
148
|
if suppress_output:
|
|
@@ -167,8 +165,7 @@ def run(
|
|
|
167
165
|
# pylint: disable-next=R0913, R0914, R0917
|
|
168
166
|
def _run_with_control_api(
|
|
169
167
|
app: Path,
|
|
170
|
-
|
|
171
|
-
federation_config: dict[str, Any],
|
|
168
|
+
superlink_connection: SuperLinkConnection,
|
|
172
169
|
config_overrides: list[str] | None,
|
|
173
170
|
stream: bool,
|
|
174
171
|
output_format: str,
|
|
@@ -177,8 +174,7 @@ def _run_with_control_api(
|
|
|
177
174
|
channel = None
|
|
178
175
|
is_remote_app = app_spec is not None
|
|
179
176
|
try:
|
|
180
|
-
|
|
181
|
-
channel = init_channel(app, federation_config, auth_plugin)
|
|
177
|
+
channel = init_channel_from_connection(superlink_connection)
|
|
182
178
|
stub = ControlStub(channel)
|
|
183
179
|
|
|
184
180
|
# Build FAB if local app
|
|
@@ -194,16 +190,19 @@ def _run_with_control_api(
|
|
|
194
190
|
fab_id = fab_version = fab_hash = ""
|
|
195
191
|
fab = Fab(fab_hash, b"", {})
|
|
196
192
|
|
|
197
|
-
|
|
193
|
+
federation: str = superlink_connection.federation or NOOP_FEDERATION
|
|
198
194
|
|
|
199
195
|
# Construct a `ConfigRecord` out of a flattened `UserConfig`
|
|
200
|
-
|
|
201
|
-
|
|
196
|
+
options = {}
|
|
197
|
+
if superlink_connection.options:
|
|
198
|
+
options = _serialize_simulation_options(superlink_connection.options)
|
|
199
|
+
|
|
200
|
+
c_record = user_config_to_configrecord(options)
|
|
202
201
|
|
|
203
202
|
req = StartRunRequest(
|
|
204
203
|
fab=fab_to_proto(fab),
|
|
205
204
|
override_config=user_config_to_proto(parse_config_args(config_overrides)),
|
|
206
|
-
federation=
|
|
205
|
+
federation=federation,
|
|
207
206
|
federation_options=config_record_to_proto(c_record),
|
|
208
207
|
app_spec=app_spec or "",
|
|
209
208
|
)
|
|
@@ -246,26 +245,12 @@ def _run_with_control_api(
|
|
|
246
245
|
|
|
247
246
|
def _run_without_control_api(
|
|
248
247
|
app: Path | None,
|
|
249
|
-
|
|
248
|
+
simulation_options: SuperLinkSimulationOptions,
|
|
250
249
|
config_overrides: list[str] | None,
|
|
251
|
-
federation: str,
|
|
252
250
|
) -> None:
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
backend_cfg = federation_config["options"].get("backend", {})
|
|
257
|
-
except KeyError as err:
|
|
258
|
-
typer.secho(
|
|
259
|
-
"❌ The project's `pyproject.toml` needs to declare the number of"
|
|
260
|
-
" SuperNodes in the simulation. To simulate 10 SuperNodes,"
|
|
261
|
-
" use the following notation:\n\n"
|
|
262
|
-
f"[tool.flwr.federations.{federation}]\n"
|
|
263
|
-
"options.num-supernodes = 10\n",
|
|
264
|
-
fg=typer.colors.RED,
|
|
265
|
-
bold=True,
|
|
266
|
-
err=True,
|
|
267
|
-
)
|
|
268
|
-
raise typer.Exit(code=1) from err
|
|
251
|
+
|
|
252
|
+
num_supernodes = simulation_options.num_supernodes
|
|
253
|
+
verbose = False # bool | None = superlink_connection.options.verbose
|
|
269
254
|
|
|
270
255
|
command = [
|
|
271
256
|
"flower-simulation",
|
|
@@ -275,9 +260,10 @@ def _run_without_control_api(
|
|
|
275
260
|
f"{num_supernodes}",
|
|
276
261
|
]
|
|
277
262
|
|
|
278
|
-
if
|
|
263
|
+
if simulation_options.backend:
|
|
279
264
|
# Stringify as JSON
|
|
280
|
-
|
|
265
|
+
backend_serial = _serialize_simulation_options(simulation_options)
|
|
266
|
+
command.extend(["--backend-config", json.dumps(backend_serial)])
|
|
281
267
|
|
|
282
268
|
if verbose:
|
|
283
269
|
command.extend(["--verbose"])
|