C2MV commited on
Commit
29fefec
verified
1 Parent(s): 509dd2d

Upload 2 files

Browse files
Files changed (2) hide show
  1. UI.py +24 -144
  2. app.py +14 -38
UI.py CHANGED
@@ -1,152 +1,32 @@
1
- # UI.py
2
  import gradio as gr
3
- import numpy as np
4
 
5
- def create_interface(process_function_for_button):
6
- with gr.Blocks(theme='gradio/soft') as demo:
7
- gr.Markdown("# Modelado de Bioprocesos con Ecuaciones Personalizadas y An谩lisis por IA")
8
-
9
- with gr.Row():
10
- with gr.Column(scale=2):
11
- gr.Markdown("### Carga de Datos y Configuraci贸n General")
12
- file_input = gr.File(label="Subir archivo Excel (.xlsx)", file_types=[".xlsx"])
13
-
14
- show_legend_ui = gr.Checkbox(label="Mostrar leyenda en gr谩ficos", value=True)
15
- show_params_ui = gr.Checkbox(label="Mostrar par谩metros ajustados en gr谩ficos", value=True)
16
- legend_position_ui = gr.Dropdown(
17
- label="Posici贸n de la leyenda",
18
- choices=['best', 'upper right', 'upper left', 'lower right', 'lower left', 'center left', 'center right', 'lower center', 'upper center', 'center'],
19
- value='best', # Asegura que el valor por defecto es uno de los choices
20
- type="value" # Especificar el tipo de retorno si es ambiguo
21
- )
22
- with gr.Column(scale=1):
23
- gr.Markdown("### Conteo de Ecuaciones a Probar")
24
- biomass_eq_count_ui = gr.Number(label="Biomasa (1-3)", value=1.0, minimum=1.0, maximum=3.0, step=1.0, precision=0) # Usar float para gr.Number
25
- substrate_eq_count_ui = gr.Number(label="Sustrato (1-3)", value=1.0, minimum=1.0, maximum=3.0, step=1.0, precision=0)
26
- product_eq_count_ui = gr.Number(label="Producto (1-3)", value=1.0, minimum=1.0, maximum=3.0, step=1.0, precision=0)
27
-
28
- # --- Secci贸n de Biomasa ---
29
- with gr.Accordion("Ecuaciones y Par谩metros de Biomasa", open=True):
30
- with gr.Row():
31
- with gr.Column():
32
- 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)))")
33
- biomass_param1_ui = gr.Textbox(label="Par谩metros Biomasa 1", value="Xm, um, t_lag", info="Nombres, coma sep. Use 't' para tiempo. 'X_val' para X(t) en S/P.")
34
- biomass_bound1_ui = gr.Textbox(label="L铆mites Biomasa 1", value="(0, np.inf), (0, np.inf), (0, np.inf)", info="Formato: (low,high). Use np.inf.")
35
-
36
- biomass_col2_container = gr.Column(visible=False)
37
- with biomass_col2_container:
38
- biomass_eq2_ui = gr.Textbox(label="Ecuaci贸n de Biomasa 2", value="X0 * exp(um * t)", lines=2)
39
- biomass_param2_ui = gr.Textbox(label="Par谩metros Biomasa 2", value="X0, um")
40
- biomass_bound2_ui = gr.Textbox(label="L铆mites Biomasa 2", value="(0, np.inf), (0, np.inf)")
41
-
42
- biomass_col3_container = gr.Column(visible=False)
43
- with biomass_col3_container:
44
- biomass_eq3_ui = gr.Textbox(label="Ecuaci贸n de Biomasa 3", lines=2, value="")
45
- biomass_param3_ui = gr.Textbox(label="Par谩metros Biomasa 3", value="")
46
- biomass_bound3_ui = gr.Textbox(label="L铆mites Biomasa 3", value="")
47
 
