dindizz's picture
Update app.py
b4993ec verified
raw
history blame
7.32 kB
import gradio as gr
import numpy as np
from scipy.optimize import linprog
# Example data: Nutritional Information and Cost for the healthiest dishes
nutritional_data = {
"Idli with Vegetable Sambar": {
"Energy (kcal)": 100, "Protein (g)": 5.5, "Fat (g)": 1.5, "Carbohydrate (g)": 17.0, "Fiber (g)": 3.0,
"Calcium (mg)": 35, "Iron (mg)": 1.0, "Vitamin C (mg)": 8.0,
"Chennai": 50, "Bengaluru": 55, "Hyderabad": 50, "New Delhi": 60
},
"Khichdi": {
"Energy (kcal)": 120, "Protein (g)": 4.0, "Fat (g)": 2.5, "Carbohydrate (g)": 20.0, "Fiber (g)": 2.5,
"Calcium (mg)": 40, "Iron (mg)": 1.0, "Vitamin C (mg)": 5.0,
"Chennai": 60, "Bengaluru": 65, "Hyderabad": 60, "New Delhi": 70
},
"Tandoori Chicken": {
"Energy (kcal)": 150, "Protein (g)": 18.0, "Fat (g)": 7.0, "Carbohydrate (g)": 3.0, "Fiber (g)": 0.5,
"Calcium (mg)": 15, "Iron (mg)": 1.2, "Vitamin C (mg)": 1.5,
"Chennai": 150, "Bengaluru": 160, "Hyderabad": 150, "New Delhi": 180
},
"Palak Paneer": {
"Energy (kcal)": 140, "Protein (g)": 7.5, "Fat (g)": 10.0, "Carbohydrate (g)": 6.0, "Fiber (g)": 3.0,
"Calcium (mg)": 200, "Iron (mg)": 3.0, "Vitamin C (mg)": 15.0,
"Chennai": 100, "Bengaluru": 110, "Hyderabad": 100, "New Delhi": 120
},
"Raita": {
"Energy (kcal)": 60, "Protein (g)": 3.5, "Fat (g)": 2.0, "Carbohydrate (g)": 6.5, "Fiber (g)": 0.5,
"Calcium (mg)": 100, "Iron (mg)": 0.5, "Vitamin C (mg)": 2.0,
"Chennai": 30, "Bengaluru": 35, "Hyderabad": 30, "New Delhi": 40
},
"Rajma": {
"Energy (kcal)": 140, "Protein (g)": 7.5, "Fat (g)": 5.0, "Carbohydrate (g)": 20.0, "Fiber (g)": 6.0,
"Calcium (mg)": 50, "Iron (mg)": 3.5, "Vitamin C (mg)": 4.0,
"Chennai": 80, "Bengaluru": 90, "Hyderabad": 80, "New Delhi": 100
},
"Baingan Bharta": {
"Energy (kcal)": 70, "Protein (g)": 2.5, "Fat (g)": 3.0, "Carbohydrate (g)": 10.0, "Fiber (g)": 4.0,
"Calcium (mg)": 30, "Iron (mg)": 0.7, "Vitamin C (mg)": 6.0,
"Chennai": 50, "Bengaluru": 55, "Hyderabad": 50, "New Delhi": 60
},
"Besan Chilla": {
"Energy (kcal)": 180, "Protein (g)": 8.0, "Fat (g)": 7.0, "Carbohydrate (g)": 20.0, "Fiber (g)": 5.0,
"Calcium (mg)": 30, "Iron (mg)": 2.5, "Vitamin C (mg)": 1.0,
"Chennai": 60, "Bengaluru": 65, "Hyderabad": 60, "New Delhi": 70
},
"Masoor Dal": {
"Energy (kcal)": 110, "Protein (g)": 7.5, "Fat (g)": 2.0, "Carbohydrate (g)": 16.0, "Fiber (g)": 5.5,
"Calcium (mg)": 25, "Iron (mg)": 3.0, "Vitamin C (mg)": 4.0,
"Chennai": 70, "Bengaluru": 75, "Hyderabad": 70, "New Delhi": 80
},
"Upma": {
"Energy (kcal)": 150, "Protein (g)": 4.0, "Fat (g)": 6.0, "Carbohydrate (g)": 25.0, "Fiber (g)": 3.0,
"Calcium (mg)": 30, "Iron (mg)": 1.0, "Vitamin C (mg)": 3.0,
"Chennai": 40, "Bengaluru": 45, "Hyderabad": 40, "New Delhi": 50
}
}
def display_dishes_in_city(city):
"""Displays all dishes available in the selected city with their nutritional information and cost."""
result_str = f"### Available Dishes in {city}:\n"
for dish, info in nutritional_data.items():
result_str += f"- **{dish}**\n"
result_str += f" - Cost: ₹{info[city]}\n"
result_str += f" - Energy: {info['Energy (kcal)']} kcal\n"
result_str += f" - Protein: {info['Protein (g)']} g\n"
result_str += f" - Fat: {info['Fat (g)']} g\n"
result_str += f" - Carbohydrate: {info['Carbohydrate (g)']} g\n"
result_str += f" - Fiber: {info['Fiber (g)']} g\n"
result_str += f" - Calcium: {info['Calcium (mg)']} mg\n"
result_str += f" - Iron: {info['Iron (mg)']} mg\n"
result_str += f" - Vitamin C: {info['Vitamin C (mg)']} mg\n\n"
return result_str
def optimize_dishes_for_budget(city, daily_budget):
# Extracting cost, calories, and protein data for the selected city
costs = [nutritional_data[dish][city] for dish in nutritional_data]
calories = [nutritional_data[dish]["Energy (kcal)"] for dish in nutritional_data]
proteins = [nutritional_data[dish]["Protein (g)"] for dish in nutritional_data]
# Objective function: Maximize nutritional value (calories + protein)
c = [-1 * (cal + prot) for cal, prot in zip(calories, proteins)] # Minimize negative of nutrition for maximization
# Constraint: Total cost must not exceed the daily budget
A_ub = [costs] # Sum of costs * portions <= daily_budget
b_ub = [daily_budget]
# Bounds for each dish (x >= 0)
bounds = [(0, None) for _ in costs]
# Solve the optimization problem
result = linprog(c, A_ub=A_ub, b_ub=b_ub, bounds=bounds, method='highs')
if result.success:
selected_dishes = [dish for i, dish in enumerate(nutritional_data) if result.x[i] > 1e-5]
quantities = result.x
total_cost = sum(cost * qty for cost, qty in zip(costs, quantities))
total_calories = sum(cal * qty for cal, qty in zip(calories, quantities))
total_protein = sum(prot * qty for prot, qty in zip(proteins, quantities))
result_str = f"### Best Combination of Dishes for ₹{daily_budget:.2f} in {city}:\n"
for dish, qty in zip(selected_dishes, quantities):
if qty > 1e-5:
result_str += f"- **{dish}**: {qty:.2f} portions\n"
result_str += f"\n### Total Cost: ₹{total_cost:.2f}\n"
result_str += f"### Total Calories: {total_calories:.2f} kcal\n"
result_str += f"### Total Protein: {total_protein:.2f} g\n"
return result_str
else:
return f"No feasible solution found for ₹{daily_budget:.2f} in {city}."
# Gradio Interface
def create_interface():
cities = ["Chennai", "Bengaluru", "Hyderabad", "New Delhi"]
with gr.Blocks() as demo:
gr.Markdown("# Daily Budget Optimization for Best Nutrition")
# User inputs for city and daily budget
city_selector = gr.Dropdown(choices=cities, label="Select City")
budget_input = gr.Number(label="Daily Budget (₹)", value=300)
show_all_dishes_button = gr.Button("Show All Available Dishes")
optimize_button = gr.Button("Optimize Nutrition")
all_dishes_output = gr.Markdown(label="All Available Dishes")
optimization_output = gr.Markdown(label="Optimization Results")
# Function to handle showing all dishes
def show_all_dishes(city):
return display_dishes_in_city(city)
# Function to handle optimization
def run_optimization(city, daily_budget):
return optimize_dishes_for_budget(city, daily_budget)
show_all_dishes_button.click(fn=show_all_dishes, inputs=[city_selector], outputs=all_dishes_output)
optimize_button.click(fn=run_optimization, inputs=[city_selector, budget_input], outputs=optimization_output)
gr.Row([city_selector, budget_input])
gr.Row(optimize_button)
gr.Row(optimization_output)
gr.Row(show_all_dishes_button)
gr.Row(all_dishes_output)
return demo
# Launch the interface
demo = create_interface()
demo.launch(share=True)