flwr 1.15.2__py3-none-any.whl → 1.17.0__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 (120) hide show
  1. flwr/cli/build.py +2 -0
  2. flwr/cli/log.py +20 -21
  3. flwr/cli/new/templates/app/code/flwr_tune/client_app.py.tpl +1 -1
  4. flwr/cli/new/templates/app/pyproject.baseline.toml.tpl +1 -1
  5. flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +1 -1
  6. flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl +1 -1
  7. flwr/cli/new/templates/app/pyproject.jax.toml.tpl +1 -1
  8. flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +1 -1
  9. flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +1 -1
  10. flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +1 -1
  11. flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +1 -1
  12. flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +1 -1
  13. flwr/cli/run/run.py +5 -9
  14. flwr/client/app.py +6 -4
  15. flwr/client/client_app.py +260 -86
  16. flwr/client/clientapp/app.py +6 -2
  17. flwr/client/grpc_client/connection.py +24 -21
  18. flwr/client/message_handler/message_handler.py +28 -28
  19. flwr/client/mod/__init__.py +2 -2
  20. flwr/client/mod/centraldp_mods.py +7 -7
  21. flwr/client/mod/comms_mods.py +16 -22
  22. flwr/client/mod/localdp_mod.py +4 -4
  23. flwr/client/mod/secure_aggregation/secaggplus_mod.py +31 -31
  24. flwr/client/rest_client/connection.py +4 -6
  25. flwr/client/run_info_store.py +2 -2
  26. flwr/client/supernode/__init__.py +0 -2
  27. flwr/client/supernode/app.py +1 -11
  28. flwr/common/__init__.py +12 -4
  29. flwr/common/address.py +35 -0
  30. flwr/common/args.py +8 -2
  31. flwr/common/auth_plugin/auth_plugin.py +2 -1
  32. flwr/common/config.py +4 -4
  33. flwr/common/constant.py +16 -0
  34. flwr/common/context.py +4 -4
  35. flwr/common/event_log_plugin/__init__.py +22 -0
  36. flwr/common/event_log_plugin/event_log_plugin.py +60 -0
  37. flwr/common/grpc.py +1 -1
  38. flwr/common/logger.py +2 -2
  39. flwr/common/message.py +338 -102
  40. flwr/common/object_ref.py +0 -10
  41. flwr/common/record/__init__.py +8 -4
  42. flwr/common/record/arrayrecord.py +626 -0
  43. flwr/common/record/{configsrecord.py → configrecord.py} +75 -29
  44. flwr/common/record/conversion_utils.py +9 -18
  45. flwr/common/record/{metricsrecord.py → metricrecord.py} +78 -32
  46. flwr/common/record/recorddict.py +288 -0
  47. flwr/common/recorddict_compat.py +410 -0
  48. flwr/common/secure_aggregation/quantization.py +5 -1
  49. flwr/common/secure_aggregation/secaggplus_constants.py +1 -1
  50. flwr/common/serde.py +67 -190
  51. flwr/common/telemetry.py +0 -10
  52. flwr/common/typing.py +44 -8
  53. flwr/proto/exec_pb2.py +3 -3
  54. flwr/proto/exec_pb2.pyi +3 -3
  55. flwr/proto/message_pb2.py +12 -12
  56. flwr/proto/message_pb2.pyi +9 -9
  57. flwr/proto/recorddict_pb2.py +70 -0
  58. flwr/proto/{recordset_pb2.pyi → recorddict_pb2.pyi} +35 -35
  59. flwr/proto/run_pb2.py +31 -31
  60. flwr/proto/run_pb2.pyi +3 -3
  61. flwr/server/__init__.py +3 -1
  62. flwr/server/app.py +74 -3
  63. flwr/server/compat/__init__.py +2 -2
  64. flwr/server/compat/app.py +15 -12
  65. flwr/server/compat/app_utils.py +26 -18
  66. flwr/server/compat/{driver_client_proxy.py → grid_client_proxy.py} +41 -41
  67. flwr/server/fleet_event_log_interceptor.py +94 -0
  68. flwr/server/{driver → grid}/__init__.py +8 -7
  69. flwr/server/{driver/driver.py → grid/grid.py} +48 -19
  70. flwr/server/{driver/grpc_driver.py → grid/grpc_grid.py} +88 -56
  71. flwr/server/{driver/inmemory_driver.py → grid/inmemory_grid.py} +41 -54
  72. flwr/server/run_serverapp.py +6 -17
  73. flwr/server/server_app.py +126 -33
  74. flwr/server/serverapp/app.py +10 -10
  75. flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +2 -2
  76. flwr/server/superlink/fleet/message_handler/message_handler.py +8 -12
  77. flwr/server/superlink/fleet/vce/backend/backend.py +3 -3
  78. flwr/server/superlink/fleet/vce/backend/raybackend.py +2 -2
  79. flwr/server/superlink/fleet/vce/vce_api.py +33 -38
  80. flwr/server/superlink/linkstate/in_memory_linkstate.py +171 -132
  81. flwr/server/superlink/linkstate/linkstate.py +51 -64
  82. flwr/server/superlink/linkstate/sqlite_linkstate.py +253 -285
  83. flwr/server/superlink/linkstate/utils.py +171 -133
  84. flwr/server/superlink/{driver → serverappio}/__init__.py +1 -1
  85. flwr/server/superlink/{driver → serverappio}/serverappio_grpc.py +1 -1
  86. flwr/server/superlink/{driver → serverappio}/serverappio_servicer.py +27 -29
  87. flwr/server/superlink/simulation/simulationio_servicer.py +2 -2
  88. flwr/server/typing.py +3 -3
  89. flwr/server/utils/__init__.py +2 -2
  90. flwr/server/utils/validator.py +53 -68
  91. flwr/server/workflow/default_workflows.py +52 -58
  92. flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +48 -50
  93. flwr/simulation/app.py +2 -2
  94. flwr/simulation/ray_transport/ray_actor.py +4 -2
  95. flwr/simulation/ray_transport/ray_client_proxy.py +34 -32
  96. flwr/simulation/run_simulation.py +15 -15
  97. flwr/superexec/app.py +0 -14
  98. flwr/superexec/deployment.py +4 -4
  99. flwr/superexec/exec_event_log_interceptor.py +135 -0
  100. flwr/superexec/exec_grpc.py +10 -4
  101. flwr/superexec/exec_servicer.py +6 -6
  102. flwr/superexec/exec_user_auth_interceptor.py +22 -4
  103. flwr/superexec/executor.py +3 -3
  104. flwr/superexec/simulation.py +3 -3
  105. {flwr-1.15.2.dist-info → flwr-1.17.0.dist-info}/METADATA +5 -5
  106. {flwr-1.15.2.dist-info → flwr-1.17.0.dist-info}/RECORD +111 -112
  107. {flwr-1.15.2.dist-info → flwr-1.17.0.dist-info}/entry_points.txt +0 -3
  108. flwr/client/message_handler/task_handler.py +0 -37
  109. flwr/common/record/parametersrecord.py +0 -204
  110. flwr/common/record/recordset.py +0 -202
  111. flwr/common/recordset_compat.py +0 -418
  112. flwr/proto/recordset_pb2.py +0 -70
  113. flwr/proto/task_pb2.py +0 -33
  114. flwr/proto/task_pb2.pyi +0 -100
  115. flwr/proto/task_pb2_grpc.py +0 -4
  116. flwr/proto/task_pb2_grpc.pyi +0 -4
  117. /flwr/proto/{recordset_pb2_grpc.py → recorddict_pb2_grpc.py} +0 -0
  118. /flwr/proto/{recordset_pb2_grpc.pyi → recorddict_pb2_grpc.pyi} +0 -0
  119. {flwr-1.15.2.dist-info → flwr-1.17.0.dist-info}/LICENSE +0 -0
  120. {flwr-1.15.2.dist-info → flwr-1.17.0.dist-info}/WHEEL +0 -0
