From d0f5e322b13e5641882e034cbdd57927fda57fde Mon Sep 17 00:00:00 2001 From: jgrusewski Date: Wed, 8 Apr 2026 17:39:58 +0200 Subject: [PATCH] =?UTF-8?q?test(magnitude):=203=20unit=20tests=20=E2=80=94?= =?UTF-8?q?=20epsilon=20parity,=20counterfactual=20weight,=20micro-reward?= =?UTF-8?q?=20scaling?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.6 (1M context) --- .../src/trainers/dqn/smoke_tests/reward_v8.rs | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/crates/ml/src/trainers/dqn/smoke_tests/reward_v8.rs b/crates/ml/src/trainers/dqn/smoke_tests/reward_v8.rs index 49c549672..b6655d222 100644 --- a/crates/ml/src/trainers/dqn/smoke_tests/reward_v8.rs +++ b/crates/ml/src/trainers/dqn/smoke_tests/reward_v8.rs @@ -170,4 +170,38 @@ mod tests { "Flat × mag={mag} must be zero"); } } + + #[test] + fn test_magnitude_epsilon_equals_direction() { + let eps_start = 0.20_f64; + let eps_end = 0.02; + let eps_old_mag = eps_end + 0.1 * (eps_start - eps_end); + let eps_new_mag = eps_start; + assert!(eps_new_mag > eps_old_mag * 4.0, + "New magnitude epsilon ({eps_new_mag}) should be >4× old ({eps_old_mag})"); + assert!((eps_new_mag - eps_start).abs() < 1e-10, + "Magnitude epsilon should equal direction epsilon"); + } + + #[test] + fn test_counterfactual_weight() { + let cf_weight = 0.3_f64; + let flat_fraction = 0.58; + let effective = cf_weight * flat_fraction + 1.0 * (1.0 - flat_fraction); + assert!(effective > 0.5, "Effective gradient should be >50%: {effective}"); + assert!(effective < 1.0, "Counterfactual must reduce magnitude gradient: {effective}"); + let amp = 1.0 / effective; + assert!((amp - 1.68).abs() < 0.1, "Expected ~1.68× amplification, got {amp}"); + } + + #[test] + fn test_magnitude_micro_reward_scaling() { + let dir_reward = 0.01_f64; + let adaptive_scale = 1.0; + let micro_vol = 0.005; + let small_reward = adaptive_scale * dir_reward * 0.25 / micro_vol; + let full_reward = adaptive_scale * dir_reward * 1.00 / micro_vol; + assert!((full_reward / small_reward - 4.0).abs() < 1e-10, + "Full/Small reward ratio should be 4.0, got {}", full_reward / small_reward); + } }