flwr-nightly 1.10.0.dev20240711__py3-none-any.whl → 1.10.0.dev20240712__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/client/app.py CHANGED
@@ -18,7 +18,7 @@ import signal
18
18
  import sys
19
19
  import time
20
20
  from dataclasses import dataclass
21
- from logging import DEBUG, ERROR, INFO, WARN
21
+ from logging import ERROR, INFO, WARN
22
22
  from pathlib import Path
23
23
  from typing import Callable, ContextManager, Dict, Optional, Tuple, Type, Union
24
24
 
@@ -160,6 +160,7 @@ def start_client(
160
160
  event(EventType.START_CLIENT_ENTER)
161
161
  _start_client_internal(
162
162
  server_address=server_address,
163
+ node_config={},
163
164
  load_client_app_fn=None,
164
165
  client_fn=client_fn,
165
166
  client=client,
@@ -181,6 +182,7 @@ def start_client(
181
182
  def _start_client_internal(
182
183
  *,
183
184
  server_address: str,
185
+ node_config: Dict[str, str],
184
186
  load_client_app_fn: Optional[Callable[[str, str], ClientApp]] = None,
185
187
  client_fn: Optional[ClientFnExt] = None,
186
188
  client: Optional[Client] = None,
@@ -193,7 +195,6 @@ def _start_client_internal(
193
195
  ] = None,
194
196
  max_retries: Optional[int] = None,
195
197
  max_wait_time: Optional[float] = None,
196
- partition_id: Optional[int] = None,
197
198
  flwr_dir: Optional[Path] = None,
198
199
  ) -> None:
199
200
  """Start a Flower client node which connects to a Flower server.
@@ -204,6 +205,8 @@ def _start_client_internal(
204
205
  The IPv4 or IPv6 address of the server. If the Flower
205
206
  server runs on the same machine on port 8080, then `server_address`
206
207
  would be `"[::]:8080"`.
208
+ node_config: Dict[str, str]
209
+ The configuration of the node.
207
210
  load_client_app_fn : Optional[Callable[[], ClientApp]] (default: None)
208
211
  A function that can be used to load a `ClientApp` instance.
209
212
  client_fn : Optional[ClientFnExt]
@@ -238,9 +241,6 @@ def _start_client_internal(
238
241
  The maximum duration before the client stops trying to
239
242
  connect to the server in case of connection error.
240
243
  If set to None, there is no limit to the total time.
241
- partition_id: Optional[int] (default: None)
242
- The data partition index associated with this node. Better suited for
243
- prototyping purposes.
244
244
  flwr_dir: Optional[Path] (default: None)
245
245
  The fully resolved path containing installed Flower Apps.
246
246
  """
@@ -295,7 +295,7 @@ def _start_client_internal(
295
295
  log(WARN, "Connection attempt failed, retrying...")
296
296
  else:
297
297
  log(
298
- DEBUG,
298
+ WARN,
299
299
  "Connection attempt failed, retrying in %.2f seconds",
300
300
  retry_state.actual_wait,
301
301
  )
@@ -319,7 +319,9 @@ def _start_client_internal(
319
319
  on_backoff=_on_backoff,
320
320
  )
321
321
 
322
- node_state = NodeState(partition_id=partition_id)
322
+ # NodeState gets initialized when the first connection is established
323
+ node_state: Optional[NodeState] = None
324
+
323
325
  runs: Dict[int, Run] = {}
324
326
 
325
327
  while not app_state_tracker.interrupt:
@@ -334,9 +336,33 @@ def _start_client_internal(
334
336
  ) as conn:
335
337
  receive, send, create_node, delete_node, get_run = conn
336
338
 
337
- # Register node
338
- if create_node is not None:
339
- create_node() # pylint: disable=not-callable
339
+ # Register node when connecting the first time
340
+ if node_state is None:
341
+ if create_node is None:
342
+ if transport not in ["grpc-bidi", None]:
343
+ raise NotImplementedError(
344
+ "All transports except `grpc-bidi` require "
345
+ "an implementation for `create_node()`.'"
346
+ )
347
+ # gRPC-bidi doesn't have the concept of node_id,
348
+ # so we set it to -1
349
+ node_state = NodeState(
350
+ node_id=-1,
351
+ node_config={},
352
+ partition_id=None,
353
+ )
354
+ else:
355
+ # Call create_node fn to register node
356
+ node_id: Optional[int] = ( # pylint: disable=assignment-from-none
357
+ create_node()
358
+ ) # pylint: disable=not-callable
359
+ if node_id is None:
360
+ raise ValueError("Node registration failed")
361
+ node_state = NodeState(
362
+ node_id=node_id,
363
+ node_config=node_config,
364
+ partition_id=None,
365
+ )
340
366
 
341
367
  app_state_tracker.register_signal_handler()
342
368
  while not app_state_tracker.interrupt:
@@ -580,7 +606,7 @@ def _init_connection(transport: Optional[str], server_address: str) -> Tuple[
580
606
  Tuple[
581
607
  Callable[[], Optional[Message]],
582
608
  Callable[[Message], None],
583
- Optional[Callable[[], None]],
609
+ Optional[Callable[[], Optional[int]]],
584
610
  Optional[Callable[[], None]],
585
611
  Optional[Callable[[int], Run]],
586
612
  ]
@@ -44,7 +44,7 @@ def grpc_adapter( # pylint: disable=R0913
44
44
  Tuple[
45
45
  Callable[[], Optional[Message]],
46
46
  Callable[[Message], None],
47
- Optional[Callable[[], None]],
47
+ Optional[Callable[[], Optional[int]]],
48
48
  Optional[Callable[[], None]],
49
49
  Optional[Callable[[int], Run]],
50
50
  ]
@@ -72,7 +72,7 @@ def grpc_connection( # pylint: disable=R0913, R0915
72
72
  Tuple[
73
73
  Callable[[], Optional[Message]],
74
74
  Callable[[Message], None],
75
- Optional[Callable[[], None]],
75
+ Optional[Callable[[], Optional[int]]],
76
76
  Optional[Callable[[], None]],
77
77
  Optional[Callable[[int], Run]],
78
78
  ]
@@ -79,7 +79,7 @@ def grpc_request_response( # pylint: disable=R0913, R0914, R0915
79
79
  Tuple[
80
80
  Callable[[], Optional[Message]],
81
81
  Callable[[Message], None],
82
- Optional[Callable[[], None]],
82
+ Optional[Callable[[], Optional[int]]],
83
83
  Optional[Callable[[], None]],
84
84
  Optional[Callable[[int], Run]],
85
85
  ]
@@ -176,7 +176,7 @@ def grpc_request_response( # pylint: disable=R0913, R0914, R0915
176
176
  if not ping_stop_event.is_set():
177
177
  ping_stop_event.wait(next_interval)
178
178
 
179
- def create_node() -> None:
179
+ def create_node() -> Optional[int]:
180
180
  """Set create_node."""
181
181
  # Call FleetAPI
182
182
  create_node_request = CreateNodeRequest(ping_interval=PING_DEFAULT_INTERVAL)
@@ -189,6 +189,7 @@ def grpc_request_response( # pylint: disable=R0913, R0914, R0915
189
189
  nonlocal node, ping_thread
190
190
  node = cast(Node, create_node_response.node)
191
191
  ping_thread = start_ping_loop(ping, ping_stop_event)
192
+ return node.node_id
192
193
 
193
194
  def delete_node() -> None:
194
195
  """Set delete_node."""
flwr/client/node_state.py CHANGED
@@ -17,7 +17,7 @@
17
17
 
18
18
  from dataclasses import dataclass
19
19
  from pathlib import Path
20
- from typing import Any, Dict, Optional
20
+ from typing import Dict, Optional
21
21
 
22
22
  from flwr.common import Context, RecordSet
23
23
  from flwr.common.config import get_fused_config
@@ -35,8 +35,11 @@ class RunInfo:
35
35
  class NodeState:
36
36
  """State of a node where client nodes execute runs."""
37
37
 
38
- def __init__(self, partition_id: Optional[int]) -> None:
39
- self._meta: Dict[str, Any] = {} # holds metadata about the node
38
+ def __init__(
39
+ self, node_id: int, node_config: Dict[str, str], partition_id: Optional[int]
40
+ ) -> None:
41
+ self.node_id = node_id
42
+ self.node_config = node_config
40
43
  self.run_infos: Dict[int, RunInfo] = {}
41
44
  self._partition_id = partition_id
42
45
 
@@ -52,6 +55,8 @@ class NodeState:
52
55
  self.run_infos[run_id] = RunInfo(
53
56
  initial_run_config=initial_run_config,
54
57
  context=Context(
58
+ node_id=self.node_id,
59
+ node_config=self.node_config,
55
60
  state=RecordSet(),
56
61
  run_config=initial_run_config.copy(),
57
62
  partition_id=self._partition_id,
@@ -41,7 +41,7 @@ def test_multirun_in_node_state() -> None:
41
41
  expected_values = {0: "1", 1: "1" * 3, 2: "1" * 2, 3: "1", 5: "1"}
42
42
 
43
43
  # NodeState
44
- node_state = NodeState(partition_id=None)
44
+ node_state = NodeState(node_id=0, node_config={}, partition_id=None)
45
45
 
46
46
  for task in tasks:
47
47
  run_id = task.run_id
@@ -90,7 +90,7 @@ def http_request_response( # pylint: disable=,R0913, R0914, R0915
90
90
  Tuple[
91
91
  Callable[[], Optional[Message]],
92
92
  Callable[[Message], None],
93
- Optional[Callable[[], None]],
93
+ Optional[Callable[[], Optional[int]]],
94
94
  Optional[Callable[[], None]],
95
95
  Optional[Callable[[int], Run]],
96
96
  ]
@@ -237,19 +237,20 @@ def http_request_response( # pylint: disable=,R0913, R0914, R0915
237
237
  if not ping_stop_event.is_set():
238
238
  ping_stop_event.wait(next_interval)
239
239
 
240
- def create_node() -> None:
240
+ def create_node() -> Optional[int]:
241
241
  """Set create_node."""
242
242
  req = CreateNodeRequest(ping_interval=PING_DEFAULT_INTERVAL)
243
243
 
244
244
  # Send the request
245
245
  res = _request(req, CreateNodeResponse, PATH_CREATE_NODE)
246
246
  if res is None:
247
- return
247
+ return None
248
248
 
249
249
  # Remember the node and the ping-loop thread
250
250
  nonlocal node, ping_thread
251
251
  node = res.node
252
252
  ping_thread = start_ping_loop(ping, ping_stop_event)
253
+ return node.node_id
253
254
 
254
255
  def delete_node() -> None:
255
256
  """Set delete_node."""
@@ -29,7 +29,12 @@ from cryptography.hazmat.primitives.serialization import (
29
29
 
30
30
  from flwr.client.client_app import ClientApp, LoadClientAppError
31
31
  from flwr.common import EventType, event
32
- from flwr.common.config import get_flwr_dir, get_project_config, get_project_dir
32
+ from flwr.common.config import (
33
+ get_flwr_dir,
34
+ get_project_config,
35
+ get_project_dir,
36
+ parse_config_args,
37
+ )
33
38
  from flwr.common.constant import (
34
39
  TRANSPORT_TYPE_GRPC_ADAPTER,
35
40
  TRANSPORT_TYPE_GRPC_RERE,
@@ -67,7 +72,7 @@ def run_supernode() -> None:
67
72
  authentication_keys=authentication_keys,
68
73
  max_retries=args.max_retries,
69
74
  max_wait_time=args.max_wait_time,
70
- partition_id=args.partition_id,
75
+ node_config=parse_config_args(args.node_config),
71
76
  flwr_dir=get_flwr_dir(args.flwr_dir),
72
77
  )
73
78
 
@@ -93,6 +98,7 @@ def run_client_app() -> None:
93
98
 
94
99
  _start_client_internal(
95
100
  server_address=args.superlink,
101
+ node_config=parse_config_args(args.node_config),
96
102
  load_client_app_fn=load_fn,
97
103
  transport=args.transport,
98
104
  root_certificates=root_certificates,
@@ -389,11 +395,11 @@ def _parse_args_common(parser: argparse.ArgumentParser) -> None:
389
395
  help="The SuperNode's public key (as a path str) to enable authentication.",
390
396
  )
391
397
  parser.add_argument(
392
- "--partition-id",
393
- type=int,
394
- help="The data partition index associated with this SuperNode. Better suited "
395
- "for prototyping purposes where a SuperNode might only load a fraction of an "
396
- "artificially partitioned dataset (e.g. using `flwr-datasets`)",
398
+ "--node-config",
399
+ type=str,
400
+ help="A comma separated list of key/value pairs (separated by `=`) to "
401
+ "configure the SuperNode. "
402
+ "E.g. --node-config 'key1=\"value1\",partition-id=0,num-partitions=100'",
397
403
  )
398
404
 
399
405
 
flwr/common/config.py CHANGED
@@ -121,16 +121,16 @@ def flatten_dict(raw_dict: Dict[str, Any], parent_key: str = "") -> Dict[str, st
121
121
 
122
122
 
123
123
  def parse_config_args(
124
- config_overrides: Optional[str],
124
+ config: Optional[str],
125
125
  separator: str = ",",
126
126
  ) -> Dict[str, str]:
127
127
  """Parse separator separated list of key-value pairs separated by '='."""
128
128
  overrides: Dict[str, str] = {}
129
129
 
130
- if config_overrides is None:
130
+ if config is None:
131
131
  return overrides
132
132
 
133
- overrides_list = config_overrides.split(separator)
133
+ overrides_list = config.split(separator)
134
134
  if (
135
135
  len(overrides_list) == 1
136
136
  and "=" not in overrides_list
flwr/common/context.py CHANGED
@@ -27,6 +27,11 @@ class Context:
27
27
 
28
28
  Parameters
29
29
  ----------
30
+ node_id : int
31
+ The ID that identifies the node.
32
+ node_config : Dict[str, str]
33
+ A config (key/value mapping) unique to the node and independent of the
34
+ `run_config`. This config persists across all runs this node participates in.
30
35
  state : RecordSet
31
36
  Holds records added by the entity in a given run and that will stay local.
32
37
  This means that the data it holds will never leave the system it's running from.
@@ -44,16 +49,22 @@ class Context:
44
49
  simulation or proto typing setups.
45
50
  """
46
51
 
52
+ node_id: int
53
+ node_config: Dict[str, str]
47
54
  state: RecordSet
48
- partition_id: Optional[int]
49
55
  run_config: Dict[str, str]
56
+ partition_id: Optional[int]
50
57
 
51
- def __init__(
58
+ def __init__( # pylint: disable=too-many-arguments
52
59
  self,
60
+ node_id: int,
61
+ node_config: Dict[str, str],
53
62
  state: RecordSet,
54
63
  run_config: Dict[str, str],
55
64
  partition_id: Optional[int] = None,
56
65
  ) -> None:
66
+ self.node_id = node_id
67
+ self.node_config = node_config
57
68
  self.state = state
58
69
  self.run_config = run_config
59
70
  self.partition_id = partition_id
@@ -52,4 +52,4 @@ class LegacyContext(Context):
52
52
  self.strategy = strategy
53
53
  self.client_manager = client_manager
54
54
  self.history = History()
55
- super().__init__(state, run_config={})
55
+ super().__init__(node_id=0, node_config={}, state=state, run_config={})
@@ -78,7 +78,9 @@ def run(
78
78
  server_app = _load()
79
79
 
80
80
  # Initialize Context
81
- context = Context(state=RecordSet(), run_config=server_app_run_config)
81
+ context = Context(
82
+ node_id=0, node_config={}, state=RecordSet(), run_config=server_app_run_config
83
+ )
82
84
 
83
85
  # Call ServerApp
84
86
  server_app(driver=driver, context=context)
@@ -284,7 +284,9 @@ def start_vce(
284
284
  # Construct mapping of NodeStates
285
285
  node_states: Dict[int, NodeState] = {}
286
286
  for node_id, partition_id in nodes_mapping.items():
287
- node_states[node_id] = NodeState(partition_id=partition_id)
287
+ node_states[node_id] = NodeState(
288
+ node_id=node_id, node_config={}, partition_id=partition_id
289
+ )
288
290
 
289
291
  # Load backend config
290
292
  log(DEBUG, "Supported backends: %s", list(supported_backends.keys()))
@@ -59,7 +59,9 @@ class RayActorClientProxy(ClientProxy):
59
59
 
60
60
  self.app_fn = _load_app
61
61
  self.actor_pool = actor_pool
62
- self.proxy_state = NodeState(partition_id=self.partition_id)
62
+ self.proxy_state = NodeState(
63
+ node_id=node_id, node_config={}, partition_id=self.partition_id
64
+ )
63
65
 
64
66
  def _submit_job(self, message: Message, timeout: Optional[float]) -> Message:
65
67
  """Sumbit a message to the ActorPool."""
flwr/superexec/app.py CHANGED
@@ -127,11 +127,11 @@ def _try_obtain_certificates(
127
127
  return None
128
128
  # Check if certificates are provided
129
129
  if args.ssl_certfile and args.ssl_keyfile and args.ssl_ca_certfile:
130
- if not Path.is_file(args.ssl_ca_certfile):
130
+ if not Path(args.ssl_ca_certfile).is_file():
131
131
  sys.exit("Path argument `--ssl-ca-certfile` does not point to a file.")
132
- if not Path.is_file(args.ssl_certfile):
132
+ if not Path(args.ssl_certfile).is_file():
133
133
  sys.exit("Path argument `--ssl-certfile` does not point to a file.")
134
- if not Path.is_file(args.ssl_keyfile):
134
+ if not Path(args.ssl_keyfile).is_file():
135
135
  sys.exit("Path argument `--ssl-keyfile` does not point to a file.")
136
136
  certificates = (
137
137
  Path(args.ssl_ca_certfile).read_bytes(), # CA certificate
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: flwr-nightly
3
- Version: 1.10.0.dev20240711
3
+ Version: 1.10.0.dev20240712
4
4
  Summary: Flower: A Friendly Federated Learning Framework
5
5
  Home-page: https://flower.ai
6
6
  License: Apache-2.0
@@ -53,17 +53,17 @@ flwr/cli/run/__init__.py,sha256=oCd6HmQDx-sqver1gecgx-uMA38BLTSiiKpl7RGNceg,789
53
53
  flwr/cli/run/run.py,sha256=eFYZwHOw9pHo_jxtS-UQIf7LVIOiNwjnJdaykcZQz5Q,4969
54
54
  flwr/cli/utils.py,sha256=l65Ul0YsSBPuypk0uorAtEDmLEYiUrzpCXi6zCg9mJ4,4506
55
55
  flwr/client/__init__.py,sha256=wzJZsYJIHf_8-PMzvfbinyzzjgh1UP1vLrAw2_yEbKI,1345
56
- flwr/client/app.py,sha256=TC9wO6dSuXxRt0YsqFTz8Usf-ophSww9cwMRjEaXKjI,25123
56
+ flwr/client/app.py,sha256=60e0vEmMNRusDheu7laQRqe87FhFyVzxIZKAhLrRLAo,26268
57
57
  flwr/client/client.py,sha256=Vp9UkOkoHdNfn6iMYZsj_5m_GICiFfUlKEVaLad-YhM,8183
58
58
  flwr/client/client_app.py,sha256=cvY-km3JEOWKxUio4xvksNFBk2FQQXliUfQTlDty71w,9648
59
59
  flwr/client/dpfedavg_numpy_client.py,sha256=ylZ-LpBIKmL1HCiS8kq4pkp2QGalc8rYEzDHdRG3VRQ,7435
60
60
  flwr/client/grpc_adapter_client/__init__.py,sha256=QyNWIbsq9DpyMk7oemiO1P3TBFfkfkctnJ1JoAkTl3s,742
61
- flwr/client/grpc_adapter_client/connection.py,sha256=jxwWnqppwpwI7c5xtGRwbiyDKRLdMP4Y6YLAwTypfeY,3864
61
+ flwr/client/grpc_adapter_client/connection.py,sha256=fM6QTIrcDGIXux7nzxOY3qNUfBGxVl1W7861iGSy5wA,3873
62
62
  flwr/client/grpc_client/__init__.py,sha256=LsnbqXiJhgQcB0XzAlUQgPx011Uf7Y7yabIC1HxivJ8,735
63
- flwr/client/grpc_client/connection.py,sha256=5KZ1AhKJiJsMgLoAwsyN83k8hu_XWaRbUb-ATR1RvF0,9302
63
+ flwr/client/grpc_client/connection.py,sha256=7J3YlvvBrky3f8UJ99U9IsPECGtcY8rvXsyr_Ol8qyY,9311
64
64
  flwr/client/grpc_rere_client/__init__.py,sha256=MK-oSoV3kwUEQnIwl0GN4OpiHR7eLOrMA8ikunET130,752
65
65
  flwr/client/grpc_rere_client/client_interceptor.py,sha256=sYPEznuQPdy2BPDlvM9FK0ZRRucb4NfwUee1Z_mN82E,4954
66
- flwr/client/grpc_rere_client/connection.py,sha256=ieIOBSrrjWVZflbLdb6KMehzs-aOdvIhcTTtfgQbT5I,10292
66
+ flwr/client/grpc_rere_client/connection.py,sha256=nC4Usb1qok2liVxwlbQokUNwRRRD10_GIscbspqqz_c,10338
67
67
  flwr/client/grpc_rere_client/grpc_adapter.py,sha256=woljH8yr1pyLH4W4Azogyy7Nafn6y9DHBnDCIIVKwCw,4711
68
68
  flwr/client/heartbeat.py,sha256=cx37mJBH8LyoIN4Lks85wtqT1mnU5GulQnr4pGCvAq0,2404
69
69
  flwr/client/message_handler/__init__.py,sha256=QxxQuBNpFPTHx3KiUNvQSlqMKlEnbRR1kFfc1KVje08,719
@@ -77,19 +77,19 @@ flwr/client/mod/secure_aggregation/__init__.py,sha256=A7DzZ3uvXTUkuHBzrxJMWQQD4R
77
77
  flwr/client/mod/secure_aggregation/secagg_mod.py,sha256=wI9tuIEvMUETz-wVIEbPYvh-1nK9CEylBLGoVpNhL94,1095
78
78
  flwr/client/mod/secure_aggregation/secaggplus_mod.py,sha256=fZTfIELkYS64lpgxQKL66s-QHjCn-159qfLoNoIMJjc,19699
79
79
  flwr/client/mod/utils.py,sha256=UAJXiB0wwVyLkCkpW_i5BXikdBR65p8sNFr7VNHm2nk,1226
80
- flwr/client/node_state.py,sha256=8nsvz8IndKLI1VeAzO7EwHh4rZdvaw03W0llLQhifiw,2830
81
- flwr/client/node_state_tests.py,sha256=vXxS3vHMQxl66SfD2MO-JNi83EabYs8Jhd8N7H2zfEM,2231
80
+ flwr/client/node_state.py,sha256=Yh-3-YQtnUfAjMxz356cUQp40UFfdM1yw-n_Ir50JBk,2971
81
+ flwr/client/node_state_tests.py,sha256=DAZk3Ir3HSN24xx42l0u9n5Q7sTgw8Jps4QRhwGew3A,2258
82
82
  flwr/client/numpy_client.py,sha256=u76GWAdHmJM88Agm2EgLQSvO8Jnk225mJTk-_TmPjFE,10283
83
83
  flwr/client/rest_client/__init__.py,sha256=5KGlp7pjc1dhNRkKlaNtUfQmg8wrRFh9lS3P3uRS-7Q,735
84
- flwr/client/rest_client/connection.py,sha256=nowX8_TMnaiIhBMU5f60sIOkvcS3DHOHBT_YrvCnxnw,12096
84
+ flwr/client/rest_client/connection.py,sha256=aY_UzrNyE8g-xPAK_POZZZ93mERHTe-pOhNP-uZ8GyU,12147
85
85
  flwr/client/supernode/__init__.py,sha256=SUhWOzcgXRNXk1V9UgB5-FaWukqqrOEajVUHEcPkwyQ,865
86
- flwr/client/supernode/app.py,sha256=GQ9N2ydrTkgo7ZVb3AFOWYeLSru3qwQ_SvsYU6fdhI4,15321
86
+ flwr/client/supernode/app.py,sha256=cg8momLzMnFrDBNJsSRDYrn8zHuJ-4UC3wIHf51aBXQ,15385
87
87
  flwr/client/typing.py,sha256=RJGVF64Z0nqW-qmdFuFaY4Jig3dMUFgNhFi-5dq-8-I,1069
88
88
  flwr/common/__init__.py,sha256=4cBLNNnNTwHDnL_HCxhU5ILCSZ6fYh3A_aMBtlvHTVw,3721
89
89
  flwr/common/address.py,sha256=wRu1Luezx1PWadwV9OA_KNko01oVvbRnPqfzaDn8QOk,1882
90
- flwr/common/config.py,sha256=GTmXfeCi6Xt1CTUzg8TUshOHVv2vP8X8e6uCcLBWoX4,5024
90
+ flwr/common/config.py,sha256=7OF4R43st8teFXBWmV92noGEYVe00wT29QMs6od8mlI,4994
91
91
  flwr/common/constant.py,sha256=qNmxEV3_pOO7MeTAA9qwIh4KoCPStcX3Gm8GRPIRx_4,2890
92
- flwr/common/context.py,sha256=dd37Q_0rngvGTzIwQ2M50jfhGGV0vV2-uGlL-gC4Y_Y,2170
92
+ flwr/common/context.py,sha256=iW-rDC0dTzwyvLSWdtaeHMZM7l5XAf6dg2TdVw0lg68,2643
93
93
  flwr/common/date.py,sha256=OcQuwpb2HxcblTqYm6H223ufop5UZw5N_fzalbpOVzY,891
94
94
  flwr/common/differential_privacy.py,sha256=WZWrL7C9XaB9l9NDkLDI5PvM7jwcoTTFu08ZVG8-M5Q,6113
95
95
  flwr/common/differential_privacy_constants.py,sha256=c7b7tqgvT7yMK0XN9ndiTBs4mQf6d3qk6K7KBZGlV4Q,1074
@@ -180,14 +180,14 @@ flwr/server/compat/__init__.py,sha256=VxnJtJyOjNFQXMNi9hIuzNlZM5n0Hj1p3aq_Pm2udw
180
180
  flwr/server/compat/app.py,sha256=u0elxfiLjGouCMQIy5KnCpeCHdc3s0qvojUm8unInIs,3421
181
181
  flwr/server/compat/app_utils.py,sha256=B9pec7LnYACzowXKZTZNu3SNS-fSaHfefwvRyAQa4Nc,3456
182
182
  flwr/server/compat/driver_client_proxy.py,sha256=BxTDo7i89VAG2tuF4x7zogSVn2bXPMr0H2H0lERzW9c,5444
183
- flwr/server/compat/legacy_context.py,sha256=3T_vON4qXt31To0dd9ygULvxL9l1hmDSED6ZqBiLhxI,1781
183
+ flwr/server/compat/legacy_context.py,sha256=-c2J_tPDFahDILl80XFrgkdRLfpHWDu5W3DQP3nKdls,1814
184
184
  flwr/server/criterion.py,sha256=ypbAexbztzGUxNen9RCHF91QeqiEQix4t4Ih3E-42MM,1061
185
185
  flwr/server/driver/__init__.py,sha256=bikRv6CjTwSvYh7tf10gziU5o2YotOWhhftz2tr3KDc,886
186
186
  flwr/server/driver/driver.py,sha256=NT_yaeit7_kZEIsCEqOWPID1GrVD3ywH4xZ2wtIh5lM,5217
187
187
  flwr/server/driver/grpc_driver.py,sha256=4Azmzq4RWzcLbOqBBEF-I78krWVWZ6bT0U42S25zMvY,9659
188
188
  flwr/server/driver/inmemory_driver.py,sha256=RcK94_NtjGZ4aZDIscnU7A3Uv1u8jGx29-xcbjQvZTM,6444
189
189
  flwr/server/history.py,sha256=bBOHKyX1eQONIsUx4EUU-UnAk1i0EbEl8ioyMq_UWQ8,5063
190
- flwr/server/run_serverapp.py,sha256=s8KyWbANv9kyj8_tJoDiLkUj9D6QrPWfC5M_xDCOtYU,9445
190
+ flwr/server/run_serverapp.py,sha256=iq62xuSPYndmsYiJRpRkT9cTfQpZ0FgsWLncktUvh98,9486
191
191
  flwr/server/server.py,sha256=wsXsxMZ9SQ0B42nBnUlcV83NJPycgrgg5bFwcQ4BYBE,17821
192
192
  flwr/server/server_app.py,sha256=1hul76ospG8L_KooK_ewn1sWPNTNYLTtZMeGNOBNruA,6267
193
193
  flwr/server/server_config.py,sha256=CZaHVAsMvGLjpWVcLPkiYxgJN4xfIyAiUrCI3fETKY4,1349
@@ -239,7 +239,7 @@ flwr/server/superlink/fleet/vce/__init__.py,sha256=36MHKiefnJeyjwMQzVUK4m06Ojon3
239
239
  flwr/server/superlink/fleet/vce/backend/__init__.py,sha256=oBIzmnrSSRvH_H0vRGEGWhWzQQwqe3zn6e13RsNwlIY,1466
240
240
  flwr/server/superlink/fleet/vce/backend/backend.py,sha256=iG3KSIY7DzNfcxmuLfTs7VdQJnqPCvvn5DFkTWKG5lI,2227
241
241
  flwr/server/superlink/fleet/vce/backend/raybackend.py,sha256=pIJm6YXZw-Jv3okRgred1yjm7b3EWuj1BvtyBd3Fk08,7422
242
- flwr/server/superlink/fleet/vce/vce_api.py,sha256=Aiv8fulgx4decS_PQ17L94VWc0Mxx7_lL4BmIX1-PMg,11745
242
+ flwr/server/superlink/fleet/vce/vce_api.py,sha256=253x7nGgAbLZzJmSKNxii_xZDrF_8fC0hpbj4bIQ7SY,11800
243
243
  flwr/server/superlink/state/__init__.py,sha256=Gj2OTFLXvA-mAjBvwuKDM3rDrVaQPcIoybSa2uskMTE,1003
244
244
  flwr/server/superlink/state/in_memory_state.py,sha256=fb-f4RGiqXON0DC7aSEMNuNIjH406BhBYrNNX5Kza2g,13061
245
245
  flwr/server/superlink/state/sqlite_state.py,sha256=dO374mTkvhWQSiwbqwUXVnAYHev-j2mHaX9v8wFmmMA,29044
@@ -260,17 +260,17 @@ flwr/simulation/__init__.py,sha256=9x8OCkK3jpFAPJB1aeEMOddz6V58bExQPtwE8Z3q-RY,1
260
260
  flwr/simulation/app.py,sha256=8NDXoQ8oC11khXIGnydrsUh5JfaH7c2Fwzix8vDFK1I,15144
261
261
  flwr/simulation/ray_transport/__init__.py,sha256=wzcEEwUUlulnXsg6raCA1nGpP3LlAQDtJ8zNkCXcVbA,734
262
262
  flwr/simulation/ray_transport/ray_actor.py,sha256=3j0HgzjrlYjnzdTRy8aA4Nf6VoUvxi1hGRQkGSU5z6c,19020
263
- flwr/simulation/ray_transport/ray_client_proxy.py,sha256=zGLVebfwFhBo1CAqEQ0MtW-fPG8ark3e4n6OksFGch4,6954
263
+ flwr/simulation/ray_transport/ray_client_proxy.py,sha256=lcrYLHeAud6AT0TgzKLK14yi3ijZpqMWS4oKj5M1A3A,7009
264
264
  flwr/simulation/ray_transport/utils.py,sha256=TYdtfg1P9VfTdLMOJlifInGpxWHYs9UfUqIv2wfkRLA,2392
265
265
  flwr/simulation/run_simulation.py,sha256=qGP8sHKAzJT9nGeqMw36iCsVXm4ZFMBisCORuTswr-g,17277
266
266
  flwr/superexec/__init__.py,sha256=9h94ogLxi6eJ3bUuJYq3E3pApThSabTPiSmPAGlTkHE,800
267
- flwr/superexec/app.py,sha256=dm0o3O6dlsk8hZHondat5QWrBh9UfKzHxn4dVrqwiRk,6151
267
+ flwr/superexec/app.py,sha256=1ZGSErFo3AQeIQOARKM1DN99fCuH451PeM1bDasBjRQ,6157
268
268
  flwr/superexec/deployment.py,sha256=xv5iQWuaMeeL0XE5KMLWq3gRU4lvsGu1-_oPIXi5x9E,3955
269
269
  flwr/superexec/exec_grpc.py,sha256=u-rztpOleqSGqgvNE-ZLw1HchNsBHU1-eB3m52GZ0pQ,1852
270
270
  flwr/superexec/exec_servicer.py,sha256=4R1f_9v0vly_bXpIYaXAeV1tO5LAy1AYygGGGNZmlQk,2194
271
271
  flwr/superexec/executor.py,sha256=TMQMMf-vv0htlv6v-eEBI67J1WL3Yz7dp_Fm1lgMEyU,1718
272
- flwr_nightly-1.10.0.dev20240711.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
273
- flwr_nightly-1.10.0.dev20240711.dist-info/METADATA,sha256=6FH6xn5sDwtX8aB4bz6zCf3au-O319V8I2iOIWWXDXE,15632
274
- flwr_nightly-1.10.0.dev20240711.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
275
- flwr_nightly-1.10.0.dev20240711.dist-info/entry_points.txt,sha256=7qBQcA-bDGDxnJmLd9FYqglFQubjCNqyg9M8a-lukps,336
276
- flwr_nightly-1.10.0.dev20240711.dist-info/RECORD,,
272
+ flwr_nightly-1.10.0.dev20240712.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
273
+ flwr_nightly-1.10.0.dev20240712.dist-info/METADATA,sha256=ueea2HUP0m4iFuOa_T3u2lD-93HGTmfD-ulaZv7LKJg,15632
274
+ flwr_nightly-1.10.0.dev20240712.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
275
+ flwr_nightly-1.10.0.dev20240712.dist-info/entry_points.txt,sha256=7qBQcA-bDGDxnJmLd9FYqglFQubjCNqyg9M8a-lukps,336
276
+ flwr_nightly-1.10.0.dev20240712.dist-info/RECORD,,