From c1287efbcfd2cd073be4cf85313f25c414be6248 Mon Sep 17 00:00:00 2001 From: jgrusewski Date: Sun, 8 Mar 2026 03:24:49 +0100 Subject: [PATCH] fix(ml): pad remaining state tensor paths for tensor core alignment MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Additional padding in get_q_values and convert_to_state — these are currently unused in the training pipeline but would crash if called. Co-Authored-By: Claude Opus 4.6 --- crates/ml/src/trainers/dqn/trainer.rs | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/crates/ml/src/trainers/dqn/trainer.rs b/crates/ml/src/trainers/dqn/trainer.rs index 9693a61dd..d4de0afd2 100644 --- a/crates/ml/src/trainers/dqn/trainer.rs +++ b/crates/ml/src/trainers/dqn/trainer.rs @@ -1264,7 +1264,16 @@ impl DQNTrainer { async fn get_q_values(&self, state: &TradingState) -> Result> { let agent = self.agent.read().await; let state_vec = state.to_vector(); - let state_tensor = Tensor::new(&*state_vec, &self.device)?.unsqueeze(0)?; // Add batch dimension + let raw_dim = state_vec.len(); + let aligned = crate::dqn::mixed_precision::align_dim_for_tensor_cores(raw_dim, &self.device); + let padded: Vec = if aligned > raw_dim { + let mut v = state_vec.to_vec(); + v.resize(aligned, 0.0); + v + } else { + state_vec.to_vec() + }; + let state_tensor = Tensor::new(&*padded, &self.device)?.unsqueeze(0)?; // Add batch dimension let q_values_tensor = agent.forward(&state_tensor)?; let q_values_vec = q_values_tensor.squeeze(0)?.to_vec1::()?; @@ -4221,11 +4230,20 @@ impl DQNTrainer { // Use internal conversion method (returns TradingState) let trading_state = self.feature_vector_to_state(feature_vec, Some(close))?; - // Convert TradingState to flat vector + // Convert TradingState to flat vector, pad for tensor core alignment let state_vec = trading_state.to_vector(); + let raw_dim = state_vec.len(); + let aligned = crate::dqn::mixed_precision::align_dim_for_tensor_cores(raw_dim, &self.device); + let padded: Vec = if aligned > raw_dim { + let mut v = state_vec.to_vec(); + v.resize(aligned, 0.0); + v + } else { + state_vec.to_vec() + }; // Convert to Tensor using trainer's device (GPU or CPU) - Tensor::new(state_vec.as_slice(), &self.device) + Tensor::new(padded.as_slice(), &self.device) .context("Failed to create state tensor from TradingState") }