flwr-nightly 1.13.0.dev20241106__py3-none-any.whl → 1.13.0.dev20241108__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.

Files changed (37) hide show
  1. flwr/cli/run/run.py +16 -5
  2. flwr/client/app.py +10 -6
  3. flwr/client/nodestate/__init__.py +25 -0
  4. flwr/client/nodestate/in_memory_nodestate.py +38 -0
  5. flwr/client/nodestate/nodestate.py +30 -0
  6. flwr/client/nodestate/nodestate_factory.py +37 -0
  7. flwr/common/config.py +10 -0
  8. flwr/common/constant.py +0 -1
  9. flwr/common/object_ref.py +47 -16
  10. flwr/common/typing.py +1 -1
  11. flwr/proto/exec_pb2.py +14 -17
  12. flwr/proto/exec_pb2.pyi +6 -20
  13. flwr/proto/run_pb2.py +32 -27
  14. flwr/proto/run_pb2.pyi +26 -0
  15. flwr/proto/simulationio_pb2.py +2 -2
  16. flwr/proto/simulationio_pb2_grpc.py +34 -0
  17. flwr/proto/simulationio_pb2_grpc.pyi +13 -0
  18. flwr/server/driver/driver.py +1 -1
  19. flwr/server/driver/grpc_driver.py +2 -6
  20. flwr/server/driver/inmemory_driver.py +1 -3
  21. flwr/server/run_serverapp.py +2 -2
  22. flwr/server/serverapp/app.py +1 -1
  23. flwr/server/strategy/aggregate.py +4 -4
  24. flwr/server/superlink/linkstate/in_memory_linkstate.py +0 -16
  25. flwr/server/superlink/linkstate/sqlite_linkstate.py +0 -15
  26. flwr/server/superlink/linkstate/utils.py +2 -33
  27. flwr/server/superlink/simulation/simulationio_servicer.py +22 -1
  28. flwr/simulation/run_simulation.py +1 -1
  29. flwr/superexec/deployment.py +1 -1
  30. flwr/superexec/exec_servicer.py +2 -2
  31. flwr/superexec/executor.py +4 -3
  32. flwr/superexec/simulation.py +8 -8
  33. {flwr_nightly-1.13.0.dev20241106.dist-info → flwr_nightly-1.13.0.dev20241108.dist-info}/METADATA +3 -3
  34. {flwr_nightly-1.13.0.dev20241106.dist-info → flwr_nightly-1.13.0.dev20241108.dist-info}/RECORD +37 -33
  35. {flwr_nightly-1.13.0.dev20241106.dist-info → flwr_nightly-1.13.0.dev20241108.dist-info}/LICENSE +0 -0
  36. {flwr_nightly-1.13.0.dev20241106.dist-info → flwr_nightly-1.13.0.dev20241108.dist-info}/WHEEL +0 -0
  37. {flwr_nightly-1.13.0.dev20241106.dist-info → flwr_nightly-1.13.0.dev20241108.dist-info}/entry_points.txt +0 -0
@@ -36,6 +36,11 @@ class SimulationIoStub(object):
36
36
  request_serializer=flwr_dot_proto_dot_log__pb2.PushLogsRequest.SerializeToString,
37
37
  response_deserializer=flwr_dot_proto_dot_log__pb2.PushLogsResponse.FromString,
38
38
  )
39
+ self.GetFederationOptions = channel.unary_unary(
40
+ '/flwr.proto.SimulationIo/GetFederationOptions',
41
+ request_serializer=flwr_dot_proto_dot_run__pb2.GetFederationOptionsRequest.SerializeToString,
42
+ response_deserializer=flwr_dot_proto_dot_run__pb2.GetFederationOptionsResponse.FromString,
43
+ )
39
44
 
40
45
 
41
46
  class SimulationIoServicer(object):
@@ -69,6 +74,13 @@ class SimulationIoServicer(object):
69
74
  context.set_details('Method not implemented!')
70
75
  raise NotImplementedError('Method not implemented!')
71
76
 
77
+ def GetFederationOptions(self, request, context):
78
+ """Get Federation Options
79
+ """
80
+ context.set_code(grpc.StatusCode.UNIMPLEMENTED)
81
+ context.set_details('Method not implemented!')
82
+ raise NotImplementedError('Method not implemented!')
83
+
72
84
 
73
85
  def add_SimulationIoServicer_to_server(servicer, server):
74
86
  rpc_method_handlers = {
@@ -92,6 +104,11 @@ def add_SimulationIoServicer_to_server(servicer, server):
92
104
  request_deserializer=flwr_dot_proto_dot_log__pb2.PushLogsRequest.FromString,
93
105
  response_serializer=flwr_dot_proto_dot_log__pb2.PushLogsResponse.SerializeToString,
94
106
  ),
107
+ 'GetFederationOptions': grpc.unary_unary_rpc_method_handler(
108
+ servicer.GetFederationOptions,
109
+ request_deserializer=flwr_dot_proto_dot_run__pb2.GetFederationOptionsRequest.FromString,
110
+ response_serializer=flwr_dot_proto_dot_run__pb2.GetFederationOptionsResponse.SerializeToString,
111
+ ),
95
112
  }
96
113
  generic_handler = grpc.method_handlers_generic_handler(
97
114
  'flwr.proto.SimulationIo', rpc_method_handlers)
@@ -169,3 +186,20 @@ class SimulationIo(object):
169
186
  flwr_dot_proto_dot_log__pb2.PushLogsResponse.FromString,
170
187
  options, channel_credentials,
171
188
  insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
189
+
190
+ @staticmethod
191
+ def GetFederationOptions(request,
192
+ target,
193
+ options=(),
194
+ channel_credentials=None,
195
+ call_credentials=None,
196
+ insecure=False,
197
+ compression=None,
198
+ wait_for_ready=None,
199
+ timeout=None,
200
+ metadata=None):
201
+ return grpc.experimental.unary_unary(request, target, '/flwr.proto.SimulationIo/GetFederationOptions',
202
+ flwr_dot_proto_dot_run__pb2.GetFederationOptionsRequest.SerializeToString,
203
+ flwr_dot_proto_dot_run__pb2.GetFederationOptionsResponse.FromString,
204
+ options, channel_credentials,
205
+ insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
@@ -30,6 +30,11 @@ class SimulationIoStub:
30
30
  flwr.proto.log_pb2.PushLogsResponse]
31
31
  """Push ServerApp logs"""
32
32
 
