flwr-nightly 1.14.0.dev20241216__py3-none-any.whl → 1.15.0.dev20250107__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.
Files changed (38) hide show
  1. flwr/cli/log.py +8 -6
  2. flwr/cli/ls.py +7 -4
  3. flwr/cli/new/templates/app/.gitignore.tpl +3 -0
  4. flwr/cli/new/templates/app/pyproject.baseline.toml.tpl +1 -1
  5. flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +1 -1
  6. flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl +1 -1
  7. flwr/cli/new/templates/app/pyproject.jax.toml.tpl +1 -1
  8. flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +1 -1
  9. flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +1 -1
  10. flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +3 -3
  11. flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +1 -1
  12. flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +1 -1
  13. flwr/cli/run/run.py +7 -2
  14. flwr/cli/stop.py +3 -2
  15. flwr/cli/utils.py +79 -10
  16. flwr/client/client.py +0 -32
  17. flwr/client/message_handler/message_handler.py +0 -2
  18. flwr/client/numpy_client.py +0 -44
  19. flwr/client/supernode/app.py +1 -2
  20. flwr/common/record/recordset.py +1 -1
  21. flwr/common/secure_aggregation/crypto/symmetric_encryption.py +45 -0
  22. flwr/common/telemetry.py +13 -3
  23. flwr/server/app.py +1 -0
  24. flwr/server/run_serverapp.py +8 -9
  25. flwr/server/serverapp/app.py +17 -2
  26. flwr/server/superlink/driver/serverappio_servicer.py +9 -0
  27. flwr/server/superlink/fleet/vce/vce_api.py +2 -2
  28. flwr/server/superlink/linkstate/in_memory_linkstate.py +10 -2
  29. flwr/server/superlink/linkstate/linkstate.py +4 -0
  30. flwr/server/superlink/linkstate/sqlite_linkstate.py +6 -2
  31. flwr/server/superlink/simulation/simulationio_servicer.py +13 -0
  32. flwr/simulation/app.py +15 -4
  33. flwr/simulation/run_simulation.py +35 -7
  34. {flwr_nightly-1.14.0.dev20241216.dist-info → flwr_nightly-1.15.0.dev20250107.dist-info}/METADATA +2 -2
  35. {flwr_nightly-1.14.0.dev20241216.dist-info → flwr_nightly-1.15.0.dev20250107.dist-info}/RECORD +38 -38
  36. {flwr_nightly-1.14.0.dev20241216.dist-info → flwr_nightly-1.15.0.dev20250107.dist-info}/LICENSE +0 -0
  37. {flwr_nightly-1.14.0.dev20241216.dist-info → flwr_nightly-1.15.0.dev20250107.dist-info}/WHEEL +0 -0
  38. {flwr_nightly-1.14.0.dev20241216.dist-info → flwr_nightly-1.15.0.dev20250107.dist-info}/entry_points.txt +0 -0
@@ -25,6 +25,7 @@ from typing import Optional
25
25
 
26
26
  from flwr.cli.config_utils import get_fab_metadata
27
27
  from flwr.cli.install import install_from_fab
28
+ from flwr.cli.utils import get_sha256_hash
28
29
  from flwr.common.args import add_args_flwr_app_common
