Pair {i} - 🤖 LLM Selected (Similarity: {similarity_score:.3f})
Effect: {pair['effect']}
Technology: {pair['mechanism']['technology']}
Subject: {pair['mechanism']['subject']}
Action: {pair['mechanism']['action']}
Object: {pair['mechanism']['object']}
Knowledge: {pair['mechanism']['knowledge']}
Effect: {pair['mechanism']['effect']}
""", unsafe_allow_html=True)
with col2:
# Create two columns for navigation buttons
nav_col1, nav_col2 = st.columns(2)
with nav_col1:
# Previous mechanism button
if st.button(f"⏮️ Prev #{i}", key=f"prev_{i}", use_container_width=True):
if effect_key in st.session_state.mechanism_indices and effect_key in st.session_state.top_50_mechanisms:
current_idx = st.session_state.mechanism_indices[effect_key]
max_idx = len(st.session_state.top_50_mechanisms[effect_key]) - 1
# Circular navigation: if at first (0), go to last
if current_idx <= 0:
st.session_state.mechanism_indices[effect_key] = max_idx
else:
st.session_state.mechanism_indices[effect_key] = current_idx - 1
new_idx = st.session_state.mechanism_indices[effect_key]
st.session_state.mechanisms[i-1] = st.session_state.top_50_mechanisms[effect_key][new_idx]
# Reset solution when mechanism changes
st.session_state.solution = ""
st.rerun()
with nav_col2:
# Next mechanism button
if st.button(f"⏭️ Next #{i}", key=f"next_{i}", use_container_width=True):
if effect_key in st.session_state.mechanism_indices and effect_key in st.session_state.top_50_mechanisms:
current_idx = st.session_state.mechanism_indices[effect_key]
max_idx = len(st.session_state.top_50_mechanisms[effect_key]) - 1
# Circular navigation: if at last, go to first (0)
if current_idx >= max_idx:
st.session_state.mechanism_indices[effect_key] = 0
else:
st.session_state.mechanism_indices[effect_key] = current_idx + 1
new_idx = st.session_state.mechanism_indices[effect_key]
st.session_state.mechanisms[i-1] = st.session_state.top_50_mechanisms[effect_key][new_idx]
# Reset solution when mechanism changes
st.session_state.solution = ""
st.rerun()
# Reset button - now resets to LLM-selected mechanism
if st.button(f"🔄 Reset #{i}", key=f"reset_{i}", use_container_width=True):
if effect_key in st.session_state.original_llm_indices:
# Reset to original LLM-selected index instead of 0
original_idx = st.session_state.original_llm_indices[effect_key]
st.session_state.mechanism_indices[effect_key] = original_idx
if effect_key in st.session_state.top_50_mechanisms:
st.session_state.mechanisms[i-1] = st.session_state.top_50_mechanisms[effect_key][original_idx]
# Reset solution when mechanism changes
st.session_state.solution = ""
st.rerun()
# Show current position
if effect_key in st.session_state.mechanism_indices and effect_key in st.session_state.top_50_mechanisms:
current = st.session_state.mechanism_indices[effect_key] + 1
total = len(st.session_state.top_50_mechanisms[effect_key])
st.caption(f"📍 {current}/{total}")
# Show navigation hint
if total > 1:
st.caption("🔄 Circular navigation enabled")
col1, col2, col3 = st.columns([1, 1, 1])
with col1:
if st.button("⬅️ Back to Effects", use_container_width=True):
st.session_state.step = 2
st.rerun()
with col3:
if st.button("🚀 Generate Solution", type="primary", use_container_width=True):
st.session_state.step = 4
st.rerun()
def render_step4(self):
"""Render Step 4: Solution Generation"""
st.markdown('', unsafe_allow_html=True)
if not st.session_state.solution:
with st.spinner("✨ Generating your solution..."):
solution = self.generate_solution(st.session_state.problem, st.session_state.mechanisms)
st.session_state.solution = solution
st.rerun()
if st.session_state.solution:
st.markdown("**Generated Solution:**")
# Render the solution as markdown with custom styling
st.markdown(
f"""