flwr-nightly 1.12.0.dev20241007__py3-none-any.whl → 1.12.0.dev20241010__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.

Potentially problematic release.


This version of flwr-nightly might be problematic. Click here for more details.

Files changed (49) hide show
  1. flwr/cli/build.py +60 -29
  2. flwr/cli/config_utils.py +10 -0
  3. flwr/cli/install.py +60 -20
  4. flwr/cli/new/new.py +2 -0
  5. flwr/cli/new/templates/app/code/client.jax.py.tpl +11 -17
  6. flwr/cli/new/templates/app/code/client.mlx.py.tpl +16 -36
  7. flwr/cli/new/templates/app/code/client.numpy.py.tpl +4 -5
  8. flwr/cli/new/templates/app/code/client.pytorch.py.tpl +8 -11
  9. flwr/cli/new/templates/app/code/client.sklearn.py.tpl +14 -48
  10. flwr/cli/new/templates/app/code/server.jax.py.tpl +9 -3
  11. flwr/cli/new/templates/app/code/server.mlx.py.tpl +13 -2
  12. flwr/cli/new/templates/app/code/server.numpy.py.tpl +7 -2
  13. flwr/cli/new/templates/app/code/server.pytorch.py.tpl +1 -1
  14. flwr/cli/new/templates/app/code/server.sklearn.py.tpl +13 -1
  15. flwr/cli/new/templates/app/code/task.jax.py.tpl +2 -2
  16. flwr/cli/new/templates/app/code/task.mlx.py.tpl +1 -1
  17. flwr/cli/new/templates/app/code/task.numpy.py.tpl +7 -0
  18. flwr/cli/new/templates/app/code/task.pytorch.py.tpl +3 -3
  19. flwr/cli/new/templates/app/code/task.sklearn.py.tpl +67 -0
  20. flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +1 -1
  21. flwr/cli/new/templates/app/pyproject.jax.toml.tpl +3 -2
  22. flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +1 -0
  23. flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +2 -0
  24. flwr/cli/run/run.py +5 -5
  25. flwr/client/app.py +13 -3
  26. flwr/client/clientapp/app.py +5 -2
  27. flwr/client/clientapp/utils.py +11 -5
  28. flwr/client/grpc_rere_client/connection.py +3 -0
  29. flwr/common/config.py +18 -5
  30. flwr/common/constant.py +3 -0
  31. flwr/common/message.py +5 -0
  32. flwr/common/recordset_compat.py +10 -0
  33. flwr/common/retry_invoker.py +15 -0
  34. flwr/server/client_manager.py +2 -0
  35. flwr/server/compat/driver_client_proxy.py +15 -29
  36. flwr/server/driver/inmemory_driver.py +6 -2
  37. flwr/server/run_serverapp.py +11 -13
  38. flwr/server/superlink/driver/driver_servicer.py +1 -1
  39. flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +3 -1
  40. flwr/server/superlink/fleet/vce/vce_api.py +1 -1
  41. flwr/server/superlink/state/in_memory_state.py +26 -8
  42. flwr/server/superlink/state/sqlite_state.py +46 -11
  43. flwr/server/superlink/state/state.py +1 -7
  44. flwr/server/superlink/state/utils.py +0 -10
  45. {flwr_nightly-1.12.0.dev20241007.dist-info → flwr_nightly-1.12.0.dev20241010.dist-info}/METADATA +1 -1
  46. {flwr_nightly-1.12.0.dev20241007.dist-info → flwr_nightly-1.12.0.dev20241010.dist-info}/RECORD +49 -47
  47. {flwr_nightly-1.12.0.dev20241007.dist-info → flwr_nightly-1.12.0.dev20241010.dist-info}/LICENSE +0 -0
  48. {flwr_nightly-1.12.0.dev20241007.dist-info → flwr_nightly-1.12.0.dev20241010.dist-info}/WHEEL +0 -0
  49. {flwr_nightly-1.12.0.dev20241007.dist-info → flwr_nightly-1.12.0.dev20241010.dist-info}/entry_points.txt +0 -0
@@ -39,16 +39,20 @@ class InMemoryDriver(Driver):
39
39
  The identifier of the run.
40
40
  state_factory : StateFactory
41
41
  A StateFactory embedding a state that this driver can interface with.
42
+ pull_interval : float (default=0.1)
43
+ Sleep duration between calls to `pull_messages`.
42
44
  """
43
45
 
44
46
  def __init__(
45
47
  self,
46
48
  run_id: int,
47
49
  state_factory: StateFactory,
50
+ pull_interval: float = 0.1,
48
51
  ) -> None:
49
52
  self._run_id = run_id
50
53
  self._run: Optional[Run] = None
51
54
  self.state = state_factory.state()
55
+ self.pull_interval = pull_interval
52
56
  self.node = Node(node_id=0, anonymous=True)
53
57
 
54
58
  def _check_message(self, message: Message) -> None:
@@ -146,7 +150,7 @@ class InMemoryDriver(Driver):
146
150
  """
147
151
  msg_ids = {UUID(msg_id) for msg_id in message_ids}
148
152
  # Pull TaskRes
149
- task_res_list = self.state.get_task_res(task_ids=msg_ids, limit=len(msg_ids))
153
+ task_res_list = self.state.get_task_res(task_ids=msg_ids)
150
154
  # Delete tasks in state
151
155
  self.state.delete_tasks(msg_ids)
152
156
  # Convert TaskRes to Message
@@ -180,5 +184,5 @@ class InMemoryDriver(Driver):
180
184
  if len(msg_ids) == 0:
181
185
  break
182
186
  # Sleep
183
- time.sleep(3)
187
+ time.sleep(self.pull_interval)
184
188
  return ret
@@ -181,19 +181,17 @@ def run_server_app() -> None:
181
181
  )
182
182
  flwr_dir = get_flwr_dir(args.flwr_dir)
183
183
  run_ = driver.run
184
- if run_.fab_hash:
185
- fab_req = GetFabRequest(hash_str=run_.fab_hash)
186
- # pylint: disable-next=W0212
187
- fab_res: GetFabResponse = driver._stub.GetFab(fab_req)
188
- if fab_res.fab.hash_str != run_.fab_hash:
189
- raise ValueError("FAB hashes don't match.")
190
-
191
- install_from_fab(fab_res.fab.content, flwr_dir, True)
192
- fab_id, fab_version = get_fab_metadata(fab_res.fab.content)
193
- else:
194
- fab_id, fab_version = run_.fab_id, run_.fab_version
195
-
196
- app_path = str(get_project_dir(fab_id, fab_version, flwr_dir))
184
+ if not run_.fab_hash:
185
+ raise ValueError("FAB hash not provided.")
186
+ fab_req = GetFabRequest(hash_str=run_.fab_hash)
187
+ # pylint: disable-next=W0212
188
+ fab_res: GetFabResponse = driver._stub.GetFab(fab_req)
189
+ if fab_res.fab.hash_str != run_.fab_hash:
190
+ raise ValueError("FAB hashes don't match.")
191
+ install_from_fab(fab_res.fab.content, flwr_dir, True)
192
+ fab_id, fab_version = get_fab_metadata(fab_res.fab.content)
193
+
194
+ app_path = str(get_project_dir(fab_id, fab_version, run_.fab_hash, flwr_dir))
197
195
  config = get_project_config(app_path)