29
30
  from flwr.common.config import (
30
31
  get_flwr_dir,
@@ -51,6 +52,7 @@ from flwr.common.serde import (
51
52
  run_from_proto,
52
53
  run_status_to_proto,
53
54
  )
55
+ from flwr.common.telemetry import EventType, event
54
56
  from flwr.common.typing import RunNotRunningException, RunStatus
55
57
  from flwr.proto.run_pb2 import UpdateRunStatusRequest # pylint: disable=E0611
56
58
  from flwr.proto.serverappio_pb2 import ( # pylint: disable=E0611
@@ -113,7 +115,8 @@ def run_serverapp( # pylint: disable=R0914, disable=W0212, disable=R0915
113
115
  # Resolve directory where FABs are installed
114
116
  flwr_dir_ = get_flwr_dir(flwr_dir)
115
117
  log_uploader = None
116
-
118
+ success = True
119
+ hash_run_id = None
117
120
  while True:
118
121
 
119
122
  try:
@@ -129,6 +132,8 @@ def run_serverapp( # pylint: disable=R0914, disable=W0212, disable=R0915
129
132
  run = run_from_proto(res.run)
130
133
  fab = fab_from_proto(res.fab)
131
134
 
135
+ hash_run_id = get_sha256_hash(run.run_id)
136
+
132
137
  driver.set_run(run.run_id)
133
138
 
134
139
  # Start log uploader for this run
@@ -171,6 +176,11 @@ def run_serverapp( # pylint: disable=R0914, disable=W0212, disable=R0915
171
176
  UpdateRunStatusRequest(run_id=run.run_id, run_status=run_status_proto)
172
177
  )
173
178
 
179
+ event(
180
+ EventType.FLWR_SERVERAPP_RUN_ENTER,
181
+ event_details={"run-id-hash": hash_run_id},
182
+ )
183
+
174
184
  # Load and run the ServerApp with the Driver
175
185
  updated_context = run_(
176
186
  driver=driver,
@@ -187,17 +197,18 @@ def run_serverapp( # pylint: disable=R0914, disable=W0212, disable=R0915
187
197
  _ = driver._stub.PushServerAppOutputs(out_req)
188
198
 
189
199
  run_status = RunStatus(Status.FINISHED, SubStatus.COMPLETED, "")
190
-
191
200
  except RunNotRunningException:
192
201
  log(INFO, "")
193
202
  log(INFO, "Run ID %s stopped.", run.run_id)
194
203
  log(INFO, "")
195
204
  run_status = None
205
+ success = False
196
206
 
197
207
  except Exception as ex: # pylint: disable=broad-exception-caught
198
208
  exc_entity = "ServerApp"
199
209
  log(ERROR, "%s raised an exception", exc_entity, exc_info=ex)
200
210
  run_status = RunStatus(Status.FINISHED, SubStatus.FAILED, str(ex))
211
+ success = False
201
212
 
202
213
  finally:
203
214
  # Stop log uploader for this run and upload final logs
@@ -213,6 +224,10 @@ def run_serverapp( # pylint: disable=R0914, disable=W0212, disable=R0915
213
224
  run_id=run.run_id, run_status=run_status_proto
214
225
  )
215
226
  )
227
+ event(
228
+ EventType.FLWR_SERVERAPP_RUN_LEAVE,
229
+ event_details={"run-id-hash": hash_run_id, "success": success},
230
+ )
216
231
 
217
232
  # Stop the loop if `flwr-serverapp` is expected to process a single run
218
233
  if run_once:
@@ -159,6 +159,9 @@ class ServerAppIoServicer(serverappio_pb2_grpc.ServerAppIoServicer):
159
159
  for task_ins in request.task_ins_list:
160
160
  validation_errors = validate_task_ins_or_res(task_ins)
161
161
  _raise_if(bool(validation_errors), ", ".join(validation_errors))
162
+ _raise_if(
163
+ request.run_id != task_ins.run_id, "`task_ins` has mismatched `run_id`"
164
+ )
162
165
 
163
166
  # Store each TaskIns
164
167
  task_ids: list[Optional[UUID]] = []
@@ -193,6 +196,12 @@ class ServerAppIoServicer(serverappio_pb2_grpc.ServerAppIoServicer):
193
196
  # Read from state
194
197
  task_res_list: list[TaskRes] = state.get_task_res(task_ids=task_ids)
195
198
 
199
+ # Validate request
200
+ for task_res in task_res_list:
201
+ _raise_if(
202
+ request.run_id != task_res.run_id, "`task_res` has mismatched `run_id`"
203
+ )
204
+
196
205
  # Delete the TaskIns/TaskRes pairs if TaskRes is found
197
206
  task_ins_ids_to_delete = {
198
207
  UUID(task_res.task.ancestry[0]) for task_res in task_res_list
@@ -182,8 +182,8 @@ def run_api(
182
182
  f_stop: threading.Event,
183
183
  ) -> None:
184
184
  """Run the VCE."""
185
- taskins_queue: "Queue[TaskIns]" = Queue()
186
- taskres_queue: "Queue[TaskRes]" = Queue()
185
+ taskins_queue: Queue[TaskIns] = Queue()
186
+ taskres_queue: Queue[TaskRes] = Queue()
187
187
 
188
188
  try:
189
189
 
@@ -430,10 +430,17 @@ class InMemoryLinkState(LinkState): # pylint: disable=R0902,R0904
430
430
  """Retrieve `server_public_key` in urlsafe bytes."""
431
431
  return self.server_public_key
432
432
 
433
+ def clear_supernode_auth_keys_and_credentials(self) -> None:
434
+ """Clear stored `node_public_keys` and credentials in the link state if any."""
435
+ with self.lock:
436
+ self.server_private_key = None
437
+ self.server_public_key = None
438
+ self.node_public_keys.clear()
439
+
433
440
  def store_node_public_keys(self, public_keys: set[bytes]) -> None:
434
441
  """Store a set of `node_public_keys` in the link state."""
435
442
  with self.lock:
436
- self.node_public_keys = public_keys
443
+ self.node_public_keys.update(public_keys)
437
444
 
438
445
  def store_node_public_key(self, public_key: bytes) -> None:
439
446
  """Store a `node_public_key` in the link state."""
@@ -442,7 +449,8 @@ class InMemoryLinkState(LinkState): # pylint: disable=R0902,R0904
442
449
 
443
450
  def get_node_public_keys(self) -> set[bytes]:
444
451
  """Retrieve all currently stored `node_public_keys` as a set."""
445
- return self.node_public_keys
452
+ with self.lock:
453
+ return self.node_public_keys.copy()
446
454
 
447
455
  def get_run_ids(self) -> set[int]:
448
456
  """Retrieve all run IDs."""
@@ -284,6 +284,10 @@ class LinkState(abc.ABC): # pylint: disable=R0904
284
284
  def get_server_public_key(self) -> Optional[bytes]:
285
285
  """Retrieve `server_public_key` in urlsafe bytes."""
286
286
 
287
+ @abc.abstractmethod
288
+ def clear_supernode_auth_keys_and_credentials(self) -> None:
289
+ """Clear stored `node_public_keys` and credentials in the link state if any."""
290
+
287
291
  @abc.abstractmethod
288
292
  def store_node_public_keys(self, public_keys: set[bytes]) -> None:
289
293
  """Store a set of `node_public_keys` in the link state."""
@@ -761,8 +761,6 @@ class SqliteLinkState(LinkState): # pylint: disable=R0904
761
761
  "federation_options, pending_at, starting_at, running_at, finished_at, "
762
762
  "sub_status, details) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);"
763
763
  )
764
- if fab_hash:
765
- fab_id, fab_version = "", ""
766
764
  override_config_json = json.dumps(override_config)
767
765
  data = [
768
766
  sint64_run_id,
@@ -820,6 +818,12 @@ class SqliteLinkState(LinkState): # pylint: disable=R0904
820
818
  public_key = None
821
819
  return public_key
822
820
 
821
+ def clear_supernode_auth_keys_and_credentials(self) -> None:
822
+ """Clear stored `node_public_keys` and credentials in the link state if any."""
823
+ queries = ["DELETE FROM public_key;", "DELETE FROM credential;"]
824
+ for query in queries:
825
+ self.query(query)
826
+
823
827
  def store_node_public_keys(self, public_keys: set[bytes]) -> None:
824
828
  """Store a set of `node_public_keys` in the link state."""
825
829
  query = "INSERT INTO public_key (public_key) VALUES (?)"
@@ -54,6 +54,7 @@ from flwr.proto.simulationio_pb2 import ( # pylint: disable=E0611
54
54
  )
55
55
  from flwr.server.superlink.ffs.ffs_factory import FfsFactory
56
56
  from flwr.server.superlink.linkstate import LinkStateFactory
57
+ from flwr.server.superlink.utils import abort_if
57
58
 
58
59
 
59
60
  class SimulationIoServicer(simulationio_pb2_grpc.SimulationIoServicer):
@@ -110,6 +111,15 @@ class SimulationIoServicer(simulationio_pb2_grpc.SimulationIoServicer):
110
111
  """Push Simulation process outputs."""
111
112
  log(DEBUG, "SimultionIoServicer.PushSimulationOutputs")
112
113
  state = self.state_factory.state()
114
+
115
+ # Abort if the run is not running
116
+ abort_if(
117
+ request.run_id,
118
+ [Status.PENDING, Status.STARTING, Status.FINISHED],
119
+ state,
120
+ context,
121
+ )
122
+
113
123
  state.set_serverapp_context(request.run_id, context_from_proto(request.context))
114
124
  return PushSimulationOutputsResponse()
115
125
 
@@ -120,6 +130,9 @@ class SimulationIoServicer(simulationio_pb2_grpc.SimulationIoServicer):
120
130
  log(DEBUG, "SimultionIoServicer.UpdateRunStatus")
121
131
  state = self.state_factory.state()
122
132
 
133
+ # Abort if the run is finished
134
+ abort_if(request.run_id, [Status.FINISHED], state, context)
135
+
123
136
  # Update the run status
124
137
  state.update_run_status(
125
138
  run_id=request.run_id, new_status=run_status_from_proto(request.run_status)
flwr/simulation/app.py CHANGED
@@ -24,7 +24,8 @@ from typing import Optional
24
24
 
25
25
  from flwr.cli.config_utils import get_fab_metadata
26
26
  from flwr.cli.install import install_from_fab
27
- from flwr.common import EventType
27
+ from flwr.cli.utils import get_sha256_hash
28
+ from flwr.common import EventType, event
28
29
  from flwr.common.args import add_args_flwr_app_common
29
30
  from flwr.common.config import (
30
31
  get_flwr_dir,
@@ -48,6 +49,7 @@ from flwr.common.logger import (
48
49
  from flwr.common.serde import (
49
50
  configs_record_from_proto,
50
51
  context_from_proto,
52
+ context_to_proto,
51
53
  fab_from_proto,
52
54
  run_from_proto,
53
55
  run_status_to_proto,
@@ -201,8 +203,17 @@ def run_simulation_process( # pylint: disable=R0914, disable=W0212, disable=R09
201
203
  verbose: bool = fed_opt.get("verbose", False)
202
204
  enable_tf_gpu_growth: bool = fed_opt.get("enable_tf_gpu_growth", False)
203
205
 
206
+ event(
207
+ EventType.FLWR_SIMULATION_RUN_ENTER,
208
+ event_details={
209
+ "backend": "ray",
210
+ "num-supernodes": num_supernodes,
211
+ "run-id-hash": get_sha256_hash(run.run_id),
212
+ },
213
+ )
214
+
204
215
  # Launch the simulation
205
- _run_simulation(
216
+ updated_context = _run_simulation(
206
217
  server_app_attr=server_app_attr,
207
218
  client_app_attr=client_app_attr,
208
219
  num_supernodes=num_supernodes,
@@ -213,11 +224,11 @@ def run_simulation_process( # pylint: disable=R0914, disable=W0212, disable=R09
213
224
  verbose_logging=verbose,
214
225
  server_app_run_config=fused_config,
215
226
  is_app=True,
216
- exit_event=EventType.CLI_FLOWER_SIMULATION_LEAVE,
227
+ exit_event=EventType.FLWR_SIMULATION_RUN_LEAVE,
217
228
  )
218
229
 
219
230
  # Send resulting context
220
- context_proto = None # context_to_proto(updated_context)
231
+ context_proto = context_to_proto(updated_context)
221
232
  out_req = PushSimulationOutputsRequest(
222
233
  run_id=run.run_id, context=context_proto
223
234
  )
@@ -24,9 +24,11 @@ import threading
24
24
  import traceback
25
25
  from logging import DEBUG, ERROR, INFO, WARNING
26
26
  from pathlib import Path
27
+ from queue import Empty, Queue
27
28
  from typing import Any, Optional
28
29
 
29
30
  from flwr.cli.config_utils import load_and_validate
31
+ from flwr.cli.utils import get_sha256_hash
30
32
  from flwr.client import ClientApp
31
33
  from flwr.common import Context, EventType, RecordSet, event, log, now
32
34
  from flwr.common.config import get_fused_config_from_dir, parse_config_args
@@ -126,7 +128,7 @@ def run_simulation_from_cli() -> None:
126
128
  run = Run.create_empty(run_id)
127
129
  run.override_config = override_config
128
130
 
129
- _run_simulation(
131
+ _ = _run_simulation(
130
132
  server_app_attr=server_app_attr,
131
133
  client_app_attr=client_app_attr,
132
134
  num_supernodes=args.num_supernodes,
@@ -206,7 +208,7 @@ def run_simulation(
206
208
  "\n\tflwr.simulation.run_simulationt(...)",
207
209
  )
208
210
 
209
- _run_simulation(
211
+ _ = _run_simulation(
210
212
  num_supernodes=num_supernodes,
211
213
  client_app=client_app,
212
214
  server_app=server_app,
@@ -229,6 +231,7 @@ def run_serverapp_th(
229
231
  has_exception: threading.Event,
230
232
  enable_tf_gpu_growth: bool,
231
233
  run_id: int,
234
+ ctx_queue: "Queue[Context]",
232
235
  ) -> threading.Thread:
233
236
  """Run SeverApp in a thread."""
234
237
 
@@ -241,6 +244,7 @@ def run_serverapp_th(
241
244
  _server_app_run_config: UserConfig,
242
245
  _server_app_attr: Optional[str],
243
246
  _server_app: Optional[ServerApp],
247
+ _ctx_queue: "Queue[Context]",
244
248
  ) -> None:
245
249
  """Run SeverApp, after check if GPU memory growth has to be set.
246
250
 
@@ -261,13 +265,14 @@ def run_serverapp_th(
261
265
  )
262
266
 
263
267
  # Run ServerApp
264
- _run(
268
+ updated_context = _run(
265
269
  driver=_driver,
266
270
  context=context,
267
271
  server_app_dir=_server_app_dir,
268
272
  server_app_attr=_server_app_attr,
269
273
  loaded_server_app=_server_app,
270
274
  )
275
+ _ctx_queue.put(updated_context)
271
276
  except Exception as ex: # pylint: disable=broad-exception-caught
272
277
  log(ERROR, "ServerApp thread raised an exception: %s", ex)
273
278
  log(ERROR, traceback.format_exc())
@@ -291,6 +296,7 @@ def run_serverapp_th(
291
296
  server_app_run_config,
292
297
  server_app_attr,
293
298
  server_app,
299
+ ctx_queue,
294
300
  ),
295
301
  )
296
302
  serverapp_th.start()
@@ -313,7 +319,7 @@ def _main_loop(
313
319
  server_app: Optional[ServerApp] = None,
314
320
  server_app_attr: Optional[str] = None,
315
321
  server_app_run_config: Optional[UserConfig] = None,
316
- ) -> None:
322
+ ) -> Context:
317
323
  """Start ServerApp on a separate thread, then launch Simulation Engine."""
318
324
  # Initialize StateFactory
319
325
  state_factory = LinkStateFactory(":flwr-in-memory-state:")
@@ -323,6 +329,13 @@ def _main_loop(
323
329
  server_app_thread_has_exception = threading.Event()
324
330
  serverapp_th = None
325
331
  success = True
332
+ updated_context = Context(
333
+ run_id=run.run_id,
334
+ node_id=0,
335
+ node_config=UserConfig(),
336
+ state=RecordSet(),
337
+ run_config=UserConfig(),
338
+ )
326
339
  try:
327
340
  # Register run
328
341
  log(DEBUG, "Pre-registering run with id %s", run.run_id)
@@ -337,6 +350,7 @@ def _main_loop(
337
350
  # Initialize Driver
338
351
  driver = InMemoryDriver(state_factory=state_factory)
339
352
  driver.set_run(run_id=run.run_id)
353
+ output_context_queue: Queue[Context] = Queue()
340
354
 
341
355
  # Get and run ServerApp thread
342
356
  serverapp_th = run_serverapp_th(
@@ -349,6 +363,7 @@ def _main_loop(
349
363
  has_exception=server_app_thread_has_exception,
350
364
  enable_tf_gpu_growth=enable_tf_gpu_growth,
351
365
  run_id=run.run_id,
366
+ ctx_queue=output_context_queue,
352
367
  )
353
368
 
354
369
  # Start Simulation Engine
@@ -366,6 +381,11 @@ def _main_loop(
366
381
  flwr_dir=flwr_dir,
367
382
  )
368
383
 
384
+ updated_context = output_context_queue.get(timeout=3)
385
+
386
+ except Empty:
387
+ log(DEBUG, "Queue timeout. No context received.")
388
+
369
389
  except Exception as ex:
370
390
  log(ERROR, "An exception occurred !! %s", ex)
371
391
  log(ERROR, traceback.format_exc())
@@ -375,13 +395,20 @@ def _main_loop(
375
395
  finally:
376
396
  # Trigger stop event
377
397
  f_stop.set()
378
- event(exit_event, event_details={"success": success})
398
+ event(
399
+ exit_event,
400
+ event_details={
401
+ "run-id-hash": get_sha256_hash(run.run_id),
402
+ "success": success,
403
+ },
404
+ )
379
405
  if serverapp_th:
380
406
  serverapp_th.join()
381
407
  if server_app_thread_has_exception.is_set():
382
408
  raise RuntimeError("Exception in ServerApp thread")
383
409
 
384
410
  log(DEBUG, "Stopping Simulation Engine now.")
411
+ return updated_context
385
412
 
386
413
 
387
414
  # pylint: disable=too-many-arguments,too-many-locals,too-many-positional-arguments
@@ -401,7 +428,7 @@ def _run_simulation(
401
428
  enable_tf_gpu_growth: bool = False,
402
429
  verbose_logging: bool = False,
403
430
  is_app: bool = False,
404
- ) -> None:
431
+ ) -> Context:
405
432
  """Launch the Simulation Engine."""
406
433
  if backend_config is None:
407
434
  backend_config = {}
@@ -480,7 +507,8 @@ def _run_simulation(
480
507
  # Set logger propagation to False to prevent duplicated log output in Colab.
481
508
  logger = set_logger_propagation(logger, False)
482
509
 
483
- _main_loop(*args)
510
+ updated_context = _main_loop(*args)
511
+ return updated_context
484
512
 
485
513
 
486
514
  def _parse_args_run_simulation() -> argparse.ArgumentParser:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: flwr-nightly
3
- Version: 1.14.0.dev20241216
3
+ Version: 1.15.0.dev20250107
4
4
  Summary: Flower: A Friendly Federated AI Framework
5
5
  Home-page: https://flower.ai
6
6
  License: Apache-2.0
@@ -118,7 +118,7 @@ Flower's goal is to make federated learning accessible to everyone. This series
118
118
 
119
119
  4. **Custom Clients for Federated Learning**
120
120
 
121
- [![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/adap/flower/blob/main/doc/source/tutorial-series-customize-the-client-pytorch.ipynb) (or open the [Jupyter Notebook](https://github.com/adap/flower/blob/main/framework/docs/source/tutorial-series-customize-the-client-pytorch.ipynb))
121
+ [![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/adap/flower/blob/main/framework/docs/source/tutorial-series-customize-the-client-pytorch.ipynb) (or open the [Jupyter Notebook](https://github.com/adap/flower/blob/main/framework/docs/source/tutorial-series-customize-the-client-pytorch.ipynb))
122
122
 
123
123
  Stay tuned, more tutorials are coming soon. Topics include **Privacy and Security in Federated Learning**, and **Scaling Federated Learning**.
124
124
 
@@ -6,14 +6,14 @@ flwr/cli/cli_user_auth_interceptor.py,sha256=rEjgAZmzHO0GjwdyZib6bkTI2X59ErJAZlu
6
6
  flwr/cli/config_utils.py,sha256=I4_EMv2f68mfrL_QuOYoAG--yDfKisE7tGiIg09G2YQ,12079
7
7
  flwr/cli/example.py,sha256=uk5CoD0ZITgpY_ffsTbEKf8XOOCSUzByjHPcMSPqV18,2216
8
8
  flwr/cli/install.py,sha256=0AD0qJD79SKgBnWOQlphcubfr4zHk8jTpFgwZbJBI_g,8180
9
- flwr/cli/log.py,sha256=SXr12PepUUU0YDNIMl3m8lguL7Tmf6MrpFBsxZcRmcg,5976
9
+ flwr/cli/log.py,sha256=O7MBpsJp114PIZb-7Cru-KM6fqyneFQkqoQbQsqQmZU,6121
10
10
  flwr/cli/login/__init__.py,sha256=6_9zOzbPOAH72K2wX3-9dXTAbS7Mjpa5sEn2lA6eHHI,800
11
11
  flwr/cli/login/login.py,sha256=bZZ3hVeGpF5805R0Eg_SBZUGwrLAWmyaoLhLw6vQFcg,2764
12
- flwr/cli/ls.py,sha256=II1aCv6q0yi6yl5AcBQ-en250ZUkh82rw_Kt-RewtBQ,10859
12
+ flwr/cli/ls.py,sha256=K_3Bt2RfETw4V7J4qgo8_Wx-Y_bWZqttuO879Ppxo5Y,11056
13
13
  flwr/cli/new/__init__.py,sha256=pOQtPT9W4kCIttcKne5m-FtJbvTqdjTVJxzQ9AUYK8I,790
14
14
  flwr/cli/new/new.py,sha256=scyyKt8mzkc3El1bypgkHjKwVQEc2-q4I50PxriPFdI,9922
15
15
  flwr/cli/new/templates/__init__.py,sha256=4luU8RL-CK8JJCstQ_ON809W9bNTkY1l9zSaPKBkgwY,725
16
- flwr/cli/new/templates/app/.gitignore.tpl,sha256=XixnHdyeMB2vwkGtGnwHqoWpH-9WChdyG0GXe57duhc,3078
16
+ flwr/cli/new/templates/app/.gitignore.tpl,sha256=HZJcGQoxp7aUzaPg8Uqch3kNrIESwr9yjimDxJYgXVY,3104
17
17
  flwr/cli/new/templates/app/LICENSE.tpl,sha256=WNHhf_5RCaeuKWyq_K39vmp9F28LxKsB4SpomwSZ2L0,11357
18
18
  flwr/cli/new/templates/app/README.baseline.md.tpl,sha256=4dg2aBS-NIleVyDlxsG8m65Af6LIJ-pZA5ICjGFU5XA,9641
19
19
  flwr/cli/new/templates/app/README.flowertune.md.tpl,sha256=QSG51uifue2KVZz2ZNw8kmOStS7svC2AQ2gTa5E7Bhs,3326
@@ -55,22 +55,22 @@ flwr/cli/new/templates/app/code/task.pytorch.py.tpl,sha256=XlJqA4Ix_PloO_zJLhjiN
55
55
  flwr/cli/new/templates/app/code/task.sklearn.py.tpl,sha256=SeIIo0rr_6ffn4Qx2xELD18jYXCkcW__NWtYEDXCICM,1843
56
56
  flwr/cli/new/templates/app/code/task.tensorflow.py.tpl,sha256=SKXAZdgBnPpbAbJ90Rb7oQ5ilnopBx_j_JNFoUDeEAI,1732
57
57
  flwr/cli/new/templates/app/code/utils.baseline.py.tpl,sha256=YkHAgppUeD2BnBoGfVB6dEvBfjuIPGsU1gw4CiUi3qA,40
58
- flwr/cli/new/templates/app/pyproject.baseline.toml.tpl,sha256=_bT_ze1QPajyFZW0AxLILai0_2qiquB5_7FCSF0ZqCk,2666
59
- flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl,sha256=GH8stg-XUQAsj_324Cc9RYm7etdtcR49ssglOloo8kE,1873
60
- flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl,sha256=_LSCSc9cAiRuvTLdsy9wphwzhV7FCOUxO1ce12YOk58,1143
61
- flwr/cli/new/templates/app/pyproject.jax.toml.tpl,sha256=8xC1457V13AxTsO7SaLsqhQQPN7Aau3wbNZqKJ9Inx8,673
62
- flwr/cli/new/templates/app/pyproject.mlx.toml.tpl,sha256=sJMPYaroZLM7EkIX5ulnCelKxHlpViYiSqhswEnGrB0,744
63
- flwr/cli/new/templates/app/pyproject.numpy.toml.tpl,sha256=SbCIUjwCIsgTRoBb-GMwivcWdoigMvD3QbKL6TJNgWM,612
64
- flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl,sha256=UtH3Vslg2S8fIKIHC-dJGcxz5YUK2WI3F2TUAgTsQn0,710
65
- flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl,sha256=01HArBqRrbZT3O7pXOM9MqduXMNm525wv7Sj6dvYMJE,686
66
- flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl,sha256=KVCIOEYNWnq6j7XOboXqZshc9aQ2PyRDUu7bZtmfJ24,710
58
+ flwr/cli/new/templates/app/pyproject.baseline.toml.tpl,sha256=5-xGWgb1s0c4E5KXfQqWzVziJXIsUp1cGwZEsMEI31Q,2666
59
+ flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl,sha256=-XdX44M9o6dl-EDBLtHLQejFGQlwQnjATgmEpA8cuq4,1873
60
+ flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl,sha256=QPxFT3_7RSUVwy8jjT6SeWmV9dl2FQ26gUhdp8O7CpI,1143
61
+ flwr/cli/new/templates/app/pyproject.jax.toml.tpl,sha256=cFFgI0zzzyThm38iXy9OLBkPpZz8mOP1qSagBJvwxGQ,673
62
+ flwr/cli/new/templates/app/pyproject.mlx.toml.tpl,sha256=1qeTW-GHMAWr-vuMAJ-eijco9IIsftdBeqNH7g8x3Zw,744
63
+ flwr/cli/new/templates/app/pyproject.numpy.toml.tpl,sha256=nU-ij9nPXxmPgE2SGapXnRfghye8g_Fo1_ub5XpaKAE,612
64
+ flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl,sha256=PA_dEtWkY6Wf3Ektc9DvSKE81er3yDntf_VTtC1nDHc,710
65
+ flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl,sha256=d7TwWH-QJN0j-9rs9zHnng_bHeHV7mk138KXqdv5BoE,686
66
+ flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl,sha256=r0SZnvoR5a5mEWKJIvQ3rW8C6-2DkhaC8A1fTA0avm0,710
67
67
  flwr/cli/run/__init__.py,sha256=cCsKVB0SFzh2b3QmGba6BHckB85xlhjh3mh4pBpACtY,790
68
- flwr/cli/run/run.py,sha256=hUYedvUAxX28i0ytMIyKhO4kJM9MhUdN5KbzKLl_0Y0,7803
69
- flwr/cli/stop.py,sha256=cIvTpS9rRGzHbpdlWz03XOSXNCxMVXORV-7YsmSV1Vg,4540
70
- flwr/cli/utils.py,sha256=25S3IqC2yiC94AcSJ6XQXruDCCH7iZU3mVRHBaAKExo,7873
68
+ flwr/cli/run/run.py,sha256=BvpjYyUvDhVMvO5cG711ihtdeSbls9p8zVAuFGETLA8,7893
69
+ flwr/cli/stop.py,sha256=1T9RNRCH8dxjmBT38hFtKAWY9Gb7RMCMCML7kex9WzE,4613
70
+ flwr/cli/utils.py,sha256=d15VkwxVK-NC1X-LVXXW3_O4-A38ZrlevwSNKNYpJCY,10592
71
71
  flwr/client/__init__.py,sha256=DGDoO0AEAfz-0CUFmLdyUUweAS64-07AOnmDfWUefK4,1192
72
72
  flwr/client/app.py,sha256=XJWu-kPswM52oLYXaOLKr0gj87KPNRI7M0Na9oBsDK4,34784
73
- flwr/client/client.py,sha256=lIIUgxHk4tofk2RljVBL5wFzPR_Ob9iURg0NpyKufPY,9081
73
+ flwr/client/client.py,sha256=8o58nd9o6ZFcMIaVYPGcV4MSjBG4H0oFgWiv8ZEO3oA,7895
74
74
  flwr/client/client_app.py,sha256=cTig-N00YzTucbo9zNi6I21J8PlbflU_8J_f5CI-Wpw,10390
75
75
  flwr/client/clientapp/__init__.py,sha256=kZqChGnTChQ1WGSUkIlW2S5bc0d0mzDubCAmZUGRpEY,800
76
76
  flwr/client/clientapp/app.py,sha256=n3IbbQ__QBjd4n7hhP2oydYg66IvrnSXvwi3sZvnWeU,8949
@@ -87,7 +87,7 @@ flwr/client/grpc_rere_client/connection.py,sha256=NqKSoYIJblB4lElZ7EKIgDjLb6KYEc
87
87
  flwr/client/grpc_rere_client/grpc_adapter.py,sha256=sQo0I9T65t97LFGoW_PrmgaTbd18GFgi2DoAI5wQJ4k,5589
88
88
  flwr/client/heartbeat.py,sha256=cx37mJBH8LyoIN4Lks85wtqT1mnU5GulQnr4pGCvAq0,2404
89
89
  flwr/client/message_handler/__init__.py,sha256=QxxQuBNpFPTHx3KiUNvQSlqMKlEnbRR1kFfc1KVje08,719
90
- flwr/client/message_handler/message_handler.py,sha256=wEbSn60qjozUfNaJIPTsSG2X9OsAKBd8D4c7TU4oJc4,6525
90
+ flwr/client/message_handler/message_handler.py,sha256=s7FEfYJp5QB259Pj1L94_9AC24Kh5JyKC2U-E6eNkkY,6492
91
91
  flwr/client/message_handler/task_handler.py,sha256=ZDJBKmrn2grRMNl1rU1iGs7FiMHL5VmZiSp_6h9GHVU,1824
92
92
  flwr/client/mod/__init__.py,sha256=37XeXZLFq_tzFVKVtC9JaigM2bSAU7BrGQvMPCE3Q28,1159
93
93
  flwr/client/mod/centraldp_mods.py,sha256=UGwNuqpmOWfLdfJITFgdi1TG-nLjuSb-cbEyoyfDgxQ,5415
@@ -101,12 +101,12 @@ flwr/client/nodestate/__init__.py,sha256=6FTlzydo1j0n55Tb-Qo0XmuqTUyRxg3x7jHgo3g
101
101
  flwr/client/nodestate/in_memory_nodestate.py,sha256=MKI3jVPARPWJmNGw61k1-9LIXROkTx2PrhWjDM8cpHk,1291
102
102
  flwr/client/nodestate/nodestate.py,sha256=CmHZdR6kVO8tkffg42W0Yb9JdRmrUonZ9deXfUNK6Hg,1024
103
103
  flwr/client/nodestate/nodestate_factory.py,sha256=apUbcJG0a_FUVsc0TkNN3q9yovc9u_J34u9iuLFKTLQ,1430
104
- flwr/client/numpy_client.py,sha256=tqGyhIkeeZQGr65BR03B7TWgx4rW3FA7G2874D8z_VU,11167
104
+ flwr/client/numpy_client.py,sha256=chTkL9dOtK_wgUoYtzp5mfDOC1k8xPAd1qPIsB3hcjA,9581
105
105
  flwr/client/rest_client/__init__.py,sha256=5KGlp7pjc1dhNRkKlaNtUfQmg8wrRFh9lS3P3uRS-7Q,735
106
106
  flwr/client/rest_client/connection.py,sha256=NWBu7Cc8LUTlf7GjJl3rgdCAykrE5suul_xZUV21OgI,12659
107
107
  flwr/client/run_info_store.py,sha256=ZN2Phi4DSLbSyzg8RmzJcVYh1g6eurHOmWRCT7GMtw4,4040
108
108
  flwr/client/supernode/__init__.py,sha256=SUhWOzcgXRNXk1V9UgB5-FaWukqqrOEajVUHEcPkwyQ,865
109
- flwr/client/supernode/app.py,sha256=qh_hhV_PihPfzL8UMXkwvQJVHRautdsCNd5WKv_Wd40,11483
109
+ flwr/client/supernode/app.py,sha256=LCZs4ImGkleGgsn-b1AOK-u_P8Gi5nKeSvicEDRDF8Q,11400
110
110
  flwr/client/typing.py,sha256=dxoTBnTMfqXr5J7G3y-uNjqxYCddvxhu89spfj4Lm2U,1048
111
111
  flwr/common/__init__.py,sha256=TVaoFEJE158aui1TPZQiJCDZX4RNHRyI8I55VC80HhI,3901
112
112
  flwr/common/address.py,sha256=9KNYE69WW_QVcyumsux3Qn1wmn4J7f13Y9nHASpvzbA,3018
@@ -132,20 +132,20 @@ flwr/common/record/configsrecord.py,sha256=i40jOzBx04ysZKECwaw4FdUXMdY9HgdY8GAqK
132
132
  flwr/common/record/conversion_utils.py,sha256=n3I3SI2P6hUjyxbWNc0QAch-SEhfMK6Hm-UUaplAlUc,1393
133
133
  flwr/common/record/metricsrecord.py,sha256=UywkEPbifiu_IyPUFoDJCi8WEVLujlqZERUWAWpc3vs,5752
134
134
  flwr/common/record/parametersrecord.py,sha256=SasHn35JRHsj8G1UT76FgRjaP4ZJasejvgjBV6HnaTg,7748
135
- flwr/common/record/recordset.py,sha256=sSofrBycZSqiHR4TzfI4_QoIIN-5B1LnMG0C9CiByAo,8312
135
+ flwr/common/record/recordset.py,sha256=qqIFdRZ0ivQhUhztpdxNIvCRDZQXY_zX0kKDEU9mhfM,8319
136
136
  flwr/common/record/typeddict.py,sha256=q5hL2xkXymuiCprHWb69mUmLpWQk_XXQq0hGQ69YPaw,3599
137
137
  flwr/common/recordset_compat.py,sha256=ViSwA26h6Q55ZmV1LLjSJpcKiipV-p_JpCj4wxdE-Ow,14230
138
138
  flwr/common/retry_invoker.py,sha256=UIDKsn0AitS3fOr43WTqZAdD-TaHkBeTj1QxD7SGba0,14481
139
139
  flwr/common/secure_aggregation/__init__.py,sha256=erPnTWdOfMH0K0HQTmj5foDJ6t3iYcExy2aACy8iZNQ,731
140
140
  flwr/common/secure_aggregation/crypto/__init__.py,sha256=nlHesCWy8xxE5s6qHWnauCtyClcMQ2K0CEXAHakY5n0,738
141
141
  flwr/common/secure_aggregation/crypto/shamir.py,sha256=wCSfEfeaPgJ9Om580-YPUF2ljiyRhq33TRC4HtwxYl8,2779
142
- flwr/common/secure_aggregation/crypto/symmetric_encryption.py,sha256=wTDbOaMGZwT0nR4cAPZ0XrGulb8sdtF-Li_NcJ-c464,4166
142
+ flwr/common/secure_aggregation/crypto/symmetric_encryption.py,sha256=J_pRkxbogc7e1fxRZStZFBdzzG5jeUycshJPpvyCt6g,5333
143
143
  flwr/common/secure_aggregation/ndarrays_arithmetic.py,sha256=zvVAIrIyI6OSzGhpCi8NNaTvPXmoMYQIPJT-NkBg8RU,3013
144
144
  flwr/common/secure_aggregation/quantization.py,sha256=mC4uLf05zeONo8Ke-BY0Tj8UCMOS7VD93zHCzuv3MHU,2304
145
145
  flwr/common/secure_aggregation/secaggplus_constants.py,sha256=9MF-oQh62uD7rt9VeNB-rHf2gBLd5GL3S9OejCxmILY,2183
146
146
  flwr/common/secure_aggregation/secaggplus_utils.py,sha256=OgYd68YBRaHQYLc-YdExj9CSpwL58bVTaPrdHoAj2AE,3214
147
147
  flwr/common/serde.py,sha256=K9ExsqcTPETESkt2HMaNtIQAIAfwmuwtJFlG-59I7Sw,31046
148
- flwr/common/telemetry.py,sha256=CHIwFFQ13sWFavmEvkvA43XR1sbh1S3nWvD5TuCO2eI,8774
148
+ flwr/common/telemetry.py,sha256=APKVubU_zJNrE-M_rip6S6Fsu41DxY3tAjFWNOgTmC0,9086
149
149
  flwr/common/typing.py,sha256=eTlGl56rdus583r11xHY_ejG-3b3rknqF735UY5zMK8,6025
150
150
  flwr/common/version.py,sha256=aNSxLL49RKeLz8sPcZrsTEWtrAeQ0uxu6tjmfba4O60,1325
151
151
  flwr/proto/__init__.py,sha256=hbY7JYakwZwCkYgCNlmHdc8rtvfoJbAZLalMdc--CGc,683
@@ -211,7 +211,7 @@ flwr/proto/transport_pb2_grpc.py,sha256=vLN3EHtx2aEEMCO4f1Upu-l27BPzd3-5pV-u8wPc
211
211
  flwr/proto/transport_pb2_grpc.pyi,sha256=AGXf8RiIiW2J5IKMlm_3qT3AzcDa4F3P5IqUjve_esA,766
212
212
  flwr/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
213
213
  flwr/server/__init__.py,sha256=cEg1oecBu4cKB69iJCqWEylC8b5XW47bl7rQiJsdTvM,1528
214
- flwr/server/app.py,sha256=t2N5Q2CEOptaCBxmos397Re9UDPDvNvgnXxNy7xqj-g,30944
214
+ flwr/server/app.py,sha256=qn5gdsDqvJ7o4ZiWpbNBHtYKSZiUJ7SiGfdkUEczTd4,31010
215
215
  flwr/server/client_manager.py,sha256=7Ese0tgrH-i-ms363feYZJKwB8gWnXSmg_hYF2Bju4U,6227
216
216
  flwr/server/client_proxy.py,sha256=4G-oTwhb45sfWLx2uZdcXD98IZwdTS6F88xe3akCdUg,2399
217
217
  flwr/server/compat/__init__.py,sha256=VxnJtJyOjNFQXMNi9hIuzNlZM5n0Hj1p3aq_Pm2udw4,892
@@ -225,12 +225,12 @@ flwr/server/driver/driver.py,sha256=u_fMfqLYTroTafGCNwKPHI4lttRL-Z5CqeT3_FHSq-Q,
225
225
  flwr/server/driver/grpc_driver.py,sha256=9Vns8XRSc3WmQn8KejJtJftgsg3UzsEwqPC8ekTGSHY,9636
226
226
  flwr/server/driver/inmemory_driver.py,sha256=fCDhbP3OGmqWrUPQlagsMFGbEwFT0pn9OqhxeHr65zg,6614
227
227
  flwr/server/history.py,sha256=qSb5_pPTrwofpSYGsZWzMPkl_4uJ4mJFWesxXDrEvDU,5026
228
- flwr/server/run_serverapp.py,sha256=oDfHaHyVT5BRcckFFQKg8AVPCWR1ek7OhNceTC8qq9g,2493
228
+ flwr/server/run_serverapp.py,sha256=vIPhvJx0i5sEZO4IKM6ruCXmx4ncat76rh0B4KhdhhM,2446
229
229
  flwr/server/server.py,sha256=1ZsFEptmAV-L2vP2etNC9Ed5CLSxpuKzUFkAPQ4l5Xc,17893
230
230
  flwr/server/server_app.py,sha256=RsgS6PRS5Z74cMUAHzsm8r3LWddwn00MjRs6rlacHt8,6297
231
231
  flwr/server/server_config.py,sha256=CZaHVAsMvGLjpWVcLPkiYxgJN4xfIyAiUrCI3fETKY4,1349
232
232
  flwr/server/serverapp/__init__.py,sha256=L0K-94UDdTyEZ8LDtYybGIIIv3HW6AhSVjXMUfYJQnQ,800
233
- flwr/server/serverapp/app.py,sha256=wAIN72ESE7yY6W7qShCfnVF-DVgeGmfpIxW1JZUFWDc,7911
233
+ flwr/server/serverapp/app.py,sha256=eh15kToGVRdIFXHyVKa58tWN5Hh3EIXHcYEbcIqqNb0,8467
234
234
  flwr/server/serverapp_components.py,sha256=-IV_CitOfrJclJj2jNdbN1Q65PyFmtKtrTIg1hc6WQw,2118
235
235
  flwr/server/strategy/__init__.py,sha256=tQer2SwjDnvgFFuJMZM-S01Z615N5XK6MaCvpm4BMU0,2836
236
236
  flwr/server/strategy/aggregate.py,sha256=PDvekufza13s9AsVmz9WASunaBs3yCtl8JVliFx9j6Q,13978
@@ -259,7 +259,7 @@ flwr/server/strategy/strategy.py,sha256=cXapkD5uDrt5C-RbmWDn9FLoap3Q41i7GKvbmfbC
259
259
  flwr/server/superlink/__init__.py,sha256=8tHYCfodUlRD8PCP9fHgvu8cz5N31A2QoRVL0jDJ15E,707
260
260
  flwr/server/superlink/driver/__init__.py,sha256=5soEK5QSvxNjmJQ-CGTWROc4alSAeU0e9Ad9RDhsd3E,717
261
261
  flwr/server/superlink/driver/serverappio_grpc.py,sha256=62371xIRzp3k-eQTaSpb9c4TiSfueSuI7Iw5X3IafOY,2186
262
- flwr/server/superlink/driver/serverappio_servicer.py,sha256=EjqseReChpd0b4ZPEVPbWiWlVMsqK-WhIbH7jNHi7IM,11880
262
+ flwr/server/superlink/driver/serverappio_servicer.py,sha256=mgyV0XTONO7Vqb7sGOLu6AkCXWpBSeJ2s7ksadK1vE4,12197
263
263
  flwr/server/superlink/ffs/__init__.py,sha256=FAY-zShcfPmOxosok2QyT6hTNMNctG8cH9s_nIl8jkI,840
264
264
  flwr/server/superlink/ffs/disk_ffs.py,sha256=n_Ah0sQwXGVQ9wj5965nLjdkQQbpoHCljjXKFnwftsU,3297
265
265
  flwr/server/superlink/ffs/ffs.py,sha256=qLI1UfosJugu2BKOJWqHIhafTm-YiuKqGf3OGWPH0NM,2395
@@ -283,16 +283,16 @@ flwr/server/superlink/fleet/vce/__init__.py,sha256=TZJsKTpYO_djv2EXx9Ji62I8TA0Ji
283
283
  flwr/server/superlink/fleet/vce/backend/__init__.py,sha256=cGgal5qpd0_MwEdIqjJbHHSIgGa6GSPoI5_byUwtG_k,1437
284
284
  flwr/server/superlink/fleet/vce/backend/backend.py,sha256=LBAQxnbfPAphVOVIvYMj0QIvVP5O-RQxKQlUGNUj974,2194
285
285
  flwr/server/superlink/fleet/vce/backend/raybackend.py,sha256=jsUkFEVQTnrucK1jNQ_cUM8YwL7W4MQNA1GAf8ibRdg,7156
286
- flwr/server/superlink/fleet/vce/vce_api.py,sha256=VL6e_Jwf4uxA-X1EelxJZMv6Eji-_p2J9D0MdHG10a4,13029
286
+ flwr/server/superlink/fleet/vce/vce_api.py,sha256=WTnUILr1OHS8LfjXQUA3FyWJYdJgdqpFAybyJUD-1Xo,13025
287
287
  flwr/server/superlink/linkstate/__init__.py,sha256=v-2JyJlCB3qyhMNwMjmcNVOq4rkooqFU0LHH8Zo1jls,1064
288
- flwr/server/superlink/linkstate/in_memory_linkstate.py,sha256=haJiQ0TkinyVH4vOG-EUuEhhI78YESgjKYU6qVgXics,21638
289
- flwr/server/superlink/linkstate/linkstate.py,sha256=sbI7JLAZNMtVH1ZRjRjWDrws4mL0fjvrywxAKgCw9Mw,12936
288
+ flwr/server/superlink/linkstate/in_memory_linkstate.py,sha256=SR6a0wb-xFVQmPEsNseT91jmBeN0Lh1m_lZ6nY6aNS0,21984
289
+ flwr/server/superlink/linkstate/linkstate.py,sha256=ayQY5eb-2InSldQUnVcx5ABjPU4QhQRV2lEVPVM_818,13114
290
290
  flwr/server/superlink/linkstate/linkstate_factory.py,sha256=ISSMjDlwuN7swxjOeYlTNpI_kuZ8PGkMcJnf1dbhUSE,2069
291
- flwr/server/superlink/linkstate/sqlite_linkstate.py,sha256=9xmHV15hAicEtViCv4X-lHQosaCUwT6-NPd2UnY0zhA,42662
291
+ flwr/server/superlink/linkstate/sqlite_linkstate.py,sha256=svP5Vj6Jaq1iazd6q0wWQU0lJslfIJT0XBw8mA1SABs,42879
292
292
  flwr/server/superlink/linkstate/utils.py,sha256=d5uqqIOCKfd54X8CFNfUr3AWqPLpgmzsC_RagRwFugM,13321
293
293
  flwr/server/superlink/simulation/__init__.py,sha256=mg-oapC9dkzEfjXPQFior5lpWj4g9kwbLovptyYM_g0,718
294
294
  flwr/server/superlink/simulation/simulationio_grpc.py,sha256=5wflYW_TS0mjmPG6OYuHMJwXD2_cYmUNhFkdOU0jMWQ,2237
295
- flwr/server/superlink/simulation/simulationio_servicer.py,sha256=UqOyc76IQ5iDELkyuET1J9F20K0mYib30HyVLwX_2Mg,6546
295
+ flwr/server/superlink/simulation/simulationio_servicer.py,sha256=J_TmdqM-Bxgp-iPEI3tvCuBpykw1UX0FouMQalEYAF4,6907
296
296
  flwr/server/superlink/utils.py,sha256=KVb3K_g2vYfu9TnftcN0ewmev133WZcjuEePMm8d7GE,2137
297
297
  flwr/server/typing.py,sha256=5kaRLZuxTEse9A0g7aVna2VhYxU3wTq1f3d3mtw7kXs,1019
298
298
  flwr/server/utils/__init__.py,sha256=pltsPHJoXmUIr3utjwwYxu7_ZAGy5u4MVHzv9iA5Un8,908
@@ -305,13 +305,13 @@ flwr/server/workflow/secure_aggregation/__init__.py,sha256=3XlgDOjD_hcukTGl6Bc1B
305
305
  flwr/server/workflow/secure_aggregation/secagg_workflow.py,sha256=l2IdMdJjs1bgHs5vQgLSOVzar7v2oxUn46oCrnVE1rM,5839
306
306
  flwr/server/workflow/secure_aggregation/secaggplus_workflow.py,sha256=rfn2etO1nb7u-1oRl-H9q3enJZz3shMINZaBB7rPsC4,29671
307
307
  flwr/simulation/__init__.py,sha256=5UcDVJNjFoSwWqHbGM1hKfTTUUNdwAtuoNvNrfvdkUY,1556
308
- flwr/simulation/app.py,sha256=qalNoJxT17bbU-kVQNGTPSFu6C7W9F1oZl4i4nzCJx0,9380
308
+ flwr/simulation/app.py,sha256=cQgIJJujFUpBCcydxgakNygibf3Iww6OAWRo7Sq6y8w,9754
309
309
  flwr/simulation/legacy_app.py,sha256=ySggtKEtXe8L77n8qyGXDA7UPv840MXh-QoalzoGiLU,15780
310
310
  flwr/simulation/ray_transport/__init__.py,sha256=wzcEEwUUlulnXsg6raCA1nGpP3LlAQDtJ8zNkCXcVbA,734
311
311
  flwr/simulation/ray_transport/ray_actor.py,sha256=k11yoAPQzFGQU-KnCCP0ZrfPPdUPXXrBe-1DKM5VdW4,18997
312
312
  flwr/simulation/ray_transport/ray_client_proxy.py,sha256=2vjOKoom3B74C6XU-jC3N6DwYmsLdB-lmkHZ_Xrv96o,7367
313
313
  flwr/simulation/ray_transport/utils.py,sha256=wtbQhKQ4jGoiQDLJNQP17m1DSfL22ERhDBGuoeUFaAQ,2393
314
- flwr/simulation/run_simulation.py,sha256=GY1TIg5jnEoiW3Ak06swYo4jIho1iZposKbq_Bq-bp4,19478
314
+ flwr/simulation/run_simulation.py,sha256=KFpdL_RxE8NHZ68ZdghmFS6rccmWkO_iQ-kLLE1WUn8,20336
315
315
  flwr/simulation/simulationio_connection.py,sha256=8aAh6MKQkQPMSnWEqA5vua_QzZtoMxG-_-AB23RPhS4,3412
316
316
  flwr/superexec/__init__.py,sha256=fcj366jh4RFby_vDwLroU4kepzqbnJgseZD_jUr_Mko,715
317
317
  flwr/superexec/app.py,sha256=Z6kYHWd62YL0Q4YKyCAbt_BcefNfbKH6V-jCC-1NkZM,1842
@@ -321,8 +321,8 @@ flwr/superexec/exec_servicer.py,sha256=8tFwj1fDBF6PzwLhByTlxM-KNZc83bG1UdE92-8DS
321
321
  flwr/superexec/exec_user_auth_interceptor.py,sha256=K06OU-l4LnYhTDg071hGJuOaQWEJbZsYi5qxUmmtiG0,3704
322
322
  flwr/superexec/executor.py,sha256=_B55WW2TD1fBINpabSSDRenVHXYmvlfhv-k8hJKU4lQ,3115
323
323
  flwr/superexec/simulation.py,sha256=WQDon15oqpMopAZnwRZoTICYCfHqtkvFSqiTQ2hLD_g,4088
324
- flwr_nightly-1.14.0.dev20241216.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
325
- flwr_nightly-1.14.0.dev20241216.dist-info/METADATA,sha256=f4OsNAS5i9xKEW7m-ntvOAXHJA-EOUSsUXb7-rQg4YE,15799
326
- flwr_nightly-1.14.0.dev20241216.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
327
- flwr_nightly-1.14.0.dev20241216.dist-info/entry_points.txt,sha256=JlNxX3qhaV18_2yj5a3kJW1ESxm31cal9iS_N_pf1Rk,538
328
- flwr_nightly-1.14.0.dev20241216.dist-info/RECORD,,
324
+ flwr_nightly-1.15.0.dev20250107.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
325
+ flwr_nightly-1.15.0.dev20250107.dist-info/METADATA,sha256=WViuONypdpsZ9HD8sY37AA9v1KR4FA86-PspOAyHPCQ,15810
326
+ flwr_nightly-1.15.0.dev20250107.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
327
+ flwr_nightly-1.15.0.dev20250107.dist-info/entry_points.txt,sha256=JlNxX3qhaV18_2yj5a3kJW1ESxm31cal9iS_N_pf1Rk,538
328
+ flwr_nightly-1.15.0.dev20250107.dist-info/RECORD,,