flwr-nightly 1.9.0.dev20240417__py3-none-any.whl → 1.9.0.dev20240419__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.

@@ -0,0 +1,140 @@
1
+ # Copyright 2024 Flower Labs GmbH. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ # ==============================================================================
15
+ """Driver (abstract base class)."""
16
+
17
+
18
+ from abc import ABC, abstractmethod
19
+ from typing import Iterable, List, Optional
20
+
21
+ from flwr.common import Message, RecordSet
22
+
23
+
24
+ class Driver(ABC):
25
+ """Abstract base Driver class for the Driver API."""
26
+
27
+ @abstractmethod
28
+ def create_message( # pylint: disable=too-many-arguments
29
+ self,
30
+ content: RecordSet,
31
+ message_type: str,
32
+ dst_node_id: int,
33
+ group_id: str,
34
+ ttl: Optional[float] = None,
35
+ ) -> Message:
36
+ """Create a new message with specified parameters.
37
+
38
+ This method constructs a new `Message` with given content and metadata.
39
+ The `run_id` and `src_node_id` will be set automatically.
40
+
41
+ Parameters
42
+ ----------
43
+ content : RecordSet
44
+ The content for the new message. This holds records that are to be sent
45
+ to the destination node.
46
+ message_type : str
47
+ The type of the message, defining the action to be executed on
48
+ the receiving end.
49
+ dst_node_id : int
50
+ The ID of the destination node to which the message is being sent.
51
+ group_id : str
52
+ The ID of the group to which this message is associated. In some settings,
53
+ this is used as the FL round.
54
+ ttl : Optional[float] (default: None)
55
+ Time-to-live for the round trip of this message, i.e., the time from sending
56
+ this message to receiving a reply. It specifies in seconds the duration for
57
+ which the message and its potential reply are considered valid. If unset,
58
+ the default TTL (i.e., `common.DEFAULT_TTL`) will be used.
59
+
60
+ Returns
61
+ -------
62
+ message : Message
63
+ A new `Message` instance with the specified content and metadata.
64
+ """
65
+
66
+ @abstractmethod
67
+ def get_node_ids(self) -> List[int]:
68
+ """Get node IDs."""
69
+
70
+ @abstractmethod
71
+ def push_messages(self, messages: Iterable[Message]) -> Iterable[str]:
72
+ """Push messages to specified node IDs.
73
+
74
+ This method takes an iterable of messages and sends each message
75
+ to the node specified in `dst_node_id`.
76
+
77
+ Parameters
78
+ ----------
79
+ messages : Iterable[Message]
80
+ An iterable of messages to be sent.
81
+
82
+ Returns
83
+ -------
84
+ message_ids : Iterable[str]
85
+ An iterable of IDs for the messages that were sent, which can be used
86
+ to pull replies.
87
+ """
88
+
89
+ @abstractmethod
90
+ def pull_messages(self, message_ids: Iterable[str]) -> Iterable[Message]:
91
+ """Pull messages based on message IDs.
92
+
93
+ This method is used to collect messages from the SuperLink
94
+ that correspond to a set of given message IDs.
95
+
96
+ Parameters
97
+ ----------
98
+ message_ids : Iterable[str]
99
+ An iterable of message IDs for which reply messages are to be retrieved.
100
+
101
+ Returns
102
+ -------
103
+ messages : Iterable[Message]
104
+ An iterable of messages received.
105
+ """
106
+
107
+ @abstractmethod
108
+ def send_and_receive(
109
+ self,
110
+ messages: Iterable[Message],
111
+ *,
112
+ timeout: Optional[float] = None,
113
+ ) -> Iterable[Message]:
114
+ """Push messages to specified node IDs and pull the reply messages.
115
+
116
+ This method sends a list of messages to their destination node IDs and then
117
+ waits for the replies. It continues to pull replies until either all
118
+ replies are received or the specified timeout duration is exceeded.
119
+
120
+ Parameters
121
+ ----------
122
+ messages : Iterable[Message]
123
+ An iterable of messages to be sent.
124
+ timeout : Optional[float] (default: None)
125
+ The timeout duration in seconds. If specified, the method will wait for
126
+ replies for this duration. If `None`, there is no time limit and the method
127
+ will wait until replies for all messages are received.
128
+
129
+ Returns
130
+ -------
131
+ replies : Iterable[Message]
132
+ An iterable of reply messages received from the SuperLink.
133
+
134
+ Notes
135
+ -----
136
+ This method uses `push_messages` to send the messages and `pull_messages`
137
+ to collect the replies. If `timeout` is set, the method may not return
138
+ replies for all sent messages. A message remains valid until its TTL,
139
+ which is not affected by `timeout`.
140
+ """
@@ -64,7 +64,7 @@ class DriverServicer(driver_pb2_grpc.DriverServicer):
64
64
  """Create run ID."""
