diff --git a/crates/ml/src/cuda_pipeline/epsilon_greedy_kernel.cu b/crates/ml/src/cuda_pipeline/epsilon_greedy_kernel.cu index 9e4fe515c..17e7bb25b 100644 --- a/crates/ml/src/cuda_pipeline/epsilon_greedy_kernel.cu +++ b/crates/ml/src/cuda_pipeline/epsilon_greedy_kernel.cu @@ -194,9 +194,7 @@ extern "C" __global__ void branching_action_select( const float* __restrict__ q_urgency, /* [batch_size, 3] */ unsigned int* rng_states, /* [batch_size] */ unsigned int* actions_out, /* [batch_size] -- factored index 0-44 */ - const float epsilon_exp, /* per-branch epsilon: exposure (dir+mag) */ - const float epsilon_ord, /* per-branch epsilon: order type */ - const float epsilon_urg, /* per-branch epsilon: urgency */ + const float* __restrict__ per_sample_epsilon, /* [B] state-dependent epsilon */ const int batch_size, const float q_gap_threshold, /* min Q-gap for trade entry (0.0 = disabled) */ const float* __restrict__ bonus_exposure, /* [5] UCB count bonus per exposure action (NULL = disabled) */ @@ -207,14 +205,12 @@ extern "C" __global__ void branching_action_select( if (idx >= batch_size) return; unsigned int rng = rng_states[idx]; - float eps_exp_bf = bf16(epsilon_exp); - float eps_ord_bf = bf16(epsilon_ord); - float eps_urg_bf = bf16(epsilon_urg); + float eps = per_sample_epsilon[idx]; /* Head 1: Exposure (5 actions) -- with UCB bonus + Q-gap conviction filter */ int exposure; float r1 = bf16(gpu_random(&rng)); - if (r1 < eps_exp_bf) { + if (r1 < eps) { exposure = (int)(gpu_random(&rng) * 5.0f); if (exposure >= 5) exposure = 4; } else { @@ -244,7 +240,7 @@ extern "C" __global__ void branching_action_select( /* Head 2: Order type (3 actions) -- Boltzmann softmax with UCB bonus */ int order; float r2 = bf16(gpu_random(&rng)); - if (r2 < eps_ord_bf) { + if (r2 < eps) { /* Random exploration */ order = (int)(gpu_random(&rng) * 3.0f); if (order >= 3) order = 2; @@ -279,7 +275,7 @@ extern "C" __global__ void branching_action_select( /* Head 3: Urgency (3 actions) -- Boltzmann softmax with UCB bonus */ int urgency; float r3 = bf16(gpu_random(&rng)); - if (r3 < eps_urg_bf) { + if (r3 < eps) { /* Random exploration */ urgency = (int)(gpu_random(&rng) * 3.0f); if (urgency >= 3) urgency = 2;