# DQN Branching Rainbow Integration

## Summary
Bring the Branching DQN (Phase C+) to full GPU Rainbow parity with 7 fixes:
H1 (CUDA fallback), H2 (per-branch C51), M1 (NoisyNet), M2 (regime-conditional),
M3 (state dim alignment), L1 (fxhash fill sim), L2 (hyperopt 29D).

## Per-Branch C51 Distributional (H2)
Each branch head outputs `[batch, n_d, num_atoms]` logit distributions.
Loss = average of D cross-entropy losses against projected Bellman target.
Aggregate Q = V(s) + (1/D) * sum_d [E[A_d] - mean(E[A_d])].

## Files
- ml-dqn/src/branching.rs — NoisyLinear, distributional output, regime input
- ml-core/src/fill_simulator.rs — fxhash replacement
- ml-dqn/src/dqn.rs — distributional loss path, experience gate
- ml/src/trainers/dqn/trainer.rs — regime forwarding
- ml/src/trainers/dqn/config.rs — branching config fields
- ml/src/hyperopt/adapters/dqn.rs — 29D search space
- ml/src/cuda_pipeline/gpu_experience_collector.rs — branching fallback