65
65
  log(INFO, "DriverServicer.CreateRun")
66
66
  state: State = self.state_factory.state()
67
- run_id = state.create_run()
67
+ run_id = state.create_run("None/None", "None")
68
68
  return CreateRunResponse(run_id=run_id)
69
69
 
70
70
  def PushTaskIns(
@@ -33,6 +33,7 @@ from flwr.proto.fleet_pb2 import ( # pylint: disable=E0611
33
33
  PushTaskResRequest,
34
34
  PushTaskResResponse,
35
35
  Reconnect,
36
+ Run,
36
37
  )
37
38
  from flwr.proto.node_pb2 import Node # pylint: disable=E0611
38
39
  from flwr.proto.task_pb2 import TaskIns, TaskRes # pylint: disable=E0611
@@ -109,4 +110,6 @@ def get_run(
109
110
  request: GetRunRequest, state: State # pylint: disable=W0613
110
111
  ) -> GetRunResponse:
111
112
  """Get run information."""
112
- return GetRunResponse()
113
+ run_id, fab_id, fab_version = state.get_run(request.run_id)
114
+ run = Run(run_id=run_id, fab_id=fab_id, fab_version=fab_version)
115
+ return GetRunResponse(run=run)
@@ -36,7 +36,8 @@ class InMemoryState(State):
36
36
  def __init__(self) -> None:
37
37
  # Map node_id to (online_until, ping_interval)
38
38
  self.node_ids: Dict[int, Tuple[float, float]] = {}
39
- self.run_ids: Set[int] = set()
39
+ # Map run_id to (fab_id, fab_version)
40
+ self.run_ids: Dict[int, Tuple[str, str]] = {}
40
41
  self.task_ins_store: Dict[UUID, TaskIns] = {}
41
42
  self.task_res_store: Dict[UUID, TaskRes] = {}
42
43
  self.lock = threading.Lock()
@@ -238,18 +239,26 @@ class InMemoryState(State):
238
239
  if online_until > current_time
239
240
  }
240
241
 
241
- def create_run(self) -> int:
242
- """Create one run."""
242
+ def create_run(self, fab_id: str, fab_version: str) -> int:
243
+ """Create a new run for the specified `fab_id` and `fab_version`."""
243
244
  # Sample a random int64 as run_id
244
245
  with self.lock:
245
246
  run_id: int = int.from_bytes(os.urandom(8), "little", signed=True)
246
247
 
247
248
  if run_id not in self.run_ids:
248
- self.run_ids.add(run_id)
249
+ self.run_ids[run_id] = (fab_id, fab_version)
249
250
  return run_id
250
251
  log(ERROR, "Unexpected run creation failure.")
251
252
  return 0
252
253
 
254
+ def get_run(self, run_id: int) -> Tuple[int, str, str]:
255
+ """Retrieve information about the run with the specified `run_id`."""
256
+ with self.lock:
257
+ if run_id not in self.run_ids:
258
+ log(ERROR, "`run_id` is invalid")
259
+ return 0, "", ""
260
+ return run_id, *self.run_ids[run_id]
261
+
253
262
  def acknowledge_ping(self, node_id: int, ping_interval: float) -> bool:
254
263
  """Acknowledge a ping received from a node, serving as a heartbeat."""
255
264
  with self.lock:
@@ -46,7 +46,9 @@ CREATE INDEX IF NOT EXISTS idx_online_until ON node (online_until);
46
46
 
47
47
  SQL_CREATE_TABLE_RUN = """
48
48
  CREATE TABLE IF NOT EXISTS run(
49
- run_id INTEGER UNIQUE
49
+ run_id INTEGER UNIQUE,
50
+ fab_id TEXT,
51
+ fab_version TEXT
50
52
  );
51
53
  """
52
54
 
@@ -558,8 +560,8 @@ class SqliteState(State):
558
560
  result: Set[int] = {row["node_id"] for row in rows}
559
561
  return result
560
562
 
561
- def create_run(self) -> int:
562
- """Create one run and store it in state."""
563
+ def create_run(self, fab_id: str, fab_version: str) -> int:
564
+ """Create a new run for the specified `fab_id` and `fab_version`."""
563
565
  # Sample a random int64 as run_id
