flwr-nightly 1.17.0.dev20250319__py3-none-any.whl → 1.17.0.dev20250321__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 (69) hide show
  1. flwr/cli/run/run.py +5 -9
  2. flwr/client/app.py +6 -4
  3. flwr/client/client_app.py +10 -12
  4. flwr/client/clientapp/app.py +2 -2
  5. flwr/client/grpc_client/connection.py +24 -21
  6. flwr/client/message_handler/message_handler.py +27 -27
  7. flwr/client/mod/__init__.py +2 -2
  8. flwr/client/mod/centraldp_mods.py +7 -7
  9. flwr/client/mod/comms_mods.py +16 -22
  10. flwr/client/mod/localdp_mod.py +4 -4
  11. flwr/client/mod/secure_aggregation/secaggplus_mod.py +31 -31
  12. flwr/client/run_info_store.py +2 -2
  13. flwr/common/__init__.py +12 -4
  14. flwr/common/config.py +4 -4
  15. flwr/common/constant.py +1 -1
  16. flwr/common/context.py +4 -4
  17. flwr/common/message.py +269 -101
  18. flwr/common/record/__init__.py +8 -4
  19. flwr/common/record/{parametersrecord.py → arrayrecord.py} +75 -32
  20. flwr/common/record/{configsrecord.py → configrecord.py} +75 -29
  21. flwr/common/record/conversion_utils.py +1 -1
  22. flwr/common/record/{metricsrecord.py → metricrecord.py} +78 -32
  23. flwr/common/record/recorddict.py +288 -0
  24. flwr/common/recorddict_compat.py +410 -0
  25. flwr/common/secure_aggregation/secaggplus_constants.py +1 -1
  26. flwr/common/serde.py +66 -71
  27. flwr/common/typing.py +8 -8
  28. flwr/proto/exec_pb2.py +3 -3
  29. flwr/proto/exec_pb2.pyi +3 -3
  30. flwr/proto/message_pb2.py +12 -12
  31. flwr/proto/message_pb2.pyi +9 -9
  32. flwr/proto/recorddict_pb2.py +70 -0
  33. flwr/proto/{recordset_pb2.pyi → recorddict_pb2.pyi} +35 -35
  34. flwr/proto/run_pb2.py +31 -31
  35. flwr/proto/run_pb2.pyi +3 -3
  36. flwr/server/compat/grid_client_proxy.py +31 -31
  37. flwr/server/grid/grid.py +3 -3
  38. flwr/server/grid/grpc_grid.py +15 -23
  39. flwr/server/grid/inmemory_grid.py +14 -20
  40. flwr/server/superlink/fleet/vce/backend/backend.py +2 -2
  41. flwr/server/superlink/fleet/vce/backend/raybackend.py +2 -2
  42. flwr/server/superlink/fleet/vce/vce_api.py +1 -3
  43. flwr/server/superlink/linkstate/in_memory_linkstate.py +5 -5
  44. flwr/server/superlink/linkstate/linkstate.py +4 -4
  45. flwr/server/superlink/linkstate/sqlite_linkstate.py +21 -25
  46. flwr/server/superlink/linkstate/utils.py +18 -15
  47. flwr/server/superlink/serverappio/serverappio_servicer.py +3 -3
  48. flwr/server/superlink/simulation/simulationio_servicer.py +2 -2
  49. flwr/server/utils/validator.py +4 -4
  50. flwr/server/workflow/default_workflows.py +34 -41
  51. flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +37 -39
  52. flwr/simulation/app.py +2 -2
  53. flwr/simulation/ray_transport/ray_actor.py +4 -2
  54. flwr/simulation/ray_transport/ray_client_proxy.py +34 -32
  55. flwr/simulation/run_simulation.py +5 -5
  56. flwr/superexec/deployment.py +4 -4
  57. flwr/superexec/exec_servicer.py +2 -2
  58. flwr/superexec/executor.py +3 -3
  59. flwr/superexec/simulation.py +3 -3
  60. {flwr_nightly-1.17.0.dev20250319.dist-info → flwr_nightly-1.17.0.dev20250321.dist-info}/METADATA +1 -1
  61. {flwr_nightly-1.17.0.dev20250319.dist-info → flwr_nightly-1.17.0.dev20250321.dist-info}/RECORD +66 -66
  62. flwr/common/record/recordset.py +0 -209
  63. flwr/common/recordset_compat.py +0 -418
  64. flwr/proto/recordset_pb2.py +0 -70
  65. /flwr/proto/{recordset_pb2_grpc.py → recorddict_pb2_grpc.py} +0 -0
  66. /flwr/proto/{recordset_pb2_grpc.pyi → recorddict_pb2_grpc.pyi} +0 -0
  67. {flwr_nightly-1.17.0.dev20250319.dist-info → flwr_nightly-1.17.0.dev20250321.dist-info}/LICENSE +0 -0
  68. {flwr_nightly-1.17.0.dev20250319.dist-info → flwr_nightly-1.17.0.dev20250321.dist-info}/WHEEL +0 -0
  69. {flwr_nightly-1.17.0.dev20250319.dist-info → flwr_nightly-1.17.0.dev20250321.dist-info}/entry_points.txt +0 -0
@@ -68,36 +68,36 @@ flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl,sha256=7qIeXECaC8lTlyKgSnE
68
68
  flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl,sha256=ds40KOWf1RnkJ-_uQCp3QzdIYMMbDsvXhHMboZGlL_o,686
69
69
  flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl,sha256=_q5F8w-oOC-oDIpPTd7ejMhfGtAffKMiXlE5H6B_3KQ,710
70
70
  flwr/cli/run/__init__.py,sha256=cCsKVB0SFzh2b3QmGba6BHckB85xlhjh3mh4pBpACtY,790
71
- flwr/cli/run/run.py,sha256=kEOYKin9qPJy8SODxcAvIWk-OskKPsxvcbvhDhf2VD4,8299
71
+ flwr/cli/run/run.py,sha256=Jcs_ZIpdvmAyncFRtd_MSvD8jow2zo1M0f5hQwK_GK4,8277
72
72
  flwr/cli/stop.py,sha256=E4TGynmYQss5iWJ_fjSdYIW8nrNta2KOiK4sfvHKO_g,4976
73
73
  flwr/cli/utils.py,sha256=D9XcpxzwkGPNdwX16o0kI-sYnRDMlWYyKNIpz6npRhQ,11236
74
74
  flwr/client/__init__.py,sha256=DGDoO0AEAfz-0CUFmLdyUUweAS64-07AOnmDfWUefK4,1192
75
- flwr/client/app.py,sha256=tNnef5wGVfqMiiGiWzAuULyy1QpvCKukiRmNi_a2cQc,34261
75
+ flwr/client/app.py,sha256=rHL2-ki3XegWNO7RL36-mQmAfpW5cGwlsvNRN6-9W6Y,34301
76
76
  flwr/client/client.py,sha256=8o58nd9o6ZFcMIaVYPGcV4MSjBG4H0oFgWiv8ZEO3oA,7895
