flwr-nightly 1.12.0.dev20240918__py3-none-any.whl → 1.12.0.dev20241007__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/app.py +2 -0
  2. flwr/cli/log.py +234 -0
  3. flwr/cli/new/new.py +1 -1
  4. flwr/cli/new/templates/app/README.flowertune.md.tpl +1 -1
  5. flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +1 -0
  6. flwr/cli/run/run.py +17 -1
  7. flwr/client/grpc_rere_client/client_interceptor.py +3 -0
  8. flwr/client/grpc_rere_client/connection.py +3 -3
  9. flwr/client/grpc_rere_client/grpc_adapter.py +14 -3
  10. flwr/client/rest_client/connection.py +3 -3
  11. flwr/client/supernode/app.py +1 -0
  12. flwr/common/constant.py +9 -3
  13. flwr/common/message.py +32 -15
  14. flwr/common/secure_aggregation/secaggplus_utils.py +4 -4
  15. flwr/common/serde.py +22 -7
  16. flwr/proto/control_pb2.py +27 -0
  17. flwr/proto/control_pb2.pyi +7 -0
  18. flwr/proto/control_pb2_grpc.py +135 -0
  19. flwr/proto/control_pb2_grpc.pyi +53 -0
  20. flwr/proto/driver_pb2.py +15 -24
  21. flwr/proto/driver_pb2.pyi +0 -52
  22. flwr/proto/driver_pb2_grpc.py +6 -6
  23. flwr/proto/driver_pb2_grpc.pyi +4 -4
  24. flwr/proto/fab_pb2.py +8 -7
  25. flwr/proto/fab_pb2.pyi +7 -1
  26. flwr/proto/fleet_pb2.py +10 -10
  27. flwr/proto/fleet_pb2.pyi +6 -1
  28. flwr/proto/recordset_pb2.py +35 -33
  29. flwr/proto/recordset_pb2.pyi +40 -14
  30. flwr/proto/run_pb2.py +33 -9
  31. flwr/proto/run_pb2.pyi +150 -1
  32. flwr/proto/transport_pb2.py +8 -8
  33. flwr/proto/transport_pb2.pyi +9 -6
  34. flwr/server/run_serverapp.py +2 -2
  35. flwr/server/strategy/aggregate.py +22 -8
  36. flwr/server/superlink/driver/driver_servicer.py +2 -2
  37. flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +17 -2
  38. flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +4 -0
  39. flwr/server/superlink/state/in_memory_state.py +47 -2
  40. flwr/server/superlink/state/sqlite_state.py +73 -8
  41. flwr/server/utils/validator.py +6 -0
  42. flwr/superexec/deployment.py +3 -1
  43. flwr/superexec/exec_servicer.py +68 -3
  44. flwr/superexec/executor.py +2 -1
  45. {flwr_nightly-1.12.0.dev20240918.dist-info → flwr_nightly-1.12.0.dev20241007.dist-info}/METADATA +4 -2
  46. {flwr_nightly-1.12.0.dev20240918.dist-info → flwr_nightly-1.12.0.dev20241007.dist-info}/RECORD +49 -44
  47. {flwr_nightly-1.12.0.dev20240918.dist-info → flwr_nightly-1.12.0.dev20241007.dist-info}/LICENSE +0 -0
  48. {flwr_nightly-1.12.0.dev20240918.dist-info → flwr_nightly-1.12.0.dev20241007.dist-info}/WHEEL +0 -0
  49. {flwr_nightly-1.12.0.dev20240918.dist-info → flwr_nightly-1.12.0.dev20241007.dist-info}/entry_points.txt +0 -0
@@ -17,12 +17,16 @@
17
17
 
18
18
  import threading
19
19
  import time
20
- from logging import ERROR
20
+ from logging import ERROR, WARNING
21
21
  from typing import Optional
22
22
  from uuid import UUID, uuid4
23
23
 
24
24
  from flwr.common import log, now
25
- from flwr.common.constant import NODE_ID_NUM_BYTES, RUN_ID_NUM_BYTES
25
+ from flwr.common.constant import (
26
+ MESSAGE_TTL_TOLERANCE,
27
+ NODE_ID_NUM_BYTES,
28
+ RUN_ID_NUM_BYTES,
29
+ )
26
30
  from flwr.common.typing import Run, UserConfig
27
31
  from flwr.proto.task_pb2 import TaskIns, TaskRes # pylint: disable=E0611
28
32
  from flwr.server.superlink.state.state import State
@@ -83,6 +87,7 @@ class InMemoryState(State): # pylint: disable=R0902,R0904
83
87
 
84
88
  # Find TaskIns for node_id that were not delivered yet
85
89
  task_ins_list: list[TaskIns] = []
90
+ current_time = time.time()
86
91
  with self.lock:
87
92
  for _, task_ins in self.task_ins_store.items():
88
93
  # pylint: disable=too-many-boolean-expressions
@@ -91,11 +96,13 @@ class InMemoryState(State): # pylint: disable=R0902,R0904
91
96
  and task_ins.task.consumer.anonymous is False
92
97
  and task_ins.task.consumer.node_id == node_id
93
98
  and task_ins.task.delivered_at == ""
99
+ and task_ins.task.created_at + task_ins.task.ttl > current_time
94
100
  ) or (
95
101
  node_id is None # Anonymous
96
102
  and task_ins.task.consumer.anonymous is True
97
103
  and task_ins.task.consumer.node_id == 0
98
104
  and task_ins.task.delivered_at == ""
105
+ and task_ins.task.created_at + task_ins.task.ttl > current_time
99
106
  ):
100
107
  task_ins_list.append(task_ins)
101
108
  if limit and len(task_ins_list) == limit:
@@ -117,6 +124,44 @@ class InMemoryState(State): # pylint: disable=R0902,R0904
117
124
  log(ERROR, errors)
118
125
  return None
119
126
 
127
+ with self.lock:
128
+ # Check if the TaskIns it is replying to exists and is valid
129
+ task_ins_id = task_res.task.ancestry[0]
130
+ task_ins = self.task_ins_store.get(UUID(task_ins_id))
131
+
132
+ if task_ins is None:
133
+ log(ERROR, "TaskIns with task_id %s does not exist.", task_ins_id)
134
+ return None
135
+
136
+ if task_ins.task.created_at + task_ins.task.ttl <= time.time():
137
+ log(
138
+ ERROR,
139
+ "Failed to store TaskRes: TaskIns with task_id %s has expired.",
140
+ task_ins_id,
141
+ )
142
+ return None
143
+
144
+ # Fail if the TaskRes TTL exceeds the
145
+ # expiration time of the TaskIns it replies to.
146
+ # Condition: TaskIns.created_at + TaskIns.ttl ≥
147
+ # TaskRes.created_at + TaskRes.ttl
148
+ # A small tolerance is introduced to account
149
+ # for floating-point precision issues.
150
+ max_allowed_ttl = (
151
+ task_ins.task.created_at + task_ins.task.ttl - task_res.task.created_at
152
+ )
153
+ if task_res.task.ttl and (
154
+ task_res.task.ttl - max_allowed_ttl > MESSAGE_TTL_TOLERANCE
155
+ ):
156
+ log(
157
+ WARNING,
158
+ "Received TaskRes with TTL %.2f "
159
+ "exceeding the allowed maximum TTL %.2f.",
160
+ task_res.task.ttl,
161
+ max_allowed_ttl,
162
+ )
163
+ return None
164
+
120
165
  # Validate run_id
121
166
  if task_res.run_id not in self.run_ids:
122
167
  log(ERROR, "`run_id` is invalid")
@@ -20,12 +20,16 @@ import re
20
20
  import sqlite3
21
21
  import time
22
22
  from collections.abc import Sequence