@@ -4,7 +4,7 @@ isort:skip_file
4
4
  """
5
5
  import builtins
6
6
  import flwr.proto.error_pb2
7
- import flwr.proto.recordset_pb2
7
+ import flwr.proto.recorddict_pb2
8
8
  import flwr.proto.transport_pb2
9
9
  import google.protobuf.descriptor
10
10
  import google.protobuf.internal.containers
@@ -22,13 +22,13 @@ class Message(google.protobuf.message.Message):
22
22
  @property
23
23
  def metadata(self) -> global___Metadata: ...
24
24
  @property
25
- def content(self) -> flwr.proto.recordset_pb2.RecordSet: ...
25
+ def content(self) -> flwr.proto.recorddict_pb2.RecordDict: ...
26
26
  @property
27
27
  def error(self) -> flwr.proto.error_pb2.Error: ...
28
28
  def __init__(self,
29
29
  *,
30
30
  metadata: typing.Optional[global___Metadata] = ...,
31
- content: typing.Optional[flwr.proto.recordset_pb2.RecordSet] = ...,
31
+ content: typing.Optional[flwr.proto.recorddict_pb2.RecordDict] = ...,
32
32
  error: typing.Optional[flwr.proto.error_pb2.Error] = ...,
33
33
  ) -> None: ...
34
34
  def HasField(self, field_name: typing_extensions.Literal["content",b"content","error",b"error","metadata",b"metadata"]) -> builtins.bool: ...
@@ -77,7 +77,7 @@ class Context(google.protobuf.message.Message):
77
77
  @property
78
78
  def node_config(self) -> google.protobuf.internal.containers.MessageMap[typing.Text, flwr.proto.transport_pb2.Scalar]: ...
79
79
  @property
80
- def state(self) -> flwr.proto.recordset_pb2.RecordSet: ...
80
+ def state(self) -> flwr.proto.recorddict_pb2.RecordDict: ...
81
81
  @property
82
82
  def run_config(self) -> google.protobuf.internal.containers.MessageMap[typing.Text, flwr.proto.transport_pb2.Scalar]: ...
83
83
  def __init__(self,
@@ -85,7 +85,7 @@ class Context(google.protobuf.message.Message):
85
85
  run_id: builtins.int = ...,
86
86
  node_id: builtins.int = ...,
87
87
  node_config: typing.Optional[typing.Mapping[typing.Text, flwr.proto.transport_pb2.Scalar]] = ...,
88
- state: typing.Optional[flwr.proto.recordset_pb2.RecordSet] = ...,
88
+ state: typing.Optional[flwr.proto.recorddict_pb2.RecordDict] = ...,
89
89
  run_config: typing.Optional[typing.Mapping[typing.Text, flwr.proto.transport_pb2.Scalar]] = ...,
90
90
  ) -> None: ...
91
91
  def HasField(self, field_name: typing_extensions.Literal["state",b"state"]) -> builtins.bool: ...
@@ -98,7 +98,7 @@ class Metadata(google.protobuf.message.Message):
98
98
  MESSAGE_ID_FIELD_NUMBER: builtins.int
99
99
  SRC_NODE_ID_FIELD_NUMBER: builtins.int
100
100
  DST_NODE_ID_FIELD_NUMBER: builtins.int
101
- REPLY_TO_MESSAGE_FIELD_NUMBER: builtins.int
101
+ REPLY_TO_MESSAGE_ID_FIELD_NUMBER: builtins.int
102
102
  GROUP_ID_FIELD_NUMBER: builtins.int
103
103
  TTL_FIELD_NUMBER: builtins.int
104
104
  MESSAGE_TYPE_FIELD_NUMBER: builtins.int
@@ -107,7 +107,7 @@ class Metadata(google.protobuf.message.Message):
107
107
  message_id: typing.Text
108
108
  src_node_id: builtins.int
109
109
  dst_node_id: builtins.int
110
- reply_to_message: typing.Text
110
+ reply_to_message_id: typing.Text
111
111
  group_id: typing.Text
112
112
  ttl: builtins.float
113
113
  message_type: typing.Text
@@ -118,11 +118,11 @@ class Metadata(google.protobuf.message.Message):
118
118
  message_id: typing.Text = ...,
119
119
  src_node_id: builtins.int = ...,
120
120
  dst_node_id: builtins.int = ...,
121
- reply_to_message: typing.Text = ...,
121
+ reply_to_message_id: typing.Text = ...,
122
122
  group_id: typing.Text = ...,
123
123
  ttl: builtins.float = ...,
124
124
  message_type: typing.Text = ...,
125
125
  created_at: builtins.float = ...,
126
126
  ) -> None: ...
127
- def ClearField(self, field_name: typing_extensions.Literal["created_at",b"created_at","dst_node_id",b"dst_node_id","group_id",b"group_id","message_id",b"message_id","message_type",b"message_type","reply_to_message",b"reply_to_message","run_id",b"run_id","src_node_id",b"src_node_id","ttl",b"ttl"]) -> None: ...
127
+ def ClearField(self, field_name: typing_extensions.Literal["created_at",b"created_at","dst_node_id",b"dst_node_id","group_id",b"group_id","message_id",b"message_id","message_type",b"message_type","reply_to_message_id",b"reply_to_message_id","run_id",b"run_id","src_node_id",b"src_node_id","ttl",b"ttl"]) -> None: ...
128
128
  global___Metadata = Metadata
@@ -0,0 +1,70 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Generated by the protocol buffer compiler. DO NOT EDIT!
3
+ # source: flwr/proto/recorddict.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
+
16
+
17
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1b\x66lwr/proto/recorddict.proto\x12\nflwr.proto\"\x1a\n\nDoubleList\x12\x0c\n\x04vals\x18\x01 \x03(\x01\"\x18\n\x08SintList\x12\x0c\n\x04vals\x18\x01 \x03(\x12\"\x18\n\x08UintList\x12\x0c\n\x04vals\x18\x01 \x03(\x04\"\x18\n\x08\x42oolList\x12\x0c\n\x04vals\x18\x01 \x03(\x08\"\x1a\n\nStringList\x12\x0c\n\x04vals\x18\x01 \x03(\t\"\x19\n\tBytesList\x12\x0c\n\x04vals\x18\x01 \x03(\x0c\"B\n\x05\x41rray\x12\r\n\x05\x64type\x18\x01 \x01(\t\x12\r\n\x05shape\x18\x02 \x03(\x05\x12\r\n\x05stype\x18\x03 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x04 \x01(\x0c\"\xd7\x01\n\x11MetricRecordValue\x12\x10\n\x06\x64ouble\x18\x01 \x01(\x01H\x00\x12\x10\n\x06sint64\x18\x02 \x01(\x12H\x00\x12\x10\n\x06uint64\x18\x03 \x01(\x04H\x00\x12-\n\x0b\x64ouble_list\x18\x15 \x01(\x0b\x32\x16.flwr.proto.DoubleListH\x00\x12)\n\tsint_list\x18\x16 \x01(\x0b\x32\x14.flwr.proto.SintListH\x00\x12)\n\tuint_list\x18\x17 \x01(\x0b\x32\x14.flwr.proto.UintListH\x00\x42\x07\n\x05value\"\x91\x03\n\x11\x43onfigRecordValue\x12\x10\n\x06\x64ouble\x18\x01 \x01(\x01H\x00\x12\x10\n\x06sint64\x18\x02 \x01(\x12H\x00\x12\x10\n\x06uint64\x18\x03 \x01(\x04H\x00\x12\x0e\n\x04\x62ool\x18\x04 \x01(\x08H\x00\x12\x10\n\x06string\x18\x05 \x01(\tH\x00\x12\x0f\n\x05\x62ytes\x18\x06 \x01(\x0cH\x00\x12-\n\x0b\x64ouble_list\x18\x15 \x01(\x0b\x32\x16.flwr.proto.DoubleListH\x00\x12)\n\tsint_list\x18\x16 \x01(\x0b\x32\x14.flwr.proto.SintListH\x00\x12)\n\tuint_list\x18\x17 \x01(\x0b\x32\x14.flwr.proto.UintListH\x00\x12)\n\tbool_list\x18\x18 \x01(\x0b\x32\x14.flwr.proto.BoolListH\x00\x12-\n\x0bstring_list\x18\x19 \x01(\x0b\x32\x16.flwr.proto.StringListH\x00\x12+\n\nbytes_list\x18\x1a \x01(\x0b\x32\x15.flwr.proto.BytesListH\x00\x42\x07\n\x05value\"H\n\x0b\x41rrayRecord\x12\x11\n\tdata_keys\x18\x01 \x03(\t\x12&\n\x0b\x64\x61ta_values\x18\x02 \x03(\x0b\x32\x11.flwr.proto.Array\"\x8c\x01\n\x0cMetricRecord\x12\x30\n\x04\x64\x61ta\x18\x01 \x03(\x0b\x32\".flwr.proto.MetricRecord.DataEntry\x1aJ\n\tDataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12,\n\x05value\x18\x02 \x01(\x0b\x32\x1d.flwr.proto.MetricRecordValue:\x02\x38\x01\"\x8c\x01\n\x0c\x43onfigRecord\x12\x30\n\x04\x64\x61ta\x18\x01 \x03(\x0b\x32\".flwr.proto.ConfigRecord.DataEntry\x1aJ\n\tDataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12,\n\x05value\x18\x02 \x01(\x0b\x32\x1d.flwr.proto.ConfigRecordValue:\x02\x38\x01\"\x88\x03\n\nRecordDict\x12\x32\n\x06\x61rrays\x18\x01 \x03(\x0b\x32\".flwr.proto.RecordDict.ArraysEntry\x12\x34\n\x07metrics\x18\x02 \x03(\x0b\x32#.flwr.proto.RecordDict.MetricsEntry\x12\x34\n\x07\x63onfigs\x18\x03 \x03(\x0b\x32#.flwr.proto.RecordDict.ConfigsEntry\x1a\x46\n\x0b\x41rraysEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12&\n\x05value\x18\x02 \x01(\x0b\x32\x17.flwr.proto.ArrayRecord:\x02\x38\x01\x1aH\n\x0cMetricsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\'\n\x05value\x18\x02 \x01(\x0b\x32\x18.flwr.proto.MetricRecord:\x02\x38\x01\x1aH\n\x0c\x43onfigsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\'\n\x05value\x18\x02 \x01(\x0b\x32\x18.flwr.proto.ConfigRecord:\x02\x38\x01\x62\x06proto3')
18
+
19
+ _globals = globals()
20
+ _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
21
+ _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'flwr.proto.recorddict_pb2', _globals)
22
+ if _descriptor._USE_C_DESCRIPTORS == False:
23
+ DESCRIPTOR._options = None
24
+ _globals['_METRICRECORD_DATAENTRY']._options = None
25
+ _globals['_METRICRECORD_DATAENTRY']._serialized_options = b'8\001'
26
+ _globals['_CONFIGRECORD_DATAENTRY']._options = None
27
+ _globals['_CONFIGRECORD_DATAENTRY']._serialized_options = b'8\001'
28
+ _globals['_RECORDDICT_ARRAYSENTRY']._options = None
29
+ _globals['_RECORDDICT_ARRAYSENTRY']._serialized_options = b'8\001'
30
+ _globals['_RECORDDICT_METRICSENTRY']._options = None
31
+ _globals['_RECORDDICT_METRICSENTRY']._serialized_options = b'8\001'
32
+ _globals['_RECORDDICT_CONFIGSENTRY']._options = None
33
+ _globals['_RECORDDICT_CONFIGSENTRY']._serialized_options = b'8\001'
34
+ _globals['_DOUBLELIST']._serialized_start=43
35
+ _globals['_DOUBLELIST']._serialized_end=69
36
+ _globals['_SINTLIST']._serialized_start=71
37
+ _globals['_SINTLIST']._serialized_end=95
38
+ _globals['_UINTLIST']._serialized_start=97
39
+ _globals['_UINTLIST']._serialized_end=121
40
+ _globals['_BOOLLIST']._serialized_start=123
41
+ _globals['_BOOLLIST']._serialized_end=147
42
+ _globals['_STRINGLIST']._serialized_start=149
43
+ _globals['_STRINGLIST']._serialized_end=175
44
+ _globals['_BYTESLIST']._serialized_start=177
45
+ _globals['_BYTESLIST']._serialized_end=202
46
+ _globals['_ARRAY']._serialized_start=204
47
+ _globals['_ARRAY']._serialized_end=270
48
+ _globals['_METRICRECORDVALUE']._serialized_start=273
49
+ _globals['_METRICRECORDVALUE']._serialized_end=488
50
+ _globals['_CONFIGRECORDVALUE']._serialized_start=491
51
+ _globals['_CONFIGRECORDVALUE']._serialized_end=892
52
+ _globals['_ARRAYRECORD']._serialized_start=894
53
+ _globals['_ARRAYRECORD']._serialized_end=966
54
+ _globals['_METRICRECORD']._serialized_start=969
55
+ _globals['_METRICRECORD']._serialized_end=1109
56
+ _globals['_METRICRECORD_DATAENTRY']._serialized_start=1035
57
+ _globals['_METRICRECORD_DATAENTRY']._serialized_end=1109
58
+ _globals['_CONFIGRECORD']._serialized_start=1112
59
+ _globals['_CONFIGRECORD']._serialized_end=1252
60
+ _globals['_CONFIGRECORD_DATAENTRY']._serialized_start=1178
61
+ _globals['_CONFIGRECORD_DATAENTRY']._serialized_end=1252
62
+ _globals['_RECORDDICT']._serialized_start=1255
63
+ _globals['_RECORDDICT']._serialized_end=1647
64
+ _globals['_RECORDDICT_ARRAYSENTRY']._serialized_start=1429
65
+ _globals['_RECORDDICT_ARRAYSENTRY']._serialized_end=1499
66
+ _globals['_RECORDDICT_METRICSENTRY']._serialized_start=1501
67
+ _globals['_RECORDDICT_METRICSENTRY']._serialized_end=1573
68
+ _globals['_RECORDDICT_CONFIGSENTRY']._serialized_start=1575
69
+ _globals['_RECORDDICT_CONFIGSENTRY']._serialized_end=1647
70
+ # @@protoc_insertion_point(module_scope)
@@ -104,7 +104,7 @@ class Array(google.protobuf.message.Message):
104
104
  def ClearField(self, field_name: typing_extensions.Literal["data",b"data","dtype",b"dtype","shape",b"shape","stype",b"stype"]) -> None: ...
105
105
  global___Array = Array
106
106
 
107
- class MetricsRecordValue(google.protobuf.message.Message):
107
+ class MetricRecordValue(google.protobuf.message.Message):
108
108
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
109
109
  DOUBLE_FIELD_NUMBER: builtins.int
110
110
  SINT64_FIELD_NUMBER: builtins.int
@@ -137,9 +137,9 @@ class MetricsRecordValue(google.protobuf.message.Message):
137
137
  def HasField(self, field_name: typing_extensions.Literal["double",b"double","double_list",b"double_list","sint64",b"sint64","sint_list",b"sint_list","uint64",b"uint64","uint_list",b"uint_list","value",b"value"]) -> builtins.bool: ...
138
138
  def ClearField(self, field_name: typing_extensions.Literal["double",b"double","double_list",b"double_list","sint64",b"sint64","sint_list",b"sint_list","uint64",b"uint64","uint_list",b"uint_list","value",b"value"]) -> None: ...
139
139
  def WhichOneof(self, oneof_group: typing_extensions.Literal["value",b"value"]) -> typing.Optional[typing_extensions.Literal["double","sint64","uint64","double_list","sint_list","uint_list"]]: ...
140
- global___MetricsRecordValue = MetricsRecordValue
140
+ global___MetricRecordValue = MetricRecordValue
141
141
 
142
- class ConfigsRecordValue(google.protobuf.message.Message):
142
+ class ConfigRecordValue(google.protobuf.message.Message):
143
143
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
144
144
  DOUBLE_FIELD_NUMBER: builtins.int
145
145
  SINT64_FIELD_NUMBER: builtins.int
@@ -193,9 +193,9 @@ class ConfigsRecordValue(google.protobuf.message.Message):
193
193
  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","sint_list",b"sint_list","string",b"string","string_list",b"string_list","uint64",b"uint64","uint_list",b"uint_list","value",b"value"]) -> builtins.bool: ...
194
194
  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","sint_list",b"sint_list","string",b"string","string_list",b"string_list","uint64",b"uint64","uint_list",b"uint_list","value",b"value"]) -> None: ...
195
195
  def WhichOneof(self, oneof_group: typing_extensions.Literal["value",b"value"]) -> typing.Optional[typing_extensions.Literal["double","sint64","uint64","bool","string","bytes","double_list","sint_list","uint_list","bool_list","string_list","bytes_list"]]: ...
196
- global___ConfigsRecordValue = ConfigsRecordValue
196
+ global___ConfigRecordValue = ConfigRecordValue
197
197
 
198
- class ParametersRecord(google.protobuf.message.Message):
198
+ class ArrayRecord(google.protobuf.message.Message):
199
199
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
200
200
  DATA_KEYS_FIELD_NUMBER: builtins.int
201
201
  DATA_VALUES_FIELD_NUMBER: builtins.int
@@ -209,9 +209,9 @@ class ParametersRecord(google.protobuf.message.Message):
209
209
  data_values: typing.Optional[typing.Iterable[global___Array]] = ...,
210
210
  ) -> None: ...
211
211
  def ClearField(self, field_name: typing_extensions.Literal["data_keys",b"data_keys","data_values",b"data_values"]) -> None: ...
212
- global___ParametersRecord = ParametersRecord
212
+ global___ArrayRecord = ArrayRecord
213
213
 
214
- class MetricsRecord(google.protobuf.message.Message):
214
+ class MetricRecord(google.protobuf.message.Message):
215
215
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
216
216
  class DataEntry(google.protobuf.message.Message):
217
217
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
@@ -219,26 +219,26 @@ class MetricsRecord(google.protobuf.message.Message):
219
219
  VALUE_FIELD_NUMBER: builtins.int
220
220
  key: typing.Text
221
221
  @property
222
- def value(self) -> global___MetricsRecordValue: ...
222
+ def value(self) -> global___MetricRecordValue: ...
223
223
  def __init__(self,
224
224
  *,
225
225
  key: typing.Text = ...,
226
- value: typing.Optional[global___MetricsRecordValue] = ...,
226
+ value: typing.Optional[global___MetricRecordValue] = ...,
227
227
  ) -> None: ...
228
228
  def HasField(self, field_name: typing_extensions.Literal["value",b"value"]) -> builtins.bool: ...
229
229
  def ClearField(self, field_name: typing_extensions.Literal["key",b"key","value",b"value"]) -> None: ...
230
230
 
231
231
  DATA_FIELD_NUMBER: builtins.int
232
232
  @property
233
- def data(self) -> google.protobuf.internal.containers.MessageMap[typing.Text, global___MetricsRecordValue]: ...
233
+ def data(self) -> google.protobuf.internal.containers.MessageMap[typing.Text, global___MetricRecordValue]: ...
234
234
  def __init__(self,
235
235
  *,
236
- data: typing.Optional[typing.Mapping[typing.Text, global___MetricsRecordValue]] = ...,
236
+ data: typing.Optional[typing.Mapping[typing.Text, global___MetricRecordValue]] = ...,
237
237
  ) -> None: ...
238
238
  def ClearField(self, field_name: typing_extensions.Literal["data",b"data"]) -> None: ...
239
- global___MetricsRecord = MetricsRecord
239
+ global___MetricRecord = MetricRecord
240
240
 
241
- class ConfigsRecord(google.protobuf.message.Message):
241
+ class ConfigRecord(google.protobuf.message.Message):
242
242
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
243
243
  class DataEntry(google.protobuf.message.Message):
244
244
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
@@ -246,38 +246,38 @@ class ConfigsRecord(google.protobuf.message.Message):
246
246
  VALUE_FIELD_NUMBER: builtins.int
247
247
  key: typing.Text
248
248
  @property
249
- def value(self) -> global___ConfigsRecordValue: ...
249
+ def value(self) -> global___ConfigRecordValue: ...
250
250
  def __init__(self,
251
251
  *,
252
252
  key: typing.Text = ...,
253
- value: typing.Optional[global___ConfigsRecordValue] = ...,
253
+ value: typing.Optional[global___ConfigRecordValue] = ...,
254
254
  ) -> None: ...
255
255
  def HasField(self, field_name: typing_extensions.Literal["value",b"value"]) -> builtins.bool: ...
256
256
  def ClearField(self, field_name: typing_extensions.Literal["key",b"key","value",b"value"]) -> None: ...
257
257
 
258
258
  DATA_FIELD_NUMBER: builtins.int
259
259
  @property
260
- def data(self) -> google.protobuf.internal.containers.MessageMap[typing.Text, global___ConfigsRecordValue]: ...
260
+ def data(self) -> google.protobuf.internal.containers.MessageMap[typing.Text, global___ConfigRecordValue]: ...
261
261
  def __init__(self,
262
262
  *,
263
- data: typing.Optional[typing.Mapping[typing.Text, global___ConfigsRecordValue]] = ...,
263
+ data: typing.Optional[typing.Mapping[typing.Text, global___ConfigRecordValue]] = ...,
264
264
  ) -> None: ...
265
265
  def ClearField(self, field_name: typing_extensions.Literal["data",b"data"]) -> None: ...
266
- global___ConfigsRecord = ConfigsRecord
266
+ global___ConfigRecord = ConfigRecord
267
267
 
268
- class RecordSet(google.protobuf.message.Message):
268
+ class RecordDict(google.protobuf.message.Message):
269
269
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
270
- class ParametersEntry(google.protobuf.message.Message):
270
+ class ArraysEntry(google.protobuf.message.Message):
271
271
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
272
272
  KEY_FIELD_NUMBER: builtins.int
273
273
  VALUE_FIELD_NUMBER: builtins.int
274
274
  key: typing.Text
275
275
  @property
276
- def value(self) -> global___ParametersRecord: ...
276
+ def value(self) -> global___ArrayRecord: ...
277
277
  def __init__(self,
278
278
  *,
279
279
  key: typing.Text = ...,
280
- value: typing.Optional[global___ParametersRecord] = ...,
280
+ value: typing.Optional[global___ArrayRecord] = ...,
281
281
  ) -> None: ...
282
282
  def HasField(self, field_name: typing_extensions.Literal["value",b"value"]) -> builtins.bool: ...
283
283
  def ClearField(self, field_name: typing_extensions.Literal["key",b"key","value",b"value"]) -> None: ...
@@ -288,11 +288,11 @@ class RecordSet(google.protobuf.message.Message):
288
288
  VALUE_FIELD_NUMBER: builtins.int
289
289
  key: typing.Text
290
290
  @property
291
- def value(self) -> global___MetricsRecord: ...
291
+ def value(self) -> global___MetricRecord: ...
292
292
  def __init__(self,
293
293
  *,
294
294
  key: typing.Text = ...,
295
- value: typing.Optional[global___MetricsRecord] = ...,
295
+ value: typing.Optional[global___MetricRecord] = ...,
296
296
  ) -> None: ...
297
297
  def HasField(self, field_name: typing_extensions.Literal["value",b"value"]) -> builtins.bool: ...
298
298
  def ClearField(self, field_name: typing_extensions.Literal["key",b"key","value",b"value"]) -> None: ...
@@ -303,29 +303,29 @@ class RecordSet(google.protobuf.message.Message):
303
303
  VALUE_FIELD_NUMBER: builtins.int
304
304
  key: typing.Text
305
305
  @property
306
- def value(self) -> global___ConfigsRecord: ...
306
+ def value(self) -> global___ConfigRecord: ...
307
307
  def __init__(self,
308
308
  *,
309
309
  key: typing.Text = ...,
310
- value: typing.Optional[global___ConfigsRecord] = ...,
310
+ value: typing.Optional[global___ConfigRecord] = ...,
311
311
  ) -> None: ...
312
312
  def HasField(self, field_name: typing_extensions.Literal["value",b"value"]) -> builtins.bool: ...
313
313
  def ClearField(self, field_name: typing_extensions.Literal["key",b"key","value",b"value"]) -> None: ...
314
314
 
315
- PARAMETERS_FIELD_NUMBER: builtins.int
315
+ ARRAYS_FIELD_NUMBER: builtins.int
316
316
  METRICS_FIELD_NUMBER: builtins.int
317
317
  CONFIGS_FIELD_NUMBER: builtins.int
318
318
  @property
319
- def parameters(self) -> google.protobuf.internal.containers.MessageMap[typing.Text, global___ParametersRecord]: ...
319
+ def arrays(self) -> google.protobuf.internal.containers.MessageMap[typing.Text, global___ArrayRecord]: ...
320
320
  @property
321
- def metrics(self) -> google.protobuf.internal.containers.MessageMap[typing.Text, global___MetricsRecord]: ...
321
+ def metrics(self) -> google.protobuf.internal.containers.MessageMap[typing.Text, global___MetricRecord]: ...
322
322
  @property
323
- def configs(self) -> google.protobuf.internal.containers.MessageMap[typing.Text, global___ConfigsRecord]: ...
323
+ def configs(self) -> google.protobuf.internal.containers.MessageMap[typing.Text, global___ConfigRecord]: ...
324
324
  def __init__(self,
325
325
  *,
326
- parameters: typing.Optional[typing.Mapping[typing.Text, global___ParametersRecord]] = ...,
327
- metrics: typing.Optional[typing.Mapping[typing.Text, global___MetricsRecord]] = ...,
328
- configs: typing.Optional[typing.Mapping[typing.Text, global___ConfigsRecord]] = ...,
326
+ arrays: typing.Optional[typing.Mapping[typing.Text, global___ArrayRecord]] = ...,
327
+ metrics: typing.Optional[typing.Mapping[typing.Text, global___MetricRecord]] = ...,
328
+ configs: typing.Optional[typing.Mapping[typing.Text, global___ConfigRecord]] = ...,
329
329
  ) -> None: ...
330
- def ClearField(self, field_name: typing_extensions.Literal["configs",b"configs","metrics",b"metrics","parameters",b"parameters"]) -> None: ...
331
- global___RecordSet = RecordSet
330
+ def ClearField(self, field_name: typing_extensions.Literal["arrays",b"arrays","configs",b"configs","metrics",b"metrics"]) -> None: ...
331
+ global___RecordDict = RecordDict
flwr/proto/run_pb2.py CHANGED
@@ -14,11 +14,11 @@ _sym_db = _symbol_database.Default()
14
14
 
15
15
  from flwr.proto import fab_pb2 as flwr_dot_proto_dot_fab__pb2
16
16
  from flwr.proto import node_pb2 as flwr_dot_proto_dot_node__pb2
17
- from flwr.proto import recordset_pb2 as flwr_dot_proto_dot_recordset__pb2
17
+ from flwr.proto import recorddict_pb2 as flwr_dot_proto_dot_recorddict__pb2
18
18
  from flwr.proto import transport_pb2 as flwr_dot_proto_dot_transport__pb2
19
19
 
20
20
 
21
- DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x14\x66lwr/proto/run.proto\x12\nflwr.proto\x1a\x14\x66lwr/proto/fab.proto\x1a\x15\x66lwr/proto/node.proto\x1a\x1a\x66lwr/proto/recordset.proto\x1a\x1a\x66lwr/proto/transport.proto\"\xce\x02\n\x03Run\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\x12\x0e\n\x06\x66\x61\x62_id\x18\x02 \x01(\t\x12\x13\n\x0b\x66\x61\x62_version\x18\x03 \x01(\t\x12<\n\x0foverride_config\x18\x04 \x03(\x0b\x32#.flwr.proto.Run.OverrideConfigEntry\x12\x10\n\x08\x66\x61\x62_hash\x18\x05 \x01(\t\x12\x12\n\npending_at\x18\x06 \x01(\t\x12\x13\n\x0bstarting_at\x18\x07 \x01(\t\x12\x12\n\nrunning_at\x18\x08 \x01(\t\x12\x13\n\x0b\x66inished_at\x18\t \x01(\t\x12%\n\x06status\x18\n \x01(\x0b\x32\x15.flwr.proto.RunStatus\x1aI\n\x13OverrideConfigEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12!\n\x05value\x18\x02 \x01(\x0b\x32\x12.flwr.proto.Scalar:\x02\x38\x01\"@\n\tRunStatus\x12\x0e\n\x06status\x18\x01 \x01(\t\x12\x12\n\nsub_status\x18\x02 \x01(\t\x12\x0f\n\x07\x64\x65tails\x18\x03 \x01(\t\"\xeb\x01\n\x10\x43reateRunRequest\x12\x0e\n\x06\x66\x61\x62_id\x18\x01 \x01(\t\x12\x13\n\x0b\x66\x61\x62_version\x18\x02 \x01(\t\x12I\n\x0foverride_config\x18\x03 \x03(\x0b\x32\x30.flwr.proto.CreateRunRequest.OverrideConfigEntry\x12\x1c\n\x03\x66\x61\x62\x18\x04 \x01(\x0b\x32\x0f.flwr.proto.Fab\x1aI\n\x13OverrideConfigEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12!\n\x05value\x18\x02 \x01(\x0b\x32\x12.flwr.proto.Scalar:\x02\x38\x01\"#\n\x11\x43reateRunResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\"?\n\rGetRunRequest\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\x12\x0e\n\x06run_id\x18\x02 \x01(\x04\".\n\x0eGetRunResponse\x12\x1c\n\x03run\x18\x01 \x01(\x0b\x32\x0f.flwr.proto.Run\"S\n\x16UpdateRunStatusRequest\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\x12)\n\nrun_status\x18\x02 \x01(\x0b\x32\x15.flwr.proto.RunStatus\"\x19\n\x17UpdateRunStatusResponse\"F\n\x13GetRunStatusRequest\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\x12\x0f\n\x07run_ids\x18\x02 \x03(\x04\"\xb1\x01\n\x14GetRunStatusResponse\x12L\n\x0frun_status_dict\x18\x01 \x03(\x0b\x32\x33.flwr.proto.GetRunStatusResponse.RunStatusDictEntry\x1aK\n\x12RunStatusDictEntry\x12\x0b\n\x03key\x18\x01 \x01(\x04\x12$\n\x05value\x18\x02 \x01(\x0b\x32\x15.flwr.proto.RunStatus:\x02\x38\x01\"-\n\x1bGetFederationOptionsRequest\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\"U\n\x1cGetFederationOptionsResponse\x12\x35\n\x12\x66\x65\x64\x65ration_options\x18\x01 \x01(\x0b\x32\x19.flwr.proto.ConfigsRecordb\x06proto3')
21
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x14\x66lwr/proto/run.proto\x12\nflwr.proto\x1a\x14\x66lwr/proto/fab.proto\x1a\x15\x66lwr/proto/node.proto\x1a\x1b\x66lwr/proto/recorddict.proto\x1a\x1a\x66lwr/proto/transport.proto\"\xce\x02\n\x03Run\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\x12\x0e\n\x06\x66\x61\x62_id\x18\x02 \x01(\t\x12\x13\n\x0b\x66\x61\x62_version\x18\x03 \x01(\t\x12<\n\x0foverride_config\x18\x04 \x03(\x0b\x32#.flwr.proto.Run.OverrideConfigEntry\x12\x10\n\x08\x66\x61\x62_hash\x18\x05 \x01(\t\x12\x12\n\npending_at\x18\x06 \x01(\t\x12\x13\n\x0bstarting_at\x18\x07 \x01(\t\x12\x12\n\nrunning_at\x18\x08 \x01(\t\x12\x13\n\x0b\x66inished_at\x18\t \x01(\t\x12%\n\x06status\x18\n \x01(\x0b\x32\x15.flwr.proto.RunStatus\x1aI\n\x13OverrideConfigEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12!\n\x05value\x18\x02 \x01(\x0b\x32\x12.flwr.proto.Scalar:\x02\x38\x01\"@\n\tRunStatus\x12\x0e\n\x06status\x18\x01 \x01(\t\x12\x12\n\nsub_status\x18\x02 \x01(\t\x12\x0f\n\x07\x64\x65tails\x18\x03 \x01(\t\"\xeb\x01\n\x10\x43reateRunRequest\x12\x0e\n\x06\x66\x61\x62_id\x18\x01 \x01(\t\x12\x13\n\x0b\x66\x61\x62_version\x18\x02 \x01(\t\x12I\n\x0foverride_config\x18\x03 \x03(\x0b\x32\x30.flwr.proto.CreateRunRequest.OverrideConfigEntry\x12\x1c\n\x03\x66\x61\x62\x18\x04 \x01(\x0b\x32\x0f.flwr.proto.Fab\x1aI\n\x13OverrideConfigEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12!\n\x05value\x18\x02 \x01(\x0b\x32\x12.flwr.proto.Scalar:\x02\x38\x01\"#\n\x11\x43reateRunResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\"?\n\rGetRunRequest\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\x12\x0e\n\x06run_id\x18\x02 \x01(\x04\".\n\x0eGetRunResponse\x12\x1c\n\x03run\x18\x01 \x01(\x0b\x32\x0f.flwr.proto.Run\"S\n\x16UpdateRunStatusRequest\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\x12)\n\nrun_status\x18\x02 \x01(\x0b\x32\x15.flwr.proto.RunStatus\"\x19\n\x17UpdateRunStatusResponse\"F\n\x13GetRunStatusRequest\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\x12\x0f\n\x07run_ids\x18\x02 \x03(\x04\"\xb1\x01\n\x14GetRunStatusResponse\x12L\n\x0frun_status_dict\x18\x01 \x03(\x0b\x32\x33.flwr.proto.GetRunStatusResponse.RunStatusDictEntry\x1aK\n\x12RunStatusDictEntry\x12\x0b\n\x03key\x18\x01 \x01(\x04\x12$\n\x05value\x18\x02 \x01(\x0b\x32\x15.flwr.proto.RunStatus:\x02\x38\x01\"-\n\x1bGetFederationOptionsRequest\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\"T\n\x1cGetFederationOptionsResponse\x12\x34\n\x12\x66\x65\x64\x65ration_options\x18\x01 \x01(\x0b\x32\x18.flwr.proto.ConfigRecordb\x06proto3')
22
22
 
23
23
  _globals = globals()
24
24
  _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
@@ -31,34 +31,34 @@ if _descriptor._USE_C_DESCRIPTORS == False:
31
31
  _globals['_CREATERUNREQUEST_OVERRIDECONFIGENTRY']._serialized_options = b'8\001'
32
32
  _globals['_GETRUNSTATUSRESPONSE_RUNSTATUSDICTENTRY']._options = None
33
33
  _globals['_GETRUNSTATUSRESPONSE_RUNSTATUSDICTENTRY']._serialized_options = b'8\001'
34
- _globals['_RUN']._serialized_start=138
35
- _globals['_RUN']._serialized_end=472
36
- _globals['_RUN_OVERRIDECONFIGENTRY']._serialized_start=399
37
- _globals['_RUN_OVERRIDECONFIGENTRY']._serialized_end=472
38
- _globals['_RUNSTATUS']._serialized_start=474
39
- _globals['_RUNSTATUS']._serialized_end=538
40
- _globals['_CREATERUNREQUEST']._serialized_start=541
41
- _globals['_CREATERUNREQUEST']._serialized_end=776
42
- _globals['_CREATERUNREQUEST_OVERRIDECONFIGENTRY']._serialized_start=399
43
- _globals['_CREATERUNREQUEST_OVERRIDECONFIGENTRY']._serialized_end=472
44
- _globals['_CREATERUNRESPONSE']._serialized_start=778
45
- _globals['_CREATERUNRESPONSE']._serialized_end=813
46
- _globals['_GETRUNREQUEST']._serialized_start=815
47
- _globals['_GETRUNREQUEST']._serialized_end=878
48
- _globals['_GETRUNRESPONSE']._serialized_start=880
49
- _globals['_GETRUNRESPONSE']._serialized_end=926
50
- _globals['_UPDATERUNSTATUSREQUEST']._serialized_start=928
51
- _globals['_UPDATERUNSTATUSREQUEST']._serialized_end=1011
52
- _globals['_UPDATERUNSTATUSRESPONSE']._serialized_start=1013
53
- _globals['_UPDATERUNSTATUSRESPONSE']._serialized_end=1038
54
- _globals['_GETRUNSTATUSREQUEST']._serialized_start=1040
55
- _globals['_GETRUNSTATUSREQUEST']._serialized_end=1110
56
- _globals['_GETRUNSTATUSRESPONSE']._serialized_start=1113
57
- _globals['_GETRUNSTATUSRESPONSE']._serialized_end=1290
58
- _globals['_GETRUNSTATUSRESPONSE_RUNSTATUSDICTENTRY']._serialized_start=1215
59
- _globals['_GETRUNSTATUSRESPONSE_RUNSTATUSDICTENTRY']._serialized_end=1290
60
- _globals['_GETFEDERATIONOPTIONSREQUEST']._serialized_start=1292
61
- _globals['_GETFEDERATIONOPTIONSREQUEST']._serialized_end=1337
62
- _globals['_GETFEDERATIONOPTIONSRESPONSE']._serialized_start=1339
34
+ _globals['_RUN']._serialized_start=139
35
+ _globals['_RUN']._serialized_end=473
36
+ _globals['_RUN_OVERRIDECONFIGENTRY']._serialized_start=400
37
+ _globals['_RUN_OVERRIDECONFIGENTRY']._serialized_end=473
38
+ _globals['_RUNSTATUS']._serialized_start=475
39
+ _globals['_RUNSTATUS']._serialized_end=539
40
+ _globals['_CREATERUNREQUEST']._serialized_start=542
41
+ _globals['_CREATERUNREQUEST']._serialized_end=777
42
+ _globals['_CREATERUNREQUEST_OVERRIDECONFIGENTRY']._serialized_start=400
43
+ _globals['_CREATERUNREQUEST_OVERRIDECONFIGENTRY']._serialized_end=473
44
+ _globals['_CREATERUNRESPONSE']._serialized_start=779
45
+ _globals['_CREATERUNRESPONSE']._serialized_end=814
46
+ _globals['_GETRUNREQUEST']._serialized_start=816
47
+ _globals['_GETRUNREQUEST']._serialized_end=879
48
+ _globals['_GETRUNRESPONSE']._serialized_start=881
49
+ _globals['_GETRUNRESPONSE']._serialized_end=927
50
+ _globals['_UPDATERUNSTATUSREQUEST']._serialized_start=929
51
+ _globals['_UPDATERUNSTATUSREQUEST']._serialized_end=1012
52
+ _globals['_UPDATERUNSTATUSRESPONSE']._serialized_start=1014
53
+ _globals['_UPDATERUNSTATUSRESPONSE']._serialized_end=1039
54
+ _globals['_GETRUNSTATUSREQUEST']._serialized_start=1041
55
+ _globals['_GETRUNSTATUSREQUEST']._serialized_end=1111
56
+ _globals['_GETRUNSTATUSRESPONSE']._serialized_start=1114
57
+ _globals['_GETRUNSTATUSRESPONSE']._serialized_end=1291
58
+ _globals['_GETRUNSTATUSRESPONSE_RUNSTATUSDICTENTRY']._serialized_start=1216
59
+ _globals['_GETRUNSTATUSRESPONSE_RUNSTATUSDICTENTRY']._serialized_end=1291
60
+ _globals['_GETFEDERATIONOPTIONSREQUEST']._serialized_start=1293
61
+ _globals['_GETFEDERATIONOPTIONSREQUEST']._serialized_end=1338
62
+ _globals['_GETFEDERATIONOPTIONSRESPONSE']._serialized_start=1340
63
63
  _globals['_GETFEDERATIONOPTIONSRESPONSE']._serialized_end=1424
64
64
  # @@protoc_insertion_point(module_scope)
flwr/proto/run_pb2.pyi CHANGED
@@ -5,7 +5,7 @@ isort:skip_file
5
5
  import builtins
6
6
  import flwr.proto.fab_pb2
7
7
  import flwr.proto.node_pb2
8
- import flwr.proto.recordset_pb2
8
+ import flwr.proto.recorddict_pb2
9
9
  import flwr.proto.transport_pb2
10
10
  import google.protobuf.descriptor
11
11
  import google.protobuf.internal.containers
@@ -258,10 +258,10 @@ class GetFederationOptionsResponse(google.protobuf.message.Message):
258
258
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
259
259
  FEDERATION_OPTIONS_FIELD_NUMBER: builtins.int
260
260
  @property
261
- def federation_options(self) -> flwr.proto.recordset_pb2.ConfigsRecord: ...
261
+ def federation_options(self) -> flwr.proto.recorddict_pb2.ConfigRecord: ...
262
262
  def __init__(self,
263
263
  *,
264
- federation_options: typing.Optional[flwr.proto.recordset_pb2.ConfigsRecord] = ...,
264
+ federation_options: typing.Optional[flwr.proto.recorddict_pb2.ConfigRecord] = ...,
265
265
  ) -> None: ...
266
266
  def HasField(self, field_name: typing_extensions.Literal["federation_options",b"federation_options"]) -> builtins.bool: ...
267
267
  def ClearField(self, field_name: typing_extensions.Literal["federation_options",b"federation_options"]) -> None: ...
flwr/server/__init__.py CHANGED
@@ -21,7 +21,8 @@ from .app import start_server as start_server
21
21
  from .client_manager import ClientManager as ClientManager
22
22
  from .client_manager import SimpleClientManager as SimpleClientManager
23
23
  from .compat import LegacyContext as LegacyContext
24
- from .driver import Driver as Driver
24
+ from .grid import Driver as Driver
25
+ from .grid import Grid as Grid
25
26
  from .history import History as History
26
27
  from .server import Server as Server
27
28
  from .server_app import ServerApp as ServerApp
@@ -31,6 +32,7 @@ from .serverapp_components import ServerAppComponents as ServerAppComponents
31
32
  __all__ = [
32
33
  "ClientManager",
33
34
  "Driver",
35
+ "Grid",
34
36
  "History",
35
37
  "LegacyContext",
36
38
  "Server",
flwr/server/app.py CHANGED
@@ -54,7 +54,9 @@ from flwr.common.constant import (
54
54
  TRANSPORT_TYPE_GRPC_ADAPTER,
55
55
  TRANSPORT_TYPE_GRPC_RERE,
56
56
  TRANSPORT_TYPE_REST,
57
+ EventLogWriterType,
57
58
  )
59
+ from flwr.common.event_log_plugin import EventLogWriterPlugin
58
60
  from flwr.common.exit import ExitCode, flwr_exit
59
61
  from flwr.common.exit_handlers import register_exit_handlers
60
62
  from flwr.common.grpc import generic_create_grpc_server
@@ -66,6 +68,7 @@ from flwr.proto.fleet_pb2_grpc import ( # pylint: disable=E0611
66
68
  add_FleetServicer_to_server,
67
69
  )
68
70
  from flwr.proto.grpcadapter_pb2_grpc import add_GrpcAdapterServicer_to_server
71
+ from flwr.server.fleet_event_log_interceptor import FleetEventLogInterceptor
69
72
  from flwr.server.serverapp.app import flwr_serverapp
70
73
  from flwr.simulation.app import flwr_simulation
71
74
  from flwr.superexec.app import load_executor
@@ -76,13 +79,13 @@ from .history import History
76
79
  from .server import Server, init_defaults, run_fl
77
80
  from .server_config import ServerConfig
78
81
  from .strategy import Strategy
79
- from .superlink.driver.serverappio_grpc import run_serverappio_api_grpc
80
82
  from .superlink.ffs.ffs_factory import FfsFactory
81
83
  from .superlink.fleet.grpc_adapter.grpc_adapter_servicer import GrpcAdapterServicer
82
84
  from .superlink.fleet.grpc_bidi.grpc_server import start_grpc_server
83
85
  from .superlink.fleet.grpc_rere.fleet_servicer import FleetServicer
84
86
  from .superlink.fleet.grpc_rere.server_interceptor import AuthenticateServerInterceptor
85
87
  from .superlink.linkstate import LinkStateFactory
88
+ from .superlink.serverappio.serverappio_grpc import run_serverappio_api_grpc
86
89
  from .superlink.simulation.simulationio_grpc import run_simulationio_api_grpc
87
90
 
88
91
  DATABASE = ":flwr-in-memory-state:"
@@ -90,7 +93,13 @@ BASE_DIR = get_flwr_dir() / "superlink" / "ffs"
90
93
 
91
94
 
92
95
  try:
93
- from flwr.ee import add_ee_args_superlink, get_exec_auth_plugins
96
+ from flwr.ee import (
97
+ add_ee_args_superlink,
98
+ get_dashboard_server,
99
+ get_exec_auth_plugins,
100
+ get_exec_event_log_writer_plugins,
101
+ get_fleet_event_log_writer_plugins,
102
+ )
94
103
  except ImportError:
95
104
 
96
105
  # pylint: disable-next=unused-argument
@@ -101,6 +110,18 @@ except ImportError:
101
110
  """Return all Exec API authentication plugins."""
102
111
  raise NotImplementedError("No authentication plugins are currently supported.")
103
112
 
113
+ def get_exec_event_log_writer_plugins() -> dict[str, type[EventLogWriterPlugin]]:
114
+ """Return all Exec API event log writer plugins."""
115
+ raise NotImplementedError(
116
+ "No event log writer plugins are currently supported."
117
+ )
118
+
119
+ def get_fleet_event_log_writer_plugins() -> dict[str, type[EventLogWriterPlugin]]:
120
+ """Return all Fleet API event log writer plugins."""
121
+ raise NotImplementedError(
122
+ "No event log writer plugins are currently supported."
123
+ )
124
+
104
125
 
105
126
  def start_server( # pylint: disable=too-many-arguments,too-many-locals
106
127
  *,
@@ -272,9 +293,13 @@ def run_superlink() -> None:
272
293
  verify_tls_cert = not getattr(args, "disable_oidc_tls_cert_verification", None)
273
294
 
274
295
  auth_plugin: Optional[ExecAuthPlugin] = None
296
+ event_log_plugin: Optional[EventLogWriterPlugin] = None
275
297
  # Load the auth plugin if the args.user_auth_config is provided
276
298
  if cfg_path := getattr(args, "user_auth_config", None):
277
299
  auth_plugin = _try_obtain_exec_auth_plugin(Path(cfg_path), verify_tls_cert)
300
+ # Enable event logging if the args.enable_event_log is True
301
+ if args.enable_event_log:
302
+ event_log_plugin = _try_obtain_exec_event_log_writer_plugin()
278
303
 
279
304
  # Initialize StateFactory
280
305
  state_factory = LinkStateFactory(args.database)
@@ -294,6 +319,7 @@ def run_superlink() -> None:
294
319
  [args.executor_config] if args.executor_config else args.executor_config
295
320
  ),
296
321
  auth_plugin=auth_plugin,
322
+ event_log_plugin=event_log_plugin,
297
323
  )
298
324
  grpc_servers = [exec_server]
299
325
 
@@ -385,6 +411,11 @@ def run_superlink() -> None:
385
411
  log(DEBUG, "Automatic node authentication enabled")
386
412
 
387
413
  interceptors = [AuthenticateServerInterceptor(state_factory, auto_auth)]
414
+ if getattr(args, "enable_event_log", None):
415
+ fleet_log_plugin = _try_obtain_fleet_event_log_writer_plugin()
416
+ if fleet_log_plugin is not None:
417
+ interceptors.append(FleetEventLogInterceptor(fleet_log_plugin))
418
+ log(INFO, "Flower Fleet event logging enabled")
388
419
 
389
420
  fleet_server = _run_fleet_api_grpc_rere(
390
421
  address=fleet_address,
@@ -431,6 +462,17 @@ def run_superlink() -> None:
431
462
  scheduler_th.start()
432
463
  bckg_threads.append(scheduler_th)
433
464
 
465
+ # Add Dashboard server if available
466
+ if dashboard_address := getattr(args, "dashboard_address", None):
467
+ dashboard_address_str, _, _ = _format_address(dashboard_address)
468
+ dashboard_server = get_dashboard_server(
469
+ address=dashboard_address_str,
470
+ state_factory=state_factory,
471
+ certificates=None,
472
+ )
473
+
474
+ grpc_servers.append(dashboard_server)
475
+
434
476
  # Graceful shutdown
435
477
  register_exit_handlers(
436
478
  event_type=EventType.RUN_SUPERLINK_LEAVE,
@@ -598,6 +640,34 @@ def _try_obtain_exec_auth_plugin(
598
640
  sys.exit("No authentication plugins are currently supported.")
599
641
 
600
642
 
643
+ def _try_obtain_exec_event_log_writer_plugin() -> Optional[EventLogWriterPlugin]:
644
+ """Return an instance of the event log writer plugin."""
645
+ try:
646
+ all_plugins: dict[str, type[EventLogWriterPlugin]] = (
647
+ get_exec_event_log_writer_plugins()
648
+ )
649
+ plugin_class = all_plugins[EventLogWriterType.STDOUT]
650
+ return plugin_class()
651
+ except KeyError:
652
+ sys.exit("No event log writer plugin is provided.")
653
+ except NotImplementedError:
654
+ sys.exit("No event log writer plugins are currently supported.")
655
+
656
+
657
+ def _try_obtain_fleet_event_log_writer_plugin() -> Optional[EventLogWriterPlugin]:
658
+ """Return an instance of the Fleet Servicer event log writer plugin."""
659
+ try:
660
+ all_plugins: dict[str, type[EventLogWriterPlugin]] = (
661
+ get_fleet_event_log_writer_plugins()
662
+ )
663
+ plugin_class = all_plugins[EventLogWriterType.STDOUT]
664
+ return plugin_class()
665
+ except KeyError:
666
+ sys.exit("No Fleet API event log writer plugin is provided.")
667
+ except NotImplementedError:
668
+ sys.exit("No Fleet API event log writer plugins are currently supported.")
669
+
670
+
601
671
  def _run_fleet_api_grpc_rere(
602
672
  address: str,
603
673
  state_factory: LinkStateFactory,
@@ -710,7 +780,8 @@ def _add_args_common(parser: argparse.ArgumentParser) -> None:
710
780
  "--insecure",
711
781
  action="store_true",
712
782
  help="Run the server without HTTPS, regardless of whether certificate "
713
- "paths are provided. By default, the server runs with HTTPS enabled. "
783
+ "paths are provided. Data transmitted between the gRPC client and server "
784
+ "is not encrypted. By default, the server runs with HTTPS enabled. "
714
785
  "Use this flag only if you understand the risks.",
715
786
  )
716
787
  parser.add_argument(
@@ -15,10 +15,10 @@
15
15
  """Flower ServerApp compatibility package."""
16
16
 
17
17
 
18
- from .app import start_driver as start_driver
18
+ from .app import start_grid as start_grid
19
19
  from .legacy_context import LegacyContext as LegacyContext
20
20
 
21
21
  __all__ = [
22
22
  "LegacyContext",
23
- "start_driver",
23
+ "start_grid",
24
24
  ]