48
- # --- Secci贸n de Sustrato ---
49
- with gr.Accordion("Ecuaciones y Par谩metros de Sustrato", open=True):
50
- gr.Markdown("Para Sustrato/Producto, usa `X_val` para X(t). Ejemplo: `S0 - (X_val / YXS)` donde YXS es un par谩metro.")
51
- with gr.Row():
52
- with gr.Column():
53
- substrate_eq1_ui = gr.Textbox(label="Ecuaci贸n de Sustrato 1", value="S0 - (X_val / YXS) - mS * t", lines=2)
54
- substrate_param1_ui = gr.Textbox(label="Par谩metros Sustrato 1", value="S0, YXS, mS")
55
- substrate_bound1_ui = gr.Textbox(label="L铆mites Sustrato 1", value="(0, np.inf), (1e-9, np.inf), (0, np.inf)")
56
-
57
- substrate_col2_container = gr.Column(visible=False)
58
- with substrate_col2_container:
59
- substrate_eq2_ui = gr.Textbox(label="Ecuaci贸n de Sustrato 2", lines=2, value="")
60
- substrate_param2_ui = gr.Textbox(label="Par谩metros Sustrato 2", value="")
61
- substrate_bound2_ui = gr.Textbox(label="L铆mites Sustrato 2", value="")
62
-
63
- substrate_col3_container = gr.Column(visible=False)
64
- with substrate_col3_container:
65
- substrate_eq3_ui = gr.Textbox(label="Ecuaci贸n de Sustrato 3", lines=2, value="")
66
- substrate_param3_ui = gr.Textbox(label="Par谩metros Sustrato 3", value="")
67
- substrate_bound3_ui = gr.Textbox(label="L铆mites Sustrato 3", value="")
68
-
69
- # --- Secci贸n de Producto ---
70
- with gr.Accordion("Ecuaciones y Par谩metros de Producto", open=True):
71
- with gr.Row():
72
- with gr.Column():
73
- product_eq1_ui = gr.Textbox(label="Ecuaci贸n de Producto 1", value="P0 + YPX * X_val + mP * t", lines=2)
74
- product_param1_ui = gr.Textbox(label="Par谩metros Producto 1", value="P0, YPX, mP")
75
- product_bound1_ui = gr.Textbox(label="L铆mites Producto 1", value="(0, np.inf), (0, np.inf), (0, np.inf)")
76
-
77
- product_col2_container = gr.Column(visible=False)
78
- with product_col2_container:
79
- product_eq2_ui = gr.Textbox(label="Ecuaci贸n de Producto 2", lines=2, value="")
80
- product_param2_ui = gr.Textbox(label="Par谩metros Producto 2", value="")
81
- product_bound2_ui = gr.Textbox(label="L铆mites Producto 2", value="")
82
-
83
- product_col3_container = gr.Column(visible=False)
84
- with product_col3_container:
85
- product_eq3_ui = gr.Textbox(label="Ecuaci贸n de Producto 3", lines=2, value="")
86
- product_param3_ui = gr.Textbox(label="Par谩metros Producto 3", value="")
87
- product_bound3_ui = gr.Textbox(label="L铆mites Producto 3", value="")
88
-
89
- # L贸gica para mostrar/ocultar campos de ecuaci贸n din谩micamente
90
- def update_eq_visibility(count_value):
91
- count = int(count_value)
92
- return gr.update(visible=count >= 2), gr.update(visible=count >= 3)
93
 
94
- biomass_eq_count_ui.change(fn=update_eq_visibility, inputs=biomass_eq_count_ui, outputs=[biomass_col2_container, biomass_col3_container])
95
- substrate_eq_count_ui.change(fn=update_eq_visibility, inputs=substrate_eq_count_ui, outputs=[substrate_col2_container, substrate_col3_container])
96
- product_eq_count_ui.change(fn=update_eq_visibility, inputs=product_eq_count_ui, outputs=[product_col2_container, product_col3_container])
97
 
98
- submit_button = gr.Button("Procesar y Analizar", variant="primary", scale=1)
 
 
 
 
99
 
100
- gr.Markdown("## Resultados del An谩lisis")
101
- with gr.Row():
102
- image_output = gr.Image(label="Gr谩fico Generado", type="pil", scale=2, show_download_button=True, height=600)
103
- with gr.Column(scale=3):
104
- analysis_output = gr.Markdown(label="An谩lisis del Modelo por IA")
 
 
105
 
