flwr-nightly 1.15.0.dev20250107__py3-none-any.whl → 1.15.0.dev20250109__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.
- flwr/cli/cli_user_auth_interceptor.py +6 -2
- flwr/cli/login/login.py +11 -4
- flwr/cli/utils.py +4 -4
- flwr/client/grpc_rere_client/client_interceptor.py +6 -0
- flwr/client/grpc_rere_client/grpc_adapter.py +16 -0
- flwr/common/auth_plugin/auth_plugin.py +33 -23
- flwr/common/constant.py +2 -0
- flwr/common/typing.py +20 -0
- flwr/proto/exec_pb2.py +12 -24
- flwr/proto/exec_pb2.pyi +27 -54
- flwr/proto/fleet_pb2.py +40 -27
- flwr/proto/fleet_pb2.pyi +84 -0
- flwr/proto/fleet_pb2_grpc.py +66 -0
- flwr/proto/fleet_pb2_grpc.pyi +20 -0
- flwr/server/app.py +11 -13
- flwr/server/superlink/driver/serverappio_servicer.py +22 -8
- flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +16 -0
- flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +2 -1
- flwr/server/superlink/linkstate/in_memory_linkstate.py +26 -22
- flwr/server/superlink/linkstate/linkstate.py +10 -4
- flwr/server/superlink/linkstate/sqlite_linkstate.py +50 -29
- flwr/superexec/exec_servicer.py +23 -2
- {flwr_nightly-1.15.0.dev20250107.dist-info → flwr_nightly-1.15.0.dev20250109.dist-info}/METADATA +4 -4
- {flwr_nightly-1.15.0.dev20250107.dist-info → flwr_nightly-1.15.0.dev20250109.dist-info}/RECORD +27 -27
- {flwr_nightly-1.15.0.dev20250107.dist-info → flwr_nightly-1.15.0.dev20250109.dist-info}/LICENSE +0 -0
- {flwr_nightly-1.15.0.dev20250107.dist-info → flwr_nightly-1.15.0.dev20250109.dist-info}/WHEEL +0 -0
- {flwr_nightly-1.15.0.dev20250107.dist-info → flwr_nightly-1.15.0.dev20250109.dist-info}/entry_points.txt +0 -0
@@ -72,14 +72,14 @@ CREATE TABLE IF NOT EXISTS node(
|
|
72
72
|
|
73
73
|
SQL_CREATE_TABLE_CREDENTIAL = """
|
74
74
|
CREATE TABLE IF NOT EXISTS credential(
|
75
|
-
private_key
|
76
|
-
public_key
|
75
|
+
private_key BLOB PRIMARY KEY,
|
76
|
+
public_key BLOB
|
77
77
|
);
|
78
78
|
"""
|
79
79
|
|
80
80
|
SQL_CREATE_TABLE_PUBLIC_KEY = """
|
81
81
|
CREATE TABLE IF NOT EXISTS public_key(
|
82
|
-
public_key
|
82
|
+
public_key BLOB PRIMARY KEY
|
83
83
|
);
|
84
84
|
"""
|
85
85
|
|
@@ -635,9 +635,7 @@ class SqliteLinkState(LinkState): # pylint: disable=R0904
|
|
635
635
|
|
636
636
|
return {UUID(row["task_id"]) for row in rows}
|
637
637
|
|
638
|
-
def create_node(
|
639
|
-
self, ping_interval: float, public_key: Optional[bytes] = None
|
640
|
-
) -> int:
|
638
|
+
def create_node(self, ping_interval: float) -> int:
|
641
639
|
"""Create, store in the link state, and return `node_id`."""
|
642
640
|
# Sample a random uint64 as node_id
|
643
641
|
uint64_node_id = generate_rand_int_from_bytes(NODE_ID_NUM_BYTES)
|
@@ -645,13 +643,6 @@ class SqliteLinkState(LinkState): # pylint: disable=R0904
|
|
645
643
|
# Convert the uint64 value to sint64 for SQLite
|
646
644
|
sint64_node_id = convert_uint64_to_sint64(uint64_node_id)
|
647
645
|
|
648
|
-
query = "SELECT node_id FROM node WHERE public_key = :public_key;"
|
649
|
-
row = self.query(query, {"public_key": public_key})
|
650
|
-
|
651
|
-
if len(row) > 0:
|
652
|
-
log(ERROR, "Unexpected node registration failure.")
|
653
|
-
return 0
|
654
|
-
|
655
646
|
query = (
|
656
647
|
"INSERT INTO node "
|
657
648
|
"(node_id, online_until, ping_interval, public_key) "
|
@@ -665,7 +656,7 @@ class SqliteLinkState(LinkState): # pylint: disable=R0904
|
|
665
656
|
sint64_node_id,
|
666
657
|
time.time() + ping_interval,
|
667
658
|
ping_interval,
|
668
|
-
|
659
|
+
b"", # Initialize with an empty public key
|
669
660
|
),
|
670
661
|
)
|
671
662
|
except sqlite3.IntegrityError:
|
@@ -675,7 +666,7 @@ class SqliteLinkState(LinkState): # pylint: disable=R0904
|
|
675
666
|
# Note: we need to return the uint64 value of the node_id
|
676
667
|
return uint64_node_id
|
677
668
|
|
678
|
-
def delete_node(self, node_id: int
|
669
|
+
def delete_node(self, node_id: int) -> None:
|
679
670
|
"""Delete a node."""
|
680
671
|
# Convert the uint64 value to sint64 for SQLite
|
681
672
|
sint64_node_id = convert_uint64_to_sint64(node_id)
|
@@ -683,10 +674,6 @@ class SqliteLinkState(LinkState): # pylint: disable=R0904
|
|
683
674
|
query = "DELETE FROM node WHERE node_id = ?"
|
684
675
|
params = (sint64_node_id,)
|
685
676
|
|
686
|
-
if public_key is not None:
|
687
|
-
query += " AND public_key = ?"
|
688
|
-
params += (public_key,) # type: ignore
|
689
|
-
|
690
677
|
if self.conn is None:
|
691
678
|
raise AttributeError("LinkState is not initialized.")
|
692
679
|
|
@@ -694,7 +681,7 @@ class SqliteLinkState(LinkState): # pylint: disable=R0904
|
|
694
681
|
with self.conn:
|
695
682
|
rows = self.conn.execute(query, params)
|
696
683
|
if rows.rowcount < 1:
|
697
|
-
raise ValueError("
|
684
|
+
raise ValueError(f"Node {node_id} not found")
|
698
685
|
except KeyError as exc:
|
699
686
|
log(ERROR, {"query": query, "data": params, "exception": exc})
|
700
687
|
|
@@ -722,6 +709,41 @@ class SqliteLinkState(LinkState): # pylint: disable=R0904
|
|
722
709
|
result: set[int] = {convert_sint64_to_uint64(row["node_id"]) for row in rows}
|
723
710
|
return result
|
724
711
|
|
712
|
+
def set_node_public_key(self, node_id: int, public_key: bytes) -> None:
|
713
|
+
"""Set `public_key` for the specified `node_id`."""
|
714
|
+
# Convert the uint64 value to sint64 for SQLite
|
715
|
+
sint64_node_id = convert_uint64_to_sint64(node_id)
|
716
|
+
|
717
|
+
# Check if the node exists in the `node` table
|
718
|
+
query = "SELECT 1 FROM node WHERE node_id = ?"
|
719
|
+
if not self.query(query, (sint64_node_id,)):
|
720
|
+
raise ValueError(f"Node {node_id} not found")
|
721
|
+
|
722
|
+
# Check if the public key is already in use in the `node` table
|
723
|
+
query = "SELECT 1 FROM node WHERE public_key = ?"
|
724
|
+
if self.query(query, (public_key,)):
|
725
|
+
raise ValueError("Public key already in use")
|
726
|
+
|
727
|
+
# Update the `node` table to set the public key for the given node ID
|
728
|
+
query = "UPDATE node SET public_key = ? WHERE node_id = ?"
|
729
|
+
self.query(query, (public_key, sint64_node_id))
|
730
|
+
|
731
|
+
def get_node_public_key(self, node_id: int) -> Optional[bytes]:
|
732
|
+
"""Get `public_key` for the specified `node_id`."""
|
733
|
+
# Convert the uint64 value to sint64 for SQLite
|
734
|
+
sint64_node_id = convert_uint64_to_sint64(node_id)
|
735
|
+
|
736
|
+
# Query the public key for the given node_id
|
737
|
+
query = "SELECT public_key FROM node WHERE node_id = ?"
|
738
|
+
rows = self.query(query, (sint64_node_id,))
|
739
|
+
|
740
|
+
# If no result is found, return None
|
741
|
+
if not rows:
|
742
|
+
raise ValueError(f"Node {node_id} not found")
|
743
|
+
|
744
|
+
# Return the public key if it is not empty, otherwise return None
|
745
|
+
return rows[0]["public_key"] or None
|
746
|
+
|
725
747
|
def get_node_id(self, node_public_key: bytes) -> Optional[int]:
|
726
748
|
"""Retrieve stored `node_id` filtered by `node_public_keys`."""
|
727
749
|
query = "SELECT node_id FROM node WHERE public_key = :public_key;"
|
@@ -982,17 +1004,16 @@ class SqliteLinkState(LinkState): # pylint: disable=R0904
|
|
982
1004
|
"""Acknowledge a ping received from a node, serving as a heartbeat."""
|
983
1005
|
sint64_node_id = convert_uint64_to_sint64(node_id)
|
984
1006
|
|
985
|
-
#
|
986
|
-
query = "
|
987
|
-
|
988
|
-
self.query(
|
989
|
-
query, (time.time() + ping_interval, ping_interval, sint64_node_id)
|
990
|
-
)
|
991
|
-
return True
|
992
|
-
except sqlite3.IntegrityError:
|
993
|
-
log(ERROR, "`node_id` does not exist.")
|
1007
|
+
# Check if the node exists in the `node` table
|
1008
|
+
query = "SELECT 1 FROM node WHERE node_id = ?"
|
1009
|
+
if not self.query(query, (sint64_node_id,)):
|
994
1010
|
return False
|
995
1011
|
|
1012
|
+
# Update `online_until` and `ping_interval` for the given `node_id`
|
1013
|
+
query = "UPDATE node SET online_until = ?, ping_interval = ? WHERE node_id = ?"
|
1014
|
+
self.query(query, (time.time() + ping_interval, ping_interval, sint64_node_id))
|
1015
|
+
return True
|
1016
|
+
|
996
1017
|
def get_serverapp_context(self, run_id: int) -> Optional[Context]:
|
997
1018
|
"""Get the context for the specified `run_id`."""
|
998
1019
|
# Retrieve context if any
|
flwr/superexec/exec_servicer.py
CHANGED
@@ -181,8 +181,20 @@ class ExecServicer(exec_pb2_grpc.ExecServicer):
|
|
181
181
|
"ExecServicer initialized without user authentication",
|
182
182
|
)
|
183
183
|
raise grpc.RpcError() # This line is unreachable
|
184
|
+
|
185
|
+
# Get login details
|
186
|
+
details = self.auth_plugin.get_login_details()
|
187
|
+
|
188
|
+
# Return empty response if details is None
|
189
|
+
if details is None:
|
190
|
+
return GetLoginDetailsResponse()
|
191
|
+
|
184
192
|
return GetLoginDetailsResponse(
|
185
|
-
|
193
|
+
auth_type=details.auth_type,
|
194
|
+
device_code=details.device_code,
|
195
|
+
verification_uri_complete=details.verification_uri_complete,
|
196
|
+
expires_in=details.expires_in,
|
197
|
+
interval=details.interval,
|
186
198
|
)
|
187
199
|
|
188
200
|
def GetAuthTokens(
|
@@ -196,8 +208,17 @@ class ExecServicer(exec_pb2_grpc.ExecServicer):
|
|
196
208
|
"ExecServicer initialized without user authentication",
|
197
209
|
)
|
198
210
|
raise grpc.RpcError() # This line is unreachable
|
211
|
+
|
212
|
+
# Get auth tokens
|
213
|
+
credentials = self.auth_plugin.get_auth_tokens(request.device_code)
|
214
|
+
|
215
|
+
# Return empty response if credentials is None
|
216
|
+
if credentials is None:
|
217
|
+
return GetAuthTokensResponse()
|
218
|
+
|
199
219
|
return GetAuthTokensResponse(
|
200
|
-
|
220
|
+
access_token=credentials.access_token,
|
221
|
+
refresh_token=credentials.refresh_token,
|
201
222
|
)
|
202
223
|
|
203
224
|
|
{flwr_nightly-1.15.0.dev20250107.dist-info → flwr_nightly-1.15.0.dev20250109.dist-info}/METADATA
RENAMED
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: flwr-nightly
|
3
|
-
Version: 1.15.0.
|
3
|
+
Version: 1.15.0.dev20250109
|
4
4
|
Summary: Flower: A Friendly Federated AI Framework
|
5
5
|
Home-page: https://flower.ai
|
6
6
|
License: Apache-2.0
|
@@ -43,11 +43,11 @@ Requires-Dist: pyyaml (>=6.0.2,<7.0.0)
|
|
43
43
|
Requires-Dist: ray (==2.10.0) ; (python_version >= "3.9" and python_version < "3.12") and (extra == "simulation")
|
44
44
|
Requires-Dist: requests (>=2.31.0,<3.0.0)
|
45
45
|
Requires-Dist: rich (>=13.5.0,<14.0.0)
|
46
|
-
Requires-Dist: starlette (>=0.
|
46
|
+
Requires-Dist: starlette (>=0.45.2,<0.46.0) ; extra == "rest"
|
47
47
|
Requires-Dist: tomli (>=2.0.1,<3.0.0)
|
48
48
|
Requires-Dist: tomli-w (>=1.0.0,<2.0.0)
|
49
49
|
Requires-Dist: typer (>=0.12.5,<0.13.0)
|
50
|
-
Requires-Dist: uvicorn[standard] (>=0.
|
50
|
+
Requires-Dist: uvicorn[standard] (>=0.34.0,<0.35.0) ; extra == "rest"
|
51
51
|
Project-URL: Documentation, https://flower.ai
|
52
52
|
Project-URL: Repository, https://github.com/adap/flower
|
53
53
|
Description-Content-Type: text/markdown
|
@@ -88,7 +88,7 @@ design of Flower is based on a few guiding principles:
|
|
88
88
|
|
89
89
|
- **Framework-agnostic**: Different machine learning frameworks have different
|
90
90
|
strengths. Flower can be used with any machine learning framework, for
|
91
|
-
example, [PyTorch](https://pytorch.org), [TensorFlow](https://tensorflow.org), [Hugging Face Transformers](https://huggingface.co/), [PyTorch Lightning](https://pytorchlightning.ai/), [scikit-learn](https://scikit-learn.org/), [JAX](https://jax.readthedocs.io/), [TFLite](https://tensorflow.org/lite/), [MONAI](https://docs.monai.io/en/latest/index.html), [fastai](https://www.fast.ai/), [MLX](https://ml-explore.github.io/mlx/build/html/index.html), [XGBoost](https://xgboost.readthedocs.io/en/stable/), [Pandas](https://pandas.pydata.org/) for federated analytics, or even raw [NumPy](https://numpy.org/)
|
91
|
+
example, [PyTorch](https://pytorch.org), [TensorFlow](https://tensorflow.org), [Hugging Face Transformers](https://huggingface.co/), [PyTorch Lightning](https://pytorchlightning.ai/), [scikit-learn](https://scikit-learn.org/), [JAX](https://jax.readthedocs.io/), [TFLite](https://tensorflow.org/lite/), [MONAI](https://docs.monai.io/en/latest/index.html), [fastai](https://www.fast.ai/), [MLX](https://ml-explore.github.io/mlx/build/html/index.html), [XGBoost](https://xgboost.readthedocs.io/en/stable/), [LeRobot](https://github.com/huggingface/lerobot) for federated robots, [Pandas](https://pandas.pydata.org/) for federated analytics, or even raw [NumPy](https://numpy.org/)
|
92
92
|
for users who enjoy computing gradients by hand.
|
93
93
|
|
94
94
|
- **Understandable**: Flower is written with maintainability in mind. The
|
{flwr_nightly-1.15.0.dev20250107.dist-info → flwr_nightly-1.15.0.dev20250109.dist-info}/RECORD
RENAMED
@@ -2,13 +2,13 @@ flwr/__init__.py,sha256=VmBWedrCxqmt4QvUHBLqyVEH6p7zaFMD_oCHerXHSVw,937
|
|
2
2
|
flwr/cli/__init__.py,sha256=cZJVgozlkC6Ni2Hd_FAIrqefrkCGOV18fikToq-6iLw,720
|
3
3
|
flwr/cli/app.py,sha256=UeXrW5gxrUnFViDjAMIxGNZZKwu3a1oAj83v53IWIWM,1382
|
4
4
|
flwr/cli/build.py,sha256=4P70i_FnUs0P21aTwjTXtFQSAfY-C04hUDF-2npfJdo,6345
|
5
|
-
flwr/cli/cli_user_auth_interceptor.py,sha256=
|
5
|
+
flwr/cli/cli_user_auth_interceptor.py,sha256=aZepPA298s-HjGmkJGMvI_uZe72O5aLC3jri-ilG53o,3126
|
6
6
|
flwr/cli/config_utils.py,sha256=I4_EMv2f68mfrL_QuOYoAG--yDfKisE7tGiIg09G2YQ,12079
|
7
7
|
flwr/cli/example.py,sha256=uk5CoD0ZITgpY_ffsTbEKf8XOOCSUzByjHPcMSPqV18,2216
|
8
8
|
flwr/cli/install.py,sha256=0AD0qJD79SKgBnWOQlphcubfr4zHk8jTpFgwZbJBI_g,8180
|
9
9
|
flwr/cli/log.py,sha256=O7MBpsJp114PIZb-7Cru-KM6fqyneFQkqoQbQsqQmZU,6121
|
10
10
|
flwr/cli/login/__init__.py,sha256=6_9zOzbPOAH72K2wX3-9dXTAbS7Mjpa5sEn2lA6eHHI,800
|
11
|
-
flwr/cli/login/login.py,sha256=
|
11
|
+
flwr/cli/login/login.py,sha256=VaBPQBdLYmSfxXEJWVyu8U5dXztQgIv6rfTJkvz3zV8,3025
|
12
12
|
flwr/cli/ls.py,sha256=K_3Bt2RfETw4V7J4qgo8_Wx-Y_bWZqttuO879Ppxo5Y,11056
|
13
13
|
flwr/cli/new/__init__.py,sha256=pOQtPT9W4kCIttcKne5m-FtJbvTqdjTVJxzQ9AUYK8I,790
|
14
14
|
flwr/cli/new/new.py,sha256=scyyKt8mzkc3El1bypgkHjKwVQEc2-q4I50PxriPFdI,9922
|
@@ -67,7 +67,7 @@ flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl,sha256=r0SZnvoR5a5mEWKJ
|
|
67
67
|
flwr/cli/run/__init__.py,sha256=cCsKVB0SFzh2b3QmGba6BHckB85xlhjh3mh4pBpACtY,790
|
68
68
|
flwr/cli/run/run.py,sha256=BvpjYyUvDhVMvO5cG711ihtdeSbls9p8zVAuFGETLA8,7893
|
69
69
|
flwr/cli/stop.py,sha256=1T9RNRCH8dxjmBT38hFtKAWY9Gb7RMCMCML7kex9WzE,4613
|
70
|
-
flwr/cli/utils.py,sha256=
|
70
|
+
flwr/cli/utils.py,sha256=RXozds-T7HN8yH0mMj67q-0YktdNNm83N9Ptu_pdhsc,10604
|
71
71
|
flwr/client/__init__.py,sha256=DGDoO0AEAfz-0CUFmLdyUUweAS64-07AOnmDfWUefK4,1192
|
72
72
|
flwr/client/app.py,sha256=XJWu-kPswM52oLYXaOLKr0gj87KPNRI7M0Na9oBsDK4,34784
|
73
73
|
flwr/client/client.py,sha256=8o58nd9o6ZFcMIaVYPGcV4MSjBG4H0oFgWiv8ZEO3oA,7895
|
@@ -82,9 +82,9 @@ flwr/client/grpc_adapter_client/connection.py,sha256=nV-hPd5q5Eblg6PgUrGGYj74mbE
|
|
82
82
|
flwr/client/grpc_client/__init__.py,sha256=LsnbqXiJhgQcB0XzAlUQgPx011Uf7Y7yabIC1HxivJ8,735
|
83
83
|
flwr/client/grpc_client/connection.py,sha256=gMwB87mlmRBbvPOvUA1m3C-Ci6bjMEmTRI4bJpgbyic,9416
|
84
84
|
flwr/client/grpc_rere_client/__init__.py,sha256=MK-oSoV3kwUEQnIwl0GN4OpiHR7eLOrMA8ikunET130,752
|
85
|
-
flwr/client/grpc_rere_client/client_interceptor.py,sha256=
|
85
|
+
flwr/client/grpc_rere_client/client_interceptor.py,sha256=9BEZNOHxNJFxIuXc9KzBF0ZkXECtOm7RgnZ9yHVUxCQ,5554
|
86
86
|
flwr/client/grpc_rere_client/connection.py,sha256=NqKSoYIJblB4lElZ7EKIgDjLb6KYEcI-7CBrTbyiKfg,11475
|
87
|
-
flwr/client/grpc_rere_client/grpc_adapter.py,sha256=
|
87
|
+
flwr/client/grpc_rere_client/grpc_adapter.py,sha256=VrSqHosRcWv8xDLKEabuzyHpVnRhjAEJf_MUFQxhDh8,6155
|
88
88
|
flwr/client/heartbeat.py,sha256=cx37mJBH8LyoIN4Lks85wtqT1mnU5GulQnr4pGCvAq0,2404
|
89
89
|
flwr/client/message_handler/__init__.py,sha256=QxxQuBNpFPTHx3KiUNvQSlqMKlEnbRR1kFfc1KVje08,719
|
90
90
|
flwr/client/message_handler/message_handler.py,sha256=s7FEfYJp5QB259Pj1L94_9AC24Kh5JyKC2U-E6eNkkY,6492
|
@@ -112,9 +112,9 @@ flwr/common/__init__.py,sha256=TVaoFEJE158aui1TPZQiJCDZX4RNHRyI8I55VC80HhI,3901
|
|
112
112
|
flwr/common/address.py,sha256=9KNYE69WW_QVcyumsux3Qn1wmn4J7f13Y9nHASpvzbA,3018
|
113
113
|
flwr/common/args.py,sha256=bCvtG0hhh_hVjl9NoWsY_g7kLMIN3jCN7B883HvZ7hg,6223
|
114
114
|
flwr/common/auth_plugin/__init__.py,sha256=1Y8Oj3iB49IHDu9tvDih1J74Ygu7k85V9s2A4WORPyA,887
|
115
|
-
flwr/common/auth_plugin/auth_plugin.py,sha256=
|
115
|
+
flwr/common/auth_plugin/auth_plugin.py,sha256=p_3oDuKiHtMMLLCyEe_fuRi_g5GwRKb4HJCnBkVK74I,3840
|
116
116
|
flwr/common/config.py,sha256=vmPwtRu7JIoGCke03pJlsyrA6zTlN43flzQx-4AX1mE,8099
|
117
|
-
flwr/common/constant.py,sha256=
|
117
|
+
flwr/common/constant.py,sha256=0H9SBSnQ78ZK4KPIKCIxTQZps2jU_pea8KMX8Hw22bQ,6066
|
118
118
|
flwr/common/context.py,sha256=uJ-mnoC_8y_udEb3kAX-r8CPphNTWM72z1AlsvQEu54,2403
|
119
119
|
flwr/common/date.py,sha256=NHHpESce5wYqEwoDXf09gp9U9l_5Bmlh2BsOcwS-kDM,1554
|
120
120
|
flwr/common/differential_privacy.py,sha256=XwcJ3rWr8S8BZUocc76vLSJAXIf6OHnWkBV6-xlIRuw,6106
|
@@ -146,7 +146,7 @@ flwr/common/secure_aggregation/secaggplus_constants.py,sha256=9MF-oQh62uD7rt9VeN
|
|
146
146
|
flwr/common/secure_aggregation/secaggplus_utils.py,sha256=OgYd68YBRaHQYLc-YdExj9CSpwL58bVTaPrdHoAj2AE,3214
|
147
147
|
flwr/common/serde.py,sha256=K9ExsqcTPETESkt2HMaNtIQAIAfwmuwtJFlG-59I7Sw,31046
|
148
148
|
flwr/common/telemetry.py,sha256=APKVubU_zJNrE-M_rip6S6Fsu41DxY3tAjFWNOgTmC0,9086
|
149
|
-
flwr/common/typing.py,sha256=
|
149
|
+
flwr/common/typing.py,sha256=IMgs_7nDJWn8Eb7y16Hl4HC3imQV7_Hdla1IFs3B5u8,6382
|
150
150
|
flwr/common/version.py,sha256=aNSxLL49RKeLz8sPcZrsTEWtrAeQ0uxu6tjmfba4O60,1325
|
151
151
|
flwr/proto/__init__.py,sha256=hbY7JYakwZwCkYgCNlmHdc8rtvfoJbAZLalMdc--CGc,683
|
152
152
|
flwr/proto/clientappio_pb2.py,sha256=Y3PMv-JMaBGehpslgbvGY6l2u5vNpfCTFWu-fmAmBJ4,3703
|
@@ -157,18 +157,18 @@ flwr/proto/error_pb2.py,sha256=LarjKL90LbwkXKlhzNrDssgl4DXcvIPve8NVCXHpsKA,1084
|
|
157
157
|
flwr/proto/error_pb2.pyi,sha256=ZNH4HhJTU_KfMXlyCeg8FwU-fcUYxTqEmoJPtWtHikc,734
|
158
158
|
flwr/proto/error_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
|
159
159
|
flwr/proto/error_pb2_grpc.pyi,sha256=ff2TSiLVnG6IVQcTGzb2DIH3XRSoAvAo_RMcvbMFyc0,76
|
160
|
-
flwr/proto/exec_pb2.py,sha256=
|
161
|
-
flwr/proto/exec_pb2.pyi,sha256=
|
160
|
+
flwr/proto/exec_pb2.py,sha256=1a8nh4RyDpRLY2gC6vMSAEe6-ksj7hLonAr-pZAejqc,5664
|
161
|
+
flwr/proto/exec_pb2.pyi,sha256=2vbzq2OOYM5GI-Tug4eVM5J6xvNvSFtR8m3MsP-i-Q4,9477
|
162
162
|
flwr/proto/exec_pb2_grpc.py,sha256=-bdLqjsqQxK9R8LIiZaKlLKH2NmjR50EaGKTPPTwFhI,10445
|
163
163
|
flwr/proto/exec_pb2_grpc.pyi,sha256=M5k-FzeLWxal7zt28LJfzMWWRxmNknTC2BzHRRMa1sQ,2914
|
164
164
|
flwr/proto/fab_pb2.py,sha256=-gfW_ePYHx1vDGHfimwn91qEhmmY_gslaOHwqqZnVdU,1627
|
165
165
|
flwr/proto/fab_pb2.pyi,sha256=AMXpiDK0fo3nZWjxsC2E4otSaVjyQbU7iiWKrsSZavs,2395
|
166
166
|
flwr/proto/fab_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
|
167
167
|
flwr/proto/fab_pb2_grpc.pyi,sha256=ff2TSiLVnG6IVQcTGzb2DIH3XRSoAvAo_RMcvbMFyc0,76
|
168
|
-
flwr/proto/fleet_pb2.py,sha256=
|
169
|
-
flwr/proto/fleet_pb2.pyi,sha256=
|
170
|
-
flwr/proto/fleet_pb2_grpc.py,sha256=
|
171
|
-
flwr/proto/fleet_pb2_grpc.pyi,sha256=
|
168
|
+
flwr/proto/fleet_pb2.py,sha256=Uu_oFKPBTzkROKWQmFN59jFucGagtvMjHqkgz6PhlLM,6583
|
169
|
+
flwr/proto/fleet_pb2.pyi,sha256=XT8Y79QB9ZWljt30hGmytkxJbu6H_D7ltkYopJQFM4o,12004
|
170
|
+
flwr/proto/fleet_pb2_grpc.py,sha256=J1rR8nr3_LFzaBfocZdgFj8xIXUaJDOMCN-G2-Rs-hU,15510
|
171
|
+
flwr/proto/fleet_pb2_grpc.pyi,sha256=BsqtyvC2GSqB40efort63LG2wRIKTp4eI8aOr9rbU1Y,3928
|
172
172
|
flwr/proto/grpcadapter_pb2.py,sha256=bb8mW09XzNCpMdr1KuYQkefPFWR8lc8y1uL6Uk0TtsM,1843
|
173
173
|
flwr/proto/grpcadapter_pb2.pyi,sha256=AR77gDsF6f8zqSIQp3877DUd7S8lP95lFak5Ir_WPkw,1716
|
174
174
|
flwr/proto/grpcadapter_pb2_grpc.py,sha256=rRNuNES5nBugUZWfeA8oAy8dMHgzqU_PF1srTseo3b8,2634
|
@@ -211,7 +211,7 @@ flwr/proto/transport_pb2_grpc.py,sha256=vLN3EHtx2aEEMCO4f1Upu-l27BPzd3-5pV-u8wPc
|
|
211
211
|
flwr/proto/transport_pb2_grpc.pyi,sha256=AGXf8RiIiW2J5IKMlm_3qT3AzcDa4F3P5IqUjve_esA,766
|
212
212
|
flwr/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
213
213
|
flwr/server/__init__.py,sha256=cEg1oecBu4cKB69iJCqWEylC8b5XW47bl7rQiJsdTvM,1528
|
214
|
-
flwr/server/app.py,sha256=
|
214
|
+
flwr/server/app.py,sha256=xXiRsHXypzMW0EI1ewiiGE0dk6296I9d95ae1d0MKYU,30860
|
215
215
|
flwr/server/client_manager.py,sha256=7Ese0tgrH-i-ms363feYZJKwB8gWnXSmg_hYF2Bju4U,6227
|
216
216
|
flwr/server/client_proxy.py,sha256=4G-oTwhb45sfWLx2uZdcXD98IZwdTS6F88xe3akCdUg,2399
|
217
217
|
flwr/server/compat/__init__.py,sha256=VxnJtJyOjNFQXMNi9hIuzNlZM5n0Hj1p3aq_Pm2udw4,892
|
@@ -259,7 +259,7 @@ flwr/server/strategy/strategy.py,sha256=cXapkD5uDrt5C-RbmWDn9FLoap3Q41i7GKvbmfbC
|
|
259
259
|
flwr/server/superlink/__init__.py,sha256=8tHYCfodUlRD8PCP9fHgvu8cz5N31A2QoRVL0jDJ15E,707
|
260
260
|
flwr/server/superlink/driver/__init__.py,sha256=5soEK5QSvxNjmJQ-CGTWROc4alSAeU0e9Ad9RDhsd3E,717
|
261
261
|
flwr/server/superlink/driver/serverappio_grpc.py,sha256=62371xIRzp3k-eQTaSpb9c4TiSfueSuI7Iw5X3IafOY,2186
|
262
|
-
flwr/server/superlink/driver/serverappio_servicer.py,sha256=
|
262
|
+
flwr/server/superlink/driver/serverappio_servicer.py,sha256=4QEwqm_pew1iVbtEZuOWLhfgbbw4LIUwFjOuGBlPJZY,12747
|
263
263
|
flwr/server/superlink/ffs/__init__.py,sha256=FAY-zShcfPmOxosok2QyT6hTNMNctG8cH9s_nIl8jkI,840
|
264
264
|
flwr/server/superlink/ffs/disk_ffs.py,sha256=n_Ah0sQwXGVQ9wj5965nLjdkQQbpoHCljjXKFnwftsU,3297
|
265
265
|
flwr/server/superlink/ffs/ffs.py,sha256=qLI1UfosJugu2BKOJWqHIhafTm-YiuKqGf3OGWPH0NM,2395
|
@@ -273,8 +273,8 @@ flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py,sha256=JkAH_nIZaqe_9kntrg26
|
|
273
273
|
flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py,sha256=h3EhqgelegVC4EjOXH5birmAnMoCBJcP7jpHYCnHZPk,4887
|
274
274
|
flwr/server/superlink/fleet/grpc_bidi/grpc_server.py,sha256=X4I2rd1ZC9fqjOg9uwdTydLxJ3JiWthkIAqb3wEv17g,12454
|
275
275
|
flwr/server/superlink/fleet/grpc_rere/__init__.py,sha256=j2hyC342am-_Hgp1g80Y3fGDzfTI6n8QOOn2PyWf4eg,758
|
276
|
-
flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py,sha256=
|
277
|
-
flwr/server/superlink/fleet/grpc_rere/server_interceptor.py,sha256=
|
276
|
+
flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py,sha256=PyZP78gHU_RIRVSlPjyAvKG6UOLSilopkT6zoC_6ASc,5881
|
277
|
+
flwr/server/superlink/fleet/grpc_rere/server_interceptor.py,sha256=SKa1wfBNxJL6vGBUbbTgUylY3ZHJMyBSZRC1J6PBvyY,8342
|
278
278
|
flwr/server/superlink/fleet/message_handler/__init__.py,sha256=h8oLD7uo5lKICPy0rRdKRjTYe62u8PKkT_fA4xF5JPA,731
|
279
279
|
flwr/server/superlink/fleet/message_handler/message_handler.py,sha256=hzL8t6uUqO1lu5UHLF_NerdJuce4S5cK9fIWkKDzJfA,5298
|
280
280
|
flwr/server/superlink/fleet/rest_rere/__init__.py,sha256=5jbYbAn75sGv-gBwOPDySE0kz96F6dTYLeMrGqNi4lM,735
|
@@ -285,10 +285,10 @@ flwr/server/superlink/fleet/vce/backend/backend.py,sha256=LBAQxnbfPAphVOVIvYMj0Q
|
|
285
285
|
flwr/server/superlink/fleet/vce/backend/raybackend.py,sha256=jsUkFEVQTnrucK1jNQ_cUM8YwL7W4MQNA1GAf8ibRdg,7156
|
286
286
|
flwr/server/superlink/fleet/vce/vce_api.py,sha256=WTnUILr1OHS8LfjXQUA3FyWJYdJgdqpFAybyJUD-1Xo,13025
|
287
287
|
flwr/server/superlink/linkstate/__init__.py,sha256=v-2JyJlCB3qyhMNwMjmcNVOq4rkooqFU0LHH8Zo1jls,1064
|
288
|
-
flwr/server/superlink/linkstate/in_memory_linkstate.py,sha256=
|
289
|
-
flwr/server/superlink/linkstate/linkstate.py,sha256=
|
288
|
+
flwr/server/superlink/linkstate/in_memory_linkstate.py,sha256=yYLIzFurLTw5L5KscLYF6VBEBo1i-GFuSjBW2ij-7V0,22230
|
289
|
+
flwr/server/superlink/linkstate/linkstate.py,sha256=NAdArILJ58TUif-K-LzUVfgqcMdqb0719GYAV3gu0n4,13342
|
290
290
|
flwr/server/superlink/linkstate/linkstate_factory.py,sha256=ISSMjDlwuN7swxjOeYlTNpI_kuZ8PGkMcJnf1dbhUSE,2069
|
291
|
-
flwr/server/superlink/linkstate/sqlite_linkstate.py,sha256=
|
291
|
+
flwr/server/superlink/linkstate/sqlite_linkstate.py,sha256=lLvVAscwVioqzj4uj0WfDUyoq-L7Nr-kMKCdaGPI0Z8,44050
|
292
292
|
flwr/server/superlink/linkstate/utils.py,sha256=d5uqqIOCKfd54X8CFNfUr3AWqPLpgmzsC_RagRwFugM,13321
|
293
293
|
flwr/server/superlink/simulation/__init__.py,sha256=mg-oapC9dkzEfjXPQFior5lpWj4g9kwbLovptyYM_g0,718
|
294
294
|
flwr/server/superlink/simulation/simulationio_grpc.py,sha256=5wflYW_TS0mjmPG6OYuHMJwXD2_cYmUNhFkdOU0jMWQ,2237
|
@@ -317,12 +317,12 @@ flwr/superexec/__init__.py,sha256=fcj366jh4RFby_vDwLroU4kepzqbnJgseZD_jUr_Mko,71
|
|
317
317
|
flwr/superexec/app.py,sha256=Z6kYHWd62YL0Q4YKyCAbt_BcefNfbKH6V-jCC-1NkZM,1842
|
318
318
|
flwr/superexec/deployment.py,sha256=wZ9G42gGS91knfplswh95MnQ83Fzu-rs6wcuNgDmmvY,6735
|
319
319
|
flwr/superexec/exec_grpc.py,sha256=XD94kqzigQ9tLB3hU-jVgMAS_BmlK80Z5rQ_9M6b7aY,2897
|
320
|
-
flwr/superexec/exec_servicer.py,sha256=
|
320
|
+
flwr/superexec/exec_servicer.py,sha256=X10ILT-AoGMrB3IgI2mBe9i-QcIVUAl9bucuqVOPYkU,8341
|
321
321
|
flwr/superexec/exec_user_auth_interceptor.py,sha256=K06OU-l4LnYhTDg071hGJuOaQWEJbZsYi5qxUmmtiG0,3704
|
322
322
|
flwr/superexec/executor.py,sha256=_B55WW2TD1fBINpabSSDRenVHXYmvlfhv-k8hJKU4lQ,3115
|
323
323
|
flwr/superexec/simulation.py,sha256=WQDon15oqpMopAZnwRZoTICYCfHqtkvFSqiTQ2hLD_g,4088
|
324
|
-
flwr_nightly-1.15.0.
|
325
|
-
flwr_nightly-1.15.0.
|
326
|
-
flwr_nightly-1.15.0.
|
327
|
-
flwr_nightly-1.15.0.
|
328
|
-
flwr_nightly-1.15.0.
|
324
|
+
flwr_nightly-1.15.0.dev20250109.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
|
325
|
+
flwr_nightly-1.15.0.dev20250109.dist-info/METADATA,sha256=bx7_AOmer-gS3TN_YLCG0WVJFPIXNgyGE6ovkxjiGDg,15882
|
326
|
+
flwr_nightly-1.15.0.dev20250109.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
|
327
|
+
flwr_nightly-1.15.0.dev20250109.dist-info/entry_points.txt,sha256=JlNxX3qhaV18_2yj5a3kJW1ESxm31cal9iS_N_pf1Rk,538
|
328
|
+
flwr_nightly-1.15.0.dev20250109.dist-info/RECORD,,
|
{flwr_nightly-1.15.0.dev20250107.dist-info → flwr_nightly-1.15.0.dev20250109.dist-info}/LICENSE
RENAMED
File without changes
|
{flwr_nightly-1.15.0.dev20250107.dist-info → flwr_nightly-1.15.0.dev20250109.dist-info}/WHEEL
RENAMED
File without changes
|
File without changes
|