Modelos y Simulación · Tema 41

Reproducibilidad

Semillas, versiones y experimentos repetibles: que otro obtenga lo mismo con lo mismo.

01 · Punto de partida

De la confianza a la repetición

Verificamos el programa (Tema 35), lo validamos (Tema 36), lo calibramos (Tema 37) y ordenamos escenarios y sensibilidades (Temas 39–40). Pero todo ese edificio se cae con una pregunta simple: si otro corre lo mismo, ¿obtiene lo mismo? Sin reproducibilidad no hay auditoría, no hay ciencia y no hay decisión defendible.

Reproducible no es «más o menos parecido»: es idéntico ante iguales entradas (misma versión, mismos parámetros, mismas semillas) y explicable cuando difiere (qué versión o semilla cambió y por qué).

  • ¿Cada corrida guarda su semilla y su versión?
  • ¿El azar sale de un generador propio, no global?
  • ¿Otro puede repetir el experimento con lo guardado?
  • ¿Qué cambia cuando el resultado cambia?

02 · Vocabulario mínimo

Semilla, versión y traza

⚄

Semilla

Número que fija el azar: misma semilla, misma historia. Una por corrida, nunca global.

▦

Versión

Qué código corrió: v1, v2, commit o fecha. Sin versión, el resultado es huérfano.

▤

Traza

Ficha completa: parámetros, semillas, versión, horizonte y estado. Viaja con cada resultado.

Qué fijar para poder repetir.
QuéCómo se fijaQué rompe si falta
Azarrandom.Random(semilla) por corridaHistorias que cambian solas
CódigoVersión o commit guardadov1 contra v2 sin saberlo
DatosEntradas y parámetros archivadosEl pasado «igual» que no era igual
AnálisisMismo script de agregaciónIguales corridas, distintas conclusiones

03 · Tres pilares

Azar, código y registro

  1. 1
    Azar fijado.

    Generador propio por corrida con semilla registrada. Nada de azar global ni hora del sistema.

  2. 2
    Código versionado.

    Cada resultado dice qué versión lo produjo. Cambiar el modelo sin cambiar la versión es fraguar.

  3. 3
    Registro completo.

    Traza junto al resultado: parámetros, semillas, versión, horizonte y estado (Tema 33).

Re-ejecutable

Corre otra vez

El script anda en tu máquina hoy. Mañana, en otra máquina o con otra versión, da otra cosa y nadie sabe por qué.

Reproducible

Da lo mismo

Con la traza guardada, otro obtiene historias idénticas y sabe exactamente qué cambiar para explorar.

Reproducibilidad
Iguales entradas producen iguales salidas, verificable por otro.
Semilla
Valor inicial del generador que fija la secuencia aleatoria.
Versión
Identidad del código que produjo un resultado.
Traza
Registro que permite repetir una corrida idéntica.

04 · Protocolo

El pacto en cinco pasos

Fijar→Versionar→Registrar→Compartir→Repetir

Se fijan semillas, se versiona el código, se registra la traza con cada resultado, se comparte código + datos + trazas y otro repite idéntico antes de discutir conclusiones.

05 · En Python

Azar propio y traza que viaja

Cada corrida crea su generador: la misma semilla repite la historia en cualquier máquina y en cualquier orden.

Python en tu navegador. Reproducibilidad con stdlib: generadores propios y dicts.

import random

def corrida(entradas, salida, semilla, version="v1"):
    rng = random.Random(semilla)
    n, h = 10, []
    for e in entradas:
        n = max(n + e + rng.choice([-1, 0, 1]) - salida, 0)
        h.append(n)
    return {"version": version, "semilla": semilla, "historia": h}


a = corrida([3] * 6, 2, 7)
b = corrida([3] * 6, 2, 7)
print("idénticas:", a["historia"] == b["historia"])

La versión también se registra

Dos versiones del modelo con igual semilla deben poder diferir: la traza explica por qué.