106
- all_inputs_for_button = [
107
- file_input,
108
- biomass_eq1_ui, biomass_eq2_ui, biomass_eq3_ui,
109
- biomass_param1_ui, biomass_param2_ui, biomass_param3_ui,
110
- biomass_bound1_ui, biomass_bound2_ui, biomass_bound3_ui,
111
- substrate_eq1_ui, substrate_eq2_ui, substrate_eq3_ui,
112
- substrate_param1_ui, substrate_param2_ui, substrate_param3_ui,
113
- substrate_bound1_ui, substrate_bound2_ui, substrate_bound3_ui,
114
- product_eq1_ui, product_eq2_ui, product_eq3_ui,
115
- product_param1_ui, product_param2_ui, product_param3_ui,
116
- product_bound1_ui, product_bound2_ui, product_bound3_ui,
117
- legend_position_ui,
118
- show_legend_ui,
119
- show_params_ui,
120
- biomass_eq_count_ui,
121
- substrate_eq_count_ui,
122
- product_eq_count_ui
123
- ]
124
- outputs_for_button = [image_output, analysis_output]
125
-
126
- submit_button.click(
127
- fn=process_function_for_button,
128
- inputs=all_inputs_for_button,
129
- outputs=outputs_for_button
130
- )
131
-
132
- # Inicializar visibilidad usando demo.load
133
- def set_initial_visibility_on_load_wrapper(b_c_val, s_c_val, p_c_val):
134
- b_c_int, s_c_int, p_c_int = int(b_c_val), int(s_c_val), int(p_c_val)
135
-
136
- b_vis2_upd, b_vis3_upd = update_eq_visibility(b_c_int)
137
- s_vis2_upd, s_vis3_upd = update_eq_visibility(s_c_int)
138
- p_vis2_upd, p_vis3_upd = update_eq_visibility(p_c_int)
139
-
140
- # Devolver los resultados de gr.update para cada componente de salida
141
- return b_vis2_upd, b_vis3_upd, s_vis2_upd, s_vis3_upd, p_vis2_upd, p_vis3_upd
142
-
143
- demo.load(
144
- fn=set_initial_visibility_on_load_wrapper,
145
- inputs=[biomass_eq_count_ui, substrate_eq_count_ui, product_eq_count_ui],
146
- outputs=[
147
- biomass_col2_container, biomass_col3_container,
148
- substrate_col2_container, substrate_col3_container,
149
- product_col2_container, product_col3_container
150
- ]
151
- )
152
  return demo
 
1
+ # UI.py (VERSI脫N DE DEPURACI脫N)
2
  import gradio as gr
 
3
 
4
+ def create_interface(process_function_for_button): # Mantenemos la firma
5
+ with gr.Blocks(theme='gradio/soft') as demo:
6
+ gr.Markdown("# Prueba de API de Gradio Simplificada")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7
 
8
+ name_input = gr.Textbox(label="Ingresa tu nombre")
9
+ greeting_output = gr.Textbox(label="Saludo")
10
+
11
+ def simple_greet(name):
12
+ if not name:
13
+ return "Por favor, ingresa un nombre."
14
+ return f"Hola, {name}!"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
15
 
16
+ greet_button = gr.Button("Saludar")
 
 
17
 
18
+ greet_button.click(
19
+ fn=simple_greet, # Usa una funci贸n local simple para probar
20
+ inputs=[name_input],
21
+ outputs=[greeting_output]
22
+ )
23
 
24
+ # --- SIMULACI脫N DE TUS OUTPUTS ESPERADOS ---
25
+ # Para asegurar que la funci贸n principal (process_and_plot) tenga outputs compatibles
26
+ # si la conectamos a esta UI simplificada (aunque no lo haremos directamente ahora).
27
+ # Esto es solo para que Gradio no se queje si intentara analizar process_and_plot
28
+ # con una UI que no tuviera los outputs correctos.
29
+ # gr.Image(label="Gr谩fico Dummy", visible=False)
30
+ # gr.Markdown(label="An谩lisis Dummy", visible=False)
31
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
32
  return demo
app.py CHANGED
@@ -2,53 +2,30 @@
2
  import sys
3
  from pathlib import Path
4
  import os
5
- import subprocess
6
-
7
- # --- CR脥TICO: L脥NEA PARA FORZAR LA VERSI脫N DE GRADIO Y GRADIO-CLIENT CORRECTA ---
8
- print("INFO: Forzando la instalaci贸n de Gradio 4.29.0 y su cliente compatible...")
9
- try:
10
- # Desinstalar cualquier versi贸n existente de gradio y gradio_client
11
- subprocess.check_call([sys.executable, "-m", "pip", "uninstall", "-y", "gradio", "gradio-client"])
12
- # Instalar la versi贸n espec铆fica deseada: gradio 4.29.0 necesita gradio-client 0.16.1
13
- subprocess.check_call([sys.executable, "-m", "pip", "install", "gradio==4.29.0", "gradio-client==0.16.1"])
14
- print("INFO: Gradio 4.29.0 y gradio-client 0.16.1 instalados correctamente de forma forzada.")
15
- except subprocess.CalledProcessError as e:
16
- print(f"ERROR: Fallo al forzar la instalaci贸n de Gradio 4.29.0: {e}")
17
- print("Por favor, aseg煤rate de que no hay otras dependencias conflictivas y reintenta despu茅s de una limpieza profunda.")
18
- sys.exit(1)
19
- # --- FIN DE L脥NEA CR脥TICA ---
20
-
21
 