77
- flwr/client/client_app.py,sha256=iuQSO-iwRjWzpeWOjeYKmvfIpBxoGnIAU2TgsmqLpyo,17145
77
+ flwr/client/client_app.py,sha256=dJEtyZQZRLB6CouaWYGjSHy1ZUHQTrhQEbcf98dImYY,17077
78
78
  flwr/client/clientapp/__init__.py,sha256=kZqChGnTChQ1WGSUkIlW2S5bc0d0mzDubCAmZUGRpEY,800
79
- flwr/client/clientapp/app.py,sha256=B3GrIMP8BMvltYf4n4xbtlRR1jEPT5-F93KnBCPuPJM,9069
79
+ flwr/client/clientapp/app.py,sha256=Eh54GXLfCysefGkVhTB2ublrqbaKtGpZ1jRhD389TYQ,9062
80
80
  flwr/client/clientapp/clientappio_servicer.py,sha256=5L6bjw_j3Mnx9kRFwYwxDNABKurBO5q1jZOWE_X11wQ,8522
81
81
  flwr/client/clientapp/utils.py,sha256=qqTw9PKPCldGnnbAbMhtS-Qs_GcqADE1eOtVPXeKYAo,4344
82
82
  flwr/client/dpfedavg_numpy_client.py,sha256=4KsEvzavDKyVDU1V0kMqffTwu1lNdUCYQN-i0DTYVN8,7404
83
83
  flwr/client/grpc_adapter_client/__init__.py,sha256=QyNWIbsq9DpyMk7oemiO1P3TBFfkfkctnJ1JoAkTl3s,742
84
84
  flwr/client/grpc_adapter_client/connection.py,sha256=nV-hPd5q5Eblg6PgUrGGYj74mbE1a0qjfN8G3wzJVAc,4006
85
85
  flwr/client/grpc_client/__init__.py,sha256=LsnbqXiJhgQcB0XzAlUQgPx011Uf7Y7yabIC1HxivJ8,735
86
- flwr/client/grpc_client/connection.py,sha256=HK_y1xfoaypozo6UQJsYJ8mZWXkknf2qx7gjpzuxys8,9057
86
+ flwr/client/grpc_client/connection.py,sha256=TbH9DCBPKWwaw1G0aWQep6wk3Igj1Re428mQSGylVtM,9188
87
87
  flwr/client/grpc_rere_client/__init__.py,sha256=MK-oSoV3kwUEQnIwl0GN4OpiHR7eLOrMA8ikunET130,752
88
88
  flwr/client/grpc_rere_client/client_interceptor.py,sha256=8yX2jhwfX9r1PO76ZdME4tPefutnQqWPi7kELriBMUo,2451
89
89
  flwr/client/grpc_rere_client/connection.py,sha256=CHC5ssg7SMIN78JsWFKHg2P_fT2G_Ng3rtR869hLmoQ,11777
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=FspUe8JmH8pROpANZVjNtxHX-07yi9A6poLZ9Ro7WK4,6492
94
- flwr/client/mod/__init__.py,sha256=37XeXZLFq_tzFVKVtC9JaigM2bSAU7BrGQvMPCE3Q28,1159
95
- flwr/client/mod/centraldp_mods.py,sha256=UGwNuqpmOWfLdfJITFgdi1TG-nLjuSb-cbEyoyfDgxQ,5415
96
- flwr/client/mod/comms_mods.py,sha256=s_H57ZXUPaWFifodCbRCOZW06IZRsilcOr9F-yWBtxg,2625
97
- flwr/client/mod/localdp_mod.py,sha256=Zhcu2M1QYCaS0dfmTjkhmFABIJcFXfT6zDgV0o9sn-4,5003
93
+ flwr/client/message_handler/message_handler.py,sha256=lRTzbEZFCrHgKhyLES9uIBS0TyyWJSgRs7X8gInsBQg,6532
94
+ flwr/client/mod/__init__.py,sha256=Ov7g-Nb4MVHXvMVPoOT6BpUtLGveWjPdoisy1pOjVhY,1151
95
+ flwr/client/mod/centraldp_mods.py,sha256=IfbUCAMXc0qztC5_bJkoQCEMSCXGje3Z6hiIfhiVwbY,5422
96
+ flwr/client/mod/comms_mods.py,sha256=LgbnUmISwiz3eFdcBXnyFmldMZFOwdytVJdbTeE9ndE,2380
97
+ flwr/client/mod/localdp_mod.py,sha256=vPrPHMw30PoSDBZEZjtbEHKRF8atx3CxZRN1x_yDze4,5007
98
98
  flwr/client/mod/secure_aggregation/__init__.py,sha256=A7DzZ3uvXTUkuHBzrxJMWQQD4RtO_PsVA53yHc4oWco,849
99
99
  flwr/client/mod/secure_aggregation/secagg_mod.py,sha256=wI9tuIEvMUETz-wVIEbPYvh-1nK9CEylBLGoVpNhL94,1095
100
- flwr/client/mod/secure_aggregation/secaggplus_mod.py,sha256=7cNXsY07ZA0M5_9VSc52F8JUoAoGaraNDA2rgaLvvFo,19680
100
+ flwr/client/mod/secure_aggregation/secaggplus_mod.py,sha256=M7NfPS1i0GL5sYoTyFAcuAVjo9mN1fhA8afeKfLRJYY,19661
101
101
  flwr/client/mod/utils.py,sha256=dFcTHOjUuuiw34fcQlvyzytYD0sCv1w9x8fQX1Yo8Oc,1201
102
102
  flwr/client/nodestate/__init__.py,sha256=6FTlzydo1j0n55Tb-Qo0XmuqTUyRxg3x7jHgo3gU1No,976
103
103
  flwr/client/nodestate/in_memory_nodestate.py,sha256=MKI3jVPARPWJmNGw61k1-9LIXROkTx2PrhWjDM8cpHk,1291
@@ -106,18 +106,18 @@ flwr/client/nodestate/nodestate_factory.py,sha256=apUbcJG0a_FUVsc0TkNN3q9yovc9u_
106
106
  flwr/client/numpy_client.py,sha256=chTkL9dOtK_wgUoYtzp5mfDOC1k8xPAd1qPIsB3hcjA,9581
107
107
  flwr/client/rest_client/__init__.py,sha256=5KGlp7pjc1dhNRkKlaNtUfQmg8wrRFh9lS3P3uRS-7Q,735
108
108
  flwr/client/rest_client/connection.py,sha256=c0mHsNXHAsbX4zNelbGd2qrV3vj90FfNE6FsiD6JzuY,12904
109
- flwr/client/run_info_store.py,sha256=ZN2Phi4DSLbSyzg8RmzJcVYh1g6eurHOmWRCT7GMtw4,4040
109
+ flwr/client/run_info_store.py,sha256=CtOTf-m5WMpbHtNL97h6FzYCsRBk7yD4Pl7yNRY-lEo,4042
110
110
  flwr/client/supernode/__init__.py,sha256=D5swXxemuRbA2rB_T9B8LwJW-_PucXwmlFQQerwIUv0,793
