Files
foxhunt/crates/ml/tests
jgrusewski 66f7e64d13 fix(sp5): D1 rewrite — match production per-bar semantics, fix D4 blocker
The original D1 kernel (commit 5ee795f14) was authored against a brief
that assumed per-trade event arrays exist in production. They don't.
Production has per-bar step_returns + done_flags with episode-boundary
resets, plus already-aggregated summary scalars (sum_returns,
sum_sq_returns) on TradeStats. The previous D4 agent found this
mismatch as a structural blocker and stopped before any code changes.

This rewrite fixes the kernel internals to match compute_epoch_financials
in financials.rs bit-for-bit. The slot allocation (ISV[286..290) for
PNL_TOTAL/MEAN/VAR/MAX_DD), Pearls A+D chain, and reset registry are
unchanged — only the kernel interface and max_dd internals shift.

What changed:
  - pnl_aggregation_kernel.cu: full rewrite. New signature consumes
    step_returns[N], done_flags[N], num_bars, n_trades, sum_returns,
    sum_sq_returns, initial_capital. pnl_total uses log-space
    compounded growth (financials.rs:80-97). pnl_mean/pnl_var are
    per-trade (financials.rs:122-124). pnl_max_dd implements per-bar
    equity walk over last 10K bars with reset at done_flags > 0.5
    AFTER processing the bar's return (matches financials.rs:163-194
    line-by-line, including 1.0 cap).
  - launch_sp5_pnl_aggregation: signature updated to match. 2
    MappedF32Buffers + 5 i32/f32 scalars instead of 3 mapped-pinned
    buffers + 1 count. Same Pearls A+D chain on the same stream.
  - sp5_isv_slots.rs: PNL slot docstring updated to reflect the actual
    output semantics (slot constants unchanged).
  - SCRATCH_PNL_AGG_BASE docstring + cubin static docstring + field
    docstring updated.
  - sp5_producer_unit_tests::pnl_aggregation_kernel_correctness:
    rewritten with new oracle. Inputs cover an episode boundary at
    bar 2 so the reset semantics are observable; expected values
    derived analytically from the host formula (no CPU oracle in the
    test process, per feedback_no_cpu_test_fallbacks).
  - Audit doc: D1-rewrite entry supersedes original D1 entry, with a
    line-by-line formula provenance table for D4 reviewers.

Unchanged: ISV slot allocation (sp5_isv_slots.rs constants),
SP5_SLOT_END/SP5_PRODUCER_COUNT/ISV_TOTAL_DIM, wiener offsets,
state_reset_registry arm + dispatch, build.rs cubin registration.
The kernel filename stays the same; only the file contents change.

Formula fidelity provenance (financials.rs as the oracle):
  - pnl_total: lines 80-97 (log-space sum, 1e-10 floor, exp − 1)
  - pnl_mean:  line 122   (per-trade sum_returns / n_trades)
  - pnl_var:   lines 123-124 (per-trade E[X²] − E[X]², .max(0))
  - pnl_max_dd: lines 163-194 (10K window, post-update reset, 1.0 cap)

Tests: cargo check + cargo build --features cuda clean; ISV slot +
state_reset_registry tests pass (8/8 unchanged); rewritten GPU
correctness test fires on next L40S smoke.

This unblocks D4 atomic wiring (D1+D2+D3 into the production hot
path with host-EMA removal). D4 dispatch resumes once this lands.

Refs: SP5 plan §D Task D1 + the structural blocker investigation by
the prior D4 agent (no commit; investigation reported up).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-02 17:25:10 +02:00
..