flwr-nightly 1.12.0.dev20240924__py3-none-any.whl → 1.12.0.dev20240926__py3-none-any.whl

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

Potentially problematic release.


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

flwr/cli/log.py CHANGED
@@ -26,18 +26,71 @@ import typer
26
26
  from flwr.cli.config_utils import load_and_validate
27
27
  from flwr.common.grpc import GRPC_MAX_MESSAGE_LENGTH, create_channel
28
28
  from flwr.common.logger import log as logger
29
+ from flwr.proto.exec_pb2 import StreamLogsRequest # pylint: disable=E0611
30
+ from flwr.proto.exec_pb2_grpc import ExecStub
29
31
 
30
32
  CONN_REFRESH_PERIOD = 60 # Connection refresh period for log streaming (seconds)
31
33
 
32
34
 
33
- # pylint: disable=unused-argument
34
- def stream_logs(run_id: int, channel: grpc.Channel, period: int) -> None:
35
+ def start_stream(
36
+ run_id: int, channel: grpc.Channel, refresh_period: int = CONN_REFRESH_PERIOD
37
+ ) -> None:
38
+ """Start log streaming for a given run ID."""
39
+ try:
40
+ while True:
41
+ logger(INFO, "Starting logstream for run_id `%s`", run_id)
42
+ stream_logs(run_id, channel, refresh_period)
43
+ time.sleep(2)
44
+ logger(DEBUG, "Reconnecting to logstream")
45
+ except KeyboardInterrupt:
46
+ logger(INFO, "Exiting logstream")
47
+ except grpc.RpcError as e:
48
+ # pylint: disable=E1101
49
+ if e.code() == grpc.StatusCode.NOT_FOUND:
50
+ logger(ERROR, "Invalid run_id `%s`, exiting", run_id)
51
+ if e.code() == grpc.StatusCode.CANCELLED:
52
+ pass
53
+ finally:
54
+ channel.close()
55
+
56
+
57
+ def stream_logs(run_id: int, channel: grpc.Channel, duration: int) -> None:
35
58
  """Stream logs from the beginning of a run with connection refresh."""
59
+ start_time = time.time()
60
+ stub = ExecStub(channel)
61
+ req = StreamLogsRequest(run_id=run_id)
62
+
63
+ for res in stub.StreamLogs(req):
64
+ print(res.log_output)
65
+ if time.time() - start_time > duration:
66
+ break
36
67
 
37
68
 
38
- # pylint: disable=unused-argument
39
69
  def print_logs(run_id: int, channel: grpc.Channel, timeout: int) -> None:
40
70
  """Print logs from the beginning of a run."""
71
+ stub = ExecStub(channel)
72
+ req = StreamLogsRequest(run_id=run_id)
73
+
74
+ try:
75
+ while True:
76
+ try:
77
+ # Enforce timeout for graceful exit
78
+ for res in stub.StreamLogs(req, timeout=timeout):
79
+ print(res.log_output)
80
+ except grpc.RpcError as e:
81
+ # pylint: disable=E1101
82
+ if e.code() == grpc.StatusCode.DEADLINE_EXCEEDED:
83
+ break
84
+ if e.code() == grpc.StatusCode.NOT_FOUND:
85
+ logger(ERROR, "Invalid run_id `%s`, exiting", run_id)
86
+ break
87
+ if e.code() == grpc.StatusCode.CANCELLED:
88
+ break
89
+ except KeyboardInterrupt:
90
+ logger(DEBUG, "Stream interrupted by user")
91
+ finally:
92
+ channel.close()
93
+ logger(DEBUG, "Channel closed")
41
94
 
42
95
 
43
96
  def on_channel_state_change(channel_connectivity: str) -> None:
@@ -175,22 +228,7 @@ def _log_with_superexec(
175
228
  channel.subscribe(on_channel_state_change)
176
229
 
177
230
  if stream:
178
- try:
179
- while True:
180
- logger(INFO, "Starting logstream for run_id `%s`", run_id)
181
- stream_logs(run_id, channel, CONN_REFRESH_PERIOD)
182
- time.sleep(2)
183
- logger(DEBUG, "Reconnecting to logstream")
184
- except KeyboardInterrupt:
185
- logger(INFO, "Exiting logstream")
186
- except grpc.RpcError as e:
187
- # pylint: disable=E1101
188
- if e.code() == grpc.StatusCode.NOT_FOUND:
189
- logger(ERROR, "Invalid run_id `%s`, exiting", run_id)
190
- if e.code() == grpc.StatusCode.CANCELLED:
191
- pass
192
- finally:
193
- channel.close()
231
+ start_stream(run_id, channel, CONN_REFRESH_PERIOD)
194
232
  else:
195
233
  logger(INFO, "Printing logstream for run_id `%s`", run_id)
196
234
  print_logs(run_id, channel, timeout=5)
@@ -55,7 +55,7 @@ We use Mistral-7B model with 4-bit quantization as default. The estimated VRAM c
55
55
  | :--------: | :--------: | :--------: | :--------: | :--------: |
56
56
  | VRAM | ~25.50 GB | ~17.30 GB | ~22.80 GB | ~17.40 GB |
57
57
 
58
- You can adjust the CPU/GPU resources you assign to each of the clients based on your device, which are specified with `options.backend.clientapp-cpus` and `options.backend.clientapp-gpus` under `[tool.flwr.federations.local-simulation]` entry in `pyproject.toml`.
58
+ You can adjust the CPU/GPU resources you assign to each of the clients based on your device, which are specified with `options.backend.client-resources.num-cpus` and `options.backend.client-resources.num-gpus` under `[tool.flwr.federations.local-simulation]` entry in `pyproject.toml`.
59
59
 
60
60
 
61
61
  ## Model saving
flwr/cli/run/run.py CHANGED
@@ -34,6 +34,10 @@ from flwr.common.typing import Fab
34
34
  from flwr.proto.exec_pb2 import StartRunRequest # pylint: disable=E0611
35
35
  from flwr.proto.exec_pb2_grpc import ExecStub
36
36
 
37
+ from ..log import start_stream
38
+
39
+ CONN_REFRESH_PERIOD = 60 # Connection refresh period for log streaming (seconds)
40
+
37
41
 
38
42
  def on_channel_state_change(channel_connectivity: str) -> None:
39
43
  """Log channel connectivity."""
@@ -62,6 +66,14 @@ def run(
62
66
  "inside the `pyproject.toml` in order to be properly overriden.",
63
67
  ),
64
68
  ] = None,
69
+ stream: Annotated[
70
+ bool,
71
+ typer.Option(
72
+ "--stream",
73
+ help="Use `--stream` with `flwr run` to display logs;\n "
74
+ "logs are not streamed by default.",
75
+ ),
76
+ ] = False,
65
77
  ) -> None:
66
78
  """Run Flower App."""
67
79
  typer.secho("Loading project configuration... ", fg=typer.colors.BLUE)