r1 = corrida([3] * 6, 2, 7, version="v1")
r2 = corrida([3] * 6, 2, 7, version="v2")
print(r1["version"], r1["semilla"])
print(r2["version"], r2["semilla"])

06 · Exploración

Laboratorio: lo mismo da lo mismo

Dos corridas del mismo banco. La A siempre usa la v1. La B usa la versión que elijas, con la semilla que elijas. ¿Cuándo las historias se superponen y cuándo se separan? ¿Por azar o por versión?

EXPERIMENTO 41

A contra B

misma semilla + misma versión = idéntica

Los resultados numéricos aparecen debajo.
Semilla A7
Coinciden12 de 12
Diferencia media0
LecturaIdéntica

Misma semilla y misma versión: historias idénticas paso a paso.

Dos curvas: A (v1, semilla 7) y B (tu versión y semilla). Superpuestas es repetible; separadas explican por qué.

Preguntas para explorar

  1. Con B en v1 y semilla 7, ¿coinciden los 12 pasos? Cambiá solo la semilla de B. ¿Qué pasa?
  2. Volvé a semilla 7 y pasá B a v2. ¿Difieren aunque la semilla sea igual? ¿Por qué?
  3. Alargá a 24 pasos con todo igual. ¿Siguen idénticas? ¿Qué prueba eso sobre el azar fijado?
Ver respuestas sugeridas
  1. Sí, 12 de 12. Al cambiar la semilla difieren: distinto azar, distinta historia, como debe ser.
  2. Sí: igual semilla pero distinto modelo (v2 atiende 1 más). La traza lo explica: cambió la versión, no el azar.
  3. Sí: el generador propio repite la secuencia completa. El azar fijado no depende del largo ni del orden.

07 · Comprensión

Confusiones frecuentes

«Reproducible es parecido»

No: es idéntico ante iguales entradas. Parecido es re-ejecutable con suerte.

«Con guardar el código alcanza»

Faltan semillas, datos, versión y script de análisis. El código solo es un cuarto del pacto.

«La semilla es un detalle técnico»

Es parte del resultado: sin ella, la historia aleatoria no se puede repetir ni auditar.

«Versionar es para software grande»

Un «v1 / v2» escrito en la traza ya es versionar. Lo imperdonable es mezclar versiones sin saberlo.

08 · Práctica guiada

Ejercicios con Python

Ejercicio 1: repetir la historia

Corré dos veces con igual semilla y verificá que las historias coinciden.

import random

def historia(semilla):
    rng = random.Random(semilla)
    return [rng.choice([-1, 0, 1]) for _ in range(6)]

print(historia(7) == historia(7))
Ver solución razonada

Da True: el generador propio repite la secuencia exacta. Con azar global y otro orden, podría fallar.

Ejercicio 2: distinguir por versión

Guardá versión junto a semilla y explicá una diferencia con igual semilla.

a = {"version": "v1", "semilla": 7, "media": 8.1}
b = {"version": "v2", "semilla": 7, "media": 7.4}
print("difieren por", "versión" if a["version"] != b["version"] else "azar")
Ver solución

Imprime difieren por versión: igual semilla, distinto modelo. La traza lo dice sin adivinar.

Ejercicio 3: armar la traza mínima

Empaquetá lo mínimo que otro necesita para repetir tu corrida.

Ver una posible respuesta
traza = {"version": "v1", "semilla": 7, "entradas": [3] * 6,
         "salida": 2, "horizonte": 6, "estado": "OK"}
print(sorted(traza))

Con esas 6 claves otro repite idéntico: versión, semilla, entradas, salida, horizonte y estado.

09 · Síntesis

Ideas para recordar

  • Reproducible es idéntico ante iguales entradas, explicable cuando difiere.
  • Un generador propio por corrida con semilla registrada aísla y fija el azar.
  • Cada resultado lleva su versión: sin versión no hay auditoría.
  • La traza viaja con el resultado: parámetros, semillas, versión, horizonte, estado.
  • En Python: random.Random(semilla) por corrida y dicts de traza.

En el próximo tema cosecharemos lo andado: las ventajas de la simulación.