fix: IQL readiness uses adaptive EMA — was binary pop-on

Readiness jumped from 0 to ~0.8 in one step when CV first improved,
causing per-sample support to snap from [-1,1] to V(s)-centered
discontinuously. Same adaptive alpha pattern as eval_v_range:
α = |error| / (|error| + 0.05), clamped [0.01, 0.3]. Smooth ramp-in.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
jgrusewski
2026-04-14 14:26:05 +02:00
parent e3bd44f170
commit 7000151493

View File

@@ -729,8 +729,15 @@ void iql_adv_sigma_ema_update(
readiness_buf[2] = cv_max;
float anchor = fmaxf(cv_max, cv_initial);
float improvement = (anchor - cv) / fmaxf(anchor, 1e-6f);
readiness_buf[0] = fminf(fmaxf(improvement, 0.0f), 1.0f);
float improvement = fminf(fmaxf((anchor - cv) / fmaxf(anchor, 1e-6f), 0.0f), 1.0f);
/* Adaptive-rate EMA: smooth readiness transitions to prevent
per-sample support from snapping discontinuously. Tracks fast
when readiness changes rapidly, smooths when stable. */
float prev_r = readiness_buf[0];
float r_err = fabsf(improvement - prev_r);
float r_alpha = r_err / (r_err + 0.05f);
r_alpha = fminf(fmaxf(r_alpha, 0.01f), 0.3f);
readiness_buf[0] = (1.0f - r_alpha) * prev_r + r_alpha * improvement;
}
}