flwr-nightly 1.14.0.dev20241216__py3-none-any.whl → 1.14.0.dev20241217__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of flwr-nightly might be problematic. Click here for more details.

flwr/cli/log.py CHANGED
@@ -34,7 +34,7 @@ from flwr.common.logger import log as logger
34
34
  from flwr.proto.exec_pb2 import StreamLogsRequest # pylint: disable=E0611
35
35
  from flwr.proto.exec_pb2_grpc import ExecStub
36
36
 
37
- from .utils import init_channel, try_obtain_cli_auth_plugin
37
+ from .utils import init_channel, try_obtain_cli_auth_plugin, unauthenticated_exc_handler
38
38
 
39
39
 
40
40
  def start_stream(
@@ -88,8 +88,9 @@ def stream_logs(
88
88
  latest_timestamp = 0.0
89
89
  res = None
90
90
  try:
91
- for res in stub.StreamLogs(req, timeout=duration):
92
- print(res.log_output, end="")
91
+ with unauthenticated_exc_handler():
92
+ for res in stub.StreamLogs(req, timeout=duration):
93
+ print(res.log_output, end="")
93
94
  except grpc.RpcError as e:
94
95
  # pylint: disable=E1101
95
96
  if e.code() != grpc.StatusCode.DEADLINE_EXCEEDED:
@@ -109,9 +110,10 @@ def print_logs(run_id: int, channel: grpc.Channel, timeout: int) -> None:
109
110
  try:
110
111
  while True:
111
112
  try:
112
- # Enforce timeout for graceful exit
113
- for res in stub.StreamLogs(req, timeout=timeout):
114
- print(res.log_output)
113
+ with unauthenticated_exc_handler():
114
+ # Enforce timeout for graceful exit
115
+ for res in stub.StreamLogs(req, timeout=timeout):
116
+ print(res.log_output)
115
117
  except grpc.RpcError as e:
116
118
  # pylint: disable=E1101
117
119
  if e.code() == grpc.StatusCode.DEADLINE_EXCEEDED:
flwr/cli/ls.py CHANGED
@@ -43,7 +43,7 @@ from flwr.proto.exec_pb2 import ( # pylint: disable=E0611
43
43
  )
44
44
  from flwr.proto.exec_pb2_grpc import ExecStub
45
45
 
46
- from .utils import init_channel, try_obtain_cli_auth_plugin
46
+ from .utils import init_channel, try_obtain_cli_auth_plugin, unauthenticated_exc_handler
47
47
 
48
48
  _RunListType = tuple[int, str, str, str, str, str, str, str, str]
49
49
 
@@ -99,7 +99,6 @@ def ls( # pylint: disable=too-many-locals, too-many-branches
99
99
  try:
100
100
  if suppress_output:
101
101
  redirect_output(captured_output)
102
-
103
102
  # Load and validate federation config
104
103
  typer.secho("Loading project configuration... ", fg=typer.colors.BLUE)
105
104
 
@@ -132,6 +131,8 @@ def ls( # pylint: disable=too-many-locals, too-many-branches
132
131
  _list_runs(stub, output_format)
133
132
 
134
133
  except ValueError as err:
134
+ if suppress_output:
135
+ redirect_output(captured_output)
135
136
  typer.secho(
136
137
  f"❌ {err}",
137
138
  fg=typer.colors.RED,
@@ -295,7 +296,8 @@ def _list_runs(
295
296
  output_format: str = CliOutputFormat.DEFAULT,
296
297
  ) -> None:
297
298
  """List all runs."""
298
- res: ListRunsResponse = stub.ListRuns(ListRunsRequest())
299
+ with unauthenticated_exc_handler():
300
+ res: ListRunsResponse = stub.ListRuns(ListRunsRequest())
299
301
  run_dict = {run_id: run_from_proto(proto) for run_id, proto in res.run_dict.items()}
300
302
 
301
303
  formatted_runs = _format_runs(run_dict, res.now)
@@ -311,7 +313,8 @@ def _display_one_run(
311
313
  output_format: str = CliOutputFormat.DEFAULT,
312
314
  ) -> None:
313
315
  """Display information about a specific run."""
314
- res: ListRunsResponse = stub.ListRuns(ListRunsRequest(run_id=run_id))
316
+ with unauthenticated_exc_handler():
317
+ res: ListRunsResponse = stub.ListRuns(ListRunsRequest(run_id=run_id))
315
318
  if not res.run_dict:
316
319
  raise ValueError(f"Run ID {run_id} not found")
317
320
 
flwr/cli/run/run.py CHANGED
@@ -48,7 +48,11 @@ from flwr.proto.exec_pb2 import StartRunRequest # pylint: disable=E0611
48
48
  from flwr.proto.exec_pb2_grpc import ExecStub
49
49
 
50
50
  from ..log import start_stream
51
- from ..utils import init_channel, try_obtain_cli_auth_plugin
51
+ from ..utils import (
52
+ init_channel,
53
+ try_obtain_cli_auth_plugin,
54
+ unauthenticated_exc_handler,
55
+ )
52
56
 
53
57
  CONN_REFRESH_PERIOD = 60 # Connection refresh period for log streaming (seconds)
54
58
 
@@ -166,7 +170,8 @@ def _run_with_exec_api(
166
170
  override_config=user_config_to_proto(parse_config_args(config_overrides)),
167
171
  federation_options=configs_record_to_proto(c_record),
168
172
  )
169
- res = stub.StartRun(req)
173
+ with unauthenticated_exc_handler():
174
+ res = stub.StartRun(req)
170
175
 
171
176
  if res.HasField("run_id"):
172
177
  typer.secho(f"🎊 Successfully started run {res.run_id}", fg=typer.colors.GREEN)
flwr/cli/stop.py CHANGED
@@ -34,7 +34,7 @@ from flwr.common.logger import print_json_error, redirect_output, restore_output
34
34
  from flwr.proto.exec_pb2 import StopRunRequest, StopRunResponse # pylint: disable=E0611
35
35
  from flwr.proto.exec_pb2_grpc import ExecStub
36
36
 
37
- from .utils import init_channel, try_obtain_cli_auth_plugin
37
+ from .utils import init_channel, try_obtain_cli_auth_plugin, unauthenticated_exc_handler
38
38
 
39
39
 
40
40
  def stop( # pylint: disable=R0914
@@ -113,7 +113,8 @@ def stop( # pylint: disable=R0914
113
113
 
114
114
  def _stop_run(stub: ExecStub, run_id: int, output_format: str) -> None:
115
115
  """Stop a run."""
116
- response: StopRunResponse = stub.StopRun(request=StopRunRequest(run_id=run_id))
116
+ with unauthenticated_exc_handler():
117
+ response: StopRunResponse = stub.StopRun(request=StopRunRequest(run_id=run_id))
117
118
  if response.success:
118
119
  typer.secho(f"✅ Run {run_id} successfully stopped.", fg=typer.colors.GREEN)
119
120
  if output_format == CliOutputFormat.JSON:
flwr/cli/utils.py CHANGED
@@ -18,6 +18,8 @@
18
18
  import hashlib
19
19
  import json
20
20
  import re
21
+ from collections.abc import Iterator
22
+ from contextlib import contextmanager
21
23
  from logging import DEBUG
22
24
  from pathlib import Path
23
25
  from typing import Any, Callable, Optional, cast
@@ -231,3 +233,24 @@ def init_channel(
231
233
  )
232
234
  channel.subscribe(on_channel_state_change)
233
235
  return channel
236
+
237
+
238
+ @contextmanager
239
+ def unauthenticated_exc_handler() -> Iterator[None]:
240
+ """Context manager to handle gRPC UNAUTHENTICATED errors.
241
+
242
+ It catches grpc.RpcError exceptions with UNAUTHENTICATED status, informs the user,
243
+ and exits the application. All other exceptions will be allowed to escape.
244
+ """
245
+ try:
246
+ yield
247
+ except grpc.RpcError as e:
248
+ if e.code() != grpc.StatusCode.UNAUTHENTICATED:
249
+ raise
250
+ typer.secho(
251
+ "❌ Authentication failed. Please run `flwr login`"
252
+ " to authenticate and try again.",
253
+ fg=typer.colors.RED,
254
+ bold=True,
255
+ )
256
+ raise typer.Exit(code=1) from None
flwr/client/client.py CHANGED
@@ -22,7 +22,6 @@ from abc import ABC
22
22
 
23
23
  from flwr.common import (
24
24
  Code,
25
- Context,
26
25
  EvaluateIns,
27
26
  EvaluateRes,
28
27
  FitIns,
@@ -34,14 +33,11 @@ from flwr.common import (
34
33
  Parameters,
35
34
  Status,
36
35
  )
37
- from flwr.common.logger import warn_deprecated_feature_with_example
38
36
 
39
37
 
40
38
  class Client(ABC):
41
39
  """Abstract base class for Flower clients."""
42
40
 
43
- _context: Context
44
-
45
41
  def get_properties(self, ins: GetPropertiesIns) -> GetPropertiesRes:
46
42
  """Return set of client's properties.
47
43
 
@@ -143,34 +139,6 @@ class Client(ABC):
143
139
  metrics={},
144
140
  )
145
141
 
146
- @property
147
- def context(self) -> Context:
148
- """Getter for `Context` client attribute."""
149
- warn_deprecated_feature_with_example(
150
- "Accessing the context via the client's attribute is deprecated.",
151
- example_message="Instead, pass it to the client's "
152
- "constructor in your `client_fn()` which already "
153
- "receives a context object.",
154
- code_example="def client_fn(context: Context) -> Client:\n\n"
155
- "\t\t# Your existing client_fn\n\n"
156
- "\t\t# Pass `context` to the constructor\n"
157
- "\t\treturn FlowerClient(context).to_client()",
158
- )
159
- return self._context
160
-
161
- @context.setter
162
- def context(self, context: Context) -> None:
163
- """Setter for `Context` client attribute."""
164
- self._context = context
165
-
166
- def get_context(self) -> Context:
167
- """Get the run context from this client."""
168
- return self.context
169
-
170
- def set_context(self, context: Context) -> None:
171
- """Apply a run context to this client."""
172
- self.context = context
173
-
174
142
  def to_client(self) -> Client:
175
143
  """Return client (itself)."""
176
144
  return self
@@ -105,8 +105,6 @@ def handle_legacy_message_from_msgtype(
105
105
  "Please use `NumPyClient.to_client()` method to convert it to `Client`.",
106
106
  )
107
107
 
108
- client.set_context(context)
109
-
110
108
  message_type = message.metadata.message_type
111
109
 
112
110
  # Handle GetPropertiesIns
@@ -21,13 +21,11 @@ from typing import Callable
21
21
  from flwr.client.client import Client
22
22
  from flwr.common import (
23
23
  Config,
24
- Context,
25
24
  NDArrays,
26
25
  Scalar,
27
26
  ndarrays_to_parameters,
28
27
  parameters_to_ndarrays,
29
28
  )
30
- from flwr.common.logger import warn_deprecated_feature_with_example
31
29
  from flwr.common.typing import (
32
30
  Code,
33
31
  EvaluateIns,
@@ -71,8 +69,6 @@ Example
71
69
  class NumPyClient(ABC):
72
70
  """Abstract base class for Flower clients using NumPy."""
73
71
 
74
- _context: Context
75
-
76
72
  def get_properties(self, config: Config) -> dict[str, Scalar]:
77
73
  """Return a client's set of properties.
78
74
 
@@ -175,34 +171,6 @@ class NumPyClient(ABC):
175
171
  _ = (self, parameters, config)
176
172
  return 0.0, 0, {}
177
173
 
178
- @property
179
- def context(self) -> Context:
180
- """Getter for `Context` client attribute."""
181
- warn_deprecated_feature_with_example(
182
- "Accessing the context via the client's attribute is deprecated.",
183
- example_message="Instead, pass it to the client's "
184
- "constructor in your `client_fn()` which already "
185
- "receives a context object.",
186
- code_example="def client_fn(context: Context) -> Client:\n\n"
187
- "\t\t# Your existing client_fn\n\n"
188
- "\t\t# Pass `context` to the constructor\n"
189
- "\t\treturn FlowerClient(context).to_client()",
190
- )
191
- return self._context
192
-
193
- @context.setter
194
- def context(self, context: Context) -> None:
195
- """Setter for `Context` client attribute."""
196
- self._context = context
197
-
198
- def get_context(self) -> Context:
199
- """Get the run context from this client."""
200
- return self.context
201
-
202
- def set_context(self, context: Context) -> None:
203
- """Apply a run context to this client."""
204
- self.context = context
205
-
206
174
  def to_client(self) -> Client:
207
175
  """Convert to object to Client type and return it."""
208
176
  return _wrap_numpy_client(client=self)
@@ -299,21 +267,9 @@ def _evaluate(self: Client, ins: EvaluateIns) -> EvaluateRes:
299
267
  )
300
268
 
301
269
 
302
- def _get_context(self: Client) -> Context:
303
- """Return context of underlying NumPyClient."""
304
- return self.numpy_client.get_context() # type: ignore
305
-
306
-
307
- def _set_context(self: Client, context: Context) -> None:
308
- """Apply context to underlying NumPyClient."""
309
- self.numpy_client.set_context(context) # type: ignore
310
-
311
-
312
270
  def _wrap_numpy_client(client: NumPyClient) -> Client:
313
271
  member_dict: dict[str, Callable] = { # type: ignore
314
272
  "__init__": _constructor,
315
- "get_context": _get_context,
316
- "set_context": _set_context,
317
273
  }
318
274
 
319
275
  # Add wrapper type methods (if overridden)
@@ -159,6 +159,9 @@ class ServerAppIoServicer(serverappio_pb2_grpc.ServerAppIoServicer):
159
159
  for task_ins in request.task_ins_list:
160
160
  validation_errors = validate_task_ins_or_res(task_ins)
161
161
  _raise_if(bool(validation_errors), ", ".join(validation_errors))
162
+ _raise_if(
163
+ request.run_id != task_ins.run_id, "`task_ins` has mismatched `run_id`"
164
+ )
162
165
 
163
166
  # Store each TaskIns
164
167
  task_ids: list[Optional[UUID]] = []
@@ -193,6 +196,12 @@ class ServerAppIoServicer(serverappio_pb2_grpc.ServerAppIoServicer):
193
196
  # Read from state
194
197
  task_res_list: list[TaskRes] = state.get_task_res(task_ids=task_ids)
195
198
 
199
+ # Validate request
200
+ for task_res in task_res_list:
201
+ _raise_if(
202
+ request.run_id != task_res.run_id, "`task_res` has mismatched `run_id`"
203
+ )
204
+
196
205
  # Delete the TaskIns/TaskRes pairs if TaskRes is found
197
206
  task_ins_ids_to_delete = {
198
207
  UUID(task_res.task.ancestry[0]) for task_res in task_res_list
@@ -761,8 +761,6 @@ class SqliteLinkState(LinkState): # pylint: disable=R0904
761
761
  "federation_options, pending_at, starting_at, running_at, finished_at, "
762
762
  "sub_status, details) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);"
763
763
  )
764
- if fab_hash:
765
- fab_id, fab_version = "", ""
766
764
  override_config_json = json.dumps(override_config)
767
765
  data = [
768
766
  sint64_run_id,
@@ -54,6 +54,7 @@ from flwr.proto.simulationio_pb2 import ( # pylint: disable=E0611
54
54
  )
55
55
  from flwr.server.superlink.ffs.ffs_factory import FfsFactory
56
56
  from flwr.server.superlink.linkstate import LinkStateFactory
57
+ from flwr.server.superlink.utils import abort_if
57
58
 
58
59
 
59
60
  class SimulationIoServicer(simulationio_pb2_grpc.SimulationIoServicer):
@@ -110,6 +111,15 @@ class SimulationIoServicer(simulationio_pb2_grpc.SimulationIoServicer):
110
111
  """Push Simulation process outputs."""
111
112
  log(DEBUG, "SimultionIoServicer.PushSimulationOutputs")
112
113
  state = self.state_factory.state()
114
+
115
+ # Abort if the run is not running
116
+ abort_if(
117
+ request.run_id,
118
+ [Status.PENDING, Status.STARTING, Status.FINISHED],
119
+ state,
120
+ context,
121
+ )
122
+
113
123
  state.set_serverapp_context(request.run_id, context_from_proto(request.context))
114
124
  return PushSimulationOutputsResponse()
115
125
 
@@ -120,6 +130,9 @@ class SimulationIoServicer(simulationio_pb2_grpc.SimulationIoServicer):
120
130
  log(DEBUG, "SimultionIoServicer.UpdateRunStatus")
121
131
  state = self.state_factory.state()
122
132
 
133
+ # Abort if the run is finished
134
+ abort_if(request.run_id, [Status.FINISHED], state, context)
135
+
123
136
  # Update the run status
124
137
  state.update_run_status(
125
138
  run_id=request.run_id, new_status=run_status_from_proto(request.run_status)
flwr/simulation/app.py CHANGED
@@ -48,6 +48,7 @@ from flwr.common.logger import (
48
48
  from flwr.common.serde import (
49
49
  configs_record_from_proto,
50
50
  context_from_proto,
51
+ context_to_proto,
51
52
  fab_from_proto,
52
53
  run_from_proto,
53
54
  run_status_to_proto,
@@ -202,7 +203,7 @@ def run_simulation_process( # pylint: disable=R0914, disable=W0212, disable=R09
202
203
  enable_tf_gpu_growth: bool = fed_opt.get("enable_tf_gpu_growth", False)
203
204
 
204
205
  # Launch the simulation
205
- _run_simulation(
206
+ updated_context = _run_simulation(
206
207
  server_app_attr=server_app_attr,
207
208
  client_app_attr=client_app_attr,
208
209
  num_supernodes=num_supernodes,
@@ -217,7 +218,7 @@ def run_simulation_process( # pylint: disable=R0914, disable=W0212, disable=R09
217
218
  )
218
219
 
219
220
  # Send resulting context
220
- context_proto = None # context_to_proto(updated_context)
221
+ context_proto = context_to_proto(updated_context)
221
222
  out_req = PushSimulationOutputsRequest(
222
223
  run_id=run.run_id, context=context_proto
223
224
  )
@@ -24,6 +24,7 @@ import threading
24
24
  import traceback
25
25
  from logging import DEBUG, ERROR, INFO, WARNING
26
26
  from pathlib import Path
27
+ from queue import Empty, Queue
27
28
  from typing import Any, Optional
28
29
 
29
30
  from flwr.cli.config_utils import load_and_validate
@@ -126,7 +127,7 @@ def run_simulation_from_cli() -> None:
126
127
  run = Run.create_empty(run_id)
127
128
  run.override_config = override_config
128
129
 
129
- _run_simulation(
130
+ _ = _run_simulation(
130
131
  server_app_attr=server_app_attr,
131
132
  client_app_attr=client_app_attr,
132
133
  num_supernodes=args.num_supernodes,
@@ -206,7 +207,7 @@ def run_simulation(
206
207
  "\n\tflwr.simulation.run_simulationt(...)",
207
208
  )
208
209
 
209
- _run_simulation(
210
+ _ = _run_simulation(
210
211
  num_supernodes=num_supernodes,
211
212
  client_app=client_app,
212
213
  server_app=server_app,
@@ -229,6 +230,7 @@ def run_serverapp_th(
229
230
  has_exception: threading.Event,
230
231
  enable_tf_gpu_growth: bool,
231
232
  run_id: int,
233
+ ctx_queue: "Queue[Context]",
232
234
  ) -> threading.Thread:
233
235
  """Run SeverApp in a thread."""
234
236
 
@@ -241,6 +243,7 @@ def run_serverapp_th(
241
243
  _server_app_run_config: UserConfig,
242
244
  _server_app_attr: Optional[str],
243
245
  _server_app: Optional[ServerApp],
246
+ _ctx_queue: "Queue[Context]",
244
247
  ) -> None:
245
248
  """Run SeverApp, after check if GPU memory growth has to be set.
246
249
 
@@ -261,13 +264,14 @@ def run_serverapp_th(
261
264
  )
262
265
 
263
266
  # Run ServerApp
264
- _run(
267
+ updated_context = _run(
265
268
  driver=_driver,
266
269
  context=context,
267
270
  server_app_dir=_server_app_dir,
268
271
  server_app_attr=_server_app_attr,
269
272
  loaded_server_app=_server_app,
270
273
  )
274
+ _ctx_queue.put(updated_context)
271
275
  except Exception as ex: # pylint: disable=broad-exception-caught
272
276
  log(ERROR, "ServerApp thread raised an exception: %s", ex)
273
277
  log(ERROR, traceback.format_exc())
@@ -291,6 +295,7 @@ def run_serverapp_th(
291
295
  server_app_run_config,
292
296
  server_app_attr,
293
297
  server_app,
298
+ ctx_queue,
294
299
  ),
295
300
  )
296
301
  serverapp_th.start()
@@ -313,7 +318,7 @@ def _main_loop(
313
318
  server_app: Optional[ServerApp] = None,
314
319
  server_app_attr: Optional[str] = None,
315
320
  server_app_run_config: Optional[UserConfig] = None,
316
- ) -> None:
321
+ ) -> Context:
317
322
  """Start ServerApp on a separate thread, then launch Simulation Engine."""
318
323
  # Initialize StateFactory
319
324
  state_factory = LinkStateFactory(":flwr-in-memory-state:")
@@ -323,6 +328,13 @@ def _main_loop(
323
328
  server_app_thread_has_exception = threading.Event()
324
329
  serverapp_th = None
325
330
  success = True
331
+ updated_context = Context(
332
+ run_id=run.run_id,
333
+ node_id=0,
334
+ node_config=UserConfig(),
335
+ state=RecordSet(),
336
+ run_config=UserConfig(),
337
+ )
326
338
  try:
327
339
  # Register run
328
340
  log(DEBUG, "Pre-registering run with id %s", run.run_id)
@@ -337,6 +349,7 @@ def _main_loop(
337
349
  # Initialize Driver
338
350
  driver = InMemoryDriver(state_factory=state_factory)
339
351
  driver.set_run(run_id=run.run_id)
352
+ output_context_queue: "Queue[Context]" = Queue()
340
353
 
341
354
  # Get and run ServerApp thread
342
355
  serverapp_th = run_serverapp_th(
@@ -349,6 +362,7 @@ def _main_loop(
349
362
  has_exception=server_app_thread_has_exception,
350
363
  enable_tf_gpu_growth=enable_tf_gpu_growth,
351
364
  run_id=run.run_id,
365
+ ctx_queue=output_context_queue,
352
366
  )
353
367
 
354
368
  # Start Simulation Engine
@@ -366,6 +380,11 @@ def _main_loop(
366
380
  flwr_dir=flwr_dir,
367
381
  )
368
382
 
383
+ updated_context = output_context_queue.get(timeout=3)
384
+
385
+ except Empty:
386
+ log(DEBUG, "Queue timeout. No context received.")
387
+
369
388
  except Exception as ex:
370
389
  log(ERROR, "An exception occurred !! %s", ex)
371
390
  log(ERROR, traceback.format_exc())
@@ -382,6 +401,7 @@ def _main_loop(
382
401
  raise RuntimeError("Exception in ServerApp thread")
383
402
 
384
403
  log(DEBUG, "Stopping Simulation Engine now.")
404
+ return updated_context
385
405
 
386
406
 
387
407
  # pylint: disable=too-many-arguments,too-many-locals,too-many-positional-arguments
@@ -401,7 +421,7 @@ def _run_simulation(
401
421
  enable_tf_gpu_growth: bool = False,
402
422
  verbose_logging: bool = False,
403
423
  is_app: bool = False,
404
- ) -> None:
424
+ ) -> Context:
405
425
  """Launch the Simulation Engine."""
406
426
  if backend_config is None:
407
427
  backend_config = {}
@@ -480,7 +500,8 @@ def _run_simulation(
480
500
  # Set logger propagation to False to prevent duplicated log output in Colab.
481
501
  logger = set_logger_propagation(logger, False)
482
502
 
483
- _main_loop(*args)
503
+ updated_context = _main_loop(*args)
504
+ return updated_context
484
505
 
485
506
 
486
507
  def _parse_args_run_simulation() -> argparse.ArgumentParser:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: flwr-nightly
3
- Version: 1.14.0.dev20241216
3
+ Version: 1.14.0.dev20241217
4
4
  Summary: Flower: A Friendly Federated AI Framework
5
5
  Home-page: https://flower.ai
6
6
  License: Apache-2.0
@@ -6,10 +6,10 @@ flwr/cli/cli_user_auth_interceptor.py,sha256=rEjgAZmzHO0GjwdyZib6bkTI2X59ErJAZlu
6
6
  flwr/cli/config_utils.py,sha256=I4_EMv2f68mfrL_QuOYoAG--yDfKisE7tGiIg09G2YQ,12079
7
7
  flwr/cli/example.py,sha256=uk5CoD0ZITgpY_ffsTbEKf8XOOCSUzByjHPcMSPqV18,2216
8
8
  flwr/cli/install.py,sha256=0AD0qJD79SKgBnWOQlphcubfr4zHk8jTpFgwZbJBI_g,8180
9
- flwr/cli/log.py,sha256=SXr12PepUUU0YDNIMl3m8lguL7Tmf6MrpFBsxZcRmcg,5976
9
+ flwr/cli/log.py,sha256=O7MBpsJp114PIZb-7Cru-KM6fqyneFQkqoQbQsqQmZU,6121
10
10
  flwr/cli/login/__init__.py,sha256=6_9zOzbPOAH72K2wX3-9dXTAbS7Mjpa5sEn2lA6eHHI,800
11
11
  flwr/cli/login/login.py,sha256=bZZ3hVeGpF5805R0Eg_SBZUGwrLAWmyaoLhLw6vQFcg,2764
12
- flwr/cli/ls.py,sha256=II1aCv6q0yi6yl5AcBQ-en250ZUkh82rw_Kt-RewtBQ,10859
12
+ flwr/cli/ls.py,sha256=K_3Bt2RfETw4V7J4qgo8_Wx-Y_bWZqttuO879Ppxo5Y,11056
13
13
  flwr/cli/new/__init__.py,sha256=pOQtPT9W4kCIttcKne5m-FtJbvTqdjTVJxzQ9AUYK8I,790
14
14
  flwr/cli/new/new.py,sha256=scyyKt8mzkc3El1bypgkHjKwVQEc2-q4I50PxriPFdI,9922
15
15
  flwr/cli/new/templates/__init__.py,sha256=4luU8RL-CK8JJCstQ_ON809W9bNTkY1l9zSaPKBkgwY,725
@@ -65,12 +65,12 @@ flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl,sha256=UtH3Vslg2S8fIKIHC-d
65
65
  flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl,sha256=01HArBqRrbZT3O7pXOM9MqduXMNm525wv7Sj6dvYMJE,686
66
66
  flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl,sha256=KVCIOEYNWnq6j7XOboXqZshc9aQ2PyRDUu7bZtmfJ24,710
67
67
  flwr/cli/run/__init__.py,sha256=cCsKVB0SFzh2b3QmGba6BHckB85xlhjh3mh4pBpACtY,790
68
- flwr/cli/run/run.py,sha256=hUYedvUAxX28i0ytMIyKhO4kJM9MhUdN5KbzKLl_0Y0,7803
69
- flwr/cli/stop.py,sha256=cIvTpS9rRGzHbpdlWz03XOSXNCxMVXORV-7YsmSV1Vg,4540
70
- flwr/cli/utils.py,sha256=25S3IqC2yiC94AcSJ6XQXruDCCH7iZU3mVRHBaAKExo,7873
68
+ flwr/cli/run/run.py,sha256=BvpjYyUvDhVMvO5cG711ihtdeSbls9p8zVAuFGETLA8,7893
69
+ flwr/cli/stop.py,sha256=1T9RNRCH8dxjmBT38hFtKAWY9Gb7RMCMCML7kex9WzE,4613
70
+ flwr/cli/utils.py,sha256=kko38Sci_yy5V5f8ZXwKyAzG-7BRlkKi2l2vlFOx5ug,8626
71
71
  flwr/client/__init__.py,sha256=DGDoO0AEAfz-0CUFmLdyUUweAS64-07AOnmDfWUefK4,1192
72
72
  flwr/client/app.py,sha256=XJWu-kPswM52oLYXaOLKr0gj87KPNRI7M0Na9oBsDK4,34784
73
- flwr/client/client.py,sha256=lIIUgxHk4tofk2RljVBL5wFzPR_Ob9iURg0NpyKufPY,9081
73
+ flwr/client/client.py,sha256=8o58nd9o6ZFcMIaVYPGcV4MSjBG4H0oFgWiv8ZEO3oA,7895
74
74
  flwr/client/client_app.py,sha256=cTig-N00YzTucbo9zNi6I21J8PlbflU_8J_f5CI-Wpw,10390
75
75
  flwr/client/clientapp/__init__.py,sha256=kZqChGnTChQ1WGSUkIlW2S5bc0d0mzDubCAmZUGRpEY,800
76
76
  flwr/client/clientapp/app.py,sha256=n3IbbQ__QBjd4n7hhP2oydYg66IvrnSXvwi3sZvnWeU,8949
@@ -87,7 +87,7 @@ flwr/client/grpc_rere_client/connection.py,sha256=NqKSoYIJblB4lElZ7EKIgDjLb6KYEc
87
87
  flwr/client/grpc_rere_client/grpc_adapter.py,sha256=sQo0I9T65t97LFGoW_PrmgaTbd18GFgi2DoAI5wQJ4k,5589
88
88
  flwr/client/heartbeat.py,sha256=cx37mJBH8LyoIN4Lks85wtqT1mnU5GulQnr4pGCvAq0,2404
89
89
  flwr/client/message_handler/__init__.py,sha256=QxxQuBNpFPTHx3KiUNvQSlqMKlEnbRR1kFfc1KVje08,719
90
- flwr/client/message_handler/message_handler.py,sha256=wEbSn60qjozUfNaJIPTsSG2X9OsAKBd8D4c7TU4oJc4,6525
90
+ flwr/client/message_handler/message_handler.py,sha256=s7FEfYJp5QB259Pj1L94_9AC24Kh5JyKC2U-E6eNkkY,6492
91
91
  flwr/client/message_handler/task_handler.py,sha256=ZDJBKmrn2grRMNl1rU1iGs7FiMHL5VmZiSp_6h9GHVU,1824
92
92
  flwr/client/mod/__init__.py,sha256=37XeXZLFq_tzFVKVtC9JaigM2bSAU7BrGQvMPCE3Q28,1159
93
93
  flwr/client/mod/centraldp_mods.py,sha256=UGwNuqpmOWfLdfJITFgdi1TG-nLjuSb-cbEyoyfDgxQ,5415
@@ -101,7 +101,7 @@ flwr/client/nodestate/__init__.py,sha256=6FTlzydo1j0n55Tb-Qo0XmuqTUyRxg3x7jHgo3g
101
101
  flwr/client/nodestate/in_memory_nodestate.py,sha256=MKI3jVPARPWJmNGw61k1-9LIXROkTx2PrhWjDM8cpHk,1291
102
102
  flwr/client/nodestate/nodestate.py,sha256=CmHZdR6kVO8tkffg42W0Yb9JdRmrUonZ9deXfUNK6Hg,1024
103
103
  flwr/client/nodestate/nodestate_factory.py,sha256=apUbcJG0a_FUVsc0TkNN3q9yovc9u_J34u9iuLFKTLQ,1430
104
- flwr/client/numpy_client.py,sha256=tqGyhIkeeZQGr65BR03B7TWgx4rW3FA7G2874D8z_VU,11167
104
+ flwr/client/numpy_client.py,sha256=chTkL9dOtK_wgUoYtzp5mfDOC1k8xPAd1qPIsB3hcjA,9581
105
105
  flwr/client/rest_client/__init__.py,sha256=5KGlp7pjc1dhNRkKlaNtUfQmg8wrRFh9lS3P3uRS-7Q,735
106
106
  flwr/client/rest_client/connection.py,sha256=NWBu7Cc8LUTlf7GjJl3rgdCAykrE5suul_xZUV21OgI,12659
107
107
  flwr/client/run_info_store.py,sha256=ZN2Phi4DSLbSyzg8RmzJcVYh1g6eurHOmWRCT7GMtw4,4040
@@ -259,7 +259,7 @@ flwr/server/strategy/strategy.py,sha256=cXapkD5uDrt5C-RbmWDn9FLoap3Q41i7GKvbmfbC
259
259
  flwr/server/superlink/__init__.py,sha256=8tHYCfodUlRD8PCP9fHgvu8cz5N31A2QoRVL0jDJ15E,707
260
260
  flwr/server/superlink/driver/__init__.py,sha256=5soEK5QSvxNjmJQ-CGTWROc4alSAeU0e9Ad9RDhsd3E,717
261
261
  flwr/server/superlink/driver/serverappio_grpc.py,sha256=62371xIRzp3k-eQTaSpb9c4TiSfueSuI7Iw5X3IafOY,2186
262
- flwr/server/superlink/driver/serverappio_servicer.py,sha256=EjqseReChpd0b4ZPEVPbWiWlVMsqK-WhIbH7jNHi7IM,11880
262
+ flwr/server/superlink/driver/serverappio_servicer.py,sha256=mgyV0XTONO7Vqb7sGOLu6AkCXWpBSeJ2s7ksadK1vE4,12197
263
263
  flwr/server/superlink/ffs/__init__.py,sha256=FAY-zShcfPmOxosok2QyT6hTNMNctG8cH9s_nIl8jkI,840
264
264
  flwr/server/superlink/ffs/disk_ffs.py,sha256=n_Ah0sQwXGVQ9wj5965nLjdkQQbpoHCljjXKFnwftsU,3297
265
265
  flwr/server/superlink/ffs/ffs.py,sha256=qLI1UfosJugu2BKOJWqHIhafTm-YiuKqGf3OGWPH0NM,2395
@@ -288,11 +288,11 @@ flwr/server/superlink/linkstate/__init__.py,sha256=v-2JyJlCB3qyhMNwMjmcNVOq4rkoo
288
288
  flwr/server/superlink/linkstate/in_memory_linkstate.py,sha256=haJiQ0TkinyVH4vOG-EUuEhhI78YESgjKYU6qVgXics,21638
289
289
  flwr/server/superlink/linkstate/linkstate.py,sha256=sbI7JLAZNMtVH1ZRjRjWDrws4mL0fjvrywxAKgCw9Mw,12936
290
290
  flwr/server/superlink/linkstate/linkstate_factory.py,sha256=ISSMjDlwuN7swxjOeYlTNpI_kuZ8PGkMcJnf1dbhUSE,2069
291
- flwr/server/superlink/linkstate/sqlite_linkstate.py,sha256=9xmHV15hAicEtViCv4X-lHQosaCUwT6-NPd2UnY0zhA,42662
291
+ flwr/server/superlink/linkstate/sqlite_linkstate.py,sha256=q_XyGRxL6vTT-fe0L6dKnPEZq0ARIT4D_ytGajU9Zzk,42592
292
292
  flwr/server/superlink/linkstate/utils.py,sha256=d5uqqIOCKfd54X8CFNfUr3AWqPLpgmzsC_RagRwFugM,13321
293
293
  flwr/server/superlink/simulation/__init__.py,sha256=mg-oapC9dkzEfjXPQFior5lpWj4g9kwbLovptyYM_g0,718
294
294
  flwr/server/superlink/simulation/simulationio_grpc.py,sha256=5wflYW_TS0mjmPG6OYuHMJwXD2_cYmUNhFkdOU0jMWQ,2237
295
- flwr/server/superlink/simulation/simulationio_servicer.py,sha256=UqOyc76IQ5iDELkyuET1J9F20K0mYib30HyVLwX_2Mg,6546
295
+ flwr/server/superlink/simulation/simulationio_servicer.py,sha256=J_TmdqM-Bxgp-iPEI3tvCuBpykw1UX0FouMQalEYAF4,6907
296
296
  flwr/server/superlink/utils.py,sha256=KVb3K_g2vYfu9TnftcN0ewmev133WZcjuEePMm8d7GE,2137
297
297
  flwr/server/typing.py,sha256=5kaRLZuxTEse9A0g7aVna2VhYxU3wTq1f3d3mtw7kXs,1019
298
298
  flwr/server/utils/__init__.py,sha256=pltsPHJoXmUIr3utjwwYxu7_ZAGy5u4MVHzv9iA5Un8,908
@@ -305,13 +305,13 @@ flwr/server/workflow/secure_aggregation/__init__.py,sha256=3XlgDOjD_hcukTGl6Bc1B
305
305
  flwr/server/workflow/secure_aggregation/secagg_workflow.py,sha256=l2IdMdJjs1bgHs5vQgLSOVzar7v2oxUn46oCrnVE1rM,5839
306
306
  flwr/server/workflow/secure_aggregation/secaggplus_workflow.py,sha256=rfn2etO1nb7u-1oRl-H9q3enJZz3shMINZaBB7rPsC4,29671
307
307
  flwr/simulation/__init__.py,sha256=5UcDVJNjFoSwWqHbGM1hKfTTUUNdwAtuoNvNrfvdkUY,1556
308
- flwr/simulation/app.py,sha256=qalNoJxT17bbU-kVQNGTPSFu6C7W9F1oZl4i4nzCJx0,9380
308
+ flwr/simulation/app.py,sha256=Q9vZFVUvy2_QNNUpyElCmAMfe4d90mSoX9rGpzgZjD4,9412
309
309
  flwr/simulation/legacy_app.py,sha256=ySggtKEtXe8L77n8qyGXDA7UPv840MXh-QoalzoGiLU,15780
310
310
  flwr/simulation/ray_transport/__init__.py,sha256=wzcEEwUUlulnXsg6raCA1nGpP3LlAQDtJ8zNkCXcVbA,734
311
311
  flwr/simulation/ray_transport/ray_actor.py,sha256=k11yoAPQzFGQU-KnCCP0ZrfPPdUPXXrBe-1DKM5VdW4,18997
312
312
  flwr/simulation/ray_transport/ray_client_proxy.py,sha256=2vjOKoom3B74C6XU-jC3N6DwYmsLdB-lmkHZ_Xrv96o,7367
313
313
  flwr/simulation/ray_transport/utils.py,sha256=wtbQhKQ4jGoiQDLJNQP17m1DSfL22ERhDBGuoeUFaAQ,2393
314
- flwr/simulation/run_simulation.py,sha256=GY1TIg5jnEoiW3Ak06swYo4jIho1iZposKbq_Bq-bp4,19478
314
+ flwr/simulation/run_simulation.py,sha256=MSD2USh40j8vRrUyJeb3ngtghB8evtFLBMi6nUfpljY,20169
315
315
  flwr/simulation/simulationio_connection.py,sha256=8aAh6MKQkQPMSnWEqA5vua_QzZtoMxG-_-AB23RPhS4,3412
316
316
  flwr/superexec/__init__.py,sha256=fcj366jh4RFby_vDwLroU4kepzqbnJgseZD_jUr_Mko,715
317
317
  flwr/superexec/app.py,sha256=Z6kYHWd62YL0Q4YKyCAbt_BcefNfbKH6V-jCC-1NkZM,1842
@@ -321,8 +321,8 @@ flwr/superexec/exec_servicer.py,sha256=8tFwj1fDBF6PzwLhByTlxM-KNZc83bG1UdE92-8DS
321
321
  flwr/superexec/exec_user_auth_interceptor.py,sha256=K06OU-l4LnYhTDg071hGJuOaQWEJbZsYi5qxUmmtiG0,3704
322
322
  flwr/superexec/executor.py,sha256=_B55WW2TD1fBINpabSSDRenVHXYmvlfhv-k8hJKU4lQ,3115
323
323
  flwr/superexec/simulation.py,sha256=WQDon15oqpMopAZnwRZoTICYCfHqtkvFSqiTQ2hLD_g,4088
324
- flwr_nightly-1.14.0.dev20241216.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
325
- flwr_nightly-1.14.0.dev20241216.dist-info/METADATA,sha256=f4OsNAS5i9xKEW7m-ntvOAXHJA-EOUSsUXb7-rQg4YE,15799
326
- flwr_nightly-1.14.0.dev20241216.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
327
- flwr_nightly-1.14.0.dev20241216.dist-info/entry_points.txt,sha256=JlNxX3qhaV18_2yj5a3kJW1ESxm31cal9iS_N_pf1Rk,538
328
- flwr_nightly-1.14.0.dev20241216.dist-info/RECORD,,
324
+ flwr_nightly-1.14.0.dev20241217.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
325
+ flwr_nightly-1.14.0.dev20241217.dist-info/METADATA,sha256=U7ytaeqIXkDuNUF0Dt5_nCAgh6ILjoWnyYiX1gpo2gM,15799
326
+ flwr_nightly-1.14.0.dev20241217.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
327
+ flwr_nightly-1.14.0.dev20241217.dist-info/entry_points.txt,sha256=JlNxX3qhaV18_2yj5a3kJW1ESxm31cal9iS_N_pf1Rk,538
328
+ flwr_nightly-1.14.0.dev20241217.dist-info/RECORD,,