Spaces:
Building
on
CPU Upgrade
Building
on
CPU Upgrade
feat: add jsonification
Browse files
app.py
CHANGED
@@ -4,9 +4,10 @@ from pathlib import Path
|
|
4 |
import numpy as np
|
5 |
import gradio as gr
|
6 |
import requests
|
|
|
7 |
|
8 |
# Store the server's URL
|
9 |
-
SERVER_URL = "
|
10 |
CURRENT_DIR = Path(__file__).parent
|
11 |
DEPLOYMENT_DIR = CURRENT_DIR / "deployment_files"
|
12 |
KEYS_DIR = DEPLOYMENT_DIR / ".fhe_keys"
|
@@ -118,7 +119,7 @@ def decrypt_result(encrypted_answer: bytes, user_id: str) -> bool:
|
|
118 |
|
119 |
|
120 |
def encode_categorical_data(data):
|
121 |
-
categories = ["Gender", "Ethnicity", "Geographic_Location", "Smoking_Status", "Alcohol_Consumption", "Exercise_Habits", "Diet", "Functional_Status", "Previous_Trial_Participation"]
|
122 |
encoded_data = []
|
123 |
for i in range(len(categories)):
|
124 |
sub_cats = additional_categories[categories[i]]
|
@@ -129,22 +130,69 @@ def encode_categorical_data(data):
|
|
129 |
|
130 |
return encoded_data
|
131 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
132 |
|
133 |
def process_patient_data(age, gender, ethnicity, geographic_location, diagnoses_icd10, medications, allergies, previous_treatments, blood_glucose_level, blood_pressure_systolic, blood_pressure_diastolic, bmi, smoking_status, alcohol_consumption, exercise_habits, diet, condition_severity, functional_status, previous_trial_participation):
|
134 |
|
135 |
# Encode the data
|
136 |
-
categorical_data = [gender, ethnicity, geographic_location, smoking_status, alcohol_consumption, exercise_habits, diet, functional_status, previous_trial_participation]
|
137 |
print(f"Categorical data: {categorical_data}")
|
138 |
encoded_categorical_data = encode_categorical_data(categorical_data)
|
139 |
numerical_data = np.array([age, blood_glucose_level, blood_pressure_systolic, blood_pressure_diastolic, bmi, condition_severity])
|
140 |
print(f"Numerical data: {numerical_data}")
|
141 |
print(f"One-hot encoded data: {encoded_categorical_data}")
|
142 |
combined_data = np.hstack((numerical_data, encoded_categorical_data))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
143 |
print(f"Combined data: {combined_data}")
|
144 |
-
encrypted_array = encrypt_array(combined_data, "user_id")
|
145 |
|
146 |
-
# Send the
|
147 |
-
|
|
|
148 |
|
149 |
# Check if the data was sent successfully
|
150 |
if response.status_code == 200:
|
@@ -153,20 +201,19 @@ def process_patient_data(age, gender, ethnicity, geographic_location, diagnoses_
|
|
153 |
print("Error sending data.")
|
154 |
|
155 |
# Decrypt the result
|
156 |
-
decrypted_result = decrypt_result(response.content, USER_ID)
|
157 |
-
|
|
|
158 |
# If the answer is True, return the link
|
159 |
if decrypted_result:
|
160 |
return (
|
161 |
-
f"Encrypted data: {encrypted_array}",
|
162 |
-
f"Decrypted result: {
|
163 |
-
f"You may now access the link to the [clinical trial]({EXAMPLE_CLINICAL_TRIAL_LINK})"
|
164 |
)
|
165 |
else:
|
166 |
return (
|
167 |
-
f"Encrypted data: {encrypted_array}",
|
168 |
-
f"Decrypted result: {
|
169 |
-
f"Unfortunately, there are no clinical trials available for the provided criteria."
|
170 |
)
|
171 |
|
172 |
# Create the Gradio interface
|
|
|
4 |
import numpy as np
|
5 |
import gradio as gr
|
6 |
import requests
|
7 |
+
import json
|
8 |
|
9 |
# Store the server's URL
|
10 |
+
SERVER_URL = "https://ppaihack-match.azurewebsites.net/"
|
11 |
CURRENT_DIR = Path(__file__).parent
|
12 |
DEPLOYMENT_DIR = CURRENT_DIR / "deployment_files"
|
13 |
KEYS_DIR = DEPLOYMENT_DIR / ".fhe_keys"
|
|
|
119 |
|
120 |
|
121 |
def encode_categorical_data(data):
|
122 |
+
categories = ["Gender", "Ethnicity", "Geographic_Location", "Diagnoses_ICD10", "Medications", "Allergies", "Previous_Treatments", "Smoking_Status", "Alcohol_Consumption", "Exercise_Habits", "Diet", "Functional_Status", "Previous_Trial_Participation"]
|
123 |
encoded_data = []
|
124 |
for i in range(len(categories)):
|
125 |
sub_cats = additional_categories[categories[i]]
|
|
|
130 |
|
131 |
return encoded_data
|
132 |
|
133 |
+
def clear_data_to_json(data):
|
134 |
+
print(data)
|
135 |
+
patient_data = {
|
136 |
+
"model_names": ["my_model"],
|
137 |
+
"patient": {
|
138 |
+
"Age": data.get("age", 30),
|
139 |
+
"Blood_Glucose_Level": data.get("blood_glucose_level", 0),
|
140 |
+
"Blood_Pressure_Systolic": data.get("blood_pressure_systolic", 0),
|
141 |
+
"Blood_Pressure_Diastolic": data.get("blood_pressure_diastolic", 0),
|
142 |
+
"BMI": data.get("bmi", 0),
|
143 |
+
"Condition_Severity": data.get("condition_severity", 0),
|
144 |
+
"Gender": data.get("Gender", 0),
|
145 |
+
"Ethnicity": data.get("Ethnicity", 0),
|
146 |
+
"Geographic_Location": data.get("Geographic_Location", 0),
|
147 |
+
"Smoking_Status": data.get("Smoking_Status", 0),
|
148 |
+
"Diagnoses_ICD10": data.get("Diagnoses_ICD10", 0),
|
149 |
+
"Medications": data.get("Medications", 0),
|
150 |
+
"Allergies": data.get("Allergies", 0),
|
151 |
+
"Previous_Treatments": data.get("Previous_Treatments", 0),
|
152 |
+
"Alcohol_Consumption": data.get("Alcohol_Consumption", 0),
|
153 |
+
"Exercise_Habits": data.get("Exercise_Habits", 0),
|
154 |
+
"Diet": data.get("Diet", 0),
|
155 |
+
"Functional_Status": data.get("Functional_Status", 0),
|
156 |
+
"Previous_Trial_Participation": data.get("Previous_Trial_Participation", 0)
|
157 |
+
}
|
158 |
+
}
|
159 |
+
return json.dumps(patient_data, indent=4)
|
160 |
+
|
161 |
|
162 |
def process_patient_data(age, gender, ethnicity, geographic_location, diagnoses_icd10, medications, allergies, previous_treatments, blood_glucose_level, blood_pressure_systolic, blood_pressure_diastolic, bmi, smoking_status, alcohol_consumption, exercise_habits, diet, condition_severity, functional_status, previous_trial_participation):
|
163 |
|
164 |
# Encode the data
|
165 |
+
categorical_data = [gender, ethnicity, geographic_location, diagnoses_icd10, medications, allergies, previous_treatments, smoking_status, alcohol_consumption, exercise_habits, diet, functional_status, previous_trial_participation]
|
166 |
print(f"Categorical data: {categorical_data}")
|
167 |
encoded_categorical_data = encode_categorical_data(categorical_data)
|
168 |
numerical_data = np.array([age, blood_glucose_level, blood_pressure_systolic, blood_pressure_diastolic, bmi, condition_severity])
|
169 |
print(f"Numerical data: {numerical_data}")
|
170 |
print(f"One-hot encoded data: {encoded_categorical_data}")
|
171 |
combined_data = np.hstack((numerical_data, encoded_categorical_data))
|
172 |
+
|
173 |
+
ordered_categories = ["Gender", "Ethnicity", "Geographic_Location", "Diagnoses_ICD10", "Medications", "Allergies", "Previous_Treatments", "Smoking_Status", "Alcohol_Consumption", "Exercise_Habits", "Diet", "Functional_Status", "Previous_Trial_Participation"]
|
174 |
+
zipped_data = zip(ordered_categories, encoded_categorical_data)
|
175 |
+
# Convert the zipped data to a dictionary
|
176 |
+
encoded_categorical_dict = {category: value for category, value in zipped_data}
|
177 |
+
|
178 |
+
# Convert the data to JSON
|
179 |
+
json_data = clear_data_to_json({
|
180 |
+
"age": age,
|
181 |
+
"blood_glucose_level": blood_glucose_level,
|
182 |
+
"blood_pressure_systolic": blood_pressure_systolic,
|
183 |
+
"blood_pressure_diastolic": blood_pressure_diastolic,
|
184 |
+
"bmi": bmi,
|
185 |
+
"condition_severity": condition_severity,
|
186 |
+
**encoded_categorical_dict
|
187 |
+
})
|
188 |
+
|
189 |
+
print(f"JSON data: {json_data}")
|
190 |
print(f"Combined data: {combined_data}")
|
191 |
+
# encrypted_array = encrypt_array(combined_data, "user_id")
|
192 |
|
193 |
+
# Send the data to the server
|
194 |
+
url = SERVER_URL + "clear-match"
|
195 |
+
response = requests.post(url, data=json_data)
|
196 |
|
197 |
# Check if the data was sent successfully
|
198 |
if response.status_code == 200:
|
|
|
201 |
print("Error sending data.")
|
202 |
|
203 |
# Decrypt the result
|
204 |
+
# decrypted_result = decrypt_result(response.content, USER_ID)
|
205 |
+
print()
|
206 |
+
decrypted_result = response.json()
|
207 |
# If the answer is True, return the link
|
208 |
if decrypted_result:
|
209 |
return (
|
210 |
+
# f"Encrypted data: {encrypted_array}",
|
211 |
+
f"Decrypted result: {response.json()}"
|
|
|
212 |
)
|
213 |
else:
|
214 |
return (
|
215 |
+
# f"Encrypted data: {encrypted_array}",
|
216 |
+
f"Decrypted result: {response.json()}"
|
|
|
217 |
)
|
218 |
|
219 |
# Create the Gradio interface
|