111
111
  flwr/client/supernode/app.py,sha256=W1VAgvjdSgrKKgjyM04Hx5XIUGxK2Oouuh0LjavZB9E,8975
112
112
  flwr/client/typing.py,sha256=dxoTBnTMfqXr5J7G3y-uNjqxYCddvxhu89spfj4Lm2U,1048
113
- flwr/common/__init__.py,sha256=TVaoFEJE158aui1TPZQiJCDZX4RNHRyI8I55VC80HhI,3901
113
+ flwr/common/__init__.py,sha256=Ue3IrSnLoIBgpQw0rTBwQ7gJe-bShQHdkYDMD1RqVig,4162
114
114
  flwr/common/address.py,sha256=rRaN1JpiCJnit7ImEqZVxURQ69dPihRoyyWn_3I2wh4,4119
115
115
  flwr/common/args.py,sha256=2gGT2a3SPJ0-LTNKnhBsZ-ESIoW9FGpw-9xkUSs8qwk,5417
116
116
  flwr/common/auth_plugin/__init__.py,sha256=1Y8Oj3iB49IHDu9tvDih1J74Ygu7k85V9s2A4WORPyA,887
117
117
  flwr/common/auth_plugin/auth_plugin.py,sha256=dQU5U4uJIA5XqgOJ3PankHWq-uXCaMvO74khaMPGdiU,3938
118
- flwr/common/config.py,sha256=SAkG3BztnA6iupXxF3GAIpGmWVVCH0ptyMpC9yjr_14,13965
119
- flwr/common/constant.py,sha256=a1kNtPH5yS30YUWs7VgNu-O7i8_RAt5iL0AzG04QHVo,6989
120
- flwr/common/context.py,sha256=uJ-mnoC_8y_udEb3kAX-r8CPphNTWM72z1AlsvQEu54,2403
118
+ flwr/common/config.py,sha256=8pcQHIvxJnuyXKyAsMCpYuIOvU53CszTUDZre_qPy_s,13960
119
+ flwr/common/constant.py,sha256=-KmAOdlIgjSMQtvZtxkBQmz0DBE9x4PkZHqfz3nfOw8,6984
120
+ flwr/common/context.py,sha256=XE3WlKPd4C_md6I8oWw8HM4grtOjMKz7YamhNWieF34,2407
121
121
  flwr/common/date.py,sha256=NHHpESce5wYqEwoDXf09gp9U9l_5Bmlh2BsOcwS-kDM,1554
122
122
  flwr/common/differential_privacy.py,sha256=YA01NqjddKNAEVmf7hXmOVxOjhekgzvJudk3mBGq-2k,6148
123
123
  flwr/common/differential_privacy_constants.py,sha256=c7b7tqgvT7yMK0XN9ndiTBs4mQf6d3qk6K7KBZGlV4Q,1074
@@ -130,18 +130,18 @@ flwr/common/exit/exit_code.py,sha256=PNEnCrZfOILjfDAFu5m-2YWEJBrk97xglq4zCUlqV7E
130
130
  flwr/common/exit_handlers.py,sha256=yclujry30954o0lI7vtknTajskPCvK8TXw2V3RdldXU,3174
131
131
  flwr/common/grpc.py,sha256=7sHNP34LcNZv7J1GewJxXh509XTEbYvoHvXL5tQ3tcw,9798
132
132
  flwr/common/logger.py,sha256=Q5ZsQq1ouTvpP63I4V8e7gr0T_r7h0DJ122Nh3q0qzg,13049
133
- flwr/common/message.py,sha256=dbaIKvw1hJZrLpipbdX6hUw1nhzrxDMXCS7EADQUwE8,16060
133
+ flwr/common/message.py,sha256=u2M7mEnKMqrrOOwRj6pEeIiHB2ZjfNuf8s3Ctt9SESE,23060
134
134
  flwr/common/object_ref.py,sha256=DXL8NtbN17DSYaR-Zc8WYhaG8rv0_D_cclvP7Sa66So,9134
135
135
  flwr/common/parameter.py,sha256=-bFAUayToYDF50FZGrBC1hQYJCQDtB2bbr3ZuVLMtdE,2095
136
136
  flwr/common/pyproject.py,sha256=vEAxl800XiJ1JNJDui8vuVV-08msnB6hLt7o95viZl0,1386
137
- flwr/common/record/__init__.py,sha256=LUixpq0Z-lMJwCIu1-4u5HfvRPjRMRgoAc6YJQ6UEOs,1055
138
- flwr/common/record/configsrecord.py,sha256=i40jOzBx04ysZKECwaw4FdUXMdY9HgdY8GAqKdTO1Lw,6486
139
- flwr/common/record/conversion_utils.py,sha256=ZcsM-vTm_rVtLXLFD2RY3N47V_hUr3ywTdtnpVXnOGU,1202
140
- flwr/common/record/metricsrecord.py,sha256=UywkEPbifiu_IyPUFoDJCi8WEVLujlqZERUWAWpc3vs,5752
141
- flwr/common/record/parametersrecord.py,sha256=EGnpnfw68P22qqbUWuDFjURMqDOvSUkfZGq7lYQLbUI,21597
142
- flwr/common/record/recordset.py,sha256=ambtB74uF1pooQTfcBt1_xWsjvyDjGMc6awEt20ur2A,8547
137
+ flwr/common/record/__init__.py,sha256=8kSdSIeacvClznQyyH6OzoEcslCGd4YQQakvoqLKL60,1179
138
+ flwr/common/record/arrayrecord.py,sha256=kgsSdqUhyRjEPwN2-4k-e0kptwc07BaYbFckypSN-7w,22750
139
+ flwr/common/record/configrecord.py,sha256=JWBoZUJdAC09xBEpz-4NndiWXzkpjqon4YDCcRzbgqs,7750
140
+ flwr/common/record/conversion_utils.py,sha256=4X19jUrY7svS3uNc8wc-KAe_Fb0T5wQNrt7AjHLhKFU,1197
141
+ flwr/common/record/metricrecord.py,sha256=CxSfcOmPC3P4z8dwRk800Y5DbpxYvLIj7rothSr0aR4,7020
142
+ flwr/common/record/recorddict.py,sha256=RecSTrmjfv6uWcMnXCnzCrtQRrwn-pvgQwIXvlzJOkw,10535
143
143
  flwr/common/record/typeddict.py,sha256=q5hL2xkXymuiCprHWb69mUmLpWQk_XXQq0hGQ69YPaw,3599
144
- flwr/common/recordset_compat.py,sha256=ViSwA26h6Q55ZmV1LLjSJpcKiipV-p_JpCj4wxdE-Ow,14230
144
+ flwr/common/recorddict_compat.py,sha256=Znn1xRGiqLpPPgviVqyb-GPTM-pCK6tpnEmhWSXafy8,14119
145
145
  flwr/common/retry_invoker.py,sha256=UIDKsn0AitS3fOr43WTqZAdD-TaHkBeTj1QxD7SGba0,14481
