OpenCyber Academy
Investigación doctoral · Capítulo 4 · Español
Código del curso: OCA-207Capítulo 04: OCA-207-C004

Capítulo 4 — Replicación de líneas de base y piloto

Aprendizaje gratuito y abierto para quienes desean proteger a las personas y la tecnología. No se necesita una cuenta para estudiar ni consultar las respuestas.

Mapa de la lección

Lección 04 publicada. Mapa, ejemplo, EX021.

flowchart TD
  N0["Resultados de aprendizaje y conexión"]
  N1["4.1 Reproducción, replicación, robustez"]
  N2["4.2 Reproducir un cálculo de modelo: el modelo insum"]
  N3["4.3 La discrepancia de GridWater-Sim sintética"]
  N4["4.4 Verificar un simulador"]
  N5["4.5 Replicar una línea de base de detección: artefac"]
  N6["4.6 Obtención de parámetros"]
  N7["4.7 El piloto"]
  N0 --> N1 --> N2 --> N3 --> N4 --> N5 --> N6 --> N7
  N7 --> EX["Ejemplo resuelto"]
  EX --> Q["Ejercicio EX021"]

Dibujo lógico

flowchart LR
  N0["Resultados de aprendizaje y conexión"]
  N1["4.1 Reproducción, replicación, robustez"]
  N2["4.2 Reproducir un cálculo de modelo: el modelo insum"]
  N3["4.3 La discrepancia de GridWater-Sim sintética"]
  N4["4.4 Verificar un simulador"]
  N5["4.5 Replicar una línea de base de detección: artefac"]
  N6["4.6 Obtención de parámetros"]
  N7["4.7 El piloto"]
  N0 --> N1 --> N2 --> N3 --> N4 --> N5 --> N6 --> N7 --> Q["EX021"]
[Resultados de aprendizaje y conexión]
    |
    v
[4.1 Reproducción, replicación, robustez]
    |
    v
[4.2 Reproducir un cálculo de modelo: el modelo insum]
    |
    v
[4.3 La discrepancia de GridWater-Sim sintética]
    |
    v
[4.4 Verificar un simulador]
    |
    v
[4.5 Replicar una línea de base de detección: artefac]
    |
    v
[4.6 Obtención de parámetros]
    |
    v
[4.7 El piloto]
    |
    v
[Ejemplo resuelto] --> [Ejercicio EX021]

Resultados de aprendizaje y conexión

Al terminar este capítulo, el estudiante será capaz de:

  1. Distinguir la reproducción, la replicación y las comprobaciones de robustez, y elegir cuál necesita una línea de base.
  2. Reproducir un cálculo de modelo publicado, declarar de antemano una tolerancia, diagnosticar una discrepancia y redactar una bitácora de reproducción.
  3. Verificar un simulador con invariantes, pruebas unitarias y una implementación independiente antes de confiar en cualquier comparación que produzca.
  4. Reconocer los artefactos de los protocolos de evaluación —ajuste por punto, fuga temporal, características propias del banco de pruebas— que inflan las líneas de base de detección.
  5. Obtener de expertos y documentar los parámetros del modelo con incertidumbre explícita.
  6. Diseñar un piloto acotado cuyo propósito sea la factibilidad, con criterios de continuar o detener, y explicar por qué un piloto no debe usarse para estimar el tamaño del efecto.

El capítulo 3 fijó las hipótesis, las líneas de base y las condiciones de fracaso. Antes de que el estudio principal pueda comparar DEP con SILO, CRITFLAG y ORACLE, hay que demostrar que cada número del que dependen esas comparaciones significa lo que afirma.

4.1 Reproducción, replicación, robustez

Las National Academies (2019) distinguen la reproducibilidad —obtener resultados coherentes con los mismos datos de entrada, pasos computacionales, métodos y condiciones de análisis— de la replicabilidad —obtener resultados coherentes entre estudios dirigidos a la misma pregunta, cada uno con sus propios datos—. Una tercera actividad, a menudo llamada comprobación de robustez, varía las decisiones analíticas sobre los mismos datos. Las tesis sobre infraestructura necesitan las tres:

