flwr-nightly 1.9.0.dev20240604__py3-none-any.whl → 1.9.0.dev20240608__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/__init__.py CHANGED
@@ -28,6 +28,7 @@ __all__ = [
28
28
  "Client",
29
29
  "ClientApp",
30
30
  "ClientFn",
31
+ "mod",
31
32
  "NumPyClient",
32
33
  "run_client_app",
33
34
  "run_supernode",
flwr/client/app.py CHANGED
@@ -14,8 +14,10 @@
14
14
  # ==============================================================================
15
15
  """Flower client app."""
16
16
 
17
+ import signal
17
18
  import sys
18
19
  import time
20
+ from dataclasses import dataclass
19
21
  from logging import DEBUG, ERROR, INFO, WARN
20
22
  from typing import Callable, ContextManager, Optional, Tuple, Type, Union
21
23
 
@@ -37,7 +39,7 @@ from flwr.common.constant import (
37
39
  )
38
40
  from flwr.common.logger import log, warn_deprecated_feature
39
41
  from flwr.common.message import Error
40
- from flwr.common.retry_invoker import RetryInvoker, exponential
42
+ from flwr.common.retry_invoker import RetryInvoker, RetryState, exponential
41
43
 
42
44
  from .grpc_client.connection import grpc_connection
43
45
  from .grpc_rere_client.connection import grpc_request_response
@@ -263,6 +265,29 @@ def _start_client_internal(
263
265
  transport, server_address
264
266
  )
265
267
 
268
+ run_tracker = _RunTracker()
269
+
270
+ def _on_sucess(retry_state: RetryState) -> None:
271
+ if retry_state.tries > 1:
272
+ log(
273
+ INFO,
274
+ "Connection successful after %.2f seconds and %s tries.",
275
+ retry_state.elapsed_time,
276
+ retry_state.tries,
277
+ )
278
+ if run_tracker.create_node:
279
+ run_tracker.create_node()
280
+
281
+ def _on_backoff(retry_state: RetryState) -> None:
282
+ if retry_state.tries == 1:
283
+ log(WARN, "Connection attempt failed, retrying...")
284
+ else:
285
+ log(
286
+ DEBUG,
287
+ "Connection attempt failed, retrying in %.2f seconds",
288
+ retry_state.actual_wait,
289
+ )
290
+
266
291
  retry_invoker = RetryInvoker(
267
292
  wait_gen_factory=exponential,
268
293
  recoverable_exceptions=connection_error_type,
@@ -278,25 +303,8 @@ def _start_client_internal(
278
303
  if retry_state.tries > 1
279
304
  else None
280
305
  ),
281
- on_success=lambda retry_state: (
282
- log(
283
- INFO,
284
- "Connection successful after %.2f seconds and %s tries.",
285
- retry_state.elapsed_time,
286
- retry_state.tries,
287
- )
288
- if retry_state.tries > 1
289
- else None
290
- ),
291
- on_backoff=lambda retry_state: (
292
- log(WARN, "Connection attempt failed, retrying...")
293
- if retry_state.tries == 1
294
- else log(
295
- DEBUG,
296
- "Connection attempt failed, retrying in %.2f seconds",
297
- retry_state.actual_wait,
298
- )
299
- ),
306
+ on_success=_on_sucess,
307
+ on_backoff=_on_backoff,
300
308
  )
301
309
 
302
310
  node_state = NodeState()
@@ -579,3 +587,20 @@ def _init_connection(transport: Optional[str], server_address: str) -> Tuple[
579
587
  )
580
588
 
581
589
  return connection, address, error_type
590
+
591
+
592
+ @dataclass
593
+ class _RunTracker:
594
+ create_node: Optional[Callable[[], None]] = None
595
+ interrupt: bool = False
596
+
597
+ def register_signal_handler(self) -> None:
598
+ """Register handlers for exit signals."""
599
+
600
+ def signal_handler(sig, frame): # type: ignore
601
+ # pylint: disable=unused-argument
602
+ self.interrupt = True
603
+ raise StopIteration from None
604
+
605
+ signal.signal(signal.SIGINT, signal_handler)
606
+ signal.signal(signal.SIGTERM, signal_handler)
@@ -12,7 +12,7 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
  # ==============================================================================
15
- """Mods."""
15
+ """Flower Built-in Mods."""
16
16
 
17
17
 
18
18
  from .centraldp_mods import adaptiveclipping_mod, fixedclipping_mod
@@ -30,11 +30,13 @@ from cryptography.hazmat.primitives.serialization import (
30
30
  from flwr.client.client_app import ClientApp, LoadClientAppError
31
31
  from flwr.common import EventType, event
32
32
  from flwr.common.exit_handlers import register_exit_handlers
33
- from flwr.common.logger import log
33
+ from flwr.common.logger import log, warn_deprecated_feature
34
34
  from flwr.common.object_ref import load_app, validate
35
35
 
36
36
  from ..app import _start_client_internal
37
37
 
38
+ ADDRESS_FLEET_API_GRPC_RERE = "0.0.0.0:9092"
39
+
38
40
 
39
41
  def run_supernode() -> None:
40
42
  """Run Flower SuperNode."""
@@ -63,6 +65,23 @@ def run_client_app() -> None:
63
65
 
64
66
  args = _parse_args_run_client_app().parse_args()
65
67
 
68
+ if args.server != ADDRESS_FLEET_API_GRPC_RERE:
69
+ warn = "Passing flag --server is deprecated. Use --superlink instead."
70
+ warn_deprecated_feature(warn)
71
+
72
+ if args.superlink != ADDRESS_FLEET_API_GRPC_RERE:
73
+ # if `--superlink` also passed, then
74
+ # warn user that this argument overrides what was passed with `--server`
75
+ log(
76
+ WARN,
77
+ "Both `--server` and `--superlink` were passed. "
78
+ "`--server` will be ignored. Connecting to the Superlink Fleet API "
79
+ "at %s.",
80
+ args.superlink,
81
+ )
82
+ else:
83
+ args.superlink = args.server
84
+
66
85
  root_certificates = _get_certificates(args)
67
86
  log(
68
87
  DEBUG,
@@ -73,7 +92,7 @@ def run_client_app() -> None:
73
92
  authentication_keys = _try_setup_client_authentication(args)
74
93
 
75
94
  _start_client_internal(
76
- server_address=args.server,
95
+ server_address=args.superlink,
77
96
  load_client_app_fn=load_fn,
78
97
  transport="rest" if args.rest else "grpc-rere",
79
98
  root_certificates=root_certificates,
@@ -100,7 +119,7 @@ def _get_certificates(args: argparse.Namespace) -> Optional[bytes]:
100
119
  WARN,
101
120
  "Option `--insecure` was set. "
102
121
  "Starting insecure HTTP client connected to %s.",
103
- args.server,
122
+ args.superlink,
104
123
  )
105
124
  root_certificates = None
106
125
  else:
@@ -114,7 +133,7 @@ def _get_certificates(args: argparse.Namespace) -> Optional[bytes]:
114
133
  DEBUG,
115
134
  "Starting secure HTTPS client connected to %s "
116
135
  "with the following certificates: %s.",
117
- args.server,
136
+ args.superlink,
118
137
  cert_path,
119
138
  )
120
139
  return root_certificates
@@ -213,9 +232,14 @@ def _parse_args_common(parser: argparse.ArgumentParser) -> None:
213
232
  )
214
233
  parser.add_argument(
215
234
  "--server",
216
- default="0.0.0.0:9092",
235
+ default=ADDRESS_FLEET_API_GRPC_RERE,
217
236
  help="Server address",
218
237
  )
238
+ parser.add_argument(
239
+ "--superlink",
240
+ default=ADDRESS_FLEET_API_GRPC_RERE,
241
+ help="SuperLink Fleet API (gRPC-rere) address (IPv4, IPv6, or a domain name)",
242
+ )
219
243
  parser.add_argument(
220
244
  "--max-retries",
221
245
  type=int,
flwr/server/app.py CHANGED
@@ -230,6 +230,7 @@ def run_driver_api() -> None:
230
230
  grpc_server.wait_for_termination()
231
231
 
232
232
 
233
+ # pylint: disable=too-many-locals
233
234
  def run_fleet_api() -> None:
234
235
  """Run Flower server (Fleet API)."""
235
236
  log(INFO, "Starting Flower server (Fleet API)")
@@ -248,6 +249,25 @@ def run_fleet_api() -> None:
248
249
  grpc_servers = []
249
250
  bckg_threads = []
250
251
 
252
+ address_arg = args.fleet_api_address
253
+ parsed_address = parse_address(address_arg)
254
+ if not parsed_address:
255
+ sys.exit(f"Fleet IP address ({address_arg}) cannot be parsed.")
256
+ host, port, is_v6 = parsed_address
257
+ address = f"[{host}]:{port}" if is_v6 else f"{host}:{port}"
258
+
259
+ num_workers = args.fleet_api_num_workers
260
+ if num_workers != 1:
261
+ log(
262
+ WARN,
263
+ "The Fleet API currently supports only 1 worker. "
264
+ "You have specified %d workers. "
265
+ "Support for multiple workers will be added in future releases. "
266
+ "Proceeding with a single worker.",
267
+ args.fleet_api_num_workers,
268
+ )
269
+ num_workers = 1
270
+
251
271
  # Start Fleet API
252
272
  if args.fleet_api_type == TRANSPORT_TYPE_REST:
253
273
  if (
@@ -256,20 +276,19 @@ def run_fleet_api() -> None:
256
276
  and importlib.util.find_spec("uvicorn")
257
277
  ) is None:
258
278
  sys.exit(MISSING_EXTRA_REST)
259
- address_arg = args.rest_fleet_api_address
260
- parsed_address = parse_address(address_arg)
261
- if not parsed_address:
262
- sys.exit(f"Fleet IP address ({address_arg}) cannot be parsed.")
263
- host, port, _ = parsed_address
279
+
280
+ _, ssl_certfile, ssl_keyfile = (
281
+ certificates if certificates is not None else (None, None, None)
282
+ )
264
283
  fleet_thread = threading.Thread(
265
284
  target=_run_fleet_api_rest,
266
285
  args=(
267
286
  host,
268
287
  port,
269
- args.ssl_keyfile,
270
- args.ssl_certfile,
288
+ ssl_keyfile,
289
+ ssl_certfile,
271
290
  state_factory,
272
- args.rest_fleet_api_workers,
291
+ num_workers,
273
292
  ),
274
293
  )
275
294
  fleet_thread.start()
@@ -314,11 +333,15 @@ def run_superlink() -> None:
314
333
  args = _parse_args_run_superlink().parse_args()
315
334
 
316
335
  # Parse IP address
317
- parsed_address = parse_address(args.driver_api_address)
318
- if not parsed_address:
336
+ parsed_driver_address = parse_address(args.driver_api_address)
337
+ if not parsed_driver_address:
319
338
  sys.exit(f"Driver IP address ({args.driver_api_address}) cannot be parsed.")
320
- host, port, is_v6 = parsed_address
321
- address = f"[{host}]:{port}" if is_v6 else f"{host}:{port}"
339
+ driver_host, driver_port, driver_is_v6 = parsed_driver_address
340
+ driver_address = (
341
+ f"[{driver_host}]:{driver_port}"
342
+ if driver_is_v6
343
+ else f"{driver_host}:{driver_port}"
344
+ )
322
345
 
323
346
  # Obtain certificates
324
347
  certificates = _try_obtain_certificates(args)
@@ -328,13 +351,38 @@ def run_superlink() -> None:
328
351
 
329
352
  # Start Driver API
330
353
  driver_server: grpc.Server = run_driver_api_grpc(
331
- address=address,
354
+ address=driver_address,
332
355
  state_factory=state_factory,
333
356
  certificates=certificates,
334
357
  )
335
358
 
336
359
  grpc_servers = [driver_server]
337
360
  bckg_threads = []
361
+ if not args.fleet_api_address:
362
+ args.fleet_api_address = (
363
+ ADDRESS_FLEET_API_GRPC_RERE
364
+ if args.fleet_api_type == TRANSPORT_TYPE_GRPC_RERE
365
+ else ADDRESS_FLEET_API_REST
366
+ )
367
+ parsed_fleet_address = parse_address(args.fleet_api_address)
368
+ if not parsed_fleet_address:
369
+ sys.exit(f"Fleet IP address ({args.fleet_api_address}) cannot be parsed.")
370
+ fleet_host, fleet_port, fleet_is_v6 = parsed_fleet_address
371
+ fleet_address = (
372
+ f"[{fleet_host}]:{fleet_port}" if fleet_is_v6 else f"{fleet_host}:{fleet_port}"
373
+ )
374
+
375
+ num_workers = args.fleet_api_num_workers
376
+ if num_workers != 1:
377
+ log(
378
+ WARN,
379
+ "The Fleet API currently supports only 1 worker. "
380
+ "You have specified %d workers. "
381
+ "Support for multiple workers will be added in future releases. "
382
+ "Proceeding with a single worker.",
383
+ args.fleet_api_num_workers,
384
+ )
385
+ num_workers = 1
338
386
 
339
387
  # Start Fleet API
340
388
  if args.fleet_api_type == TRANSPORT_TYPE_REST:
@@ -344,35 +392,25 @@ def run_superlink() -> None:
344
392
  and importlib.util.find_spec("uvicorn")
345
393
  ) is None:
346
394
  sys.exit(MISSING_EXTRA_REST)
347
- address_arg = args.rest_fleet_api_address
348
- parsed_address = parse_address(address_arg)
395
+
349
396
  _, ssl_certfile, ssl_keyfile = (
350
397
  certificates if certificates is not None else (None, None, None)
351
398
  )
352
- if not parsed_address:
353
- sys.exit(f"Fleet IP address ({address_arg}) cannot be parsed.")
354
- host, port, _ = parsed_address
399
+
355
400
  fleet_thread = threading.Thread(
356
401
  target=_run_fleet_api_rest,
357
402
  args=(
358
- host,
359
- port,
403
+ fleet_host,
404
+ fleet_port,
360
405
  ssl_keyfile,
361
406
  ssl_certfile,
362
407
  state_factory,
363
- args.rest_fleet_api_workers,
408
+ num_workers,
364
409
  ),
365
410
  )
366
411
  fleet_thread.start()
367
412
  bckg_threads.append(fleet_thread)
368
413
  elif args.fleet_api_type == TRANSPORT_TYPE_GRPC_RERE:
369
- address_arg = args.grpc_rere_fleet_api_address
370
- parsed_address = parse_address(address_arg)
371
- if not parsed_address:
372
- sys.exit(f"Fleet IP address ({address_arg}) cannot be parsed.")
373
- host, port, is_v6 = parsed_address
374
- address = f"[{host}]:{port}" if is_v6 else f"{host}:{port}"
375
-
376
414
  maybe_keys = _try_setup_client_authentication(args, certificates)
377
415
  interceptors: Optional[Sequence[grpc.ServerInterceptor]] = None
378
416
  if maybe_keys is not None:
@@ -395,7 +433,7 @@ def run_superlink() -> None:
395
433
  interceptors = [AuthenticateServerInterceptor(state)]
396
434
 
397
435
  fleet_server = _run_fleet_api_grpc_rere(
398
- address=address,
436
+ address=fleet_address,
399
437
  state_factory=state_factory,
400
438
  certificates=certificates,
401
439
  interceptors=interceptors,
@@ -596,7 +634,7 @@ def _run_fleet_api_rest(
596
634
  ssl_keyfile: Optional[str],
597
635
  ssl_certfile: Optional[str],
598
636
  state_factory: StateFactory,
599
- workers: int,
637
+ num_workers: int,
600
638
  ) -> None:
601
639
  """Run Driver API (REST-based)."""
602
640
  try:
@@ -605,12 +643,7 @@ def _run_fleet_api_rest(
605
643
  from flwr.server.superlink.fleet.rest_rere.rest_api import app as fast_api_app
606
644
  except ModuleNotFoundError:
607
645
  sys.exit(MISSING_EXTRA_REST)
608
- if workers != 1:
609
- raise ValueError(
610
- f"The supported number of workers for the Fleet API (REST server) is "
611
- f"1. Instead given {workers}. The functionality of >1 workers will be "
612
- f"added in the future releases."
613
- )
646
+
614
647
  log(INFO, "Starting Flower REST server")
615
648
 
616
649
  # See: https://www.starlette.io/applications/#accessing-the-app-instance
@@ -624,7 +657,7 @@ def _run_fleet_api_rest(
624
657
  access_log=True,
625
658
  ssl_keyfile=ssl_keyfile,
626
659
  ssl_certfile=ssl_certfile,
627
- workers=workers,
660
+ workers=num_workers,
628
661
  )
629
662
 
630
663
 
@@ -732,50 +765,27 @@ def _add_args_common(parser: argparse.ArgumentParser) -> None:
732
765
  def _add_args_driver_api(parser: argparse.ArgumentParser) -> None:
733
766
  parser.add_argument(
734
767
  "--driver-api-address",
735
- help="Driver API (gRPC) server address (IPv4, IPv6, or a domain name)",
768
+ help="Driver API (gRPC) server address (IPv4, IPv6, or a domain name).",
736
769
  default=ADDRESS_DRIVER_API,
737
770
  )
738
771
 
739
772
 
740
773
  def _add_args_fleet_api(parser: argparse.ArgumentParser) -> None:
741
774
  # Fleet API transport layer type
742
- ex_group = parser.add_mutually_exclusive_group()
743
- ex_group.add_argument(
744
- "--grpc-rere",
745
- action="store_const",
746
- dest="fleet_api_type",
747
- const=TRANSPORT_TYPE_GRPC_RERE,
775
+ parser.add_argument(
776
+ "--fleet-api-type",
748
777
  default=TRANSPORT_TYPE_GRPC_RERE,
749
- help="Start a Fleet API server (gRPC-rere)",
750
- )
751
- ex_group.add_argument(
752
- "--rest",
753
- action="store_const",
754
- dest="fleet_api_type",
755
- const=TRANSPORT_TYPE_REST,
756
- help="Start a Fleet API server (REST, experimental)",
757
- )
758
-
759
- # Fleet API gRPC-rere options
760
- grpc_rere_group = parser.add_argument_group(
761
- "Fleet API (gRPC-rere) server options", ""
762
- )
763
- grpc_rere_group.add_argument(
764
- "--grpc-rere-fleet-api-address",
765
- help="Fleet API (gRPC-rere) server address (IPv4, IPv6, or a domain name)",
766
- default=ADDRESS_FLEET_API_GRPC_RERE,
778
+ type=str,
779
+ choices=[TRANSPORT_TYPE_GRPC_RERE, TRANSPORT_TYPE_REST],
780
+ help="Start a gRPC-rere or REST (experimental) Fleet API server.",
767
781
  )
768
-
769
- # Fleet API REST options
770
- rest_group = parser.add_argument_group("Fleet API (REST) server options", "")
771
- rest_group.add_argument(
772
- "--rest-fleet-api-address",
773
- help="Fleet API (REST) server address (IPv4, IPv6, or a domain name)",
774
- default=ADDRESS_FLEET_API_REST,
782
+ parser.add_argument(
783
+ "--fleet-api-address",
784
+ help="Fleet API server address (IPv4, IPv6, or a domain name).",
775
785
  )
776
- rest_group.add_argument(
777
- "--rest-fleet-api-workers",
778
- help="Set the number of concurrent workers for the Fleet API REST server.",
779
- type=int,
786
+ parser.add_argument(
787
+ "--fleet-api-num-workers",
780
788
  default=1,
789
+ type=int,
790
+ help="Set the number of concurrent workers for the Fleet API server.",
781
791
  )
@@ -22,12 +22,14 @@ from pathlib import Path
22
22
  from typing import Optional
23
23
 
24
24
  from flwr.common import Context, EventType, RecordSet, event
25
- from flwr.common.logger import log, update_console_handler
25
+ from flwr.common.logger import log, update_console_handler, warn_deprecated_feature
26
26
  from flwr.common.object_ref import load_app
27
27
 
28
28
  from .driver import Driver, GrpcDriver
29
29
  from .server_app import LoadServerAppError, ServerApp
30
30
 
31
+ ADDRESS_DRIVER_API = "0.0.0.0:9091"
32
+
31
33
 
32
34
  def run(
33
35
  driver: Driver,
@@ -76,6 +78,23 @@ def run_server_app() -> None:
76
78
 
77
79
  args = _parse_args_run_server_app().parse_args()
78
80
 
81
+ if args.server != ADDRESS_DRIVER_API:
82
+ warn = "Passing flag --server is deprecated. Use --superlink instead."
83
+ warn_deprecated_feature(warn)
84
+
85
+ if args.superlink != ADDRESS_DRIVER_API:
86
+ # if `--superlink` also passed, then
87
+ # warn user that this argument overrides what was passed with `--server`
88
+ log(
89
+ WARN,
90
+ "Both `--server` and `--superlink` were passed. "
91
+ "`--server` will be ignored. Connecting to the Superlink Driver API "
92
+ "at %s.",
93
+ args.superlink,
94
+ )
95
+ else:
96
+ args.superlink = args.server
97
+
79
98
  update_console_handler(
80
99
  level=DEBUG if args.verbose else INFO,
81
100
  timestamps=args.verbose,
@@ -95,7 +114,7 @@ def run_server_app() -> None:
95
114
  WARN,
96
115
  "Option `--insecure` was set. "
97
116
  "Starting insecure HTTP client connected to %s.",
98
- args.server,
117
+ args.superlink,
99
118
  )
100
119
  root_certificates = None
101
120
  else:
@@ -109,7 +128,7 @@ def run_server_app() -> None:
109
128
  DEBUG,
110
129
  "Starting secure HTTPS client connected to %s "
111
130
  "with the following certificates: %s.",
112
- args.server,
131
+ args.superlink,
113
132
  cert_path,
114
133
  )
115
134
 
@@ -130,7 +149,7 @@ def run_server_app() -> None:
130
149
 
131
150
  # Initialize GrpcDriver
132
151
  driver = GrpcDriver(
133
- driver_service_address=args.server,
152
+ driver_service_address=args.superlink,
134
153
  root_certificates=root_certificates,
135
154
  fab_id=args.fab_id,
136
155
  fab_version=args.fab_version,
@@ -175,9 +194,14 @@ def _parse_args_run_server_app() -> argparse.ArgumentParser:
175
194
  )
176
195
  parser.add_argument(
177
196
  "--server",
178
- default="0.0.0.0:9091",
197
+ default=ADDRESS_DRIVER_API,
179
198
  help="Server address",
180
199
  )
200
+ parser.add_argument(
201
+ "--superlink",
202
+ default=ADDRESS_DRIVER_API,
203
+ help="SuperLink Driver API (gRPC-rere) address (IPv4, IPv6, or a domain name)",
204
+ )
181
205
  parser.add_argument(
182
206
  "--dir",
183
207
  default="",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: flwr-nightly
3
- Version: 1.9.0.dev20240604
3
+ Version: 1.9.0.dev20240608
4
4
  Summary: Flower: A Friendly Federated Learning Framework
5
5
  Home-page: https://flower.ai
6
6
  License: Apache-2.0
@@ -41,8 +41,8 @@ flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl,sha256=yp4w6LZn2v67AvYR
41
41
  flwr/cli/run/__init__.py,sha256=oCd6HmQDx-sqver1gecgx-uMA38BLTSiiKpl7RGNceg,789
42
42
  flwr/cli/run/run.py,sha256=Oadt7JsJX549JG-2P1UPdF11vnblLWS8uGvuVx0modA,2687
43
43
  flwr/cli/utils.py,sha256=px-M-IlBLu6Ez-Sc9tWhsJRjWurRaZTmxB9ASz8wurk,4119
44
- flwr/client/__init__.py,sha256=CivBxRFjK6gXHN5kUUf9UaZQHa_NHlEM867WWB-H0D8,1268
45
- flwr/client/app.py,sha256=rzfaHiXxrtjwyhHrHb3epRD6NNw07YzL5DoZO6eW7RA,22313
44
+ flwr/client/__init__.py,sha256=tcgMyAW8brnmAIk4NmXkonVjYV3lafQJD4vfZ3OJ6kA,1279
45
+ flwr/client/app.py,sha256=FjCJ6_ORVeDgfB0NDLg-mBOPvz1eUbZbatPvCaePRrw,23035
46
46
  flwr/client/client.py,sha256=Vp9UkOkoHdNfn6iMYZsj_5m_GICiFfUlKEVaLad-YhM,8183
47
47
  flwr/client/client_app.py,sha256=2jyVTzu8pwDtg66z4FjAa_kPzg31Q8-hx-RkDhguIqw,8635
48
48
  flwr/client/dpfedavg_numpy_client.py,sha256=9Tnig4iml2J88HBKNahegjXjbfvIQyBtaIQaqjbeqsA,7435
@@ -55,7 +55,7 @@ flwr/client/heartbeat.py,sha256=cx37mJBH8LyoIN4Lks85wtqT1mnU5GulQnr4pGCvAq0,2404
55
55
  flwr/client/message_handler/__init__.py,sha256=abHvBRJJiiaAMNgeILQbMOa6h8WqMK2BcnvxwQZFpic,719
56
56
  flwr/client/message_handler/message_handler.py,sha256=ml_FlduAJ5pxO31n1tKRrWfQRSxkMgKLbwXXcRsNSos,6553
57
57
  flwr/client/message_handler/task_handler.py,sha256=ZDJBKmrn2grRMNl1rU1iGs7FiMHL5VmZiSp_6h9GHVU,1824
58
- flwr/client/mod/__init__.py,sha256=apqhs7bslrGgQK91JR56mEcwj5JihL0NF_XKQwqaQuo,1143
58
+ flwr/client/mod/__init__.py,sha256=7ai56tcBxppD_Qn0koE7vmdo-WdU4TDTA0QDE5dhLKE,1159
59
59
  flwr/client/mod/centraldp_mods.py,sha256=UGwNuqpmOWfLdfJITFgdi1TG-nLjuSb-cbEyoyfDgxQ,5415
60
60
  flwr/client/mod/comms_mods.py,sha256=QzJF7lgbYGnZvY805rkBfDsYCRC0HBHeDkJQ_JXhUZY,2624
61
61
  flwr/client/mod/localdp_mod.py,sha256=SBDhW71vY6lEU_lQNOySLUWypkNwUwuHAtbBErOarpM,4982
@@ -69,7 +69,7 @@ flwr/client/numpy_client.py,sha256=u76GWAdHmJM88Agm2EgLQSvO8Jnk225mJTk-_TmPjFE,1
69
69
  flwr/client/rest_client/__init__.py,sha256=ThwOnkMdzxo_UuyTI47Q7y9oSpuTgNT2OuFvJCfuDiw,735
70
70
  flwr/client/rest_client/connection.py,sha256=MspqM5RjrQe09_2BUEEVGstA5x9Qz_RWdXXraOic3i8,11520
71
71
  flwr/client/supernode/__init__.py,sha256=SUhWOzcgXRNXk1V9UgB5-FaWukqqrOEajVUHEcPkwyQ,865
72
- flwr/client/supernode/app.py,sha256=7OGgDnDN67Y_EKrIBUWRCMVjwVr4nl_sdUPUaQd_tOM,9915
72
+ flwr/client/supernode/app.py,sha256=sc0VD8Il2UI1Lnh4tQwKSQMSsiS30WFrZtVMnz7WpWM,10873
73
73
  flwr/client/typing.py,sha256=c9EvjlEjasxn1Wqx6bGl6Xg6vM1gMFfmXht-E2i5J-k,1006
74
74
  flwr/common/__init__.py,sha256=dHOptgKxna78CEQLD5Yu0QIsoSgpIIw5AhIUZCHDWAU,3721
75
75
  flwr/common/address.py,sha256=iTAN9jtmIGMrWFnx9XZQl45ZEtQJVZZLYPRBSNVARGI,1882
@@ -142,7 +142,7 @@ flwr/proto/transport_pb2_grpc.py,sha256=vLN3EHtx2aEEMCO4f1Upu-l27BPzd3-5pV-u8wPc
142
142
  flwr/proto/transport_pb2_grpc.pyi,sha256=AGXf8RiIiW2J5IKMlm_3qT3AzcDa4F3P5IqUjve_esA,766
143
143
  flwr/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
144
144
  flwr/server/__init__.py,sha256=PWyHKu-_KFxGI7oFWSWwqMfTiG_phWECT80iv0saouA,1716
145
- flwr/server/app.py,sha256=aCKA2uYWzkDXrVyeCFvCG_0wGS28NeFXNf1TzOhoJ98,28034
145
+ flwr/server/app.py,sha256=Gqhl54ATKe3BE8rk68IzZkg0a9klaDUJNMjYetxdRi0,28131
146
146
  flwr/server/client_manager.py,sha256=T8UDSRJBVD3fyIDI7NTAA-NA7GPrMNNgH2OAF54RRxE,6127
147
147
  flwr/server/client_proxy.py,sha256=4G-oTwhb45sfWLx2uZdcXD98IZwdTS6F88xe3akCdUg,2399
148
148
  flwr/server/compat/__init__.py,sha256=VxnJtJyOjNFQXMNi9hIuzNlZM5n0Hj1p3aq_Pm2udw4,892
@@ -156,7 +156,7 @@ flwr/server/driver/driver.py,sha256=t9SSSDlo9wT_y2Nl7waGYMTm2VlkvK3_bOb7ggPPlho,
156
156
  flwr/server/driver/grpc_driver.py,sha256=rdjkcAmtRWKeqJw4xDFqULuwVf0G2nLhfbOTrNUvPeY,11832
157
157
  flwr/server/driver/inmemory_driver.py,sha256=XfdLV3mVorTWBfthBkErJDLm8jXZ834IHF3139lTS5o,6490
158
158
  flwr/server/history.py,sha256=bBOHKyX1eQONIsUx4EUU-UnAk1i0EbEl8ioyMq_UWQ8,5063
159
- flwr/server/run_serverapp.py,sha256=avLi_yRNE5jD2ql95gzh04BTUbHvzH-N848_mdnnkVk,5972
159
+ flwr/server/run_serverapp.py,sha256=nKrA9Vhs3OKeY_T4-kFL-41Qhsp5dszW98yfycOCD6c,6887
160
160
  flwr/server/server.py,sha256=wsXsxMZ9SQ0B42nBnUlcV83NJPycgrgg5bFwcQ4BYBE,17821
161
161
  flwr/server/server_app.py,sha256=Re5Y9ftXlBRJXYHY_8TrNWsjyOUCPC5F_93H0xiZDhI,4400
162
162
  flwr/server/server_config.py,sha256=CZaHVAsMvGLjpWVcLPkiYxgJN4xfIyAiUrCI3fETKY4,1349
@@ -229,8 +229,8 @@ flwr/simulation/ray_transport/ray_actor.py,sha256=_wv2eP7qxkCZ-6rMyYWnjLrGPBZRxj
229
229
  flwr/simulation/ray_transport/ray_client_proxy.py,sha256=oDu4sEPIOu39vrNi-fqDAe10xtNUXMO49bM2RWfRcyw,6738
230
230
  flwr/simulation/ray_transport/utils.py,sha256=TYdtfg1P9VfTdLMOJlifInGpxWHYs9UfUqIv2wfkRLA,2392
231
231
  flwr/simulation/run_simulation.py,sha256=Jmc6DyN5UCY1U1PcDvL04NgYmEQ6ufJ1JisjG5yqfY8,15098
232
- flwr_nightly-1.9.0.dev20240604.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
233
- flwr_nightly-1.9.0.dev20240604.dist-info/METADATA,sha256=G_tlOA4q9i-3c_Wgs7qy1dqWOk0J6Ib5yu6UHp4EbWE,15517
234
- flwr_nightly-1.9.0.dev20240604.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
235
- flwr_nightly-1.9.0.dev20240604.dist-info/entry_points.txt,sha256=8JJPfpqMnXz9c5V_FSt07Xwd-wCWbAO3MFUDXQ5ZGsI,378
236
- flwr_nightly-1.9.0.dev20240604.dist-info/RECORD,,
232
+ flwr_nightly-1.9.0.dev20240608.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
233
+ flwr_nightly-1.9.0.dev20240608.dist-info/METADATA,sha256=3gY0CsNjHke3Kro6kPrXoQBFbkPH4zcuXV4LoGKWV44,15517
234
+ flwr_nightly-1.9.0.dev20240608.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
235
+ flwr_nightly-1.9.0.dev20240608.dist-info/entry_points.txt,sha256=8JJPfpqMnXz9c5V_FSt07Xwd-wCWbAO3MFUDXQ5ZGsI,378
236
+ flwr_nightly-1.9.0.dev20240608.dist-info/RECORD,,