**Progress: 1,178 → 57 test errors (95% reduction)** ## Status Summary - ✅ Production code: Compiles cleanly (0 errors) - ⚠️ Test code: 57 errors remain (massive improvement) - ⚙️ All services build successfully - 📊 Warning count: 253 (target: <20) - AGENTS WILL FIX ## Remaining Test Errors (57 total) ### Primary Issues: 1. 23× E0308 mismatched types 2. 17× E0433 undeclared Decimal 3. 15× E0433 compliance module not found 4. 6× E0624 private method access 5. Various import and type issues ## Next Phase: Wave 33-2 Launch 10+ parallel agents to: - Fix remaining 57 test compilation errors - Reduce 253 warnings to <20 - Achieve 95% test coverage - Ensure all tests pass 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
216 lines
5.9 KiB
Rust
216 lines
5.9 KiB
Rust
#![allow(missing_docs)] // Internal implementation details don't require documentation
|
|
//! ML Data Repository
|
|
//!
|
|
//! Production-ready ML data management for HFT trading systems.
|
|
//! Provides repositories for training data, model artifacts, performance tracking,
|
|
//! and feature engineering with PostgreSQL integration.
|
|
|
|
use database::Database;
|
|
use std::sync::Arc;
|
|
|
|
pub mod features;
|
|
pub mod models;
|
|
pub mod performance;
|
|
pub mod training;
|
|
|
|
/// Common error types for ML data operations
|
|
#[derive(thiserror::Error, Debug)]
|
|
pub enum MlDataError {
|
|
#[error("Database error: {0}")]
|
|
Database(#[from] database::DatabaseError),
|
|
|
|
#[error("SQL error: {0}")]
|
|
Sql(#[from] sqlx::Error),
|
|
|
|
#[error("Serialization error: {0}")]
|
|
Serialization(#[from] serde_json::Error),
|
|
|
|
#[error("IO error: {0}")]
|
|
Io(#[from] std::io::Error),
|
|
|
|
#[error("Validation error: {message}")]
|
|
Validation { message: String },
|
|
|
|
#[error("Version conflict: {message}")]
|
|
VersionConflict { message: String },
|
|
|
|
#[error("Not found: {resource_type} with id {id}")]
|
|
NotFound { resource_type: String, id: String },
|
|
|
|
#[error("Configuration error: {0}")]
|
|
Configuration(#[from] config::ConfigError),
|
|
}
|
|
|
|
pub type Result<T> = std::result::Result<T, MlDataError>;
|
|
|
|
/// Configuration for ML data repositories
|
|
#[derive(Debug, Clone, serde::Deserialize)]
|
|
pub struct MlDataConfig {
|
|
/// Database connection configuration
|
|
pub database: config::DatabaseConfig,
|
|
|
|
/// Model artifact storage path
|
|
pub model_storage_path: String,
|
|
|
|
/// Feature store configuration
|
|
pub feature_store: FeatureStoreConfig,
|
|
|
|
/// Performance tracking settings
|
|
pub performance: PerformanceConfig,
|
|
|
|
/// Training data management
|
|
pub training: TrainingConfig,
|
|
}
|
|
|
|
#[derive(Debug, Clone, serde::Deserialize)]
|
|
pub struct FeatureStoreConfig {
|
|
/// Maximum number of features to cache in memory
|
|
pub cache_size: usize,
|
|
|
|
/// Feature TTL in seconds
|
|
pub ttl_seconds: u64,
|
|
|
|
/// Batch size for feature computation
|
|
pub batch_size: usize,
|
|
}
|
|
|
|
#[derive(Debug, Clone, serde::Deserialize)]
|
|
pub struct PerformanceConfig {
|
|
/// Metrics retention period in days
|
|
pub retention_days: u32,
|
|
|
|
/// Performance degradation threshold
|
|
pub degradation_threshold: f64,
|
|
|
|
/// A/B test confidence level
|
|
pub confidence_level: f64,
|
|
}
|
|
|
|
#[derive(Debug, Clone, serde::Deserialize)]
|
|
pub struct TrainingConfig {
|
|
/// Maximum dataset size in bytes
|
|
pub max_dataset_size: u64,
|
|
|
|
/// Data validation rules
|
|
pub validation_rules: ValidationRules,
|
|
|
|
/// Default train/validation/test split ratios
|
|
pub default_splits: SplitRatios,
|
|
}
|
|
|
|
#[derive(Debug, Clone, serde::Deserialize)]
|
|
pub struct ValidationRules {
|
|
/// Minimum number of samples required
|
|
pub min_samples: usize,
|
|
|
|
/// Maximum missing value ratio allowed
|
|
pub max_missing_ratio: f64,
|
|
|
|
/// Required features list
|
|
pub required_features: Vec<String>,
|
|
}
|
|
|
|
#[derive(Debug, Clone, serde::Deserialize)]
|
|
pub struct SplitRatios {
|
|
pub train: f64,
|
|
pub validation: f64,
|
|
pub test: f64,
|
|
}
|
|
|
|
impl Default for SplitRatios {
|
|
fn default() -> Self {
|
|
Self {
|
|
train: 0.7,
|
|
validation: 0.2,
|
|
test: 0.1,
|
|
}
|
|
}
|
|
}
|
|
|
|
/// ML Data Repository Manager
|
|
///
|
|
/// Central coordinator for all ML data operations
|
|
#[derive(Clone)]
|
|
pub struct MlDataManager {
|
|
pub training: Arc<training::TrainingDataRepository>,
|
|
pub models: Arc<models::ModelRepository>,
|
|
pub performance: Arc<performance::PerformanceRepository>,
|
|
pub features: Arc<features::FeatureRepository>,
|
|
config: MlDataConfig,
|
|
}
|
|
|
|
impl MlDataManager {
|
|
/// Create a new ML data manager with the provided configuration
|
|
pub async fn new(config: MlDataConfig) -> Result<Self> {
|
|
let db = Database::new(config.database.clone()).await?;
|
|
|
|
let training = Arc::new(
|
|
training::TrainingDataRepository::new(db.clone(), config.training.clone()).await?,
|
|
);
|
|
|
|
let models = Arc::new(
|
|
models::ModelRepository::new(db.clone(), config.model_storage_path.clone()).await?,
|
|
);
|
|
|
|
let performance = Arc::new(
|
|
performance::PerformanceRepository::new(db.clone(), config.performance.clone()).await?,
|
|
);
|
|
|
|
let features = Arc::new(
|
|
features::FeatureRepository::new(db.clone(), config.feature_store.clone()).await?,
|
|
);
|
|
|
|
Ok(Self {
|
|
training,
|
|
models,
|
|
performance,
|
|
features,
|
|
config,
|
|
})
|
|
}
|
|
|
|
/// Get the configuration
|
|
pub fn config(&self) -> &MlDataConfig {
|
|
&self.config
|
|
}
|
|
|
|
/// Initialize database schema for all repositories
|
|
pub async fn initialize_schema(&self) -> Result<()> {
|
|
tracing::info!("Initializing ML data repository schemas");
|
|
|
|
self.training.initialize_schema().await?;
|
|
self.models.initialize_schema().await?;
|
|
self.performance.initialize_schema().await?;
|
|
self.features.initialize_schema().await?;
|
|
|
|
tracing::info!("ML data repository schemas initialized successfully");
|
|
Ok(())
|
|
}
|
|
|
|
/// Health check for all repositories
|
|
pub async fn health_check(&self) -> Result<HealthStatus> {
|
|
let training_health = self.training.health_check().await?;
|
|
let models_health = self.models.health_check().await?;
|
|
let performance_health = self.performance.health_check().await?;
|
|
let features_health = self.features.health_check().await?;
|
|
|
|
Ok(HealthStatus {
|
|
training: training_health,
|
|
models: models_health,
|
|
performance: performance_health,
|
|
features: features_health,
|
|
overall: training_health && models_health && performance_health && features_health,
|
|
})
|
|
}
|
|
}
|
|
|
|
/// Health status for all ML data repositories
|
|
#[derive(Debug, serde::Serialize)]
|
|
pub struct HealthStatus {
|
|
pub training: bool,
|
|
pub models: bool,
|
|
pub performance: bool,
|
|
pub features: bool,
|
|
pub overall: bool,
|
|
}
|