23
- from logging import DEBUG, ERROR
23
+ from logging import DEBUG, ERROR, WARNING
24
24
  from typing import Any, Optional, Union, cast
25
25
  from uuid import UUID, uuid4
26
26
 
27
27
  from flwr.common import log, now
28
- from flwr.common.constant import NODE_ID_NUM_BYTES, RUN_ID_NUM_BYTES
28
+ from flwr.common.constant import (
29
+ MESSAGE_TTL_TOLERANCE,
30
+ NODE_ID_NUM_BYTES,
31
+ RUN_ID_NUM_BYTES,
32
+ )
29
33
  from flwr.common.typing import Run, UserConfig
30
34
  from flwr.proto.node_pb2 import Node # pylint: disable=E0611
31
35
  from flwr.proto.recordset_pb2 import RecordSet # pylint: disable=E0611
@@ -295,6 +299,7 @@ class SqliteState(State): # pylint: disable=R0904
295
299
  WHERE consumer_anonymous == 1
296
300
  AND consumer_node_id == 0
297
301
  AND delivered_at = ""
302
+ AND (created_at + ttl) > CAST(strftime('%s', 'now') AS REAL)
298
303
  """
299
304
  else:
300
305
  # Convert the uint64 value to sint64 for SQLite
@@ -307,6 +312,7 @@ class SqliteState(State): # pylint: disable=R0904
307
312
  WHERE consumer_anonymous == 0
308
313
  AND consumer_node_id == :node_id
309
314
  AND delivered_at = ""
315
+ AND (created_at + ttl) > CAST(strftime('%s', 'now') AS REAL)
310
316
  """
311
317
 
312
318
  if limit is not None:
@@ -372,7 +378,39 @@ class SqliteState(State): # pylint: disable=R0904
372
378
  # Create task_id
373
379
  task_id = uuid4()
374
380
 
375
- # Store TaskIns
381
+ task_ins_id = task_res.task.ancestry[0]
382
+ task_ins = self.get_valid_task_ins(task_ins_id)
383
+ if task_ins is None:
384
+ log(
385
+ ERROR,
386
+ "Failed to store TaskRes: "
387
+ "TaskIns with task_id %s does not exist or has expired.",
388
+ task_ins_id,
389
+ )
390
+ return None
391
+
392
+ # Fail if the TaskRes TTL exceeds the
393
+ # expiration time of the TaskIns it replies to.
394
+ # Condition: TaskIns.created_at + TaskIns.ttl ≥
395
+ # TaskRes.created_at + TaskRes.ttl
396
+ # A small tolerance is introduced to account
397
+ # for floating-point precision issues.
398
+ max_allowed_ttl = (
399
+ task_ins["created_at"] + task_ins["ttl"] - task_res.task.created_at
400
+ )
401
+ if task_res.task.ttl and (
402
+ task_res.task.ttl - max_allowed_ttl > MESSAGE_TTL_TOLERANCE
403
+ ):
404
+ log(
405
+ WARNING,
406
+ "Received TaskRes with TTL %.2f "
407
+ "exceeding the allowed maximum TTL %.2f.",
408
+ task_res.task.ttl,
409
+ max_allowed_ttl,
410
+ )
411
+ return None
412
+
413
+ # Store TaskRes
376
414
  task_res.task_id = str(task_id)
377
415
  data = (task_res_to_dict(task_res),)
378
416
 
@@ -782,8 +820,9 @@ class SqliteState(State): # pylint: disable=R0904
782
820
  # Convert the uint64 value to sint64 for SQLite
783
821
  sint64_run_id = convert_uint64_to_sint64(run_id)
784
822
  query = "SELECT * FROM run WHERE run_id = ?;"
785
- try:
786
- row = self.query(query, (sint64_run_id,))[0]
823
+ rows = self.query(query, (sint64_run_id,))
824
+ if rows:
825
+ row = rows[0]
787
826
  return Run(
788
827
  run_id=convert_sint64_to_uint64(row["run_id"]),
789
828
  fab_id=row["fab_id"],
@@ -791,9 +830,8 @@ class SqliteState(State): # pylint: disable=R0904
791
830
  fab_hash=row["fab_hash"],
792
831
  override_config=json.loads(row["override_config"]),
793
832
  )
794
- except sqlite3.IntegrityError:
795
- log(ERROR, "`run_id` does not exist.")
796
- return None
833
+ log(ERROR, "`run_id` does not exist.")
834
+ return None
797
835
 
798
836
  def acknowledge_ping(self, node_id: int, ping_interval: float) -> bool:
799
837
  """Acknowledge a ping received from a node, serving as a heartbeat."""
@@ -810,6 +848,33 @@ class SqliteState(State): # pylint: disable=R0904
810
848
  log(ERROR, "`node_id` does not exist.")
811
849
  return False
812
850
 
851
+ def get_valid_task_ins(self, task_id: str) -> Optional[dict[str, Any]]:
852
+ """Check if the TaskIns exists and is valid (not expired).
853
+
854
+ Return TaskIns if valid.
855
+ """
856
+ query = """
857
+ SELECT *
858
+ FROM task_ins
859
+ WHERE task_id = :task_id
860
+ """
861
+ data = {"task_id": task_id}
862
+ rows = self.query(query, data)
863
+ if not rows:
864
+ # TaskIns does not exist
865
+ return None
866
+
867
+ task_ins = rows[0]
868
+ created_at = task_ins["created_at"]
869
+ ttl = task_ins["ttl"]
870
+ current_time = time.time()
871
+
872
+ # Check if TaskIns is expired
873
+ if ttl is not None and created_at + ttl <= current_time:
874
+ return None
875
+
876
+ return task_ins
877
+
813
878
 