33
+ GetFederationOptions: grpc.UnaryUnaryMultiCallable[
34
+ flwr.proto.run_pb2.GetFederationOptionsRequest,
35
+ flwr.proto.run_pb2.GetFederationOptionsResponse]
36
+ """Get Federation Options"""
37
+
33
38
 
34
39
  class SimulationIoServicer(metaclass=abc.ABCMeta):
35
40
  @abc.abstractmethod
@@ -64,5 +69,13 @@ class SimulationIoServicer(metaclass=abc.ABCMeta):
64
69
  """Push ServerApp logs"""
65
70
  pass
66
71
 
72
+ @abc.abstractmethod
73
+ def GetFederationOptions(self,
74
+ request: flwr.proto.run_pb2.GetFederationOptionsRequest,
75
+ context: grpc.ServicerContext,
76
+ ) -> flwr.proto.run_pb2.GetFederationOptionsResponse:
77
+ """Get Federation Options"""
78
+ pass
79
+
67
80
 
68
81
  def add_SimulationIoServicer_to_server(servicer: SimulationIoServicer, server: grpc.Server) -> None: ...
@@ -27,7 +27,7 @@ class Driver(ABC):
27
27
  """Abstract base Driver class for the ServerAppIo API."""
28
28
 
29
29
  @abstractmethod
30
- def init_run(self, run_id: int) -> None:
30
+ def set_run(self, run_id: int) -> None:
31
31
  """Request a run to the SuperLink with a given `run_id`.
32
32
 
33
33
  If a Run with the specified `run_id` exists, a local Run
@@ -112,12 +112,8 @@ class GrpcDriver(Driver):
112
112
  channel.close()
113
113
  log(DEBUG, "[Driver] Disconnected")
114
114
 
115
- def init_run(self, run_id: int) -> None:
116
- """Initialize the run."""
117
- # Check if is initialized
118
- if self._run is not None:
119
- return
120
-
115
+ def set_run(self, run_id: int) -> None:
116
+ """Set the run."""
121
117
  # Get the run info
122
118
  req = GetRunRequest(run_id=run_id)
123
119
  res: GetRunResponse = self._stub.GetRun(req)
@@ -62,10 +62,8 @@ class InMemoryDriver(Driver):
62
62
  ):
63
63
  raise ValueError(f"Invalid message: {message}")
64
64
 
65
- def init_run(self, run_id: int) -> None:
65
+ def set_run(self, run_id: int) -> None:
66
66
  """Initialize the run."""
67
- if self._run is not None:
68
- return
69
67
  run = self.state.get_run(run_id)
70
68
  if run is None:
71
69
  raise RuntimeError(f"Cannot find the run with ID: {run_id}")
@@ -174,7 +174,7 @@ def run_server_app() -> None:
174
174
  root_certificates=root_certificates,
175
175
  )
176
176
  flwr_dir = get_flwr_dir(args.flwr_dir)
177
- driver.init_run(args.run_id)
177
+ driver.set_run(args.run_id)
178
178
  run_ = driver.run
179
179
  if not run_.fab_hash:
180
180
  raise ValueError("FAB hash not provided.")
@@ -204,7 +204,7 @@ def run_server_app() -> None:
204
204
  req = CreateRunRequest(fab_id=fab_id, fab_version=fab_version)
205
205
  res: CreateRunResponse = driver._stub.CreateRun(req) # pylint: disable=W0212
206
206
  # Fetch full `Run` using `run_id`
207
- driver.init_run(res.run_id) # pylint: disable=W0212
207
+ driver.set_run(res.run_id) # pylint: disable=W0212
208
208
  run_id = res.run_id
209
209
 
210
210
  # Obtain server app reference and the run config
@@ -189,7 +189,7 @@ def run_serverapp( # pylint: disable=R0914, disable=W0212
189
189
  run = run_from_proto(res.run)
190
190
  fab = fab_from_proto(res.fab)
191
191
 
192
- driver.init_run(run.run_id)
192
+ driver.set_run(run.run_id)
193
193
 
194
194
  # Start log uploader for this run
195
195
  log_uploader = start_log_uploader(
@@ -48,12 +48,12 @@ def aggregate_inplace(results: list[tuple[ClientProxy, FitRes]]) -> NDArrays:
48
48
  num_examples_total = sum(fit_res.num_examples for (_, fit_res) in results)
49
49
 
50
50
  # Compute scaling factors for each result
51
- scaling_factors = [
52
- fit_res.num_examples / num_examples_total for _, fit_res in results
53
- ]
51
+ scaling_factors = np.asarray(
52
+ [fit_res.num_examples / num_examples_total for _, fit_res in results]
53
+ )
54
54
 
55
55
  def _try_inplace(
56
- x: NDArray, y: Union[NDArray, float], np_binary_op: np.ufunc
56
+ x: NDArray, y: Union[NDArray, np.float64], np_binary_op: np.ufunc
57
57
  ) -> NDArray:
58
58
  return ( # type: ignore[no-any-return]
59
59
  np_binary_op(x, y, out=x)
@@ -40,7 +40,6 @@ from .utils import (
40
40
  generate_rand_int_from_bytes,
41
41
  has_valid_sub_status,
42
42
  is_valid_transition,
43
- make_node_unavailable_taskres,
44
43
  )
45
44
 
46
45
 
@@ -257,21 +256,6 @@ class InMemoryLinkState(LinkState): # pylint: disable=R0902,R0904
257
256
  task_res_list.append(task_res)
258
257
  replied_task_ids.add(reply_to)
259
258
 
260
- # Check if the node is offline
261
- for task_id in task_ids - replied_task_ids:
262
- task_ins = self.task_ins_store.get(task_id)
263
- if task_ins is None:
264
- continue
265
- node_id = task_ins.task.consumer.node_id
266
- online_until, _ = self.node_ids[node_id]
267
- # Generate a TaskRes containing an error reply if the node is offline.
268
- if online_until < time.time():
269
- err_taskres = make_node_unavailable_taskres(
270
- ref_taskins=task_ins,
271
- )
272
- self.task_res_store[UUID(err_taskres.task_id)] = err_taskres
273
- task_res_list.append(err_taskres)
274
-
275
259
  # Mark all of them as delivered
276
260
  delivered_at = now().isoformat()
277
261
  for task_res in task_res_list:
@@ -57,7 +57,6 @@ from .utils import (
57
57
  generate_rand_int_from_bytes,
58
58
  has_valid_sub_status,
59
59
  is_valid_transition,
60
- make_node_unavailable_taskres,
61
60
  )
62
61
 
63
62
  SQL_CREATE_TABLE_NODE = """
