File size: 5,351 Bytes
f6cea9d
 
27ca8f1
f6cea9d
1103a86
a8e848d
1103a86
 
 
 
a8e848d
 
 
 
1103a86
 
 
 
a9b0f70
9e6d99b
a9b0f70
1103a86
a9b0f70
1103a86
a8e848d
9e6d99b
1e120d7
1103a86
1e120d7
a8e848d
1103a86
 
dc36cbe
1103a86
a8e848d
 
1103a86
a9b0f70
1103a86
 
a9b0f70
a8e848d
 
 
 
 
1103a86
 
a9b0f70
 
 
 
 
 
 
 
 
 
1103a86
a9b0f70
34eaa8b
 
1103a86
a9b0f70
34eaa8b
1103a86
a9b0f70
 
 
1103a86
a9b0f70
1103a86
a9b0f70
1103a86
a8e848d
 
 
a9b0f70
a8e848d
 
1103a86
7c6ca1b
a8e848d
a9b0f70
1103a86
a9b0f70
 
 
 
1103a86
a9b0f70
 
1103a86
a9b0f70
1103a86
a8e848d
a9b0f70
 
 
 
 
1103a86
 
a9b0f70
76db320
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
import gradio as gr
import numpy as np
import matplotlib.pyplot as plt

# Function to simulate blood glucose changes over time
def predict_glucose(current_glucose, meal_type, meal_time_hr, meal_time_min, galvus_dose, galvus_time_hr, galvus_time_min, exercise_duration, fast_carbs_ml, chocolate_time_min, prediction_time=3):
    # Constants for glucose reduction effects
    post_meal_reduction = 63.6  # mg/dL (avg reduction for Vildagliptin in 2 hours)
    fasting_reduction = 27.7  # mg/dL (avg reduction over 6-12 hours)
    
    # Convert meal time and Galvus time to minutes for easier calculations
    meal_time_total_min = meal_time_hr * 60 + meal_time_min
    galvus_time_total_min = galvus_time_hr * 60 + galvus_time_min

    # Adjust for fast carbs (milk, juice, etc.)
    carb_effect = fast_carbs_ml * 1.5  # Approximate glucose rise per mL of fast carbs

    # Calculate blood glucose over time considering meal type, Galvus dose, and exercise
    if meal_type == 'High-carb':
        glucose_after_meal = current_glucose + carb_effect + 60  # Higher glucose increase due to carbs
    elif meal_type == 'Protein-heavy':
        glucose_after_meal = current_glucose + 20  # Small glucose increase due to protein
    elif meal_type == 'Low-carb':
        glucose_after_meal = current_glucose - 10  # Small reduction due to low-carb meal
    elif meal_type == 'Fast carb':
        glucose_after_meal = current_glucose + carb_effect * 1.5  # Fast carbs like juice, milk increase glucose quickly
    else:
        glucose_after_meal = current_glucose  # Normal meal with moderate carbs

    # Calculate glucose levels over 1 hour and 3 hours
    glucose_1hr = glucose_after_meal - post_meal_reduction + carb_effect * 0.5  # Adjust for carb effect
    glucose_3hr = glucose_1hr - fasting_reduction

    # Adjust the effects of Galvus based on its administration time (medication effect starts at galvus_time + 1-2 hours)
    time_since_galvus = meal_time_total_min - galvus_time_total_min
    if time_since_galvus >= 60:  # After 1 hour, the effects of Galvus start kicking in
        glucose_3hr -= fasting_reduction  # Galvus effect after 3 hours

    # Exercise effect on glucose (hypothetical value, may vary based on intensity)
    glucose_3hr -= exercise_duration * 2  # Exercise reduces glucose by 2 mg/dL per minute

    # Chocolate bar effect
    if chocolate_time_min <= 60:  # If the chocolate bar is eaten within 1 hour
        glucose_1hr += 40  # Approximate glucose rise from chocolate
        glucose_3hr += 30  # This would still contribute to an increase at 3 hours

    # Plotting the graph of glucose prediction over time
    time_points = [0, 1, 3]  # Time: 0 hours, 1 hour, 3 hours
    glucose_values = [current_glucose, glucose_1hr, glucose_3hr]

    plt.plot(time_points, glucose_values, marker='o', color='b')
    plt.title("Blood Glucose Prediction Over Time")
    plt.xlabel("Time (Hours)")
    plt.ylabel("Blood Glucose (mg/dL)")
    plt.xticks([0, 1, 2, 3])
    plt.grid(True)
    plt.tight_layout()

    # Save the graph as a file to show it in Gradio
    plt.savefig('/tmp/blood_glucose_prediction.png')
    plt.close()

    # Return glucose predictions and the image file path
    return glucose_1hr, glucose_3hr, '/tmp/blood_glucose_prediction.png'


# Gradio Interface
def build_interface():
    with gr.Blocks() as iface:
        gr.Markdown("# Blood Glucose Prediction Model (With Vildagliptin Effects)")

        # Inputs for current glucose, meal info, medication dose, exercise, fast carbs, and Galvus time
        with gr.Row():
            current_glucose = gr.Number(label="Current Blood Glucose (mg/dL)", value=105)
            meal_type = gr.Radio(choices=["Normal", "High-carb", "Protein-heavy", "Low-carb", "Fast carb"], label="Meal Type", value="Low-carb")
            meal_time_hr = gr.Number(label="Last Meal Time (hours)", value=6)
            meal_time_min = gr.Number(label="Last Meal Time (minutes)", value=0)
            galvus_dose = gr.Number(label="Galvus Dose (mg)", value=50)
            galvus_time_hr = gr.Number(label="Galvus Time of Administration (hours)", value=2)
            galvus_time_min = gr.Number(label="Galvus Time of Administration (minutes)", value=0)
            exercise_duration = gr.Number(label="Exercise Duration (min)", value=60)
            fast_carbs_ml = gr.Number(label="Fast Carbs (mL)", value=0)
            chocolate_time_min = gr.Number(label="Time After Meal When Chocolate Bar Is Eaten (min)", value=60)

        # Output predictions and graph
        glucose_1hr_output = gr.Textbox(label="Predicted Glucose Level in 1 Hour (mg/dL)")
        glucose_3hr_output = gr.Textbox(label="Predicted Glucose Level in 3 Hours (mg/dL)")
        glucose_graph = gr.Image(label="Blood Glucose Prediction Graph")

        # Button to trigger prediction
        predict_button = gr.Button("Predict Blood Glucose")

        # Set button action
        predict_button.click(
            predict_glucose,
            inputs=[current_glucose, meal_type, meal_time_hr, meal_time_min, galvus_dose, galvus_time_hr, galvus_time_min, exercise_duration, fast_carbs_ml, chocolate_time_min],
            outputs=[glucose_1hr_output, glucose_3hr_output, glucose_graph]
        )

    return iface


# Build and launch the Gradio interface
iface = build_interface()
iface.launch()