146
146
  flwr/common/secure_aggregation/__init__.py,sha256=erPnTWdOfMH0K0HQTmj5foDJ6t3iYcExy2aACy8iZNQ,731
147
147
  flwr/common/secure_aggregation/crypto/__init__.py,sha256=nlHesCWy8xxE5s6qHWnauCtyClcMQ2K0CEXAHakY5n0,738
@@ -149,11 +149,11 @@ flwr/common/secure_aggregation/crypto/shamir.py,sha256=wCSfEfeaPgJ9Om580-YPUF2lj
149
149
  flwr/common/secure_aggregation/crypto/symmetric_encryption.py,sha256=J_pRkxbogc7e1fxRZStZFBdzzG5jeUycshJPpvyCt6g,5333
150
150
  flwr/common/secure_aggregation/ndarrays_arithmetic.py,sha256=zvVAIrIyI6OSzGhpCi8NNaTvPXmoMYQIPJT-NkBg8RU,3013
151
151
  flwr/common/secure_aggregation/quantization.py,sha256=NE_ltC3Fx5Z3bMKqJHA95wQf2tkGQlN0VZf3d1w5ABA,2400
152
- flwr/common/secure_aggregation/secaggplus_constants.py,sha256=9MF-oQh62uD7rt9VeNB-rHf2gBLd5GL3S9OejCxmILY,2183
152
+ flwr/common/secure_aggregation/secaggplus_constants.py,sha256=c1IIyWrbaif9VYbB3ph0ZvW6MUsouCKMrArUOeH--O0,2182
153
153
  flwr/common/secure_aggregation/secaggplus_utils.py,sha256=OgYd68YBRaHQYLc-YdExj9CSpwL58bVTaPrdHoAj2AE,3214
154
- flwr/common/serde.py,sha256=dgPUMPoKh8r09NERMgfnZKmEiGuKVBje7bSVFwJVZyk,27340
154
+ flwr/common/serde.py,sha256=_OYisre1Zha60TsoNF2GNryGnDq7trGq3cl6B-T4q4U,27082
155
155
  flwr/common/telemetry.py,sha256=k4JVXNEZSyYF2BuKk10iH70D8RYmQEtFlVr42Ve6lls,8770
156
- flwr/common/typing.py,sha256=Prl8_4tKnIl_Kh5UjJGbw1tnld543EkXrX0RWffJpiA,6900
156
+ flwr/common/typing.py,sha256=pXxbtTprUFi4UA-52TtkzvphjgUOdrAkkdj3s7HDiQ8,6886
157
157
  flwr/common/version.py,sha256=aNSxLL49RKeLz8sPcZrsTEWtrAeQ0uxu6tjmfba4O60,1325
158
158
  flwr/proto/__init__.py,sha256=hbY7JYakwZwCkYgCNlmHdc8rtvfoJbAZLalMdc--CGc,683
159
159
  flwr/proto/clientappio_pb2.py,sha256=aroQDv0D2GquQ5Ujqml7n7l6ObZoXqMvDa0XVO-_8Cc,3703
@@ -164,8 +164,8 @@ flwr/proto/error_pb2.py,sha256=PQVWrfjVPo88ql_KgV9nCxyQNCcV9PVfmcw7sOzTMro,1084
164
164
  flwr/proto/error_pb2.pyi,sha256=ZNH4HhJTU_KfMXlyCeg8FwU-fcUYxTqEmoJPtWtHikc,734
165
165
  flwr/proto/error_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
166
166
  flwr/proto/error_pb2_grpc.pyi,sha256=ff2TSiLVnG6IVQcTGzb2DIH3XRSoAvAo_RMcvbMFyc0,76
167
- flwr/proto/exec_pb2.py,sha256=HYvEJ1LtRMpEtUFoo4cgl33QQ8fNisOOEZQlJbTrvTk,5664
168
- flwr/proto/exec_pb2.pyi,sha256=2vbzq2OOYM5GI-Tug4eVM5J6xvNvSFtR8m3MsP-i-Q4,9477
167
+ flwr/proto/exec_pb2.py,sha256=vsGjwZnpaNUFOAzllVtWAXhpUbHTzcKc1LsalQSicRA,5666
168
+ flwr/proto/exec_pb2.pyi,sha256=oEQH84BwhgaiD5zIseGH_UujuMk2SVCe5R75msEga-8,9478
169
169
  flwr/proto/exec_pb2_grpc.py,sha256=-bdLqjsqQxK9R8LIiZaKlLKH2NmjR50EaGKTPPTwFhI,10445
170
170
  flwr/proto/exec_pb2_grpc.pyi,sha256=M5k-FzeLWxal7zt28LJfzMWWRxmNknTC2BzHRRMa1sQ,2914
171
171
  flwr/proto/fab_pb2.py,sha256=2Nu0WaWxDZ8TbutMtctjdcGM7OtXiyP4kmCgg5o7Jjw,1627
@@ -184,20 +184,20 @@ flwr/proto/log_pb2.py,sha256=iKaS3MVn1BS4xHu8uGPFCOi1KWtvVx-H9V4jCUIJghs,1393
184
184
  flwr/proto/log_pb2.pyi,sha256=ipuhgo40sAHTcRzCsGI1HwIstr5q0THPNk_cf62YyME,1448
185
185
  flwr/proto/log_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
186
186
  flwr/proto/log_pb2_grpc.pyi,sha256=ff2TSiLVnG6IVQcTGzb2DIH3XRSoAvAo_RMcvbMFyc0,76
187
- flwr/proto/message_pb2.py,sha256=QpHsdMqMUTj30jdLARagAc90UvqpRI7xbtXVE_nw9RM,3189
188
- flwr/proto/message_pb2.pyi,sha256=kAFVgSi8j6ZYzkCQ9MkbrpUtVKgZsTYVIoQmcMB6BX0,5735
187
+ flwr/proto/message_pb2.py,sha256=ob77p0WOtDYAvKhVoGOSPriGtVuSSfMw9WR7G7FkAJk,3198
188
+ flwr/proto/message_pb2.pyi,sha256=DPUti2q_VJpRsy6Fzc5OPVm8j3Ko4OgN8IuEiFV4KOo,5759
189
189
  flwr/proto/message_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
190
190
  flwr/proto/message_pb2_grpc.pyi,sha256=ff2TSiLVnG6IVQcTGzb2DIH3XRSoAvAo_RMcvbMFyc0,76
191
191
  flwr/proto/node_pb2.py,sha256=BzZfAWIX7lV62bZr9f7x16lUZcpg-EImxnwxQXgCbYg,1045
192
192
  flwr/proto/node_pb2.pyi,sha256=CPMeIPzUeI5-Csw9sHktV9UBH4GbqiGuYzGQQKftm6Q,616
193
193
  flwr/proto/node_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