@@ -640,20 +639,6 @@ class SqliteLinkState(LinkState): # pylint: disable=R0904
640
639
  data = {f"id_{i}": str(node_id) for i, node_id in enumerate(offline_node_ids)}
641
640
  task_ins_rows = self.query(query, data)
642
641
 
643
- # Make TaskRes containing node unavailabe error
644
- for row in task_ins_rows:
645
- for row in rows:
646
- # Convert values from sint64 to uint64
647
- convert_sint64_values_in_dict_to_uint64(
648
- row, ["run_id", "producer_node_id", "consumer_node_id"]
649
- )
650
-
651
- task_ins = dict_to_task_ins(row)
652
- err_taskres = make_node_unavailable_taskres(
653
- ref_taskins=task_ins,
654
- )
655
- result.append(err_taskres)
656
-
657
642
  return result
658
643
 
659
644
  def num_task_ins(self) -> int:
@@ -15,21 +15,15 @@
15
15
  """Utility functions for State."""
16
16
 
17
17
 
18
- import time
19
- from logging import ERROR
20
18
  from os import urandom
21
- from uuid import uuid4
22
19
 
23
- from flwr.common import ConfigsRecord, Context, log, serde
24
- from flwr.common.constant import ErrorCode, Status, SubStatus
20
+ from flwr.common import ConfigsRecord, Context, serde
21
+ from flwr.common.constant import Status, SubStatus
25
22
  from flwr.common.typing import RunStatus
26
- from flwr.proto.error_pb2 import Error # pylint: disable=E0611
27
23
  from flwr.proto.message_pb2 import Context as ProtoContext # pylint: disable=E0611
28
- from flwr.proto.node_pb2 import Node # pylint: disable=E0611
29
24
 
30
25
  # pylint: disable=E0611
31
26
  from flwr.proto.recordset_pb2 import ConfigsRecord as ProtoConfigsRecord
32
- from flwr.proto.task_pb2 import Task, TaskIns, TaskRes # pylint: disable=E0611
33
27
 
34
28
  NODE_UNAVAILABLE_ERROR_REASON = (
35
29
  "Error: Node Unavailable - The destination node is currently unavailable. "
@@ -161,31 +155,6 @@ def configsrecord_from_bytes(configsrecord_bytes: bytes) -> ConfigsRecord:
161
155
  )
162
156
 
163
157
 
164
- def make_node_unavailable_taskres(ref_taskins: TaskIns) -> TaskRes:
165
- """Generate a TaskRes with a node unavailable error from a TaskIns."""
166
- current_time = time.time()
167
- ttl = ref_taskins.task.ttl - (current_time - ref_taskins.task.created_at)
168
- if ttl < 0:
169
- log(ERROR, "Creating TaskRes for TaskIns that exceeds its TTL.")
170
- ttl = 0
171
- return TaskRes(
172
- task_id=str(uuid4()),
173
- group_id=ref_taskins.group_id,
174
- run_id=ref_taskins.run_id,
175
- task=Task(
176
- producer=Node(node_id=ref_taskins.task.consumer.node_id, anonymous=False),
177
- consumer=Node(node_id=ref_taskins.task.producer.node_id, anonymous=False),
178
- created_at=current_time,
179
- ttl=ttl,
180
- ancestry=[ref_taskins.task_id],
181
- task_type=ref_taskins.task.task_type,
182
- error=Error(
183
- code=ErrorCode.NODE_UNAVAILABLE, reason=NODE_UNAVAILABLE_ERROR_REASON
184
- ),
185
- ),
186
- )
187
-
188
-
189
158
  def is_valid_transition(current_status: RunStatus, new_status: RunStatus) -> bool:
190
159
  """Check if a transition between two run statuses is valid.
191
160
 
@@ -23,6 +23,7 @@ from grpc import ServicerContext
23
23
  from flwr.common.constant import Status
24
24
  from flwr.common.logger import log
25
25
  from flwr.common.serde import (
26
+ configs_record_to_proto,
26
27
  context_from_proto,
27
28
  context_to_proto,
28
29
  fab_to_proto,
@@ -36,6 +37,8 @@ from flwr.proto.log_pb2 import ( # pylint: disable=E0611
36
37
  PushLogsResponse,
37
38
  )
38
39
  from flwr.proto.run_pb2 import ( # pylint: disable=E0611
40
+ GetFederationOptionsRequest,
41
+ GetFederationOptionsResponse,
39
42
  UpdateRunStatusRequest,
40
43
  UpdateRunStatusResponse,
41
44
  )
@@ -123,10 +126,28 @@ class SimulationIoServicer(simulationio_pb2_grpc.SimulationIoServicer):
123
126
  self, request: PushLogsRequest, context: grpc.ServicerContext
124
127
  ) -> PushLogsResponse:
125
128
  """Push logs."""
126
- log(DEBUG, "ServerAppIoServicer.PushLogs")
129
+ log(DEBUG, "SimultionIoServicer.PushLogs")
127
130
  state = self.state_factory.state()
128
131
 
129
132
  # Add logs to LinkState
130
133
  merged_logs = "".join(request.logs)
131
134
  state.add_serverapp_log(request.run_id, merged_logs)
132
135
  return PushLogsResponse()
136
+
137
+ def GetFederationOptions(
138
+ self, request: GetFederationOptionsRequest, context: ServicerContext
139
+ ) -> GetFederationOptionsResponse:
140
+ """Get Federation Options associated with a run."""
141
+ log(DEBUG, "SimultionIoServicer.GetFederationOptions")
142
+ state = self.state_factory.state()
143
+
144
+ federation_options = state.get_federation_options(request.run_id)
145
+ if federation_options is None:
146
+ context.abort(
147
+ grpc.StatusCode.FAILED_PRECONDITION,
148
+ "Expected federation options to be set, but none available.",
149
+ )
150
+ return GetFederationOptionsResponse()
151
+ return GetFederationOptionsResponse(
152
+ federation_options=configs_record_to_proto(federation_options)
153
+ )
@@ -347,7 +347,7 @@ def _main_loop(
347
347
 
348
348
  # Initialize Driver
349
349
  driver = InMemoryDriver(state_factory=state_factory)
350
- driver.init_run(run_id=run.run_id)
350
+ driver.set_run(run_id=run.run_id)
351
351
 
352
352
  # Get and run ServerApp thread
353
353
  serverapp_th = run_serverapp_th(
@@ -153,7 +153,7 @@ class DeploymentEngine(Executor):
153
153
  self,
154
154
  fab_file: bytes,
155
155
  override_config: UserConfig,
156
- federation_config: UserConfig,
156
+ federation_options: ConfigsRecord,
157
157
  ) -> Optional[int]:
158
158
  """Start run using the Flower Deployment Engine."""
159
159
  run_id = None
@@ -24,7 +24,7 @@ import grpc
24
24
 
25
25
  from flwr.common.constant import LOG_STREAM_INTERVAL, Status
26
26
  from flwr.common.logger import log
27
- from flwr.common.serde import user_config_from_proto
27
+ from flwr.common.serde import configs_record_from_proto, user_config_from_proto
28
28
  from flwr.proto import exec_pb2_grpc # pylint: disable=E0611
29
29
  from flwr.proto.exec_pb2 import ( # pylint: disable=E0611
30
30
  StartRunRequest,
@@ -61,7 +61,7 @@ class ExecServicer(exec_pb2_grpc.ExecServicer):
61
61
  run_id = self.executor.start_run(
62
62
  request.fab.content,
63
63
  user_config_from_proto(request.override_config),
64
- user_config_from_proto(request.federation_config),
64
+ configs_record_from_proto(request.federation_options),
65
65
  )
66
66
 
67
67
  if run_id is None:
@@ -19,6 +19,7 @@ from dataclasses import dataclass, field
19
19
  from subprocess import Popen
20
20
  from typing import Optional
21
21
 
22
+ from flwr.common import ConfigsRecord
22
23
  from flwr.common.typing import UserConfig
23
24
  from flwr.server.superlink.ffs.ffs_factory import FfsFactory
24
25
  from flwr.server.superlink.linkstate import LinkStateFactory
@@ -71,7 +72,7 @@ class Executor(ABC):
71
72
  self,
72
73
  fab_file: bytes,
73
74
  override_config: UserConfig,
74
- federation_config: UserConfig,
75
+ federation_options: ConfigsRecord,
75
76
  ) -> Optional[int]:
76
77
  """Start a run using the given Flower FAB ID and version.
