flwr-nightly 1.26.0.dev20260112__tar.gz → 1.26.0.dev20260113__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.dev20260112 → flwr_nightly-1.26.0.dev20260113}/PKG-INFO +2 -1
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/cli/app.py +6 -6
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/cli/federation/__init__.py +0 -2
- flwr_nightly-1.26.0.dev20260112/py/flwr/cli/federation/show.py → flwr_nightly-1.26.0.dev20260113/py/flwr/cli/federation/ls.py +113 -70
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/cli/utils.py +100 -5
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supercore/constant.py +52 -4
- flwr_nightly-1.26.0.dev20260113/py/flwr/supercore/typing.py +97 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/pyproject.toml +2 -1
- flwr_nightly-1.26.0.dev20260112/py/flwr/cli/federation/ls.py +0 -140
- flwr_nightly-1.26.0.dev20260112/py/flwr/supercore/typing.py +0 -29
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/README.md +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/app/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/app/error.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/app/exception.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/app/message_type.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/app/metadata.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/app/user_config.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/cli/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/cli/app_cmd/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/cli/app_cmd/publish.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/cli/app_cmd/review.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/cli/auth_plugin/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/cli/auth_plugin/auth_plugin.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/cli/auth_plugin/noop_auth_plugin.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/cli/auth_plugin/oidc_cli_plugin.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/cli/build.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/cli/cli_account_auth_interceptor.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/cli/config_utils.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/cli/constant.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/cli/example.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/cli/install.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/cli/log.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/cli/login/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/cli/login/login.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/cli/ls.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/cli/new/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/cli/new/new.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/cli/pull.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/cli/run/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/cli/run/run.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/cli/run_utils.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/cli/stop.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/cli/supernode/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/cli/supernode/ls.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/cli/supernode/register.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/cli/supernode/unregister.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/client/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/client/client.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/client/dpfedavg_numpy_client.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/client/grpc_adapter_client/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/client/grpc_adapter_client/connection.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/client/grpc_rere_client/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/client/grpc_rere_client/connection.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/client/grpc_rere_client/grpc_adapter.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/client/grpc_rere_client/node_auth_client_interceptor.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/client/message_handler/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/client/message_handler/message_handler.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/client/mod/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/client/mod/centraldp_mods.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/client/mod/comms_mods.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/client/mod/localdp_mod.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/client/mod/utils.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/client/numpy_client.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/client/rest_client/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/client/rest_client/connection.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/client/run_info_store.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/client/typing.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/clientapp/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/clientapp/client_app.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/clientapp/mod/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/clientapp/mod/centraldp_mods.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/clientapp/mod/localdp_mod.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/clientapp/typing.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/clientapp/utils.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/args.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/config.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/constant.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/context.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/differential_privacy.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/differential_privacy_constants.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/dp.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/event_log_plugin/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/event_log_plugin/event_log_plugin.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/exit/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/exit/exit.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/exit/exit_code.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/exit/exit_handler.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/exit/signal_handler.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/grpc.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/inflatable.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/inflatable_protobuf_utils.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/inflatable_utils.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/logger.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/message.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/object_ref.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/parameter.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/record/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/record/array.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/record/arraychunk.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/record/arrayrecord.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/record/configrecord.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/record/conversion_utils.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/record/metricrecord.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/record/recorddict.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/record/typeddict.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/recorddict_compat.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/retry_invoker.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/secure_aggregation/quantization.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/serde.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/serde_utils.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/telemetry.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/typing.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/compat/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/compat/client/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/compat/client/app.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/compat/client/grpc_client/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/compat/client/grpc_client/connection.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/compat/common/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/compat/common/constant.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/compat/server/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/compat/server/app.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/compat/simulation/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/appio_pb2.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/appio_pb2.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/appio_pb2_grpc.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/appio_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/clientappio_pb2.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/clientappio_pb2.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/clientappio_pb2_grpc.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/clientappio_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/control_pb2.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/control_pb2.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/control_pb2_grpc.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/control_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/error_pb2.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/error_pb2.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/error_pb2_grpc.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/error_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/fab_pb2.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/fab_pb2.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/fab_pb2_grpc.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/fab_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/federation_pb2.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/federation_pb2.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/federation_pb2_grpc.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/federation_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/fleet_pb2.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/fleet_pb2.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/fleet_pb2_grpc.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/grpcadapter_pb2.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/grpcadapter_pb2.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/grpcadapter_pb2_grpc.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/grpcadapter_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/heartbeat_pb2.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/heartbeat_pb2.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/heartbeat_pb2_grpc.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/heartbeat_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/log_pb2.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/log_pb2.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/log_pb2_grpc.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/log_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/message_pb2.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/message_pb2.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/message_pb2_grpc.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/message_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/node_pb2.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/node_pb2.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/node_pb2_grpc.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/node_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/recorddict_pb2.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/recorddict_pb2.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/recorddict_pb2_grpc.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/recorddict_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/run_pb2.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/run_pb2.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/run_pb2_grpc.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/run_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/serverappio_pb2.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/serverappio_pb2.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/serverappio_pb2_grpc.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/serverappio_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/simulationio_pb2.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/simulationio_pb2.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/simulationio_pb2_grpc.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/simulationio_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/transport_pb2.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/transport_pb2.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/transport_pb2_grpc.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/py.typed +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/app.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/client_manager.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/client_proxy.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/compat/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/compat/app.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/compat/app_utils.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/compat/grid_client_proxy.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/compat/legacy_context.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/criterion.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/fleet_event_log_interceptor.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/grid/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/grid/grid.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/grid/grpc_grid.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/grid/inmemory_grid.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/history.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/run_serverapp.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/server.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/server_app.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/server_config.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/serverapp/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/serverapp/app.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/serverapp_components.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/strategy/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/strategy/aggregate.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/strategy/bulyan.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/strategy/fedadagrad.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/strategy/fedadam.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/strategy/fedavg.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/strategy/fedavg_android.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/strategy/fedavgm.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/strategy/fedmedian.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/strategy/fedopt.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/strategy/fedprox.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/strategy/fedyogi.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/strategy/krum.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/strategy/qfedavg.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/strategy/strategy.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/superlink/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/superlink/fleet/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/superlink/fleet/grpc_adapter/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/superlink/fleet/grpc_rere/node_auth_server_interceptor.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/superlink/fleet/message_handler/message_handler.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/superlink/fleet/vce/vce_api.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/superlink/linkstate/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/superlink/linkstate/in_memory_linkstate.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/superlink/linkstate/linkstate.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/superlink/linkstate/linkstate_factory.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/superlink/linkstate/sqlite_linkstate.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/superlink/linkstate/utils.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/superlink/serverappio/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/superlink/serverappio/serverappio_grpc.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/superlink/serverappio/serverappio_servicer.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/superlink/simulation/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/superlink/simulation/simulationio_grpc.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/superlink/simulation/simulationio_servicer.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/superlink/utils.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/typing.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/utils/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/utils/tensorboard.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/utils/validator.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/workflow/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/workflow/constant.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/workflow/default_workflows.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/serverapp/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/serverapp/exception.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/serverapp/strategy/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/serverapp/strategy/bulyan.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/serverapp/strategy/dp_adaptive_clipping.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/serverapp/strategy/dp_fixed_clipping.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/serverapp/strategy/fedadagrad.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/serverapp/strategy/fedadam.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/serverapp/strategy/fedavg.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/serverapp/strategy/fedavgm.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/serverapp/strategy/fedmedian.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/serverapp/strategy/fedopt.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/serverapp/strategy/fedprox.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/serverapp/strategy/fedtrimmedavg.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/serverapp/strategy/fedxgb_bagging.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/serverapp/strategy/fedxgb_cyclic.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/serverapp/strategy/fedyogi.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/serverapp/strategy/krum.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/serverapp/strategy/multikrum.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/serverapp/strategy/qfedavg.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/serverapp/strategy/result.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/serverapp/strategy/strategy.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/serverapp/strategy/strategy_utils.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/simulation/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/simulation/app.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/simulation/legacy_app.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/simulation/ray_transport/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/simulation/ray_transport/utils.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/simulation/run_simulation.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/simulation/simulationio_connection.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supercore/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supercore/address.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supercore/app_utils.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supercore/cli/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supercore/cli/flower_superexec.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supercore/corestate/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supercore/corestate/corestate.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supercore/corestate/in_memory_corestate.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supercore/corestate/sqlite_corestate.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supercore/date.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supercore/ffs/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supercore/ffs/disk_ffs.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supercore/ffs/ffs.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supercore/ffs/ffs_factory.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supercore/grpc_health/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supercore/grpc_health/health_server.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supercore/grpc_health/simple_health_servicer.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supercore/heartbeat.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supercore/license_plugin/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supercore/license_plugin/license_plugin.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supercore/object_store/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supercore/object_store/in_memory_object_store.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supercore/object_store/object_store.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supercore/object_store/object_store_factory.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supercore/object_store/sqlite_object_store.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supercore/primitives/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supercore/primitives/asymmetric.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supercore/primitives/asymmetric_ed25519.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supercore/sqlite_mixin.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supercore/superexec/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supercore/superexec/plugin/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supercore/superexec/plugin/base_exec_plugin.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supercore/superexec/plugin/clientapp_exec_plugin.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supercore/superexec/plugin/exec_plugin.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supercore/superexec/plugin/serverapp_exec_plugin.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supercore/superexec/plugin/simulation_exec_plugin.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supercore/superexec/run_superexec.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supercore/utils.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supercore/version.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/superlink/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/superlink/artifact_provider/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/superlink/artifact_provider/artifact_provider.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/superlink/auth_plugin/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/superlink/auth_plugin/auth_plugin.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/superlink/auth_plugin/noop_auth_plugin.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/superlink/federation/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/superlink/federation/federation_manager.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/superlink/federation/noop_federation_manager.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/superlink/servicer/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/superlink/servicer/control/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/superlink/servicer/control/control_account_auth_interceptor.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/superlink/servicer/control/control_event_log_interceptor.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/superlink/servicer/control/control_grpc.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/superlink/servicer/control/control_license_interceptor.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/superlink/servicer/control/control_servicer.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supernode/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supernode/cli/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supernode/cli/flower_supernode.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supernode/cli/flwr_clientapp.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supernode/nodestate/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supernode/nodestate/in_memory_nodestate.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supernode/nodestate/nodestate.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supernode/nodestate/nodestate_factory.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supernode/runtime/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supernode/runtime/run_clientapp.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supernode/servicer/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supernode/servicer/clientappio/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supernode/servicer/clientappio/clientappio_servicer.py +0 -0
- {flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/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.dev20260113
|
|
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
|
|
@@ -30,6 +30,7 @@ Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
|
30
30
|
Classifier: Typing :: Typed
|
|
31
31
|
Provides-Extra: rest
|
|
32
32
|
Provides-Extra: simulation
|
|
33
|
+
Requires-Dist: SQLAlchemy (>=2.0.45,<3.0.0)
|
|
33
34
|
Requires-Dist: click (<8.2.0)
|
|
34
35
|
Requires-Dist: cryptography (>=44.0.1,<45.0.0)
|
|
35
36
|
Requires-Dist: grpcio (>=1.70.0,<2.0.0)
|
|
@@ -23,7 +23,6 @@ from .app_cmd import publish as app_publish
|
|
|
23
23
|
from .app_cmd import review as app_review
|
|
24
24
|
from .build import build
|
|
25
25
|
from .federation import ls as federation_list
|
|
26
|
-
from .federation import show as federation_show
|
|
27
26
|
from .install import install
|
|
28
27
|
from .log import log
|
|
29
28
|
from .login import login
|
|
@@ -35,6 +34,7 @@ from .stop import stop
|
|
|
35
34
|
from .supernode import ls as supernode_list
|
|
36
35
|
from .supernode import register as supernode_register
|
|
37
36
|
from .supernode import unregister as supernode_unregister
|
|
37
|
+
from .utils import init_flwr_config
|
|
38
38
|
|
|
39
39
|
app = typer.Typer(
|
|
40
40
|
help=typer.style(
|
|
@@ -80,14 +80,13 @@ federation_app.command("list")(federation_list)
|
|
|
80
80
|
# Hide "ls" command (left as alias)
|
|
81
81
|
federation_app.command(hidden=True)(federation_list)
|
|
82
82
|
app.add_typer(federation_app, name="federation")
|
|
83
|
-
federation_app.command()(federation_show)
|
|
84
83
|
|
|
85
84
|
typer_click_object = get_command(app)
|
|
86
85
|
|
|
87
86
|
|
|
88
87
|
@app.callback(invoke_without_command=True)
|
|
89
|
-
def
|
|
90
|
-
|
|
88
|
+
def main(
|
|
89
|
+
version: bool = typer.Option(
|
|
91
90
|
None,
|
|
92
91
|
"-V",
|
|
93
92
|
"--version",
|
|
@@ -95,8 +94,9 @@ def version_callback(
|
|
|
95
94
|
help="Show the version and exit.",
|
|
96
95
|
),
|
|
97
96
|
) -> None:
|
|
98
|
-
"""
|
|
99
|
-
|
|
97
|
+
"""Flower CLI."""
|
|
98
|
+
init_flwr_config()
|
|
99
|
+
if version:
|
|
100
100
|
typer.secho(f"Flower version: {package_version}", fg="blue")
|
|
101
101
|
raise typer.Exit()
|
|
102
102
|
|
|
@@ -12,12 +12,12 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
# ==============================================================================
|
|
15
|
-
"""Flower command line interface `federation
|
|
15
|
+
"""Flower command line interface `federation list` command."""
|
|
16
16
|
|
|
17
17
|
|
|
18
18
|
import io
|
|
19
19
|
from pathlib import Path
|
|
20
|
-
from typing import Annotated, Any
|
|
20
|
+
from typing import Annotated, Any, cast
|
|
21
21
|
|
|
22
22
|
import typer
|
|
23
23
|
from rich.console import Console
|
|
@@ -35,24 +35,27 @@ from flwr.common.constant import FAB_CONFIG_FILE, NOOP_ACCOUNT_NAME, CliOutputFo
|
|
|
35
35
|
from flwr.common.logger import print_json_error, redirect_output, restore_output
|
|
36
36
|
from flwr.common.serde import run_from_proto
|
|
37
37
|
from flwr.proto.control_pb2 import ( # pylint: disable=E0611
|
|
38
|
+
ListFederationsRequest,
|
|
39
|
+
ListFederationsResponse,
|
|
38
40
|
ShowFederationRequest,
|
|
39
41
|
ShowFederationResponse,
|
|
40
42
|
)
|
|
41
43
|
from flwr.proto.control_pb2_grpc import ControlStub
|
|
44
|
+
from flwr.proto.federation_pb2 import Federation # pylint: disable=E0611
|
|
42
45
|
from flwr.proto.node_pb2 import NodeInfo # pylint: disable=E0611
|
|
43
|
-
from flwr.supercore.constant import NOOP_FEDERATION
|
|
44
46
|
from flwr.supercore.utils import humanize_duration
|
|
45
47
|
|
|
46
48
|
from ..run_utils import RunRow, format_runs
|
|
47
49
|
from ..utils import flwr_cli_grpc_exc_handler, init_channel, load_cli_auth_plugin
|
|
48
50
|
|
|
49
51
|
|
|
50
|
-
def
|
|
52
|
+
def ls( # pylint: disable=R0914, R0913, R0917, R0912
|
|
53
|
+
ctx: typer.Context,
|
|
51
54
|
app: Annotated[
|
|
52
55
|
Path,
|
|
53
56
|
typer.Argument(help="Path of the Flower project"),
|
|
54
57
|
] = Path("."),
|
|
55
|
-
|
|
58
|
+
toml_federation: Annotated[
|
|
56
59
|
str | None,
|
|
57
60
|
typer.Argument(help="Name of the federation"),
|
|
58
61
|
] = None,
|
|
@@ -64,12 +67,19 @@ def show( # pylint: disable=R0914, R0913, R0917
|
|
|
64
67
|
help="Format output using 'default' view or 'json'",
|
|
65
68
|
),
|
|
66
69
|
] = CliOutputFormat.DEFAULT,
|
|
70
|
+
federation: Annotated[
|
|
71
|
+
str | None,
|
|
72
|
+
typer.Option(
|
|
73
|
+
"--federation",
|
|
74
|
+
case_sensitive=False,
|
|
75
|
+
help="Name of the federation to display",
|
|
76
|
+
),
|
|
77
|
+
] = None,
|
|
67
78
|
) -> None:
|
|
68
|
-
"""
|
|
79
|
+
"""List available federations."""
|
|
80
|
+
# Resolve command used (list or ls)
|
|
81
|
+
command_name = cast(str, ctx.command.name) if ctx.command else "ls"
|
|
69
82
|
|
|
70
|
-
Display comprehensive information about a federation including its members,
|
|
71
|
-
registered SuperNodes, and runs.
|
|
72
|
-
"""
|
|
73
83
|
suppress_output = output_format == CliOutputFormat.JSON
|
|
74
84
|
captured_output = io.StringIO()
|
|
75
85
|
try:
|
|
@@ -80,25 +90,41 @@ def show( # pylint: disable=R0914, R0913, R0917
|
|
|
80
90
|
pyproject_path = app / FAB_CONFIG_FILE if app else None
|
|
81
91
|
config, errors, warnings = load_and_validate(pyproject_path, check_module=False)
|
|
82
92
|
config = process_loaded_project_config(config, errors, warnings)
|
|
83
|
-
|
|
84
|
-
|
|
93
|
+
toml_federation_name, federation_config = validate_federation_in_project_config(
|
|
94
|
+
toml_federation, config
|
|
85
95
|
)
|
|
86
|
-
exit_if_no_address(federation_config, "federation
|
|
87
|
-
real_federation: str = federation_config.get("federation", NOOP_FEDERATION)
|
|
96
|
+
exit_if_no_address(federation_config, f"federation {command_name}")
|
|
88
97
|
channel = None
|
|
89
98
|
try:
|
|
90
|
-
auth_plugin = load_cli_auth_plugin(
|
|
99
|
+
auth_plugin = load_cli_auth_plugin(
|
|
100
|
+
app, toml_federation_name, federation_config
|
|
101
|
+
)
|
|
91
102
|
channel = init_channel(app, federation_config, auth_plugin)
|
|
92
103
|
stub = ControlStub(channel)
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
104
|
+
|
|
105
|
+
if federation:
|
|
106
|
+
# Show specific federation details
|
|
107
|
+
typer.echo(f"📄 Showing '{federation}' federation ...")
|
|
108
|
+
members, nodes, runs = _show_federation(stub, federation)
|
|
109
|
+
|
|
110
|
+
restore_output()
|
|
111
|
+
if output_format == CliOutputFormat.JSON:
|
|
112
|
+
Console().print_json(
|
|
113
|
+
data=_to_json(members=members, nodes=nodes, runs=runs)
|
|
114
|
+
)
|
|
115
|
+
else:
|
|
116
|
+
Console().print(_to_members_table(members))
|
|
117
|
+
Console().print(_to_nodes_table(nodes))
|
|
118
|
+
Console().print(_to_runs_table(runs))
|
|
98
119
|
else:
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
120
|
+
# List federations
|
|
121
|
+
typer.echo("📄 Listing federations...")
|
|
122
|
+
federations = _list_federations(stub)
|
|
123
|
+
restore_output()
|
|
124
|
+
if output_format == CliOutputFormat.JSON:
|
|
125
|
+
Console().print_json(data=_to_json(federations=federations))
|
|
126
|
+
else:
|
|
127
|
+
Console().print(_to_table(federations))
|
|
102
128
|
finally:
|
|
103
129
|
if channel:
|
|
104
130
|
channel.close()
|
|
@@ -120,6 +146,71 @@ def show( # pylint: disable=R0914, R0913, R0917
|
|
|
120
146
|
captured_output.close()
|
|
121
147
|
|
|
122
148
|
|
|
149
|
+
def _list_federations(stub: ControlStub) -> list[Federation]:
|
|
150
|
+
"""List all federations."""
|
|
151
|
+
with flwr_cli_grpc_exc_handler():
|
|
152
|
+
res: ListFederationsResponse = stub.ListFederations(ListFederationsRequest())
|
|
153
|
+
|
|
154
|
+
return list(res.federations)
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
def _to_table(federations: list[Federation]) -> Table:
|
|
158
|
+
"""Format the provided federations list to a rich Table."""
|
|
159
|
+
table = Table(header_style="bold cyan", show_lines=True)
|
|
160
|
+
|
|
161
|
+
# Add columns
|
|
162
|
+
table.add_column(
|
|
163
|
+
Text("Federation", justify="center"), style="bright_black", no_wrap=True
|
|
164
|
+
)
|
|
165
|
+
|
|
166
|
+
for federation in federations:
|
|
167
|
+
table.add_row(federation.name)
|
|
168
|
+
|
|
169
|
+
return table
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
def _to_json(
|
|
173
|
+
federations: list[Federation] | None = None,
|
|
174
|
+
members: list[str] | None = None,
|
|
175
|
+
nodes: list[NodeInfo] | None = None,
|
|
176
|
+
runs: list[RunRow] | None = None,
|
|
177
|
+
) -> list[dict[str, str]] | list[list[dict[str, Any]]]:
|
|
178
|
+
"""Format the provided federations list to JSON serializable format."""
|
|
179
|
+
if federations is not None:
|
|
180
|
+
return [{"name": federation.name} for federation in federations]
|
|
181
|
+
|
|
182
|
+
if members is None or nodes is None or runs is None:
|
|
183
|
+
return []
|
|
184
|
+
|
|
185
|
+
members_list: list[dict[str, Any]] = []
|
|
186
|
+
nodes_list: list[dict[str, Any]] = []
|
|
187
|
+
runs_list: list[dict[str, Any]] = []
|
|
188
|
+
|
|
189
|
+
for member in members:
|
|
190
|
+
members_list.append({"member_id": member, "role": "Member"})
|
|
191
|
+
|
|
192
|
+
for node in nodes:
|
|
193
|
+
nodes_list.append(
|
|
194
|
+
{
|
|
195
|
+
"node_id": f"{node.node_id}",
|
|
196
|
+
"owner": node.owner_name,
|
|
197
|
+
"status": node.status,
|
|
198
|
+
}
|
|
199
|
+
)
|
|
200
|
+
|
|
201
|
+
for run in runs:
|
|
202
|
+
runs_list.append(
|
|
203
|
+
{
|
|
204
|
+
"run_id": f"{run.run_id}",
|
|
205
|
+
"app": f"@{run.fab_id}=={run.fab_version}",
|
|
206
|
+
"status": run.status_text,
|
|
207
|
+
"elapsed": run.elapsed,
|
|
208
|
+
}
|
|
209
|
+
)
|
|
210
|
+
|
|
211
|
+
return [members_list, nodes_list, runs_list]
|
|
212
|
+
|
|
213
|
+
|
|
123
214
|
def _show_federation(
|
|
124
215
|
stub: ControlStub, federation: str
|
|
125
216
|
) -> tuple[list[str], list[NodeInfo], list[RunRow]]:
|
|
@@ -268,51 +359,3 @@ def _to_runs_table(run_list: list[RunRow]) -> Table:
|
|
|
268
359
|
table.add_row(*formatted_row)
|
|
269
360
|
|
|
270
361
|
return table
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
def _to_json(
|
|
274
|
-
members: list[str], nodes: list[NodeInfo], runs: list[RunRow]
|
|
275
|
-
) -> list[list[dict[str, str]]]:
|
|
276
|
-
"""Format the provided federation information to JSON serializable format.
|
|
277
|
-
|
|
278
|
-
Parameters
|
|
279
|
-
----------
|
|
280
|
-
members : list[str]
|
|
281
|
-
List of member account identifiers.
|
|
282
|
-
nodes : list[NodeInfo]
|
|
283
|
-
List of NodeInfo objects.
|
|
284
|
-
runs : list[RunRow]
|
|
285
|
-
List of RunRow objects.
|
|
286
|
-
|
|
287
|
-
Returns
|
|
288
|
-
-------
|
|
289
|
-
list[list[dict[str, str]]]
|
|
290
|
-
Nested list containing dictionaries for members, nodes, and runs.
|
|
291
|
-
"""
|
|
292
|
-
members_list: list[dict[str, Any]] = []
|
|
293
|
-
nodes_list: list[dict[str, Any]] = []
|
|
294
|
-
runs_list: list[dict[str, Any]] = []
|
|
295
|
-
|
|
296
|
-
for member in members:
|
|
297
|
-
members_list.append({"member_id": member, "role": "Member"})
|
|
298
|
-
|
|
299
|
-
for node in nodes:
|
|
300
|
-
nodes_list.append(
|
|
301
|
-
{
|
|
302
|
-
"node_id": f"{node.node_id}",
|
|
303
|
-
"owner": node.owner_name,
|
|
304
|
-
"status": node.status,
|
|
305
|
-
}
|
|
306
|
-
)
|
|
307
|
-
|
|
308
|
-
for run in runs:
|
|
309
|
-
runs_list.append(
|
|
310
|
-
{
|
|
311
|
-
"run_id": f"{run.run_id}",
|
|
312
|
-
"app": f"@{run.fab_id}=={run.fab_version}",
|
|
313
|
-
"status": run.status_text,
|
|
314
|
-
"elapsed": run.elapsed,
|
|
315
|
-
}
|
|
316
|
-
)
|
|
317
|
-
|
|
318
|
-
return [members_list, nodes_list, runs_list]
|
|
@@ -48,8 +48,23 @@ from flwr.common.grpc import (
|
|
|
48
48
|
create_channel,
|
|
49
49
|
on_channel_state_change,
|
|
50
50
|
)
|
|
51
|
-
from flwr.supercore.constant import
|
|
52
|
-
|
|
51
|
+
from flwr.supercore.constant import (
|
|
52
|
+
DEFAULT_FLOWER_CONFIG_TOML,
|
|
53
|
+
DEFAULT_SIMULATION_BACKEND_NAME,
|
|
54
|
+
FLOWER_CONFIG_FILE,
|
|
55
|
+
SimulationBackendConfigTomlKey,
|
|
56
|
+
SimulationClientResourcesTomlKey,
|
|
57
|
+
SimulationInitArgsTomlKey,
|
|
58
|
+
SuperLinkConnectionTomlKey,
|
|
59
|
+
SuperLinkSimulationOptionsTomlKey,
|
|
60
|
+
)
|
|
61
|
+
from flwr.supercore.typing import (
|
|
62
|
+
SimulationBackendConfig,
|
|
63
|
+
SimulationClientResources,
|
|
64
|
+
SimulationInitArgs,
|
|
65
|
+
SuperLinkConnection,
|
|
66
|
+
SuperLinkSimulationOptions,
|
|
67
|
+
)
|
|
53
68
|
from flwr.supercore.utils import get_flwr_home
|
|
54
69
|
|
|
55
70
|
from .auth_plugin import CliAuthPlugin, get_cli_plugin_class
|
|
@@ -626,6 +641,74 @@ def validate_credentials_content(creds_path: Path) -> str:
|
|
|
626
641
|
return creds[ACCESS_TOKEN_KEY]
|
|
627
642
|
|
|
628
643
|
|
|
644
|
+
def _parse_simulation_options(options: dict[str, Any]) -> SuperLinkSimulationOptions:
|
|
645
|
+
"""Parse simulation options from a dictionary in a SuperLink connection."""
|
|
646
|
+
num_supernodes = options.get(SuperLinkSimulationOptionsTomlKey.NUM_SUPERNODES)
|
|
647
|
+
# Validation handled in SuperLinkSimulationOptions.__post_init__
|
|
648
|
+
|
|
649
|
+
backend_dict = options.get(SuperLinkSimulationOptionsTomlKey.BACKEND)
|
|
650
|
+
simulation_backend: SimulationBackendConfig | None = None
|
|
651
|
+
|
|
652
|
+
if isinstance(backend_dict, dict):
|
|
653
|
+
# Parse client resources
|
|
654
|
+
client_resources_dict = backend_dict.get(
|
|
655
|
+
SimulationBackendConfigTomlKey.CLIENT_RESOURCES
|
|
656
|
+
)
|
|
657
|
+
client_resources: SimulationClientResources | None = None
|
|
658
|
+
if isinstance(client_resources_dict, dict):
|
|
659
|
+
client_resources = SimulationClientResources(
|
|
660
|
+
num_cpus=client_resources_dict.get(
|
|
661
|
+
SimulationClientResourcesTomlKey.NUM_CPUS
|
|
662
|
+
),
|
|
663
|
+
num_gpus=client_resources_dict.get(
|
|
664
|
+
SimulationClientResourcesTomlKey.NUM_GPUS
|
|
665
|
+
),
|
|
666
|
+
)
|
|
667
|
+
|
|
668
|
+
# Parse init args
|
|
669
|
+
init_args_dict = backend_dict.get(SimulationBackendConfigTomlKey.INIT_ARGS)
|
|
670
|
+
init_args: SimulationInitArgs | None = None
|
|
671
|
+
if isinstance(init_args_dict, dict):
|
|
672
|
+
init_args = SimulationInitArgs(
|
|
673
|
+
num_cpus=init_args_dict.get(SimulationInitArgsTomlKey.NUM_CPUS),
|
|
674
|
+
num_gpus=init_args_dict.get(SimulationInitArgsTomlKey.NUM_GPUS),
|
|
675
|
+
logging_level=init_args_dict.get(
|
|
676
|
+
SimulationInitArgsTomlKey.LOGGING_LEVEL
|
|
677
|
+
),
|
|
678
|
+
log_to_drive=init_args_dict.get(SimulationInitArgsTomlKey.LOG_TO_DRIVE),
|
|
679
|
+
)
|
|
680
|
+
|
|
681
|
+
simulation_backend = SimulationBackendConfig(
|
|
682
|
+
name=backend_dict.get(
|
|
683
|
+
SimulationBackendConfigTomlKey.NAME, DEFAULT_SIMULATION_BACKEND_NAME
|
|
684
|
+
),
|
|
685
|
+
client_resources=client_resources,
|
|
686
|
+
init_args=init_args,
|
|
687
|
+
)
|
|
688
|
+
|
|
689
|
+
# Note: validation happens in SuperLinkSimulationOptions.__post_init__
|
|
690
|
+
return SuperLinkSimulationOptions(
|
|
691
|
+
num_supernodes=cast(int, num_supernodes),
|
|
692
|
+
backend=simulation_backend,
|
|
693
|
+
)
|
|
694
|
+
|
|
695
|
+
|
|
696
|
+
def init_flwr_config() -> None:
|
|
697
|
+
"""Initialize the Flower configuration file."""
|
|
698
|
+
config_path = get_flwr_home() / FLOWER_CONFIG_FILE
|
|
699
|
+
|
|
700
|
+
if not config_path.exists():
|
|
701
|
+
# Create parent directory if it doesn't exist
|
|
702
|
+
config_path.parent.mkdir(parents=True, exist_ok=True)
|
|
703
|
+
# Write Flower config file
|
|
704
|
+
config_path.write_text(DEFAULT_FLOWER_CONFIG_TOML, encoding="utf-8")
|
|
705
|
+
|
|
706
|
+
typer.secho(
|
|
707
|
+
f"\nFlower configuration not found. Created default configuration"
|
|
708
|
+
f" at {config_path}\n",
|
|
709
|
+
)
|
|
710
|
+
|
|
711
|
+
|
|
629
712
|
def parse_superlink_connection(
|
|
630
713
|
conn_dict: dict[str, Any], name: str
|
|
631
714
|
) -> SuperLinkConnection:
|
|
@@ -643,20 +726,31 @@ def parse_superlink_connection(
|
|
|
643
726
|
SuperLinkConnection
|
|
644
727
|
The parsed SuperLink connection configuration.
|
|
645
728
|
"""
|
|
646
|
-
# Check
|
|
729
|
+
# Check fields
|
|
647
730
|
address = conn_dict.get(SuperLinkConnectionTomlKey.ADDRESS)
|
|
648
731
|
root_certificates = conn_dict.get(SuperLinkConnectionTomlKey.ROOT_CERTIFICATES)
|
|
649
732
|
insecure = conn_dict.get(SuperLinkConnectionTomlKey.INSECURE)
|
|
650
733
|
enable_account_auth = conn_dict.get(SuperLinkConnectionTomlKey.ENABLE_ACCOUNT_AUTH)
|
|
651
|
-
|
|
734
|
+
options = conn_dict.get("options")
|
|
735
|
+
|
|
736
|
+
is_address_setup = (
|
|
652
737
|
isinstance(address, str)
|
|
653
738
|
# root-certificates is optional in TOML (can be missing)
|
|
654
739
|
and isinstance(root_certificates, (str, type(None)))
|
|
655
740
|
and isinstance(insecure, bool)
|
|
656
741
|
and isinstance(enable_account_auth, bool)
|
|
657
|
-
)
|
|
742
|
+
)
|
|
743
|
+
|
|
744
|
+
is_simulation_setup = isinstance(options, dict)
|
|
745
|
+
|
|
746
|
+
if not (is_address_setup or is_simulation_setup):
|
|
658
747
|
raise ValueError("Invalid SuperLink connection format.")
|
|
659
748
|
|
|
749
|
+
simulation_options: SuperLinkSimulationOptions | None = None
|
|
750
|
+
if is_simulation_setup:
|
|
751
|
+
options = cast(dict[str, Any], options)
|
|
752
|
+
simulation_options = _parse_simulation_options(options)
|
|
753
|
+
|
|
660
754
|
# Build and return SuperLinkConnection
|
|
661
755
|
return SuperLinkConnection(
|
|
662
756
|
name=name,
|
|
@@ -664,6 +758,7 @@ def parse_superlink_connection(
|
|
|
664
758
|
root_certificates=root_certificates,
|
|
665
759
|
insecure=insecure,
|
|
666
760
|
enable_account_auth=enable_account_auth,
|
|
761
|
+
options=simulation_options,
|
|
667
762
|
)
|
|
668
763
|
|
|
669
764
|
|
{flwr_nightly-1.26.0.dev20260112 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supercore/constant.py
RENAMED
|
@@ -60,6 +60,9 @@ FORCE_EXIT_TIMEOUT_SECONDS = 5 # Used in `flwr_exit` function
|
|
|
60
60
|
# Constants for message processing timing
|
|
61
61
|
MESSAGE_TIME_ENTRY_MAX_AGE_SECONDS = 3600
|
|
62
62
|
|
|
63
|
+
# Constants for simulations
|
|
64
|
+
DEFAULT_SIMULATION_BACKEND_NAME = "ray"
|
|
65
|
+
|
|
63
66
|
# System message type
|
|
64
67
|
SYSTEM_MESSAGE_TYPE = "system"
|
|
65
68
|
|
|
@@ -77,10 +80,6 @@ class NodeStatus:
|
|
|
77
80
|
raise TypeError(f"{cls.__name__} cannot be instantiated.")
|
|
78
81
|
|
|
79
82
|
|
|
80
|
-
# CLI connection configuration file name
|
|
81
|
-
FLOWER_CONFIG_FILE = "config.toml"
|
|
82
|
-
|
|
83
|
-
|
|
84
83
|
class SuperLinkConnectionTomlKey:
|
|
85
84
|
"""TOML keys for SuperLink connection configuration."""
|
|
86
85
|
|
|
@@ -90,3 +89,52 @@ class SuperLinkConnectionTomlKey:
|
|
|
90
89
|
ROOT_CERTIFICATES = "root-certificates"
|
|
91
90
|
INSECURE = "insecure"
|
|
92
91
|
ENABLE_ACCOUNT_AUTH = "enable-account-auth"
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
class SimulationClientResourcesTomlKey:
|
|
95
|
+
"""TOML keys for SimulationClientResources."""
|
|
96
|
+
|
|
97
|
+
NUM_CPUS = "num-cpus"
|
|
98
|
+
NUM_GPUS = "num-gpus"
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
class SimulationInitArgsTomlKey:
|
|
102
|
+
"""TOML keys for SimulationInitArgs."""
|
|
103
|
+
|
|
104
|
+
NUM_CPUS = "num-cpus"
|
|
105
|
+
NUM_GPUS = "num-gpus"
|
|
106
|
+
LOGGING_LEVEL = "logging-level"
|
|
107
|
+
LOG_TO_DRIVE = "log-to-drive"
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
class SimulationBackendConfigTomlKey:
|
|
111
|
+
"""TOML keys for SimulationBackendConfig."""
|
|
112
|
+
|
|
113
|
+
CLIENT_RESOURCES = "client-resources"
|
|
114
|
+
INIT_ARGS = "init-args"
|
|
115
|
+
NAME = "name"
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
class SuperLinkSimulationOptionsTomlKey:
|
|
119
|
+
"""TOML keys for SuperLinkSimulationOptions."""
|
|
120
|
+
|
|
121
|
+
NUM_SUPERNODES = "num-supernodes"
|
|
122
|
+
BACKEND = "backend"
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
# CLI connection configuration file name
|
|
126
|
+
FLOWER_CONFIG_FILE = "config.toml"
|
|
127
|
+
|
|
128
|
+
# The default configuration for the Flower config file
|
|
129
|
+
DEFAULT_FLOWER_CONFIG_TOML = f"""[{SuperLinkConnectionTomlKey.SUPERLINK}]
|
|
130
|
+
{SuperLinkConnectionTomlKey.DEFAULT} = "local-simulation"
|
|
131
|
+
|
|
132
|
+
[{SuperLinkConnectionTomlKey.SUPERLINK}.supergrid]
|
|
133
|
+
{SuperLinkConnectionTomlKey.ADDRESS} = "supergrid.flower.ai"
|
|
134
|
+
{SuperLinkConnectionTomlKey.ENABLE_ACCOUNT_AUTH} = true
|
|
135
|
+
|
|
136
|
+
[{SuperLinkConnectionTomlKey.SUPERLINK}.local-simulation]
|
|
137
|
+
options.num-supernodes = 10
|
|
138
|
+
options.backend.client-resources.num-cpus = 1
|
|
139
|
+
options.backend.client-resources.num-gpus = 0
|
|
140
|
+
"""
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
# Copyright 2026 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 type definitions for infrastructure."""
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
from dataclasses import dataclass
|
|
19
|
+
|
|
20
|
+
from flwr.supercore.constant import DEFAULT_SIMULATION_BACKEND_NAME
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
@dataclass
|
|
24
|
+
class SimulationClientResources:
|
|
25
|
+
"""Resource configuration for the ClientApp."""
|
|
26
|
+
|
|
27
|
+
num_cpus: float | None = None
|
|
28
|
+
num_gpus: float | None = None
|
|
29
|
+
|
|
30
|
+
def __post_init__(self) -> None:
|
|
31
|
+
"""Validate client resources configuration."""
|
|
32
|
+
if self.num_cpus is not None and not isinstance(self.num_cpus, (int, float)):
|
|
33
|
+
raise ValueError("client-resources.num-cpus must be a number (int/float).")
|
|
34
|
+
if self.num_gpus is not None and not isinstance(self.num_gpus, (int, float)):
|
|
35
|
+
raise ValueError("client-resources.num-gpus must be a number (int/float).")
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
@dataclass
|
|
39
|
+
class SimulationInitArgs:
|
|
40
|
+
"""Initialization arguments for the simulation."""
|
|
41
|
+
|
|
42
|
+
num_cpus: int | None = None
|
|
43
|
+
num_gpus: int | None = None
|
|
44
|
+
logging_level: str | None = None
|
|
45
|
+
log_to_drive: bool | None = None
|
|
46
|
+
|
|
47
|
+
def __post_init__(self) -> None:
|
|
48
|
+
"""Validate initialization arguments."""
|
|
49
|
+
if self.num_cpus is not None and not isinstance(self.num_cpus, int):
|
|
50
|
+
raise ValueError("init-args.num-cpus must be an integer.")
|
|
51
|
+
if self.num_gpus is not None and not isinstance(self.num_gpus, int):
|
|
52
|
+
raise ValueError("init-args.num-gpus must be an integer.")
|
|
53
|
+
if self.logging_level is not None and not isinstance(self.logging_level, str):
|
|
54
|
+
raise ValueError("init-args.logging-level must be a string.")
|
|
55
|
+
if self.log_to_drive is not None and not isinstance(self.log_to_drive, bool):
|
|
56
|
+
raise ValueError("init-args.log-to-drive must be a boolean.")
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
@dataclass
|
|
60
|
+
class SimulationBackendConfig:
|
|
61
|
+
"""Backend configuration for the simulation."""
|
|
62
|
+
|
|
63
|
+
client_resources: SimulationClientResources | None = None
|
|
64
|
+
init_args: SimulationInitArgs | None = None
|
|
65
|
+
name: str = DEFAULT_SIMULATION_BACKEND_NAME
|
|
66
|
+
|
|
67
|
+
def __post_init__(self) -> None:
|
|
68
|
+
"""Validate backend configuration."""
|
|
69
|
+
if not isinstance(self.name, str):
|
|
70
|
+
raise ValueError("backend.name must be a string.")
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
@dataclass
|
|
74
|
+
class SuperLinkSimulationOptions:
|
|
75
|
+
"""Options for local simulation."""
|
|
76
|
+
|
|
77
|
+
num_supernodes: int
|
|
78
|
+
backend: SimulationBackendConfig | None = None
|
|
79
|
+
|
|
80
|
+
def __post_init__(self) -> None:
|
|
81
|
+
"""Validate simulation options."""
|
|
82
|
+
if not isinstance(self.num_supernodes, int):
|
|
83
|
+
raise ValueError(
|
|
84
|
+
"Invalid simulation options: num-supernodes must be an integer."
|
|
85
|
+
)
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
@dataclass
|
|
89
|
+
class SuperLinkConnection:
|
|
90
|
+
"""SuperLink connection configuration for CLI commands."""
|
|
91
|
+
|
|
92
|
+
name: str
|
|
93
|
+
address: str | None = None
|
|
94
|
+
root_certificates: str | None = None
|
|
95
|
+
insecure: bool | None = None
|
|
96
|
+
enable_account_auth: bool | None = None
|
|
97
|
+
options: SuperLinkSimulationOptions | None = None
|
|
@@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api"
|
|
|
4
4
|
|
|
5
5
|
[tool.poetry]
|
|
6
6
|
name = "flwr-nightly"
|
|
7
|
-
version = "1.26.0.
|
|
7
|
+
version = "1.26.0.dev20260113"
|
|
8
8
|
description = "Flower: A Friendly Federated AI Framework"
|
|
9
9
|
license = "Apache-2.0"
|
|
10
10
|
authors = ["The Flower Authors <hello@flower.ai>"]
|
|
@@ -78,6 +78,7 @@ rich = "^13.5.0"
|
|
|
78
78
|
pyyaml = "^6.0.2"
|
|
79
79
|
requests = "^2.31.0"
|
|
80
80
|
click = "<8.2.0"
|
|
81
|
+
SQLAlchemy = "^2.0.45"
|
|
81
82
|
# Optional dependencies (Simulation Engine)
|
|
82
83
|
ray = [
|
|
83
84
|
{ version = "==2.51.1", optional = true, python = ">=3.10,<3.13" },
|