flwr-nightly 1.9.0.dev20240426__py3-none-any.whl → 1.9.0.dev20240430__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.

Potentially problematic release.


This version of flwr-nightly might be problematic. Click here for more details.

@@ -0,0 +1,174 @@
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
+ """Flower server interceptor."""
16
+
17
+
18
+ import base64
19
+ from logging import INFO
20
+ from typing import Any, Callable, Sequence, Set, Tuple, Union
21
+
22
+ import grpc
23
+ from cryptography.hazmat.primitives.asymmetric import ec
24
+
25
+ from flwr.common.logger import log
26
+ from flwr.common.secure_aggregation.crypto.symmetric_encryption import (
27
+ bytes_to_public_key,
28
+ generate_shared_key,
29
+ public_key_to_bytes,
30
+ verify_hmac,
31
+ )
32
+ from flwr.proto.fleet_pb2 import ( # pylint: disable=E0611
33
+ CreateNodeRequest,
34
+ CreateNodeResponse,
35
+ DeleteNodeRequest,
36
+ DeleteNodeResponse,
37
+ GetRunRequest,
38
+ GetRunResponse,
39
+ PingRequest,
40
+ PingResponse,
41
+ PullTaskInsRequest,
42
+ PullTaskInsResponse,
43
+ PushTaskResRequest,
44
+ PushTaskResResponse,
45
+ )
46
+
47
+ _PUBLIC_KEY_HEADER = "public-key"
48
+ _AUTH_TOKEN_HEADER = "auth-token"
49
+
50
+ Request = Union[
51
+ CreateNodeRequest,
52
+ DeleteNodeRequest,
53
+ PullTaskInsRequest,
54
+ PushTaskResRequest,
55
+ GetRunRequest,
56
+ PingRequest,
57
+ ]
58
+
59
+ Response = Union[
60
+ CreateNodeResponse,
61
+ DeleteNodeResponse,
62
+ PullTaskInsResponse,
63
+ PushTaskResResponse,
64
+ GetRunResponse,
65
+ PingResponse,
66
+ ]
67
+
68
+
69
+ def _get_value_from_tuples(
70
+ key_string: str, tuples: Sequence[Tuple[str, Union[str, bytes]]]
71
+ ) -> bytes:
72
+ value = next((value for key, value in tuples if key == key_string), "")
73
+ if isinstance(value, str):
74
+ return value.encode()
75
+
76
+ return value
77
+
78
+
79
+ class AuthenticateServerInterceptor(grpc.ServerInterceptor): # type: ignore
80
+ """Server interceptor for client authentication."""
81
+
82
+ def __init__(
83
+ self,
84
+ client_public_keys: Set[bytes],
85
+ private_key: ec.EllipticCurvePrivateKey,
86
+ public_key: ec.EllipticCurvePublicKey,
87
+ ):
88
+ self.server_private_key = private_key
89
+ self.client_public_keys = client_public_keys
90
+ self.encoded_server_public_key = base64.urlsafe_b64encode(
91
+ public_key_to_bytes(public_key)
92
+ )
93
+ log(
94
+ INFO,
95
+ "Client authentication enabled with %d known public keys",
96
+ len(client_public_keys),
97
+ )
98
+
99
+ def intercept_service(
100
+ self,
101
+ continuation: Callable[[Any], Any],
102
+ handler_call_details: grpc.HandlerCallDetails,
103
+ ) -> grpc.RpcMethodHandler:
104
+ """Flower server interceptor authentication logic.
105
+
106
+ Intercept all unary calls from clients and authenticate clients by validating
107
+ auth metadata sent by the client. Continue RPC call if client is authenticated,
108
+ else, terminate RPC call by setting context to abort.
109
+ """
110
+ # One of the method handlers in
111
+ # `flwr.server.superlink.fleet.grpc_rere.fleet_server.FleetServicer`
112
+ method_handler: grpc.RpcMethodHandler = continuation(handler_call_details)
113
+ return self._generic_auth_unary_method_handler(method_handler)
114
+
115
+ def _generic_auth_unary_method_handler(
116
+ self, method_handler: grpc.RpcMethodHandler
117
+ ) -> grpc.RpcMethodHandler:
118
+ def _generic_method_handler(
119
+ request: Request,
120
+ context: grpc.ServicerContext,
121
+ ) -> Response:
122
+ client_public_key_bytes = base64.urlsafe_b64decode(
123
+ _get_value_from_tuples(
124
+ _PUBLIC_KEY_HEADER, context.invocation_metadata()
125
+ )
126
+ )
127
+ is_public_key_known = client_public_key_bytes in self.client_public_keys
128
+ if not is_public_key_known:
129
+ context.abort(grpc.StatusCode.UNAUTHENTICATED, "Access denied")
130
+
131
+ if isinstance(request, CreateNodeRequest):
132
+ context.send_initial_metadata(
133
+ (
134
+ (
135
+ _PUBLIC_KEY_HEADER,
136
+ self.encoded_server_public_key,
137
+ ),
138
+ )
139
+ )
140
+ elif isinstance(
141
+ request,
142
+ (
143
+ DeleteNodeRequest,
144
+ PullTaskInsRequest,
145
+ PushTaskResRequest,
146
+ GetRunRequest,
147
+ PingRequest,
148
+ ),
149
+ ):
150
+ hmac_value = base64.urlsafe_b64decode(
151
+ _get_value_from_tuples(
152
+ _AUTH_TOKEN_HEADER, context.invocation_metadata()
153
+ )
154
+ )
155
+ client_public_key = bytes_to_public_key(client_public_key_bytes)
156
+ shared_secret = generate_shared_key(
157
+ self.server_private_key,
158
+ client_public_key,
159
+ )
160
+ verify = verify_hmac(
161
+ shared_secret, request.SerializeToString(True), hmac_value
162
+ )
163
+ if not verify:
164
+ context.abort(grpc.StatusCode.UNAUTHENTICATED, "Access denied")
165
+ else:
166
+ context.abort(grpc.StatusCode.UNAUTHENTICATED, "Access denied")
167
+
168
+ return method_handler.unary_unary(request, context) # type: ignore
169
+
170
+ return grpc.unary_unary_rpc_method_handler(
171
+ _generic_method_handler,
172
+ request_deserializer=method_handler.request_deserializer,
173
+ response_serializer=method_handler.response_serializer,
174
+ )
flwr/simulation/app.py CHANGED
@@ -15,6 +15,8 @@
15
15
  """Flower simulation app."""
