flwr-nightly 1.16.0.dev20250305__py3-none-any.whl → 1.16.0.dev20250307__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.
Files changed (32) hide show
  1. flwr/client/message_handler/message_handler.py +1 -1
  2. flwr/client/rest_client/connection.py +4 -6
  3. flwr/common/message.py +7 -7
  4. flwr/common/record/recordset.py +4 -12
  5. flwr/common/serde.py +8 -126
  6. flwr/server/compat/driver_client_proxy.py +2 -2
  7. flwr/server/driver/driver.py +1 -1
  8. flwr/server/driver/grpc_driver.py +1 -1
  9. flwr/server/driver/inmemory_driver.py +17 -20
  10. flwr/server/superlink/driver/serverappio_servicer.py +18 -23
  11. flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +2 -2
  12. flwr/server/superlink/fleet/message_handler/message_handler.py +8 -12
  13. flwr/server/superlink/fleet/vce/backend/backend.py +1 -1
  14. flwr/server/superlink/fleet/vce/vce_api.py +32 -35
  15. flwr/server/superlink/linkstate/in_memory_linkstate.py +1 -221
  16. flwr/server/superlink/linkstate/linkstate.py +0 -113
  17. flwr/server/superlink/linkstate/sqlite_linkstate.py +2 -511
  18. flwr/server/superlink/linkstate/utils.py +2 -179
  19. flwr/server/utils/__init__.py +0 -2
  20. flwr/server/utils/validator.py +0 -88
  21. flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +3 -3
  22. flwr/superexec/exec_servicer.py +3 -3
  23. {flwr_nightly-1.16.0.dev20250305.dist-info → flwr_nightly-1.16.0.dev20250307.dist-info}/METADATA +1 -1
  24. {flwr_nightly-1.16.0.dev20250305.dist-info → flwr_nightly-1.16.0.dev20250307.dist-info}/RECORD +27 -32
  25. flwr/client/message_handler/task_handler.py +0 -37
  26. flwr/proto/task_pb2.py +0 -33
  27. flwr/proto/task_pb2.pyi +0 -100
  28. flwr/proto/task_pb2_grpc.py +0 -4
  29. flwr/proto/task_pb2_grpc.pyi +0 -4
  30. {flwr_nightly-1.16.0.dev20250305.dist-info → flwr_nightly-1.16.0.dev20250307.dist-info}/LICENSE +0 -0
  31. {flwr_nightly-1.16.0.dev20250305.dist-info → flwr_nightly-1.16.0.dev20250307.dist-info}/WHEEL +0 -0
  32. {flwr_nightly-1.16.0.dev20250305.dist-info → flwr_nightly-1.16.0.dev20250307.dist-info}/entry_points.txt +0 -0
@@ -15,30 +15,17 @@
15
15
  """Utility functions for State."""
16
16
 
17
17
 
18
- from logging import ERROR
19
18
  from os import urandom
20
- from typing import Optional, Union
19
+ from typing import Optional
21
20
  from uuid import UUID, uuid4
22
21
 
23
- from flwr.common import (
24
- ConfigsRecord,
25
- Context,
26
- Error,
27
- Message,
28
- Metadata,
29
- log,
30
- now,
31
- serde,
32
- )
22
+ from flwr.common import ConfigsRecord, Context, Error, Message, Metadata, now, serde
33
23
  from flwr.common.constant import SUPERLINK_NODE_ID, ErrorCode, Status, SubStatus
34
24
  from flwr.common.typing import RunStatus
35
25
 
36
26
  # pylint: disable=E0611
37
- from flwr.proto.error_pb2 import Error as ProtoError
38
27
  from flwr.proto.message_pb2 import Context as ProtoContext
39
- from flwr.proto.node_pb2 import Node
40
28
  from flwr.proto.recordset_pb2 import ConfigsRecord as ProtoConfigsRecord
41
- from flwr.proto.task_pb2 import Task, TaskIns, TaskRes
42
29
 
43
30
  # pylint: enable=E0611
44
31
 
@@ -244,80 +231,6 @@ def has_valid_sub_status(status: RunStatus) -> bool:
244
231
  return status.sub_status == ""
245
232
 
246
233
 
247
- def create_taskres_for_unavailable_taskins(taskins_id: Union[str, UUID]) -> TaskRes:
248
- """Generate a TaskRes with a TaskIns unavailable error.
249
-
250
- Parameters
251
- ----------
252
- taskins_id : Union[str, UUID]
253
- The ID of the unavailable TaskIns.
254
-
255
- Returns
256
- -------
257
- TaskRes
258
- A TaskRes with an error code MESSAGE_UNAVAILABLE to indicate that the
259
- inquired TaskIns ID cannot be found (due to non-existence or expiration).
260
- """
261
- current_time = now().timestamp()
262
- return TaskRes(
263
- task_id=str(uuid4()),
264
- group_id="", # Unknown group ID
265
- run_id=0, # Unknown run ID
266
- task=Task(
267
- # This function is only called by SuperLink, and thus it's the producer.
268
- producer=Node(node_id=SUPERLINK_NODE_ID),
269
- consumer=Node(node_id=SUPERLINK_NODE_ID),
270
- created_at=current_time,
271
- ttl=0,
272
- ancestry=[str(taskins_id)],
273
- task_type="", # Unknown message type
274
- error=ProtoError(
275
- code=ErrorCode.MESSAGE_UNAVAILABLE,
276
- reason=MESSAGE_UNAVAILABLE_ERROR_REASON,
277
- ),
278
- ),
279
- )
280
-
281
-
282
- def create_taskres_for_unavailable_taskres(ref_taskins: TaskIns) -> TaskRes:
283
- """Generate a TaskRes with a reply message unavailable error from a TaskIns.
284
-
285
- Parameters
286
- ----------
287
- ref_taskins : TaskIns
288
- The reference TaskIns object.
289
-
290
- Returns
291
- -------
292
- TaskRes
293
- The generated TaskRes with an error code REPLY_MESSAGE_UNAVAILABLE_ERROR_REASON,
294
- indicating that the original TaskRes has expired.
295
- """
296
- current_time = now().timestamp()
297
- ttl = ref_taskins.task.ttl - (current_time - ref_taskins.task.created_at)
298
- if ttl < 0:
299
- log(ERROR, "Creating TaskRes for TaskIns that exceeds its TTL.")
300
- ttl = 0
301
- return TaskRes(
302
- task_id=str(uuid4()),
303
- group_id=ref_taskins.group_id,
304
- run_id=ref_taskins.run_id,
305
- task=Task(
306
- # This function is only called by SuperLink, and thus it's the producer.
307
- producer=Node(node_id=SUPERLINK_NODE_ID),
308
- consumer=Node(node_id=SUPERLINK_NODE_ID),
309
- created_at=current_time,
310
- ttl=ttl,
311
- ancestry=[ref_taskins.task_id],
312
- task_type=ref_taskins.task.task_type,
313
- error=ProtoError(
314
- code=ErrorCode.REPLY_MESSAGE_UNAVAILABLE,
315
- reason=REPLY_MESSAGE_UNAVAILABLE_ERROR_REASON,
316
- ),
317
- ),
318
- )
319
-
320
-
321
234
  def create_message_error_unavailable_res_message(ins_metadata: Metadata) -> Message:
