flwr-nightly 1.26.0.dev20260203__py3-none-any.whl → 1.27.0.dev20260205__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.
@@ -31,7 +31,7 @@ from flwr.proto import fab_pb2 as flwr_dot_proto_dot_fab__pb2
31
31
  from flwr.proto import appio_pb2 as flwr_dot_proto_dot_appio__pb2
32
32
 
33
33
 
34
- DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1c\x66lwr/proto/serverappio.proto\x12\nflwr.proto\x1a\x1a\x66lwr/proto/heartbeat.proto\x1a\x14\x66lwr/proto/log.proto\x1a\x15\x66lwr/proto/node.proto\x1a\x18\x66lwr/proto/message.proto\x1a\x14\x66lwr/proto/run.proto\x1a\x14\x66lwr/proto/fab.proto\x1a\x16\x66lwr/proto/appio.proto\"!\n\x0fGetNodesRequest\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\"3\n\x10GetNodesResponse\x12\x1f\n\x05nodes\x18\x01 \x03(\x0b\x32\x10.flwr.proto.Node2\x94\n\n\x0bServerAppIo\x12_\n\x10ListAppsToLaunch\x12#.flwr.proto.ListAppsToLaunchRequest\x1a$.flwr.proto.ListAppsToLaunchResponse\"\x00\x12S\n\x0cRequestToken\x12\x1f.flwr.proto.RequestTokenRequest\x1a .flwr.proto.RequestTokenResponse\"\x00\x12\x41\n\x06GetRun\x12\x19.flwr.proto.GetRunRequest\x1a\x1a.flwr.proto.GetRunResponse\"\x00\x12_\n\x10SendAppHeartbeat\x12#.flwr.proto.SendAppHeartbeatRequest\x1a$.flwr.proto.SendAppHeartbeatResponse\"\x00\x12V\n\rPullAppInputs\x12 .flwr.proto.PullAppInputsRequest\x1a!.flwr.proto.PullAppInputsResponse\"\x00\x12Y\n\x0ePushAppOutputs\x12!.flwr.proto.PushAppOutputsRequest\x1a\".flwr.proto.PushAppOutputsResponse\"\x00\x12M\n\nPushObject\x12\x1d.flwr.proto.PushObjectRequest\x1a\x1e.flwr.proto.PushObjectResponse\"\x00\x12M\n\nPullObject\x12\x1d.flwr.proto.PullObjectRequest\x1a\x1e.flwr.proto.PullObjectResponse\"\x00\x12q\n\x16\x43onfirmMessageReceived\x12).flwr.proto.ConfirmMessageReceivedRequest\x1a*.flwr.proto.ConfirmMessageReceivedResponse\"\x00\x12\\\n\x0fUpdateRunStatus\x12\".flwr.proto.UpdateRunStatusRequest\x1a#.flwr.proto.UpdateRunStatusResponse\"\x00\x12G\n\x08PushLogs\x12\x1b.flwr.proto.PushLogsRequest\x1a\x1c.flwr.proto.PushLogsResponse\"\x00\x12Y\n\x0cPushMessages\x12\".flwr.proto.PushAppMessagesRequest\x1a#.flwr.proto.PushAppMessagesResponse\"\x00\x12Y\n\x0cPullMessages\x12\".flwr.proto.PullAppMessagesRequest\x1a#.flwr.proto.PullAppMessagesResponse\"\x00\x12G\n\x08GetNodes\x12\x1b.flwr.proto.GetNodesRequest\x1a\x1c.flwr.proto.GetNodesResponse\"\x00\x12\x41\n\x06GetFab\x12\x19.flwr.proto.GetFabRequest\x1a\x1a.flwr.proto.GetFabResponse\"\x00\x62\x06proto3')
34
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1c\x66lwr/proto/serverappio.proto\x12\nflwr.proto\x1a\x1a\x66lwr/proto/heartbeat.proto\x1a\x14\x66lwr/proto/log.proto\x1a\x15\x66lwr/proto/node.proto\x1a\x18\x66lwr/proto/message.proto\x1a\x14\x66lwr/proto/run.proto\x1a\x14\x66lwr/proto/fab.proto\x1a\x16\x66lwr/proto/appio.proto\"!\n\x0fGetNodesRequest\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\"3\n\x10GetNodesResponse\x12\x1f\n\x05nodes\x18\x01 \x03(\x0b\x32\x10.flwr.proto.Node2\xd1\t\n\x0bServerAppIo\x12_\n\x10ListAppsToLaunch\x12#.flwr.proto.ListAppsToLaunchRequest\x1a$.flwr.proto.ListAppsToLaunchResponse\"\x00\x12S\n\x0cRequestToken\x12\x1f.flwr.proto.RequestTokenRequest\x1a .flwr.proto.RequestTokenResponse\"\x00\x12\x41\n\x06GetRun\x12\x19.flwr.proto.GetRunRequest\x1a\x1a.flwr.proto.GetRunResponse\"\x00\x12_\n\x10SendAppHeartbeat\x12#.flwr.proto.SendAppHeartbeatRequest\x1a$.flwr.proto.SendAppHeartbeatResponse\"\x00\x12V\n\rPullAppInputs\x12 .flwr.proto.PullAppInputsRequest\x1a!.flwr.proto.PullAppInputsResponse\"\x00\x12Y\n\x0ePushAppOutputs\x12!.flwr.proto.PushAppOutputsRequest\x1a\".flwr.proto.PushAppOutputsResponse\"\x00\x12M\n\nPushObject\x12\x1d.flwr.proto.PushObjectRequest\x1a\x1e.flwr.proto.PushObjectResponse\"\x00\x12M\n\nPullObject\x12\x1d.flwr.proto.PullObjectRequest\x1a\x1e.flwr.proto.PullObjectResponse\"\x00\x12q\n\x16\x43onfirmMessageReceived\x12).flwr.proto.ConfirmMessageReceivedRequest\x1a*.flwr.proto.ConfirmMessageReceivedResponse\"\x00\x12\\\n\x0fUpdateRunStatus\x12\".flwr.proto.UpdateRunStatusRequest\x1a#.flwr.proto.UpdateRunStatusResponse\"\x00\x12G\n\x08PushLogs\x12\x1b.flwr.proto.PushLogsRequest\x1a\x1c.flwr.proto.PushLogsResponse\"\x00\x12Y\n\x0cPushMessages\x12\".flwr.proto.PushAppMessagesRequest\x1a#.flwr.proto.PushAppMessagesResponse\"\x00\x12Y\n\x0cPullMessages\x12\".flwr.proto.PullAppMessagesRequest\x1a#.flwr.proto.PullAppMessagesResponse\"\x00\x12G\n\x08GetNodes\x12\x1b.flwr.proto.GetNodesRequest\x1a\x1c.flwr.proto.GetNodesResponse\"\x00\x62\x06proto3')
35
35
 