194
194
  flwr/proto/node_pb2_grpc.pyi,sha256=ff2TSiLVnG6IVQcTGzb2DIH3XRSoAvAo_RMcvbMFyc0,76
195
- flwr/proto/recordset_pb2.py,sha256=DndSkDNEYjdoOaHopgohRGP8lQtmal8yx_Re1wXfuOM,6367
196
- flwr/proto/recordset_pb2.pyi,sha256=ypFNvroU4aIlnN0D6W4XAsOfm0UzTfXhxxL1v7u__Ac,15370
197
- flwr/proto/recordset_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
198
- flwr/proto/recordset_pb2_grpc.pyi,sha256=ff2TSiLVnG6IVQcTGzb2DIH3XRSoAvAo_RMcvbMFyc0,76
199
- flwr/proto/run_pb2.py,sha256=_IvmIi3uttPIALjMYExAoUXw7P_rt3I-at_s0yNTIJY,5743
200
- flwr/proto/run_pb2.pyi,sha256=i6TEwphuFH94_kT2hZWb_RjndLuphkPrT3C2VP-NnVs,11739
195
+ flwr/proto/recorddict_pb2.py,sha256=G_ArzgRfHVXJTqtIZ6lYN8rZsCcj6p_1KokGUjajtMY,6338
196
+ flwr/proto/recorddict_pb2.pyi,sha256=M9dVj5o7sw91pnIBWVl76Ka82sDUiwm-rnv_iV9Omhc,15286
197
+ flwr/proto/recorddict_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
198
+ flwr/proto/recorddict_pb2_grpc.pyi,sha256=ff2TSiLVnG6IVQcTGzb2DIH3XRSoAvAo_RMcvbMFyc0,76
199
+ flwr/proto/run_pb2.py,sha256=9ArAxGT-SgOaIZG-WN6tb-rpka1jLTkaJpDAA39JXeY,5745
200
+ flwr/proto/run_pb2.pyi,sha256=NEz0uJmTpbSGGuYWPVoSog7tS-XjBkaJNdB2l_io2SI,11740
201
201
  flwr/proto/run_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
202
202
  flwr/proto/run_pb2_grpc.pyi,sha256=ff2TSiLVnG6IVQcTGzb2DIH3XRSoAvAo_RMcvbMFyc0,76
203
203
  flwr/proto/serverappio_pb2.py,sha256=WijK7rejbb7h6GVK0pTf81Ey5Ltf7A_S7aKlUJWlny4,4908
@@ -220,14 +220,14 @@ flwr/server/client_proxy.py,sha256=4G-oTwhb45sfWLx2uZdcXD98IZwdTS6F88xe3akCdUg,2
220
220
  flwr/server/compat/__init__.py,sha256=uEH_iym6jRdv-Z48CksoMsxvrxU26PIIj50Plf39jhs,886
221
221
  flwr/server/compat/app.py,sha256=Q4XY4sQ5fRPvX86X1U2A2Ah1QbVTg26YsTJC8JgdruY,3323
222
222
  flwr/server/compat/app_utils.py,sha256=X63iKjRsdsyVL0TTIlIXqysOxXh1lyymR8qEmJopx2c,3772
223
- flwr/server/compat/grid_client_proxy.py,sha256=hUSZdzXCDlfsuuVBzjTzE_n-Wp7UJMrvhnhaxbwYyiI,4930
223
+ flwr/server/compat/grid_client_proxy.py,sha256=FxMgGtrzBoBAPby2ZjTWzpCJsCht8FwMm4PzqW80dmQ,4956
224
224
  flwr/server/compat/legacy_context.py,sha256=wBzBcfV6YO6IQGriM_FdJ5XZfiBBEEJdS_OdAiF47dY,1804
225
225
  flwr/server/criterion.py,sha256=ypbAexbztzGUxNen9RCHF91QeqiEQix4t4Ih3E-42MM,1061
226
226
  flwr/server/fleet_event_log_interceptor.py,sha256=AkL7Y5d3xm2vRhL3ahmEVVoOvAP7PA7dRgB-je4v-Ys,3774
227
227
  flwr/server/grid/__init__.py,sha256=aWZHezoR2UGMJISB_gPMCm2N_2GSbm97A3lAp7ruhRQ,888
228
- flwr/server/grid/grid.py,sha256=p5ZhBT_GQ_oeHfKWFf94Uco4zKCaNeeIZnw32bZ-djI,6611
229
- flwr/server/grid/grpc_grid.py,sha256=KOMkIWdRkZPLN1bDMxrXPnrJYtibbgMalKEvBt8sqWg,11209
230
- flwr/server/grid/inmemory_grid.py,sha256=JV9EnOCiPpSfskeYXY3j_IRZ_T1AOXHciA9sHT4YRDI,6079
228
+ flwr/server/grid/grid.py,sha256=5r5wdqs3NJ5EJ7HyhMahMauAnPyLZEsgpNOfdKudt_s,6614
229
+ flwr/server/grid/grpc_grid.py,sha256=1aTWEgTA3Z0gnWJy5ywe3H7YmaoPTmrXBlu1fD3CFPI,10973
230
+ flwr/server/grid/inmemory_grid.py,sha256=WypQlPP6ArTOipS0i9xJCZmonu6LoKCAra2s7g_vPsE,5959
231
231
  flwr/server/history.py,sha256=qSb5_pPTrwofpSYGsZWzMPkl_4uJ4mJFWesxXDrEvDU,5026
232
232
  flwr/server/run_serverapp.py,sha256=EEDgJH0iwKCsxguGrdjQ6Eh7BL6VaM23DWjec6AlVdE,2063
233
233
  flwr/server/server.py,sha256=1ZsFEptmAV-L2vP2etNC9Ed5CLSxpuKzUFkAPQ4l5Xc,17893
@@ -282,52 +282,52 @@ flwr/server/superlink/fleet/rest_rere/__init__.py,sha256=5jbYbAn75sGv-gBwOPDySE0
282
282
  flwr/server/superlink/fleet/rest_rere/rest_api.py,sha256=L7sg9Uyp7l1bViYNWjnpaDvcG_j7FYKWC1XL-8bMpsg,6710
283
283
  flwr/server/superlink/fleet/vce/__init__.py,sha256=TZJsKTpYO_djv2EXx9Ji62I8TA0JiZF8jvRyJRZkAes,784
284
284
  flwr/server/superlink/fleet/vce/backend/__init__.py,sha256=cGgal5qpd0_MwEdIqjJbHHSIgGa6GSPoI5_byUwtG_k,1437
