pryvx 2.4.2__py3-none-any.whl → 2.4.3__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.
- pryvx/fl_client.py +8 -7
- pryvx/fl_ensemble.py +16 -12
- pryvx/fl_server.py +5 -3
- {pryvx-2.4.2.dist-info → pryvx-2.4.3.dist-info}/METADATA +1 -1
- {pryvx-2.4.2.dist-info → pryvx-2.4.3.dist-info}/RECORD +8 -8
- {pryvx-2.4.2.dist-info → pryvx-2.4.3.dist-info}/LICENSE +0 -0
- {pryvx-2.4.2.dist-info → pryvx-2.4.3.dist-info}/WHEEL +0 -0
- {pryvx-2.4.2.dist-info → pryvx-2.4.3.dist-info}/top_level.txt +0 -0
pryvx/fl_client.py
CHANGED
@@ -9,27 +9,28 @@ import pickle
|
|
9
9
|
def train_logistic_classifier(features, labels):
|
10
10
|
model = LogisticRegression()
|
11
11
|
model.fit(features, labels)
|
12
|
-
|
13
12
|
serialized_model = pickle.dumps(model)
|
13
|
+
return serialized_model, model
|
14
14
|
|
15
|
-
return serialized_model
|
16
15
|
|
17
16
|
def train_random_forest_classifier(features, labels):
|
18
17
|
model = RandomForestClassifier(n_estimators=100, random_state=42)
|
19
18
|
model.fit(features, labels)
|
20
19
|
serialized_model = pickle.dumps(model)
|
21
|
-
|
22
|
-
return serialized_model
|
20
|
+
return serialized_model, model
|
23
21
|
|
24
22
|
|
25
|
-
def send_params(serialized_model, connection_url):
|
23
|
+
def send_params(serialized_model, connection_url, client_id):
|
26
24
|
|
27
25
|
with grpc.insecure_channel(connection_url) as channel:
|
28
26
|
stub = pryvx_pb2_grpc.ModelServiceStub(channel)
|
29
27
|
|
28
|
+
# Attach metadata (client ID) in the request
|
29
|
+
metadata = (("client_id", client_id),)
|
30
|
+
|
30
31
|
model_params = pryvx_pb2.ModelParams(params=serialized_model)
|
31
32
|
|
32
|
-
response = stub.SendModelParams(model_params)
|
33
|
+
response = stub.SendModelParams(model_params, metadata=metadata)
|
33
34
|
|
34
|
-
return "Model Params sent to server"
|
35
|
+
return f"✅ Model Params sent to server from {client_id}"
|
35
36
|
|
pryvx/fl_ensemble.py
CHANGED
@@ -1,16 +1,20 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
# estimators = [('client_1', model_1), ('client_2', model_2), ('client_3', model_3)]
|
1
|
+
import numpy as np
|
4
2
|
|
5
3
|
def federated_ensemble(estimators, X_test):
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
)
|
11
|
-
|
12
|
-
|
13
|
-
|
4
|
+
"""
|
5
|
+
Perform soft voting ensemble on a list of trained estimators.
|
6
|
+
|
7
|
+
:param estimators: List of trained models that support `predict_proba`
|
8
|
+
:param X_test: Test dataset (features only)
|
9
|
+
:return: Final predictions after soft voting
|
10
|
+
"""
|
11
|
+
if not estimators:
|
12
|
+
raise ValueError("No models provided for ensemble.")
|
14
13
|
|
15
|
-
|
14
|
+
# Sum all probability predictions
|
15
|
+
avg_probs = sum(model.predict_proba(X_test) for model in estimators) / len(estimators)
|
16
16
|
|
17
|
+
# Convert probabilities to final predictions (highest probability wins)
|
18
|
+
y_pred_ensemble = np.argmax(avg_probs, axis=1)
|
19
|
+
|
20
|
+
return y_pred_ensemble
|
pryvx/fl_server.py
CHANGED
@@ -16,18 +16,20 @@ class ModelServicer(pryvx_pb2_grpc.ModelServiceServicer):
|
|
16
16
|
|
17
17
|
def SendModelParams(self, request, context):
|
18
18
|
try:
|
19
|
+
# Extract metadata (client ID)
|
20
|
+
client_id = dict(context.invocation_metadata()).get("client_id", "unknown_client")
|
21
|
+
|
19
22
|
# Deserialize model received from client
|
20
23
|
model = pickle.loads(request.params)
|
21
24
|
|
22
|
-
timestamp = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
|
23
|
-
|
24
25
|
# Assign a unique client ID
|
25
26
|
client_id = f"client_{len(self.client_models) + 1}"
|
26
27
|
self.client_models[client_id] = model
|
27
28
|
|
28
29
|
# Save model to disk
|
29
|
-
model_filename = os.path.join(MODEL_SAVE_PATH, f"{client_id}
|
30
|
+
model_filename = os.path.join(MODEL_SAVE_PATH, f"{client_id}_model.pkl")
|
30
31
|
with open(model_filename, "wb") as f:
|
32
|
+
|
31
33
|
pickle.dump(model, f)
|
32
34
|
|
33
35
|
print(f"✅ Received and saved model from {client_id}")
|
@@ -1,7 +1,7 @@
|
|
1
1
|
pryvx/__init__.py,sha256=QvpYISJ8MH7XnbxC5iTMTycq7Svsld0NIbMozcndYjo,111
|
2
|
-
pryvx/fl_client.py,sha256=
|
3
|
-
pryvx/fl_ensemble.py,sha256=
|
4
|
-
pryvx/fl_server.py,sha256=
|
2
|
+
pryvx/fl_client.py,sha256=gQNjv99tDDjaGj0JTdAVomefqR2F3_xNLcnHJ6aGZZo,1152
|
3
|
+
pryvx/fl_ensemble.py,sha256=lvgvd-zJDSBh-RyMAjTyJZwu0eFiUNXfCU7J2Vk7g0g,715
|
4
|
+
pryvx/fl_server.py,sha256=JqYtlLtLTcKxrNB8oY-hdZmG8VajS7mIqAY3OjOUxmU,1822
|
5
5
|
pryvx/gdp.py,sha256=ToLtWNvBKtSs-3Na1pGe_J6dWvBxXhV2raUJkNtKMg4,925
|
6
6
|
pryvx/ldp.py,sha256=WxBQLnZ_b2wNV1rlN7rtKXaQ5waUPPvnRus-4tUnCB8,810
|
7
7
|
pryvx/phe.py,sha256=HN70aUNTq0w9vRPMaNGfTnNi00gMQ1B7R7Cm6r6rheE,2974
|
@@ -9,8 +9,8 @@ pryvx/pryvx_pb2.py,sha256=-ce40VMW0nQcjyhAJy1BvI32wtWNm425LSIExspK_qg,1200
|
|
9
9
|
pryvx/pryvx_pb2_grpc.py,sha256=pRQKblTNIVEwHsMQmhC-HGJFzsLh0sdOzQ-ksFYVK-A,2437
|
10
10
|
pryvx/psi.py,sha256=V0BUJwYfiFWhKtEL27q45yxY7U-I7B4olKQhaGbgN50,1346
|
11
11
|
pryvx/smpc.py,sha256=FZcE3gZo8WUVPmcBHSgP8iOkWt3AKcBLSLCtKczy8hs,2247
|
12
|
-
pryvx-2.4.
|
13
|
-
pryvx-2.4.
|
14
|
-
pryvx-2.4.
|
15
|
-
pryvx-2.4.
|
16
|
-
pryvx-2.4.
|
12
|
+
pryvx-2.4.3.dist-info/LICENSE,sha256=pbIMXbaorAIVW-fDch2tvtZRkVA3mz-UnXQqeCf4LDg,1086
|
13
|
+
pryvx-2.4.3.dist-info/METADATA,sha256=Ytztu3-NrHGnG2XkIBalwkZSMQiP5d7UzU0V5C8wpdQ,1066
|
14
|
+
pryvx-2.4.3.dist-info/WHEEL,sha256=eOLhNAGa2EW3wWl_TU484h7q1UNgy0JXjjoqKoxAAQc,92
|
15
|
+
pryvx-2.4.3.dist-info/top_level.txt,sha256=1iHoeevu_FoFjdPg8HyMlgvHNUm1--9QEpFMaJEa4hw,6
|
16
|
+
pryvx-2.4.3.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|