W structural prior init kernel (Step 5):
- aux_w_prior_init_kernel.cu: 4-thread one-time init writing W[a] =
[-0.5, 0.0, +0.5, 0.0] (Short / Hold / Long / Flat). Hardcoded values
in kernel — no HtoD per feedback_no_htod_htoh_only_mapped_pinned.md.
- build.rs registration + gpu_dqn_trainer.rs cubin static + handle field
+ new() launch after alloc_zeros for w_aux_to_q_dir.
compute_expected_q atom-shift (Step 6):
- experience_kernels.cu signature grows 4 args (w_aux, batch_states,
aux_dir_prob_index, state_dim). NULL-safe — collapses to 0 shift
when either pointer is NULL, bit-identical to pre-Phase-3-α.
- Per-action inner loop computes aux_atom_shift = w_aux[a] * state_121
once per (b, a) for d==0 only. Inner z-loop applies z_val +=
aux_atom_shift before all S/TZ/TZ²/TLM accumulators consume it.
Launcher updates (3 trainer sites + 1 collector site):
- populate_q_out: passes W + current states (online path).
- replay_forward_for_q_values: passes W + current states (online replay).
- compute_denoise_target_q: passes W + next_states (target on s'; W
shared across online/target).
- gpu_experience_collector.rs: passes NULL W + NULL states until
Phase C1 wires the trainer's W ptr through a setter.
Architectural notes:
- Action selection (every compute_expected_q call) now uses shifted
atom positions for direction branch (d==0). Other branches stay
bit-identical (shift = 0). Step 7 (c51_loss_kernel) + Step 8
(c51_grad_kernel) will close the loop on training loss + W gradient
in the same atomic commit to avoid the gradient mismatch trap
per feedback_no_partial_refactor.md.
- Adam wireup for w_aux_to_q_dir lands at Step 11; until then W stays
at structural prior values (no Adam step modifies it).
Verification:
- cargo check -p ml --lib: 0 errors, 21 pre-existing warnings
(Phase 3b baseline parity).
- Audit doc updated with B9 Step 5+6 checkpoint entry.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>