285
- flwr/server/superlink/fleet/vce/backend/backend.py,sha256=lr_uBMaoCp7qs59ZRpCI07wp-EsClNB-7QWFfF0r95c,2195
286
- flwr/server/superlink/fleet/vce/backend/raybackend.py,sha256=jsUkFEVQTnrucK1jNQ_cUM8YwL7W4MQNA1GAf8ibRdg,7156
287
- flwr/server/superlink/fleet/vce/vce_api.py,sha256=xQbWzfIsXYwcEHoYxrgDcx3yGJKUoBdkc8zkJ8onzBs,12802
285
+ flwr/server/superlink/fleet/vce/backend/backend.py,sha256=ND7PLJoe-xMKcibWH1SnLMNW0DgH9JUoAeZ2Hb2_rjA,2193
286
+ flwr/server/superlink/fleet/vce/backend/raybackend.py,sha256=XWV9BI1-I4syJb3pr28Y2bNGrOqt6B0LKx6MBs3KPzk,7154
287
+ flwr/server/superlink/fleet/vce/vce_api.py,sha256=GlT2wMpAFSk_jTXyp4kWdlsyt9DQ189zpHRzhf1I0Xg,12765
288
288
  flwr/server/superlink/linkstate/__init__.py,sha256=v-2JyJlCB3qyhMNwMjmcNVOq4rkooqFU0LHH8Zo1jls,1064
289
- flwr/server/superlink/linkstate/in_memory_linkstate.py,sha256=9wOOvqmWvchtVDVxhCrifTchzpY2Y6yM4OLHDrzLoq0,22292
290
- flwr/server/superlink/linkstate/linkstate.py,sha256=YB3SryGNvt-bE-unYjoloJt9d3xAUPBNLK4mor8gk3M,11851
289
+ flwr/server/superlink/linkstate/in_memory_linkstate.py,sha256=DLOJOUHK5Lrs9D6SIocTRnz3zKsBQRIFYejaLisayMk,22291
290
+ flwr/server/superlink/linkstate/linkstate.py,sha256=M7Rrpq_ergi5HkEFWIY2ab0VZUR2WuEjsT76juTWUhI,11847
291
291
  flwr/server/superlink/linkstate/linkstate_factory.py,sha256=ISSMjDlwuN7swxjOeYlTNpI_kuZ8PGkMcJnf1dbhUSE,2069
292
- flwr/server/superlink/linkstate/sqlite_linkstate.py,sha256=N_zWoWDNaNrFCnyz4wHWABc0k4jGryQhx50QWk_D6VQ,39691
293
- flwr/server/superlink/linkstate/utils.py,sha256=NjGRbvm2VE0ODeLMO0q5pFDd9DK_kV8byvRo4lk2_kE,15232
292
+ flwr/server/superlink/linkstate/sqlite_linkstate.py,sha256=Wtu85XKqK-UcGn7pz6jpQqhwwusJGr8QXajQN5er7Gw,39627
293
+ flwr/server/superlink/linkstate/utils.py,sha256=8R8ieD_MlMFVzpZzWJO7wkGcVa_NeCXE7axoyrc7_H4,15358
294
294
  flwr/server/superlink/serverappio/__init__.py,sha256=Fy4zJuoccZe5mZSEIpOmQvU6YeXFBa1M4eZuXXmJcn8,717
295
295
  flwr/server/superlink/serverappio/serverappio_grpc.py,sha256=opJ6SYwIAbu4NWEo3K-VxFO-tMSFmE4H3i2HwHIVRzw,2173
296
- flwr/server/superlink/serverappio/serverappio_servicer.py,sha256=71s1SijefpTpJC2mZD3Y0CZBK9PtK0Yxc4aXawdvEDQ,13121
296
+ flwr/server/superlink/serverappio/serverappio_servicer.py,sha256=olLC0PvFY09hRWSZyJvJo-ituSDX45fvEVGaTlKufu8,13122
297
297
  flwr/server/superlink/simulation/__init__.py,sha256=mg-oapC9dkzEfjXPQFior5lpWj4g9kwbLovptyYM_g0,718
298
298
  flwr/server/superlink/simulation/simulationio_grpc.py,sha256=8aUrZZLdvprKUfLLqFID4aItus9beU6m1qLQYIPB7k0,2224
299
- flwr/server/superlink/simulation/simulationio_servicer.py,sha256=J_TmdqM-Bxgp-iPEI3tvCuBpykw1UX0FouMQalEYAF4,6907
299
+ flwr/server/superlink/simulation/simulationio_servicer.py,sha256=x4BH3RxdIa9sDHtw4u1jk8sfnz0vPbuRqoMHmifV724,6905
300
300
  flwr/server/superlink/utils.py,sha256=KVb3K_g2vYfu9TnftcN0ewmev133WZcjuEePMm8d7GE,2137
301
301
  flwr/server/typing.py,sha256=3pdDgzX-rwW56egOINr1R_Qnbhm20ieYNuVaI_P7-as,1011
302
302
  flwr/server/utils/__init__.py,sha256=vnS9EAyVUsBOmWeYZXMoBcjeEFhqN4_KQQVk5EBiWG0,884
303
303
  flwr/server/utils/tensorboard.py,sha256=gEBD8w_5uaIfp5aw5RYH66lYZpd_SfkObHQ7eDd9MUk,5466
304
- flwr/server/utils/validator.py,sha256=11olMv1UyeaxLa1ci5gsJ0WALk7VwWGCQYCvLsZ56LY,3604
304
+ flwr/server/utils/validator.py,sha256=ka2zJkCNnfs6GdPJYWh_ojq8D5egOICmXBZmJWzecdQ,3616
305
305
  flwr/server/workflow/__init__.py,sha256=SXY0XkwbkezFBxxrFB5hKUtmtAgnYISBkPouR1V71ss,902
306
306
  flwr/server/workflow/constant.py,sha256=q4DLdR8Krlxuewq2AQjwTL75hphxE5ODNz4AhViHMXk,1082
307
- flwr/server/workflow/default_workflows.py,sha256=WVHupVIHax5g0OcBN0LYeMo4Mxz2UpGf_AgnIIAogBg,14102
307
+ flwr/server/workflow/default_workflows.py,sha256=_I2ac4zlOEhlMl-xyc8vyH3O0QGJX6-1lAKvqB_8pIw,13900
308
308
  flwr/server/workflow/secure_aggregation/__init__.py,sha256=3XlgDOjD_hcukTGl6Bc1B-8M_dPlVSJuTbvXIbiO-Ic,880
309
309
  flwr/server/workflow/secure_aggregation/secagg_workflow.py,sha256=l2IdMdJjs1bgHs5vQgLSOVzar7v2oxUn46oCrnVE1rM,5839
310
- flwr/server/workflow/secure_aggregation/secaggplus_workflow.py,sha256=VZTe2B-rTYHMJwQsSqXZ2r5y12BhEZ7S0xv6Tiy6DOg,29581
310
+ flwr/server/workflow/secure_aggregation/secaggplus_workflow.py,sha256=tsecazXA_RhkOhovfIf1iS-b_tr3bleh--KKLWpDbJA,29460
311
311
  flwr/simulation/__init__.py,sha256=5UcDVJNjFoSwWqHbGM1hKfTTUUNdwAtuoNvNrfvdkUY,1556