77
78
 
@@ -84,8 +85,8 @@ class Executor(ABC):
84
85
  The Flower App Bundle file bytes.
85
86
  override_config: UserConfig
86
87
  The config overrides dict sent by the user (using `flwr run`).
87
- federation_config: UserConfig
88
- The federation options dict sent by the user (using `flwr run`).
88
+ federation_options: ConfigsRecord
89
+ The federation options sent by the user (using `flwr run`).
89
90
 
90
91
  Returns
91
92
  -------
@@ -25,6 +25,7 @@ from typing_extensions import override
25
25
 
26
26
  from flwr.cli.config_utils import load_and_validate
27
27
  from flwr.cli.install import install_from_fab
28
+ from flwr.common import ConfigsRecord
28
29
  from flwr.common.config import unflatten_dict
29
30
  from flwr.common.constant import RUN_ID_NUM_BYTES
30
31
  from flwr.common.logger import log
@@ -124,7 +125,7 @@ class SimulationEngine(Executor):
124
125
  self,
125
126
  fab_file: bytes,
126
127
  override_config: UserConfig,
127
- federation_config: UserConfig,
128
+ federation_options: ConfigsRecord,
128
129
  ) -> Optional[int]:
129
130
  """Start run using the Flower Simulation Engine."""
130
131
  if self.num_supernodes is None:
@@ -163,14 +164,13 @@ class SimulationEngine(Executor):
163
164
  "Config extracted from FAB's pyproject.toml is not valid"
164
165
  )
165
166
 
166
- # Flatten federated config
167
- federation_config_flat = unflatten_dict(federation_config)
167
+ # Unflatten underlaying dict
168
+ fed_opt = unflatten_dict({**federation_options})
168
169
 
169
- num_supernodes = federation_config_flat.get(
170
- "num-supernodes", self.num_supernodes
171
- )
172
- backend_cfg = federation_config_flat.get("backend", {})
173
- verbose: Optional[bool] = federation_config_flat.get("verbose")
170
+ # Read data
171
+ num_supernodes = fed_opt.get("num-supernodes", self.num_supernodes)
172
+ backend_cfg = fed_opt.get("backend", {})
173
+ verbose: Optional[bool] = fed_opt.get("verbose")
174
174
 
175
175
  # In Simulation there is no SuperLink, still we create a run_id
176
176
  run_id = generate_rand_int_from_bytes(RUN_ID_NUM_BYTES)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: flwr-nightly
3
- Version: 1.13.0.dev20241106
3
+ Version: 1.13.0.dev20241108
4
4
  Summary: Flower: A Friendly Federated Learning Framework
5
5
  Home-page: https://flower.ai
6
6
  License: Apache-2.0
@@ -32,9 +32,9 @@ Classifier: Typing :: Typed
32
32
  Provides-Extra: rest
33
33
  Provides-Extra: simulation
34
34
  Requires-Dist: cryptography (>=42.0.4,<43.0.0)
35
- Requires-Dist: grpcio (>=1.60.0,<2.0.0,!=1.64.2,!=1.65.1,!=1.65.2,!=1.65.4,!=1.65.5,!=1.66.0,!=1.66.1)
35
+ Requires-Dist: grpcio (>=1.60.0,<2.0.0,!=1.64.2,<=1.64.3)
36
36
  Requires-Dist: iterators (>=0.0.2,<0.0.3)
37
- Requires-Dist: numpy (>=1.21.0,<2.0.0)
37
+ Requires-Dist: numpy (>=1.26.0,<3.0.0)
38
38
  Requires-Dist: pathspec (>=0.12.1,<0.13.0)
39
39
  Requires-Dist: protobuf (>=4.25.2,<5.0.0)
40
40
  Requires-Dist: pycryptodome (>=3.18.0,<4.0.0)
@@ -61,10 +61,10 @@ flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl,sha256=LUsQsEVhCgGzKEBB5Ie
61
61
  flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl,sha256=BiZPOKEoGiZOuxSHQY_nQHj3KH7wH7QAiVmpxGutOgk,686
62
62
  flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl,sha256=6R_bIGyPvXlCtLABF8fHLmGBNlIptG8QrYM69_Fy_nk,710
63
63
  flwr/cli/run/__init__.py,sha256=oCd6HmQDx-sqver1gecgx-uMA38BLTSiiKpl7RGNceg,789
64
- flwr/cli/run/run.py,sha256=FCdETDR3d_Aqw3Bn-oGogiAjOqH87AWLtcwifgJLAcQ,6034
64
+ flwr/cli/run/run.py,sha256=TQm7M0a-oSeNXPCsn75qYrkGB0IPbk0HulcYk1gwmR0,6293
65
65
  flwr/cli/utils.py,sha256=emMUdthvoHBTB0iGQp-oFBmA5wV46lw3y3FmfXQPCsc,4500
