flwr-nightly 1.21.0.dev20250809__py3-none-any.whl → 1.21.0.dev20250812__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.
flwr/common/constant.py CHANGED
@@ -265,6 +265,8 @@ class ExecPluginType:
265
265
  """SuperExec plugin types."""
266
266
 
267
267
  CLIENT_APP = "clientapp"
268
+ SERVER_APP = "serverapp"
269
+ SIMULATION = "simulation"
268
270
 
269
271
  def __new__(cls) -> ExecPluginType:
270
272
  """Prevent instantiation."""
@@ -17,23 +17,16 @@ from flwr.proto import log_pb2 as flwr_dot_proto_dot_log__pb2
17
17
  from flwr.proto import message_pb2 as flwr_dot_proto_dot_message__pb2
18
18
  from flwr.proto import run_pb2 as flwr_dot_proto_dot_run__pb2
19
19
  from flwr.proto import fab_pb2 as flwr_dot_proto_dot_fab__pb2
20
+ from flwr.proto import appio_pb2 as flwr_dot_proto_dot_appio__pb2
20
21
 
21
22
 
22
- DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1d\x66lwr/proto/simulationio.proto\x12\nflwr.proto\x1a\x1a\x66lwr/proto/heartbeat.proto\x1a\x14\x66lwr/proto/log.proto\x1a\x18\x66lwr/proto/message.proto\x1a\x14\x66lwr/proto/run.proto\x1a\x14\x66lwr/proto/fab.proto\"\x1d\n\x1bPullSimulationInputsRequest\"\x80\x01\n\x1cPullSimulationInputsResponse\x12$\n\x07\x63ontext\x18\x01 \x01(\x0b\x32\x13.flwr.proto.Context\x12\x1c\n\x03run\x18\x02 \x01(\x0b\x32\x0f.flwr.proto.Run\x12\x1c\n\x03\x66\x61\x62\x18\x03 \x01(\x0b\x32\x0f.flwr.proto.Fab\"T\n\x1cPushSimulationOutputsRequest\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\x12$\n\x07\x63ontext\x18\x02 \x01(\x0b\x32\x13.flwr.proto.Context\"\x1f\n\x1dPushSimulationOutputsResponse2\xb5\x05\n\x0cSimulationIo\x12k\n\x14PullSimulationInputs\x12\'.flwr.proto.PullSimulationInputsRequest\x1a(.flwr.proto.PullSimulationInputsResponse\"\x00\x12n\n\x15PushSimulationOutputs\x12(.flwr.proto.PushSimulationOutputsRequest\x1a).flwr.proto.PushSimulationOutputsResponse\"\x00\x12\\\n\x0fUpdateRunStatus\x12\".flwr.proto.UpdateRunStatusRequest\x1a#.flwr.proto.UpdateRunStatusResponse\"\x00\x12G\n\x08PushLogs\x12\x1b.flwr.proto.PushLogsRequest\x1a\x1c.flwr.proto.PushLogsResponse\"\x00\x12k\n\x14GetFederationOptions\x12\'.flwr.proto.GetFederationOptionsRequest\x1a(.flwr.proto.GetFederationOptionsResponse\"\x00\x12S\n\x0cGetRunStatus\x12\x1f.flwr.proto.GetRunStatusRequest\x1a .flwr.proto.GetRunStatusResponse\"\x00\x12_\n\x10SendAppHeartbeat\x12#.flwr.proto.SendAppHeartbeatRequest\x1a$.flwr.proto.SendAppHeartbeatResponse\"\x00\x62\x06proto3')
23
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1d\x66lwr/proto/simulationio.proto\x12\nflwr.proto\x1a\x1a\x66lwr/proto/heartbeat.proto\x1a\x14\x66lwr/proto/log.proto\x1a\x18\x66lwr/proto/message.proto\x1a\x14\x66lwr/proto/run.proto\x1a\x14\x66lwr/proto/fab.proto\x1a\x16\x66lwr/proto/appio.proto2\xc1\x06\n\x0cSimulationIo\x12_\n\x10ListAppsToLaunch\x12#.flwr.proto.ListAppsToLaunchRequest\x1a$.flwr.proto.ListAppsToLaunchResponse\"\x00\x12S\n\x0cRequestToken\x12\x1f.flwr.proto.RequestTokenRequest\x1a .flwr.proto.RequestTokenResponse\"\x00\x12V\n\rPullAppInputs\x12 .flwr.proto.PullAppInputsRequest\x1a!.flwr.proto.PullAppInputsResponse\"\x00\x12Y\n\x0ePushAppOutputs\x12!.flwr.proto.PushAppOutputsRequest\x1a\".flwr.proto.PushAppOutputsResponse\"\x00\x12\\\n\x0fUpdateRunStatus\x12\".flwr.proto.UpdateRunStatusRequest\x1a#.flwr.proto.UpdateRunStatusResponse\"\x00\x12G\n\x08PushLogs\x12\x1b.flwr.proto.PushLogsRequest\x1a\x1c.flwr.proto.PushLogsResponse\"\x00\x12k\n\x14GetFederationOptions\x12\'.flwr.proto.GetFederationOptionsRequest\x1a(.flwr.proto.GetFederationOptionsResponse\"\x00\x12S\n\x0cGetRunStatus\x12\x1f.flwr.proto.GetRunStatusRequest\x1a .flwr.proto.GetRunStatusResponse\"\x00\x12_\n\x10SendAppHeartbeat\x12#.flwr.proto.SendAppHeartbeatRequest\x1a$.flwr.proto.SendAppHeartbeatResponse\"\x00\x62\x06proto3')
23
24
 
24
25
  _globals = globals()
25
26
  _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
26
27
  _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'flwr.proto.simulationio_pb2', _globals)
27
28
  if _descriptor._USE_C_DESCRIPTORS == False:
28
29
  DESCRIPTOR._options = None
29
- _globals['_PULLSIMULATIONINPUTSREQUEST']._serialized_start=165
30
- _globals['_PULLSIMULATIONINPUTSREQUEST']._serialized_end=194
31
- _globals['_PULLSIMULATIONINPUTSRESPONSE']._serialized_start=197
32
- _globals['_PULLSIMULATIONINPUTSRESPONSE']._serialized_end=325
33
- _globals['_PUSHSIMULATIONOUTPUTSREQUEST']._serialized_start=327
34
- _globals['_PUSHSIMULATIONOUTPUTSREQUEST']._serialized_end=411
35
- _globals['_PUSHSIMULATIONOUTPUTSRESPONSE']._serialized_start=413
36
- _globals['_PUSHSIMULATIONOUTPUTSRESPONSE']._serialized_end=444
37
- _globals['_SIMULATIONIO']._serialized_start=447
38
- _globals['_SIMULATIONIO']._serialized_end=1140
30
+ _globals['_SIMULATIONIO']._serialized_start=190
31
+ _globals['_SIMULATIONIO']._serialized_end=1023
39
32
  # @@protoc_insertion_point(module_scope)
@@ -2,64 +2,6 @@
2
2
  @generated by mypy-protobuf. Do not edit manually!