Tabla de la lección; desplázate para ver todas las columnas →

Actividad Ejemplo del Estudio Cascada Contra qué protege
Reproducción Volver a ejecutar un cálculo de inoperabilidad publicado con la matriz publicada Malinterpretar convenciones; errores de programación en la línea de base
Replicación Construir Port Halvard de forma independiente y comprobar si se mantiene el resultado de Riverbend Hallazgos propios de un contexto o de un modelo
Robustez Variar pesos, reservas, paso temporal, horizonte Resultados que dependen de una sola elección arbitraria

4.2 Reproducir un cálculo de modelo: el modelo insumo-producto de inoperabilidad

4.2.1 El modelo

El modelo insumo-producto de inoperabilidad de Haimes y Jiang (2001) adapta la economía insumo-producto de Leontief a la infraestructura. Cada sector i tiene una inoperabilidad q_i entre 0 (plenamente operable) y 1 (plenamente inoperable). El equilibrio tras una perturbación inicial c* es q = A*q + c*, de donde q = (I − A*)⁻¹ c*. El elemento A*_ij es la inoperabilidad que aporta al sector i cada unidad de inoperabilidad del sector j. La convención importa: la fila es el sector receptor y la columna el sector proveedor. Los artículos y el software difieren en la notación, y algunos derivan A* de tablas económicas de insumo-producto mediante pasos de normalización en los que es fácil equivocarse de forma sutil.

4.2.2 Laboratorio de reproducción

Un artículo «publicado» sintético informa que, tras una perturbación que deja la electricidad inoperable en un 50 %, el agua alcanza una inoperabilidad de equilibrio de 0,236 en un modelo de tres sectores. Declare de antemano una tolerancia de ± 0,005 (el redondeo de la publicación) y luego reproduzca:

# Lab 4a - reproducing an inoperability input-output (IIM) result (offline, standard library only)
# q = (I - A*)^-1 c*. Convention: A*[i][j] = inoperability contributed to sector i per unit inoperability of sector j.
def solve(a, c):
    n = len(c)
    m = [[(1.0 if i == j else 0.0) - a[i][j] for j in range(n)] + [c[i]] for i in range(n)]
    for col in range(n):
        piv = max(range(col, n), key=lambda r: abs(m[r][col]))
        m[col], m[piv] = m[piv], m[col]
        for r in range(n):
            if r != col:
                f = m[r][col] / m[col][col]
                m[r] = [x - f * y for x, y in zip(m[r], m[col])]
    return [m[i][n] / m[i][i] for i in range(n)]
sectors = ["power", "water", "telecom"]
A = [[0.00, 0.05, 0.10],   # power depends a little on water (cooling) and telecom (SCADA comms)
     [0.40, 0.00, 0.15],   # water depends strongly on power
     [0.30, 0.02, 0.00]]   # telecom depends on power
c = [0.50, 0.00, 0.00]    # initial perturbation: power 50% inoperable
q = solve(A, c)
print("convention A* (row = receiving sector):", [round(x, 3) for x in q])
At = [list(r) for r in zip(*A)]
qt = solve(At, c)
print("transposed by mistake:               ", [round(x, 3) for x in qt])

Salida esperada:

convention A* (row = receiving sector): [0.528, 0.236, 0.163]
transposed by mistake:                [0.528, 0.028, 0.057]

Con la convención correcta, la reproducción coincide (agua 0,236). Con la matriz traspuesta —un error que no produce ninguna advertencia, ningún fallo y un vector de aspecto plausible—, la inoperabilidad del agua cae casi un orden de magnitud y la clasificación de los sectores cambia: las telecomunicaciones aparecen ahora más afectadas que el agua. El valor de la propia electricidad coincide casualmente en ambos casos, y eso es exactamente lo que vuelve peligroso el error: quien replique comprobando solo el sector perturbado declararía el éxito.