36
36
  _globals = globals()
37
37
  _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
@@ -43,5 +43,5 @@ if not _descriptor._USE_C_DESCRIPTORS:
43
43
  _globals['_GETNODESRESPONSE']._serialized_start=246
44
44
  _globals['_GETNODESRESPONSE']._serialized_end=297
45
45
  _globals['_SERVERAPPIO']._serialized_start=300
46
- _globals['_SERVERAPPIO']._serialized_end=1600
46
+ _globals['_SERVERAPPIO']._serialized_end=1533
47
47
  # @@protoc_insertion_point(module_scope)
@@ -4,7 +4,6 @@ import grpc
4
4
  import warnings
5
5
 
6
6
  from flwr.proto import appio_pb2 as flwr_dot_proto_dot_appio__pb2
7
- from flwr.proto import fab_pb2 as flwr_dot_proto_dot_fab__pb2
8
7
  from flwr.proto import heartbeat_pb2 as flwr_dot_proto_dot_heartbeat__pb2
9
8
  from flwr.proto import log_pb2 as flwr_dot_proto_dot_log__pb2
10
9
  from flwr.proto import message_pb2 as flwr_dot_proto_dot_message__pb2
@@ -110,11 +109,6 @@ class ServerAppIoStub(object):
110
109
  request_serializer=flwr_dot_proto_dot_serverappio__pb2.GetNodesRequest.SerializeToString,