564
566
  run_id: int = int.from_bytes(os.urandom(8), "little", signed=True)
565
567
 
@@ -567,12 +569,22 @@ class SqliteState(State):
567
569
  query = "SELECT COUNT(*) FROM run WHERE run_id = ?;"
568
570
  # If run_id does not exist
569
571
  if self.query(query, (run_id,))[0]["COUNT(*)"] == 0:
570
- query = "INSERT INTO run VALUES(:run_id);"
571
- self.query(query, {"run_id": run_id})
572
+ query = "INSERT INTO run (run_id, fab_id, fab_version) VALUES (?, ?, ?);"
573
+ self.query(query, (run_id, fab_id, fab_version))
572
574
  return run_id
573
575
  log(ERROR, "Unexpected run creation failure.")
574
576
  return 0
575
577
 
578
+ def get_run(self, run_id: int) -> Tuple[int, str, str]:
579
+ """Retrieve information about the run with the specified `run_id`."""
580
+ query = "SELECT * FROM run WHERE run_id = ?;"
581
+ try:
582
+ row = self.query(query, (run_id,))[0]
583
+ return run_id, row["fab_id"], row["fab_version"]
584
+ except sqlite3.IntegrityError:
585
+ log(ERROR, "`run_id` does not exist.")
586
+ return 0, "", ""
587
+
576
588
  def acknowledge_ping(self, node_id: int, ping_interval: float) -> bool:
577
589
  """Acknowledge a ping received from a node, serving as a heartbeat."""
578
590
  # Update `online_until` and `ping_interval` for the given `node_id`
@@ -16,7 +16,7 @@
16
16
 
17
17
 
18
18
  import abc
19
- from typing import List, Optional, Set
19
+ from typing import List, Optional, Set, Tuple
20
20
  from uuid import UUID
21
21
 
22
22
  from flwr.proto.task_pb2 import TaskIns, TaskRes # pylint: disable=E0611
