flwr-nightly 1.10.0.dev20240625__py3-none-any.whl → 1.10.0.dev20240629__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/build.py CHANGED
@@ -31,7 +31,7 @@ from .utils import get_sha256_hash, is_valid_project_name
31
31
  def build(
32
32
  directory: Annotated[
33
33
  Optional[Path],
34
- typer.Option(help="The Flower project directory to bundle into a FAB"),
34
+ typer.Option(help="Path of the Flower project to bundle into a FAB"),
35
35
  ] = None,
36
36
  ) -> str:
37
37
  """Build a Flower project into a Flower App Bundle (FAB).
@@ -118,7 +118,7 @@ def build(
118
118
  fab_file.writestr(".info/CONTENT", list_file_content)
119
119
 
120
120
  typer.secho(
121
- f"🎊 Successfully built {fab_filename}.", fg=typer.colors.GREEN, bold=True
121
+ f"🎊 Successfully built {fab_filename}", fg=typer.colors.GREEN, bold=True
122
122
  )
123
123
 
124
124
  return fab_filename
flwr/cli/run/run.py CHANGED
@@ -17,12 +17,14 @@
17
17
  import sys
18
18
  from enum import Enum
19
19
  from logging import DEBUG
20
+ from pathlib import Path
20
21
  from typing import Optional
21
22
 
22
23
  import typer
23
24
  from typing_extensions import Annotated
24
25
 
25
26
  from flwr.cli import config_utils
27
+ from flwr.cli.build import build
26
28
  from flwr.common.constant import SUPEREXEC_DEFAULT_ADDRESS
27
29
  from flwr.common.grpc import GRPC_MAX_MESSAGE_LENGTH, create_channel
28
30
  from flwr.common.logger import log
@@ -52,10 +54,14 @@ def run(
52
54
  case_sensitive=False, help="Use this flag to use the new SuperExec API"
53
55
  ),
54
56
  ] = False,
57
+ directory: Annotated[
58
+ Optional[Path],
59
+ typer.Option(help="Path of the Flower project to run"),
60
+ ] = None,
55
61
  ) -> None:
56
62
  """Run Flower project."""
57
63
  if use_superexec:
58
- _start_superexec_run()
64
+ _start_superexec_run(directory)
59
65
  return
60
66
 
61
67
  typer.secho("Loading project configuration... ", fg=typer.colors.BLUE)
@@ -109,7 +115,7 @@ def run(
109
115
  )
110
116
 
111
117
 
112
- def _start_superexec_run() -> None:
118
+ def _start_superexec_run(directory: Optional[Path]) -> None:
113
119
  def on_channel_state_change(channel_connectivity: str) -> None:
114
120
  """Log channel connectivity."""
115
121
  log(DEBUG, channel_connectivity)
@@ -124,5 +130,8 @@ def _start_superexec_run() -> None:
124
130
  channel.subscribe(on_channel_state_change)
125
131
  stub = ExecStub(channel)
126
132
 
127
- req = StartRunRequest()
128
- stub.StartRun(req)
133
+ fab_path = build(directory)
134
+
135
+ req = StartRunRequest(fab_file=Path(fab_path).read_bytes())
136
+ res = stub.StartRun(req)
137
+ typer.secho(f"🎊 Successfully started run {res.run_id}", fg=typer.colors.GREEN)
flwr/client/app.py CHANGED
@@ -191,6 +191,7 @@ def _start_client_internal(
191
191
  ] = None,
192
192
  max_retries: Optional[int] = None,
193
193
  max_wait_time: Optional[float] = None,
194
+ partition_id: Optional[int] = None,
194
195
  ) -> None:
195
196
  """Start a Flower client node which connects to a Flower server.
196
197
 