66
66
  flwr/client/__init__.py,sha256=DGDoO0AEAfz-0CUFmLdyUUweAS64-07AOnmDfWUefK4,1192
67
- flwr/client/app.py,sha256=fEUTXz_uNwZe-otCbUf5F3sJozGfvkrMNS3u7DE6sOo,32808
67
+ flwr/client/app.py,sha256=zpYl6I6_1-5BEv93IqGIBX_FDpEvOSYFhDidWjq0K8U,32975
68
68
  flwr/client/client.py,sha256=gy6WVlMUFAp8oevN4xpQPX30vPOIYGVqdbuFlTWkyG4,9080
69
69
  flwr/client/client_app.py,sha256=cTig-N00YzTucbo9zNi6I21J8PlbflU_8J_f5CI-Wpw,10390
70
70
  flwr/client/clientapp/__init__.py,sha256=kZqChGnTChQ1WGSUkIlW2S5bc0d0mzDubCAmZUGRpEY,800
@@ -92,6 +92,10 @@ flwr/client/mod/secure_aggregation/__init__.py,sha256=A7DzZ3uvXTUkuHBzrxJMWQQD4R
92
92
  flwr/client/mod/secure_aggregation/secagg_mod.py,sha256=wI9tuIEvMUETz-wVIEbPYvh-1nK9CEylBLGoVpNhL94,1095
93
93
  flwr/client/mod/secure_aggregation/secaggplus_mod.py,sha256=7cNXsY07ZA0M5_9VSc52F8JUoAoGaraNDA2rgaLvvFo,19680
94
94
  flwr/client/mod/utils.py,sha256=dFcTHOjUuuiw34fcQlvyzytYD0sCv1w9x8fQX1Yo8Oc,1201
95
+ flwr/client/nodestate/__init__.py,sha256=UBK-iI4BTiiFi3v6SBo2cizaRRhZzTzkXOhbAZB7cs8,975
96
+ flwr/client/nodestate/in_memory_nodestate.py,sha256=MKI3jVPARPWJmNGw61k1-9LIXROkTx2PrhWjDM8cpHk,1291
97
+ flwr/client/nodestate/nodestate.py,sha256=2sSziyHK65ygayLcEoR78erqyrRe10tZ2tB-QISdRB4,1023
98
+ flwr/client/nodestate/nodestate_factory.py,sha256=LipmYzjYlN2U-CYN20d8Kk0PXyCAJq3L3VQFc6QscJc,1429
95
99
  flwr/client/numpy_client.py,sha256=tqGyhIkeeZQGr65BR03B7TWgx4rW3FA7G2874D8z_VU,11167
96
100
  flwr/client/rest_client/__init__.py,sha256=5KGlp7pjc1dhNRkKlaNtUfQmg8wrRFh9lS3P3uRS-7Q,735
97
101
  flwr/client/rest_client/connection.py,sha256=k-RqgUFqidACAGlMFPIUM8aawXI5h2LvKUri2OAK7Bg,12817
@@ -101,8 +105,8 @@ flwr/client/supernode/app.py,sha256=JN24tRBHLbFJ0KeCTA8eS24KUJHCl9J2xGwWjyPQ7Vg,
101
105
  flwr/client/typing.py,sha256=dxoTBnTMfqXr5J7G3y-uNjqxYCddvxhu89spfj4Lm2U,1048
102
106
  flwr/common/__init__.py,sha256=TVaoFEJE158aui1TPZQiJCDZX4RNHRyI8I55VC80HhI,3901
103
107
  flwr/common/address.py,sha256=7kM2Rqjw86-c8aKwAvrXerWqznnVv4TFJ62aSAeTn10,3017
104
- flwr/common/config.py,sha256=nYA1vjiiqSWx5JjSdlQd1i_0N_Dh9kEGUse1Qze3JMs,7803
105
- flwr/common/constant.py,sha256=-YsUgUiaScB3vvoppQ3h8_Ww-bkaNgLK72wwi2qZj6M,4756
108
+ flwr/common/config.py,sha256=qC1QvGAGr4faBtg3Y5dWhfyK5FggyWUMjPqg-Rx_FW4,8083
109
+ flwr/common/constant.py,sha256=D7MNLl1u-P7tJAMdT67xIujSeCibc2QzqtFoqCagoco,4731
106
110
  flwr/common/context.py,sha256=uJ-mnoC_8y_udEb3kAX-r8CPphNTWM72z1AlsvQEu54,2403
107
111
  flwr/common/date.py,sha256=uTvLmCkd3uVQuD4MviPHnIXMGyheL16mEI_UlOsv_R8,894
108
112
  flwr/common/differential_privacy.py,sha256=XwcJ3rWr8S8BZUocc76vLSJAXIf6OHnWkBV6-xlIRuw,6106
@@ -112,7 +116,7 @@ flwr/common/exit_handlers.py,sha256=MracJaBeoCOC7TaXK9zCJQxhrMSx9ZtczK237qvhBpU,
112
116
  flwr/common/grpc.py,sha256=6Yi28JjAll19nxYJlOT9B03RN8dvJZP9zUoR3RSmxoY,2487
113
117
  flwr/common/logger.py,sha256=AJNu-cymiQUp4Dw1zkw5xww_HVkUAhHvtYxwzUtuohM,11065
114
118
  flwr/common/message.py,sha256=4O1m0OWXBAYZz05gKgEtnoJ94J1gjo7hCNHyUXThxRo,13831
115
- flwr/common/object_ref.py,sha256=5lgWqYaJR28UdFc-iirWw9YqFXMfgkOOAdfJc1AVibE,8711
119
+ flwr/common/object_ref.py,sha256=DavEkh-IJv_s0VeLsJvSZS5k-Ix_k1UcNXbldfNFXxM,9859
116
120
  flwr/common/parameter.py,sha256=-bFAUayToYDF50FZGrBC1hQYJCQDtB2bbr3ZuVLMtdE,2095
117
121
  flwr/common/pyproject.py,sha256=EI_ovbCHGmhYrdPx0RSDi5EkFZFof-8m1PA54c0ZTjc,1385
118
122
  flwr/common/record/__init__.py,sha256=ejDBQOIA0OkwZAC5cK_tTPHA4oAM0Ju7Oi13-NneMlE,1054