22
  CURRENT_DIR = Path(__file__).parent
23
  if str(CURRENT_DIR) not in sys.path:
24
  sys.path.insert(0, str(CURRENT_DIR))
25
 
26
  try:
27
- import decorators
28
- from UI import create_interface
29
- import interface as app_interface_module
30
  except ImportError as e:
31
- print(f"Error cr铆tico de importaci贸n en app.py: {e}. Aseg煤rate de que todos los archivos .py est茅n en el mismo directorio o en PYTHONPATH.")
32
- print(f"sys.path actual: {sys.path}")
33
  sys.exit(1)
34
 
35
-
36
- if decorators.was_real_spaces_gpu_imported():
37
- print("INFO (app.py): El decorador GPU de 'spaces' parece estar disponible.")
38
- print("INFO (app.py): Se definir谩 una funci贸n dummy decorada para satisfacer el chequeo de Gradio si es necesario.")
39
-
40
- @decorators.gpu_decorator(duration=1)
41
- def _app_py_dummy_gpu_function_for_gradio_startup():
42
- pass
43
- else:
44
- print("INFO (app.py): El decorador GPU real de 'spaces' no fue importado. No se necesita funci贸n dummy para GPU.")
45
-
46
 
47
  def main():
48
- print("INFO (app.py): Creando la interfaz Gradio...")
49
- demo_instance = create_interface(process_function_for_button=app_interface_module.process_and_plot)
50
 
51
- print("INFO (app.py): Lanzando la interfaz Gradio localmente...")
 
 
 
 
 
52
  try:
53
  demo_instance.launch(debug=True)
54
  except ValueError as ve:
@@ -57,11 +34,10 @@ def main():
57
  demo_instance.launch(share=True, debug=True)
58
  else:
59
  print(f"Error inesperado de ValueError durante launch(): {ve}")
60
- raise ve
61
  except Exception as e_launch:
62
  print(f"Error inesperado durante demo.launch(): {e_launch}")
63
- raise e_launch
64
-
65
 
66
  if __name__ == "__main__":
67
  main()
 
2
  import sys
3
  from pathlib import Path
4
  import os
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5
 
6
  CURRENT_DIR = Path(__file__).parent
7
  if str(CURRENT_DIR) not in sys.path:
8
  sys.path.insert(0, str(CURRENT_DIR))
9
 
10
  try:
11
+ # No necesitamos decorators ni interface para esta prueba simple
12
+ from UI import create_interface # Importa la UI.py simplificada
 
13
  except ImportError as e:
14
+ print(f"Error cr铆tico de importaci贸n en app.py: {e}.")
 
15
  sys.exit(1)
16
 
17
+ # No se necesita la l贸gica del decorador dummy para esta prueba
18
+ print("INFO (app.py - Prueba Simplificada): Saltando chequeo de decorador GPU.")
 
 
 
 
 
 
 
 
 
19
 
20
  def main():
21
+ print("INFO (app.py - Prueba Simplificada): Creando la interfaz Gradio simplificada...")
 
22
 
23
+ # La UI simplificada define su propia funci贸n de callback simple (simple_greet)
24
+ # por lo que no necesitamos pasar process_and_plot aqu铆.
25
+ # create_interface ya conecta su propio bot贸n a su propia funci贸n.
26
+ demo_instance = create_interface(process_function_for_button=None) # Pasamos None o una dummy
27
+
28
+ print("INFO (app.py - Prueba Simplificada): Lanzando la interfaz Gradio localmente...")
29
  try:
30
  demo_instance.launch(debug=True)
31
  except ValueError as ve:
 
34
  demo_instance.launch(share=True, debug=True)
35
  else:
36
  print(f"Error inesperado de ValueError durante launch(): {ve}")
37
+ raise ve # Relanzar para ver el error completo
38
  except Exception as e_launch:
39
  print(f"Error inesperado durante demo.launch(): {e_launch}")
40
+ raise e_launch # Relanzar
 
41
 
42
  if __name__ == "__main__":
43
  main()