16
16
 
17
17
 
18
+ import asyncio
19
+ import logging
18
20
  import sys
19
21
  import threading
20
22
  import traceback
@@ -27,7 +29,7 @@ from ray.util.scheduling_strategies import NodeAffinitySchedulingStrategy
27
29
 
28
30
  from flwr.client import ClientFn
29
31
  from flwr.common import EventType, event
30
- from flwr.common.logger import log
32
+ from flwr.common.logger import log, set_logger_propagation
31
33
  from flwr.server.client_manager import ClientManager
32
34
  from flwr.server.history import History
33
35
  from flwr.server.server import Server, init_defaults, run_fl
@@ -156,6 +158,7 @@ def start_simulation(
156
158
  is an advanced feature. For all details, please refer to the Ray documentation:
157
159
  https://docs.ray.io/en/latest/ray-core/scheduling/index.html
158
160
 
161
+
159
162
  Returns
160
163
  -------
161
164
  hist : flwr.server.history.History
@@ -167,6 +170,18 @@ def start_simulation(
167
170
  {"num_clients": len(clients_ids) if clients_ids is not None else num_clients},
168
171
  )
169
172
 
173
+ # Set logger propagation
174
+ loop: Optional[asyncio.AbstractEventLoop] = None
175
+ try:
176
+ loop = asyncio.get_running_loop()
177
+ except RuntimeError:
178
+ loop = None
179
+ finally:
180
+ if loop and loop.is_running():
181
+ # Set logger propagation to False to prevent duplicated log output in Colab.
182
+ logger = logging.getLogger("flwr")
183
+ _ = set_logger_propagation(logger, False)
184
+
170
185
  # Initialize server and server config
171
186
  initialized_server, initialized_config = init_defaults(
172
187
  server=server,
@@ -28,6 +28,7 @@ import grpc
28
28
 
29
29
  from flwr.client import ClientApp
30
30
  from flwr.common import EventType, event, log
31
+ from flwr.common.logger import set_logger_propagation
31
32
  from flwr.common.typing import ConfigsRecordValues
32
33
  from flwr.server.driver import Driver, GrpcDriver
33
34
  from flwr.server.run_serverapp import run
@@ -364,6 +365,8 @@ def _run_simulation(
364
365
 
365
366
  finally:
366
367
  if run_in_thread:
368
+ # Set logger propagation to False to prevent duplicated log output in Colab.
369
+ logger = set_logger_propagation(logger, False)
367
370
  log(DEBUG, "Starting Simulation Engine on a new thread.")
368
371
  simulation_engine_th = threading.Thread(target=_main_loop, args=args)
369
372
  simulation_engine_th.start()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: flwr-nightly
3
- Version: 1.9.0.dev20240426
3
+ Version: 1.9.0.dev20240430
4
4
  Summary: Flower: A Friendly Federated Learning Framework
5
5
  Home-page: https://flower.ai
6
6
  License: Apache-2.0
@@ -27,15 +27,15 @@ flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl,sha256=BJvyU78wnym8R7kh
27
27
  flwr/cli/run/__init__.py,sha256=oCd6HmQDx-sqver1gecgx-uMA38BLTSiiKpl7RGNceg,789
28
28
  flwr/cli/run/run.py,sha256=jr_J7Cbcyuj1MXIbuwU86htHdFI7XogsBrdGl7P4aYY,2334
29
29
  flwr/cli/utils.py,sha256=px-M-IlBLu6Ez-Sc9tWhsJRjWurRaZTmxB9ASz8wurk,4119
30
- flwr/client/__init__.py,sha256=8LuIrd2GGWJXG2CFWihywicJtntIvCoPLssIUnHqZaA,1262
31
- flwr/client/app.py,sha256=zs5yeFavIIX-407b25xLapVruprohKSB0Ckk0CjW1Vw,24670
30
+ flwr/client/__init__.py,sha256=CivBxRFjK6gXHN5kUUf9UaZQHa_NHlEM867WWB-H0D8,1268
31
+ flwr/client/app.py,sha256=rzfaHiXxrtjwyhHrHb3epRD6NNw07YzL5DoZO6eW7RA,22313
32
32
  flwr/client/client.py,sha256=Vp9UkOkoHdNfn6iMYZsj_5m_GICiFfUlKEVaLad-YhM,8183
33
33
  flwr/client/client_app.py,sha256=-Cs0084tLQUoBCeYZdG2KgU7cjp95_ZJ4MfjoaN4Fzk,8636
34
34
  flwr/client/dpfedavg_numpy_client.py,sha256=9Tnig4iml2J88HBKNahegjXjbfvIQyBtaIQaqjbeqsA,7435
35
35
  flwr/client/grpc_client/__init__.py,sha256=LsnbqXiJhgQcB0XzAlUQgPx011Uf7Y7yabIC1HxivJ8,735
36
36
  flwr/client/grpc_client/connection.py,sha256=KWbBwuvn1-2wjrAKteydGCZC_7A2zmEjk3DycQWafrA,8993
37
37
  flwr/client/grpc_rere_client/__init__.py,sha256=avn6W_vHEM_yZEB1S7hCZgnTbXb6ZujqRP_vAzyXu-0,752
38
- flwr/client/grpc_rere_client/client_interceptor.py,sha256=cZZHd_lVlVuyPrhXf3mB4_Zpmhpmrv6-18E9XJisImE,4761
38
+ flwr/client/grpc_rere_client/client_interceptor.py,sha256=rDBXRVo-d-rflxJ6Kw3eDfBmvChdUHkzRw5eP-bpe6Y,4903
39
39
  flwr/client/grpc_rere_client/connection.py,sha256=gSSJJ9pSe5SgUb1Ey-xcrVK6xArUkwq0yGdav0h2kww,9597
40
40
  flwr/client/heartbeat.py,sha256=cx37mJBH8LyoIN4Lks85wtqT1mnU5GulQnr4pGCvAq0,2404
41
41
  flwr/client/message_handler/__init__.py,sha256=abHvBRJJiiaAMNgeILQbMOa6h8WqMK2BcnvxwQZFpic,719
@@ -54,8 +54,8 @@ flwr/client/node_state_tests.py,sha256=gPwz0zf2iuDSa11jedkur_u3Xm7lokIDG5ALD2MCv
54
54
  flwr/client/numpy_client.py,sha256=u76GWAdHmJM88Agm2EgLQSvO8Jnk225mJTk-_TmPjFE,10283
55
55
  flwr/client/rest_client/__init__.py,sha256=ThwOnkMdzxo_UuyTI47Q7y9oSpuTgNT2OuFvJCfuDiw,735
56
56
  flwr/client/rest_client/connection.py,sha256=MspqM5RjrQe09_2BUEEVGstA5x9Qz_RWdXXraOic3i8,11520
57
- flwr/client/supernode/__init__.py,sha256=D5swXxemuRbA2rB_T9B8LwJW-_PucXwmlFQQerwIUv0,793
58
- flwr/client/supernode/app.py,sha256=gauvN8elkIy0vuT0GxT7MmkuBRY74ckZfpxejE7dduM,3861
57
+ flwr/client/supernode/__init__.py,sha256=SUhWOzcgXRNXk1V9UgB5-FaWukqqrOEajVUHEcPkwyQ,865
58
+ flwr/client/supernode/app.py,sha256=6OWaD_4ZfguN6sukDfhbZzCgDmsSqHPlAmtcyU6TfJQ,9052
59
59
  flwr/client/typing.py,sha256=c9EvjlEjasxn1Wqx6bGl6Xg6vM1gMFfmXht-E2i5J-k,1006
60
60
  flwr/common/__init__.py,sha256=dHOptgKxna78CEQLD5Yu0QIsoSgpIIw5AhIUZCHDWAU,3721
61
61
  flwr/common/address.py,sha256=iTAN9jtmIGMrWFnx9XZQl45ZEtQJVZZLYPRBSNVARGI,1882
@@ -67,8 +67,8 @@ flwr/common/differential_privacy_constants.py,sha256=c7b7tqgvT7yMK0XN9ndiTBs4mQf
67
67
  flwr/common/dp.py,sha256=Hc3lLHihjexbJaD_ft31gdv9XRcwOTgDBwJzICuok3A,2004
68
68
  flwr/common/exit_handlers.py,sha256=2Nt0wLhc17KQQsLPFSRAjjhUiEFfJK6tNozdGiIY4Fs,2812
69
69
  flwr/common/grpc.py,sha256=Yx_YFK24cU4U81RpXrdVwEVY_jTy4RE19cHtBxE2XOE,2460
70
- flwr/common/logger.py,sha256=3hfKun9YISWj4i_QhxgZdnaHJc4x-QvFJQJTKHZ2KHs,6096
71
- flwr/common/message.py,sha256=NvxiWT9YI8GmIt2r3EPVPFFAFQo3xhP09mvnAxjHivQ,12385
70
+ flwr/common/logger.py,sha256=s1ZTh6nCeGZh0MxbCG8zHYZAeQ9JNDpw8k6qtxSCCzM,6920
71
+ flwr/common/message.py,sha256=78SN-HZpqbsnap5JFbdnmqR1dL0juK1zDRiixg3Jbl4,12686
72
72
  flwr/common/object_ref.py,sha256=ELoUCAFO-vbjJC41CGpa-WBG2SLYe3ErW-d9YCG3zqA,4961
73
73
  flwr/common/parameter.py,sha256=-bFAUayToYDF50FZGrBC1hQYJCQDtB2bbr3ZuVLMtdE,2095
74
74
  flwr/common/pyproject.py,sha256=EI_ovbCHGmhYrdPx0RSDi5EkFZFof-8m1PA54c0ZTjc,1385
@@ -77,14 +77,14 @@ flwr/common/record/configsrecord.py,sha256=VKeFEYa6cneyStqQlUOaKj12by5ZI_NXYR25L
77
77
  flwr/common/record/conversion_utils.py,sha256=n3I3SI2P6hUjyxbWNc0QAch-SEhfMK6Hm-UUaplAlUc,1393
78
78
  flwr/common/record/metricsrecord.py,sha256=Yv99oRa3LzFgSfwl903S8sB8rAgr3Sv6i6ovW7pdHsA,3923
79
79
  flwr/common/record/parametersrecord.py,sha256=WSqtRrYvI-mRzkEwv5s-EG-yE5uizJ8zy9aczwRG-1E,4849
80
- flwr/common/record/recordset.py,sha256=o3cXGGEFYRqzO8AzYmFxf5cb4CZIkaw-_lSk4kfTg0Q,4553
80
+ flwr/common/record/recordset.py,sha256=ZIDX_ZMpSRwFyD9PZQBDSM_UhRzzafgna8hDJj-egZ4,4533
81
81
  flwr/common/record/typeddict.py,sha256=2NW8JF27p1uNWaqDbJ7bMkItA5x4ygYT8aHrf8NaqnE,3879
82
82
  flwr/common/recordset_compat.py,sha256=BjxeuvlCaP94yIiKOyFFTRBUH_lprFWSLo8U8q3BDbs,13798
83
83
  flwr/common/retry_invoker.py,sha256=dQY5fPIKhy9OiFswZhLxA9fB455u-DYCvDVcFJmrPDk,11707
84
84
  flwr/common/secure_aggregation/__init__.py,sha256=29nHIUO2L8-KhNHQ2KmIgRo_4CPkq4LgLCUN0on5FgI,731
85
85
  flwr/common/secure_aggregation/crypto/__init__.py,sha256=dz7pVx2aPrHxr_AwgO5mIiTzu4PcvUxRq9NLBbFcsf8,738
86
86
  flwr/common/secure_aggregation/crypto/shamir.py,sha256=yY35ZgHlB4YyGW_buG-1X-0M-ejXuQzISgYLgC_Z9TY,2792
87
- flwr/common/secure_aggregation/crypto/symmetric_encryption.py,sha256=BP2qzZLz1FAdJt-E_7D--4yfyXsmfNqtvQG1XJfS4J0,4173
87
+ flwr/common/secure_aggregation/crypto/symmetric_encryption.py,sha256=zlACMLahJEIqhcss0-1xz_iCXUGTlL2G-i9hi8spu-8,4707
88
88
  flwr/common/secure_aggregation/ndarrays_arithmetic.py,sha256=66mNQCz64r7qzvXwFrXP6zz7YMi8EkTOABN7KulkKc4,3026
89
89
  flwr/common/secure_aggregation/quantization.py,sha256=appui7GGrkRPsupF59TkapeV4Na_CyPi73JtJ1pimdI,2310
90
90
  flwr/common/secure_aggregation/secaggplus_constants.py,sha256=Fh7-n6pgL4TUnHpNYXo8iW-n5cOGQgQa-c7RcU80tqQ,2183
@@ -124,7 +124,7 @@ flwr/proto/transport_pb2_grpc.py,sha256=vLN3EHtx2aEEMCO4f1Upu-l27BPzd3-5pV-u8wPc
124
124
  flwr/proto/transport_pb2_grpc.pyi,sha256=AGXf8RiIiW2J5IKMlm_3qT3AzcDa4F3P5IqUjve_esA,766
125
125
  flwr/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
126
126
  flwr/server/__init__.py,sha256=dNLbXIERZ6X9aA_Bit3R9AARwcaZZzEfDuFmEx8VVOE,1785
127
- flwr/server/app.py,sha256=FriloRrkDHTlB5G7EBn6sH4v5GhiYFf_ZhbdROgjKbY,24199
127
+ flwr/server/app.py,sha256=W5AzN9Gg3nQVnekXgCOzpN3dlpP3T-oh-N2ugdfuF7o,28282
128
128
  flwr/server/client_manager.py,sha256=T8UDSRJBVD3fyIDI7NTAA-NA7GPrMNNgH2OAF54RRxE,6127
129
129
  flwr/server/client_proxy.py,sha256=4G-oTwhb45sfWLx2uZdcXD98IZwdTS6F88xe3akCdUg,2399
130
130
  flwr/server/compat/__init__.py,sha256=VxnJtJyOjNFQXMNi9hIuzNlZM5n0Hj1p3aq_Pm2udw4,892
@@ -174,9 +174,10 @@ flwr/server/superlink/fleet/grpc_bidi/__init__.py,sha256=mgGJGjwT6VU7ovC1gdnnqtt
174
174
  flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py,sha256=57b3UL5-baGdLwgCtB0dCUTTSbmmfMAXcXV5bjPZNWQ,5993
175
175
  flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py,sha256=LSOmabFXAQxKycQOliplKmigbmVwdm-D4CI-hJ0Pav0,6458
176
176
  flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py,sha256=kuD7R1yB1Ite0sNfvjsrnZu83LWGk8fP-yihE1mjQm0,4887
177
- flwr/server/superlink/fleet/grpc_bidi/grpc_server.py,sha256=1QyBX5qcFPjMVlv7TrvnQkcET4muvg94Fy9hAQUBYnY,11818
177
+ flwr/server/superlink/fleet/grpc_bidi/grpc_server.py,sha256=_zWknjP7CRjwLDvofzmv1QoSI8Qq1cZC5nNw9nkSS7I,11932
178
178
  flwr/server/superlink/fleet/grpc_rere/__init__.py,sha256=bEJOMWbSlqkw-y5ZHtEXczhoSlAxErcRYffmTMQAV8M,758
179
179
  flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py,sha256=YGn1IPpuX-6NDgaG1UbyREbI9iAyKDimZuNeWxbG6s0,3387
180
+ flwr/server/superlink/fleet/grpc_rere/server_interceptor.py,sha256=3EuoVOb5pXrN52XlDGjEfJdXYmcfFunZeYYMlDlu7ug,5902
180
181
  flwr/server/superlink/fleet/message_handler/__init__.py,sha256=hEY0l61ojH8Iz30_K1btm1HJ6J49iZJSFUsVYqUTw3A,731
181
182
  flwr/server/superlink/fleet/message_handler/message_handler.py,sha256=lG3BkiONcikDVowK0An06V7p2SNkwGbWE5hfN2xlsZw,3622
182
183
  flwr/server/superlink/fleet/rest_rere/__init__.py,sha256=VKDvDq5H8koOUztpmQacVzGJXPLEEkL1Vmolxt3mvnY,735
@@ -203,14 +204,14 @@ flwr/server/workflow/secure_aggregation/__init__.py,sha256=3XlgDOjD_hcukTGl6Bc1B
203
204
  flwr/server/workflow/secure_aggregation/secagg_workflow.py,sha256=wpAkYPId0nfK6SgpUAtsCni4_MQLd-uqJ81tUKu3xlI,5838
204
205
  flwr/server/workflow/secure_aggregation/secaggplus_workflow.py,sha256=BRqhlnVe8CYNoUvb_KCfRXay02NTT6a-pCrMaOqAxGc,29038
205
206
  flwr/simulation/__init__.py,sha256=hpoKzdovrH0_Cf8HIcXxQxyUUb3BiSk-WUNLf5STHcc,1400
206
- flwr/simulation/app.py,sha256=WqJxdXTEuehwMW605p5NMmvBbKYx5tuqnV3Mp7jSWXM,13904
207
+ flwr/simulation/app.py,sha256=Fjq3krpzx9GUW1oYLHPn_Wq2tzjyqVBa9bxRbtuNVBQ,14380
207
208
  flwr/simulation/ray_transport/__init__.py,sha256=FsaAnzC4cw4DqoouBCix6496k29jACkfeIam55BvW9g,734
208
209
  flwr/simulation/ray_transport/ray_actor.py,sha256=_wv2eP7qxkCZ-6rMyYWnjLrGPBZRxjvTPjaVk8zIaQ4,19367
209
210
  flwr/simulation/ray_transport/ray_client_proxy.py,sha256=oDu4sEPIOu39vrNi-fqDAe10xtNUXMO49bM2RWfRcyw,6738
210
211
  flwr/simulation/ray_transport/utils.py,sha256=TYdtfg1P9VfTdLMOJlifInGpxWHYs9UfUqIv2wfkRLA,2392
211
- flwr/simulation/run_simulation.py,sha256=nxXNv3r8ODImd5o6f0sa_w5L0I08LD2Udw2OTXStRnQ,15694
212
- flwr_nightly-1.9.0.dev20240426.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
213
- flwr_nightly-1.9.0.dev20240426.dist-info/METADATA,sha256=oAUYiOKXu_WSYxMwROhr8cswgSP9wXY7Gl0hKkP7ekU,15260
214
- flwr_nightly-1.9.0.dev20240426.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
215
- flwr_nightly-1.9.0.dev20240426.dist-info/entry_points.txt,sha256=DBrrf685V2W9NbbchQwvuqBEpj5ik8tMZNoZg_W2bZY,363
216
- flwr_nightly-1.9.0.dev20240426.dist-info/RECORD,,
212
+ flwr/simulation/run_simulation.py,sha256=jSzL7vZJ6Cg76yAyuWt7X8WzwkZ26krpurRAIHXhrNk,15896
213
+ flwr_nightly-1.9.0.dev20240430.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
214
+ flwr_nightly-1.9.0.dev20240430.dist-info/METADATA,sha256=2a9zRPdWPIMNrE6-zIuOfaygal8wUPe-hDQfhLrRxjk,15260
215
+ flwr_nightly-1.9.0.dev20240430.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
216
+ flwr_nightly-1.9.0.dev20240430.dist-info/entry_points.txt,sha256=DBrrf685V2W9NbbchQwvuqBEpj5ik8tMZNoZg_W2bZY,363
217
+ flwr_nightly-1.9.0.dev20240430.dist-info/RECORD,,