Spaces:
Build error
Build error
| import gradio as gr | |
| import pandas as pd | |
| import random | |
| from datetime import datetime, timedelta | |
| from groq import Groq | |
| # Initialize Groq API | |
| client = Groq(api_key="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") # Replace with your Groq API key | |
| # Predefined resource inference logic | |
| def infer_resources(schedule): | |
| resource_map = { | |
| "Excavation": {"labor": 10, "equipment": "Excavator", "material": "Soil"}, | |
| "Foundation": {"labor": 15, "equipment": "Concrete Mixer", "material": "Concrete"}, | |
| "Framing": {"labor": 20, "equipment": "Cranes", "material": "Steel"}, | |
| "Finishing": {"labor": 5, "equipment": "Hand Tools", "material": "Paint"} | |
| } | |
| inferred_resources = [] | |
| for _, row in schedule.iterrows(): | |
| task = row["task"] | |
| resources = resource_map.get(task, {"labor": 5, "equipment": "General", "material": "Standard"}) | |
| inferred_resources.append({ | |
| "task": task, | |
| "labor": resources["labor"], | |
| "equipment": resources["equipment"], | |
| "material": resources["material"] | |
| }) | |
| return pd.DataFrame(inferred_resources) | |
| # Fill missing columns | |
| def fill_missing_columns(schedule): | |
| # Generate random dates if missing | |
| if "start_date" not in schedule.columns: | |
| schedule["start_date"] = [ | |
| (datetime.now() + timedelta(days=random.randint(1, 30))).strftime("%Y-%m-%d") | |
| for _ in range(len(schedule)) | |
| ] | |
| if "end_date" not in schedule.columns: | |
| schedule["end_date"] = [ | |
| (datetime.strptime(start, "%Y-%m-%d") + timedelta(days=random.randint(5, 15))).strftime("%Y-%m-%d") | |
| for start in schedule["start_date"] | |
| ] | |
| return schedule | |
| # Mock optimization logic | |
| def mock_optimize_schedule(schedule_with_resources): | |
| optimized_schedule = [] | |
| conflicts = [] | |
| for _, row in schedule_with_resources.iterrows(): | |
| task = row["task"] | |
| start_date = row["start_date"] | |
| end_date = row["end_date"] | |
| labor = row["labor"] | |
| equipment = row["equipment"] | |
| material = row["material"] | |
| # Check for conflicts (mock logic) | |
| if labor > 20: # Example conflict condition | |
| conflicts.append(f"Task '{task}' exceeds labor capacity.") | |
| optimized_schedule.append({ | |
| "task": task, | |
| "start_date": start_date, | |
| "end_date": end_date, | |
| "labor": labor, | |
| "equipment": equipment, | |
| "material": material, | |
| "conflict": "Yes" if f"Task '{task}' exceeds labor capacity." in conflicts else "No" | |
| }) | |
| return pd.DataFrame(optimized_schedule), conflicts | |
| # Main function for resource optimization | |
| def optimize_resources(schedule_file): | |
| try: | |
| # Load schedule file | |
| schedule = pd.read_csv(schedule_file.name) | |
| # Ensure the 'task' column exists | |
| if "task" not in schedule.columns: | |
| raise ValueError("The uploaded schedule must contain a 'task' column.") | |
| # Fill missing columns | |
| schedule = fill_missing_columns(schedule) | |
| # Infer resources | |
| inferred_resources = infer_resources(schedule) | |
| schedule_with_resources = pd.concat([schedule, inferred_resources], axis=1) | |
| # Perform optimization (mocked for now) | |
| optimized_schedule_df, conflicts = mock_optimize_schedule(schedule_with_resources) | |
| return optimized_schedule_df, "\n".join(conflicts) if conflicts else "No conflicts detected." | |
| except Exception as e: | |
| return f"Error: {e}" | |
| # Define Gradio interface | |
| interface = gr.Interface( | |
| fn=optimize_resources, | |
| inputs=[ | |
| gr.File(label="Upload Schedule File (CSV)") | |
| ], | |
| outputs=[ | |
| gr.Dataframe(label="Optimized Schedule"), # Tabular output | |
| gr.Textbox(label="Conflicts") # Text output for conflict details | |
| ], | |
| title="Smart Construction Resource Loading", | |
| description="Upload a construction schedule with at least a 'task' column. The app will dynamically infer other details and optimize the schedule." | |
| ) | |
| # Launch the app | |
| if __name__ == "__main__": | |
| interface.launch() | |