flwr-nightly 1.19.0.dev20250604__py3-none-any.whl → 1.19.0.dev20250606__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.
@@ -31,11 +31,17 @@ from flwr.common.constant import HEARTBEAT_CALL_TIMEOUT, HEARTBEAT_DEFAULT_INTER
31
31
  from flwr.common.grpc import create_channel, on_channel_state_change
32
32
  from flwr.common.heartbeat import HeartbeatSender
33
33
  from flwr.common.inflatable_grpc_utils import (
34
+ make_pull_object_fn_grpc,
35
+ make_push_object_fn_grpc,
34
36
  pull_object_from_servicer,
35
37
  push_object_to_servicer,
36
38
  )
37
39
  from flwr.common.logger import log
38
- from flwr.common.message import Message, get_message_to_descendant_id_mapping
40
+ from flwr.common.message import (
41
+ Message,
42
+ get_message_to_descendant_id_mapping,
43
+ remove_content_from_message,
44
+ )
39
45
  from flwr.common.retry_invoker import RetryInvoker, _wrap_stub
40
46
  from flwr.common.secure_aggregation.crypto.symmetric_encryption import (
41
47
  generate_key_pairs,
@@ -265,9 +271,11 @@ def grpc_request_response( # pylint: disable=R0913,R0914,R0915,R0917
265
271
  Message,
266
272
  pull_object_from_servicer(
267
273
  object_id=message_proto.metadata.message_id,
268
- stub=stub,
269
- node=node,
270
- run_id=message_proto.metadata.run_id,
274
+ pull_object_fn=make_pull_object_fn_grpc(
275
+ pull_object_grpc=stub.PullObject,
276
+ node=node,
277
+ run_id=message_proto.metadata.run_id,
278
+ ),
271
279
  ),
272
280
  )
273
281
 
@@ -305,7 +313,7 @@ def grpc_request_response( # pylint: disable=R0913,R0914,R0915,R0917
305
313
  return
306
314
 
307
315
  # Serialize Message
308
- message_proto = message_to_proto(message=message)
316
+ message_proto = message_to_proto(message=remove_content_from_message(message))
309
317
  descendants_mapping = get_message_to_descendant_id_mapping(message)
310
318
  request = PushMessagesRequest(
311
319
  node=node,
@@ -318,9 +326,11 @@ def grpc_request_response( # pylint: disable=R0913,R0914,R0915,R0917
318
326
  objs_to_push = set(response.objects_to_push[message.object_id].object_ids)
319
327
  push_object_to_servicer(
320
328
  message,
321
- stub,
322
- node,
323
- run_id=message.metadata.run_id,
329
+ push_object_fn=make_push_object_fn_grpc(
330
+ push_object_grpc=stub.PushObject,
331
+ node=node,
332
+ run_id=message.metadata.run_id,
333
+ ),
324
334
  object_ids_to_push=objs_to_push,
325
335
  )
326
336
  log(DEBUG, "Pushed %s objects to servicer.", len(objs_to_push))
@@ -16,10 +16,8 @@
16
16
 
17
17
 
18
18
  from time import sleep
19
- from typing import Optional, Union
19
+ from typing import Callable, Optional
20
20
 
21
- from flwr.client.grpc_rere_client.grpc_adapter import GrpcAdapter
22
- from flwr.proto.fleet_pb2_grpc import FleetStub # pylint: disable=E0611
23
21
  from flwr.proto.message_pb2 import ( # pylint: disable=E0611
24
22
  PullObjectRequest,
25
23
  PullObjectResponse,
@@ -27,7 +25,6 @@ from flwr.proto.message_pb2 import ( # pylint: disable=E0611
27
25
  PushObjectResponse,
28
26
  )
29
27
  from flwr.proto.node_pb2 import Node # pylint: disable=E0611
30
- from flwr.proto.serverappio_pb2_grpc import ServerAppIoStub # pylint: disable=E0611
31
28
 
32
29
  from .inflatable import (
33
30
  InflatableObject,
@@ -48,11 +45,24 @@ inflatable_class_registry: dict[str, type[InflatableObject]] = {
48
45
  }
49
46
 
50
47
 
48
+ class ObjectUnavailableError(Exception):
49
+ """Exception raised when an object has been pre-registered but is not yet
50
+ available."""
51
+
52
+ def __init__(self, object_id: str):
53
+ super().__init__(f"Object with ID '{object_id}' is not yet available.")
54
+
55
+
56
+ class ObjectIdNotPreregisteredError(Exception):
57
+ """Exception raised when an object ID is not pre-registered."""
58
+
59
+ def __init__(self, object_id: str):
60
+ super().__init__(f"Object with ID '{object_id}' could not be found.")
61
+
62
+
51
63
  def push_object_to_servicer(
52
64
  obj: InflatableObject,
53
- stub: Union[FleetStub, ServerAppIoStub, GrpcAdapter],
54
- node: Node,
55
- run_id: int,
65
+ push_object_fn: Callable[[str, bytes], None],
56
66
  object_ids_to_push: Optional[set[str]] = None,
57
67
  ) -> set[str]:
58
68
  """Recursively deflate an object and push it to the servicer.
@@ -60,13 +70,30 @@ def push_object_to_servicer(
60
70
  Objects with the same ID are not pushed twice. If `object_ids_to_push` is set,
61
71
  only objects with those IDs are pushed. It returns the set of pushed object
62
72
  IDs.
73
+
74
+ Parameters
75
+ ----------
76
+ obj : InflatableObject
77
+ The object to push.
78
+ push_object_fn : Callable[[str, bytes], None]
79
+ A function that takes an object ID and its content as bytes, and pushes
80
+ it to the servicer. This function should raise `ObjectIdNotPreregisteredError`
81
+ if the object ID is not pre-registered.
82
+ object_ids_to_push : Optional[set[str]] (default: None)
83
+ A set of object IDs to push. If object ID of the given object is not in this
84
+ set, the object will not be pushed.
85
+
86
+ Returns
87
+ -------
88
+ set[str]
89
+ A set of object IDs that were pushed to the servicer.
63
90
  """
64
91
  pushed_object_ids: set[str] = set()
65
92
  # Push children if it has any
66
93
  if children := obj.children:
67
94
  for child in children.values():
68
95
  pushed_object_ids |= push_object_to_servicer(
69
- child, stub, node, run_id, object_ids_to_push
96
+ child, push_object_fn, object_ids_to_push
70
97
  )
71
98
 
72
99
  # Deflate object and push
@@ -74,14 +101,8 @@ def push_object_to_servicer(
74
101
  object_id = get_object_id(object_content)
75
102
  # Push always if no object set is specified, or if the object is in the set
76
103
  if object_ids_to_push is None or object_id in object_ids_to_push:
77
- _: PushObjectResponse = stub.PushObject(
78
- PushObjectRequest(
79
- node=node,
80
- run_id=run_id,
81
- object_id=object_id,
82
- object_content=object_content,
83
- )
84
- )
104
+ # The function may raise an error if the object ID is not pre-registered
105
+ push_object_fn(object_id, object_content)
85
106
  pushed_object_ids.add(object_id)
86
107
 
87
108
  return pushed_object_ids
@@ -89,20 +110,33 @@ def push_object_to_servicer(
89
110
 
90
111
  def pull_object_from_servicer(
91
112
  object_id: str,
92
- stub: Union[FleetStub, ServerAppIoStub, GrpcAdapter],
93
- node: Node,
94
- run_id: int,
113
+ pull_object_fn: Callable[[str], bytes],
95
114
  ) -> InflatableObject:
96
- """Recursively inflate an object by pulling it from the servicer."""
115
+ """Recursively inflate an object by pulling it from the servicer.
116
+
117
+ Parameters
118
+ ----------
119
+ object_id : str
120
+ The ID of the object to pull.
121
+ pull_object_fn : Callable[[str], bytes]
122
+ A function that takes an object ID and returns the object content as bytes.
123
+ The function should raise `ObjectUnavailableError` if the object is not yet
124
+ available, or `ObjectIdNotPreregisteredError` if the object ID is not
125
+ pre-registered.
126
+
127
+ Returns
128
+ -------
129
+ InflatableObject
130
+ The pulled object.
131
+ """
97
132
  # Pull object
98
- object_available = False
99
- while not object_available:
100
- object_proto: PullObjectResponse = stub.PullObject(
101
- PullObjectRequest(node=node, run_id=run_id, object_id=object_id)
102
- )
103
- object_available = object_proto.object_available
104
- object_content = object_proto.object_content
105
- sleep(0.1)
133
+ while True:
134
+ try:
135
+ # The function may raise an error if the object ID is not pre-registered
136
+ object_content: bytes = pull_object_fn(object_id)
137
+ break # Exit loop if object is successfully pulled
138
+ except ObjectUnavailableError:
139
+ sleep(0.1) # Retry after a short delay
106
140
 
107
141
  # Extract object class and object_ids of children
108
142
  obj_type, children_obj_ids, _ = get_object_head_values_from_object_content(
@@ -115,8 +149,79 @@ def pull_object_from_servicer(
115
149
  children: dict[str, InflatableObject] = {}
116
150
  for child_object_id in children_obj_ids:
117
151
  children[child_object_id] = pull_object_from_servicer(
118
- child_object_id, stub, node, run_id
152
+ child_object_id, pull_object_fn
119
153
  )
120
154
 
121
155
  # Inflate object passing its children
122
156
  return cls_type.inflate(object_content, children=children)
157
+
158
+
159
+ def make_pull_object_fn_grpc(
160
+ pull_object_grpc: Callable[[PullObjectRequest], PullObjectResponse],
161
+ node: Node,
162
+ run_id: int,
163
+ ) -> Callable[[str], bytes]:
164
+ """Create a pull object function that uses gRPC to pull objects.
165
+
166
+ Parameters
167
+ ----------
168
+ pull_object_grpc : Callable[[PullObjectRequest], PullObjectResponse]
169
+ The gRPC function to pull objects, e.g., `FleetStub.PullObject`.
170
+ node : Node
171
+ The node making the request.
172
+ run_id : int
173
+ The run ID for the current operation.
174
+
175
+ Returns
176
+ -------
177
+ Callable[[str], bytes]
178
+ A function that takes an object ID and returns the object content as bytes.
179
+ The function raises `ObjectIdNotPreregisteredError` if the object ID is not
180
+ pre-registered, or `ObjectUnavailableError` if the object is not yet available.
181
+ """
182
+
183
+ def pull_object_fn(object_id: str) -> bytes:
184
+ request = PullObjectRequest(node=node, run_id=run_id, object_id=object_id)
185
+ response: PullObjectResponse = pull_object_grpc(request)
186
+ if not response.object_found:
187
+ raise ObjectIdNotPreregisteredError(object_id)
188
+ if not response.object_available:
189
+ raise ObjectUnavailableError(object_id)
190
+ return response.object_content
191
+
192
+ return pull_object_fn
193
+
194
+
195
+ def make_push_object_fn_grpc(
196
+ push_object_grpc: Callable[[PushObjectRequest], PushObjectResponse],
197
+ node: Node,
198
+ run_id: int,
199
+ ) -> Callable[[str, bytes], None]:
200
+ """Create a push object function that uses gRPC to push objects.
201
+
202
+ Parameters
203
+ ----------
204
+ push_object_grpc : Callable[[PushObjectRequest], PushObjectResponse]
205
+ The gRPC function to push objects, e.g., `FleetStub.PushObject`.
206
+ node : Node
207
+ The node making the request.
208
+ run_id : int
209
+ The run ID for the current operation.
210
+
211
+ Returns
212
+ -------
213
+ Callable[[str, bytes], None]
214
+ A function that takes an object ID and its content as bytes, and pushes it
215
+ to the servicer. The function raises `ObjectIdNotPreregisteredError` if
216
+ the object ID is not pre-registered.
217
+ """
218
+
219
+ def push_object_fn(object_id: str, object_content: bytes) -> None:
220
+ request = PushObjectRequest(
221
+ node=node, run_id=run_id, object_id=object_id, object_content=object_content
222
+ )
223
+ response: PushObjectResponse = push_object_grpc(request)
224
+ if not response.stored:
225
+ raise ObjectIdNotPreregisteredError(object_id)
226
+
227
+ return push_object_fn
flwr/common/message.py CHANGED
@@ -426,6 +426,17 @@ def make_message(
426
426
  return Message(metadata=metadata, content=content, error=error) # type: ignore
427
427
 
428
428
 
429
+ def remove_content_from_message(message: Message) -> Message:
430
+ """Return a copy of the Message but with an empty RecordDict as content.
431
+
432
+ If message has no content, it returns itself.
433
+ """
434
+ if message.has_error():
435
+ return message
436
+
437
+ return make_message(metadata=message.metadata, content=RecordDict())
438
+
439
+
429
440
  def _limit_reply_ttl(
430
441
  current: float, reply_ttl: float | None, reply_to: Message
431
442
  ) -> float:
@@ -16,6 +16,7 @@
16
16
 
17
17
 
18
18
  import threading
19
+ from typing import Any, Callable
19
20
 
20
21
  from flwr.common.typing import RunNotRunningException
21
22
 
@@ -80,36 +81,57 @@ def _update_client_manager(
80
81
  """Update the nodes list in the client manager."""
81
82
  # Loop until the grid is disconnected
82
83
  registered_nodes: dict[int, GridClientProxy] = {}
84
+ lock = threading.RLock()
85
+
86
+ def update_registered_nodes() -> None:
87
+ with lock:
88
+ all_node_ids = set(grid.get_node_ids())
89
+ dead_nodes = set(registered_nodes).difference(all_node_ids)
90
+ new_nodes = all_node_ids.difference(registered_nodes)
91
+
92
+ # Unregister dead nodes
93
+ for node_id in dead_nodes:
94
+ client_proxy = registered_nodes[node_id]
95
+ client_manager.unregister(client_proxy)
96
+ del registered_nodes[node_id]
97
+
98
+ # Register new nodes
99
+ for node_id in new_nodes:
100
+ client_proxy = GridClientProxy(
101
+ node_id=node_id,
102
+ grid=grid,
103
+ run_id=grid.run.run_id,
104
+ )
105
+ if client_manager.register(client_proxy):
106
+ registered_nodes[node_id] = client_proxy
107
+ else:
108
+ raise RuntimeError("Could not register node.")
109
+
110
+ # Get the wrapped method of ClientManager instance
111
+ def get_wrapped_method(method_name: str) -> Callable[..., Any]:
112
+ original_method = getattr(client_manager, method_name)
113
+
114
+ def wrapped_method(*args: Any, **kwargs: Any) -> Any:
115
+ # Update registered nodes before calling the original method
116
+ update_registered_nodes()
117
+ return original_method(*args, **kwargs)
118
+
119
+ return wrapped_method
120
+
121
+ # Wrap the ClientManager
122
+ for method_name in ["num_available", "all", "sample"]:
123
+ setattr(client_manager, method_name, get_wrapped_method(method_name))
124
+
125
+ c_done.set()
126
+
83
127
  while not f_stop.is_set():
128
+ # Sleep for 5 seconds
129
+ if not f_stop.is_set():
130
+ f_stop.wait(5)
131
+
84
132
  try:
85
- all_node_ids = set(grid.get_node_ids())
133
+ # Update registered nodes
134
+ update_registered_nodes()
86
135
  except RunNotRunningException:
87
136
  f_stop.set()
88
137
  break
89
- dead_nodes = set(registered_nodes).difference(all_node_ids)
90
- new_nodes = all_node_ids.difference(registered_nodes)
91
-
92
- # Unregister dead nodes
93
- for node_id in dead_nodes:
94
- client_proxy = registered_nodes[node_id]
95
- client_manager.unregister(client_proxy)
96
- del registered_nodes[node_id]
97
-
98
- # Register new nodes
99
- for node_id in new_nodes:
100
- client_proxy = GridClientProxy(
101
- node_id=node_id,
102
- grid=grid,
103
- run_id=grid.run.run_id,
104
- )
105
- if client_manager.register(client_proxy):
106
- registered_nodes[node_id] = client_proxy
107
- else:
108
- raise RuntimeError("Could not register node.")
109
-
110
- # Flag first pass for nodes registration is completed
111
- c_done.set()
112
-
113
- # Sleep for 3 seconds
114
- if not f_stop.is_set():
115
- f_stop.wait(3)
@@ -29,11 +29,16 @@ from flwr.common.constant import (
29
29
  )
30
30
  from flwr.common.grpc import create_channel, on_channel_state_change
31
31
  from flwr.common.inflatable_grpc_utils import (
32
+ make_pull_object_fn_grpc,
33
+ make_push_object_fn_grpc,
32
34
  pull_object_from_servicer,
33
35
  push_object_to_servicer,
34
36
  )
35
37
  from flwr.common.logger import log, warn_deprecated_feature
36
- from flwr.common.message import get_message_to_descendant_id_mapping
38
+ from flwr.common.message import (
39
+ get_message_to_descendant_id_mapping,
40
+ remove_content_from_message,
41
+ )
37
42
  from flwr.common.retry_invoker import _make_simple_grpc_retry_invoker, _wrap_stub
38
43
  from flwr.common.serde import message_to_proto, run_from_proto
39
44
  from flwr.common.typing import Run
@@ -210,7 +215,7 @@ class GrpcGrid(Grid):
210
215
  # Call GrpcServerAppIoStub method
211
216
  res: PushInsMessagesResponse = self._stub.PushMessages(
212
217
  PushInsMessagesRequest(
213
- messages_list=[message_to_proto(message)],
218
+ messages_list=[message_to_proto(remove_content_from_message(message))],
214
219
  run_id=run_id,
215
220
  msg_to_descendant_mapping=descendants_mapping,
216
221
  )
@@ -224,9 +229,11 @@ class GrpcGrid(Grid):
224
229
  # Push only object that are not in the store
225
230
  push_object_to_servicer(
226
231
  message,
227
- self._stub,
228
- node=self.node,
229
- run_id=run_id,
232
+ push_object_fn=make_push_object_fn_grpc(
233
+ push_object_grpc=self._stub.PushObject,
234
+ node=self.node,
235
+ run_id=run_id,
236
+ ),
230
237
  object_ids_to_push=obj_ids_to_push,
231
238
  )
232
239
  return msg_id
@@ -289,9 +296,11 @@ class GrpcGrid(Grid):
289
296
 
290
297
  message = pull_object_from_servicer(
291
298
  msg_proto.metadata.message_id,
292
- self._stub,
293
- node=self.node,
294
- run_id=run_id,
299
+ pull_object_fn=make_pull_object_fn_grpc(
300
+ pull_object_grpc=self._stub.PullObject,
301
+ node=self.node,
302
+ run_id=run_id,
303
+ ),
295
304
  )
296
305
  inflated_msgs.append(cast(Message, message))
297
306
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: flwr-nightly
3
- Version: 1.19.0.dev20250604
3
+ Version: 1.19.0.dev20250606
4
4
  Summary: Flower: A Friendly Federated AI Framework
5
5
  License: Apache-2.0
6
6
  Keywords: Artificial Intelligence,Federated AI,Federated Analytics,Federated Evaluation,Federated Learning,Flower,Machine Learning
@@ -84,7 +84,7 @@ flwr/client/grpc_adapter_client/__init__.py,sha256=RQWP5mFPROLHKgombiRvPXVWSoVrQ
84
84
  flwr/client/grpc_adapter_client/connection.py,sha256=aj5tTYyE8z2hQLXPPydsJiz8gBDIWLUhfWvqYkAL1L4,3966
85
85
  flwr/client/grpc_rere_client/__init__.py,sha256=i7iS0Lt8B7q0E2L72e4F_YrKm6ClRKnd71PNA6PW2O0,752
86
86
  flwr/client/grpc_rere_client/client_interceptor.py,sha256=zFaVHw6AxeNO-7eCKKb-RxrPa7zbM5Z-2-1Efc4adQY,2451
87
- flwr/client/grpc_rere_client/connection.py,sha256=kjnbUNLNz3fn-79fOQ-EDPIkzK8W0GckYIUkvWCXDD0,13283
87
+ flwr/client/grpc_rere_client/connection.py,sha256=6LF9JuAhL4XDHVtPS6MzEYm-Nrer-5iM7fEjR5XaGzM,13658
88
88
  flwr/client/grpc_rere_client/grpc_adapter.py,sha256=JvMZ7vCFTaTEo6AzKYh3zDmeQAU7VSjdysbC6t3ufWg,6351
89
89
  flwr/client/message_handler/__init__.py,sha256=0lyljDVqre3WljiZbPcwCCf8GiIaSVI_yo_ylEyPwSE,719
90
90
  flwr/client/message_handler/message_handler.py,sha256=X9SXX6et97Lw9_DGD93HKsEBGNjXClcFgc_5aLK0oiU,6541
@@ -123,9 +123,9 @@ flwr/common/exit_handlers.py,sha256=IaqJ60fXZuu7McaRYnoYKtlbH9t4Yl9goNExKqtmQbs,
123
123
  flwr/common/grpc.py,sha256=manTaHaPiyYngUq1ErZvvV2B2GxlXUUUGRy3jc3TBIQ,9798
124
124
  flwr/common/heartbeat.py,sha256=SyEpNDnmJ0lni0cWO67rcoJVKasCLmkNHm3dKLeNrLU,5749
125
125
  flwr/common/inflatable.py,sha256=9yPsSFOfNM2OIb15JQ6-wY5kblwXiC5zNX-tsp2ZwW0,7017
126
- flwr/common/inflatable_grpc_utils.py,sha256=YGP8oJRfnkwvY6segWH1DUf_ljDIkku7-2zH66tv3HA,4337
126
+ flwr/common/inflatable_grpc_utils.py,sha256=3M3_334GM-BrjLysilPXEbkDAErh_dXVgkcmcFSQYWg,8017
127
127
  flwr/common/logger.py,sha256=JbRf6E2vQxXzpDBq1T8IDUJo_usu3gjWEBPQ6uKcmdg,13049
128
- flwr/common/message.py,sha256=HfSeqxwXgf90ilbMlM0vrF4cJWqJVx3jJ0gNmTfgdFw,19628
128
+ flwr/common/message.py,sha256=ZdH35PznYhIzfNKPzHTL1YS5z-flTpHnjdNpQR6B8x0,19953
129
129
  flwr/common/object_ref.py,sha256=p3SfTeqo3Aj16SkB-vsnNn01zswOPdGNBitcbRnqmUk,9134
130
130
  flwr/common/parameter.py,sha256=UVw6sOgehEFhFs4uUCMl2kfVq1PD6ncmWgPLMsZPKPE,2095
131
131
  flwr/common/pyproject.py,sha256=2SU6yJW7059SbMXgzjOdK1GZRWO6AixDH7BmdxbMvHI,1386
@@ -229,14 +229,14 @@ flwr/server/client_manager.py,sha256=5jCGavVli7XdupvWWo7ru3PdFTlRU8IGvHFSSoUVLRs
229
229
  flwr/server/client_proxy.py,sha256=sv0E9AldBYOvc3pusqFh-GnyreeMfsXQ1cuTtxTq_wY,2399
230
230
  flwr/server/compat/__init__.py,sha256=0IsttWvY15qO98_1GyzVC-vR1e_ZPXOdu2qUlOkYMPE,886
231
231
  flwr/server/compat/app.py,sha256=N18vG9fF6rnDQqzPGH53sdAi2P72QNAM1chtq9KQweQ,3323
232
- flwr/server/compat/app_utils.py,sha256=99VccCr-OH6kCoD8399P5WQmdnjIIEFU_8Kpo04kJpk,3772
232
+ flwr/server/compat/app_utils.py,sha256=Uz6m-NV90cQ6k-gW6wlWQuhoFoK78qlMr0CEmALKXqY,4591
233
233
  flwr/server/compat/grid_client_proxy.py,sha256=FxMgGtrzBoBAPby2ZjTWzpCJsCht8FwMm4PzqW80dmQ,4956
234
234
  flwr/server/compat/legacy_context.py,sha256=94JsRQxyOdLI6lZZkFjS3-TMd0YJGAgSBBO0M_s_9ts,1804
235
235
  flwr/server/criterion.py,sha256=G4e-6B48Pc7d5rmGVUpIzNKb6UF88O3VmTRuUltgjzM,1061
236
236
  flwr/server/fleet_event_log_interceptor.py,sha256=AkL7Y5d3xm2vRhL3ahmEVVoOvAP7PA7dRgB-je4v-Ys,3774
237
237
  flwr/server/grid/__init__.py,sha256=aWZHezoR2UGMJISB_gPMCm2N_2GSbm97A3lAp7ruhRQ,888
238
238
  flwr/server/grid/grid.py,sha256=naGCYt5J6dnmUvrcGkdNyKPe3MBd-0awGm1ALmgahqY,6625
239
- flwr/server/grid/grpc_grid.py,sha256=MWESNIUbBp8ownNE1JvWW-xQ7Hb7AyxcorVsOZIkI18,12321
239
+ flwr/server/grid/grpc_grid.py,sha256=o9oXBsAc9jp2RneY1AhOOyOO8B4sRJKP_l1UyC0j5_M,12692
240
240
  flwr/server/grid/inmemory_grid.py,sha256=RjejYT-d-hHuTs1KSs_5wvOdAWKLus8w5_UAcnGt4iw,6168
241
241
  flwr/server/history.py,sha256=cCkFhBN4GoHsYYNk5GG1Y089eKJh2DH_ZJbYPwLaGyk,5026
242
242
  flwr/server/run_serverapp.py,sha256=v0p6jXj2dFxlRUdoEeF1mnaFd9XRQi6dZCflPY6d3qI,2063
@@ -357,7 +357,7 @@ flwr/supernode/servicer/__init__.py,sha256=lucTzre5WPK7G1YLCfaqg3rbFWdNSb7ZTt-ca
357
357
  flwr/supernode/servicer/clientappio/__init__.py,sha256=vJyOjO2FXZ2URbnthmdsgs6948wbYfdq1L1V8Um-Lr8,895
358
358
  flwr/supernode/servicer/clientappio/clientappio_servicer.py,sha256=LmzkxtNQBn5vVrHc0Bhq2WqaK6-LM2v4kfLBN0PiNNM,8522
359
359
  flwr/supernode/start_client_internal.py,sha256=5CwTNV-XmIhwR1jv3G7aQAXGhf6OFWS6U-vmxY1iKGA,16984
360
- flwr_nightly-1.19.0.dev20250604.dist-info/METADATA,sha256=xUqCj0YV0Yt1jAVWil6lHAaQkDUMpQqRIFL5tX2yUQo,15910
361
- flwr_nightly-1.19.0.dev20250604.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
362
- flwr_nightly-1.19.0.dev20250604.dist-info/entry_points.txt,sha256=jNpDXGBGgs21RqUxelF_jwGaxtqFwm-MQyfz-ZqSjrA,367
363
- flwr_nightly-1.19.0.dev20250604.dist-info/RECORD,,
360
+ flwr_nightly-1.19.0.dev20250606.dist-info/METADATA,sha256=OBd3qXqNO4F-2bqFuBUM8HZ1hKilS8QDmf0fH12imYs,15910
361
+ flwr_nightly-1.19.0.dev20250606.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
362
+ flwr_nightly-1.19.0.dev20250606.dist-info/entry_points.txt,sha256=jNpDXGBGgs21RqUxelF_jwGaxtqFwm-MQyfz-ZqSjrA,367
363
+ flwr_nightly-1.19.0.dev20250606.dist-info/RECORD,,