@@ -117,7 +129,7 @@ def run(
117
129
  raise typer.Exit(code=1)
118
130
 
119
131
  if "address" in federation_config:
120
- _run_with_superexec(app, federation_config, config_overrides)
132
+ _run_with_superexec(app, federation_config, config_overrides, stream)
121
133
  else:
122
134
  _run_without_superexec(app, federation_config, config_overrides, federation)
123
135
 
@@ -126,6 +138,7 @@ def _run_with_superexec(
126
138
  app: Path,
127
139
  federation_config: dict[str, Any],
128
140
  config_overrides: Optional[list[str]],
141
+ stream: bool,
129
142
  ) -> None:
130
143
 
131
144
  insecure_str = federation_config.get("insecure")
@@ -183,6 +196,9 @@ def _run_with_superexec(
183
196
  fab_path.unlink()
184
197
  typer.secho(f"🎊 Successfully started run {res.run_id}", fg=typer.colors.GREEN)
185
198
 
199
+ if stream:
200
+ start_stream(res.run_id, channel, CONN_REFRESH_PERIOD)
201
+
186
202
 
187
203
  def _run_without_superexec(
188
204
  app: Optional[Path],
@@ -269,7 +269,7 @@ def grpc_request_response( # pylint: disable=R0913, R0914, R0915
269
269
  task_res = message_to_taskres(message)
270
270
 
271
271
  # Serialize ProtoBuf to bytes
272
- request = PushTaskResRequest(task_res_list=[task_res])
272
+ request = PushTaskResRequest(node=node, task_res_list=[task_res])
273
273
  _ = retry_invoker.invoke(stub.PushTaskRes, request)
274
274
 
275
275
  # Cleanup
@@ -277,7 +277,7 @@ def grpc_request_response( # pylint: disable=R0913, R0914, R0915
277
277
 
278
278
  def get_run(run_id: int) -> Run:
279
279
  # Call FleetAPI
280
- get_run_request = GetRunRequest(run_id=run_id)
280
+ get_run_request = GetRunRequest(node=node, run_id=run_id)
281
281
  get_run_response: GetRunResponse = retry_invoker.invoke(
282
282
  stub.GetRun,
283
283
  request=get_run_request,
@@ -294,7 +294,7 @@ def grpc_request_response( # pylint: disable=R0913, R0914, R0915
294
294
 
295
295
  def get_fab(fab_hash: str) -> Fab:
296
296
  # Call FleetAPI
297
- get_fab_request = GetFabRequest(hash_str=fab_hash)
297
+ get_fab_request = GetFabRequest(node=node, hash_str=fab_hash)
298
298
  get_fab_response: GetFabResponse = retry_invoker.invoke(
299
299
  stub.GetFab,
300
300
  request=get_fab_request,
@@ -340,7 +340,7 @@ def http_request_response( # pylint: disable=,R0913, R0914, R0915
340
340
  task_res = message_to_taskres(message)
341
341
 
342
342
  # Serialize ProtoBuf to bytes
343
- req = PushTaskResRequest(task_res_list=[task_res])
343
+ req = PushTaskResRequest(node=node, task_res_list=[task_res])
344
344
 
345
345
  # Send the request
346
346
  res = _request(req, PushTaskResResponse, PATH_PUSH_TASK_RES)
@@ -356,7 +356,7 @@ def http_request_response( # pylint: disable=,R0913, R0914, R0915
356
356
 
357
357
  def get_run(run_id: int) -> Run:
358
358
  # Construct the request
359
- req = GetRunRequest(run_id=run_id)
359
+ req = GetRunRequest(node=node, run_id=run_id)
360
360
 
361
361
  # Send the request
362
362
  res = _request(req, GetRunResponse, PATH_GET_RUN)
@@ -373,7 +373,7 @@ def http_request_response( # pylint: disable=,R0913, R0914, R0915
373
373
 
374
374
  def get_fab(fab_hash: str) -> Fab:
375
375
  # Construct the request
376
- req = GetFabRequest(hash_str=fab_hash)
376
+ req = GetFabRequest(node=node, hash_str=fab_hash)
377
377
 
378
378
  # Send the request
379
379
  res = _request(req, GetFabResponse, PATH_GET_FAB)
@@ -43,8 +43,8 @@ def share_keys_plaintext_concat(
43
43
  """
44
44
  return b"".join(
45
45
  [
46
- int.to_bytes(src_node_id, 8, "little", signed=True),
47
- int.to_bytes(dst_node_id, 8, "little", signed=True),
46
+ int.to_bytes(src_node_id, 8, "little", signed=False),
47
+ int.to_bytes(dst_node_id, 8, "little", signed=False),
48
48
  int.to_bytes(len(b_share), 4, "little"),
49
49
  b_share,
50
50
  sk_share,
@@ -72,8 +72,8 @@ def share_keys_plaintext_separate(plaintext: bytes) -> tuple[int, int, bytes, by
72
72
  the secret key share of the source sent to the destination.
73
73
  """
74
74
  src, dst, mark = (
75
- int.from_bytes(plaintext[:8], "little", signed=True),
76
- int.from_bytes(plaintext[8:16], "little", signed=True),
75
+ int.from_bytes(plaintext[:8], "little", signed=False),
76
+ int.from_bytes(plaintext[8:16], "little", signed=False),
77
77
  int.from_bytes(plaintext[16:20], "little"),
78
78
  )
79
79
  ret = (src, dst, plaintext[20 : 20 + mark], plaintext[20 + mark :])
flwr/common/serde.py CHANGED
@@ -33,12 +33,12 @@ from flwr.proto.recordset_pb2 import Array as ProtoArray
33
33
  from flwr.proto.recordset_pb2 import BoolList, BytesList
34
34
  from flwr.proto.recordset_pb2 import ConfigsRecord as ProtoConfigsRecord
35
35
  from flwr.proto.recordset_pb2 import ConfigsRecordValue as ProtoConfigsRecordValue
36
- from flwr.proto.recordset_pb2 import DoubleList
36
+ from flwr.proto.recordset_pb2 import DoubleList, Int, IntList
37
37
  from flwr.proto.recordset_pb2 import MetricsRecord as ProtoMetricsRecord
38
38
  from flwr.proto.recordset_pb2 import MetricsRecordValue as ProtoMetricsRecordValue
39
39
  from flwr.proto.recordset_pb2 import ParametersRecord as ProtoParametersRecord
40
40
  from flwr.proto.recordset_pb2 import RecordSet as ProtoRecordSet
41
- from flwr.proto.recordset_pb2 import Sint64List, StringList
41
+ from flwr.proto.recordset_pb2 import StringList
42
42
  from flwr.proto.run_pb2 import Run as ProtoRun
43
43
  from flwr.proto.task_pb2 import Task, TaskIns, TaskRes
44
44
  from flwr.proto.transport_pb2 import (
@@ -354,7 +354,9 @@ def scalar_to_proto(scalar: typing.Scalar) -> Scalar:
354
354
  return Scalar(double=scalar)
355
355
 
356
356
  if isinstance(scalar, int):
357
- return Scalar(sint64=scalar)
357
+ if scalar >= 0:
358
+ return Scalar(uint64=scalar) # Use uint64 for non-negative integers
359
+ return Scalar(sint64=scalar) # Use sint64 for negative integers
358
360
 
359
361
  if isinstance(scalar, str):
360
362
  return Scalar(string=scalar)
@@ -374,16 +376,16 @@ def scalar_from_proto(scalar_msg: Scalar) -> typing.Scalar:
374
376
  # === Record messages ===
375
377
 
376
378
 
377
- _type_to_field = {
379
+ _type_to_field: dict[type, str] = {
378
380
  float: "double",
379
- int: "sint64",
381
+ int: "int",
380
382
  bool: "bool",
381
383
  str: "string",
382
384
  bytes: "bytes",
383
385
  }
384
- _list_type_to_class_and_field = {
386
+ _list_type_to_class_and_field: dict[type, tuple[type[GrpcMessage], str]] = {
385
387
  float: (DoubleList, "double_list"),
386
- int: (Sint64List, "sint64_list"),
388
+ int: (IntList, "int_list"),
387
389
  bool: (BoolList, "bool_list"),
388
390
  str: (StringList, "string_list"),
389
391
  bytes: (BytesList, "bytes_list"),
@@ -391,6 +393,19 @@ _list_type_to_class_and_field = {
391
393
  T = TypeVar("T")
392
394
 
393
395
 
396
+ def int_to_proto(value: int) -> Int:
397
+ """Serialize a int to `Int`."""
398
+ if value >= 0:
399
+ return Int(uint64=value)
400
+ return Int(sint64=value)
401
+
402
+
403
+ def int_from_proto(value_proto: Int) -> int:
404
+ """Deserialize a int from `Int`."""
405
+ fld = cast(str, value_proto.WhichOneof("int"))
406
+ return cast(int, getattr(value_proto, fld))
407
+
408
+
394
409
  def _record_value_to_proto(
395
410
  value: Any, allowed_types: list[type], proto_class: type[T]
396
411
  ) -> T:
@@ -403,12 +418,17 @@ def _record_value_to_proto(
403
418
  # Single element
404
419
  # Note: `isinstance(False, int) == True`.
405
420
  if isinstance(value, t):
406
- arg[_type_to_field[t]] = value
421
+ fld = _type_to_field[t]
422
+ if t is int:
423
+ fld = "uint64" if cast(int, value) >= 0 else "sint64"
424
+ arg[fld] = value
407
425
  return proto_class(**arg)
408
426
  # List
409
427
  if isinstance(value, list) and all(isinstance(item, t) for item in value):
410
- list_class, field_name = _list_type_to_class_and_field[t]
411
- arg[field_name] = list_class(vals=value)
428
+ list_class, fld = _list_type_to_class_and_field[t]
429
+ if t is int:
430
+ value = [int_to_proto(v) for v in value]
431
+ arg[fld] = list_class(vals=value)
412
432
  return proto_class(**arg)
413
433
  # Invalid types
414
434
  raise TypeError(
@@ -422,6 +442,8 @@ def _record_value_from_proto(value_proto: GrpcMessage) -> Any:
422
442
  value_field = cast(str, value_proto.WhichOneof("value"))
423
443
  if value_field.endswith("list"):
424
444
  value = list(getattr(value_proto, value_field).vals)
445
+ if value_field == "int_list":
446
+ value = [int_from_proto(v) for v in value]
425
447
  else:
426
448
  value = getattr(value_proto, value_field)
427
449
  return value
flwr/proto/fab_pb2.py CHANGED
@@ -12,19 +12,20 @@ from google.protobuf.internal import builder as _builder
12
12
  _sym_db = _symbol_database.Default()
13
13
 
14
14
 
15
+ from flwr.proto import node_pb2 as flwr_dot_proto_dot_node__pb2
15
16
 
16
17
 
17
- DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x14\x66lwr/proto/fab.proto\x12\nflwr.proto\"(\n\x03\x46\x61\x62\x12\x10\n\x08hash_str\x18\x01 \x01(\t\x12\x0f\n\x07\x63ontent\x18\x02 \x01(\x0c\"!\n\rGetFabRequest\x12\x10\n\x08hash_str\x18\x01 \x01(\t\".\n\x0eGetFabResponse\x12\x1c\n\x03\x66\x61\x62\x18\x01 \x01(\x0b\x32\x0f.flwr.proto.Fabb\x06proto3')
18
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x14\x66lwr/proto/fab.proto\x12\nflwr.proto\x1a\x15\x66lwr/proto/node.proto\"(\n\x03\x46\x61\x62\x12\x10\n\x08hash_str\x18\x01 \x01(\t\x12\x0f\n\x07\x63ontent\x18\x02 \x01(\x0c\"A\n\rGetFabRequest\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\x12\x10\n\x08hash_str\x18\x02 \x01(\t\".\n\x0eGetFabResponse\x12\x1c\n\x03\x66\x61\x62\x18\x01 \x01(\x0b\x32\x0f.flwr.proto.Fabb\x06proto3')
18
19
 
19
20
  _globals = globals()
20
21
  _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
21
22
  _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'flwr.proto.fab_pb2', _globals)
22
23
  if _descriptor._USE_C_DESCRIPTORS == False:
23
24
  DESCRIPTOR._options = None
24
- _globals['_FAB']._serialized_start=36
25
- _globals['_FAB']._serialized_end=76
26
- _globals['_GETFABREQUEST']._serialized_start=78
27
- _globals['_GETFABREQUEST']._serialized_end=111
28
- _globals['_GETFABRESPONSE']._serialized_start=113
29
- _globals['_GETFABRESPONSE']._serialized_end=159
25
+ _globals['_FAB']._serialized_start=59
26
+ _globals['_FAB']._serialized_end=99
27
+ _globals['_GETFABREQUEST']._serialized_start=101
28
+ _globals['_GETFABREQUEST']._serialized_end=166
29
+ _globals['_GETFABRESPONSE']._serialized_start=168
30
+ _globals['_GETFABRESPONSE']._serialized_end=214
30
31
  # @@protoc_insertion_point(module_scope)
flwr/proto/fab_pb2.pyi CHANGED
@@ -3,6 +3,7 @@
3
3
  isort:skip_file
4
4
  """
5
5
  import builtins
6
+ import flwr.proto.node_pb2
6
7
  import google.protobuf.descriptor
7
8
  import google.protobuf.message
8
9
  import typing
@@ -33,13 +34,18 @@ global___Fab = Fab
33
34
 
34
35
  class GetFabRequest(google.protobuf.message.Message):
35
36
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
37
+ NODE_FIELD_NUMBER: builtins.int
36
38
  HASH_STR_FIELD_NUMBER: builtins.int
39
+ @property
40
+ def node(self) -> flwr.proto.node_pb2.Node: ...
37
41
  hash_str: typing.Text
38
42
  def __init__(self,
39
43
  *,
44
+ node: typing.Optional[flwr.proto.node_pb2.Node] = ...,
40
45
  hash_str: typing.Text = ...,
41
46
  ) -> None: ...
42
- def ClearField(self, field_name: typing_extensions.Literal["hash_str",b"hash_str"]) -> None: ...
47
+ def HasField(self, field_name: typing_extensions.Literal["node",b"node"]) -> builtins.bool: ...
48
+ def ClearField(self, field_name: typing_extensions.Literal["hash_str",b"hash_str","node",b"node"]) -> None: ...
43
49
  global___GetFabRequest = GetFabRequest
44
50
 
45
51
  class GetFabResponse(google.protobuf.message.Message):
flwr/proto/fleet_pb2.py CHANGED
@@ -18,7 +18,7 @@ from flwr.proto import run_pb2 as flwr_dot_proto_dot_run__pb2
18
18
  from flwr.proto import fab_pb2 as flwr_dot_proto_dot_fab__pb2
19
19
 
20
20
 
21
- DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x16\x66lwr/proto/fleet.proto\x12\nflwr.proto\x1a\x15\x66lwr/proto/node.proto\x1a\x15\x66lwr/proto/task.proto\x1a\x14\x66lwr/proto/run.proto\x1a\x14\x66lwr/proto/fab.proto\"*\n\x11\x43reateNodeRequest\x12\x15\n\rping_interval\x18\x01 \x01(\x01\"4\n\x12\x43reateNodeResponse\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\"3\n\x11\x44\x65leteNodeRequest\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\"\x14\n\x12\x44\x65leteNodeResponse\"D\n\x0bPingRequest\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\x12\x15\n\rping_interval\x18\x02 \x01(\x01\"\x1f\n\x0cPingResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\"F\n\x12PullTaskInsRequest\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\x12\x10\n\x08task_ids\x18\x02 \x03(\t\"k\n\x13PullTaskInsResponse\x12(\n\treconnect\x18\x01 \x01(\x0b\x32\x15.flwr.proto.Reconnect\x12*\n\rtask_ins_list\x18\x02 \x03(\x0b\x32\x13.flwr.proto.TaskIns\"@\n\x12PushTaskResRequest\x12*\n\rtask_res_list\x18\x01 \x03(\x0b\x32\x13.flwr.proto.TaskRes\"\xae\x01\n\x13PushTaskResResponse\x12(\n\treconnect\x18\x01 \x01(\x0b\x32\x15.flwr.proto.Reconnect\x12=\n\x07results\x18\x02 \x03(\x0b\x32,.flwr.proto.PushTaskResResponse.ResultsEntry\x1a.\n\x0cResultsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\r:\x02\x38\x01\"\x1e\n\tReconnect\x12\x11\n\treconnect\x18\x01 \x01(\x04\x32\x8c\x04\n\x05\x46leet\x12M\n\nCreateNode\x12\x1d.flwr.proto.CreateNodeRequest\x1a\x1e.flwr.proto.CreateNodeResponse\"\x00\x12M\n\nDeleteNode\x12\x1d.flwr.proto.DeleteNodeRequest\x1a\x1e.flwr.proto.DeleteNodeResponse\"\x00\x12;\n\x04Ping\x12\x17.flwr.proto.PingRequest\x1a\x18.flwr.proto.PingResponse\"\x00\x12P\n\x0bPullTaskIns\x12\x1e.flwr.proto.PullTaskInsRequest\x1a\x1f.flwr.proto.PullTaskInsResponse\"\x00\x12P\n\x0bPushTaskRes\x12\x1e.flwr.proto.PushTaskResRequest\x1a\x1f.flwr.proto.PushTaskResResponse\"\x00\x12\x41\n\x06GetRun\x12\x19.flwr.proto.GetRunRequest\x1a\x1a.flwr.proto.GetRunResponse\"\x00\x12\x41\n\x06GetFab\x12\x19.flwr.proto.GetFabRequest\x1a\x1a.flwr.proto.GetFabResponse\"\x00\x62\x06proto3')
21
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x16\x66lwr/proto/fleet.proto\x12\nflwr.proto\x1a\x15\x66lwr/proto/node.proto\x1a\x15\x66lwr/proto/task.proto\x1a\x14\x66lwr/proto/run.proto\x1a\x14\x66lwr/proto/fab.proto\"*\n\x11\x43reateNodeRequest\x12\x15\n\rping_interval\x18\x01 \x01(\x01\"4\n\x12\x43reateNodeResponse\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\"3\n\x11\x44\x65leteNodeRequest\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\"\x14\n\x12\x44\x65leteNodeResponse\"D\n\x0bPingRequest\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\x12\x15\n\rping_interval\x18\x02 \x01(\x01\"\x1f\n\x0cPingResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\"F\n\x12PullTaskInsRequest\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\x12\x10\n\x08task_ids\x18\x02 \x03(\t\"k\n\x13PullTaskInsResponse\x12(\n\treconnect\x18\x01 \x01(\x0b\x32\x15.flwr.proto.Reconnect\x12*\n\rtask_ins_list\x18\x02 \x03(\x0b\x32\x13.flwr.proto.TaskIns\"`\n\x12PushTaskResRequest\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\x12*\n\rtask_res_list\x18\x02 \x03(\x0b\x32\x13.flwr.proto.TaskRes\"\xae\x01\n\x13PushTaskResResponse\x12(\n\treconnect\x18\x01 \x01(\x0b\x32\x15.flwr.proto.Reconnect\x12=\n\x07results\x18\x02 \x03(\x0b\x32,.flwr.proto.PushTaskResResponse.ResultsEntry\x1a.\n\x0cResultsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\r:\x02\x38\x01\"\x1e\n\tReconnect\x12\x11\n\treconnect\x18\x01 \x01(\x04\x32\x8c\x04\n\x05\x46leet\x12M\n\nCreateNode\x12\x1d.flwr.proto.CreateNodeRequest\x1a\x1e.flwr.proto.CreateNodeResponse\"\x00\x12M\n\nDeleteNode\x12\x1d.flwr.proto.DeleteNodeRequest\x1a\x1e.flwr.proto.DeleteNodeResponse\"\x00\x12;\n\x04Ping\x12\x17.flwr.proto.PingRequest\x1a\x18.flwr.proto.PingResponse\"\x00\x12P\n\x0bPullTaskIns\x12\x1e.flwr.proto.PullTaskInsRequest\x1a\x1f.flwr.proto.PullTaskInsResponse\"\x00\x12P\n\x0bPushTaskRes\x12\x1e.flwr.proto.PushTaskResRequest\x1a\x1f.flwr.proto.PushTaskResResponse\"\x00\x12\x41\n\x06GetRun\x12\x19.flwr.proto.GetRunRequest\x1a\x1a.flwr.proto.GetRunResponse\"\x00\x12\x41\n\x06GetFab\x12\x19.flwr.proto.GetFabRequest\x1a\x1a.flwr.proto.GetFabResponse\"\x00\x62\x06proto3')
22
22
 
23
23
  _globals = globals()
24
24
  _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
@@ -44,13 +44,13 @@ if _descriptor._USE_C_DESCRIPTORS == False:
44
44
  _globals['_PULLTASKINSRESPONSE']._serialized_start=476
45
45
  _globals['_PULLTASKINSRESPONSE']._serialized_end=583
46
46
  _globals['_PUSHTASKRESREQUEST']._serialized_start=585
47
- _globals['_PUSHTASKRESREQUEST']._serialized_end=649
48
- _globals['_PUSHTASKRESRESPONSE']._serialized_start=652
49
- _globals['_PUSHTASKRESRESPONSE']._serialized_end=826
50
- _globals['_PUSHTASKRESRESPONSE_RESULTSENTRY']._serialized_start=780
51
- _globals['_PUSHTASKRESRESPONSE_RESULTSENTRY']._serialized_end=826
52
- _globals['_RECONNECT']._serialized_start=828
53
- _globals['_RECONNECT']._serialized_end=858
54
- _globals['_FLEET']._serialized_start=861
55
- _globals['_FLEET']._serialized_end=1385
47
+ _globals['_PUSHTASKRESREQUEST']._serialized_end=681
48
+ _globals['_PUSHTASKRESRESPONSE']._serialized_start=684
49
+ _globals['_PUSHTASKRESRESPONSE']._serialized_end=858
50
+ _globals['_PUSHTASKRESRESPONSE_RESULTSENTRY']._serialized_start=812
51
+ _globals['_PUSHTASKRESRESPONSE_RESULTSENTRY']._serialized_end=858
52
+ _globals['_RECONNECT']._serialized_start=860
53
+ _globals['_RECONNECT']._serialized_end=890
54
+ _globals['_FLEET']._serialized_start=893
55
+ _globals['_FLEET']._serialized_end=1417
56
56
  # @@protoc_insertion_point(module_scope)
flwr/proto/fleet_pb2.pyi CHANGED
@@ -124,14 +124,19 @@ global___PullTaskInsResponse = PullTaskInsResponse
124
124
  class PushTaskResRequest(google.protobuf.message.Message):
125
125
  """PushTaskRes messages"""
126
126
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
127
+ NODE_FIELD_NUMBER: builtins.int
127
128
  TASK_RES_LIST_FIELD_NUMBER: builtins.int
128
129
  @property
130
+ def node(self) -> flwr.proto.node_pb2.Node: ...
131
+ @property
129
132
  def task_res_list(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[flwr.proto.task_pb2.TaskRes]: ...
130
133
  def __init__(self,
131
134
  *,
135
+ node: typing.Optional[flwr.proto.node_pb2.Node] = ...,
132
136
  task_res_list: typing.Optional[typing.Iterable[flwr.proto.task_pb2.TaskRes]] = ...,
133
137
  ) -> None: ...
134
- def ClearField(self, field_name: typing_extensions.Literal["task_res_list",b"task_res_list"]) -> None: ...
138
+ def HasField(self, field_name: typing_extensions.Literal["node",b"node"]) -> builtins.bool: ...
139
+ def ClearField(self, field_name: typing_extensions.Literal["node",b"node","task_res_list",b"task_res_list"]) -> None: ...
135
140
  global___PushTaskResRequest = PushTaskResRequest
136
141
 
137
142
  class PushTaskResResponse(google.protobuf.message.Message):
@@ -14,7 +14,7 @@ _sym_db = _symbol_database.Default()
14
14
 
15
15
 
16
16
 
17
- DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1a\x66lwr/proto/recordset.proto\x12\nflwr.proto\"\x1a\n\nDoubleList\x12\x0c\n\x04vals\x18\x01 \x03(\x01\"\x1a\n\nSint64List\x12\x0c\n\x04vals\x18\x01 \x03(\x12\"\x18\n\x08\x42oolList\x12\x0c\n\x04vals\x18\x01 \x03(\x08\"\x1a\n\nStringList\x12\x0c\n\x04vals\x18\x01 \x03(\t\"\x19\n\tBytesList\x12\x0c\n\x04vals\x18\x01 \x03(\x0c\"B\n\x05\x41rray\x12\r\n\x05\x64type\x18\x01 \x01(\t\x12\r\n\x05shape\x18\x02 \x03(\x05\x12\r\n\x05stype\x18\x03 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x04 \x01(\x0c\"\x9f\x01\n\x12MetricsRecordValue\x12\x10\n\x06\x64ouble\x18\x01 \x01(\x01H\x00\x12\x10\n\x06sint64\x18\x02 \x01(\x12H\x00\x12-\n\x0b\x64ouble_list\x18\x15 \x01(\x0b\x32\x16.flwr.proto.DoubleListH\x00\x12-\n\x0bsint64_list\x18\x16 \x01(\x0b\x32\x16.flwr.proto.Sint64ListH\x00\x42\x07\n\x05value\"\xd9\x02\n\x12\x43onfigsRecordValue\x12\x10\n\x06\x64ouble\x18\x01 \x01(\x01H\x00\x12\x10\n\x06sint64\x18\x02 \x01(\x12H\x00\x12\x0e\n\x04\x62ool\x18\x03 \x01(\x08H\x00\x12\x10\n\x06string\x18\x04 \x01(\tH\x00\x12\x0f\n\x05\x62ytes\x18\x05 \x01(\x0cH\x00\x12-\n\x0b\x64ouble_list\x18\x15 \x01(\x0b\x32\x16.flwr.proto.DoubleListH\x00\x12-\n\x0bsint64_list\x18\x16 \x01(\x0b\x32\x16.flwr.proto.Sint64ListH\x00\x12)\n\tbool_list\x18\x17 \x01(\x0b\x32\x14.flwr.proto.BoolListH\x00\x12-\n\x0bstring_list\x18\x18 \x01(\x0b\x32\x16.flwr.proto.StringListH\x00\x12+\n\nbytes_list\x18\x19 \x01(\x0b\x32\x15.flwr.proto.BytesListH\x00\x42\x07\n\x05value\"M\n\x10ParametersRecord\x12\x11\n\tdata_keys\x18\x01 \x03(\t\x12&\n\x0b\x64\x61ta_values\x18\x02 \x03(\x0b\x32\x11.flwr.proto.Array\"\x8f\x01\n\rMetricsRecord\x12\x31\n\x04\x64\x61ta\x18\x01 \x03(\x0b\x32#.flwr.proto.MetricsRecord.DataEntry\x1aK\n\tDataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12-\n\x05value\x18\x02 \x01(\x0b\x32\x1e.flwr.proto.MetricsRecordValue:\x02\x38\x01\"\x8f\x01\n\rConfigsRecord\x12\x31\n\x04\x64\x61ta\x18\x01 \x03(\x0b\x32#.flwr.proto.ConfigsRecord.DataEntry\x1aK\n\tDataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12-\n\x05value\x18\x02 \x01(\x0b\x32\x1e.flwr.proto.ConfigsRecordValue:\x02\x38\x01\"\x97\x03\n\tRecordSet\x12\x39\n\nparameters\x18\x01 \x03(\x0b\x32%.flwr.proto.RecordSet.ParametersEntry\x12\x33\n\x07metrics\x18\x02 \x03(\x0b\x32\".flwr.proto.RecordSet.MetricsEntry\x12\x33\n\x07\x63onfigs\x18\x03 \x03(\x0b\x32\".flwr.proto.RecordSet.ConfigsEntry\x1aO\n\x0fParametersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12+\n\x05value\x18\x02 \x01(\x0b\x32\x1c.flwr.proto.ParametersRecord:\x02\x38\x01\x1aI\n\x0cMetricsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12(\n\x05value\x18\x02 \x01(\x0b\x32\x19.flwr.proto.MetricsRecord:\x02\x38\x01\x1aI\n\x0c\x43onfigsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12(\n\x05value\x18\x02 \x01(\x0b\x32\x19.flwr.proto.ConfigsRecord:\x02\x38\x01\x62\x06proto3')
17
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1a\x66lwr/proto/recordset.proto\x12\nflwr.proto\"0\n\x03Int\x12\x10\n\x06sint64\x18\x01 \x01(\x12H\x00\x12\x10\n\x06uint64\x18\x02 \x01(\x04H\x00\x42\x05\n\x03int\"\x1a\n\nDoubleList\x12\x0c\n\x04vals\x18\x01 \x03(\x01\"(\n\x07IntList\x12\x1d\n\x04vals\x18\x01 \x03(\x0b\x32\x0f.flwr.proto.Int\"\x18\n\x08\x42oolList\x12\x0c\n\x04vals\x18\x01 \x03(\x08\"\x1a\n\nStringList\x12\x0c\n\x04vals\x18\x01 \x03(\t\"\x19\n\tBytesList\x12\x0c\n\x04vals\x18\x01 \x03(\x0c\"B\n\x05\x41rray\x12\r\n\x05\x64type\x18\x01 \x01(\t\x12\r\n\x05shape\x18\x02 \x03(\x05\x12\r\n\x05stype\x18\x03 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x04 \x01(\x0c\"\xab\x01\n\x12MetricsRecordValue\x12\x10\n\x06\x64ouble\x18\x01 \x01(\x01H\x00\x12\x10\n\x06sint64\x18\x02 \x01(\x12H\x00\x12\x10\n\x06uint64\x18\x03 \x01(\x04H\x00\x12-\n\x0b\x64ouble_list\x18\x15 \x01(\x0b\x32\x16.flwr.proto.DoubleListH\x00\x12\'\n\x08int_list\x18\x16 \x01(\x0b\x32\x13.flwr.proto.IntListH\x00\x42\x07\n\x05value\"\xe5\x02\n\x12\x43onfigsRecordValue\x12\x10\n\x06\x64ouble\x18\x01 \x01(\x01H\x00\x12\x10\n\x06sint64\x18\x02 \x01(\x12H\x00\x12\x10\n\x06uint64\x18\x03 \x01(\x04H\x00\x12\x0e\n\x04\x62ool\x18\x04 \x01(\x08H\x00\x12\x10\n\x06string\x18\x05 \x01(\tH\x00\x12\x0f\n\x05\x62ytes\x18\x06 \x01(\x0cH\x00\x12-\n\x0b\x64ouble_list\x18\x15 \x01(\x0b\x32\x16.flwr.proto.DoubleListH\x00\x12\'\n\x08int_list\x18\x16 \x01(\x0b\x32\x13.flwr.proto.IntListH\x00\x12)\n\tbool_list\x18\x18 \x01(\x0b\x32\x14.flwr.proto.BoolListH\x00\x12-\n\x0bstring_list\x18\x19 \x01(\x0b\x32\x16.flwr.proto.StringListH\x00\x12+\n\nbytes_list\x18\x1a \x01(\x0b\x32\x15.flwr.proto.BytesListH\x00\x42\x07\n\x05value\"M\n\x10ParametersRecord\x12\x11\n\tdata_keys\x18\x01 \x03(\t\x12&\n\x0b\x64\x61ta_values\x18\x02 \x03(\x0b\x32\x11.flwr.proto.Array\"\x8f\x01\n\rMetricsRecord\x12\x31\n\x04\x64\x61ta\x18\x01 \x03(\x0b\x32#.flwr.proto.MetricsRecord.DataEntry\x1aK\n\tDataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12-\n\x05value\x18\x02 \x01(\x0b\x32\x1e.flwr.proto.MetricsRecordValue:\x02\x38\x01\"\x8f\x01\n\rConfigsRecord\x12\x31\n\x04\x64\x61ta\x18\x01 \x03(\x0b\x32#.flwr.proto.ConfigsRecord.DataEntry\x1aK\n\tDataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12-\n\x05value\x18\x02 \x01(\x0b\x32\x1e.flwr.proto.ConfigsRecordValue:\x02\x38\x01\"\x97\x03\n\tRecordSet\x12\x39\n\nparameters\x18\x01 \x03(\x0b\x32%.flwr.proto.RecordSet.ParametersEntry\x12\x33\n\x07metrics\x18\x02 \x03(\x0b\x32\".flwr.proto.RecordSet.MetricsEntry\x12\x33\n\x07\x63onfigs\x18\x03 \x03(\x0b\x32\".flwr.proto.RecordSet.ConfigsEntry\x1aO\n\x0fParametersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12+\n\x05value\x18\x02 \x01(\x0b\x32\x1c.flwr.proto.ParametersRecord:\x02\x38\x01\x1aI\n\x0cMetricsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12(\n\x05value\x18\x02 \x01(\x0b\x32\x19.flwr.proto.MetricsRecord:\x02\x38\x01\x1aI\n\x0c\x43onfigsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12(\n\x05value\x18\x02 \x01(\x0b\x32\x19.flwr.proto.ConfigsRecord:\x02\x38\x01\x62\x06proto3')
18
18
 
19
19
  _globals = globals()
20
20
  _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
@@ -31,38 +31,40 @@ if _descriptor._USE_C_DESCRIPTORS == False:
31
31
  _globals['_RECORDSET_METRICSENTRY']._serialized_options = b'8\001'
32
32
  _globals['_RECORDSET_CONFIGSENTRY']._options = None
33
33
  _globals['_RECORDSET_CONFIGSENTRY']._serialized_options = b'8\001'
34
- _globals['_DOUBLELIST']._serialized_start=42
35
- _globals['_DOUBLELIST']._serialized_end=68
36
- _globals['_SINT64LIST']._serialized_start=70
37
- _globals['_SINT64LIST']._serialized_end=96
38
- _globals['_BOOLLIST']._serialized_start=98
39
- _globals['_BOOLLIST']._serialized_end=122
40
- _globals['_STRINGLIST']._serialized_start=124
41
- _globals['_STRINGLIST']._serialized_end=150
42
- _globals['_BYTESLIST']._serialized_start=152
43
- _globals['_BYTESLIST']._serialized_end=177
44
- _globals['_ARRAY']._serialized_start=179
45
- _globals['_ARRAY']._serialized_end=245
46
- _globals['_METRICSRECORDVALUE']._serialized_start=248
47
- _globals['_METRICSRECORDVALUE']._serialized_end=407
48
- _globals['_CONFIGSRECORDVALUE']._serialized_start=410
49
- _globals['_CONFIGSRECORDVALUE']._serialized_end=755
50
- _globals['_PARAMETERSRECORD']._serialized_start=757
51
- _globals['_PARAMETERSRECORD']._serialized_end=834
52
- _globals['_METRICSRECORD']._serialized_start=837
53
- _globals['_METRICSRECORD']._serialized_end=980
54
- _globals['_METRICSRECORD_DATAENTRY']._serialized_start=905
55
- _globals['_METRICSRECORD_DATAENTRY']._serialized_end=980
56
- _globals['_CONFIGSRECORD']._serialized_start=983
57
- _globals['_CONFIGSRECORD']._serialized_end=1126
58
- _globals['_CONFIGSRECORD_DATAENTRY']._serialized_start=1051
59
- _globals['_CONFIGSRECORD_DATAENTRY']._serialized_end=1126
60
- _globals['_RECORDSET']._serialized_start=1129
61
- _globals['_RECORDSET']._serialized_end=1536
62
- _globals['_RECORDSET_PARAMETERSENTRY']._serialized_start=1307
63
- _globals['_RECORDSET_PARAMETERSENTRY']._serialized_end=1386
64
- _globals['_RECORDSET_METRICSENTRY']._serialized_start=1388
65
- _globals['_RECORDSET_METRICSENTRY']._serialized_end=1461
66
- _globals['_RECORDSET_CONFIGSENTRY']._serialized_start=1463
67
- _globals['_RECORDSET_CONFIGSENTRY']._serialized_end=1536
34
+ _globals['_INT']._serialized_start=42
35
+ _globals['_INT']._serialized_end=90
36
+ _globals['_DOUBLELIST']._serialized_start=92
37
+ _globals['_DOUBLELIST']._serialized_end=118
38
+ _globals['_INTLIST']._serialized_start=120
39
+ _globals['_INTLIST']._serialized_end=160
40
+ _globals['_BOOLLIST']._serialized_start=162
41
+ _globals['_BOOLLIST']._serialized_end=186
42
+ _globals['_STRINGLIST']._serialized_start=188
43
+ _globals['_STRINGLIST']._serialized_end=214
44
+ _globals['_BYTESLIST']._serialized_start=216
45
+ _globals['_BYTESLIST']._serialized_end=241
46
+ _globals['_ARRAY']._serialized_start=243
47
+ _globals['_ARRAY']._serialized_end=309
48
+ _globals['_METRICSRECORDVALUE']._serialized_start=312
49
+ _globals['_METRICSRECORDVALUE']._serialized_end=483
50
+ _globals['_CONFIGSRECORDVALUE']._serialized_start=486
51
+ _globals['_CONFIGSRECORDVALUE']._serialized_end=843
52
+ _globals['_PARAMETERSRECORD']._serialized_start=845
53
+ _globals['_PARAMETERSRECORD']._serialized_end=922
54
+ _globals['_METRICSRECORD']._serialized_start=925
55
+ _globals['_METRICSRECORD']._serialized_end=1068
56
+ _globals['_METRICSRECORD_DATAENTRY']._serialized_start=993
57
+ _globals['_METRICSRECORD_DATAENTRY']._serialized_end=1068
58
+ _globals['_CONFIGSRECORD']._serialized_start=1071
59
+ _globals['_CONFIGSRECORD']._serialized_end=1214
60
+ _globals['_CONFIGSRECORD_DATAENTRY']._serialized_start=1139
61
+ _globals['_CONFIGSRECORD_DATAENTRY']._serialized_end=1214
62
+ _globals['_RECORDSET']._serialized_start=1217
63
+ _globals['_RECORDSET']._serialized_end=1624
64
+ _globals['_RECORDSET_PARAMETERSENTRY']._serialized_start=1395
65
+ _globals['_RECORDSET_PARAMETERSENTRY']._serialized_end=1474
66
+ _globals['_RECORDSET_METRICSENTRY']._serialized_start=1476
67
+ _globals['_RECORDSET_METRICSENTRY']._serialized_end=1549
68
+ _globals['_RECORDSET_CONFIGSENTRY']._serialized_start=1551
69
+ _globals['_RECORDSET_CONFIGSENTRY']._serialized_end=1624
68
70
  # @@protoc_insertion_point(module_scope)
@@ -11,6 +11,22 @@ import typing_extensions
11
11
 
12
12
  DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
13
13
 
14
+ class Int(google.protobuf.message.Message):
15
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
16
+ SINT64_FIELD_NUMBER: builtins.int
17
+ UINT64_FIELD_NUMBER: builtins.int
18
+ sint64: builtins.int
19
+ uint64: builtins.int
20
+ def __init__(self,
21
+ *,
22
+ sint64: builtins.int = ...,
23
+ uint64: builtins.int = ...,
24
+ ) -> None: ...
25
+ def HasField(self, field_name: typing_extensions.Literal["int",b"int","sint64",b"sint64","uint64",b"uint64"]) -> builtins.bool: ...
26
+ def ClearField(self, field_name: typing_extensions.Literal["int",b"int","sint64",b"sint64","uint64",b"uint64"]) -> None: ...
27
+ def WhichOneof(self, oneof_group: typing_extensions.Literal["int",b"int"]) -> typing.Optional[typing_extensions.Literal["sint64","uint64"]]: ...
28
+ global___Int = Int
29
+
14
30
  class DoubleList(google.protobuf.message.Message):
15
31
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
16
32
  VALS_FIELD_NUMBER: builtins.int
@@ -23,17 +39,17 @@ class DoubleList(google.protobuf.message.Message):
23
39
  def ClearField(self, field_name: typing_extensions.Literal["vals",b"vals"]) -> None: ...
24
40
  global___DoubleList = DoubleList
25
41
 
26
- class Sint64List(google.protobuf.message.Message):
42
+ class IntList(google.protobuf.message.Message):
27
43
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
28
44
  VALS_FIELD_NUMBER: builtins.int
29
45
  @property
30
- def vals(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.int]: ...
46
+ def vals(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___Int]: ...
31
47
  def __init__(self,
32
48
  *,
33
- vals: typing.Optional[typing.Iterable[builtins.int]] = ...,
49
+ vals: typing.Optional[typing.Iterable[global___Int]] = ...,
34
50
  ) -> None: ...
35
51
  def ClearField(self, field_name: typing_extensions.Literal["vals",b"vals"]) -> None: ...
36
- global___Sint64List = Sint64List
52
+ global___IntList = IntList
37
53
 
38
54
  class BoolList(google.protobuf.message.Message):
39
55
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
@@ -96,39 +112,43 @@ class MetricsRecordValue(google.protobuf.message.Message):
96
112
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
97
113
  DOUBLE_FIELD_NUMBER: builtins.int
98
114
  SINT64_FIELD_NUMBER: builtins.int
115
+ UINT64_FIELD_NUMBER: builtins.int
99
116
  DOUBLE_LIST_FIELD_NUMBER: builtins.int
100
- SINT64_LIST_FIELD_NUMBER: builtins.int
117
+ INT_LIST_FIELD_NUMBER: builtins.int
101
118
  double: builtins.float
102
119
  """Single element"""
103
120
 
104
121
  sint64: builtins.int
122
+ uint64: builtins.int
105
123
  @property
106
124
  def double_list(self) -> global___DoubleList:
107
125
  """List types"""
108
126
  pass
109
127
  @property
110
- def sint64_list(self) -> global___Sint64List: ...
128
+ def int_list(self) -> global___IntList: ...
111
129
  def __init__(self,
112
130
  *,
113
131
  double: builtins.float = ...,
114
132
  sint64: builtins.int = ...,
133
+ uint64: builtins.int = ...,
115
134
  double_list: typing.Optional[global___DoubleList] = ...,
116
- sint64_list: typing.Optional[global___Sint64List] = ...,
135
+ int_list: typing.Optional[global___IntList] = ...,
117
136
  ) -> None: ...
118
- def HasField(self, field_name: typing_extensions.Literal["double",b"double","double_list",b"double_list","sint64",b"sint64","sint64_list",b"sint64_list","value",b"value"]) -> builtins.bool: ...
119
- def ClearField(self, field_name: typing_extensions.Literal["double",b"double","double_list",b"double_list","sint64",b"sint64","sint64_list",b"sint64_list","value",b"value"]) -> None: ...
120
- def WhichOneof(self, oneof_group: typing_extensions.Literal["value",b"value"]) -> typing.Optional[typing_extensions.Literal["double","sint64","double_list","sint64_list"]]: ...
137
+ def HasField(self, field_name: typing_extensions.Literal["double",b"double","double_list",b"double_list","int_list",b"int_list","sint64",b"sint64","uint64",b"uint64","value",b"value"]) -> builtins.bool: ...
138
+ def ClearField(self, field_name: typing_extensions.Literal["double",b"double","double_list",b"double_list","int_list",b"int_list","sint64",b"sint64","uint64",b"uint64","value",b"value"]) -> None: ...
139
+ def WhichOneof(self, oneof_group: typing_extensions.Literal["value",b"value"]) -> typing.Optional[typing_extensions.Literal["double","sint64","uint64","double_list","int_list"]]: ...
121
140
  global___MetricsRecordValue = MetricsRecordValue
122
141
 
123
142
  class ConfigsRecordValue(google.protobuf.message.Message):
124
143
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
125
144
  DOUBLE_FIELD_NUMBER: builtins.int
126
145
  SINT64_FIELD_NUMBER: builtins.int
146
+ UINT64_FIELD_NUMBER: builtins.int
127
147
  BOOL_FIELD_NUMBER: builtins.int
128
148
  STRING_FIELD_NUMBER: builtins.int
129
149
  BYTES_FIELD_NUMBER: builtins.int
130
150
  DOUBLE_LIST_FIELD_NUMBER: builtins.int
131
- SINT64_LIST_FIELD_NUMBER: builtins.int
151
+ INT_LIST_FIELD_NUMBER: builtins.int
132
152
  BOOL_LIST_FIELD_NUMBER: builtins.int
133
153
  STRING_LIST_FIELD_NUMBER: builtins.int
134
154
  BYTES_LIST_FIELD_NUMBER: builtins.int
@@ -136,6 +156,7 @@ class ConfigsRecordValue(google.protobuf.message.Message):
136
156
  """Single element"""
137
157
 
138
158
  sint64: builtins.int
159
+ uint64: builtins.int
139
160
  bool: builtins.bool
140
161
  string: typing.Text
141
162
  bytes: builtins.bytes
@@ -144,7 +165,7 @@ class ConfigsRecordValue(google.protobuf.message.Message):
144
165
  """List types"""
145
166
  pass
146
167
  @property
147
- def sint64_list(self) -> global___Sint64List: ...
168
+ def int_list(self) -> global___IntList: ...
148
169
  @property
149
170
  def bool_list(self) -> global___BoolList: ...
150
171
  @property
@@ -155,18 +176,19 @@ class ConfigsRecordValue(google.protobuf.message.Message):
155
176
  *,
156
177
  double: builtins.float = ...,
157
178
  sint64: builtins.int = ...,
179
+ uint64: builtins.int = ...,
158
180
  bool: builtins.bool = ...,
159
181
  string: typing.Text = ...,
160
182
  bytes: builtins.bytes = ...,
161
183
  double_list: typing.Optional[global___DoubleList] = ...,
162
- sint64_list: typing.Optional[global___Sint64List] = ...,
184
+ int_list: typing.Optional[global___IntList] = ...,
163
185
  bool_list: typing.Optional[global___BoolList] = ...,
164
186
  string_list: typing.Optional[global___StringList] = ...,
165
187
  bytes_list: typing.Optional[global___BytesList] = ...,
166
188
  ) -> None: ...
167
- def HasField(self, field_name: typing_extensions.Literal["bool",b"bool","bool_list",b"bool_list","bytes",b"bytes","bytes_list",b"bytes_list","double",b"double","double_list",b"double_list","sint64",b"sint64","sint64_list",b"sint64_list","string",b"string","string_list",b"string_list","value",b"value"]) -> builtins.bool: ...
168
- def ClearField(self, field_name: typing_extensions.Literal["bool",b"bool","bool_list",b"bool_list","bytes",b"bytes","bytes_list",b"bytes_list","double",b"double","double_list",b"double_list","sint64",b"sint64","sint64_list",b"sint64_list","string",b"string","string_list",b"string_list","value",b"value"]) -> None: ...
169
- def WhichOneof(self, oneof_group: typing_extensions.Literal["value",b"value"]) -> typing.Optional[typing_extensions.Literal["double","sint64","bool","string","bytes","double_list","sint64_list","bool_list","string_list","bytes_list"]]: ...
189
+ def HasField(self, field_name: typing_extensions.Literal["bool",b"bool","bool_list",b"bool_list","bytes",b"bytes","bytes_list",b"bytes_list","double",b"double","double_list",b"double_list","int_list",b"int_list","sint64",b"sint64","string",b"string","string_list",b"string_list","uint64",b"uint64","value",b"value"]) -> builtins.bool: ...
190
+ def ClearField(self, field_name: typing_extensions.Literal["bool",b"bool","bool_list",b"bool_list","bytes",b"bytes","bytes_list",b"bytes_list","double",b"double","double_list",b"double_list","int_list",b"int_list","sint64",b"sint64","string",b"string","string_list",b"string_list","uint64",b"uint64","value",b"value"]) -> None: ...
191
+ def WhichOneof(self, oneof_group: typing_extensions.Literal["value",b"value"]) -> typing.Optional[typing_extensions.Literal["double","sint64","uint64","bool","string","bytes","double_list","int_list","bool_list","string_list","bytes_list"]]: ...
170
192
  global___ConfigsRecordValue = ConfigsRecordValue
171
193
 
172
194
  class ParametersRecord(google.protobuf.message.Message):
flwr/proto/run_pb2.py CHANGED
@@ -13,10 +13,11 @@ _sym_db = _symbol_database.Default()
13
13
 
14
14
 
15
15
  from flwr.proto import fab_pb2 as flwr_dot_proto_dot_fab__pb2
16
+ from flwr.proto import node_pb2 as flwr_dot_proto_dot_node__pb2
16
17
  from flwr.proto import transport_pb2 as flwr_dot_proto_dot_transport__pb2
17
18
 
18
19
 
19
- DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x14\x66lwr/proto/run.proto\x12\nflwr.proto\x1a\x14\x66lwr/proto/fab.proto\x1a\x1a\x66lwr/proto/transport.proto\"\xd5\x01\n\x03Run\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\x12\x0e\n\x06\x66\x61\x62_id\x18\x02 \x01(\t\x12\x13\n\x0b\x66\x61\x62_version\x18\x03 \x01(\t\x12<\n\x0foverride_config\x18\x04 \x03(\x0b\x32#.flwr.proto.Run.OverrideConfigEntry\x12\x10\n\x08\x66\x61\x62_hash\x18\x05 \x01(\t\x1aI\n\x13OverrideConfigEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12!\n\x05value\x18\x02 \x01(\x0b\x32\x12.flwr.proto.Scalar:\x02\x38\x01\"@\n\tRunStatus\x12\x0e\n\x06status\x18\x01 \x01(\t\x12\x12\n\nsub_status\x18\x02 \x01(\t\x12\x0f\n\x07\x64\x65tails\x18\x03 \x01(\t\"\xeb\x01\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\x12I\n\x0foverride_config\x18\x03 \x03(\x0b\x32\x30.flwr.proto.CreateRunRequest.OverrideConfigEntry\x12\x1c\n\x03\x66\x61\x62\x18\x04 \x01(\x0b\x32\x0f.flwr.proto.Fab\x1aI\n\x13OverrideConfigEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12!\n\x05value\x18\x02 \x01(\x0b\x32\x12.flwr.proto.Scalar:\x02\x38\x01\"#\n\x11\x43reateRunResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\"\x1f\n\rGetRunRequest\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\".\n\x0eGetRunResponse\x12\x1c\n\x03run\x18\x01 \x01(\x0b\x32\x0f.flwr.proto.Run\"S\n\x16UpdateRunStatusRequest\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\x12)\n\nrun_status\x18\x02 \x01(\x0b\x32\x15.flwr.proto.RunStatus\"\x19\n\x17UpdateRunStatusResponse\"&\n\x13GetRunStatusRequest\x12\x0f\n\x07run_ids\x18\x01 \x03(\x04\"\xb1\x01\n\x14GetRunStatusResponse\x12L\n\x0frun_status_dict\x18\x01 \x03(\x0b\x32\x33.flwr.proto.GetRunStatusResponse.RunStatusDictEntry\x1aK\n\x12RunStatusDictEntry\x12\x0b\n\x03key\x18\x01 \x01(\x04\x12$\n\x05value\x18\x02 \x01(\x0b\x32\x15.flwr.proto.RunStatus:\x02\x38\x01\x62\x06proto3')
20
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x14\x66lwr/proto/run.proto\x12\nflwr.proto\x1a\x14\x66lwr/proto/fab.proto\x1a\x15\x66lwr/proto/node.proto\x1a\x1a\x66lwr/proto/transport.proto\"\xd5\x01\n\x03Run\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\x12\x0e\n\x06\x66\x61\x62_id\x18\x02 \x01(\t\x12\x13\n\x0b\x66\x61\x62_version\x18\x03 \x01(\t\x12<\n\x0foverride_config\x18\x04 \x03(\x0b\x32#.flwr.proto.Run.OverrideConfigEntry\x12\x10\n\x08\x66\x61\x62_hash\x18\x05 \x01(\t\x1aI\n\x13OverrideConfigEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12!\n\x05value\x18\x02 \x01(\x0b\x32\x12.flwr.proto.Scalar:\x02\x38\x01\"@\n\tRunStatus\x12\x0e\n\x06status\x18\x01 \x01(\t\x12\x12\n\nsub_status\x18\x02 \x01(\t\x12\x0f\n\x07\x64\x65tails\x18\x03 \x01(\t\"\xeb\x01\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\x12I\n\x0foverride_config\x18\x03 \x03(\x0b\x32\x30.flwr.proto.CreateRunRequest.OverrideConfigEntry\x12\x1c\n\x03\x66\x61\x62\x18\x04 \x01(\x0b\x32\x0f.flwr.proto.Fab\x1aI\n\x13OverrideConfigEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12!\n\x05value\x18\x02 \x01(\x0b\x32\x12.flwr.proto.Scalar:\x02\x38\x01\"#\n\x11\x43reateRunResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\"?\n\rGetRunRequest\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\x12\x0e\n\x06run_id\x18\x02 \x01(\x04\".\n\x0eGetRunResponse\x12\x1c\n\x03run\x18\x01 \x01(\x0b\x32\x0f.flwr.proto.Run\"S\n\x16UpdateRunStatusRequest\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\x12)\n\nrun_status\x18\x02 \x01(\x0b\x32\x15.flwr.proto.RunStatus\"\x19\n\x17UpdateRunStatusResponse\"F\n\x13GetRunStatusRequest\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\x12\x0f\n\x07run_ids\x18\x02 \x03(\x04\"\xb1\x01\n\x14GetRunStatusResponse\x12L\n\x0frun_status_dict\x18\x01 \x03(\x0b\x32\x33.flwr.proto.GetRunStatusResponse.RunStatusDictEntry\x1aK\n\x12RunStatusDictEntry\x12\x0b\n\x03key\x18\x01 \x01(\x04\x12$\n\x05value\x18\x02 \x01(\x0b\x32\x15.flwr.proto.RunStatus:\x02\x38\x01\x62\x06proto3')
20
21
 
21
22
  _globals = globals()
22
23
  _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
@@ -29,30 +30,30 @@ if _descriptor._USE_C_DESCRIPTORS == False:
29
30
  _globals['_CREATERUNREQUEST_OVERRIDECONFIGENTRY']._serialized_options = b'8\001'
30
31
  _globals['_GETRUNSTATUSRESPONSE_RUNSTATUSDICTENTRY']._options = None
31
32
  _globals['_GETRUNSTATUSRESPONSE_RUNSTATUSDICTENTRY']._serialized_options = b'8\001'
32
- _globals['_RUN']._serialized_start=87
33
- _globals['_RUN']._serialized_end=300
34
- _globals['_RUN_OVERRIDECONFIGENTRY']._serialized_start=227
35
- _globals['_RUN_OVERRIDECONFIGENTRY']._serialized_end=300
36
- _globals['_RUNSTATUS']._serialized_start=302
37
- _globals['_RUNSTATUS']._serialized_end=366
38
- _globals['_CREATERUNREQUEST']._serialized_start=369
39
- _globals['_CREATERUNREQUEST']._serialized_end=604
40
- _globals['_CREATERUNREQUEST_OVERRIDECONFIGENTRY']._serialized_start=227
41
- _globals['_CREATERUNREQUEST_OVERRIDECONFIGENTRY']._serialized_end=300
42
- _globals['_CREATERUNRESPONSE']._serialized_start=606
43
- _globals['_CREATERUNRESPONSE']._serialized_end=641
44
- _globals['_GETRUNREQUEST']._serialized_start=643
45
- _globals['_GETRUNREQUEST']._serialized_end=674
46
- _globals['_GETRUNRESPONSE']._serialized_start=676
47
- _globals['_GETRUNRESPONSE']._serialized_end=722
48
- _globals['_UPDATERUNSTATUSREQUEST']._serialized_start=724
49
- _globals['_UPDATERUNSTATUSREQUEST']._serialized_end=807
50
- _globals['_UPDATERUNSTATUSRESPONSE']._serialized_start=809
51
- _globals['_UPDATERUNSTATUSRESPONSE']._serialized_end=834
52
- _globals['_GETRUNSTATUSREQUEST']._serialized_start=836
53
- _globals['_GETRUNSTATUSREQUEST']._serialized_end=874
54
- _globals['_GETRUNSTATUSRESPONSE']._serialized_start=877
55
- _globals['_GETRUNSTATUSRESPONSE']._serialized_end=1054
56
- _globals['_GETRUNSTATUSRESPONSE_RUNSTATUSDICTENTRY']._serialized_start=979
57
- _globals['_GETRUNSTATUSRESPONSE_RUNSTATUSDICTENTRY']._serialized_end=1054
33
+ _globals['_RUN']._serialized_start=110
34
+ _globals['_RUN']._serialized_end=323
35
+ _globals['_RUN_OVERRIDECONFIGENTRY']._serialized_start=250
36
+ _globals['_RUN_OVERRIDECONFIGENTRY']._serialized_end=323
37
+ _globals['_RUNSTATUS']._serialized_start=325
38
+ _globals['_RUNSTATUS']._serialized_end=389
39
+ _globals['_CREATERUNREQUEST']._serialized_start=392
40
+ _globals['_CREATERUNREQUEST']._serialized_end=627
41
+ _globals['_CREATERUNREQUEST_OVERRIDECONFIGENTRY']._serialized_start=250
42
+ _globals['_CREATERUNREQUEST_OVERRIDECONFIGENTRY']._serialized_end=323
43
+ _globals['_CREATERUNRESPONSE']._serialized_start=629
44
+ _globals['_CREATERUNRESPONSE']._serialized_end=664
45
+ _globals['_GETRUNREQUEST']._serialized_start=666
46
+ _globals['_GETRUNREQUEST']._serialized_end=729
47
+ _globals['_GETRUNRESPONSE']._serialized_start=731
48
+ _globals['_GETRUNRESPONSE']._serialized_end=777
49
+ _globals['_UPDATERUNSTATUSREQUEST']._serialized_start=779
50
+ _globals['_UPDATERUNSTATUSREQUEST']._serialized_end=862
51
+ _globals['_UPDATERUNSTATUSRESPONSE']._serialized_start=864
52
+ _globals['_UPDATERUNSTATUSRESPONSE']._serialized_end=889
53
+ _globals['_GETRUNSTATUSREQUEST']._serialized_start=891
54
+ _globals['_GETRUNSTATUSREQUEST']._serialized_end=961
55
+ _globals['_GETRUNSTATUSRESPONSE']._serialized_start=964
56
+ _globals['_GETRUNSTATUSRESPONSE']._serialized_end=1141
57
+ _globals['_GETRUNSTATUSRESPONSE_RUNSTATUSDICTENTRY']._serialized_start=1066
58
+ _globals['_GETRUNSTATUSRESPONSE_RUNSTATUSDICTENTRY']._serialized_end=1141
58
59
  # @@protoc_insertion_point(module_scope)
flwr/proto/run_pb2.pyi CHANGED
@@ -4,6 +4,7 @@ isort:skip_file
4
4
  """
5
5
  import builtins
6
6
  import flwr.proto.fab_pb2
7
+ import flwr.proto.node_pb2
7
8
  import flwr.proto.transport_pb2
8
9
  import google.protobuf.descriptor
9
10
  import google.protobuf.internal.containers
@@ -128,13 +129,18 @@ global___CreateRunResponse = CreateRunResponse
128
129
  class GetRunRequest(google.protobuf.message.Message):
129
130
  """GetRun"""
130
131
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
132
+ NODE_FIELD_NUMBER: builtins.int
131
133
  RUN_ID_FIELD_NUMBER: builtins.int
134
+ @property
135
+ def node(self) -> flwr.proto.node_pb2.Node: ...
132
136
  run_id: builtins.int
133
137
  def __init__(self,
134
138
  *,
139
+ node: typing.Optional[flwr.proto.node_pb2.Node] = ...,
135
140
  run_id: builtins.int = ...,
136
141
  ) -> None: ...
137
- def ClearField(self, field_name: typing_extensions.Literal["run_id",b"run_id"]) -> None: ...
142
+ def HasField(self, field_name: typing_extensions.Literal["node",b"node"]) -> builtins.bool: ...
143
+ def ClearField(self, field_name: typing_extensions.Literal["node",b"node","run_id",b"run_id"]) -> None: ...
138
144
  global___GetRunRequest = GetRunRequest
139
145
 
140
146
  class GetRunResponse(google.protobuf.message.Message):
@@ -176,14 +182,19 @@ global___UpdateRunStatusResponse = UpdateRunStatusResponse
176
182
  class GetRunStatusRequest(google.protobuf.message.Message):
177
183
  """GetRunStatus"""
178
184
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
185
+ NODE_FIELD_NUMBER: builtins.int
179
186
  RUN_IDS_FIELD_NUMBER: builtins.int
180
187
  @property
188
+ def node(self) -> flwr.proto.node_pb2.Node: ...
189
+ @property
181
190
  def run_ids(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.int]: ...
182
191
  def __init__(self,
183
192
  *,
193
+ node: typing.Optional[flwr.proto.node_pb2.Node] = ...,
184
194
  run_ids: typing.Optional[typing.Iterable[builtins.int]] = ...,
185
195
  ) -> None: ...
186
- def ClearField(self, field_name: typing_extensions.Literal["run_ids",b"run_ids"]) -> None: ...
196
+ def HasField(self, field_name: typing_extensions.Literal["node",b"node"]) -> builtins.bool: ...
197
+ def ClearField(self, field_name: typing_extensions.Literal["node",b"node","run_ids",b"run_ids"]) -> None: ...
187
198
  global___GetRunStatusRequest = GetRunStatusRequest
188
199
 
189
200
  class GetRunStatusResponse(google.protobuf.message.Message):
@@ -14,7 +14,7 @@ _sym_db = _symbol_database.Default()
14
14
 
15
15
 
16
16
 
17
- DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1a\x66lwr/proto/transport.proto\x12\nflwr.proto\"9\n\x06Status\x12\x1e\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x10.flwr.proto.Code\x12\x0f\n\x07message\x18\x02 \x01(\t\"2\n\nParameters\x12\x0f\n\x07tensors\x18\x01 \x03(\x0c\x12\x13\n\x0btensor_type\x18\x02 \x01(\t\"\xba\x08\n\rServerMessage\x12?\n\rreconnect_ins\x18\x01 \x01(\x0b\x32&.flwr.proto.ServerMessage.ReconnectInsH\x00\x12H\n\x12get_properties_ins\x18\x02 \x01(\x0b\x32*.flwr.proto.ServerMessage.GetPropertiesInsH\x00\x12H\n\x12get_parameters_ins\x18\x03 \x01(\x0b\x32*.flwr.proto.ServerMessage.GetParametersInsH\x00\x12\x33\n\x07\x66it_ins\x18\x04 \x01(\x0b\x32 .flwr.proto.ServerMessage.FitInsH\x00\x12=\n\x0c\x65valuate_ins\x18\x05 \x01(\x0b\x32%.flwr.proto.ServerMessage.EvaluateInsH\x00\x1a\x1f\n\x0cReconnectIns\x12\x0f\n\x07seconds\x18\x01 \x01(\x03\x1a\x9d\x01\n\x10GetPropertiesIns\x12\x46\n\x06\x63onfig\x18\x01 \x03(\x0b\x32\x36.flwr.proto.ServerMessage.GetPropertiesIns.ConfigEntry\x1a\x41\n\x0b\x43onfigEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12!\n\x05value\x18\x02 \x01(\x0b\x32\x12.flwr.proto.Scalar:\x02\x38\x01\x1a\x9d\x01\n\x10GetParametersIns\x12\x46\n\x06\x63onfig\x18\x01 \x03(\x0b\x32\x36.flwr.proto.ServerMessage.GetParametersIns.ConfigEntry\x1a\x41\n\x0b\x43onfigEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12!\n\x05value\x18\x02 \x01(\x0b\x32\x12.flwr.proto.Scalar:\x02\x38\x01\x1a\xb5\x01\n\x06\x46itIns\x12*\n\nparameters\x18\x01 \x01(\x0b\x32\x16.flwr.proto.Parameters\x12<\n\x06\x63onfig\x18\x02 \x03(\x0b\x32,.flwr.proto.ServerMessage.FitIns.ConfigEntry\x1a\x41\n\x0b\x43onfigEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12!\n\x05value\x18\x02 \x01(\x0b\x32\x12.flwr.proto.Scalar:\x02\x38\x01\x1a\xbf\x01\n\x0b\x45valuateIns\x12*\n\nparameters\x18\x01 \x01(\x0b\x32\x16.flwr.proto.Parameters\x12\x41\n\x06\x63onfig\x18\x02 \x03(\x0b\x32\x31.flwr.proto.ServerMessage.EvaluateIns.ConfigEntry\x1a\x41\n\x0b\x43onfigEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12!\n\x05value\x18\x02 \x01(\x0b\x32\x12.flwr.proto.Scalar:\x02\x38\x01\x42\x05\n\x03msg\"\xa0\t\n\rClientMessage\x12\x41\n\x0e\x64isconnect_res\x18\x01 \x01(\x0b\x32\'.flwr.proto.ClientMessage.DisconnectResH\x00\x12H\n\x12get_properties_res\x18\x02 \x01(\x0b\x32*.flwr.proto.ClientMessage.GetPropertiesResH\x00\x12H\n\x12get_parameters_res\x18\x03 \x01(\x0b\x32*.flwr.proto.ClientMessage.GetParametersResH\x00\x12\x33\n\x07\x66it_res\x18\x04 \x01(\x0b\x32 .flwr.proto.ClientMessage.FitResH\x00\x12=\n\x0c\x65valuate_res\x18\x05 \x01(\x0b\x32%.flwr.proto.ClientMessage.EvaluateResH\x00\x1a\x33\n\rDisconnectRes\x12\"\n\x06reason\x18\x01 \x01(\x0e\x32\x12.flwr.proto.Reason\x1a\xcd\x01\n\x10GetPropertiesRes\x12\"\n\x06status\x18\x01 \x01(\x0b\x32\x12.flwr.proto.Status\x12N\n\nproperties\x18\x02 \x03(\x0b\x32:.flwr.proto.ClientMessage.GetPropertiesRes.PropertiesEntry\x1a\x45\n\x0fPropertiesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12!\n\x05value\x18\x02 \x01(\x0b\x32\x12.flwr.proto.Scalar:\x02\x38\x01\x1a\x62\n\x10GetParametersRes\x12\"\n\x06status\x18\x01 \x01(\x0b\x32\x12.flwr.proto.Status\x12*\n\nparameters\x18\x02 \x01(\x0b\x32\x16.flwr.proto.Parameters\x1a\xf2\x01\n\x06\x46itRes\x12\"\n\x06status\x18\x01 \x01(\x0b\x32\x12.flwr.proto.Status\x12*\n\nparameters\x18\x02 \x01(\x0b\x32\x16.flwr.proto.Parameters\x12\x14\n\x0cnum_examples\x18\x03 \x01(\x03\x12>\n\x07metrics\x18\x04 \x03(\x0b\x32-.flwr.proto.ClientMessage.FitRes.MetricsEntry\x1a\x42\n\x0cMetricsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12!\n\x05value\x18\x02 \x01(\x0b\x32\x12.flwr.proto.Scalar:\x02\x38\x01\x1a\xde\x01\n\x0b\x45valuateRes\x12\"\n\x06status\x18\x01 \x01(\x0b\x32\x12.flwr.proto.Status\x12\x0c\n\x04loss\x18\x02 \x01(\x02\x12\x14\n\x0cnum_examples\x18\x03 \x01(\x03\x12\x43\n\x07metrics\x18\x04 \x03(\x0b\x32\x32.flwr.proto.ClientMessage.EvaluateRes.MetricsEntry\x1a\x42\n\x0cMetricsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12!\n\x05value\x18\x02 \x01(\x0b\x32\x12.flwr.proto.Scalar:\x02\x38\x01\x42\x05\n\x03msg\"i\n\x06Scalar\x12\x10\n\x06\x64ouble\x18\x01 \x01(\x01H\x00\x12\x10\n\x06sint64\x18\x08 \x01(\x12H\x00\x12\x0e\n\x04\x62ool\x18\r \x01(\x08H\x00\x12\x10\n\x06string\x18\x0e \x01(\tH\x00\x12\x0f\n\x05\x62ytes\x18\x0f \x01(\x0cH\x00\x42\x08\n\x06scalar*\x8d\x01\n\x04\x43ode\x12\x06\n\x02OK\x10\x00\x12\"\n\x1eGET_PROPERTIES_NOT_IMPLEMENTED\x10\x01\x12\"\n\x1eGET_PARAMETERS_NOT_IMPLEMENTED\x10\x02\x12\x17\n\x13\x46IT_NOT_IMPLEMENTED\x10\x03\x12\x1c\n\x18\x45VALUATE_NOT_IMPLEMENTED\x10\x04*[\n\x06Reason\x12\x0b\n\x07UNKNOWN\x10\x00\x12\r\n\tRECONNECT\x10\x01\x12\x16\n\x12POWER_DISCONNECTED\x10\x02\x12\x14\n\x10WIFI_UNAVAILABLE\x10\x03\x12\x07\n\x03\x41\x43K\x10\x04\x32S\n\rFlowerService\x12\x42\n\x04Join\x12\x19.flwr.proto.ClientMessage\x1a\x19.flwr.proto.ServerMessage\"\x00(\x01\x30\x01\x62\x06proto3')
17
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1a\x66lwr/proto/transport.proto\x12\nflwr.proto\"9\n\x06Status\x12\x1e\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x10.flwr.proto.Code\x12\x0f\n\x07message\x18\x02 \x01(\t\"2\n\nParameters\x12\x0f\n\x07tensors\x18\x01 \x03(\x0c\x12\x13\n\x0btensor_type\x18\x02 \x01(\t\"\xba\x08\n\rServerMessage\x12?\n\rreconnect_ins\x18\x01 \x01(\x0b\x32&.flwr.proto.ServerMessage.ReconnectInsH\x00\x12H\n\x12get_properties_ins\x18\x02 \x01(\x0b\x32*.flwr.proto.ServerMessage.GetPropertiesInsH\x00\x12H\n\x12get_parameters_ins\x18\x03 \x01(\x0b\x32*.flwr.proto.ServerMessage.GetParametersInsH\x00\x12\x33\n\x07\x66it_ins\x18\x04 \x01(\x0b\x32 .flwr.proto.ServerMessage.FitInsH\x00\x12=\n\x0c\x65valuate_ins\x18\x05 \x01(\x0b\x32%.flwr.proto.ServerMessage.EvaluateInsH\x00\x1a\x1f\n\x0cReconnectIns\x12\x0f\n\x07seconds\x18\x01 \x01(\x03\x1a\x9d\x01\n\x10GetPropertiesIns\x12\x46\n\x06\x63onfig\x18\x01 \x03(\x0b\x32\x36.flwr.proto.ServerMessage.GetPropertiesIns.ConfigEntry\x1a\x41\n\x0b\x43onfigEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12!\n\x05value\x18\x02 \x01(\x0b\x32\x12.flwr.proto.Scalar:\x02\x38\x01\x1a\x9d\x01\n\x10GetParametersIns\x12\x46\n\x06\x63onfig\x18\x01 \x03(\x0b\x32\x36.flwr.proto.ServerMessage.GetParametersIns.ConfigEntry\x1a\x41\n\x0b\x43onfigEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12!\n\x05value\x18\x02 \x01(\x0b\x32\x12.flwr.proto.Scalar:\x02\x38\x01\x1a\xb5\x01\n\x06\x46itIns\x12*\n\nparameters\x18\x01 \x01(\x0b\x32\x16.flwr.proto.Parameters\x12<\n\x06\x63onfig\x18\x02 \x03(\x0b\x32,.flwr.proto.ServerMessage.FitIns.ConfigEntry\x1a\x41\n\x0b\x43onfigEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12!\n\x05value\x18\x02 \x01(\x0b\x32\x12.flwr.proto.Scalar:\x02\x38\x01\x1a\xbf\x01\n\x0b\x45valuateIns\x12*\n\nparameters\x18\x01 \x01(\x0b\x32\x16.flwr.proto.Parameters\x12\x41\n\x06\x63onfig\x18\x02 \x03(\x0b\x32\x31.flwr.proto.ServerMessage.EvaluateIns.ConfigEntry\x1a\x41\n\x0b\x43onfigEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12!\n\x05value\x18\x02 \x01(\x0b\x32\x12.flwr.proto.Scalar:\x02\x38\x01\x42\x05\n\x03msg\"\xa0\t\n\rClientMessage\x12\x41\n\x0e\x64isconnect_res\x18\x01 \x01(\x0b\x32\'.flwr.proto.ClientMessage.DisconnectResH\x00\x12H\n\x12get_properties_res\x18\x02 \x01(\x0b\x32*.flwr.proto.ClientMessage.GetPropertiesResH\x00\x12H\n\x12get_parameters_res\x18\x03 \x01(\x0b\x32*.flwr.proto.ClientMessage.GetParametersResH\x00\x12\x33\n\x07\x66it_res\x18\x04 \x01(\x0b\x32 .flwr.proto.ClientMessage.FitResH\x00\x12=\n\x0c\x65valuate_res\x18\x05 \x01(\x0b\x32%.flwr.proto.ClientMessage.EvaluateResH\x00\x1a\x33\n\rDisconnectRes\x12\"\n\x06reason\x18\x01 \x01(\x0e\x32\x12.flwr.proto.Reason\x1a\xcd\x01\n\x10GetPropertiesRes\x12\"\n\x06status\x18\x01 \x01(\x0b\x32\x12.flwr.proto.Status\x12N\n\nproperties\x18\x02 \x03(\x0b\x32:.flwr.proto.ClientMessage.GetPropertiesRes.PropertiesEntry\x1a\x45\n\x0fPropertiesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12!\n\x05value\x18\x02 \x01(\x0b\x32\x12.flwr.proto.Scalar:\x02\x38\x01\x1a\x62\n\x10GetParametersRes\x12\"\n\x06status\x18\x01 \x01(\x0b\x32\x12.flwr.proto.Status\x12*\n\nparameters\x18\x02 \x01(\x0b\x32\x16.flwr.proto.Parameters\x1a\xf2\x01\n\x06\x46itRes\x12\"\n\x06status\x18\x01 \x01(\x0b\x32\x12.flwr.proto.Status\x12*\n\nparameters\x18\x02 \x01(\x0b\x32\x16.flwr.proto.Parameters\x12\x14\n\x0cnum_examples\x18\x03 \x01(\x03\x12>\n\x07metrics\x18\x04 \x03(\x0b\x32-.flwr.proto.ClientMessage.FitRes.MetricsEntry\x1a\x42\n\x0cMetricsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12!\n\x05value\x18\x02 \x01(\x0b\x32\x12.flwr.proto.Scalar:\x02\x38\x01\x1a\xde\x01\n\x0b\x45valuateRes\x12\"\n\x06status\x18\x01 \x01(\x0b\x32\x12.flwr.proto.Status\x12\x0c\n\x04loss\x18\x02 \x01(\x02\x12\x14\n\x0cnum_examples\x18\x03 \x01(\x03\x12\x43\n\x07metrics\x18\x04 \x03(\x0b\x32\x32.flwr.proto.ClientMessage.EvaluateRes.MetricsEntry\x1a\x42\n\x0cMetricsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12!\n\x05value\x18\x02 \x01(\x0b\x32\x12.flwr.proto.Scalar:\x02\x38\x01\x42\x05\n\x03msg\"{\n\x06Scalar\x12\x10\n\x06\x64ouble\x18\x01 \x01(\x01H\x00\x12\x10\n\x06uint64\x18\x06 \x01(\x04H\x00\x12\x10\n\x06sint64\x18\x08 \x01(\x12H\x00\x12\x0e\n\x04\x62ool\x18\r \x01(\x08H\x00\x12\x10\n\x06string\x18\x0e \x01(\tH\x00\x12\x0f\n\x05\x62ytes\x18\x0f \x01(\x0cH\x00\x42\x08\n\x06scalar*\x8d\x01\n\x04\x43ode\x12\x06\n\x02OK\x10\x00\x12\"\n\x1eGET_PROPERTIES_NOT_IMPLEMENTED\x10\x01\x12\"\n\x1eGET_PARAMETERS_NOT_IMPLEMENTED\x10\x02\x12\x17\n\x13\x46IT_NOT_IMPLEMENTED\x10\x03\x12\x1c\n\x18\x45VALUATE_NOT_IMPLEMENTED\x10\x04*[\n\x06Reason\x12\x0b\n\x07UNKNOWN\x10\x00\x12\r\n\tRECONNECT\x10\x01\x12\x16\n\x12POWER_DISCONNECTED\x10\x02\x12\x14\n\x10WIFI_UNAVAILABLE\x10\x03\x12\x07\n\x03\x41\x43K\x10\x04\x32S\n\rFlowerService\x12\x42\n\x04Join\x12\x19.flwr.proto.ClientMessage\x1a\x19.flwr.proto.ServerMessage\"\x00(\x01\x30\x01\x62\x06proto3')
18
18
 
19
19
  _globals = globals()
20
20
  _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
@@ -35,10 +35,10 @@ if _descriptor._USE_C_DESCRIPTORS == False:
35
35
  _globals['_CLIENTMESSAGE_FITRES_METRICSENTRY']._serialized_options = b'8\001'
36
36
  _globals['_CLIENTMESSAGE_EVALUATERES_METRICSENTRY']._options = None
37
37
  _globals['_CLIENTMESSAGE_EVALUATERES_METRICSENTRY']._serialized_options = b'8\001'
38
- _globals['_CODE']._serialized_start=2533
39
- _globals['_CODE']._serialized_end=2674
40
- _globals['_REASON']._serialized_start=2676
41
- _globals['_REASON']._serialized_end=2767
38
+ _globals['_CODE']._serialized_start=2551
39
+ _globals['_CODE']._serialized_end=2692
40
+ _globals['_REASON']._serialized_start=2694
41
+ _globals['_REASON']._serialized_end=2785
42
42
  _globals['_STATUS']._serialized_start=42
43
43
  _globals['_STATUS']._serialized_end=99
44
44
  _globals['_PARAMETERS']._serialized_start=101
@@ -82,7 +82,7 @@ if _descriptor._USE_C_DESCRIPTORS == False:
82
82
  _globals['_CLIENTMESSAGE_EVALUATERES_METRICSENTRY']._serialized_start=2125
83
83
  _globals['_CLIENTMESSAGE_EVALUATERES_METRICSENTRY']._serialized_end=2191
84
84
  _globals['_SCALAR']._serialized_start=2425
85
- _globals['_SCALAR']._serialized_end=2530
86
- _globals['_FLOWERSERVICE']._serialized_start=2769
87
- _globals['_FLOWERSERVICE']._serialized_end=2852
85
+ _globals['_SCALAR']._serialized_end=2548
86
+ _globals['_FLOWERSERVICE']._serialized_start=2787
87
+ _globals['_FLOWERSERVICE']._serialized_end=2870
88
88
  # @@protoc_insertion_point(module_scope)
@@ -402,20 +402,22 @@ global___ClientMessage = ClientMessage
402
402
  class Scalar(google.protobuf.message.Message):
403
403
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
404
404
  DOUBLE_FIELD_NUMBER: builtins.int
405
+ UINT64_FIELD_NUMBER: builtins.int
405
406
  SINT64_FIELD_NUMBER: builtins.int
406
407
  BOOL_FIELD_NUMBER: builtins.int
407
408
  STRING_FIELD_NUMBER: builtins.int
408
409
  BYTES_FIELD_NUMBER: builtins.int
409
410
  double: builtins.float
410
- sint64: builtins.int
411
+ uint64: builtins.int
411
412
  """float float = 2;
412
413
  int32 int32 = 3;
413
414
  int64 int64 = 4;
414
415
  uint32 uint32 = 5;
415
- uint64 uint64 = 6;
416
- sint32 sint32 = 7;
417
416
  """
418
417
 
418
+ sint64: builtins.int
419
+ """sint32 sint32 = 7;"""
420
+
419
421
  bool: builtins.bool
420
422
  """fixed32 fixed32 = 9;
421
423
  fixed64 fixed64 = 10;
@@ -428,12 +430,13 @@ class Scalar(google.protobuf.message.Message):
428
430
  def __init__(self,
429
431
  *,
430
432
  double: builtins.float = ...,
433
+ uint64: builtins.int = ...,
431
434
  sint64: builtins.int = ...,
432
435
  bool: builtins.bool = ...,
433
436
  string: typing.Text = ...,
434
437
  bytes: builtins.bytes = ...,
435
438
  ) -> None: ...
436
- def HasField(self, field_name: typing_extensions.Literal["bool",b"bool","bytes",b"bytes","double",b"double","scalar",b"scalar","sint64",b"sint64","string",b"string"]) -> builtins.bool: ...
437
- def ClearField(self, field_name: typing_extensions.Literal["bool",b"bool","bytes",b"bytes","double",b"double","scalar",b"scalar","sint64",b"sint64","string",b"string"]) -> None: ...
438
- def WhichOneof(self, oneof_group: typing_extensions.Literal["scalar",b"scalar"]) -> typing.Optional[typing_extensions.Literal["double","sint64","bool","string","bytes"]]: ...
439
+ def HasField(self, field_name: typing_extensions.Literal["bool",b"bool","bytes",b"bytes","double",b"double","scalar",b"scalar","sint64",b"sint64","string",b"string","uint64",b"uint64"]) -> builtins.bool: ...
440
+ def ClearField(self, field_name: typing_extensions.Literal["bool",b"bool","bytes",b"bytes","double",b"double","scalar",b"scalar","sint64",b"sint64","string",b"string","uint64",b"uint64"]) -> None: ...
441
+ def WhichOneof(self, oneof_group: typing_extensions.Literal["scalar",b"scalar"]) -> typing.Optional[typing_extensions.Literal["double","uint64","sint64","bool","string","bytes"]]: ...
439
442
  global___Scalar = Scalar
@@ -117,6 +117,23 @@ class InMemoryState(State): # pylint: disable=R0902,R0904
117
117
  log(ERROR, errors)
118
118
  return None
119
119
 
120
+ with self.lock:
121
+ # Check if the TaskIns it is replying to exists and is valid
122
+ task_ins_id = task_res.task.ancestry[0]
123
+ task_ins = self.task_ins_store.get(UUID(task_ins_id))
124
+
125
+ if task_ins is None:
126
+ log(ERROR, "TaskIns with task_id %s does not exist.", task_ins_id)
127
+ return None
128
+
129
+ if task_ins.task.created_at + task_ins.task.ttl <= time.time():
130
+ log(
131
+ ERROR,
132
+ "Failed to store TaskRes: TaskIns with task_id %s has expired.",
133
+ task_ins_id,
134
+ )
135
+ return None
136
+
120
137
  # Validate run_id
121
138
  if task_res.run_id not in self.run_ids:
122
139
  log(ERROR, "`run_id` is invalid")
@@ -372,7 +372,18 @@ class SqliteState(State): # pylint: disable=R0904
372
372
  # Create task_id
373
373
  task_id = uuid4()
374
374
 
375
- # Store TaskIns
375
+ task_ins_id = task_res.task.ancestry[0]
376
+ task_ins = self.get_valid_task_ins(task_ins_id)
377
+ if task_ins is None:
378
+ log(
379
+ ERROR,
380
+ "Failed to store TaskRes: "
381
+ "TaskIns with task_id %s does not exist or has expired.",
382
+ task_ins_id,
383
+ )
384
+ return None
385
+
386
+ # Store TaskRes
376
387
  task_res.task_id = str(task_id)
377
388
  data = (task_res_to_dict(task_res),)
378
389
 
@@ -810,6 +821,33 @@ class SqliteState(State): # pylint: disable=R0904
810
821
  log(ERROR, "`node_id` does not exist.")
811
822
  return False
812
823
 
824
+ def get_valid_task_ins(self, task_id: str) -> Optional[dict[str, Any]]:
825
+ """Check if the TaskIns exists and is valid (not expired).
826
+
827
+ Return TaskIns if valid.
828
+ """
829
+ query = """
830
+ SELECT *
831
+ FROM task_ins
832
+ WHERE task_id = :task_id
833
+ """
834
+ data = {"task_id": task_id}
835
+ rows = self.query(query, data)
836
+ if not rows:
837
+ # TaskIns does not exist
838
+ return None
839
+
840
+ task_ins = rows[0]
841
+ created_at = task_ins["created_at"]
842
+ ttl = task_ins["ttl"]
843
+ current_time = time.time()
844
+
845
+ # Check if TaskIns is expired
846
+ if ttl is not None and created_at + ttl <= current_time:
847
+ return None
848
+
849
+ return task_ins
850
+
813
851
 
814
852
  def dict_factory(
815
853
  cursor: sqlite3.Cursor,
@@ -15,6 +15,7 @@
15
15
  """Validators."""
16
16
 
17
17
 
18
+ import time
18
19
  from typing import Union
19
20
 
20
21
  from flwr.proto.task_pb2 import TaskIns, TaskRes # pylint: disable=E0611
@@ -47,6 +48,11 @@ def validate_task_ins_or_res(tasks_ins_res: Union[TaskIns, TaskRes]) -> list[str
47
48
  # unix timestamp of 27 March 2024 00h:00m:00s UTC
48
49
  validation_errors.append("`pushed_at` is not a recent timestamp")
49
50
 
51
+ # Verify TTL and created_at time
52
+ current_time = time.time()
53
+ if tasks_ins_res.task.created_at + tasks_ins_res.task.ttl <= current_time:
54
+ validation_errors.append("Task TTL has expired")
55
+
50
56
  # TaskIns specific
51
57
  if isinstance(tasks_ins_res, TaskIns):
52
58
  # Task producer
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: flwr-nightly
3
- Version: 1.12.0.dev20240924
3
+ Version: 1.12.0.dev20240926
4
4
  Summary: Flower: A Friendly Federated Learning Framework
5
5
  Home-page: https://flower.ai
6
6
  License: Apache-2.0
@@ -69,6 +69,7 @@ Description-Content-Type: text/markdown
69
69
  [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](https://github.com/adap/flower/blob/main/CONTRIBUTING.md)
70
70
  ![Build](https://github.com/adap/flower/actions/workflows/framework.yml/badge.svg)
71
71
  [![Downloads](https://static.pepy.tech/badge/flwr)](https://pepy.tech/project/flwr)
72
+ [![Docker Hub](https://img.shields.io/badge/Docker%20Hub-flwr-blue)](https://hub.docker.com/u/flwr)
72
73
  [![Slack](https://img.shields.io/badge/Chat-Slack-red)](https://flower.ai/join-slack)
73
74
 
74
75
  Flower (`flwr`) is a framework for building federated learning systems. The
@@ -5,14 +5,14 @@ flwr/cli/build.py,sha256=H4xrQPDj7kvZ7Ys65yb-jE86RLEmvIE3pZ3mokZfJHg,5145
5
5
  flwr/cli/config_utils.py,sha256=uJmJAHNoqeSeAC3BAxxoBuYOR9eV3mJg8wrWZgbGp3E,7521
6
6
  flwr/cli/example.py,sha256=1bGDYll3BXQY2kRqSN-oICqS5n1b9m0g0RvXTopXHl4,2215
7
7
  flwr/cli/install.py,sha256=t5tdeKOsTmG3nuInUoSKBVzUU1RnzA096yzYs013VhE,7065
8
- flwr/cli/log.py,sha256=h01DNZPB8YPHuj-6Kpcuh6b-FBaEkVN0l161VZxwq6A,6803
8
+ flwr/cli/log.py,sha256=uhtcLcFGkazirWnEmet3Wt3rt_q-a13kauQqPLaMaRY,8097
9
9
  flwr/cli/new/__init__.py,sha256=cQzK1WH4JP2awef1t2UQ2xjl1agVEz9rwutV18SWV1k,789
10
10
  flwr/cli/new/new.py,sha256=wpHBmHOq6X04CPwJDaEgu3H5_MsfoEYsYsv3E-EDhzM,9558
11
11
  flwr/cli/new/templates/__init__.py,sha256=4luU8RL-CK8JJCstQ_ON809W9bNTkY1l9zSaPKBkgwY,725
12
12
  flwr/cli/new/templates/app/.gitignore.tpl,sha256=XixnHdyeMB2vwkGtGnwHqoWpH-9WChdyG0GXe57duhc,3078
13
13
  flwr/cli/new/templates/app/LICENSE.tpl,sha256=WNHhf_5RCaeuKWyq_K39vmp9F28LxKsB4SpomwSZ2L0,11357
14
14
  flwr/cli/new/templates/app/README.baseline.md.tpl,sha256=4dg2aBS-NIleVyDlxsG8m65Af6LIJ-pZA5ICjGFU5XA,9641
15
- flwr/cli/new/templates/app/README.flowertune.md.tpl,sha256=lxr_RCGfiDy8QGcMVdjXsUXWM_gLf6cY7UQanGL_FFQ,3304
15
+ flwr/cli/new/templates/app/README.flowertune.md.tpl,sha256=QSG51uifue2KVZz2ZNw8kmOStS7svC2AQ2gTa5E7Bhs,3326
16
16
  flwr/cli/new/templates/app/README.md.tpl,sha256=t7w4YFZEcJOxAnuJmNPw5-fDdIJu7PfLd8gFJDiBwwo,436
17
17
  flwr/cli/new/templates/app/__init__.py,sha256=DU7QMY7IhMQyuwm_tja66xU0KXTWQFqzfTqwg-_NJdE,729
18
18
  flwr/cli/new/templates/app/code/__init__.baseline.py.tpl,sha256=YkHAgppUeD2BnBoGfVB6dEvBfjuIPGsU1gw4CiUi3qA,40
@@ -59,7 +59,7 @@ flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl,sha256=vIO1ArukTC76ogYLNmJ
59
59
  flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl,sha256=jk_5teoyOVM9QdBea8J-nk10S6TKw81QZiiKB54ATF0,654
60
60
  flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl,sha256=bRIvPCPvTTI4Eo5b61Rmw8WdDw3sjcohciTXgULN5l8,702
61
61
  flwr/cli/run/__init__.py,sha256=oCd6HmQDx-sqver1gecgx-uMA38BLTSiiKpl7RGNceg,789
62
- flwr/cli/run/run.py,sha256=bGfiHFAsoBSRmuz1vLrRtG0IE0ZCDSIqaVOocUKMciw,7938
62
+ flwr/cli/run/run.py,sha256=tLKeWpWJqEBxkOtDKEprL4SBKxH1vHGybQxlCLnXiSQ,8386
63
63
  flwr/cli/utils.py,sha256=emMUdthvoHBTB0iGQp-oFBmA5wV46lw3y3FmfXQPCsc,4500
64
64
  flwr/client/__init__.py,sha256=DGDoO0AEAfz-0CUFmLdyUUweAS64-07AOnmDfWUefK4,1192
65
65
  flwr/client/app.py,sha256=cH0LAmpm6M8rfgc3lJFJ3pEwCVEgMuv-58WvOo6FEw0,31956
@@ -76,7 +76,7 @@ flwr/client/grpc_client/__init__.py,sha256=LsnbqXiJhgQcB0XzAlUQgPx011Uf7Y7yabIC1
76
76
  flwr/client/grpc_client/connection.py,sha256=WX0cKlV_S19bYYp52z3PYRrtOdGb52ovvFFVWIz6Uyw,9382
77
77
  flwr/client/grpc_rere_client/__init__.py,sha256=MK-oSoV3kwUEQnIwl0GN4OpiHR7eLOrMA8ikunET130,752
78
78
  flwr/client/grpc_rere_client/client_interceptor.py,sha256=4OlD1ZmUEtrbBDuSBjdJB_yXWUHHag51yhxBPwvmXsU,5260
79
- flwr/client/grpc_rere_client/connection.py,sha256=N67GVj4_7_SuNAjQAJ8ulQxWjFPqOcQnOKW5ebbeeBQ,10927
79
+ flwr/client/grpc_rere_client/connection.py,sha256=tppAfMTV1yLBNmgS0KuvqGUjaecpA7SWbPIITkfEHcY,10960
80
80
  flwr/client/grpc_rere_client/grpc_adapter.py,sha256=yPsJg8POxKqAtQxR7R2zSzJ85LQsfV7u6xfrsoZbf0g,4999
81
81
  flwr/client/heartbeat.py,sha256=cx37mJBH8LyoIN4Lks85wtqT1mnU5GulQnr4pGCvAq0,2404
82
82
  flwr/client/message_handler/__init__.py,sha256=QxxQuBNpFPTHx3KiUNvQSlqMKlEnbRR1kFfc1KVje08,719
@@ -94,7 +94,7 @@ flwr/client/node_state.py,sha256=HRKqkgTVGcZXL7nQSQ1nLxNx22eLyaCCIieZ5NZXgnA,394
94
94
  flwr/client/node_state_tests.py,sha256=-4fVsn7y-z9NYBuhq-cjepgxgVuPqqQgDOL4SofrdIo,2239
95
95
  flwr/client/numpy_client.py,sha256=tqGyhIkeeZQGr65BR03B7TWgx4rW3FA7G2874D8z_VU,11167
96
96
  flwr/client/rest_client/__init__.py,sha256=5KGlp7pjc1dhNRkKlaNtUfQmg8wrRFh9lS3P3uRS-7Q,735
97
- flwr/client/rest_client/connection.py,sha256=UKznSmlbLhS0XtNepmKyMQnaBXTCMYYWyHL9XQm9T-w,12781
97
+ flwr/client/rest_client/connection.py,sha256=icPDYPaTMWn3bQ9g42VUHEppcIVcBJFGuV3leo7mMpo,12814
98
98
  flwr/client/supernode/__init__.py,sha256=SUhWOzcgXRNXk1V9UgB5-FaWukqqrOEajVUHEcPkwyQ,865
99
99
  flwr/client/supernode/app.py,sha256=PGsOJG7TXqwnfV6NIyf_YOLKdm0fKjRxUnlPdFLOO3s,11940
100
100
  flwr/client/typing.py,sha256=dxoTBnTMfqXr5J7G3y-uNjqxYCddvxhu89spfj4Lm2U,1048
@@ -130,8 +130,8 @@ flwr/common/secure_aggregation/crypto/symmetric_encryption.py,sha256=wTDbOaMGZwT
130
130
  flwr/common/secure_aggregation/ndarrays_arithmetic.py,sha256=zvVAIrIyI6OSzGhpCi8NNaTvPXmoMYQIPJT-NkBg8RU,3013
131
131
  flwr/common/secure_aggregation/quantization.py,sha256=mC4uLf05zeONo8Ke-BY0Tj8UCMOS7VD93zHCzuv3MHU,2304
132
132
  flwr/common/secure_aggregation/secaggplus_constants.py,sha256=9MF-oQh62uD7rt9VeNB-rHf2gBLd5GL3S9OejCxmILY,2183
133
- flwr/common/secure_aggregation/secaggplus_utils.py,sha256=vmBBxdVqC7b8BvgXmPOeNJsNI5Yfft1UWLvx7P0S4H8,3189
134
- flwr/common/serde.py,sha256=tucfRG2pQ8v5jMbNrs8AILf5fpcNtvwRETpW6x6hlWY,29241
133
+ flwr/common/secure_aggregation/secaggplus_utils.py,sha256=o7IhHH6J9xqinhQy3TdPgQpoj1XyEpyv3OQFyx81RVQ,3193
134
+ flwr/common/serde.py,sha256=m39nnxIYD3jVnYqVepX2tZT-QkVmO3kyWLmRWE-VSWI,30055
135
135
  flwr/common/telemetry.py,sha256=PvdlipCPYciqEgmXRwQ1HklP1uyECcNqt9HTBzthmAg,8904
136
136
  flwr/common/typing.py,sha256=ZVviEABqDeGCyo_yM9ft8EbIGA9RaLOeoNHmMnTkmUo,4985
137
137
  flwr/common/version.py,sha256=tCcl_FvxVK206C1dxIJCs4TjL06WmyaODBP19FRHE1c,1324
@@ -160,12 +160,12 @@ flwr/proto/exec_pb2.py,sha256=GH_VWC-BZwWmeWdmjP4IkXvwR8yY1uBZNNwKru-ZZL4,3231
160
160
  flwr/proto/exec_pb2.pyi,sha256=5y6L3xFkAuCfLTn2pVIHQAlXp17YcTTq8WVDS7_MPl4,4273
161
161
  flwr/proto/exec_pb2_grpc.py,sha256=faAN19XEMP8GTKrcIU6jvlWkN44n2KiUsZh_OG0sYcg,4072
162
162
  flwr/proto/exec_pb2_grpc.pyi,sha256=VrFhT1Um3Nb8UC2YqnR9GIiM-Yyx0FqaxVOWljh-G_w,1208
163
- flwr/proto/fab_pb2.py,sha256=ztC3HnD5e-bYpp7lxrlxkdc30haAlBHswTnt4X5G1eg,1432
164
- flwr/proto/fab_pb2.pyi,sha256=wQXdQkcij6CrkmclIT5tU9SkOSZHTqm3PxWJWu4-CPI,1970
163
+ flwr/proto/fab_pb2.py,sha256=3QSDq9pjbZoqVxsmCRDwHO5PrSjzn2vixjYxE-qPmb0,1589
164
+ flwr/proto/fab_pb2.pyi,sha256=fXI108QaFtbl1WWTyslPbIx9c_19D0aYCoFn0xYtL4U,2277
165
165
  flwr/proto/fab_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
166
166
  flwr/proto/fab_pb2_grpc.pyi,sha256=ff2TSiLVnG6IVQcTGzb2DIH3XRSoAvAo_RMcvbMFyc0,76
167
- flwr/proto/fleet_pb2.py,sha256=euBC2M_LfQSwiSK9kFi18OvoV1gnQT4cC9lAMCCiOGY,4729
168
- flwr/proto/fleet_pb2.pyi,sha256=45kQ9YINv3VG0nxWSjCN4SppdepjKW8rRBlxKxz7ud4,7571
167
+ flwr/proto/fleet_pb2.py,sha256=06NAaIAOxTA2UhkBA-VWZKflaVQIzXgPZ3Fb6vtliY0,4789
168
+ flwr/proto/fleet_pb2.pyi,sha256=bkzPOFXaYVZv9jRIA_XqckTR4dLZcfPRmluaGeoqxBY,7851
169
169
  flwr/proto/fleet_pb2_grpc.py,sha256=VyqpAcX-6tiQVehQfRMbCErtIW4Mot1uXUSzRaklZTI,12228
170
170
  flwr/proto/fleet_pb2_grpc.pyi,sha256=VvOtOBwPcgoHRPgj2JENXq2HbcfU8cxp82E9tDfGyEs,3216
171
171
  flwr/proto/grpcadapter_pb2.py,sha256=bb8mW09XzNCpMdr1KuYQkefPFWR8lc8y1uL6Uk0TtsM,1843
@@ -180,20 +180,20 @@ flwr/proto/node_pb2.py,sha256=qrxEpf7Up9XhigP8g9cIHVhmpdKmYpxMdlO67H0xjEM,1081
180
180
  flwr/proto/node_pb2.pyi,sha256=aX3BHhgXvJE1rvcRnEE_gB-5GcaFQ0SJ88yTE223bjI,751
181
181
  flwr/proto/node_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
182
182
  flwr/proto/node_pb2_grpc.pyi,sha256=ff2TSiLVnG6IVQcTGzb2DIH3XRSoAvAo_RMcvbMFyc0,76
183
- flwr/proto/recordset_pb2.py,sha256=un8L0kvBcgFXQIiQweOseeIJBjlOozUvQY9uTQ42Dqo,6009
184
- flwr/proto/recordset_pb2.pyi,sha256=NPzCJWAj1xLWzeZ_xZ6uaObQjQfWGnnqlLtn4J-SoFY,14161
183
+ flwr/proto/recordset_pb2.py,sha256=B1YcYSC_ftr1oiYOzD_kjOiCWlhcg_mEn2CgYXdBHBo,6298
184
+ flwr/proto/recordset_pb2.pyi,sha256=tZGsentlCIgrFZGy8AZMVDUj89s4tXnORG0mF9pMXrg,15174
185
185
  flwr/proto/recordset_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
186
186
  flwr/proto/recordset_pb2_grpc.pyi,sha256=ff2TSiLVnG6IVQcTGzb2DIH3XRSoAvAo_RMcvbMFyc0,76
187
- flwr/proto/run_pb2.py,sha256=o7qfwQa6o2ExjCBvtUbRQHyVYBGOpVtqg0OkJhZDk1o,4725
188
- flwr/proto/run_pb2.pyi,sha256=pGK9pNSq_9TdjrVgOkHuWu4GfIC8FIjIIgkRa3VFA68,9054
187
+ flwr/proto/run_pb2.py,sha256=pwel-8Hzsz1Gw2EHGEFKObgSEKQNth7nGZOEsJQO8fM,4940
188
+ flwr/proto/run_pb2.pyi,sha256=pr7MPml_7gOmBuu7BO-yaU-LexamsJYxnRG-utigVAo,9641
189
189
  flwr/proto/run_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
190
190
  flwr/proto/run_pb2_grpc.pyi,sha256=ff2TSiLVnG6IVQcTGzb2DIH3XRSoAvAo_RMcvbMFyc0,76
191
191
  flwr/proto/task_pb2.py,sha256=R5GfHgL8IJRI_qHWNeILl1Y9zHjvB0tnCvMHmTgF4Is,2361
192
192
  flwr/proto/task_pb2.pyi,sha256=KJVsLm-THY5QjHreHDm_-OS1tyZyD61mx6BzOpoeMjw,4320
193
193
  flwr/proto/task_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
194
194
  flwr/proto/task_pb2_grpc.pyi,sha256=ff2TSiLVnG6IVQcTGzb2DIH3XRSoAvAo_RMcvbMFyc0,76
195
- flwr/proto/transport_pb2.py,sha256=cURzfpCgZvH7GEvBPLvTYijE3HvhK1MePjINk4xYArk,9781
196
- flwr/proto/transport_pb2.pyi,sha256=CZvJRWTU3QWFWLXNFtyLSrSKFatIyMcy-ohzLbQ-G9c,21497
195
+ flwr/proto/transport_pb2.py,sha256=lJsj9rnLiFBhepXuZAIpZysGAqvtXtoSt4h7soU61Do,9824
196
+ flwr/proto/transport_pb2.pyi,sha256=ipHQ03eFBqsxtAuAVefZ2lVr04BZ4YifJCS2eauNmy8,21627
197
197
  flwr/proto/transport_pb2_grpc.py,sha256=vLN3EHtx2aEEMCO4f1Upu-l27BPzd3-5pV-u8wPcosk,2598
198
198
  flwr/proto/transport_pb2_grpc.pyi,sha256=AGXf8RiIiW2J5IKMlm_3qT3AzcDa4F3P5IqUjve_esA,766
199
199
  flwr/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -270,15 +270,15 @@ flwr/server/superlink/fleet/vce/backend/backend.py,sha256=LBAQxnbfPAphVOVIvYMj0Q
270
270
  flwr/server/superlink/fleet/vce/backend/raybackend.py,sha256=7kB3re3mR53b7E6L6DPSioTSKD3YGtS3uJsPD7Hn2Fw,7155
271
271
  flwr/server/superlink/fleet/vce/vce_api.py,sha256=cGPsjS_4SJHm8jszGjsHh8ZNk9nqWoIQwW_62yKKR1Y,12647
272
272
  flwr/server/superlink/state/__init__.py,sha256=Gj2OTFLXvA-mAjBvwuKDM3rDrVaQPcIoybSa2uskMTE,1003
273
- flwr/server/superlink/state/in_memory_state.py,sha256=DvPSyK-ITZI9XfW-1M0bljLa6Sj0JIUeHFbg5tKKc2s,13142
274
- flwr/server/superlink/state/sqlite_state.py,sha256=GNSBin45-ZgLXNdDSoaPvU6Nem_dUwjarpjIAlkYHdM,32132
273
+ flwr/server/superlink/state/in_memory_state.py,sha256=m7UwCEYwDaUVnPq6AMegmFnHMx7C5ENKHT5GeVaWalM,13792
274
+ flwr/server/superlink/state/sqlite_state.py,sha256=tLdpnXZ4KDdWTMXfCylRlu3pGrR156cGgDq9N_0TK0Y,33244
275
275
  flwr/server/superlink/state/state.py,sha256=KpM894R8RE1N0b-s_Nlii6i0TDxj0DRkKa3Vf24Gt70,8127
276
276
  flwr/server/superlink/state/state_factory.py,sha256=Fo8pBQ1WWrVJK5TOEPZ_zgJE69_mfTGjTO6czh6571o,2021
277
277
  flwr/server/superlink/state/utils.py,sha256=OsF3OOoU4bU4PgLWkypX6EDoFs0L8RP_mHEBG-tVqGA,5227
278
278
  flwr/server/typing.py,sha256=5kaRLZuxTEse9A0g7aVna2VhYxU3wTq1f3d3mtw7kXs,1019
279
279
  flwr/server/utils/__init__.py,sha256=pltsPHJoXmUIr3utjwwYxu7_ZAGy5u4MVHzv9iA5Un8,908
280
280
  flwr/server/utils/tensorboard.py,sha256=gEBD8w_5uaIfp5aw5RYH66lYZpd_SfkObHQ7eDd9MUk,5466
281
- flwr/server/utils/validator.py,sha256=mJSTiJcOKYr9e2YK8yUR1W-bop5EDd_ZnRiaFCa2jSw,5295
281
+ flwr/server/utils/validator.py,sha256=o13PPwjSM7VyUZgzGUiBQTaJLVmRRKi0NSQj6f5HuiA,5512
282
282
  flwr/server/workflow/__init__.py,sha256=SXY0XkwbkezFBxxrFB5hKUtmtAgnYISBkPouR1V71ss,902
283
283
  flwr/server/workflow/constant.py,sha256=q4DLdR8Krlxuewq2AQjwTL75hphxE5ODNz4AhViHMXk,1082
284
284
  flwr/server/workflow/default_workflows.py,sha256=UMC9JgdomKwxql5G0OV4AeRXWI-bMClaLAOn5OrZMnw,14073
@@ -299,8 +299,8 @@ flwr/superexec/exec_grpc.py,sha256=ZPq7EP55Vwj0kRcLVuTCokFqfIgBk-7YmDykZoMKi-c,1
299
299
  flwr/superexec/exec_servicer.py,sha256=TRpwPVl7eI0Y_xlCY6DmVpAo0yFU1gLwzyIeqFw9pyk,4746
300
300
  flwr/superexec/executor.py,sha256=-5J-ZLs-uArro3T2pCq0YQRC65cs18M888nufzdYE4E,2375
301
301
  flwr/superexec/simulation.py,sha256=J6pw-RqCSiUed8I_3MasZH4tl57ZmDebPAHNnbb0-vE,7420
302
- flwr_nightly-1.12.0.dev20240924.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
303
- flwr_nightly-1.12.0.dev20240924.dist-info/METADATA,sha256=uqu5vC87XmCsR6ITGq9dnv0CJnblRG6tIr9YfpvvlDc,15452
304
- flwr_nightly-1.12.0.dev20240924.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
305
- flwr_nightly-1.12.0.dev20240924.dist-info/entry_points.txt,sha256=WUCbqhLEOzjx_lyATIM0-f0e8kOVaQjzwOvyOxHrMhs,434
306
- flwr_nightly-1.12.0.dev20240924.dist-info/RECORD,,
302
+ flwr_nightly-1.12.0.dev20240926.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
303
+ flwr_nightly-1.12.0.dev20240926.dist-info/METADATA,sha256=tYRpupl2xRehjabALyfVt-rtZrKCFf9aOcBmir_kBgs,15552
304
+ flwr_nightly-1.12.0.dev20240926.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
305
+ flwr_nightly-1.12.0.dev20240926.dist-info/entry_points.txt,sha256=WUCbqhLEOzjx_lyATIM0-f0e8kOVaQjzwOvyOxHrMhs,434
306
+ flwr_nightly-1.12.0.dev20240926.dist-info/RECORD,,