3
3
  isort:skip_file
4
4
  """
5
- import builtins
6
- import flwr.proto.fab_pb2
7
- import flwr.proto.message_pb2
8
- import flwr.proto.run_pb2
9
5
  import google.protobuf.descriptor
10
- import google.protobuf.message
11
- import typing
12
- import typing_extensions
13
6
 
14
7
  DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
15
-
16
- class PullSimulationInputsRequest(google.protobuf.message.Message):
17
- """PullSimulationInputs messages"""
18
- DESCRIPTOR: google.protobuf.descriptor.Descriptor
19
- def __init__(self,
20
- ) -> None: ...
21
- global___PullSimulationInputsRequest = PullSimulationInputsRequest
22
-
23
- class PullSimulationInputsResponse(google.protobuf.message.Message):
24
- DESCRIPTOR: google.protobuf.descriptor.Descriptor
25
- CONTEXT_FIELD_NUMBER: builtins.int
26
- RUN_FIELD_NUMBER: builtins.int
27
- FAB_FIELD_NUMBER: builtins.int
28
- @property
29
- def context(self) -> flwr.proto.message_pb2.Context: ...
30
- @property
31
- def run(self) -> flwr.proto.run_pb2.Run: ...
32
- @property
33
- def fab(self) -> flwr.proto.fab_pb2.Fab: ...
34
- def __init__(self,
35
- *,
36
- context: typing.Optional[flwr.proto.message_pb2.Context] = ...,
37
- run: typing.Optional[flwr.proto.run_pb2.Run] = ...,
38
- fab: typing.Optional[flwr.proto.fab_pb2.Fab] = ...,
39
- ) -> None: ...
40
- def HasField(self, field_name: typing_extensions.Literal["context",b"context","fab",b"fab","run",b"run"]) -> builtins.bool: ...
41
- def ClearField(self, field_name: typing_extensions.Literal["context",b"context","fab",b"fab","run",b"run"]) -> None: ...
42
- global___PullSimulationInputsResponse = PullSimulationInputsResponse
43
-
44
- class PushSimulationOutputsRequest(google.protobuf.message.Message):
45
- """PushSimulationOutputs messages"""
46
- DESCRIPTOR: google.protobuf.descriptor.Descriptor
47
- RUN_ID_FIELD_NUMBER: builtins.int
48
- CONTEXT_FIELD_NUMBER: builtins.int
49
- run_id: builtins.int
50
- @property
51
- def context(self) -> flwr.proto.message_pb2.Context: ...
52
- def __init__(self,
53
- *,
54
- run_id: builtins.int = ...,
55
- context: typing.Optional[flwr.proto.message_pb2.Context] = ...,
56
- ) -> None: ...
57
- def HasField(self, field_name: typing_extensions.Literal["context",b"context"]) -> builtins.bool: ...
58
- def ClearField(self, field_name: typing_extensions.Literal["context",b"context","run_id",b"run_id"]) -> None: ...
59
- global___PushSimulationOutputsRequest = PushSimulationOutputsRequest
60
-
61
- class PushSimulationOutputsResponse(google.protobuf.message.Message):
62
- DESCRIPTOR: google.protobuf.descriptor.Descriptor
63
- def __init__(self,
64
- ) -> None: ...
65
- global___PushSimulationOutputsResponse = PushSimulationOutputsResponse
@@ -2,10 +2,10 @@
2
2
  """Client and server classes corresponding to protobuf-defined services."""
3
3
  import grpc
4
4
 
5
+ from flwr.proto import appio_pb2 as flwr_dot_proto_dot_appio__pb2
5
6
  from flwr.proto import heartbeat_pb2 as flwr_dot_proto_dot_heartbeat__pb2
6
7
  from flwr.proto import log_pb2 as flwr_dot_proto_dot_log__pb2
7
8
  from flwr.proto import run_pb2 as flwr_dot_proto_dot_run__pb2
8
- from flwr.proto import simulationio_pb2 as flwr_dot_proto_dot_simulationio__pb2
9
9
 
10
10
 
11
11
  class SimulationIoStub(object):
@@ -17,15 +17,25 @@ class SimulationIoStub(object):
17
17
  Args:
18
18
  channel: A grpc.Channel.
19
19
  """
