flwr-nightly 1.26.0.dev20260122__tar.gz → 1.26.0.dev20260123__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.dev20260122 → flwr_nightly-1.26.0.dev20260123}/PKG-INFO +2 -2
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/cli/config_utils.py +0 -132
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/cli/utils.py +2 -55
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/superlink/linkstate/__init__.py +0 -2
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/supercore/object_store/object_store_factory.py +4 -4
- flwr_nightly-1.26.0.dev20260122/py/flwr/supercore/object_store/sqlite_object_store.py → flwr_nightly-1.26.0.dev20260123/py/flwr/supercore/object_store/sql_object_store.py +107 -113
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/pyproject.toml +2 -2
- flwr_nightly-1.26.0.dev20260122/py/flwr/server/superlink/linkstate/sqlite_linkstate.py +0 -1302
- flwr_nightly-1.26.0.dev20260122/py/flwr/supercore/corestate/sqlite_corestate.py +0 -157
- flwr_nightly-1.26.0.dev20260122/py/flwr/supercore/object_store/sql_object_store.py +0 -82
- flwr_nightly-1.26.0.dev20260122/py/flwr/supercore/sqlite_mixin.py +0 -156
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/README.md +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/app/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/app/error.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/app/exception.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/app/message_type.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/app/metadata.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/app/user_config.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/cli/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/cli/app.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/cli/app_cmd/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/cli/app_cmd/publish.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/cli/app_cmd/review.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/cli/auth_plugin/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/cli/auth_plugin/auth_plugin.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/cli/auth_plugin/noop_auth_plugin.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/cli/auth_plugin/oidc_cli_plugin.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/cli/build.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/cli/cli_account_auth_interceptor.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/cli/config/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/cli/config/ls.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/cli/config_migration.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/cli/constant.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/cli/example.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/cli/federation/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/cli/federation/ls.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/cli/flower_config.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/cli/install.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/cli/log.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/cli/login/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/cli/login/login.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/cli/ls.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/cli/new/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/cli/new/new.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/cli/pull.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/cli/run/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/cli/run/run.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/cli/run_utils.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/cli/stop.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/cli/supernode/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/cli/supernode/ls.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/cli/supernode/register.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/cli/supernode/unregister.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/cli/typing.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/client/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/client/client.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/client/dpfedavg_numpy_client.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/client/grpc_adapter_client/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/client/grpc_adapter_client/connection.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/client/grpc_rere_client/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/client/grpc_rere_client/connection.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/client/grpc_rere_client/grpc_adapter.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/client/grpc_rere_client/node_auth_client_interceptor.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/client/message_handler/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/client/message_handler/message_handler.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/client/mod/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/client/mod/centraldp_mods.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/client/mod/comms_mods.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/client/mod/localdp_mod.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/client/mod/utils.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/client/numpy_client.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/client/rest_client/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/client/rest_client/connection.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/client/run_info_store.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/client/typing.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/clientapp/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/clientapp/client_app.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/clientapp/mod/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/clientapp/mod/centraldp_mods.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/clientapp/mod/localdp_mod.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/clientapp/typing.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/clientapp/utils.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/common/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/common/args.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/common/config.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/common/constant.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/common/context.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/common/differential_privacy.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/common/differential_privacy_constants.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/common/dp.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/common/event_log_plugin/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/common/event_log_plugin/event_log_plugin.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/common/exit/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/common/exit/exit.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/common/exit/exit_code.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/common/exit/exit_handler.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/common/exit/signal_handler.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/common/grpc.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/common/inflatable.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/common/inflatable_protobuf_utils.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/common/inflatable_utils.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/common/logger.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/common/message.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/common/object_ref.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/common/parameter.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/common/record/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/common/record/array.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/common/record/arraychunk.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/common/record/arrayrecord.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/common/record/configrecord.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/common/record/conversion_utils.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/common/record/metricrecord.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/common/record/recorddict.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/common/record/typeddict.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/common/recorddict_compat.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/common/retry_invoker.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/common/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/common/secure_aggregation/quantization.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/common/serde.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/common/serde_utils.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/common/telemetry.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/common/typing.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/compat/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/compat/client/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/compat/client/app.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/compat/client/grpc_client/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/compat/client/grpc_client/connection.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/compat/common/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/compat/common/constant.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/compat/server/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/compat/server/app.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/compat/simulation/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/proto/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/proto/appio_pb2.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/proto/appio_pb2.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/proto/appio_pb2_grpc.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/proto/appio_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/proto/clientappio_pb2.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/proto/clientappio_pb2.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/proto/clientappio_pb2_grpc.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/proto/clientappio_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/proto/control_pb2.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/proto/control_pb2.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/proto/control_pb2_grpc.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/proto/control_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/proto/error_pb2.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/proto/error_pb2.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/proto/error_pb2_grpc.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/proto/error_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/proto/fab_pb2.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/proto/fab_pb2.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/proto/fab_pb2_grpc.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/proto/fab_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/proto/federation_pb2.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/proto/federation_pb2.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/proto/federation_pb2_grpc.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/proto/federation_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/proto/fleet_pb2.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/proto/fleet_pb2.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/proto/fleet_pb2_grpc.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/proto/grpcadapter_pb2.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/proto/grpcadapter_pb2.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/proto/grpcadapter_pb2_grpc.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/proto/grpcadapter_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/proto/heartbeat_pb2.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/proto/heartbeat_pb2.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/proto/heartbeat_pb2_grpc.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/proto/heartbeat_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/proto/log_pb2.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/proto/log_pb2.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/proto/log_pb2_grpc.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/proto/log_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/proto/message_pb2.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/proto/message_pb2.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/proto/message_pb2_grpc.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/proto/message_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/proto/node_pb2.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/proto/node_pb2.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/proto/node_pb2_grpc.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/proto/node_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/proto/recorddict_pb2.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/proto/recorddict_pb2.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/proto/recorddict_pb2_grpc.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/proto/recorddict_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/proto/run_pb2.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/proto/run_pb2.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/proto/run_pb2_grpc.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/proto/run_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/proto/serverappio_pb2.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/proto/serverappio_pb2.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/proto/serverappio_pb2_grpc.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/proto/serverappio_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/proto/simulationio_pb2.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/proto/simulationio_pb2.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/proto/simulationio_pb2_grpc.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/proto/simulationio_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/proto/transport_pb2.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/proto/transport_pb2.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/proto/transport_pb2_grpc.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/py.typed +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/app.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/client_manager.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/client_proxy.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/compat/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/compat/app.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/compat/app_utils.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/compat/grid_client_proxy.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/compat/legacy_context.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/criterion.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/fleet_event_log_interceptor.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/grid/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/grid/grid.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/grid/grpc_grid.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/grid/inmemory_grid.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/history.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/run_serverapp.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/server.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/server_app.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/server_config.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/serverapp/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/serverapp/app.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/serverapp_components.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/strategy/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/strategy/aggregate.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/strategy/bulyan.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/strategy/fedadagrad.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/strategy/fedadam.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/strategy/fedavg.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/strategy/fedavg_android.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/strategy/fedavgm.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/strategy/fedmedian.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/strategy/fedopt.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/strategy/fedprox.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/strategy/fedyogi.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/strategy/krum.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/strategy/qfedavg.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/strategy/strategy.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/superlink/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/superlink/fleet/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/superlink/fleet/grpc_adapter/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/superlink/fleet/grpc_rere/node_auth_server_interceptor.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/superlink/fleet/message_handler/message_handler.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/superlink/fleet/vce/vce_api.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/superlink/linkstate/in_memory_linkstate.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/superlink/linkstate/linkstate.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/superlink/linkstate/linkstate_factory.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/superlink/linkstate/sql_linkstate.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/superlink/linkstate/utils.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/superlink/serverappio/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/superlink/serverappio/serverappio_grpc.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/superlink/serverappio/serverappio_servicer.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/superlink/simulation/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/superlink/simulation/simulationio_grpc.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/superlink/simulation/simulationio_servicer.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/superlink/utils.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/typing.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/utils/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/utils/tensorboard.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/utils/validator.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/workflow/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/workflow/constant.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/workflow/default_workflows.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/serverapp/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/serverapp/exception.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/serverapp/strategy/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/serverapp/strategy/bulyan.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/serverapp/strategy/dp_adaptive_clipping.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/serverapp/strategy/dp_fixed_clipping.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/serverapp/strategy/fedadagrad.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/serverapp/strategy/fedadam.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/serverapp/strategy/fedavg.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/serverapp/strategy/fedavgm.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/serverapp/strategy/fedmedian.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/serverapp/strategy/fedopt.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/serverapp/strategy/fedprox.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/serverapp/strategy/fedtrimmedavg.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/serverapp/strategy/fedxgb_bagging.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/serverapp/strategy/fedxgb_cyclic.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/serverapp/strategy/fedyogi.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/serverapp/strategy/krum.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/serverapp/strategy/multikrum.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/serverapp/strategy/qfedavg.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/serverapp/strategy/result.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/serverapp/strategy/strategy.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/serverapp/strategy/strategy_utils.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/simulation/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/simulation/app.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/simulation/legacy_app.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/simulation/ray_transport/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/simulation/ray_transport/utils.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/simulation/run_simulation.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/simulation/simulationio_connection.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/supercore/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/supercore/address.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/supercore/app_utils.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/supercore/cli/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/supercore/cli/flower_superexec.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/supercore/constant.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/supercore/corestate/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/supercore/corestate/corestate.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/supercore/corestate/in_memory_corestate.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/supercore/corestate/sql_corestate.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/supercore/credential_store/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/supercore/credential_store/credential_store.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/supercore/credential_store/file_credential_store.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/supercore/date.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/supercore/ffs/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/supercore/ffs/disk_ffs.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/supercore/ffs/ffs.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/supercore/ffs/ffs_factory.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/supercore/grpc_health/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/supercore/grpc_health/health_server.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/supercore/grpc_health/simple_health_servicer.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/supercore/heartbeat.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/supercore/license_plugin/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/supercore/license_plugin/license_plugin.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/supercore/object_store/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/supercore/object_store/in_memory_object_store.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/supercore/object_store/object_store.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/supercore/primitives/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/supercore/primitives/asymmetric.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/supercore/primitives/asymmetric_ed25519.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/supercore/sql_mixin.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/supercore/state/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/supercore/state/schema/README.md +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/supercore/state/schema/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/supercore/state/schema/corestate_tables.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/supercore/state/schema/linkstate_tables.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/supercore/state/schema/objectstore_tables.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/supercore/superexec/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/supercore/superexec/plugin/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/supercore/superexec/plugin/base_exec_plugin.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/supercore/superexec/plugin/clientapp_exec_plugin.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/supercore/superexec/plugin/exec_plugin.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/supercore/superexec/plugin/serverapp_exec_plugin.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/supercore/superexec/plugin/simulation_exec_plugin.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/supercore/superexec/run_superexec.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/supercore/utils.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/supercore/version.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/superlink/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/superlink/artifact_provider/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/superlink/artifact_provider/artifact_provider.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/superlink/auth_plugin/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/superlink/auth_plugin/auth_plugin.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/superlink/auth_plugin/noop_auth_plugin.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/superlink/federation/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/superlink/federation/federation_manager.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/superlink/federation/noop_federation_manager.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/superlink/servicer/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/superlink/servicer/control/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/superlink/servicer/control/control_account_auth_interceptor.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/superlink/servicer/control/control_event_log_interceptor.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/superlink/servicer/control/control_grpc.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/superlink/servicer/control/control_license_interceptor.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/superlink/servicer/control/control_servicer.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/supernode/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/supernode/cli/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/supernode/cli/flower_supernode.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/supernode/cli/flwr_clientapp.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/supernode/nodestate/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/supernode/nodestate/in_memory_nodestate.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/supernode/nodestate/nodestate.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/supernode/nodestate/nodestate_factory.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/supernode/runtime/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/supernode/runtime/run_clientapp.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/supernode/servicer/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/supernode/servicer/clientappio/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/supernode/servicer/clientappio/clientappio_servicer.py +0 -0
- {flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/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.dev20260123
|
|
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
|
|
@@ -45,7 +45,7 @@ Requires-Dist: ray (==2.51.1) ; (python_version >= "3.10" and python_version < "
|
|
|
45
45
|
Requires-Dist: ray (==2.51.1) ; (sys_platform != "win32" and python_version == "3.13") and (extra == "simulation")
|
|
46
46
|
Requires-Dist: requests (>=2.31.0,<3.0.0)
|
|
47
47
|
Requires-Dist: rich (>=13.5.0,<14.0.0)
|
|
48
|
-
Requires-Dist: starlette (>=0.
|
|
48
|
+
Requires-Dist: starlette (>=0.47.2,<0.48.0) ; extra == "rest"
|
|
49
49
|
Requires-Dist: tomli (>=2.0.1,<3.0.0)
|
|
50
50
|
Requires-Dist: tomli-w (>=1.0.0,<2.0.0)
|
|
51
51
|
Requires-Dist: typer (>=0.12.5,<0.21.0)
|
{flwr_nightly-1.26.0.dev20260122 → flwr_nightly-1.26.0.dev20260123}/py/flwr/cli/config_utils.py
RENAMED
|
@@ -114,57 +114,6 @@ def load(toml_path: Path) -> dict[str, Any] | None:
|
|
|
114
114
|
return None
|
|
115
115
|
|
|
116
116
|
|
|
117
|
-
def process_loaded_project_config(
|
|
118
|
-
config: dict[str, Any] | None, errors: list[str], warnings: list[str]
|
|
119
|
-
) -> dict[str, Any]:
|
|
120
|
-
"""Process and return the loaded project configuration.
|
|
121
|
-
|
|
122
|
-
This function handles errors and warnings from the `load_and_validate` function,
|
|
123
|
-
exits on critical issues, and returns the validated configuration.
|
|
124
|
-
|
|
125
|
-
Parameters
|
|
126
|
-
----------
|
|
127
|
-
config : dict[str, Any] | None
|
|
128
|
-
The loaded configuration dictionary, or None if loading failed.
|
|
129
|
-
errors : list[str]
|
|
130
|
-
List of error messages from validation.
|
|
131
|
-
warnings : list[str]
|
|
132
|
-
List of warning messages from validation.
|
|
133
|
-
|
|
134
|
-
Returns
|
|
135
|
-
-------
|
|
136
|
-
dict[str, Any]
|
|
137
|
-
The validated configuration dictionary.
|
|
138
|
-
|
|
139
|
-
Raises
|
|
140
|
-
------
|
|
141
|
-
typer.Exit
|
|
142
|
-
If config is None or contains critical errors.
|
|
143
|
-
"""
|
|
144
|
-
if config is None:
|
|
145
|
-
typer.secho(
|
|
146
|
-
"Project configuration could not be loaded.\n"
|
|
147
|
-
"pyproject.toml is invalid:\n"
|
|
148
|
-
+ "\n".join([f"- {line}" for line in errors]),
|
|
149
|
-
fg=typer.colors.RED,
|
|
150
|
-
bold=True,
|
|
151
|
-
err=True,
|
|
152
|
-
)
|
|
153
|
-
raise typer.Exit(code=1)
|
|
154
|
-
|
|
155
|
-
if warnings:
|
|
156
|
-
typer.secho(
|
|
157
|
-
"Project configuration is missing the following "
|
|
158
|
-
"recommended properties:\n" + "\n".join([f"- {line}" for line in warnings]),
|
|
159
|
-
fg=typer.colors.RED,
|
|
160
|
-
bold=True,
|
|
161
|
-
)
|
|
162
|
-
|
|
163
|
-
typer.secho("Success", fg=typer.colors.GREEN)
|
|
164
|
-
|
|
165
|
-
return config
|
|
166
|
-
|
|
167
|
-
|
|
168
117
|
def validate_federation_in_project_config(
|
|
169
118
|
federation: str | None,
|
|
170
119
|
config: dict[str, Any],
|
|
@@ -229,61 +178,6 @@ def validate_federation_in_project_config(
|
|
|
229
178
|
return federation, federation_config
|
|
230
179
|
|
|
231
180
|
|
|
232
|
-
def validate_certificate_in_federation_config(
|
|
233
|
-
app: Path, federation_config: dict[str, Any]
|
|
234
|
-
) -> tuple[bool, bytes | None]:
|
|
235
|
-
"""Validate the certificates in the Flower project configuration.
|
|
236
|
-
|
|
237
|
-
Accepted configurations:
|
|
238
|
-
1. TLS enabled and gRPC will load(*) the trusted certificate bundle:
|
|
239
|
-
- Only `address` is provided. `root-certificates` and `insecure` not set.
|
|
240
|
-
- `address` is provided and `insecure` set to `false`. `root-certificates` not
|
|
241
|
-
set.
|
|
242
|
-
(*)gRPC uses a multi-step fallback mechanism to load the trusted certificate
|
|
243
|
-
bundle in the following sequence:
|
|
244
|
-
a. A configured file path (if set via configuration or environment),
|
|
245
|
-
b. An override callback (if registered via
|
|
246
|
-
`grpc_set_ssl_roots_override_callback`),
|
|
247
|
-
c. The OS trust store (if available),
|
|
248
|
-
d. A bundled default certificate file.
|
|
249
|
-
2. TLS enabled with self-signed certificates:
|
|
250
|
-
- `address` and `root-certificates` are provided. `insecure` not set.
|
|
251
|
-
- `address` and `root-certificates` are provided. `insecure` set to `false`.
|
|
252
|
-
3. TLS disabled. This is not recommended and should only be used for prototyping:
|
|
253
|
-
- `address` is provided and `insecure = true`. If `root-certificates` is
|
|
254
|
-
set, exit with an error.
|
|
255
|
-
"""
|
|
256
|
-
insecure = get_insecure_flag(federation_config)
|
|
257
|
-
|
|
258
|
-
# Process root certificates
|
|
259
|
-
if root_certificates := federation_config.get("root-certificates"):
|
|
260
|
-
if insecure:
|
|
261
|
-
typer.secho(
|
|
262
|
-
"❌ `root-certificates` were provided but the `insecure` parameter "
|
|
263
|
-
"is set to `True`.",
|
|
264
|
-
fg=typer.colors.RED,
|
|
265
|
-
bold=True,
|
|
266
|
-
err=True,
|
|
267
|
-
)
|
|
268
|
-
raise typer.Exit(code=1)
|
|
269
|
-
|
|
270
|
-
# TLS is enabled with self-signed certificates: attempt to read the file
|
|
271
|
-
try:
|
|
272
|
-
root_certificates_bytes = (app / root_certificates).read_bytes()
|
|
273
|
-
except Exception as e:
|
|
274
|
-
typer.secho(
|
|
275
|
-
f"❌ Failed to read certificate file `{root_certificates}`: {e}",
|
|
276
|
-
fg=typer.colors.RED,
|
|
277
|
-
bold=True,
|
|
278
|
-
err=True,
|
|
279
|
-
)
|
|
280
|
-
raise typer.Exit(code=1) from e
|
|
281
|
-
else:
|
|
282
|
-
root_certificates_bytes = None
|
|
283
|
-
|
|
284
|
-
return insecure, root_certificates_bytes
|
|
285
|
-
|
|
286
|
-
|
|
287
181
|
def load_certificate_in_connection(
|
|
288
182
|
connection: SuperLinkConnection,
|
|
289
183
|
) -> bytes | None:
|
|
@@ -336,32 +230,6 @@ def load_certificate_in_connection(
|
|
|
336
230
|
return root_certificates_bytes
|
|
337
231
|
|
|
338
232
|
|
|
339
|
-
def exit_if_no_address(federation_config: dict[str, Any], cmd: str) -> None:
|
|
340
|
-
"""Exit if the provided federation_config has no "address" key.
|
|
341
|
-
|
|
342
|
-
Parameters
|
|
343
|
-
----------
|
|
344
|
-
federation_config : dict[str, Any]
|
|
345
|
-
The federation configuration dictionary to check.
|
|
346
|
-
cmd : str
|
|
347
|
-
The command name to display in the error message.
|
|
348
|
-
|
|
349
|
-
Raises
|
|
350
|
-
------
|
|
351
|
-
typer.Exit
|
|
352
|
-
If 'address' key is not present in federation_config.
|
|
353
|
-
"""
|
|
354
|
-
if "address" not in federation_config:
|
|
355
|
-
typer.secho(
|
|
356
|
-
f"❌ `flwr {cmd}` currently works with a SuperLink. Ensure that the "
|
|
357
|
-
"correct SuperLink (Control API) address is provided in `pyproject.toml`.",
|
|
358
|
-
fg=typer.colors.RED,
|
|
359
|
-
bold=True,
|
|
360
|
-
err=True,
|
|
361
|
-
)
|
|
362
|
-
raise typer.Exit(code=1)
|
|
363
|
-
|
|
364
|
-
|
|
365
233
|
def get_insecure_flag(federation_config: dict[str, Any]) -> bool:
|
|
366
234
|
"""Extract and validate the `insecure` flag from the federation configuration.
|
|
367
235
|
|
|
@@ -20,7 +20,7 @@ import json
|
|
|
20
20
|
from collections.abc import Callable, Iterable, Iterator
|
|
21
21
|
from contextlib import contextmanager
|
|
22
22
|
from pathlib import Path
|
|
23
|
-
from typing import
|
|
23
|
+
from typing import cast
|
|
24
24
|
|
|
25
25
|
import click
|
|
26
26
|
import grpc
|
|
@@ -50,10 +50,7 @@ from flwr.supercore.credential_store import get_credential_store
|
|
|
50
50
|
|
|
51
51
|
from .auth_plugin import CliAuthPlugin, get_cli_plugin_class
|
|
52
52
|
from .cli_account_auth_interceptor import CliAccountAuthInterceptor
|
|
53
|
-
from .config_utils import
|
|
54
|
-
load_certificate_in_connection,
|
|
55
|
-
validate_certificate_in_federation_config,
|
|
56
|
-
)
|
|
53
|
+
from .config_utils import load_certificate_in_connection
|
|
57
54
|
from .constant import AUTHN_TYPE_STORE_KEY
|
|
58
55
|
|
|
59
56
|
|
|
@@ -197,18 +194,6 @@ def get_authn_type(host: str) -> str:
|
|
|
197
194
|
return authn_type.decode("utf-8")
|
|
198
195
|
|
|
199
196
|
|
|
200
|
-
def load_cli_auth_plugin(
|
|
201
|
-
root_dir: Path,
|
|
202
|
-
federation: str,
|
|
203
|
-
federation_config: dict[str, Any],
|
|
204
|
-
authn_type: str | None = None,
|
|
205
|
-
) -> CliAuthPlugin:
|
|
206
|
-
"""."""
|
|
207
|
-
raise RuntimeError(
|
|
208
|
-
"Deprecated function. Use `load_cli_auth_plugin_from_connection`"
|
|
209
|
-
)
|
|
210
|
-
|
|
211
|
-
|
|
212
197
|
def load_cli_auth_plugin_from_connection(
|
|
213
198
|
host: str, authn_type: str | None = None
|
|
214
199
|
) -> CliAuthPlugin:
|
|
@@ -246,44 +231,6 @@ def load_cli_auth_plugin_from_connection(
|
|
|
246
231
|
raise typer.Exit(code=1) from None
|
|
247
232
|
|
|
248
233
|
|
|
249
|
-
def init_channel(
|
|
250
|
-
app: Path, federation_config: dict[str, Any], auth_plugin: CliAuthPlugin
|
|
251
|
-
) -> grpc.Channel:
|
|
252
|
-
"""Initialize gRPC channel to the Control API.
|
|
253
|
-
|
|
254
|
-
Parameters
|
|
255
|
-
----------
|
|
256
|
-
app : Path
|
|
257
|
-
Path to the Flower app directory.
|
|
258
|
-
federation_config : dict[str, Any]
|
|
259
|
-
Federation configuration dictionary containing address and TLS settings.
|
|
260
|
-
auth_plugin : CliAuthPlugin
|
|
261
|
-
Authentication plugin instance for handling credentials.
|
|
262
|
-
|
|
263
|
-
Returns
|
|
264
|
-
-------
|
|
265
|
-
grpc.Channel
|
|
266
|
-
Configured gRPC channel with authentication interceptors.
|
|
267
|
-
"""
|
|
268
|
-
insecure, root_certificates_bytes = validate_certificate_in_federation_config(
|
|
269
|
-
app, federation_config
|
|
270
|
-
)
|
|
271
|
-
|
|
272
|
-
# Load tokens
|
|
273
|
-
auth_plugin.load_tokens()
|
|
274
|
-
|
|
275
|
-
# Create the gRPC channel
|
|
276
|
-
channel = create_channel(
|
|
277
|
-
server_address=federation_config["address"],
|
|
278
|
-
insecure=insecure,
|
|
279
|
-
root_certificates=root_certificates_bytes,
|
|
280
|
-
max_message_length=GRPC_MAX_MESSAGE_LENGTH,
|
|
281
|
-
interceptors=[CliAccountAuthInterceptor(auth_plugin)],
|
|
282
|
-
)
|
|
283
|
-
channel.subscribe(on_channel_state_change)
|
|
284
|
-
return channel
|
|
285
|
-
|
|
286
|
-
|
|
287
234
|
def require_superlink_address(connection: SuperLinkConnection) -> str:
|
|
288
235
|
"""Return the SuperLink address or exit if it is not configured."""
|
|
289
236
|
if connection.address is None:
|
|
@@ -19,12 +19,10 @@ from .in_memory_linkstate import InMemoryLinkState as InMemoryLinkState
|
|
|
19
19
|
from .linkstate import LinkState as LinkState
|
|
20
20
|
from .linkstate_factory import LinkStateFactory as LinkStateFactory
|
|
21
21
|
from .sql_linkstate import SqlLinkState as SqlLinkState
|
|
22
|
-
from .sqlite_linkstate import SqliteLinkState as SqliteLinkState
|
|
23
22
|
|
|
24
23
|
__all__ = [
|
|
25
24
|
"InMemoryLinkState",
|
|
26
25
|
"LinkState",
|
|
27
26
|
"LinkStateFactory",
|
|
28
27
|
"SqlLinkState",
|
|
29
|
-
"SqliteLinkState",
|
|
30
28
|
]
|
|
@@ -22,7 +22,7 @@ from flwr.supercore.constant import FLWR_IN_MEMORY_DB_NAME
|
|
|
22
22
|
|
|
23
23
|
from .in_memory_object_store import InMemoryObjectStore
|
|
24
24
|
from .object_store import ObjectStore
|
|
25
|
-
from .
|
|
25
|
+
from .sql_object_store import SqlObjectStore
|
|
26
26
|
|
|
27
27
|
|
|
28
28
|
class ObjectStoreFactory:
|
|
@@ -56,8 +56,8 @@ class ObjectStoreFactory:
|
|
|
56
56
|
log(DEBUG, "Using InMemoryObjectStore")
|
|
57
57
|
return self.store_instance
|
|
58
58
|
|
|
59
|
-
#
|
|
60
|
-
store =
|
|
59
|
+
# SqlObjectStore
|
|
60
|
+
store = SqlObjectStore(self.database)
|
|
61
61
|
store.initialize()
|
|
62
|
-
log(DEBUG, "Using
|
|
62
|
+
log(DEBUG, "Using SqlObjectStore")
|
|
63
63
|
return store
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Copyright
|
|
1
|
+
# Copyright 2026 Flower Labs GmbH. All Rights Reserved.
|
|
2
2
|
#
|
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
4
|
# you may not use this file except in compliance with the License.
|
|
@@ -12,10 +12,10 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
# ==============================================================================
|
|
15
|
-
"""Flower
|
|
15
|
+
"""Flower SQLAlchemy-based ObjectStore implementation."""
|
|
16
16
|
|
|
17
17
|
|
|
18
|
-
from
|
|
18
|
+
from sqlalchemy import MetaData
|
|
19
19
|
|
|
20
20
|
from flwr.common.inflatable import (
|
|
21
21
|
get_object_id,
|
|
@@ -24,52 +24,23 @@ from flwr.common.inflatable import (
|
|
|
24
24
|
)
|
|
25
25
|
from flwr.common.inflatable_utils import validate_object_content
|
|
26
26
|
from flwr.proto.message_pb2 import ObjectTree # pylint: disable=E0611
|
|
27
|
-
from flwr.supercore.
|
|
27
|
+
from flwr.supercore.sql_mixin import SqlMixin
|
|
28
|
+
from flwr.supercore.state.schema.objectstore_tables import create_objectstore_metadata
|
|
28
29
|
from flwr.supercore.utils import uint64_to_int64
|
|
29
30
|
|
|
30
31
|
from .object_store import NoObjectInStoreError, ObjectStore
|
|
31
32
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
content BLOB,
|
|
36
|
-
is_available INTEGER NOT NULL CHECK (is_available IN (0,1)),
|
|
37
|
-
ref_count INTEGER NOT NULL
|
|
38
|
-
);
|
|
39
|
-
"""
|
|
40
|
-
SQL_CREATE_OBJECT_CHILDREN = """
|
|
41
|
-
CREATE TABLE IF NOT EXISTS object_children (
|
|
42
|
-
parent_id TEXT NOT NULL,
|
|
43
|
-
child_id TEXT NOT NULL,
|
|
44
|
-
FOREIGN KEY (parent_id) REFERENCES objects(object_id) ON DELETE CASCADE,
|
|
45
|
-
FOREIGN KEY (child_id) REFERENCES objects(object_id) ON DELETE CASCADE,
|
|
46
|
-
PRIMARY KEY (parent_id, child_id)
|
|
47
|
-
);
|
|
48
|
-
"""
|
|
49
|
-
SQL_CREATE_RUN_OBJECTS = """
|
|
50
|
-
CREATE TABLE IF NOT EXISTS run_objects (
|
|
51
|
-
run_id INTEGER NOT NULL,
|
|
52
|
-
object_id TEXT NOT NULL,
|
|
53
|
-
FOREIGN KEY (object_id) REFERENCES objects(object_id) ON DELETE CASCADE,
|
|
54
|
-
PRIMARY KEY (run_id, object_id)
|
|
55
|
-
);
|
|
56
|
-
"""
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
class SqliteObjectStore(ObjectStore, SqliteMixin):
|
|
60
|
-
"""SQLite-based implementation of the ObjectStore interface."""
|
|
33
|
+
|
|
34
|
+
class SqlObjectStore(ObjectStore, SqlMixin):
|
|
35
|
+
"""SQLAlchemy-based implementation of the ObjectStore interface."""
|
|
61
36
|
|
|
62
37
|
def __init__(self, database_path: str, verify: bool = True) -> None:
|
|
63
38
|
super().__init__(database_path)
|
|
64
39
|
self.verify = verify
|
|
65
40
|
|
|
66
|
-
def
|
|
67
|
-
"""Return
|
|
68
|
-
return (
|
|
69
|
-
SQL_CREATE_OBJECTS,
|
|
70
|
-
SQL_CREATE_OBJECT_CHILDREN,
|
|
71
|
-
SQL_CREATE_RUN_OBJECTS,
|
|
72
|
-
)
|
|
41
|
+
def get_metadata(self) -> MetaData:
|
|
42
|
+
"""Return SQLAlchemy MetaData for ObjectStore tables."""
|
|
43
|
+
return create_objectstore_metadata()
|
|
73
44
|
|
|
74
45
|
def preregister(self, run_id: int, object_tree: ObjectTree) -> list[str]:
|
|
75
46
|
"""Identify and preregister missing objects in the `ObjectStore`."""
|
|
@@ -80,56 +51,64 @@ class SqliteObjectStore(ObjectStore, SqliteMixin):
|
|
|
80
51
|
raise ValueError(f"Invalid object ID format: {obj_id}")
|
|
81
52
|
|
|
82
53
|
child_ids = [child.object_id for child in tree_node.children]
|
|
83
|
-
with self.
|
|
84
|
-
|
|
85
|
-
"SELECT object_id, is_available FROM objects
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
54
|
+
with self.session():
|
|
55
|
+
rows = self.query(
|
|
56
|
+
"SELECT object_id, is_available FROM objects "
|
|
57
|
+
"WHERE object_id = :object_id",
|
|
58
|
+
{"object_id": obj_id},
|
|
59
|
+
)
|
|
60
|
+
if not rows:
|
|
89
61
|
# Insert new object
|
|
90
|
-
self.
|
|
91
|
-
"INSERT INTO objects"
|
|
62
|
+
self.query(
|
|
63
|
+
"INSERT INTO objects "
|
|
92
64
|
"(object_id, content, is_available, ref_count) "
|
|
93
|
-
"VALUES (
|
|
94
|
-
|
|
65
|
+
"VALUES (:object_id, :content, :is_available, :ref_count)",
|
|
66
|
+
{
|
|
67
|
+
"object_id": obj_id,
|
|
68
|
+
"content": b"",
|
|
69
|
+
"is_available": 0,
|
|
70
|
+
"ref_count": 0,
|
|
71
|
+
},
|
|
95
72
|
)
|
|
96
73
|
for cid in child_ids:
|
|
97
|
-
self.
|
|
98
|
-
"INSERT INTO object_children(parent_id, child_id) "
|
|
99
|
-
"VALUES (
|
|
100
|
-
|
|
74
|
+
self.query(
|
|
75
|
+
"INSERT INTO object_children (parent_id, child_id) "
|
|
76
|
+
"VALUES (:parent_id, :child_id)",
|
|
77
|
+
{"parent_id": obj_id, "child_id": cid},
|
|
101
78
|
)
|
|
102
|
-
self.
|
|
79
|
+
self.query(
|
|
103
80
|
"UPDATE objects SET ref_count = ref_count + 1 "
|
|
104
|
-
"WHERE object_id =
|
|
105
|
-
|
|
81
|
+
"WHERE object_id = :object_id",
|
|
82
|
+
{"object_id": cid},
|
|
106
83
|
)
|
|
107
84
|
new_objects.append(obj_id)
|
|
108
85
|
else:
|
|
109
86
|
# Add to the list of new objects if not available
|
|
110
|
-
if not
|
|
87
|
+
if not rows[0]["is_available"]:
|
|
111
88
|
new_objects.append(obj_id)
|
|
112
89
|
|
|
113
90
|
# Ensure run mapping
|
|
114
|
-
self.
|
|
115
|
-
"INSERT
|
|
116
|
-
"VALUES (
|
|
117
|
-
|
|
91
|
+
self.query(
|
|
92
|
+
"INSERT INTO run_objects (run_id, object_id) "
|
|
93
|
+
"VALUES (:run_id, :object_id) ON CONFLICT DO NOTHING",
|
|
94
|
+
{"run_id": uint64_to_int64(run_id), "object_id": obj_id},
|
|
118
95
|
)
|
|
119
96
|
return new_objects
|
|
120
97
|
|
|
121
98
|
def get_object_tree(self, object_id: str) -> ObjectTree:
|
|
122
99
|
"""Get the object tree for a given object ID."""
|
|
123
|
-
with self.
|
|
124
|
-
|
|
125
|
-
"SELECT object_id FROM objects WHERE object_id
|
|
126
|
-
|
|
127
|
-
|
|
100
|
+
with self.session():
|
|
101
|
+
rows = self.query(
|
|
102
|
+
"SELECT object_id FROM objects WHERE object_id = :object_id",
|
|
103
|
+
{"object_id": object_id},
|
|
104
|
+
)
|
|
105
|
+
if not rows:
|
|
128
106
|
raise NoObjectInStoreError(
|
|
129
107
|
f"Object {object_id} was not pre-registered."
|
|
130
108
|
)
|
|
131
109
|
children = self.query(
|
|
132
|
-
"SELECT child_id FROM object_children WHERE parent_id
|
|
110
|
+
"SELECT child_id FROM object_children WHERE parent_id = :parent_id",
|
|
111
|
+
{"parent_id": object_id},
|
|
133
112
|
)
|
|
134
113
|
|
|
135
114
|
# Build the object trees of all children
|
|
@@ -157,61 +136,71 @@ class SqliteObjectStore(ObjectStore, SqliteMixin):
|
|
|
157
136
|
# Validate object content
|
|
158
137
|
validate_object_content(content=object_content)
|
|
159
138
|
|
|
160
|
-
with self.
|
|
139
|
+
with self.session():
|
|
161
140
|
# Only allow adding the object if it has been preregistered
|
|
162
|
-
|
|
163
|
-
"SELECT is_available FROM objects WHERE object_id
|
|
164
|
-
|
|
165
|
-
|
|
141
|
+
rows = self.query(
|
|
142
|
+
"SELECT is_available FROM objects WHERE object_id = :object_id",
|
|
143
|
+
{"object_id": object_id},
|
|
144
|
+
)
|
|
145
|
+
if not rows:
|
|
166
146
|
raise NoObjectInStoreError(
|
|
167
147
|
f"Object with ID '{object_id}' was not pre-registered."
|
|
168
148
|
)
|
|
169
149
|
|
|
170
150
|
# Return if object is already present in the store
|
|
171
|
-
if
|
|
151
|
+
if rows[0]["is_available"]:
|
|
172
152
|
return
|
|
173
153
|
|
|
174
154
|
# Update the object entry in the store
|
|
175
|
-
self.
|
|
176
|
-
"UPDATE objects SET content
|
|
177
|
-
|
|
155
|
+
self.query(
|
|
156
|
+
"UPDATE objects SET content = :content, is_available = 1 "
|
|
157
|
+
"WHERE object_id = :object_id",
|
|
158
|
+
{"content": object_content, "object_id": object_id},
|
|
178
159
|
)
|
|
179
160
|
|
|
180
161
|
def get(self, object_id: str) -> bytes | None:
|
|
181
162
|
"""Get an object from the store."""
|
|
182
|
-
rows = self.query(
|
|
163
|
+
rows = self.query(
|
|
164
|
+
"SELECT content FROM objects WHERE object_id = :oid", {"oid": object_id}
|
|
165
|
+
)
|
|
183
166
|
return rows[0]["content"] if rows else None
|
|
184
167
|
|
|
185
168
|
def delete(self, object_id: str) -> None:
|
|
186
169
|
"""Delete an object and its unreferenced descendants from the store."""
|
|
187
|
-
with self.
|
|
188
|
-
|
|
189
|
-
"SELECT ref_count FROM objects WHERE object_id
|
|
190
|
-
|
|
170
|
+
with self.session():
|
|
171
|
+
rows = self.query(
|
|
172
|
+
"SELECT ref_count FROM objects WHERE object_id = :object_id",
|
|
173
|
+
{"object_id": object_id},
|
|
174
|
+
)
|
|
191
175
|
|
|
192
176
|
# If the object is not in the store, nothing to delete
|
|
193
|
-
if
|
|
177
|
+
if not rows:
|
|
194
178
|
return
|
|
195
179
|
|
|
196
180
|
# Skip deletion if there are still references
|
|
197
|
-
if
|
|
181
|
+
if rows[0]["ref_count"] > 0:
|
|
198
182
|
return
|
|
199
183
|
|
|
200
184
|
# Deleting will cascade via FK, but we need to decrement children first
|
|
201
|
-
children = self.
|
|
202
|
-
"SELECT child_id FROM object_children WHERE parent_id
|
|
203
|
-
|
|
185
|
+
children = self.query(
|
|
186
|
+
"SELECT child_id FROM object_children WHERE parent_id = :parent_id",
|
|
187
|
+
{"parent_id": object_id},
|
|
188
|
+
)
|
|
204
189
|
child_ids = [child["child_id"] for child in children]
|
|
205
190
|
|
|
206
191
|
if child_ids:
|
|
207
|
-
placeholders = ", ".join("
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
192
|
+
placeholders = ", ".join(f":cid{i}" for i in range(len(child_ids)))
|
|
193
|
+
params = {f"cid{i}": cid for i, cid in enumerate(child_ids)}
|
|
194
|
+
self.query(
|
|
195
|
+
"UPDATE objects SET ref_count = ref_count - 1 "
|
|
196
|
+
f"WHERE object_id IN ({placeholders})",
|
|
197
|
+
params,
|
|
198
|
+
)
|
|
213
199
|
|
|
214
|
-
self.
|
|
200
|
+
self.query(
|
|
201
|
+
"DELETE FROM objects WHERE object_id = :object_id",
|
|
202
|
+
{"object_id": object_id},
|
|
203
|
+
)
|
|
215
204
|
|
|
216
205
|
# Recursively clean children
|
|
217
206
|
for child_id in child_ids:
|
|
@@ -220,34 +209,39 @@ class SqliteObjectStore(ObjectStore, SqliteMixin):
|
|
|
220
209
|
def delete_objects_in_run(self, run_id: int) -> None:
|
|
221
210
|
"""Delete all objects that were registered in a specific run."""
|
|
222
211
|
run_id_sint = uint64_to_int64(run_id)
|
|
223
|
-
with self.
|
|
224
|
-
objs = self.
|
|
225
|
-
"SELECT object_id FROM run_objects WHERE run_id
|
|
226
|
-
|
|
212
|
+
with self.session():
|
|
213
|
+
objs = self.query(
|
|
214
|
+
"SELECT object_id FROM run_objects WHERE run_id = :run_id",
|
|
215
|
+
{"run_id": run_id_sint},
|
|
216
|
+
)
|
|
227
217
|
for obj in objs:
|
|
228
218
|
object_id = obj["object_id"]
|
|
229
|
-
|
|
230
|
-
"SELECT ref_count FROM objects WHERE object_id
|
|
231
|
-
|
|
232
|
-
|
|
219
|
+
rows = self.query(
|
|
220
|
+
"SELECT ref_count FROM objects WHERE object_id=:object_id",
|
|
221
|
+
{"object_id": object_id},
|
|
222
|
+
)
|
|
223
|
+
if rows and rows[0]["ref_count"] == 0:
|
|
233
224
|
self.delete(object_id)
|
|
234
|
-
self.
|
|
225
|
+
self.query(
|
|
226
|
+
"DELETE FROM run_objects WHERE run_id = :run_id",
|
|
227
|
+
{"run_id": run_id_sint},
|
|
228
|
+
)
|
|
235
229
|
|
|
236
230
|
def clear(self) -> None:
|
|
237
231
|
"""Clear the store."""
|
|
238
|
-
with self.
|
|
239
|
-
self.
|
|
240
|
-
self.
|
|
241
|
-
self.
|
|
232
|
+
with self.session():
|
|
233
|
+
self.query("DELETE FROM object_children")
|
|
234
|
+
self.query("DELETE FROM run_objects")
|
|
235
|
+
self.query("DELETE FROM objects")
|
|
242
236
|
|
|
243
237
|
def __contains__(self, object_id: str) -> bool:
|
|
244
238
|
"""Check if an object_id is in the store."""
|
|
245
|
-
|
|
246
|
-
"SELECT 1 FROM objects WHERE object_id
|
|
247
|
-
)
|
|
248
|
-
return
|
|
239
|
+
rows = self.query(
|
|
240
|
+
"SELECT 1 FROM objects WHERE object_id = :oid", {"oid": object_id}
|
|
241
|
+
)
|
|
242
|
+
return len(rows) > 0
|
|
249
243
|
|
|
250
244
|
def __len__(self) -> int:
|
|
251
245
|
"""Return the number of objects in the store."""
|
|
252
|
-
|
|
253
|
-
return
|
|
246
|
+
rows = self.query("SELECT COUNT(*) AS cnt FROM objects")
|
|
247
|
+
return int(rows[0]["cnt"])
|
|
@@ -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.dev20260123"
|
|
8
8
|
description = "Flower: A Friendly Federated AI Framework"
|
|
9
9
|
license = "Apache-2.0"
|
|
10
10
|
authors = ["The Flower Authors <hello@flower.ai>"]
|
|
@@ -85,7 +85,7 @@ ray = [
|
|
|
85
85
|
{ version = "==2.51.1", optional = true, python = "==3.13", markers = "sys_platform != 'win32'" },
|
|
86
86
|
]
|
|
87
87
|
# Optional dependencies (REST transport layer)
|
|
88
|
-
starlette = { version = "^0.
|
|
88
|
+
starlette = { version = "^0.47.2", optional = true }
|
|
89
89
|
uvicorn = { version = "^0.34.0", extras = ["standard"], optional = true }
|
|
90
90
|
|
|
91
91
|
[tool.poetry.extras]
|