322
235
  """Generate an error Message that the SuperLink returns carrying the specified
323
236
  error."""
@@ -366,55 +279,11 @@ def create_message_error_unavailable_ins_message(reply_to_message: UUID) -> Mess
366
279
  )
367
280
 
368
281
 
369
- def has_expired(task_ins_or_res: Union[TaskIns, TaskRes], current_time: float) -> bool:
370
- """Check if the TaskIns/TaskRes has expired."""
371
- return task_ins_or_res.task.ttl + task_ins_or_res.task.created_at < current_time
372
-
373
-
374
282
  def message_ttl_has_expired(message_metadata: Metadata, current_time: float) -> bool:
375
283
  """Check if the Message has expired."""
376
284
  return message_metadata.ttl + message_metadata.created_at < current_time
377
285
 
378
286
 
379
- def verify_taskins_ids(
380
- inquired_taskins_ids: set[UUID],
381
- found_taskins_dict: dict[UUID, TaskIns],
382
- current_time: Optional[float] = None,
383
- update_set: bool = True,
384
- ) -> dict[UUID, TaskRes]:
385
- """Verify found TaskIns and generate error TaskRes for invalid ones.
386
-
387
- Parameters
388
- ----------
389
- inquired_taskins_ids : set[UUID]
390
- Set of TaskIns IDs for which to generate error TaskRes if invalid.
391
- found_taskins_dict : dict[UUID, TaskIns]
392
- Dictionary containing all found TaskIns indexed by their IDs.
393
- current_time : Optional[float] (default: None)
394
- The current time to check for expiration. If set to `None`, the current time
395
- will automatically be set to the current timestamp using `now().timestamp()`.
396
- update_set : bool (default: True)
397
- If True, the `inquired_taskins_ids` will be updated to remove invalid ones,
398
- by default True.
399
-
400
- Returns
401
- -------
402
- dict[UUID, TaskRes]
403
- A dictionary of error TaskRes indexed by the corresponding TaskIns ID.
404
- """
405
- ret_dict = {}
406
- current = current_time if current_time else now().timestamp()
407
- for taskins_id in list(inquired_taskins_ids):
408
- # Generate error TaskRes if the task_ins doesn't exist or has expired
409
- taskins = found_taskins_dict.get(taskins_id)
410
- if taskins is None or has_expired(taskins, current):
411
- if update_set:
412
- inquired_taskins_ids.remove(taskins_id)
413
- taskres = create_taskres_for_unavailable_taskins(taskins_id)
414
- ret_dict[taskins_id] = taskres
415
- return ret_dict
416
-
417
-
418
287
  def verify_message_ids(
419
288
  inquired_message_ids: set[UUID],
420
289
  found_message_ins_dict: dict[UUID, Message],
@@ -457,52 +326,6 @@ def verify_message_ids(
457
326
  return ret_dict
458
327
 
459
328
 
460
- def verify_found_taskres(
461
- inquired_taskins_ids: set[UUID],
462
- found_taskins_dict: dict[UUID, TaskIns],
463
- found_taskres_list: list[TaskRes],
464
- current_time: Optional[float] = None,
465
- update_set: bool = True,
466
- ) -> dict[UUID, TaskRes]:
467
- """Verify found TaskRes and generate error TaskRes for invalid ones.
468
-
469
- Parameters
470
- ----------
471
- inquired_taskins_ids : set[UUID]
472
- Set of TaskIns IDs for which to generate error TaskRes if invalid.
473
- found_taskins_dict : dict[UUID, TaskIns]
474
- Dictionary containing all found TaskIns indexed by their IDs.
475
- found_taskres_list : dict[TaskIns, TaskRes]
476
- List of found TaskRes to be verified.
477
- current_time : Optional[float] (default: None)
478
- The current time to check for expiration. If set to `None`, the current time
479
- will automatically be set to the current timestamp using `now().timestamp()`.
480
- update_set : bool (default: True)
481
- If True, the `inquired_taskins_ids` will be updated to remove ones
482
- that have a TaskRes, by default True.
483
-
484
- Returns
485
- -------
486
- dict[UUID, TaskRes]
487
- A dictionary of TaskRes indexed by the corresponding TaskIns ID.
488
- """
489
- ret_dict: dict[UUID, TaskRes] = {}
490
- current = current_time if current_time else now().timestamp()
491
- for taskres in found_taskres_list:
492
- taskins_id = UUID(taskres.task.ancestry[0])
493
- if update_set:
494
- inquired_taskins_ids.remove(taskins_id)
495
- # Check if the TaskRes has expired
496
- if has_expired(taskres, current):
497
- # No need to insert the error TaskRes
498
- taskres = create_taskres_for_unavailable_taskres(
499
- found_taskins_dict[taskins_id]
500
- )
501
- taskres.task.delivered_at = now().isoformat()
502
- ret_dict[taskins_id] = taskres
503
- return ret_dict
504
-
505
-
506
329
  def verify_found_message_replies(
507
330
  inquired_message_ids: set[UUID],
508
331
  found_message_ins_dict: dict[UUID, Message],
@@ -17,10 +17,8 @@
17
17
 
18
18
  from .tensorboard import tensorboard as tensorboard
19
19
  from .validator import validate_message as validate_message
20
- from .validator import validate_task_ins_or_res as validate_task_ins_or_res
21
20
 
22
21
  __all__ = [
23
22
  "tensorboard",
24
23
  "validate_message",
25
- "validate_task_ins_or_res",
26
24
  ]
@@ -16,97 +16,9 @@
16
16
 
17
17
 
18
18
  import time
19
- from typing import Union
20
19
 
21
20
  from flwr.common import Message
22
21
  from flwr.common.constant import SUPERLINK_NODE_ID
23
- from flwr.proto.task_pb2 import TaskIns, TaskRes # pylint: disable=E0611
24
-
25
-
26
- # pylint: disable-next=too-many-branches,too-many-statements
27
- def validate_task_ins_or_res(tasks_ins_res: Union[TaskIns, TaskRes]) -> list[str]:
28
- """Validate a TaskIns or TaskRes."""
29
- validation_errors = []
30
-
31
- if tasks_ins_res.task_id != "":
32
- validation_errors.append("non-empty `task_id`")
33
-
34
- if not tasks_ins_res.HasField("task"):
35
- validation_errors.append("`task` does not set field `task`")
36
-
37
- # Created/delivered/TTL/Pushed
38
- if (
39
- tasks_ins_res.task.created_at < 1711497600.0
40
- ): # unix timestamp of 27 March 2024 00h:00m:00s UTC
41
- validation_errors.append(
42
- "`created_at` must be a float that records the unix timestamp "
43
- "in seconds when the message was created."
44
- )
45
- if tasks_ins_res.task.delivered_at != "":
46
- validation_errors.append("`delivered_at` must be an empty str")
47
- if tasks_ins_res.task.ttl <= 0:
48
- validation_errors.append("`ttl` must be higher than zero")
49
-
50
- # Verify TTL and created_at time
51
- current_time = time.time()
52
- if tasks_ins_res.task.created_at + tasks_ins_res.task.ttl <= current_time:
53
- validation_errors.append("Task TTL has expired")
54
-
55
- # TaskIns specific
56
- if isinstance(tasks_ins_res, TaskIns):
57
- # Task producer
58
- if not tasks_ins_res.task.HasField("producer"):
59
- validation_errors.append("`producer` does not set field `producer`")
60
- if tasks_ins_res.task.producer.node_id != SUPERLINK_NODE_ID:
61
- validation_errors.append(f"`producer.node_id` is not {SUPERLINK_NODE_ID}")
62
-
63
- # Task consumer
64
- if not tasks_ins_res.task.HasField("consumer"):
65
- validation_errors.append("`consumer` does not set field `consumer`")
66
- if tasks_ins_res.task.consumer.node_id == SUPERLINK_NODE_ID:
67
- validation_errors.append("consumer MUST provide a valid `node_id`")
68
-
69
- # Content check
70
- if tasks_ins_res.task.task_type == "":
71
- validation_errors.append("`task_type` MUST be set")
72
- if not (
73
- tasks_ins_res.task.HasField("recordset")
74
- ^ tasks_ins_res.task.HasField("error")
75
- ):
76
- validation_errors.append("Either `recordset` or `error` MUST be set")
77
-
78
- # Ancestors
79
- if len(tasks_ins_res.task.ancestry) != 0:
80
- validation_errors.append("`ancestry` is not empty")
81
-
82
- # TaskRes specific
83
- if isinstance(tasks_ins_res, TaskRes):
84
- # Task producer
85
- if not tasks_ins_res.task.HasField("producer"):
86
- validation_errors.append("`producer` does not set field `producer`")
87
- if tasks_ins_res.task.producer.node_id == SUPERLINK_NODE_ID:
88
- validation_errors.append("producer MUST provide a valid `node_id`")
89
-
90
- # Task consumer
91
- if not tasks_ins_res.task.HasField("consumer"):
92
- validation_errors.append("`consumer` does not set field `consumer`")
93
- if tasks_ins_res.task.consumer.node_id != SUPERLINK_NODE_ID:
94
- validation_errors.append(f"consumer is not {SUPERLINK_NODE_ID}")
95
-
96
- # Content check
97
- if tasks_ins_res.task.task_type == "":
98
- validation_errors.append("`task_type` MUST be set")
99
- if not (
100
- tasks_ins_res.task.HasField("recordset")
101
- ^ tasks_ins_res.task.HasField("error")
102
- ):
103
- validation_errors.append("Either `recordset` or `error` MUST be set")
104
-
105
- # Ancestors
106
- if len(tasks_ins_res.task.ancestry) == 0:
107
- validation_errors.append("`ancestry` is empty")
108
-
109
- return validation_errors
110
22
 
111
23
 
112
24
  # pylint: disable-next=too-many-branches
@@ -367,7 +367,7 @@ class SecAggPlusWorkflow:
367
367
 
368
368
  # Send setup configuration to clients
369
369
  cfgs_record = ConfigsRecord(sa_params_dict) # type: ignore
370
- content = RecordSet(configs_records={RECORD_KEY_CONFIGS: cfgs_record})
370
+ content = RecordSet({RECORD_KEY_CONFIGS: cfgs_record})
371
371
 
372
372
  def make(nid: int) -> Message:
373
373
  return driver.create_message(
@@ -417,7 +417,7 @@ class SecAggPlusWorkflow:
417
417
  {str(nid): state.nid_to_publickeys[nid] for nid in neighbours}
418
418
  )
419
419
  cfgs_record[Key.STAGE] = Stage.SHARE_KEYS
420
- content = RecordSet(configs_records={RECORD_KEY_CONFIGS: cfgs_record})
420
+ content = RecordSet({RECORD_KEY_CONFIGS: cfgs_record})
421
421
  return driver.create_message(
422
422
  content=content,
423
423
  message_type=MessageType.TRAIN,
@@ -566,7 +566,7 @@ class SecAggPlusWorkflow:
566
566
  Key.DEAD_NODE_ID_LIST: list(neighbours & dead_nids),
567
567
  }
568
568
  cfgs_record = ConfigsRecord(cfgs_dict) # type: ignore
569
- content = RecordSet(configs_records={RECORD_KEY_CONFIGS: cfgs_record})
569
+ content = RecordSet({RECORD_KEY_CONFIGS: cfgs_record})
570
570
  return driver.create_message(
571
571
  content=content,
572
572
  message_type=MessageType.TRAIN,
@@ -163,10 +163,10 @@ class ExecServicer(exec_pb2_grpc.ExecServicer):
163
163
  )
164
164
 
165
165
  if update_success:
166
- task_ids: set[UUID] = state.get_task_ids_from_run_id(request.run_id)
166
+ message_ids: set[UUID] = state.get_message_ids_from_run_id(request.run_id)
167
167
 
168
- # Delete TaskIns and TaskRes for the `run_id`
169
- state.delete_tasks(task_ids)
168
+ # Delete Messages and their replies for the `run_id`
169
+ state.delete_messages(message_ids)
170
170
 
171
171
  return StopRunResponse(success=update_success)
172
172
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: flwr-nightly
3
- Version: 1.16.0.dev20250305
3
+ Version: 1.16.0.dev20250307
4
4
  Summary: Flower: A Friendly Federated AI Framework
5
5
  Home-page: https://flower.ai
6
6
  License: Apache-2.0
@@ -90,8 +90,7 @@ flwr/client/grpc_rere_client/connection.py,sha256=CHC5ssg7SMIN78JsWFKHg2P_fT2G_N
90
90
  flwr/client/grpc_rere_client/grpc_adapter.py,sha256=4EixBCeceM-nLu-eqB1jr0pXaGdkvoSbKmrY1ushQok,5601
91
91
  flwr/client/heartbeat.py,sha256=cx37mJBH8LyoIN4Lks85wtqT1mnU5GulQnr4pGCvAq0,2404
92
92
  flwr/client/message_handler/__init__.py,sha256=QxxQuBNpFPTHx3KiUNvQSlqMKlEnbRR1kFfc1KVje08,719
93
- flwr/client/message_handler/message_handler.py,sha256=s7FEfYJp5QB259Pj1L94_9AC24Kh5JyKC2U-E6eNkkY,6492
94
- flwr/client/message_handler/task_handler.py,sha256=zr5H2jJNKBTSI4hNGpMxbBAKUP0wSdHCJPAYjQYCxDw,1310
93
+ flwr/client/message_handler/message_handler.py,sha256=FspUe8JmH8pROpANZVjNtxHX-07yi9A6poLZ9Ro7WK4,6492
95
94
  flwr/client/mod/__init__.py,sha256=37XeXZLFq_tzFVKVtC9JaigM2bSAU7BrGQvMPCE3Q28,1159
96
95
  flwr/client/mod/centraldp_mods.py,sha256=UGwNuqpmOWfLdfJITFgdi1TG-nLjuSb-cbEyoyfDgxQ,5415
97
96
  flwr/client/mod/comms_mods.py,sha256=s_H57ZXUPaWFifodCbRCOZW06IZRsilcOr9F-yWBtxg,2625
@@ -106,7 +105,7 @@ flwr/client/nodestate/nodestate.py,sha256=CmHZdR6kVO8tkffg42W0Yb9JdRmrUonZ9deXfU
106
105
  flwr/client/nodestate/nodestate_factory.py,sha256=apUbcJG0a_FUVsc0TkNN3q9yovc9u_J34u9iuLFKTLQ,1430
107
106
  flwr/client/numpy_client.py,sha256=chTkL9dOtK_wgUoYtzp5mfDOC1k8xPAd1qPIsB3hcjA,9581
108
107
  flwr/client/rest_client/__init__.py,sha256=5KGlp7pjc1dhNRkKlaNtUfQmg8wrRFh9lS3P3uRS-7Q,735
109
- flwr/client/rest_client/connection.py,sha256=9_JDGHkmaiPgk6CmcQId56Ia1ucQfrqcpNOUObdZaZU,13008
108
+ flwr/client/rest_client/connection.py,sha256=c0mHsNXHAsbX4zNelbGd2qrV3vj90FfNE6FsiD6JzuY,12904
110
109
  flwr/client/run_info_store.py,sha256=ZN2Phi4DSLbSyzg8RmzJcVYh1g6eurHOmWRCT7GMtw4,4040
111
110
  flwr/client/supernode/__init__.py,sha256=SUhWOzcgXRNXk1V9UgB5-FaWukqqrOEajVUHEcPkwyQ,865
112
111
  flwr/client/supernode/app.py,sha256=oBbggh56HoieksBkTdDHAJC8VUFbrmGOP0-D9wdcZek,9265
@@ -131,7 +130,7 @@ flwr/common/exit/exit_code.py,sha256=PNEnCrZfOILjfDAFu5m-2YWEJBrk97xglq4zCUlqV7E
131
130
  flwr/common/exit_handlers.py,sha256=yclujry30954o0lI7vtknTajskPCvK8TXw2V3RdldXU,3174
132
131
  flwr/common/grpc.py,sha256=K60AIvIqH0CvkkiqBfw5HoxQfbFOL2DrhKPjbZ8raIE,9786
133
132
  flwr/common/logger.py,sha256=Hund1C6bEhMw3GemlzuFK22tXZ27YeHLrFB0b4LP5f8,13041
134
- flwr/common/message.py,sha256=VcGIBkb0te_OIKy22k4oHiOVrx0B2-8S1Gxmq0QLzTg,14210
133
+ flwr/common/message.py,sha256=rWH_JIPnIo263-pC6Ps6XWmIgakRJA_AMBYwhE0qHcQ,14251
135
134
  flwr/common/object_ref.py,sha256=DXL8NtbN17DSYaR-Zc8WYhaG8rv0_D_cclvP7Sa66So,9134
136
135
  flwr/common/parameter.py,sha256=-bFAUayToYDF50FZGrBC1hQYJCQDtB2bbr3ZuVLMtdE,2095
137
136
  flwr/common/pyproject.py,sha256=vEAxl800XiJ1JNJDui8vuVV-08msnB6hLt7o95viZl0,1386
@@ -140,7 +139,7 @@ flwr/common/record/configsrecord.py,sha256=i40jOzBx04ysZKECwaw4FdUXMdY9HgdY8GAqK
140
139
  flwr/common/record/conversion_utils.py,sha256=ZcsM-vTm_rVtLXLFD2RY3N47V_hUr3ywTdtnpVXnOGU,1202
141
140
  flwr/common/record/metricsrecord.py,sha256=UywkEPbifiu_IyPUFoDJCi8WEVLujlqZERUWAWpc3vs,5752
142
141
  flwr/common/record/parametersrecord.py,sha256=rR0LbeNrKrdK37CiAA56Z5WBq-ZzZ2YNSUkcmr5i2lI,12950
143
- flwr/common/record/recordset.py,sha256=gY3nmE--8sXSIPEFMReq7nh6hMiF-sr0HpfUtiB65E8,8890
142
+ flwr/common/record/recordset.py,sha256=ambtB74uF1pooQTfcBt1_xWsjvyDjGMc6awEt20ur2A,8547
144
143
  flwr/common/record/typeddict.py,sha256=q5hL2xkXymuiCprHWb69mUmLpWQk_XXQq0hGQ69YPaw,3599
145
144
  flwr/common/recordset_compat.py,sha256=ViSwA26h6Q55ZmV1LLjSJpcKiipV-p_JpCj4wxdE-Ow,14230
146
145
  flwr/common/retry_invoker.py,sha256=UIDKsn0AitS3fOr43WTqZAdD-TaHkBeTj1QxD7SGba0,14481
@@ -152,7 +151,7 @@ flwr/common/secure_aggregation/ndarrays_arithmetic.py,sha256=zvVAIrIyI6OSzGhpCi8
152
151
  flwr/common/secure_aggregation/quantization.py,sha256=NE_ltC3Fx5Z3bMKqJHA95wQf2tkGQlN0VZf3d1w5ABA,2400
153
152
  flwr/common/secure_aggregation/secaggplus_constants.py,sha256=9MF-oQh62uD7rt9VeNB-rHf2gBLd5GL3S9OejCxmILY,2183
154
153
  flwr/common/secure_aggregation/secaggplus_utils.py,sha256=OgYd68YBRaHQYLc-YdExj9CSpwL58bVTaPrdHoAj2AE,3214
155
- flwr/common/serde.py,sha256=iDVS5IXGKqEuzQAvnroH9c6KFEHxKFEWmkGP89PMOO0,31064
154
+ flwr/common/serde.py,sha256=dgPUMPoKh8r09NERMgfnZKmEiGuKVBje7bSVFwJVZyk,27340
156
155
  flwr/common/telemetry.py,sha256=APKVubU_zJNrE-M_rip6S6Fsu41DxY3tAjFWNOgTmC0,9086
157
156
  flwr/common/typing.py,sha256=Prl8_4tKnIl_Kh5UjJGbw1tnld543EkXrX0RWffJpiA,6900
158
157
  flwr/common/version.py,sha256=aNSxLL49RKeLz8sPcZrsTEWtrAeQ0uxu6tjmfba4O60,1325
@@ -209,10 +208,6 @@ flwr/proto/simulationio_pb2.py,sha256=GOOmivAJPLQ6mPXrfKS8CyYeE6Kk-Q5mInLz5pyZSs
209
208
  flwr/proto/simulationio_pb2.pyi,sha256=oXx8_FLBe5B54wduZj-f89kub73XxNtQbThuW8YfPAs,2660
210
209
  flwr/proto/simulationio_pb2_grpc.py,sha256=9I3yAfJaeMuG-qH_5Ge45eFOftsIOmL9b8E_xHmcvKw,11232
211
210
  flwr/proto/simulationio_pb2_grpc.pyi,sha256=YHvKtyo7UdbBgdhoN0ndzZeB5vIC3JuR5PAJLrl-OKM,3206
212
- flwr/proto/task_pb2.py,sha256=pFKpq2QSvmFQOEpv2bgCG9jPAVauIHXQ9p5ASW-Z6lE,2322
213
- flwr/proto/task_pb2.pyi,sha256=PZXt-QkD-hFzTlgNVVx6SGvgbTCweBfisivEi_HfDWc,4183
214
- flwr/proto/task_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
215
- flwr/proto/task_pb2_grpc.pyi,sha256=ff2TSiLVnG6IVQcTGzb2DIH3XRSoAvAo_RMcvbMFyc0,76
216
211
  flwr/proto/transport_pb2.py,sha256=P-jX_tUyk_8xFe-vIUUSfZlHGtk2Ou3A8eXdBKkp5AY,9824
217
212
  flwr/proto/transport_pb2.pyi,sha256=ipHQ03eFBqsxtAuAVefZ2lVr04BZ4YifJCS2eauNmy8,21627
218
213
  flwr/proto/transport_pb2_grpc.py,sha256=vLN3EHtx2aEEMCO4f1Upu-l27BPzd3-5pV-u8wPcosk,2598
@@ -225,13 +220,13 @@ flwr/server/client_proxy.py,sha256=4G-oTwhb45sfWLx2uZdcXD98IZwdTS6F88xe3akCdUg,2
225
220
  flwr/server/compat/__init__.py,sha256=VxnJtJyOjNFQXMNi9hIuzNlZM5n0Hj1p3aq_Pm2udw4,892
226
221
  flwr/server/compat/app.py,sha256=Y0xAqXLn20e6XKGb2nHdeUYdCj_Dux-SyFCc-5ivhqk,3369
227
222
  flwr/server/compat/app_utils.py,sha256=568PfvPME8KHjX-L5GB2rYQa_Wy8iUBGs22KJqn8Xk0,3824
228
- flwr/server/compat/driver_client_proxy.py,sha256=jMmrfqSm4-qW0jOCTpHhN9Kw0ohfMwsyKU9buBzrfG0,4958
223
+ flwr/server/compat/driver_client_proxy.py,sha256=1ElUYvn85iMbxfyjbPiGGlmdWzNqKIIgrGJgZ18uS4E,4964
229
224
  flwr/server/compat/legacy_context.py,sha256=wBzBcfV6YO6IQGriM_FdJ5XZfiBBEEJdS_OdAiF47dY,1804
230
225
  flwr/server/criterion.py,sha256=ypbAexbztzGUxNen9RCHF91QeqiEQix4t4Ih3E-42MM,1061
231
226
  flwr/server/driver/__init__.py,sha256=bikRv6CjTwSvYh7tf10gziU5o2YotOWhhftz2tr3KDc,886
232
- flwr/server/driver/driver.py,sha256=u_fMfqLYTroTafGCNwKPHI4lttRL-Z5CqeT3_FHSq-Q,5701
233
- flwr/server/driver/grpc_driver.py,sha256=3mSws0l83fWD4aq9-MmHFnIfyf4REoAXUkWfyJDHros,9864
234
- flwr/server/driver/inmemory_driver.py,sha256=7ZtWDDJa8xupPAHNaDdCE2DOIOIYgrffmJMdKjs3wdA,6616
227
+ flwr/server/driver/driver.py,sha256=X072eFWl8Kx-aZbahTkpAc1wwoojr8A4uO2yozwwSbE,5705
228
+ flwr/server/driver/grpc_driver.py,sha256=CLa9pxN2yf1lIdxkFHVVWrs_9EFHSNUU9SJluNIQwKM,9868
229
+ flwr/server/driver/inmemory_driver.py,sha256=p6p9RykDfoty94izzD4i11Xp7A8t1KUaHpbKbbVZAdU,6407
235
230
  flwr/server/history.py,sha256=qSb5_pPTrwofpSYGsZWzMPkl_4uJ4mJFWesxXDrEvDU,5026
236
231
  flwr/server/run_serverapp.py,sha256=vIPhvJx0i5sEZO4IKM6ruCXmx4ncat76rh0B4KhdhhM,2446
237
232
  flwr/server/server.py,sha256=1ZsFEptmAV-L2vP2etNC9Ed5CLSxpuKzUFkAPQ4l5Xc,17893
@@ -267,7 +262,7 @@ flwr/server/strategy/strategy.py,sha256=cXapkD5uDrt5C-RbmWDn9FLoap3Q41i7GKvbmfbC
267
262
  flwr/server/superlink/__init__.py,sha256=8tHYCfodUlRD8PCP9fHgvu8cz5N31A2QoRVL0jDJ15E,707
268
263
  flwr/server/superlink/driver/__init__.py,sha256=5soEK5QSvxNjmJQ-CGTWROc4alSAeU0e9Ad9RDhsd3E,717
269
264
  flwr/server/superlink/driver/serverappio_grpc.py,sha256=UzHwo6qYZMeOhr7nn1iZbcyDSmwvnq_kpYH0mEAndW0,2173
270
- flwr/server/superlink/driver/serverappio_servicer.py,sha256=hT_fM32ya3SxZFHNmfI7u2qQ_apbNHTUZB3cw6WRsmw,13116
265
+ flwr/server/superlink/driver/serverappio_servicer.py,sha256=sZKqHOLM7sOqOlnNedwWpPNAqx5hV43bSx6eo6fbfak,12953
271
266
  flwr/server/superlink/ffs/__init__.py,sha256=FAY-zShcfPmOxosok2QyT6hTNMNctG8cH9s_nIl8jkI,840
272
267
  flwr/server/superlink/ffs/disk_ffs.py,sha256=n_Ah0sQwXGVQ9wj5965nLjdkQQbpoHCljjXKFnwftsU,3297
273
268
  flwr/server/superlink/ffs/ffs.py,sha256=qLI1UfosJugu2BKOJWqHIhafTm-YiuKqGf3OGWPH0NM,2395
@@ -281,37 +276,37 @@ flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py,sha256=JkAH_nIZaqe_9kntrg26
281
276
  flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py,sha256=h3EhqgelegVC4EjOXH5birmAnMoCBJcP7jpHYCnHZPk,4887
282
277
  flwr/server/superlink/fleet/grpc_bidi/grpc_server.py,sha256=mxPxyEF0IW0vV41Bqk1zfKOdRDEvXPwzJyMiRMg7nTI,5173
283
278
  flwr/server/superlink/fleet/grpc_rere/__init__.py,sha256=j2hyC342am-_Hgp1g80Y3fGDzfTI6n8QOOn2PyWf4eg,758
284
- flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py,sha256=syWWZgsU3PHvIuvSoJxUTbEdkOtyV6psXAbRowNE_yY,5533
279
+ flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py,sha256=_J8kmdYiRoT8iUJenYic674VjX2lot8iigN3vnaWfMg,5528
285
280
  flwr/server/superlink/fleet/grpc_rere/server_interceptor.py,sha256=KPgAcnYsKPPI7_iYNSnqGbyv4tsqZuBqrTiREwVBJiM,6984
286
281
  flwr/server/superlink/fleet/message_handler/__init__.py,sha256=h8oLD7uo5lKICPy0rRdKRjTYe62u8PKkT_fA4xF5JPA,731
287
- flwr/server/superlink/fleet/message_handler/message_handler.py,sha256=QpLo3E-viPQ1Ia4isRM21htCfU3QH0P4wqMfXAtX8Hk,5412
282
+ flwr/server/superlink/fleet/message_handler/message_handler.py,sha256=1pC9U-9D7Nhh9bwRZjtLxgz3osgG-tcXS-k-cAQjeF0,5242
288
283
  flwr/server/superlink/fleet/rest_rere/__init__.py,sha256=5jbYbAn75sGv-gBwOPDySE0kz96F6dTYLeMrGqNi4lM,735
289
284
  flwr/server/superlink/fleet/rest_rere/rest_api.py,sha256=L7sg9Uyp7l1bViYNWjnpaDvcG_j7FYKWC1XL-8bMpsg,6710
290
285
  flwr/server/superlink/fleet/vce/__init__.py,sha256=TZJsKTpYO_djv2EXx9Ji62I8TA0JiZF8jvRyJRZkAes,784
291
286
  flwr/server/superlink/fleet/vce/backend/__init__.py,sha256=cGgal5qpd0_MwEdIqjJbHHSIgGa6GSPoI5_byUwtG_k,1437
292
- flwr/server/superlink/fleet/vce/backend/backend.py,sha256=LBAQxnbfPAphVOVIvYMj0QIvVP5O-RQxKQlUGNUj974,2194
287
+ flwr/server/superlink/fleet/vce/backend/backend.py,sha256=lr_uBMaoCp7qs59ZRpCI07wp-EsClNB-7QWFfF0r95c,2195
293
288
  flwr/server/superlink/fleet/vce/backend/raybackend.py,sha256=jsUkFEVQTnrucK1jNQ_cUM8YwL7W4MQNA1GAf8ibRdg,7156
294
- flwr/server/superlink/fleet/vce/vce_api.py,sha256=iXNSAJ7f8Sg1hOrVuRTGRkLdSWeFIpNWbusoOTc4I8I,12971
289
+ flwr/server/superlink/fleet/vce/vce_api.py,sha256=xQbWzfIsXYwcEHoYxrgDcx3yGJKUoBdkc8zkJ8onzBs,12802
295
290
  flwr/server/superlink/linkstate/__init__.py,sha256=v-2JyJlCB3qyhMNwMjmcNVOq4rkooqFU0LHH8Zo1jls,1064
296
- flwr/server/superlink/linkstate/in_memory_linkstate.py,sha256=tw98opVU78Q9jfIORLRhwSATiMTfDa5THlcegwXSzWM,29377
297
- flwr/server/superlink/linkstate/linkstate.py,sha256=Yi76bAq-OJmDjl1HAQInrPIU0m9dKMiYugNJXKpKyuw,15843
291
+ flwr/server/superlink/linkstate/in_memory_linkstate.py,sha256=Ss64nq7MgbHwx4LOER-YV7vynkzC1K4XVNk542oPg7s,21305
292
+ flwr/server/superlink/linkstate/linkstate.py,sha256=YB3SryGNvt-bE-unYjoloJt9d3xAUPBNLK4mor8gk3M,11851
298
293
  flwr/server/superlink/linkstate/linkstate_factory.py,sha256=ISSMjDlwuN7swxjOeYlTNpI_kuZ8PGkMcJnf1dbhUSE,2069
299
- flwr/server/superlink/linkstate/sqlite_linkstate.py,sha256=c33n0iOZiQwNd07KfPkQbKZ7cSEX5LGg1crlUHd1ZD0,55309
300
- flwr/server/superlink/linkstate/utils.py,sha256=vKJYvzP_MbYD2Qo8ly6Qibyb4SI92G_4sB60ubELj64,19048
294
+ flwr/server/superlink/linkstate/sqlite_linkstate.py,sha256=Wsx5gD6WRIMLlKarvVV1_dlS7jmfno-yTVW1-rgcIto,38276
295
+ flwr/server/superlink/linkstate/utils.py,sha256=UunwphV90p9XzvGFJpZr3C64HgIyXjhRPNBVS3HSL8M,12696
301
296
  flwr/server/superlink/simulation/__init__.py,sha256=mg-oapC9dkzEfjXPQFior5lpWj4g9kwbLovptyYM_g0,718
302
297
  flwr/server/superlink/simulation/simulationio_grpc.py,sha256=8aUrZZLdvprKUfLLqFID4aItus9beU6m1qLQYIPB7k0,2224
303
298
  flwr/server/superlink/simulation/simulationio_servicer.py,sha256=J_TmdqM-Bxgp-iPEI3tvCuBpykw1UX0FouMQalEYAF4,6907
304
299
  flwr/server/superlink/utils.py,sha256=KVb3K_g2vYfu9TnftcN0ewmev133WZcjuEePMm8d7GE,2137
305
300
  flwr/server/typing.py,sha256=5kaRLZuxTEse9A0g7aVna2VhYxU3wTq1f3d3mtw7kXs,1019
306
- flwr/server/utils/__init__.py,sha256=myLB6L0ycQ0rd_nnL1pI-NLdFoOfXcj_z4gIqqj8Ye4,992
301
+ flwr/server/utils/__init__.py,sha256=vnS9EAyVUsBOmWeYZXMoBcjeEFhqN4_KQQVk5EBiWG0,884
307
302
  flwr/server/utils/tensorboard.py,sha256=gEBD8w_5uaIfp5aw5RYH66lYZpd_SfkObHQ7eDd9MUk,5466
308
- flwr/server/utils/validator.py,sha256=UzYFMIyXyORXYRYXbFhOk6q6GDpOE-eIqLhlNFnR__0,7256
303
+ flwr/server/utils/validator.py,sha256=11olMv1UyeaxLa1ci5gsJ0WALk7VwWGCQYCvLsZ56LY,3604
309
304
  flwr/server/workflow/__init__.py,sha256=SXY0XkwbkezFBxxrFB5hKUtmtAgnYISBkPouR1V71ss,902
310
305
  flwr/server/workflow/constant.py,sha256=q4DLdR8Krlxuewq2AQjwTL75hphxE5ODNz4AhViHMXk,1082
311
306
  flwr/server/workflow/default_workflows.py,sha256=RwDX7hXOI1-q4FH9A0onHvadqa5yXTzslpmShPpXodk,14152
312
307
  flwr/server/workflow/secure_aggregation/__init__.py,sha256=3XlgDOjD_hcukTGl6Bc1B-8M_dPlVSJuTbvXIbiO-Ic,880
313
308
  flwr/server/workflow/secure_aggregation/secagg_workflow.py,sha256=l2IdMdJjs1bgHs5vQgLSOVzar7v2oxUn46oCrnVE1rM,5839
314
- flwr/server/workflow/secure_aggregation/secaggplus_workflow.py,sha256=rfn2etO1nb7u-1oRl-H9q3enJZz3shMINZaBB7rPsC4,29671
309
+ flwr/server/workflow/secure_aggregation/secaggplus_workflow.py,sha256=acfqyzOebe0WvXG2Z7yd7WtEtGJI3eNK2f0d_kjSdnM,29623
315
310
  flwr/simulation/__init__.py,sha256=5UcDVJNjFoSwWqHbGM1hKfTTUUNdwAtuoNvNrfvdkUY,1556
316
311
  flwr/simulation/app.py,sha256=xRVSJBnTXQUqWIYOzENfTnJlZ24CSNhWkhVEFxIu4I0,9758
317
312
  flwr/simulation/legacy_app.py,sha256=qpZI4Vvzr5TyWSLTRrMP-jN4rH2C25JI9nVSSjhFwSQ,15861
@@ -325,12 +320,12 @@ flwr/superexec/__init__.py,sha256=fcj366jh4RFby_vDwLroU4kepzqbnJgseZD_jUr_Mko,71
325
320
  flwr/superexec/app.py,sha256=Z6kYHWd62YL0Q4YKyCAbt_BcefNfbKH6V-jCC-1NkZM,1842
326
321
  flwr/superexec/deployment.py,sha256=wZ9G42gGS91knfplswh95MnQ83Fzu-rs6wcuNgDmmvY,6735
327
322
  flwr/superexec/exec_grpc.py,sha256=ttA9qoZzSLF0Mfk1L4hzOkMSNuj5rR58_kKBYwcyrAg,2864
328
- flwr/superexec/exec_servicer.py,sha256=72AL60LBbWD-OTxTvtPBrnb_M5rccMtU_JAYcEVQVNg,8330
323
+ flwr/superexec/exec_servicer.py,sha256=4UpzJqPUHkBG2PZNe2lrX7XFVDOL6yw_HcoBHxuXE9A,8349
329
324
  flwr/superexec/exec_user_auth_interceptor.py,sha256=YtvcjrD2hMVmZ3y9wHuGI6FwmG_Y__q112t4fFnypy0,3793
330
325
  flwr/superexec/executor.py,sha256=_B55WW2TD1fBINpabSSDRenVHXYmvlfhv-k8hJKU4lQ,3115
331
326
  flwr/superexec/simulation.py,sha256=WQDon15oqpMopAZnwRZoTICYCfHqtkvFSqiTQ2hLD_g,4088
332
- flwr_nightly-1.16.0.dev20250305.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
333
- flwr_nightly-1.16.0.dev20250305.dist-info/METADATA,sha256=X8lB9V-qGjFy1843wMvWpu-VV-sR-7xcfM-g9I2wh8A,15877
334
- flwr_nightly-1.16.0.dev20250305.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
335
- flwr_nightly-1.16.0.dev20250305.dist-info/entry_points.txt,sha256=JlNxX3qhaV18_2yj5a3kJW1ESxm31cal9iS_N_pf1Rk,538
336
- flwr_nightly-1.16.0.dev20250305.dist-info/RECORD,,
327
+ flwr_nightly-1.16.0.dev20250307.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
328
+ flwr_nightly-1.16.0.dev20250307.dist-info/METADATA,sha256=v9rrSVpfMxZvJRYAdOPlQ9ft30L7hlIQlApk1-p7BGc,15877
329
+ flwr_nightly-1.16.0.dev20250307.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
330
+ flwr_nightly-1.16.0.dev20250307.dist-info/entry_points.txt,sha256=JlNxX3qhaV18_2yj5a3kJW1ESxm31cal9iS_N_pf1Rk,538
331
+ flwr_nightly-1.16.0.dev20250307.dist-info/RECORD,,
@@ -1,37 +0,0 @@
1
- # Copyright 2023 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
- """Task handling."""
16
-
17
-
18
- from flwr.proto.task_pb2 import TaskIns # pylint: disable=E0611
19
-
20
-
21
- def validate_task_ins(task_ins: TaskIns) -> bool:
22
- """Validate a TaskIns before it entering the message handling process.
23
-
24
- Parameters
25
- ----------
26
- task_ins: TaskIns
27
- The task instruction coming from the server.
28
-
29
- Returns
30
- -------
31
- is_valid: bool
32
- True if the TaskIns is deemed valid and therefore suitable for
33
- undergoing the message handling process, False otherwise.
34
- """
35
- if not (task_ins.HasField("task") and task_ins.task.HasField("recordset")):
36
- return False
37
- return True
flwr/proto/task_pb2.py DELETED
@@ -1,33 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
- # Generated by the protocol buffer compiler. DO NOT EDIT!
3
- # source: flwr/proto/task.proto
4
- # Protobuf Python Version: 4.25.1
5
- """Generated protocol buffer code."""
6
- from google.protobuf import descriptor as _descriptor
7
- from google.protobuf import descriptor_pool as _descriptor_pool
8
- from google.protobuf import symbol_database as _symbol_database
9
- from google.protobuf.internal import builder as _builder
10
- # @@protoc_insertion_point(imports)
11
-
12
- _sym_db = _symbol_database.Default()
13
-
14
-
15
- from flwr.proto import node_pb2 as flwr_dot_proto_dot_node__pb2
16
- from flwr.proto import recordset_pb2 as flwr_dot_proto_dot_recordset__pb2
17
- from flwr.proto import error_pb2 as flwr_dot_proto_dot_error__pb2
18
-
19
-
20
- DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x15\x66lwr/proto/task.proto\x12\nflwr.proto\x1a\x15\x66lwr/proto/node.proto\x1a\x1a\x66lwr/proto/recordset.proto\x1a\x16\x66lwr/proto/error.proto\"\xf6\x01\n\x04Task\x12\"\n\x08producer\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\x12\"\n\x08\x63onsumer\x18\x02 \x01(\x0b\x32\x10.flwr.proto.Node\x12\x12\n\ncreated_at\x18\x03 \x01(\x01\x12\x14\n\x0c\x64\x65livered_at\x18\x04 \x01(\t\x12\x0b\n\x03ttl\x18\x06 \x01(\x01\x12\x10\n\x08\x61ncestry\x18\x07 \x03(\t\x12\x11\n\ttask_type\x18\x08 \x01(\t\x12(\n\trecordset\x18\t \x01(\x0b\x32\x15.flwr.proto.RecordSet\x12 \n\x05\x65rror\x18\n \x01(\x0b\x32\x11.flwr.proto.Error\"\\\n\x07TaskIns\x12\x0f\n\x07task_id\x18\x01 \x01(\t\x12\x10\n\x08group_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\x04\x12\x1e\n\x04task\x18\x04 \x01(\x0b\x32\x10.flwr.proto.Task\"\\\n\x07TaskRes\x12\x0f\n\x07task_id\x18\x01 \x01(\t\x12\x10\n\x08group_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\x04\x12\x1e\n\x04task\x18\x04 \x01(\x0b\x32\x10.flwr.proto.Taskb\x06proto3')
21
-
22
- _globals = globals()
23
- _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
24
- _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'flwr.proto.task_pb2', _globals)
25
- if _descriptor._USE_C_DESCRIPTORS == False:
26
- DESCRIPTOR._options = None
27
- _globals['_TASK']._serialized_start=113
28
- _globals['_TASK']._serialized_end=359
29
- _globals['_TASKINS']._serialized_start=361
30
- _globals['_TASKINS']._serialized_end=453
31
- _globals['_TASKRES']._serialized_start=455
32
- _globals['_TASKRES']._serialized_end=547
33
- # @@protoc_insertion_point(module_scope)