Spaces:
Sleeping
Sleeping
File size: 4,349 Bytes
20f613e 8eec00c f4c0948 8eec00c 0d20623 20f613e a441a77 8eec00c c293c79 8eec00c c293c79 8eec00c 9446470 f943ddf 57921b2 0af71f6 f943ddf 9446470 9f7a981 f943ddf 0af71f6 57921b2 8ca0345 8cfdf35 c293c79 d0b48a1 d53a8f4 6e40716 d53a8f4 d0b48a1 c293c79 73426a1 d02d174 c293c79 d02d174 c293c79 20f613e ec1acd9 73426a1 20f613e 8eec00c 20f613e | 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 | import os
import gradio as gr
import numpy as np
from openai import OpenAI
from Sim_Setup_Fcns import (
load_and_crop_image, cluster_image, build_parcel_map,
get_cluster_labels, get_land_colors, plot_parcel_map_to_file
)
from Sim_Engine import run_full_simulation
from feedback_fcns import (
summarize_initial_conditions, plot_forage_map_to_file,
elk_feedback, usfs_feedback, simulate_and_summarize, full_response
)
from zone_utils import (
identify_zones, plot_labeled_zones,
assign_zone_labels, save_zone_info_to_excel,override_zone_id_and_label
)
# === Setup on Launch ===
img = load_and_crop_image("Carson_map.png")
clustered_img = cluster_image(img)
parcel_map, n_rows, n_cols = build_parcel_map(clustered_img)
cluster_labels = get_cluster_labels()
land_colors = get_land_colors()
plot_parcel_map_to_file(parcel_map, cluster_labels, land_colors, save_path="clustered_map.png")
# === Zoning ===
# 1. Identify contiguous zones
zone_map, zone_to_cluster = identify_zones(parcel_map, connectivity="queen")
# 2. Assign human-readable labels (before override)
zone_labels = assign_zone_labels(zone_to_cluster)
# === Manual override for mislabeled riparian zone ===
# First, update the zone label once
for zid, lbl in zone_labels.items():
if lbl == "A" and zone_to_cluster[zid] == 1:
zone_labels[zid] = "Riparian A1"
if lbl == "M" and zone_to_cluster[zid] == 1:
zone_labels[zid] = "Riparian A2"
# Then update all matching parcels
for i in range(n_rows):
for j in range(n_cols):
zone_id = zone_map[i, j]
if zone_labels.get(zone_id) == "Riparian A1":
parcel_map[i, j] = 2
if zone_labels.get(zone_id) == "Riparian A2":
parcel_map[i, j] = 2
#
# ⬇️ Add this block right after the override
zone_to_cluster = {}
for zone_id in np.unique(zone_map):
indices = np.argwhere(zone_map == zone_id)
if len(indices) > 0:
i, j = indices[0]
zone_to_cluster[zone_id] = parcel_map[i, j]
# 6. Plot labeled zones after override and mapping
plot_labeled_zones(zone_map, zone_labels, zone_to_cluster, save_path="zones_labeled.png")
# 5. Define cluster-to-class mapping (should stay after override)
cluster_to_class = {
0: "desert",
1: "pasture",
2: "riparain",
3: "sensitive riparian",
4: "wetland",
5: "water"
}
# 7. Save zone info to Excel
zone_excel_path = "zone_info.xlsx"
save_zone_info_to_excel(
parcel_map, zone_map, zone_labels, zone_to_cluster, cluster_to_class,
save_path=zone_excel_path
)
client = OpenAI(api_key=os.environ.get("OPENAI_API_KEY"))
# === Gradio App ===
with gr.Blocks() as demo:
gr.Markdown("# AGEC 3052 — Grazing Strategy Simulation")
gr.Image(value="clustered_map.png", label="Initial 25×25 Parcel Layout")
gr.Image(value="zones_labeled.png", label="Labeled Pasture & Riparian Zones")
# ✅ Downloadable Excel
gr.File(value=zone_excel_path, label="Download Zone Info (Excel)")
plan = gr.Radio(["Conservative", "Normal", "Aggressive"], label="Grazing Plan")
essay = gr.Textbox(lines=8, label="Your Essay Justifying the Plan")
elk_output = gr.Textbox(label="Elk Stakeholder Feedback")
usfs_output = gr.Textbox(label="USFS Feedback")
sim_output = gr.Textbox(label="Simulation Results", lines=2)
sim_image = gr.Image(label="Forage Map After Simulation", type="filepath")
round_counter = gr.State(value=1)
history = gr.State(value=[summarize_initial_conditions(n_rows, n_cols)])
def submit_handler(plan_choice, essay_text, history_val):
return full_response(plan_choice, essay_text, history_val[-1])
def sim_handler(plan_choice, round_val, history_val):
summary, map_path, new_round = simulate_and_summarize(
plan_choice, round_val, parcel_map, cluster_labels, n_rows, n_cols,
run_full_simulation, history_val
)
history_val.append(summary)
return summary, map_path, new_round, history_val
submit_btn = gr.Button("Submit Grazing Plan")
sim_btn = gr.Button("Run Simulation")
submit_btn.click(fn=submit_handler, inputs=[plan, essay, history], outputs=[elk_output, usfs_output])
sim_btn.click(fn=sim_handler, inputs=[plan, round_counter, history], outputs=[sim_output, sim_image, round_counter, history])
demo.launch()
|