chore: update
Browse files
app.py
CHANGED
|
@@ -124,7 +124,7 @@ def get_features_fn(*checked_symptoms: Tuple[str]) -> Dict:
|
|
| 124 |
visible=False,
|
| 125 |
value=get_user_symptoms_from_checkboxgroup(pretty_print(checked_symptoms)),
|
| 126 |
),
|
| 127 |
-
|
| 128 |
}
|
| 129 |
|
| 130 |
|
|
@@ -457,7 +457,7 @@ def decrypt_fn(
|
|
| 457 |
return {
|
| 458 |
error_box7: gr.update(visible=False),
|
| 459 |
decrypt_target_box: out,
|
| 460 |
-
|
| 461 |
}
|
| 462 |
|
| 463 |
|
|
@@ -468,7 +468,7 @@ def reset_fn():
|
|
| 468 |
|
| 469 |
return {
|
| 470 |
user_vect_box2: None,
|
| 471 |
-
|
| 472 |
user_id_box: gr.update(visible=False, value=None, interactive=False),
|
| 473 |
user_vect_box1: None,
|
| 474 |
default_symptoms: gr.update(visible=True, value=None),
|
|
@@ -540,7 +540,7 @@ if __name__ == "__main__":
|
|
| 540 |
gr.Markdown("<span style='color:grey'>Client Side</span>")
|
| 541 |
gr.Markdown("Select at least 5 chief complaints from the list below.")
|
| 542 |
|
| 543 |
-
#
|
| 544 |
check_boxes = []
|
| 545 |
with gr.Row():
|
| 546 |
with gr.Column():
|
|
@@ -571,23 +571,29 @@ if __name__ == "__main__":
|
|
| 571 |
default_symptoms = gr.Textbox(
|
| 572 |
label="Related Symptoms:", interactive=False, visible=False,
|
| 573 |
)
|
| 574 |
-
|
| 575 |
-
disease_box.change(fn=display_default_symptoms_fn, inputs=[disease_box], outputs=[default_symptoms])
|
| 576 |
-
|
| 577 |
user_vect_box1 = gr.Textbox(visible=False)
|
| 578 |
-
|
| 579 |
# Submit botton
|
| 580 |
-
|
| 581 |
# Clear botton
|
| 582 |
-
clear_button = gr.Button("Reset Space π
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 583 |
|
| 584 |
-
|
| 585 |
# ------------------------- Step 2 -------------------------
|
| 586 |
gr.Markdown("## Step 2: Encrypt data")
|
| 587 |
gr.Markdown("<hr />")
|
| 588 |
gr.Markdown("<span style='color:grey'>Client Side</span>")
|
| 589 |
-
|
| 590 |
gr.Markdown(
|
|
|
|
| 591 |
"In FHE schemes, a secret (enc/dec)ryption keys are generated for encrypting and decrypting data owned by the client. \n\n"
|
| 592 |
"Additionally, a public evaluation key is generated, enabling external entities to perform homomorphic operations on encrypted data, without the need to decrypt them. \n\n"
|
| 593 |
"The evaluation key will be transmitted to the server for further processing."
|
|
@@ -595,39 +601,32 @@ if __name__ == "__main__":
|
|
| 595 |
|
| 596 |
gen_key_btn = gr.Button("Generate the evaluation key")
|
| 597 |
error_box2 = gr.Textbox(label="Error β", visible=False)
|
| 598 |
-
user_id_box = gr.Textbox(label="User ID:",
|
| 599 |
-
key_len_box = gr.Textbox(
|
| 600 |
-
|
| 601 |
-
|
| 602 |
-
|
| 603 |
-
|
| 604 |
-
|
| 605 |
-
|
| 606 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 607 |
)
|
| 608 |
|
|
|
|
| 609 |
gr.Markdown("### Encrypt the data")
|
| 610 |
-
|
| 611 |
encrypt_btn = gr.Button("Encrypt the data using the private secret key")
|
| 612 |
error_box3 = gr.Textbox(label="Error β", visible=False)
|
| 613 |
-
quant_vect_box = gr.Textbox(
|
| 614 |
-
label="Quantized Vector:",
|
| 615 |
-
interactive=False,
|
| 616 |
-
visible=False,
|
| 617 |
-
)
|
| 618 |
|
| 619 |
with gr.Row():
|
| 620 |
with gr.Column():
|
| 621 |
-
user_vect_box2 = gr.Textbox(
|
| 622 |
-
label="User Symptoms Vector:", interactive=False, max_lines=10
|
| 623 |
-
)
|
| 624 |
-
|
| 625 |
with gr.Column():
|
| 626 |
-
enc_vect_box = gr.Textbox(
|
| 627 |
-
label="Encrypted Vector:",
|
| 628 |
-
max_lines=10,
|
| 629 |
-
interactive=False,
|
| 630 |
-
)
|
| 631 |
|
| 632 |
encrypt_btn.click(
|
| 633 |
encrypt_fn,
|
|
@@ -638,21 +637,17 @@ if __name__ == "__main__":
|
|
| 638 |
error_box3,
|
| 639 |
],
|
| 640 |
)
|
| 641 |
-
|
| 642 |
gr.Markdown(
|
| 643 |
-
"### Send the encrypted data to the "
|
| 644 |
-
"<span style='color:grey'>Server Side</span>"
|
| 645 |
)
|
| 646 |
-
|
| 647 |
error_box4 = gr.Textbox(label="Error β", visible=False)
|
| 648 |
|
| 649 |
with gr.Row().style(equal_height=False):
|
| 650 |
with gr.Column(scale=4):
|
| 651 |
send_input_btn = gr.Button("Send data")
|
| 652 |
with gr.Column(scale=1):
|
| 653 |
-
srv_resp_send_data_box = gr.Checkbox(
|
| 654 |
-
label="Data Sent", show_label=False, interactive=False
|
| 655 |
-
)
|
| 656 |
|
| 657 |
send_input_btn.click(
|
| 658 |
send_input_fn,
|
|
@@ -713,7 +708,7 @@ if __name__ == "__main__":
|
|
| 713 |
decrypt_target_btn.click(
|
| 714 |
decrypt_fn,
|
| 715 |
inputs=[user_id_box, user_vect_box1, *check_boxes],
|
| 716 |
-
outputs=[decrypt_target_box, error_box7,
|
| 717 |
)
|
| 718 |
|
| 719 |
# ------------------------- End -------------------------
|
|
@@ -723,35 +718,20 @@ if __name__ == "__main__":
|
|
| 723 |
Try it yourself and don't forget to star on [Github](https://github.com/zama-ai/concrete-ml) β.
|
| 724 |
""")
|
| 725 |
|
|
|
|
|
|
|
| 726 |
gr.Markdown(
|
| 727 |
"""**Please Note**: This space is intended solely for educational and demonstration purposes.
|
| 728 |
It should not be considered as a replacement for professional medical counsel, diagnosis, or therapy for any health or related issues.
|
| 729 |
Any questions or concerns about your individual health should be addressed to your doctor or another qualified healthcare provider.
|
| 730 |
""")
|
| 731 |
|
| 732 |
-
submit_button.click(
|
| 733 |
-
fn=get_features_fn,
|
| 734 |
-
inputs=[*check_boxes],
|
| 735 |
-
outputs=[user_vect_box1, error_box1, submit_button],
|
| 736 |
-
)
|
| 737 |
-
|
| 738 |
-
gen_key_btn.click(
|
| 739 |
-
key_gen_fn,
|
| 740 |
-
inputs=user_vect_box1,
|
| 741 |
-
outputs=[
|
| 742 |
-
key_box,
|
| 743 |
-
user_id_box,
|
| 744 |
-
key_len_box,
|
| 745 |
-
error_box2,
|
| 746 |
-
],
|
| 747 |
-
)
|
| 748 |
-
|
| 749 |
clear_button.click(
|
| 750 |
reset_fn,
|
| 751 |
outputs=[
|
| 752 |
user_vect_box2,
|
| 753 |
user_vect_box1,
|
| 754 |
-
|
| 755 |
# disease_box,
|
| 756 |
error_box1,
|
| 757 |
error_box2,
|
|
|
|
| 124 |
visible=False,
|
| 125 |
value=get_user_symptoms_from_checkboxgroup(pretty_print(checked_symptoms)),
|
| 126 |
),
|
| 127 |
+
submit_btn: gr.update(value="Data submitted β
"),
|
| 128 |
}
|
| 129 |
|
| 130 |
|
|
|
|
| 457 |
return {
|
| 458 |
error_box7: gr.update(visible=False),
|
| 459 |
decrypt_target_box: out,
|
| 460 |
+
submit_btn: gr.update(value="Submit")
|
| 461 |
}
|
| 462 |
|
| 463 |
|
|
|
|
| 468 |
|
| 469 |
return {
|
| 470 |
user_vect_box2: None,
|
| 471 |
+
submit_btn: gr.update(value="Submit"),
|
| 472 |
user_id_box: gr.update(visible=False, value=None, interactive=False),
|
| 473 |
user_vect_box1: None,
|
| 474 |
default_symptoms: gr.update(visible=True, value=None),
|
|
|
|
| 540 |
gr.Markdown("<span style='color:grey'>Client Side</span>")
|
| 541 |
gr.Markdown("Select at least 5 chief complaints from the list below.")
|
| 542 |
|
| 543 |
+
# Step 1.1: Provide symptoms
|
| 544 |
check_boxes = []
|
| 545 |
with gr.Row():
|
| 546 |
with gr.Column():
|
|
|
|
| 571 |
default_symptoms = gr.Textbox(
|
| 572 |
label="Related Symptoms:", interactive=False, visible=False,
|
| 573 |
)
|
| 574 |
+
# User vector symptoms encoded in oneHot representation
|
|
|
|
|
|
|
| 575 |
user_vect_box1 = gr.Textbox(visible=False)
|
|
|
|
| 576 |
# Submit botton
|
| 577 |
+
submit_btn = gr.Button("Submit")
|
| 578 |
# Clear botton
|
| 579 |
+
clear_button = gr.Button("Reset Space π", visible=False)
|
| 580 |
+
|
| 581 |
+
disease_box.change(fn=display_default_symptoms_fn, inputs=[disease_box], outputs=[default_symptoms])
|
| 582 |
+
|
| 583 |
+
|
| 584 |
+
submit_btn.click(
|
| 585 |
+
fn=get_features_fn,
|
| 586 |
+
inputs=[*check_boxes],
|
| 587 |
+
outputs=[user_vect_box1, error_box1, submit_btn],
|
| 588 |
+
)
|
| 589 |
|
|
|
|
| 590 |
# ------------------------- Step 2 -------------------------
|
| 591 |
gr.Markdown("## Step 2: Encrypt data")
|
| 592 |
gr.Markdown("<hr />")
|
| 593 |
gr.Markdown("<span style='color:grey'>Client Side</span>")
|
| 594 |
+
# Step 2.1: Key generation
|
| 595 |
gr.Markdown(
|
| 596 |
+
"### Key Generation\n\n"
|
| 597 |
"In FHE schemes, a secret (enc/dec)ryption keys are generated for encrypting and decrypting data owned by the client. \n\n"
|
| 598 |
"Additionally, a public evaluation key is generated, enabling external entities to perform homomorphic operations on encrypted data, without the need to decrypt them. \n\n"
|
| 599 |
"The evaluation key will be transmitted to the server for further processing."
|
|
|
|
| 601 |
|
| 602 |
gen_key_btn = gr.Button("Generate the evaluation key")
|
| 603 |
error_box2 = gr.Textbox(label="Error β", visible=False)
|
| 604 |
+
user_id_box = gr.Textbox(label="User ID:", visible=True)
|
| 605 |
+
key_len_box = gr.Textbox(label="Evaluation Key Size:", visible=False)
|
| 606 |
+
key_box = gr.Textbox(label="Evaluation key (truncated):", max_lines=3, visible=False)
|
| 607 |
+
|
| 608 |
+
gen_key_btn.click(
|
| 609 |
+
key_gen_fn,
|
| 610 |
+
inputs=user_vect_box1,
|
| 611 |
+
outputs=[
|
| 612 |
+
key_box,
|
| 613 |
+
user_id_box,
|
| 614 |
+
key_len_box,
|
| 615 |
+
error_box2,
|
| 616 |
+
],
|
| 617 |
)
|
| 618 |
|
| 619 |
+
# Step 2.2: Encrypt data locally
|
| 620 |
gr.Markdown("### Encrypt the data")
|
|
|
|
| 621 |
encrypt_btn = gr.Button("Encrypt the data using the private secret key")
|
| 622 |
error_box3 = gr.Textbox(label="Error β", visible=False)
|
| 623 |
+
quant_vect_box = gr.Textbox(label="Quantized Vector:", visible=False)
|
|
|
|
|
|
|
|
|
|
|
|
|
| 624 |
|
| 625 |
with gr.Row():
|
| 626 |
with gr.Column():
|
| 627 |
+
user_vect_box2 = gr.Textbox(label="User Symptoms Vector:", max_lines=10)
|
|
|
|
|
|
|
|
|
|
| 628 |
with gr.Column():
|
| 629 |
+
enc_vect_box = gr.Textbox(label="Encrypted Vector:", max_lines=10)
|
|
|
|
|
|
|
|
|
|
|
|
|
| 630 |
|
| 631 |
encrypt_btn.click(
|
| 632 |
encrypt_fn,
|
|
|
|
| 637 |
error_box3,
|
| 638 |
],
|
| 639 |
)
|
| 640 |
+
# Step 2.3: Send encrypted data to the server
|
| 641 |
gr.Markdown(
|
| 642 |
+
"### Send the encrypted data to the <span style='color:grey'>Server Side</span>"
|
|
|
|
| 643 |
)
|
|
|
|
| 644 |
error_box4 = gr.Textbox(label="Error β", visible=False)
|
| 645 |
|
| 646 |
with gr.Row().style(equal_height=False):
|
| 647 |
with gr.Column(scale=4):
|
| 648 |
send_input_btn = gr.Button("Send data")
|
| 649 |
with gr.Column(scale=1):
|
| 650 |
+
srv_resp_send_data_box = gr.Checkbox(label="Data Sent", show_label=False)
|
|
|
|
|
|
|
| 651 |
|
| 652 |
send_input_btn.click(
|
| 653 |
send_input_fn,
|
|
|
|
| 708 |
decrypt_target_btn.click(
|
| 709 |
decrypt_fn,
|
| 710 |
inputs=[user_id_box, user_vect_box1, *check_boxes],
|
| 711 |
+
outputs=[decrypt_target_box, error_box7, submit_btn],
|
| 712 |
)
|
| 713 |
|
| 714 |
# ------------------------- End -------------------------
|
|
|
|
| 718 |
Try it yourself and don't forget to star on [Github](https://github.com/zama-ai/concrete-ml) β.
|
| 719 |
""")
|
| 720 |
|
| 721 |
+
gr.Markdown("\n\n")
|
| 722 |
+
|
| 723 |
gr.Markdown(
|
| 724 |
"""**Please Note**: This space is intended solely for educational and demonstration purposes.
|
| 725 |
It should not be considered as a replacement for professional medical counsel, diagnosis, or therapy for any health or related issues.
|
| 726 |
Any questions or concerns about your individual health should be addressed to your doctor or another qualified healthcare provider.
|
| 727 |
""")
|
| 728 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 729 |
clear_button.click(
|
| 730 |
reset_fn,
|
| 731 |
outputs=[
|
| 732 |
user_vect_box2,
|
| 733 |
user_vect_box1,
|
| 734 |
+
submit_btn,
|
| 735 |
# disease_box,
|
| 736 |
error_box1,
|
| 737 |
error_box2,
|
utils.py
CHANGED
|
@@ -10,7 +10,7 @@ from concrete.ml.sklearn import XGBClassifier as ConcreteXGBoostClassifier
|
|
| 10 |
|
| 11 |
# Max Input to be displayed on the HuggingFace space brower using Gradio
|
| 12 |
# Too large inputs, slow down the server: https://github.com/gradio-app/gradio/issues/1877
|
| 13 |
-
INPUT_BROWSER_LIMIT =
|
| 14 |
|
| 15 |
# Store the server's URL
|
| 16 |
SERVER_URL = "http://localhost:8000/"
|
|
|
|
| 10 |
|
| 11 |
# Max Input to be displayed on the HuggingFace space brower using Gradio
|
| 12 |
# Too large inputs, slow down the server: https://github.com/gradio-app/gradio/issues/1877
|
| 13 |
+
INPUT_BROWSER_LIMIT = 400
|
| 14 |
|
| 15 |
# Store the server's URL
|
| 16 |
SERVER_URL = "http://localhost:8000/"
|