4.2.3 La bitácora de reproducción

Una bitácora de reproducción registra: el valor objetivo y su fuente (página, tabla); la tolerancia, fijada antes de ejecutar; el entorno de software (versión del lenguaje, sistema operativo); las entradas y su procedencia; la salida exacta; las discrepancias y su diagnóstico; y la decisión (reproducido, reproducido tras una corrección, no reproducido). Cuando la convención de los autores originales es ambigua, escríbales; registre la correspondencia. Una no reproducción es un resultado, no una vergüenza, y pertenece a la tesis.

4.2.4 Lo que un IIM reproducido puede sustentar y lo que no

Reproducir el cálculo solo muestra que se entiende la aritmética. El IIM sigue siendo lineal y basado en el equilibrio: no modela reservas, tiempos ni orden de restablecimiento, y sus coeficientes suelen derivarse de flujos económicos y no de dependencias de ingeniería. En el Estudio Cascada sirve como contraste a nivel sectorial —¿coinciden los sectores que el IIM clasifica como más afectados con los servicios que el modelo de reservas muestra fallando?— y no como competidor del modelo de restablecimiento.

4.3 La discrepancia de GridWater-Sim (sintética)

El banco de referencia sintético GridWater-Sim reporta, para una configuración similar a Riverbend, una pérdida ponderada media de servicios críticos con restablecimiento de clientes primero que la reimplementación del candidato no pudo igualar dentro de la tolerancia declarada de antemano. El diagnóstico siguió el orden que con más frecuencia encuentra la causa:

  1. Entradas. ¿Se usaron las mismas distribuciones de parámetros? La documentación del banco de referencia daba las distribuciones triangulares como (mínimo, moda, máximo); random.triangular de Python recibe (mínimo, máximo, moda). Intercambiar la moda y el máximo desplaza la media sin dar aviso.
  2. Semántica. ¿«Restablecido» significa reenergizado o servicio reanudado? GridWater-Sim aplicaba un retardo de rearranque de una hora solo al agua; la reimplementación lo aplicaba a todos los servicios.
  3. Numérica. El banco de referencia avanzaba el tiempo en pasos fijos; la reimplementación calculaba intervalos de interrupción exactos. Los pasos fijos introducen un error de discretización que depende del paso y de dónde caen los vencimientos de las reservas dentro de un paso.
  4. Aleatoriedad. ¿Eran idénticos las semillas y el orden de las extracciones? El orden importa: extraer las duraciones antes que las reservas en una implementación y después en otra produce conjuntos de escenarios distintos a partir de la misma semilla.

Tras alinear (1) y (2), la diferencia restante quedó dentro de la tolerancia y se redujo con pasos temporales más pequeños, lo que confirmó (3). La tesis registra el banco de referencia como reproducido tras corregir una ambigüedad en el orden de los parámetros, reporta los valores originales y corregidos, y adopta la implementación de intervalos exactos, conservando la versión de pasos temporales como comprobación independiente.

4.4 Verificar un simulador

La verificación pregunta si el modelo está implementado correctamente; la validación pregunta si representa el sistema real de forma adecuada para su propósito (Sargent, 2013). La verificación va primero, porque validar una implementación con errores no tiene sentido. Invariantes que debe cumplir cualquier simulador de restablecimiento correcto:

Las pruebas unitarias comprueban los componentes más pequeños: la aritmética de intervalos de un solo servicio; el efecto de una dependencia con reserva en el sitio; la asignación de cuadrillas con dos cuadrillas. Las pruebas entre implementaciones comparan dos implementaciones escritas de forma independiente con extracciones fijas. Las pruebas de condiciones extremas usan reservas nulas, duraciones nulas y un solo alimentador. Conserve las pruebas en el archivo (capítulo 7); un revisor que puede ejecutarlas confía más en las comparaciones que uno que debe aceptarlas por fe.

