flwr-nightly 1.9.0.dev20240404__py3-none-any.whl → 1.9.0.dev20240412__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/example.py +3 -1
- flwr/cli/new/new.py +16 -5
- flwr/cli/new/templates/app/README.md.tpl +0 -4
- flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +11 -11
- flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +13 -13
- flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +12 -13
- flwr/cli/utils.py +60 -4
- flwr/client/app.py +7 -6
- flwr/client/heartbeat.py +3 -1
- flwr/common/retry_invoker.py +1 -0
- flwr/proto/driver_pb2.py +18 -18
- flwr/proto/driver_pb2.pyi +8 -0
- flwr/server/compat/app_utils.py +3 -2
- {flwr_nightly-1.9.0.dev20240404.dist-info → flwr_nightly-1.9.0.dev20240412.dist-info}/METADATA +1 -1
- {flwr_nightly-1.9.0.dev20240404.dist-info → flwr_nightly-1.9.0.dev20240412.dist-info}/RECORD +18 -21
- flwr/cli/new/templates/app/requirements.numpy.txt.tpl +0 -2
- flwr/cli/new/templates/app/requirements.pytorch.txt.tpl +0 -4
- flwr/cli/new/templates/app/requirements.tensorflow.txt.tpl +0 -4
- {flwr_nightly-1.9.0.dev20240404.dist-info → flwr_nightly-1.9.0.dev20240412.dist-info}/LICENSE +0 -0
- {flwr_nightly-1.9.0.dev20240404.dist-info → flwr_nightly-1.9.0.dev20240412.dist-info}/WHEEL +0 -0
- {flwr_nightly-1.9.0.dev20240404.dist-info → flwr_nightly-1.9.0.dev20240412.dist-info}/entry_points.txt +0 -0
flwr/cli/example.py
CHANGED
|
@@ -39,7 +39,9 @@ def example() -> None:
|
|
|
39
39
|
with urllib.request.urlopen(examples_directory_url) as res:
|
|
40
40
|
data = json.load(res)
|
|
41
41
|
example_names = [
|
|
42
|
-
item["path"]
|
|
42
|
+
item["path"]
|
|
43
|
+
for item in data["tree"]
|
|
44
|
+
if item["path"] not in [".gitignore", "doc"]
|
|
43
45
|
]
|
|
44
46
|
|
|
45
47
|
example_name = prompt_options(
|
flwr/cli/new/new.py
CHANGED
|
@@ -22,7 +22,12 @@ from typing import Dict, Optional
|
|
|
22
22
|
import typer
|
|
23
23
|
from typing_extensions import Annotated
|
|
24
24
|
|
|
25
|
-
from ..utils import
|
|
25
|
+
from ..utils import (
|
|
26
|
+
is_valid_project_name,
|
|
27
|
+
prompt_options,
|
|
28
|
+
prompt_text,
|
|
29
|
+
sanitize_project_name,
|
|
30
|
+
)
|
|
26
31
|
|
|
27
32
|
|
|
28
33
|
class MlFramework(str, Enum):
|
|
@@ -81,6 +86,16 @@ def new(
|
|
|
81
86
|
] = None,
|
|
82
87
|
) -> None:
|
|
83
88
|
"""Create new Flower project."""
|
|
89
|
+
if project_name is None:
|
|
90
|
+
project_name = prompt_text("Please provide project name")
|
|
91
|
+
if not is_valid_project_name(project_name):
|
|
92
|
+
project_name = prompt_text(
|
|
93
|
+
"Please provide a name that only contains "
|
|
94
|
+
"characters in {'_', 'a-zA-Z', '0-9'}",
|
|
95
|
+
predicate=is_valid_project_name,
|
|
96
|
+
default=sanitize_project_name(project_name),
|
|
97
|
+
)
|
|
98
|
+
|
|
84
99
|
print(
|
|
85
100
|
typer.style(
|
|
86
101
|
f"🔨 Creating Flower project {project_name}...",
|
|
@@ -89,9 +104,6 @@ def new(
|
|
|
89
104
|
)
|
|
90
105
|
)
|
|
91
106
|
|
|
92
|
-
if project_name is None:
|
|
93
|
-
project_name = prompt_text("Please provide project name")
|
|
94
|
-
|
|
95
107
|
if framework is not None:
|
|
96
108
|
framework_str = str(framework.value)
|
|
97
109
|
else:
|
|
@@ -116,7 +128,6 @@ def new(
|
|
|
116
128
|
# List of files to render
|
|
117
129
|
files = {
|
|
118
130
|
"README.md": {"template": "app/README.md.tpl"},
|
|
119
|
-
"requirements.txt": {"template": f"app/requirements.{framework_str}.txt.tpl"},
|
|
120
131
|
"flower.toml": {"template": "app/flower.toml.tpl"},
|
|
121
132
|
"pyproject.toml": {"template": f"app/pyproject.{framework_str}.toml.tpl"},
|
|
122
133
|
f"{pnl}/__init__.py": {"template": "app/code/__init__.py.tpl"},
|
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
[build-system]
|
|
2
|
-
requires = ["
|
|
3
|
-
build-backend = "
|
|
2
|
+
requires = ["hatchling"]
|
|
3
|
+
build-backend = "hatchling.build"
|
|
4
4
|
|
|
5
|
-
[
|
|
5
|
+
[project]
|
|
6
6
|
name = "$project_name"
|
|
7
7
|
version = "1.0.0"
|
|
8
8
|
description = ""
|
|
9
|
-
license = "Apache-2.0"
|
|
10
9
|
authors = [
|
|
11
|
-
"The Flower Authors
|
|
10
|
+
{ name = "The Flower Authors", email = "hello@flower.ai" },
|
|
11
|
+
]
|
|
12
|
+
license = {text = "Apache License (2.0)"}
|
|
13
|
+
dependencies = [
|
|
14
|
+
"flwr[simulation]>=1.8.0,<2.0",
|
|
15
|
+
"numpy>=1.21.0",
|
|
12
16
|
]
|
|
13
|
-
readme = "README.md"
|
|
14
17
|
|
|
15
|
-
[tool.
|
|
16
|
-
|
|
17
|
-
# Mandatory dependencies
|
|
18
|
-
numpy = "^1.21.0"
|
|
19
|
-
flwr = { version = "^1.8.0", extras = ["simulation"] }
|
|
18
|
+
[tool.hatch.build.targets.wheel]
|
|
19
|
+
packages = ["."]
|
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
[build-system]
|
|
2
|
-
requires = ["
|
|
3
|
-
build-backend = "
|
|
2
|
+
requires = ["hatchling"]
|
|
3
|
+
build-backend = "hatchling.build"
|
|
4
4
|
|
|
5
|
-
[
|
|
5
|
+
[project]
|
|
6
6
|
name = "$project_name"
|
|
7
7
|
version = "1.0.0"
|
|
8
8
|
description = ""
|
|
9
|
-
license = "Apache-2.0"
|
|
10
9
|
authors = [
|
|
11
|
-
"The Flower Authors
|
|
10
|
+
{ name = "The Flower Authors", email = "hello@flower.ai" },
|
|
11
|
+
]
|
|
12
|
+
license = {text = "Apache License (2.0)"}
|
|
13
|
+
dependencies = [
|
|
14
|
+
"flwr[simulation]>=1.8.0,<2.0",
|
|
15
|
+
"flwr-datasets[vision]>=0.0.2,<1.0.0",
|
|
16
|
+
"torch==2.2.1",
|
|
17
|
+
"torchvision==0.17.1",
|
|
12
18
|
]
|
|
13
|
-
readme = "README.md"
|
|
14
19
|
|
|
15
|
-
[tool.
|
|
16
|
-
|
|
17
|
-
# Mandatory dependencies
|
|
18
|
-
flwr = { version = "^1.8.0", extras = ["simulation"] }
|
|
19
|
-
flwr-datasets = { version = "0.0.2", extras = ["vision"] }
|
|
20
|
-
torch = "2.2.1"
|
|
21
|
-
torchvision = "0.17.1"
|
|
20
|
+
[tool.hatch.build.targets.wheel]
|
|
21
|
+
packages = ["."]
|
|
@@ -1,21 +1,20 @@
|
|
|
1
1
|
[build-system]
|
|
2
|
-
requires = ["
|
|
3
|
-
build-backend = "
|
|
2
|
+
requires = ["hatchling"]
|
|
3
|
+
build-backend = "hatchling.build"
|
|
4
4
|
|
|
5
|
-
[
|
|
5
|
+
[project]
|
|
6
6
|
name = "$project_name"
|
|
7
7
|
version = "1.0.0"
|
|
8
8
|
description = ""
|
|
9
|
-
license = "Apache-2.0"
|
|
10
9
|
authors = [
|
|
11
|
-
"The Flower Authors
|
|
10
|
+
{ name = "The Flower Authors", email = "hello@flower.ai" },
|
|
11
|
+
]
|
|
12
|
+
license = {text = "Apache License (2.0)"}
|
|
13
|
+
dependencies = [
|
|
14
|
+
"flwr[simulation]>=1.8.0,<2.0",
|
|
15
|
+
"flwr-datasets[vision]>=0.0.2,<1.0.0",
|
|
16
|
+
"tensorflow>=2.11.1",
|
|
12
17
|
]
|
|
13
|
-
readme = "README.md"
|
|
14
18
|
|
|
15
|
-
[tool.
|
|
16
|
-
|
|
17
|
-
# Mandatory dependencies
|
|
18
|
-
flwr = { version = "^1.8.0", extras = ["simulation"] }
|
|
19
|
-
flwr-datasets = { version = "^0.0.2", extras = ["vision"] }
|
|
20
|
-
tensorflow-cpu = { version = ">=2.9.1,<2.11.1 || >2.11.1", markers = "platform_machine == \"x86_64\"" }
|
|
21
|
-
tensorflow-macos = { version = ">=2.9.1,<2.11.1 || >2.11.1", markers = "sys_platform == \"darwin\" and platform_machine == \"arm64\"" }
|
|
19
|
+
[tool.hatch.build.targets.wheel]
|
|
20
|
+
packages = ["."]
|
flwr/cli/utils.py
CHANGED
|
@@ -14,18 +14,23 @@
|
|
|
14
14
|
# ==============================================================================
|
|
15
15
|
"""Flower command line interface utils."""
|
|
16
16
|
|
|
17
|
-
from typing import List, cast
|
|
17
|
+
from typing import Callable, List, Optional, cast
|
|
18
18
|
|
|
19
19
|
import typer
|
|
20
20
|
|
|
21
21
|
|
|
22
|
-
def prompt_text(
|
|
22
|
+
def prompt_text(
|
|
23
|
+
text: str,
|
|
24
|
+
predicate: Callable[[str], bool] = lambda _: True,
|
|
25
|
+
default: Optional[str] = None,
|
|
26
|
+
) -> str:
|
|
23
27
|
"""Ask user to enter text input."""
|
|
24
28
|
while True:
|
|
25
29
|
result = typer.prompt(
|
|
26
|
-
typer.style(f"\n💬 {text}", fg=typer.colors.MAGENTA, bold=True)
|
|
30
|
+
typer.style(f"\n💬 {text}", fg=typer.colors.MAGENTA, bold=True),
|
|
31
|
+
default=default,
|
|
27
32
|
)
|
|
28
|
-
if len(result) > 0:
|
|
33
|
+
if predicate(result) and len(result) > 0:
|
|
29
34
|
break
|
|
30
35
|
print(typer.style("❌ Invalid entry", fg=typer.colors.RED, bold=True))
|
|
31
36
|
|
|
@@ -65,3 +70,54 @@ def prompt_options(text: str, options: List[str]) -> str:
|
|
|
65
70
|
|
|
66
71
|
result = options[int(index)]
|
|
67
72
|
return result
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
def is_valid_project_name(name: str) -> bool:
|
|
76
|
+
"""Check if the given string is a valid Python module name.
|
|
77
|
+
|
|
78
|
+
A valid module name must start with a letter or an underscore, and can only contain
|
|
79
|
+
letters, digits, and underscores.
|
|
80
|
+
"""
|
|
81
|
+
if not name:
|
|
82
|
+
return False
|
|
83
|
+
|
|
84
|
+
# Check if the first character is a letter or underscore
|
|
85
|
+
if not (name[0].isalpha() or name[0] == "_"):
|
|
86
|
+
return False
|
|
87
|
+
|
|
88
|
+
# Check if the rest of the characters are valid (letter, digit, or underscore)
|
|
89
|
+
for char in name[1:]:
|
|
90
|
+
if not (char.isalnum() or char == "_"):
|
|
91
|
+
return False
|
|
92
|
+
|
|
93
|
+
return True
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
def sanitize_project_name(name: str) -> str:
|
|
97
|
+
"""Sanitize the given string to make it a valid Python module name.
|
|
98
|
+
|
|
99
|
+
This version replaces hyphens with underscores, removes any characters not allowed
|
|
100
|
+
in Python module names, makes the string lowercase, and ensures it starts with a
|
|
101
|
+
valid character.
|
|
102
|
+
"""
|
|
103
|
+
# Replace '-' with '_'
|
|
104
|
+
name_with_underscores = name.replace("-", "_").replace(" ", "_")
|
|
105
|
+
|
|
106
|
+
# Allowed characters in a module name: letters, digits, underscore
|
|
107
|
+
allowed_chars = set(
|
|
108
|
+
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_"
|
|
109
|
+
)
|
|
110
|
+
|
|
111
|
+
# Make the string lowercase
|
|
112
|
+
sanitized_name = name_with_underscores.lower()
|
|
113
|
+
|
|
114
|
+
# Remove any characters not allowed in Python module names
|
|
115
|
+
sanitized_name = "".join(c for c in sanitized_name if c in allowed_chars)
|
|
116
|
+
|
|
117
|
+
# Ensure the first character is a letter or underscore
|
|
118
|
+
if sanitized_name and (
|
|
119
|
+
sanitized_name[0].isdigit() or sanitized_name[0] not in allowed_chars
|
|
120
|
+
):
|
|
121
|
+
sanitized_name = "_" + sanitized_name
|
|
122
|
+
|
|
123
|
+
return sanitized_name
|
flwr/client/app.py
CHANGED
|
@@ -456,12 +456,13 @@ def _start_client_internal(
|
|
|
456
456
|
continue
|
|
457
457
|
|
|
458
458
|
log(INFO, "")
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
459
|
+
if len(message.metadata.group_id) > 0:
|
|
460
|
+
log(
|
|
461
|
+
INFO,
|
|
462
|
+
"[RUN %s, ROUND %s]",
|
|
463
|
+
message.metadata.run_id,
|
|
464
|
+
message.metadata.group_id,
|
|
465
|
+
)
|
|
465
466
|
log(
|
|
466
467
|
INFO,
|
|
467
468
|
"Received: %s message %s",
|
flwr/client/heartbeat.py
CHANGED
|
@@ -66,7 +66,9 @@ def start_ping_loop(
|
|
|
66
66
|
asynchronous ping operations. The loop can be terminated through the provided stop
|
|
67
67
|
event.
|
|
68
68
|
"""
|
|
69
|
-
thread = threading.Thread(
|
|
69
|
+
thread = threading.Thread(
|
|
70
|
+
target=_ping_loop, args=(ping_fn, stop_event), daemon=True
|
|
71
|
+
)
|
|
70
72
|
thread.start()
|
|
71
73
|
|
|
72
74
|
return thread
|
flwr/common/retry_invoker.py
CHANGED
|
@@ -261,6 +261,7 @@ class RetryInvoker:
|
|
|
261
261
|
try:
|
|
262
262
|
ret = target(*args, **kwargs)
|
|
263
263
|
except self.recoverable_exceptions as err:
|
|
264
|
+
state.exception = err
|
|
264
265
|
# Check if giveup event should be triggered
|
|
265
266
|
max_tries_exceeded = try_cnt == self.max_tries
|
|
266
267
|
max_time_exceeded = (
|
flwr/proto/driver_pb2.py
CHANGED
|
@@ -16,7 +16,7 @@ from flwr.proto import node_pb2 as flwr_dot_proto_dot_node__pb2
|
|
|
16
16
|
from flwr.proto import task_pb2 as flwr_dot_proto_dot_task__pb2
|
|
17
17
|
|
|
18
18
|
|
|
19
|
-
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x17\x66lwr/proto/driver.proto\x12\nflwr.proto\x1a\x15\x66lwr/proto/node.proto\x1a\x15\x66lwr/proto/task.proto\"\
|
|
19
|
+
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x17\x66lwr/proto/driver.proto\x12\nflwr.proto\x1a\x15\x66lwr/proto/node.proto\x1a\x15\x66lwr/proto/task.proto\"7\n\x10\x43reateRunRequest\x12\x0e\n\x06\x66\x61\x62_id\x18\x01 \x01(\t\x12\x13\n\x0b\x66\x61\x62_version\x18\x02 \x01(\t\"#\n\x11\x43reateRunResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\x12\"!\n\x0fGetNodesRequest\x12\x0e\n\x06run_id\x18\x01 \x01(\x12\"3\n\x10GetNodesResponse\x12\x1f\n\x05nodes\x18\x01 \x03(\x0b\x32\x10.flwr.proto.Node\"@\n\x12PushTaskInsRequest\x12*\n\rtask_ins_list\x18\x01 \x03(\x0b\x32\x13.flwr.proto.TaskIns\"\'\n\x13PushTaskInsResponse\x12\x10\n\x08task_ids\x18\x02 \x03(\t\"F\n\x12PullTaskResRequest\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\x12\x10\n\x08task_ids\x18\x02 \x03(\t\"A\n\x13PullTaskResResponse\x12*\n\rtask_res_list\x18\x01 \x03(\x0b\x32\x13.flwr.proto.TaskRes2\xc1\x02\n\x06\x44river\x12J\n\tCreateRun\x12\x1c.flwr.proto.CreateRunRequest\x1a\x1d.flwr.proto.CreateRunResponse\"\x00\x12G\n\x08GetNodes\x12\x1b.flwr.proto.GetNodesRequest\x1a\x1c.flwr.proto.GetNodesResponse\"\x00\x12P\n\x0bPushTaskIns\x12\x1e.flwr.proto.PushTaskInsRequest\x1a\x1f.flwr.proto.PushTaskInsResponse\"\x00\x12P\n\x0bPullTaskRes\x12\x1e.flwr.proto.PullTaskResRequest\x1a\x1f.flwr.proto.PullTaskResResponse\"\x00\x62\x06proto3')
|
|
20
20
|
|
|
21
21
|
_globals = globals()
|
|
22
22
|
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
|
|
@@ -24,21 +24,21 @@ _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'flwr.proto.driver_pb2', _gl
|
|
|
24
24
|
if _descriptor._USE_C_DESCRIPTORS == False:
|
|
25
25
|
DESCRIPTOR._options = None
|
|
26
26
|
_globals['_CREATERUNREQUEST']._serialized_start=85
|
|
27
|
-
_globals['_CREATERUNREQUEST']._serialized_end=
|
|
28
|
-
_globals['_CREATERUNRESPONSE']._serialized_start=
|
|
29
|
-
_globals['_CREATERUNRESPONSE']._serialized_end=
|
|
30
|
-
_globals['_GETNODESREQUEST']._serialized_start=
|
|
31
|
-
_globals['_GETNODESREQUEST']._serialized_end=
|
|
32
|
-
_globals['_GETNODESRESPONSE']._serialized_start=
|
|
33
|
-
_globals['_GETNODESRESPONSE']._serialized_end=
|
|
34
|
-
_globals['_PUSHTASKINSREQUEST']._serialized_start=
|
|
35
|
-
_globals['_PUSHTASKINSREQUEST']._serialized_end=
|
|
36
|
-
_globals['_PUSHTASKINSRESPONSE']._serialized_start=
|
|
37
|
-
_globals['_PUSHTASKINSRESPONSE']._serialized_end=
|
|
38
|
-
_globals['_PULLTASKRESREQUEST']._serialized_start=
|
|
39
|
-
_globals['_PULLTASKRESREQUEST']._serialized_end=
|
|
40
|
-
_globals['_PULLTASKRESRESPONSE']._serialized_start=
|
|
41
|
-
_globals['_PULLTASKRESRESPONSE']._serialized_end=
|
|
42
|
-
_globals['_DRIVER']._serialized_start=
|
|
43
|
-
_globals['_DRIVER']._serialized_end=
|
|
27
|
+
_globals['_CREATERUNREQUEST']._serialized_end=140
|
|
28
|
+
_globals['_CREATERUNRESPONSE']._serialized_start=142
|
|
29
|
+
_globals['_CREATERUNRESPONSE']._serialized_end=177
|
|
30
|
+
_globals['_GETNODESREQUEST']._serialized_start=179
|
|
31
|
+
_globals['_GETNODESREQUEST']._serialized_end=212
|
|
32
|
+
_globals['_GETNODESRESPONSE']._serialized_start=214
|
|
33
|
+
_globals['_GETNODESRESPONSE']._serialized_end=265
|
|
34
|
+
_globals['_PUSHTASKINSREQUEST']._serialized_start=267
|
|
35
|
+
_globals['_PUSHTASKINSREQUEST']._serialized_end=331
|
|
36
|
+
_globals['_PUSHTASKINSRESPONSE']._serialized_start=333
|
|
37
|
+
_globals['_PUSHTASKINSRESPONSE']._serialized_end=372
|
|
38
|
+
_globals['_PULLTASKRESREQUEST']._serialized_start=374
|
|
39
|
+
_globals['_PULLTASKRESREQUEST']._serialized_end=444
|
|
40
|
+
_globals['_PULLTASKRESRESPONSE']._serialized_start=446
|
|
41
|
+
_globals['_PULLTASKRESRESPONSE']._serialized_end=511
|
|
42
|
+
_globals['_DRIVER']._serialized_start=514
|
|
43
|
+
_globals['_DRIVER']._serialized_end=835
|
|
44
44
|
# @@protoc_insertion_point(module_scope)
|
flwr/proto/driver_pb2.pyi
CHANGED
|
@@ -16,8 +16,16 @@ DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
|
|
|
16
16
|
class CreateRunRequest(google.protobuf.message.Message):
|
|
17
17
|
"""CreateRun"""
|
|
18
18
|
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
|
19
|
+
FAB_ID_FIELD_NUMBER: builtins.int
|
|
20
|
+
FAB_VERSION_FIELD_NUMBER: builtins.int
|
|
21
|
+
fab_id: typing.Text
|
|
22
|
+
fab_version: typing.Text
|
|
19
23
|
def __init__(self,
|
|
24
|
+
*,
|
|
25
|
+
fab_id: typing.Text = ...,
|
|
26
|
+
fab_version: typing.Text = ...,
|
|
20
27
|
) -> None: ...
|
|
28
|
+
def ClearField(self, field_name: typing_extensions.Literal["fab_id",b"fab_id","fab_version",b"fab_version"]) -> None: ...
|
|
21
29
|
global___CreateRunRequest = CreateRunRequest
|
|
22
30
|
|
|
23
31
|
class CreateRunResponse(google.protobuf.message.Message):
|
flwr/server/compat/app_utils.py
CHANGED
|
@@ -16,7 +16,6 @@
|
|
|
16
16
|
|
|
17
17
|
|
|
18
18
|
import threading
|
|
19
|
-
import time
|
|
20
19
|
from typing import Dict, Tuple
|
|
21
20
|
|
|
22
21
|
from ..client_manager import ClientManager
|
|
@@ -60,6 +59,7 @@ def start_update_client_manager_thread(
|
|
|
60
59
|
client_manager,
|
|
61
60
|
f_stop,
|
|
62
61
|
),
|
|
62
|
+
daemon=True,
|
|
63
63
|
)
|
|
64
64
|
thread.start()
|
|
65
65
|
|
|
@@ -99,4 +99,5 @@ def _update_client_manager(
|
|
|
99
99
|
raise RuntimeError("Could not register node.")
|
|
100
100
|
|
|
101
101
|
# Sleep for 3 seconds
|
|
102
|
-
|
|
102
|
+
if not f_stop.is_set():
|
|
103
|
+
f_stop.wait(3)
|
{flwr_nightly-1.9.0.dev20240404.dist-info → flwr_nightly-1.9.0.dev20240412.dist-info}/RECORD
RENAMED
|
@@ -1,12 +1,12 @@
|
|
|
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=38thPnMydBmNAxNE9mz4By-KdRUhJfoUgeDuAxMYF_U,1095
|
|
4
|
-
flwr/cli/example.py,sha256=
|
|
4
|
+
flwr/cli/example.py,sha256=1bGDYll3BXQY2kRqSN-oICqS5n1b9m0g0RvXTopXHl4,2215
|
|
5
5
|
flwr/cli/flower_toml.py,sha256=gypY4zOe6Mx_Xzz5vsSzGRppWBaCnipiksBTrox_r3k,4675
|
|
6
6
|
flwr/cli/new/__init__.py,sha256=cQzK1WH4JP2awef1t2UQ2xjl1agVEz9rwutV18SWV1k,789
|
|
7
|
-
flwr/cli/new/new.py,sha256=
|
|
7
|
+
flwr/cli/new/new.py,sha256=gxl4j0b9Ojsh5vcjmwPxEY4wrxDQg8JaLs7-Q61xvFM,5300
|
|
8
8
|
flwr/cli/new/templates/__init__.py,sha256=4luU8RL-CK8JJCstQ_ON809W9bNTkY1l9zSaPKBkgwY,725
|
|
9
|
-
flwr/cli/new/templates/app/README.md.tpl,sha256=
|
|
9
|
+
flwr/cli/new/templates/app/README.md.tpl,sha256=_qGtgpKYKoCJVjQnvlBMKvFs_1gzTcL908I3KJg0oAM,668
|
|
10
10
|
flwr/cli/new/templates/app/__init__.py,sha256=DU7QMY7IhMQyuwm_tja66xU0KXTWQFqzfTqwg-_NJdE,729
|
|
11
11
|
flwr/cli/new/templates/app/code/__init__.py,sha256=EM6vfvgAILKPaPn7H1wMV1Wi01WyZCP_Eg6NxD6oWg8,736
|
|
12
12
|
flwr/cli/new/templates/app/code/__init__.py.tpl,sha256=olwrBeJemHNBWvjc6gJURloFRqW40dAy7FRQA5pDqHU,21
|
|
@@ -18,17 +18,14 @@ flwr/cli/new/templates/app/code/server.pytorch.py.tpl,sha256=xtKvUivNMzgOcLSOtnj
|
|
|
18
18
|
flwr/cli/new/templates/app/code/server.tensorflow.py.tpl,sha256=d6J5VM681d0j4hj1Duaj1WQyeFoyCiEZh4o4J8zH-_M,48
|
|
19
19
|
flwr/cli/new/templates/app/code/task.pytorch.py.tpl,sha256=NvajdZN-eTyfdqKK0v2MrvWITXw9BjJ3Ri5c1haPJDs,3684
|
|
20
20
|
flwr/cli/new/templates/app/flower.toml.tpl,sha256=gJ5MZ7zaiaVvIEt5X_kkU-SU2NmeXkAZ9NXJS00-Axw,269
|
|
21
|
-
flwr/cli/new/templates/app/pyproject.numpy.toml.tpl,sha256=
|
|
22
|
-
flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl,sha256=
|
|
23
|
-
flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl,sha256=
|
|
24
|
-
flwr/cli/new/templates/app/requirements.numpy.txt.tpl,sha256=YfJLjL-ONv0hnw5k4EfHv6uMpaqfLzOhkT_P4aWv5Fo,30
|
|
25
|
-
flwr/cli/new/templates/app/requirements.pytorch.txt.tpl,sha256=3dvhiFgiOw3HAHCDmyiqvBSTF492wQm75KUKzVCOkUc,86
|
|
26
|
-
flwr/cli/new/templates/app/requirements.tensorflow.txt.tpl,sha256=MsiO0GbUe35h5giVMaE2YykKMAhtC5ccAc_4EcmJUNs,209
|
|
21
|
+
flwr/cli/new/templates/app/pyproject.numpy.toml.tpl,sha256=00Qp7cQhOvW0Bx7j82mIP9BXT6D0ysbzqZHDEPoZQyU,390
|
|
22
|
+
flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl,sha256=A2AqU5lh2VBHOCX_S7rTMYZc5JmPqwEVIg9KsIjLgh8,459
|
|
23
|
+
flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl,sha256=vLmeOFCIvMVUoIDgGtLinAUQy6jKjqmgHKcuEqhVYkw,438
|
|
27
24
|
flwr/cli/run/__init__.py,sha256=oCd6HmQDx-sqver1gecgx-uMA38BLTSiiKpl7RGNceg,789
|
|
28
25
|
flwr/cli/run/run.py,sha256=C7Yh-Y0f64PEabb9733jBKIhhOUFpcRmCZJIDtv-NG8,2329
|
|
29
|
-
flwr/cli/utils.py,sha256=
|
|
26
|
+
flwr/cli/utils.py,sha256=33m5ELefA43VhJwtBHW5ntWkP7X5Tk_5A2s1OcaSBYg,4153
|
|
30
27
|
flwr/client/__init__.py,sha256=futk_IdY_N1h8BTve4Iru51bxm7H1gv58ZPIXWi5XUA,1187
|
|
31
|
-
flwr/client/app.py,sha256=
|
|
28
|
+
flwr/client/app.py,sha256=B48cQa-kb_0WzdtufTXuaoEyrynGWMQCqxdUz_sAKek,26193
|
|
32
29
|
flwr/client/client.py,sha256=Vp9UkOkoHdNfn6iMYZsj_5m_GICiFfUlKEVaLad-YhM,8183
|
|
33
30
|
flwr/client/client_app.py,sha256=-Cs0084tLQUoBCeYZdG2KgU7cjp95_ZJ4MfjoaN4Fzk,8636
|
|
34
31
|
flwr/client/dpfedavg_numpy_client.py,sha256=9Tnig4iml2J88HBKNahegjXjbfvIQyBtaIQaqjbeqsA,7435
|
|
@@ -36,7 +33,7 @@ flwr/client/grpc_client/__init__.py,sha256=LsnbqXiJhgQcB0XzAlUQgPx011Uf7Y7yabIC1
|
|
|
36
33
|
flwr/client/grpc_client/connection.py,sha256=w3Lble9-eCzNOR7fBUsVedVCK4ui9QPhK7i7Ew_a5Vk,8717
|
|
37
34
|
flwr/client/grpc_rere_client/__init__.py,sha256=avn6W_vHEM_yZEB1S7hCZgnTbXb6ZujqRP_vAzyXu-0,752
|
|
38
35
|
flwr/client/grpc_rere_client/connection.py,sha256=JaQIQYUJnmZHfqrGBxYZmEtyC-rUdCCaK1HrMcOXEig,8560
|
|
39
|
-
flwr/client/heartbeat.py,sha256=
|
|
36
|
+
flwr/client/heartbeat.py,sha256=cx37mJBH8LyoIN4Lks85wtqT1mnU5GulQnr4pGCvAq0,2404
|
|
40
37
|
flwr/client/message_handler/__init__.py,sha256=abHvBRJJiiaAMNgeILQbMOa6h8WqMK2BcnvxwQZFpic,719
|
|
41
38
|
flwr/client/message_handler/message_handler.py,sha256=ml_FlduAJ5pxO31n1tKRrWfQRSxkMgKLbwXXcRsNSos,6553
|
|
42
39
|
flwr/client/message_handler/task_handler.py,sha256=ZDJBKmrn2grRMNl1rU1iGs7FiMHL5VmZiSp_6h9GHVU,1824
|
|
@@ -77,7 +74,7 @@ flwr/common/record/parametersrecord.py,sha256=WSqtRrYvI-mRzkEwv5s-EG-yE5uizJ8zy9
|
|
|
77
74
|
flwr/common/record/recordset.py,sha256=o5UwLubotz1KE9HCoEIP5kK0f0dlIzpFpS1xeQvxo08,3016
|
|
78
75
|
flwr/common/record/typeddict.py,sha256=2NW8JF27p1uNWaqDbJ7bMkItA5x4ygYT8aHrf8NaqnE,3879
|
|
79
76
|
flwr/common/recordset_compat.py,sha256=BjxeuvlCaP94yIiKOyFFTRBUH_lprFWSLo8U8q3BDbs,13798
|
|
80
|
-
flwr/common/retry_invoker.py,sha256=
|
|
77
|
+
flwr/common/retry_invoker.py,sha256=dQY5fPIKhy9OiFswZhLxA9fB455u-DYCvDVcFJmrPDk,11707
|
|
81
78
|
flwr/common/secure_aggregation/__init__.py,sha256=29nHIUO2L8-KhNHQ2KmIgRo_4CPkq4LgLCUN0on5FgI,731
|
|
82
79
|
flwr/common/secure_aggregation/crypto/__init__.py,sha256=dz7pVx2aPrHxr_AwgO5mIiTzu4PcvUxRq9NLBbFcsf8,738
|
|
83
80
|
flwr/common/secure_aggregation/crypto/shamir.py,sha256=yY35ZgHlB4YyGW_buG-1X-0M-ejXuQzISgYLgC_Z9TY,2792
|
|
@@ -91,8 +88,8 @@ flwr/common/telemetry.py,sha256=JkFB6WBOskqAJfzSM-l6tQfRiSi2oiysClfg0-5T7NY,7782
|
|
|
91
88
|
flwr/common/typing.py,sha256=3Wu6Ol1Ja6Gb0WdlcXVEn1EHYJbc4oRRJA81vEegxBo,4382
|
|
92
89
|
flwr/common/version.py,sha256=_RDSMGZPEuGKYViZuXPotDtXMvh4iyDH9XOCO4qtPO8,666
|
|
93
90
|
flwr/proto/__init__.py,sha256=hbY7JYakwZwCkYgCNlmHdc8rtvfoJbAZLalMdc--CGc,683
|
|
94
|
-
flwr/proto/driver_pb2.py,sha256=
|
|
95
|
-
flwr/proto/driver_pb2.pyi,sha256=
|
|
91
|
+
flwr/proto/driver_pb2.py,sha256=N5tU8YFOrWBPpNVWRfU6IpnpgNIQjVUQpO8rhFfryYE,3207
|
|
92
|
+
flwr/proto/driver_pb2.pyi,sha256=uTcjWrMsNojfSYrXaXyYmXaB4E8PL5drYs2MuMgN5R8,5016
|
|
96
93
|
flwr/proto/driver_pb2_grpc.py,sha256=qQBRdQUz4k2K4DVO7kSfWHx-62UJ85HaYKnKCr6JcU8,7304
|
|
97
94
|
flwr/proto/driver_pb2_grpc.pyi,sha256=NpOM5eCrIPcuWdYrZAayQSDvvFp6cDCVflabhmuvMfo,2022
|
|
98
95
|
flwr/proto/error_pb2.py,sha256=LarjKL90LbwkXKlhzNrDssgl4DXcvIPve8NVCXHpsKA,1084
|
|
@@ -126,7 +123,7 @@ flwr/server/client_manager.py,sha256=T8UDSRJBVD3fyIDI7NTAA-NA7GPrMNNgH2OAF54RRxE
|
|
|
126
123
|
flwr/server/client_proxy.py,sha256=4G-oTwhb45sfWLx2uZdcXD98IZwdTS6F88xe3akCdUg,2399
|
|
127
124
|
flwr/server/compat/__init__.py,sha256=VxnJtJyOjNFQXMNi9hIuzNlZM5n0Hj1p3aq_Pm2udw4,892
|
|
128
125
|
flwr/server/compat/app.py,sha256=3Skh76Rg80B4oME1dJOhZvn9eTfVmTNIQ0jCiZ6CzeQ,5271
|
|
129
|
-
flwr/server/compat/app_utils.py,sha256
|
|
126
|
+
flwr/server/compat/app_utils.py,sha256=GGmGApka7J9wHY2tiU_ZDejNvtfW_CZ9NZtb8L30M90,3496
|
|
130
127
|
flwr/server/compat/driver_client_proxy.py,sha256=QWLl5YJwI6NVADwjQGQJqkLtCfPNT-aRH0NF9yeGEnA,7344
|
|
131
128
|
flwr/server/compat/legacy_context.py,sha256=D2s7PvQoDnTexuRmf1uG9Von7GUj4Qqyr7qLklSlKAM,1766
|
|
132
129
|
flwr/server/criterion.py,sha256=ypbAexbztzGUxNen9RCHF91QeqiEQix4t4Ih3E-42MM,1061
|
|
@@ -206,8 +203,8 @@ flwr/simulation/ray_transport/ray_actor.py,sha256=_wv2eP7qxkCZ-6rMyYWnjLrGPBZRxj
|
|
|
206
203
|
flwr/simulation/ray_transport/ray_client_proxy.py,sha256=oDu4sEPIOu39vrNi-fqDAe10xtNUXMO49bM2RWfRcyw,6738
|
|
207
204
|
flwr/simulation/ray_transport/utils.py,sha256=TYdtfg1P9VfTdLMOJlifInGpxWHYs9UfUqIv2wfkRLA,2392
|
|
208
205
|
flwr/simulation/run_simulation.py,sha256=HiIH6aa_v56NfKQN5ZBd94NyVfaZNyFs43_kItYsQXU,15685
|
|
209
|
-
flwr_nightly-1.9.0.
|
|
210
|
-
flwr_nightly-1.9.0.
|
|
211
|
-
flwr_nightly-1.9.0.
|
|
212
|
-
flwr_nightly-1.9.0.
|
|
213
|
-
flwr_nightly-1.9.0.
|
|
206
|
+
flwr_nightly-1.9.0.dev20240412.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
|
|
207
|
+
flwr_nightly-1.9.0.dev20240412.dist-info/METADATA,sha256=3qWZ1UVcfk0WJKQB5zmWdBj6IKB1K4n313xQmHpfZGI,15257
|
|
208
|
+
flwr_nightly-1.9.0.dev20240412.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
|
|
209
|
+
flwr_nightly-1.9.0.dev20240412.dist-info/entry_points.txt,sha256=utu2wybGyYJSTtsB2ktY_gmy-XtMFo9EFZdishX0zR4,320
|
|
210
|
+
flwr_nightly-1.9.0.dev20240412.dist-info/RECORD,,
|
{flwr_nightly-1.9.0.dev20240404.dist-info → flwr_nightly-1.9.0.dev20240412.dist-info}/LICENSE
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|