From 5c18f17a01e27d57bb62243f6d08b23ec2dcf3a5 Mon Sep 17 00:00:00 2001 From: jgrusewski Date: Sat, 7 Mar 2026 22:21:18 +0100 Subject: [PATCH] refactor(ml): extract shared items from dqn/ to top-level modules MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Move mixed_precision, xavier_init, portfolio_tracker, action_space, order_router from dqn/ to ml/src/ root. Extract TradingAction enum from dqn/agent.rs to standalone trading_action module. Re-export from dqn/mod.rs for backward compatibility. These modules are shared infrastructure used by PPO, trainers, hyperopt, and ensemble — not DQN-specific. Test results: 2757 passed, 0 failed, 25 ignored (unchanged). Co-Authored-By: Claude Opus 4.6 --- crates/ml/src/{dqn => }/action_space.rs | 0 crates/ml/src/dqn/agent.rs | 33 +----------------- crates/ml/src/dqn/mod.rs | 17 ++++----- crates/ml/src/lib.rs | 8 +++++ crates/ml/src/{dqn => }/mixed_precision.rs | 0 crates/ml/src/{dqn => }/order_router.rs | 2 +- crates/ml/src/{dqn => }/portfolio_tracker.rs | 4 +-- crates/ml/src/trading_action.rs | 36 ++++++++++++++++++++ crates/ml/src/{dqn => }/xavier_init.rs | 0 9 files changed, 57 insertions(+), 43 deletions(-) rename crates/ml/src/{dqn => }/action_space.rs (100%) rename crates/ml/src/{dqn => }/mixed_precision.rs (100%) rename crates/ml/src/{dqn => }/order_router.rs (98%) rename crates/ml/src/{dqn => }/portfolio_tracker.rs (99%) create mode 100644 crates/ml/src/trading_action.rs rename crates/ml/src/{dqn => }/xavier_init.rs (100%) diff --git a/crates/ml/src/dqn/action_space.rs b/crates/ml/src/action_space.rs similarity index 100% rename from crates/ml/src/dqn/action_space.rs rename to crates/ml/src/action_space.rs diff --git a/crates/ml/src/dqn/agent.rs b/crates/ml/src/dqn/agent.rs index 4de10908d..145f9bd48 100644 --- a/crates/ml/src/dqn/agent.rs +++ b/crates/ml/src/dqn/agent.rs @@ -24,38 +24,7 @@ use super::network::{QNetwork, QNetworkConfig}; use super::{Experience, ReplayBuffer, ReplayBufferConfig}; use crate::MLError; -/// Trading actions available to the `DQN` agent -#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] -pub enum TradingAction { - /// Buy signal - Buy = 0, - /// Sell signal - Sell = 1, - /// Hold/Do nothing - Hold = 2, -} - -impl TradingAction { - /// Convert action to integer index - pub fn to_int(self) -> u8 { - self as u8 - } - - /// Convert integer index to action - pub fn from_int(val: u8) -> Option { - match val { - 0 => Some(TradingAction::Buy), - 1 => Some(TradingAction::Sell), - 2 => Some(TradingAction::Hold), - _ => None, - } - } - - /// Get all possible actions - pub fn all() -> [TradingAction; 3] { - [TradingAction::Buy, TradingAction::Sell, TradingAction::Hold] - } -} +pub use crate::trading_action::TradingAction; /// Trading state representation for `DQN` #[derive(Debug, Clone, Serialize, Deserialize)] diff --git a/crates/ml/src/dqn/mod.rs b/crates/ml/src/dqn/mod.rs index cee2c759e..80f61f07f 100644 --- a/crates/ml/src/dqn/mod.rs +++ b/crates/ml/src/dqn/mod.rs @@ -4,9 +4,15 @@ //! with all 6 components: Double Q-learning, Dueling Networks, Prioritized Experience Replay, //! Multi-step Learning, Distributional RL (C51), and Noisy Networks. +// Shared modules moved to crate root — re-export for backward compatibility +pub use crate::action_space; +pub use crate::order_router; +pub use crate::mixed_precision; +pub use crate::xavier_init; +pub use crate::portfolio_tracker; +pub use crate::trading_action::TradingAction; + // Original DQN components -pub mod action_space; // Factored action space (5 DQN exposure actions + deterministic order routing) -pub mod order_router; // Deterministic order routing: exposure → (order_type, urgency) from microstructure pub mod count_bonus; // UCB count-based exploration bonus for action diversity pub mod agent; pub mod attention; // Multi-head self-attention for temporal pattern recognition (Wave 26 P1.2) @@ -19,7 +25,6 @@ pub mod hindsight_replay; // Hindsight Experience Replay for 5-10x data efficien pub mod logging; // Optimized logging utilities for ML training (Wave 30) pub mod network; pub mod nstep_buffer; // N-step experience buffer for multi-step returns (Wave 2.2) -pub mod portfolio_tracker; pub mod regime_conditional; // Regime-conditional Q-networks (3 heads: Trending, Ranging, Volatile) pub mod replay_buffer; pub mod residual; // Residual/skip connections for better gradient flow (Wave 26 P0.4) @@ -29,7 +34,6 @@ pub mod logit_clipping; // Bug #12: Clip logits before softmax to prevent satura pub mod target_update; // Target network update strategies (Polyak averaging, hard updates) pub mod trade_executor; // Risk controls and execution simulation pub mod trainable_adapter; // UnifiedTrainable trait implementation -pub mod xavier_init; // Xavier/Glorot weight initialization // Wave 16 Portfolio Features pub mod entropy_regularization; // Entropy-based policy diversity @@ -72,7 +76,7 @@ pub mod performance_validation; // Re-export core DQN types for public usage pub use action_space::{ExposureLevel, FactoredAction, OrderType, Urgency}; pub use order_router::OrderRouter; -pub use agent::{AgentMetrics, DQNAgent, TradingAction, TradingState}; +pub use agent::{AgentMetrics, DQNAgent, TradingState}; pub use dqn::{GradientResult, DQN, DQNConfig}; pub use experience::{Experience, ExperienceBatch}; pub use nstep_buffer::NStepBuffer; @@ -112,9 +116,6 @@ pub use logit_clipping::{clip_logits, clip_logits_default, softmax_with_clipping // Re-export GAE components (Wave 26 P1.9) pub use gae::{GAECalculator, GAEConfig}; -// Wave 26 P2.1: Mixed precision (AMP) for 2x speedup -pub mod mixed_precision; - // Wave 26 P2.3: Ensemble Q-network for uncertainty estimation pub mod ensemble_network; diff --git a/crates/ml/src/lib.rs b/crates/ml/src/lib.rs index ad5887f0c..1dede44b2 100644 --- a/crates/ml/src/lib.rs +++ b/crates/ml/src/lib.rs @@ -780,6 +780,14 @@ pub const PRECISION_FACTOR: i64 = 100_000_000; /// Maximum inference latency target in microseconds pub const MAX_INFERENCE_LATENCY_US: u64 = 100; +// ========== SHARED INFRASTRUCTURE (extracted from dqn/) ========== +pub mod action_space; // Factored action space (5 DQN exposure actions + deterministic order routing) +pub mod mixed_precision; // AMP utilities for 2x speedup (FP16/BF16) +pub mod order_router; // Deterministic order routing: exposure -> (order_type, urgency) from microstructure +pub mod portfolio_tracker; // Portfolio state tracking for training +pub mod trading_action; // TradingAction enum (Buy/Sell/Hold) +pub mod xavier_init; // Xavier/Glorot weight initialization + // ========== CORE ML MODULES ========== // Core ML modules pub mod backtesting; // Backtesting framework for barrier optimization diff --git a/crates/ml/src/dqn/mixed_precision.rs b/crates/ml/src/mixed_precision.rs similarity index 100% rename from crates/ml/src/dqn/mixed_precision.rs rename to crates/ml/src/mixed_precision.rs diff --git a/crates/ml/src/dqn/order_router.rs b/crates/ml/src/order_router.rs similarity index 98% rename from crates/ml/src/dqn/order_router.rs rename to crates/ml/src/order_router.rs index 4771747cc..da49fb5a5 100644 --- a/crates/ml/src/dqn/order_router.rs +++ b/crates/ml/src/order_router.rs @@ -5,7 +5,7 @@ //! spread and volatility conditions. This separates the alpha model //! (what exposure?) from execution (how to route?). -use super::action_space::{ExposureLevel, FactoredAction, OrderType, Urgency}; +use crate::action_space::{ExposureLevel, FactoredAction, OrderType, Urgency}; /// Deterministic order routing based on market microstructure. /// DQN selects exposure level (0-4), OrderRouter selects order type + urgency. diff --git a/crates/ml/src/dqn/portfolio_tracker.rs b/crates/ml/src/portfolio_tracker.rs similarity index 99% rename from crates/ml/src/dqn/portfolio_tracker.rs rename to crates/ml/src/portfolio_tracker.rs index dce492480..6de03136f 100644 --- a/crates/ml/src/dqn/portfolio_tracker.rs +++ b/crates/ml/src/portfolio_tracker.rs @@ -8,8 +8,8 @@ //! The PortfolioTracker is used by DQNTrainer to provide portfolio features //! to the reward function, enabling P&L-based reward calculations. -use super::action_space::FactoredAction; -use super::agent::TradingAction; +use crate::action_space::FactoredAction; +use crate::trading_action::TradingAction; use tracing::{debug, warn}; /// Trade action enum with quantities for TradeExecutor diff --git a/crates/ml/src/trading_action.rs b/crates/ml/src/trading_action.rs new file mode 100644 index 000000000..fd2bc5eb5 --- /dev/null +++ b/crates/ml/src/trading_action.rs @@ -0,0 +1,36 @@ +//! Trading action enum shared across DQN, PPO, ensemble, and other ML modules. + +use serde::{Deserialize, Serialize}; + +/// Trading actions available to the `DQN` agent +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +pub enum TradingAction { + /// Buy signal + Buy = 0, + /// Sell signal + Sell = 1, + /// Hold/Do nothing + Hold = 2, +} + +impl TradingAction { + /// Convert action to integer index + pub fn to_int(self) -> u8 { + self as u8 + } + + /// Convert integer index to action + pub fn from_int(val: u8) -> Option { + match val { + 0 => Some(TradingAction::Buy), + 1 => Some(TradingAction::Sell), + 2 => Some(TradingAction::Hold), + _ => None, + } + } + + /// Get all possible actions + pub fn all() -> [TradingAction; 3] { + [TradingAction::Buy, TradingAction::Sell, TradingAction::Hold] + } +} diff --git a/crates/ml/src/dqn/xavier_init.rs b/crates/ml/src/xavier_init.rs similarity index 100% rename from crates/ml/src/dqn/xavier_init.rs rename to crates/ml/src/xavier_init.rs