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.
- flwr/cli/app.py +2 -0
- flwr/cli/log.py +234 -0
- flwr/cli/new/new.py +1 -1
- flwr/cli/new/templates/app/README.flowertune.md.tpl +1 -1
- flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +1 -0
- flwr/cli/run/run.py +17 -1
- flwr/client/grpc_rere_client/client_interceptor.py +3 -0
- flwr/client/grpc_rere_client/connection.py +3 -3
- flwr/client/grpc_rere_client/grpc_adapter.py +14 -3
- flwr/client/rest_client/connection.py +3 -3
- flwr/client/supernode/app.py +1 -0
- flwr/common/constant.py +9 -3
- flwr/common/message.py +32 -15
- flwr/common/secure_aggregation/secaggplus_utils.py +4 -4
- flwr/common/serde.py +22 -7
- flwr/proto/control_pb2.py +27 -0
- flwr/proto/control_pb2.pyi +7 -0
- flwr/proto/control_pb2_grpc.py +135 -0
- flwr/proto/control_pb2_grpc.pyi +53 -0
- flwr/proto/driver_pb2.py +15 -24
- flwr/proto/driver_pb2.pyi +0 -52
- flwr/proto/driver_pb2_grpc.py +6 -6
- flwr/proto/driver_pb2_grpc.pyi +4 -4
- flwr/proto/fab_pb2.py +8 -7
- flwr/proto/fab_pb2.pyi +7 -1
- flwr/proto/fleet_pb2.py +10 -10
- flwr/proto/fleet_pb2.pyi +6 -1
- flwr/proto/recordset_pb2.py +35 -33
- flwr/proto/recordset_pb2.pyi +40 -14
- flwr/proto/run_pb2.py +33 -9
- flwr/proto/run_pb2.pyi +150 -1
- flwr/proto/transport_pb2.py +8 -8
- flwr/proto/transport_pb2.pyi +9 -6
- flwr/server/run_serverapp.py +2 -2
- flwr/server/strategy/aggregate.py +22 -8
- flwr/server/superlink/driver/driver_servicer.py +2 -2
- flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +17 -2
- flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +4 -0
- flwr/server/superlink/state/in_memory_state.py +47 -2
- flwr/server/superlink/state/sqlite_state.py +73 -8
- flwr/server/utils/validator.py +6 -0
- flwr/superexec/deployment.py +3 -1
- flwr/superexec/exec_servicer.py +68 -3
- flwr/superexec/executor.py +2 -1
- {flwr_nightly-1.12.0.dev20240918.dist-info → flwr_nightly-1.12.0.dev20241007.dist-info}/METADATA +4 -2
- {flwr_nightly-1.12.0.dev20240918.dist-info → flwr_nightly-1.12.0.dev20241007.dist-info}/RECORD +49 -44
- {flwr_nightly-1.12.0.dev20240918.dist-info → flwr_nightly-1.12.0.dev20241007.dist-info}/LICENSE +0 -0
- {flwr_nightly-1.12.0.dev20240918.dist-info → flwr_nightly-1.12.0.dev20241007.dist-info}/WHEEL +0 -0
- {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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
786
|
-
|
|
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
|
-
|
|
795
|
-
|
|
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,
|
flwr/server/utils/validator.py
CHANGED
|
@@ -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
|
flwr/superexec/deployment.py
CHANGED
|
@@ -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))
|
flwr/superexec/exec_servicer.py
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
flwr/superexec/executor.py
CHANGED
|
@@ -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):
|
{flwr_nightly-1.12.0.dev20240918.dist-info → flwr_nightly-1.12.0.dev20241007.dist-info}/METADATA
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: flwr-nightly
|
|
3
|
-
Version: 1.12.0.
|
|
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
|
|
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
|
[](https://github.com/adap/flower/blob/main/CONTRIBUTING.md)
|
|
70
70
|

|
|
71
71
|
[](https://pepy.tech/project/flwr)
|
|
72
|
+
[](https://hub.docker.com/u/flwr)
|
|
72
73
|
[](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)
|
{flwr_nightly-1.12.0.dev20240918.dist-info → flwr_nightly-1.12.0.dev20241007.dist-info}/RECORD
RENAMED
|
@@ -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=
|
|
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=
|
|
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=
|
|
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
|
|
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=
|
|
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=
|
|
78
|
-
flwr/client/grpc_rere_client/connection.py,sha256=
|
|
79
|
-
flwr/client/grpc_rere_client/grpc_adapter.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
133
|
-
flwr/common/serde.py,sha256=
|
|
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/
|
|
147
|
-
flwr/proto/
|
|
148
|
-
flwr/proto/
|
|
149
|
-
flwr/proto/
|
|
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=
|
|
159
|
-
flwr/proto/fab_pb2.pyi,sha256=
|
|
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=
|
|
163
|
-
flwr/proto/fleet_pb2.pyi,sha256=
|
|
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=
|
|
179
|
-
flwr/proto/recordset_pb2.pyi,sha256=
|
|
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=
|
|
183
|
-
flwr/proto/run_pb2.pyi,sha256=
|
|
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=
|
|
191
|
-
flwr/proto/transport_pb2.pyi,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
269
|
-
flwr/server/superlink/state/sqlite_state.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
295
|
-
flwr/superexec/executor.py,sha256
|
|
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.
|
|
298
|
-
flwr_nightly-1.12.0.
|
|
299
|
-
flwr_nightly-1.12.0.
|
|
300
|
-
flwr_nightly-1.12.0.
|
|
301
|
-
flwr_nightly-1.12.0.
|
|
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,,
|
{flwr_nightly-1.12.0.dev20240918.dist-info → flwr_nightly-1.12.0.dev20241007.dist-info}/LICENSE
RENAMED
|
File without changes
|