# ROS2: primer motor Rosenbrock

Plan del 2026-10-04, primer hito implementado. Objetivo: incorporar operaciones nuevas (campo diferencial, Jacobiano y resoluciones lineales) sin cambiar los motores RK, GLM ni PGLM. Selector operativo `ROS=[1]`, ID arbitrario de la familia ROS: metodo ROS2, no RK1 ni PGLM1. Inicialmente paso fijo con ultimo paso acortado, sin listas, adaptacion, mdin, discontinuidades, DT/TICK en el modelo, convoluciones, RERUN ni CONTINUE. Uso y contrato en [ROS.md](ROS.md).

## Modelo e interfaz

Calcula resuelve el modelo residual `R(t,y,z)=0` con parametros, tiempo y estados impuestos. Entre las incognitas z estan las derivadas de y y las variables algebraicas. Pedir las derivadas produce el campo reducido `f(t,y)`. Se requiere solucion local unica y suficientemente suave; no se promete soporte DAE de indice alto ni eleccion de ramas de soluciones multiples.

El Jacobiano requerido es `J_ij = d f_i / d y_j`. No es el Jacobiano de R usado por Newton. El primer proveedor aproxima J por diferencias centrales: perturba un estado, vuelve a resolver TODO z, y diferencia las derivadas resultantes. Tambien calcula la derivada temporal parcial con y fijo; solo necesita EVAL. El quinto hito agrega SENS1 en Calcula para obtener `R_z z_y = -R_y` y `R_z z_t = -R_t`, factorizando R_z una vez. Ambos proveedores se conservan y no requieren SWIG.

## Formula elegida

