In [2]:
"""
DEMO 02: Muestreo del Espacio de Parámetros (Design of Experiments - DoE) en Python
Curso guiado de GSUA-CSB

Compara métodos de muestreo:
- Uniforme Aleatorio ("uniform")
- Hipercubo Latino ("latin_hypercube")
- Secuencias de Sobol ("sobol")
- Demostración de escala logarítmica (log_scale)
"""
import sys
import os
import numpy as np
import matplotlib.pyplot as plt
from gsua_csb import design_matrix, UserFunctionModel
In [3]:
# Añadir la ruta del Módulo 01 para reutilizar el modelo SIR continuo
module1_py_path = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..", "01_Introduccion_Modelos", "python"))
if module1_py_path not in sys.path:
    sys.path.append(module1_py_path)
In [4]:
from sir_continuous_userdefined import create_sir_continuous_model
In [5]:
def run_demo():
    print("=========================================================================")
    print("  MÓDULO 02: MUESTREO DEL ESPACIO DE PARÁMETROS (PYTHON gsua_csb)")
    print("=========================================================================\n")
    
    # 1. Crear Modelo SIR
    model_sir = create_sir_continuous_model()
    print(f"Factores del Modelo: {model_sir.names}")
    print(f"Límites:\n{model_sir.range}\n")
    
    N_samples = 250
    
    # 2. Generar Matrices de Diseño con diferentes métodos
    M_uni   = design_matrix(model_sir, n=N_samples, method="uniform", seed=42)
    M_lhs   = design_matrix(model_sir, n=N_samples, method="latin_hypercube", seed=42)
    M_sobol = design_matrix(model_sir, n=N_samples, method="sobol", seed=42)
    
    # 3. Visualizar y comparar proyecciones 2D (beta vs gamma)
    fig, axes = plt.subplots(1, 3, figsize=(13, 4))
    
    axes[0].scatter(M_uni[:, 0], M_uni[:, 1], color='tab:red', alpha=0.7, s=15)
    axes[0].set_xlabel('beta')
    axes[0].set_ylabel('gamma')
    axes[0].set_title('Muestreo Uniforme Aleatorio')
    axes[0].grid(True)
    
    axes[1].scatter(M_lhs[:, 0], M_lhs[:, 1], color='tab:green', alpha=0.7, s=15)
    axes[1].set_xlabel('beta')
    axes[1].set_ylabel('gamma')
    axes[1].set_title('Hipercubo Latino (LHS)')
    axes[1].grid(True)
    
    axes[2].scatter(M_sobol[:, 0], M_sobol[:, 1], color='tab:blue', alpha=0.7, s=15)
    axes[2].set_xlabel('beta')
    axes[2].set_ylabel('gamma')
    axes[2].set_title('Secuencia de Sobol')
    axes[2].grid(True)
    
    plt.tight_layout()
    plt.savefig("demo_sampling_comparison.png")
    print("Gráfica comparativa de muestreo guardada como 'demo_sampling_comparison.png'")
    
    # 4. Demostración de Escala Logarítmica (log_scale)
    print("\n--- Demostración de Escala Logarítmica (log_scale) ---")
    
    # Modelo con log_scale activado para el primer parámetro
    def dummy_func(params):
        return params[0] + params[1]
        
    model_log = UserFunctionModel(
        func=dummy_func,
        names=["beta_multidecadal", "gamma_std"],
        range=np.array([[1e-6, 1e-1], [0.05, 0.20]]),
        log_scale=[True, False] # beta varía en escala logarítmica
    )
    
    M_log = design_matrix(model_log, n=500, method="latin_hypercube", seed=42)
    
    fig, axes = plt.subplots(1, 2, figsize=(10, 4))
    axes[0].hist(M_log[:, 0], bins=25, color='tab:orange', edgecolor='black')
    axes[0].set_xlabel('beta_multidecadal (Escala Lineal)')
    axes[0].set_ylabel('Frecuencia')
    axes[0].set_title('Distribución en Valores Reales (Concentrada en década superior)')
    axes[0].grid(True)
    
    axes[1].hist(np.log10(M_log[:, 0]), bins=25, color='tab:purple', edgecolor='black')
    axes[1].set_xlabel('log10(beta_multidecadal) (Escala Logarítmica)')
    axes[1].set_ylabel('Frecuencia')
    axes[1].set_title('Distribución en log10 (Uniformemente distribuida)')
    axes[1].grid(True)
    
    plt.tight_layout()
    plt.savefig("demo_log_scale_sampling.png")
    print("Gráfica de muestreo logarítmico guardada como 'demo_log_scale_sampling.png'")
    
    # 5. PREGUNTAS Y EJERCICIOS PARA EL ESTUDIANTE
    print("\n=========================================================================")
    print("  PREGUNTAS DE ANÁLISIS Y EJERCICIOS DOCENTES (MÓDULO 02)  ")
    print("=========================================================================")
    print("1. Al observar la proyección 2D (beta vs gamma), ¿cuál método muestra mayores huecos o aglomeraciones?")
    print("2. ¿Por qué el Hipercubo Latino garantiza que no haya dos muestras en el mismo intervalo unidimensional?")
    print("3. Si un parámetro varía entre 1e-5 y 100, ¿qué ocurre si usamos muestreo lineal vs logarítmico?")
    print("=========================================================================\n")
In [6]:
if __name__ == "__main__":
    run_demo()
=========================================================================
  MÓDULO 02: MUESTREO DEL ESPACIO DE PARÁMETROS (PYTHON gsua_csb)
=========================================================================

Factores del Modelo: ['beta', 'gamma', 'S0', 'I0']
Límites:
[[1.00e-04 8.00e-04]
 [5.00e-02 2.00e-01]
 [9.00e+02 9.99e+02]
 [1.00e+00 5.00e+01]]

C:\Users\Lanre\anaconda3\Lib\site-packages\scipy\stats\_qmc.py:993: UserWarning: The balance properties of Sobol' points require n to be a power of 2.
  sample = self._random(n, workers=workers)
No description has been provided for this image
Gráfica comparativa de muestreo guardada como 'demo_sampling_comparison.png'

--- Demostración de Escala Logarítmica (log_scale) ---
No description has been provided for this image
Gráfica de muestreo logarítmico guardada como 'demo_log_scale_sampling.png'

=========================================================================
  PREGUNTAS DE ANÁLISIS Y EJERCICIOS DOCENTES (MÓDULO 02)  
=========================================================================
1. Al observar la proyección 2D (beta vs gamma), ¿cuál método muestra mayores huecos o aglomeraciones?
2. ¿Por qué el Hipercubo Latino garantiza que no haya dos muestras en el mismo intervalo unidimensional?
3. Si un parámetro varía entre 1e-5 y 100, ¿qué ocurre si usamos muestreo lineal vs logarítmico?
=========================================================================