312
- flwr/simulation/app.py,sha256=xRVSJBnTXQUqWIYOzENfTnJlZ24CSNhWkhVEFxIu4I0,9758
312
+ flwr/simulation/app.py,sha256=Nag6eoeuJob77PE-mo8lzhKUZKwvcWbpdm0cJmYgFvg,9756
313
313
  flwr/simulation/legacy_app.py,sha256=qpZI4Vvzr5TyWSLTRrMP-jN4rH2C25JI9nVSSjhFwSQ,15861
314
314
  flwr/simulation/ray_transport/__init__.py,sha256=wzcEEwUUlulnXsg6raCA1nGpP3LlAQDtJ8zNkCXcVbA,734
315
- flwr/simulation/ray_transport/ray_actor.py,sha256=k11yoAPQzFGQU-KnCCP0ZrfPPdUPXXrBe-1DKM5VdW4,18997
316
- flwr/simulation/ray_transport/ray_client_proxy.py,sha256=2vjOKoom3B74C6XU-jC3N6DwYmsLdB-lmkHZ_Xrv96o,7367
315
+ flwr/simulation/ray_transport/ray_actor.py,sha256=nVq6wHtnfWPF3iXLN4B8CGImgU5AbiDX0zfeyVvVZ8Q,19147
316
+ flwr/simulation/ray_transport/ray_client_proxy.py,sha256=4JZRkic8ZYuf-pBaTqSA_yu_1ryms8Ql2FmuCFYrg1k,7506
317
317
  flwr/simulation/ray_transport/utils.py,sha256=wtbQhKQ4jGoiQDLJNQP17m1DSfL22ERhDBGuoeUFaAQ,2393
318
- flwr/simulation/run_simulation.py,sha256=bMETYMWS8C9nWOD62qYGnfNQwOJUsQPsUOkCFrf7DIc,20302
318
+ flwr/simulation/run_simulation.py,sha256=DjtLgq8AxlHQyaGDD98u6CGhXCeeF1jllDeByBaLx1I,20303
319
319
  flwr/simulation/simulationio_connection.py,sha256=lcbEmdjb9RVEF2W5vSbf_J1zlTuv_ZAT_HLox1mqcfY,3494
320
320
  flwr/superexec/__init__.py,sha256=fcj366jh4RFby_vDwLroU4kepzqbnJgseZD_jUr_Mko,715
321
321
  flwr/superexec/app.py,sha256=C0T2LMjuyF__I5V1FKfjtWtbsQPxK_EgL4vuhWIwG8s,1465
322
- flwr/superexec/deployment.py,sha256=wZ9G42gGS91knfplswh95MnQ83Fzu-rs6wcuNgDmmvY,6735
322
+ flwr/superexec/deployment.py,sha256=cn2fwyx10-nxiP4g_2LOOJvfQqPhdFH9gZt_b-s2SFk,6734
323
323
  flwr/superexec/exec_event_log_interceptor.py,sha256=IlQ_w-GpGNMJ4g1gTI3H4LHfWli1-8O7a2-pCqB3yeA,5753
324
324
  flwr/superexec/exec_grpc.py,sha256=9-WF6qPuhiYohMe3SIZ5Sapp_dLjICvm5QfdTNizsJg,3252
325
- flwr/superexec/exec_servicer.py,sha256=4UpzJqPUHkBG2PZNe2lrX7XFVDOL6yw_HcoBHxuXE9A,8349
325
+ flwr/superexec/exec_servicer.py,sha256=ScwGRnix5swqVjBPdxZHBlji9ReXRXTWRIIV6YgnN_M,8347
326
326
  flwr/superexec/exec_user_auth_interceptor.py,sha256=2kXjjJcrZyff893QTFLQD6zxC4pdVwtN4Rc66jHptfE,4440
