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 +2 -0
- flwr/proto/simulationio_pb2.py +4 -11
- flwr/proto/simulationio_pb2.pyi +0 -58
- flwr/proto/simulationio_pb2_grpc.py +95 -27
- flwr/proto/simulationio_pb2_grpc.pyi +39 -13
- flwr/server/superlink/simulation/simulationio_servicer.py +56 -16
- flwr/simulation/app.py +9 -11
- flwr/supercore/app_utils.py +28 -2
- flwr/supercore/cli/flower_superexec.py +20 -1
- flwr/supercore/superexec/plugin/__init__.py +2 -0
- flwr/supercore/superexec/plugin/simulation_exec_plugin.py +28 -0
- flwr/supercore/superexec/run_superexec.py +9 -0
- {flwr_nightly-1.21.0.dev20250809.dist-info → flwr_nightly-1.21.0.dev20250812.dist-info}/METADATA +1 -1
- {flwr_nightly-1.21.0.dev20250809.dist-info → flwr_nightly-1.21.0.dev20250812.dist-info}/RECORD +16 -15
- {flwr_nightly-1.21.0.dev20250809.dist-info → flwr_nightly-1.21.0.dev20250812.dist-info}/WHEEL +0 -0
- {flwr_nightly-1.21.0.dev20250809.dist-info → flwr_nightly-1.21.0.dev20250812.dist-info}/entry_points.txt +0 -0
flwr/common/constant.py
CHANGED
flwr/proto/simulationio_pb2.py
CHANGED
@@ -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\
|
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['
|
30
|
-
_globals['
|
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)
|
flwr/proto/simulationio_pb2.pyi
CHANGED
@@ -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.
|
21
|
-
'/flwr.proto.SimulationIo/
|
22
|
-
request_serializer=
|
23
|
-
response_deserializer=
|
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.
|
26
|
-
'/flwr.proto.SimulationIo/
|
27
|
-
request_serializer=
|
28
|
-
response_deserializer=
|
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
|
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
|
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
|
-
'
|
113
|
-
servicer.
|
114
|
-
request_deserializer=
|
115
|
-
response_serializer=
|
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
|
-
'
|
118
|
-
servicer.
|
119
|
-
request_deserializer=
|
120
|
-
response_serializer=
|
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
|
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/
|
169
|
-
|
170
|
-
|
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
|
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/
|
186
|
-
|
187
|
-
|
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
|
-
|
15
|
-
flwr.proto.
|
16
|
-
flwr.proto.
|
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
|
-
|
20
|
-
flwr.proto.
|
21
|
-
flwr.proto.
|
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
|
53
|
-
request: flwr.proto.
|
62
|
+
def ListAppsToLaunch(self,
|
63
|
+
request: flwr.proto.appio_pb2.ListAppsToLaunchRequest,
|
54
64
|
context: grpc.ServicerContext,
|
55
|
-
) -> flwr.proto.
|
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
|
61
|
-
request: flwr.proto.
|
86
|
+
def PushAppOutputs(self,
|
87
|
+
request: flwr.proto.appio_pb2.PushAppOutputsRequest,
|
62
88
|
context: grpc.ServicerContext,
|
63
|
-
) -> flwr.proto.
|
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
|
75
|
-
self,
|
76
|
-
|
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
|
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
|
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
|
113
|
-
self, request:
|
114
|
-
) ->
|
152
|
+
def PushAppOutputs(
|
153
|
+
self, request: PushAppOutputsRequest, context: ServicerContext
|
154
|
+
) -> PushAppOutputsResponse:
|
115
155
|
"""Push Simulation process outputs."""
|
116
|
-
log(DEBUG, "SimultionIoServicer.
|
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
|
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 =
|
132
|
-
res:
|
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 =
|
244
|
-
|
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
|
|
flwr/supercore/app_utils.py
CHANGED
@@ -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
|
42
|
-
|
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.
|
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(
|
{flwr_nightly-1.21.0.dev20250809.dist-info → flwr_nightly-1.21.0.dev20250812.dist-info}/METADATA
RENAMED
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.3
|
2
2
|
Name: flwr-nightly
|
3
|
-
Version: 1.21.0.
|
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
|
{flwr_nightly-1.21.0.dev20250809.dist-info → flwr_nightly-1.21.0.dev20250812.dist-info}/RECORD
RENAMED
@@ -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=
|
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=
|
224
|
-
flwr/proto/simulationio_pb2.pyi,sha256=
|
225
|
-
flwr/proto/simulationio_pb2_grpc.py,sha256=
|
226
|
-
flwr/proto/simulationio_pb2_grpc.pyi,sha256=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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/
|
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.
|
391
|
-
flwr_nightly-1.21.0.
|
392
|
-
flwr_nightly-1.21.0.
|
393
|
-
flwr_nightly-1.21.0.
|
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,,
|
{flwr_nightly-1.21.0.dev20250809.dist-info → flwr_nightly-1.21.0.dev20250812.dist-info}/WHEEL
RENAMED
File without changes
|
File without changes
|