814
879
  def dict_factory(
815
880
  cursor: sqlite3.Cursor,
@@ -15,6 +15,7 @@
15
15
  """Validators."""
16
16
 
17
17
 
18
+ import time
18
19
  from typing import Union
19
20
 
20
21
  from flwr.proto.task_pb2 import TaskIns, TaskRes # pylint: disable=E0611
@@ -47,6 +48,11 @@ def validate_task_ins_or_res(tasks_ins_res: Union[TaskIns, TaskRes]) -> list[str
47
48
  # unix timestamp of 27 March 2024 00h:00m:00s UTC
48
49
  validation_errors.append("`pushed_at` is not a recent timestamp")
49
50
 
51
+ # Verify TTL and created_at time
52
+ current_time = time.time()
53
+ if tasks_ins_res.task.created_at + tasks_ins_res.task.ttl <= current_time:
54
+ validation_errors.append("Task TTL has expired")
55
+
50
56
  # TaskIns specific
51
57
  if isinstance(tasks_ins_res, TaskIns):
52
58
  # Task producer
@@ -28,8 +28,8 @@ from flwr.common.grpc import create_channel
28
28
  from flwr.common.logger import log
29
29
  from flwr.common.serde import fab_to_proto, user_config_to_proto
30
30
  from flwr.common.typing import Fab, UserConfig
31
- from flwr.proto.driver_pb2 import CreateRunRequest # pylint: disable=E0611
32
31
  from flwr.proto.driver_pb2_grpc import DriverStub
32
+ from flwr.proto.run_pb2 import CreateRunRequest # pylint: disable=E0611
33
33
 
34
34
  from .executor import Executor, RunTracker
35
35
 
@@ -167,6 +167,8 @@ class DeploymentEngine(Executor):
167
167
  # Execute the command
168
168
  proc = subprocess.Popen( # pylint: disable=consider-using-with
169
169
  command,
170
+ stdout=subprocess.PIPE,
171
+ stderr=subprocess.PIPE,
170
172
  text=True,
171
173
  )
172
174
  log(INFO, "Started run %s", str(run_id))
@@ -15,6 +15,10 @@
15
15
  """SuperExec API servicer."""
16
16
 
17
17
 
18
+ import select
19
+ import sys
20
+ import threading
21
+ import time
18
22
  from collections.abc import Generator
19
23
  from logging import ERROR, INFO
20
24
  from typing import Any
@@ -33,6 +37,8 @@ from flwr.proto.exec_pb2 import ( # pylint: disable=E0611
33
37
 
34
38
  from .executor import Executor, RunTracker
35
39
 
40
+ SELECT_TIMEOUT = 1 # Timeout for selecting ready-to-read file descriptors (in seconds)
41
+
36
42
 
37
43
  class ExecServicer(exec_pb2_grpc.ExecServicer):
38
44
  """SuperExec API servicer."""
@@ -59,13 +65,72 @@ class ExecServicer(exec_pb2_grpc.ExecServicer):
59
65
 
60
66
  self.runs[run.run_id] = run
61
67
 
68
+ # Start a background thread to capture the log output
69
+ capture_thread = threading.Thread(
70
+ target=_capture_logs, args=(run,), daemon=True
71
+ )
72
+ capture_thread.start()
73
+
62
74
  return StartRunResponse(run_id=run.run_id)
63
75
 
64
- def StreamLogs(
76
+ def StreamLogs( # pylint: disable=C0103
65
77
  self, request: StreamLogsRequest, context: grpc.ServicerContext
66
78
  ) -> Generator[StreamLogsResponse, Any, None]:
67
79
  """Get logs."""
68
- logs = ["a", "b", "c"]
80
+ log(INFO, "ExecServicer.StreamLogs")
81
+
82
+ # Exit if `run_id` not found
83
+ if request.run_id not in self.runs:
84
+ context.abort(grpc.StatusCode.NOT_FOUND, "Run ID not found")
85
+
86
+ last_sent_index = 0
69
87
  while context.is_active():
70
- for i in range(len(logs)): # pylint: disable=C0200
88
+ # Yield n'th row of logs, if n'th row < len(logs)
89
+ logs = self.runs[request.run_id].logs
90
+ for i in range(last_sent_index, len(logs)):
71
91
  yield StreamLogsResponse(log_output=logs[i])
92
+ last_sent_index = len(logs)
93
+
94
+ # Wait for and continue to yield more log responses only if the
95
+ # run isn't completed yet. If the run is finished, the entire log
96
+ # is returned at this point and the server ends the stream.
97
+ if self.runs[request.run_id].proc.poll() is not None:
98
+ log(INFO, "All logs for run ID `%s` returned", request.run_id)
99
+ context.set_code(grpc.StatusCode.OK)
100
+ context.cancel()
101
+
102
+ time.sleep(1.0) # Sleep briefly to avoid busy waiting
103
+
104
+
105
+ def _capture_logs(
106
+ run: RunTracker,
107
+ ) -> None:
108
+ while True:
109
+ # Explicitly check if Popen.poll() is None. Required for `pytest`.
110
+ if run.proc.poll() is None:
111
+ # Select streams only when ready to read
112
+ ready_to_read, _, _ = select.select(
113
+ [run.proc.stdout, run.proc.stderr],
114
+ [],
115
+ [],
116
+ SELECT_TIMEOUT,
117
+ )
118
+ # Read from std* and append to RunTracker.logs
119
+ for stream in ready_to_read:
120
+ # Flush stdout to view output in real time
121
+ readline = stream.readline()
122
+ sys.stdout.write(readline)
123
+ sys.stdout.flush()
124
+ # Append to logs
125
+ line = readline.rstrip()
126
+ if line:
127
+ run.logs.append(f"{line}")
128
+
129
+ # Close std* to prevent blocking
130
+ elif run.proc.poll() is not None:
131
+ log(INFO, "Subprocess finished, exiting log capture")
132
+ if run.proc.stdout:
133
+ run.proc.stdout.close()
134
+ if run.proc.stderr:
135
+ run.proc.stderr.close()
136
+ break
@@ -15,7 +15,7 @@
15
15
  """Execute and monitor a Flower run."""
16
16
 
17
17
  from abc import ABC, abstractmethod
18
- from dataclasses import dataclass
18
+ from dataclasses import dataclass, field
19
19
  from subprocess import Popen
20
20
  from typing import Optional
21
21
 
@@ -28,6 +28,7 @@ class RunTracker:
28
28
 
29
29
  run_id: int
30
30
  proc: Popen # type: ignore
31
+ logs: list[str] = field(default_factory=list)
31
32
 
32
33
 
33
34
  class Executor(ABC):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: flwr-nightly
3
- Version: 1.12.0.dev20240918
3
+ Version: 1.12.0.dev20241007
4
4
  Summary: Flower: A Friendly Federated Learning Framework
5
5
  Home-page: https://flower.ai
6
6
  License: Apache-2.0
@@ -43,7 +43,7 @@ Requires-Dist: requests (>=2.31.0,<3.0.0) ; extra == "rest"
43
43
  Requires-Dist: starlette (>=0.31.0,<0.32.0) ; extra == "rest"
44
44
  Requires-Dist: tomli (>=2.0.1,<3.0.0)
45
45
  Requires-Dist: tomli-w (>=1.0.0,<2.0.0)
46
- Requires-Dist: typer[all] (>=0.9.0,<0.10.0)
46
+ Requires-Dist: typer (>=0.12.5,<0.13.0)
47
47
  Requires-Dist: uvicorn[standard] (>=0.23.0,<0.24.0) ; extra == "rest"
48
48
  Project-URL: Documentation, https://flower.ai
49
49
  Project-URL: Repository, https://github.com/adap/flower
@@ -69,6 +69,7 @@ Description-Content-Type: text/markdown
69
69
  [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](https://github.com/adap/flower/blob/main/CONTRIBUTING.md)
70
70
  ![Build](https://github.com/adap/flower/actions/workflows/framework.yml/badge.svg)
71
71
  [![Downloads](https://static.pepy.tech/badge/flwr)](https://pepy.tech/project/flwr)
72
+ [![Docker Hub](https://img.shields.io/badge/Docker%20Hub-flwr-blue)](https://hub.docker.com/u/flwr)
72
73
  [![Slack](https://img.shields.io/badge/Chat-Slack-red)](https://flower.ai/join-slack)
73
74
 
74
75
  Flower (`flwr`) is a framework for building federated learning systems. The
@@ -152,6 +153,7 @@ Flower Baselines is a collection of community-contributed projects that reproduc
152
153
  - [FedNova](https://github.com/adap/flower/tree/main/baselines/fednova)
153
154
  - [HeteroFL](https://github.com/adap/flower/tree/main/baselines/heterofl)
154
155
  - [FedAvgM](https://github.com/adap/flower/tree/main/baselines/fedavgm)
156
+ - [FedRep](https://github.com/adap/flower/tree/main/baselines/fedrep)
155
157
  - [FedStar](https://github.com/adap/flower/tree/main/baselines/fedstar)
156
158
  - [FedWav2vec2](https://github.com/adap/flower/tree/main/baselines/fedwav2vec2)
157
159
  - [FjORD](https://github.com/adap/flower/tree/main/baselines/fjord)
@@ -1,17 +1,18 @@
1
1
  flwr/__init__.py,sha256=VmBWedrCxqmt4QvUHBLqyVEH6p7zaFMD_oCHerXHSVw,937
2
2
  flwr/cli/__init__.py,sha256=cZJVgozlkC6Ni2Hd_FAIrqefrkCGOV18fikToq-6iLw,720
3
- flwr/cli/app.py,sha256=v66W3QJ226JUy9y51hRwftX53R3oEKl3oOl1Xx-IwgU,1215
3
+ flwr/cli/app.py,sha256=_HDs7HS12Dp7NXIyVrkPs1SKJq3x-XvVZd6y1lvyud4,1255
4
4
  flwr/cli/build.py,sha256=H4xrQPDj7kvZ7Ys65yb-jE86RLEmvIE3pZ3mokZfJHg,5145
5
5
  flwr/cli/config_utils.py,sha256=uJmJAHNoqeSeAC3BAxxoBuYOR9eV3mJg8wrWZgbGp3E,7521
6
6
  flwr/cli/example.py,sha256=1bGDYll3BXQY2kRqSN-oICqS5n1b9m0g0RvXTopXHl4,2215
7
7
  flwr/cli/install.py,sha256=t5tdeKOsTmG3nuInUoSKBVzUU1RnzA096yzYs013VhE,7065
8
+ flwr/cli/log.py,sha256=uhtcLcFGkazirWnEmet3Wt3rt_q-a13kauQqPLaMaRY,8097
8
9
  flwr/cli/new/__init__.py,sha256=cQzK1WH4JP2awef1t2UQ2xjl1agVEz9rwutV18SWV1k,789
9
- flwr/cli/new/new.py,sha256=FvSxGIDsnO7w5Rtq6-Zz3PzD_tkSthNGvYOHeYRcCeI,9570
10
+ flwr/cli/new/new.py,sha256=wpHBmHOq6X04CPwJDaEgu3H5_MsfoEYsYsv3E-EDhzM,9558
10
11
  flwr/cli/new/templates/__init__.py,sha256=4luU8RL-CK8JJCstQ_ON809W9bNTkY1l9zSaPKBkgwY,725
11
12
  flwr/cli/new/templates/app/.gitignore.tpl,sha256=XixnHdyeMB2vwkGtGnwHqoWpH-9WChdyG0GXe57duhc,3078
12
13
  flwr/cli/new/templates/app/LICENSE.tpl,sha256=WNHhf_5RCaeuKWyq_K39vmp9F28LxKsB4SpomwSZ2L0,11357
13
14
  flwr/cli/new/templates/app/README.baseline.md.tpl,sha256=4dg2aBS-NIleVyDlxsG8m65Af6LIJ-pZA5ICjGFU5XA,9641
14
- flwr/cli/new/templates/app/README.flowertune.md.tpl,sha256=lxr_RCGfiDy8QGcMVdjXsUXWM_gLf6cY7UQanGL_FFQ,3304
15
+ flwr/cli/new/templates/app/README.flowertune.md.tpl,sha256=QSG51uifue2KVZz2ZNw8kmOStS7svC2AQ2gTa5E7Bhs,3326
15
16
  flwr/cli/new/templates/app/README.md.tpl,sha256=t7w4YFZEcJOxAnuJmNPw5-fDdIJu7PfLd8gFJDiBwwo,436
16
17
  flwr/cli/new/templates/app/__init__.py,sha256=DU7QMY7IhMQyuwm_tja66xU0KXTWQFqzfTqwg-_NJdE,729
17
18
  flwr/cli/new/templates/app/code/__init__.baseline.py.tpl,sha256=YkHAgppUeD2BnBoGfVB6dEvBfjuIPGsU1gw4CiUi3qA,40
@@ -49,7 +50,7 @@ flwr/cli/new/templates/app/code/task.pytorch.py.tpl,sha256=NgbPix74X1t3ybaGjqdls
49
50
  flwr/cli/new/templates/app/code/task.tensorflow.py.tpl,sha256=SKXAZdgBnPpbAbJ90Rb7oQ5ilnopBx_j_JNFoUDeEAI,1732
50
51
  flwr/cli/new/templates/app/code/utils.baseline.py.tpl,sha256=YkHAgppUeD2BnBoGfVB6dEvBfjuIPGsU1gw4CiUi3qA,40
51
52
  flwr/cli/new/templates/app/pyproject.baseline.toml.tpl,sha256=4gi90W9_B1kj6rYkpvVJxhNX9Yctsv9OH6CzXP-dcE4,2666
52
- flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl,sha256=-tW_nwHQCK5JIRI4Cpb0yDVHJO0RUAEOTqCtWJoGHIQ,1827
53
+ flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl,sha256=bYdDP0O8z741pvy1INnH4UBuP-KFvcyQt6Yo81n4frQ,1853
53
54
  flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl,sha256=CHJgkPNkJfzJhEbTe15uiV3AhOtIddQi-yofPZsCk3E,1143
54
55
  flwr/cli/new/templates/app/pyproject.jax.toml.tpl,sha256=Tq6jeGcoOKzMwWWYxMVnzMcipLURHLiW69iYlD1ywMg,659
55
56
  flwr/cli/new/templates/app/pyproject.mlx.toml.tpl,sha256=SHwYAA2qgIlOAU3Sb9BKSZcZ7O9biACg27MHexXUtDw,741
@@ -58,7 +59,7 @@ flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl,sha256=vIO1ArukTC76ogYLNmJ
58
59
  flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl,sha256=jk_5teoyOVM9QdBea8J-nk10S6TKw81QZiiKB54ATF0,654
59
60
  flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl,sha256=bRIvPCPvTTI4Eo5b61Rmw8WdDw3sjcohciTXgULN5l8,702
60
61
  flwr/cli/run/__init__.py,sha256=oCd6HmQDx-sqver1gecgx-uMA38BLTSiiKpl7RGNceg,789
61
- flwr/cli/run/run.py,sha256=bGfiHFAsoBSRmuz1vLrRtG0IE0ZCDSIqaVOocUKMciw,7938
62
+ flwr/cli/run/run.py,sha256=tLKeWpWJqEBxkOtDKEprL4SBKxH1vHGybQxlCLnXiSQ,8386
62
63
  flwr/cli/utils.py,sha256=emMUdthvoHBTB0iGQp-oFBmA5wV46lw3y3FmfXQPCsc,4500
63
64
  flwr/client/__init__.py,sha256=DGDoO0AEAfz-0CUFmLdyUUweAS64-07AOnmDfWUefK4,1192
64
65
  flwr/client/app.py,sha256=cH0LAmpm6M8rfgc3lJFJ3pEwCVEgMuv-58WvOo6FEw0,31956
@@ -74,9 +75,9 @@ flwr/client/grpc_adapter_client/connection.py,sha256=50LlADsrvvo_kYoGRXOph3ICAmc
74
75
  flwr/client/grpc_client/__init__.py,sha256=LsnbqXiJhgQcB0XzAlUQgPx011Uf7Y7yabIC1HxivJ8,735
75
76
  flwr/client/grpc_client/connection.py,sha256=WX0cKlV_S19bYYp52z3PYRrtOdGb52ovvFFVWIz6Uyw,9382
76
77
  flwr/client/grpc_rere_client/__init__.py,sha256=MK-oSoV3kwUEQnIwl0GN4OpiHR7eLOrMA8ikunET130,752
77
- flwr/client/grpc_rere_client/client_interceptor.py,sha256=4OlD1ZmUEtrbBDuSBjdJB_yXWUHHag51yhxBPwvmXsU,5260
78
- flwr/client/grpc_rere_client/connection.py,sha256=N67GVj4_7_SuNAjQAJ8ulQxWjFPqOcQnOKW5ebbeeBQ,10927
79
- flwr/client/grpc_rere_client/grpc_adapter.py,sha256=yPsJg8POxKqAtQxR7R2zSzJ85LQsfV7u6xfrsoZbf0g,4999
78
+ flwr/client/grpc_rere_client/client_interceptor.py,sha256=q08lIEeJLvvonNOiejNXvmySbPObteGnbDHhEKDmWzE,5380
79
+ flwr/client/grpc_rere_client/connection.py,sha256=tppAfMTV1yLBNmgS0KuvqGUjaecpA7SWbPIITkfEHcY,10960
80
+ flwr/client/grpc_rere_client/grpc_adapter.py,sha256=sQo0I9T65t97LFGoW_PrmgaTbd18GFgi2DoAI5wQJ4k,5589
80
81
  flwr/client/heartbeat.py,sha256=cx37mJBH8LyoIN4Lks85wtqT1mnU5GulQnr4pGCvAq0,2404
81
82
  flwr/client/message_handler/__init__.py,sha256=QxxQuBNpFPTHx3KiUNvQSlqMKlEnbRR1kFfc1KVje08,719
82
83
  flwr/client/message_handler/message_handler.py,sha256=lwBUvnY21GTK9uZPyxfiAPnGav9ueKo7YmyDpzUU6-Y,6524
@@ -93,14 +94,14 @@ flwr/client/node_state.py,sha256=HRKqkgTVGcZXL7nQSQ1nLxNx22eLyaCCIieZ5NZXgnA,394
93
94
  flwr/client/node_state_tests.py,sha256=-4fVsn7y-z9NYBuhq-cjepgxgVuPqqQgDOL4SofrdIo,2239
94
95
  flwr/client/numpy_client.py,sha256=tqGyhIkeeZQGr65BR03B7TWgx4rW3FA7G2874D8z_VU,11167
95
96
  flwr/client/rest_client/__init__.py,sha256=5KGlp7pjc1dhNRkKlaNtUfQmg8wrRFh9lS3P3uRS-7Q,735
96
- flwr/client/rest_client/connection.py,sha256=UKznSmlbLhS0XtNepmKyMQnaBXTCMYYWyHL9XQm9T-w,12781
97
+ flwr/client/rest_client/connection.py,sha256=icPDYPaTMWn3bQ9g42VUHEppcIVcBJFGuV3leo7mMpo,12814
97
98
  flwr/client/supernode/__init__.py,sha256=SUhWOzcgXRNXk1V9UgB5-FaWukqqrOEajVUHEcPkwyQ,865
98
- flwr/client/supernode/app.py,sha256=PGsOJG7TXqwnfV6NIyf_YOLKdm0fKjRxUnlPdFLOO3s,11940
99
+ flwr/client/supernode/app.py,sha256=it4jm9GATntwmRJNXfIIfsS8bTIRwba94B1uNy0I2TM,11973
99
100
  flwr/client/typing.py,sha256=dxoTBnTMfqXr5J7G3y-uNjqxYCddvxhu89spfj4Lm2U,1048
100
101
  flwr/common/__init__.py,sha256=TVaoFEJE158aui1TPZQiJCDZX4RNHRyI8I55VC80HhI,3901
101
102
  flwr/common/address.py,sha256=7kM2Rqjw86-c8aKwAvrXerWqznnVv4TFJ62aSAeTn10,3017
102
103
  flwr/common/config.py,sha256=QjsDEDf4xsx8StJV9I80dYWbBp7aBNrJmTlAeLpQpyw,7567
103
- flwr/common/constant.py,sha256=BxVpp2o3h70h-klxiwsyLT7U5woj2GD-TXh92-STlLc,3351
104
+ flwr/common/constant.py,sha256=zPBbsggMBrQy52kf3teXaqfif-g9NLsrdgIBtD6VNgY,3650
104
105
  flwr/common/context.py,sha256=5Bd9RCrhLkYZOVR7vr97OVhzVBHQkS1fUsYiIKTwpxU,2239
105
106
  flwr/common/date.py,sha256=OcQuwpb2HxcblTqYm6H223ufop5UZw5N_fzalbpOVzY,891
106
107
  flwr/common/differential_privacy.py,sha256=XwcJ3rWr8S8BZUocc76vLSJAXIf6OHnWkBV6-xlIRuw,6106
@@ -109,7 +110,7 @@ flwr/common/dp.py,sha256=vddkvyjV2FhRoN4VuU2LeAM1UBn7dQB8_W-Qdiveal8,1978
109
110
  flwr/common/exit_handlers.py,sha256=MracJaBeoCOC7TaXK9zCJQxhrMSx9ZtczK237qvhBpU,2806
110
111
  flwr/common/grpc.py,sha256=6Yi28JjAll19nxYJlOT9B03RN8dvJZP9zUoR3RSmxoY,2487
111
112
  flwr/common/logger.py,sha256=zAjaGrr_UWMkIdi1xG9tY764qJHIYM8LsPgMfBsyp64,8117
112
- flwr/common/message.py,sha256=QmFYYXA-3e9M8tGO-3NPyAI8yvdmcpdYaA_noR1DE88,13194
113
+ flwr/common/message.py,sha256=QDq7WvzNJqynIGgGQ3ZdrWiZUQBZiNhxAX2HFTmeUcw,13671
113
114
  flwr/common/object_ref.py,sha256=5lgWqYaJR28UdFc-iirWw9YqFXMfgkOOAdfJc1AVibE,8711
114
115
  flwr/common/parameter.py,sha256=-bFAUayToYDF50FZGrBC1hQYJCQDtB2bbr3ZuVLMtdE,2095
115
116
  flwr/common/pyproject.py,sha256=EI_ovbCHGmhYrdPx0RSDi5EkFZFof-8m1PA54c0ZTjc,1385
@@ -129,8 +130,8 @@ flwr/common/secure_aggregation/crypto/symmetric_encryption.py,sha256=wTDbOaMGZwT
129
130
  flwr/common/secure_aggregation/ndarrays_arithmetic.py,sha256=zvVAIrIyI6OSzGhpCi8NNaTvPXmoMYQIPJT-NkBg8RU,3013
130
131
  flwr/common/secure_aggregation/quantization.py,sha256=mC4uLf05zeONo8Ke-BY0Tj8UCMOS7VD93zHCzuv3MHU,2304
131
132
  flwr/common/secure_aggregation/secaggplus_constants.py,sha256=9MF-oQh62uD7rt9VeNB-rHf2gBLd5GL3S9OejCxmILY,2183
132
- flwr/common/secure_aggregation/secaggplus_utils.py,sha256=vmBBxdVqC7b8BvgXmPOeNJsNI5Yfft1UWLvx7P0S4H8,3189
133
- flwr/common/serde.py,sha256=tucfRG2pQ8v5jMbNrs8AILf5fpcNtvwRETpW6x6hlWY,29241
133
+ flwr/common/secure_aggregation/secaggplus_utils.py,sha256=o7IhHH6J9xqinhQy3TdPgQpoj1XyEpyv3OQFyx81RVQ,3193
134
+ flwr/common/serde.py,sha256=74nN5uqASdqfykSWPOhaTJARA07Iznyg3Nyr-dh-uy4,29918
134
135
  flwr/common/telemetry.py,sha256=PvdlipCPYciqEgmXRwQ1HklP1uyECcNqt9HTBzthmAg,8904
135
136
  flwr/common/typing.py,sha256=ZVviEABqDeGCyo_yM9ft8EbIGA9RaLOeoNHmMnTkmUo,4985
136
137
  flwr/common/version.py,sha256=tCcl_FvxVK206C1dxIJCs4TjL06WmyaODBP19FRHE1c,1324
@@ -143,10 +144,14 @@ flwr/proto/common_pb2.py,sha256=uzSmq0FJdC-MriN9UGPFs7QVIFTKJmX5lyLnzcyZ5WE,2405
143
144
  flwr/proto/common_pb2.pyi,sha256=0ylFO7G79qqLuRg9IQUCBdgyIIFv4m8VzrfoWad4xXU,5394
144
145
  flwr/proto/common_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
145
146
  flwr/proto/common_pb2_grpc.pyi,sha256=ff2TSiLVnG6IVQcTGzb2DIH3XRSoAvAo_RMcvbMFyc0,76
146
- flwr/proto/driver_pb2.py,sha256=gxlDAZUCELzYCkmhxcJdVyGXLmzYFXVFeqlJAIHPChE,4299
147
- flwr/proto/driver_pb2.pyi,sha256=apvTyy7N0SV3H8mueOwgB8aDETtxb6ZuKB1g1nMmJ4o,6390
148
- flwr/proto/driver_pb2_grpc.py,sha256=ZNDFyPfEZt5L3eFqJRwAE_ylwWLTNf1hfXzUGkVpzTI,10462
149
- flwr/proto/driver_pb2_grpc.pyi,sha256=_SLFI7AvJv5JU_7axipERF4oTspRh3bzZswLiKDtV1E,2812
147
+ flwr/proto/control_pb2.py,sha256=yaUkwY2J9uo-fdUIB5aHwVSDOuGunxaUr4ZlggifA_M,1439
148
+ flwr/proto/control_pb2.pyi,sha256=XbFvpZvvrS7QcH5AFXfpRGl4hQvhd3QdKO6x0oTlCCU,165
149
+ flwr/proto/control_pb2_grpc.py,sha256=FFE21nZvEILWpe1WCR5vAwgYEtpzrdG78-_SsU0gZ7w,5783
150
+ flwr/proto/control_pb2_grpc.pyi,sha256=9DU4sgkzJ497a4Nq6kitZWEG4g_5MO8MevichnO0oAg,1672
151
+ flwr/proto/driver_pb2.py,sha256=Z2fRF9mBa0cR0p6cItgyp5Q70WUAsh--kPEq8aIJuZk,3176
152
+ flwr/proto/driver_pb2.pyi,sha256=jUOe6tHWQhddVbB3xtnNvlrztNUcxRHHJS7-LqGO_70,4034
153
+ flwr/proto/driver_pb2_grpc.py,sha256=SGNmNcpsSWRc0jjNyH0xYNB8a7DAxIsXaL9a0M78vZw,10444
154
+ flwr/proto/driver_pb2_grpc.pyi,sha256=wTVkRgVUNq2Jnzo5yhIIqGFiLN_VRB1zpjfqRLD5QnM,2800
150
155
  flwr/proto/error_pb2.py,sha256=LarjKL90LbwkXKlhzNrDssgl4DXcvIPve8NVCXHpsKA,1084
151
156
  flwr/proto/error_pb2.pyi,sha256=ZNH4HhJTU_KfMXlyCeg8FwU-fcUYxTqEmoJPtWtHikc,734
152
157
  flwr/proto/error_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
@@ -155,12 +160,12 @@ flwr/proto/exec_pb2.py,sha256=GH_VWC-BZwWmeWdmjP4IkXvwR8yY1uBZNNwKru-ZZL4,3231
155
160
  flwr/proto/exec_pb2.pyi,sha256=5y6L3xFkAuCfLTn2pVIHQAlXp17YcTTq8WVDS7_MPl4,4273
156
161
  flwr/proto/exec_pb2_grpc.py,sha256=faAN19XEMP8GTKrcIU6jvlWkN44n2KiUsZh_OG0sYcg,4072
157
162
  flwr/proto/exec_pb2_grpc.pyi,sha256=VrFhT1Um3Nb8UC2YqnR9GIiM-Yyx0FqaxVOWljh-G_w,1208
158
- flwr/proto/fab_pb2.py,sha256=ztC3HnD5e-bYpp7lxrlxkdc30haAlBHswTnt4X5G1eg,1432
159
- flwr/proto/fab_pb2.pyi,sha256=wQXdQkcij6CrkmclIT5tU9SkOSZHTqm3PxWJWu4-CPI,1970
163
+ flwr/proto/fab_pb2.py,sha256=3QSDq9pjbZoqVxsmCRDwHO5PrSjzn2vixjYxE-qPmb0,1589
164
+ flwr/proto/fab_pb2.pyi,sha256=fXI108QaFtbl1WWTyslPbIx9c_19D0aYCoFn0xYtL4U,2277
160
165
  flwr/proto/fab_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
161
166
  flwr/proto/fab_pb2_grpc.pyi,sha256=ff2TSiLVnG6IVQcTGzb2DIH3XRSoAvAo_RMcvbMFyc0,76
162
- flwr/proto/fleet_pb2.py,sha256=euBC2M_LfQSwiSK9kFi18OvoV1gnQT4cC9lAMCCiOGY,4729
163
- flwr/proto/fleet_pb2.pyi,sha256=45kQ9YINv3VG0nxWSjCN4SppdepjKW8rRBlxKxz7ud4,7571
167
+ flwr/proto/fleet_pb2.py,sha256=06NAaIAOxTA2UhkBA-VWZKflaVQIzXgPZ3Fb6vtliY0,4789
168
+ flwr/proto/fleet_pb2.pyi,sha256=bkzPOFXaYVZv9jRIA_XqckTR4dLZcfPRmluaGeoqxBY,7851
164
169
  flwr/proto/fleet_pb2_grpc.py,sha256=VyqpAcX-6tiQVehQfRMbCErtIW4Mot1uXUSzRaklZTI,12228
165
170
  flwr/proto/fleet_pb2_grpc.pyi,sha256=VvOtOBwPcgoHRPgj2JENXq2HbcfU8cxp82E9tDfGyEs,3216
166
171
  flwr/proto/grpcadapter_pb2.py,sha256=bb8mW09XzNCpMdr1KuYQkefPFWR8lc8y1uL6Uk0TtsM,1843
@@ -175,20 +180,20 @@ flwr/proto/node_pb2.py,sha256=qrxEpf7Up9XhigP8g9cIHVhmpdKmYpxMdlO67H0xjEM,1081
175
180
  flwr/proto/node_pb2.pyi,sha256=aX3BHhgXvJE1rvcRnEE_gB-5GcaFQ0SJ88yTE223bjI,751
176
181
  flwr/proto/node_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
177
182
  flwr/proto/node_pb2_grpc.pyi,sha256=ff2TSiLVnG6IVQcTGzb2DIH3XRSoAvAo_RMcvbMFyc0,76
178
- flwr/proto/recordset_pb2.py,sha256=un8L0kvBcgFXQIiQweOseeIJBjlOozUvQY9uTQ42Dqo,6009
179
- flwr/proto/recordset_pb2.pyi,sha256=NPzCJWAj1xLWzeZ_xZ6uaObQjQfWGnnqlLtn4J-SoFY,14161
183
+ flwr/proto/recordset_pb2.py,sha256=XjEIDU-YlKSY59qNd0qXTFB4COvMHGiszQ5O1krJ1Ks,6367
184
+ flwr/proto/recordset_pb2.pyi,sha256=ypFNvroU4aIlnN0D6W4XAsOfm0UzTfXhxxL1v7u__Ac,15370
180
185
  flwr/proto/recordset_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
181
186
  flwr/proto/recordset_pb2_grpc.pyi,sha256=ff2TSiLVnG6IVQcTGzb2DIH3XRSoAvAo_RMcvbMFyc0,76
182
- flwr/proto/run_pb2.py,sha256=zTH0YjBETYhQzv2MC5TD8cW8Lvsc89ublkFtGuHp0ek,2102
183
- flwr/proto/run_pb2.pyi,sha256=oIaKIjgyjnifossFMTSqQISEMb1IJYhSYGQYcAGBIS4,3063
187
+ flwr/proto/run_pb2.py,sha256=pwel-8Hzsz1Gw2EHGEFKObgSEKQNth7nGZOEsJQO8fM,4940
188
+ flwr/proto/run_pb2.pyi,sha256=pr7MPml_7gOmBuu7BO-yaU-LexamsJYxnRG-utigVAo,9641
184
189
  flwr/proto/run_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
185
190
  flwr/proto/run_pb2_grpc.pyi,sha256=ff2TSiLVnG6IVQcTGzb2DIH3XRSoAvAo_RMcvbMFyc0,76
186
191
  flwr/proto/task_pb2.py,sha256=R5GfHgL8IJRI_qHWNeILl1Y9zHjvB0tnCvMHmTgF4Is,2361
187
192
  flwr/proto/task_pb2.pyi,sha256=KJVsLm-THY5QjHreHDm_-OS1tyZyD61mx6BzOpoeMjw,4320
188
193
  flwr/proto/task_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
189
194
  flwr/proto/task_pb2_grpc.pyi,sha256=ff2TSiLVnG6IVQcTGzb2DIH3XRSoAvAo_RMcvbMFyc0,76
190
- flwr/proto/transport_pb2.py,sha256=cURzfpCgZvH7GEvBPLvTYijE3HvhK1MePjINk4xYArk,9781
191
- flwr/proto/transport_pb2.pyi,sha256=CZvJRWTU3QWFWLXNFtyLSrSKFatIyMcy-ohzLbQ-G9c,21497
195
+ flwr/proto/transport_pb2.py,sha256=lJsj9rnLiFBhepXuZAIpZysGAqvtXtoSt4h7soU61Do,9824
196
+ flwr/proto/transport_pb2.pyi,sha256=ipHQ03eFBqsxtAuAVefZ2lVr04BZ4YifJCS2eauNmy8,21627
192
197
  flwr/proto/transport_pb2_grpc.py,sha256=vLN3EHtx2aEEMCO4f1Upu-l27BPzd3-5pV-u8wPcosk,2598
193
198
  flwr/proto/transport_pb2_grpc.pyi,sha256=AGXf8RiIiW2J5IKMlm_3qT3AzcDa4F3P5IqUjve_esA,766
194
199
  flwr/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -207,13 +212,13 @@ flwr/server/driver/driver.py,sha256=rGLbOfLhBOn74mUHi_0CMbXqZLX8q_lXqEkcUXoL_wI,
207
212
  flwr/server/driver/grpc_driver.py,sha256=xd1mxRexeiIJrZw9l-urj2zEIncLT8KtNn0l8hIDYZs,9681
208
213
  flwr/server/driver/inmemory_driver.py,sha256=up5L2ux9l0pEUZO3hh8p5LufXntGL95IA4E3e7WsxqY,6465
209
214
  flwr/server/history.py,sha256=qSb5_pPTrwofpSYGsZWzMPkl_4uJ4mJFWesxXDrEvDU,5026
210
- flwr/server/run_serverapp.py,sha256=ASpwKHNlxpDfBe6UPotxkaifXZyKS9ZIrdwtTGLCt3k,10534
215
+ flwr/server/run_serverapp.py,sha256=SaE9hoWLCAPnRXvdAzE4Oi3QaiC8NOTrHxrIGXjgYxU,10531
211
216
  flwr/server/server.py,sha256=1ZsFEptmAV-L2vP2etNC9Ed5CLSxpuKzUFkAPQ4l5Xc,17893
212
217
  flwr/server/server_app.py,sha256=1hul76ospG8L_KooK_ewn1sWPNTNYLTtZMeGNOBNruA,6267
213
218
  flwr/server/server_config.py,sha256=CZaHVAsMvGLjpWVcLPkiYxgJN4xfIyAiUrCI3fETKY4,1349
214
219
  flwr/server/serverapp_components.py,sha256=-IV_CitOfrJclJj2jNdbN1Q65PyFmtKtrTIg1hc6WQw,2118
215
220
  flwr/server/strategy/__init__.py,sha256=tQer2SwjDnvgFFuJMZM-S01Z615N5XK6MaCvpm4BMU0,2836
216
- flwr/server/strategy/aggregate.py,sha256=RpMW6R6tPKSJqi-1CwYi0nlLnG3AMhWIt_QqKYVGkog,13455
221
+ flwr/server/strategy/aggregate.py,sha256=iFZ8lp7PV_a2m9kywV-FK0iM33ofxavOs5TIaEQY8nU,13961
217
222
  flwr/server/strategy/bulyan.py,sha256=DDNLLlTJCHgBtij7EpDsa852GHEYjjDB1iORACZO2KE,6513
218
223
  flwr/server/strategy/dp_adaptive_clipping.py,sha256=OoGnSavjfIP6IUkt6z2t62CR3qItgrowtBy27TEdz2s,17387
219
224
  flwr/server/strategy/dp_fixed_clipping.py,sha256=ILmO_AsoMpstOAYK9L6hJpqf7zE6erdMj_SD_-hHAFk,12834
@@ -239,14 +244,14 @@ flwr/server/strategy/strategy.py,sha256=cXapkD5uDrt5C-RbmWDn9FLoap3Q41i7GKvbmfbC
239
244
  flwr/server/superlink/__init__.py,sha256=8tHYCfodUlRD8PCP9fHgvu8cz5N31A2QoRVL0jDJ15E,707
240
245
  flwr/server/superlink/driver/__init__.py,sha256=_JaRW-FdyikHc7souUrnk3mwTGViraEJCeUBY_M_ocs,712
241
246
  flwr/server/superlink/driver/driver_grpc.py,sha256=ej9T21zIquIJEZyWcvapQSQFckh4oFPamOe6P6DhB2s,2048
242
- flwr/server/superlink/driver/driver_servicer.py,sha256=ofxSlotqz1hhvv9Cww2eWoDS5Jpvavge4AtKxTElJNY,6967
247
+ flwr/server/superlink/driver/driver_servicer.py,sha256=x8L8rIO6r7kVdmWZFJp-xmTB0K_Tz1mh-7Akc6I_ZjY,6967
243
248
  flwr/server/superlink/ffs/__init__.py,sha256=FAY-zShcfPmOxosok2QyT6hTNMNctG8cH9s_nIl8jkI,840
244
249
  flwr/server/superlink/ffs/disk_ffs.py,sha256=yCN6CCzegnJIOaHr5nIu49wZQa4g5BByiSKshz50RKU,3296
245
250
  flwr/server/superlink/ffs/ffs.py,sha256=qLI1UfosJugu2BKOJWqHIhafTm-YiuKqGf3OGWPH0NM,2395
246
251
  flwr/server/superlink/ffs/ffs_factory.py,sha256=N_eMuUZggotdGiDQ5r_Tf21xsu_ob0e3jyM6ag7d3kk,1490
247
252
  flwr/server/superlink/fleet/__init__.py,sha256=76od-HhYjOUoZFLFDFCFnNHI4JLAmaXQEAyp7LWlQpc,711
248
253
  flwr/server/superlink/fleet/grpc_adapter/__init__.py,sha256=spBQQJeYz8zPOBOfyMLv87kqWPASGB73AymcLXdFaYA,742
249
- flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py,sha256=3yrZtwSrvNJzwkZJiOnG48hYVT2ERLQmadKmcHpL4gs,5591
254
+ flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py,sha256=kE7ejRKR-8rVJsKgvglHn78L2ok6ZJ1Y4frZvgiJvpk,6341
250
255
  flwr/server/superlink/fleet/grpc_bidi/__init__.py,sha256=dkSKQMuMTYh1qSnuN87cAPv_mcdLg3f0PqTABHs8gUE,735
251
256
  flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py,sha256=xbvorZhCHBj0CvFWB7oUeHoY0o750hUkiS0DiTCGHDs,6020
252
257
  flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py,sha256=JkAH_nIZaqe_9kntrg26od_jaz5XdLFuvNMgGu8xk9Q,6485
@@ -254,7 +259,7 @@ flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py,sha256=h3EhqgelegVC4E
254
259
  flwr/server/superlink/fleet/grpc_bidi/grpc_server.py,sha256=8VFp7K5ollkexR2UmXOrLtxo6H_B79eZkyM_Ro77tSU,12312
255
260
  flwr/server/superlink/fleet/grpc_rere/__init__.py,sha256=j2hyC342am-_Hgp1g80Y3fGDzfTI6n8QOOn2PyWf4eg,758
256
261
  flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py,sha256=bgoLQEhahVHjdlRDk_58zyKFeMOziiPUXSbYMhOxybY,4757
257
- flwr/server/superlink/fleet/grpc_rere/server_interceptor.py,sha256=sAmmPfjuoHPjhyT5oWKEuj4UJFSyyMxDo1O1BzZmQfs,8005
262
+ flwr/server/superlink/fleet/grpc_rere/server_interceptor.py,sha256=pgSiH-qrTgDxu4M_jJu-8gvEQnxTdR-qIAawKgxjQ6M,8157
258
263
  flwr/server/superlink/fleet/message_handler/__init__.py,sha256=h8oLD7uo5lKICPy0rRdKRjTYe62u8PKkT_fA4xF5JPA,731
259
264
  flwr/server/superlink/fleet/message_handler/message_handler.py,sha256=NneayZ9FjIf7k2h_R3wQ2wluqYCAyzVVU_Uq7keWay4,4433
260
265
  flwr/server/superlink/fleet/rest_rere/__init__.py,sha256=5jbYbAn75sGv-gBwOPDySE0kz96F6dTYLeMrGqNi4lM,735
@@ -265,15 +270,15 @@ flwr/server/superlink/fleet/vce/backend/backend.py,sha256=LBAQxnbfPAphVOVIvYMj0Q
265
270
  flwr/server/superlink/fleet/vce/backend/raybackend.py,sha256=7kB3re3mR53b7E6L6DPSioTSKD3YGtS3uJsPD7Hn2Fw,7155
266
271
  flwr/server/superlink/fleet/vce/vce_api.py,sha256=cGPsjS_4SJHm8jszGjsHh8ZNk9nqWoIQwW_62yKKR1Y,12647
267
272
  flwr/server/superlink/state/__init__.py,sha256=Gj2OTFLXvA-mAjBvwuKDM3rDrVaQPcIoybSa2uskMTE,1003
268
- flwr/server/superlink/state/in_memory_state.py,sha256=DvPSyK-ITZI9XfW-1M0bljLa6Sj0JIUeHFbg5tKKc2s,13142
269
- flwr/server/superlink/state/sqlite_state.py,sha256=W1qFF8QvQ9CwhqCwE_sqDERiFVb5rqppira7gJSWI-w,32155
273
+ flwr/server/superlink/state/in_memory_state.py,sha256=XL1cqXSnF87lpTprEtyl9aYRbDp2VuOiJdxvhTSvO18,14936
274
+ flwr/server/superlink/state/sqlite_state.py,sha256=B1DOzHB9BpKLPmCSp4YyjcFspZpFpDsNJqCML6WQlhs,34259
270
275
  flwr/server/superlink/state/state.py,sha256=KpM894R8RE1N0b-s_Nlii6i0TDxj0DRkKa3Vf24Gt70,8127
271
276
  flwr/server/superlink/state/state_factory.py,sha256=Fo8pBQ1WWrVJK5TOEPZ_zgJE69_mfTGjTO6czh6571o,2021
272
277
  flwr/server/superlink/state/utils.py,sha256=OsF3OOoU4bU4PgLWkypX6EDoFs0L8RP_mHEBG-tVqGA,5227
273
278
  flwr/server/typing.py,sha256=5kaRLZuxTEse9A0g7aVna2VhYxU3wTq1f3d3mtw7kXs,1019
274
279
  flwr/server/utils/__init__.py,sha256=pltsPHJoXmUIr3utjwwYxu7_ZAGy5u4MVHzv9iA5Un8,908
275
280
  flwr/server/utils/tensorboard.py,sha256=gEBD8w_5uaIfp5aw5RYH66lYZpd_SfkObHQ7eDd9MUk,5466
276
- flwr/server/utils/validator.py,sha256=mJSTiJcOKYr9e2YK8yUR1W-bop5EDd_ZnRiaFCa2jSw,5295
281
+ flwr/server/utils/validator.py,sha256=o13PPwjSM7VyUZgzGUiBQTaJLVmRRKi0NSQj6f5HuiA,5512
277
282
  flwr/server/workflow/__init__.py,sha256=SXY0XkwbkezFBxxrFB5hKUtmtAgnYISBkPouR1V71ss,902
278
283
  flwr/server/workflow/constant.py,sha256=q4DLdR8Krlxuewq2AQjwTL75hphxE5ODNz4AhViHMXk,1082
279
284
  flwr/server/workflow/default_workflows.py,sha256=UMC9JgdomKwxql5G0OV4AeRXWI-bMClaLAOn5OrZMnw,14073
@@ -289,13 +294,13 @@ flwr/simulation/ray_transport/utils.py,sha256=TYdtfg1P9VfTdLMOJlifInGpxWHYs9UfUq
289
294
  flwr/simulation/run_simulation.py,sha256=AN62VEoJhqe88VmkJ5dlJPVcDhUXGBaMKo4KjHqUu_8,22744
290
295
  flwr/superexec/__init__.py,sha256=fcj366jh4RFby_vDwLroU4kepzqbnJgseZD_jUr_Mko,715
291
296
  flwr/superexec/app.py,sha256=mKwlsysbtmGPuz4CpWAPDPWAEFZH3b8u0JKRkWpfzuw,6552
292
- flwr/superexec/deployment.py,sha256=sNb-sYdCDkVEALSbC_eBNIulieHwpg7HzgmDIp4wT9o,6267
297
+ flwr/superexec/deployment.py,sha256=TbzOAAaY2sNt7O516w1GS6N5xvt0UV-dML74O6WA2O4,6344
293
298
  flwr/superexec/exec_grpc.py,sha256=ZPq7EP55Vwj0kRcLVuTCokFqfIgBk-7YmDykZoMKi-c,1935
294
- flwr/superexec/exec_servicer.py,sha256=P4bJtQqCr0NiVIa-ss9lvdUM1SbM_ip5g5UqKp3dNL4,2344
295
- flwr/superexec/executor.py,sha256=k_adivto6R2U82DADOHNvdtobehBYreRek1gOEBIQnQ,2318
299
+ flwr/superexec/exec_servicer.py,sha256=TRpwPVl7eI0Y_xlCY6DmVpAo0yFU1gLwzyIeqFw9pyk,4746
300
+ flwr/superexec/executor.py,sha256=-5J-ZLs-uArro3T2pCq0YQRC65cs18M888nufzdYE4E,2375
296
301
  flwr/superexec/simulation.py,sha256=J6pw-RqCSiUed8I_3MasZH4tl57ZmDebPAHNnbb0-vE,7420
297
- flwr_nightly-1.12.0.dev20240918.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
298
- flwr_nightly-1.12.0.dev20240918.dist-info/METADATA,sha256=lnIUhAPYCT7RrWdszYziCh3uNppNN_xtOLQqihPN92I,15452
299
- flwr_nightly-1.12.0.dev20240918.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
300
- flwr_nightly-1.12.0.dev20240918.dist-info/entry_points.txt,sha256=WUCbqhLEOzjx_lyATIM0-f0e8kOVaQjzwOvyOxHrMhs,434
301
- flwr_nightly-1.12.0.dev20240918.dist-info/RECORD,,
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,,