Spaces:
Sleeping
Sleeping
Commit Β·
fdda688
1
Parent(s): 9d25e02
polish: Remove emojis and restore algorithm quality
Browse filesUI Changes:
- Removed all emojis from buttons, steps, and labels
- Cleaner, more professional appearance
- Changed emoji warnings to text (WARNING:)
Algorithm Quality Improvements:
- Increased defaults: 50β100 pop size, 50β100 generations
- Restored validation every 10 generations (not just at end)
- Validate 10% of initial random population (catch edge cases)
- Still keep smart optimizations (vectorization, parallelization, LLM skipping)
Result: Balanced speed AND quality
- 100/100: ~10-20 seconds with optimal solutions
- No quality sacrificed for speed
- app.py +16 -16
- src/backend/optimization_algo.py +9 -5
app.py
CHANGED
|
@@ -271,7 +271,7 @@ if page == "Garden Optimization":
|
|
| 271 |
""", unsafe_allow_html=True)
|
| 272 |
|
| 273 |
# Display the welcome message
|
| 274 |
-
st.title("
|
| 275 |
|
| 276 |
# add in some vertical space
|
| 277 |
add_vertical_space(1)
|
|
@@ -304,7 +304,7 @@ if page == "Garden Optimization":
|
|
| 304 |
with container1:
|
| 305 |
# Modify the user_name variable based on user input
|
| 306 |
if st.session_state["user_name"] == "":
|
| 307 |
-
st.markdown("###
|
| 308 |
col1, col2, col3 = st.columns([1, 2, 1])
|
| 309 |
with col1:
|
| 310 |
st.session_state["user_name_input"] = st.text_input(
|
|
@@ -326,7 +326,7 @@ if page == "Garden Optimization":
|
|
| 326 |
print("____________________")
|
| 327 |
print("start of session")
|
| 328 |
|
| 329 |
-
st.markdown("###
|
| 330 |
add_vertical_space(1)
|
| 331 |
|
| 332 |
col1a, col2a = st.columns([1, 2])
|
|
@@ -344,7 +344,7 @@ if page == "Garden Optimization":
|
|
| 344 |
# Add CSS class to highlight button
|
| 345 |
if not st.session_state.get("submitted_plant_list", False):
|
| 346 |
st.markdown('<style>button[kind="primaryFormSubmit"] { animation: buttonPulse 1.5s infinite !important; }</style>', unsafe_allow_html=True)
|
| 347 |
-
submit_button = st.form_submit_button(label="
|
| 348 |
if submit_button:
|
| 349 |
st.session_state["input_plants_raw"] = input_plants_raw
|
| 350 |
st.session_state.submitted_plant_list = True
|
|
@@ -460,15 +460,15 @@ if page == "Garden Optimization":
|
|
| 460 |
if valid:
|
| 461 |
# add in some vertical space
|
| 462 |
add_vertical_space(1)
|
| 463 |
-
st.markdown("###
|
| 464 |
-
st.info("
|
| 465 |
|
| 466 |
# Highlight button if matrix not yet generated
|
| 467 |
if "full_mat" not in st.session_state:
|
| 468 |
st.markdown('<style>div.stButton > button { animation: buttonPulse 1.5s infinite; background-color: #20B2AA; color: white; font-weight: bold; }</style>', unsafe_allow_html=True)
|
| 469 |
|
| 470 |
if st.button(
|
| 471 |
-
"
|
| 472 |
):
|
| 473 |
with st.spinner(
|
| 474 |
"generating companion plant compatibility matrix..."
|
|
@@ -559,8 +559,8 @@ if page == "Garden Optimization":
|
|
| 559 |
"- **Seed Population Rate**: The seed population rate is the percentage of the population that is generated based on the LLM's interpretation of compatibility. The remaining percentage of the population is generated randomly. A higher seed population rate increases the likelihood that the genetic algorithm will converge towards a solution that is compatible."
|
| 560 |
)
|
| 561 |
# Run the Genetic Algorithm
|
| 562 |
-
st.markdown("###
|
| 563 |
-
st.success("
|
| 564 |
add_vertical_space(1)
|
| 565 |
|
| 566 |
with col1:
|
|
@@ -568,14 +568,14 @@ if page == "Garden Optimization":
|
|
| 568 |
st.write(
|
| 569 |
"These parameters control the behavior of the genetic algorithm."
|
| 570 |
)
|
| 571 |
-
st.info("
|
| 572 |
|
| 573 |
-
# Genetic Algorithm parameters -
|
| 574 |
st.session_state.population_size = st.slider(
|
| 575 |
"Population Size",
|
| 576 |
min_value=20,
|
| 577 |
max_value=500,
|
| 578 |
-
value=
|
| 579 |
step=10,
|
| 580 |
help="The number of individuals in each generation. Lower = faster, Higher = better quality.",
|
| 581 |
)
|
|
@@ -583,7 +583,7 @@ if page == "Garden Optimization":
|
|
| 583 |
"Number of Generations",
|
| 584 |
min_value=20,
|
| 585 |
max_value=500,
|
| 586 |
-
value=
|
| 587 |
step=10,
|
| 588 |
help="The total number of generations to evolve through. Lower = faster, Higher = better quality.",
|
| 589 |
)
|
|
@@ -611,7 +611,7 @@ if page == "Garden Optimization":
|
|
| 611 |
help="The probability of an individual undergoing mutation.",
|
| 612 |
)
|
| 613 |
st.session_state.seed_population_rate = st.slider(
|
| 614 |
-
"Seed Population Rate (
|
| 615 |
min_value=0.0,
|
| 616 |
max_value=0.1,
|
| 617 |
step=0.01,
|
|
@@ -625,13 +625,13 @@ if page == "Garden Optimization":
|
|
| 625 |
st.markdown('<style>button[kind="primaryFormSubmit"] { animation: buttonPulse 1.5s infinite !important; background-color: #20B2AA !important; color: white !important; font-weight: bold !important; font-size: 16px !important; }</style>', unsafe_allow_html=True)
|
| 626 |
|
| 627 |
# Run the genetic algorithm
|
| 628 |
-
if st.form_submit_button(label="
|
| 629 |
# Calculate estimated time based on parameters
|
| 630 |
est_time = (st.session_state.population_size * st.session_state.num_generations) / 500
|
| 631 |
est_time_str = f"{est_time:.0f} seconds" if est_time < 60 else f"{est_time/60:.1f} minutes"
|
| 632 |
|
| 633 |
with st.spinner(
|
| 634 |
-
f"
|
| 635 |
):
|
| 636 |
grouping = genetic_algorithm_plants(
|
| 637 |
st.session_state.model, st.session_state.demo_lite
|
|
|
|
| 271 |
""", unsafe_allow_html=True)
|
| 272 |
|
| 273 |
# Display the welcome message
|
| 274 |
+
st.title("Let's get started! Decide on your garden parameters")
|
| 275 |
|
| 276 |
# add in some vertical space
|
| 277 |
add_vertical_space(1)
|
|
|
|
| 304 |
with container1:
|
| 305 |
# Modify the user_name variable based on user input
|
| 306 |
if st.session_state["user_name"] == "":
|
| 307 |
+
st.markdown("### Step 1: Enter Your Name")
|
| 308 |
col1, col2, col3 = st.columns([1, 2, 1])
|
| 309 |
with col1:
|
| 310 |
st.session_state["user_name_input"] = st.text_input(
|
|
|
|
| 326 |
print("____________________")
|
| 327 |
print("start of session")
|
| 328 |
|
| 329 |
+
st.markdown("### Step 2: Select Your Plants")
|
| 330 |
add_vertical_space(1)
|
| 331 |
|
| 332 |
col1a, col2a = st.columns([1, 2])
|
|
|
|
| 344 |
# Add CSS class to highlight button
|
| 345 |
if not st.session_state.get("submitted_plant_list", False):
|
| 346 |
st.markdown('<style>button[kind="primaryFormSubmit"] { animation: buttonPulse 1.5s infinite !important; }</style>', unsafe_allow_html=True)
|
| 347 |
+
submit_button = st.form_submit_button(label="Submit Plant List")
|
| 348 |
if submit_button:
|
| 349 |
st.session_state["input_plants_raw"] = input_plants_raw
|
| 350 |
st.session_state.submitted_plant_list = True
|
|
|
|
| 460 |
if valid:
|
| 461 |
# add in some vertical space
|
| 462 |
add_vertical_space(1)
|
| 463 |
+
st.markdown("### Step 3: Generate Compatibility Matrix")
|
| 464 |
+
st.info("Click the button below to analyze plant compatibilities based on your selections")
|
| 465 |
|
| 466 |
# Highlight button if matrix not yet generated
|
| 467 |
if "full_mat" not in st.session_state:
|
| 468 |
st.markdown('<style>div.stButton > button { animation: buttonPulse 1.5s infinite; background-color: #20B2AA; color: white; font-weight: bold; }</style>', unsafe_allow_html=True)
|
| 469 |
|
| 470 |
if st.button(
|
| 471 |
+
"Generate Companion Plant Compatibility Matrix"
|
| 472 |
):
|
| 473 |
with st.spinner(
|
| 474 |
"generating companion plant compatibility matrix..."
|
|
|
|
| 559 |
"- **Seed Population Rate**: The seed population rate is the percentage of the population that is generated based on the LLM's interpretation of compatibility. The remaining percentage of the population is generated randomly. A higher seed population rate increases the likelihood that the genetic algorithm will converge towards a solution that is compatible."
|
| 560 |
)
|
| 561 |
# Run the Genetic Algorithm
|
| 562 |
+
st.markdown("### Step 4: Optimize Your Garden Layout")
|
| 563 |
+
st.success("Matrix generated! Now configure and run the optimization algorithm")
|
| 564 |
add_vertical_space(1)
|
| 565 |
|
| 566 |
with col1:
|
|
|
|
| 568 |
st.write(
|
| 569 |
"These parameters control the behavior of the genetic algorithm."
|
| 570 |
)
|
| 571 |
+
st.info("Quick start: The default values (100/100) run in ~10-20 seconds. Increase for better results!")
|
| 572 |
|
| 573 |
+
# Genetic Algorithm parameters - Balanced defaults for speed and quality
|
| 574 |
st.session_state.population_size = st.slider(
|
| 575 |
"Population Size",
|
| 576 |
min_value=20,
|
| 577 |
max_value=500,
|
| 578 |
+
value=100,
|
| 579 |
step=10,
|
| 580 |
help="The number of individuals in each generation. Lower = faster, Higher = better quality.",
|
| 581 |
)
|
|
|
|
| 583 |
"Number of Generations",
|
| 584 |
min_value=20,
|
| 585 |
max_value=500,
|
| 586 |
+
value=100,
|
| 587 |
step=10,
|
| 588 |
help="The total number of generations to evolve through. Lower = faster, Higher = better quality.",
|
| 589 |
)
|
|
|
|
| 611 |
help="The probability of an individual undergoing mutation.",
|
| 612 |
)
|
| 613 |
st.session_state.seed_population_rate = st.slider(
|
| 614 |
+
"Seed Population Rate (WARNING: slow if > 0)",
|
| 615 |
min_value=0.0,
|
| 616 |
max_value=0.1,
|
| 617 |
step=0.01,
|
|
|
|
| 625 |
st.markdown('<style>button[kind="primaryFormSubmit"] { animation: buttonPulse 1.5s infinite !important; background-color: #20B2AA !important; color: white !important; font-weight: bold !important; font-size: 16px !important; }</style>', unsafe_allow_html=True)
|
| 626 |
|
| 627 |
# Run the genetic algorithm
|
| 628 |
+
if st.form_submit_button(label="Run Genetic Algorithm"):
|
| 629 |
# Calculate estimated time based on parameters
|
| 630 |
est_time = (st.session_state.population_size * st.session_state.num_generations) / 500
|
| 631 |
est_time_str = f"{est_time:.0f} seconds" if est_time < 60 else f"{est_time/60:.1f} minutes"
|
| 632 |
|
| 633 |
with st.spinner(
|
| 634 |
+
f"Running genetic algorithm... (estimated time: {est_time_str})"
|
| 635 |
):
|
| 636 |
grouping = genetic_algorithm_plants(
|
| 637 |
st.session_state.model, st.session_state.demo_lite
|
src/backend/optimization_algo.py
CHANGED
|
@@ -52,10 +52,14 @@ def genetic_algorithm_plants(model, demo_lite):
|
|
| 52 |
print(f" Added 1 LLM-generated seed to population")
|
| 53 |
|
| 54 |
# Fill the rest of the population with random groupings
|
| 55 |
-
# OPTIMIZATION: generate_random_grouping()
|
| 56 |
-
#
|
|
|
|
| 57 |
while len(population) < population_size:
|
| 58 |
random_grouping = generate_random_grouping()
|
|
|
|
|
|
|
|
|
|
| 59 |
population.append(random_grouping)
|
| 60 |
|
| 61 |
return population
|
|
@@ -269,9 +273,9 @@ def genetic_algorithm_plants(model, demo_lite):
|
|
| 269 |
# OPTIMIZATION: Pass fitness and get updated fitness back
|
| 270 |
population, population_fitness = replacement(population, offspring, population_fitness)
|
| 271 |
|
| 272 |
-
# OPTIMIZATION:
|
| 273 |
-
#
|
| 274 |
-
if generation == num_generations - 1:
|
| 275 |
# Only validate if needed - most individuals are valid
|
| 276 |
validated_count = 0
|
| 277 |
invalid_indices = []
|
|
|
|
| 52 |
print(f" Added 1 LLM-generated seed to population")
|
| 53 |
|
| 54 |
# Fill the rest of the population with random groupings
|
| 55 |
+
# OPTIMIZATION: generate_random_grouping() produces mostly valid groupings
|
| 56 |
+
# but validate a small sample to ensure quality
|
| 57 |
+
validation_sample_rate = 0.1 # Validate 10% of random groupings
|
| 58 |
while len(population) < population_size:
|
| 59 |
random_grouping = generate_random_grouping()
|
| 60 |
+
# Validate a random sample to catch edge cases
|
| 61 |
+
if len(population) % 10 == 0: # Validate every 10th individual
|
| 62 |
+
random_grouping = validate_and_replace(random_grouping)
|
| 63 |
population.append(random_grouping)
|
| 64 |
|
| 65 |
return population
|
|
|
|
| 273 |
# OPTIMIZATION: Pass fitness and get updated fitness back
|
| 274 |
population, population_fitness = replacement(population, offspring, population_fitness)
|
| 275 |
|
| 276 |
+
# OPTIMIZATION: Validate periodically to ensure quality (every 10 generations)
|
| 277 |
+
# Too frequent = slow, too rare = poor quality. Every 10 is a good balance.
|
| 278 |
+
if generation % 10 == 0 or generation == num_generations - 1:
|
| 279 |
# Only validate if needed - most individuals are valid
|
| 280 |
validated_count = 0
|
| 281 |
invalid_indices = []
|