flwr-nightly 1.17.0.dev20250317__tar.gz → 1.17.0.dev20250319__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.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/PKG-INFO +1 -1
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/pyproject.toml +1 -1
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/common/constant.py +5 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/common/logger.py +2 -2
- flwr_nightly-1.17.0.dev20250319/src/py/flwr/common/record/parametersrecord.py +583 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/__init__.py +3 -1
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/app.py +1 -1
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/compat/__init__.py +2 -2
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/compat/app.py +11 -11
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/compat/app_utils.py +16 -16
- flwr_nightly-1.17.0.dev20250317/src/py/flwr/server/compat/driver_client_proxy.py → flwr_nightly-1.17.0.dev20250319/src/py/flwr/server/compat/grid_client_proxy.py +9 -9
- {flwr_nightly-1.17.0.dev20250317/src/py/flwr/server/driver → flwr_nightly-1.17.0.dev20250319/src/py/flwr/server/grid}/__init__.py +8 -7
- flwr_nightly-1.17.0.dev20250317/src/py/flwr/server/driver/driver.py → flwr_nightly-1.17.0.dev20250319/src/py/flwr/server/grid/grid.py +44 -15
- flwr_nightly-1.17.0.dev20250317/src/py/flwr/server/driver/grpc_driver.py → flwr_nightly-1.17.0.dev20250319/src/py/flwr/server/grid/grpc_grid.py +12 -20
- flwr_nightly-1.17.0.dev20250317/src/py/flwr/server/driver/inmemory_driver.py → flwr_nightly-1.17.0.dev20250319/src/py/flwr/server/grid/inmemory_grid.py +6 -14
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/run_serverapp.py +4 -4
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/server_app.py +38 -12
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/serverapp/app.py +10 -10
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/superlink/linkstate/in_memory_linkstate.py +28 -3
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/superlink/linkstate/sqlite_linkstate.py +40 -2
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/superlink/linkstate/utils.py +67 -10
- {flwr_nightly-1.17.0.dev20250317/src/py/flwr/server/superlink/driver → flwr_nightly-1.17.0.dev20250319/src/py/flwr/server/superlink/serverappio}/__init__.py +1 -1
- {flwr_nightly-1.17.0.dev20250317/src/py/flwr/server/superlink/driver → flwr_nightly-1.17.0.dev20250319/src/py/flwr/server/superlink/serverappio}/serverappio_grpc.py +1 -1
- {flwr_nightly-1.17.0.dev20250317/src/py/flwr/server/superlink/driver → flwr_nightly-1.17.0.dev20250319/src/py/flwr/server/superlink/serverappio}/serverappio_servicer.py +1 -1
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/typing.py +3 -3
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/workflow/default_workflows.py +17 -19
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +15 -15
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/simulation/run_simulation.py +10 -10
- flwr_nightly-1.17.0.dev20250317/src/py/flwr/common/record/parametersrecord.py +0 -339
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/LICENSE +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/README.md +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/__init__.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/__init__.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/app.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/auth_plugin/__init__.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/auth_plugin/oidc_cli_plugin.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/build.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/cli_user_auth_interceptor.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/config_utils.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/constant.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/example.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/install.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/log.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/login/__init__.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/login/login.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/ls.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/__init__.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/new.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/__init__.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/.gitignore.tpl +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/LICENSE.tpl +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/README.baseline.md.tpl +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/README.flowertune.md.tpl +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/README.md.tpl +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/__init__.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/code/__init__.baseline.py.tpl +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/code/client.baseline.py.tpl +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/code/client.huggingface.py.tpl +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/code/client.jax.py.tpl +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/code/client.mlx.py.tpl +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/code/client.numpy.py.tpl +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/code/dataset.baseline.py.tpl +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/code/flwr_tune/__init__.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/code/flwr_tune/client_app.py.tpl +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/code/flwr_tune/dataset.py.tpl +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/code/flwr_tune/models.py.tpl +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/code/flwr_tune/server_app.py.tpl +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/code/flwr_tune/strategy.py.tpl +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/code/model.baseline.py.tpl +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/code/server.baseline.py.tpl +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/code/server.huggingface.py.tpl +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/code/server.jax.py.tpl +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/code/server.mlx.py.tpl +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/code/server.sklearn.py.tpl +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/code/strategy.baseline.py.tpl +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/code/task.huggingface.py.tpl +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/code/task.jax.py.tpl +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/code/task.mlx.py.tpl +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/code/task.numpy.py.tpl +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/code/task.sklearn.py.tpl +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/code/task.tensorflow.py.tpl +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/code/utils.baseline.py.tpl +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/pyproject.baseline.toml.tpl +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/pyproject.jax.toml.tpl +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/run/__init__.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/run/run.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/stop.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/cli/utils.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/client/__init__.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/client/app.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/client/client.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/client/client_app.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/client/clientapp/__init__.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/client/clientapp/app.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/client/clientapp/clientappio_servicer.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/client/clientapp/utils.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/client/dpfedavg_numpy_client.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/client/grpc_adapter_client/__init__.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/client/grpc_adapter_client/connection.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/client/grpc_client/__init__.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/client/grpc_client/connection.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/client/grpc_rere_client/__init__.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/client/grpc_rere_client/client_interceptor.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/client/grpc_rere_client/connection.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/client/grpc_rere_client/grpc_adapter.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/client/heartbeat.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/client/message_handler/__init__.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/client/message_handler/message_handler.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/client/mod/__init__.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/client/mod/centraldp_mods.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/client/mod/comms_mods.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/client/mod/localdp_mod.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/client/mod/utils.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/client/nodestate/__init__.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/client/nodestate/in_memory_nodestate.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/client/nodestate/nodestate.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/client/nodestate/nodestate_factory.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/client/numpy_client.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/client/rest_client/__init__.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/client/rest_client/connection.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/client/run_info_store.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/client/supernode/__init__.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/client/supernode/app.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/client/typing.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/common/__init__.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/common/address.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/common/args.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/common/auth_plugin/__init__.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/common/auth_plugin/auth_plugin.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/common/config.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/common/context.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/common/date.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/common/differential_privacy.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/common/differential_privacy_constants.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/common/dp.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/common/event_log_plugin/__init__.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/common/event_log_plugin/event_log_plugin.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/common/exit/__init__.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/common/exit/exit.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/common/exit/exit_code.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/common/exit_handlers.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/common/grpc.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/common/message.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/common/object_ref.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/common/parameter.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/common/pyproject.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/common/record/__init__.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/common/record/configsrecord.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/common/record/conversion_utils.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/common/record/metricsrecord.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/common/record/recordset.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/common/record/typeddict.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/common/recordset_compat.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/common/retry_invoker.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/common/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/common/secure_aggregation/quantization.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/common/serde.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/common/telemetry.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/common/typing.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/common/version.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/__init__.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/clientappio_pb2.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/clientappio_pb2.pyi +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/clientappio_pb2_grpc.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/clientappio_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/error_pb2.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/error_pb2.pyi +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/error_pb2_grpc.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/error_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/exec_pb2.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/exec_pb2.pyi +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/exec_pb2_grpc.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/exec_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/fab_pb2.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/fab_pb2.pyi +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/fab_pb2_grpc.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/fab_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/fleet_pb2.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/fleet_pb2.pyi +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/fleet_pb2_grpc.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/grpcadapter_pb2.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/grpcadapter_pb2.pyi +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/grpcadapter_pb2_grpc.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/grpcadapter_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/log_pb2.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/log_pb2.pyi +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/log_pb2_grpc.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/log_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/message_pb2.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/message_pb2.pyi +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/message_pb2_grpc.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/message_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/node_pb2.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/node_pb2.pyi +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/node_pb2_grpc.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/node_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/recordset_pb2.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/recordset_pb2.pyi +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/recordset_pb2_grpc.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/recordset_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/run_pb2.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/run_pb2.pyi +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/run_pb2_grpc.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/run_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/serverappio_pb2.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/serverappio_pb2.pyi +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/serverappio_pb2_grpc.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/serverappio_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/simulationio_pb2.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/simulationio_pb2.pyi +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/simulationio_pb2_grpc.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/simulationio_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/transport_pb2.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/transport_pb2.pyi +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/transport_pb2_grpc.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/py.typed +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/client_manager.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/client_proxy.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/compat/legacy_context.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/criterion.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/fleet_event_log_interceptor.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/history.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/server.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/server_config.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/serverapp/__init__.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/serverapp_components.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/strategy/__init__.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/strategy/aggregate.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/strategy/bulyan.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/strategy/fedadagrad.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/strategy/fedadam.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/strategy/fedavg.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/strategy/fedavg_android.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/strategy/fedavgm.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/strategy/fedmedian.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/strategy/fedopt.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/strategy/fedprox.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/strategy/fedyogi.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/strategy/krum.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/strategy/qfedavg.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/strategy/strategy.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/superlink/__init__.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/superlink/ffs/__init__.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/superlink/ffs/disk_ffs.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/superlink/ffs/ffs.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/superlink/ffs/ffs_factory.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/superlink/fleet/__init__.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/superlink/fleet/grpc_adapter/__init__.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/superlink/fleet/message_handler/message_handler.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/superlink/fleet/vce/vce_api.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/superlink/linkstate/__init__.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/superlink/linkstate/linkstate.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/superlink/linkstate/linkstate_factory.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/superlink/simulation/__init__.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/superlink/simulation/simulationio_grpc.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/superlink/simulation/simulationio_servicer.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/superlink/utils.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/utils/__init__.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/utils/tensorboard.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/utils/validator.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/workflow/__init__.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/workflow/constant.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/simulation/__init__.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/simulation/app.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/simulation/legacy_app.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/simulation/ray_transport/__init__.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/simulation/ray_transport/utils.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/simulation/simulationio_connection.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/superexec/__init__.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/superexec/app.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/superexec/deployment.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/superexec/exec_event_log_interceptor.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/superexec/exec_grpc.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/superexec/exec_servicer.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/superexec/exec_user_auth_interceptor.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/superexec/executor.py +0 -0
- {flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/superexec/simulation.py +0 -0
@@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api"
|
|
4
4
|
|
5
5
|
[tool.poetry]
|
6
6
|
name = "flwr-nightly"
|
7
|
-
version = "1.17.0.
|
7
|
+
version = "1.17.0.dev20250319"
|
8
8
|
description = "Flower: A Friendly Federated AI Framework"
|
9
9
|
license = "Apache-2.0"
|
10
10
|
authors = ["The Flower Authors <hello@flower.ai>"]
|
{flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/common/constant.py
RENAMED
@@ -61,6 +61,7 @@ PING_CALL_TIMEOUT = 5
|
|
61
61
|
PING_BASE_MULTIPLIER = 0.8
|
62
62
|
PING_RANDOM_RANGE = (-0.1, 0.1)
|
63
63
|
PING_MAX_INTERVAL = 1e300
|
64
|
+
PING_PATIENCE = 2
|
64
65
|
|
65
66
|
# IDs
|
66
67
|
RUN_ID_NUM_BYTES = 8
|
@@ -120,6 +121,9 @@ TIMESTAMP_HEADER = "flwr-timestamp"
|
|
120
121
|
TIMESTAMP_TOLERANCE = 10 # General tolerance for timestamp verification
|
121
122
|
SYSTEM_TIME_TOLERANCE = 5 # Allowance for system time drift
|
122
123
|
|
124
|
+
# Constants for ParametersRecord
|
125
|
+
GC_THRESHOLD = 200_000_000 # 200 MB
|
126
|
+
|
123
127
|
|
124
128
|
class MessageType:
|
125
129
|
"""Message type."""
|
@@ -163,6 +167,7 @@ class ErrorCode:
|
|
163
167
|
CLIENT_APP_RAISED_EXCEPTION = 2
|
164
168
|
MESSAGE_UNAVAILABLE = 3
|
165
169
|
REPLY_MESSAGE_UNAVAILABLE = 4
|
170
|
+
NODE_UNAVAILABLE = 5
|
166
171
|
|
167
172
|
def __new__(cls) -> ErrorCode:
|
168
173
|
"""Prevent instantiation."""
|
{flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/common/logger.py
RENAMED
@@ -250,9 +250,9 @@ def warn_deprecated_feature_with_example(
|
|
250
250
|
log(
|
251
251
|
WARN,
|
252
252
|
"""FEATURE UPDATE: %s
|
253
|
-
|
253
|
+
------------------------------------------------------------
|
254
254
|
%s
|
255
|
-
|
255
|
+
------------------------------------------------------------
|
256
256
|
""",
|
257
257
|
example_message,
|
258
258
|
code_example,
|
@@ -0,0 +1,583 @@
|
|
1
|
+
# Copyright 2024 Flower Labs GmbH. All Rights Reserved.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
# ==============================================================================
|
15
|
+
"""ParametersRecord and Array."""
|
16
|
+
|
17
|
+
|
18
|
+
from __future__ import annotations
|
19
|
+
|
20
|
+
import gc
|
21
|
+
import sys
|
22
|
+
from collections import OrderedDict
|
23
|
+
from dataclasses import dataclass
|
24
|
+
from io import BytesIO
|
25
|
+
from typing import TYPE_CHECKING, Any, cast, overload
|
26
|
+
|
27
|
+
import numpy as np
|
28
|
+
|
29
|
+
from ..constant import GC_THRESHOLD, SType
|
30
|
+
from ..typing import NDArray
|
31
|
+
from .typeddict import TypedDict
|
32
|
+
|
33
|
+
if TYPE_CHECKING:
|
34
|
+
import torch
|
35
|
+
|
36
|
+
|
37
|
+
def _raise_array_init_error() -> None:
|
38
|
+
raise TypeError(
|
39
|
+
f"Invalid arguments for {Array.__qualname__}. Expected either a "
|
40
|
+
"PyTorch tensor, a NumPy ndarray, or explicit"
|
41
|
+
" dtype/shape/stype/data values."
|
42
|
+
)
|
43
|
+
|
44
|
+
|
45
|
+
def _raise_parameters_record_init_error() -> None:
|
46
|
+
raise TypeError(
|
47
|
+
f"Invalid arguments for {ParametersRecord.__qualname__}. Expected either "
|
48
|
+
"a list of NumPy ndarrays, a PyTorch state_dict, or a dictionary of Arrays. "
|
49
|
+
"The `keep_input` argument is keyword-only."
|
50
|
+
)
|
51
|
+
|
52
|
+
|
53
|
+
@dataclass
|
54
|
+
class Array:
|
55
|
+
"""Array type.
|
56
|
+
|
57
|
+
A dataclass containing serialized data from an array-like or tensor-like object
|
58
|
+
along with metadata about it. The class can be initialized in one of three ways:
|
59
|
+
|
60
|
+
1. By specifying explicit values for `dtype`, `shape`, `stype`, and `data`.
|
61
|
+
2. By providing a NumPy ndarray (via the `ndarray` argument).
|
62
|
+
3. By providing a PyTorch tensor (via the `torch_tensor` argument).
|
63
|
+
|
64
|
+
In scenarios (2)-(3), the `dtype`, `shape`, `stype`, and `data` are automatically
|
65
|
+
derived from the input. In scenario (1), these fields must be specified manually.
|
66
|
+
|
67
|
+
Parameters
|
68
|
+
----------
|
69
|
+
dtype : Optional[str] (default: None)
|
70
|
+
A string representing the data type of the serialized object (e.g. `"float32"`).
|
71
|
+
Only required if you are not passing in a ndarray or a tensor.
|
72
|
+
|
73
|
+
shape : Optional[list[int]] (default: None)
|
74
|
+
A list representing the shape of the unserialized array-like object. Only
|
75
|
+
required if you are not passing in a ndarray or a tensor.
|
76
|
+
|
77
|
+
stype : Optional[str] (default: None)
|
78
|
+
A string indicating the serialization mechanism used to generate the bytes in
|
79
|
+
`data` from an array-like or tensor-like object. Only required if you are not
|
80
|
+
passing in a ndarray or a tensor.
|
81
|
+
|
82
|
+
data : Optional[bytes] (default: None)
|
83
|
+
A buffer of bytes containing the data. Only required if you are not passing in
|
84
|
+
a ndarray or a tensor.
|
85
|
+
|
86
|
+
ndarray : Optional[NDArray] (default: None)
|
87
|
+
A NumPy ndarray. If provided, the `dtype`, `shape`, `stype`, and `data`
|
88
|
+
fields are derived automatically from it.
|
89
|
+
|
90
|
+
torch_tensor : Optional[torch.Tensor] (default: None)
|
91
|
+
A PyTorch tensor. If provided, it will be **detached and moved to CPU**
|
92
|
+
before conversion, and the `dtype`, `shape`, `stype`, and `data` fields
|
93
|
+
will be derived automatically from it.
|
94
|
+
|
95
|
+
Examples
|
96
|
+
--------
|
97
|
+
Initializing by specifying all fields directly:
|
98
|
+
|
99
|
+
>>> arr1 = Array(
|
100
|
+
>>> dtype="float32",
|
101
|
+
>>> shape=[3, 3],
|
102
|
+
>>> stype="numpy.ndarray",
|
103
|
+
>>> data=b"serialized_data...",
|
104
|
+
>>> )
|
105
|
+
|
106
|
+
Initializing with a NumPy ndarray:
|
107
|
+
|
108
|
+
>>> import numpy as np
|
109
|
+
>>> arr2 = Array(np.random.randn(3, 3))
|
110
|
+
|
111
|
+
Initializing with a PyTorch tensor:
|
112
|
+
|
113
|
+
>>> import torch
|
114
|
+
>>> arr3 = Array(torch.randn(3, 3))
|
115
|
+
"""
|
116
|
+
|
117
|
+
dtype: str
|
118
|
+
shape: list[int]
|
119
|
+
stype: str
|
120
|
+
data: bytes
|
121
|
+
|
122
|
+
@overload
|
123
|
+
def __init__( # noqa: E704
|
124
|
+
self, dtype: str, shape: list[int], stype: str, data: bytes
|
125
|
+
) -> None: ...
|
126
|
+
|
127
|
+
@overload
|
128
|
+
def __init__(self, ndarray: NDArray) -> None: ... # noqa: E704
|
129
|
+
|
130
|
+
@overload
|
131
|
+
def __init__(self, torch_tensor: torch.Tensor) -> None: ... # noqa: E704
|
132
|
+
|
133
|
+
def __init__( # pylint: disable=too-many-arguments, too-many-locals
|
134
|
+
self,
|
135
|
+
*args: Any,
|
136
|
+
dtype: str | None = None,
|
137
|
+
shape: list[int] | None = None,
|
138
|
+
stype: str | None = None,
|
139
|
+
data: bytes | None = None,
|
140
|
+
ndarray: NDArray | None = None,
|
141
|
+
torch_tensor: torch.Tensor | None = None,
|
142
|
+
) -> None:
|
143
|
+
# Determine the initialization method and validate input arguments.
|
144
|
+
# Support three initialization formats:
|
145
|
+
# 1. Array(dtype: str, shape: list[int], stype: str, data: bytes)
|
146
|
+
# 2. Array(ndarray: NDArray)
|
147
|
+
# 3. Array(torch_tensor: torch.Tensor)
|
148
|
+
|
149
|
+
# Initialize all arguments
|
150
|
+
# If more than 4 positional arguments are provided, raise an error.
|
151
|
+
if len(args) > 4:
|
152
|
+
_raise_array_init_error()
|
153
|
+
all_args = [None] * 4
|
154
|
+
for i, arg in enumerate(args):
|
155
|
+
all_args[i] = arg
|
156
|
+
init_method: str | None = None # Track which init method is being used
|
157
|
+
|
158
|
+
# Try to assign a value to all_args[index] if it's not already set.
|
159
|
+
# If an initialization method is provided, update init_method.
|
160
|
+
def _try_set_arg(index: int, arg: Any, method: str) -> None:
|
161
|
+
# Skip if arg is None
|
162
|
+
if arg is None:
|
163
|
+
return
|
164
|
+
# Raise an error if all_args[index] is already set
|
165
|
+
if all_args[index] is not None:
|
166
|
+
_raise_array_init_error()
|
167
|
+
# Raise an error if a different initialization method is already set
|
168
|
+
nonlocal init_method
|
169
|
+
if init_method is not None and init_method != method:
|
170
|
+
_raise_array_init_error()
|
171
|
+
# Set init_method and all_args[index]
|
172
|
+
if init_method is None:
|
173
|
+
init_method = method
|
174
|
+
all_args[index] = arg
|
175
|
+
|
176
|
+
# Try to set keyword arguments in all_args
|
177
|
+
_try_set_arg(0, dtype, "direct")
|
178
|
+
_try_set_arg(1, shape, "direct")
|
179
|
+
_try_set_arg(2, stype, "direct")
|
180
|
+
_try_set_arg(3, data, "direct")
|
181
|
+
_try_set_arg(0, ndarray, "ndarray")
|
182
|
+
_try_set_arg(0, torch_tensor, "torch_tensor")
|
183
|
+
|
184
|
+
# Check if all arguments are correctly set
|
185
|
+
all_args = [arg for arg in all_args if arg is not None]
|
186
|
+
|
187
|
+
# Handle direct field initialization
|
188
|
+
if not init_method or init_method == "direct":
|
189
|
+
if (
|
190
|
+
len(all_args) == 4 # pylint: disable=too-many-boolean-expressions
|
191
|
+
and isinstance(all_args[0], str)
|
192
|
+
and isinstance(all_args[1], list)
|
193
|
+
and all(isinstance(i, int) for i in all_args[1])
|
194
|
+
and isinstance(all_args[2], str)
|
195
|
+
and isinstance(all_args[3], bytes)
|
196
|
+
):
|
197
|
+
self.dtype, self.shape, self.stype, self.data = all_args
|
198
|
+
return
|
199
|
+
|
200
|
+
# Handle NumPy array
|
201
|
+
if not init_method or init_method == "ndarray":
|
202
|
+
if len(all_args) == 1 and isinstance(all_args[0], np.ndarray):
|
203
|
+
self.__dict__.update(self.from_numpy_ndarray(all_args[0]).__dict__)
|
204
|
+
return
|
205
|
+
|
206
|
+
# Handle PyTorch tensor
|
207
|
+
if not init_method or init_method == "torch_tensor":
|
208
|
+
if (
|
209
|
+
len(all_args) == 1
|
210
|
+
and "torch" in sys.modules
|
211
|
+
and isinstance(all_args[0], sys.modules["torch"].Tensor)
|
212
|
+
):
|
213
|
+
self.__dict__.update(self.from_torch_tensor(all_args[0]).__dict__)
|
214
|
+
return
|
215
|
+
|
216
|
+
_raise_array_init_error()
|
217
|
+
|
218
|
+
@classmethod
|
219
|
+
def from_numpy_ndarray(cls, ndarray: NDArray) -> Array:
|
220
|
+
"""Create Array from NumPy ndarray."""
|
221
|
+
assert isinstance(
|
222
|
+
ndarray, np.ndarray
|
223
|
+
), f"Expected NumPy ndarray, got {type(ndarray)}"
|
224
|
+
buffer = BytesIO()
|
225
|
+
# WARNING: NEVER set allow_pickle to true.
|
226
|
+
# Reason: loading pickled data can execute arbitrary code
|
227
|
+
# Source: https://numpy.org/doc/stable/reference/generated/numpy.save.html
|
228
|
+
np.save(buffer, ndarray, allow_pickle=False)
|
229
|
+
data = buffer.getvalue()
|
230
|
+
return Array(
|
231
|
+
dtype=str(ndarray.dtype),
|
232
|
+
shape=list(ndarray.shape),
|
233
|
+
stype=SType.NUMPY,
|
234
|
+
data=data,
|
235
|
+
)
|
236
|
+
|
237
|
+
@classmethod
|
238
|
+
def from_torch_tensor(cls, tensor: torch.Tensor) -> Array:
|
239
|
+
"""Create Array from PyTorch tensor."""
|
240
|
+
if not (torch := sys.modules.get("torch")):
|
241
|
+
raise RuntimeError(
|
242
|
+
f"PyTorch is required to use {cls.from_torch_tensor.__name__}"
|
243
|
+
)
|
244
|
+
|
245
|
+
assert isinstance(
|
246
|
+
tensor, torch.Tensor
|
247
|
+
), f"Expected PyTorch Tensor, got {type(tensor)}"
|
248
|
+
return cls.from_numpy_ndarray(tensor.detach().cpu().numpy())
|
249
|
+
|
250
|
+
def numpy(self) -> NDArray:
|
251
|
+
"""Return the array as a NumPy array."""
|
252
|
+
if self.stype != SType.NUMPY:
|
253
|
+
raise TypeError(
|
254
|
+
f"Unsupported serialization type for numpy conversion: '{self.stype}'"
|
255
|
+
)
|
256
|
+
bytes_io = BytesIO(self.data)
|
257
|
+
# WARNING: NEVER set allow_pickle to true.
|
258
|
+
# Reason: loading pickled data can execute arbitrary code
|
259
|
+
# Source: https://numpy.org/doc/stable/reference/generated/numpy.load.html
|
260
|
+
ndarray_deserialized = np.load(bytes_io, allow_pickle=False)
|
261
|
+
return cast(NDArray, ndarray_deserialized)
|
262
|
+
|
263
|
+
|
264
|
+
def _check_key(key: str) -> None:
|
265
|
+
"""Check if key is of expected type."""
|
266
|
+
if not isinstance(key, str):
|
267
|
+
raise TypeError(f"Key must be of type `str` but `{type(key)}` was passed.")
|
268
|
+
|
269
|
+
|
270
|
+
def _check_value(value: Array) -> None:
|
271
|
+
if not isinstance(value, Array):
|
272
|
+
raise TypeError(
|
273
|
+
f"Value must be of type `{Array}` but `{type(value)}` was passed."
|
274
|
+
)
|
275
|
+
|
276
|
+
|
277
|
+
class ParametersRecord(TypedDict[str, Array]):
|
278
|
+
r"""Parameters record.
|
279
|
+
|
280
|
+
A typed dictionary (``str`` to :class:`Array`) that can store named parameters
|
281
|
+
as serialized tensors. Internally, this behaves similarly to an
|
282
|
+
``OrderedDict[str, Array]``. A ``ParametersRecord`` can be viewed as an
|
283
|
+
equivalent to PyTorch's ``state_dict``, but it holds arrays in serialized form.
|
284
|
+
|
285
|
+
This object is one of the record types supported by :class:`RecordSet` and can
|
286
|
+
therefore be stored in the ``content`` of a :class:`Message` or the ``state``
|
287
|
+
of a :class:`Context`.
|
288
|
+
|
289
|
+
This class can be instantiated in multiple ways:
|
290
|
+
|
291
|
+
1. By providing nothing (empty container).
|
292
|
+
2. By providing a dictionary of :class:`Array` (via the ``array_dict`` argument).
|
293
|
+
3. By providing a list of NumPy ``ndarray`` (via the ``numpy_ndarrays`` argument).
|
294
|
+
4. By providing a PyTorch ``state_dict`` (via the ``torch_state_dict`` argument).
|
295
|
+
|
296
|
+
Parameters
|
297
|
+
----------
|
298
|
+
array_dict : Optional[OrderedDict[str, Array]] (default: None)
|
299
|
+
An existing dictionary containing named :class:`Array` instances. If
|
300
|
+
provided, these entries will be used directly to populate the record.
|
301
|
+
numpy_ndarrays : Optional[list[NDArray]] (default: None)
|
302
|
+
A list of NumPy arrays. Each array will be automatically converted
|
303
|
+
into an :class:`Array` and stored in this record with generated keys.
|
304
|
+
torch_state_dict : Optional[OrderedDict[str, torch.Tensor]] (default: None)
|
305
|
+
A PyTorch ``state_dict`` (``str`` keys to ``torch.Tensor`` values). Each
|
306
|
+
tensor will be converted into an :class:`Array` and stored in this record.
|
307
|
+
keep_input : bool (default: True)
|
308
|
+
If ``False``, entries from the input are removed after being added to
|
309
|
+
this record to free up memory. If ``True``, the input remains unchanged.
|
310
|
+
Regardless of this value, no duplicate memory is used if the input is a
|
311
|
+
dictionary of :class:`Array`, i.e., ``array_dict``.
|
312
|
+
|
313
|
+
Examples
|
314
|
+
--------
|
315
|
+
Initializing an empty ParametersRecord:
|
316
|
+
|
317
|
+
>>> p_record = ParametersRecord()
|
318
|
+
|
319
|
+
Initializing with a dictionary of :class:`Array`:
|
320
|
+
|
321
|
+
>>> arr = Array("float32", [5, 5], "numpy.ndarray", b"serialized_data...")
|
322
|
+
>>> p_record = ParametersRecord({"weight": arr})
|
323
|
+
|
324
|
+
Initializing with a list of NumPy arrays:
|
325
|
+
|
326
|
+
>>> import numpy as np
|
327
|
+
>>> arr1 = np.random.randn(3, 3)
|
328
|
+
>>> arr2 = np.random.randn(2, 2)
|
329
|
+
>>> p_record = ParametersRecord([arr1, arr2])
|
330
|
+
|
331
|
+
Initializing with a PyTorch model state_dict:
|
332
|
+
|
333
|
+
>>> import torch.nn as nn
|
334
|
+
>>> model = nn.Linear(10, 5)
|
335
|
+
>>> p_record = ParametersRecord(model.state_dict())
|
336
|
+
|
337
|
+
Initializing with a TensorFlow model weights (a list of NumPy arrays):
|
338
|
+
|
339
|
+
>>> import tensorflow as tf
|
340
|
+
>>> model = tf.keras.Sequential([tf.keras.layers.Dense(5, input_shape=(10,))])
|
341
|
+
>>> p_record = ParametersRecord(model.get_weights())
|
342
|
+
"""
|
343
|
+
|
344
|
+
@overload
|
345
|
+
def __init__(self) -> None: ... # noqa: E704
|
346
|
+
|
347
|
+
@overload
|
348
|
+
def __init__( # noqa: E704
|
349
|
+
self, array_dict: OrderedDict[str, Array], *, keep_input: bool = True
|
350
|
+
) -> None: ...
|
351
|
+
|
352
|
+
@overload
|
353
|
+
def __init__( # noqa: E704
|
354
|
+
self, numpy_ndarrays: list[NDArray], *, keep_input: bool = True
|
355
|
+
) -> None: ...
|
356
|
+
|
357
|
+
@overload
|
358
|
+
def __init__( # noqa: E704
|
359
|
+
self,
|
360
|
+
torch_state_dict: OrderedDict[str, torch.Tensor],
|
361
|
+
*,
|
362
|
+
keep_input: bool = True,
|
363
|
+
) -> None: ...
|
364
|
+
|
365
|
+
def __init__( # pylint: disable=too-many-arguments
|
366
|
+
self,
|
367
|
+
*args: Any,
|
368
|
+
numpy_ndarrays: list[NDArray] | None = None,
|
369
|
+
torch_state_dict: OrderedDict[str, torch.Tensor] | None = None,
|
370
|
+
array_dict: OrderedDict[str, Array] | None = None,
|
371
|
+
keep_input: bool = True,
|
372
|
+
) -> None:
|
373
|
+
super().__init__(_check_key, _check_value)
|
374
|
+
|
375
|
+
# Determine the initialization method and validates input arguments.
|
376
|
+
# Support the following initialization formats:
|
377
|
+
# 1. cls(array_dict: OrderedDict[str, Array], keep_input: bool)
|
378
|
+
# 2. cls(numpy_ndarrays: list[NDArray], keep_input: bool)
|
379
|
+
# 3. cls(torch_state_dict: dict[str, torch.Tensor], keep_input: bool)
|
380
|
+
|
381
|
+
# Init the argument
|
382
|
+
if len(args) > 1:
|
383
|
+
_raise_parameters_record_init_error()
|
384
|
+
arg = args[0] if args else None
|
385
|
+
init_method: str | None = None # Track which init method is being used
|
386
|
+
|
387
|
+
# Try to assign a value to arg if it's not already set.
|
388
|
+
# If an initialization method is provided, update init_method.
|
389
|
+
def _try_set_arg(_arg: Any, method: str) -> None:
|
390
|
+
# Skip if _arg is None
|
391
|
+
if _arg is None:
|
392
|
+
return
|
393
|
+
nonlocal arg, init_method
|
394
|
+
# Raise an error if arg is already set
|
395
|
+
if arg is not None:
|
396
|
+
_raise_parameters_record_init_error()
|
397
|
+
# Raise an error if a different initialization method is already set
|
398
|
+
if init_method is not None:
|
399
|
+
_raise_parameters_record_init_error()
|
400
|
+
# Set init_method and arg
|
401
|
+
if init_method is None:
|
402
|
+
init_method = method
|
403
|
+
arg = _arg
|
404
|
+
|
405
|
+
# Try to set keyword arguments
|
406
|
+
_try_set_arg(array_dict, "array_dict")
|
407
|
+
_try_set_arg(numpy_ndarrays, "numpy_ndarrays")
|
408
|
+
_try_set_arg(torch_state_dict, "state_dict")
|
409
|
+
|
410
|
+
# If no arguments are provided, return and keep self empty
|
411
|
+
if arg is None:
|
412
|
+
return
|
413
|
+
|
414
|
+
# Handle dictionary of Arrays
|
415
|
+
if not init_method or init_method == "array_dict":
|
416
|
+
# Type check the input
|
417
|
+
if (
|
418
|
+
isinstance(arg, dict)
|
419
|
+
and all(isinstance(k, str) for k in arg.keys())
|
420
|
+
and all(isinstance(v, Array) for v in arg.values())
|
421
|
+
):
|
422
|
+
array_dict = cast(OrderedDict[str, Array], arg)
|
423
|
+
converted = self.from_array_dict(array_dict, keep_input=keep_input)
|
424
|
+
self.__dict__.update(converted.__dict__)
|
425
|
+
return
|
426
|
+
|
427
|
+
# Handle NumPy ndarrays
|
428
|
+
if not init_method or init_method == "numpy_ndarrays":
|
429
|
+
# Type check the input
|
430
|
+
# pylint: disable-next=not-an-iterable
|
431
|
+
if isinstance(arg, list) and all(isinstance(v, np.ndarray) for v in arg):
|
432
|
+
numpy_ndarrays = cast(list[NDArray], arg)
|
433
|
+
converted = self.from_numpy_ndarrays(
|
434
|
+
numpy_ndarrays, keep_input=keep_input
|
435
|
+
)
|
436
|
+
self.__dict__.update(converted.__dict__)
|
437
|
+
return
|
438
|
+
|
439
|
+
# Handle PyTorch state_dict
|
440
|
+
if not init_method or init_method == "state_dict":
|
441
|
+
# Type check the input
|
442
|
+
if (
|
443
|
+
(torch := sys.modules.get("torch")) is not None
|
444
|
+
and isinstance(arg, dict)
|
445
|
+
and all(isinstance(k, str) for k in arg.keys())
|
446
|
+
and all(isinstance(v, torch.Tensor) for v in arg.values())
|
447
|
+
):
|
448
|
+
torch_state_dict = cast(
|
449
|
+
OrderedDict[str, torch.Tensor], arg # type: ignore
|
450
|
+
)
|
451
|
+
converted = self.from_torch_state_dict(
|
452
|
+
torch_state_dict, keep_input=keep_input
|
453
|
+
)
|
454
|
+
self.__dict__.update(converted.__dict__)
|
455
|
+
return
|
456
|
+
|
457
|
+
_raise_parameters_record_init_error()
|
458
|
+
|
459
|
+
@classmethod
|
460
|
+
def from_array_dict(
|
461
|
+
cls,
|
462
|
+
array_dict: OrderedDict[str, Array],
|
463
|
+
*,
|
464
|
+
keep_input: bool = True,
|
465
|
+
) -> ParametersRecord:
|
466
|
+
"""Create ParametersRecord from a dictionary of :class:`Array`."""
|
467
|
+
record = ParametersRecord()
|
468
|
+
for k, v in array_dict.items():
|
469
|
+
record[k] = Array(
|
470
|
+
dtype=v.dtype, shape=list(v.shape), stype=v.stype, data=v.data
|
471
|
+
)
|
472
|
+
if not keep_input:
|
473
|
+
array_dict.clear()
|
474
|
+
return record
|
475
|
+
|
476
|
+
@classmethod
|
477
|
+
def from_numpy_ndarrays(
|
478
|
+
cls,
|
479
|
+
ndarrays: list[NDArray],
|
480
|
+
*,
|
481
|
+
keep_input: bool = True,
|
482
|
+
) -> ParametersRecord:
|
483
|
+
"""Create ParametersRecord from a list of NumPy ``ndarray``."""
|
484
|
+
record = ParametersRecord()
|
485
|
+
total_serialized_bytes = 0
|
486
|
+
|
487
|
+
for i in range(len(ndarrays)): # pylint: disable=C0200
|
488
|
+
record[str(i)] = Array.from_numpy_ndarray(ndarrays[i])
|
489
|
+
|
490
|
+
if not keep_input:
|
491
|
+
# Remove the reference
|
492
|
+
ndarrays[i] = None # type: ignore
|
493
|
+
total_serialized_bytes += len(record[str(i)].data)
|
494
|
+
|
495
|
+
# If total serialized data exceeds the threshold, trigger GC
|
496
|
+
if total_serialized_bytes > GC_THRESHOLD:
|
497
|
+
total_serialized_bytes = 0
|
498
|
+
gc.collect()
|
499
|
+
|
500
|
+
if not keep_input:
|
501
|
+
# Clear the entire list to remove all references and force GC
|
502
|
+
ndarrays.clear()
|
503
|
+
gc.collect()
|
504
|
+
return record
|
505
|
+
|
506
|
+
@classmethod
|
507
|
+
def from_torch_state_dict(
|
508
|
+
cls,
|
509
|
+
state_dict: OrderedDict[str, torch.Tensor],
|
510
|
+
*,
|
511
|
+
keep_input: bool = True,
|
512
|
+
) -> ParametersRecord:
|
513
|
+
"""Create ParametersRecord from PyTorch ``state_dict``."""
|
514
|
+
if "torch" not in sys.modules:
|
515
|
+
raise RuntimeError(
|
516
|
+
f"PyTorch is required to use {cls.from_torch_state_dict.__name__}"
|
517
|
+
)
|
518
|
+
|
519
|
+
record = ParametersRecord()
|
520
|
+
|
521
|
+
for k in list(state_dict.keys()):
|
522
|
+
v = state_dict[k] if keep_input else state_dict.pop(k)
|
523
|
+
record[k] = Array.from_numpy_ndarray(v.detach().cpu().numpy())
|
524
|
+
|
525
|
+
return record
|
526
|
+
|
527
|
+
def to_numpy_ndarrays(self, *, keep_input: bool = True) -> list[NDArray]:
|
528
|
+
"""Return the ParametersRecord as a list of NumPy ``ndarray``."""
|
529
|
+
if keep_input:
|
530
|
+
return [v.numpy() for v in self.values()]
|
531
|
+
|
532
|
+
# Clear the record and return the list of NumPy arrays
|
533
|
+
ret: list[NDArray] = []
|
534
|
+
total_serialized_bytes = 0
|
535
|
+
for k in list(self.keys()):
|
536
|
+
arr = self.pop(k)
|
537
|
+
ret.append(arr.numpy())
|
538
|
+
total_serialized_bytes += len(arr.data)
|
539
|
+
del arr
|
540
|
+
|
541
|
+
# If total serialized data exceeds the threshold, trigger GC
|
542
|
+
if total_serialized_bytes > GC_THRESHOLD:
|
543
|
+
total_serialized_bytes = 0
|
544
|
+
gc.collect()
|
545
|
+
|
546
|
+
if not keep_input:
|
547
|
+
# Force GC
|
548
|
+
gc.collect()
|
549
|
+
return ret
|
550
|
+
|
551
|
+
def to_torch_state_dict(
|
552
|
+
self, *, keep_input: bool = True
|
553
|
+
) -> OrderedDict[str, torch.Tensor]:
|
554
|
+
"""Return the ParametersRecord as a PyTorch ``state_dict``."""
|
555
|
+
if not (torch := sys.modules.get("torch")):
|
556
|
+
raise RuntimeError(
|
557
|
+
f"PyTorch is required to use {self.to_torch_state_dict.__name__}"
|
558
|
+
)
|
559
|
+
|
560
|
+
state_dict = OrderedDict()
|
561
|
+
|
562
|
+
for k in list(self.keys()):
|
563
|
+
arr = self[k] if keep_input else self.pop(k)
|
564
|
+
state_dict[k] = torch.from_numpy(arr.numpy())
|
565
|
+
|
566
|
+
return state_dict
|
567
|
+
|
568
|
+
def count_bytes(self) -> int:
|
569
|
+
"""Return number of Bytes stored in this object.
|
570
|
+
|
571
|
+
Note that a small amount of Bytes might also be included in this counting that
|
572
|
+
correspond to metadata of the serialized object (e.g. of NumPy array) needed for
|
573
|
+
deseralization.
|
574
|
+
"""
|
575
|
+
num_bytes = 0
|
576
|
+
|
577
|
+
for k, v in self.items():
|
578
|
+
num_bytes += len(v.data)
|
579
|
+
|
580
|
+
# We also count the bytes footprint of the keys
|
581
|
+
num_bytes += len(k)
|
582
|
+
|
583
|
+
return num_bytes
|
{flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/__init__.py
RENAMED
@@ -21,7 +21,8 @@ from .app import start_server as start_server
|
|
21
21
|
from .client_manager import ClientManager as ClientManager
|
22
22
|
from .client_manager import SimpleClientManager as SimpleClientManager
|
23
23
|
from .compat import LegacyContext as LegacyContext
|
24
|
-
from .
|
24
|
+
from .grid import Driver as Driver
|
25
|
+
from .grid import Grid as Grid
|
25
26
|
from .history import History as History
|
26
27
|
from .server import Server as Server
|
27
28
|
from .server_app import ServerApp as ServerApp
|
@@ -31,6 +32,7 @@ from .serverapp_components import ServerAppComponents as ServerAppComponents
|
|
31
32
|
__all__ = [
|
32
33
|
"ClientManager",
|
33
34
|
"Driver",
|
35
|
+
"Grid",
|
34
36
|
"History",
|
35
37
|
"LegacyContext",
|
36
38
|
"Server",
|
{flwr_nightly-1.17.0.dev20250317 → flwr_nightly-1.17.0.dev20250319}/src/py/flwr/server/app.py
RENAMED
@@ -79,13 +79,13 @@ from .history import History
|
|
79
79
|
from .server import Server, init_defaults, run_fl
|
80
80
|
from .server_config import ServerConfig
|
81
81
|
from .strategy import Strategy
|
82
|
-
from .superlink.driver.serverappio_grpc import run_serverappio_api_grpc
|
83
82
|
from .superlink.ffs.ffs_factory import FfsFactory
|
84
83
|
from .superlink.fleet.grpc_adapter.grpc_adapter_servicer import GrpcAdapterServicer
|
85
84
|
from .superlink.fleet.grpc_bidi.grpc_server import start_grpc_server
|
86
85
|
from .superlink.fleet.grpc_rere.fleet_servicer import FleetServicer
|
87
86
|
from .superlink.fleet.grpc_rere.server_interceptor import AuthenticateServerInterceptor
|
88
87
|
from .superlink.linkstate import LinkStateFactory
|
88
|
+
from .superlink.serverappio.serverappio_grpc import run_serverappio_api_grpc
|
89
89
|
from .superlink.simulation.simulationio_grpc import run_simulationio_api_grpc
|
90
90
|
|
91
91
|
DATABASE = ":flwr-in-memory-state:"
|
@@ -15,10 +15,10 @@
|
|
15
15
|
"""Flower ServerApp compatibility package."""
|
16
16
|
|
17
17
|
|
18
|
-
from .app import
|
18
|
+
from .app import start_grid as start_grid
|
19
19
|
from .legacy_context import LegacyContext as LegacyContext
|
20
20
|
|
21
21
|
__all__ = [
|
22
22
|
"LegacyContext",
|
23
|
-
"
|
23
|
+
"start_grid",
|
24
24
|
]
|