flwr-nightly 1.22.0.dev20250916__py3-none-any.whl → 1.22.0.dev20250917__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/app.py +2 -0
- flwr/cli/new/new.py +2 -2
- flwr/cli/new/templates/app/README.flowertune.md.tpl +1 -1
- flwr/cli/new/templates/app/code/client.baseline.py.tpl +64 -47
- flwr/cli/new/templates/app/code/flwr_tune/client_app.py.tpl +56 -90
- flwr/cli/new/templates/app/code/flwr_tune/models.py.tpl +1 -23
- flwr/cli/new/templates/app/code/flwr_tune/server_app.py.tpl +37 -58
- flwr/cli/new/templates/app/code/flwr_tune/strategy.py.tpl +39 -44
- flwr/cli/new/templates/app/code/model.baseline.py.tpl +0 -14
- flwr/cli/new/templates/app/code/server.baseline.py.tpl +27 -29
- flwr/cli/new/templates/app/pyproject.baseline.toml.tpl +3 -3
- flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +1 -1
- flwr/cli/pull.py +100 -0
- flwr/cli/utils.py +17 -0
- flwr/common/constant.py +2 -0
- flwr/proto/control_pb2.py +7 -3
- flwr/proto/control_pb2.pyi +24 -0
- flwr/proto/control_pb2_grpc.py +34 -0
- flwr/proto/control_pb2_grpc.pyi +13 -0
- flwr/server/app.py +13 -0
- flwr/serverapp/strategy/__init__.py +2 -0
- flwr/serverapp/strategy/fedprox.py +174 -0
- flwr/simulation/app.py +1 -1
- flwr/simulation/run_simulation.py +25 -30
- flwr/superlink/artifact_provider/__init__.py +22 -0
- flwr/superlink/artifact_provider/artifact_provider.py +37 -0
- flwr/superlink/servicer/control/control_grpc.py +3 -0
- flwr/superlink/servicer/control/control_servicer.py +59 -2
- {flwr_nightly-1.22.0.dev20250916.dist-info → flwr_nightly-1.22.0.dev20250917.dist-info}/METADATA +1 -1
- {flwr_nightly-1.22.0.dev20250916.dist-info → flwr_nightly-1.22.0.dev20250917.dist-info}/RECORD +32 -28
- {flwr_nightly-1.22.0.dev20250916.dist-info → flwr_nightly-1.22.0.dev20250917.dist-info}/WHEEL +0 -0
- {flwr_nightly-1.22.0.dev20250916.dist-info → flwr_nightly-1.22.0.dev20250917.dist-info}/entry_points.txt +0 -0
@@ -143,6 +143,15 @@ def run_simulation_from_cli() -> None:
|
|
143
143
|
run = Run.create_empty(run_id)
|
144
144
|
run.override_config = override_config
|
145
145
|
|
146
|
+
# Create Context
|
147
|
+
server_app_context = Context(
|
148
|
+
run_id=run_id,
|
149
|
+
node_id=0,
|
150
|
+
node_config=UserConfig(),
|
151
|
+
state=RecordDict(),
|
152
|
+
run_config=fused_config,
|
153
|
+
)
|
154
|
+
|
146
155
|
_ = _run_simulation(
|
147
156
|
server_app_attr=server_app_attr,
|
148
157
|
client_app_attr=client_app_attr,
|
@@ -153,7 +162,7 @@ def run_simulation_from_cli() -> None:
|
|
153
162
|
run=run,
|
154
163
|
enable_tf_gpu_growth=args.enable_tf_gpu_growth,
|
155
164
|
verbose_logging=args.verbose,
|
156
|
-
|
165
|
+
server_app_context=server_app_context,
|
157
166
|
is_app=True,
|
158
167
|
exit_event=EventType.CLI_FLOWER_SIMULATION_LEAVE,
|
159
168
|
)
|
@@ -241,13 +250,12 @@ def run_simulation(
|
|
241
250
|
def run_serverapp_th(
|
242
251
|
server_app_attr: Optional[str],
|
243
252
|
server_app: Optional[ServerApp],
|
244
|
-
|
253
|
+
server_app_context: Context,
|
245
254
|
grid: Grid,
|
246
255
|
app_dir: str,
|
247
256
|
f_stop: threading.Event,
|
248
257
|
has_exception: threading.Event,
|
249
258
|
enable_tf_gpu_growth: bool,
|
250
|
-
run_id: int,
|
251
259
|
ctx_queue: "Queue[Context]",
|
252
260
|
) -> threading.Thread:
|
253
261
|
"""Run SeverApp in a thread."""
|
@@ -258,7 +266,6 @@ def run_serverapp_th(
|
|
258
266
|
exception_event: threading.Event,
|
259
267
|
_grid: Grid,
|
260
268
|
_server_app_dir: str,
|
261
|
-
_server_app_run_config: UserConfig,
|
262
269
|
_server_app_attr: Optional[str],
|
263
270
|
_server_app: Optional[ServerApp],
|
264
271
|
_ctx_queue: "Queue[Context]",
|
@@ -272,19 +279,10 @@ def run_serverapp_th(
|
|
272
279
|
log(INFO, "Enabling GPU growth for Tensorflow on the server thread.")
|
273
280
|
enable_gpu_growth()
|
274
281
|
|
275
|
-
# Initialize Context
|
276
|
-
context = Context(
|
277
|
-
run_id=run_id,
|
278
|
-
node_id=0,
|
279
|
-
node_config={},
|
280
|
-
state=RecordDict(),
|
281
|
-
run_config=_server_app_run_config,
|
282
|
-
)
|
283
|
-
|
284
282
|
# Run ServerApp
|
285
283
|
updated_context = _run(
|
286
284
|
grid=_grid,
|
287
|
-
context=
|
285
|
+
context=server_app_context,
|
288
286
|
server_app_dir=_server_app_dir,
|
289
287
|
server_app_attr=_server_app_attr,
|
290
288
|
loaded_server_app=_server_app,
|
@@ -310,7 +308,6 @@ def run_serverapp_th(
|
|
310
308
|
has_exception,
|
311
309
|
grid,
|
312
310
|
app_dir,
|
313
|
-
server_app_run_config,
|
314
311
|
server_app_attr,
|
315
312
|
server_app,
|
316
313
|
ctx_queue,
|
@@ -335,7 +332,7 @@ def _main_loop(
|
|
335
332
|
client_app_attr: Optional[str] = None,
|
336
333
|
server_app: Optional[ServerApp] = None,
|
337
334
|
server_app_attr: Optional[str] = None,
|
338
|
-
|
335
|
+
server_app_context: Optional[Context] = None,
|
339
336
|
) -> Context:
|
340
337
|
"""Start ServerApp on a separate thread, then launch Simulation Engine."""
|
341
338
|
# Initialize StateFactory
|
@@ -346,13 +343,15 @@ def _main_loop(
|
|
346
343
|
server_app_thread_has_exception = threading.Event()
|
347
344
|
serverapp_th = None
|
348
345
|
success = True
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
346
|
+
if server_app_context is None:
|
347
|
+
server_app_context = Context(
|
348
|
+
run_id=run.run_id,
|
349
|
+
node_id=0,
|
350
|
+
node_config=UserConfig(),
|
351
|
+
state=RecordDict(),
|
352
|
+
run_config=UserConfig(),
|
353
|
+
)
|
354
|
+
updated_context = server_app_context
|
356
355
|
try:
|
357
356
|
# Register run
|
358
357
|
log(DEBUG, "Pre-registering run with id %s", run.run_id)
|
@@ -361,9 +360,6 @@ def _main_loop(
|
|
361
360
|
run.running_at = run.starting_at
|
362
361
|
state_factory.state().run_ids[run.run_id] = RunRecord(run=run) # type: ignore
|
363
362
|
|
364
|
-
if server_app_run_config is None:
|
365
|
-
server_app_run_config = {}
|
366
|
-
|
367
363
|
# Initialize Grid
|
368
364
|
grid = InMemoryGrid(state_factory=state_factory)
|
369
365
|
grid.set_run(run_id=run.run_id)
|
@@ -373,13 +369,12 @@ def _main_loop(
|
|
373
369
|
serverapp_th = run_serverapp_th(
|
374
370
|
server_app_attr=server_app_attr,
|
375
371
|
server_app=server_app,
|
376
|
-
|
372
|
+
server_app_context=server_app_context,
|
377
373
|
grid=grid,
|
378
374
|
app_dir=app_dir,
|
379
375
|
f_stop=f_stop,
|
380
376
|
has_exception=server_app_thread_has_exception,
|
381
377
|
enable_tf_gpu_growth=enable_tf_gpu_growth,
|
382
|
-
run_id=run.run_id,
|
383
378
|
ctx_queue=output_context_queue,
|
384
379
|
)
|
385
380
|
|
@@ -438,7 +433,7 @@ def _run_simulation(
|
|
438
433
|
backend_config: Optional[BackendConfig] = None,
|
439
434
|
client_app_attr: Optional[str] = None,
|
440
435
|
server_app_attr: Optional[str] = None,
|
441
|
-
|
436
|
+
server_app_context: Optional[Context] = None,
|
442
437
|
app_dir: str = "",
|
443
438
|
flwr_dir: Optional[str] = None,
|
444
439
|
run: Optional[Run] = None,
|
@@ -502,7 +497,7 @@ def _run_simulation(
|
|
502
497
|
client_app_attr,
|
503
498
|
server_app,
|
504
499
|
server_app_attr,
|
505
|
-
|
500
|
+
server_app_context,
|
506
501
|
)
|
507
502
|
# Detect if there is an Asyncio event loop already running.
|
508
503
|
# If yes, disable logger propagation. In environmnets
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# Copyright 2025 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
|
+
"""ArtifactProvider for SuperLink."""
|
16
|
+
|
17
|
+
|
18
|
+
from .artifact_provider import ArtifactProvider
|
19
|
+
|
20
|
+
__all__ = [
|
21
|
+
"ArtifactProvider",
|
22
|
+
]
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# Copyright 2025 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
|
+
"""Abstract base class for ArtifactProvider."""
|
16
|
+
|
17
|
+
|
18
|
+
from abc import ABC, abstractmethod
|
19
|
+
from typing import Optional
|
20
|
+
|
21
|
+
|
22
|
+
class ArtifactProvider(ABC):
|
23
|
+
"""ArtifactProvider interface for providing artifact download links."""
|
24
|
+
|
25
|
+
@abstractmethod
|
26
|
+
def get_url(self, run_id: int) -> Optional[str]:
|
27
|
+
"""Return the artifact download link for the given run ID."""
|
28
|
+
|
29
|
+
@property
|
30
|
+
@abstractmethod
|
31
|
+
def output_dir(self) -> str:
|
32
|
+
"""Permanent storage directory."""
|
33
|
+
|
34
|
+
@property
|
35
|
+
@abstractmethod
|
36
|
+
def tmp_dir(self) -> str:
|
37
|
+
"""Temporary storage directory."""
|
@@ -31,6 +31,7 @@ from flwr.server.superlink.linkstate import LinkStateFactory
|
|
31
31
|
from flwr.supercore.ffs import FfsFactory
|
32
32
|
from flwr.supercore.license_plugin import LicensePlugin
|
33
33
|
from flwr.supercore.object_store import ObjectStoreFactory
|
34
|
+
from flwr.superlink.artifact_provider import ArtifactProvider
|
34
35
|
|
35
36
|
from .control_event_log_interceptor import ControlEventLogInterceptor
|
36
37
|
from .control_license_interceptor import ControlLicenseInterceptor
|
@@ -56,6 +57,7 @@ def run_control_api_grpc(
|
|
56
57
|
auth_plugin: Optional[ControlAuthPlugin] = None,
|
57
58
|
authz_plugin: Optional[ControlAuthzPlugin] = None,
|
58
59
|
event_log_plugin: Optional[EventLogWriterPlugin] = None,
|
60
|
+
artifact_provider: Optional[ArtifactProvider] = None,
|
59
61
|
) -> grpc.Server:
|
60
62
|
"""Run Control API (gRPC, request-response)."""
|
61
63
|
license_plugin: Optional[LicensePlugin] = get_license_plugin()
|
@@ -68,6 +70,7 @@ def run_control_api_grpc(
|
|
68
70
|
objectstore_factory=objectstore_factory,
|
69
71
|
is_simulation=is_simulation,
|
70
72
|
auth_plugin=auth_plugin,
|
73
|
+
artifact_provider=artifact_provider,
|
71
74
|
)
|
72
75
|
interceptors: list[grpc.ServerInterceptor] = []
|
73
76
|
if license_plugin is not None:
|
@@ -29,7 +29,9 @@ from flwr.common.auth_plugin import ControlAuthPlugin
|
|
29
29
|
from flwr.common.constant import (
|
30
30
|
FAB_MAX_SIZE,
|
31
31
|
LOG_STREAM_INTERVAL,
|
32
|
+
NO_ARTIFACT_PROVIDER_MESSAGE,
|
32
33
|
NO_USER_AUTH_MESSAGE,
|
34
|
+
PULL_UNFINISHED_RUN_MESSAGE,
|
33
35
|
RUN_ID_NOT_FOUND_MESSAGE,
|
34
36
|
Status,
|
35
37
|
SubStatus,
|
@@ -49,6 +51,8 @@ from flwr.proto.control_pb2 import ( # pylint: disable=E0611
|
|
49
51
|
GetLoginDetailsResponse,
|
50
52
|
ListRunsRequest,
|
51
53
|
ListRunsResponse,
|
54
|
+
PullArtifactsRequest,
|
55
|
+
PullArtifactsResponse,
|
52
56
|
StartRunRequest,
|
53
57
|
StartRunResponse,
|
54
58
|
StopRunRequest,
|
@@ -59,6 +63,7 @@ from flwr.proto.control_pb2 import ( # pylint: disable=E0611
|
|
59
63
|
from flwr.server.superlink.linkstate import LinkState, LinkStateFactory
|
60
64
|
from flwr.supercore.ffs import FfsFactory
|
61
65
|
from flwr.supercore.object_store import ObjectStore, ObjectStoreFactory
|
66
|
+
from flwr.superlink.artifact_provider import ArtifactProvider
|
62
67
|
|
63
68
|
from .control_user_auth_interceptor import shared_account_info
|
64
69
|
|
@@ -73,14 +78,16 @@ class ControlServicer(control_pb2_grpc.ControlServicer):
|
|
73
78
|
objectstore_factory: ObjectStoreFactory,
|
74
79
|
is_simulation: bool,
|
75
80
|
auth_plugin: Optional[ControlAuthPlugin] = None,
|
81
|
+
artifact_provider: Optional[ArtifactProvider] = None,
|
76
82
|
) -> None:
|
77
83
|
self.linkstate_factory = linkstate_factory
|
78
84
|
self.ffs_factory = ffs_factory
|
79
85
|
self.objectstore_factory = objectstore_factory
|
80
86
|
self.is_simulation = is_simulation
|
81
87
|
self.auth_plugin = auth_plugin
|
88
|
+
self.artifact_provider = artifact_provider
|
82
89
|
|
83
|
-
def StartRun(
|
90
|
+
def StartRun( # pylint: disable=too-many-locals
|
84
91
|
self, request: StartRunRequest, context: grpc.ServicerContext
|
85
92
|
) -> StartRunResponse:
|
86
93
|
"""Create run ID."""
|
@@ -126,11 +133,20 @@ class ControlServicer(control_pb2_grpc.ControlServicer):
|
|
126
133
|
flwr_aid,
|
127
134
|
)
|
128
135
|
|
136
|
+
# Initialize node config
|
137
|
+
node_config = {}
|
138
|
+
if self.artifact_provider is not None:
|
139
|
+
node_config = {
|
140
|
+
"output_dir": self.artifact_provider.output_dir,
|
141
|
+
"tmp_dir": self.artifact_provider.tmp_dir,
|
142
|
+
}
|
143
|
+
|
129
144
|
# Create an empty context for the Run
|
130
145
|
context = Context(
|
131
146
|
run_id=run_id,
|
132
147
|
node_id=0,
|
133
|
-
|
148
|
+
# Dict is invariant in mypy
|
149
|
+
node_config=node_config, # type: ignore[arg-type]
|
134
150
|
state=RecordDict(),
|
135
151
|
run_config={},
|
136
152
|
)
|
@@ -335,6 +351,47 @@ class ControlServicer(control_pb2_grpc.ControlServicer):
|
|
335
351
|
refresh_token=credentials.refresh_token,
|
336
352
|
)
|
337
353
|
|
354
|
+
def PullArtifacts(
|
355
|
+
self, request: PullArtifactsRequest, context: grpc.ServicerContext
|
356
|
+
) -> PullArtifactsResponse:
|
357
|
+
"""Pull artifacts for a given run ID."""
|
358
|
+
log(INFO, "ControlServicer.PullArtifacts")
|
359
|
+
|
360
|
+
# Check if artifact provider is configured
|
361
|
+
if self.artifact_provider is None:
|
362
|
+
context.abort(
|
363
|
+
grpc.StatusCode.UNIMPLEMENTED,
|
364
|
+
NO_ARTIFACT_PROVIDER_MESSAGE,
|
365
|
+
)
|
366
|
+
raise grpc.RpcError() # This line is unreachable
|
367
|
+
|
368
|
+
# Init link state
|
369
|
+
state = self.linkstate_factory.state()
|
370
|
+
|
371
|
+
# Retrieve run ID and run
|
372
|
+
run_id = request.run_id
|
373
|
+
run = state.get_run(run_id)
|
374
|
+
|
375
|
+
# Exit if `run_id` not found
|
376
|
+
if not run:
|
377
|
+
context.abort(grpc.StatusCode.NOT_FOUND, RUN_ID_NOT_FOUND_MESSAGE)
|
378
|
+
raise grpc.RpcError() # This line is unreachable
|
379
|
+
|
380
|
+
# Exit if the run is not finished yet
|
381
|
+
if run.status.status != Status.FINISHED:
|
382
|
+
context.abort(
|
383
|
+
grpc.StatusCode.FAILED_PRECONDITION, PULL_UNFINISHED_RUN_MESSAGE
|
384
|
+
)
|
385
|
+
|
386
|
+
# Check if `flwr_aid` matches the run's `flwr_aid` when user auth is enabled
|
387
|
+
if self.auth_plugin:
|
388
|
+
flwr_aid = shared_account_info.get().flwr_aid
|
389
|
+
_check_flwr_aid_in_run(flwr_aid=flwr_aid, run=run, context=context)
|
390
|
+
|
391
|
+
# Call artifact provider
|
392
|
+
download_url = self.artifact_provider.get_url(run_id)
|
393
|
+
return PullArtifactsResponse(url=download_url)
|
394
|
+
|
338
395
|
|
339
396
|
def _create_list_runs_response(
|
340
397
|
run_ids: set[int], state: LinkState, store: ObjectStore
|
{flwr_nightly-1.22.0.dev20250916.dist-info → flwr_nightly-1.22.0.dev20250917.dist-info}/METADATA
RENAMED
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.3
|
2
2
|
Name: flwr-nightly
|
3
|
-
Version: 1.22.0.
|
3
|
+
Version: 1.22.0.dev20250917
|
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.22.0.dev20250916.dist-info → flwr_nightly-1.22.0.dev20250917.dist-info}/RECORD
RENAMED
@@ -4,7 +4,7 @@ flwr/app/error.py,sha256=0PwA-E_CAs5P_nWAA0kksVO1A44t4CNLEf7u-Su-uJ0,2342
|
|
4
4
|
flwr/app/exception.py,sha256=WX45Yviu_CmYrYd8JHNjRkSsb-g4Br7XvVLKuVxwSdI,1298
|
5
5
|
flwr/app/metadata.py,sha256=rdMBn0zhIOYmCvmGENQWSQqDwcxwsMJzCle4PQdlc_Y,7331
|
6
6
|
flwr/cli/__init__.py,sha256=EfMGmHoobET6P2blBt_eOByXL8299MgFfB7XNdaPQ6I,720
|
7
|
-
flwr/cli/app.py,sha256=
|
7
|
+
flwr/cli/app.py,sha256=qYMZtPXzDXZpigmerRz4WF3lA3D0Y1lVufzgWB8Nd9A,1899
|
8
8
|
flwr/cli/auth_plugin/__init__.py,sha256=FyaoqPzcxlBTFfJ2sBRC5USwQLmAhFr5KuBwfMO4bmo,1052
|
9
9
|
flwr/cli/auth_plugin/oidc_cli_plugin.py,sha256=kQteGRB9-DmC7K5F9TBmUc8ndSBR7WyT27ygWUUuX_g,5402
|
10
10
|
flwr/cli/build.py,sha256=hE54Q_eMdWLpVKSVC2aQaUxVaiUlWnAosGNvIPSEg6Y,7284
|
@@ -18,19 +18,19 @@ flwr/cli/login/__init__.py,sha256=B1SXKU3HCQhWfFDMJhlC7FOl8UsvH4mxysxeBnrfyUE,80
|
|
18
18
|
flwr/cli/login/login.py,sha256=RM1Jiv_VFm3oz4rTHSr3D87X90lW3WzErjBBU7WviWY,4309
|
19
19
|
flwr/cli/ls.py,sha256=3YK7cpoImJ7PbjlP_JgYRQWz1GymX2q7Reu-mKJEpao,10957
|
20
20
|
flwr/cli/new/__init__.py,sha256=QA1E2QtzPvFCjLTUHnFnJbufuFiGyT_0Y53Wpbvg1F0,790
|
21
|
-
flwr/cli/new/new.py,sha256=
|
21
|
+
flwr/cli/new/new.py,sha256=GvXapfYMrUQMktn1qJ3bfxfXeK0IAsxsxHBIGfPg3sE,10535
|
22
22
|
flwr/cli/new/templates/__init__.py,sha256=FpjWCfIySU2DB4kh0HOXLAjlZNNFDTVU4w3HoE2TzcI,725
|
23
23
|
flwr/cli/new/templates/app/.gitignore.tpl,sha256=HZJcGQoxp7aUzaPg8Uqch3kNrIESwr9yjimDxJYgXVY,3104
|
24
24
|
flwr/cli/new/templates/app/LICENSE.tpl,sha256=WNHhf_5RCaeuKWyq_K39vmp9F28LxKsB4SpomwSZ2L0,11357
|
25
25
|
flwr/cli/new/templates/app/README.baseline.md.tpl,sha256=oClo5eR0iLuPzBT7uS3ikhNRAnySz_lhkHFElixKyJM,9640
|
26
|
-
flwr/cli/new/templates/app/README.flowertune.md.tpl,sha256=
|
26
|
+
flwr/cli/new/templates/app/README.flowertune.md.tpl,sha256=2-W0HAseLWOe1JJU0TsNocp63D14N7jLwWhtYjxlfxs,3494
|
27
27
|
flwr/cli/new/templates/app/README.md.tpl,sha256=uI8vUMCEGA1-WJ8-9EUFCnNtofWFkJNOxaR1V6r_Su4,1908
|
28
28
|
flwr/cli/new/templates/app/__init__.py,sha256=LbR0ksGiF566JcHM_H5m1Tc4-oYUEilWFlcXR-Oe6bI,729
|
29
29
|
flwr/cli/new/templates/app/code/__init__.baseline.py.tpl,sha256=YkHAgppUeD2BnBoGfVB6dEvBfjuIPGsU1gw4CiUi3qA,40
|
30
30
|
flwr/cli/new/templates/app/code/__init__.py,sha256=zXa2YU1swzHxOKDQbwlDMEwVPOUswVeosjkiXNMTgFo,736
|
31
31
|
flwr/cli/new/templates/app/code/__init__.py.tpl,sha256=J0Gn74E7khpLyKJVNqOPu7ev93vkcu1PZugsbxtABMw,52
|
32
32
|
flwr/cli/new/templates/app/code/__init__.pytorch_legacy_api.py.tpl,sha256=mKIS8MK_X8T9NlmcX1-_c9Bbexc-ueqDIBI7uN6c4dE,45
|
33
|
-
flwr/cli/new/templates/app/code/client.baseline.py.tpl,sha256=
|
33
|
+
flwr/cli/new/templates/app/code/client.baseline.py.tpl,sha256=w8xYWhVAb5AFDLj206Nxz5U-xbzDBv0px2FFvE5wRTM,2438
|
34
34
|
flwr/cli/new/templates/app/code/client.huggingface.py.tpl,sha256=SIZZ3s-6u8IU8cFfsqu6ZU8zjhfI1m1SWauOSUcW8TA,3015
|
35
35
|
flwr/cli/new/templates/app/code/client.jax.py.tpl,sha256=uFCIPwAHYiRAgh2W3nRni_Oig02ZzRF-ofUG5O19zcE,2125
|
36
36
|
flwr/cli/new/templates/app/code/client.mlx.py.tpl,sha256=CHU2IBIzI2YENZZuvTsAlSdL94DK19wMYMIhr-JgwZ8,3422
|
@@ -41,13 +41,13 @@ flwr/cli/new/templates/app/code/client.sklearn.py.tpl,sha256=0qqEe-RRjkHGOH8gsD9
|
|
41
41
|
flwr/cli/new/templates/app/code/client.tensorflow.py.tpl,sha256=8o55KXpsbF_rv6o98ZNYJDCazjwMp_RPTaSzDfT7Qlw,2682
|
42
42
|
flwr/cli/new/templates/app/code/dataset.baseline.py.tpl,sha256=jbd_exHAk2-Blu_kVutjPO6a_dkJQWb232zxSeXIZ1k,1453
|
43
43
|
flwr/cli/new/templates/app/code/flwr_tune/__init__.py,sha256=Xq5fEn5yZkw6HAJi10T_3HRBoqN5_5pNqJHY4wXvD5k,748
|
44
|
-
flwr/cli/new/templates/app/code/flwr_tune/client_app.py.tpl,sha256=
|
44
|
+
flwr/cli/new/templates/app/code/flwr_tune/client_app.py.tpl,sha256=p6BzTbP-mXkFANiVC7iz3YlskOidWaLC341IJyrUotQ,2951
|
45
45
|
flwr/cli/new/templates/app/code/flwr_tune/dataset.py.tpl,sha256=1NA2Sf-EviNtOaYN4dnFk6v2tcZVsY3-eXY84wOXVng,3059
|
46
|
-
flwr/cli/new/templates/app/code/flwr_tune/models.py.tpl,sha256=
|
47
|
-
flwr/cli/new/templates/app/code/flwr_tune/server_app.py.tpl,sha256=
|
48
|
-
flwr/cli/new/templates/app/code/flwr_tune/strategy.py.tpl,sha256=
|
49
|
-
flwr/cli/new/templates/app/code/model.baseline.py.tpl,sha256=
|
50
|
-
flwr/cli/new/templates/app/code/server.baseline.py.tpl,sha256=
|
46
|
+
flwr/cli/new/templates/app/code/flwr_tune/models.py.tpl,sha256=UCLEKUpXarkz9tMFtDrxmLv6QuKe5zCimTuoopQedUM,1717
|
47
|
+
flwr/cli/new/templates/app/code/flwr_tune/server_app.py.tpl,sha256=qe9Om3P2ERvvSj2NN5RSEKgNgztWatCpWtC8SkS_T_M,2420
|
48
|
+
flwr/cli/new/templates/app/code/flwr_tune/strategy.py.tpl,sha256=M6CzBY-gtIqLOu2xTtABXOVgBnqKOu7d6Vn2sazmYuI,2444
|
49
|
+
flwr/cli/new/templates/app/code/model.baseline.py.tpl,sha256=P6jTuN9reJfdthiN3mOUHiA4xrtDh5TTUcAV6210-hU,2104
|
50
|
+
flwr/cli/new/templates/app/code/server.baseline.py.tpl,sha256=hliBSfHSzg4bi6PxMlj4oGFfvzvi-4DzoaI67VZbJeQ,1111
|
51
51
|
flwr/cli/new/templates/app/code/server.huggingface.py.tpl,sha256=_2Mv-SqGSMf7sMdbMEmvROzedvNaVHvhIIO3eYAhVYU,1252
|
52
52
|
flwr/cli/new/templates/app/code/server.jax.py.tpl,sha256=RW-rh7ogcJ3_BD66bJxTw-ZoP7c-4SK8hVHc-e0SSVY,1029
|
53
53
|
flwr/cli/new/templates/app/code/server.mlx.py.tpl,sha256=J8rIe6RL2ndODVJD79xShRKBH70HljFSCi4s_RJ-xLQ,1200
|
@@ -66,8 +66,8 @@ flwr/cli/new/templates/app/code/task.pytorch_legacy_api.py.tpl,sha256=XlJqA4Ix_P
|
|
66
66
|
flwr/cli/new/templates/app/code/task.sklearn.py.tpl,sha256=vHdhtMp0FHxbYafXyhDT9aKmmmA0Jvpx5Oum1Yu9lWY,1850
|
67
67
|
flwr/cli/new/templates/app/code/task.tensorflow.py.tpl,sha256=impgWN7MfztmcWF4xh1llcZGsgTvrb1HD5ZE0t-8U08,1731
|
68
68
|
flwr/cli/new/templates/app/code/utils.baseline.py.tpl,sha256=YkHAgppUeD2BnBoGfVB6dEvBfjuIPGsU1gw4CiUi3qA,40
|
69
|
-
flwr/cli/new/templates/app/pyproject.baseline.toml.tpl,sha256=
|
70
|
-
flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl,sha256=
|
69
|
+
flwr/cli/new/templates/app/pyproject.baseline.toml.tpl,sha256=mPIMPfneVYV03l8jWRgWZ0V5Kh_pJw-AMUvkhcKkmL8,3182
|
70
|
+
flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl,sha256=wqYW4bWcf12m0U2njR995lySSesFvnHB-eSkPWz-QdM,2501
|
71
71
|
flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl,sha256=xHGF38i7oFpvnFvqfqLdtc08CkHRYsenbLz3q1dhCXk,2020
|
72
72
|
flwr/cli/new/templates/app/pyproject.jax.toml.tpl,sha256=fdDhwmPoMirJ095cU_vFCBf0ILQlAoa1fdnHb2LM1yk,1471
|
73
73
|
flwr/cli/new/templates/app/pyproject.mlx.toml.tpl,sha256=PAjPT2v06sBZxacNiyMJloDwocCK5tFcGQmMXOoBqc8,1542
|
@@ -76,10 +76,11 @@ flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl,sha256=SE4H23OFkQbqNU64nYf
|
|
76
76
|
flwr/cli/new/templates/app/pyproject.pytorch_legacy_api.toml.tpl,sha256=docQbs3MuRR-yT24lVz7N2sQL3Sj49EHuOCuRj_0djQ,1508
|
77
77
|
flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl,sha256=apauU_PUmLEbt2rjckKniEbzdRs1EnMri_qgtHtBJZ8,1484
|
78
78
|
flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl,sha256=LQpDKJTEnRKj5Ygn5FkT44SxlnLVprkPlbrGaFf5Q50,1508
|
79
|
+
flwr/cli/pull.py,sha256=dHiMe6x8w8yRoFNKpjA-eiPD6eFiHz4Vah5HZrqNpuo,3364
|
79
80
|
flwr/cli/run/__init__.py,sha256=RPyB7KbYTFl6YRiilCch6oezxrLQrl1kijV7BMGkLbA,790
|
80
81
|
flwr/cli/run/run.py,sha256=ECa0kup9dn15O70H74QdgUsEaeErbzDqVX_U0zZO5IM,8173
|
81
82
|
flwr/cli/stop.py,sha256=TR9F61suTxNUzGIktUdoBhXwdRtCdvzGhy3qCuvcfBg,5000
|
82
|
-
flwr/cli/utils.py,sha256=
|
83
|
+
flwr/cli/utils.py,sha256=sMctnDYHv-zu9FG67aV0vy_zs3gkkXclQicBD_67WWg,13805
|
83
84
|
flwr/client/__init__.py,sha256=boIhKaK6I977zrILmoTutNx94x5jB0e6F1gnAjaRJnI,1250
|
84
85
|
flwr/client/client.py,sha256=3HAchxvknKG9jYbB7swNyDj-e5vUWDuMKoLvbT7jCVM,7895
|
85
86
|
flwr/client/client_app.py,sha256=zVhi-l3chAb06ozFsKwix3hU_RpOLjST13Ha50AVIPE,16918
|
@@ -116,7 +117,7 @@ flwr/common/args.py,sha256=Nq2u4yePbkSY0CWFamn0hZY6Rms8G1xYDeDGIcLIITE,5849
|
|
116
117
|
flwr/common/auth_plugin/__init__.py,sha256=DktrRcGZrRarLf7Jb_UlHtOyLp9_-kEplyq6PS5-vOA,988
|
117
118
|
flwr/common/auth_plugin/auth_plugin.py,sha256=mM7SuphO4OsVAVJR1GErYVgYT83ZjxDzS_gha12bT9E,4855
|
118
119
|
flwr/common/config.py,sha256=glcZDjco-amw1YfQcYTFJ4S1pt9APoexT-mf1QscuHs,13960
|
119
|
-
flwr/common/constant.py,sha256=
|
120
|
+
flwr/common/constant.py,sha256=zopMTlEgz8TxMSh59ueef6VutHSdfb3XRStl1W5yBZ4,9013
|
120
121
|
flwr/common/context.py,sha256=Be8obQR_OvEDy1OmshuUKxGRQ7Qx89mf5F4xlhkR10s,2407
|
121
122
|
flwr/common/date.py,sha256=1ZT2cRSpC2DJqprOVTLXYCR_O2_OZR0zXO_brJ3LqWc,1554
|
122
123
|
flwr/common/differential_privacy.py,sha256=FdlpdpPl_H_2HJa8CQM1iCUGBBQ5Dc8CzxmHERM-EoE,6148
|
@@ -181,10 +182,10 @@ flwr/proto/clientappio_pb2.py,sha256=vJjzwWydhg7LruK8cvRAeVQeHPsJztgdIW9nyiPBZF0
|
|
181
182
|
flwr/proto/clientappio_pb2.pyi,sha256=XbFvpZvvrS7QcH5AFXfpRGl4hQvhd3QdKO6x0oTlCCU,165
|
182
183
|
flwr/proto/clientappio_pb2_grpc.py,sha256=iobNROP0qvn5zddx7k-uIi_dJWP3T_BRp_kbKq086i8,17550
|
183
184
|
flwr/proto/clientappio_pb2_grpc.pyi,sha256=Ytf1O1ktKB0Vsuc3AWLIErGjIJYokzKYzi2uA7mdMeg,4785
|
184
|
-
flwr/proto/control_pb2.py,sha256=
|
185
|
-
flwr/proto/control_pb2.pyi,sha256=
|
186
|
-
flwr/proto/control_pb2_grpc.py,sha256=
|
187
|
-
flwr/proto/control_pb2_grpc.pyi,sha256=
|
185
|
+
flwr/proto/control_pb2.py,sha256=Sz7PTdb7YGBs2N-FX6GiOVueY9PN0cF85XbwBkK9_BE,6183
|
186
|
+
flwr/proto/control_pb2.pyi,sha256=2OLPt6ztVcLzzISqfRqW4yrA-nawIPLwVDoTjBnSS5U,10592
|
187
|
+
flwr/proto/control_pb2_grpc.py,sha256=R4ykPqGblqEpOdVskoSfMeS-pZdyMT3CMBQUtTzHbgQ,12282
|
188
|
+
flwr/proto/control_pb2_grpc.pyi,sha256=7U9aOP4dYamnc4ZtTrEQEYYz0kFNI_fT88LRxwClA0U,3504
|
188
189
|
flwr/proto/error_pb2.py,sha256=PQVWrfjVPo88ql_KgV9nCxyQNCcV9PVfmcw7sOzTMro,1084
|
189
190
|
flwr/proto/error_pb2.pyi,sha256=ZNH4HhJTU_KfMXlyCeg8FwU-fcUYxTqEmoJPtWtHikc,734
|
190
191
|
flwr/proto/error_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
|
@@ -239,7 +240,7 @@ flwr/proto/transport_pb2_grpc.py,sha256=vLN3EHtx2aEEMCO4f1Upu-l27BPzd3-5pV-u8wPc
|
|
239
240
|
flwr/proto/transport_pb2_grpc.pyi,sha256=AGXf8RiIiW2J5IKMlm_3qT3AzcDa4F3P5IqUjve_esA,766
|
240
241
|
flwr/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
241
242
|
flwr/server/__init__.py,sha256=LQQHiuL2jy7TpNaKastRdGsexlxSt5ZWAQNVqitDnrY,1598
|
242
|
-
flwr/server/app.py,sha256=
|
243
|
+
flwr/server/app.py,sha256=SUWdNUcl-Sy8h2MiC8Etr50GDJuGq58Ekqtr5XQ-Xrg,29951
|
243
244
|
flwr/server/client_manager.py,sha256=5jCGavVli7XdupvWWo7ru3PdFTlRU8IGvHFSSoUVLRs,6227
|
244
245
|
flwr/server/client_proxy.py,sha256=sv0E9AldBYOvc3pusqFh-GnyreeMfsXQ1cuTtxTq_wY,2399
|
245
246
|
flwr/server/compat/__init__.py,sha256=0IsttWvY15qO98_1GyzVC-vR1e_ZPXOdu2qUlOkYMPE,886
|
@@ -332,7 +333,7 @@ flwr/server/workflow/secure_aggregation/secaggplus_workflow.py,sha256=DkayCsnlAy
|
|
332
333
|
flwr/serverapp/__init__.py,sha256=ZujKNXULwhWYQhFnxOOT5Wi9MRq2JCWFhAAj7ouiQ78,884
|
333
334
|
flwr/serverapp/dp_fixed_clipping.py,sha256=wbP4W7CaUHXdll8ZSVUnTBSEWrnWM00CGk63rOR-Q2s,12133
|
334
335
|
flwr/serverapp/exception.py,sha256=5cuH-2AafvihzosWDdDjuMmHdDqZ1XxHvCqZXNBVklw,1334
|
335
|
-
flwr/serverapp/strategy/__init__.py,sha256=
|
336
|
+
flwr/serverapp/strategy/__init__.py,sha256=MJNWeBWzpQDfqhhpND5LncxPVK91kUo_Yzu6IMFdLCc,1492
|
336
337
|
flwr/serverapp/strategy/dp_fixed_clipping.py,sha256=wbP4W7CaUHXdll8ZSVUnTBSEWrnWM00CGk63rOR-Q2s,12133
|
337
338
|
flwr/serverapp/strategy/fedadagrad.py,sha256=fD65P6OEERa_pxq847e1UZpA083AcWR44XavYB0naGM,6343
|
338
339
|
flwr/serverapp/strategy/fedadam.py,sha256=s3xPIqhopy6yPTeFxevSPnc7a6BcKnKsvo2AaO6Z_xs,7138
|
@@ -340,6 +341,7 @@ flwr/serverapp/strategy/fedavg.py,sha256=Bq_nlmngzJbjqX1fF1mevXGVN6-pwglHv-6yNrs
|
|
340
341
|
flwr/serverapp/strategy/fedavgm.py,sha256=VlByltWzUYCoiVIWPFRqsqLKNWjlOlO2INK8SUxEjzk,8327
|
341
342
|
flwr/serverapp/strategy/fedmedian.py,sha256=b31Dk0LQBbQxi_f-jeSbWHI7iOBugcuBSN2Az-_a75E,2596
|
342
343
|
flwr/serverapp/strategy/fedopt.py,sha256=kqT0uV2IUE93O72XEVa1JJo61dcwbZEoT9KmYTjR2tE,8477
|
344
|
+
flwr/serverapp/strategy/fedprox.py,sha256=XkkLTk3XpXAj0QoAzHqAvcAlPjrNlX11ISAu5u2x6X8,7026
|
343
345
|
flwr/serverapp/strategy/fedtrimmedavg.py,sha256=4-QxgAQGo_7vB_L7qDYy28d95OBt9MeDa92yaTRMHqk,7166
|
344
346
|
flwr/serverapp/strategy/fedxgb_bagging.py,sha256=ktDjzov4y0BRecioq788umCEtcuwElou9olBizQKOnM,3282
|
345
347
|
flwr/serverapp/strategy/fedyogi.py,sha256=1Ripr4Hi2cdeTOLiFOXtMKvOxR3BsUQwc7bbTrXN4LM,6653
|
@@ -348,13 +350,13 @@ flwr/serverapp/strategy/strategy.py,sha256=8uJGGm1ROLZERQ_dkRS7Z_rs-yK6XCE0UxXtI
|
|
348
350
|
flwr/serverapp/strategy/strategy_utils.py,sha256=hiwS7k-Hx6_c4NZXoKpHucS5CBKb7f8GppXRBSMt3Us,10851
|
349
351
|
flwr/serverapp/strategy/strategy_utils_tests.py,sha256=_adS23Lrv1QA6V_3oZ7P_csMd8RqDObFeIhOkFnNtTg,10690
|
350
352
|
flwr/simulation/__init__.py,sha256=Gg6OsP1Z-ixc3-xxzvl7j7rz2Fijy9rzyEPpxgAQCeM,1556
|
351
|
-
flwr/simulation/app.py,sha256=
|
353
|
+
flwr/simulation/app.py,sha256=b_bDyZFwBf2zpKs37Vmd5cFJSzDRE0fL-8uqA0UkAv4,10393
|
352
354
|
flwr/simulation/legacy_app.py,sha256=nMISQqW0otJL1-2Kfd94O6BLlGS2IEmEPKTM2WGKrIs,15861
|
353
355
|
flwr/simulation/ray_transport/__init__.py,sha256=ogd-0AMv2U-wBZ1r3sHWaDIOIrVqr88Xi6C8o4Dviy0,734
|
354
356
|
flwr/simulation/ray_transport/ray_actor.py,sha256=JN3xTqFIr5Z750k92CcA_uavzOHhSWDwE2WCaecvpks,19147
|
355
357
|
flwr/simulation/ray_transport/ray_client_proxy.py,sha256=2kVUDrJe2ViOJEuB0v_Xb3XUwK9yKNwDwrYQXTJDdco,7506
|
356
358
|
flwr/simulation/ray_transport/utils.py,sha256=KrexpWYCF-dAF3UHc9yDbPQWO-ahMT-BbD8nURLgiHk,2393
|
357
|
-
flwr/simulation/run_simulation.py,sha256
|
359
|
+
flwr/simulation/run_simulation.py,sha256=LrM5iI0Rf_QqrnqvJ1muKxKFlrInA3I8-SF-uIIsPik,20666
|
358
360
|
flwr/simulation/simulationio_connection.py,sha256=mzS1C6EEREwQDPceDo30anAasmTDLb9qqV2tXlBhOUA,3494
|
359
361
|
flwr/supercore/__init__.py,sha256=pqkFoow_E6UhbBlhmoD1gmTH-33yJRhBsIZqxRPFZ7U,755
|
360
362
|
flwr/supercore/app_utils.py,sha256=K76Zt6R670b1hUmxOsNc1WUCVYvF7lejXPcCO9K0Q0g,1753
|
@@ -386,12 +388,14 @@ flwr/supercore/superexec/plugin/simulation_exec_plugin.py,sha256=upn5zE-YKkl_jTw
|
|
386
388
|
flwr/supercore/superexec/run_superexec.py,sha256=8hUlaVPVNnhePQ9OUgen4yy0fSGZAVggBGzm-33iJPw,6630
|
387
389
|
flwr/supercore/utils.py,sha256=ebuHMbeA8eXisX0oMPqBK3hk7uVnIE_yiqWVz8YbkpQ,1324
|
388
390
|
flwr/superlink/__init__.py,sha256=GNSuJ4-N6Z8wun2iZNlXqENt5beUyzC0Gi_tN396bbM,707
|
391
|
+
flwr/superlink/artifact_provider/__init__.py,sha256=pgZEcVPKRE874LSu3cgy0HbwSJBIpVy_HxQOmne4PAs,810
|
392
|
+
flwr/superlink/artifact_provider/artifact_provider.py,sha256=Gnlg2M2SOqCruji2B0U3ov68NJWKin9scmnWJTiSnNA,1267
|
389
393
|
flwr/superlink/servicer/__init__.py,sha256=ZC-kILcUGeh6IxJsfu24cTzUqIGXmQfEKsGfhsnhBpM,717
|
390
394
|
flwr/superlink/servicer/control/__init__.py,sha256=qhUTMt_Mg4lxslCJYn5hDSrA-lXf5ya3617BT8kR-2Y,803
|
391
395
|
flwr/superlink/servicer/control/control_event_log_interceptor.py,sha256=HauUd7Xq-b1TFZmZVl9wpBITfDttn8-1_KhlEq-HJ8M,5966
|
392
|
-
flwr/superlink/servicer/control/control_grpc.py,sha256=
|
396
|
+
flwr/superlink/servicer/control/control_grpc.py,sha256=BYm2QELbUAV_mHr0K-ZU726jjgoFXTo4M0-C6MXFzTg,4244
|
393
397
|
flwr/superlink/servicer/control/control_license_interceptor.py,sha256=T3AzmRt-PPwyTq3hrdpmZHQd5_CpPOk7TtnFZrB-JRY,3349
|
394
|
-
flwr/superlink/servicer/control/control_servicer.py,sha256=
|
398
|
+
flwr/superlink/servicer/control/control_servicer.py,sha256=zY1ARksabr776eLQDy48wDmEx9t-VXTOnHq1h5Mt61U,16143
|
395
399
|
flwr/superlink/servicer/control/control_user_auth_interceptor.py,sha256=9Aqhrt_UX80FXbIQVXUrqDHs5rD5CA7vEn0Bh-zPiYU,6232
|
396
400
|
flwr/supernode/__init__.py,sha256=KgeCaVvXWrU3rptNR1y0oBp4YtXbAcrnCcJAiOoWkI4,707
|
397
401
|
flwr/supernode/cli/__init__.py,sha256=JuEMr0-s9zv-PEWKuLB9tj1ocNfroSyNJ-oyv7ati9A,887
|
@@ -407,7 +411,7 @@ flwr/supernode/servicer/__init__.py,sha256=lucTzre5WPK7G1YLCfaqg3rbFWdNSb7ZTt-ca
|
|
407
411
|
flwr/supernode/servicer/clientappio/__init__.py,sha256=7Oy62Y_oijqF7Dxi6tpcUQyOpLc_QpIRZ83NvwmB0Yg,813
|
408
412
|
flwr/supernode/servicer/clientappio/clientappio_servicer.py,sha256=nIHRu38EWK-rpNOkcgBRAAKwYQQWFeCwu0lkO7OPZGQ,10239
|
409
413
|
flwr/supernode/start_client_internal.py,sha256=Y9S1-QlO2WP6eo4JvWzIpfaCoh2aoE7bjEYyxNNnlyg,20777
|
410
|
-
flwr_nightly-1.22.0.
|
411
|
-
flwr_nightly-1.22.0.
|
412
|
-
flwr_nightly-1.22.0.
|
413
|
-
flwr_nightly-1.22.0.
|
414
|
+
flwr_nightly-1.22.0.dev20250917.dist-info/METADATA,sha256=NGqW090jvJZ7dg66AQQr9jKb4SF7DdF78xwqFuhtFUE,14559
|
415
|
+
flwr_nightly-1.22.0.dev20250917.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
|
416
|
+
flwr_nightly-1.22.0.dev20250917.dist-info/entry_points.txt,sha256=hxHD2ixb_vJFDOlZV-zB4Ao32_BQlL34ftsDh1GXv14,420
|
417
|
+
flwr_nightly-1.22.0.dev20250917.dist-info/RECORD,,
|
{flwr_nightly-1.22.0.dev20250916.dist-info → flwr_nightly-1.22.0.dev20250917.dist-info}/WHEEL
RENAMED
File without changes
|
File without changes
|