From 70001514933f455aaf487be997e4b8b10ddf211f Mon Sep 17 00:00:00 2001 From: jgrusewski Date: Tue, 14 Apr 2026 14:26:05 +0200 Subject: [PATCH] =?UTF-8?q?fix:=20IQL=20readiness=20uses=20adaptive=20EMA?= =?UTF-8?q?=20=E2=80=94=20was=20binary=20pop-on?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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) --- crates/ml/src/cuda_pipeline/iql_value_kernel.cu | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/crates/ml/src/cuda_pipeline/iql_value_kernel.cu b/crates/ml/src/cuda_pipeline/iql_value_kernel.cu index 9073364e0..9ca063639 100644 --- a/crates/ml/src/cuda_pipeline/iql_value_kernel.cu +++ b/crates/ml/src/cuda_pipeline/iql_value_kernel.cu @@ -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; } }