fix(sp5): Task A6 — close two minor review findings

Combined spec/quality review caught two minor issues in the Pearl 6
commit. Both are mechanical fixes; no behavior change.

1. Test 12 (pearl_6_kelly_within_fold_ewma_blend) was missing an
   explicit assertion for slot 282 (TRADE_VAR_SMOOTH_IDX). The test
   setup initialized tvar_i32 and the launcher passed it through the
   kernel's parameter slot, but no assert! ever fired against the
   resulting ISV value. With n_envs=1, the kernel's
   `(kelly_count > 1) ? variance : 0.0f` branch returns 0 (no
   cross-env variance possible with 1 env), so EWMA blend yields
   0.99 × 0.5 + 0.01 × 0.0 = 0.495. Added the missing assertion to
   close the within-fold coverage gap for s==2.

2. pearl_6_kelly_kernel.cu:136 doc comment said the slot computes
   "standard deviation of per-env Kelly fractions" but the code
   actually computes `ksum_sq / kelly_count` — i.e. the variance
   (second moment), not the standard deviation. The slot name
   TRADE_VAR_SMOOTH_INDEX correctly indicates variance; the comment
   was wrong. Updated comment to match: 'variance of per-env Kelly
   fractions' with explicit note that this is the second moment,
   NOT std-dev (no sqrtf applied).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
jgrusewski
2026-05-01 23:31:37 +02:00
parent 5b4cdec4ff
commit f40ccc16a7
3 changed files with 15 additions and 2 deletions

View File

@@ -133,8 +133,10 @@ extern "C" __global__ void pearl_6_kelly_update(
new_obs = current;
} else if (s == 2) {
/* trade_var_smooth: variance proxy — standard deviation of per-env Kelly
* fractions across envs (measures cross-env PnL dispersion).
/* trade_var_smooth: variance of per-env Kelly fractions across envs
* (measures cross-env PnL dispersion). Computed as the second moment
* `ksum_sq / kelly_count` — i.e. variance, NOT standard deviation;
* matches the slot name TRADE_VAR_SMOOTH_INDEX.
* Second pass over envs: same Bayesian-prior formula, accumulate sq-dev. */
float kelly_mean = (kelly_count > 0)
? (kelly_sum / (float)kelly_count)

View File

@@ -1669,6 +1669,15 @@ fn pearl_6_kelly_within_fold_ewma_blend() {
let expected_lr = 0.99 * 0.5 + 0.01 * (5.0_f32 / 15.0);
assert!((isv[LOSS_RATE_SMOOTH_IDX] - expected_lr).abs() < 2e-5,
"loss_rate: expected {expected_lr:.6}, got {:.6}", isv[LOSS_RATE_SMOOTH_IDX]);
// slot 282 — trade_var_smooth: variance of per-env Kelly fractions across envs.
// With n_envs=1, kelly_count=1, the kernel's `(kelly_count > 1) ? var : 0.0f`
// branch returns 0.0 (single-env can't have cross-env variance).
// EWMA blend: 0.99 × 0.5 + 0.01 × 0.0 = 0.495.
let expected_tvar = 0.99 * 0.5 + 0.01 * 0.0_f32;
assert!((isv[TRADE_VAR_SMOOTH_IDX] - expected_tvar).abs() < 2e-5,
"trade_var: expected {expected_tvar:.6} (n_envs=1 → variance=0; EWMA blend with prior 0.5), got {:.6}",
isv[TRADE_VAR_SMOOTH_IDX]);
}
/// SP5 Task A6 Test 13: cross-fold sample_count persists via max().

File diff suppressed because one or more lines are too long