327
- flwr/superexec/executor.py,sha256=_B55WW2TD1fBINpabSSDRenVHXYmvlfhv-k8hJKU4lQ,3115
328
- flwr/superexec/simulation.py,sha256=WQDon15oqpMopAZnwRZoTICYCfHqtkvFSqiTQ2hLD_g,4088
329
- flwr_nightly-1.17.0.dev20250319.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
330
- flwr_nightly-1.17.0.dev20250319.dist-info/METADATA,sha256=CV7FwrxaqpObFhROZV0wp_HuFRtNjLrbvRgV601Ufmc,15878
331
- flwr_nightly-1.17.0.dev20250319.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
332
- flwr_nightly-1.17.0.dev20250319.dist-info/entry_points.txt,sha256=2-1L-GNKhwGw2_7_RoH55vHw2SIHjdAQy3HAVAWl9PY,374
333
- flwr_nightly-1.17.0.dev20250319.dist-info/RECORD,,
327
+ flwr/superexec/executor.py,sha256=xdiRM2ryAMX8z4sS5A1Z5CbaOqhM4WkXrlQNupcF3DI,3112
328
+ flwr/superexec/simulation.py,sha256=Pnm9PWTiDVjXS2IgufMEqz1-fPTe3AR1vKOA5IxycGE,4088
329
+ flwr_nightly-1.17.0.dev20250321.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
330
+ flwr_nightly-1.17.0.dev20250321.dist-info/METADATA,sha256=i4cwm_zjJE0lxDm7jMeLGHtWWEeNI6zF3UZI66mkZek,15878
331
+ flwr_nightly-1.17.0.dev20250321.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
332
+ flwr_nightly-1.17.0.dev20250321.dist-info/entry_points.txt,sha256=2-1L-GNKhwGw2_7_RoH55vHw2SIHjdAQy3HAVAWl9PY,374
333
+ flwr_nightly-1.17.0.dev20250321.dist-info/RECORD,,
@@ -1,209 +0,0 @@
1
- # Copyright 2024 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
- """RecordSet."""
16
-
17
-
18
- from __future__ import annotations
19
-
20
- from logging import WARN
21
- from textwrap import indent
22
- from typing import TypeVar, Union, cast
23
-
24
- from ..logger import log
25
- from .configsrecord import ConfigsRecord
26
- from .metricsrecord import MetricsRecord
27
- from .parametersrecord import ParametersRecord
28
- from .typeddict import TypedDict
29
-
30
- RecordType = Union[ParametersRecord, MetricsRecord, ConfigsRecord]
31
-
32
- T = TypeVar("T")
33
-
34
-
35
- def _check_key(key: str) -> None:
36
- if not isinstance(key, str):
37
- raise TypeError(
38
- f"Expected `{str.__name__}`, but "
39
- f"received `{type(key).__name__}` for the key."
40
- )
41
-
42
-
43
- def _check_value(value: RecordType) -> None:
44
- if not isinstance(value, (ParametersRecord, MetricsRecord, ConfigsRecord)):
45
- raise TypeError(
46
- f"Expected `{ParametersRecord.__name__}`, `{MetricsRecord.__name__}`, "
47
- f"or `{ConfigsRecord.__name__}` but received "
48
- f"`{type(value).__name__}` for the value."
49
- )
50
-
51
-
52
- class _SyncedDict(TypedDict[str, T]):
53
- """A synchronized dictionary that mirrors changes to an underlying RecordSet.
54
-
55
- This dictionary ensures that any modifications (set or delete operations)
56
- are automatically reflected in the associated `RecordSet`. Only values of
57
- the specified `allowed_type` are permitted.
58
- """
59
-
60
- def __init__(self, ref_recordset: RecordSet, allowed_type: type[T]) -> None:
61
- if not issubclass(
62
- allowed_type, (ParametersRecord, MetricsRecord, ConfigsRecord)
63
- ):
64
- raise TypeError(f"{allowed_type} is not a valid type.")
65
- super().__init__(_check_key, self.check_value)
66
- self.recordset = ref_recordset
67
- self.allowed_type = allowed_type
68
-
69
- def __setitem__(self, key: str, value: T) -> None:
70
- super().__setitem__(key, value)
71
- self.recordset[key] = cast(RecordType, value)
72
-
73
- def __delitem__(self, key: str) -> None:
74
- super().__delitem__(key)
75
- del self.recordset[key]
76
-
77
- def check_value(self, value: T) -> None:
78
- """Check if value is of expected type."""
79
- if not isinstance(value, self.allowed_type):
80
- raise TypeError(
81
- f"Expected `{self.allowed_type.__name__}`, but "
82
- f"received `{type(value).__name__}` for the value."
83
- )
84
-
85
-
86
- class RecordSet(TypedDict[str, RecordType]):
87
- """RecordSet stores groups of parameters, metrics and configs.
88
-
89
- A :class:`RecordSet` is the unified mechanism by which parameters,
90
- metrics and configs can be either stored as part of a :class:`Context`
91
- in your apps or communicated as part of a :class:`Message` between
92
- your apps.
93
-
94
- Parameters
95
- ----------
96
- parameters_records : Optional[Dict[str, ParametersRecord]]
97
- A dictionary of :code:`ParametersRecords` that can be used to record
98
- and communicate model parameters and high-dimensional arrays.
99
- metrics_records : Optional[Dict[str, MetricsRecord]]
100
- A dictionary of :code:`MetricsRecord` that can be used to record
101
- and communicate scalar-valued metrics that are the result of performing
102
- and action, for example, by a :code:`ClientApp`.
103
- configs_records : Optional[Dict[str, ConfigsRecord]]
104
- A dictionary of :code:`ConfigsRecord` that can be used to record
105
- and communicate configuration values to an entity (e.g. to a
106
- :code:`ClientApp`)
107
- for it to adjust how an action is performed.
108
-
109
- Examples
110
- --------
111
- A :code:`RecordSet` can hold three types of records, each designed
112
- with an specific purpose. What is common to all of them is that they
113
- are Python dictionaries designed to ensure that each key-value pair
114
- adheres to specified data types.
115
-
116
- Let's see an example.
117
-
118
- >>> from flwr.common import RecordSet
119
- >>> from flwr.common import ConfigsRecord, MetricsRecord, ParametersRecord
120
- >>>
121
- >>> # Let's begin with an empty record
122
- >>> my_recordset = RecordSet()
123
- >>>
124
- >>> # We can create a ConfigsRecord
125
- >>> c_record = ConfigsRecord({"lr": 0.1, "batch-size": 128})
126
- >>> # Adding it to the record_set would look like this
127
- >>> my_recordset["my_config"] = c_record
128
- >>>
129
- >>> # We can create a MetricsRecord following a similar process
130
- >>> m_record = MetricsRecord({"accuracy": 0.93, "losses": [0.23, 0.1]})
131
- >>> # Adding it to the record_set would look like this
132
- >>> my_recordset["my_metrics"] = m_record
133
-
134
- Adding a :code:`ParametersRecord` follows the same steps as above but first,
135
- the array needs to be serialized and represented as a :code:`flwr.common.Array`.
136
- If the array is a :code:`NumPy` array, you can use the built-in utility function
137
- `array_from_numpy <flwr.common.array_from_numpy.html>`_. It is often possible to
138
- convert an array first to :code:`NumPy` and then use the aforementioned function.
139
-
140
- >>> from flwr.common import array_from_numpy
141
- >>> # Creating a ParametersRecord would look like this
142
- >>> arr_np = np.random.randn(3, 3)
143
- >>>
144
- >>> # You can use the built-in tool to serialize the array
145
- >>> arr = array_from_numpy(arr_np)
146
- >>>
147
- >>> # Finally, create the record
148
- >>> p_record = ParametersRecord({"my_array": arr})
149
- >>>
150
- >>> # Adding it to the record_set would look like this
151
- >>> my_recordset["my_parameters"] = p_record
152
-
153
- For additional examples on how to construct each of the records types shown
154
- above, please refer to the documentation for :code:`ConfigsRecord`,
155
- :code:`MetricsRecord` and :code:`ParametersRecord`.
156
- """
157
-
158
- def __init__(self, records: dict[str, RecordType] | None = None) -> None:
159
- super().__init__(_check_key, _check_value)
160
- if records is not None:
161
- for key, record in records.items():
162
- self[key] = record
163
-
164
- @property
165
- def parameters_records(self) -> TypedDict[str, ParametersRecord]:
166
- """Dictionary holding only ParametersRecord instances."""
167
- synced_dict = _SyncedDict[ParametersRecord](self, ParametersRecord)
168
- for key, record in self.items():
169
- if isinstance(record, ParametersRecord):
170
- synced_dict[key] = record
171
- return synced_dict
172
-
173
- @property
174
- def metrics_records(self) -> TypedDict[str, MetricsRecord]:
175
- """Dictionary holding only MetricsRecord instances."""
176
- synced_dict = _SyncedDict[MetricsRecord](self, MetricsRecord)
177
- for key, record in self.items():
178
- if isinstance(record, MetricsRecord):
179
- synced_dict[key] = record
180
- return synced_dict
181
-
182
- @property
183
- def configs_records(self) -> TypedDict[str, ConfigsRecord]:
184
- """Dictionary holding only ConfigsRecord instances."""
185
- synced_dict = _SyncedDict[ConfigsRecord](self, ConfigsRecord)
186
- for key, record in self.items():
187
- if isinstance(record, ConfigsRecord):
188
- synced_dict[key] = record
189
- return synced_dict
190
-
191
- def __repr__(self) -> str:
192
- """Return a string representation of this instance."""
193
- flds = ("parameters_records", "metrics_records", "configs_records")
194
- fld_views = [f"{fld}={dict(getattr(self, fld))!r}" for fld in flds]
195
- view = indent(",\n".join(fld_views), " ")
196
- return f"{self.__class__.__qualname__}(\n{view}\n)"
197
-
198
- def __setitem__(self, key: str, value: RecordType) -> None:
199
- """Set the given key to the given value after type checking."""
200
- original_value = self.get(key, None)
201
- super().__setitem__(key, value)
202
- if original_value is not None and not isinstance(value, type(original_value)):
203
- log(
204
- WARN,
205
- "Key '%s' was overwritten: record of type `%s` replaced with type `%s`",
206
- key,
207
- type(original_value).__name__,
208
- type(value).__name__,
209
- )