111
110
  response_deserializer=flwr_dot_proto_dot_serverappio__pb2.GetNodesResponse.FromString,
112
111
  _registered_method=True)
113
- self.GetFab = channel.unary_unary(
114
- '/flwr.proto.ServerAppIo/GetFab',
115
- request_serializer=flwr_dot_proto_dot_fab__pb2.GetFabRequest.SerializeToString,
116
- response_deserializer=flwr_dot_proto_dot_fab__pb2.GetFabResponse.FromString,
117
- _registered_method=True)
118
112
 
119
113
 
120
114
  class ServerAppIoServicer(object):
@@ -238,13 +232,6 @@ class ServerAppIoServicer(object):
238
232
  context.set_details('Method not implemented!')
239
233
  raise NotImplementedError('Method not implemented!')
240
234
 
241
- def GetFab(self, request, context):
242
- """Get FAB
243
- """
244
- context.set_code(grpc.StatusCode.UNIMPLEMENTED)
245
- context.set_details('Method not implemented!')
246
- raise NotImplementedError('Method not implemented!')
247
-
248
235
 
249
236
  def add_ServerAppIoServicer_to_server(servicer, server):
250
237
  rpc_method_handlers = {
@@ -318,11 +305,6 @@ def add_ServerAppIoServicer_to_server(servicer, server):
318
305
  request_deserializer=flwr_dot_proto_dot_serverappio__pb2.GetNodesRequest.FromString,
319
306
  response_serializer=flwr_dot_proto_dot_serverappio__pb2.GetNodesResponse.SerializeToString,
320
307
  ),
321
- 'GetFab': grpc.unary_unary_rpc_method_handler(
322
- servicer.GetFab,
323
- request_deserializer=flwr_dot_proto_dot_fab__pb2.GetFabRequest.FromString,
324
- response_serializer=flwr_dot_proto_dot_fab__pb2.GetFabResponse.SerializeToString,
325
- ),
326
308
  }
327
309
  generic_handler = grpc.method_handlers_generic_handler(
328
310
  'flwr.proto.ServerAppIo', rpc_method_handlers)
@@ -711,30 +693,3 @@ class ServerAppIo(object):
711
693
  timeout,
712
694
  metadata,
713
695
  _registered_method=True)
714
-
715
- @staticmethod
716
- def GetFab(request,
717
- target,
718
- options=(),
719
- channel_credentials=None,
720
- call_credentials=None,
721
- insecure=False,
722
- compression=None,
723
- wait_for_ready=None,
724
- timeout=None,
725
- metadata=None):
726
- return grpc.experimental.unary_unary(
727
- request,
728
- target,
729
- '/flwr.proto.ServerAppIo/GetFab',
730
- flwr_dot_proto_dot_fab__pb2.GetFabRequest.SerializeToString,
731
- flwr_dot_proto_dot_fab__pb2.GetFabResponse.FromString,
732
- options,
733
- channel_credentials,
734
- insecure,
735
- call_credentials,
736
- compression,
737
- wait_for_ready,
738
- timeout,
739
- metadata,
740
- _registered_method=True)
@@ -20,7 +20,6 @@ limitations under the License.
20
20
  import abc
21
21
  import collections.abc
22
22
  import flwr.proto.appio_pb2
23
- import flwr.proto.fab_pb2
24
23
  import flwr.proto.heartbeat_pb2
25
24
  import flwr.proto.log_pb2
26
25
  import flwr.proto.message_pb2
@@ -148,12 +147,6 @@ class ServerAppIoStub:
148
147
  ]
149
148
  """Return a set of nodes"""
150
149
 
151
- GetFab: grpc.UnaryUnaryMultiCallable[
152
- flwr.proto.fab_pb2.GetFabRequest,
153
- flwr.proto.fab_pb2.GetFabResponse,
154
- ]
155
- """Get FAB"""
156
-
157
150
  class ServerAppIoAsyncStub:
158
151
  ListAppsToLaunch: grpc.aio.UnaryUnaryMultiCallable[
159
152
  flwr.proto.appio_pb2.ListAppsToLaunchRequest,
@@ -264,12 +257,6 @@ class ServerAppIoAsyncStub:
264
257
  ]
265
258
  """Return a set of nodes"""
266
259
 
267
- GetFab: grpc.aio.UnaryUnaryMultiCallable[
268
- flwr.proto.fab_pb2.GetFabRequest,
269
- flwr.proto.fab_pb2.GetFabResponse,
270
- ]
271
- """Get FAB"""
272
-
273
260
  class ServerAppIoServicer(metaclass=abc.ABCMeta):
274
261
  @abc.abstractmethod
275
262
  def ListAppsToLaunch(
@@ -408,12 +395,4 @@ class ServerAppIoServicer(metaclass=abc.ABCMeta):
408
395
  ) -> typing.Union[flwr.proto.serverappio_pb2.GetNodesResponse, collections.abc.Awaitable[flwr.proto.serverappio_pb2.GetNodesResponse]]:
409
396
  """Return a set of nodes"""
410
397
 
411
- @abc.abstractmethod
412
- def GetFab(
413
- self,
414
- request: flwr.proto.fab_pb2.GetFabRequest,
415
- context: _ServicerContext,
416
- ) -> typing.Union[flwr.proto.fab_pb2.GetFabResponse, collections.abc.Awaitable[flwr.proto.fab_pb2.GetFabResponse]]:
417
- """Get FAB"""
418
-
419
398
  def add_ServerAppIoServicer_to_server(servicer: ServerAppIoServicer, server: typing.Union[grpc.Server, grpc.aio.Server]) -> None: ...
@@ -54,7 +54,6 @@ from flwr.proto.appio_pb2 import ( # pylint: disable=E0611
54
54
  RequestTokenRequest,
55
55
  RequestTokenResponse,
56
56
  )
