flwr-nightly 1.23.0.dev20250930__py3-none-any.whl → 1.26.0.dev20260121__py3-none-any.whl
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/__init__.py +17 -6
- flwr/app/__init__.py +4 -1
- flwr/app/error.py +2 -2
- flwr/app/exception.py +3 -3
- flwr/app/message_type.py +29 -0
- flwr/app/metadata.py +5 -2
- flwr/app/user_config.py +19 -0
- flwr/cli/app.py +62 -9
- flwr/cli/{new/templates/app/code → app_cmd}/__init__.py +9 -1
- flwr/cli/app_cmd/publish.py +285 -0
- flwr/cli/app_cmd/review.py +262 -0
- flwr/cli/auth_plugin/__init__.py +13 -6
- flwr/cli/auth_plugin/auth_plugin.py +26 -15
- flwr/cli/auth_plugin/noop_auth_plugin.py +101 -0
- flwr/cli/auth_plugin/oidc_cli_plugin.py +52 -32
- flwr/cli/build.py +166 -53
- flwr/cli/{cli_user_auth_interceptor.py → cli_account_auth_interceptor.py} +27 -10
- flwr/cli/config/__init__.py +21 -0
- flwr/cli/config/ls.py +104 -0
- flwr/cli/config_migration.py +300 -0
- flwr/cli/config_utils.py +154 -13
- flwr/cli/constant.py +67 -0
- flwr/cli/{new/templates/app/code/flwr_tune → federation}/__init__.py +8 -1
- flwr/cli/federation/ls.py +361 -0
- flwr/cli/flower_config.py +447 -0
- flwr/cli/install.py +91 -13
- flwr/cli/log.py +65 -36
- flwr/cli/login/login.py +41 -27
- flwr/cli/ls.py +232 -158
- flwr/cli/new/new.py +188 -244
- flwr/cli/pull.py +25 -34
- flwr/cli/run/run.py +106 -74
- flwr/cli/run_utils.py +148 -0
- flwr/cli/stop.py +46 -37
- flwr/cli/supernode/__init__.py +25 -0
- flwr/cli/supernode/ls.py +273 -0
- flwr/cli/supernode/register.py +190 -0
- flwr/cli/supernode/unregister.py +140 -0
- flwr/cli/typing.py +211 -0
- flwr/cli/utils.py +428 -80
- flwr/client/__init__.py +2 -1
- flwr/client/dpfedavg_numpy_client.py +4 -1
- flwr/client/grpc_adapter_client/connection.py +14 -17
- flwr/client/grpc_rere_client/connection.py +73 -43
- flwr/client/grpc_rere_client/grpc_adapter.py +35 -15
- flwr/client/grpc_rere_client/{client_interceptor.py → node_auth_client_interceptor.py} +5 -7
- flwr/client/message_handler/message_handler.py +4 -3
- flwr/client/mod/centraldp_mods.py +1 -1
- flwr/client/mod/localdp_mod.py +1 -1
- flwr/client/mod/secure_aggregation/secaggplus_mod.py +11 -9
- flwr/client/numpy_client.py +1 -1
- flwr/client/rest_client/connection.py +99 -54
- flwr/client/run_info_store.py +6 -6
- flwr/client/typing.py +1 -1
- flwr/clientapp/__init__.py +1 -2
- flwr/{client → clientapp}/client_app.py +11 -11
- flwr/clientapp/mod/centraldp_mods.py +16 -17
- flwr/clientapp/mod/localdp_mod.py +8 -9
- flwr/clientapp/typing.py +1 -1
- flwr/{client/clientapp → clientapp}/utils.py +4 -4
- flwr/common/__init__.py +3 -2
- flwr/common/args.py +3 -4
- flwr/common/config.py +15 -17
- flwr/common/constant.py +56 -28
- flwr/common/context.py +2 -1
- flwr/common/differential_privacy.py +3 -4
- flwr/common/event_log_plugin/event_log_plugin.py +3 -4
- flwr/common/exit/exit.py +16 -3
- flwr/common/exit/exit_code.py +39 -10
- flwr/common/exit/exit_handler.py +6 -2
- flwr/common/exit/signal_handler.py +5 -5
- flwr/common/grpc.py +8 -7
- flwr/common/inflatable_protobuf_utils.py +1 -1
- flwr/common/inflatable_utils.py +48 -31
- flwr/common/logger.py +19 -19
- flwr/common/message.py +5 -5
- flwr/common/object_ref.py +7 -7
- flwr/common/record/array.py +6 -6
- flwr/common/record/arrayrecord.py +18 -21
- flwr/common/record/configrecord.py +3 -3
- flwr/common/record/recorddict.py +5 -5
- flwr/common/record/typeddict.py +9 -2
- flwr/common/recorddict_compat.py +7 -10
- flwr/common/retry_invoker.py +20 -20
- flwr/common/secure_aggregation/crypto/symmetric_encryption.py +1 -89
- flwr/common/secure_aggregation/ndarrays_arithmetic.py +8 -5
- flwr/common/serde.py +22 -11
- flwr/common/serde_utils.py +2 -2
- flwr/common/telemetry.py +10 -6
- flwr/common/typing.py +65 -44
- flwr/compat/client/app.py +45 -47
- flwr/compat/client/grpc_client/connection.py +15 -14
- flwr/compat/common/constant.py +29 -0
- flwr/compat/server/app.py +6 -7
- flwr/proto/appio_pb2.py +13 -3
- flwr/proto/appio_pb2.pyi +134 -65
- flwr/proto/appio_pb2_grpc.py +20 -0
- flwr/proto/appio_pb2_grpc.pyi +27 -0
- flwr/proto/clientappio_pb2.py +17 -7
- flwr/proto/clientappio_pb2.pyi +15 -0
- flwr/proto/clientappio_pb2_grpc.py +206 -40
- flwr/proto/clientappio_pb2_grpc.pyi +168 -53
- flwr/proto/control_pb2.py +72 -40
- flwr/proto/control_pb2.pyi +319 -87
- flwr/proto/control_pb2_grpc.py +339 -28
- flwr/proto/control_pb2_grpc.pyi +209 -37
- flwr/proto/error_pb2.py +13 -3
- flwr/proto/error_pb2.pyi +24 -6
- flwr/proto/error_pb2_grpc.py +20 -0
- flwr/proto/error_pb2_grpc.pyi +27 -0
- flwr/proto/fab_pb2.py +24 -10
- flwr/proto/fab_pb2.pyi +68 -20
- flwr/proto/fab_pb2_grpc.py +20 -0
- flwr/proto/fab_pb2_grpc.pyi +27 -0
- flwr/proto/federation_pb2.py +38 -0
- flwr/proto/federation_pb2.pyi +56 -0
- flwr/proto/federation_pb2_grpc.py +24 -0
- flwr/proto/federation_pb2_grpc.pyi +31 -0
- flwr/proto/fleet_pb2.py +45 -27
- flwr/proto/fleet_pb2.pyi +190 -70
- flwr/proto/fleet_pb2_grpc.py +277 -66
- flwr/proto/fleet_pb2_grpc.pyi +201 -55
- flwr/proto/grpcadapter_pb2.py +14 -4
- flwr/proto/grpcadapter_pb2.pyi +38 -16
- flwr/proto/grpcadapter_pb2_grpc.py +35 -4
- flwr/proto/grpcadapter_pb2_grpc.pyi +38 -7
- flwr/proto/heartbeat_pb2.py +17 -7
- flwr/proto/heartbeat_pb2.pyi +51 -22
- flwr/proto/heartbeat_pb2_grpc.py +20 -0
- flwr/proto/heartbeat_pb2_grpc.pyi +27 -0
- flwr/proto/log_pb2.py +13 -3
- flwr/proto/log_pb2.pyi +34 -11
- flwr/proto/log_pb2_grpc.py +20 -0
- flwr/proto/log_pb2_grpc.pyi +27 -0
- flwr/proto/message_pb2.py +15 -5
- flwr/proto/message_pb2.pyi +154 -86
- flwr/proto/message_pb2_grpc.py +20 -0
- flwr/proto/message_pb2_grpc.pyi +27 -0
- flwr/proto/node_pb2.py +16 -4
- flwr/proto/node_pb2.pyi +77 -4
- flwr/proto/node_pb2_grpc.py +20 -0
- flwr/proto/node_pb2_grpc.pyi +27 -0
- flwr/proto/recorddict_pb2.py +13 -3
- flwr/proto/recorddict_pb2.pyi +184 -107
- flwr/proto/recorddict_pb2_grpc.py +20 -0
- flwr/proto/recorddict_pb2_grpc.pyi +27 -0
- flwr/proto/run_pb2.py +40 -31
- flwr/proto/run_pb2.pyi +158 -84
- flwr/proto/run_pb2_grpc.py +20 -0
- flwr/proto/run_pb2_grpc.pyi +27 -0
- flwr/proto/serverappio_pb2.py +13 -3
- flwr/proto/serverappio_pb2.pyi +32 -8
- flwr/proto/serverappio_pb2_grpc.py +246 -65
- flwr/proto/serverappio_pb2_grpc.pyi +221 -85
- flwr/proto/simulationio_pb2.py +16 -8
- flwr/proto/simulationio_pb2.pyi +15 -0
- flwr/proto/simulationio_pb2_grpc.py +162 -41
- flwr/proto/simulationio_pb2_grpc.pyi +149 -55
- flwr/proto/transport_pb2.py +20 -10
- flwr/proto/transport_pb2.pyi +249 -160
- flwr/proto/transport_pb2_grpc.py +35 -4
- flwr/proto/transport_pb2_grpc.pyi +38 -8
- flwr/server/app.py +175 -128
- flwr/server/client_manager.py +4 -5
- flwr/server/client_proxy.py +10 -11
- flwr/server/compat/app.py +4 -5
- flwr/server/compat/app_utils.py +2 -1
- flwr/server/compat/grid_client_proxy.py +12 -13
- flwr/server/compat/legacy_context.py +3 -4
- flwr/server/fleet_event_log_interceptor.py +2 -1
- flwr/server/grid/grid.py +2 -3
- flwr/server/grid/grpc_grid.py +12 -10
- flwr/server/grid/inmemory_grid.py +4 -4
- flwr/server/run_serverapp.py +2 -3
- flwr/server/server.py +34 -39
- flwr/server/server_app.py +7 -8
- flwr/server/server_config.py +1 -2
- flwr/server/serverapp/app.py +34 -28
- flwr/server/serverapp_components.py +4 -5
- flwr/server/strategy/aggregate.py +9 -8
- flwr/server/strategy/bulyan.py +13 -11
- flwr/server/strategy/dp_adaptive_clipping.py +16 -20
- flwr/server/strategy/dp_fixed_clipping.py +12 -17
- flwr/server/strategy/dpfedavg_adaptive.py +3 -4
- flwr/server/strategy/dpfedavg_fixed.py +6 -10
- flwr/server/strategy/fault_tolerant_fedavg.py +14 -13
- flwr/server/strategy/fedadagrad.py +18 -14
- flwr/server/strategy/fedadam.py +16 -14
- flwr/server/strategy/fedavg.py +16 -17
- flwr/server/strategy/fedavg_android.py +15 -15
- flwr/server/strategy/fedavgm.py +21 -18
- flwr/server/strategy/fedmedian.py +2 -3
- flwr/server/strategy/fedopt.py +11 -10
- flwr/server/strategy/fedprox.py +10 -9
- flwr/server/strategy/fedtrimmedavg.py +12 -11
- flwr/server/strategy/fedxgb_bagging.py +13 -11
- flwr/server/strategy/fedxgb_cyclic.py +6 -6
- flwr/server/strategy/fedxgb_nn_avg.py +4 -4
- flwr/server/strategy/fedyogi.py +16 -14
- flwr/server/strategy/krum.py +12 -11
- flwr/server/strategy/qfedavg.py +16 -15
- flwr/server/strategy/strategy.py +6 -9
- flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +20 -9
- flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +1 -2
- flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +3 -4
- flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +10 -12
- flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +1 -3
- flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +136 -42
- flwr/server/superlink/fleet/grpc_rere/{server_interceptor.py → node_auth_server_interceptor.py} +28 -50
- flwr/server/superlink/fleet/message_handler/message_handler.py +141 -51
- flwr/server/superlink/fleet/rest_rere/rest_api.py +54 -33
- flwr/server/superlink/fleet/vce/backend/backend.py +2 -2
- flwr/server/superlink/fleet/vce/backend/raybackend.py +6 -6
- flwr/server/superlink/fleet/vce/vce_api.py +32 -13
- flwr/server/superlink/linkstate/__init__.py +2 -0
- flwr/server/superlink/linkstate/in_memory_linkstate.py +293 -208
- flwr/server/superlink/linkstate/linkstate.py +176 -64
- flwr/server/superlink/linkstate/linkstate_factory.py +24 -6
- flwr/server/superlink/linkstate/sql_linkstate.py +221 -0
- flwr/server/superlink/linkstate/sqlite_linkstate.py +743 -648
- flwr/server/superlink/linkstate/utils.py +11 -62
- flwr/server/superlink/serverappio/serverappio_grpc.py +1 -2
- flwr/server/superlink/serverappio/serverappio_servicer.py +28 -23
- flwr/server/superlink/simulation/simulationio_grpc.py +1 -2
- flwr/server/superlink/simulation/simulationio_servicer.py +19 -14
- flwr/server/superlink/utils.py +4 -6
- flwr/server/typing.py +1 -1
- flwr/server/utils/tensorboard.py +15 -8
- flwr/server/utils/validator.py +2 -3
- flwr/server/workflow/default_workflows.py +7 -6
- flwr/server/workflow/secure_aggregation/secagg_workflow.py +2 -4
- flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +13 -11
- flwr/serverapp/strategy/bulyan.py +16 -15
- flwr/serverapp/strategy/dp_adaptive_clipping.py +12 -11
- flwr/serverapp/strategy/dp_fixed_clipping.py +11 -14
- flwr/serverapp/strategy/fedadagrad.py +10 -11
- flwr/serverapp/strategy/fedadam.py +10 -11
- flwr/serverapp/strategy/fedavg.py +10 -11
- flwr/serverapp/strategy/fedavgm.py +17 -16
- flwr/serverapp/strategy/fedmedian.py +2 -2
- flwr/serverapp/strategy/fedopt.py +10 -11
- flwr/serverapp/strategy/fedprox.py +7 -8
- flwr/serverapp/strategy/fedtrimmedavg.py +9 -9
- flwr/serverapp/strategy/fedxgb_bagging.py +3 -3
- flwr/serverapp/strategy/fedxgb_cyclic.py +10 -10
- flwr/serverapp/strategy/fedyogi.py +9 -11
- flwr/serverapp/strategy/krum.py +7 -7
- flwr/serverapp/strategy/multikrum.py +9 -9
- flwr/serverapp/strategy/qfedavg.py +17 -16
- flwr/serverapp/strategy/strategy.py +6 -9
- flwr/serverapp/strategy/strategy_utils.py +7 -8
- flwr/simulation/app.py +46 -42
- flwr/simulation/legacy_app.py +12 -12
- flwr/simulation/ray_transport/ray_actor.py +11 -12
- flwr/simulation/ray_transport/ray_client_proxy.py +14 -19
- flwr/simulation/run_simulation.py +46 -44
- flwr/simulation/simulationio_connection.py +4 -4
- flwr/{common → supercore}/address.py +1 -37
- flwr/supercore/cli/flower_superexec.py +3 -4
- flwr/supercore/constant.py +69 -0
- flwr/supercore/corestate/corestate.py +24 -3
- flwr/supercore/corestate/in_memory_corestate.py +138 -0
- flwr/supercore/corestate/sql_corestate.py +153 -0
- flwr/supercore/corestate/sqlite_corestate.py +157 -0
- flwr/supercore/credential_store/__init__.py +33 -0
- flwr/supercore/credential_store/credential_store.py +34 -0
- flwr/supercore/credential_store/file_credential_store.py +76 -0
- flwr/{common → supercore}/date.py +0 -11
- flwr/supercore/ffs/disk_ffs.py +1 -2
- flwr/supercore/ffs/ffs.py +1 -2
- flwr/supercore/ffs/ffs_factory.py +1 -2
- flwr/{common → supercore}/heartbeat.py +20 -25
- flwr/supercore/object_store/in_memory_object_store.py +1 -6
- flwr/supercore/object_store/object_store.py +1 -2
- flwr/supercore/object_store/object_store_factory.py +27 -8
- flwr/supercore/object_store/sqlite_object_store.py +253 -0
- flwr/{cli/new/templates/app → supercore/primitives}/__init__.py +1 -1
- flwr/supercore/primitives/asymmetric.py +117 -0
- flwr/supercore/primitives/asymmetric_ed25519.py +175 -0
- flwr/supercore/sql_mixin.py +292 -0
- flwr/supercore/sqlite_mixin.py +156 -0
- flwr/{client/clientapp → supercore/state}/__init__.py +2 -2
- flwr/supercore/state/schema/README.md +125 -0
- flwr/{cli/new/templates → supercore/state/schema}/__init__.py +2 -2
- flwr/supercore/state/schema/corestate_tables.py +36 -0
- flwr/supercore/state/schema/linkstate_tables.py +152 -0
- flwr/supercore/state/schema/objectstore_tables.py +90 -0
- flwr/supercore/superexec/plugin/base_exec_plugin.py +1 -2
- flwr/supercore/superexec/plugin/exec_plugin.py +3 -3
- flwr/supercore/superexec/run_superexec.py +9 -13
- flwr/supercore/utils.py +224 -0
- flwr/superlink/artifact_provider/artifact_provider.py +1 -2
- flwr/superlink/auth_plugin/__init__.py +5 -2
- flwr/superlink/auth_plugin/auth_plugin.py +20 -19
- flwr/superlink/auth_plugin/noop_auth_plugin.py +84 -0
- flwr/superlink/federation/__init__.py +24 -0
- flwr/superlink/federation/federation_manager.py +64 -0
- flwr/superlink/federation/noop_federation_manager.py +71 -0
- flwr/superlink/servicer/control/{control_user_auth_interceptor.py → control_account_auth_interceptor.py} +41 -32
- flwr/superlink/servicer/control/control_event_log_interceptor.py +7 -7
- flwr/superlink/servicer/control/control_grpc.py +20 -17
- flwr/superlink/servicer/control/control_license_interceptor.py +3 -3
- flwr/superlink/servicer/control/control_servicer.py +328 -68
- flwr/supernode/cli/flower_supernode.py +74 -26
- flwr/supernode/nodestate/in_memory_nodestate.py +121 -49
- flwr/supernode/nodestate/nodestate.py +52 -8
- flwr/supernode/nodestate/nodestate_factory.py +7 -4
- flwr/supernode/runtime/run_clientapp.py +43 -24
- flwr/supernode/servicer/clientappio/clientappio_servicer.py +48 -10
- flwr/supernode/start_client_internal.py +185 -57
- {flwr_nightly-1.23.0.dev20250930.dist-info → flwr_nightly-1.26.0.dev20260121.dist-info}/METADATA +10 -11
- flwr_nightly-1.26.0.dev20260121.dist-info/RECORD +411 -0
- flwr/cli/new/templates/app/.gitignore.tpl +0 -163
- flwr/cli/new/templates/app/LICENSE.tpl +0 -202
- flwr/cli/new/templates/app/README.baseline.md.tpl +0 -127
- flwr/cli/new/templates/app/README.flowertune.md.tpl +0 -68
- flwr/cli/new/templates/app/README.md.tpl +0 -37
- flwr/cli/new/templates/app/code/__init__.baseline.py.tpl +0 -1
- flwr/cli/new/templates/app/code/__init__.py.tpl +0 -1
- flwr/cli/new/templates/app/code/__init__.pytorch_legacy_api.py.tpl +0 -1
- flwr/cli/new/templates/app/code/client.baseline.py.tpl +0 -75
- flwr/cli/new/templates/app/code/client.huggingface.py.tpl +0 -93
- flwr/cli/new/templates/app/code/client.jax.py.tpl +0 -71
- flwr/cli/new/templates/app/code/client.mlx.py.tpl +0 -102
- flwr/cli/new/templates/app/code/client.numpy.py.tpl +0 -46
- flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -80
- flwr/cli/new/templates/app/code/client.pytorch_legacy_api.py.tpl +0 -55
- flwr/cli/new/templates/app/code/client.sklearn.py.tpl +0 -108
- flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -82
- flwr/cli/new/templates/app/code/client.xgboost.py.tpl +0 -110
- flwr/cli/new/templates/app/code/dataset.baseline.py.tpl +0 -36
- flwr/cli/new/templates/app/code/flwr_tune/client_app.py.tpl +0 -92
- flwr/cli/new/templates/app/code/flwr_tune/dataset.py.tpl +0 -87
- flwr/cli/new/templates/app/code/flwr_tune/models.py.tpl +0 -56
- flwr/cli/new/templates/app/code/flwr_tune/server_app.py.tpl +0 -73
- flwr/cli/new/templates/app/code/flwr_tune/strategy.py.tpl +0 -78
- flwr/cli/new/templates/app/code/model.baseline.py.tpl +0 -66
- flwr/cli/new/templates/app/code/server.baseline.py.tpl +0 -43
- flwr/cli/new/templates/app/code/server.huggingface.py.tpl +0 -42
- flwr/cli/new/templates/app/code/server.jax.py.tpl +0 -39
- flwr/cli/new/templates/app/code/server.mlx.py.tpl +0 -41
- flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -38
- flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -41
- flwr/cli/new/templates/app/code/server.pytorch_legacy_api.py.tpl +0 -31
- flwr/cli/new/templates/app/code/server.sklearn.py.tpl +0 -44
- flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -38
- flwr/cli/new/templates/app/code/server.xgboost.py.tpl +0 -56
- flwr/cli/new/templates/app/code/strategy.baseline.py.tpl +0 -1
- flwr/cli/new/templates/app/code/task.huggingface.py.tpl +0 -98
- flwr/cli/new/templates/app/code/task.jax.py.tpl +0 -57
- flwr/cli/new/templates/app/code/task.mlx.py.tpl +0 -102
- flwr/cli/new/templates/app/code/task.numpy.py.tpl +0 -7
- flwr/cli/new/templates/app/code/task.pytorch.py.tpl +0 -98
- flwr/cli/new/templates/app/code/task.pytorch_legacy_api.py.tpl +0 -111
- flwr/cli/new/templates/app/code/task.sklearn.py.tpl +0 -67
- flwr/cli/new/templates/app/code/task.tensorflow.py.tpl +0 -52
- flwr/cli/new/templates/app/code/task.xgboost.py.tpl +0 -67
- flwr/cli/new/templates/app/code/utils.baseline.py.tpl +0 -1
- flwr/cli/new/templates/app/pyproject.baseline.toml.tpl +0 -146
- flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +0 -80
- flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl +0 -65
- flwr/cli/new/templates/app/pyproject.jax.toml.tpl +0 -52
- flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +0 -56
- flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +0 -49
- flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +0 -53
- flwr/cli/new/templates/app/pyproject.pytorch_legacy_api.toml.tpl +0 -53
- flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +0 -52
- flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +0 -53
- flwr/cli/new/templates/app/pyproject.xgboost.toml.tpl +0 -61
- flwr/common/pyproject.py +0 -42
- flwr/supercore/object_store/utils.py +0 -43
- flwr_nightly-1.23.0.dev20250930.dist-info/RECORD +0 -429
- /flwr/{common → supercore}/version.py +0 -0
- {flwr_nightly-1.23.0.dev20250930.dist-info → flwr_nightly-1.26.0.dev20260121.dist-info}/WHEEL +0 -0
- {flwr_nightly-1.23.0.dev20250930.dist-info → flwr_nightly-1.26.0.dev20260121.dist-info}/entry_points.txt +0 -0
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
|
|
17
17
|
|
|
18
18
|
from logging import WARNING
|
|
19
|
-
from typing import Any,
|
|
19
|
+
from typing import Any, cast
|
|
20
20
|
|
|
21
21
|
from flwr.common import EvaluateIns, EvaluateRes, FitIns, FitRes, Parameters, Scalar
|
|
22
22
|
from flwr.common.logger import log
|
|
@@ -34,7 +34,7 @@ class FedXgbCyclic(FedAvg):
|
|
|
34
34
|
self,
|
|
35
35
|
**kwargs: Any,
|
|
36
36
|
):
|
|
37
|
-
self.global_model:
|
|
37
|
+
self.global_model: bytes | None = None
|
|
38
38
|
super().__init__(**kwargs)
|
|
39
39
|
|
|
40
40
|
def __repr__(self) -> str:
|
|
@@ -46,8 +46,8 @@ class FedXgbCyclic(FedAvg):
|
|
|
46
46
|
self,
|
|
47
47
|
server_round: int,
|
|
48
48
|
results: list[tuple[ClientProxy, FitRes]],
|
|
49
|
-
failures: list[
|
|
50
|
-
) -> tuple[
|
|
49
|
+
failures: list[tuple[ClientProxy, FitRes] | BaseException],
|
|
50
|
+
) -> tuple[Parameters | None, dict[str, Scalar]]:
|
|
51
51
|
"""Aggregate fit results using bagging."""
|
|
52
52
|
if not results:
|
|
53
53
|
return None, {}
|
|
@@ -70,8 +70,8 @@ class FedXgbCyclic(FedAvg):
|
|
|
70
70
|
self,
|
|
71
71
|
server_round: int,
|
|
72
72
|
results: list[tuple[ClientProxy, EvaluateRes]],
|
|
73
|
-
failures: list[
|
|
74
|
-
) -> tuple[
|
|
73
|
+
failures: list[tuple[ClientProxy, EvaluateRes] | BaseException],
|
|
74
|
+
) -> tuple[float | None, dict[str, Scalar]]:
|
|
75
75
|
"""Aggregate evaluation metrics using average."""
|
|
76
76
|
if not results:
|
|
77
77
|
return None, {}
|
|
@@ -22,7 +22,7 @@ Paper: arxiv.org/abs/2304.07537
|
|
|
22
22
|
|
|
23
23
|
|
|
24
24
|
from logging import WARNING
|
|
25
|
-
from typing import Any
|
|
25
|
+
from typing import Any
|
|
26
26
|
|
|
27
27
|
from flwr.common import FitRes, Scalar, ndarrays_to_parameters, parameters_to_ndarrays
|
|
28
28
|
from flwr.common.logger import log, warn_deprecated_feature
|
|
@@ -57,7 +57,7 @@ class FedXgbNnAvg(FedAvg):
|
|
|
57
57
|
|
|
58
58
|
def evaluate(
|
|
59
59
|
self, server_round: int, parameters: Any
|
|
60
|
-
) ->
|
|
60
|
+
) -> tuple[float, dict[str, Scalar]] | None:
|
|
61
61
|
"""Evaluate model parameters using an evaluation function."""
|
|
62
62
|
if self.evaluate_fn is None:
|
|
63
63
|
# No evaluation function provided
|
|
@@ -72,8 +72,8 @@ class FedXgbNnAvg(FedAvg):
|
|
|
72
72
|
self,
|
|
73
73
|
server_round: int,
|
|
74
74
|
results: list[tuple[ClientProxy, FitRes]],
|
|
75
|
-
failures: list[
|
|
76
|
-
) -> tuple[
|
|
75
|
+
failures: list[tuple[ClientProxy, FitRes] | BaseException],
|
|
76
|
+
) -> tuple[Any | None, dict[str, Scalar]]:
|
|
77
77
|
"""Aggregate fit results using weighted average."""
|
|
78
78
|
if not results:
|
|
79
79
|
return None, {}
|
flwr/server/strategy/fedyogi.py
CHANGED
|
@@ -18,7 +18,7 @@ Paper: arxiv.org/abs/2003.00295
|
|
|
18
18
|
"""
|
|
19
19
|
|
|
20
20
|
|
|
21
|
-
from
|
|
21
|
+
from collections.abc import Callable
|
|
22
22
|
|
|
23
23
|
import numpy as np
|
|
24
24
|
|
|
@@ -91,18 +91,19 @@ class FedYogi(FedOpt):
|
|
|
91
91
|
min_fit_clients: int = 2,
|
|
92
92
|
min_evaluate_clients: int = 2,
|
|
93
93
|
min_available_clients: int = 2,
|
|
94
|
-
evaluate_fn:
|
|
94
|
+
evaluate_fn: (
|
|
95
95
|
Callable[
|
|
96
96
|
[int, NDArrays, dict[str, Scalar]],
|
|
97
|
-
|
|
97
|
+
tuple[float, dict[str, Scalar]] | None,
|
|
98
98
|
]
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
99
|
+
| None
|
|
100
|
+
) = None,
|
|
101
|
+
on_fit_config_fn: Callable[[int], dict[str, Scalar]] | None = None,
|
|
102
|
+
on_evaluate_config_fn: Callable[[int], dict[str, Scalar]] | None = None,
|
|
102
103
|
accept_failures: bool = True,
|
|
103
104
|
initial_parameters: Parameters,
|
|
104
|
-
fit_metrics_aggregation_fn:
|
|
105
|
-
evaluate_metrics_aggregation_fn:
|
|
105
|
+
fit_metrics_aggregation_fn: MetricsAggregationFn | None = None,
|
|
106
|
+
evaluate_metrics_aggregation_fn: MetricsAggregationFn | None = None,
|
|
106
107
|
eta: float = 1e-2,
|
|
107
108
|
eta_l: float = 0.0316,
|
|
108
109
|
beta_1: float = 0.9,
|
|
@@ -138,8 +139,8 @@ class FedYogi(FedOpt):
|
|
|
138
139
|
self,
|
|
139
140
|
server_round: int,
|
|
140
141
|
results: list[tuple[ClientProxy, FitRes]],
|
|
141
|
-
failures: list[
|
|
142
|
-
) -> tuple[
|
|
142
|
+
failures: list[tuple[ClientProxy, FitRes] | BaseException],
|
|
143
|
+
) -> tuple[Parameters | None, dict[str, Scalar]]:
|
|
143
144
|
"""Aggregate fit results using weighted average."""
|
|
144
145
|
fedavg_parameters_aggregated, metrics_aggregated = super().aggregate_fit(
|
|
145
146
|
server_round=server_round, results=results, failures=failures
|
|
@@ -151,7 +152,8 @@ class FedYogi(FedOpt):
|
|
|
151
152
|
|
|
152
153
|
# Yogi
|
|
153
154
|
delta_t: NDArrays = [
|
|
154
|
-
x - y
|
|
155
|
+
x - y
|
|
156
|
+
for x, y in zip(fedavg_weights_aggregate, self.current_weights, strict=True)
|
|
155
157
|
]
|
|
156
158
|
|
|
157
159
|
# m_t
|
|
@@ -159,7 +161,7 @@ class FedYogi(FedOpt):
|
|
|
159
161
|
self.m_t = [np.zeros_like(x) for x in delta_t]
|
|
160
162
|
self.m_t = [
|
|
161
163
|
np.multiply(self.beta_1, x) + (1 - self.beta_1) * y
|
|
162
|
-
for x, y in zip(self.m_t, delta_t)
|
|
164
|
+
for x, y in zip(self.m_t, delta_t, strict=True)
|
|
163
165
|
]
|
|
164
166
|
|
|
165
167
|
# v_t
|
|
@@ -167,12 +169,12 @@ class FedYogi(FedOpt):
|
|
|
167
169
|
self.v_t = [np.zeros_like(x) for x in delta_t]
|
|
168
170
|
self.v_t = [
|
|
169
171
|
x - (1.0 - self.beta_2) * np.multiply(y, y) * np.sign(x - np.multiply(y, y))
|
|
170
|
-
for x, y in zip(self.v_t, delta_t)
|
|
172
|
+
for x, y in zip(self.v_t, delta_t, strict=True)
|
|
171
173
|
]
|
|
172
174
|
|
|
173
175
|
new_weights = [
|
|
174
176
|
x + self.eta * y / (np.sqrt(z) + self.tau)
|
|
175
|
-
for x, y, z in zip(self.current_weights, self.m_t, self.v_t)
|
|
177
|
+
for x, y, z in zip(self.current_weights, self.m_t, self.v_t, strict=True)
|
|
176
178
|
]
|
|
177
179
|
|
|
178
180
|
self.current_weights = new_weights
|
flwr/server/strategy/krum.py
CHANGED
|
@@ -20,8 +20,8 @@ Paper: proceedings.neurips.cc/paper/2017/file/f4b9ec30ad9f68f89b29639786cb62ef-P
|
|
|
20
20
|
"""
|
|
21
21
|
|
|
22
22
|
|
|
23
|
+
from collections.abc import Callable
|
|
23
24
|
from logging import WARNING
|
|
24
|
-
from typing import Callable, Optional, Union
|
|
25
25
|
|
|
26
26
|
from flwr.common import (
|
|
27
27
|
FitRes,
|
|
@@ -85,18 +85,19 @@ class Krum(FedAvg):
|
|
|
85
85
|
min_available_clients: int = 2,
|
|
86
86
|
num_malicious_clients: int = 0,
|
|
87
87
|
num_clients_to_keep: int = 0,
|
|
88
|
-
evaluate_fn:
|
|
88
|
+
evaluate_fn: (
|
|
89
89
|
Callable[
|
|
90
90
|
[int, NDArrays, dict[str, Scalar]],
|
|
91
|
-
|
|
91
|
+
tuple[float, dict[str, Scalar]] | None,
|
|
92
92
|
]
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
93
|
+
| None
|
|
94
|
+
) = None,
|
|
95
|
+
on_fit_config_fn: Callable[[int], dict[str, Scalar]] | None = None,
|
|
96
|
+
on_evaluate_config_fn: Callable[[int], dict[str, Scalar]] | None = None,
|
|
96
97
|
accept_failures: bool = True,
|
|
97
|
-
initial_parameters:
|
|
98
|
-
fit_metrics_aggregation_fn:
|
|
99
|
-
evaluate_metrics_aggregation_fn:
|
|
98
|
+
initial_parameters: Parameters | None = None,
|
|
99
|
+
fit_metrics_aggregation_fn: MetricsAggregationFn | None = None,
|
|
100
|
+
evaluate_metrics_aggregation_fn: MetricsAggregationFn | None = None,
|
|
100
101
|
) -> None:
|
|
101
102
|
super().__init__(
|
|
102
103
|
fraction_fit=fraction_fit,
|
|
@@ -124,8 +125,8 @@ class Krum(FedAvg):
|
|
|
124
125
|
self,
|
|
125
126
|
server_round: int,
|
|
126
127
|
results: list[tuple[ClientProxy, FitRes]],
|
|
127
|
-
failures: list[
|
|
128
|
-
) -> tuple[
|
|
128
|
+
failures: list[tuple[ClientProxy, FitRes] | BaseException],
|
|
129
|
+
) -> tuple[Parameters | None, dict[str, Scalar]]:
|
|
129
130
|
"""Aggregate fit results using Krum."""
|
|
130
131
|
if not results:
|
|
131
132
|
return None, {}
|
flwr/server/strategy/qfedavg.py
CHANGED
|
@@ -18,8 +18,8 @@ Paper: openreview.net/pdf?id=ByexElSYDr
|
|
|
18
18
|
"""
|
|
19
19
|
|
|
20
20
|
|
|
21
|
+
from collections.abc import Callable
|
|
21
22
|
from logging import WARNING
|
|
22
|
-
from typing import Callable, Optional, Union
|
|
23
23
|
|
|
24
24
|
import numpy as np
|
|
25
25
|
|
|
@@ -58,18 +58,19 @@ class QFedAvg(FedAvg):
|
|
|
58
58
|
min_fit_clients: int = 1,
|
|
59
59
|
min_evaluate_clients: int = 1,
|
|
60
60
|
min_available_clients: int = 1,
|
|
61
|
-
evaluate_fn:
|
|
61
|
+
evaluate_fn: (
|
|
62
62
|
Callable[
|
|
63
63
|
[int, NDArrays, dict[str, Scalar]],
|
|
64
|
-
|
|
64
|
+
tuple[float, dict[str, Scalar]] | None,
|
|
65
65
|
]
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
66
|
+
| None
|
|
67
|
+
) = None,
|
|
68
|
+
on_fit_config_fn: Callable[[int], dict[str, Scalar]] | None = None,
|
|
69
|
+
on_evaluate_config_fn: Callable[[int], dict[str, Scalar]] | None = None,
|
|
69
70
|
accept_failures: bool = True,
|
|
70
|
-
initial_parameters:
|
|
71
|
-
fit_metrics_aggregation_fn:
|
|
72
|
-
evaluate_metrics_aggregation_fn:
|
|
71
|
+
initial_parameters: Parameters | None = None,
|
|
72
|
+
fit_metrics_aggregation_fn: MetricsAggregationFn | None = None,
|
|
73
|
+
evaluate_metrics_aggregation_fn: MetricsAggregationFn | None = None,
|
|
73
74
|
) -> None:
|
|
74
75
|
super().__init__(
|
|
75
76
|
fraction_fit=fraction_fit,
|
|
@@ -87,7 +88,7 @@ class QFedAvg(FedAvg):
|
|
|
87
88
|
)
|
|
88
89
|
self.learning_rate = qffl_learning_rate
|
|
89
90
|
self.q_param = q_param
|
|
90
|
-
self.pre_weights:
|
|
91
|
+
self.pre_weights: NDArrays | None = None
|
|
91
92
|
|
|
92
93
|
def __repr__(self) -> str:
|
|
93
94
|
"""Compute a string representation of the strategy."""
|
|
@@ -159,8 +160,8 @@ class QFedAvg(FedAvg):
|
|
|
159
160
|
self,
|
|
160
161
|
server_round: int,
|
|
161
162
|
results: list[tuple[ClientProxy, FitRes]],
|
|
162
|
-
failures: list[
|
|
163
|
-
) -> tuple[
|
|
163
|
+
failures: list[tuple[ClientProxy, FitRes] | BaseException],
|
|
164
|
+
) -> tuple[Parameters | None, dict[str, Scalar]]:
|
|
164
165
|
"""Aggregate fit results using weighted average."""
|
|
165
166
|
if not results:
|
|
166
167
|
return None, {}
|
|
@@ -199,7 +200,7 @@ class QFedAvg(FedAvg):
|
|
|
199
200
|
# plug in the weight updates into the gradient
|
|
200
201
|
grads = [
|
|
201
202
|
np.multiply((u - v), 1.0 / self.learning_rate)
|
|
202
|
-
for u, v in zip(weights_before, new_weights)
|
|
203
|
+
for u, v in zip(weights_before, new_weights, strict=True)
|
|
203
204
|
]
|
|
204
205
|
deltas.append(
|
|
205
206
|
[np.float_power(loss + 1e-10, self.q_param) * grad for grad in grads]
|
|
@@ -230,8 +231,8 @@ class QFedAvg(FedAvg):
|
|
|
230
231
|
self,
|
|
231
232
|
server_round: int,
|
|
232
233
|
results: list[tuple[ClientProxy, EvaluateRes]],
|
|
233
|
-
failures: list[
|
|
234
|
-
) -> tuple[
|
|
234
|
+
failures: list[tuple[ClientProxy, EvaluateRes] | BaseException],
|
|
235
|
+
) -> tuple[float | None, dict[str, Scalar]]:
|
|
235
236
|
"""Aggregate evaluation losses using weighted average."""
|
|
236
237
|
if not results:
|
|
237
238
|
return None, {}
|
flwr/server/strategy/strategy.py
CHANGED
|
@@ -16,7 +16,6 @@
|
|
|
16
16
|
|
|
17
17
|
|
|
18
18
|
from abc import ABC, abstractmethod
|
|
19
|
-
from typing import Optional, Union
|
|
20
19
|
|
|
21
20
|
from flwr.common import EvaluateIns, EvaluateRes, FitIns, FitRes, Parameters, Scalar
|
|
22
21
|
from flwr.server.client_manager import ClientManager
|
|
@@ -27,9 +26,7 @@ class Strategy(ABC):
|
|
|
27
26
|
"""Abstract base class for server strategy implementations."""
|
|
28
27
|
|
|
29
28
|
@abstractmethod
|
|
30
|
-
def initialize_parameters(
|
|
31
|
-
self, client_manager: ClientManager
|
|
32
|
-
) -> Optional[Parameters]:
|
|
29
|
+
def initialize_parameters(self, client_manager: ClientManager) -> Parameters | None:
|
|
33
30
|
"""Initialize the (global) model parameters.
|
|
34
31
|
|
|
35
32
|
Parameters
|
|
@@ -73,8 +70,8 @@ class Strategy(ABC):
|
|
|
73
70
|
self,
|
|
74
71
|
server_round: int,
|
|
75
72
|
results: list[tuple[ClientProxy, FitRes]],
|
|
76
|
-
failures: list[
|
|
77
|
-
) -> tuple[
|
|
73
|
+
failures: list[tuple[ClientProxy, FitRes] | BaseException],
|
|
74
|
+
) -> tuple[Parameters | None, dict[str, Scalar]]:
|
|
78
75
|
"""Aggregate training results.
|
|
79
76
|
|
|
80
77
|
Parameters
|
|
@@ -135,8 +132,8 @@ class Strategy(ABC):
|
|
|
135
132
|
self,
|
|
136
133
|
server_round: int,
|
|
137
134
|
results: list[tuple[ClientProxy, EvaluateRes]],
|
|
138
|
-
failures: list[
|
|
139
|
-
) -> tuple[
|
|
135
|
+
failures: list[tuple[ClientProxy, EvaluateRes] | BaseException],
|
|
136
|
+
) -> tuple[float | None, dict[str, Scalar]]:
|
|
140
137
|
"""Aggregate evaluation results.
|
|
141
138
|
|
|
142
139
|
Parameters
|
|
@@ -164,7 +161,7 @@ class Strategy(ABC):
|
|
|
164
161
|
@abstractmethod
|
|
165
162
|
def evaluate(
|
|
166
163
|
self, server_round: int, parameters: Parameters
|
|
167
|
-
) ->
|
|
164
|
+
) -> tuple[float, dict[str, Scalar]] | None:
|
|
168
165
|
"""Evaluate the current model parameters.
|
|
169
166
|
|
|
170
167
|
This function can be used to perform centralized (i.e., server-side) evaluation
|
|
@@ -15,8 +15,9 @@
|
|
|
15
15
|
"""Fleet API gRPC adapter servicer."""
|
|
16
16
|
|
|
17
17
|
|
|
18
|
+
from collections.abc import Callable
|
|
18
19
|
from logging import DEBUG
|
|
19
|
-
from typing import
|
|
20
|
+
from typing import TypeVar
|
|
20
21
|
|
|
21
22
|
import grpc
|
|
22
23
|
from google.protobuf.message import Message as GrpcMessage
|
|
@@ -29,14 +30,15 @@ from flwr.common.constant import (
|
|
|
29
30
|
GRPC_ADAPTER_METADATA_MESSAGE_QUALNAME_KEY,
|
|
30
31
|
)
|
|
31
32
|
from flwr.common.logger import log
|
|
32
|
-
from flwr.common.version import package_name, package_version
|
|
33
33
|
from flwr.proto import grpcadapter_pb2_grpc # pylint: disable=E0611
|
|
34
34
|
from flwr.proto.fab_pb2 import GetFabRequest # pylint: disable=E0611
|
|
35
35
|
from flwr.proto.fleet_pb2 import ( # pylint: disable=E0611
|
|
36
|
-
|
|
37
|
-
|
|
36
|
+
ActivateNodeRequest,
|
|
37
|
+
DeactivateNodeRequest,
|
|
38
38
|
PullMessagesRequest,
|
|
39
39
|
PushMessagesRequest,
|
|
40
|
+
RegisterNodeFleetRequest,
|
|
41
|
+
UnregisterNodeFleetRequest,
|
|
40
42
|
)
|
|
41
43
|
from flwr.proto.grpcadapter_pb2 import MessageContainer # pylint: disable=E0611
|
|
42
44
|
from flwr.proto.heartbeat_pb2 import SendNodeHeartbeatRequest # pylint: disable=E0611
|
|
@@ -46,6 +48,7 @@ from flwr.proto.message_pb2 import ( # pylint: disable=E0611
|
|
|
46
48
|
PushObjectRequest,
|
|
47
49
|
)
|
|
48
50
|
from flwr.proto.run_pb2 import GetRunRequest # pylint: disable=E0611
|
|
51
|
+
from flwr.supercore.version import package_name, package_version
|
|
49
52
|
|
|
50
53
|
from ..grpc_rere.fleet_servicer import FleetServicer
|
|
51
54
|
|
|
@@ -77,15 +80,23 @@ def _handle(
|
|
|
77
80
|
class GrpcAdapterServicer(grpcadapter_pb2_grpc.GrpcAdapterServicer, FleetServicer):
|
|
78
81
|
"""Fleet API via GrpcAdapter servicer."""
|
|
79
82
|
|
|
80
|
-
def SendReceive( # pylint: disable=too-many-return-statements
|
|
83
|
+
def SendReceive( # pylint: disable=too-many-return-statements, too-many-branches
|
|
81
84
|
self, request: MessageContainer, context: grpc.ServicerContext
|
|
82
85
|
) -> MessageContainer:
|
|
83
86
|
"""."""
|
|
84
87
|
log(DEBUG, "GrpcAdapterServicer.SendReceive")
|
|
85
|
-
if request.grpc_message_name ==
|
|
86
|
-
return _handle(
|
|
87
|
-
|
|
88
|
-
|
|
88
|
+
if request.grpc_message_name == RegisterNodeFleetRequest.__qualname__:
|
|
89
|
+
return _handle(
|
|
90
|
+
request, context, RegisterNodeFleetRequest, self.RegisterNode
|
|
91
|
+
)
|
|
92
|
+
if request.grpc_message_name == ActivateNodeRequest.__qualname__:
|
|
93
|
+
return _handle(request, context, ActivateNodeRequest, self.ActivateNode)
|
|
94
|
+
if request.grpc_message_name == DeactivateNodeRequest.__qualname__:
|
|
95
|
+
return _handle(request, context, DeactivateNodeRequest, self.DeactivateNode)
|
|
96
|
+
if request.grpc_message_name == UnregisterNodeFleetRequest.__qualname__:
|
|
97
|
+
return _handle(
|
|
98
|
+
request, context, UnregisterNodeFleetRequest, self.UnregisterNode
|
|
99
|
+
)
|
|
89
100
|
if request.grpc_message_name == SendNodeHeartbeatRequest.__qualname__:
|
|
90
101
|
return _handle(
|
|
91
102
|
request, context, SendNodeHeartbeatRequest, self.SendNodeHeartbeat
|
|
@@ -19,7 +19,6 @@ from collections.abc import Iterator
|
|
|
19
19
|
from dataclasses import dataclass
|
|
20
20
|
from enum import Enum
|
|
21
21
|
from threading import Condition
|
|
22
|
-
from typing import Optional
|
|
23
22
|
|
|
24
23
|
from flwr.proto.transport_pb2 import ( # pylint: disable=E0611
|
|
25
24
|
ClientMessage,
|
|
@@ -32,7 +31,7 @@ class InsWrapper:
|
|
|
32
31
|
"""Instruction wrapper class for a single server message."""
|
|
33
32
|
|
|
34
33
|
server_message: ServerMessage
|
|
35
|
-
timeout:
|
|
34
|
+
timeout: float | None
|
|
36
35
|
|
|
37
36
|
|
|
38
37
|
@dataclass
|
|
@@ -70,8 +69,8 @@ class GrpcBridge:
|
|
|
70
69
|
# pylint: disable=unsubscriptable-object
|
|
71
70
|
self._cv = Condition() # cv stands for condition variable
|
|
72
71
|
self._status = Status.AWAITING_INS_WRAPPER
|
|
73
|
-
self._ins_wrapper:
|
|
74
|
-
self._res_wrapper:
|
|
72
|
+
self._ins_wrapper: InsWrapper | None = None
|
|
73
|
+
self._res_wrapper: ResWrapper | None = None
|
|
75
74
|
|
|
76
75
|
def _is_closed(self) -> bool:
|
|
77
76
|
"""Return True if closed and False otherwise."""
|
|
@@ -15,8 +15,6 @@
|
|
|
15
15
|
"""Flower ClientProxy implementation using gRPC bidirectional streaming."""
|
|
16
16
|
|
|
17
17
|
|
|
18
|
-
from typing import Optional
|
|
19
|
-
|
|
20
18
|
from flwr import common
|
|
21
19
|
from flwr.common import serde
|
|
22
20
|
from flwr.proto.transport_pb2 import ( # pylint: disable=E0611
|
|
@@ -45,8 +43,8 @@ class GrpcClientProxy(ClientProxy):
|
|
|
45
43
|
def get_properties(
|
|
46
44
|
self,
|
|
47
45
|
ins: common.GetPropertiesIns,
|
|
48
|
-
timeout:
|
|
49
|
-
group_id:
|
|
46
|
+
timeout: float | None,
|
|
47
|
+
group_id: int | None,
|
|
50
48
|
) -> common.GetPropertiesRes:
|
|
51
49
|
"""Request client's set of internal properties."""
|
|
52
50
|
get_properties_msg = serde.get_properties_ins_to_proto(ins)
|
|
@@ -65,8 +63,8 @@ class GrpcClientProxy(ClientProxy):
|
|
|
65
63
|
def get_parameters(
|
|
66
64
|
self,
|
|
67
65
|
ins: common.GetParametersIns,
|
|
68
|
-
timeout:
|
|
69
|
-
group_id:
|
|
66
|
+
timeout: float | None,
|
|
67
|
+
group_id: int | None,
|
|
70
68
|
) -> common.GetParametersRes:
|
|
71
69
|
"""Return the current local model parameters."""
|
|
72
70
|
get_parameters_msg = serde.get_parameters_ins_to_proto(ins)
|
|
@@ -85,8 +83,8 @@ class GrpcClientProxy(ClientProxy):
|
|
|
85
83
|
def fit(
|
|
86
84
|
self,
|
|
87
85
|
ins: common.FitIns,
|
|
88
|
-
timeout:
|
|
89
|
-
group_id:
|
|
86
|
+
timeout: float | None,
|
|
87
|
+
group_id: int | None,
|
|
90
88
|
) -> common.FitRes:
|
|
91
89
|
"""Refine the provided parameters using the locally held dataset."""
|
|
92
90
|
fit_ins_msg = serde.fit_ins_to_proto(ins)
|
|
@@ -104,8 +102,8 @@ class GrpcClientProxy(ClientProxy):
|
|
|
104
102
|
def evaluate(
|
|
105
103
|
self,
|
|
106
104
|
ins: common.EvaluateIns,
|
|
107
|
-
timeout:
|
|
108
|
-
group_id:
|
|
105
|
+
timeout: float | None,
|
|
106
|
+
group_id: int | None,
|
|
109
107
|
) -> common.EvaluateRes:
|
|
110
108
|
"""Evaluate the provided parameters using the locally held dataset."""
|
|
111
109
|
evaluate_msg = serde.evaluate_ins_to_proto(ins)
|
|
@@ -122,8 +120,8 @@ class GrpcClientProxy(ClientProxy):
|
|
|
122
120
|
def reconnect(
|
|
123
121
|
self,
|
|
124
122
|
ins: common.ReconnectIns,
|
|
125
|
-
timeout:
|
|
126
|
-
group_id:
|
|
123
|
+
timeout: float | None,
|
|
124
|
+
group_id: int | None,
|
|
127
125
|
) -> common.DisconnectRes:
|
|
128
126
|
"""Disconnect and (optionally) reconnect later."""
|
|
129
127
|
reconnect_ins_msg = serde.reconnect_ins_to_proto(ins)
|
|
@@ -15,8 +15,6 @@
|
|
|
15
15
|
"""Implements utility function to create a gRPC server."""
|
|
16
16
|
|
|
17
17
|
|
|
18
|
-
from typing import Optional
|
|
19
|
-
|
|
20
18
|
import grpc
|
|
21
19
|
|
|
22
20
|
from flwr.common import GRPC_MAX_MESSAGE_LENGTH
|
|
@@ -36,7 +34,7 @@ def start_grpc_server( # pylint: disable=too-many-arguments,R0917
|
|
|
36
34
|
max_concurrent_workers: int = 1000,
|
|
37
35
|
max_message_length: int = GRPC_MAX_MESSAGE_LENGTH,
|
|
38
36
|
keepalive_time_ms: int = 210000,
|
|
39
|
-
certificates:
|
|
37
|
+
certificates: tuple[bytes, bytes, bytes] | None = None,
|
|
40
38
|
) -> grpc.Server:
|
|
41
39
|
"""Create and start a gRPC server running FlowerServiceServicer.
|
|
42
40
|
|