flwr-nightly 1.5.0.dev20230608__py3-none-any.whl → 1.5.0.dev20230615__py3-none-any.whl
Sign up to get free protection for your applications and to get access to all the features.
- flwr/client/app.py +0 -3
- flwr/client/client.py +0 -4
- flwr/client/dpfedavg_numpy_client.py +97 -0
- flwr/client/grpc_rere_client/connection.py +0 -2
- flwr/client/message_handler/task_handler.py +0 -1
- flwr/client/numpy_client.py +1 -1
- flwr/client/rest_client/connection.py +0 -3
- flwr/common/address.py +1 -1
- flwr/common/dp.py +1 -2
- flwr/common/grpc.py +0 -1
- flwr/common/logger.py +0 -1
- flwr/common/serde.py +0 -1
- flwr/driver/driver.py +0 -3
- flwr/driver/driver_client_manager.py +9 -0
- flwr/driver/driver_client_proxy.py +1 -1
- flwr/proto/task_pb2.py +94 -6
- flwr/proto/task_pb2.pyi +137 -2
- flwr/server/app.py +4 -11
- flwr/server/client_manager.py +7 -0
- flwr/server/client_proxy.py +1 -1
- flwr/server/criterion.py +1 -2
- flwr/server/fleet/grpc_bidi/flower_service_servicer.py +3 -1
- flwr/server/fleet/grpc_bidi/grpc_bridge.py +1 -2
- flwr/server/fleet/grpc_bidi/grpc_client_proxy.py +1 -1
- flwr/server/fleet/grpc_bidi/grpc_server.py +1 -3
- flwr/server/fleet/grpc_bidi/ins_scheduler.py +0 -1
- flwr/server/fleet/message_handler/message_handler.py +0 -2
- flwr/server/history.py +15 -0
- flwr/server/server.py +0 -5
- flwr/server/state/in_memory_state.py +8 -5
- flwr/server/state/sqlite_state.py +4 -5
- flwr/server/state/state.py +2 -2
- flwr/server/state/state_factory.py +0 -1
- flwr/server/strategy/dpfedavg_adaptive.py +1 -1
- flwr/server/strategy/dpfedavg_fixed.py +46 -2
- flwr/server/strategy/fedadagrad.py +4 -4
- flwr/server/strategy/fedadam.py +3 -4
- flwr/server/strategy/fedavg.py +1 -2
- flwr/server/strategy/fedavg_android.py +1 -2
- flwr/server/strategy/fedopt.py +1 -2
- flwr/server/strategy/fedxgb_nn_avg.py +2 -2
- flwr/server/strategy/fedyogi.py +3 -4
- flwr/server/strategy/qfedavg.py +1 -2
- flwr/server/utils/tensorboard.py +2 -4
- flwr/server/utils/validator.py +0 -1
- flwr/simulation/app.py +4 -5
- flwr/simulation/ray_transport/ray_client_proxy.py +13 -13
- {flwr_nightly-1.5.0.dev20230608.dist-info → flwr_nightly-1.5.0.dev20230615.dist-info}/METADATA +1 -1
- {flwr_nightly-1.5.0.dev20230608.dist-info → flwr_nightly-1.5.0.dev20230615.dist-info}/RECORD +52 -52
- {flwr_nightly-1.5.0.dev20230608.dist-info → flwr_nightly-1.5.0.dev20230615.dist-info}/LICENSE +0 -0
- {flwr_nightly-1.5.0.dev20230608.dist-info → flwr_nightly-1.5.0.dev20230615.dist-info}/WHEEL +0 -0
- {flwr_nightly-1.5.0.dev20230608.dist-info → flwr_nightly-1.5.0.dev20230615.dist-info}/entry_points.txt +0 -0
flwr/client/app.py
CHANGED
@@ -150,7 +150,6 @@ def start_client(
|
|
150
150
|
>>> root_certificates=Path("/crts/root.pem").read_bytes(),
|
151
151
|
>>> )
|
152
152
|
"""
|
153
|
-
|
154
153
|
event(EventType.START_CLIENT_ENTER)
|
155
154
|
|
156
155
|
# Parse IP address
|
@@ -278,7 +277,6 @@ def start_numpy_client(
|
|
278
277
|
>>> root_certificates=Path("/crts/root.pem").read_bytes(),
|
279
278
|
>>> )
|
280
279
|
"""
|
281
|
-
|
282
280
|
# Start
|
283
281
|
start_client(
|
284
282
|
server_address=server_address,
|
@@ -321,7 +319,6 @@ def _get_parameters(self: Client, ins: GetParametersIns) -> GetParametersRes:
|
|
321
319
|
|
322
320
|
def _fit(self: Client, ins: FitIns) -> FitRes:
|
323
321
|
"""Refine the provided parameters using the locally held dataset."""
|
324
|
-
|
325
322
|
# Deconstruct FitIns
|
326
323
|
parameters: NDArrays = parameters_to_ndarrays(ins.parameters)
|
327
324
|
|
flwr/client/client.py
CHANGED
@@ -161,7 +161,6 @@ def maybe_call_get_properties(
|
|
161
161
|
client: Client, get_properties_ins: GetPropertiesIns
|
162
162
|
) -> GetPropertiesRes:
|
163
163
|
"""Call `get_properties` if the client overrides it."""
|
164
|
-
|
165
164
|
# Check if client overrides `get_properties`
|
166
165
|
if not has_get_properties(client=client):
|
167
166
|
# If client does not override `get_properties`, don't call it
|
@@ -182,7 +181,6 @@ def maybe_call_get_parameters(
|
|
182
181
|
client: Client, get_parameters_ins: GetParametersIns
|
183
182
|
) -> GetParametersRes:
|
184
183
|
"""Call `get_parameters` if the client overrides it."""
|
185
|
-
|
186
184
|
# Check if client overrides `get_parameters`
|
187
185
|
if not has_get_parameters(client=client):
|
188
186
|
# If client does not override `get_parameters`, don't call it
|
@@ -201,7 +199,6 @@ def maybe_call_get_parameters(
|
|
201
199
|
|
202
200
|
def maybe_call_fit(client: Client, fit_ins: FitIns) -> FitRes:
|
203
201
|
"""Call `fit` if the client overrides it."""
|
204
|
-
|
205
202
|
# Check if client overrides `fit`
|
206
203
|
if not has_fit(client=client):
|
207
204
|
# If client does not override `fit`, don't call it
|
@@ -222,7 +219,6 @@ def maybe_call_fit(client: Client, fit_ins: FitIns) -> FitRes:
|
|
222
219
|
|
223
220
|
def maybe_call_evaluate(client: Client, evaluate_ins: EvaluateIns) -> EvaluateRes:
|
224
221
|
"""Call `evaluate` if the client overrides it."""
|
225
|
-
|
226
222
|
# Check if client overrides `evaluate`
|
227
223
|
if not has_evaluate(client=client):
|
228
224
|
# If client does not override `evaluate`, don't call it
|
@@ -33,14 +33,82 @@ class DPFedAvgNumPyClient(NumPyClient):
|
|
33
33
|
self.client = client
|
34
34
|
|
35
35
|
def get_properties(self, config: Config) -> Dict[str, Scalar]:
|
36
|
+
"""Get client properties using the given Numpy client.
|
37
|
+
|
38
|
+
Parameters
|
39
|
+
----------
|
40
|
+
config : Config
|
41
|
+
Configuration parameters requested by the server.
|
42
|
+
This can be used to tell the client which properties
|
43
|
+
are needed along with some Scalar attributes.
|
44
|
+
|
45
|
+
Returns
|
46
|
+
-------
|
47
|
+
properties : Dict[str, Scalar]
|
48
|
+
A dictionary mapping arbitrary string keys to values of type
|
49
|
+
bool, bytes, float, int, or str. It can be used to communicate
|
50
|
+
arbitrary property values back to the server.
|
51
|
+
"""
|
36
52
|
return self.client.get_properties(config)
|
37
53
|
|
38
54
|
def get_parameters(self, config: Dict[str, Scalar]) -> NDArrays:
|
55
|
+
"""Return the current local model parameters.
|
56
|
+
|
57
|
+
Parameters
|
58
|
+
----------
|
59
|
+
config : Config
|
60
|
+
Configuration parameters requested by the server.
|
61
|
+
This can be used to tell the client which parameters
|
62
|
+
are needed along with some Scalar attributes.
|
63
|
+
|
64
|
+
Returns
|
65
|
+
-------
|
66
|
+
parameters : NDArrays
|
67
|
+
The local model parameters as a list of NumPy ndarrays.
|
68
|
+
"""
|
39
69
|
return self.client.get_parameters(config)
|
40
70
|
|
41
71
|
def fit(
|
42
72
|
self, parameters: NDArrays, config: Dict[str, Scalar]
|
43
73
|
) -> Tuple[NDArrays, int, Dict[str, Scalar]]:
|
74
|
+
"""Train the provided parameters using the locally held dataset.
|
75
|
+
|
76
|
+
This method first updates the local model using the original parameters
|
77
|
+
provided. It then calculates the update by subtracting the original
|
78
|
+
parameters from the updated model. The update is then clipped by an L2
|
79
|
+
norm and Gaussian noise is added if specified by the configuration.
|
80
|
+
|
81
|
+
The update is then applied to the original parameters to obtain the
|
82
|
+
updated parameters which are returned along with the number of examples
|
83
|
+
used and metrics computed during the fitting process.
|
84
|
+
|
85
|
+
Parameters
|
86
|
+
----------
|
87
|
+
parameters : NDArrays
|
88
|
+
The current (global) model parameters.
|
89
|
+
config : Dict[str, Scalar]
|
90
|
+
Configuration parameters which allow the
|
91
|
+
server to influence training on the client. It can be used to
|
92
|
+
communicate arbitrary values from the server to the client, for
|
93
|
+
example, to set the number of (local) training epochs.
|
94
|
+
|
95
|
+
Returns
|
96
|
+
-------
|
97
|
+
parameters : NDArrays
|
98
|
+
The locally updated model parameters.
|
99
|
+
num_examples : int
|
100
|
+
The number of examples used for training.
|
101
|
+
metrics : Dict[str, Scalar]
|
102
|
+
A dictionary mapping arbitrary string keys to values of type
|
103
|
+
bool, bytes, float, int, or str. It can be used to communicate
|
104
|
+
arbitrary values back to the server.
|
105
|
+
|
106
|
+
Raises
|
107
|
+
------
|
108
|
+
Exception
|
109
|
+
If any required configuration parameters are not provided or are of
|
110
|
+
the wrong type.
|
111
|
+
"""
|
44
112
|
original_params = copy.deepcopy(parameters)
|
45
113
|
# Getting the updated model from the wrapped client
|
46
114
|
updated_params, num_examples, metrics = self.client.fit(parameters, config)
|
@@ -80,4 +148,33 @@ class DPFedAvgNumPyClient(NumPyClient):
|
|
80
148
|
def evaluate(
|
81
149
|
self, parameters: NDArrays, config: Dict[str, Scalar]
|
82
150
|
) -> Tuple[float, int, Dict[str, Scalar]]:
|
151
|
+
"""Evaluate the provided parameters using the locally held dataset.
|
152
|
+
|
153
|
+
Parameters
|
154
|
+
----------
|
155
|
+
parameters : NDArrays
|
156
|
+
The current (global) model parameters.
|
157
|
+
config : Dict[str, Scalar]
|
158
|
+
Configuration parameters which allow the server to influence
|
159
|
+
evaluation on the client. It can be used to communicate
|
160
|
+
arbitrary values from the server to the client, for example,
|
161
|
+
to influence the number of examples used for evaluation.
|
162
|
+
|
163
|
+
Returns
|
164
|
+
-------
|
165
|
+
loss : float
|
166
|
+
The evaluation loss of the model on the local dataset.
|
167
|
+
num_examples : int
|
168
|
+
The number of examples used for evaluation.
|
169
|
+
metrics : Dict[str, Scalar]
|
170
|
+
A dictionary mapping arbitrary string keys to values of
|
171
|
+
type bool, bytes, float, int, or str. It can be used to
|
172
|
+
communicate arbitrary values back to the server.
|
173
|
+
|
174
|
+
Warning
|
175
|
+
-------
|
176
|
+
The previous return type format (int, float, float) and the
|
177
|
+
extended format (int, float, float, Dict[str, Scalar]) have been
|
178
|
+
deprecated and removed since Flower 0.19.
|
179
|
+
"""
|
83
180
|
return self.client.evaluate(parameters, config)
|
@@ -98,7 +98,6 @@ def grpc_request_response(
|
|
98
98
|
|
99
99
|
def receive() -> Optional[ServerMessage]:
|
100
100
|
"""Receive next task from server."""
|
101
|
-
|
102
101
|
# Request instructions (task) from server
|
103
102
|
request = PullTaskInsRequest(
|
104
103
|
node=Node(node_id=0, anonymous=True),
|
@@ -121,7 +120,6 @@ def grpc_request_response(
|
|
121
120
|
|
122
121
|
def send(client_message_proto: ClientMessage) -> None:
|
123
122
|
"""Send task result back to server."""
|
124
|
-
|
125
123
|
if state[KEY_TASK_INS] is None:
|
126
124
|
log(ERROR, "No current TaskIns")
|
127
125
|
return
|
@@ -26,7 +26,6 @@ def get_server_message(
|
|
26
26
|
pull_task_ins_response: PullTaskInsResponse,
|
27
27
|
) -> Optional[Tuple[TaskIns, ServerMessage]]:
|
28
28
|
"""Get the first ServerMessage, if available."""
|
29
|
-
|
30
29
|
# Extract a single ServerMessage from the response, if possible
|
31
30
|
if len(pull_task_ins_response.task_ins_list) == 0:
|
32
31
|
return None
|
flwr/client/numpy_client.py
CHANGED
@@ -25,7 +25,7 @@ class NumPyClient(ABC):
|
|
25
25
|
"""Abstract base class for Flower clients using NumPy."""
|
26
26
|
|
27
27
|
def get_properties(self, config: Config) -> Dict[str, Scalar]:
|
28
|
-
"""
|
28
|
+
"""Return a client's set of properties.
|
29
29
|
|
30
30
|
Parameters
|
31
31
|
----------
|
@@ -79,7 +79,6 @@ def http_request_response(
|
|
79
79
|
-------
|
80
80
|
receive, send : Callable, Callable
|
81
81
|
"""
|
82
|
-
|
83
82
|
log(
|
84
83
|
WARN,
|
85
84
|
"""
|
@@ -113,7 +112,6 @@ def http_request_response(
|
|
113
112
|
|
114
113
|
def receive() -> Optional[ServerMessage]:
|
115
114
|
"""Receive next task from server."""
|
116
|
-
|
117
115
|
# Serialize ProtoBuf to bytes
|
118
116
|
pull_task_ins_req_proto = PullTaskInsRequest(
|
119
117
|
node=Node(node_id=0, anonymous=True),
|
@@ -170,7 +168,6 @@ def http_request_response(
|
|
170
168
|
|
171
169
|
def send(client_message_proto: ClientMessage) -> None:
|
172
170
|
"""Send task result back to server."""
|
173
|
-
|
174
171
|
if state[KEY_TASK_INS] is None:
|
175
172
|
log(ERROR, "No current TaskIns")
|
176
173
|
return
|
flwr/common/address.py
CHANGED
flwr/common/dp.py
CHANGED
@@ -31,8 +31,7 @@ def _get_update_norm(update: NDArrays) -> float:
|
|
31
31
|
|
32
32
|
|
33
33
|
def add_gaussian_noise(update: NDArrays, std_dev: float) -> NDArrays:
|
34
|
-
"""
|
35
|
-
point value in the update."""
|
34
|
+
"""Add iid Gaussian noise to each floating point value in the update."""
|
36
35
|
update_noised = [
|
37
36
|
layer + np.random.normal(0, std_dev, layer.shape) for layer in update
|
38
37
|
]
|
flwr/common/grpc.py
CHANGED
@@ -31,7 +31,6 @@ def create_channel(
|
|
31
31
|
max_message_length: int = GRPC_MAX_MESSAGE_LENGTH,
|
32
32
|
) -> grpc.Channel:
|
33
33
|
"""Create a gRPC channel, either secure or insecure."""
|
34
|
-
|
35
34
|
# Possible options:
|
36
35
|
# https://github.com/grpc/grpc/blob/v1.43.x/include/grpc/impl/codegen/grpc_types.h
|
37
36
|
channel_options = [
|
flwr/common/logger.py
CHANGED
@@ -70,7 +70,6 @@ def configure(
|
|
70
70
|
identifier: str, filename: Optional[str] = None, host: Optional[str] = None
|
71
71
|
) -> None:
|
72
72
|
"""Configure logging to file and/or remote log server."""
|
73
|
-
|
74
73
|
# Create formatter
|
75
74
|
string_to_input = f"{identifier} | %(levelname)s %(name)s %(asctime)s "
|
76
75
|
string_to_input += "| %(filename)s:%(lineno)d | %(message)s"
|
flwr/common/serde.py
CHANGED
flwr/driver/driver.py
CHANGED
@@ -75,7 +75,6 @@ class Driver:
|
|
75
75
|
|
76
76
|
def get_nodes(self, req: driver_pb2.GetNodesRequest) -> driver_pb2.GetNodesResponse:
|
77
77
|
"""Get client IDs."""
|
78
|
-
|
79
78
|
# Check if channel is open
|
80
79
|
if self.stub is None:
|
81
80
|
log(ERROR, ERROR_MESSAGE_DRIVER_NOT_CONNECTED)
|
@@ -89,7 +88,6 @@ class Driver:
|
|
89
88
|
self, req: driver_pb2.PushTaskInsRequest
|
90
89
|
) -> driver_pb2.PushTaskInsResponse:
|
91
90
|
"""Schedule tasks."""
|
92
|
-
|
93
91
|
# Check if channel is open
|
94
92
|
if self.stub is None:
|
95
93
|
log(ERROR, ERROR_MESSAGE_DRIVER_NOT_CONNECTED)
|
@@ -103,7 +101,6 @@ class Driver:
|
|
103
101
|
self, req: driver_pb2.PullTaskResRequest
|
104
102
|
) -> driver_pb2.PullTaskResResponse:
|
105
103
|
"""Get task results."""
|
106
|
-
|
107
104
|
# Check if channel is open
|
108
105
|
if self.stub is None:
|
109
106
|
log(ERROR, ERROR_MESSAGE_DRIVER_NOT_CONNECTED)
|
@@ -85,10 +85,12 @@ class DriverClientManager(ClientManager):
|
|
85
85
|
raise NotImplementedError("DriverClientManager.unregister is not implemented")
|
86
86
|
|
87
87
|
def all(self) -> Dict[str, ClientProxy]:
|
88
|
+
"""Return all available clients."""
|
88
89
|
self._update_nodes()
|
89
90
|
return self.clients
|
90
91
|
|
91
92
|
def wait_for(self, num_clients: int, timeout: int = 86400) -> bool:
|
93
|
+
"""Wait until at least `num_clients` are available."""
|
92
94
|
start_time = time.time()
|
93
95
|
while time.time() < start_time + timeout:
|
94
96
|
self._update_nodes()
|
@@ -103,6 +105,7 @@ class DriverClientManager(ClientManager):
|
|
103
105
|
min_num_clients: Optional[int] = None,
|
104
106
|
criterion: Optional[Criterion] = None,
|
105
107
|
) -> List[ClientProxy]:
|
108
|
+
"""Sample a number of Flower ClientProxy instances."""
|
106
109
|
if min_num_clients is None:
|
107
110
|
min_num_clients = num_clients
|
108
111
|
self.wait_for(min_num_clients)
|
@@ -128,6 +131,12 @@ class DriverClientManager(ClientManager):
|
|
128
131
|
return [self.clients[cid] for cid in sampled_cids]
|
129
132
|
|
130
133
|
def _update_nodes(self) -> None:
|
134
|
+
"""Update the nodes list in the client manager.
|
135
|
+
|
136
|
+
This method communicates with the associated driver to get all node ids. Each
|
137
|
+
node id is then converted into a `DriverClientProxy` instance and stored in the
|
138
|
+
`clients` dictionary with node id as key.
|
139
|
+
"""
|
131
140
|
get_nodes_res = self.driver.get_nodes(req=driver_pb2.GetNodesRequest())
|
132
141
|
all_node_ids = get_nodes_res.node_ids
|
133
142
|
for node_id in all_node_ids:
|
@@ -40,7 +40,7 @@ class DriverClientProxy(ClientProxy):
|
|
40
40
|
def get_properties(
|
41
41
|
self, ins: common.GetPropertiesIns, timeout: Optional[float]
|
42
42
|
) -> common.GetPropertiesRes:
|
43
|
-
"""
|
43
|
+
"""Return client's properties."""
|
44
44
|
server_message_proto: transport_pb2.ServerMessage = (
|
45
45
|
serde.server_message_to_proto(
|
46
46
|
server_message=common.ServerMessage(get_properties_ins=ins)
|
flwr/proto/task_pb2.py
CHANGED
@@ -16,13 +16,21 @@ from flwr.proto import node_pb2 as flwr_dot_proto_dot_node__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/task.proto\x12\nflwr.proto\x1a\x15\x66lwr/proto/node.proto\x1a\x1a\x66lwr/proto/transport.proto\"\
|
19
|
+
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/transport.proto\"\xbe\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(\t\x12\x14\n\x0c\x64\x65livered_at\x18\x04 \x01(\t\x12\x0b\n\x03ttl\x18\x05 \x01(\t\x12\x10\n\x08\x61ncestry\x18\x06 \x03(\t\x12)\n\x02sa\x18\x07 \x01(\x0b\x32\x1d.flwr.proto.SecureAggregation\x12<\n\x15legacy_server_message\x18\x65 \x01(\x0b\x32\x19.flwr.proto.ServerMessageB\x02\x18\x01\x12<\n\x15legacy_client_message\x18\x66 \x01(\x0b\x32\x19.flwr.proto.ClientMessageB\x02\x18\x01\"a\n\x07TaskIns\x12\x0f\n\x07task_id\x18\x01 \x01(\t\x12\x10\n\x08group_id\x18\x02 \x01(\t\x12\x13\n\x0bworkload_id\x18\x03 \x01(\t\x12\x1e\n\x04task\x18\x04 \x01(\x0b\x32\x10.flwr.proto.Task\"a\n\x07TaskRes\x12\x0f\n\x07task_id\x18\x01 \x01(\t\x12\x10\n\x08group_id\x18\x02 \x01(\t\x12\x13\n\x0bworkload_id\x18\x03 \x01(\t\x12\x1e\n\x04task\x18\x04 \x01(\x0b\x32\x10.flwr.proto.Task\"\xf3\x03\n\x05Value\x12\x10\n\x06\x64ouble\x18\x01 \x01(\x01H\x00\x12\x10\n\x06sint64\x18\x02 \x01(\x12H\x00\x12\x0e\n\x04\x62ool\x18\x03 \x01(\x08H\x00\x12\x10\n\x06string\x18\x04 \x01(\tH\x00\x12\x0f\n\x05\x62ytes\x18\x05 \x01(\x0cH\x00\x12\x33\n\x0b\x64ouble_list\x18\x15 \x01(\x0b\x32\x1c.flwr.proto.Value.DoubleListH\x00\x12\x33\n\x0bsint64_list\x18\x16 \x01(\x0b\x32\x1c.flwr.proto.Value.Sint64ListH\x00\x12/\n\tbool_list\x18\x17 \x01(\x0b\x32\x1a.flwr.proto.Value.BoolListH\x00\x12\x33\n\x0bstring_list\x18\x18 \x01(\x0b\x32\x1c.flwr.proto.Value.StringListH\x00\x12\x31\n\nbytes_list\x18\x19 \x01(\x0b\x32\x1b.flwr.proto.Value.BytesListH\x00\x1a\x1a\n\nDoubleList\x12\x0c\n\x04vals\x18\x01 \x03(\x01\x1a\x1a\n\nSint64List\x12\x0c\n\x04vals\x18\x01 \x03(\x12\x1a\x18\n\x08\x42oolList\x12\x0c\n\x04vals\x18\x01 \x03(\x08\x1a\x1a\n\nStringList\x12\x0c\n\x04vals\x18\x01 \x03(\t\x1a\x19\n\tBytesList\x12\x0c\n\x04vals\x18\x01 \x03(\x0c\x42\x07\n\x05value\"\xa0\x01\n\x11SecureAggregation\x12\x44\n\x0cnamed_values\x18\x01 \x03(\x0b\x32..flwr.proto.SecureAggregation.NamedValuesEntry\x1a\x45\n\x10NamedValuesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12 \n\x05value\x18\x02 \x01(\x0b\x32\x11.flwr.proto.Value:\x02\x38\x01\x62\x06proto3')
|
20
20
|
|
21
21
|
|
22
22
|
|
23
23
|
_TASK = DESCRIPTOR.message_types_by_name['Task']
|
24
24
|
_TASKINS = DESCRIPTOR.message_types_by_name['TaskIns']
|
25
25
|
_TASKRES = DESCRIPTOR.message_types_by_name['TaskRes']
|
26
|
+
_VALUE = DESCRIPTOR.message_types_by_name['Value']
|
27
|
+
_VALUE_DOUBLELIST = _VALUE.nested_types_by_name['DoubleList']
|
28
|
+
_VALUE_SINT64LIST = _VALUE.nested_types_by_name['Sint64List']
|
29
|
+
_VALUE_BOOLLIST = _VALUE.nested_types_by_name['BoolList']
|
30
|
+
_VALUE_STRINGLIST = _VALUE.nested_types_by_name['StringList']
|
31
|
+
_VALUE_BYTESLIST = _VALUE.nested_types_by_name['BytesList']
|
32
|
+
_SECUREAGGREGATION = DESCRIPTOR.message_types_by_name['SecureAggregation']
|
33
|
+
_SECUREAGGREGATION_NAMEDVALUESENTRY = _SECUREAGGREGATION.nested_types_by_name['NamedValuesEntry']
|
26
34
|
Task = _reflection.GeneratedProtocolMessageType('Task', (_message.Message,), {
|
27
35
|
'DESCRIPTOR' : _TASK,
|
28
36
|
'__module__' : 'flwr.proto.task_pb2'
|
@@ -44,6 +52,68 @@ TaskRes = _reflection.GeneratedProtocolMessageType('TaskRes', (_message.Message,
|
|
44
52
|
})
|
45
53
|
_sym_db.RegisterMessage(TaskRes)
|
46
54
|
|
55
|
+
Value = _reflection.GeneratedProtocolMessageType('Value', (_message.Message,), {
|
56
|
+
|
57
|
+
'DoubleList' : _reflection.GeneratedProtocolMessageType('DoubleList', (_message.Message,), {
|
58
|
+
'DESCRIPTOR' : _VALUE_DOUBLELIST,
|
59
|
+
'__module__' : 'flwr.proto.task_pb2'
|
60
|
+
# @@protoc_insertion_point(class_scope:flwr.proto.Value.DoubleList)
|
61
|
+
})
|
62
|
+
,
|
63
|
+
|
64
|
+
'Sint64List' : _reflection.GeneratedProtocolMessageType('Sint64List', (_message.Message,), {
|
65
|
+
'DESCRIPTOR' : _VALUE_SINT64LIST,
|
66
|
+
'__module__' : 'flwr.proto.task_pb2'
|
67
|
+
# @@protoc_insertion_point(class_scope:flwr.proto.Value.Sint64List)
|
68
|
+
})
|
69
|
+
,
|
70
|
+
|
71
|
+
'BoolList' : _reflection.GeneratedProtocolMessageType('BoolList', (_message.Message,), {
|
72
|
+
'DESCRIPTOR' : _VALUE_BOOLLIST,
|
73
|
+
'__module__' : 'flwr.proto.task_pb2'
|
74
|
+
# @@protoc_insertion_point(class_scope:flwr.proto.Value.BoolList)
|
75
|
+
})
|
76
|
+
,
|
77
|
+
|
78
|
+
'StringList' : _reflection.GeneratedProtocolMessageType('StringList', (_message.Message,), {
|
79
|
+
'DESCRIPTOR' : _VALUE_STRINGLIST,
|
80
|
+
'__module__' : 'flwr.proto.task_pb2'
|
81
|
+
# @@protoc_insertion_point(class_scope:flwr.proto.Value.StringList)
|
82
|
+
})
|
83
|
+
,
|
84
|
+
|
85
|
+
'BytesList' : _reflection.GeneratedProtocolMessageType('BytesList', (_message.Message,), {
|
86
|
+
'DESCRIPTOR' : _VALUE_BYTESLIST,
|
87
|
+
'__module__' : 'flwr.proto.task_pb2'
|
88
|
+
# @@protoc_insertion_point(class_scope:flwr.proto.Value.BytesList)
|
89
|
+
})
|
90
|
+
,
|
91
|
+
'DESCRIPTOR' : _VALUE,
|
92
|
+
'__module__' : 'flwr.proto.task_pb2'
|
93
|
+
# @@protoc_insertion_point(class_scope:flwr.proto.Value)
|
94
|
+
})
|
95
|
+
_sym_db.RegisterMessage(Value)
|
96
|
+
_sym_db.RegisterMessage(Value.DoubleList)
|
97
|
+
_sym_db.RegisterMessage(Value.Sint64List)
|
98
|
+
_sym_db.RegisterMessage(Value.BoolList)
|
99
|
+
_sym_db.RegisterMessage(Value.StringList)
|
100
|
+
_sym_db.RegisterMessage(Value.BytesList)
|
101
|
+
|
102
|
+
SecureAggregation = _reflection.GeneratedProtocolMessageType('SecureAggregation', (_message.Message,), {
|
103
|
+
|
104
|
+
'NamedValuesEntry' : _reflection.GeneratedProtocolMessageType('NamedValuesEntry', (_message.Message,), {
|
105
|
+
'DESCRIPTOR' : _SECUREAGGREGATION_NAMEDVALUESENTRY,
|
106
|
+
'__module__' : 'flwr.proto.task_pb2'
|
107
|
+
# @@protoc_insertion_point(class_scope:flwr.proto.SecureAggregation.NamedValuesEntry)
|
108
|
+
})
|
109
|
+
,
|
110
|
+
'DESCRIPTOR' : _SECUREAGGREGATION,
|
111
|
+
'__module__' : 'flwr.proto.task_pb2'
|
112
|
+
# @@protoc_insertion_point(class_scope:flwr.proto.SecureAggregation)
|
113
|
+
})
|
114
|
+
_sym_db.RegisterMessage(SecureAggregation)
|
115
|
+
_sym_db.RegisterMessage(SecureAggregation.NamedValuesEntry)
|
116
|
+
|
47
117
|
if _descriptor._USE_C_DESCRIPTORS == False:
|
48
118
|
|
49
119
|
DESCRIPTOR._options = None
|
@@ -51,10 +121,28 @@ if _descriptor._USE_C_DESCRIPTORS == False:
|
|
51
121
|
_TASK.fields_by_name['legacy_server_message']._serialized_options = b'\030\001'
|
52
122
|
_TASK.fields_by_name['legacy_client_message']._options = None
|
53
123
|
_TASK.fields_by_name['legacy_client_message']._serialized_options = b'\030\001'
|
124
|
+
_SECUREAGGREGATION_NAMEDVALUESENTRY._options = None
|
125
|
+
_SECUREAGGREGATION_NAMEDVALUESENTRY._serialized_options = b'8\001'
|
54
126
|
_TASK._serialized_start=89
|
55
|
-
_TASK._serialized_end=
|
56
|
-
_TASKINS._serialized_start=
|
57
|
-
_TASKINS._serialized_end=
|
58
|
-
_TASKRES._serialized_start=
|
59
|
-
_TASKRES._serialized_end=
|
127
|
+
_TASK._serialized_end=407
|
128
|
+
_TASKINS._serialized_start=409
|
129
|
+
_TASKINS._serialized_end=506
|
130
|
+
_TASKRES._serialized_start=508
|
131
|
+
_TASKRES._serialized_end=605
|
132
|
+
_VALUE._serialized_start=608
|
133
|
+
_VALUE._serialized_end=1107
|
134
|
+
_VALUE_DOUBLELIST._serialized_start=963
|
135
|
+
_VALUE_DOUBLELIST._serialized_end=989
|
136
|
+
_VALUE_SINT64LIST._serialized_start=991
|
137
|
+
_VALUE_SINT64LIST._serialized_end=1017
|
138
|
+
_VALUE_BOOLLIST._serialized_start=1019
|
139
|
+
_VALUE_BOOLLIST._serialized_end=1043
|
140
|
+
_VALUE_STRINGLIST._serialized_start=1045
|
141
|
+
_VALUE_STRINGLIST._serialized_end=1071
|
142
|
+
_VALUE_BYTESLIST._serialized_start=1073
|
143
|
+
_VALUE_BYTESLIST._serialized_end=1098
|
144
|
+
_SECUREAGGREGATION._serialized_start=1110
|
145
|
+
_SECUREAGGREGATION._serialized_end=1270
|
146
|
+
_SECUREAGGREGATION_NAMEDVALUESENTRY._serialized_start=1201
|
147
|
+
_SECUREAGGREGATION_NAMEDVALUESENTRY._serialized_end=1270
|
60
148
|
# @@protoc_insertion_point(module_scope)
|
flwr/proto/task_pb2.pyi
CHANGED
@@ -21,6 +21,7 @@ class Task(google.protobuf.message.Message):
|
|
21
21
|
DELIVERED_AT_FIELD_NUMBER: builtins.int
|
22
22
|
TTL_FIELD_NUMBER: builtins.int
|
23
23
|
ANCESTRY_FIELD_NUMBER: builtins.int
|
24
|
+
SA_FIELD_NUMBER: builtins.int
|
24
25
|
LEGACY_SERVER_MESSAGE_FIELD_NUMBER: builtins.int
|
25
26
|
LEGACY_CLIENT_MESSAGE_FIELD_NUMBER: builtins.int
|
26
27
|
@property
|
@@ -33,6 +34,8 @@ class Task(google.protobuf.message.Message):
|
|
33
34
|
@property
|
34
35
|
def ancestry(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[typing.Text]: ...
|
35
36
|
@property
|
37
|
+
def sa(self) -> global___SecureAggregation: ...
|
38
|
+
@property
|
36
39
|
def legacy_server_message(self) -> flwr.proto.transport_pb2.ServerMessage: ...
|
37
40
|
@property
|
38
41
|
def legacy_client_message(self) -> flwr.proto.transport_pb2.ClientMessage: ...
|
@@ -44,11 +47,12 @@ class Task(google.protobuf.message.Message):
|
|
44
47
|
delivered_at: typing.Text = ...,
|
45
48
|
ttl: typing.Text = ...,
|
46
49
|
ancestry: typing.Optional[typing.Iterable[typing.Text]] = ...,
|
50
|
+
sa: typing.Optional[global___SecureAggregation] = ...,
|
47
51
|
legacy_server_message: typing.Optional[flwr.proto.transport_pb2.ServerMessage] = ...,
|
48
52
|
legacy_client_message: typing.Optional[flwr.proto.transport_pb2.ClientMessage] = ...,
|
49
53
|
) -> None: ...
|
50
|
-
def HasField(self, field_name: typing_extensions.Literal["consumer",b"consumer","legacy_client_message",b"legacy_client_message","legacy_server_message",b"legacy_server_message","producer",b"producer"]) -> builtins.bool: ...
|
51
|
-
def ClearField(self, field_name: typing_extensions.Literal["ancestry",b"ancestry","consumer",b"consumer","created_at",b"created_at","delivered_at",b"delivered_at","legacy_client_message",b"legacy_client_message","legacy_server_message",b"legacy_server_message","producer",b"producer","ttl",b"ttl"]) -> None: ...
|
54
|
+
def HasField(self, field_name: typing_extensions.Literal["consumer",b"consumer","legacy_client_message",b"legacy_client_message","legacy_server_message",b"legacy_server_message","producer",b"producer","sa",b"sa"]) -> builtins.bool: ...
|
55
|
+
def ClearField(self, field_name: typing_extensions.Literal["ancestry",b"ancestry","consumer",b"consumer","created_at",b"created_at","delivered_at",b"delivered_at","legacy_client_message",b"legacy_client_message","legacy_server_message",b"legacy_server_message","producer",b"producer","sa",b"sa","ttl",b"ttl"]) -> None: ...
|
52
56
|
global___Task = Task
|
53
57
|
|
54
58
|
class TaskIns(google.protobuf.message.Message):
|
@@ -94,3 +98,134 @@ class TaskRes(google.protobuf.message.Message):
|
|
94
98
|
def HasField(self, field_name: typing_extensions.Literal["task",b"task"]) -> builtins.bool: ...
|
95
99
|
def ClearField(self, field_name: typing_extensions.Literal["group_id",b"group_id","task",b"task","task_id",b"task_id","workload_id",b"workload_id"]) -> None: ...
|
96
100
|
global___TaskRes = TaskRes
|
101
|
+
|
102
|
+
class Value(google.protobuf.message.Message):
|
103
|
+
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
104
|
+
class DoubleList(google.protobuf.message.Message):
|
105
|
+
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
106
|
+
VALS_FIELD_NUMBER: builtins.int
|
107
|
+
@property
|
108
|
+
def vals(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.float]: ...
|
109
|
+
def __init__(self,
|
110
|
+
*,
|
111
|
+
vals: typing.Optional[typing.Iterable[builtins.float]] = ...,
|
112
|
+
) -> None: ...
|
113
|
+
def ClearField(self, field_name: typing_extensions.Literal["vals",b"vals"]) -> None: ...
|
114
|
+
|
115
|
+
class Sint64List(google.protobuf.message.Message):
|
116
|
+
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
117
|
+
VALS_FIELD_NUMBER: builtins.int
|
118
|
+
@property
|
119
|
+
def vals(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.int]: ...
|
120
|
+
def __init__(self,
|
121
|
+
*,
|
122
|
+
vals: typing.Optional[typing.Iterable[builtins.int]] = ...,
|
123
|
+
) -> None: ...
|
124
|
+
def ClearField(self, field_name: typing_extensions.Literal["vals",b"vals"]) -> None: ...
|
125
|
+
|
126
|
+
class BoolList(google.protobuf.message.Message):
|
127
|
+
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
128
|
+
VALS_FIELD_NUMBER: builtins.int
|
129
|
+
@property
|
130
|
+
def vals(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.bool]: ...
|
131
|
+
def __init__(self,
|
132
|
+
*,
|
133
|
+
vals: typing.Optional[typing.Iterable[builtins.bool]] = ...,
|
134
|
+
) -> None: ...
|
135
|
+
def ClearField(self, field_name: typing_extensions.Literal["vals",b"vals"]) -> None: ...
|
136
|
+
|
137
|
+
class StringList(google.protobuf.message.Message):
|
138
|
+
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
139
|
+
VALS_FIELD_NUMBER: builtins.int
|
140
|
+
@property
|
141
|
+
def vals(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[typing.Text]: ...
|
142
|
+
def __init__(self,
|
143
|
+
*,
|
144
|
+
vals: typing.Optional[typing.Iterable[typing.Text]] = ...,
|
145
|
+
) -> None: ...
|
146
|
+
def ClearField(self, field_name: typing_extensions.Literal["vals",b"vals"]) -> None: ...
|
147
|
+
|
148
|
+
class BytesList(google.protobuf.message.Message):
|
149
|
+
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
150
|
+
VALS_FIELD_NUMBER: builtins.int
|
151
|
+
@property
|
152
|
+
def vals(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.bytes]: ...
|
153
|
+
def __init__(self,
|
154
|
+
*,
|
155
|
+
vals: typing.Optional[typing.Iterable[builtins.bytes]] = ...,
|
156
|
+
) -> None: ...
|
157
|
+
def ClearField(self, field_name: typing_extensions.Literal["vals",b"vals"]) -> None: ...
|
158
|
+
|
159
|
+
DOUBLE_FIELD_NUMBER: builtins.int
|
160
|
+
SINT64_FIELD_NUMBER: builtins.int
|
161
|
+
BOOL_FIELD_NUMBER: builtins.int
|
162
|
+
STRING_FIELD_NUMBER: builtins.int
|
163
|
+
BYTES_FIELD_NUMBER: builtins.int
|
164
|
+
DOUBLE_LIST_FIELD_NUMBER: builtins.int
|
165
|
+
SINT64_LIST_FIELD_NUMBER: builtins.int
|
166
|
+
BOOL_LIST_FIELD_NUMBER: builtins.int
|
167
|
+
STRING_LIST_FIELD_NUMBER: builtins.int
|
168
|
+
BYTES_LIST_FIELD_NUMBER: builtins.int
|
169
|
+
double: builtins.float
|
170
|
+
"""Single element"""
|
171
|
+
|
172
|
+
sint64: builtins.int
|
173
|
+
bool: builtins.bool
|
174
|
+
string: typing.Text
|
175
|
+
bytes: builtins.bytes
|
176
|
+
@property
|
177
|
+
def double_list(self) -> global___Value.DoubleList:
|
178
|
+
"""List types"""
|
179
|
+
pass
|
180
|
+
@property
|
181
|
+
def sint64_list(self) -> global___Value.Sint64List: ...
|
182
|
+
@property
|
183
|
+
def bool_list(self) -> global___Value.BoolList: ...
|
184
|
+
@property
|
185
|
+
def string_list(self) -> global___Value.StringList: ...
|
186
|
+
@property
|
187
|
+
def bytes_list(self) -> global___Value.BytesList: ...
|
188
|
+
def __init__(self,
|
189
|
+
*,
|
190
|
+
double: builtins.float = ...,
|
191
|
+
sint64: builtins.int = ...,
|
192
|
+
bool: builtins.bool = ...,
|
193
|
+
string: typing.Text = ...,
|
194
|
+
bytes: builtins.bytes = ...,
|
195
|
+
double_list: typing.Optional[global___Value.DoubleList] = ...,
|
196
|
+
sint64_list: typing.Optional[global___Value.Sint64List] = ...,
|
197
|
+
bool_list: typing.Optional[global___Value.BoolList] = ...,
|
198
|
+
string_list: typing.Optional[global___Value.StringList] = ...,
|
199
|
+
bytes_list: typing.Optional[global___Value.BytesList] = ...,
|
200
|
+
) -> None: ...
|
201
|
+
def HasField(self, field_name: typing_extensions.Literal["bool",b"bool","bool_list",b"bool_list","bytes",b"bytes","bytes_list",b"bytes_list","double",b"double","double_list",b"double_list","sint64",b"sint64","sint64_list",b"sint64_list","string",b"string","string_list",b"string_list","value",b"value"]) -> builtins.bool: ...
|
202
|
+
def ClearField(self, field_name: typing_extensions.Literal["bool",b"bool","bool_list",b"bool_list","bytes",b"bytes","bytes_list",b"bytes_list","double",b"double","double_list",b"double_list","sint64",b"sint64","sint64_list",b"sint64_list","string",b"string","string_list",b"string_list","value",b"value"]) -> None: ...
|
203
|
+
def WhichOneof(self, oneof_group: typing_extensions.Literal["value",b"value"]) -> typing.Optional[typing_extensions.Literal["double","sint64","bool","string","bytes","double_list","sint64_list","bool_list","string_list","bytes_list"]]: ...
|
204
|
+
global___Value = Value
|
205
|
+
|
206
|
+
class SecureAggregation(google.protobuf.message.Message):
|
207
|
+
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
208
|
+
class NamedValuesEntry(google.protobuf.message.Message):
|
209
|
+
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
210
|
+
KEY_FIELD_NUMBER: builtins.int
|
211
|
+
VALUE_FIELD_NUMBER: builtins.int
|
212
|
+
key: typing.Text
|
213
|
+
@property
|
214
|
+
def value(self) -> global___Value: ...
|
215
|
+
def __init__(self,
|
216
|
+
*,
|
217
|
+
key: typing.Text = ...,
|
218
|
+
value: typing.Optional[global___Value] = ...,
|
219
|
+
) -> None: ...
|
220
|
+
def HasField(self, field_name: typing_extensions.Literal["value",b"value"]) -> builtins.bool: ...
|
221
|
+
def ClearField(self, field_name: typing_extensions.Literal["key",b"key","value",b"value"]) -> None: ...
|
222
|
+
|
223
|
+
NAMED_VALUES_FIELD_NUMBER: builtins.int
|
224
|
+
@property
|
225
|
+
def named_values(self) -> google.protobuf.internal.containers.MessageMap[typing.Text, global___Value]: ...
|
226
|
+
def __init__(self,
|
227
|
+
*,
|
228
|
+
named_values: typing.Optional[typing.Mapping[typing.Text, global___Value]] = ...,
|
229
|
+
) -> None: ...
|
230
|
+
def ClearField(self, field_name: typing_extensions.Literal["named_values",b"named_values"]) -> None: ...
|
231
|
+
global___SecureAggregation = SecureAggregation
|