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