@@ -134,7 +138,7 @@ flwr/common/secure_aggregation/secaggplus_constants.py,sha256=9MF-oQh62uD7rt9VeN
134
138
  flwr/common/secure_aggregation/secaggplus_utils.py,sha256=o7IhHH6J9xqinhQy3TdPgQpoj1XyEpyv3OQFyx81RVQ,3193
135
139
  flwr/common/serde.py,sha256=_z7-2XC-ecfEPzv2wEjJMTp9YH5FJqgQrTBZneDmhzA,30630
136
140
  flwr/common/telemetry.py,sha256=20AYNaePOBaSEh99PIuBrxRxtY53-kZ5-2Ej0JWUJmc,8731
137
- flwr/common/typing.py,sha256=fS_KmVdg0c1B87yMnccIPfjBzQ3CTRwYJcaWfmvZzEA,5103
141
+ flwr/common/typing.py,sha256=gk9B685P9_TctGOU0wxTlCRTxHbeaESn5TZiR9v6S0E,5104
138
142
  flwr/common/version.py,sha256=tCcl_FvxVK206C1dxIJCs4TjL06WmyaODBP19FRHE1c,1324
139
143
  flwr/proto/__init__.py,sha256=hbY7JYakwZwCkYgCNlmHdc8rtvfoJbAZLalMdc--CGc,683
140
144
  flwr/proto/clientappio_pb2.py,sha256=Y3PMv-JMaBGehpslgbvGY6l2u5vNpfCTFWu-fmAmBJ4,3703
@@ -153,8 +157,8 @@ flwr/proto/error_pb2.py,sha256=LarjKL90LbwkXKlhzNrDssgl4DXcvIPve8NVCXHpsKA,1084
153
157
  flwr/proto/error_pb2.pyi,sha256=ZNH4HhJTU_KfMXlyCeg8FwU-fcUYxTqEmoJPtWtHikc,734
154
158
  flwr/proto/error_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
155
159
  flwr/proto/error_pb2_grpc.pyi,sha256=ff2TSiLVnG6IVQcTGzb2DIH3XRSoAvAo_RMcvbMFyc0,76
156
- flwr/proto/exec_pb2.py,sha256=jrPfFdZrT7L6kI-MGu6Ej2rYpd8sgen27bm6njrTrrk,3335
157
- flwr/proto/exec_pb2.pyi,sha256=rvf6cp7YXGQiltzjhd7ZeZmyAeHexDKTp_5kyavZYsA,4612
160
+ flwr/proto/exec_pb2.py,sha256=e6a-KKc5o7bI5BpdfxmZR-nIj2_RMcIBUVOUnaUU_vA,2976
161
+ flwr/proto/exec_pb2.pyi,sha256=bz1Ld0GmofBRrkr04ustaRToCAWx1AWShxjhJYiwAo0,3906
158
162
  flwr/proto/exec_pb2_grpc.py,sha256=faAN19XEMP8GTKrcIU6jvlWkN44n2KiUsZh_OG0sYcg,4072
159
163
  flwr/proto/exec_pb2_grpc.pyi,sha256=VrFhT1Um3Nb8UC2YqnR9GIiM-Yyx0FqaxVOWljh-G_w,1208
160
164
  flwr/proto/fab_pb2.py,sha256=3QSDq9pjbZoqVxsmCRDwHO5PrSjzn2vixjYxE-qPmb0,1589
@@ -185,18 +189,18 @@ flwr/proto/recordset_pb2.py,sha256=XjEIDU-YlKSY59qNd0qXTFB4COvMHGiszQ5O1krJ1Ks,6
185
189
  flwr/proto/recordset_pb2.pyi,sha256=ypFNvroU4aIlnN0D6W4XAsOfm0UzTfXhxxL1v7u__Ac,15370
186
190
  flwr/proto/recordset_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
187
191
  flwr/proto/recordset_pb2_grpc.pyi,sha256=ff2TSiLVnG6IVQcTGzb2DIH3XRSoAvAo_RMcvbMFyc0,76
188
- flwr/proto/run_pb2.py,sha256=pwel-8Hzsz1Gw2EHGEFKObgSEKQNth7nGZOEsJQO8fM,4940
189
- flwr/proto/run_pb2.pyi,sha256=pr7MPml_7gOmBuu7BO-yaU-LexamsJYxnRG-utigVAo,9641
192
+ flwr/proto/run_pb2.py,sha256=RDTp7PlvPT-1p0uUYpaQUk4bw1mYr7lktuKA7uRPfrg,5516
193
+ flwr/proto/run_pb2.pyi,sha256=M9Zdokby10jr_sBlNIFBYad97Dre0sz5AB7JI4b9OgY,10903
190
194
  flwr/proto/run_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
191
195
  flwr/proto/run_pb2_grpc.pyi,sha256=ff2TSiLVnG6IVQcTGzb2DIH3XRSoAvAo_RMcvbMFyc0,76
192
196
  flwr/proto/serverappio_pb2.py,sha256=zWnODeaj26oSx98-BFvwtWM_fYvsw9OeSIuV7JnKVvw,4822
193
197
  flwr/proto/serverappio_pb2.pyi,sha256=Ib9c32FCtjA9zZY54Ohi6B-DtLgSjokAqOExm_2uOvY,6429
194
198
  flwr/proto/serverappio_pb2_grpc.py,sha256=M__pFMmb9yTAGMHVd3_K1V6DeLRuFc9UErJHWjBAsZs,17439
195
199
  flwr/proto/serverappio_pb2_grpc.pyi,sha256=ERM-0cQVmUqrVXlvEbS2wfUZpZmv5SlIeNsGZPYMrVo,4779
196
- flwr/proto/simulationio_pb2.py,sha256=Za9bndkWX7TPoiNmlnQeRHR4DQ2UrbaagDtirKOb-0U,2884
200
+ flwr/proto/simulationio_pb2.py,sha256=sCJQp_NEJSDtC4EKzyy2yZWtu9z7PGUUFJpLjdA9VUs,3011
197
201
  flwr/proto/simulationio_pb2.pyi,sha256=oXx8_FLBe5B54wduZj-f89kub73XxNtQbThuW8YfPAs,2660
