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:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user