@@ -234,6 +235,9 @@ def _start_client_internal(
234
235
  The maximum duration before the client stops trying to
235
236
  connect to the server in case of connection error.
236
237
  If set to None, there is no limit to the total time.
238
+ partitioni_id: Optional[int] (default: None)
239
+ The data partition index associated with this node. Better suited for
240
+ prototyping purposes.
237
241
  """
238
242
  if insecure is None:
239
243
  insecure = root_certificates is None
@@ -309,7 +313,7 @@ def _start_client_internal(
309
313
  on_backoff=_on_backoff,
310
314
  )
311
315
 
312
- node_state = NodeState()
316
+ node_state = NodeState(partition_id=partition_id)
313
317
  # run_id -> (fab_id, fab_version)
314
318
  run_info: Dict[int, Tuple[str, str]] = {}
315
319
 
@@ -93,7 +93,7 @@ def handle_legacy_message_from_msgtype(
93
93
  client_fn: ClientFn, message: Message, context: Context
94
94
  ) -> Message:
95
95
  """Handle legacy message in the inner most mod."""
96
- client = client_fn(str(message.metadata.partition_id))
96
+ client = client_fn(str(context.partition_id))
97
97
 
98
98
  # Check if NumPyClient is returend
99
99
  if isinstance(client, NumPyClient):
flwr/client/node_state.py CHANGED
@@ -15,7 +15,7 @@
15
15
  """Node state."""
16
16
 
17
17
 
18
- from typing import Any, Dict
18
+ from typing import Any, Dict, Optional
19
19
 
20
20
  from flwr.common import Context, RecordSet
21
21
 
@@ -23,14 +23,17 @@ from flwr.common import Context, RecordSet
23
23
  class NodeState:
24
24
  """State of a node where client nodes execute runs."""
25
25
 
26
- def __init__(self) -> None:
26
+ def __init__(self, partition_id: Optional[int]) -> None:
27
27
  self._meta: Dict[str, Any] = {} # holds metadata about the node
28
28
  self.run_contexts: Dict[int, Context] = {}
29
+ self._partition_id = partition_id
29
30
 
30
31
  def register_context(self, run_id: int) -> None:
31
32
  """Register new run context for this node."""
32
33
  if run_id not in self.run_contexts:
33
- self.run_contexts[run_id] = Context(state=RecordSet())
34
+ self.run_contexts[run_id] = Context(
35
+ state=RecordSet(), partition_id=self._partition_id
36
+ )
34
37
 
35
38
  def retrieve_context(self, run_id: int) -> Context:
36
39
  """Get run context given a run_id."""
@@ -41,7 +41,7 @@ def test_multirun_in_node_state() -> None:
41
41
  expected_values = {0: "1", 1: "1" * 3, 2: "1" * 2, 3: "1", 5: "1"}
42
42
 
43
43
  # NodeState
44
- node_state = NodeState()
44
+ node_state = NodeState(partition_id=None)
45
45
 
46
46
  for task in tasks:
47
47
  run_id = task.run_id
@@ -67,6 +67,7 @@ def run_supernode() -> None:
67
67
  authentication_keys=authentication_keys,
68
68
  max_retries=args.max_retries,
69
69
  max_wait_time=args.max_wait_time,
70
+ partition_id=args.partition_id,
70
71
  )
71
72
 
72
73
  # Graceful shutdown
@@ -373,6 +374,13 @@ def _parse_args_common(parser: argparse.ArgumentParser) -> None:
373
374
  type=str,
374
375
  help="The SuperNode's public key (as a path str) to enable authentication.",
375
376
  )
377
+ parser.add_argument(
378
+ "--partition-id",
379
+ type=int,
380
+ help="The data partition index associated with this SuperNode. Better suited "
381
+ "for prototyping purposes where a SuperNode might only load a fraction of an "
382
+ "artificially partitioned dataset (e.g. using `flwr-datasets`)",
383
+ )
376
384
 
377
385
 
378
386
  def _try_setup_client_authentication(
flwr/common/constant.py CHANGED
@@ -46,6 +46,9 @@ PING_BASE_MULTIPLIER = 0.8
46
46
  PING_RANDOM_RANGE = (-0.1, 0.1)
47
47
  PING_MAX_INTERVAL = 1e300
48
48
 
49
+ # IDs
50
+ RUN_ID_NUM_BYTES = 8
51
+ NODE_ID_NUM_BYTES = 8
49
52
  GRPC_ADAPTER_METADATA_FLOWER_VERSION_KEY = "flower-version"
50
53
  GRPC_ADAPTER_METADATA_SHOULD_EXIT_KEY = "should-exit"
51
54
 
flwr/common/context.py CHANGED
@@ -16,13 +16,14 @@
16
16
 
17
17
 
18
18
  from dataclasses import dataclass
19
+ from typing import Optional
19
20
 
20
21
  from .record import RecordSet
21
22
 
22
23
 
23
24
  @dataclass
24
25
  class Context:
25
- """State of your run.
26
+ """Context of your run.
26
27
 
27
28
  Parameters
28
29
  ----------
@@ -33,6 +34,15 @@ class Context:
33
34
  executing mods. It can also be used as a memory to access
34
35
  at different points during the lifecycle of this entity (e.g. across
35
36
  multiple rounds)
37
+ partition_id : Optional[int] (default: None)
38
+ An index that specifies the data partition that the ClientApp using this Context
39
+ object should make use of. Setting this attribute is better suited for
40
+ simulation or proto typing setups.
36
41
  """
37
42
 
38
43
  state: RecordSet
44
+ partition_id: Optional[int]
45
+
46
+ def __init__(self, state: RecordSet, partition_id: Optional[int] = None) -> None:
47
+ self.state = state
48
+ self.partition_id = partition_id
flwr/common/message.py CHANGED
@@ -48,10 +48,6 @@ class Metadata: # pylint: disable=too-many-instance-attributes
48
48
  message_type : str
49
49
  A string that encodes the action to be executed on
50
50
  the receiving end.
51
- partition_id : Optional[int]
52
- An identifier that can be used when loading a particular
53
- data partition for a ClientApp. Making use of this identifier
54
- is more relevant when conducting simulations.
55
51
  """
56
52
 
57
53
  def __init__( # pylint: disable=too-many-arguments
@@ -64,7 +60,6 @@ class Metadata: # pylint: disable=too-many-instance-attributes
64
60
  group_id: str,
65
61
  ttl: float,
66
62
  message_type: str,
67
- partition_id: int | None = None,
68
63
  ) -> None:
69
64
  var_dict = {
70
65
  "_run_id": run_id,
@@ -75,7 +70,6 @@ class Metadata: # pylint: disable=too-many-instance-attributes
75
70
  "_group_id": group_id,
76
71
  "_ttl": ttl,
77
72
  "_message_type": message_type,
78
- "_partition_id": partition_id,
79
73
  }
80
74
  self.__dict__.update(var_dict)
81
75
 
@@ -149,16 +143,6 @@ class Metadata: # pylint: disable=too-many-instance-attributes
149
143
  """Set message_type."""
150
144
  self.__dict__["_message_type"] = value
151
145
 
152
- @property
153
- def partition_id(self) -> int | None:
154
- """An identifier telling which data partition a ClientApp should use."""
155
- return cast(int, self.__dict__["_partition_id"])
156
-
157
- @partition_id.setter
158
- def partition_id(self, value: int) -> None:
159
- """Set partition_id."""
160
- self.__dict__["_partition_id"] = value
161
-
162
146
  def __repr__(self) -> str:
163
147
  """Return a string representation of this instance."""
164
148
  view = ", ".join([f"{k.lstrip('_')}={v!r}" for k, v in self.__dict__.items()])
@@ -398,5 +382,4 @@ def _create_reply_metadata(msg: Message, ttl: float) -> Metadata:
398
382
  group_id=msg.metadata.group_id,
399
383
  ttl=ttl,
400
384
  message_type=msg.metadata.message_type,
401
- partition_id=msg.metadata.partition_id,
402
385
  )
@@ -168,7 +168,7 @@ class RayBackend(Backend):
168
168
 
169
169
  Return output message and updated context.
170
170
  """
171
- partition_id = message.metadata.partition_id
171
+ partition_id = context.partition_id
172
172
 
173
173
  try:
174
174
  # Submit a task to the pool
@@ -57,7 +57,6 @@ async def worker(
57
57
  queue: "asyncio.Queue[TaskIns]",
58
58
  node_states: Dict[int, NodeState],
59
59
  state_factory: StateFactory,
60
- nodes_mapping: NodeToPartitionMapping,
61
60
  backend: Backend,
62
61
  ) -> None:
63
62
  """Get TaskIns from queue and pass it to an actor in the pool to execute it."""
@@ -74,8 +73,6 @@ async def worker(
74
73
 
75
74
  # Convert TaskIns to Message
76
75
  message = message_from_taskins(task_ins)
77
- # Set partition_id
78
- message.metadata.partition_id = nodes_mapping[node_id]
79
76
 
80
77
  # Let backend process message
81
78
  out_mssg, updated_context = await backend.process_message(
@@ -187,9 +184,7 @@ async def run(
187
184
  # Add workers (they submit Messages to Backend)
188
185
  worker_tasks = [
189
186
  asyncio.create_task(
190
- worker(
191
- app_fn, queue, node_states, state_factory, nodes_mapping, backend
192
- )
187
+ worker(app_fn, queue, node_states, state_factory, backend)
193
188
  )
194
189
  for _ in range(backend.num_workers)
195
190
  ]
@@ -291,8 +286,8 @@ def start_vce(
291
286
 
292
287
  # Construct mapping of NodeStates
293
288
  node_states: Dict[int, NodeState] = {}
294
- for node_id in nodes_mapping:
295
- node_states[node_id] = NodeState()
289
+ for node_id, partition_id in nodes_mapping.items():
290
+ node_states[node_id] = NodeState(partition_id=partition_id)
296
291
 
297
292
  # Load backend config
298
293
  log(DEBUG, "Supported backends: %s", list(supported_backends.keys()))
@@ -15,7 +15,6 @@
15
15
  """In-memory State implementation."""
16
16
 
17
17
 
18
- import os
19
18
  import threading
20
19
  import time
21
20
  from logging import ERROR
@@ -23,12 +22,13 @@ from typing import Dict, List, Optional, Set, Tuple
23
22
  from uuid import UUID, uuid4
24
23
 
25
24
  from flwr.common import log, now
25
+ from flwr.common.constant import NODE_ID_NUM_BYTES, RUN_ID_NUM_BYTES
26
26
  from flwr.common.typing import Run
27
27
  from flwr.proto.task_pb2 import TaskIns, TaskRes # pylint: disable=E0611
28
28
  from flwr.server.superlink.state.state import State
29
29
  from flwr.server.utils import validate_task_ins_or_res
30
30
 
31
- from .utils import make_node_unavailable_taskres
31
+ from .utils import generate_rand_int_from_bytes, make_node_unavailable_taskres
32
32
 
33
33
 
34
34
  class InMemoryState(State): # pylint: disable=R0902,R0904
@@ -216,7 +216,7 @@ class InMemoryState(State): # pylint: disable=R0902,R0904
216
216
  ) -> int:
217
217
  """Create, store in state, and return `node_id`."""
218
218
  # Sample a random int64 as node_id
219
- node_id: int = int.from_bytes(os.urandom(8), "little", signed=True)
219
+ node_id = generate_rand_int_from_bytes(NODE_ID_NUM_BYTES)
220
220
 
221
221
  with self.lock:
222
222
  if node_id in self.node_ids:
@@ -279,7 +279,7 @@ class InMemoryState(State): # pylint: disable=R0902,R0904
279
279
  """Create a new run for the specified `fab_id` and `fab_version`."""
280
280
  # Sample a random int64 as run_id
281
281
  with self.lock:
282
- run_id: int = int.from_bytes(os.urandom(8), "little", signed=True)
282
+ run_id = generate_rand_int_from_bytes(RUN_ID_NUM_BYTES)
283
283
 
284
284
  if run_id not in self.run_ids:
285
285
  self.run_ids[run_id] = Run(
@@ -15,7 +15,6 @@
15
15
  """SQLite based implemenation of server state."""
16
16
 
17
17
 
18
- import os
19
18
  import re
20
19
  import sqlite3
21
20
  import time
@@ -24,6 +23,7 @@ from typing import Any, Dict, List, Optional, Sequence, Set, Tuple, Union, cast
24
23
  from uuid import UUID, uuid4
25
24
 
26
25
  from flwr.common import log, now
26
+ from flwr.common.constant import NODE_ID_NUM_BYTES, RUN_ID_NUM_BYTES
27
27
  from flwr.common.typing import Run
28
28
  from flwr.proto.node_pb2 import Node # pylint: disable=E0611
29
29
  from flwr.proto.recordset_pb2 import RecordSet # pylint: disable=E0611
@@ -31,7 +31,7 @@ from flwr.proto.task_pb2 import Task, TaskIns, TaskRes # pylint: disable=E0611
31
31
  from flwr.server.utils.validator import validate_task_ins_or_res
32
32
 
33
33
  from .state import State
34
- from .utils import make_node_unavailable_taskres
34
+ from .utils import generate_rand_int_from_bytes, make_node_unavailable_taskres
35
35
 
36
36
  SQL_CREATE_TABLE_NODE = """
37
37
  CREATE TABLE IF NOT EXISTS node(
@@ -541,7 +541,7 @@ class SqliteState(State): # pylint: disable=R0904
541
541
  ) -> int:
542
542
  """Create, store in state, and return `node_id`."""
543
543
  # Sample a random int64 as node_id
544
- node_id: int = int.from_bytes(os.urandom(8), "little", signed=True)
544
+ node_id = generate_rand_int_from_bytes(NODE_ID_NUM_BYTES)
545
545
 
546
546
  query = "SELECT node_id FROM node WHERE public_key = :public_key;"
547
547
  row = self.query(query, {"public_key": public_key})
@@ -616,7 +616,7 @@ class SqliteState(State): # pylint: disable=R0904
616
616
  def create_run(self, fab_id: str, fab_version: str) -> int:
617
617
  """Create a new run for the specified `fab_id` and `fab_version`."""
618
618
  # Sample a random int64 as run_id
619
- run_id: int = int.from_bytes(os.urandom(8), "little", signed=True)
619
+ run_id = generate_rand_int_from_bytes(RUN_ID_NUM_BYTES)
620
620
 
621
621
  # Check conflicts
622
622
  query = "SELECT COUNT(*) FROM run WHERE run_id = ?;"
@@ -17,6 +17,7 @@
17
17
 
18
18
  import time
19
19
  from logging import ERROR
20
+ from os import urandom
20
21
  from uuid import uuid4
21
22
 
22
23
  from flwr.common import log
@@ -31,6 +32,11 @@ NODE_UNAVAILABLE_ERROR_REASON = (
31
32
  )
32
33
 
33
34
 
35
+ def generate_rand_int_from_bytes(num_bytes: int) -> int:
36
+ """Generate a random `num_bytes` integer."""
37
+ return int.from_bytes(urandom(num_bytes), "little", signed=True)
38
+
39
+
34
40
  def make_node_unavailable_taskres(ref_taskins: TaskIns) -> TaskRes:
35
41
  """Generate a TaskRes with a node unavailable error from a TaskIns."""
36
42
  current_time = time.time()
@@ -53,7 +53,7 @@ class RayActorClientProxy(ClientProxy):
53
53
 
54
54
  self.app_fn = _load_app
55
55
  self.actor_pool = actor_pool
56
- self.proxy_state = NodeState()
56
+ self.proxy_state = NodeState(partition_id=int(self.cid))
57
57
 
58
58
  def _submit_job(self, message: Message, timeout: Optional[float]) -> Message:
59
59
  """Sumbit a message to the ActorPool."""
@@ -107,7 +107,6 @@ class RayActorClientProxy(ClientProxy):
107
107
  reply_to_message="",
108
108
  ttl=timeout if timeout else DEFAULT_TTL,
109
109
  message_type=message_type,
110
- partition_id=int(self.cid),
111
110
  ),
112
111
  )
113
112
 
@@ -0,0 +1,109 @@
1
+ # Copyright 2024 Flower Labs GmbH. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ # ==============================================================================
15
+ """Deployment engine executor."""
16
+
17
+ import subprocess
18
+ import sys
19
+ from logging import ERROR, INFO
20
+ from typing import Optional
21
+
22
+ from typing_extensions import override
23
+
24
+ from flwr.cli.config_utils import get_fab_metadata
25
+ from flwr.cli.install import install_from_fab
26
+ from flwr.common.grpc import create_channel
27
+ from flwr.common.logger import log
28
+ from flwr.proto.driver_pb2 import CreateRunRequest # pylint: disable=E0611
29
+ from flwr.proto.driver_pb2_grpc import DriverStub
30
+ from flwr.server.driver.grpc_driver import DEFAULT_SERVER_ADDRESS_DRIVER
31
+
32
+ from .executor import Executor, RunTracker
33
+
34
+
35
+ class DeploymentEngine(Executor):
36
+ """Deployment engine executor."""
37
+
38
+ def __init__(
39
+ self,
40
+ address: str = DEFAULT_SERVER_ADDRESS_DRIVER,
41
+ root_certificates: Optional[bytes] = None,
42
+ ) -> None:
43
+ self.address = address
44
+ self.root_certificates = root_certificates
45
+ self.stub: Optional[DriverStub] = None
46
+
47
+ def _connect(self) -> None:
48
+ if self.stub is None:
49
+ channel = create_channel(
50
+ server_address=self.address,
51
+ insecure=(self.root_certificates is None),
52
+ root_certificates=self.root_certificates,
53
+ )
54
+ self.stub = DriverStub(channel)
55
+
56
+ def _create_run(self, fab_id: str, fab_version: str) -> int:
57
+ if self.stub is None:
58
+ self._connect()
59
+
60
+ assert self.stub is not None
61
+
62
+ req = CreateRunRequest(fab_id=fab_id, fab_version=fab_version)
63
+ res = self.stub.CreateRun(request=req)
64
+ return int(res.run_id)
65
+
66
+ @override
67
+ def start_run(self, fab_file: bytes) -> Optional[RunTracker]:
68
+ """Start run using the Flower Deployment Engine."""
69
+ try:
70
+ # Install FAB to flwr dir
71
+ fab_version, fab_id = get_fab_metadata(fab_file)
72
+ fab_path = install_from_fab(fab_file, None, True)
73
+
74
+ # Install FAB Python package
75
+ subprocess.check_call(
76
+ [sys.executable, "-m", "pip", "install", str(fab_path)],
77
+ stdout=subprocess.DEVNULL,
78
+ stderr=subprocess.DEVNULL,
79
+ )
80
+
81
+ # Call SuperLink to create run
82
+ run_id: int = self._create_run(fab_id, fab_version)
83
+ log(INFO, "Created run %s", str(run_id))
84
+
85
+ # Start ServerApp
86
+ proc = subprocess.Popen( # pylint: disable=consider-using-with
87
+ [
88
+ "flower-server-app",
89
+ "--run-id",
90
+ str(run_id),
91
+ "--insecure",
92
+ ],
93
+ stdout=subprocess.PIPE,
94
+ stderr=subprocess.PIPE,
95
+ text=True,
96
+ )
97
+ log(INFO, "Started run %s", str(run_id))
98
+
99
+ return RunTracker(
100
+ run_id=run_id,
101
+ proc=proc,
102
+ )
103
+ # pylint: disable-next=broad-except
104
+ except Exception as e:
105
+ log(ERROR, "Could not start run: %s", str(e))
106
+ return None
107
+
108
+
109
+ executor = DeploymentEngine()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: flwr-nightly
3
- Version: 1.10.0.dev20240625
3
+ Version: 1.10.0.dev20240629
4
4
  Summary: Flower: A Friendly Federated Learning Framework
5
5
  Home-page: https://flower.ai
6
6
  License: Apache-2.0
@@ -1,7 +1,7 @@
1
1
  flwr/__init__.py,sha256=VmBWedrCxqmt4QvUHBLqyVEH6p7zaFMD_oCHerXHSVw,937
2
2
  flwr/cli/__init__.py,sha256=cZJVgozlkC6Ni2Hd_FAIrqefrkCGOV18fikToq-6iLw,720
3
3
  flwr/cli/app.py,sha256=FBcSrE35ll88VE11ib67qgsJe2GYDN25UswV9-cYcX8,1267
4
- flwr/cli/build.py,sha256=W3tIAdJFykXTAvgDh-V5PGSIfucFmWmu7o18Cklx9MM,4740
4
+ flwr/cli/build.py,sha256=G0wgNrgxir_H0Qb_YlT2itxETEb-9q_3RQflqIqNXTU,4737
5
5
  flwr/cli/config_utils.py,sha256=ugUlqH52yxTPMtKw6q4xv5k2OVWUy89cwyJ5LB2RLgk,6037
6
6
  flwr/cli/example.py,sha256=1bGDYll3BXQY2kRqSN-oICqS5n1b9m0g0RvXTopXHl4,2215
7
7
  flwr/cli/install.py,sha256=Wz7Hqg2PE9N-w5CnqlH9Zr8mzADN2J7NLcUhgldZLWU,6579
@@ -50,10 +50,10 @@ flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl,sha256=wxN6I8uvWZ4MErvTbQJ
50
50
  flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl,sha256=wFeJuhqnBPQtKCBvnE3ySBpxmbeNdxcsq2Eb_RmSDIg,655
51
51
  flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl,sha256=zkxLTQRvujF76sIlzNNGPVU7Y9nVCwNBxAx82AOBaJY,654
52
52
  flwr/cli/run/__init__.py,sha256=oCd6HmQDx-sqver1gecgx-uMA38BLTSiiKpl7RGNceg,789
53
- flwr/cli/run/run.py,sha256=4FFE8bSUecqXClGcFx_i5rdpbAFCp_imK0LyUIkCheY,4068
53
+ flwr/cli/run/run.py,sha256=WsOknYnwm_iD-s6jAHxjGKbm0PgV3VZdQ04v6s4nPQY,4449
54
54
  flwr/cli/utils.py,sha256=l65Ul0YsSBPuypk0uorAtEDmLEYiUrzpCXi6zCg9mJ4,4506
55
55
  flwr/client/__init__.py,sha256=FWiXcxwJf1nfTFxEiO9rHtwxzA4x809Iu22sDV2qSAA,1279
56
- flwr/client/app.py,sha256=n4TSijcc2bAyRWu5-TNiTZtI6mMBa18f3BRbNnkYgUM,24386
56
+ flwr/client/app.py,sha256=FcOolVUe8p2meFfxDI3YIlL8y-1rv_8Q6azx-d455oY,24608
57
57
  flwr/client/client.py,sha256=Vp9UkOkoHdNfn6iMYZsj_5m_GICiFfUlKEVaLad-YhM,8183
58
58
  flwr/client/client_app.py,sha256=IfafzehQpo5Od2taQqYW0nEkdRK_YirSyLEU9q33QeY,8635
59
59
  flwr/client/dpfedavg_numpy_client.py,sha256=ylZ-LpBIKmL1HCiS8kq4pkp2QGalc8rYEzDHdRG3VRQ,7435
@@ -67,7 +67,7 @@ flwr/client/grpc_rere_client/connection.py,sha256=MazJNpMkatxXXcmkwNCWfCzCqMXW-n
67
67
  flwr/client/grpc_rere_client/grpc_adapter.py,sha256=woljH8yr1pyLH4W4Azogyy7Nafn6y9DHBnDCIIVKwCw,4711
68
68
  flwr/client/heartbeat.py,sha256=cx37mJBH8LyoIN4Lks85wtqT1mnU5GulQnr4pGCvAq0,2404
69
69
  flwr/client/message_handler/__init__.py,sha256=QxxQuBNpFPTHx3KiUNvQSlqMKlEnbRR1kFfc1KVje08,719
70
- flwr/client/message_handler/message_handler.py,sha256=cfbOdYQrC9i8TaGtcHABQzSDGIJrAtDg1vx42qiXmog,6553
70
+ flwr/client/message_handler/message_handler.py,sha256=RghBrdedAyqKc0dNeEa2oef5A9cCj4qIlRWSbRyaog8,6544
71
71
  flwr/client/message_handler/task_handler.py,sha256=ZDJBKmrn2grRMNl1rU1iGs7FiMHL5VmZiSp_6h9GHVU,1824
72
72
  flwr/client/mod/__init__.py,sha256=37XeXZLFq_tzFVKVtC9JaigM2bSAU7BrGQvMPCE3Q28,1159
73
73
  flwr/client/mod/centraldp_mods.py,sha256=UGwNuqpmOWfLdfJITFgdi1TG-nLjuSb-cbEyoyfDgxQ,5415
@@ -77,19 +77,19 @@ flwr/client/mod/secure_aggregation/__init__.py,sha256=A7DzZ3uvXTUkuHBzrxJMWQQD4R
77
77
  flwr/client/mod/secure_aggregation/secagg_mod.py,sha256=wI9tuIEvMUETz-wVIEbPYvh-1nK9CEylBLGoVpNhL94,1095
78
78
  flwr/client/mod/secure_aggregation/secaggplus_mod.py,sha256=fZTfIELkYS64lpgxQKL66s-QHjCn-159qfLoNoIMJjc,19699
79
79
  flwr/client/mod/utils.py,sha256=UAJXiB0wwVyLkCkpW_i5BXikdBR65p8sNFr7VNHm2nk,1226
80
- flwr/client/node_state.py,sha256=KTTs_l4I0jBM7IsSsbAGjhfL_yZC3QANbzyvyfZBRDM,1778
81
- flwr/client/node_state_tests.py,sha256=gPwz0zf2iuDSa11jedkur_u3Xm7lokIDG5ALD2MCvSw,2195
80
+ flwr/client/node_state.py,sha256=z4ol2a20wvspTkn53q24Gnt-1csZRR8JjWnk4A_-Agk,1922
81
+ flwr/client/node_state_tests.py,sha256=fadnOTT3VAuzzs_UAbOukcuyx-oQPv2lBq92qTuUecw,2212
82
82
  flwr/client/numpy_client.py,sha256=u76GWAdHmJM88Agm2EgLQSvO8Jnk225mJTk-_TmPjFE,10283
83
83
  flwr/client/rest_client/__init__.py,sha256=5KGlp7pjc1dhNRkKlaNtUfQmg8wrRFh9lS3P3uRS-7Q,735
84
84
  flwr/client/rest_client/connection.py,sha256=vw264e67jq7kgqgqHLvgXFbQwoHll2yET9XKzJkXtnM,11957
85
85
  flwr/client/supernode/__init__.py,sha256=SUhWOzcgXRNXk1V9UgB5-FaWukqqrOEajVUHEcPkwyQ,865
86
- flwr/client/supernode/app.py,sha256=waBWwTtOJ2YZpTjhQG3YrBSyvvGjrNdNYSwHGJLZh2Q,14487
86
+ flwr/client/supernode/app.py,sha256=pPQigWa_TfPA5UpsKdX73k_0w0v6zR-DYwAb6ykVa8U,14849
87
87
  flwr/client/typing.py,sha256=c9EvjlEjasxn1Wqx6bGl6Xg6vM1gMFfmXht-E2i5J-k,1006
88
88
  flwr/common/__init__.py,sha256=4cBLNNnNTwHDnL_HCxhU5ILCSZ6fYh3A_aMBtlvHTVw,3721
89
89
  flwr/common/address.py,sha256=wRu1Luezx1PWadwV9OA_KNko01oVvbRnPqfzaDn8QOk,1882
90
90
  flwr/common/config.py,sha256=afI57MxKWrLzrh0rlrSxnAlMCI7crgnllouAKxznWLY,2628
91
- flwr/common/constant.py,sha256=2u7nLqayhiFtcpSauRQZrTYkHLLEU1qv6TO1eMGkOI0,2841
92
- flwr/common/context.py,sha256=ounF-mWPPtXGwtae3sg5EhF58ScviOa3MVqxRpGVu-8,1313
91
+ flwr/common/constant.py,sha256=qNmxEV3_pOO7MeTAA9qwIh4KoCPStcX3Gm8GRPIRx_4,2890
92
+ flwr/common/context.py,sha256=j894PRbqybFSw4Shw8DFMleDx3SUYTbtNk5xLFyNHGw,1790
93
93
  flwr/common/date.py,sha256=OcQuwpb2HxcblTqYm6H223ufop5UZw5N_fzalbpOVzY,891
94
94
  flwr/common/differential_privacy.py,sha256=WZWrL7C9XaB9l9NDkLDI5PvM7jwcoTTFu08ZVG8-M5Q,6113
95
95
  flwr/common/differential_privacy_constants.py,sha256=c7b7tqgvT7yMK0XN9ndiTBs4mQf6d3qk6K7KBZGlV4Q,1074
@@ -97,7 +97,7 @@ flwr/common/dp.py,sha256=SZ3MtJKpjxUeQeyb2pqWSF0S_h9rZtCGYPToIxqcNj8,2004
97
97
  flwr/common/exit_handlers.py,sha256=2Nt0wLhc17KQQsLPFSRAjjhUiEFfJK6tNozdGiIY4Fs,2812
98
98
  flwr/common/grpc.py,sha256=_9838_onFLx7W6_lakUN35ziKpdcKp7fA-0jE0EhcEQ,2460
99
99
  flwr/common/logger.py,sha256=bFu4eOychVwwYwaaCtxQ85dmx8gUtvwp6fRk-GefXHk,7107
100
- flwr/common/message.py,sha256=M7rwhmO9HgdGlHnNysLJMm_UJFBjqvQbXM0G-bLsi7o,13896
100
+ flwr/common/message.py,sha256=QmFYYXA-3e9M8tGO-3NPyAI8yvdmcpdYaA_noR1DE88,13194
101
101
  flwr/common/object_ref.py,sha256=PQR0tztVOkD1nn_uGuNz4bHm7z4fwsosTsUKvWIGF5Y,6506
102
102
  flwr/common/parameter.py,sha256=-bFAUayToYDF50FZGrBC1hQYJCQDtB2bbr3ZuVLMtdE,2095
103
103
  flwr/common/pyproject.py,sha256=EI_ovbCHGmhYrdPx0RSDi5EkFZFof-8m1PA54c0ZTjc,1385
@@ -233,14 +233,14 @@ flwr/server/superlink/fleet/rest_rere/rest_api.py,sha256=yoSU-6nCJF9ASHGNpSY69nZ
233
233
  flwr/server/superlink/fleet/vce/__init__.py,sha256=36MHKiefnJeyjwMQzVUK4m06Ojon3WDcwZGQsAcyVhQ,783
234
234
  flwr/server/superlink/fleet/vce/backend/__init__.py,sha256=oBIzmnrSSRvH_H0vRGEGWhWzQQwqe3zn6e13RsNwlIY,1466
235
235
  flwr/server/superlink/fleet/vce/backend/backend.py,sha256=LJsKl7oixVvptcG98Rd9ejJycNWcEVB0ODvSreLGp-A,2260
236
- flwr/server/superlink/fleet/vce/backend/raybackend.py,sha256=oUTvvKybcN2QFj3641Hr1QxNL86_ALsB7KAIUlTy7KE,7504
237
- flwr/server/superlink/fleet/vce/vce_api.py,sha256=o8DqsL4vrq0AiN4qfQkvRH7gFcztkdy1Wr1IkwWaCmY,12534
236
+ flwr/server/superlink/fleet/vce/backend/raybackend.py,sha256=dwaebZfzvzlvjkMflH5hJ19-Sszvxt0AWwIEGk9BliU,7495
237
+ flwr/server/superlink/fleet/vce/vce_api.py,sha256=skPxli2QKTn-zElEt7lak5Q4N5v8NZB-EeROKac2bAs,12387
238
238
  flwr/server/superlink/state/__init__.py,sha256=Gj2OTFLXvA-mAjBvwuKDM3rDrVaQPcIoybSa2uskMTE,1003
239
- flwr/server/superlink/state/in_memory_state.py,sha256=_cgJ0Bh_km_c8xqZRI90VibypRBL7uTIOXfa9VuQEQs,12827
240
- flwr/server/superlink/state/sqlite_state.py,sha256=k_cxDgqRUNJxyKUV7HxrujWpzSwTAmyMb-k_p2xS4tM,28612
239
+ flwr/server/superlink/state/in_memory_state.py,sha256=5bkz3oqbpPymhorCtbicxQg31RJC0vT4AT-o0Ex0LRQ,12895
240
+ flwr/server/superlink/state/sqlite_state.py,sha256=tDE6fWVMwkXugy6ri75K-H5TXs-2MuBaVpFi9kKX01c,28680
241
241
  flwr/server/superlink/state/state.py,sha256=Ap-TzFPWTRd0a4uCq0XhE-jDPfPbzGvQEDskVOpCt98,8037
242
242
  flwr/server/superlink/state/state_factory.py,sha256=Fo8pBQ1WWrVJK5TOEPZ_zgJE69_mfTGjTO6czh6571o,2021
243
- flwr/server/superlink/state/utils.py,sha256=qhIjBu5_rqm9GLMB6QS5TIRrMDVs85lmY17BqZ1ccLk,2207
243
+ flwr/server/superlink/state/utils.py,sha256=155ngcaSePy7nD8X4LHgpuVok6fcH5_CPNRiFAbLWDA,2407
244
244
  flwr/server/typing.py,sha256=2zSG-KuDAgwFPuzgVjTLDaEqJ8gXXGqFR2RD-qIk730,913
245
245
  flwr/server/utils/__init__.py,sha256=pltsPHJoXmUIr3utjwwYxu7_ZAGy5u4MVHzv9iA5Un8,908
246
246
  flwr/server/utils/tensorboard.py,sha256=l6aMVdtZbbfCX8uwFW-WxH6P171-R-tulMcPhlykowo,5485
@@ -255,16 +255,17 @@ flwr/simulation/__init__.py,sha256=9x8OCkK3jpFAPJB1aeEMOddz6V58bExQPtwE8Z3q-RY,1
255
255
  flwr/simulation/app.py,sha256=7vEV4ytkpJ-zq_5KBSVteTuqR2ZoQdYlfOaYpyzXQcQ,14380
256
256
  flwr/simulation/ray_transport/__init__.py,sha256=wzcEEwUUlulnXsg6raCA1nGpP3LlAQDtJ8zNkCXcVbA,734
257
257
  flwr/simulation/ray_transport/ray_actor.py,sha256=bu6gEnbHYtlUxLtzjzpEUtvkQDRzl1PVMjJuCDZvfgQ,19196
258
- flwr/simulation/ray_transport/ray_client_proxy.py,sha256=hP0B91tkSl4DUyGTRQPMLOfcpR-gyKJ_5SrHz3r9UGc,6738
258
+ flwr/simulation/ray_transport/ray_client_proxy.py,sha256=rN34kP6cHJzvAli1mAjjeip72ffwhy10Ytz7lqqUKvo,6720
259
259
  flwr/simulation/ray_transport/utils.py,sha256=TYdtfg1P9VfTdLMOJlifInGpxWHYs9UfUqIv2wfkRLA,2392
260
260
  flwr/simulation/run_simulation.py,sha256=m2FK0LzLSOR2HC94XDowLLwvHuIhaV6q78HsT_MKLMU,16858
261
261
  flwr/superexec/__init__.py,sha256=9h94ogLxi6eJ3bUuJYq3E3pApThSabTPiSmPAGlTkHE,800
262
262
  flwr/superexec/app.py,sha256=kCCsCo51_peIMmKc4-tmiN5qO29cPqZOqqs-QVH0oA4,6097
263
+ flwr/superexec/deployment.py,sha256=yWIhS8rozuDo_jQ-Uw-RX_9-Lsn3Pb2uqe7OZYjXSQ0,3733
263
264
  flwr/superexec/exec_grpc.py,sha256=u-rztpOleqSGqgvNE-ZLw1HchNsBHU1-eB3m52GZ0pQ,1852
264
265
  flwr/superexec/exec_servicer.py,sha256=qf8CT4RLXnY8omOy75kwfsWmMnfTD42B4ENTh5S-BCY,2120
265
266
  flwr/superexec/executor.py,sha256=GouXCY2LiZ-ffsOoZ_z-fh4JwbzMmhTl-gwpWFgGWTY,1688
266
- flwr_nightly-1.10.0.dev20240625.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
267
- flwr_nightly-1.10.0.dev20240625.dist-info/METADATA,sha256=cAtSHEj9_vEyH7vFzn2XmksbOEfvCW228YC9_DAj2NE,15614
268
- flwr_nightly-1.10.0.dev20240625.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
269
- flwr_nightly-1.10.0.dev20240625.dist-info/entry_points.txt,sha256=7qBQcA-bDGDxnJmLd9FYqglFQubjCNqyg9M8a-lukps,336
270
- flwr_nightly-1.10.0.dev20240625.dist-info/RECORD,,
267
+ flwr_nightly-1.10.0.dev20240629.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
268
+ flwr_nightly-1.10.0.dev20240629.dist-info/METADATA,sha256=D9eKqgaS_e3ZiW6UMuIJ3xRkd1NnmGVUCYzbdm7rQxw,15614
269
+ flwr_nightly-1.10.0.dev20240629.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
270
+ flwr_nightly-1.10.0.dev20240629.dist-info/entry_points.txt,sha256=7qBQcA-bDGDxnJmLd9FYqglFQubjCNqyg9M8a-lukps,336
271
+ flwr_nightly-1.10.0.dev20240629.dist-info/RECORD,,