4.5 Replicar una línea de base de detección: artefactos de evaluación

Aunque el Estudio Cascada no propone un detector, su análisis del tiempo hasta el impacto depende de cuándo se reconoce una interrupción, y el candidato debe ser capaz de juzgar las líneas de base de detección reportadas para la infraestructura. Los mecanismos habituales de inflación son decisiones de evaluación, no propiedades del modelo.

4.5.1 Ajuste por punto

Kim et al. (2022) mostraron que el ajuste por punto (PA) —contar como detectado todo un segmento anómalo cuando se señala cualquier punto de él— puede hacer que puntuaciones aleatorias parezcan excelentes. El siguiente laboratorio reproduce el efecto con etiquetas sintéticas:

# Lab 4b - how point adjustment (PA) inflates detection scores (offline, standard library only)
import random
random.seed(42)
N = 2000
labels = [0] * N
for start, length in [(300, 60), (900, 120), (1500, 80)]:
    for t in range(start, start + length):
        labels[t] = 1
scores = [random.random() for _ in range(N)]          # a detector that knows nothing
thr = sorted(scores)[int(0.97 * N)]                    # alarm on the top 3% of scores
pred = [1 if s > thr else 0 for s in scores]
def f1(p, y):
    tp = sum(1 for a, b in zip(p, y) if a and b)
    fp = sum(1 for a, b in zip(p, y) if a and not b)
    fn = sum(1 for a, b in zip(p, y) if b and not a)
    prec = tp / (tp + fp) if tp + fp else 0.0
    rec = tp / (tp + fn) if tp + fn else 0.0
    return round(2 * prec * rec / (prec + rec), 3) if prec + rec else 0.0
def segments(y):
    segs, t = [], 0
    while t < len(y):
        if y[t]:
            s = t
            while t < len(y) and y[t]:
                t += 1
            segs.append((s, t))
        else:
            t += 1
    return segs
def adjust(p, y, k=0.0):
    q = list(p)
    for s, e in segments(y):
        hit = sum(p[s:e]) / (e - s)
        if hit > k:
            for t in range(s, e):
                q[t] = 1
    return q
print("point-wise F1           :", f1(pred, labels))
print("F1 after PA             :", f1(adjust(pred, labels), labels))
print("F1 after PA%K (K = 0.20):", f1(adjust(pred, labels, 0.20), labels))
print("segments hit by >=1 alarm:", sum(1 for s, e in segments(labels) if any(pred[s:e])), "of", len(segments(labels)))

Salida esperada:

point-wise F1           : 0.05
F1 after PA             : 0.911
F1 after PA%K (K = 0.20): 0.05
segments hit by >=1 alarm: 3 of 3

Un detector sin ninguna información obtiene 0,911 tras el PA porque cada segmento largo contiene, por azar, al menos una de las alarmas aleatorias del 3 %. PA%K con K = 20 % elimina aquí la inflación. Para la investigación en IC, la lección va más allá: ninguna de las dos métricas dice cuándo se produjo la primera alarma verdadera respecto del inicio del segmento, que es lo que importa para las reservas. Una métrica relevante para la consecuencia es la latencia de detección relativa al tiempo hasta el impacto: la fracción de incidentes detectados antes de que se agote la reserva del primer servicio dependiente.

4.5.2 Otros artefactos

4.6 Obtención de parámetros

