Files
foxhunt/crates/ml/tests
jgrusewski 71aade18cf feat(sp20): Phase 1.2 sp20_emas_compute kernel
Component 5 / Kernel 1 of the SP20 design — central state-tracker
that updates 8 Wiener-α EMAs per training step:

  - 4 ISV slots:    ALPHA_EMA (511), WR_EMA (512),
                    HOLD_PCT_EMA (515), HOLD_REWARD_EMA (516)
  - 4 internal:     trade_duration_ema, aux_conf_p50_ema,
                    aux_conf_std_ema, aux_dir_acc_ema (private
                    scratch consumed by Phase 1.3 controllers)

Per-EMA i32 observation counters (mapped-pinned obs_count[8])
handle the pearl_first_observation_bootstrap sentinel transition
correctly even when 0.0 is a legitimate observation (e.g.,
first-loss WR=0). count==0 ⇒ replace, count>0 ⇒ Wiener-blend at
α = 0.4 (WIENER_ALPHA_FLOOR per
pearl_wiener_alpha_floor_for_nonstationary).

Phase 1.2 lands kernel + launcher + 5 tests (4 GPU oracle, 1
floor lock) + build entry + audit doc atomically per
feedback_no_partial_refactor. Production wire-up (Phase 1.4)
deferred — kernel is dead code until then.

Verified on RTX 3050 Ti (sm_86):
  - 4 GPU oracle tests pass: first_observation_replaces_sentinel,
    wiener_alpha_converges_to_long_run_mean,
    hold_reward_ema_gated_on_hold_bars,
    per_step_emas_fire_unconditionally
  - 4 launcher unit tests pass (constants + struct sanity)
  - 1 floor-lock test pass (WIENER_ALPHA_FLOOR == 0.4)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-09 18:57:30 +02:00
..