@@ -150,8 +150,26 @@ class State(abc.ABC):
150
150
  """
151
151
 
152
152
  @abc.abstractmethod
153
- def create_run(self) -> int:
154
- """Create one run."""
153
+ def create_run(self, fab_id: str, fab_version: str) -> int:
154
+ """Create a new run for the specified `fab_id` and `fab_version`."""
155
+
156
+ @abc.abstractmethod
157
+ def get_run(self, run_id: int) -> Tuple[int, str, str]:
158
+ """Retrieve information about the run with the specified `run_id`.
159
+
160
+ Parameters
161
+ ----------
162
+ run_id : int
163
+ The identifier of the run.
164
+
165
+ Returns
166
+ -------
167
+ Tuple[int, str, str]
168
+ A tuple containing three elements:
169
+ - `run_id`: The identifier of the run, same as the specified `run_id`.
170
+ - `fab_id`: The identifier of the FAB used in the specified run.
171
+ - `fab_version`: The version of the FAB used in the specified run.
172
+ """
155
173
 
156
174
  @abc.abstractmethod
157
175
  def acknowledge_ping(self, node_id: int, ping_interval: float) -> bool:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: flwr-nightly
3
- Version: 1.9.0.dev20240417
3
+ Version: 1.9.0.dev20240419
4
4
  Summary: Flower: A Friendly Federated Learning Framework
5
5
  Home-page: https://flower.ai
6
6
  License: Apache-2.0
@@ -1,21 +1,22 @@
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=38thPnMydBmNAxNE9mz4By-KdRUhJfoUgeDuAxMYF_U,1095
4
- flwr/cli/config_utils.py,sha256=fTKBxsXauE8JWdwTb8yLxOm69sAcURefoif-DGUDNII,4696
4
+ flwr/cli/config_utils.py,sha256=1wTPQqOU2fKeU4FP5KyG0xMa0F-qy8x1m2WvztPORb4,5597
5
5
  flwr/cli/example.py,sha256=1bGDYll3BXQY2kRqSN-oICqS5n1b9m0g0RvXTopXHl4,2215
6
6
  flwr/cli/new/__init__.py,sha256=cQzK1WH4JP2awef1t2UQ2xjl1agVEz9rwutV18SWV1k,789
7
- flwr/cli/new/new.py,sha256=raXLXtYfDG0XVcmHfDAvWN9Q5q65sC46SZ-1ICb9ChE,5240
7
+ flwr/cli/new/new.py,sha256=OHTOpuHRqmafsoV_Hv1V1544mZz54Z0qDRRtMT3dR-M,5380
8
8
  flwr/cli/new/templates/__init__.py,sha256=4luU8RL-CK8JJCstQ_ON809W9bNTkY1l9zSaPKBkgwY,725
9
+ flwr/cli/new/templates/app/.gitignore.tpl,sha256=XixnHdyeMB2vwkGtGnwHqoWpH-9WChdyG0GXe57duhc,3078
9
10
  flwr/cli/new/templates/app/README.md.tpl,sha256=_qGtgpKYKoCJVjQnvlBMKvFs_1gzTcL908I3KJg0oAM,668
10
11
  flwr/cli/new/templates/app/__init__.py,sha256=DU7QMY7IhMQyuwm_tja66xU0KXTWQFqzfTqwg-_NJdE,729
11
12
  flwr/cli/new/templates/app/code/__init__.py,sha256=EM6vfvgAILKPaPn7H1wMV1Wi01WyZCP_Eg6NxD6oWg8,736
12
13
  flwr/cli/new/templates/app/code/__init__.py.tpl,sha256=olwrBeJemHNBWvjc6gJURloFRqW40dAy7FRQA5pDqHU,21
13
14
  flwr/cli/new/templates/app/code/client.numpy.py.tpl,sha256=mTh7Y_jOJrPUvDYHVJy4wJCnjXZV_q-jlDkB07U5GSk,521
14
15
  flwr/cli/new/templates/app/code/client.pytorch.py.tpl,sha256=671daPcdZaC4Z5k-dqmCovfb2_FShGmqfjwaR8y6EC8,1173
15
- flwr/cli/new/templates/app/code/client.tensorflow.py.tpl,sha256=d6J5VM681d0j4hj1Duaj1WQyeFoyCiEZh4o4J8zH-_M,48
16
+ flwr/cli/new/templates/app/code/client.tensorflow.py.tpl,sha256=N9SbnI65r2K9FHV_wn4JSpmVeyYpD0qEMehbHcGm4t0,1911
16
17
  flwr/cli/new/templates/app/code/server.numpy.py.tpl,sha256=fRxrDXV7pB1aDhQUXMBmrCsC1zp0uKwsBxZBx1JzbHA,248
17
18
  flwr/cli/new/templates/app/code/server.pytorch.py.tpl,sha256=xtKvUivNMzgOcLSOtnjWouJzIFbXdUQVYMm27uwyJpI,594
18
- flwr/cli/new/templates/app/code/server.tensorflow.py.tpl,sha256=d6J5VM681d0j4hj1Duaj1WQyeFoyCiEZh4o4J8zH-_M,48
19
+ flwr/cli/new/templates/app/code/server.tensorflow.py.tpl,sha256=GUGH8c_6cxgUB9obVJPaA4thxI7OVXsItyfQDsn9E5k,371
19
20
  flwr/cli/new/templates/app/code/task.pytorch.py.tpl,sha256=NvajdZN-eTyfdqKK0v2MrvWITXw9BjJ3Ri5c1haPJDs,3684
20
21
  flwr/cli/new/templates/app/pyproject.numpy.toml.tpl,sha256=0oTH0lY7q-PpRV4HA5woxJ1eWIgZRFcFsHa7-1lULIQ,489
21
22
  flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl,sha256=GYbMAFD90JBRvy8fJbLU7nDITD3sxHv1TncQrg6mjEE,558
@@ -23,15 +24,15 @@ flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl,sha256=7I8BYtE28cnc7ZiO
23
24
  flwr/cli/run/__init__.py,sha256=oCd6HmQDx-sqver1gecgx-uMA38BLTSiiKpl7RGNceg,789
24
25
  flwr/cli/run/run.py,sha256=qxXgShEXHONx-Gjpl515HF60QzRA-Ygpj2sbl0bZUAA,2331
25
26
  flwr/cli/utils.py,sha256=33m5ELefA43VhJwtBHW5ntWkP7X5Tk_5A2s1OcaSBYg,4153
26
- flwr/client/__init__.py,sha256=futk_IdY_N1h8BTve4Iru51bxm7H1gv58ZPIXWi5XUA,1187
27
- flwr/client/app.py,sha256=B48cQa-kb_0WzdtufTXuaoEyrynGWMQCqxdUz_sAKek,26193
27
+ flwr/client/__init__.py,sha256=8LuIrd2GGWJXG2CFWihywicJtntIvCoPLssIUnHqZaA,1262
28
+ flwr/client/app.py,sha256=zs5yeFavIIX-407b25xLapVruprohKSB0Ckk0CjW1Vw,24670
28
29
  flwr/client/client.py,sha256=Vp9UkOkoHdNfn6iMYZsj_5m_GICiFfUlKEVaLad-YhM,8183
29
30
  flwr/client/client_app.py,sha256=-Cs0084tLQUoBCeYZdG2KgU7cjp95_ZJ4MfjoaN4Fzk,8636
30
31
  flwr/client/dpfedavg_numpy_client.py,sha256=9Tnig4iml2J88HBKNahegjXjbfvIQyBtaIQaqjbeqsA,7435
31
32
  flwr/client/grpc_client/__init__.py,sha256=LsnbqXiJhgQcB0XzAlUQgPx011Uf7Y7yabIC1HxivJ8,735
32
- flwr/client/grpc_client/connection.py,sha256=w3Lble9-eCzNOR7fBUsVedVCK4ui9QPhK7i7Ew_a5Vk,8717
33
+ flwr/client/grpc_client/connection.py,sha256=7MfyR6hEq3u46wK3s0vP3eubFq19pKZJCG3EFw_i4T4,8775
33
34
  flwr/client/grpc_rere_client/__init__.py,sha256=avn6W_vHEM_yZEB1S7hCZgnTbXb6ZujqRP_vAzyXu-0,752
34
- flwr/client/grpc_rere_client/connection.py,sha256=JaQIQYUJnmZHfqrGBxYZmEtyC-rUdCCaK1HrMcOXEig,8560
35
+ flwr/client/grpc_rere_client/connection.py,sha256=IEGkM0MymZ1tyL6yAL4ic5ZpGy_zg9bJBVf5KCSL2iY,9052
35
36
  flwr/client/heartbeat.py,sha256=cx37mJBH8LyoIN4Lks85wtqT1mnU5GulQnr4pGCvAq0,2404
36
37
  flwr/client/message_handler/__init__.py,sha256=abHvBRJJiiaAMNgeILQbMOa6h8WqMK2BcnvxwQZFpic,719
37
38
  flwr/client/message_handler/message_handler.py,sha256=ml_FlduAJ5pxO31n1tKRrWfQRSxkMgKLbwXXcRsNSos,6553
@@ -48,7 +49,9 @@ flwr/client/node_state.py,sha256=KTTs_l4I0jBM7IsSsbAGjhfL_yZC3QANbzyvyfZBRDM,177
48
49
  flwr/client/node_state_tests.py,sha256=gPwz0zf2iuDSa11jedkur_u3Xm7lokIDG5ALD2MCvSw,2195
49
50
  flwr/client/numpy_client.py,sha256=u76GWAdHmJM88Agm2EgLQSvO8Jnk225mJTk-_TmPjFE,10283
50
51
  flwr/client/rest_client/__init__.py,sha256=ThwOnkMdzxo_UuyTI47Q7y9oSpuTgNT2OuFvJCfuDiw,735
51
- flwr/client/rest_client/connection.py,sha256=rDLQlymPOZYT4cqOaw8sejlMhmlzyqJL-UrZqyWHv8s,14482
52
+ flwr/client/rest_client/connection.py,sha256=ZxTFVDXlONqKTX6uYgxshoEWqzqVcQ8QQ2hKS93oLM8,11302
53
+ flwr/client/supernode/__init__.py,sha256=D5swXxemuRbA2rB_T9B8LwJW-_PucXwmlFQQerwIUv0,793
54
+ flwr/client/supernode/app.py,sha256=JXRZ76JdyAkhfaEEqsMiONWVQ0bn8YqzZg9oHC4Qfko,3436
52
55
  flwr/client/typing.py,sha256=c9EvjlEjasxn1Wqx6bGl6Xg6vM1gMFfmXht-E2i5J-k,1006
53
56
  flwr/common/__init__.py,sha256=dHOptgKxna78CEQLD5Yu0QIsoSgpIIw5AhIUZCHDWAU,3721
54
57
  flwr/common/address.py,sha256=iTAN9jtmIGMrWFnx9XZQl45ZEtQJVZZLYPRBSNVARGI,1882
@@ -70,7 +73,7 @@ flwr/common/record/configsrecord.py,sha256=VKeFEYa6cneyStqQlUOaKj12by5ZI_NXYR25L
70
73
  flwr/common/record/conversion_utils.py,sha256=n3I3SI2P6hUjyxbWNc0QAch-SEhfMK6Hm-UUaplAlUc,1393
71
74
  flwr/common/record/metricsrecord.py,sha256=Yv99oRa3LzFgSfwl903S8sB8rAgr3Sv6i6ovW7pdHsA,3923
72
75
  flwr/common/record/parametersrecord.py,sha256=WSqtRrYvI-mRzkEwv5s-EG-yE5uizJ8zy9aczwRG-1E,4849
73
- flwr/common/record/recordset.py,sha256=o5UwLubotz1KE9HCoEIP5kK0f0dlIzpFpS1xeQvxo08,3016
76
+ flwr/common/record/recordset.py,sha256=o3cXGGEFYRqzO8AzYmFxf5cb4CZIkaw-_lSk4kfTg0Q,4553
74
77
  flwr/common/record/typeddict.py,sha256=2NW8JF27p1uNWaqDbJ7bMkItA5x4ygYT8aHrf8NaqnE,3879
75
78
  flwr/common/recordset_compat.py,sha256=BjxeuvlCaP94yIiKOyFFTRBUH_lprFWSLo8U8q3BDbs,13798
76
79
  flwr/common/retry_invoker.py,sha256=dQY5fPIKhy9OiFswZhLxA9fB455u-DYCvDVcFJmrPDk,11707
@@ -83,7 +86,7 @@ flwr/common/secure_aggregation/quantization.py,sha256=appui7GGrkRPsupF59TkapeV4N
83
86
  flwr/common/secure_aggregation/secaggplus_constants.py,sha256=Fh7-n6pgL4TUnHpNYXo8iW-n5cOGQgQa-c7RcU80tqQ,2183
84
87
  flwr/common/secure_aggregation/secaggplus_utils.py,sha256=87bNZX6CmQekj935R4u3m5hsaEkkfKtGSA-VG2c-O9w,3221
85
88
  flwr/common/serde.py,sha256=Yn83kbSf9vJndTa5ldL4DR_bL_wy_bD4lTlD3ZbB658,22250
86
- flwr/common/telemetry.py,sha256=JkFB6WBOskqAJfzSM-l6tQfRiSi2oiysClfg0-5T7NY,7782
89
+ flwr/common/telemetry.py,sha256=Q84hW6l6MCtD8sgQI4sUcp-N-zqAo607jyApeXC5RpM,7865
87
90
  flwr/common/typing.py,sha256=3Wu6Ol1Ja6Gb0WdlcXVEn1EHYJbc4oRRJA81vEegxBo,4382
88
91
  flwr/common/version.py,sha256=_RDSMGZPEuGKYViZuXPotDtXMvh4iyDH9XOCO4qtPO8,666
89
92
  flwr/proto/__init__.py,sha256=hbY7JYakwZwCkYgCNlmHdc8rtvfoJbAZLalMdc--CGc,683
@@ -117,7 +120,7 @@ flwr/proto/transport_pb2_grpc.py,sha256=vLN3EHtx2aEEMCO4f1Upu-l27BPzd3-5pV-u8wPc
117
120
  flwr/proto/transport_pb2_grpc.pyi,sha256=AGXf8RiIiW2J5IKMlm_3qT3AzcDa4F3P5IqUjve_esA,766
118
121
  flwr/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
119
122
  flwr/server/__init__.py,sha256=dNLbXIERZ6X9aA_Bit3R9AARwcaZZzEfDuFmEx8VVOE,1785
120
- flwr/server/app.py,sha256=8rQMxWg3RprQb_ttPK45TumhZPrk6w4EBACxWO4Na8Q,24302
123
+ flwr/server/app.py,sha256=FriloRrkDHTlB5G7EBn6sH4v5GhiYFf_ZhbdROgjKbY,24199
121
124
  flwr/server/client_manager.py,sha256=T8UDSRJBVD3fyIDI7NTAA-NA7GPrMNNgH2OAF54RRxE,6127
122
125
  flwr/server/client_proxy.py,sha256=4G-oTwhb45sfWLx2uZdcXD98IZwdTS6F88xe3akCdUg,2399
123
126
  flwr/server/compat/__init__.py,sha256=VxnJtJyOjNFQXMNi9hIuzNlZM5n0Hj1p3aq_Pm2udw4,892
@@ -127,6 +130,7 @@ flwr/server/compat/driver_client_proxy.py,sha256=QWLl5YJwI6NVADwjQGQJqkLtCfPNT-a
127
130
  flwr/server/compat/legacy_context.py,sha256=D2s7PvQoDnTexuRmf1uG9Von7GUj4Qqyr7qLklSlKAM,1766
128
131
  flwr/server/criterion.py,sha256=ypbAexbztzGUxNen9RCHF91QeqiEQix4t4Ih3E-42MM,1061
129
132
  flwr/server/driver/__init__.py,sha256=yYyVX1FcDiDFM6rw0-DSZpuRy0EoWRfG9puwlQUswFA,820
133
+ flwr/server/driver/abc_driver.py,sha256=t9SSSDlo9wT_y2Nl7waGYMTm2VlkvK3_bOb7ggPPlho,5090
130
134
  flwr/server/driver/driver.py,sha256=AwAxgYRx-FI6NvI5ukmdGlEmQRyp5GZSElFnDZhelj8,10106
131
135
  flwr/server/driver/grpc_driver.py,sha256=D2n3_Es_DHFgQsq_TjYVEz8RYJJJYoe24E1vozaTFiE,4586
132
136
  flwr/server/history.py,sha256=hDsoBaA4kUa6d1yvDVXuLluBqOBKSm0_fVDtUtYJkmg,5121
@@ -161,7 +165,7 @@ flwr/server/strategy/strategy.py,sha256=g6VoIFogEviRub6G4QsKdIp6M_Ek6GhBhqcdNx5u
161
165
  flwr/server/superlink/__init__.py,sha256=8tHYCfodUlRD8PCP9fHgvu8cz5N31A2QoRVL0jDJ15E,707
162
166
  flwr/server/superlink/driver/__init__.py,sha256=STB1_DASVEg7Cu6L7VYxTzV7UMkgtBkFim09Z82Dh8I,712
163
167
  flwr/server/superlink/driver/driver_grpc.py,sha256=1qSGDs1k_OVPWxp2ofxvQgtYXExrMeC3N_rNPVWH65M,1932
164
- flwr/server/superlink/driver/driver_servicer.py,sha256=Cu6c7pohrqFy7KNMtNbaJGc-JW0UYSABRGJJJIyfPaA,4761
168
+ flwr/server/superlink/driver/driver_servicer.py,sha256=IKx3rC8s2193iCJxLEc_njndTtidkVM7Vk-RWjGngl0,4780
165
169
  flwr/server/superlink/fleet/__init__.py,sha256=C6GCSD5eP5Of6_dIeSe1jx9HnV0icsvWyQ5EKAUHJRU,711
166
170
  flwr/server/superlink/fleet/grpc_bidi/__init__.py,sha256=mgGJGjwT6VU7ovC1gdnnqttjyBPlNIcZnYRqx4K3IBQ,735
167
171
  flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py,sha256=57b3UL5-baGdLwgCtB0dCUTTSbmmfMAXcXV5bjPZNWQ,5993
@@ -171,7 +175,7 @@ flwr/server/superlink/fleet/grpc_bidi/grpc_server.py,sha256=1QyBX5qcFPjMVlv7Trvn
171
175
  flwr/server/superlink/fleet/grpc_rere/__init__.py,sha256=bEJOMWbSlqkw-y5ZHtEXczhoSlAxErcRYffmTMQAV8M,758
172
176
  flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py,sha256=YGn1IPpuX-6NDgaG1UbyREbI9iAyKDimZuNeWxbG6s0,3387
173
177
  flwr/server/superlink/fleet/message_handler/__init__.py,sha256=hEY0l61ojH8Iz30_K1btm1HJ6J49iZJSFUsVYqUTw3A,731
174
- flwr/server/superlink/fleet/message_handler/message_handler.py,sha256=NfhM-xgIhKqcD2pOkZqwv-zbAB999uVYCjYPtWzo9u4,3473
178
+ flwr/server/superlink/fleet/message_handler/message_handler.py,sha256=lG3BkiONcikDVowK0An06V7p2SNkwGbWE5hfN2xlsZw,3622
175
179
  flwr/server/superlink/fleet/rest_rere/__init__.py,sha256=VKDvDq5H8koOUztpmQacVzGJXPLEEkL1Vmolxt3mvnY,735
176
180
  flwr/server/superlink/fleet/rest_rere/rest_api.py,sha256=8gNziOjBA8ygTzfVPYiNkg_qxr-T822Q_Lbo9g2tVyk,7621
177
181
  flwr/server/superlink/fleet/vce/__init__.py,sha256=36MHKiefnJeyjwMQzVUK4m06Ojon3WDcwZGQsAcyVhQ,783
@@ -180,9 +184,9 @@ flwr/server/superlink/fleet/vce/backend/backend.py,sha256=LJsKl7oixVvptcG98Rd9ej
180
184
  flwr/server/superlink/fleet/vce/backend/raybackend.py,sha256=TaT2EpbVEsIY0EDzF8obadyZaSXjD38TFGdDPI-ytD0,6375
181
185
  flwr/server/superlink/fleet/vce/vce_api.py,sha256=c2J2m6v1jDyuAhiBArdZNIk4cbiZNFJkpKlBJFEQq-c,12454
182
186
  flwr/server/superlink/state/__init__.py,sha256=ij-7Ms-hyordQdRmGQxY1-nVa4OhixJ0jr7_YDkys0s,1003
183
- flwr/server/superlink/state/in_memory_state.py,sha256=lZPoAwyZE0LcKgef8rFa5dzekIhs2q_TPGv7iddJNKI,9586
184
- flwr/server/superlink/state/sqlite_state.py,sha256=z2jF0UV0VMsVyVIpT_7v13ji6wuFJSmyNbYZhxwelbE,23985
185
- flwr/server/superlink/state/state.py,sha256=1cboTXmRGu3r4ebdNby-Ht3qVwAfLgc563YF6awvPSw,6058
187
+ flwr/server/superlink/state/in_memory_state.py,sha256=OXpTb7ER7fnI55cFmcux2cLN6U_ACYjmRHkhYVHW2Ww,10083
188
+ flwr/server/superlink/state/sqlite_state.py,sha256=xDyvtuInAsLq65czbqLrLOv4ec61XxH_FhW_Q2NXrgM,24580
189
+ flwr/server/superlink/state/state.py,sha256=AsORTtR5Y5sRpxKPG0iueWOvnY0uISXgpAsyPSMgZXY,6762
186
190
  flwr/server/superlink/state/state_factory.py,sha256=91cSB-KOAFM37z7T098WxTkVeKNaAZ_mTI75snn2_tk,1654
187
191
  flwr/server/superlink/state/utils.py,sha256=qhIjBu5_rqm9GLMB6QS5TIRrMDVs85lmY17BqZ1ccLk,2207
188
192
  flwr/server/typing.py,sha256=2zSG-KuDAgwFPuzgVjTLDaEqJ8gXXGqFR2RD-qIk730,913
@@ -202,8 +206,8 @@ flwr/simulation/ray_transport/ray_actor.py,sha256=_wv2eP7qxkCZ-6rMyYWnjLrGPBZRxj
202
206
  flwr/simulation/ray_transport/ray_client_proxy.py,sha256=oDu4sEPIOu39vrNi-fqDAe10xtNUXMO49bM2RWfRcyw,6738
203
207
  flwr/simulation/ray_transport/utils.py,sha256=TYdtfg1P9VfTdLMOJlifInGpxWHYs9UfUqIv2wfkRLA,2392
204
208
  flwr/simulation/run_simulation.py,sha256=HiIH6aa_v56NfKQN5ZBd94NyVfaZNyFs43_kItYsQXU,15685
205
- flwr_nightly-1.9.0.dev20240417.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
206
- flwr_nightly-1.9.0.dev20240417.dist-info/METADATA,sha256=6gwoKexzP8jcUYS-mCm47XnZsuPhO06R1b-vqBipQCM,15260
207
- flwr_nightly-1.9.0.dev20240417.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
208
- flwr_nightly-1.9.0.dev20240417.dist-info/entry_points.txt,sha256=utu2wybGyYJSTtsB2ktY_gmy-XtMFo9EFZdishX0zR4,320
209
- flwr_nightly-1.9.0.dev20240417.dist-info/RECORD,,
209
+ flwr_nightly-1.9.0.dev20240419.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
210
+ flwr_nightly-1.9.0.dev20240419.dist-info/METADATA,sha256=W3tyRxj4LXms8QbNvSBIspZOouKU5DIz-UZ-UAiOsYw,15260
211
+ flwr_nightly-1.9.0.dev20240419.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
212
+ flwr_nightly-1.9.0.dev20240419.dist-info/entry_points.txt,sha256=DBrrf685V2W9NbbchQwvuqBEpj5ik8tMZNoZg_W2bZY,363
213
+ flwr_nightly-1.9.0.dev20240419.dist-info/RECORD,,
@@ -5,5 +5,6 @@ flower-fleet-api=flwr.server:run_fleet_api
5
5
  flower-server-app=flwr.server:run_server_app
6
6
  flower-simulation=flwr.simulation:run_simulation_from_cli
7
7
  flower-superlink=flwr.server:run_superlink
8
+ flower-supernode=flwr.client:run_supernode
8
9
  flwr=flwr.cli.app:app
9
10