57
- from flwr.proto.fab_pb2 import GetFabRequest, GetFabResponse # pylint: disable=E0611
58
57
  from flwr.proto.heartbeat_pb2 import ( # pylint: disable=E0611
59
58
  SendAppHeartbeatRequest,
60
59
  SendAppHeartbeatResponse,
@@ -85,7 +84,7 @@ from flwr.proto.serverappio_pb2 import ( # pylint: disable=E0611
85
84
  from flwr.server.superlink.linkstate import LinkState, LinkStateFactory
86
85
  from flwr.server.superlink.utils import abort_if
87
86
  from flwr.server.utils.validator import validate_message
88
- from flwr.supercore.ffs import Ffs, FfsFactory
87
+ from flwr.supercore.ffs import FfsFactory
89
88
  from flwr.supercore.object_store import NoObjectInStoreError, ObjectStoreFactory
90
89
 
91
90
 
@@ -312,19 +311,6 @@ class ServerAppIoServicer(serverappio_pb2_grpc.ServerAppIoServicer):
312
311
 
313
312
  return GetRunResponse(run=run_to_proto(run))
314
313
 
315
- def GetFab(
316
- self, request: GetFabRequest, context: grpc.ServicerContext
317
- ) -> GetFabResponse:
318
- """Get FAB from Ffs."""
319
- log(DEBUG, "ServerAppIoServicer.GetFab")
320
-
321
- ffs: Ffs = self.ffs_factory.ffs()
322
- if result := ffs.get(request.hash_str):
323
- fab = Fab(request.hash_str, result[0], result[1])
324
- return GetFabResponse(fab=fab_to_proto(fab))
325
-
326
- raise ValueError(f"Found no FAB with hash: {request.hash_str}")
327
-
328
314
  def PullAppInputs(
329
315
  self, request: PullAppInputsRequest, context: grpc.ServicerContext
330
316
  ) -> PullAppInputsResponse:
@@ -185,7 +185,13 @@ class Bulyan(FedAvg):
185
185
 
186
186
  # Convert to ArrayRecord
187
187
  arrays = ArrayRecord(
188
- dict(zip(array_keys, map(Array, aggregated_ndarrays), strict=True))
188
+ dict(
189
+ zip(
190
+ array_keys,
191
+ (Array(np.asarray(arr)) for arr in aggregated_ndarrays),
192
+ strict=True,
193
+ )
194
+ )
189
195
  )
190
196
 
191
197
  # Aggregate MetricRecords
@@ -22,6 +22,8 @@ from abc import ABC
22
22
  from collections.abc import Iterable
23
23
  from logging import INFO, WARNING
24
24
 
25
+ import numpy as np
26
+
25
27
  from flwr.common import Array, ArrayRecord, ConfigRecord, Message, MetricRecord, log
26
28
  from flwr.common.differential_privacy import (
27
29
  add_gaussian_noise_inplace,
@@ -216,7 +218,13 @@ class DifferentialPrivacyServerSideFixedClipping(DifferentialPrivacyFixedClippin
216
218
  )
217
219
  # Replace content while preserving keys
218
220
  reply.content[arr_name] = ArrayRecord(
219
- dict(zip(record.keys(), map(Array, reply_ndarrays), strict=True))
221
+ dict(
222
+ zip(
223
+ record.keys(),
224
+ (Array(np.asarray(v)) for v in reply_ndarrays),
225
+ strict=True,
226
+ )
227
+ )
220
228
  )
221
229
  log(
222
230
  INFO,
@@ -73,6 +73,7 @@ SYSTEM_MESSAGE_TYPE = "system"
73
73
 
74
74
  # SQLite PRAGMA settings for optimal performance and correctness
75
75
  SQLITE_PRAGMAS = (
76
+ ("busy_timeout", "5000"), # Retry lock acquisition for up to 5s before SQLITE_BUSY
76
77
  ("journal_mode", "WAL"), # Enable Write-Ahead Logging for better concurrency
77
78
  ("synchronous", "NORMAL"),
78
79
  ("foreign_keys", "ON"),
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: flwr-nightly
3
- Version: 1.26.0.dev20260203
3
+ Version: 1.27.0.dev20260205
4
4
  Summary: Flower: A Friendly Federated AI Framework
5
5
  License: Apache-2.0
6
6
  Keywords: Artificial Intelligence,Federated AI,Federated Analytics,Federated Evaluation,Federated Learning,Flower,Machine Learning
@@ -21,7 +21,6 @@ flwr/cli/config/ls.py,sha256=14JvV7llvhKozz19eIrrrWxR6WeXyko8apPFiq4P08E,2661
21
21
  flwr/cli/config_migration.py,sha256=Lc_y6zebVBgRr6JdiPJcyroUjuOG0k7UQEbqISUPC2E,10647
22
22
  flwr/cli/config_utils.py,sha256=LNmbPODWefsEtt4ov63BFtuTcK1Pb8Z-AHt1_haWWdA,7841
23
23
  flwr/cli/constant.py,sha256=MYLI7m9ntwWNkFgEEtKVo1JWX3umf_0EdqY8nJy-83Y,3525
24
- flwr/cli/example.py,sha256=SNTorkKPrx1rOryGREUyZu8TcOc1-vFv1zEddaysdY0,2216
25
24
  flwr/cli/federation/__init__.py,sha256=okxswL4fAjApI9gV_alU1lRkTUcQRbwlzvtUTLz61fE,793
26
25
  flwr/cli/federation/ls.py,sha256=k3FyGrH_xh_OdHqw5oj1S5RTKm8ZBqxeA4m6fEEoQx8,10278
27
26
  flwr/cli/flower_config.py,sha256=YQfuFGW52jf6EoAxWrXQYw6lmuH0j2qsZ0twHRLxx4k,15278
@@ -187,10 +186,10 @@ flwr/proto/run_pb2.py,sha256=0HsPXXNxKq0uefBY3gJOBvu9gQGZ-FhKaGhJiAwMKgU,4146
187
186
  flwr/proto/run_pb2.pyi,sha256=m6YeVUE2LnljsF_1FTpJWpxPEKw8RB_X1HuRFvijHG0,8689
188
187
  flwr/proto/run_pb2_grpc.py,sha256=l5u1Ww6JxVLVN784Z2OQbkQ-tAf5yYGh6QbNDc4F5II,895
189
188
  flwr/proto/run_pb2_grpc.pyi,sha256=fMwjLr-QCljWBa8uk0fvMCytnrF1-IzFLCbezqEmvdU,1071
190
- flwr/proto/serverappio_pb2.py,sha256=g4NlMFE4F3u0FXSmNJNGOe2nFRAaRRH8oEak6FSqeX8,3940
189
+ flwr/proto/serverappio_pb2.py,sha256=Df4l7tMVEt4gIR_Vg9ttIMau6rDwU5NFJPZeRqCN4C4,3847
191
190
  flwr/proto/serverappio_pb2.pyi,sha256=KpVM8B_O0M3RFJ-DtnNlQapJs4V-7pHcdEb2G3ECbhE,1998
192
- flwr/proto/serverappio_pb2_grpc.py,sha256=CNLkE1rVU5TaJHC7XoWYwONyPcDwCq5t6sezceCZbIg,30319
193
- flwr/proto/serverappio_pb2_grpc.pyi,sha256=-vpa_s5oGrT2aXE4zmIdDXXGxJ7ZSfcs8pIeOGvX7yE,15557
191
+ flwr/proto/serverappio_pb2_grpc.py,sha256=EVMV7JdjrTJhgg7NmcLdEGleBFZlYCNT_6ed1DZkuVo,28565
192
+ flwr/proto/serverappio_pb2_grpc.pyi,sha256=AHoGbatng1p72_epB9k3k5-gL8ENr8wtaUOm82ogvuM,14940
194
193
  flwr/proto/simulationio_pb2.py,sha256=b7B2VXAwKcfgKPulDmOBQs0RvEWKnWbGuTwF4GvMnn8,2681
195
194
  flwr/proto/simulationio_pb2.pyi,sha256=OsUGEduv1iJCew8C4cMz87Y5uQAhHDmxNyVfwA4kXd8,824
196
195
  flwr/proto/simulationio_pb2_grpc.py,sha256=JVJ_u2RR64amAnacdH6op6eOW7CT0RAzZbRBfqPLBQk,19201
@@ -276,7 +275,7 @@ flwr/server/superlink/linkstate/sql_linkstate.py,sha256=ziZvpEQBVV9GSxjHiS0fAyaY
276
275
  flwr/server/superlink/linkstate/utils.py,sha256=IA1mKKhGVBPoD61VXKFa8dZ_prnfuyWIuKAeeHPLmuE,16000
277
276
  flwr/server/superlink/serverappio/__init__.py,sha256=Fy4zJuoccZe5mZSEIpOmQvU6YeXFBa1M4eZuXXmJcn8,717
278
277
  flwr/server/superlink/serverappio/serverappio_grpc.py,sha256=2NFPynJMpYpT9C98Fr4n0QrTTjWBWbeUzlHcc6pg2kY,2279
279
- flwr/server/superlink/serverappio/serverappio_servicer.py,sha256=sEdA8lQzNEKMdpvvwzCsJJWHdlkPI1omCs6XyAWKES0,19586
278
+ flwr/server/superlink/serverappio/serverappio_servicer.py,sha256=Ki2DGKbyhIxPXslP6YDhS0wdeBnKZ7T9zxh7qmXwH1Y,19021
280
279
  flwr/server/superlink/simulation/__init__.py,sha256=Ry8DrNaZCMcQXvUc4FoCN2m3dvUQgWjasfp015o3Ec4,718
281
280
  flwr/server/superlink/simulation/simulationio_grpc.py,sha256=fHFW8SOR4iyfBxQeYOXWwqUStGsv0P4EAIVkBk69BN4,2174
282
281
  flwr/server/superlink/simulation/simulationio_servicer.py,sha256=QghTkyaNrSR41HMwQPtWAqhv6kWqdoj44tuto1K5x6A,9558
@@ -294,9 +293,9 @@ flwr/server/workflow/secure_aggregation/secaggplus_workflow.py,sha256=_-iDGztBOL
294
293
  flwr/serverapp/__init__.py,sha256=ZujKNXULwhWYQhFnxOOT5Wi9MRq2JCWFhAAj7ouiQ78,884
295
294
  flwr/serverapp/exception.py,sha256=5cuH-2AafvihzosWDdDjuMmHdDqZ1XxHvCqZXNBVklw,1334
296
295
  flwr/serverapp/strategy/__init__.py,sha256=dezK2TKSffjjBVXW18ATRxJLTuQ7I2M1dPuNi5y-_6c,1968
297
- flwr/serverapp/strategy/bulyan.py,sha256=disdrk0vCUPWlDvBlVMvHaral9v_hikxpQetVZV5a_Q,9292
296
+ flwr/serverapp/strategy/bulyan.py,sha256=il4FQfyto2lxAxWztrvHxtWgciT5N9en8MXKRZWEASI,9425
298
297
  flwr/serverapp/strategy/dp_adaptive_clipping.py,sha256=iddSwnw1qxNmtYtckvcfGsnVZ_bmyMMYd6biYmIZ_8s,13599
299
- flwr/serverapp/strategy/dp_fixed_clipping.py,sha256=1zJOxJhNFPIJRXneelCsTlx6La7BQAlquWuofa-oHtc,12696
298
+ flwr/serverapp/strategy/dp_fixed_clipping.py,sha256=6_6nxkWfsyJ7CxX8eGK0zjnOv1g2rSqYrAmDnx7VTNU,12893
300
299
  flwr/serverapp/strategy/fedadagrad.py,sha256=oewW2lxZ3YEo8lAI4KtjU-yp4r3bOFTybq4XjwlXYRg,6185
301
300
  flwr/serverapp/strategy/fedadam.py,sha256=jIUytggs5CUxOZ6ZUnt_ajDxHIa1dwrLbdX-3zQ1oHM,6980
302
301
  flwr/serverapp/strategy/fedavg.py,sha256=rzqQgGQTi-2OQtCZ4k3drmFmQF_GLVCRqATsAOP7uUw,12012
@@ -328,7 +327,7 @@ flwr/supercore/address.py,sha256=SgM_pazKsw1Avo5nms0WWgIZFUGS349O0gOP7N3bFW4,331
328
327
  flwr/supercore/app_utils.py,sha256=P558DOr5a4UPyOdRCxbDQueQF-L-kSc6qzouPPuqj0U,1773
329
328
  flwr/supercore/cli/__init__.py,sha256=EDl2aO-fuQfxSbL-T1W9RAfA2N0hpWHmqX_GSwblJbQ,845
330
329
  flwr/supercore/cli/flower_superexec.py,sha256=IQIGzxgaeLNMNzGXGemfYK3lp8God5bTkXpVkbeP_ig,6109
331
- flwr/supercore/constant.py,sha256=Hn87UDdFZBhVq2kbGziPoV2veozYZlJ3R_Unjmr7ekY,3008
330
+ flwr/supercore/constant.py,sha256=HSjxmgQsKC44EeaOZQ659DaZj8SDIEJ7XOGUKX122jU,3096
332
331
  flwr/supercore/corestate/__init__.py,sha256=Vau6-L_JG5QzNqtCTa9xCKGGljc09wY8avZmIjSJemg,774
333
332
  flwr/supercore/corestate/corestate.py,sha256=EZg4gPXqVOXwS7t0tlPfedajoWj5T80oeDBNxpV2y2I,2874
334
333
  flwr/supercore/corestate/in_memory_corestate.py,sha256=9qa6RuRZfCp6vs-ARYdiZjCL31VOAAxw0a_VkBXR5zY,5116
@@ -408,7 +407,7 @@ flwr/supernode/servicer/__init__.py,sha256=lucTzre5WPK7G1YLCfaqg3rbFWdNSb7ZTt-ca
408
407
  flwr/supernode/servicer/clientappio/__init__.py,sha256=7Oy62Y_oijqF7Dxi6tpcUQyOpLc_QpIRZ83NvwmB0Yg,813
409
408
  flwr/supernode/servicer/clientappio/clientappio_servicer.py,sha256=5TOp0SelGqiWzRHfhYpoKzUd7EuVTqt5_PXvnUy7_Ok,11615
410
409
  flwr/supernode/start_client_internal.py,sha256=3MkeDiWZr-SsvACuuAxJi8nYw6GYNKOO6q8b36E3R9k,26250
411
- flwr_nightly-1.26.0.dev20260203.dist-info/METADATA,sha256=HtDC4Sl-9R0f1NwHCNuXm4dulzTEou5G11nh6ximGBw,14447
412
- flwr_nightly-1.26.0.dev20260203.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
413
- flwr_nightly-1.26.0.dev20260203.dist-info/entry_points.txt,sha256=hxHD2ixb_vJFDOlZV-zB4Ao32_BQlL34ftsDh1GXv14,420
414
- flwr_nightly-1.26.0.dev20260203.dist-info/RECORD,,
410
+ flwr_nightly-1.27.0.dev20260205.dist-info/METADATA,sha256=KJB3b9bu03nkrNjA-gfN1CbNzS5YDT1UkOU8r5XPF20,14447
411
+ flwr_nightly-1.27.0.dev20260205.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
412
+ flwr_nightly-1.27.0.dev20260205.dist-info/entry_points.txt,sha256=hxHD2ixb_vJFDOlZV-zB4Ao32_BQlL34ftsDh1GXv14,420
413
+ flwr_nightly-1.27.0.dev20260205.dist-info/RECORD,,
flwr/cli/example.py DELETED
@@ -1,67 +0,0 @@
1
- # Copyright 2025 Flower Labs GmbH. All Rights Reserved.
2
- #
3
- # Licensed under the Apache License, Version 2.0 (the "License");
4
- # you may not use this file except in compliance with the License.
5
- # You may obtain a copy of the License at
6
- #
7
- # http://www.apache.org/licenses/LICENSE-2.0
8
- #
9
- # Unless required by applicable law or agreed to in writing, software
10
- # distributed under the License is distributed on an "AS IS" BASIS,
11
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
- # See the License for the specific language governing permissions and
13
- # limitations under the License.
14
- # ==============================================================================
15
- """Flower command line interface `example` command."""
16
-
17
-
18
- import json
19
- import os
20
- import subprocess
21
- import tempfile
22
- import urllib.request
23
-
24
- from .utils import prompt_options
25
-
26
-
27
- def example() -> None:
28
- """Clone a Flower example.
29
-
30
- All examples available in the Flower repository are available through this command.
31
- """
32
- # Load list of examples directly from GitHub
33
- url = "https://api.github.com/repos/adap/flower/git/trees/main"
34
- with urllib.request.urlopen(url) as res:
35
- data = json.load(res)
36
- examples_directory_url = [
37
- item["url"] for item in data["tree"] if item["path"] == "examples"
38
- ][0]
39
-
40
- with urllib.request.urlopen(examples_directory_url) as res:
41
- data = json.load(res)
42
- example_names = [
43
- item["path"]
44
- for item in data["tree"]
45
- if item["path"] not in [".gitignore", "doc"]
46
- ]
47
-
48
- example_name = prompt_options(
49
- "Please select example by typing in the number",
50
- example_names,
51
- )
52
-
53
- with tempfile.TemporaryDirectory() as tmpdirname:
54
- subprocess.check_output(
55
- [
56
- "git",
57
- "clone",
58
- "--depth=1",
59
- "https://github.com/adap/flower.git",
60
- tmpdirname,
61
- ]
62
- )
63
- examples_dir = os.path.join(tmpdirname, "examples", example_name)
64
- subprocess.check_output(["mv", examples_dir, "."])
65
-
66
- print()
67
- print(f"Example ready to use in {os.path.join(os.getcwd(), example_name)}")