198
196
  else:
199
197
  # User provided `app_dir`, but not `--run-id`
@@ -155,7 +155,7 @@ class DriverServicer(driver_pb2_grpc.DriverServicer):
155
155
  context.add_callback(on_rpc_done)
156
156
 
157
157
  # Read from state
158
- task_res_list: list[TaskRes] = state.get_task_res(task_ids=task_ids, limit=None)
158
+ task_res_list: list[TaskRes] = state.get_task_res(task_ids=task_ids)
159
159
 
160
160
  context.set_code(grpc.StatusCode.OK)
161
161
  return PullTaskResResponse(task_res_list=task_res_list)
@@ -174,7 +174,7 @@ def generic_create_grpc_server( # pylint: disable=too-many-arguments
174
174
 
175
175
  Parameters
176
176
  ----------
177
- servicer_and_add_fn : Tuple
177
+ servicer_and_add_fn : tuple
178
178
  A tuple holding a servicer implementation and a matching
179
179
  add_Servicer_to_server function.
180
180
  server_address : str
@@ -214,6 +214,8 @@ def generic_create_grpc_server( # pylint: disable=too-many-arguments
214
214
  * CA certificate.
215
215
  * server certificate.
216
216
  * server private key.
217
+ interceptors : Optional[Sequence[grpc.ServerInterceptor]] (default: None)
218
+ A list of gRPC interceptors.
217
219
 
218
220
  Returns
219
221
  -------
@@ -346,7 +346,7 @@ def start_vce(
346
346
  app_path=app_dir,
347
347
  flwr_dir=flwr_dir,
348
348
  multi_app=False,
349
- )(run.fab_id, run.fab_version)
349
+ )(run.fab_id, run.fab_version, run.fab_hash)
350
350
 
351
351
  if client_app:
352
352
  app = client_app
@@ -116,6 +116,7 @@ class InMemoryState(State): # pylint: disable=R0902,R0904
116
116
  # Return TaskIns
117
117
  return task_ins_list
118
118
 
119
+ # pylint: disable=R0911
119
120
  def store_task_res(self, task_res: TaskRes) -> Optional[UUID]:
120
121
  """Store one TaskRes."""
121
122
  # Validate task
@@ -129,6 +130,17 @@ class InMemoryState(State): # pylint: disable=R0902,R0904
129
130
  task_ins_id = task_res.task.ancestry[0]
130
131
  task_ins = self.task_ins_store.get(UUID(task_ins_id))
131
132
 
133
+ # Ensure that the consumer_id of taskIns matches the producer_id of taskRes.
134
+ if (
135
+ task_ins
136
+ and task_res
137
+ and not (
138
+ task_ins.task.consumer.anonymous or task_res.task.producer.anonymous
139
+ )
140
+ and task_ins.task.consumer.node_id != task_res.task.producer.node_id
141
+ ):
142
+ return None
143
+
132
144
  if task_ins is None:
133
145
  log(ERROR, "TaskIns with task_id %s does not exist.", task_ins_id)
134
146
  return None
@@ -178,27 +190,33 @@ class InMemoryState(State): # pylint: disable=R0902,R0904
178
190
  # Return the new task_id
179
191
  return task_id
180
192
 
181
- def get_task_res(self, task_ids: set[UUID], limit: Optional[int]) -> list[TaskRes]:
193
+ def get_task_res(self, task_ids: set[UUID]) -> list[TaskRes]:
182
194
  """Get all TaskRes that have not been delivered yet."""
183
- if limit is not None and limit < 1:
184
- raise AssertionError("`limit` must be >= 1")
185
-
186
195
  with self.lock:
187
196
  # Find TaskRes that were not delivered yet
188
197
  task_res_list: list[TaskRes] = []
189
198
  replied_task_ids: set[UUID] = set()
190
199
  for _, task_res in self.task_res_store.items():
191
200
  reply_to = UUID(task_res.task.ancestry[0])
201
+
202
+ # Check if corresponding TaskIns exists and is not expired
203
+ task_ins = self.task_ins_store.get(reply_to)
204
+ if task_ins is None:
205
+ log(WARNING, "TaskIns with task_id %s does not exist.", reply_to)
206
+ task_ids.remove(reply_to)
207
+ continue
208
+
209
+ if task_ins.task.created_at + task_ins.task.ttl <= time.time():
210
+ log(WARNING, "TaskIns with task_id %s is expired.", reply_to)
211
+ task_ids.remove(reply_to)
212
+ continue
213
+
192
214
  if reply_to in task_ids and task_res.task.delivered_at == "":
193
215
  task_res_list.append(task_res)
194
216
  replied_task_ids.add(reply_to)
195
- if limit and len(task_res_list) == limit:
196
- break
197
217
 
198
218
  # Check if the node is offline
199
219
  for task_id in task_ids - replied_task_ids:
200
- if limit and len(task_res_list) == limit:
201
- break
202
220
  task_ins = self.task_ins_store.get(task_id)
203
221
  if task_ins is None:
204
222
  continue
@@ -14,6 +14,7 @@
14
14
  # ==============================================================================
15
15
  """SQLite based implemenation of server state."""
16
16
 
17
+ # pylint: disable=too-many-lines
17
18
 
18
19
  import json
19
20
  import re
@@ -150,6 +151,11 @@ class SqliteState(State): # pylint: disable=R0904
150
151
  ----------
151
152
  log_queries : bool
152
153
  Log each query which is executed.
154
+
155
+ Returns
156
+ -------
157
+ list[tuple[str]]
158
+ The list of all tables in the DB.
153
159
  """
154
160
  self.conn = sqlite3.connect(self.database_path)
155
161
  self.conn.execute("PRAGMA foreign_keys = ON;")
@@ -389,6 +395,16 @@ class SqliteState(State): # pylint: disable=R0904
389
395
  )
390
396
  return None
391
397
 
398
+ # Ensure that the consumer_id of taskIns matches the producer_id of taskRes.
399
+ if (
400
+ task_ins
401
+ and task_res
402
+ and not (task_ins["consumer_anonymous"] or task_res.task.producer.anonymous)
403
+ and convert_sint64_to_uint64(task_ins["consumer_node_id"])
404
+ != task_res.task.producer.node_id
405
+ ):
406
+ return None
407
+
392
408
  # Fail if the TaskRes TTL exceeds the
393
409
  # expiration time of the TaskIns it replies to.
394
410
  # Condition: TaskIns.created_at + TaskIns.ttl ≥
@@ -432,8 +448,8 @@ class SqliteState(State): # pylint: disable=R0904
432
448
 
433
449
  return task_id
434
450
 
435
- # pylint: disable-next=R0914
436
- def get_task_res(self, task_ids: set[UUID], limit: Optional[int]) -> list[TaskRes]:
451
+ # pylint: disable-next=R0912,R0915,R0914
452
+ def get_task_res(self, task_ids: set[UUID]) -> list[TaskRes]:
437
453
  """Get TaskRes for task_ids.
438
454
 
439
455
  Usually, the Driver API calls this method to get results for instructions it has
@@ -448,8 +464,34 @@ class SqliteState(State): # pylint: disable=R0904
448
464
  will only take effect if enough task_ids are in the set AND are currently
449
465
  available. If `limit` is set, it has to be greater than zero.
450
466
  """
451
- if limit is not None and limit < 1:
452
- raise AssertionError("`limit` must be >= 1")
467
+ # Check if corresponding TaskIns exists and is not expired
468
+ task_ids_placeholders = ",".join([f":id_{i}" for i in range(len(task_ids))])
469
+ query = f"""
470
+ SELECT *
471
+ FROM task_ins
472
+ WHERE task_id IN ({task_ids_placeholders})
473
+ AND (created_at + ttl) > CAST(strftime('%s', 'now') AS REAL)
474
+ """
475
+ query += ";"
476
+
477
+ task_ins_data = {}
478
+ for index, task_id in enumerate(task_ids):
479
+ task_ins_data[f"id_{index}"] = str(task_id)
480
+
481
+ task_ins_rows = self.query(query, task_ins_data)
482
+
483
+ if not task_ins_rows:
484
+ return []
485
+
486
+ for row in task_ins_rows:
487
+ # Convert values from sint64 to uint64
488
+ convert_sint64_values_in_dict_to_uint64(
489
+ row, ["run_id", "producer_node_id", "consumer_node_id"]
490
+ )
491
+ task_ins = dict_to_task_ins(row)
492
+ if task_ins.task.created_at + task_ins.task.ttl <= time.time():
493
+ log(WARNING, "TaskIns with task_id %s is expired.", task_ins.task_id)
494
+ task_ids.remove(UUID(task_ins.task_id))
453
495
 
454
496
  # Retrieve all anonymous Tasks
455
497
  if len(task_ids) == 0:
@@ -465,10 +507,6 @@ class SqliteState(State): # pylint: disable=R0904
465
507
 
466
508
  data: dict[str, Union[str, float, int]] = {}
467
509
 
468
- if limit is not None:
469
- query += " LIMIT :limit"
470
- data["limit"] = limit
471
-
472
510
  query += ";"
473
511
 
474
512
  for index, task_id in enumerate(task_ids):
@@ -543,9 +581,6 @@ class SqliteState(State): # pylint: disable=R0904
543
581
 
544
582
  # Make TaskRes containing node unavailabe error
545
583
  for row in task_ins_rows:
546
- if limit and len(result) == limit:
547
- break
548
-
549
584
  for row in rows:
550
585
  # Convert values from sint64 to uint64
551
586
  convert_sint64_values_in_dict_to_uint64(
@@ -98,7 +98,7 @@ class State(abc.ABC): # pylint: disable=R0904
98
98
  """
99
99
 
100
100
  @abc.abstractmethod
101
- def get_task_res(self, task_ids: set[UUID], limit: Optional[int]) -> list[TaskRes]:
101
+ def get_task_res(self, task_ids: set[UUID]) -> list[TaskRes]:
102
102
  """Get TaskRes for task_ids.
103
103
 
104
104
  Usually, the Driver API calls this method to get results for instructions it has
@@ -106,12 +106,6 @@ class State(abc.ABC): # pylint: disable=R0904
106
106
 
107
107
  Retrieves all TaskRes for the given `task_ids` and returns and empty list of
108
108
  none could be found.
109
-
110
- Constraints
111
- -----------
112
- If `limit` is not `None`, return, at most, `limit` number of TaskRes. The limit
113
- will only take effect if enough task_ids are in the set AND are currently
114
- available. If `limit` is set, it has to be greater zero.
115
109
  """
116
110
 
117
111
  @abc.abstractmethod
@@ -100,11 +100,6 @@ def convert_uint64_values_in_dict_to_sint64(
100
100
  A dictionary where the values are integers to be converted.
101
101
  keys : list[str]
102
102
  A list of keys in the dictionary whose values need to be converted.
103
-
104
- Returns
105
- -------
106
- None
107
- This function does not return a value. It modifies `data_dict` in place.
108
103
  """
109
104
  for key in keys:
110
105
  if key in data_dict:
@@ -122,11 +117,6 @@ def convert_sint64_values_in_dict_to_uint64(
122
117
  A dictionary where the values are integers to be converted.
123
118
  keys : list[str]
124
119
  A list of keys in the dictionary whose values need to be converted.
125
-
126
- Returns
127
- -------
128
- None
129
- This function does not return a value. It modifies `data_dict` in place.
130
120
  """
131
121
  for key in keys:
132
122
  if key in data_dict:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: flwr-nightly
3
- Version: 1.12.0.dev20241007
3
+ Version: 1.12.0.dev20241010
4
4
  Summary: Flower: A Friendly Federated Learning Framework
5
5
  Home-page: https://flower.ai
6
6
  License: Apache-2.0
@@ -1,13 +1,13 @@
1
1
  flwr/__init__.py,sha256=VmBWedrCxqmt4QvUHBLqyVEH6p7zaFMD_oCHerXHSVw,937
2
2
  flwr/cli/__init__.py,sha256=cZJVgozlkC6Ni2Hd_FAIrqefrkCGOV18fikToq-6iLw,720
3
3
  flwr/cli/app.py,sha256=_HDs7HS12Dp7NXIyVrkPs1SKJq3x-XvVZd6y1lvyud4,1255
4
- flwr/cli/build.py,sha256=H4xrQPDj7kvZ7Ys65yb-jE86RLEmvIE3pZ3mokZfJHg,5145
5
- flwr/cli/config_utils.py,sha256=uJmJAHNoqeSeAC3BAxxoBuYOR9eV3mJg8wrWZgbGp3E,7521
4
+ flwr/cli/build.py,sha256=WC7e6xPJJqRJvXmi8u0ECRvPThPYQcGOxLEgh9uG0gI,6365
5
+ flwr/cli/config_utils.py,sha256=U0tYiC4uwT68LzXFpiiu6XzzplEo-43BR_ON9t3aHOw,7956
6
6
  flwr/cli/example.py,sha256=1bGDYll3BXQY2kRqSN-oICqS5n1b9m0g0RvXTopXHl4,2215
7
- flwr/cli/install.py,sha256=t5tdeKOsTmG3nuInUoSKBVzUU1RnzA096yzYs013VhE,7065
7
+ flwr/cli/install.py,sha256=7Dx8zrn49mTktxGOToBhGx8hzsHOViDasMJ43ooKPXc,8646
8
8
  flwr/cli/log.py,sha256=uhtcLcFGkazirWnEmet3Wt3rt_q-a13kauQqPLaMaRY,8097
9
9
  flwr/cli/new/__init__.py,sha256=cQzK1WH4JP2awef1t2UQ2xjl1agVEz9rwutV18SWV1k,789
10
- flwr/cli/new/new.py,sha256=wpHBmHOq6X04CPwJDaEgu3H5_MsfoEYsYsv3E-EDhzM,9558
10
+ flwr/cli/new/new.py,sha256=uSiG7aXQzPDnikv2YcjQ86OOLqint0hNWCI0fSQD0jI,9634
11
11
  flwr/cli/new/templates/__init__.py,sha256=4luU8RL-CK8JJCstQ_ON809W9bNTkY1l9zSaPKBkgwY,725
12
12
  flwr/cli/new/templates/app/.gitignore.tpl,sha256=XixnHdyeMB2vwkGtGnwHqoWpH-9WChdyG0GXe57duhc,3078
13
13
  flwr/cli/new/templates/app/LICENSE.tpl,sha256=WNHhf_5RCaeuKWyq_K39vmp9F28LxKsB4SpomwSZ2L0,11357
@@ -20,11 +20,11 @@ flwr/cli/new/templates/app/code/__init__.py,sha256=EM6vfvgAILKPaPn7H1wMV1Wi01WyZ
20
20
  flwr/cli/new/templates/app/code/__init__.py.tpl,sha256=J0Gn74E7khpLyKJVNqOPu7ev93vkcu1PZugsbxtABMw,52
21
21
  flwr/cli/new/templates/app/code/client.baseline.py.tpl,sha256=1htktXX3jXX05r0vuG_afjS1sXGtuONW9EpiQ7vSBes,1901
22
22
  flwr/cli/new/templates/app/code/client.huggingface.py.tpl,sha256=ifD08KwjdoGieV26hFCgf3PQB6rMhj_NZLo5iUUndm8,1846
23
- flwr/cli/new/templates/app/code/client.jax.py.tpl,sha256=c2LDew2V8BUybZJiz1FeB3Kq4ey0Q2s0S5qNPUTNmI4,1490
24
- flwr/cli/new/templates/app/code/client.mlx.py.tpl,sha256=gxipt57ldc741qwRqSWtsLQH05JODKdGMTtvoXiBzDA,2906
25
- flwr/cli/new/templates/app/code/client.numpy.py.tpl,sha256=DMUXvQd2dr-wEn0ZrYJQhZ0OFUT4PKoHXtiD2haWnCI,570
26
- flwr/cli/new/templates/app/code/client.pytorch.py.tpl,sha256=WczaR5avJUhfw2Grn2KEC4tDJ4voIYG-2pAy-7i2cT8,1685
27
- flwr/cli/new/templates/app/code/client.sklearn.py.tpl,sha256=xW9cuKhybk5S8IeDZhbeb0DNegDIJGEYrzMKsxgc2GE,2978
23
+ flwr/cli/new/templates/app/code/client.jax.py.tpl,sha256=4EkcGGmbPAa6dgw8GYII-GfrGsu8VU6amRHpJvF0WuA,1319
24
+ flwr/cli/new/templates/app/code/client.mlx.py.tpl,sha256=gOxt_QUTfGFpofdNaxdwTSLZlkTWHPYGix2OGHC1hYE,2376
25
+ flwr/cli/new/templates/app/code/client.numpy.py.tpl,sha256=DKcnz5-KUf693Va056QTKVofFV3ozJZutK4rQyfvRXc,548
26
+ flwr/cli/new/templates/app/code/client.pytorch.py.tpl,sha256=fuxVmZpjHIueNy_aHWF81531vmi8DGu4CYjYDqmUwWo,1705
27
+ flwr/cli/new/templates/app/code/client.sklearn.py.tpl,sha256=MfhMN-hayGCc3cZ1XpN0A6f67GRveI_tGbq5kjOeP0Q,1871
28
28
  flwr/cli/new/templates/app/code/client.tensorflow.py.tpl,sha256=yBiiU7B9Kf70U52cPkNs_dUpYrrTwbUi2os-PAyheaM,1680
29
29
  flwr/cli/new/templates/app/code/dataset.baseline.py.tpl,sha256=jbd_exHAk2-Blu_kVutjPO6a_dkJQWb232zxSeXIZ1k,1453
30
30
  flwr/cli/new/templates/app/code/flwr_tune/__init__.py,sha256=JgNgBtKdm1jKM9625WxappCAVUGtYAmcjKSsXJ1u3ZQ,748
@@ -36,39 +36,41 @@ flwr/cli/new/templates/app/code/flwr_tune/strategy.py.tpl,sha256=BhiqRg9w1MGuU5h
36
36
  flwr/cli/new/templates/app/code/model.baseline.py.tpl,sha256=cSz6-IWsnMl7s04DW4URINiIppCIberrtE8NqK6Qz48,2571
37
37
  flwr/cli/new/templates/app/code/server.baseline.py.tpl,sha256=outx7lDXsWS8QXKWOGOiDno6eE8WL7LBD51ZkAuC3WU,1570
38
38
  flwr/cli/new/templates/app/code/server.huggingface.py.tpl,sha256=0PJmnZvR9_VPLSak1yVfkOx3dmqo6cynhY1l2s4AZrE,1158
39
- flwr/cli/new/templates/app/code/server.jax.py.tpl,sha256=pIdUH-LgWRAGWQYLlivMNf8XnDSNDe2cCuRjlxbRzys,529
40
- flwr/cli/new/templates/app/code/server.mlx.py.tpl,sha256=RqiZ0k468SOlm9dcPr-fvA8xcWv4zwDCbJfBwL7P9Us,529
41
- flwr/cli/new/templates/app/code/server.numpy.py.tpl,sha256=RqiZ0k468SOlm9dcPr-fvA8xcWv4zwDCbJfBwL7P9Us,529
42
- flwr/cli/new/templates/app/code/server.pytorch.py.tpl,sha256=DW5c8vzXCvFeIE8YIWBhoGnSdv8Ka_e5wd3F6B3xvp8,916
43
- flwr/cli/new/templates/app/code/server.sklearn.py.tpl,sha256=25Ae3kDqjDdBl8LwkDwye69nevd02Pk_e7F3SQKLdyk,624
39
+ flwr/cli/new/templates/app/code/server.jax.py.tpl,sha256=IHk57syZhvO4nWVHGxE9S8f5DTxRKIrTitDufF4RhMY,828
40
+ flwr/cli/new/templates/app/code/server.mlx.py.tpl,sha256=GAqalaI-U2uRdttNeRn75k1FzdEW3rmgT-ywuKkFdK4,988
41
+ flwr/cli/new/templates/app/code/server.numpy.py.tpl,sha256=xbQlLCKutnOqlbLQPZsaL9WM7vnebTceiU8a0HaUcZk,740
42
+ flwr/cli/new/templates/app/code/server.pytorch.py.tpl,sha256=gvBsGA_Jg9kAH8xTxjzTjMcvBtciuccOwQFbO7ey8tU,916
43
+ flwr/cli/new/templates/app/code/server.sklearn.py.tpl,sha256=JoDYjPU99aKTTfjKsCtKHzMICiOR9pi8JGVBsxFpWO4,1133
44
44
  flwr/cli/new/templates/app/code/server.tensorflow.py.tpl,sha256=xMhQ7AumowgLkgUilgjVK7IbpRhPjslhVJU-vID6NY8,856
45
45
  flwr/cli/new/templates/app/code/strategy.baseline.py.tpl,sha256=YkHAgppUeD2BnBoGfVB6dEvBfjuIPGsU1gw4CiUi3qA,40
46
46
  flwr/cli/new/templates/app/code/task.huggingface.py.tpl,sha256=ua6cAhJYPUCwML20DEucM0F4ZzzsEVQLYrRvhQ7CGRE,3347
47
- flwr/cli/new/templates/app/code/task.jax.py.tpl,sha256=F05eg149c9icRyVNdfcLyZvAXROQ7QhfifoGw_U1dsg,1530
48
- flwr/cli/new/templates/app/code/task.mlx.py.tpl,sha256=jWtCULLRr_9bCIJvoTLMx037-SDl_LF8udtA1UGoXDk,2946
49
- flwr/cli/new/templates/app/code/task.pytorch.py.tpl,sha256=NgbPix74X1t3ybaGjqdls30vF1i5oY3L7EQExhWhN74,3812
47
+ flwr/cli/new/templates/app/code/task.jax.py.tpl,sha256=jK03Y0HUvVFjUB-cYnvYB-WCRdr451aYklP1o6G5rx8,1530
48
+ flwr/cli/new/templates/app/code/task.mlx.py.tpl,sha256=YxH5z4s5kOh5_9DIY9pvzqURckLDfgdanTA68_iM_Wo,2946
49
+ flwr/cli/new/templates/app/code/task.numpy.py.tpl,sha256=MsjJK8DAvM3ex6JTfZuBVqoBKJfCCjIHMUOPkspiSQ0,124
50
+ flwr/cli/new/templates/app/code/task.pytorch.py.tpl,sha256=XlJqA4Ix_PloO_zJLhjiN5vDj16w3I4CPVGdmbe8asE,3800
51
+ flwr/cli/new/templates/app/code/task.sklearn.py.tpl,sha256=SeIIo0rr_6ffn4Qx2xELD18jYXCkcW__NWtYEDXCICM,1843
50
52
  flwr/cli/new/templates/app/code/task.tensorflow.py.tpl,sha256=SKXAZdgBnPpbAbJ90Rb7oQ5ilnopBx_j_JNFoUDeEAI,1732
51
53
  flwr/cli/new/templates/app/code/utils.baseline.py.tpl,sha256=YkHAgppUeD2BnBoGfVB6dEvBfjuIPGsU1gw4CiUi3qA,40
52
54
  flwr/cli/new/templates/app/pyproject.baseline.toml.tpl,sha256=4gi90W9_B1kj6rYkpvVJxhNX9Yctsv9OH6CzXP-dcE4,2666
53
- flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl,sha256=bYdDP0O8z741pvy1INnH4UBuP-KFvcyQt6Yo81n4frQ,1853
55
+ flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl,sha256=z02u1QgZ9qZ5_3Q1TKCIRgnnMufbPaKUfsacUuTou4I,1853
54
56
  flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl,sha256=CHJgkPNkJfzJhEbTe15uiV3AhOtIddQi-yofPZsCk3E,1143
55
- flwr/cli/new/templates/app/pyproject.jax.toml.tpl,sha256=Tq6jeGcoOKzMwWWYxMVnzMcipLURHLiW69iYlD1ywMg,659
56
- flwr/cli/new/templates/app/pyproject.mlx.toml.tpl,sha256=SHwYAA2qgIlOAU3Sb9BKSZcZ7O9biACg27MHexXUtDw,741
57
+ flwr/cli/new/templates/app/pyproject.jax.toml.tpl,sha256=v1DVriLky0ow9yc0NK91_6VkxkzpPsheIxbb2c0LcYQ,673
58
+ flwr/cli/new/templates/app/pyproject.mlx.toml.tpl,sha256=S4QDy7UXboJt60R3LE7z97_QU1idb0ob8A_N7O3cifo,765
57
59
  flwr/cli/new/templates/app/pyproject.numpy.toml.tpl,sha256=-FCi64ygMgQke3zApUt0XtkIBo3WtQoPAPhtp_FqkPE,612
58
60
  flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl,sha256=vIO1ArukTC76ogYLNmJIl25MOE_nEELj3IcTZZJjohU,710
59
- flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl,sha256=jk_5teoyOVM9QdBea8J-nk10S6TKw81QZiiKB54ATF0,654
61
+ flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl,sha256=fdlIN_sip1mrbOtqpeag60Kj56aYrA-0HEq9lYZLNnM,686
60
62
  flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl,sha256=bRIvPCPvTTI4Eo5b61Rmw8WdDw3sjcohciTXgULN5l8,702
61
63
  flwr/cli/run/__init__.py,sha256=oCd6HmQDx-sqver1gecgx-uMA38BLTSiiKpl7RGNceg,789
62
- flwr/cli/run/run.py,sha256=tLKeWpWJqEBxkOtDKEprL4SBKxH1vHGybQxlCLnXiSQ,8386
64
+ flwr/cli/run/run.py,sha256=NMCeDfImxta1VEeBqqkP05xsuBK6YWFTd7Qj_bIEA2Y,8394
63
65
  flwr/cli/utils.py,sha256=emMUdthvoHBTB0iGQp-oFBmA5wV46lw3y3FmfXQPCsc,4500
64
66
  flwr/client/__init__.py,sha256=DGDoO0AEAfz-0CUFmLdyUUweAS64-07AOnmDfWUefK4,1192
65
- flwr/client/app.py,sha256=cH0LAmpm6M8rfgc3lJFJ3pEwCVEgMuv-58WvOo6FEw0,31956
67
+ flwr/client/app.py,sha256=q-hExXwM3lru1TdYVE6HA3hKgwjhmbO_6Iq6oifVGpk,32712
66
68
  flwr/client/client.py,sha256=gy6WVlMUFAp8oevN4xpQPX30vPOIYGVqdbuFlTWkyG4,9080
67
69
  flwr/client/client_app.py,sha256=cTig-N00YzTucbo9zNi6I21J8PlbflU_8J_f5CI-Wpw,10390
68
70
  flwr/client/clientapp/__init__.py,sha256=kZqChGnTChQ1WGSUkIlW2S5bc0d0mzDubCAmZUGRpEY,800
69
- flwr/client/clientapp/app.py,sha256=-85ueqDZp7cFb-0Vq4fAME8JVbqN1akKnQIi5QGZf4c,7790
71
+ flwr/client/clientapp/app.py,sha256=ddPi3jPYO7-uGZBZ0O91NbP2x-HVOiqFGEkprdsMAUU,7882
70
72
  flwr/client/clientapp/clientappio_servicer.py,sha256=5L6bjw_j3Mnx9kRFwYwxDNABKurBO5q1jZOWE_X11wQ,8522
71
- flwr/client/clientapp/utils.py,sha256=2fYKY1LfZPalG5Cm5FbSuNMIDtouQg17GbrzPINyM_A,3990
73
+ flwr/client/clientapp/utils.py,sha256=Xg23Q7g7r9jrxXEbvJ9wXal_uAqYK3mi087u0QER6-I,4343
72
74
  flwr/client/dpfedavg_numpy_client.py,sha256=4KsEvzavDKyVDU1V0kMqffTwu1lNdUCYQN-i0DTYVN8,7404
73
75
  flwr/client/grpc_adapter_client/__init__.py,sha256=QyNWIbsq9DpyMk7oemiO1P3TBFfkfkctnJ1JoAkTl3s,742
74
76
  flwr/client/grpc_adapter_client/connection.py,sha256=50LlADsrvvo_kYoGRXOph3ICAmcaQcPDEYuBmA6l5PI,3971
@@ -76,7 +78,7 @@ flwr/client/grpc_client/__init__.py,sha256=LsnbqXiJhgQcB0XzAlUQgPx011Uf7Y7yabIC1
76
78
  flwr/client/grpc_client/connection.py,sha256=WX0cKlV_S19bYYp52z3PYRrtOdGb52ovvFFVWIz6Uyw,9382
77
79
  flwr/client/grpc_rere_client/__init__.py,sha256=MK-oSoV3kwUEQnIwl0GN4OpiHR7eLOrMA8ikunET130,752
78
80
  flwr/client/grpc_rere_client/client_interceptor.py,sha256=q08lIEeJLvvonNOiejNXvmySbPObteGnbDHhEKDmWzE,5380
79
- flwr/client/grpc_rere_client/connection.py,sha256=tppAfMTV1yLBNmgS0KuvqGUjaecpA7SWbPIITkfEHcY,10960
81
+ flwr/client/grpc_rere_client/connection.py,sha256=OgDQ9TFVrPV-X4UgduduxOICRvz834zd8zG7QrYvgM0,11152
80
82
  flwr/client/grpc_rere_client/grpc_adapter.py,sha256=sQo0I9T65t97LFGoW_PrmgaTbd18GFgi2DoAI5wQJ4k,5589
81
83
  flwr/client/heartbeat.py,sha256=cx37mJBH8LyoIN4Lks85wtqT1mnU5GulQnr4pGCvAq0,2404
82
84
  flwr/client/message_handler/__init__.py,sha256=QxxQuBNpFPTHx3KiUNvQSlqMKlEnbRR1kFfc1KVje08,719
@@ -100,8 +102,8 @@ flwr/client/supernode/app.py,sha256=it4jm9GATntwmRJNXfIIfsS8bTIRwba94B1uNy0I2TM,
100
102
  flwr/client/typing.py,sha256=dxoTBnTMfqXr5J7G3y-uNjqxYCddvxhu89spfj4Lm2U,1048
101
103
  flwr/common/__init__.py,sha256=TVaoFEJE158aui1TPZQiJCDZX4RNHRyI8I55VC80HhI,3901
102
104
  flwr/common/address.py,sha256=7kM2Rqjw86-c8aKwAvrXerWqznnVv4TFJ62aSAeTn10,3017
103
- flwr/common/config.py,sha256=QjsDEDf4xsx8StJV9I80dYWbBp7aBNrJmTlAeLpQpyw,7567
104
- flwr/common/constant.py,sha256=zPBbsggMBrQy52kf3teXaqfif-g9NLsrdgIBtD6VNgY,3650
105
+ flwr/common/config.py,sha256=hlj3Div9D53cIg7ur-d1xr6sAHM0shAR3aQyOsOxZuE,7779
106
+ flwr/common/constant.py,sha256=cUP0lErfb0s1ACnErm_T5kIks0xnEi2X5UNnzmXRSW4,3757
105
107
  flwr/common/context.py,sha256=5Bd9RCrhLkYZOVR7vr97OVhzVBHQkS1fUsYiIKTwpxU,2239
106
108
  flwr/common/date.py,sha256=OcQuwpb2HxcblTqYm6H223ufop5UZw5N_fzalbpOVzY,891
107
109
  flwr/common/differential_privacy.py,sha256=XwcJ3rWr8S8BZUocc76vLSJAXIf6OHnWkBV6-xlIRuw,6106
@@ -110,7 +112,7 @@ flwr/common/dp.py,sha256=vddkvyjV2FhRoN4VuU2LeAM1UBn7dQB8_W-Qdiveal8,1978
110
112
  flwr/common/exit_handlers.py,sha256=MracJaBeoCOC7TaXK9zCJQxhrMSx9ZtczK237qvhBpU,2806
111
113
  flwr/common/grpc.py,sha256=6Yi28JjAll19nxYJlOT9B03RN8dvJZP9zUoR3RSmxoY,2487
112
114
  flwr/common/logger.py,sha256=zAjaGrr_UWMkIdi1xG9tY764qJHIYM8LsPgMfBsyp64,8117
113
- flwr/common/message.py,sha256=QDq7WvzNJqynIGgGQ3ZdrWiZUQBZiNhxAX2HFTmeUcw,13671
115
+ flwr/common/message.py,sha256=OpVvfWDHBVwcW-P_xToxSyo77cPFoCn_1cFwV2bfr4A,13801
114
116
  flwr/common/object_ref.py,sha256=5lgWqYaJR28UdFc-iirWw9YqFXMfgkOOAdfJc1AVibE,8711
115
117
  flwr/common/parameter.py,sha256=-bFAUayToYDF50FZGrBC1hQYJCQDtB2bbr3ZuVLMtdE,2095
116
118
  flwr/common/pyproject.py,sha256=EI_ovbCHGmhYrdPx0RSDi5EkFZFof-8m1PA54c0ZTjc,1385
@@ -121,8 +123,8 @@ flwr/common/record/metricsrecord.py,sha256=UywkEPbifiu_IyPUFoDJCi8WEVLujlqZERUWA
121
123
  flwr/common/record/parametersrecord.py,sha256=IjnewX8Ea6JXLRWcPMVole2sNjwzRVjBVvzoey5gqtw,7747
122
124
  flwr/common/record/recordset.py,sha256=sSofrBycZSqiHR4TzfI4_QoIIN-5B1LnMG0C9CiByAo,8312
123
125
  flwr/common/record/typeddict.py,sha256=q5hL2xkXymuiCprHWb69mUmLpWQk_XXQq0hGQ69YPaw,3599
124
- flwr/common/recordset_compat.py,sha256=FHirA3xPGiM4veOpUSiMM0cmc0winIo9qZnk3E4JIz0,14010
125
- flwr/common/retry_invoker.py,sha256=YSbH3FHGkF5scDNSf0t2zHP0sycGrWKEaSWBj5qsMc8,11660
126
+ flwr/common/recordset_compat.py,sha256=ViSwA26h6Q55ZmV1LLjSJpcKiipV-p_JpCj4wxdE-Ow,14230
127
+ flwr/common/retry_invoker.py,sha256=u5dHcRMoyS8ABL3Fjk4P5P1lgRYYa1edfLGzWXxwyAc,11969
126
128
  flwr/common/secure_aggregation/__init__.py,sha256=erPnTWdOfMH0K0HQTmj5foDJ6t3iYcExy2aACy8iZNQ,731
127
129
  flwr/common/secure_aggregation/crypto/__init__.py,sha256=nlHesCWy8xxE5s6qHWnauCtyClcMQ2K0CEXAHakY5n0,738
128
130
  flwr/common/secure_aggregation/crypto/shamir.py,sha256=wCSfEfeaPgJ9Om580-YPUF2ljiyRhq33TRC4HtwxYl8,2779
@@ -199,20 +201,20 @@ flwr/proto/transport_pb2_grpc.pyi,sha256=AGXf8RiIiW2J5IKMlm_3qT3AzcDa4F3P5IqUjve
199
201
  flwr/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
200
202
  flwr/server/__init__.py,sha256=cEg1oecBu4cKB69iJCqWEylC8b5XW47bl7rQiJsdTvM,1528
201
203
  flwr/server/app.py,sha256=aPl20uTV7jKz5RbjLE2saYIMm5GUJ-wHI_J4AMhi1xg,24423
202
- flwr/server/client_manager.py,sha256=pvNk7-UxoeVsepr1ubaq5PrOMzWYjbQ4GP9SxVtUlzA,6115
204
+ flwr/server/client_manager.py,sha256=7Ese0tgrH-i-ms363feYZJKwB8gWnXSmg_hYF2Bju4U,6227
203
205
  flwr/server/client_proxy.py,sha256=4G-oTwhb45sfWLx2uZdcXD98IZwdTS6F88xe3akCdUg,2399
204
206
  flwr/server/compat/__init__.py,sha256=VxnJtJyOjNFQXMNi9hIuzNlZM5n0Hj1p3aq_Pm2udw4,892
205
207
  flwr/server/compat/app.py,sha256=5vkHHm_h-4cMthvWD1GJo1ZW3eihytjGgvsgfXUK9gA,3298
206
208
  flwr/server/compat/app_utils.py,sha256=i8MseZQculltLTsRIEe4XUnmAuu3LF3WzGjYi0c-cps,3425
207
- flwr/server/compat/driver_client_proxy.py,sha256=BxTDo7i89VAG2tuF4x7zogSVn2bXPMr0H2H0lERzW9c,5444
209
+ flwr/server/compat/driver_client_proxy.py,sha256=Af0bRUEVZNcCYRxt3DjpLPdvVYpTgz6LSlILtI_8DQY,5010
208
210
  flwr/server/compat/legacy_context.py,sha256=wBzBcfV6YO6IQGriM_FdJ5XZfiBBEEJdS_OdAiF47dY,1804
209
211
  flwr/server/criterion.py,sha256=ypbAexbztzGUxNen9RCHF91QeqiEQix4t4Ih3E-42MM,1061
210
212
  flwr/server/driver/__init__.py,sha256=bikRv6CjTwSvYh7tf10gziU5o2YotOWhhftz2tr3KDc,886
211
213
  flwr/server/driver/driver.py,sha256=rGLbOfLhBOn74mUHi_0CMbXqZLX8q_lXqEkcUXoL_wI,5238
212
214
  flwr/server/driver/grpc_driver.py,sha256=xd1mxRexeiIJrZw9l-urj2zEIncLT8KtNn0l8hIDYZs,9681
213
- flwr/server/driver/inmemory_driver.py,sha256=up5L2ux9l0pEUZO3hh8p5LufXntGL95IA4E3e7WsxqY,6465
215
+ flwr/server/driver/inmemory_driver.py,sha256=QsYY4-aUVgLl7gVly8EW4D-NZzsCB58MhYkYUrFTEIw,6638
214
216
  flwr/server/history.py,sha256=qSb5_pPTrwofpSYGsZWzMPkl_4uJ4mJFWesxXDrEvDU,5026
215
- flwr/server/run_serverapp.py,sha256=SaE9hoWLCAPnRXvdAzE4Oi3QaiC8NOTrHxrIGXjgYxU,10531
217
+ flwr/server/run_serverapp.py,sha256=5zoXSzLWKAuhK33cLYN-y5LzTgKqIyioNmzs7MIrDOA,10498
216
218
  flwr/server/server.py,sha256=1ZsFEptmAV-L2vP2etNC9Ed5CLSxpuKzUFkAPQ4l5Xc,17893
217
219
  flwr/server/server_app.py,sha256=1hul76ospG8L_KooK_ewn1sWPNTNYLTtZMeGNOBNruA,6267
218
220
  flwr/server/server_config.py,sha256=CZaHVAsMvGLjpWVcLPkiYxgJN4xfIyAiUrCI3fETKY4,1349
@@ -244,7 +246,7 @@ flwr/server/strategy/strategy.py,sha256=cXapkD5uDrt5C-RbmWDn9FLoap3Q41i7GKvbmfbC
244
246
  flwr/server/superlink/__init__.py,sha256=8tHYCfodUlRD8PCP9fHgvu8cz5N31A2QoRVL0jDJ15E,707
245
247
  flwr/server/superlink/driver/__init__.py,sha256=_JaRW-FdyikHc7souUrnk3mwTGViraEJCeUBY_M_ocs,712
246
248
  flwr/server/superlink/driver/driver_grpc.py,sha256=ej9T21zIquIJEZyWcvapQSQFckh4oFPamOe6P6DhB2s,2048
247
- flwr/server/superlink/driver/driver_servicer.py,sha256=x8L8rIO6r7kVdmWZFJp-xmTB0K_Tz1mh-7Akc6I_ZjY,6967
249
+ flwr/server/superlink/driver/driver_servicer.py,sha256=6c_0PP2-Pec9JVJTZZK_3yfrQ8dwAfzhn43mPzT2rYw,6955
248
250
  flwr/server/superlink/ffs/__init__.py,sha256=FAY-zShcfPmOxosok2QyT6hTNMNctG8cH9s_nIl8jkI,840
249
251
  flwr/server/superlink/ffs/disk_ffs.py,sha256=yCN6CCzegnJIOaHr5nIu49wZQa4g5BByiSKshz50RKU,3296
250
252
  flwr/server/superlink/ffs/ffs.py,sha256=qLI1UfosJugu2BKOJWqHIhafTm-YiuKqGf3OGWPH0NM,2395
@@ -256,7 +258,7 @@ flwr/server/superlink/fleet/grpc_bidi/__init__.py,sha256=dkSKQMuMTYh1qSnuN87cAPv
256
258
  flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py,sha256=xbvorZhCHBj0CvFWB7oUeHoY0o750hUkiS0DiTCGHDs,6020
257
259
  flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py,sha256=JkAH_nIZaqe_9kntrg26od_jaz5XdLFuvNMgGu8xk9Q,6485
258
260
  flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py,sha256=h3EhqgelegVC4EjOXH5birmAnMoCBJcP7jpHYCnHZPk,4887
259
- flwr/server/superlink/fleet/grpc_bidi/grpc_server.py,sha256=8VFp7K5ollkexR2UmXOrLtxo6H_B79eZkyM_Ro77tSU,12312
261
+ flwr/server/superlink/fleet/grpc_bidi/grpc_server.py,sha256=01eorJIL7LVTRkxAnJjZp3HLlJzWZzg2cVOGAWxF0Ag,12427
260
262
  flwr/server/superlink/fleet/grpc_rere/__init__.py,sha256=j2hyC342am-_Hgp1g80Y3fGDzfTI6n8QOOn2PyWf4eg,758
261
263
  flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py,sha256=bgoLQEhahVHjdlRDk_58zyKFeMOziiPUXSbYMhOxybY,4757
262
264
  flwr/server/superlink/fleet/grpc_rere/server_interceptor.py,sha256=pgSiH-qrTgDxu4M_jJu-8gvEQnxTdR-qIAawKgxjQ6M,8157
@@ -268,13 +270,13 @@ flwr/server/superlink/fleet/vce/__init__.py,sha256=36MHKiefnJeyjwMQzVUK4m06Ojon3
268
270
  flwr/server/superlink/fleet/vce/backend/__init__.py,sha256=Onq16E2M2Wha2K1zvhcquT1jOveQL2cgIrgqWvAPH9Y,1436
269
271
  flwr/server/superlink/fleet/vce/backend/backend.py,sha256=LBAQxnbfPAphVOVIvYMj0QIvVP5O-RQxKQlUGNUj974,2194
270
272
  flwr/server/superlink/fleet/vce/backend/raybackend.py,sha256=7kB3re3mR53b7E6L6DPSioTSKD3YGtS3uJsPD7Hn2Fw,7155
271
- flwr/server/superlink/fleet/vce/vce_api.py,sha256=cGPsjS_4SJHm8jszGjsHh8ZNk9nqWoIQwW_62yKKR1Y,12647
273
+ flwr/server/superlink/fleet/vce/vce_api.py,sha256=4f4xEcTKXkj6Wc9jg30hzJR1RX7ECxkfsCj0CKfC9xE,12661
272
274
  flwr/server/superlink/state/__init__.py,sha256=Gj2OTFLXvA-mAjBvwuKDM3rDrVaQPcIoybSa2uskMTE,1003
273
- flwr/server/superlink/state/in_memory_state.py,sha256=XL1cqXSnF87lpTprEtyl9aYRbDp2VuOiJdxvhTSvO18,14936
274
- flwr/server/superlink/state/sqlite_state.py,sha256=B1DOzHB9BpKLPmCSp4YyjcFspZpFpDsNJqCML6WQlhs,34259
275
- flwr/server/superlink/state/state.py,sha256=KpM894R8RE1N0b-s_Nlii6i0TDxj0DRkKa3Vf24Gt70,8127
275
+ flwr/server/superlink/state/in_memory_state.py,sha256=yuyk8R9veNxaSFFhWQg9odUBYPO-1EzcKiulqcXRc1M,15668
276
+ flwr/server/superlink/state/sqlite_state.py,sha256=HJwiD3SMp7yVqcyer-nJbdQ5uS06Cs5qjuN79dSTJWM,35614
277
+ flwr/server/superlink/state/state.py,sha256=c8ZJbZA3x_SMd87M041-QuTDDTEzac4kbrLY4YHmUY8,7829
276
278
  flwr/server/superlink/state/state_factory.py,sha256=Fo8pBQ1WWrVJK5TOEPZ_zgJE69_mfTGjTO6czh6571o,2021
277
- flwr/server/superlink/state/utils.py,sha256=OsF3OOoU4bU4PgLWkypX6EDoFs0L8RP_mHEBG-tVqGA,5227
279
+ flwr/server/superlink/state/utils.py,sha256=AC5u_A2toAW_ocCrng5ioxwoNhobocJAJMgjFvg-dJI,4997
278
280
  flwr/server/typing.py,sha256=5kaRLZuxTEse9A0g7aVna2VhYxU3wTq1f3d3mtw7kXs,1019
279
281
  flwr/server/utils/__init__.py,sha256=pltsPHJoXmUIr3utjwwYxu7_ZAGy5u4MVHzv9iA5Un8,908
280
282
  flwr/server/utils/tensorboard.py,sha256=gEBD8w_5uaIfp5aw5RYH66lYZpd_SfkObHQ7eDd9MUk,5466
@@ -299,8 +301,8 @@ flwr/superexec/exec_grpc.py,sha256=ZPq7EP55Vwj0kRcLVuTCokFqfIgBk-7YmDykZoMKi-c,1
299
301
  flwr/superexec/exec_servicer.py,sha256=TRpwPVl7eI0Y_xlCY6DmVpAo0yFU1gLwzyIeqFw9pyk,4746
300
302
  flwr/superexec/executor.py,sha256=-5J-ZLs-uArro3T2pCq0YQRC65cs18M888nufzdYE4E,2375
301
303
  flwr/superexec/simulation.py,sha256=J6pw-RqCSiUed8I_3MasZH4tl57ZmDebPAHNnbb0-vE,7420
302
- flwr_nightly-1.12.0.dev20241007.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
303
- flwr_nightly-1.12.0.dev20241007.dist-info/METADATA,sha256=OQTyN5pwKmWdnH0tf30yPuTKhwFUbsz1mQ6p_96tWkw,15618
304
- flwr_nightly-1.12.0.dev20241007.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
305
- flwr_nightly-1.12.0.dev20241007.dist-info/entry_points.txt,sha256=WUCbqhLEOzjx_lyATIM0-f0e8kOVaQjzwOvyOxHrMhs,434
306
- flwr_nightly-1.12.0.dev20241007.dist-info/RECORD,,
304
+ flwr_nightly-1.12.0.dev20241010.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
305
+ flwr_nightly-1.12.0.dev20241010.dist-info/METADATA,sha256=5IR5Je6HzFFGIR62wjqICS5QuSKMugIizNgcJJ3_8iE,15618
306
+ flwr_nightly-1.12.0.dev20241010.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
307
+ flwr_nightly-1.12.0.dev20241010.dist-info/entry_points.txt,sha256=WUCbqhLEOzjx_lyATIM0-f0e8kOVaQjzwOvyOxHrMhs,434
308
+ flwr_nightly-1.12.0.dev20241010.dist-info/RECORD,,