flwr-nightly 1.26.0.dev20260129__py3-none-any.whl → 1.26.0.dev20260130__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/cli/build.py +1 -1
- flwr/cli/config_migration.py +2 -2
- flwr/cli/install.py +1 -1
- flwr/cli/run/run.py +2 -2
- flwr/cli/supernode/register.py +1 -2
- flwr/client/grpc_rere_client/connection.py +1 -1
- flwr/common/args.py +4 -4
- flwr/common/config.py +2 -2
- flwr/common/exit/exit.py +3 -3
- flwr/common/logger.py +1 -1
- flwr/server/app.py +1 -1
- flwr/server/serverapp/app.py +11 -4
- flwr/server/superlink/linkstate/linkstate_factory.py +12 -4
- flwr/supercore/ffs/disk_ffs.py +1 -1
- flwr/supercore/object_store/object_store_factory.py +10 -2
- flwr/supercore/sql_mixin.py +8 -2
- flwr/supernode/cli/flower_supernode.py +2 -1
- {flwr_nightly-1.26.0.dev20260129.dist-info → flwr_nightly-1.26.0.dev20260130.dist-info}/METADATA +1 -1
- {flwr_nightly-1.26.0.dev20260129.dist-info → flwr_nightly-1.26.0.dev20260130.dist-info}/RECORD +21 -21
- {flwr_nightly-1.26.0.dev20260129.dist-info → flwr_nightly-1.26.0.dev20260130.dist-info}/WHEEL +0 -0
- {flwr_nightly-1.26.0.dev20260129.dist-info → flwr_nightly-1.26.0.dev20260130.dist-info}/entry_points.txt +0 -0
flwr/cli/build.py
CHANGED
flwr/cli/config_migration.py
CHANGED
|
@@ -125,7 +125,7 @@ def _migrate_pyproject_toml_to_flower_config(
|
|
|
125
125
|
if cert_path := toml_fed_config.get("root-certificates"):
|
|
126
126
|
if not Path(cert_path).is_absolute():
|
|
127
127
|
toml_fed_config["root-certificates"] = str(
|
|
128
|
-
(app / cert_path).resolve()
|
|
128
|
+
(app / cert_path).expanduser().resolve()
|
|
129
129
|
)
|
|
130
130
|
# Parse and write SuperLink connection
|
|
131
131
|
conn = parse_superlink_connection(toml_fed_config, name)
|
|
@@ -223,7 +223,7 @@ def migrate(
|
|
|
223
223
|
# Determine app path for migration
|
|
224
224
|
arg1 = positional_arg_1
|
|
225
225
|
app = Path(arg1) if arg1 else Path(".")
|
|
226
|
-
app = app.resolve()
|
|
226
|
+
app = app.expanduser().resolve()
|
|
227
227
|
|
|
228
228
|
# Check if migration is applicable and if legacy usage is detected
|
|
229
229
|
is_migratable, reason = _is_migratable(app)
|
flwr/cli/install.py
CHANGED
|
@@ -63,7 +63,7 @@ def install(
|
|
|
63
63
|
if source is None:
|
|
64
64
|
source = Path(typer.prompt("Enter the source FAB file"))
|
|
65
65
|
|
|
66
|
-
source = source.resolve()
|
|
66
|
+
source = source.expanduser().resolve()
|
|
67
67
|
if not source.exists() or not source.is_file():
|
|
68
68
|
raise click.ClickException(
|
|
69
69
|
f"The source {source} does not exist or is not a file."
|
flwr/cli/run/run.py
CHANGED
|
@@ -125,11 +125,11 @@ def run(
|
|
|
125
125
|
|
|
126
126
|
# Validate TOML configuration for local app
|
|
127
127
|
else:
|
|
128
|
+
app = app.expanduser().resolve() # Resolve path to absolute
|
|
128
129
|
config, warnings = load_and_validate(app / FAB_CONFIG_FILE)
|
|
129
130
|
if warnings:
|
|
130
131
|
typer.secho(
|
|
131
|
-
"
|
|
132
|
-
"(pyproject.toml):\n"
|
|
132
|
+
f"Flower App configuration warnings in '{app / FAB_CONFIG_FILE}':\n"
|
|
133
133
|
+ "\n".join([f"- {line}" for line in warnings]),
|
|
134
134
|
fg=typer.colors.YELLOW,
|
|
135
135
|
bold=True,
|
flwr/cli/supernode/register.py
CHANGED
|
@@ -66,8 +66,7 @@ def register( # pylint: disable=R0914
|
|
|
66
66
|
) -> None:
|
|
67
67
|
"""Add a SuperNode to the federation."""
|
|
68
68
|
# Load public key
|
|
69
|
-
|
|
70
|
-
public_key_bytes = try_load_public_key(public_key_path)
|
|
69
|
+
public_key_bytes = try_load_public_key(public_key.expanduser())
|
|
71
70
|
|
|
72
71
|
with cli_output_handler(output_format=output_format) as is_json:
|
|
73
72
|
# Migrate legacy usage if any
|
|
@@ -136,7 +136,7 @@ def grpc_request_response( # pylint: disable=R0913,R0914,R0915,R0917
|
|
|
136
136
|
confirm_message_received : Callable[[str], None]
|
|
137
137
|
"""
|
|
138
138
|
if isinstance(root_certificates, str):
|
|
139
|
-
root_certificates = Path(root_certificates).read_bytes()
|
|
139
|
+
root_certificates = Path(root_certificates).expanduser().read_bytes()
|
|
140
140
|
|
|
141
141
|
# Automatic node auth: generate keys if user didn't provide any
|
|
142
142
|
self_registered = False
|
flwr/common/args.py
CHANGED
|
@@ -95,7 +95,7 @@ def try_obtain_root_certificates(
|
|
|
95
95
|
log(ERROR, "Path argument `--root-certificates` does not point to a file.")
|
|
96
96
|
sys.exit(1)
|
|
97
97
|
else:
|
|
98
|
-
root_certificates = Path(root_cert_path).read_bytes()
|
|
98
|
+
root_certificates = Path(root_cert_path).expanduser().read_bytes()
|
|
99
99
|
log(
|
|
100
100
|
DEBUG,
|
|
101
101
|
"Starting secure HTTPS channel to %s "
|
|
@@ -129,9 +129,9 @@ def try_obtain_server_certificates(
|
|
|
129
129
|
if not isfile(args.ssl_keyfile):
|
|
130
130
|
sys.exit("Path argument `--ssl-keyfile` does not point to a file.")
|
|
131
131
|
certificates = (
|
|
132
|
-
Path(args.ssl_ca_certfile).read_bytes(), # CA certificate
|
|
133
|
-
Path(args.ssl_certfile).read_bytes(), # server certificate
|
|
134
|
-
Path(args.ssl_keyfile).read_bytes(), # server private key
|
|
132
|
+
Path(args.ssl_ca_certfile).expanduser().read_bytes(), # CA certificate
|
|
133
|
+
Path(args.ssl_certfile).expanduser().read_bytes(), # server certificate
|
|
134
|
+
Path(args.ssl_keyfile).expanduser().read_bytes(), # server private key
|
|
135
135
|
)
|
|
136
136
|
return certificates
|
|
137
137
|
if args.ssl_certfile or args.ssl_keyfile or args.ssl_ca_certfile:
|
flwr/common/config.py
CHANGED
|
@@ -42,7 +42,7 @@ T_dict = TypeVar("T_dict", bound=dict[str, Any]) # pylint: disable=invalid-name
|
|
|
42
42
|
|
|
43
43
|
def get_flwr_dir(provided_path: str | None = None) -> Path:
|
|
44
44
|
"""Return the Flower home directory based on env variables."""
|
|
45
|
-
if provided_path is None or not Path(provided_path).is_dir():
|
|
45
|
+
if provided_path is None or not Path(provided_path).expanduser().is_dir():
|
|
46
46
|
return Path(
|
|
47
47
|
os.getenv(
|
|
48
48
|
FLWR_HOME,
|
|
@@ -213,7 +213,7 @@ def parse_config_args(config: list[str] | None, flatten: bool = True) -> dict[st
|
|
|
213
213
|
|
|
214
214
|
# Handle if .toml file is passed
|
|
215
215
|
if len(config) == 1 and config[0].endswith(".toml"):
|
|
216
|
-
with Path(config[0]).open("rb") as config_file:
|
|
216
|
+
with Path(config[0]).expanduser().open("rb") as config_file:
|
|
217
217
|
overrides = flatten_dict(tomli.load(config_file))
|
|
218
218
|
return overrides
|
|
219
219
|
|
flwr/common/exit/exit.py
CHANGED
|
@@ -87,9 +87,6 @@ def flwr_exit(
|
|
|
87
87
|
# Log the exit message
|
|
88
88
|
log(log_level, exit_message)
|
|
89
89
|
|
|
90
|
-
# Trigger exit handlers
|
|
91
|
-
trigger_exit_handlers()
|
|
92
|
-
|
|
93
90
|
# Start a daemon thread to force exit if graceful exit fails
|
|
94
91
|
def force_exit() -> None:
|
|
95
92
|
time.sleep(FORCE_EXIT_TIMEOUT_SECONDS)
|
|
@@ -97,6 +94,9 @@ def flwr_exit(
|
|
|
97
94
|
|
|
98
95
|
threading.Thread(target=force_exit, daemon=True).start()
|
|
99
96
|
|
|
97
|
+
# Trigger exit handlers
|
|
98
|
+
trigger_exit_handlers()
|
|
99
|
+
|
|
100
100
|
# Exit
|
|
101
101
|
sys.exit(sys_exit_code)
|
|
102
102
|
|
flwr/common/logger.py
CHANGED
|
@@ -385,7 +385,7 @@ def start_log_uploader(
|
|
|
385
385
|
) -> threading.Thread:
|
|
386
386
|
"""Start the log uploader thread and return it."""
|
|
387
387
|
thread = threading.Thread(
|
|
388
|
-
target=_log_uploader, args=(log_queue, node_id, run_id, stub)
|
|
388
|
+
target=_log_uploader, args=(log_queue, node_id, run_id, stub), daemon=True
|
|
389
389
|
)
|
|
390
390
|
thread.start()
|
|
391
391
|
return thread
|
flwr/server/app.py
CHANGED
|
@@ -485,7 +485,7 @@ def _load_control_auth_plugins(
|
|
|
485
485
|
}
|
|
486
486
|
# Load YAML file
|
|
487
487
|
else:
|
|
488
|
-
with Path(config_path).open("r", encoding="utf-8") as file:
|
|
488
|
+
with Path(config_path).expanduser().open("r", encoding="utf-8") as file:
|
|
489
489
|
config = yaml.safe_load(file)
|
|
490
490
|
|
|
491
491
|
def _load_plugin(
|
flwr/server/serverapp/app.py
CHANGED
|
@@ -144,6 +144,10 @@ def run_serverapp( # pylint: disable=R0913, R0914, R0915, R0917, W0212
|
|
|
144
144
|
exit_code = ExitCode.SUCCESS
|
|
145
145
|
|
|
146
146
|
def on_exit() -> None:
|
|
147
|
+
# Set Grpc max retries to 1 to avoid blocking on exit
|
|
148
|
+
if grid:
|
|
149
|
+
grid._retry_invoker.max_tries = 1
|
|
150
|
+
|
|
147
151
|
# Stop heartbeat sender
|
|
148
152
|
if heartbeat_sender and heartbeat_sender.is_running:
|
|
149
153
|
heartbeat_sender.stop()
|
|
@@ -154,10 +158,13 @@ def run_serverapp( # pylint: disable=R0913, R0914, R0915, R0917, W0212
|
|
|
154
158
|
|
|
155
159
|
# Update run status
|
|
156
160
|
if run and run_status and grid:
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
+
try:
|
|
162
|
+
req = UpdateRunStatusRequest(
|
|
163
|
+
run_id=run.run_id, run_status=run_status_to_proto(run_status)
|
|
164
|
+
)
|
|
165
|
+
grid._stub.UpdateRunStatus(req)
|
|
166
|
+
except grpc.RpcError:
|
|
167
|
+
pass
|
|
161
168
|
|
|
162
169
|
# Close the Grpc connection
|
|
163
170
|
if grid:
|
|
@@ -56,20 +56,28 @@ class LinkStateFactory:
|
|
|
56
56
|
|
|
57
57
|
def state(self) -> LinkState:
|
|
58
58
|
"""Return a State instance and create it, if necessary."""
|
|
59
|
+
# Return cached state if it exists
|
|
60
|
+
if self.state_instance is not None:
|
|
61
|
+
if self.database == FLWR_IN_MEMORY_DB_NAME:
|
|
62
|
+
log(DEBUG, "Using InMemoryState")
|
|
63
|
+
else:
|
|
64
|
+
log(DEBUG, "Using SqlLinkState")
|
|
65
|
+
return self.state_instance
|
|
66
|
+
|
|
59
67
|
# Get the ObjectStore instance
|
|
60
68
|
object_store = self.objectstore_factory.store()
|
|
61
69
|
|
|
62
70
|
# InMemoryState
|
|
63
71
|
if self.database == FLWR_IN_MEMORY_DB_NAME:
|
|
64
|
-
|
|
65
|
-
self.
|
|
66
|
-
|
|
67
|
-
)
|
|
72
|
+
self.state_instance = InMemoryLinkState(
|
|
73
|
+
self.federation_manager, object_store
|
|
74
|
+
)
|
|
68
75
|
log(DEBUG, "Using InMemoryState")
|
|
69
76
|
return self.state_instance
|
|
70
77
|
|
|
71
78
|
# SqlLinkState
|
|
72
79
|
state = SqlLinkState(self.database, self.federation_manager, object_store)
|
|
73
80
|
state.initialize()
|
|
81
|
+
self.state_instance = state
|
|
74
82
|
log(DEBUG, "Using SqlLinkState")
|
|
75
83
|
return state
|
flwr/supercore/ffs/disk_ffs.py
CHANGED
|
@@ -33,7 +33,7 @@ class DiskFfs(Ffs): # pylint: disable=R0904
|
|
|
33
33
|
base_dir : str
|
|
34
34
|
The base directory to store the objects.
|
|
35
35
|
"""
|
|
36
|
-
self.base_dir = Path(base_dir)
|
|
36
|
+
self.base_dir = Path(base_dir).expanduser()
|
|
37
37
|
|
|
38
38
|
def put(self, content: bytes, meta: dict[str, str]) -> str:
|
|
39
39
|
"""Store bytes and metadata and return key (hash of content).
|
|
@@ -49,15 +49,23 @@ class ObjectStoreFactory:
|
|
|
49
49
|
ObjectStore
|
|
50
50
|
An ObjectStore instance for storing objects by object_id.
|
|
51
51
|
"""
|
|
52
|
+
# Return cached store if it exists
|
|
53
|
+
if self.store_instance is not None:
|
|
54
|
+
if self.database == FLWR_IN_MEMORY_DB_NAME:
|
|
55
|
+
log(DEBUG, "Using InMemoryObjectStore")
|
|
56
|
+
else:
|
|
57
|
+
log(DEBUG, "Using SqlObjectStore")
|
|
58
|
+
return self.store_instance
|
|
59
|
+
|
|
52
60
|
# InMemoryObjectStore
|
|
53
61
|
if self.database == FLWR_IN_MEMORY_DB_NAME:
|
|
54
|
-
|
|
55
|
-
self.store_instance = InMemoryObjectStore()
|
|
62
|
+
self.store_instance = InMemoryObjectStore()
|
|
56
63
|
log(DEBUG, "Using InMemoryObjectStore")
|
|
57
64
|
return self.store_instance
|
|
58
65
|
|
|
59
66
|
# SqlObjectStore
|
|
60
67
|
store = SqlObjectStore(self.database)
|
|
61
68
|
store.initialize()
|
|
69
|
+
self.store_instance = store
|
|
62
70
|
log(DEBUG, "Using SqlObjectStore")
|
|
63
71
|
return store
|
flwr/supercore/sql_mixin.py
CHANGED
|
@@ -30,6 +30,7 @@ from sqlalchemy.orm import Session, sessionmaker
|
|
|
30
30
|
|
|
31
31
|
from flwr.common.logger import log
|
|
32
32
|
from flwr.supercore.constant import FLWR_IN_MEMORY_SQLITE_DB_URL, SQLITE_PRAGMAS
|
|
33
|
+
from flwr.supercore.state.alembic.utils import run_migrations
|
|
33
34
|
|
|
34
35
|
_current_session: ContextVar[Session | None] = ContextVar(
|
|
35
36
|
"current_sqlalchemy_session",
|
|
@@ -193,9 +194,14 @@ class SqlMixin(ABC):
|
|
|
193
194
|
# Create session factory
|
|
194
195
|
self._session_factory = sessionmaker(bind=self._engine)
|
|
195
196
|
|
|
196
|
-
# Create
|
|
197
|
-
|
|
197
|
+
# Create database
|
|
198
|
+
metadata: MetaData | None = self.get_metadata()
|
|
199
|
+
if metadata and self.database_url == FLWR_IN_MEMORY_SQLITE_DB_URL:
|
|
200
|
+
# In-memory databases: create tables directly from SQLAlchemy metadata
|
|
198
201
|
metadata.create_all(self._engine)
|
|
202
|
+
else:
|
|
203
|
+
# File-based databases: use Alembic migrations for schema versioning
|
|
204
|
+
run_migrations(self._engine)
|
|
199
205
|
|
|
200
206
|
# Get all table names using inspector
|
|
201
207
|
inspector = inspect(self._engine)
|
|
@@ -233,7 +233,7 @@ def _try_setup_client_authentication(
|
|
|
233
233
|
|
|
234
234
|
try:
|
|
235
235
|
ssh_private_key = load_ssh_private_key(
|
|
236
|
-
Path(args.auth_supernode_private_key).read_bytes(),
|
|
236
|
+
Path(args.auth_supernode_private_key).expanduser().read_bytes(),
|
|
237
237
|
None,
|
|
238
238
|
)
|
|
239
239
|
if not isinstance(ssh_private_key, ec.EllipticCurvePrivateKey):
|
|
@@ -260,6 +260,7 @@ def _try_obtain_trusted_entities(
|
|
|
260
260
|
"""Validate and return the trust entities."""
|
|
261
261
|
if not trusted_entities_path:
|
|
262
262
|
return None
|
|
263
|
+
trusted_entities_path = trusted_entities_path.expanduser()
|
|
263
264
|
if not trusted_entities_path.is_file():
|
|
264
265
|
flwr_exit(
|
|
265
266
|
ExitCode.SUPERNODE_INVALID_TRUSTED_ENTITIES,
|
{flwr_nightly-1.26.0.dev20260129.dist-info → flwr_nightly-1.26.0.dev20260130.dist-info}/METADATA
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: flwr-nightly
|
|
3
|
-
Version: 1.26.0.
|
|
3
|
+
Version: 1.26.0.dev20260130
|
|
4
4
|
Summary: Flower: A Friendly Federated AI Framework
|
|
5
5
|
License: Apache-2.0
|
|
6
6
|
Keywords: Artificial Intelligence,Federated AI,Federated Analytics,Federated Evaluation,Federated Learning,Flower,Machine Learning
|
{flwr_nightly-1.26.0.dev20260129.dist-info → flwr_nightly-1.26.0.dev20260130.dist-info}/RECORD
RENAMED
|
@@ -14,18 +14,18 @@ flwr/cli/auth_plugin/__init__.py,sha256=qpebWV9uLpx72_J8yTVgT1DlH2Y9MK_RraDoTYEq
|
|
|
14
14
|
flwr/cli/auth_plugin/auth_plugin.py,sha256=CKGsk0RvSmKPDfz5RsQIE_w1bWROBSOoVydbub4Z-I8,2813
|
|
15
15
|
flwr/cli/auth_plugin/noop_auth_plugin.py,sha256=GKrZ97w7NoZGn2r6gzqtMvyeHXeIkNKCLTfT_NHaiwg,3209
|
|
16
16
|
flwr/cli/auth_plugin/oidc_cli_plugin.py,sha256=1gN00FifSrhUA5s5uaE_GpQ3N7U8fQec4PXlSJr50RU,5975
|
|
17
|
-
flwr/cli/build.py,sha256=
|
|
17
|
+
flwr/cli/build.py,sha256=Zfy6SfuhnkfVt0nccfrX-lWxNgtzhhG-OTSXG0VFfLQ,10007
|
|
18
18
|
flwr/cli/cli_account_auth_interceptor.py,sha256=mXgxThpZjU_2Xlae9xT8ewOw60GeE64comDd57asLIY,3680
|
|
19
19
|
flwr/cli/config/__init__.py,sha256=46z6whA3hvKkl9APRs-UG7Ym3K9VOqKx_pYcgelRjtE,788
|
|
20
20
|
flwr/cli/config/ls.py,sha256=14JvV7llvhKozz19eIrrrWxR6WeXyko8apPFiq4P08E,2661
|
|
21
|
-
flwr/cli/config_migration.py,sha256=
|
|
21
|
+
flwr/cli/config_migration.py,sha256=Lc_y6zebVBgRr6JdiPJcyroUjuOG0k7UQEbqISUPC2E,10647
|
|
22
22
|
flwr/cli/config_utils.py,sha256=LNmbPODWefsEtt4ov63BFtuTcK1Pb8Z-AHt1_haWWdA,7841
|
|
23
23
|
flwr/cli/constant.py,sha256=MYLI7m9ntwWNkFgEEtKVo1JWX3umf_0EdqY8nJy-83Y,3525
|
|
24
24
|
flwr/cli/example.py,sha256=SNTorkKPrx1rOryGREUyZu8TcOc1-vFv1zEddaysdY0,2216
|
|
25
25
|
flwr/cli/federation/__init__.py,sha256=okxswL4fAjApI9gV_alU1lRkTUcQRbwlzvtUTLz61fE,793
|
|
26
26
|
flwr/cli/federation/ls.py,sha256=VwoM0BrlcvQvE4oGqFol4sAI9JqtR32SYN5gzDfmVPY,10144
|
|
27
27
|
flwr/cli/flower_config.py,sha256=YQfuFGW52jf6EoAxWrXQYw6lmuH0j2qsZ0twHRLxx4k,15278
|
|
28
|
-
flwr/cli/install.py,sha256=
|
|
28
|
+
flwr/cli/install.py,sha256=AKjJxDr_kBJirpqMg_EemlP23CfH5UF3h5IjtJQ_xPs,9124
|
|
29
29
|
flwr/cli/log.py,sha256=BPA0dvGlXx5PrtURPua5fJyF7iVrb28K4fEY2Uth0EE,7317
|
|
30
30
|
flwr/cli/login/__init__.py,sha256=B1SXKU3HCQhWfFDMJhlC7FOl8UsvH4mxysxeBnrfyUE,800
|
|
31
31
|
flwr/cli/login/login.py,sha256=o-jm5QRMIpivE8kpY7cPTGbr7nQhsyFYaftMtBaaT0s,3649
|
|
@@ -34,12 +34,12 @@ flwr/cli/new/__init__.py,sha256=QA1E2QtzPvFCjLTUHnFnJbufuFiGyT_0Y53Wpbvg1F0,790
|
|
|
34
34
|
flwr/cli/new/new.py,sha256=15phs5dhEpo7ORs7uulGzHWtW9W5ZGn0EKFE_T5WXb8,7829
|
|
35
35
|
flwr/cli/pull.py,sha256=XzBvLrdYGrSCuky5OoCEU4V9UR9QlyZMT7Tj-W6wSw0,2946
|
|
36
36
|
flwr/cli/run/__init__.py,sha256=RPyB7KbYTFl6YRiilCch6oezxrLQrl1kijV7BMGkLbA,790
|
|
37
|
-
flwr/cli/run/run.py,sha256=
|
|
37
|
+
flwr/cli/run/run.py,sha256=qavtddUCqNWv8V_FjW3ho9GLwTxQf6bIJuZirMTK9LE,8807
|
|
38
38
|
flwr/cli/run_utils.py,sha256=ZnlBOqFfRxVEPZKR_9zYrynNcohiCFY8QN6OFyOCrQs,5082
|
|
39
39
|
flwr/cli/stop.py,sha256=c5e2gTumMT6pKr7ESIXZ-IbLY6fEOfWbkesvQeAfaSQ,3934
|
|
40
40
|
flwr/cli/supernode/__init__.py,sha256=DBkjoPo2hS2Y-ghJxwLbrAbCQFBgD82_Itl2_892UBo,917
|
|
41
41
|
flwr/cli/supernode/ls.py,sha256=mmpwIpwp5YZSdq3gDlv0h8QpKoMBgZWrMrvJm_ltiRw,7594
|
|
42
|
-
flwr/cli/supernode/register.py,sha256=
|
|
42
|
+
flwr/cli/supernode/register.py,sha256=HzgJ1Q8Mlx7oJE-2kRLbIX2OrQP7wM0IeywirLqyz9Y,4724
|
|
43
43
|
flwr/cli/supernode/unregister.py,sha256=ha8-oTXA4NW8xHLyQPHn-e0f7-9bF2QyjXxUD299O6s,2938
|
|
44
44
|
flwr/cli/typing.py,sha256=xGAIv9mAVzs6UXapzu4i8bQ-MckzHMSihtLcnu5SWGU,7562
|
|
45
45
|
flwr/cli/utils.py,sha256=PEzRVZPaLBxF-9yTAkl3mi--z_W2eC9JOHoMoQHBuYw,17251
|
|
@@ -49,7 +49,7 @@ flwr/client/dpfedavg_numpy_client.py,sha256=ELDHyEJcTB-FlLhHC-JXy8HuB3ZFHfT0HL3g
|
|
|
49
49
|
flwr/client/grpc_adapter_client/__init__.py,sha256=RQWP5mFPROLHKgombiRvPXVWSoVrQ81wvZm0-lOuuBA,742
|
|
50
50
|
flwr/client/grpc_adapter_client/connection.py,sha256=rr3NA7d-BYsWNTu1VRE9966FxToLLECLBAVNhf5uFoo,4242
|
|
51
51
|
flwr/client/grpc_rere_client/__init__.py,sha256=i7iS0Lt8B7q0E2L72e4F_YrKm6ClRKnd71PNA6PW2O0,752
|
|
52
|
-
flwr/client/grpc_rere_client/connection.py,sha256=
|
|
52
|
+
flwr/client/grpc_rere_client/connection.py,sha256=0IU1X5W1H8D1Lit6_-sJIPLRyfpOv10AGOsQboZTg7E,13832
|
|
53
53
|
flwr/client/grpc_rere_client/grpc_adapter.py,sha256=HR6P604_RZa6CRd0tf2Nmcw5e5puRIAryWQrq64yxyw,7568
|
|
54
54
|
flwr/client/grpc_rere_client/node_auth_client_interceptor.py,sha256=rIUo64KOSYMC-GlfTvIYgeouAX8i6eOd5Rq2Yi9UFMY,2437
|
|
55
55
|
flwr/client/message_handler/__init__.py,sha256=0lyljDVqre3WljiZbPcwCCf8GiIaSVI_yo_ylEyPwSE,719
|
|
@@ -75,8 +75,8 @@ flwr/clientapp/mod/localdp_mod.py,sha256=CHh0SJOSWSD6In9p9yOFbE7S4eH1m-aQcStT8ZI
|
|
|
75
75
|
flwr/clientapp/typing.py,sha256=Ld2rsD40SvIRD1Z_IdAGaYSbRtkgXZ5CPFIkJJ3Ao-A,862
|
|
76
76
|
flwr/clientapp/utils.py,sha256=UEb3DFpAsAaG1ARU34D3L8njn4k1iPg-qpHl_Hyo8zA,4340
|
|
77
77
|
flwr/common/__init__.py,sha256=7Rf7Ti78N7vUydpIZ2b-1im6ciWz0G5_w91N9YEPsLM,4195
|
|
78
|
-
flwr/common/args.py,sha256=
|
|
79
|
-
flwr/common/config.py,sha256=
|
|
78
|
+
flwr/common/args.py,sha256=4m368Vm-9UEHbJI5S3pgjF6Kf9jZ6pNsQOLrH1av3tI,5870
|
|
79
|
+
flwr/common/config.py,sha256=A0pqN12KDGhhkwvwrPgdlfa3Msm6llyFILx0W9fTUDc,13721
|
|
80
80
|
flwr/common/constant.py,sha256=W_6nBuZOagCsx4w8ZcrrEmyDRAekTGyMhmJycgq7tIQ,10146
|
|
81
81
|
flwr/common/context.py,sha256=pnFVcn-X0XKK1giw82I54meNodJJEoUwZ-NpkzT37zo,2421
|
|
82
82
|
flwr/common/differential_privacy.py,sha256=HiW2qQa5mCQfE0oePapFp3q0uZzjoHKthp5UrkRFtY8,6143
|
|
@@ -85,7 +85,7 @@ flwr/common/dp.py,sha256=ftqWheOICK5N_zPaofnbFb474lMb5w9lclwxf5DKY0w,1978
|
|
|
85
85
|
flwr/common/event_log_plugin/__init__.py,sha256=ts3VAL3Fk6Grp1EK_1Qg_V-BfOof9F86iBx4rbrEkyo,838
|
|
86
86
|
flwr/common/event_log_plugin/event_log_plugin.py,sha256=uJYR363nVzjfJePay3UHwaifwgBx2rAbKHHAuQC10VU,2014
|
|
87
87
|
flwr/common/exit/__init__.py,sha256=8W7xaO1iw0vacgmQW7FTFbSh7csNv6XfsgIlnIbNF6U,978
|
|
88
|
-
flwr/common/exit/exit.py,sha256=
|
|
88
|
+
flwr/common/exit/exit.py,sha256=cyvHiznpsbESOdhWbBhWGUiVa83dr_1nZ2ia_m6B4fk,4018
|
|
89
89
|
flwr/common/exit/exit_code.py,sha256=xpvi_3UOhf6AT8pR0ZGXyBxWfnuFFE50O1cKqOGVxxE,7000
|
|
90
90
|
flwr/common/exit/exit_handler.py,sha256=zUAXHtp4rYK_sbkgsqS5zrVAzJUiSBrB-a4Ay3vSPE8,2302
|
|
91
91
|
flwr/common/exit/signal_handler.py,sha256=o_e33v9kP0jz13q-8BZDrKF7vNCzOApvDPZ3-nTXfIc,3697
|
|
@@ -93,7 +93,7 @@ flwr/common/grpc.py,sha256=8XoMTA5rJMze8fG6vOs1g4_rkxMhfpvMEYJPnqYPi2g,9799
|
|
|
93
93
|
flwr/common/inflatable.py,sha256=GDL9oBKs16_yyVdlH6kBf493O5xll_h9V7XB5Mpx1Hc,9524
|
|
94
94
|
flwr/common/inflatable_protobuf_utils.py,sha256=GTX9yoEAXhKPwcKc4ltmJHUvARFsC4qvkoNCMHqpVtc,5065
|
|
95
95
|
flwr/common/inflatable_utils.py,sha256=nooSMLLiOcHGqFx9n1Il_dAp76JIKyc36ibnkijwELE,19540
|
|
96
|
-
flwr/common/logger.py,sha256=
|
|
96
|
+
flwr/common/logger.py,sha256=kyeiusWV5T-FsG8wc21n_CBokuwg1S_YCerVp0a1MrE,12994
|
|
97
97
|
flwr/common/message.py,sha256=uKQ4-gMt62zVuPfke4JmcB9q-yN9kMGTsSUUF9fnH-4,19915
|
|
98
98
|
flwr/common/object_ref.py,sha256=aw6BLQlZRVqcfuyX2bScc71ZTRZtrBIAHyxYfplTkNE,9081
|
|
99
99
|
flwr/common/parameter.py,sha256=UVw6sOgehEFhFs4uUCMl2kfVq1PD6ncmWgPLMsZPKPE,2095
|
|
@@ -201,7 +201,7 @@ flwr/proto/transport_pb2_grpc.py,sha256=jYsbV3KYdp4TaNfWxv3ljFEvB-Yjsa8MIPtTH-vV
|
|
|
201
201
|
flwr/proto/transport_pb2_grpc.pyi,sha256=qd2cOXq6HBZtwRfPpKuni27NGMJCAxyP5R95Vk8WWDU,2073
|
|
202
202
|
flwr/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
203
203
|
flwr/server/__init__.py,sha256=LQQHiuL2jy7TpNaKastRdGsexlxSt5ZWAQNVqitDnrY,1598
|
|
204
|
-
flwr/server/app.py,sha256=
|
|
204
|
+
flwr/server/app.py,sha256=Q4p3_-ft63L8psN9pOFTL7FvnyMhcky6GNI_cjdQqSw,31691
|
|
205
205
|
flwr/server/client_manager.py,sha256=3WOqNWh5dlqPRG-DMGwXiyvGNEYS_jKqXKkFIkMqWLQ,6187
|
|
206
206
|
flwr/server/client_proxy.py,sha256=QS_RGgjSZ8V4StAHH8zc7W9_os2FyO4wNqkbylQMBTY,2341
|
|
207
207
|
flwr/server/compat/__init__.py,sha256=0IsttWvY15qO98_1GyzVC-vR1e_ZPXOdu2qUlOkYMPE,886
|
|
@@ -221,7 +221,7 @@ flwr/server/server.py,sha256=Oqv3WZ92KN9XTS6vqcYFTEvJM0sHZfkUmNM8xgbhZBE,17698
|
|
|
221
221
|
flwr/server/server_app.py,sha256=udSNhp5Syg0XJj-AnfqPGkBkg9zuPaSgm1LCL_4PYkc,9469
|
|
222
222
|
flwr/server/server_config.py,sha256=anmj2Rf18kM1chyl-9myRLDS77YVKTS6MpsDh2nIFOY,1318
|
|
223
223
|
flwr/server/serverapp/__init__.py,sha256=xcC0T_MQSMS9cicUzUUpMNCOsF2d8Oh_8jvnoBLuZvo,800
|
|
224
|
-
flwr/server/serverapp/app.py,sha256
|
|
224
|
+
flwr/server/serverapp/app.py,sha256=-88vN2d-7FtqV9L--nvcVpYHNLgfG-Jd0tYQEAmA6lw,10163
|
|
225
225
|
flwr/server/serverapp_components.py,sha256=b8GbqXkiEsiOw61gGITVj6eFpl66upEf7eMjDu1Oo-M,2078
|
|
226
226
|
flwr/server/strategy/__init__.py,sha256=HhsSWMWaC7oCb2g7Kqn1MBKdrfvgi8VxACy9ZL706Q0,2836
|
|
227
227
|
flwr/server/strategy/aggregate.py,sha256=ebIKolvRzSGwVKbxSZtofGSQAIT8LRddMW2c33mXQ2w,14070
|
|
@@ -271,7 +271,7 @@ flwr/server/superlink/fleet/vce/vce_api.py,sha256=A62Vx3r71bNI-v10IUen_27fDJoYXs
|
|
|
271
271
|
flwr/server/superlink/linkstate/__init__.py,sha256=KSUCjOfJlW1g6GAjlqK3mTviqLvJLuQEzSJwO27Qokg,1052
|
|
272
272
|
flwr/server/superlink/linkstate/in_memory_linkstate.py,sha256=1-aaSwad77SeYND3HEF2041KNG5ZA-8i1RcheYZMNq8,31689
|
|
273
273
|
flwr/server/superlink/linkstate/linkstate.py,sha256=Zz2vBI0QFFnptCUIeNjqQCbpCvMMzfsZluprEMkkHio,16809
|
|
274
|
-
flwr/server/superlink/linkstate/linkstate_factory.py,sha256=
|
|
274
|
+
flwr/server/superlink/linkstate/linkstate_factory.py,sha256=CgAoYgisVOrHQizN6u6_L-iKZdv5mgBszag6LgAfe3w,3139
|
|
275
275
|
flwr/server/superlink/linkstate/sql_linkstate.py,sha256=ziZvpEQBVV9GSxjHiS0fAyaY1G7x4y6XKlNLH-c_4TQ,48727
|
|
276
276
|
flwr/server/superlink/linkstate/utils.py,sha256=IA1mKKhGVBPoD61VXKFa8dZ_prnfuyWIuKAeeHPLmuE,16000
|
|
277
277
|
flwr/server/superlink/serverappio/__init__.py,sha256=Fy4zJuoccZe5mZSEIpOmQvU6YeXFBa1M4eZuXXmJcn8,717
|
|
@@ -338,7 +338,7 @@ flwr/supercore/credential_store/credential_store.py,sha256=m_YHW0_A8CBfuRVq-GJgG
|
|
|
338
338
|
flwr/supercore/credential_store/file_credential_store.py,sha256=PeWuigqtMGMYnj_tKnWtlmJtu7OLuVaOB4D9GS47lHc,2771
|
|
339
339
|
flwr/supercore/date.py,sha256=NsadFTzy6LMRB9zNeEV1szvzwQT45wC639P9kBTRZK4,1213
|
|
340
340
|
flwr/supercore/ffs/__init__.py,sha256=U3KXwG_SplEvchat27K0LYPoPHzh-cwwT_NHsGlYMt8,908
|
|
341
|
-
flwr/supercore/ffs/disk_ffs.py,sha256=
|
|
341
|
+
flwr/supercore/ffs/disk_ffs.py,sha256=WTgK7A15EkHcBZTEQEKl1YdfJj8vRfCwJk7cnnHE4oo,3254
|
|
342
342
|
flwr/supercore/ffs/ffs.py,sha256=Q71OLKYIuuhe_XDTqku03qozUfDBQ5Lxg-MbpGDPHlk,2364
|
|
343
343
|
flwr/supercore/ffs/ffs_factory.py,sha256=tPwVDWMddgo45X8tk1lBCTkmJenWBbRagjWfx7UsYuE,1459
|
|
344
344
|
flwr/supercore/grpc_health/__init__.py,sha256=rCPZ7ucPY9NXBWuhb9iKs2D-yZ0rQ5YkJ7LlOeahN9A,948
|
|
@@ -350,12 +350,12 @@ flwr/supercore/license_plugin/license_plugin.py,sha256=BFhlCH5v9KKuY7crVCsi8fuYe
|
|
|
350
350
|
flwr/supercore/object_store/__init__.py,sha256=cdfPAmjINY6iOp8oI_LdcVh2simg469Mkdl4LLV4kHI,911
|
|
351
351
|
flwr/supercore/object_store/in_memory_object_store.py,sha256=-DU6n1Ef3EmllHY9SzeXw57ftoU0mR_6or4NIDSZlcs,9322
|
|
352
352
|
flwr/supercore/object_store/object_store.py,sha256=XLo-xe258TmCel9dNLCJepFjXaQtEi0wBqzU9YsyJVg,5221
|
|
353
|
-
flwr/supercore/object_store/object_store_factory.py,sha256=
|
|
353
|
+
flwr/supercore/object_store/object_store_factory.py,sha256=RByhm8Ow6TxmklP1MTluaze3v5kw0O1CILrA7Y0nWMg,2604
|
|
354
354
|
flwr/supercore/object_store/sql_object_store.py,sha256=ZBmyc3a_GXZFNaefDCxhrri-_BgcQPOj7OtUfrPcjKo,10130
|
|
355
355
|
flwr/supercore/primitives/__init__.py,sha256=Tx8GOjnmMo8Y74RsDGrMpfr-E0Nl8dcUDF784_ge6F8,745
|
|
356
356
|
flwr/supercore/primitives/asymmetric.py,sha256=1643niHYj3uEbfPd06VuMHwN3tKVwg0uVyR3RhTdWIU,3778
|
|
357
357
|
flwr/supercore/primitives/asymmetric_ed25519.py,sha256=eIhOTMibQW0FJX4MXdplHdL3HcfCiKuFu2mQ8GQTUz8,5025
|
|
358
|
-
flwr/supercore/sql_mixin.py,sha256=
|
|
358
|
+
flwr/supercore/sql_mixin.py,sha256=lI-7kCudH2f8XEpxoeJsqYr0iA1grGeogwnu_4JHHqE,12058
|
|
359
359
|
flwr/supercore/state/__init__.py,sha256=FkKhsNVM4LjlRlOgXTz6twINmw5ohIUKS_OER0BNo_w,724
|
|
360
360
|
flwr/supercore/state/alembic/__init__.py,sha256=pC-y-xsfgi9YwCrqnt814yOJ9ytlDRUFGqOY6Qzt-_U,746
|
|
361
361
|
flwr/supercore/state/alembic/env.py,sha256=8zrPVosMxLqZ8CAhS7PHOlMU2Vr-LEt7gSCN4UYSAJg,3913
|
|
@@ -396,7 +396,7 @@ flwr/superlink/servicer/control/control_license_interceptor.py,sha256=8d28soJ0mL
|
|
|
396
396
|
flwr/superlink/servicer/control/control_servicer.py,sha256=s9LgpbXUGU7DYwOvFUzNjgyKEWHyjPJQeUfp-XXUBWM,25523
|
|
397
397
|
flwr/supernode/__init__.py,sha256=KgeCaVvXWrU3rptNR1y0oBp4YtXbAcrnCcJAiOoWkI4,707
|
|
398
398
|
flwr/supernode/cli/__init__.py,sha256=JuEMr0-s9zv-PEWKuLB9tj1ocNfroSyNJ-oyv7ati9A,887
|
|
399
|
-
flwr/supernode/cli/flower_supernode.py,sha256=
|
|
399
|
+
flwr/supernode/cli/flower_supernode.py,sha256=LhciYbUwUfvkR4hiHxizERhQzpqZOAG9d6qVm6-V4jY,10891
|
|
400
400
|
flwr/supernode/cli/flwr_clientapp.py,sha256=W3tAyqSfeHbPhqBC4Pfo9bsyFdkBKPqdKlhGmeUKwKg,3173
|
|
401
401
|
flwr/supernode/nodestate/__init__.py,sha256=CyLLObbmmVgfRO88UCM0VMait1dL57mUauUDfuSHsbU,976
|
|
402
402
|
flwr/supernode/nodestate/in_memory_nodestate.py,sha256=DBhpDsPmitkOr86pW78_0aiG_jWgjjCXerFONXsyOSE,10578
|
|
@@ -408,7 +408,7 @@ flwr/supernode/servicer/__init__.py,sha256=lucTzre5WPK7G1YLCfaqg3rbFWdNSb7ZTt-ca
|
|
|
408
408
|
flwr/supernode/servicer/clientappio/__init__.py,sha256=7Oy62Y_oijqF7Dxi6tpcUQyOpLc_QpIRZ83NvwmB0Yg,813
|
|
409
409
|
flwr/supernode/servicer/clientappio/clientappio_servicer.py,sha256=rRL4CQ0L78jF_p0ct4-JMGREt6wWRy__wy4czF4f54Y,11639
|
|
410
410
|
flwr/supernode/start_client_internal.py,sha256=3MkeDiWZr-SsvACuuAxJi8nYw6GYNKOO6q8b36E3R9k,26250
|
|
411
|
-
flwr_nightly-1.26.0.
|
|
412
|
-
flwr_nightly-1.26.0.
|
|
413
|
-
flwr_nightly-1.26.0.
|
|
414
|
-
flwr_nightly-1.26.0.
|
|
411
|
+
flwr_nightly-1.26.0.dev20260130.dist-info/METADATA,sha256=qlSBZYQkTLRBbGqzPTIrx7Ml1-tp9kVzKsj9zy66N7c,14439
|
|
412
|
+
flwr_nightly-1.26.0.dev20260130.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
|
|
413
|
+
flwr_nightly-1.26.0.dev20260130.dist-info/entry_points.txt,sha256=hxHD2ixb_vJFDOlZV-zB4Ao32_BQlL34ftsDh1GXv14,420
|
|
414
|
+
flwr_nightly-1.26.0.dev20260130.dist-info/RECORD,,
|
{flwr_nightly-1.26.0.dev20260129.dist-info → flwr_nightly-1.26.0.dev20260130.dist-info}/WHEEL
RENAMED
|
File without changes
|
|
File without changes
|