flwr-nightly 1.12.0.dev20240917__py3-none-any.whl → 1.12.0.dev20240919__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/new/new.py CHANGED
@@ -275,7 +275,7 @@ def new(
275
275
  )
276
276
  )
277
277
 
278
- _add = " huggingface-cli login\n" if framework_str == "flowertune" else ""
278
+ _add = " huggingface-cli login\n" if llm_challenge_str else ""
279
279
  print(
280
280
  typer.style(
281
281
  f" cd {package_name}\n" + " pip install -e .\n" + _add + " flwr run\n",
@@ -17,6 +17,7 @@ dependencies = [
17
17
  "transformers==4.39.3",
18
18
  "sentencepiece==0.2.0",
19
19
  "omegaconf==2.3.0",
20
+ "hf_transfer==0.1.8",
20
21
  ]
21
22
 
22
23
  [tool.hatch.build.targets.wheel]
@@ -17,7 +17,7 @@ from flwr.proto import run_pb2 as flwr_dot_proto_dot_run__pb2
17
17
  from flwr.proto import message_pb2 as flwr_dot_proto_dot_message__pb2
18
18
 
19
19
 
20
- DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1c\x66lwr/proto/clientappio.proto\x12\nflwr.proto\x1a\x14\x66lwr/proto/fab.proto\x1a\x14\x66lwr/proto/run.proto\x1a\x18\x66lwr/proto/message.proto\"W\n\x15\x43lientAppOutputStatus\x12-\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x1f.flwr.proto.ClientAppOutputCode\x12\x0f\n\x07message\x18\x02 \x01(\t\"\x11\n\x0fGetTokenRequest\"!\n\x10GetTokenResponse\x12\r\n\x05token\x18\x01 \x01(\x12\"+\n\x1aPullClientAppInputsRequest\x12\r\n\x05token\x18\x01 \x01(\x12\"\xa5\x01\n\x1bPullClientAppInputsResponse\x12$\n\x07message\x18\x01 \x01(\x0b\x32\x13.flwr.proto.Message\x12$\n\x07\x63ontext\x18\x02 \x01(\x0b\x32\x13.flwr.proto.Context\x12\x1c\n\x03run\x18\x03 \x01(\x0b\x32\x0f.flwr.proto.Run\x12\x1c\n\x03\x66\x61\x62\x18\x04 \x01(\x0b\x32\x0f.flwr.proto.Fab\"x\n\x1bPushClientAppOutputsRequest\x12\r\n\x05token\x18\x01 \x01(\x12\x12$\n\x07message\x18\x02 \x01(\x0b\x32\x13.flwr.proto.Message\x12$\n\x07\x63ontext\x18\x03 \x01(\x0b\x32\x13.flwr.proto.Context\"Q\n\x1cPushClientAppOutputsResponse\x12\x31\n\x06status\x18\x01 \x01(\x0b\x32!.flwr.proto.ClientAppOutputStatus*L\n\x13\x43lientAppOutputCode\x12\x0b\n\x07SUCCESS\x10\x00\x12\x15\n\x11\x44\x45\x41\x44LINE_EXCEEDED\x10\x01\x12\x11\n\rUNKNOWN_ERROR\x10\x02\x32\xad\x02\n\x0b\x43lientAppIo\x12G\n\x08GetToken\x12\x1b.flwr.proto.GetTokenRequest\x1a\x1c.flwr.proto.GetTokenResponse\"\x00\x12h\n\x13PullClientAppInputs\x12&.flwr.proto.PullClientAppInputsRequest\x1a\'.flwr.proto.PullClientAppInputsResponse\"\x00\x12k\n\x14PushClientAppOutputs\x12\'.flwr.proto.PushClientAppOutputsRequest\x1a(.flwr.proto.PushClientAppOutputsResponse\"\x00\x62\x06proto3')
20
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1c\x66lwr/proto/clientappio.proto\x12\nflwr.proto\x1a\x14\x66lwr/proto/fab.proto\x1a\x14\x66lwr/proto/run.proto\x1a\x18\x66lwr/proto/message.proto\"W\n\x15\x43lientAppOutputStatus\x12-\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x1f.flwr.proto.ClientAppOutputCode\x12\x0f\n\x07message\x18\x02 \x01(\t\"\x11\n\x0fGetTokenRequest\"!\n\x10GetTokenResponse\x12\r\n\x05token\x18\x01 \x01(\x04\"+\n\x1aPullClientAppInputsRequest\x12\r\n\x05token\x18\x01 \x01(\x04\"\xa5\x01\n\x1bPullClientAppInputsResponse\x12$\n\x07message\x18\x01 \x01(\x0b\x32\x13.flwr.proto.Message\x12$\n\x07\x63ontext\x18\x02 \x01(\x0b\x32\x13.flwr.proto.Context\x12\x1c\n\x03run\x18\x03 \x01(\x0b\x32\x0f.flwr.proto.Run\x12\x1c\n\x03\x66\x61\x62\x18\x04 \x01(\x0b\x32\x0f.flwr.proto.Fab\"x\n\x1bPushClientAppOutputsRequest\x12\r\n\x05token\x18\x01 \x01(\x04\x12$\n\x07message\x18\x02 \x01(\x0b\x32\x13.flwr.proto.Message\x12$\n\x07\x63ontext\x18\x03 \x01(\x0b\x32\x13.flwr.proto.Context\"Q\n\x1cPushClientAppOutputsResponse\x12\x31\n\x06status\x18\x01 \x01(\x0b\x32!.flwr.proto.ClientAppOutputStatus*L\n\x13\x43lientAppOutputCode\x12\x0b\n\x07SUCCESS\x10\x00\x12\x15\n\x11\x44\x45\x41\x44LINE_EXCEEDED\x10\x01\x12\x11\n\rUNKNOWN_ERROR\x10\x02\x32\xad\x02\n\x0b\x43lientAppIo\x12G\n\x08GetToken\x12\x1b.flwr.proto.GetTokenRequest\x1a\x1c.flwr.proto.GetTokenResponse\"\x00\x12h\n\x13PullClientAppInputs\x12&.flwr.proto.PullClientAppInputsRequest\x1a\'.flwr.proto.PullClientAppInputsResponse\"\x00\x12k\n\x14PushClientAppOutputs\x12\'.flwr.proto.PushClientAppOutputsRequest\x1a(.flwr.proto.PushClientAppOutputsResponse\"\x00\x62\x06proto3')
21
21
 
22
22
  _globals = globals()
23
23
  _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
@@ -0,0 +1,27 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Generated by the protocol buffer compiler. DO NOT EDIT!
3
+ # source: flwr/proto/control.proto
4
+ # Protobuf Python Version: 4.25.0
5
+ """Generated protocol buffer code."""
6
+ from google.protobuf import descriptor as _descriptor
7
+ from google.protobuf import descriptor_pool as _descriptor_pool
8
+ from google.protobuf import symbol_database as _symbol_database
9
+ from google.protobuf.internal import builder as _builder
10
+ # @@protoc_insertion_point(imports)
11
+
12
+ _sym_db = _symbol_database.Default()
13
+
14
+
15
+ from flwr.proto import run_pb2 as flwr_dot_proto_dot_run__pb2
16
+
17
+
18
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x18\x66lwr/proto/control.proto\x12\nflwr.proto\x1a\x14\x66lwr/proto/run.proto2U\n\x07\x43ontrol\x12J\n\tCreateRun\x12\x1c.flwr.proto.CreateRunRequest\x1a\x1d.flwr.proto.CreateRunResponse\"\x00\x62\x06proto3')
19
+
20
+ _globals = globals()
21
+ _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
22
+ _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'flwr.proto.control_pb2', _globals)
23
+ if _descriptor._USE_C_DESCRIPTORS == False:
24
+ DESCRIPTOR._options = None
25
+ _globals['_CONTROL']._serialized_start=62
26
+ _globals['_CONTROL']._serialized_end=147
27
+ # @@protoc_insertion_point(module_scope)
@@ -0,0 +1,7 @@
1
+ """
2
+ @generated by mypy-protobuf. Do not edit manually!
3
+ isort:skip_file
4
+ """
5
+ import google.protobuf.descriptor
6
+
7
+ DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
@@ -0,0 +1,67 @@
1
+ # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
2
+ """Client and server classes corresponding to protobuf-defined services."""
3
+ import grpc
4
+
5
+ from flwr.proto import run_pb2 as flwr_dot_proto_dot_run__pb2
6
+
7
+
8
+ class ControlStub(object):
9
+ """Missing associated documentation comment in .proto file."""
10
+
11
+ def __init__(self, channel):
12
+ """Constructor.
13
+
14
+ Args:
15
+ channel: A grpc.Channel.
16
+ """
17
+ self.CreateRun = channel.unary_unary(
18
+ '/flwr.proto.Control/CreateRun',
19
+ request_serializer=flwr_dot_proto_dot_run__pb2.CreateRunRequest.SerializeToString,
20
+ response_deserializer=flwr_dot_proto_dot_run__pb2.CreateRunResponse.FromString,
21
+ )
22
+
23
+
24
+ class ControlServicer(object):
25
+ """Missing associated documentation comment in .proto file."""
26
+
27
+ def CreateRun(self, request, context):
28
+ """Request to create a new run
29
+ """
30
+ context.set_code(grpc.StatusCode.UNIMPLEMENTED)
31
+ context.set_details('Method not implemented!')
32
+ raise NotImplementedError('Method not implemented!')
33
+
34
+
35
+ def add_ControlServicer_to_server(servicer, server):
36
+ rpc_method_handlers = {
37
+ 'CreateRun': grpc.unary_unary_rpc_method_handler(
38
+ servicer.CreateRun,
39
+ request_deserializer=flwr_dot_proto_dot_run__pb2.CreateRunRequest.FromString,
40
+ response_serializer=flwr_dot_proto_dot_run__pb2.CreateRunResponse.SerializeToString,
41
+ ),
42
+ }
43
+ generic_handler = grpc.method_handlers_generic_handler(
44
+ 'flwr.proto.Control', rpc_method_handlers)
45
+ server.add_generic_rpc_handlers((generic_handler,))
46
+
47
+
48
+ # This class is part of an EXPERIMENTAL API.
49
+ class Control(object):
50
+ """Missing associated documentation comment in .proto file."""
51
+
52
+ @staticmethod
53
+ def CreateRun(request,
54
+ target,
55
+ options=(),
56
+ channel_credentials=None,
57
+ call_credentials=None,
58
+ insecure=False,
59
+ compression=None,
60
+ wait_for_ready=None,
61
+ timeout=None,
62
+ metadata=None):
63
+ return grpc.experimental.unary_unary(request, target, '/flwr.proto.Control/CreateRun',
64
+ flwr_dot_proto_dot_run__pb2.CreateRunRequest.SerializeToString,
65
+ flwr_dot_proto_dot_run__pb2.CreateRunResponse.FromString,
66
+ options, channel_credentials,
67
+ insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
@@ -0,0 +1,27 @@
1
+ """
2
+ @generated by mypy-protobuf. Do not edit manually!
3
+ isort:skip_file
4
+ """
5
+ import abc
6
+ import flwr.proto.run_pb2
7
+ import grpc
8
+
9
+ class ControlStub:
10
+ def __init__(self, channel: grpc.Channel) -> None: ...
11
+ CreateRun: grpc.UnaryUnaryMultiCallable[
12
+ flwr.proto.run_pb2.CreateRunRequest,
13
+ flwr.proto.run_pb2.CreateRunResponse]
14
+ """Request to create a new run"""
15
+
16
+
17
+ class ControlServicer(metaclass=abc.ABCMeta):
18
+ @abc.abstractmethod
19
+ def CreateRun(self,
20
+ request: flwr.proto.run_pb2.CreateRunRequest,
21
+ context: grpc.ServicerContext,
22
+ ) -> flwr.proto.run_pb2.CreateRunResponse:
23
+ """Request to create a new run"""
24
+ pass
25
+
26
+
27
+ def add_ControlServicer_to_server(servicer: ControlServicer, server: grpc.Server) -> None: ...
flwr/proto/driver_pb2.py CHANGED
@@ -16,36 +16,27 @@ 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
  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
- from flwr.proto import transport_pb2 as flwr_dot_proto_dot_transport__pb2
20
19
 
21
20
 
22
- 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\x1a\x14\x66lwr/proto/run.proto\x1a\x14\x66lwr/proto/fab.proto\x1a\x1a\x66lwr/proto/transport.proto\"\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(\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\xc7\x03\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\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\x17\x66lwr/proto/driver.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\x0fGetNodesRequest\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\"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\xc7\x03\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\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')
23
22
 
24
23
  _globals = globals()
25
24
  _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
26
25
  _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'flwr.proto.driver_pb2', _globals)
27
26
  if _descriptor._USE_C_DESCRIPTORS == False:
28
27
  DESCRIPTOR._options = None
29
- _globals['_CREATERUNREQUEST_OVERRIDECONFIGENTRY']._options = None
30
- _globals['_CREATERUNREQUEST_OVERRIDECONFIGENTRY']._serialized_options = b'8\001'
31
- _globals['_CREATERUNREQUEST']._serialized_start=158
32
- _globals['_CREATERUNREQUEST']._serialized_end=393
33
- _globals['_CREATERUNREQUEST_OVERRIDECONFIGENTRY']._serialized_start=320
34
- _globals['_CREATERUNREQUEST_OVERRIDECONFIGENTRY']._serialized_end=393
35
- _globals['_CREATERUNRESPONSE']._serialized_start=395
36
- _globals['_CREATERUNRESPONSE']._serialized_end=430
37
- _globals['_GETNODESREQUEST']._serialized_start=432
38
- _globals['_GETNODESREQUEST']._serialized_end=465
39
- _globals['_GETNODESRESPONSE']._serialized_start=467
40
- _globals['_GETNODESRESPONSE']._serialized_end=518
41
- _globals['_PUSHTASKINSREQUEST']._serialized_start=520
42
- _globals['_PUSHTASKINSREQUEST']._serialized_end=584
43
- _globals['_PUSHTASKINSRESPONSE']._serialized_start=586
44
- _globals['_PUSHTASKINSRESPONSE']._serialized_end=625
45
- _globals['_PULLTASKRESREQUEST']._serialized_start=627
46
- _globals['_PULLTASKRESREQUEST']._serialized_end=697
47
- _globals['_PULLTASKRESRESPONSE']._serialized_start=699
48
- _globals['_PULLTASKRESRESPONSE']._serialized_end=764
49
- _globals['_DRIVER']._serialized_start=767
50
- _globals['_DRIVER']._serialized_end=1222
28
+ _globals['_GETNODESREQUEST']._serialized_start=129
29
+ _globals['_GETNODESREQUEST']._serialized_end=162
30
+ _globals['_GETNODESRESPONSE']._serialized_start=164
31
+ _globals['_GETNODESRESPONSE']._serialized_end=215
32
+ _globals['_PUSHTASKINSREQUEST']._serialized_start=217
33
+ _globals['_PUSHTASKINSREQUEST']._serialized_end=281
34
+ _globals['_PUSHTASKINSRESPONSE']._serialized_start=283
35
+ _globals['_PUSHTASKINSRESPONSE']._serialized_end=322
36
+ _globals['_PULLTASKRESREQUEST']._serialized_start=324
37
+ _globals['_PULLTASKRESREQUEST']._serialized_end=394
38
+ _globals['_PULLTASKRESRESPONSE']._serialized_start=396
39
+ _globals['_PULLTASKRESRESPONSE']._serialized_end=461
40
+ _globals['_DRIVER']._serialized_start=464
41
+ _globals['_DRIVER']._serialized_end=919
51
42
  # @@protoc_insertion_point(module_scope)
flwr/proto/driver_pb2.pyi CHANGED
@@ -3,10 +3,8 @@
3
3
  isort:skip_file
4
4
  """
5
5
  import builtins
6
- import flwr.proto.fab_pb2
7
6
  import flwr.proto.node_pb2
8
7
  import flwr.proto.task_pb2
9
- import flwr.proto.transport_pb2
10
8
  import google.protobuf.descriptor
11
9
  import google.protobuf.internal.containers
12
10
  import google.protobuf.message
@@ -15,56 +13,6 @@ import typing_extensions
15
13
 
16
14
  DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
17
15
 
18
- class CreateRunRequest(google.protobuf.message.Message):
19
- """CreateRun"""
20
- DESCRIPTOR: google.protobuf.descriptor.Descriptor
21
- class OverrideConfigEntry(google.protobuf.message.Message):
22
- DESCRIPTOR: google.protobuf.descriptor.Descriptor
23
- KEY_FIELD_NUMBER: builtins.int
24
- VALUE_FIELD_NUMBER: builtins.int
25
- key: typing.Text
26
- @property
27
- def value(self) -> flwr.proto.transport_pb2.Scalar: ...
28
- def __init__(self,
29
- *,
30
- key: typing.Text = ...,
31
- value: typing.Optional[flwr.proto.transport_pb2.Scalar] = ...,
32
- ) -> None: ...
33
- def HasField(self, field_name: typing_extensions.Literal["value",b"value"]) -> builtins.bool: ...
34
- def ClearField(self, field_name: typing_extensions.Literal["key",b"key","value",b"value"]) -> None: ...
35
-
36
- FAB_ID_FIELD_NUMBER: builtins.int
37
- FAB_VERSION_FIELD_NUMBER: builtins.int
38
- OVERRIDE_CONFIG_FIELD_NUMBER: builtins.int
39
- FAB_FIELD_NUMBER: builtins.int
40
- fab_id: typing.Text
41
- fab_version: typing.Text
42
- @property
43
- def override_config(self) -> google.protobuf.internal.containers.MessageMap[typing.Text, flwr.proto.transport_pb2.Scalar]: ...
44
- @property
45
- def fab(self) -> flwr.proto.fab_pb2.Fab: ...
46
- def __init__(self,
47
- *,
48
- fab_id: typing.Text = ...,
49
- fab_version: typing.Text = ...,
50
- override_config: typing.Optional[typing.Mapping[typing.Text, flwr.proto.transport_pb2.Scalar]] = ...,
51
- fab: typing.Optional[flwr.proto.fab_pb2.Fab] = ...,
52
- ) -> None: ...
53
- def HasField(self, field_name: typing_extensions.Literal["fab",b"fab"]) -> builtins.bool: ...
54
- def ClearField(self, field_name: typing_extensions.Literal["fab",b"fab","fab_id",b"fab_id","fab_version",b"fab_version","override_config",b"override_config"]) -> None: ...
55
- global___CreateRunRequest = CreateRunRequest
56
-
57
- class CreateRunResponse(google.protobuf.message.Message):
58
- DESCRIPTOR: google.protobuf.descriptor.Descriptor
59
- RUN_ID_FIELD_NUMBER: builtins.int
60
- run_id: builtins.int
61
- def __init__(self,
62
- *,
63
- run_id: builtins.int = ...,
64
- ) -> None: ...
65
- def ClearField(self, field_name: typing_extensions.Literal["run_id",b"run_id"]) -> None: ...
66
- global___CreateRunResponse = CreateRunResponse
67
-
68
16
  class GetNodesRequest(google.protobuf.message.Message):
69
17
  """GetNodes messages"""
70
18
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
@@ -18,8 +18,8 @@ class DriverStub(object):
18
18
  """
19
19
  self.CreateRun = channel.unary_unary(
20
20
  '/flwr.proto.Driver/CreateRun',
21
- request_serializer=flwr_dot_proto_dot_driver__pb2.CreateRunRequest.SerializeToString,
22
- response_deserializer=flwr_dot_proto_dot_driver__pb2.CreateRunResponse.FromString,
21
+ request_serializer=flwr_dot_proto_dot_run__pb2.CreateRunRequest.SerializeToString,
22
+ response_deserializer=flwr_dot_proto_dot_run__pb2.CreateRunResponse.FromString,
23
23
  )
24
24
  self.GetNodes = channel.unary_unary(
25
25
  '/flwr.proto.Driver/GetNodes',
@@ -98,8 +98,8 @@ def add_DriverServicer_to_server(servicer, server):
98
98
  rpc_method_handlers = {
99
99
  'CreateRun': grpc.unary_unary_rpc_method_handler(
100
100
  servicer.CreateRun,
101
- request_deserializer=flwr_dot_proto_dot_driver__pb2.CreateRunRequest.FromString,
102
- response_serializer=flwr_dot_proto_dot_driver__pb2.CreateRunResponse.SerializeToString,
101
+ request_deserializer=flwr_dot_proto_dot_run__pb2.CreateRunRequest.FromString,
102
+ response_serializer=flwr_dot_proto_dot_run__pb2.CreateRunResponse.SerializeToString,
103
103
  ),
104
104
  'GetNodes': grpc.unary_unary_rpc_method_handler(
105
105
  servicer.GetNodes,
@@ -148,8 +148,8 @@ class Driver(object):
148
148
  timeout=None,
149
149
  metadata=None):
150
150
  return grpc.experimental.unary_unary(request, target, '/flwr.proto.Driver/CreateRun',
151
- flwr_dot_proto_dot_driver__pb2.CreateRunRequest.SerializeToString,
152
- flwr_dot_proto_dot_driver__pb2.CreateRunResponse.FromString,
151
+ flwr_dot_proto_dot_run__pb2.CreateRunRequest.SerializeToString,
152
+ flwr_dot_proto_dot_run__pb2.CreateRunResponse.FromString,
153
153
  options, channel_credentials,
154
154
  insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
155
155
 
@@ -11,8 +11,8 @@ import grpc
11
11
  class DriverStub:
12
12
  def __init__(self, channel: grpc.Channel) -> None: ...
13
13
  CreateRun: grpc.UnaryUnaryMultiCallable[
14
- flwr.proto.driver_pb2.CreateRunRequest,
15
- flwr.proto.driver_pb2.CreateRunResponse]
14
+ flwr.proto.run_pb2.CreateRunRequest,
15
+ flwr.proto.run_pb2.CreateRunResponse]
16
16
  """Request run_id"""
17
17
 
18
18
  GetNodes: grpc.UnaryUnaryMultiCallable[
@@ -44,9 +44,9 @@ class DriverStub:
44
44
  class DriverServicer(metaclass=abc.ABCMeta):
45
45
  @abc.abstractmethod
46
46
  def CreateRun(self,
47
- request: flwr.proto.driver_pb2.CreateRunRequest,
47
+ request: flwr.proto.run_pb2.CreateRunRequest,
48
48
  context: grpc.ServicerContext,
49
- ) -> flwr.proto.driver_pb2.CreateRunResponse:
49
+ ) -> flwr.proto.run_pb2.CreateRunResponse:
50
50
  """Request run_id"""
51
51
  pass
52
52
 
flwr/proto/exec_pb2.py CHANGED
@@ -16,7 +16,7 @@ from flwr.proto import fab_pb2 as flwr_dot_proto_dot_fab__pb2
16
16
  from flwr.proto import transport_pb2 as flwr_dot_proto_dot_transport__pb2
17
17
 
18
18
 
19
- DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x15\x66lwr/proto/exec.proto\x12\nflwr.proto\x1a\x14\x66lwr/proto/fab.proto\x1a\x1a\x66lwr/proto/transport.proto\"\xdf\x02\n\x0fStartRunRequest\x12\x1c\n\x03\x66\x61\x62\x18\x01 \x01(\x0b\x32\x0f.flwr.proto.Fab\x12H\n\x0foverride_config\x18\x02 \x03(\x0b\x32/.flwr.proto.StartRunRequest.OverrideConfigEntry\x12L\n\x11\x66\x65\x64\x65ration_config\x18\x03 \x03(\x0b\x32\x31.flwr.proto.StartRunRequest.FederationConfigEntry\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\x1aK\n\x15\x46\x65\x64\x65rationConfigEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12!\n\x05value\x18\x02 \x01(\x0b\x32\x12.flwr.proto.Scalar:\x02\x38\x01\"\"\n\x10StartRunResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\x12\"#\n\x11StreamLogsRequest\x12\x0e\n\x06run_id\x18\x01 \x01(\x12\"(\n\x12StreamLogsResponse\x12\x12\n\nlog_output\x18\x01 \x01(\t2\xa0\x01\n\x04\x45xec\x12G\n\x08StartRun\x12\x1b.flwr.proto.StartRunRequest\x1a\x1c.flwr.proto.StartRunResponse\"\x00\x12O\n\nStreamLogs\x12\x1d.flwr.proto.StreamLogsRequest\x1a\x1e.flwr.proto.StreamLogsResponse\"\x00\x30\x01\x62\x06proto3')
19
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x15\x66lwr/proto/exec.proto\x12\nflwr.proto\x1a\x14\x66lwr/proto/fab.proto\x1a\x1a\x66lwr/proto/transport.proto\"\xdf\x02\n\x0fStartRunRequest\x12\x1c\n\x03\x66\x61\x62\x18\x01 \x01(\x0b\x32\x0f.flwr.proto.Fab\x12H\n\x0foverride_config\x18\x02 \x03(\x0b\x32/.flwr.proto.StartRunRequest.OverrideConfigEntry\x12L\n\x11\x66\x65\x64\x65ration_config\x18\x03 \x03(\x0b\x32\x31.flwr.proto.StartRunRequest.FederationConfigEntry\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\x1aK\n\x15\x46\x65\x64\x65rationConfigEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12!\n\x05value\x18\x02 \x01(\x0b\x32\x12.flwr.proto.Scalar:\x02\x38\x01\"\"\n\x10StartRunResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\"#\n\x11StreamLogsRequest\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\"(\n\x12StreamLogsResponse\x12\x12\n\nlog_output\x18\x01 \x01(\t2\xa0\x01\n\x04\x45xec\x12G\n\x08StartRun\x12\x1b.flwr.proto.StartRunRequest\x1a\x1c.flwr.proto.StartRunResponse\"\x00\x12O\n\nStreamLogs\x12\x1d.flwr.proto.StreamLogsRequest\x1a\x1e.flwr.proto.StreamLogsResponse\"\x00\x30\x01\x62\x06proto3')
20
20
 
21
21
  _globals = globals()
22
22
  _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
flwr/proto/message_pb2.py CHANGED
@@ -17,7 +17,7 @@ from flwr.proto import recordset_pb2 as flwr_dot_proto_dot_recordset__pb2
17
17
  from flwr.proto import transport_pb2 as flwr_dot_proto_dot_transport__pb2
18
18
 
19
19
 
20
- DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x18\x66lwr/proto/message.proto\x12\nflwr.proto\x1a\x16\x66lwr/proto/error.proto\x1a\x1a\x66lwr/proto/recordset.proto\x1a\x1a\x66lwr/proto/transport.proto\"{\n\x07Message\x12&\n\x08metadata\x18\x01 \x01(\x0b\x32\x14.flwr.proto.Metadata\x12&\n\x07\x63ontent\x18\x02 \x01(\x0b\x32\x15.flwr.proto.RecordSet\x12 \n\x05\x65rror\x18\x03 \x01(\x0b\x32\x11.flwr.proto.Error\"\xbf\x02\n\x07\x43ontext\x12\x0f\n\x07node_id\x18\x01 \x01(\x12\x12\x38\n\x0bnode_config\x18\x02 \x03(\x0b\x32#.flwr.proto.Context.NodeConfigEntry\x12$\n\x05state\x18\x03 \x01(\x0b\x32\x15.flwr.proto.RecordSet\x12\x36\n\nrun_config\x18\x04 \x03(\x0b\x32\".flwr.proto.Context.RunConfigEntry\x1a\x45\n\x0fNodeConfigEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12!\n\x05value\x18\x02 \x01(\x0b\x32\x12.flwr.proto.Scalar:\x02\x38\x01\x1a\x44\n\x0eRunConfigEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12!\n\x05value\x18\x02 \x01(\x0b\x32\x12.flwr.proto.Scalar:\x02\x38\x01\"\xbb\x01\n\x08Metadata\x12\x0e\n\x06run_id\x18\x01 \x01(\x12\x12\x12\n\nmessage_id\x18\x02 \x01(\t\x12\x13\n\x0bsrc_node_id\x18\x03 \x01(\x12\x12\x13\n\x0b\x64st_node_id\x18\x04 \x01(\x12\x12\x18\n\x10reply_to_message\x18\x05 \x01(\t\x12\x10\n\x08group_id\x18\x06 \x01(\t\x12\x0b\n\x03ttl\x18\x07 \x01(\x01\x12\x14\n\x0cmessage_type\x18\x08 \x01(\t\x12\x12\n\ncreated_at\x18\t \x01(\x01\x62\x06proto3')
20
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x18\x66lwr/proto/message.proto\x12\nflwr.proto\x1a\x16\x66lwr/proto/error.proto\x1a\x1a\x66lwr/proto/recordset.proto\x1a\x1a\x66lwr/proto/transport.proto\"{\n\x07Message\x12&\n\x08metadata\x18\x01 \x01(\x0b\x32\x14.flwr.proto.Metadata\x12&\n\x07\x63ontent\x18\x02 \x01(\x0b\x32\x15.flwr.proto.RecordSet\x12 \n\x05\x65rror\x18\x03 \x01(\x0b\x32\x11.flwr.proto.Error\"\xbf\x02\n\x07\x43ontext\x12\x0f\n\x07node_id\x18\x01 \x01(\x04\x12\x38\n\x0bnode_config\x18\x02 \x03(\x0b\x32#.flwr.proto.Context.NodeConfigEntry\x12$\n\x05state\x18\x03 \x01(\x0b\x32\x15.flwr.proto.RecordSet\x12\x36\n\nrun_config\x18\x04 \x03(\x0b\x32\".flwr.proto.Context.RunConfigEntry\x1a\x45\n\x0fNodeConfigEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12!\n\x05value\x18\x02 \x01(\x0b\x32\x12.flwr.proto.Scalar:\x02\x38\x01\x1a\x44\n\x0eRunConfigEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12!\n\x05value\x18\x02 \x01(\x0b\x32\x12.flwr.proto.Scalar:\x02\x38\x01\"\xbb\x01\n\x08Metadata\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\x12\x12\n\nmessage_id\x18\x02 \x01(\t\x12\x13\n\x0bsrc_node_id\x18\x03 \x01(\x04\x12\x13\n\x0b\x64st_node_id\x18\x04 \x01(\x04\x12\x18\n\x10reply_to_message\x18\x05 \x01(\t\x12\x10\n\x08group_id\x18\x06 \x01(\t\x12\x0b\n\x03ttl\x18\x07 \x01(\x01\x12\x14\n\x0cmessage_type\x18\x08 \x01(\t\x12\x12\n\ncreated_at\x18\t \x01(\x01\x62\x06proto3')
21
21
 
22
22
  _globals = globals()
23
23
  _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
flwr/proto/node_pb2.py CHANGED
@@ -14,7 +14,7 @@ _sym_db = _symbol_database.Default()
14
14
 
15
15
 
16
16
 
17
- DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x15\x66lwr/proto/node.proto\x12\nflwr.proto\"*\n\x04Node\x12\x0f\n\x07node_id\x18\x01 \x01(\x12\x12\x11\n\tanonymous\x18\x02 \x01(\x08\x62\x06proto3')
17
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x15\x66lwr/proto/node.proto\x12\nflwr.proto\"*\n\x04Node\x12\x0f\n\x07node_id\x18\x01 \x01(\x04\x12\x11\n\tanonymous\x18\x02 \x01(\x08\x62\x06proto3')
18
18
 
19
19
  _globals = globals()
20
20
  _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
flwr/proto/run_pb2.py CHANGED
@@ -12,10 +12,11 @@ from google.protobuf.internal import builder as _builder
12
12
  _sym_db = _symbol_database.Default()
13
13
 
14
14
 
15
+ from flwr.proto import fab_pb2 as flwr_dot_proto_dot_fab__pb2
15
16
  from flwr.proto import transport_pb2 as flwr_dot_proto_dot_transport__pb2
16
17
 
17
18
 
18
- DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x14\x66lwr/proto/run.proto\x12\nflwr.proto\x1a\x1a\x66lwr/proto/transport.proto\"\xd5\x01\n\x03Run\x12\x0e\n\x06run_id\x18\x01 \x01(\x12\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\"\x1f\n\rGetRunRequest\x12\x0e\n\x06run_id\x18\x01 \x01(\x12\".\n\x0eGetRunResponse\x12\x1c\n\x03run\x18\x01 \x01(\x0b\x32\x0f.flwr.proto.Runb\x06proto3')
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\"\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.Runb\x06proto3')
19
20
 
20
21
  _globals = globals()
21
22
  _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
@@ -24,12 +25,20 @@ if _descriptor._USE_C_DESCRIPTORS == False:
24
25
  DESCRIPTOR._options = None
25
26
  _globals['_RUN_OVERRIDECONFIGENTRY']._options = None
26
27
  _globals['_RUN_OVERRIDECONFIGENTRY']._serialized_options = b'8\001'
27
- _globals['_RUN']._serialized_start=65
28
- _globals['_RUN']._serialized_end=278
29
- _globals['_RUN_OVERRIDECONFIGENTRY']._serialized_start=205
30
- _globals['_RUN_OVERRIDECONFIGENTRY']._serialized_end=278
31
- _globals['_GETRUNREQUEST']._serialized_start=280
32
- _globals['_GETRUNREQUEST']._serialized_end=311
33
- _globals['_GETRUNRESPONSE']._serialized_start=313
34
- _globals['_GETRUNRESPONSE']._serialized_end=359
28
+ _globals['_CREATERUNREQUEST_OVERRIDECONFIGENTRY']._options = None
29
+ _globals['_CREATERUNREQUEST_OVERRIDECONFIGENTRY']._serialized_options = b'8\001'
30
+ _globals['_RUN']._serialized_start=87
31
+ _globals['_RUN']._serialized_end=300
32
+ _globals['_RUN_OVERRIDECONFIGENTRY']._serialized_start=227
33
+ _globals['_RUN_OVERRIDECONFIGENTRY']._serialized_end=300
34
+ _globals['_CREATERUNREQUEST']._serialized_start=303
35
+ _globals['_CREATERUNREQUEST']._serialized_end=538
36
+ _globals['_CREATERUNREQUEST_OVERRIDECONFIGENTRY']._serialized_start=227
37
+ _globals['_CREATERUNREQUEST_OVERRIDECONFIGENTRY']._serialized_end=300
38
+ _globals['_CREATERUNRESPONSE']._serialized_start=540
39
+ _globals['_CREATERUNRESPONSE']._serialized_end=575
40
+ _globals['_GETRUNREQUEST']._serialized_start=577
41
+ _globals['_GETRUNREQUEST']._serialized_end=608
42
+ _globals['_GETRUNRESPONSE']._serialized_start=610
43
+ _globals['_GETRUNRESPONSE']._serialized_end=656
35
44
  # @@protoc_insertion_point(module_scope)
flwr/proto/run_pb2.pyi CHANGED
@@ -3,6 +3,7 @@
3
3
  isort:skip_file
4
4
  """
5
5
  import builtins
6
+ import flwr.proto.fab_pb2
6
7
  import flwr.proto.transport_pb2
7
8
  import google.protobuf.descriptor
8
9
  import google.protobuf.internal.containers
@@ -51,7 +52,58 @@ class Run(google.protobuf.message.Message):
51
52
  def ClearField(self, field_name: typing_extensions.Literal["fab_hash",b"fab_hash","fab_id",b"fab_id","fab_version",b"fab_version","override_config",b"override_config","run_id",b"run_id"]) -> None: ...
52
53
  global___Run = Run
53
54
 
55
+ class CreateRunRequest(google.protobuf.message.Message):
56
+ """CreateRun"""
57
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
58
+ class OverrideConfigEntry(google.protobuf.message.Message):
59
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
60
+ KEY_FIELD_NUMBER: builtins.int
61
+ VALUE_FIELD_NUMBER: builtins.int
62
+ key: typing.Text
63
+ @property
64
+ def value(self) -> flwr.proto.transport_pb2.Scalar: ...
65
+ def __init__(self,
66
+ *,
67
+ key: typing.Text = ...,
68
+ value: typing.Optional[flwr.proto.transport_pb2.Scalar] = ...,
69
+ ) -> None: ...
70
+ def HasField(self, field_name: typing_extensions.Literal["value",b"value"]) -> builtins.bool: ...
71
+ def ClearField(self, field_name: typing_extensions.Literal["key",b"key","value",b"value"]) -> None: ...
72
+
73
+ FAB_ID_FIELD_NUMBER: builtins.int
74
+ FAB_VERSION_FIELD_NUMBER: builtins.int
75
+ OVERRIDE_CONFIG_FIELD_NUMBER: builtins.int
76
+ FAB_FIELD_NUMBER: builtins.int
77
+ fab_id: typing.Text
78
+ fab_version: typing.Text
79
+ @property
80
+ def override_config(self) -> google.protobuf.internal.containers.MessageMap[typing.Text, flwr.proto.transport_pb2.Scalar]: ...
81
+ @property
82
+ def fab(self) -> flwr.proto.fab_pb2.Fab: ...
83
+ def __init__(self,
84
+ *,
85
+ fab_id: typing.Text = ...,
86
+ fab_version: typing.Text = ...,
87
+ override_config: typing.Optional[typing.Mapping[typing.Text, flwr.proto.transport_pb2.Scalar]] = ...,
88
+ fab: typing.Optional[flwr.proto.fab_pb2.Fab] = ...,
89
+ ) -> None: ...
90
+ def HasField(self, field_name: typing_extensions.Literal["fab",b"fab"]) -> builtins.bool: ...
91
+ def ClearField(self, field_name: typing_extensions.Literal["fab",b"fab","fab_id",b"fab_id","fab_version",b"fab_version","override_config",b"override_config"]) -> None: ...
92
+ global___CreateRunRequest = CreateRunRequest
93
+
94
+ class CreateRunResponse(google.protobuf.message.Message):
95
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
96
+ RUN_ID_FIELD_NUMBER: builtins.int
97
+ run_id: builtins.int
98
+ def __init__(self,
99
+ *,
100
+ run_id: builtins.int = ...,
101
+ ) -> None: ...
102
+ def ClearField(self, field_name: typing_extensions.Literal["run_id",b"run_id"]) -> None: ...
103
+ global___CreateRunResponse = CreateRunResponse
104
+
54
105
  class GetRunRequest(google.protobuf.message.Message):
106
+ """GetRun"""
55
107
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
56
108
  RUN_ID_FIELD_NUMBER: builtins.int
57
109
  run_id: builtins.int
flwr/proto/task_pb2.py CHANGED
@@ -17,7 +17,7 @@ from flwr.proto import recordset_pb2 as flwr_dot_proto_dot_recordset__pb2
17
17
  from flwr.proto import error_pb2 as flwr_dot_proto_dot_error__pb2
18
18
 
19
19
 
20
- DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x15\x66lwr/proto/task.proto\x12\nflwr.proto\x1a\x15\x66lwr/proto/node.proto\x1a\x1a\x66lwr/proto/recordset.proto\x1a\x16\x66lwr/proto/error.proto\"\x89\x02\n\x04Task\x12\"\n\x08producer\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\x12\"\n\x08\x63onsumer\x18\x02 \x01(\x0b\x32\x10.flwr.proto.Node\x12\x12\n\ncreated_at\x18\x03 \x01(\x01\x12\x14\n\x0c\x64\x65livered_at\x18\x04 \x01(\t\x12\x11\n\tpushed_at\x18\x05 \x01(\x01\x12\x0b\n\x03ttl\x18\x06 \x01(\x01\x12\x10\n\x08\x61ncestry\x18\x07 \x03(\t\x12\x11\n\ttask_type\x18\x08 \x01(\t\x12(\n\trecordset\x18\t \x01(\x0b\x32\x15.flwr.proto.RecordSet\x12 \n\x05\x65rror\x18\n \x01(\x0b\x32\x11.flwr.proto.Error\"\\\n\x07TaskIns\x12\x0f\n\x07task_id\x18\x01 \x01(\t\x12\x10\n\x08group_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\x12\x12\x1e\n\x04task\x18\x04 \x01(\x0b\x32\x10.flwr.proto.Task\"\\\n\x07TaskRes\x12\x0f\n\x07task_id\x18\x01 \x01(\t\x12\x10\n\x08group_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\x12\x12\x1e\n\x04task\x18\x04 \x01(\x0b\x32\x10.flwr.proto.Taskb\x06proto3')
20
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x15\x66lwr/proto/task.proto\x12\nflwr.proto\x1a\x15\x66lwr/proto/node.proto\x1a\x1a\x66lwr/proto/recordset.proto\x1a\x16\x66lwr/proto/error.proto\"\x89\x02\n\x04Task\x12\"\n\x08producer\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\x12\"\n\x08\x63onsumer\x18\x02 \x01(\x0b\x32\x10.flwr.proto.Node\x12\x12\n\ncreated_at\x18\x03 \x01(\x01\x12\x14\n\x0c\x64\x65livered_at\x18\x04 \x01(\t\x12\x11\n\tpushed_at\x18\x05 \x01(\x01\x12\x0b\n\x03ttl\x18\x06 \x01(\x01\x12\x10\n\x08\x61ncestry\x18\x07 \x03(\t\x12\x11\n\ttask_type\x18\x08 \x01(\t\x12(\n\trecordset\x18\t \x01(\x0b\x32\x15.flwr.proto.RecordSet\x12 \n\x05\x65rror\x18\n \x01(\x0b\x32\x11.flwr.proto.Error\"\\\n\x07TaskIns\x12\x0f\n\x07task_id\x18\x01 \x01(\t\x12\x10\n\x08group_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\x04\x12\x1e\n\x04task\x18\x04 \x01(\x0b\x32\x10.flwr.proto.Task\"\\\n\x07TaskRes\x12\x0f\n\x07task_id\x18\x01 \x01(\t\x12\x10\n\x08group_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\x04\x12\x1e\n\x04task\x18\x04 \x01(\x0b\x32\x10.flwr.proto.Taskb\x06proto3')
21
21
 
22
22
  _globals = globals()
23
23
  _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
@@ -35,11 +35,11 @@ from flwr.common.constant import DRIVER_API_DEFAULT_ADDRESS
35
35
  from flwr.common.logger import log, update_console_handler, warn_deprecated_feature
36
36
  from flwr.common.object_ref import load_app
37
37
  from flwr.common.typing import UserConfig
38
- from flwr.proto.driver_pb2 import ( # pylint: disable=E0611
38
+ from flwr.proto.fab_pb2 import GetFabRequest, GetFabResponse # pylint: disable=E0611
39
+ from flwr.proto.run_pb2 import ( # pylint: disable=E0611
39
40
  CreateRunRequest,
40
41
  CreateRunResponse,
41
42
  )
42
- from flwr.proto.fab_pb2 import GetFabRequest, GetFabResponse # pylint: disable=E0611
43
43
 
44
44
  from .driver import Driver
45
45
  from .driver.grpc_driver import GrpcDriver
@@ -32,8 +32,6 @@ from flwr.common.serde import (
32
32
  from flwr.common.typing import Fab
33
33
  from flwr.proto import driver_pb2_grpc # pylint: disable=E0611
34
34
  from flwr.proto.driver_pb2 import ( # pylint: disable=E0611
35
- CreateRunRequest,
36
- CreateRunResponse,
37
35
  GetNodesRequest,
38
36
  GetNodesResponse,
39
37
  PullTaskResRequest,
@@ -44,6 +42,8 @@ from flwr.proto.driver_pb2 import ( # pylint: disable=E0611
44
42
  from flwr.proto.fab_pb2 import GetFabRequest, GetFabResponse # pylint: disable=E0611
45
43
  from flwr.proto.node_pb2 import Node # pylint: disable=E0611
46
44
  from flwr.proto.run_pb2 import ( # pylint: disable=E0611
45
+ CreateRunRequest,
46
+ CreateRunResponse,
47
47
  GetRunRequest,
48
48
  GetRunResponse,
49
49
  Run,
@@ -33,7 +33,14 @@ from flwr.proto.task_pb2 import Task, TaskIns, TaskRes # pylint: disable=E0611
33
33
  from flwr.server.utils.validator import validate_task_ins_or_res
34
34
 
35
35
  from .state import State
36
- from .utils import generate_rand_int_from_bytes, make_node_unavailable_taskres
36
+ from .utils import (
37
+ convert_sint64_to_uint64,
38
+ convert_sint64_values_in_dict_to_uint64,
39
+ convert_uint64_to_sint64,
40
+ convert_uint64_values_in_dict_to_sint64,
41
+ generate_rand_int_from_bytes,
42
+ make_node_unavailable_taskres,
43
+ )
37
44
 
38
45
  SQL_CREATE_TABLE_NODE = """
39
46
  CREATE TABLE IF NOT EXISTS node(
@@ -223,6 +230,12 @@ class SqliteState(State): # pylint: disable=R0904
223
230
  # Store TaskIns
224
231
  task_ins.task_id = str(task_id)
225
232
  data = (task_ins_to_dict(task_ins),)
233
+
234
+ # Convert values from uint64 to sint64 for SQLite
235
+ convert_uint64_values_in_dict_to_sint64(
236
+ data[0], ["run_id", "producer_node_id", "consumer_node_id"]
237
+ )
238
+
226
239
  columns = ", ".join([f":{key}" for key in data[0]])
227
240
  query = f"INSERT INTO task_ins VALUES({columns});"
228
241
 
@@ -284,6 +297,9 @@ class SqliteState(State): # pylint: disable=R0904
284
297
  AND delivered_at = ""
285
298
  """
286
299
  else:
300
+ # Convert the uint64 value to sint64 for SQLite
301
+ data["node_id"] = convert_uint64_to_sint64(node_id)
302
+
287
303
  # Retrieve all TaskIns for node_id
288
304
  query = """
289
305
  SELECT task_id
@@ -292,7 +308,6 @@ class SqliteState(State): # pylint: disable=R0904
292
308
  AND consumer_node_id == :node_id
293
309
  AND delivered_at = ""
294
310
  """
295
- data["node_id"] = node_id
296
311
 
297
312
  if limit is not None:
298
313
  query += " LIMIT :limit"
@@ -322,6 +337,12 @@ class SqliteState(State): # pylint: disable=R0904
322
337
  # Run query
323
338
  rows = self.query(query, data)
324
339
 
340
+ for row in rows:
341
+ # Convert values from sint64 to uint64
342
+ convert_sint64_values_in_dict_to_uint64(
343
+ row, ["run_id", "producer_node_id", "consumer_node_id"]
344
+ )
345
+
325
346
  result = [dict_to_task_ins(row) for row in rows]
326
347
 
327
348
  return result
@@ -354,6 +375,12 @@ class SqliteState(State): # pylint: disable=R0904
354
375
  # Store TaskIns
355
376
  task_res.task_id = str(task_id)
356
377
  data = (task_res_to_dict(task_res),)
378
+
379
+ # Convert values from uint64 to sint64 for SQLite
380
+ convert_uint64_values_in_dict_to_sint64(
381
+ data[0], ["run_id", "producer_node_id", "consumer_node_id"]
382
+ )
383
+
357
384
  columns = ", ".join([f":{key}" for key in data[0]])
358
385
  query = f"INSERT INTO task_res VALUES({columns});"
359
386
 
@@ -431,6 +458,12 @@ class SqliteState(State): # pylint: disable=R0904
431
458
  # Run query
432
459
  rows = self.query(query, data)
433
460
 
461
+ for row in rows:
462
+ # Convert values from sint64 to uint64
463
+ convert_sint64_values_in_dict_to_uint64(
464
+ row, ["run_id", "producer_node_id", "consumer_node_id"]
465
+ )
466
+
434
467
  result = [dict_to_task_res(row) for row in rows]
435
468
 
436
469
  # 1. Query: Fetch consumer_node_id of remaining task_ids
@@ -474,6 +507,13 @@ class SqliteState(State): # pylint: disable=R0904
474
507
  for row in task_ins_rows:
475
508
  if limit and len(result) == limit:
476
509
  break
510
+
511
+ for row in rows:
512
+ # Convert values from sint64 to uint64
513
+ convert_sint64_values_in_dict_to_uint64(
514
+ row, ["run_id", "producer_node_id", "consumer_node_id"]
515
+ )
516
+
477
517
  task_ins = dict_to_task_ins(row)
478
518
  err_taskres = make_node_unavailable_taskres(
479
519
  ref_taskins=task_ins,
@@ -544,8 +584,11 @@ class SqliteState(State): # pylint: disable=R0904
544
584
  self, ping_interval: float, public_key: Optional[bytes] = None
545
585
  ) -> int:
546
586
  """Create, store in state, and return `node_id`."""
547
- # Sample a random int64 as node_id
548
- node_id = generate_rand_int_from_bytes(NODE_ID_NUM_BYTES)
587
+ # Sample a random uint64 as node_id
588
+ uint64_node_id = generate_rand_int_from_bytes(NODE_ID_NUM_BYTES)
589
+
590
+ # Convert the uint64 value to sint64 for SQLite
591
+ sint64_node_id = convert_uint64_to_sint64(uint64_node_id)
549
592
 
550
593
  query = "SELECT node_id FROM node WHERE public_key = :public_key;"
551
594
  row = self.query(query, {"public_key": public_key})
@@ -562,17 +605,28 @@ class SqliteState(State): # pylint: disable=R0904
562
605
 
563
606
  try:
564
607
  self.query(
565
- query, (node_id, time.time() + ping_interval, ping_interval, public_key)
608
+ query,
609
+ (
610
+ sint64_node_id,
611
+ time.time() + ping_interval,
612
+ ping_interval,
613
+ public_key,
614
+ ),
566
615
  )
567
616
  except sqlite3.IntegrityError:
568
617
  log(ERROR, "Unexpected node registration failure.")
569
618
  return 0
570
- return node_id
619
+
620
+ # Note: we need to return the uint64 value of the node_id
621
+ return uint64_node_id
571
622
 
572
623
  def delete_node(self, node_id: int, public_key: Optional[bytes] = None) -> None:
573
624
  """Delete a node."""
625
+ # Convert the uint64 value to sint64 for SQLite
626
+ sint64_node_id = convert_uint64_to_sint64(node_id)
627
+
574
628
  query = "DELETE FROM node WHERE node_id = ?"
575
- params = (node_id,)
629
+ params = (sint64_node_id,)
576
630
 
577
631
  if public_key is not None:
578
632
  query += " AND public_key = ?"
@@ -597,15 +651,20 @@ class SqliteState(State): # pylint: disable=R0904
597
651
  If the provided `run_id` does not exist or has no matching nodes,
598
652
  an empty `Set` MUST be returned.
599
653
  """
654
+ # Convert the uint64 value to sint64 for SQLite
655
+ sint64_run_id = convert_uint64_to_sint64(run_id)
656
+
600
657
  # Validate run ID
601
658
  query = "SELECT COUNT(*) FROM run WHERE run_id = ?;"
602
- if self.query(query, (run_id,))[0]["COUNT(*)"] == 0:
659
+ if self.query(query, (sint64_run_id,))[0]["COUNT(*)"] == 0:
603
660
  return set()
604
661
 
605
662
  # Get nodes
606
663
  query = "SELECT node_id FROM node WHERE online_until > ?;"
607
664
  rows = self.query(query, (time.time(),))
608
- result: set[int] = {row["node_id"] for row in rows}
665
+
666
+ # Convert sint64 node_ids to uint64
667
+ result: set[int] = {convert_sint64_to_uint64(row["node_id"]) for row in rows}
609
668
  return result
610
669
 
611
670
  def get_node_id(self, node_public_key: bytes) -> Optional[int]:
@@ -614,7 +673,11 @@ class SqliteState(State): # pylint: disable=R0904
614
673
  row = self.query(query, {"public_key": node_public_key})
615
674
  if len(row) > 0:
616
675
  node_id: int = row[0]["node_id"]
617
- return node_id
676
+
677
+ # Convert the sint64 value to uint64 after reading from SQLite
678
+ uint64_node_id = convert_sint64_to_uint64(node_id)
679
+
680
+ return uint64_node_id
618
681
  return None
619
682
 
620
683
  def create_run(
@@ -626,12 +689,15 @@ class SqliteState(State): # pylint: disable=R0904
626
689
  ) -> int:
627
690
  """Create a new run for the specified `fab_id` and `fab_version`."""
628
691
  # Sample a random int64 as run_id
629
- run_id = generate_rand_int_from_bytes(RUN_ID_NUM_BYTES)
692
+ uint64_run_id = generate_rand_int_from_bytes(RUN_ID_NUM_BYTES)
693
+
694
+ # Convert the uint64 value to sint64 for SQLite
695
+ sint64_run_id = convert_uint64_to_sint64(uint64_run_id)
630
696
 
631
697
  # Check conflicts
632
698
  query = "SELECT COUNT(*) FROM run WHERE run_id = ?;"
633
- # If run_id does not exist
634
- if self.query(query, (run_id,))[0]["COUNT(*)"] == 0:
699
+ # If sint64_run_id does not exist
700
+ if self.query(query, (sint64_run_id,))[0]["COUNT(*)"] == 0:
635
701
  query = (
636
702
  "INSERT INTO run "
637
703
  "(run_id, fab_id, fab_version, fab_hash, override_config)"
@@ -639,14 +705,22 @@ class SqliteState(State): # pylint: disable=R0904
639
705
  )
640
706
  if fab_hash:
641
707
  self.query(
642
- query, (run_id, "", "", fab_hash, json.dumps(override_config))
708
+ query,
709
+ (sint64_run_id, "", "", fab_hash, json.dumps(override_config)),
643
710
  )
644
711
  else:
645
712
  self.query(
646
713
  query,
647
- (run_id, fab_id, fab_version, "", json.dumps(override_config)),
714
+ (
715
+ sint64_run_id,
716
+ fab_id,
717
+ fab_version,
718
+ "",
719
+ json.dumps(override_config),
720
+ ),
648
721
  )
649
- return run_id
722
+ # Note: we need to return the uint64 value of the run_id
723
+ return uint64_run_id
650
724
  log(ERROR, "Unexpected run creation failure.")
651
725
  return 0
652
726
 
@@ -705,26 +779,32 @@ class SqliteState(State): # pylint: disable=R0904
705
779
 
706
780
  def get_run(self, run_id: int) -> Optional[Run]:
707
781
  """Retrieve information about the run with the specified `run_id`."""
782
+ # Convert the uint64 value to sint64 for SQLite
783
+ sint64_run_id = convert_uint64_to_sint64(run_id)
708
784
  query = "SELECT * FROM run WHERE run_id = ?;"
709
- try:
710
- row = self.query(query, (run_id,))[0]
785
+ rows = self.query(query, (sint64_run_id,))
786
+ if rows:
787
+ row = rows[0]
711
788
  return Run(
712
- run_id=run_id,
789
+ run_id=convert_sint64_to_uint64(row["run_id"]),
713
790
  fab_id=row["fab_id"],
714
791
  fab_version=row["fab_version"],
715
792
  fab_hash=row["fab_hash"],
716
793
  override_config=json.loads(row["override_config"]),
717
794
  )
718
- except sqlite3.IntegrityError:
719
- log(ERROR, "`run_id` does not exist.")
720
- return None
795
+ log(ERROR, "`run_id` does not exist.")
796
+ return None
721
797
 
722
798
  def acknowledge_ping(self, node_id: int, ping_interval: float) -> bool:
723
799
  """Acknowledge a ping received from a node, serving as a heartbeat."""
800
+ sint64_node_id = convert_uint64_to_sint64(node_id)
801
+
724
802
  # Update `online_until` and `ping_interval` for the given `node_id`
725
803
  query = "UPDATE node SET online_until = ?, ping_interval = ? WHERE node_id = ?;"
726
804
  try:
727
- self.query(query, (time.time() + ping_interval, ping_interval, node_id))
805
+ self.query(
806
+ query, (time.time() + ping_interval, ping_interval, sint64_node_id)
807
+ )
728
808
  return True
729
809
  except sqlite3.IntegrityError:
730
810
  log(ERROR, "`node_id` does not exist.")
@@ -33,8 +33,104 @@ NODE_UNAVAILABLE_ERROR_REASON = (
33
33
 
34
34
 
35
35
  def generate_rand_int_from_bytes(num_bytes: int) -> int:
36
- """Generate a random `num_bytes` integer."""
37
- return int.from_bytes(urandom(num_bytes), "little", signed=True)
36
+ """Generate a random unsigned integer from `num_bytes` bytes."""
37
+ return int.from_bytes(urandom(num_bytes), "little", signed=False)
38
+
39
+
40
+ def convert_uint64_to_sint64(u: int) -> int:
41
+ """Convert a uint64 value to a sint64 value with the same bit sequence.
42
+
43
+ Parameters
44
+ ----------
45
+ u : int
46
+ The unsigned 64-bit integer to convert.
47
+
48
+ Returns
49
+ -------
50
+ int
51
+ The signed 64-bit integer equivalent.
52
+
53
+ The signed 64-bit integer will have the same bit pattern as the
54
+ unsigned 64-bit integer but may have a different decimal value.
55
+
56
+ For numbers within the range [0, `sint64` max value], the decimal
57
+ value remains the same. However, for numbers greater than the `sint64`
58
+ max value, the decimal value will differ due to the wraparound caused
59
+ by the sign bit.
60
+ """
61
+ if u >= (1 << 63):
62
+ return u - (1 << 64)
63
+ return u
64
+
65
+
66
+ def convert_sint64_to_uint64(s: int) -> int:
67
+ """Convert a sint64 value to a uint64 value with the same bit sequence.
68
+
69
+ Parameters
70
+ ----------
71
+ s : int
72
+ The signed 64-bit integer to convert.
73
+
74
+ Returns
75
+ -------
76
+ int
77
+ The unsigned 64-bit integer equivalent.
78
+
79
+ The unsigned 64-bit integer will have the same bit pattern as the
80
+ signed 64-bit integer but may have a different decimal value.
81
+
82
+ For negative `sint64` values, the conversion adds 2^64 to the
83
+ signed value to obtain the equivalent `uint64` value. For non-negative
84
+ `sint64` values, the decimal value remains unchanged in the `uint64`
85
+ representation.
86
+ """
87
+ if s < 0:
88
+ return s + (1 << 64)
89
+ return s
90
+
91
+
92
+ def convert_uint64_values_in_dict_to_sint64(
93
+ data_dict: dict[str, int], keys: list[str]
94
+ ) -> None:
95
+ """Convert uint64 values to sint64 in the given dictionary.
96
+
97
+ Parameters
98
+ ----------
99
+ data_dict : dict[str, int]
100
+ A dictionary where the values are integers to be converted.
101
+ keys : list[str]
102
+ A list of keys in the dictionary whose values need to be converted.
103
+
104
+ Returns
105
+ -------
106
+ None
107
+ This function does not return a value. It modifies `data_dict` in place.
108
+ """
109
+ for key in keys:
110
+ if key in data_dict:
111
+ data_dict[key] = convert_uint64_to_sint64(data_dict[key])
112
+
113
+
114
+ def convert_sint64_values_in_dict_to_uint64(
115
+ data_dict: dict[str, int], keys: list[str]
116
+ ) -> None:
117
+ """Convert sint64 values to uint64 in the given dictionary.
118
+
119
+ Parameters
120
+ ----------
121
+ data_dict : dict[str, int]
122
+ A dictionary where the values are integers to be converted.
123
+ keys : list[str]
124
+ A list of keys in the dictionary whose values need to be converted.
125
+
126
+ Returns
127
+ -------
128
+ None
129
+ This function does not return a value. It modifies `data_dict` in place.
130
+ """
131
+ for key in keys:
132
+ if key in data_dict:
133
+ data_dict[key] = convert_sint64_to_uint64(data_dict[key])
38
134
 
39
135
 
40
136
  def make_node_unavailable_taskres(ref_taskins: TaskIns) -> TaskRes:
@@ -28,8 +28,8 @@ from flwr.common.grpc import create_channel
28
28
  from flwr.common.logger import log
29
29
  from flwr.common.serde import fab_to_proto, user_config_to_proto
30
30
  from flwr.common.typing import Fab, UserConfig
31
- from flwr.proto.driver_pb2 import CreateRunRequest # pylint: disable=E0611
32
31
  from flwr.proto.driver_pb2_grpc import DriverStub
32
+ from flwr.proto.run_pb2 import CreateRunRequest # pylint: disable=E0611
33
33
 
34
34
  from .executor import Executor, RunTracker
35
35
 
@@ -167,6 +167,8 @@ class DeploymentEngine(Executor):
167
167
  # Execute the command
168
168
  proc = subprocess.Popen( # pylint: disable=consider-using-with
169
169
  command,
170
+ stdout=subprocess.PIPE,
171
+ stderr=subprocess.PIPE,
170
172
  text=True,
171
173
  )
172
174
  log(INFO, "Started run %s", str(run_id))
@@ -15,6 +15,10 @@
15
15
  """SuperExec API servicer."""
16
16
 
17
17
 
18
+ import select
19
+ import sys
20
+ import threading
21
+ import time
18
22
  from collections.abc import Generator
19
23
  from logging import ERROR, INFO
20
24
  from typing import Any
@@ -33,6 +37,8 @@ from flwr.proto.exec_pb2 import ( # pylint: disable=E0611
33
37
 
34
38
  from .executor import Executor, RunTracker
35
39
 
40
+ SELECT_TIMEOUT = 1 # Timeout for selecting ready-to-read file descriptors (in seconds)
41
+
36
42
 
37
43
  class ExecServicer(exec_pb2_grpc.ExecServicer):
38
44
  """SuperExec API servicer."""
@@ -59,13 +65,72 @@ class ExecServicer(exec_pb2_grpc.ExecServicer):
59
65
 
60
66
  self.runs[run.run_id] = run
61
67
 
68
+ # Start a background thread to capture the log output
69
+ capture_thread = threading.Thread(
70
+ target=_capture_logs, args=(run,), daemon=True
71
+ )
72
+ capture_thread.start()
73
+
62
74
  return StartRunResponse(run_id=run.run_id)
63
75
 
64
- def StreamLogs(
76
+ def StreamLogs( # pylint: disable=C0103
65
77
  self, request: StreamLogsRequest, context: grpc.ServicerContext
66
78
  ) -> Generator[StreamLogsResponse, Any, None]:
67
79
  """Get logs."""
68
- logs = ["a", "b", "c"]
80
+ log(INFO, "ExecServicer.StreamLogs")
81
+
82
+ # Exit if `run_id` not found
83
+ if request.run_id not in self.runs:
84
+ context.abort(grpc.StatusCode.NOT_FOUND, "Run ID not found")
85
+
86
+ last_sent_index = 0
69
87
  while context.is_active():
70
- for i in range(len(logs)): # pylint: disable=C0200
88
+ # Yield n'th row of logs, if n'th row < len(logs)
89
+ logs = self.runs[request.run_id].logs
90
+ for i in range(last_sent_index, len(logs)):
71
91
  yield StreamLogsResponse(log_output=logs[i])
92
+ last_sent_index = len(logs)
93
+
94
+ # Wait for and continue to yield more log responses only if the
95
+ # run isn't completed yet. If the run is finished, the entire log
96
+ # is returned at this point and the server ends the stream.
97
+ if self.runs[request.run_id].proc.poll() is not None:
98
+ log(INFO, "All logs for run ID `%s` returned", request.run_id)
99
+ context.set_code(grpc.StatusCode.OK)
100
+ context.cancel()
101
+
102
+ time.sleep(1.0) # Sleep briefly to avoid busy waiting
103
+
104
+
105
+ def _capture_logs(
106
+ run: RunTracker,
107
+ ) -> None:
108
+ while True:
109
+ # Explicitly check if Popen.poll() is None. Required for `pytest`.
110
+ if run.proc.poll() is None:
111
+ # Select streams only when ready to read
112
+ ready_to_read, _, _ = select.select(
113
+ [run.proc.stdout, run.proc.stderr],
114
+ [],
115
+ [],
116
+ SELECT_TIMEOUT,
117
+ )
118
+ # Read from std* and append to RunTracker.logs
119
+ for stream in ready_to_read:
120
+ # Flush stdout to view output in real time
121
+ readline = stream.readline()
122
+ sys.stdout.write(readline)
123
+ sys.stdout.flush()
124
+ # Append to logs
125
+ line = readline.rstrip()
126
+ if line:
127
+ run.logs.append(f"{line}")
128
+
129
+ # Close std* to prevent blocking
130
+ elif run.proc.poll() is not None:
131
+ log(INFO, "Subprocess finished, exiting log capture")
132
+ if run.proc.stdout:
133
+ run.proc.stdout.close()
134
+ if run.proc.stderr:
135
+ run.proc.stderr.close()
136
+ break
@@ -15,7 +15,7 @@
15
15
  """Execute and monitor a Flower run."""
16
16
 
17
17
  from abc import ABC, abstractmethod
18
- from dataclasses import dataclass
18
+ from dataclasses import dataclass, field
19
19
  from subprocess import Popen
20
20
  from typing import Optional
21
21
 
@@ -28,6 +28,7 @@ class RunTracker:
28
28
 
29
29
  run_id: int
30
30
  proc: Popen # type: ignore
31
+ logs: list[str] = field(default_factory=list)
31
32
 
32
33
 
33
34
  class Executor(ABC):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: flwr-nightly
3
- Version: 1.12.0.dev20240917
3
+ Version: 1.12.0.dev20240919
4
4
  Summary: Flower: A Friendly Federated Learning Framework
5
5
  Home-page: https://flower.ai
6
6
  License: Apache-2.0
@@ -6,7 +6,7 @@ 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
8
  flwr/cli/new/__init__.py,sha256=cQzK1WH4JP2awef1t2UQ2xjl1agVEz9rwutV18SWV1k,789
9
- flwr/cli/new/new.py,sha256=FvSxGIDsnO7w5Rtq6-Zz3PzD_tkSthNGvYOHeYRcCeI,9570
9
+ flwr/cli/new/new.py,sha256=wpHBmHOq6X04CPwJDaEgu3H5_MsfoEYsYsv3E-EDhzM,9558
10
10
  flwr/cli/new/templates/__init__.py,sha256=4luU8RL-CK8JJCstQ_ON809W9bNTkY1l9zSaPKBkgwY,725
11
11
  flwr/cli/new/templates/app/.gitignore.tpl,sha256=XixnHdyeMB2vwkGtGnwHqoWpH-9WChdyG0GXe57duhc,3078
12
12
  flwr/cli/new/templates/app/LICENSE.tpl,sha256=WNHhf_5RCaeuKWyq_K39vmp9F28LxKsB4SpomwSZ2L0,11357
@@ -49,7 +49,7 @@ flwr/cli/new/templates/app/code/task.pytorch.py.tpl,sha256=NgbPix74X1t3ybaGjqdls
49
49
  flwr/cli/new/templates/app/code/task.tensorflow.py.tpl,sha256=SKXAZdgBnPpbAbJ90Rb7oQ5ilnopBx_j_JNFoUDeEAI,1732
50
50
  flwr/cli/new/templates/app/code/utils.baseline.py.tpl,sha256=YkHAgppUeD2BnBoGfVB6dEvBfjuIPGsU1gw4CiUi3qA,40
51
51
  flwr/cli/new/templates/app/pyproject.baseline.toml.tpl,sha256=4gi90W9_B1kj6rYkpvVJxhNX9Yctsv9OH6CzXP-dcE4,2666
52
- flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl,sha256=-tW_nwHQCK5JIRI4Cpb0yDVHJO0RUAEOTqCtWJoGHIQ,1827
52
+ flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl,sha256=bYdDP0O8z741pvy1INnH4UBuP-KFvcyQt6Yo81n4frQ,1853
53
53
  flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl,sha256=CHJgkPNkJfzJhEbTe15uiV3AhOtIddQi-yofPZsCk3E,1143
54
54
  flwr/cli/new/templates/app/pyproject.jax.toml.tpl,sha256=Tq6jeGcoOKzMwWWYxMVnzMcipLURHLiW69iYlD1ywMg,659
55
55
  flwr/cli/new/templates/app/pyproject.mlx.toml.tpl,sha256=SHwYAA2qgIlOAU3Sb9BKSZcZ7O9biACg27MHexXUtDw,741
@@ -135,7 +135,7 @@ flwr/common/telemetry.py,sha256=PvdlipCPYciqEgmXRwQ1HklP1uyECcNqt9HTBzthmAg,8904
135
135
  flwr/common/typing.py,sha256=ZVviEABqDeGCyo_yM9ft8EbIGA9RaLOeoNHmMnTkmUo,4985
136
136
  flwr/common/version.py,sha256=tCcl_FvxVK206C1dxIJCs4TjL06WmyaODBP19FRHE1c,1324
137
137
  flwr/proto/__init__.py,sha256=hbY7JYakwZwCkYgCNlmHdc8rtvfoJbAZLalMdc--CGc,683
138
- flwr/proto/clientappio_pb2.py,sha256=3qT-IbcGPFGh9WKpa9ZRKCYzUtwrDf-ziEY9uBhd_gU,3703
138
+ flwr/proto/clientappio_pb2.py,sha256=Y3PMv-JMaBGehpslgbvGY6l2u5vNpfCTFWu-fmAmBJ4,3703
139
139
  flwr/proto/clientappio_pb2.pyi,sha256=iL6pOPmnot5wP3aXGiDfiUpp-eJIkysyju0ebPehS8Y,5670
140
140
  flwr/proto/clientappio_pb2_grpc.py,sha256=G35GhZ3iEOL8N6tu7Kn_ip4QUx4O2HveXngHAuU2YEM,6112
141
141
  flwr/proto/clientappio_pb2_grpc.pyi,sha256=cybktpMPaIMwrItd8hQaQDnRv4zNu_wgRddSqR9REyI,1822
@@ -143,15 +143,19 @@ flwr/proto/common_pb2.py,sha256=uzSmq0FJdC-MriN9UGPFs7QVIFTKJmX5lyLnzcyZ5WE,2405
143
143
  flwr/proto/common_pb2.pyi,sha256=0ylFO7G79qqLuRg9IQUCBdgyIIFv4m8VzrfoWad4xXU,5394
144
144
  flwr/proto/common_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
145
145
  flwr/proto/common_pb2_grpc.pyi,sha256=ff2TSiLVnG6IVQcTGzb2DIH3XRSoAvAo_RMcvbMFyc0,76
146
- flwr/proto/driver_pb2.py,sha256=Zeh0qvAdcKED8fxHDai67mgDq0iFR0b87C8BbOemvi8,4299
147
- flwr/proto/driver_pb2.pyi,sha256=apvTyy7N0SV3H8mueOwgB8aDETtxb6ZuKB1g1nMmJ4o,6390
148
- flwr/proto/driver_pb2_grpc.py,sha256=ZNDFyPfEZt5L3eFqJRwAE_ylwWLTNf1hfXzUGkVpzTI,10462
149
- flwr/proto/driver_pb2_grpc.pyi,sha256=_SLFI7AvJv5JU_7axipERF4oTspRh3bzZswLiKDtV1E,2812
146
+ flwr/proto/control_pb2.py,sha256=qsikYLoAye2IFtPzEd5oPTSEhF09ZkA6VjnCEDh2o7Y,1214
147
+ flwr/proto/control_pb2.pyi,sha256=XbFvpZvvrS7QcH5AFXfpRGl4hQvhd3QdKO6x0oTlCCU,165
148
+ flwr/proto/control_pb2_grpc.py,sha256=7ou_lfyACrKJ7YhfU8Da87tgd71NH8C2ExSDbYeXNNw,2511
149
+ flwr/proto/control_pb2_grpc.pyi,sha256=2_EKunqhcdwXLDOGbOwFZxpIEpdOW1EFvY-r9MUgUSc,766
150
+ flwr/proto/driver_pb2.py,sha256=Z2fRF9mBa0cR0p6cItgyp5Q70WUAsh--kPEq8aIJuZk,3176
151
+ flwr/proto/driver_pb2.pyi,sha256=jUOe6tHWQhddVbB3xtnNvlrztNUcxRHHJS7-LqGO_70,4034
152
+ flwr/proto/driver_pb2_grpc.py,sha256=SGNmNcpsSWRc0jjNyH0xYNB8a7DAxIsXaL9a0M78vZw,10444
153
+ flwr/proto/driver_pb2_grpc.pyi,sha256=wTVkRgVUNq2Jnzo5yhIIqGFiLN_VRB1zpjfqRLD5QnM,2800
150
154
  flwr/proto/error_pb2.py,sha256=LarjKL90LbwkXKlhzNrDssgl4DXcvIPve8NVCXHpsKA,1084
151
155
  flwr/proto/error_pb2.pyi,sha256=ZNH4HhJTU_KfMXlyCeg8FwU-fcUYxTqEmoJPtWtHikc,734
152
156
  flwr/proto/error_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
153
157
  flwr/proto/error_pb2_grpc.pyi,sha256=ff2TSiLVnG6IVQcTGzb2DIH3XRSoAvAo_RMcvbMFyc0,76
154
- flwr/proto/exec_pb2.py,sha256=iqAvJ03atrueo5duiRHD_peegJiLsrWuNnVU8lA2PXw,3231
158
+ flwr/proto/exec_pb2.py,sha256=GH_VWC-BZwWmeWdmjP4IkXvwR8yY1uBZNNwKru-ZZL4,3231
155
159
  flwr/proto/exec_pb2.pyi,sha256=5y6L3xFkAuCfLTn2pVIHQAlXp17YcTTq8WVDS7_MPl4,4273
156
160
  flwr/proto/exec_pb2_grpc.py,sha256=faAN19XEMP8GTKrcIU6jvlWkN44n2KiUsZh_OG0sYcg,4072
157
161
  flwr/proto/exec_pb2_grpc.pyi,sha256=VrFhT1Um3Nb8UC2YqnR9GIiM-Yyx0FqaxVOWljh-G_w,1208
@@ -167,11 +171,11 @@ flwr/proto/grpcadapter_pb2.py,sha256=bb8mW09XzNCpMdr1KuYQkefPFWR8lc8y1uL6Uk0TtsM
167
171
  flwr/proto/grpcadapter_pb2.pyi,sha256=AR77gDsF6f8zqSIQp3877DUd7S8lP95lFak5Ir_WPkw,1716
168
172
  flwr/proto/grpcadapter_pb2_grpc.py,sha256=rRNuNES5nBugUZWfeA8oAy8dMHgzqU_PF1srTseo3b8,2634
169
173
  flwr/proto/grpcadapter_pb2_grpc.pyi,sha256=AgA9Qo_lnANb9SNuPzbZGAxupau-xcqYawZz6vqf-24,735
170
- flwr/proto/message_pb2.py,sha256=6fiapmq94u3T9wqW7tGsWVuyLanW31VAg0-rD2Hfk8U,3151
174
+ flwr/proto/message_pb2.py,sha256=GW0ID-d2pvtgylsKxtINQx_oORgNGel3WJ3ybZcXxtI,3151
171
175
  flwr/proto/message_pb2.pyi,sha256=_J9NjZa7Pr-kSO7-GGOL5EvIXQx5mQD04iVIvnVHBMU,5617
172
176
  flwr/proto/message_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
173
177
  flwr/proto/message_pb2_grpc.pyi,sha256=ff2TSiLVnG6IVQcTGzb2DIH3XRSoAvAo_RMcvbMFyc0,76
174
- flwr/proto/node_pb2.py,sha256=1zfXEvgGObglIcaVb4SLFmOcHZvA8eHzEtMFM5A6FYY,1081
178
+ flwr/proto/node_pb2.py,sha256=qrxEpf7Up9XhigP8g9cIHVhmpdKmYpxMdlO67H0xjEM,1081
175
179
  flwr/proto/node_pb2.pyi,sha256=aX3BHhgXvJE1rvcRnEE_gB-5GcaFQ0SJ88yTE223bjI,751
176
180
  flwr/proto/node_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
177
181
  flwr/proto/node_pb2_grpc.pyi,sha256=ff2TSiLVnG6IVQcTGzb2DIH3XRSoAvAo_RMcvbMFyc0,76
@@ -179,11 +183,11 @@ flwr/proto/recordset_pb2.py,sha256=un8L0kvBcgFXQIiQweOseeIJBjlOozUvQY9uTQ42Dqo,6
179
183
  flwr/proto/recordset_pb2.pyi,sha256=NPzCJWAj1xLWzeZ_xZ6uaObQjQfWGnnqlLtn4J-SoFY,14161
180
184
  flwr/proto/recordset_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
181
185
  flwr/proto/recordset_pb2_grpc.pyi,sha256=ff2TSiLVnG6IVQcTGzb2DIH3XRSoAvAo_RMcvbMFyc0,76
182
- flwr/proto/run_pb2.py,sha256=Fs2HlEgOFDm9-No40K8GE2o_4aTRXZrxa_jTeYPz9l4,2102
183
- flwr/proto/run_pb2.pyi,sha256=oIaKIjgyjnifossFMTSqQISEMb1IJYhSYGQYcAGBIS4,3063
186
+ flwr/proto/run_pb2.py,sha256=bzgJZq9xXEWviJAb_SGNZKbH4QLI51SRE11pejhV2yU,3206
187
+ flwr/proto/run_pb2.pyi,sha256=oBRYDJwfJ8CWLRGDkPT3CinPWNYIZIHzpjwkIdjbH5A,5404
184
188
  flwr/proto/run_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
185
189
  flwr/proto/run_pb2_grpc.pyi,sha256=ff2TSiLVnG6IVQcTGzb2DIH3XRSoAvAo_RMcvbMFyc0,76
186
- flwr/proto/task_pb2.py,sha256=xuXMmfPAWd7lhyyqhGrmjsfn_j_s5HRz21vMXtxziNE,2361
190
+ flwr/proto/task_pb2.py,sha256=R5GfHgL8IJRI_qHWNeILl1Y9zHjvB0tnCvMHmTgF4Is,2361
187
191
  flwr/proto/task_pb2.pyi,sha256=KJVsLm-THY5QjHreHDm_-OS1tyZyD61mx6BzOpoeMjw,4320
188
192
  flwr/proto/task_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
189
193
  flwr/proto/task_pb2_grpc.pyi,sha256=ff2TSiLVnG6IVQcTGzb2DIH3XRSoAvAo_RMcvbMFyc0,76
@@ -207,7 +211,7 @@ flwr/server/driver/driver.py,sha256=rGLbOfLhBOn74mUHi_0CMbXqZLX8q_lXqEkcUXoL_wI,
207
211
  flwr/server/driver/grpc_driver.py,sha256=xd1mxRexeiIJrZw9l-urj2zEIncLT8KtNn0l8hIDYZs,9681
208
212
  flwr/server/driver/inmemory_driver.py,sha256=up5L2ux9l0pEUZO3hh8p5LufXntGL95IA4E3e7WsxqY,6465
209
213
  flwr/server/history.py,sha256=qSb5_pPTrwofpSYGsZWzMPkl_4uJ4mJFWesxXDrEvDU,5026
210
- flwr/server/run_serverapp.py,sha256=ASpwKHNlxpDfBe6UPotxkaifXZyKS9ZIrdwtTGLCt3k,10534
214
+ flwr/server/run_serverapp.py,sha256=SaE9hoWLCAPnRXvdAzE4Oi3QaiC8NOTrHxrIGXjgYxU,10531
211
215
  flwr/server/server.py,sha256=1ZsFEptmAV-L2vP2etNC9Ed5CLSxpuKzUFkAPQ4l5Xc,17893
212
216
  flwr/server/server_app.py,sha256=1hul76ospG8L_KooK_ewn1sWPNTNYLTtZMeGNOBNruA,6267
213
217
  flwr/server/server_config.py,sha256=CZaHVAsMvGLjpWVcLPkiYxgJN4xfIyAiUrCI3fETKY4,1349
@@ -239,7 +243,7 @@ flwr/server/strategy/strategy.py,sha256=cXapkD5uDrt5C-RbmWDn9FLoap3Q41i7GKvbmfbC
239
243
  flwr/server/superlink/__init__.py,sha256=8tHYCfodUlRD8PCP9fHgvu8cz5N31A2QoRVL0jDJ15E,707
240
244
  flwr/server/superlink/driver/__init__.py,sha256=_JaRW-FdyikHc7souUrnk3mwTGViraEJCeUBY_M_ocs,712
241
245
  flwr/server/superlink/driver/driver_grpc.py,sha256=ej9T21zIquIJEZyWcvapQSQFckh4oFPamOe6P6DhB2s,2048
242
- flwr/server/superlink/driver/driver_servicer.py,sha256=ofxSlotqz1hhvv9Cww2eWoDS5Jpvavge4AtKxTElJNY,6967
246
+ flwr/server/superlink/driver/driver_servicer.py,sha256=x8L8rIO6r7kVdmWZFJp-xmTB0K_Tz1mh-7Akc6I_ZjY,6967
243
247
  flwr/server/superlink/ffs/__init__.py,sha256=FAY-zShcfPmOxosok2QyT6hTNMNctG8cH9s_nIl8jkI,840
244
248
  flwr/server/superlink/ffs/disk_ffs.py,sha256=yCN6CCzegnJIOaHr5nIu49wZQa4g5BByiSKshz50RKU,3296
245
249
  flwr/server/superlink/ffs/ffs.py,sha256=qLI1UfosJugu2BKOJWqHIhafTm-YiuKqGf3OGWPH0NM,2395
@@ -266,10 +270,10 @@ flwr/server/superlink/fleet/vce/backend/raybackend.py,sha256=7kB3re3mR53b7E6L6DP
266
270
  flwr/server/superlink/fleet/vce/vce_api.py,sha256=cGPsjS_4SJHm8jszGjsHh8ZNk9nqWoIQwW_62yKKR1Y,12647
267
271
  flwr/server/superlink/state/__init__.py,sha256=Gj2OTFLXvA-mAjBvwuKDM3rDrVaQPcIoybSa2uskMTE,1003
268
272
  flwr/server/superlink/state/in_memory_state.py,sha256=DvPSyK-ITZI9XfW-1M0bljLa6Sj0JIUeHFbg5tKKc2s,13142
269
- flwr/server/superlink/state/sqlite_state.py,sha256=jNL5cv_PkkgNctGeOmkCBkVPotyypiyjGN7oNfp1wpg,29398
273
+ flwr/server/superlink/state/sqlite_state.py,sha256=GNSBin45-ZgLXNdDSoaPvU6Nem_dUwjarpjIAlkYHdM,32132
270
274
  flwr/server/superlink/state/state.py,sha256=KpM894R8RE1N0b-s_Nlii6i0TDxj0DRkKa3Vf24Gt70,8127
271
275
  flwr/server/superlink/state/state_factory.py,sha256=Fo8pBQ1WWrVJK5TOEPZ_zgJE69_mfTGjTO6czh6571o,2021
272
- flwr/server/superlink/state/utils.py,sha256=155ngcaSePy7nD8X4LHgpuVok6fcH5_CPNRiFAbLWDA,2407
276
+ flwr/server/superlink/state/utils.py,sha256=OsF3OOoU4bU4PgLWkypX6EDoFs0L8RP_mHEBG-tVqGA,5227
273
277
  flwr/server/typing.py,sha256=5kaRLZuxTEse9A0g7aVna2VhYxU3wTq1f3d3mtw7kXs,1019
274
278
  flwr/server/utils/__init__.py,sha256=pltsPHJoXmUIr3utjwwYxu7_ZAGy5u4MVHzv9iA5Un8,908
275
279
  flwr/server/utils/tensorboard.py,sha256=gEBD8w_5uaIfp5aw5RYH66lYZpd_SfkObHQ7eDd9MUk,5466
@@ -289,13 +293,13 @@ flwr/simulation/ray_transport/utils.py,sha256=TYdtfg1P9VfTdLMOJlifInGpxWHYs9UfUq
289
293
  flwr/simulation/run_simulation.py,sha256=AN62VEoJhqe88VmkJ5dlJPVcDhUXGBaMKo4KjHqUu_8,22744
290
294
  flwr/superexec/__init__.py,sha256=fcj366jh4RFby_vDwLroU4kepzqbnJgseZD_jUr_Mko,715
291
295
  flwr/superexec/app.py,sha256=mKwlsysbtmGPuz4CpWAPDPWAEFZH3b8u0JKRkWpfzuw,6552
292
- flwr/superexec/deployment.py,sha256=sNb-sYdCDkVEALSbC_eBNIulieHwpg7HzgmDIp4wT9o,6267
296
+ flwr/superexec/deployment.py,sha256=TbzOAAaY2sNt7O516w1GS6N5xvt0UV-dML74O6WA2O4,6344
293
297
  flwr/superexec/exec_grpc.py,sha256=ZPq7EP55Vwj0kRcLVuTCokFqfIgBk-7YmDykZoMKi-c,1935
294
- flwr/superexec/exec_servicer.py,sha256=P4bJtQqCr0NiVIa-ss9lvdUM1SbM_ip5g5UqKp3dNL4,2344
295
- flwr/superexec/executor.py,sha256=k_adivto6R2U82DADOHNvdtobehBYreRek1gOEBIQnQ,2318
298
+ flwr/superexec/exec_servicer.py,sha256=TRpwPVl7eI0Y_xlCY6DmVpAo0yFU1gLwzyIeqFw9pyk,4746
299
+ flwr/superexec/executor.py,sha256=-5J-ZLs-uArro3T2pCq0YQRC65cs18M888nufzdYE4E,2375
296
300
  flwr/superexec/simulation.py,sha256=J6pw-RqCSiUed8I_3MasZH4tl57ZmDebPAHNnbb0-vE,7420
297
- flwr_nightly-1.12.0.dev20240917.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
298
- flwr_nightly-1.12.0.dev20240917.dist-info/METADATA,sha256=OkGAAowGmaur_4Fz28Ni91lGncc3-Xq8A6gTGnRg8Jg,15452
299
- flwr_nightly-1.12.0.dev20240917.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
300
- flwr_nightly-1.12.0.dev20240917.dist-info/entry_points.txt,sha256=WUCbqhLEOzjx_lyATIM0-f0e8kOVaQjzwOvyOxHrMhs,434
301
- flwr_nightly-1.12.0.dev20240917.dist-info/RECORD,,
301
+ flwr_nightly-1.12.0.dev20240919.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
302
+ flwr_nightly-1.12.0.dev20240919.dist-info/METADATA,sha256=emQXCFq14TLzQuX1biZ5scBeUejF0hm9cpuiZyAvCk4,15452
303
+ flwr_nightly-1.12.0.dev20240919.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
304
+ flwr_nightly-1.12.0.dev20240919.dist-info/entry_points.txt,sha256=WUCbqhLEOzjx_lyATIM0-f0e8kOVaQjzwOvyOxHrMhs,434
305
+ flwr_nightly-1.12.0.dev20240919.dist-info/RECORD,,