Las reservas, las duraciones de restablecimiento y los pesos del modelo provienen de personas. La obtención estructurada del juicio experto —preparar a los expertos, pedir cuantiles en lugar de valores únicos, devolverles las distribuciones implícitas y registrar sus razones— reduce el anclaje y el exceso de confianza (O'Hagan et al., 2006). Para el Estudio Cascada (sintético):

Tabla de la lección; desplázate para ver todas las columnas →

Parámetro Obtenido de Forma Documentación
Duración del restablecimiento de un alimentador Tres despachadores de la REC Mínimo, más probable y máximo para maniobras manuales sin SCADA Razón de cada valor; desacuerdos registrados
Reserva de telecomunicaciones Ingeniero de instalaciones del operador Autonomía de baterías con la carga medida, horas de combustible del generador Supuesto de carga enunciado
Reserva de agua Gerente de operaciones de la RWA Autonomía del generador más vaciado del almacenamiento hasta la presión mínima Supuesto de demanda (estación) enunciado
Reserva del hospital Director de instalaciones Combustible disponible con la carga típica; horas de agua en el sitio Se distinguen los requisitos normativos del inventario real
Pesos Panel de gestión de emergencias Comparaciones por pares convertidas en pesos Obtenidos antes de cualquier simulación; firmados y fechados

Las distribuciones triangulares son una elección pragmática para obtenciones de tres puntos; no se derivan de la física. El capítulo 6 pone a prueba si las conclusiones dependen de la familia de distribuciones.

4.7 El piloto

4.7.1 Para qué sirve un piloto

Un piloto pone a prueba la factibilidad: si funcionan los procedimientos, los materiales, los tiempos, los flujos de datos y los instrumentos. No es un estudio principal pequeño. Los tamaños del efecto estimados a partir de pilotos son demasiado imprecisos para planificar tamaños de muestra o para sustentar afirmaciones (Leon, Davis y Kraemer, 2011). El piloto del Estudio Cascada tuvo dos vertientes:

  1. Piloto de simulación. Ejecutar las cuatro políticas con 50 extracciones para comprobar que funcionan el código, el registro y los invariantes, que el tiempo de ejecución permite el número de extracciones previsto y que la censura a las 72 horas es poco frecuente. Los resultados del piloto (diferencias entre políticas) se registran como exploratorios y no se interpretan.
  2. Piloto de ejercicio de mesa. Tres operadores (participantes sintéticos P01–P03, no elegibles para el estudio principal) trabajaron un escenario de 40 minutos con y sin una visualización del tiempo hasta el impacto. Preguntas: ¿entienden la visualización? ¿Revela el escenario el resultado demasiado pronto? ¿Cuánto tarda cada decisión? ¿Funciona el proceso de consentimiento y de cierre informativo?

4.7.2 Criterios de continuar o detener (declarados de antemano)

Tabla de la lección; desplázate para ver todas las columnas →

Criterio Umbral Resultado del piloto (sintético) Decisión
Pasan las pruebas de invariantes Todas Todas Continuar
Censura a las 72 h < 1 % de las combinaciones servicio-extracción 0 % Continuar
Tiempo de ejecución para 500 extracciones, incluido el oráculo < 1 hora Minutos Continuar
Los participantes leen correctamente la visualización ≥ 2 de 3 3 de 3 tras un cambio de redacción Continuar con revisión
El escenario revela el resultado prematuramente No Sí: una inyección mencionaba el «desvío hospitalario» Revisar la inyección; repetir el piloto con un participante
Duración de la sesión ≤ 60 min 55 min Continuar

Cada revisión se registra en la bitácora de desviaciones con la fecha y la confirmación de que no existían datos del estudio principal.

4.8 Ejemplo resuelto: el piloto que cambió el escenario

En el piloto del ejercicio de mesa, P02 preguntó por qué la reserva del generador del hospital se mostraba como 26 horas cuando «todo el mundo sabe que el agua se va primero». El candidato solo había mostrado las reservas eléctricas directas. La visualización se revisó para mostrar el tiempo efectivo hasta el impacto (el mínimo sobre todos los caminos, como en el Laboratorio 3) junto a las reservas directas, con el camino indicado. Esto cambió el instrumento —un resultado legítimo de un piloto— y planteó una cuestión metodológica para el estudio principal: la comparación entre «con visualización» y «sin visualización» ponía a prueba ahora la visualización del tiempo efectivo hasta el impacto, y no simplemente cualquier información de criticidad. Las hipótesis del ejercicio de mesa se refinaron en consecuencia, antes del estudio principal, y el cambio se prerregistró como enmienda.

4.9 Errores habituales y límites

Ejercicios — capítulo 4

EX021 — Bitácora de reproducción. Objetivo: documentar un intento de reproducción. Entradas: Laboratorio 4a. Restricciones: ejecutar sin conexión; tolerancia de ± 0,005 fijada antes de ejecutar. Pasos: (1) registre el objetivo (agua 0,236); (2) ejecute primero la matriz traspuesta y registre la discrepancia; (3) diagnostique usando la convención de la matriz; (4) ejecute la convención correcta; (5) redacte la entrada de la bitácora con los detalles del entorno. Evidencia esperada: bitácora de reproducción. Rúbrica: 3 = salidas exactas, diagnóstico de la convención, entorno registrado, observa que la electricidad coincide en ambas ejecuciones; 2 = falta un elemento; 1 = sin diagnóstico; 0 = no se ejecutó.

EX022 — Análisis de perturbaciones con el IIM. Objetivo: usar un modelo reproducido para una afirmación acotada. Entradas: Laboratorio 4a con la convención correcta. Restricciones: sin conexión. Pasos: (1) calcule q para las perturbaciones de electricidad 0,5 y de telecomunicaciones 0,5 por separado; (2) calcule q para ambas juntas; (3) compruebe si el resultado conjunto es igual a la suma de los resultados separados y explique por qué; (4) enuncie una afirmación que el modelo sustenta y otra que no puede sustentar. Evidencia esperada: tres vectores y un párrafo. Rúbrica: 3 = vectores correctos, linealidad (superposición) explicada, afirmación limitada a la inoperabilidad de equilibrio sin tiempos; 2 = vectores correctos, explicación pobre; 1 = errores; 0 = nada.

EX023 — La trampa del orden de los parámetros. Objetivo: detectar un error de entrada silencioso. Entradas: una distribución documentada como (low = 4, mode = 8, high = 12). Restricciones: use random.triangular(low, high, mode) de Python. Pasos: (1) calcule la media teórica, (low + mode + high) / 3, para la llamada correcta triangular(4, 12, 8); (2) estime la media de la llamada errónea triangular(4, 8, 12) a partir de 100 000 extracciones con semilla y registre el mínimo y el máximo; explique qué muestrea realmente la llamada errónea; indique qué prueba lo habría detectado. Evidencia esperada: dos medias y una explicación. Rúbrica: 3 = media correcta 8,0; la llamada errónea trata 8 como high y 12 como mode, de modo que la fórmula de CPython devuelve 4 + 4·√(2u) para una u uniforme —valores en [4, ≈ 9,66] con media ≈ 7,77, que no forman en absoluto una distribución triangular—; una comprobación de la media por sí sola es débil, mientras que comprobar que el máximo de la muestra se acerca a 12 y trazar un histograma lo detectan; 2 = error identificado, prueba débil; 1 = error no detectado; 0 = nada.

EX024 — Pruebas de invariantes. Objetivo: redactar pruebas de verificación. Entradas: los invariantes del §4.4 y el simulador que encontrará en el capítulo 5 (Laboratorio 5), o uno propio. Restricciones: al menos cuatro invariantes como aserciones ejecutables. Pasos: (1) elija al menos cuatro invariantes del §4.4; (2) escriba cada uno como aserción ejecutable; (3) ejecute las aserciones con extracciones fijas; (4) introduzca deliberadamente un error, como eliminar el retardo de rearranque de un servicio, y muestre qué prueba falla. Evidencia esperada: código de las pruebas y salida antes y después del error. Rúbrica: 3 = cuatro o más invariantes significativos, el error detectado, explicación de por qué; 2 = las pruebas se ejecutan pero el error no se detecta; 1 = pruebas triviales; 0 = nada.

EX025 — Métrica de detección relativa a la latencia. Objetivo: definir una métrica de detección relevante para la consecuencia. Entradas: Laboratorio 4b y los valores de tiempo hasta el impacto del Laboratorio 3 (el primer impacto crítico a las 2 h para el SCADA del agua, 8 h para las telecomunicaciones). Restricciones: defina la métrica formalmente. Pasos: (1) defina «detectado antes del impacto» para un segmento con inicio conocido y tiempo hasta el impacto conocido; (2) calcúlela para el detector aleatorio, tratando cada paso temporal como 6 minutos y tomando un tiempo hasta el impacto de 2 h para cada segmento; (3) compárela con los valores de F1. Evidencia esperada: definición, fracción calculada, párrafo. Rúbrica: 3 = definición sólida y cálculo correcto a partir del índice de la primera alarma de cada segmento, con el contraste con el PA explicado; 2 = definición correcta, error de cálculo; 1 = vago; 0 = nada.

EX026 — Plan del piloto. Objetivo: diseñar un piloto de factibilidad. Entradas: su propio estudio de los ejercicios anteriores. Restricciones: al menos seis criterios de continuar o detener con umbrales; enunciado explícito de lo que no se estimará. Pasos: (1) enumere las preguntas de factibilidad del piloto; (2) fije umbrales declarados de antemano; (3) defina qué ocurre ante un «detener» en cada una; (4) defina quién puede participar y por qué los participantes del piloto quedan excluidos del estudio principal. Evidencia esperada: plan del piloto. Rúbrica: 3 = criterios medibles, solo de factibilidad, exclusión justificada, proceso de revisión registrado; 2 = un criterio vago; 1 = piloto usado para estimar el efecto; 0 = nada.

Síntesis del capítulo

Antes de comparar métodos, asegúrese de que los números significan lo que afirman. Reproduzca las líneas de base con una tolerancia fijada de antemano, compruebe más de una salida y registre las convenciones: una matriz traspuesta produjo una respuesta plausible y errónea que coincidía en el único valor que comprobaría quien replica con prisa. Diagnostique las discrepancias por entradas, semántica, numérica y aleatoriedad. Verifique los simuladores con invariantes, pruebas unitarias y una implementación independiente antes de validarlos. Trate con suspicacia las líneas de base de detección que dependen del ajuste por punto, de divisiones aleatorias o de un solo banco de pruebas, y prefiera para la infraestructura la latencia relativa al tiempo hasta el impacto. Obtenga los parámetros con su incertidumbre y su procedencia. Use el piloto para ajustar procedimientos e instrumentos, nunca para estimar efectos.

Respuestas desarrolladas

EX021 — Bitácora de reproducción. Objetivo: agua 0,236 (artículo sintético, tabla 2). Tolerancia de ± 0,005 fijada antes de ejecutar. Ejecución 1 (matriz traspuesta): [0.528, 0.028, 0.057]; el agua difiere en 0,208, fuera de la tolerancia; la electricidad coincide. Diagnóstico: el artículo define A*_ij como el efecto de j sobre i; el archivo de entrada se leyó por columnas. Ejecución 2 (convención correcta): [0.528, 0.236, 0.163]; reproducido. Entorno: versión de Python, sistema operativo, fecha. Decisión: reproducido tras corregir un error de convención en nuestro manejo de las entradas. Nota: que la electricidad coincida en ambas ejecuciones muestra por qué comprobar una sola salida es insuficiente.

EX022 — Análisis de perturbaciones con el IIM. Solo electricidad 0,5: [0.528, 0.236, 0.163]. Solo telecomunicaciones 0,5: [0.057, 0.101, 0.519]. Ambas: [0.585, 0.336, 0.682], que es igual a la suma de los dos vectores separados (salvo redondeo), porque el IIM es lineal: q = (I − A*)⁻¹ c* y la inversa se distribuye sobre la suma de las perturbaciones. Afirmación sustentada: «en este modelo lineal de equilibrio, una perturbación combinada de electricidad y telecomunicaciones eleva la inoperabilidad del agua a alrededor de 0,34». No sustentada: nada sobre tiempos, reservas, umbrales u orden de restablecimiento, ni ninguna afirmación de que una inoperabilidad superior a 1 tenga sentido (los modelos lineales pueden superar los límites físicos con perturbaciones grandes).

EX023 — La trampa del orden de los parámetros. Llamada correcta triangular(4, 12, 8): media (4 + 8 + 12) / 3 = 8,0. La llamada errónea triangular(4, 8, 12) pasa high = 8 y mode = 12; CPython calcula c = (12 − 4)/(8 − 4) = 2 y devuelve 4 + 4·√(2u), de modo que los valores van de 4 a unos 9,66 y la media es de unos 7,77 (una ejecución con semilla de 100 000 extracciones dio mínimo 4,02, máximo 9,66, media 7,77). La salida no es una distribución triangular y supera el «high» documentado de 8 sin llegar nunca a 12. Una comprobación de la media por sí sola (7,77 frente a 8,0) se descarta fácilmente como ruido; una comprobación del rango frente a los límites documentados y un histograma revelan el error de inmediato.

EX024 — Pruebas de invariantes. Aserciones de ejemplo con el Laboratorio 5: (1) con todas las reservas por encima de 72 h, la pérdida de cada política es 0; (2) evaluate con órdenes idénticos da resultados idénticos; (3) ORACLE ≤ cada política en cada extracción; (4) aumentar en 1 h la reserva de un servicio nunca aumenta la pérdida con extracciones fijas; (5) con duraciones iguales, las horas-cliente de SILO ≤ las de cada permutación. Eliminar el retardo de rearranque de un servicio no lo detecta ninguno de estos invariantes: reduce de forma coherente las pérdidas de todas las políticas. Lo detecta una prueba unitaria sobre un solo servicio: alimentador restablecido a las 5 h, reserva de 2 h → intervalo de interrupción esperado (2, 6). La puntuación completa extrae la lección: los invariantes prueban la estructura y las pruebas unitarias prueban la semántica; se necesitan ambos.

EX025 — Métrica de detección relativa a la latencia. Definición: para cada segmento anómalo k con inicio s_k, primera alarma a_k (el primer índice señalado en el segmento) y tiempo hasta el impacto T_k, el segmento queda «detectado antes del impacto» si a_k existe y (a_k − s_k) × Δt < T_k. Con Δt = 6 min y T = 2 h (20 pasos): la primera alarma del segmento 1 está en el desplazamiento de 21 pasos (2,1 h) → no; la del segmento 2 en el desplazamiento 0 → sí; la del segmento 3 en el desplazamiento de 29 pasos (2,9 h) → no. Fracción detectada antes del impacto = 1/3. Contraste: PA-F1 0,911, F1 puntual 0,05, PA%K 0,05. La métrica de latencia muestra que un detector sin información se adelanta a la reserva solo por azar, información que el PA-F1 oculta por completo.

EX026 — Plan del piloto. Un plan sólido enumera preguntas de factibilidad (tasa de reclutamiento, comprensión de los materiales, duración de las sesiones, captura de datos, tiempo de ejecución, pruebas de invariantes), fija umbrales como en el §4.7.2, especifica las respuestas ante un «detener» (revisar y repetir el piloto; cambiar la vía de reclutamiento; reducir el alcance), excluye a los participantes del piloto del estudio principal porque han visto los materiales y sus elecciones estarían contaminadas, y declara explícitamente que no se estimará ni se reportará como evidencia ningún tamaño del efecto.