20
- self.PullSimulationInputs = channel.unary_unary(
21
- '/flwr.proto.SimulationIo/PullSimulationInputs',
22
- request_serializer=flwr_dot_proto_dot_simulationio__pb2.PullSimulationInputsRequest.SerializeToString,
23
- response_deserializer=flwr_dot_proto_dot_simulationio__pb2.PullSimulationInputsResponse.FromString,
20
+ self.ListAppsToLaunch = channel.unary_unary(
21
+ '/flwr.proto.SimulationIo/ListAppsToLaunch',
22
+ request_serializer=flwr_dot_proto_dot_appio__pb2.ListAppsToLaunchRequest.SerializeToString,
23
+ response_deserializer=flwr_dot_proto_dot_appio__pb2.ListAppsToLaunchResponse.FromString,
24
24
  )
25
- self.PushSimulationOutputs = channel.unary_unary(
26
- '/flwr.proto.SimulationIo/PushSimulationOutputs',
27
- request_serializer=flwr_dot_proto_dot_simulationio__pb2.PushSimulationOutputsRequest.SerializeToString,
28
- response_deserializer=flwr_dot_proto_dot_simulationio__pb2.PushSimulationOutputsResponse.FromString,
25
+ self.RequestToken = channel.unary_unary(
26
+ '/flwr.proto.SimulationIo/RequestToken',
27
+ request_serializer=flwr_dot_proto_dot_appio__pb2.RequestTokenRequest.SerializeToString,
28
+ response_deserializer=flwr_dot_proto_dot_appio__pb2.RequestTokenResponse.FromString,
29
+ )
30
+ self.PullAppInputs = channel.unary_unary(
31
+ '/flwr.proto.SimulationIo/PullAppInputs',
32
+ request_serializer=flwr_dot_proto_dot_appio__pb2.PullAppInputsRequest.SerializeToString,
33
+ response_deserializer=flwr_dot_proto_dot_appio__pb2.PullAppInputsResponse.FromString,
34
+ )
35
+ self.PushAppOutputs = channel.unary_unary(
36
+ '/flwr.proto.SimulationIo/PushAppOutputs',
37
+ request_serializer=flwr_dot_proto_dot_appio__pb2.PushAppOutputsRequest.SerializeToString,
38
+ response_deserializer=flwr_dot_proto_dot_appio__pb2.PushAppOutputsResponse.FromString,
29
39
  )
30
40
  self.UpdateRunStatus = channel.unary_unary(
31
41
  '/flwr.proto.SimulationIo/UpdateRunStatus',
@@ -57,14 +67,28 @@ class SimulationIoStub(object):
57
67
  class SimulationIoServicer(object):
58
68
  """Missing associated documentation comment in .proto file."""
59
69
 
60
- def PullSimulationInputs(self, request, context):
70
+ def ListAppsToLaunch(self, request, context):
71
+ """List runs to launch
72
+ """
73
+ context.set_code(grpc.StatusCode.UNIMPLEMENTED)
74
+ context.set_details('Method not implemented!')
75
+ raise NotImplementedError('Method not implemented!')
76
+
77
+ def RequestToken(self, request, context):
78
+ """Request token for a run
79
+ """
80
+ context.set_code(grpc.StatusCode.UNIMPLEMENTED)
81
+ context.set_details('Method not implemented!')
82
+ raise NotImplementedError('Method not implemented!')
83
+
84
+ def PullAppInputs(self, request, context):
61
85
  """Pull Simulation inputs
62
86
  """
63
87
  context.set_code(grpc.StatusCode.UNIMPLEMENTED)
64
88
  context.set_details('Method not implemented!')
65
89
  raise NotImplementedError('Method not implemented!')
66
90
 
67
- def PushSimulationOutputs(self, request, context):
91
+ def PushAppOutputs(self, request, context):
68
92
  """Push Simulation outputs
69
93
  """
70
94
  context.set_code(grpc.StatusCode.UNIMPLEMENTED)
@@ -109,15 +133,25 @@ class SimulationIoServicer(object):
109
133
 
110
134
  def add_SimulationIoServicer_to_server(servicer, server):
111
135
  rpc_method_handlers = {
112
- 'PullSimulationInputs': grpc.unary_unary_rpc_method_handler(
113
- servicer.PullSimulationInputs,
114
- request_deserializer=flwr_dot_proto_dot_simulationio__pb2.PullSimulationInputsRequest.FromString,
115
- response_serializer=flwr_dot_proto_dot_simulationio__pb2.PullSimulationInputsResponse.SerializeToString,
136
+ 'ListAppsToLaunch': grpc.unary_unary_rpc_method_handler(
137
+ servicer.ListAppsToLaunch,
138
+ request_deserializer=flwr_dot_proto_dot_appio__pb2.ListAppsToLaunchRequest.FromString,
139
+ response_serializer=flwr_dot_proto_dot_appio__pb2.ListAppsToLaunchResponse.SerializeToString,
140
+ ),
141
+ 'RequestToken': grpc.unary_unary_rpc_method_handler(
142
+ servicer.RequestToken,
143
+ request_deserializer=flwr_dot_proto_dot_appio__pb2.RequestTokenRequest.FromString,
144
+ response_serializer=flwr_dot_proto_dot_appio__pb2.RequestTokenResponse.SerializeToString,
116
145
  ),
117
- 'PushSimulationOutputs': grpc.unary_unary_rpc_method_handler(
118
- servicer.PushSimulationOutputs,
119
- request_deserializer=flwr_dot_proto_dot_simulationio__pb2.PushSimulationOutputsRequest.FromString,
120
- response_serializer=flwr_dot_proto_dot_simulationio__pb2.PushSimulationOutputsResponse.SerializeToString,
146
+ 'PullAppInputs': grpc.unary_unary_rpc_method_handler(
147
+ servicer.PullAppInputs,
148
+ request_deserializer=flwr_dot_proto_dot_appio__pb2.PullAppInputsRequest.FromString,
149
+ response_serializer=flwr_dot_proto_dot_appio__pb2.PullAppInputsResponse.SerializeToString,
150
+ ),
151
+ 'PushAppOutputs': grpc.unary_unary_rpc_method_handler(
152
+ servicer.PushAppOutputs,
153
+ request_deserializer=flwr_dot_proto_dot_appio__pb2.PushAppOutputsRequest.FromString,
154
+ response_serializer=flwr_dot_proto_dot_appio__pb2.PushAppOutputsResponse.SerializeToString,
121
155
  ),
122
156
  'UpdateRunStatus': grpc.unary_unary_rpc_method_handler(
123
157
  servicer.UpdateRunStatus,
@@ -155,7 +189,41 @@ class SimulationIo(object):
155
189
  """Missing associated documentation comment in .proto file."""
156
190
 
157
191
  @staticmethod
158
- def PullSimulationInputs(request,
192
+ def ListAppsToLaunch(request,
193
+ target,
194
+ options=(),
195
+ channel_credentials=None,
196
+ call_credentials=None,
197
+ insecure=False,
198
+ compression=None,
199
+ wait_for_ready=None,
200
+ timeout=None,
201
+ metadata=None):
202
+ return grpc.experimental.unary_unary(request, target, '/flwr.proto.SimulationIo/ListAppsToLaunch',
203
+ flwr_dot_proto_dot_appio__pb2.ListAppsToLaunchRequest.SerializeToString,
204
+ flwr_dot_proto_dot_appio__pb2.ListAppsToLaunchResponse.FromString,
205
+ options, channel_credentials,
206
+ insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
207
+
208
+ @staticmethod
209
+ def RequestToken(request,
210
+ target,
211
+ options=(),
212
+ channel_credentials=None,
213
+ call_credentials=None,
214
+ insecure=False,
215
+ compression=None,
216
+ wait_for_ready=None,
217
+ timeout=None,
218
+ metadata=None):
219
+ return grpc.experimental.unary_unary(request, target, '/flwr.proto.SimulationIo/RequestToken',
220
+ flwr_dot_proto_dot_appio__pb2.RequestTokenRequest.SerializeToString,
221
+ flwr_dot_proto_dot_appio__pb2.RequestTokenResponse.FromString,
222
+ options, channel_credentials,
223
+ insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
224
+
225
+ @staticmethod
226
+ def PullAppInputs(request,
159
227
  target,
160
228
  options=(),
161
229
  channel_credentials=None,
@@ -165,14 +233,14 @@ class SimulationIo(object):
165
233
  wait_for_ready=None,
166
234
  timeout=None,
167
235
  metadata=None):
168
- return grpc.experimental.unary_unary(request, target, '/flwr.proto.SimulationIo/PullSimulationInputs',
169
- flwr_dot_proto_dot_simulationio__pb2.PullSimulationInputsRequest.SerializeToString,
170
- flwr_dot_proto_dot_simulationio__pb2.PullSimulationInputsResponse.FromString,
236
+ return grpc.experimental.unary_unary(request, target, '/flwr.proto.SimulationIo/PullAppInputs',
237
+ flwr_dot_proto_dot_appio__pb2.PullAppInputsRequest.SerializeToString,
238
+ flwr_dot_proto_dot_appio__pb2.PullAppInputsResponse.FromString,
171
239
  options, channel_credentials,
172
240
  insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
173
241
 
174
242
  @staticmethod
175
- def PushSimulationOutputs(request,
243
+ def PushAppOutputs(request,
176
244
  target,
177
245
  options=(),
178
246
  channel_credentials=None,
@@ -182,9 +250,9 @@ class SimulationIo(object):
182
250
  wait_for_ready=None,
183
251
  timeout=None,
184
252
  metadata=None):
185
- return grpc.experimental.unary_unary(request, target, '/flwr.proto.SimulationIo/PushSimulationOutputs',
186
- flwr_dot_proto_dot_simulationio__pb2.PushSimulationOutputsRequest.SerializeToString,
187
- flwr_dot_proto_dot_simulationio__pb2.PushSimulationOutputsResponse.FromString,
253
+ return grpc.experimental.unary_unary(request, target, '/flwr.proto.SimulationIo/PushAppOutputs',
254
+ flwr_dot_proto_dot_appio__pb2.PushAppOutputsRequest.SerializeToString,
255
+ flwr_dot_proto_dot_appio__pb2.PushAppOutputsResponse.FromString,
188
256
  options, channel_credentials,
189
257
  insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
190
258
 
@@ -3,22 +3,32 @@
3
3
  isort:skip_file
4
4
  """
5
5
  import abc
6
+ import flwr.proto.appio_pb2
6
7
  import flwr.proto.heartbeat_pb2
7
8
  import flwr.proto.log_pb2
8
9
  import flwr.proto.run_pb2
9
- import flwr.proto.simulationio_pb2
10
10
  import grpc
11
11
 
12
12
  class SimulationIoStub:
13
13
  def __init__(self, channel: grpc.Channel) -> None: ...
14
- PullSimulationInputs: grpc.UnaryUnaryMultiCallable[
15
- flwr.proto.simulationio_pb2.PullSimulationInputsRequest,
16
- flwr.proto.simulationio_pb2.PullSimulationInputsResponse]
14
+ ListAppsToLaunch: grpc.UnaryUnaryMultiCallable[
15
+ flwr.proto.appio_pb2.ListAppsToLaunchRequest,
16
+ flwr.proto.appio_pb2.ListAppsToLaunchResponse]
17
+ """List runs to launch"""
18
+
19
+ RequestToken: grpc.UnaryUnaryMultiCallable[
20
+ flwr.proto.appio_pb2.RequestTokenRequest,
21
+ flwr.proto.appio_pb2.RequestTokenResponse]
22
+ """Request token for a run"""
23
+
24
+ PullAppInputs: grpc.UnaryUnaryMultiCallable[
25
+ flwr.proto.appio_pb2.PullAppInputsRequest,
26
+ flwr.proto.appio_pb2.PullAppInputsResponse]
17
27
  """Pull Simulation inputs"""
18
28
 
19
- PushSimulationOutputs: grpc.UnaryUnaryMultiCallable[
20
- flwr.proto.simulationio_pb2.PushSimulationOutputsRequest,
21
- flwr.proto.simulationio_pb2.PushSimulationOutputsResponse]
29
+ PushAppOutputs: grpc.UnaryUnaryMultiCallable[
30
+ flwr.proto.appio_pb2.PushAppOutputsRequest,
31
+ flwr.proto.appio_pb2.PushAppOutputsResponse]
22
32
  """Push Simulation outputs"""
23
33
 
24
34
  UpdateRunStatus: grpc.UnaryUnaryMultiCallable[
@@ -49,18 +59,34 @@ class SimulationIoStub:
49
59
 
50
60
  class SimulationIoServicer(metaclass=abc.ABCMeta):
51
61
  @abc.abstractmethod
52
- def PullSimulationInputs(self,
53
- request: flwr.proto.simulationio_pb2.PullSimulationInputsRequest,
62
+ def ListAppsToLaunch(self,
63
+ request: flwr.proto.appio_pb2.ListAppsToLaunchRequest,
54
64
  context: grpc.ServicerContext,
55
- ) -> flwr.proto.simulationio_pb2.PullSimulationInputsResponse:
65
+ ) -> flwr.proto.appio_pb2.ListAppsToLaunchResponse:
66
+ """List runs to launch"""
67
+ pass
68
+
69
+ @abc.abstractmethod
70
+ def RequestToken(self,
71
+ request: flwr.proto.appio_pb2.RequestTokenRequest,
72
+ context: grpc.ServicerContext,
73
+ ) -> flwr.proto.appio_pb2.RequestTokenResponse:
74
+ """Request token for a run"""
75
+ pass
76
+
77
+ @abc.abstractmethod
78
+ def PullAppInputs(self,
79
+ request: flwr.proto.appio_pb2.PullAppInputsRequest,
80
+ context: grpc.ServicerContext,
81
+ ) -> flwr.proto.appio_pb2.PullAppInputsResponse:
56
82
  """Pull Simulation inputs"""
57
83
  pass
58
84
 
59
85
  @abc.abstractmethod
60
- def PushSimulationOutputs(self,
61
- request: flwr.proto.simulationio_pb2.PushSimulationOutputsRequest,
86
+ def PushAppOutputs(self,
87
+ request: flwr.proto.appio_pb2.PushAppOutputsRequest,
62
88
  context: grpc.ServicerContext,
63
- ) -> flwr.proto.simulationio_pb2.PushSimulationOutputsResponse:
89
+ ) -> flwr.proto.appio_pb2.PushAppOutputsResponse:
64
90
  """Push Simulation outputs"""
65
91
  pass
66
92
 
@@ -34,6 +34,16 @@ from flwr.common.serde import (
34
34
  )
35
35
  from flwr.common.typing import Fab, RunStatus
36
36
  from flwr.proto import simulationio_pb2_grpc
37
+ from flwr.proto.appio_pb2 import ( # pylint: disable=E0611
38
+ ListAppsToLaunchRequest,
39
+ ListAppsToLaunchResponse,
40
+ PullAppInputsRequest,
41
+ PullAppInputsResponse,
42
+ PushAppOutputsRequest,
43
+ PushAppOutputsResponse,
44
+ RequestTokenRequest,
45
+ RequestTokenResponse,
46
+ )
37
47
  from flwr.proto.heartbeat_pb2 import ( # pylint: disable=E0611
38
48
  SendAppHeartbeatRequest,
39
49
  SendAppHeartbeatResponse,
@@ -50,12 +60,6 @@ from flwr.proto.run_pb2 import ( # pylint: disable=E0611
50
60
  UpdateRunStatusRequest,
51
61
  UpdateRunStatusResponse,
52
62
  )
53
- from flwr.proto.simulationio_pb2 import ( # pylint: disable=E0611
54
- PullSimulationInputsRequest,
55
- PullSimulationInputsResponse,
56
- PushSimulationOutputsRequest,
57
- PushSimulationOutputsResponse,
58
- )
59
63
  from flwr.server.superlink.linkstate import LinkStateFactory
60
64
  from flwr.server.superlink.utils import abort_if
61
65
  from flwr.supercore.ffs import FfsFactory
@@ -71,9 +75,45 @@ class SimulationIoServicer(simulationio_pb2_grpc.SimulationIoServicer):
71
75
  self.ffs_factory = ffs_factory
72
76
  self.lock = threading.RLock()
73
77
 
74
- def PullSimulationInputs(
75
- self, request: PullSimulationInputsRequest, context: ServicerContext
76
- ) -> PullSimulationInputsResponse:
78
+ def ListAppsToLaunch(
79
+ self,
80
+ request: ListAppsToLaunchRequest,
81
+ context: grpc.ServicerContext,
82
+ ) -> ListAppsToLaunchResponse:
83
+ """Get run IDs with pending messages."""
84
+ log(DEBUG, "SimulationIoServicer.ListAppsToLaunch")
85
+
86
+ # Initialize state connection
87
+ state = self.state_factory.state()
88
+
89
+ # Get IDs of runs in pending status
90
+ run_ids = state.get_run_ids(flwr_aid=None)
91
+ pending_run_ids = []
92
+ for run_id, status in state.get_run_status(run_ids).items():
93
+ if status.status == Status.PENDING:
94
+ pending_run_ids.append(run_id)
95
+
96
+ # Return run IDs
97
+ return ListAppsToLaunchResponse(run_ids=pending_run_ids)
98
+
99
+ def RequestToken(
100
+ self, request: RequestTokenRequest, context: grpc.ServicerContext
101
+ ) -> RequestTokenResponse:
102
+ """Request token."""
103
+ log(DEBUG, "SimulationIoServicer.RequestToken")
104
+
105
+ # Initialize state connection
106
+ state = self.state_factory.state()
107
+
108
+ # Attempt to create a token for the provided run ID
109
+ token = state.create_token(request.run_id)
110
+
111
+ # Return the token
112
+ return RequestTokenResponse(token=token or "")
113
+
114
+ def PullAppInputs(
115
+ self, request: PullAppInputsRequest, context: ServicerContext
116
+ ) -> PullAppInputsResponse:
77
117
  """Pull SimultionIo process inputs."""
78
118
  log(DEBUG, "SimultionIoServicer.SimultionIoInputs")
79
119
  # Init access to LinkState and Ffs
@@ -86,7 +126,7 @@ class SimulationIoServicer(simulationio_pb2_grpc.SimulationIoServicer):
86
126
  run_id = state.get_pending_run_id()
87
127
  # If there's no pending run, return an empty response
88
128
  if run_id is None:
89
- return PullSimulationInputsResponse()
129
+ return PullAppInputsResponse()
90
130
 
91
131
  # Retrieve Context, Run and Fab for the run_id
92
132
  serverapp_ctxt = state.get_serverapp_context(run_id)
@@ -99,7 +139,7 @@ class SimulationIoServicer(simulationio_pb2_grpc.SimulationIoServicer):
99
139
  # Update run status to STARTING
100
140
  if state.update_run_status(run_id, RunStatus(Status.STARTING, "", "")):
101
141
  log(INFO, "Starting run %d", run_id)
102
- return PullSimulationInputsResponse(
142
+ return PullAppInputsResponse(
103
143
  context=context_to_proto(serverapp_ctxt),
104
144
  run=run_to_proto(run),
105
145
  fab=fab_to_proto(fab),
@@ -109,11 +149,11 @@ class SimulationIoServicer(simulationio_pb2_grpc.SimulationIoServicer):
109
149
  # or if the status cannot be updated to STARTING
110
150
  raise RuntimeError(f"Failed to start run {run_id}")
111
151
 
112
- def PushSimulationOutputs(
113
- self, request: PushSimulationOutputsRequest, context: ServicerContext
114
- ) -> PushSimulationOutputsResponse:
152
+ def PushAppOutputs(
153
+ self, request: PushAppOutputsRequest, context: ServicerContext
154
+ ) -> PushAppOutputsResponse:
115
155
  """Push Simulation process outputs."""
116
- log(DEBUG, "SimultionIoServicer.PushSimulationOutputs")
156
+ log(DEBUG, "SimultionIoServicer.PushAppOutputs")
117
157
  state = self.state_factory.state()
118
158
 
119
159
  # Abort if the run is not running
@@ -126,7 +166,7 @@ class SimulationIoServicer(simulationio_pb2_grpc.SimulationIoServicer):
126
166
  )
127
167
 
128
168
  state.set_serverapp_context(request.run_id, context_from_proto(request.context))
129
- return PushSimulationOutputsResponse()
169
+ return PushAppOutputsResponse()
130
170
 
131
171
  def UpdateRunStatus(
132
172
  self, request: UpdateRunStatusRequest, context: grpc.ServicerContext
flwr/simulation/app.py CHANGED
@@ -57,16 +57,16 @@ from flwr.common.serde import (
57
57
  run_status_to_proto,
58
58
  )
59
59
  from flwr.common.typing import RunStatus
60
+ from flwr.proto.appio_pb2 import ( # pylint: disable=E0611
61
+ PullAppInputsRequest,
62
+ PullAppInputsResponse,
63
+ PushAppOutputsRequest,
64
+ )
60
65
  from flwr.proto.run_pb2 import ( # pylint: disable=E0611
61
66
  GetFederationOptionsRequest,
62
67
  GetFederationOptionsResponse,
63
68
  UpdateRunStatusRequest,
64
69
  )
65
- from flwr.proto.simulationio_pb2 import ( # pylint: disable=E0611
66
- PullSimulationInputsRequest,
67
- PullSimulationInputsResponse,
68
- PushSimulationOutputsRequest,
69
- )
70
70
  from flwr.server.superlink.fleet.vce.backend.backend import BackendConfig
71
71
  from flwr.simulation.run_simulation import _run_simulation
72
72
  from flwr.simulation.simulationio_connection import SimulationIoConnection
@@ -128,8 +128,8 @@ def run_simulation_process( # pylint: disable=R0914, disable=W0212, disable=R09
128
128
 
129
129
  try:
130
130
  # Pull SimulationInputs from LinkState
131
- req = PullSimulationInputsRequest()
132
- res: PullSimulationInputsResponse = conn._stub.PullSimulationInputs(req)
131
+ req = PullAppInputsRequest()
132
+ res: PullAppInputsResponse = conn._stub.PullAppInputs(req)
133
133
  if not res.HasField("run"):
134
134
  sleep(3)
135
135
  run_status = None
@@ -240,10 +240,8 @@ def run_simulation_process( # pylint: disable=R0914, disable=W0212, disable=R09
240
240
 
241
241
  # Send resulting context
242
242
  context_proto = context_to_proto(updated_context)
243
- out_req = PushSimulationOutputsRequest(
244
- run_id=run.run_id, context=context_proto
245
- )
246
- _ = conn._stub.PushSimulationOutputs(out_req)
243
+ out_req = PushAppOutputsRequest(run_id=run.run_id, context=context_proto)
244
+ _ = conn._stub.PushAppOutputs(out_req)
247
245
 
248
246
  run_status = RunStatus(Status.FINISHED, SubStatus.COMPLETED, "")
249
247
 
@@ -16,6 +16,7 @@
16
16
 
17
17
 
18
18
  import os
19
+ import signal
19
20
  import threading
20
21
  import time
21
22
  from typing import Union
@@ -29,6 +30,29 @@ from flwr.proto.appio_pb2 import ( # pylint: disable=E0611
29
30
  from flwr.proto.clientappio_pb2_grpc import ClientAppIoStub
30
31
  from flwr.proto.serverappio_pb2_grpc import ServerAppIoStub
31
32
 
33
+ if os.name == "nt":
34
+ from ctypes import windll # type: ignore
35
+
36
+
37
+ def _pid_exists(pid: int) -> bool:
38
+ """Check if a process with the given PID exists.
39
+
40
+ This works on Unix-like systems and Windows.
41
+ """
42
+ # Use `ctypes` to check if the process exists on Windows
43
+ if os.name == "nt":
44
+ handle = windll.kernel32.OpenProcess(0x1000, False, pid)
45
+ if handle:
46
+ windll.kernel32.CloseHandle(handle)
47
+ return True
48
+ return False
49
+ # Use `os.kill` on Unix-like systems
50
+ try:
51
+ os.kill(pid, 0)
52
+ except OSError:
53
+ return False
54
+ return True
55
+
32
56
 
33
57
  def start_parent_process_monitor(
34
58
  parent_pid: int,
@@ -38,8 +62,10 @@ def start_parent_process_monitor(
38
62
  def monitor() -> None:
39
63
  while True:
40
64
  time.sleep(0.2)
41
- if os.getppid() != parent_pid:
42
- os.kill(os.getpid(), 9)
65
+ if not _pid_exists(parent_pid):
66
+ # This works on Unix-like systems and Windows
67
+ # Avoid `os.kill` on Windows
68
+ signal.raise_signal(signal.SIGTERM)
43
69
 
44
70
  threading.Thread(target=monitor, daemon=True).start()
45
71
 
@@ -22,7 +22,14 @@ from flwr.common import EventType, event
22
22
  from flwr.common.constant import ExecPluginType
23
23
  from flwr.common.logger import log
24
24
  from flwr.proto.clientappio_pb2_grpc import ClientAppIoStub
25
- from flwr.supercore.superexec.plugin import ClientAppExecPlugin, ExecPlugin
25
+ from flwr.proto.serverappio_pb2_grpc import ServerAppIoStub
26
+ from flwr.proto.simulationio_pb2_grpc import SimulationIoStub
27
+ from flwr.supercore.superexec.plugin import (
28
+ ClientAppExecPlugin,
29
+ ExecPlugin,
30
+ ServerAppExecPlugin,
31
+ SimulationExecPlugin,
32
+ )
26
33
  from flwr.supercore.superexec.run_superexec import run_superexec
27
34
 
28
35
 
@@ -43,6 +50,7 @@ def flower_superexec() -> None:
43
50
  stub_class=stub_class, # type: ignore
44
51
  appio_api_address=args.appio_api_address,
45
52
  flwr_dir=args.flwr_dir,
53
+ parent_pid=args.parent_pid,
46
54
  )
47
55
 
48
56
 
@@ -79,6 +87,13 @@ def _parse_args() -> argparse.ArgumentParser:
79
87
  - `$HOME/.flwr/` in all other cases
80
88
  """,
81
89
  )
90
+ parser.add_argument(
91
+ "--parent-pid",
92
+ type=int,
93
+ default=None,
94
+ help="The PID of the parent process. When set, the process will terminate "
95
+ "when the parent process exits.",
96
+ )
82
97
  return parser
83
98
 
84
99
 
@@ -88,4 +103,8 @@ def _get_plugin_and_stub_class(
88
103
  """Get the plugin class and stub class based on the plugin type."""
89
104
  if plugin_type == ExecPluginType.CLIENT_APP:
90
105
  return ClientAppExecPlugin, ClientAppIoStub
106
+ if plugin_type == ExecPluginType.SERVER_APP:
107
+ return ServerAppExecPlugin, ServerAppIoStub
108
+ if plugin_type == ExecPluginType.SIMULATION:
109
+ return SimulationExecPlugin, SimulationIoStub
91
110
  raise ValueError(f"Unknown plugin type: {plugin_type}")
@@ -18,9 +18,11 @@
18
18
  from .clientapp_exec_plugin import ClientAppExecPlugin
19
19
  from .exec_plugin import ExecPlugin
20
20
  from .serverapp_exec_plugin import ServerAppExecPlugin
21
+ from .simulation_exec_plugin import SimulationExecPlugin
21
22
 
22
23
  __all__ = [
23
24
  "ClientAppExecPlugin",
24
25
  "ExecPlugin",
25
26
  "ServerAppExecPlugin",
27
+ "SimulationExecPlugin",
26
28
  ]
@@ -0,0 +1,28 @@
1
+ # Copyright 2025 Flower Labs GmbH. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ # ==============================================================================
15
+ """Simple Flower SuperExec plugin for simulation processes."""
16
+
17
+
18
+ from .base_exec_plugin import BaseExecPlugin
19
+
20
+
21
+ class SimulationExecPlugin(BaseExecPlugin):
22
+ """Simple Flower SuperExec plugin for simulation processes.
23
+
24
+ The plugin always selects the first candidate run ID.
25
+ """
26
+
27
+ command = "flwr-simulation"
28
+ appio_api_address_arg = "--simulationio-api-address"
@@ -31,6 +31,7 @@ from flwr.proto.appio_pb2 import ( # pylint: disable=E0611
31
31
  )
32
32
  from flwr.proto.clientappio_pb2_grpc import ClientAppIoStub
33
33
  from flwr.proto.run_pb2 import GetRunRequest # pylint: disable=E0611
34
+ from flwr.supercore.app_utils import start_parent_process_monitor
34
35
 
35
36
  from .plugin import ExecPlugin
36
37
 
@@ -40,6 +41,7 @@ def run_superexec(
40
41
  stub_class: type[ClientAppIoStub],
41
42
  appio_api_address: str,
42
43
  flwr_dir: Optional[str] = None,
44
+ parent_pid: Optional[int] = None,
43
45
  ) -> None:
44
46
  """Run Flower SuperExec.
45
47
 
@@ -53,7 +55,14 @@ def run_superexec(
53
55
  The address of the AppIO API.
54
56
  flwr_dir : Optional[str] (default: None)
55
57
  The Flower directory.
58
+ parent_pid : Optional[int] (default: None)
59
+ The PID of the parent process. If provided, the SuperExec will terminate
60
+ when the parent process exits.
56
61
  """
62
+ # Start monitoring the parent process if a PID is provided
63
+ if parent_pid is not None:
64
+ start_parent_process_monitor(parent_pid)
65
+
57
66
  # Create the channel to the AppIO API
58
67
  # No TLS support for now, so insecure connection
59
68
  channel = create_channel(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: flwr-nightly
3
- Version: 1.21.0.dev20250809
3
+ Version: 1.21.0.dev20250812
4
4
  Summary: Flower: A Friendly Federated AI Framework
5
5
  License: Apache-2.0
6
6
  Keywords: Artificial Intelligence,Federated AI,Federated Analytics,Federated Evaluation,Federated Learning,Flower,Machine Learning
@@ -108,7 +108,7 @@ flwr/common/args.py,sha256=XFQ5PU0lU7NS1QCiKhhESHVeL8KSjcD3x8h4P3e5qlM,5298
108
108
  flwr/common/auth_plugin/__init__.py,sha256=DktrRcGZrRarLf7Jb_UlHtOyLp9_-kEplyq6PS5-vOA,988
109
109
  flwr/common/auth_plugin/auth_plugin.py,sha256=mM7SuphO4OsVAVJR1GErYVgYT83ZjxDzS_gha12bT9E,4855
110
110
  flwr/common/config.py,sha256=glcZDjco-amw1YfQcYTFJ4S1pt9APoexT-mf1QscuHs,13960
111
- flwr/common/constant.py,sha256=_E2ACR9F7oAaJcG0t1E7D9F7MtDyHVGnEe0_frCwMsQ,8710
111
+ flwr/common/constant.py,sha256=0w5GCaW078GMj_VMQX-Lb7OQDnA70GmWZMzufDvGv6E,8769
112
112
  flwr/common/context.py,sha256=Be8obQR_OvEDy1OmshuUKxGRQ7Qx89mf5F4xlhkR10s,2407
113
113
  flwr/common/date.py,sha256=1ZT2cRSpC2DJqprOVTLXYCR_O2_OZR0zXO_brJ3LqWc,1554
114
114
  flwr/common/differential_privacy.py,sha256=FdlpdpPl_H_2HJa8CQM1iCUGBBQ5Dc8CzxmHERM-EoE,6148
@@ -220,10 +220,10 @@ flwr/proto/serverappio_pb2.py,sha256=CRbRIJk9r4RvLng1a_2M32LdNM3PoZmBRlNLO7fKVFs
220
220
  flwr/proto/serverappio_pb2.pyi,sha256=MDY9CEUnev_oi7Y-gZIXx8divcc0BufLAE2d7nmbo_Y,1319
221
221
  flwr/proto/serverappio_pb2_grpc.py,sha256=hfRrdawakgu1uV6vf7lHSqB7IZNlxmsYmep3KJQXjjs,27446
222
222
  flwr/proto/serverappio_pb2_grpc.pyi,sha256=65o7dZaEbqaYJKnJG84umeHGKGdJJQKK1FYMIUnvYwQ,7461
223
- flwr/proto/simulationio_pb2.py,sha256=sAJX72z-IttVGxyU3PFnG8AFuA-pV7itvBoxz-hOudE,3342
224
- flwr/proto/simulationio_pb2.pyi,sha256=oXx8_FLBe5B54wduZj-f89kub73XxNtQbThuW8YfPAs,2660
225
- flwr/proto/simulationio_pb2_grpc.py,sha256=HuGbhOwV_A5GTbvmd5XTm6lSm9fWUgKcxq9OKhgmBT0,12999
226
- flwr/proto/simulationio_pb2_grpc.pyi,sha256=KaGjpR6nH9XLM6oAPjgX-HrGbJU0dAnk9GpNjMkiR54,3687
223
+ flwr/proto/simulationio_pb2.py,sha256=H-4-31qjJICyUFayoSwba1-nBAAKICGJ-PMboyhiyA4,2640
224
+ flwr/proto/simulationio_pb2.pyi,sha256=XbFvpZvvrS7QcH5AFXfpRGl4hQvhd3QdKO6x0oTlCCU,165
225
+ flwr/proto/simulationio_pb2_grpc.py,sha256=sDPftQM16sdfL_GQTs4M2yP5Te4dcxApqwIcCosvznM,16029
226
+ flwr/proto/simulationio_pb2_grpc.pyi,sha256=XtGJVEd-4SIUxtGxZ5Uu9rFwmYFaeeQcceNwyd401dM,4430
227
227
  flwr/proto/transport_pb2.py,sha256=P-jX_tUyk_8xFe-vIUUSfZlHGtk2Ou3A8eXdBKkp5AY,9824
228
228
  flwr/proto/transport_pb2.pyi,sha256=ipHQ03eFBqsxtAuAVefZ2lVr04BZ4YifJCS2eauNmy8,21627
229
229
  flwr/proto/transport_pb2_grpc.py,sha256=vLN3EHtx2aEEMCO4f1Upu-l27BPzd3-5pV-u8wPcosk,2598
@@ -308,7 +308,7 @@ flwr/server/superlink/serverappio/serverappio_grpc.py,sha256=zcvzDhCAnlFxAwCiJUH
308
308
  flwr/server/superlink/serverappio/serverappio_servicer.py,sha256=3C_0boRbYuY1Vlf0DRGzBvTUX-D5UUzxYkFihSMZf-A,20094
309
309
  flwr/server/superlink/simulation/__init__.py,sha256=Ry8DrNaZCMcQXvUc4FoCN2m3dvUQgWjasfp015o3Ec4,718
310
310
  flwr/server/superlink/simulation/simulationio_grpc.py,sha256=VqWKxjpd4bCgPFKsgtIZPk9YcG0kc1EEmr5k20EKty4,2205
311
- flwr/server/superlink/simulation/simulationio_servicer.py,sha256=m1T1zvEn81jlfx9hVTqmeWxAu6APCS2YW8l5O0OQvhU,7724
311
+ flwr/server/superlink/simulation/simulationio_servicer.py,sha256=vuOH3upIgzQi8_vE6zE_6knnmPENhc_9dtfFNVvkQrc,8947
312
312
  flwr/server/superlink/utils.py,sha256=zXmyU2o535b9dgz-TvFklzfuQk4irNnMtiK8vT4Dm1c,2454
313
313
  flwr/server/typing.py,sha256=LvO6gq7H6TAWhA9JFx0WyqHxU7FycyvhSsLjBLPgpts,1011
314
314
  flwr/server/utils/__init__.py,sha256=U4gM84-uUFddarODDQkO6SjNUuGhFcsHJZMjSEbezkU,884
@@ -322,7 +322,7 @@ flwr/server/workflow/secure_aggregation/secagg_workflow.py,sha256=b_pKk7gmbahwyj
322
322
  flwr/server/workflow/secure_aggregation/secaggplus_workflow.py,sha256=DkayCsnlAya6Y2PZsueLgoUCMRtV-GbnW08RfWx_SXM,29460
323
323
  flwr/serverapp/__init__.py,sha256=HPvC_ZvMS7GCM7ALVrG_Wwm4bSDr4DZETeC561v3T9w,719
324
324
  flwr/simulation/__init__.py,sha256=Gg6OsP1Z-ixc3-xxzvl7j7rz2Fijy9rzyEPpxgAQCeM,1556
325
- flwr/simulation/app.py,sha256=hP7vP29qZOA_3dipzUdmkRXP25eS8RlF1MT-S09t3oc,10625
325
+ flwr/simulation/app.py,sha256=z3LVQfBOrB1UUKE5tu4j3fsRQ4FrQzKLQRUavwfC0NM,10532
326
326
  flwr/simulation/legacy_app.py,sha256=nMISQqW0otJL1-2Kfd94O6BLlGS2IEmEPKTM2WGKrIs,15861
327
327
  flwr/simulation/ray_transport/__init__.py,sha256=ogd-0AMv2U-wBZ1r3sHWaDIOIrVqr88Xi6C8o4Dviy0,734
328
328
  flwr/simulation/ray_transport/ray_actor.py,sha256=JN3xTqFIr5Z750k92CcA_uavzOHhSWDwE2WCaecvpks,19147
@@ -331,9 +331,9 @@ flwr/simulation/ray_transport/utils.py,sha256=KrexpWYCF-dAF3UHc9yDbPQWO-ahMT-BbD
331
331
  flwr/simulation/run_simulation.py,sha256=-sp3dNZcp7MCAH0BlmZpVcFAGvozRdYXRdDYcH_2Zxk,20838
332
332
  flwr/simulation/simulationio_connection.py,sha256=mzS1C6EEREwQDPceDo30anAasmTDLb9qqV2tXlBhOUA,3494
333
333
  flwr/supercore/__init__.py,sha256=pqkFoow_E6UhbBlhmoD1gmTH-33yJRhBsIZqxRPFZ7U,755
334
- flwr/supercore/app_utils.py,sha256=L4S6yNE7mAm0WFww8y2VruOouGfQOz_sguA9o9DqGuI,2029
334
+ flwr/supercore/app_utils.py,sha256=WS3tly_QIWE-NRogbtFVC5l6arxP3Md1XItI9idmt0M,2771
335
335
  flwr/supercore/cli/__init__.py,sha256=EDl2aO-fuQfxSbL-T1W9RAfA2N0hpWHmqX_GSwblJbQ,845
336
- flwr/supercore/cli/flower_superexec.py,sha256=i1quvC41nXUAscIhpLZ6gi834KFM_cUDq5rdbDjacbs,3235
336
+ flwr/supercore/cli/flower_superexec.py,sha256=J_rf7SCVW9L9wsBScOYa-oJOpyb_e1WOtwTGSyUFu1k,3882
337
337
  flwr/supercore/corestate/__init__.py,sha256=Vau6-L_JG5QzNqtCTa9xCKGGljc09wY8avZmIjSJemg,774
338
338
  flwr/supercore/corestate/corestate.py,sha256=rDAWWeG5DcpCyQso9Z3RhwL4zr2IroPlRMcDzqoSu8s,2328
339
339
  flwr/supercore/ffs/__init__.py,sha256=U3KXwG_SplEvchat27K0LYPoPHzh-cwwT_NHsGlYMt8,908
@@ -350,12 +350,13 @@ flwr/supercore/object_store/object_store.py,sha256=J-rI3X7ET-F6dqOyM-UfHKCCQtPJ_
350
350
  flwr/supercore/object_store/object_store_factory.py,sha256=QVwE2ywi7vsj2iKfvWWnNw3N_I7Rz91NUt2RpcbJ7iM,1527
351
351
  flwr/supercore/object_store/utils.py,sha256=DcPbrb9PenloAPoQRiKiXX9DrDfpXcSyY0cZpgn4PeQ,1680
352
352
  flwr/supercore/superexec/__init__.py,sha256=XKX208hZ6a9gZ4KT9kMqfpCtp_8VGxekzKFfHSu2esQ,707
353
- flwr/supercore/superexec/plugin/__init__.py,sha256=pdnH-bcyqjGyWqEhYTfnZFaLhw5v43HpUB--koNttSU,950
353
+ flwr/supercore/superexec/plugin/__init__.py,sha256=GNwq8uNdE8RB7ywEFRAvKjLFzgS3YXgz39-HBGsemWw,1035
354
354
  flwr/supercore/superexec/plugin/base_exec_plugin.py,sha256=fL-Ufc9Dp56OhWOzNSJUc7HumbkuSDYqZKwde2opG4g,2074
355
355
  flwr/supercore/superexec/plugin/clientapp_exec_plugin.py,sha256=9FT6ufEqV5K9g4FaAB9lVDbIv-VCH5LcxT4YKy23roE,1035
356
356
  flwr/supercore/superexec/plugin/exec_plugin.py,sha256=w3jmtxdv7ov_EdAgifKcm4q8nV39e2Xna4sNjqClwOM,2447
357
357
  flwr/supercore/superexec/plugin/serverapp_exec_plugin.py,sha256=IwRzdPV-cSKwrP2krGh0De4IkAuxsmgK0WU6J-2GXqM,1035
358
- flwr/supercore/superexec/run_superexec.py,sha256=MNmQd6HfPr7Ec5RvTsH6-pDnwGL8bbiqbZ5mkHaQQPY,3873
358
+ flwr/supercore/superexec/plugin/simulation_exec_plugin.py,sha256=upn5zE-YKkl_jTw8RzmeyQ58PU_UAlQ7CqnBXXdng8I,1060
359
+ flwr/supercore/superexec/run_superexec.py,sha256=2-W6UfPgdzEpHSGOvqkIr5OAhD3Zb_O4quk8ZU2oISw,4288
359
360
  flwr/supercore/utils.py,sha256=ebuHMbeA8eXisX0oMPqBK3hk7uVnIE_yiqWVz8YbkpQ,1324
360
361
  flwr/superexec/__init__.py,sha256=YFqER0IJc1XEWfsX6AxZ9LSRq0sawPYrNYki-brvTIc,715
361
362
  flwr/superexec/deployment.py,sha256=CEgWfkN_lH6Vci03RjwKLENw2z6kxNvUdVEErPbqYDY,830
@@ -387,7 +388,7 @@ flwr/supernode/servicer/__init__.py,sha256=lucTzre5WPK7G1YLCfaqg3rbFWdNSb7ZTt-ca
387
388
  flwr/supernode/servicer/clientappio/__init__.py,sha256=7Oy62Y_oijqF7Dxi6tpcUQyOpLc_QpIRZ83NvwmB0Yg,813
388
389
  flwr/supernode/servicer/clientappio/clientappio_servicer.py,sha256=nIHRu38EWK-rpNOkcgBRAAKwYQQWFeCwu0lkO7OPZGQ,10239
389
390
  flwr/supernode/start_client_internal.py,sha256=iqJR8WbCW-8RQIRNwARZYoxhnlaAo5KnluCOEfRoLWM,21020
390
- flwr_nightly-1.21.0.dev20250809.dist-info/METADATA,sha256=k1dHkYUIlLAE-9AG-gUw8_-KrH8DLnz5mPsIcCfDIpc,15966
391
- flwr_nightly-1.21.0.dev20250809.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
392
- flwr_nightly-1.21.0.dev20250809.dist-info/entry_points.txt,sha256=hxHD2ixb_vJFDOlZV-zB4Ao32_BQlL34ftsDh1GXv14,420
393
- flwr_nightly-1.21.0.dev20250809.dist-info/RECORD,,
391
+ flwr_nightly-1.21.0.dev20250812.dist-info/METADATA,sha256=Vwe0ftnR9LLzTf_h1ZFMnvBVShT7_2lKrg8BxzcxHAQ,15966
392
+ flwr_nightly-1.21.0.dev20250812.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
393
+ flwr_nightly-1.21.0.dev20250812.dist-info/entry_points.txt,sha256=hxHD2ixb_vJFDOlZV-zB4Ao32_BQlL34ftsDh1GXv14,420
394
+ flwr_nightly-1.21.0.dev20250812.dist-info/RECORD,,