File size: 9,311 Bytes
d3d8124 de3a711 227fa34 de3a711 d3d8124 227fa34 d3d8124 de3a711 d3d8124 de3a711 d3d8124 de3a711 d3d8124 de3a711 227fa34 d3d8124 de3a711 227fa34 d3d8124 de3a711 d3d8124 de3a711 d3d8124 227fa34 d3d8124 de3a711 227fa34 d3d8124 227fa34 d3d8124 de3a711 d3d8124 227fa34 d3d8124 de3a711 227fa34 d3d8124 227fa34 d3d8124 de3a711 d3d8124 de3a711 d3d8124 de3a711 227fa34 d3d8124 de3a711 d3d8124 227fa34 de3a711 227fa34 de3a711 227fa34 de3a711 227fa34 de3a711 227fa34 |
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 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 |
# UI.py
import gradio as gr
# La importaci贸n de process_and_plot ya no es necesaria aqu铆,
# la funci贸n de procesamiento se pasar谩 como argumento a create_interface.
def create_interface(process_function_for_button):
"""
Esta funci贸n crea la interfaz de usuario y la devuelve.
Conecta el bot贸n de submit a la 'process_function_for_button' proporcionada.
"""
with gr.Blocks(theme='upsatwal/mlsc_tiet') as demo: # O usa gr.themes.Soft() o tu theme preferido
gr.Markdown("# Modelado de Bioprocesos con Ecuaciones Personalizadas y An谩lisis por IA")
with gr.Row():
with gr.Column(scale=2):
gr.Markdown("### Carga de Datos y Configuraci贸n General")
file_input = gr.File(label="Subir archivo Excel (.xlsx)", file_types=[".xlsx"])
show_legend_ui = gr.Checkbox(label="Mostrar leyenda en gr谩ficos", value=True)
show_params_ui = gr.Checkbox(label="Mostrar par谩metros ajustados en gr谩ficos", value=True)
legend_position_ui = gr.Dropdown(
label="Posici贸n de la leyenda",
choices=['best', 'upper right', 'upper left', 'lower right', 'lower left', 'center left', 'center right', 'lower center', 'upper center', 'center'],
value='best'
)
with gr.Column(scale=1):
gr.Markdown("### Conteo de Ecuaciones a Probar")
biomass_eq_count_ui = gr.Number(label="Biomasa (1-3)", value=1, minimum=1, maximum=3, precision=0, step=1)
substrate_eq_count_ui = gr.Number(label="Sustrato (1-3)", value=1, minimum=1, maximum=3, precision=0, step=1)
product_eq_count_ui = gr.Number(label="Producto (1-3)", value=1, minimum=1, maximum=3, precision=0, step=1)
# --- Secci贸n de Biomasa ---
with gr.Accordion("Ecuaciones y Par谩metros de Biomasa", open=True):
with gr.Row():
with gr.Column():
biomass_eq1_ui = gr.Textbox(label="Ecuaci贸n de Biomasa 1", value="Xm * (1 - exp(-um * (t - t_lag)))", lines=2, placeholder="Ej: Xm * (1 - exp(-um * (t - t_lag)))")
biomass_param1_ui = gr.Textbox(label="Par谩metros Biomasa 1", value="Xm, um, t_lag", info="Nombres de par谩metros, coma sep. Use 't' para tiempo. 'X_val' para X(t) en S/P.")
biomass_bound1_ui = gr.Textbox(label="L铆mites Biomasa 1", value="(0, np.inf), (0, np.inf), (0, np.inf)", info="Formato: (low,high) para cada param. Use np.inf.")
# Columna 2 para Biomasa (inicialmente oculta)
biomass_col2 = gr.Column(visible=False)
with biomass_col2:
biomass_eq2_ui = gr.Textbox(label="Ecuaci贸n de Biomasa 2", value="X0 * exp(um * t)", lines=2)
biomass_param2_ui = gr.Textbox(label="Par谩metros Biomasa 2", value="X0, um")
biomass_bound2_ui = gr.Textbox(label="L铆mites Biomasa 2", value="(0, np.inf), (0, np.inf)")
# Columna 3 para Biomasa (inicialmente oculta)
biomass_col3 = gr.Column(visible=False)
with biomass_col3:
biomass_eq3_ui = gr.Textbox(label="Ecuaci贸n de Biomasa 3", lines=2)
biomass_param3_ui = gr.Textbox(label="Par谩metros Biomasa 3")
biomass_bound3_ui = gr.Textbox(label="L铆mites Biomasa 3")
# --- Secci贸n de Sustrato ---
with gr.Accordion("Ecuaciones y Par谩metros de Sustrato", open=True):
gr.Markdown("Para ecuaciones de Sustrato y Producto que dependen de la biomasa X(t), usa la variable `X_val` en tu ecuaci贸n. Ejemplo: `S0 - (X_val / YXS)`.")
with gr.Row():
with gr.Column():
substrate_eq1_ui = gr.Textbox(label="Ecuaci贸n de Sustrato 1", value="S0 - (X_val / YXS) - mS * t", lines=2)
substrate_param1_ui = gr.Textbox(label="Par谩metros Sustrato 1", value="S0, YXS, mS")
substrate_bound1_ui = gr.Textbox(label="L铆mites Sustrato 1", value="(0, np.inf), (1e-9, np.inf), (0, np.inf)") # YXS no debe ser cero
substrate_col2 = gr.Column(visible=False)
with substrate_col2:
substrate_eq2_ui = gr.Textbox(label="Ecuaci贸n de Sustrato 2", lines=2)
substrate_param2_ui = gr.Textbox(label="Par谩metros Sustrato 2")
substrate_bound2_ui = gr.Textbox(label="L铆mites Sustrato 2")
substrate_col3 = gr.Column(visible=False)
with substrate_col3:
substrate_eq3_ui = gr.Textbox(label="Ecuaci贸n de Sustrato 3", lines=2)
substrate_param3_ui = gr.Textbox(label="Par谩metros Sustrato 3")
substrate_bound3_ui = gr.Textbox(label="L铆mites Sustrato 3")
# --- Secci贸n de Producto ---
with gr.Accordion("Ecuaciones y Par谩metros de Producto", open=True):
with gr.Row():
with gr.Column():
product_eq1_ui = gr.Textbox(label="Ecuaci贸n de Producto 1", value="P0 + YPX * X_val + mP * t", lines=2)
product_param1_ui = gr.Textbox(label="Par谩metros Producto 1", value="P0, YPX, mP")
product_bound1_ui = gr.Textbox(label="L铆mites Producto 1", value="(0, np.inf), (0, np.inf), (0, np.inf)")
product_col2 = gr.Column(visible=False)
with product_col2:
product_eq2_ui = gr.Textbox(label="Ecuaci贸n de Producto 2", lines=2)
product_param2_ui = gr.Textbox(label="Par谩metros Producto 2")
product_bound2_ui = gr.Textbox(label="L铆mites Producto 2")
product_col3 = gr.Column(visible=False)
with product_col3:
product_eq3_ui = gr.Textbox(label="Ecuaci贸n de Producto 3", lines=2)
product_param3_ui = gr.Textbox(label="Par谩metros Producto 3")
product_bound3_ui = gr.Textbox(label="L铆mites Producto 3")
# L贸gica para mostrar/ocultar campos de ecuaci贸n din谩micamente
# La funci贸n `update_visibility` devuelve una tupla de diccionarios para Gradio
def update_visibility_fn(count):
return gr.Column(visible=count >= 2), gr.Column(visible=count >= 3)
biomass_eq_count_ui.change(fn=update_visibility_fn, inputs=biomass_eq_count_ui, outputs=[biomass_col2, biomass_col3])
substrate_eq_count_ui.change(fn=update_visibility_fn, inputs=substrate_eq_count_ui, outputs=[substrate_col2, substrate_col3])
product_eq_count_ui.change(fn=update_visibility_fn, inputs=product_eq_count_ui, outputs=[product_col2, product_col3])
submit_button = gr.Button("Procesar y Analizar", variant="primary", scale=1)
gr.Markdown("## Resultados del An谩lisis")
with gr.Row():
image_output = gr.Image(label="Gr谩fico Generado", type="pil", width=600, height=900, scale=2, show_download_button=True)
with gr.Column(scale=3):
analysis_output = gr.Markdown(label="An谩lisis del Modelo por IA")
# Lista de todos los inputs para el bot贸n de submit
all_inputs_for_button = [
file_input,
biomass_eq1_ui, biomass_eq2_ui, biomass_eq3_ui,
biomass_param1_ui, biomass_param2_ui, biomass_param3_ui,
biomass_bound1_ui, biomass_bound2_ui, biomass_bound3_ui,
substrate_eq1_ui, substrate_eq2_ui, substrate_eq3_ui,
substrate_param1_ui, substrate_param2_ui, substrate_param3_ui,
substrate_bound1_ui, substrate_bound2_ui, substrate_bound3_ui,
product_eq1_ui, product_eq2_ui, product_eq3_ui,
product_param1_ui, product_param2_ui, product_param3_ui,
product_bound1_ui, product_bound2_ui, product_bound3_ui,
legend_position_ui,
show_legend_ui,
show_params_ui,
biomass_eq_count_ui,
substrate_eq_count_ui,
product_eq_count_ui
]
outputs_for_button = [image_output, analysis_output]
# Conexi贸n del bot贸n DENTRO del contexto de Blocks
submit_button.click(
fn=process_function_for_button, # Usa la funci贸n pasada como argumento
inputs=all_inputs_for_button,
outputs=outputs_for_button
)
# Inicializar la visibilidad correctamente al cargar la demo
# para los campos de ecuaci贸n 2 y 3.
def initial_visibility_setup(val_b, val_s, val_p):
return (
update_visibility_fn(val_b)[0], update_visibility_fn(val_b)[1],
update_visibility_fn(val_s)[0], update_visibility_fn(val_s)[1],
update_visibility_fn(val_p)[0], update_visibility_fn(val_p)[1]
)
demo.load(
fn=initial_visibility_setup,
inputs=[biomass_eq_count_ui, substrate_eq_count_ui, product_eq_count_ui],
outputs=[
biomass_col2, biomass_col3,
substrate_col2, substrate_col3,
product_col2, product_col3
]
)
return demo |