198
- flwr/proto/simulationio_pb2_grpc.py,sha256=6bLKBXsB8Oam8RurI0i8kPKe_1VpnbqY7RrD9nqs1PM,7900
199
- flwr/proto/simulationio_pb2_grpc.pyi,sha256=d_BJaLr6bG_lcQoZuyglqAr6uJm6ttJhE0sk4zZf5N8,2320
202
+ flwr/proto/simulationio_pb2_grpc.py,sha256=-qcd4rOOK-46LcP57oZswqwASpy2_UvMJmJ80OpzuNM,9622
203
+ flwr/proto/simulationio_pb2_grpc.pyi,sha256=Bk4K7MsPpxF6RmIqByySQIXJeJ1pBrU2I19hrKUoFdI,2795
200
204
  flwr/proto/task_pb2.py,sha256=R5GfHgL8IJRI_qHWNeILl1Y9zHjvB0tnCvMHmTgF4Is,2361
201
205
  flwr/proto/task_pb2.pyi,sha256=KJVsLm-THY5QjHreHDm_-OS1tyZyD61mx6BzOpoeMjw,4320
202
206
  flwr/proto/task_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
@@ -217,19 +221,19 @@ flwr/server/compat/driver_client_proxy.py,sha256=Af0bRUEVZNcCYRxt3DjpLPdvVYpTgz6
217
221
  flwr/server/compat/legacy_context.py,sha256=wBzBcfV6YO6IQGriM_FdJ5XZfiBBEEJdS_OdAiF47dY,1804
218
222
  flwr/server/criterion.py,sha256=ypbAexbztzGUxNen9RCHF91QeqiEQix4t4Ih3E-42MM,1061
219
223
  flwr/server/driver/__init__.py,sha256=bikRv6CjTwSvYh7tf10gziU5o2YotOWhhftz2tr3KDc,886
220
- flwr/server/driver/driver.py,sha256=gHHO8oFkFWYf1J9wn4aKCcnzx7hXsmY_JO5jr004s68,5702
221
- flwr/server/driver/grpc_driver.py,sha256=ziRzquh1fuC-joaalHKI_zcqm9k1kDpZYDIzGa33TsI,9629
222
- flwr/server/driver/inmemory_driver.py,sha256=DcWFhV57p2OGgVYIdNlB65_o2lviClk9yVp_4XtdYPg,6458
224
+ flwr/server/driver/driver.py,sha256=u_fMfqLYTroTafGCNwKPHI4lttRL-Z5CqeT3_FHSq-Q,5701
225
+ flwr/server/driver/grpc_driver.py,sha256=4_bJGbeiLV2FTrJseClnsFf2TgitwjwYNO_5sm2FltY,9533
226
+ flwr/server/driver/inmemory_driver.py,sha256=gfB4jmkk1indhRa9XCdKCXghVcWBF1qBD-tAxMUyQm0,6404
223
227
  flwr/server/history.py,sha256=qSb5_pPTrwofpSYGsZWzMPkl_4uJ4mJFWesxXDrEvDU,5026
224
- flwr/server/run_serverapp.py,sha256=lYaslawycvJ0A8GD-h9Q2etp8ZgYzmEhcP_Bo91qjtQ,10561
228
+ flwr/server/run_serverapp.py,sha256=zvH7XEJt0WpTeDTTf-67VvugCRuaItMm7klSOcbhFIU,10559
225
229
  flwr/server/server.py,sha256=1ZsFEptmAV-L2vP2etNC9Ed5CLSxpuKzUFkAPQ4l5Xc,17893
226
230
  flwr/server/server_app.py,sha256=RsgS6PRS5Z74cMUAHzsm8r3LWddwn00MjRs6rlacHt8,6297
227
231
  flwr/server/server_config.py,sha256=CZaHVAsMvGLjpWVcLPkiYxgJN4xfIyAiUrCI3fETKY4,1349
228
232
  flwr/server/serverapp/__init__.py,sha256=L0K-94UDdTyEZ8LDtYybGIIIv3HW6AhSVjXMUfYJQnQ,800
229
- flwr/server/serverapp/app.py,sha256=-OUdiyNjnPwibznlc-1hQ54oUT2EowdPVheXUKCW6LM,8988
233
+ flwr/server/serverapp/app.py,sha256=yRHrTLpwRBOtcQd_VttHy8RR12LhlqFjV70H4FxQRMY,8987
230
234
  flwr/server/serverapp_components.py,sha256=-IV_CitOfrJclJj2jNdbN1Q65PyFmtKtrTIg1hc6WQw,2118
231
235
  flwr/server/strategy/__init__.py,sha256=tQer2SwjDnvgFFuJMZM-S01Z615N5XK6MaCvpm4BMU0,2836
232
- flwr/server/strategy/aggregate.py,sha256=iFZ8lp7PV_a2m9kywV-FK0iM33ofxavOs5TIaEQY8nU,13961
236
+ flwr/server/strategy/aggregate.py,sha256=PDvekufza13s9AsVmz9WASunaBs3yCtl8JVliFx9j6Q,13978
233
237
  flwr/server/strategy/bulyan.py,sha256=DDNLLlTJCHgBtij7EpDsa852GHEYjjDB1iORACZO2KE,6513
234
238
  flwr/server/strategy/dp_adaptive_clipping.py,sha256=zrqA9OfQu4gwUkLCXbh59sPsDd_x2IhNs-BER_ITzNE,17447
235
239
  flwr/server/strategy/dp_fixed_clipping.py,sha256=ILmO_AsoMpstOAYK9L6hJpqf7zE6erdMj_SD_-hHAFk,12834
@@ -281,14 +285,14 @@ flwr/server/superlink/fleet/vce/backend/backend.py,sha256=LBAQxnbfPAphVOVIvYMj0Q
281
285
  flwr/server/superlink/fleet/vce/backend/raybackend.py,sha256=7kB3re3mR53b7E6L6DPSioTSKD3YGtS3uJsPD7Hn2Fw,7155
282
286
  flwr/server/superlink/fleet/vce/vce_api.py,sha256=VL6e_Jwf4uxA-X1EelxJZMv6Eji-_p2J9D0MdHG10a4,13029
283
287
  flwr/server/superlink/linkstate/__init__.py,sha256=v-2JyJlCB3qyhMNwMjmcNVOq4rkooqFU0LHH8Zo1jls,1064
284
- flwr/server/superlink/linkstate/in_memory_linkstate.py,sha256=7teZcDU__Ni5l1mDh7j4P_-GlFVxvwaxelhy7TkM6ZU,21974
288
+ flwr/server/superlink/linkstate/in_memory_linkstate.py,sha256=SxJYOrzHVLWFO8qg3LhoD4PUmCP4ItFiqv6bDWApoxo,21197
285
289
  flwr/server/superlink/linkstate/linkstate.py,sha256=ylDV9I_j6a4LtWq-d-VWQyh8ipCob6DT7QcY6A7-LAo,12021
