Files
foxhunt/docs
jgrusewski 26deaa5004 feat(sp21): T2.2 Phase 1.5 + Phase 2 — entry_q tracking + enrichment real-tape wireup (atomic)
Closes the multi-step T2.2 work. Phase 1.5 captures entry_q (predicted
Q at trade open) on the per-trade tape; Phase 2 wires
enrichment::run_enrichments to the real GpuBacktestEvaluator
per-trade tape and deletes the fake-trade synthesizer
(extract_eval_trades_from_metrics) per feedback_no_stubs.

Plan amendment from on-paper design:
- Audit caught plan's "portfolio_state[ps+6] is unused" claim was
  wrong — slot 6 is in active use as cum_return. Replaced with a
  dedicated entry_q_state_buf [n_windows] separate from
  portfolio_state. Doesn't touch shmem layout, gather kernel, or
  model state-dim.
- E5 design question resolved as option (2): quartile-spread Sharpe
  with ISV-driven significance anchor read from
  ISV[VAL_SHARPE_VAR_EMA_INDEX=351] (per
  pearl_controller_anchors_isv_driven). Hardcoded 1.5σ/0.5σ
  thresholds eliminated; the noise floor is the val_sharpe variance
  EMA already produced per epoch by the early-stopping pipeline.
- Single-step evaluate() launcher passes NULL q_values_per_window
  (forward_fn closure exposes only action indices, not Q-values);
  same NULL-tolerant pattern as exploration_scale_ptr et al. The
  production val pipeline (chunked path) DOES wire real Q-values.

Files (atomic per feedback_no_partial_refactor):
- backtest_env_kernel.cu: 4 new args at end of both kernels
  (entry_q_state, q_values_per_window, num_actions,
  per_trade_predicted_q_out); pre_entry_q snapshot + close emit +
  open/reverse capture.
- gpu_backtest_evaluator.rs: entry_q_state_buf + per_trade_predicted_q_buf
  allocated; both reset in reset_evaluation_state; both launchers
  migrated; EvalTrade.predicted_q field added; read_per_trade_tape
  populates it.
- trainer/enrichment.rs: EvalTrade is now pub(crate) use re-export
  from gpu_backtest_evaluator (drops ensemble_var); E5 refactored
  to quartile-spread Sharpe with ISV-driven anchor;
  extract_eval_trades_from_metrics deleted; HindsightExperience
  retained (Phase 6 wiring).
- trainer/training_loop.rs: enrichment block replaced with
  evaluator.read_per_trade_tape() + ISV slot 351 read; val_bars /
  real_trade_count / real_total_pnl / real_win_rate plumbing
  dropped.
- trainer/{mod,constructor,metrics}.rs: last_val_metrics field
  removed (last consumer gone — feedback_no_hiding).
- docs/dqn-wire-up-audit.md: 2026-05-11 audit entry.

Verification (passing):
- SQLX_OFFLINE=true cargo check -p ml --tests --features cuda
- sp20_aggregate_inputs_test (12/12)
- sp20_phase1_4_wireup_test (2/2)
- sp20_emas_compute_test (4/4)
- sp20_controllers_compute_test (7/7)

After-this scope (Phase 3-7 + Phase 8 in T2.2 multi-phase):
- E1 q_correction → ISV slot consumer
- E4 per-branch LR scaling via per-group Adam
- E6 winner indices → PER priority bumps
- E7 hindsight → replay buffer injection
- E8 curriculum weights → segment sampling
- Signal-drive remaining controller GAINS (0.9/1.1 in E5; 2.0/0.5/-0.5 in E2)

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