//! Test DQNHyperparameters struct has hold_penalty field //! //! This test verifies that the DQNHyperparameters struct includes the new fields //! needed for action-aware reward system (Wave 2 preparation). use ml::trainers::dqn::DQNHyperparameters; #[test] fn test_dqn_hyperparameters_has_hold_penalty_field() { // Create hyperparameters manually (conservative() removed in Wave B) let hyperparams = DQNHyperparameters { learning_rate: 0.0001, batch_size: 128, gamma: 0.99, epsilon_start: 1.0, epsilon_end: 0.01, epsilon_decay: 0.995, buffer_size: 100000, min_replay_size: 1000, epochs: 100, checkpoint_frequency: 10, early_stopping_enabled: true, q_value_floor: 0.5, min_loss_improvement_pct: 2.0, plateau_window: 30, min_epochs_before_stopping: 50, hold_penalty: -0.001, }; // Field should exist and have the default value of 0.01 assert_eq!( hyperparams.hold_penalty, -0.001, "hold_penalty should be -0.001" ); } #[test] fn test_dqn_hyperparameters_manual_construction_with_new_fields() { // Test that we can manually construct DQNHyperparameters with new fields let hyperparams = DQNHyperparameters { learning_rate: 0.0001, batch_size: 128, gamma: 0.99, epsilon_start: 1.0, epsilon_end: 0.01, epsilon_decay: 0.995, buffer_size: 100000, min_replay_size: 1000, epochs: 100, checkpoint_frequency: 10, early_stopping_enabled: true, q_value_floor: 0.5, min_loss_improvement_pct: 2.0, plateau_window: 30, min_epochs_before_stopping: 50, hold_penalty: -0.001, }; assert_eq!(hyperparams.hold_penalty, -0.001); } #[test] fn test_hold_penalty_range() { // Test various penalty values (negative values penalize HOLD action) let test_penalties = vec![-0.01, -0.001, 0.0, 0.001, 0.01]; for penalty in test_penalties { let hyperparams = DQNHyperparameters { learning_rate: 0.0001, batch_size: 128, gamma: 0.99, epsilon_start: 1.0, epsilon_end: 0.01, epsilon_decay: 0.995, buffer_size: 100000, min_replay_size: 1000, epochs: 100, checkpoint_frequency: 10, early_stopping_enabled: true, q_value_floor: 0.5, min_loss_improvement_pct: 2.0, plateau_window: 30, min_epochs_before_stopping: 50, hold_penalty: penalty, }; assert_eq!(hyperparams.hold_penalty, penalty); } }