Coeficientes ROS-2 de [KPP](https://kpp.readthedocs.io/en/stable/num_methods/rosenbrock-methods.html#ros-2), con gamma=1+1/sqrt(2). Usamos vectores columna y J_ij=df_i/dy_j; no trasponemos J. Es un metodo de orden dos y dos etapas. Definiendo `M=I-gamma*h*J`, las ecuaciones escaladas son:

```text
M k1 = gamma*h*f(t,y) + gamma^2*h^2*f_t(t,y)
M k2 = gamma*h*f(t+h,y+k1/gamma) - 2*k1 - gamma^2*h^2*f_t(t,y)
y_nuevo = y + (3*k1+k2)/(2*gamma)
```

Se factoriza M una vez por paso y se resuelven dos segundos miembros. El termino f_t no se omite en modelos no autonomos. La estabilidad L del metodo teorico no certifica la exactitud de un Jacobiano obtenido de soluciones numericas ruidosas.

## Trabajo y verificaciones

1. Implementar un proveedor de campo sobre Calcula persistente, con diferencias centrales, controles de dimensiones y finitud y errores contextualizados. Usar perturbaciones relativas 1e-4 por max(1,abs(variable)); documentar limitaciones por escalas, ruido del solver y dominio de las perturbaciones.
2. Implementar LU densa con pivoteo escalado y reutilizacion, y el paso ROS2 independiente del conductor. Probar matrices no simetricas, pivoteo, singularidad, campos lineales/no lineales y termino temporal. Primer alcance: sistemas pequenos.
3. Generar en C un `.din` ROS autosuficiente: ecuaciones del modelo base, corrida, pares estado/derivada y descriptor versionado. Los p_estado del contrato temporal son resultados del motor, no incognitas ficticias agregadas a Calcula. No volver a interpretar el circuito en Perl.
4. Reconocer ROS en `.d`, `.ds`, `.dat` y `.din`; comprobar exclusiones y rechazar capacidades pendientes antes de simular. Conectar el motor al conductor existente para tiempo y salida atomica; mantener los pasos de RK/GLM/PGLM intactos.
5. Agregar corpus escalar, no autonomo y circuito de seis elementos. Verificar convergencia de orden dos, recurrencia independiente, ultimo paso acortado, ejecucion desde din aislado, rechazo de errores y preservacion de la salida anterior.
6. Ejecutar regresiones completas, actualizar estado/documentacion y hacer commits acotados frecuentes. Revisar archivos reales y diffs antes de cada commit: otra sesion trabaja en libdin/din.c. En din.c solo se preve una linea de inclusion de ros.inc, sin reescribir el armador compartido.

## Despues del primer hito

| Ampliacion | Motivo |
| --- | --- |
| Sensibilidades en Calcula | Implementadas como SENS1 y proveedor ROS optativo v5; controles de diferencias y matriz escalada. |
| Escalas de estado/tiempo configurables | Implementadas en descriptor v2, con comprobacion de diferencias centrales y refinamiento acotado. Contrato en ROS.md. |
| Estimador embebido y adaptacion | Implementados en v3: error directo 2(1), reintentos desde el estado aceptado, tolerancias SIRU y limites. |
| Algebra lineal especializada | Sistemas grandes/dispersos y diagnostico de condicionamiento. |
| ROS3/RODAS y variantes W | Reutilizar las capacidades nuevas con contratos y pruebas propios. |

Estado al completar el primer hito: pasos 1-6 implementados dentro del alcance indicado. Las pruebas ROS incluyen la cadena desde `.d/.ds/.dat`, un `.din` aislado con OUTPUTS, campos no autonomos y con variables algebraicas, y el circuito de seis elementos contra un calculo independiente. El protocolo de Calcula no se modifico.

Segundo hito: escalas y control de consistencia implementados. El generador escribe v2 con ROS_ESCALAS, ROS_ESCALA_TIEMPO, ROS_DELTA y ROS_CONTROL_JACOBIANO resueltos dentro del din. Se conservan los v1. Se comparan aproximaciones con perturbaciones sucesivas, en unidades adimensionales, sin presentar la coincidencia como garantia de exactitud. Corpus y pruebas incluyen distintas unidades, refinamientos agotados y escalas pequenas. No se toca din.c ni los otros motores.

Tercer hito implementado: estimador embebido de ROS2 y adaptacion temporal, contrato v3. Error directo `(k1+k2)/(2*gamma)`, orden h^2, usando las mismas etapas. El conductor acepta la solucion principal de orden dos y reintenta sin cambiar tiempo ni estado aceptados. Tolerancias SIRU separadas del control del Jacobiano; modo fijo v1/v2 conservado. Un fallo de campo, Jacobiano, LU o protocolo se propaga sin rescatarlo reduciendo h. Corpus y pruebas incluyen rechazos, precision con tolerancias distintas, rigidez, ultimo paso, limites, compatibilidad y din aislado.

El cambio comun del conductor se limita a dos opciones optativas: error_embebido_directo (evita restar estados grandes) y fallo_paso_fatal (evita los rescates de Newton en ROS). Por defecto no afectan RK/GLM/PGLM. No se modifican din.c ni el protocolo de Calcula. La configuracion del generador sigue viniendo de din_config; ros.inc escribe su representacion con errores virtuales e_estado.

Cuarto hito implementado: ROS_TOLERANCIAS por nombre, con respaldo global resuelto en descriptor v4, y estadisticas de intentos, aceptados, rechazos y consultas EVAL en el informe .informe. v1/v2/v3 siguen operativos. El conductor admite un mapa optativo por_estado y un hash de estadisticas; sin ellos conserva el calculo anterior. Pruebas de unidades distintas, din aislado, limites, OUTPUTS y fallos. No se modifica Calcula.

## Quinto hito: sensibilidades desde Calcula (implementado)

Diagnostico previo: machine.c solo exponia EVAL, SEMILLAS e ITER. El Jacobiano interno de Newton incluye tratamiento especial de colgantes y no es el del campo reducido. Por eso se implemento una operacion nueva sobre los residuos originales del punto convergido, con factorizacion propia.

1. CAPS anuncia SENS1; READY 1 y EVAL se conservan. SENS transporta datos, salidas, WRT, CONTROL y SCALES; responde punto y matriz por filas con 17 cifras. Errores especificos SENSITIVITY, sin respaldo silencioso.
2. Calcula construye R_z y R_q por diferencias de residuos, factoriza R_z una vez por peticion y resuelve todos los segundos miembros. No reutiliza la LU de Newton.
3. Escalas tambien para algebraicas, comprobacion a h/h2, perturbaciones representables, dominios/restricciones y finitud; residuo escalado <=1e-8 y relacion singular >1e-10. Restaura el evaluador al terminar/fallar. No certifica precision ni detecta todas las ramas no suaves; son precondiciones del modelo.
4. ROS_JACOBIANO=[SENSIBILIDADES] genera v5 autosuficiente, fijo o adaptativo. ROS_ESCALAS_RESIDUO configura el mapa completo. CampoSensibilidad separa el proveedor del motor temporal; consultas_sensibilidad se cuenta aparte de consultas_campo. campo_central sigue por defecto.
5. Pruebas analiticas, cambios de unidades, matrices no simetricas, singularidad, dominio, NaN colgante y errores intercalados en Calcula; J/f_t, trayectorias, costos, circuito de seis elementos y contratos en siru. Regresiones completas de ambos proyectos y commits separados. Detalles de verificacion en ROS.md.

Despues: medir tiempos en corpus mas grande, mejorar diagnosticos (valores de condicionamiento y variable que falla), algebra dispersa y reutilizacion controlada del Jacobiano entre intentos. mdin/eventos requieren un contrato de reinicio y pruebas propias; no se habilitan como efecto secundario.