286
290
  flwr/server/superlink/linkstate/linkstate_factory.py,sha256=ISSMjDlwuN7swxjOeYlTNpI_kuZ8PGkMcJnf1dbhUSE,2069
287
- flwr/server/superlink/linkstate/sqlite_linkstate.py,sha256=KLGfrJQOqCbkwC4oqeQgn0oyTyU5fm9Kv0-4v6ftenA,45159
288
- flwr/server/superlink/linkstate/utils.py,sha256=cr6HM77pefdAdhkd0dg6MIWkfwBpvedbJId5uwCPZmE,7458
291
+ flwr/server/superlink/linkstate/sqlite_linkstate.py,sha256=OndEO8VjUHXw09fDw2t65fN1Ong9QBR56N2SyOlirAE,44604
292
+ flwr/server/superlink/linkstate/utils.py,sha256=emryyCNnsSodqhxuxJ3vBLglwHZ_eIA_rawdL7dDVCA,6204
289
293
  flwr/server/superlink/simulation/__init__.py,sha256=mg-oapC9dkzEfjXPQFior5lpWj4g9kwbLovptyYM_g0,718
290
294
  flwr/server/superlink/simulation/simulationio_grpc.py,sha256=5wflYW_TS0mjmPG6OYuHMJwXD2_cYmUNhFkdOU0jMWQ,2237
291
- flwr/server/superlink/simulation/simulationio_servicer.py,sha256=KRdgPt9vYGQorRgXwmCs65hpk7LHwMRU5RSk40m8t9I,5067
295
+ flwr/server/superlink/simulation/simulationio_servicer.py,sha256=LsW6Cl8qH_vq04F6CeOp3vBtjTGQn4tATKHfirDmJZQ,5942
292
296
  flwr/server/typing.py,sha256=5kaRLZuxTEse9A0g7aVna2VhYxU3wTq1f3d3mtw7kXs,1019
293
297
  flwr/server/utils/__init__.py,sha256=pltsPHJoXmUIr3utjwwYxu7_ZAGy5u4MVHzv9iA5Un8,908
294
298
  flwr/server/utils/tensorboard.py,sha256=gEBD8w_5uaIfp5aw5RYH66lYZpd_SfkObHQ7eDd9MUk,5466
@@ -305,17 +309,17 @@ flwr/simulation/ray_transport/__init__.py,sha256=wzcEEwUUlulnXsg6raCA1nGpP3LlAQD
305
309
  flwr/simulation/ray_transport/ray_actor.py,sha256=9-XBguAm5IFqm2ddPFsQtnuuFN6lzqdb00SnCxGUGBo,18996
306
310
  flwr/simulation/ray_transport/ray_client_proxy.py,sha256=2vjOKoom3B74C6XU-jC3N6DwYmsLdB-lmkHZ_Xrv96o,7367
307
311
  flwr/simulation/ray_transport/utils.py,sha256=TYdtfg1P9VfTdLMOJlifInGpxWHYs9UfUqIv2wfkRLA,2392
308
- flwr/simulation/run_simulation.py,sha256=Wnu5ivU0Fee8lCSWggXNR2e3wudvHCr-GTinm4Xb_Bk,20248
312
+ flwr/simulation/run_simulation.py,sha256=BoG0lwaixe3g-xL4RZPl_6P47PKj2TiPHsDUtcNztkk,20247
309
313
  flwr/simulation/simulationio_connection.py,sha256=Uqtm2pRuZqEM8SxKS2TdBgsMUABSabhVIx9zzCPb_qc,3195
310
314
  flwr/superexec/__init__.py,sha256=fcj366jh4RFby_vDwLroU4kepzqbnJgseZD_jUr_Mko,715
311
315
  flwr/superexec/app.py,sha256=Tt3GonnTwHrMmicwx9XaP-crP78-bf4DUWl-N5cG6zY,1841
312
- flwr/superexec/deployment.py,sha256=cyaFosL_ue8LHu7y0EDAqbvz7npmQzfIrooR1ChKF14,6507
316
+ flwr/superexec/deployment.py,sha256=C-NNclLE9OVJST6VRemtXv5N_vOoZeb77AQcMptCP6M,6511
313
317
  flwr/superexec/exec_grpc.py,sha256=OuhBAk7hiky9rjGceinLGIXqchtzGPQThZnwyYv6Ei0,2241
314
- flwr/superexec/exec_servicer.py,sha256=6dUCijBYhrntZeQj82q2kVOUNFu_tsFOwT5HkkLYn9Q,3927
315
- flwr/superexec/executor.py,sha256=QA2_hQJxmN3zc75oEkDs-zkWAHesz59jE0P5lem-5VU,3073
316
- flwr/superexec/simulation.py,sha256=Ny3MJnNlgzW4K3NbgsgDM0LKKcoCd_q3LqNqb0GhWLI,7640
317
- flwr_nightly-1.13.0.dev20241106.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
318
- flwr_nightly-1.13.0.dev20241106.dist-info/METADATA,sha256=Llp8R-V25ySynw2F_c3igw4PHVRfkRa8sbS63ydH248,15618
319
- flwr_nightly-1.13.0.dev20241106.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
320
- flwr_nightly-1.13.0.dev20241106.dist-info/entry_points.txt,sha256=FxJQ96pmcNF2OvkTH6XF-Ip2PNrHvykjArkvkjQC7Mk,486
321
- flwr_nightly-1.13.0.dev20241106.dist-info/RECORD,,
318
+ flwr/superexec/exec_servicer.py,sha256=zNcdPkqLXgJIANKvE9uGIzgxocIs31WAj1YDnwqI6jo,3958
319
+ flwr/superexec/executor.py,sha256=zH3_53il6Jh0ZscIVEB9f4GNnXMeBbCGyCoBCxLgiG0,3114
320
+ flwr/superexec/simulation.py,sha256=prqEgAKnejHcYEj_euK1ICaHHt3QgLa3jnZJkDA7qqI,7623
321
+ flwr_nightly-1.13.0.dev20241108.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
322
+ flwr_nightly-1.13.0.dev20241108.dist-info/METADATA,sha256=gbeRnLHzdA0TrNWlmHZWif0SgZWSoHBrPeqU0TRGjY8,15573
323
+ flwr_nightly-1.13.0.dev20241108.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
324
+ flwr_nightly-1.13.0.dev20241108.dist-info/entry_points.txt,sha256=FxJQ96pmcNF2OvkTH6XF-Ip2PNrHvykjArkvkjQC7Mk,486
325
+ flwr_nightly-1.13.0.dev20241108.dist-info/RECORD,,