File size: 5,262 Bytes
57199ed
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
941ac31
57199ed
941ac31
77feed5
 
941ac31
57199ed
 
 
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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
import gradio as gr

def calculate_bmi(height, weight):
    # Calculate BMI using the provided height and weight
    # BMI Formula: weight (kg) / (height (m) ** 2)
    height_m = height / 100  # Convert height from cm to m
    bmi = weight / (height_m ** 2)
    return bmi

def calculate_bmr(age, gender, height, weight):
    # Calculate Basal Metabolic Rate (BMR) using the provided age, gender, height, and weight
    if gender == "Nam":
        # BMR Formula for males: 88.362 + (13.397 x weight in kg) + (4.799 x height in cm) - (5.677 x age in years)
        bmr = 88.362 + (13.397 * weight) + (4.799 * height) - (5.677 * age)
    else:
        # BMR Formula for females: 447.593 + (9.247 x weight in kg) + (3.098 x height in cm) - (4.330 x age in years)
        bmr = 447.593 + (9.247 * weight) + (3.098 * height) - (4.330 * age)
    return bmr

def calculate_tdee(bmr, activity_level):
    # Calculate Total Daily Energy Expenditure (TDEE) using the provided BMR and activity level
    tdee = bmr * activity_level
    return tdee

def calculate_daily_calories_goal(tdee, goal):
    # Calculate the daily calorie goal based on the provided TDEE and goal
    if goal == "Giảm cân":
        calories_goal = tdee - 500  # Aim for a 500 calorie deficit per day for weight loss
    elif goal == "Tăng cân":
        calories_goal = tdee + 500  # Aim for a 500 calorie surplus per day for weight gain
    else:
        calories_goal = tdee  # Maintain current weight
    if calories_goal < 0 : 
        return 0
    else :
        return calories_goal

def get_activity_factor(activity_input):
    """
    Get the activity factor based on the selected option.

    Args:
        activity_input (str): Selected activity option.

    Returns:
        float: Activity factor based on the selected option.
    """
    activity_factor_map = {
        'Không': 1.2,
        'Có': 1.55,
        'Thường Xuyên': 1.725
    }

    return activity_factor_map.get(activity_input, 1.2)



def process(height, weight, age, gender, activities, goal):
    # Determine activity level
    activity_level = get_activity_factor(activities)

    # Calculate BMR
    bmr = calculate_bmr(age, gender, height, weight)

    # Calculate TDEE
    tdee = calculate_tdee(bmr, activity_level)
    
    # Calculate BMI
    bmi = calculate_bmi(height, weight)
    
    # Determine BMI category based on gender
    bmi_category = ""
    if gender == "Nam":
        if bmi < 20:
            bmi_category = "Thiếu cân, cần có chế độ ăn phù hợp để cải thiện tình trạng này"
        elif 20 <= bmi < 25:
            bmi_category = "Bình thường, thậm chí ở trong tình trạng tốt nếu bạn thường xuyên tập thể dục và ăn một chế độ ăn hợp lý"
        elif 25 <= bmi < 30:
            bmi_category = "Thừa cân, cần áp dụng biện pháp để khắc phục tình trạng trên"
        else:
            bmi_category = "Béo phì nặng, nếu không cải thiện sớm có thể gây ra các vấn đề liên quan đến tiêu hóa, hệ tuần hoàn, v.v."
    else:
        if bmi < 18:
            bmi_category = "Thiếu cân, thiếu dinh dưỡng"
        elif 18 <= bmi < 23:
            bmi_category = "Bình thường"
        elif 23 <= bmi < 30:
            bmi_category = "Thừa cân"
        else:
            bmi_category = "Béo phì"

    # Calculate daily calorie goal
    calo_suggestion = calculate_daily_calories_goal(tdee, goal)

    return bmi, bmr, tdee, bmi_category, calo_suggestion

inputs = [
    gr.inputs.Number(label=" Chiều Cao (cm)"),
    gr.inputs.Number(label=" Cân Nặng (kg)"),
    gr.inputs.Number(label="Tuổi"),
    gr.inputs.Radio(['Nam', 'Nữ'], label="Giới Tính"),
    gr.inputs.Radio(['Không', "Có", 'Thường Xuyên'], label="Hoạt Động Thể Thao", default="Không" ),
    gr.inputs.Radio(['Giảm cân', 'Tăng cân', 'Duy trì'], label="Mục Tiêu", default="Giảm cân")
]

outputs = [
    gr.outputs.Textbox(label="Chỉ số BMI"),
    gr.outputs.Textbox(label="Chỉ số BMR"),
    gr.outputs.Textbox(label="Chỉ số TDEE"),
    gr.outputs.Textbox(label="Lượng Calories mỗi ngày nên là:")
]

def do(height, weight, age, gender, activities, goal):
    bmi, bmr, tdee, bmi_category, calorie_goal = process(height, weight, age, gender, activities, goal)

    # Format the values with 2 decimal places
    bmi = "{:.1f}".format(bmi)
    bmr = "{:.1f}".format(bmr)
    tdee = "{:.1f}".format(tdee)
    calorie_goal = "{:.1f}".format(calorie_goal)
    
    bmr = f"{bmr} / Ngày"
    tdee = f"{tdee} / Ngày"
    calorie_goal = f"{calorie_goal} / Ngày "
    return bmi,bmr,tdee, calorie_goal

description_html = "<div style='text-align: center;'>Ứng dụng này giúp bạn đo lường chỉ số sức khỏe thông qua chỉ số BMI, BMR và TDEE và đưa ra lượng calo cần thiết mỗi ngày dựa trên mục tiêu của bạn.</div>"
# Create a Gradio interface

interface = gr.Interface(fn=do, inputs=inputs, outputs=outputs,allow_flagging="never",
                            title="Đo lường chỉ số sức khỏe", 
                            description=description_html)

# Launch the interface
interface.launch()